@guuey/config 0.1.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.
@@ -0,0 +1,173 @@
1
+ /**
2
+ * `mcpServers` — Guuey hosted overlay shape for relayed MCP server
3
+ * declarations.
4
+ *
5
+ * Relocated 2026-04-21 from `@ggui-ai/protocol/types/credential.ts`
6
+ * as part of the OSS split §8.2 classification fix (mirror of the
7
+ * 2026-04-21 `mcp-proxy` split). The `McpServerAuthConfig` type
8
+ * previously lived in the open protocol package with a docstring
9
+ * that said "Auth config in guuey.json mcpServers entries" — an
10
+ * overlay-shape type in an open package, exactly the pattern the
11
+ * mcp-proxy split closed.
12
+ *
13
+ * ## The classification decision
14
+ *
15
+ * `mcpServers` is the declaration block a developer adds to
16
+ * `guuey.json` to tell Guuey hosting: *"for this project, relay
17
+ * these HTTP MCP servers through the Guuey bridge, authenticating
18
+ * each via the credential stored under this `serviceId`."* That is
19
+ * platform-layer plumbing — the Guuey bridge registers the
20
+ * declaration with the Guuey-hosted WebSocket gateway, and the
21
+ * Guuey mcp-proxy Lambda resolves `auth.serviceId` against the
22
+ * platform's UserCredential store. An OSS-only `ggui serve`
23
+ * deployment has no analog for `auth.serviceId` because there is no
24
+ * Guuey credential store.
25
+ *
26
+ * Per §8.2: the OSS `ggui` server does NOT read `guuey.json`.
27
+ * Consumers that need this overlay value (the closed `guuey` CLI's
28
+ * `guuey dev` command, the closed `@guuey/bridge` package, Guuey-
29
+ * hosted Lambdas) are the only call sites allowed to import from
30
+ * this package. Open packages that historically read
31
+ * `McpServerAuthConfig` (`@ggui-ai/server`'s auth-relay code) now
32
+ * inline the minimal structural shape they actually use.
33
+ *
34
+ * ## Scope of this module
35
+ *
36
+ * - {@link CredentialInjection} + {@link CredentialInjectionConfig}
37
+ * — runtime injection-mode descriptors, used here as
38
+ * `McpServerAuth.injection` and also exported from
39
+ * `@ggui-ai/protocol/types/credential.ts` for cloud-side runtime
40
+ * consumers. The overlap is intentional and minor (10 lines of
41
+ * literal-union type) — duplicating inline keeps this private
42
+ * package dep-minimal (zod-only). If the two ever drift, the
43
+ * consolidation fix is to add `@ggui-ai/protocol` as a workspace
44
+ * dep here; today the duplication is cheaper than that cross-
45
+ * boundary edge.
46
+ * - {@link McpServerAuthConfig} — auth block on a single
47
+ * `mcpServers` entry. `serviceId` references the Guuey
48
+ * credential store; `preInject` + `injection` tune how the relay
49
+ * writes the placeholder.
50
+ * - {@link McpServerEntryConfig} — a single mcpServers entry
51
+ * (`{ url, auth? }`). `url` is the HTTP MCP server endpoint.
52
+ * - {@link McpServersConfig} — the top-level record keyed by MCP
53
+ * server name (`gmail`, `calendar`, future `slack`, …). Exactly
54
+ * the shape `guuey.json#mcpServers` carries.
55
+ *
56
+ * ## Strictness
57
+ *
58
+ * Zod validation matches the rest of `guuey.json`: strict objects,
59
+ * non-empty strings, URL validation on `url`. Unknown keys on
60
+ * nested objects fail parse (prevents silent drift toward a "what
61
+ * else can we stuff into guuey.json" shape).
62
+ */
63
+ import { z } from 'zod';
64
+ /**
65
+ * Injection mode — how the Guuey mcp-proxy splices the resolved
66
+ * credential into the outbound HTTP request to the upstream MCP
67
+ * server. Duplicated minor from
68
+ * `@ggui-ai/protocol/types/credential.ts#CredentialInjection`; see
69
+ * module docstring for the duplication rationale.
70
+ */
71
+ declare const CredentialInjectionSchema: z.ZodEnum<{
72
+ bearer_header: "bearer_header";
73
+ api_key_header: "api_key_header";
74
+ query_param: "query_param";
75
+ custom_header: "custom_header";
76
+ }>;
77
+ /** Full injection config — `mode` + per-mode tunables. */
78
+ declare const CredentialInjectionConfigSchema: z.ZodObject<{
79
+ mode: z.ZodEnum<{
80
+ bearer_header: "bearer_header";
81
+ api_key_header: "api_key_header";
82
+ query_param: "query_param";
83
+ custom_header: "custom_header";
84
+ }>;
85
+ headerName: z.ZodOptional<z.ZodString>;
86
+ paramName: z.ZodOptional<z.ZodString>;
87
+ }, z.core.$strict>;
88
+ /**
89
+ * Auth block on a single `mcpServers` entry. All fields are
90
+ * optional at the block level — a server without `auth` is relayed
91
+ * without credential injection (public MCP endpoint).
92
+ */
93
+ declare const McpServerAuthSchema: z.ZodObject<{
94
+ serviceId: z.ZodString;
95
+ preInject: z.ZodOptional<z.ZodBoolean>;
96
+ injection: z.ZodOptional<z.ZodObject<{
97
+ mode: z.ZodEnum<{
98
+ bearer_header: "bearer_header";
99
+ api_key_header: "api_key_header";
100
+ query_param: "query_param";
101
+ custom_header: "custom_header";
102
+ }>;
103
+ headerName: z.ZodOptional<z.ZodString>;
104
+ paramName: z.ZodOptional<z.ZodString>;
105
+ }, z.core.$strict>>;
106
+ scopes: z.ZodOptional<z.ZodArray<z.ZodString>>;
107
+ }, z.core.$strict>;
108
+ /**
109
+ * A single `mcpServers` entry. `url` is the HTTP MCP server
110
+ * endpoint; `auth` scopes the credential injection.
111
+ */
112
+ declare const McpServerEntrySchema: z.ZodObject<{
113
+ url: z.ZodURL;
114
+ auth: z.ZodOptional<z.ZodObject<{
115
+ serviceId: z.ZodString;
116
+ preInject: z.ZodOptional<z.ZodBoolean>;
117
+ injection: z.ZodOptional<z.ZodObject<{
118
+ mode: z.ZodEnum<{
119
+ bearer_header: "bearer_header";
120
+ api_key_header: "api_key_header";
121
+ query_param: "query_param";
122
+ custom_header: "custom_header";
123
+ }>;
124
+ headerName: z.ZodOptional<z.ZodString>;
125
+ paramName: z.ZodOptional<z.ZodString>;
126
+ }, z.core.$strict>>;
127
+ scopes: z.ZodOptional<z.ZodArray<z.ZodString>>;
128
+ }, z.core.$strict>>;
129
+ }, z.core.$strict>;
130
+ /**
131
+ * The `mcpServers` section of `guuey.json`. Keys are MCP server
132
+ * display names (`gmail`, `calendar`, future `slack`, …) —
133
+ * arbitrary strings, by design. New servers are additive; a fixed
134
+ * literal union would force a schema change every time a new MCP
135
+ * server integration lands.
136
+ */
137
+ export declare const McpServersSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
138
+ url: z.ZodURL;
139
+ auth: z.ZodOptional<z.ZodObject<{
140
+ serviceId: z.ZodString;
141
+ preInject: z.ZodOptional<z.ZodBoolean>;
142
+ injection: z.ZodOptional<z.ZodObject<{
143
+ mode: z.ZodEnum<{
144
+ bearer_header: "bearer_header";
145
+ api_key_header: "api_key_header";
146
+ query_param: "query_param";
147
+ custom_header: "custom_header";
148
+ }>;
149
+ headerName: z.ZodOptional<z.ZodString>;
150
+ paramName: z.ZodOptional<z.ZodString>;
151
+ }, z.core.$strict>>;
152
+ scopes: z.ZodOptional<z.ZodArray<z.ZodString>>;
153
+ }, z.core.$strict>>;
154
+ }, z.core.$strict>>;
155
+ /** Runtime injection-mode descriptor type. */
156
+ export type CredentialInjection = z.infer<typeof CredentialInjectionSchema>;
157
+ /** Injection-config block type. */
158
+ export type CredentialInjectionConfig = z.infer<typeof CredentialInjectionConfigSchema>;
159
+ /** Auth-block type on an `mcpServers` entry. */
160
+ export type McpServerAuthConfig = z.infer<typeof McpServerAuthSchema>;
161
+ /** Single-entry type inside the `mcpServers` record. */
162
+ export type McpServerEntryConfig = z.infer<typeof McpServerEntrySchema>;
163
+ /** Full `mcpServers` overlay type derived from the zod schema. */
164
+ export type McpServersConfig = z.infer<typeof McpServersSchema>;
165
+ /**
166
+ * Parse a raw JSON value into a validated {@link McpServersConfig}.
167
+ * Throws a `ZodError` on invalid input.
168
+ */
169
+ export declare function parseMcpServers(raw: unknown): McpServersConfig;
170
+ /** Safe-parse variant — see {@link parseMcpServers}. */
171
+ export declare function safeParseMcpServers(raw: unknown): ReturnType<typeof McpServersSchema.safeParse>;
172
+ export {};
173
+ //# sourceMappingURL=mcp-servers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-servers.d.ts","sourceRoot":"","sources":["../src/mcp-servers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AACH,QAAA,MAAM,yBAAyB;;;;;EAK7B,CAAC;AAEH,0DAA0D;AAC1D,QAAA,MAAM,+BAA+B;;;;;;;;;kBAMnC,CAAC;AAEH;;;;GAIG;AACH,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;kBA4BvB,CAAC;AAEH;;;GAGG;AACH,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;kBAKxB,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;mBAG5B,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,mCAAmC;AACnC,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAC7C,OAAO,+BAA+B,CACvC,CAAC;AAEF,gDAAgD;AAChD,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,wDAAwD;AACxD,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE,kEAAkE;AAClE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAE9D;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,OAAO,GACX,UAAU,CAAC,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAE/C"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * `mcpServers` — Guuey hosted overlay shape for relayed MCP server
3
+ * declarations.
4
+ *
5
+ * Relocated 2026-04-21 from `@ggui-ai/protocol/types/credential.ts`
6
+ * as part of the OSS split §8.2 classification fix (mirror of the
7
+ * 2026-04-21 `mcp-proxy` split). The `McpServerAuthConfig` type
8
+ * previously lived in the open protocol package with a docstring
9
+ * that said "Auth config in guuey.json mcpServers entries" — an
10
+ * overlay-shape type in an open package, exactly the pattern the
11
+ * mcp-proxy split closed.
12
+ *
13
+ * ## The classification decision
14
+ *
15
+ * `mcpServers` is the declaration block a developer adds to
16
+ * `guuey.json` to tell Guuey hosting: *"for this project, relay
17
+ * these HTTP MCP servers through the Guuey bridge, authenticating
18
+ * each via the credential stored under this `serviceId`."* That is
19
+ * platform-layer plumbing — the Guuey bridge registers the
20
+ * declaration with the Guuey-hosted WebSocket gateway, and the
21
+ * Guuey mcp-proxy Lambda resolves `auth.serviceId` against the
22
+ * platform's UserCredential store. An OSS-only `ggui serve`
23
+ * deployment has no analog for `auth.serviceId` because there is no
24
+ * Guuey credential store.
25
+ *
26
+ * Per §8.2: the OSS `ggui` server does NOT read `guuey.json`.
27
+ * Consumers that need this overlay value (the closed `guuey` CLI's
28
+ * `guuey dev` command, the closed `@guuey/bridge` package, Guuey-
29
+ * hosted Lambdas) are the only call sites allowed to import from
30
+ * this package. Open packages that historically read
31
+ * `McpServerAuthConfig` (`@ggui-ai/server`'s auth-relay code) now
32
+ * inline the minimal structural shape they actually use.
33
+ *
34
+ * ## Scope of this module
35
+ *
36
+ * - {@link CredentialInjection} + {@link CredentialInjectionConfig}
37
+ * — runtime injection-mode descriptors, used here as
38
+ * `McpServerAuth.injection` and also exported from
39
+ * `@ggui-ai/protocol/types/credential.ts` for cloud-side runtime
40
+ * consumers. The overlap is intentional and minor (10 lines of
41
+ * literal-union type) — duplicating inline keeps this private
42
+ * package dep-minimal (zod-only). If the two ever drift, the
43
+ * consolidation fix is to add `@ggui-ai/protocol` as a workspace
44
+ * dep here; today the duplication is cheaper than that cross-
45
+ * boundary edge.
46
+ * - {@link McpServerAuthConfig} — auth block on a single
47
+ * `mcpServers` entry. `serviceId` references the Guuey
48
+ * credential store; `preInject` + `injection` tune how the relay
49
+ * writes the placeholder.
50
+ * - {@link McpServerEntryConfig} — a single mcpServers entry
51
+ * (`{ url, auth? }`). `url` is the HTTP MCP server endpoint.
52
+ * - {@link McpServersConfig} — the top-level record keyed by MCP
53
+ * server name (`gmail`, `calendar`, future `slack`, …). Exactly
54
+ * the shape `guuey.json#mcpServers` carries.
55
+ *
56
+ * ## Strictness
57
+ *
58
+ * Zod validation matches the rest of `guuey.json`: strict objects,
59
+ * non-empty strings, URL validation on `url`. Unknown keys on
60
+ * nested objects fail parse (prevents silent drift toward a "what
61
+ * else can we stuff into guuey.json" shape).
62
+ */
63
+ import { z } from 'zod';
64
+ /**
65
+ * Injection mode — how the Guuey mcp-proxy splices the resolved
66
+ * credential into the outbound HTTP request to the upstream MCP
67
+ * server. Duplicated minor from
68
+ * `@ggui-ai/protocol/types/credential.ts#CredentialInjection`; see
69
+ * module docstring for the duplication rationale.
70
+ */
71
+ const CredentialInjectionSchema = z.enum([
72
+ 'bearer_header',
73
+ 'api_key_header',
74
+ 'query_param',
75
+ 'custom_header',
76
+ ]);
77
+ /** Full injection config — `mode` + per-mode tunables. */
78
+ const CredentialInjectionConfigSchema = z.strictObject({
79
+ mode: CredentialInjectionSchema,
80
+ /** Header name for `api_key_header` / `custom_header`. Default: `X-API-Key`. */
81
+ headerName: z.string().min(1).optional(),
82
+ /** Query param name for `query_param`. Default: `api_key`. */
83
+ paramName: z.string().min(1).optional(),
84
+ });
85
+ /**
86
+ * Auth block on a single `mcpServers` entry. All fields are
87
+ * optional at the block level — a server without `auth` is relayed
88
+ * without credential injection (public MCP endpoint).
89
+ */
90
+ const McpServerAuthSchema = z.strictObject({
91
+ /**
92
+ * Service ID referenced against the Guuey platform's
93
+ * UserCredential store. This is a Guuey-platform concept — an
94
+ * OSS-only deployment has no equivalent lookup.
95
+ */
96
+ serviceId: z.string().min(1),
97
+ /**
98
+ * Pre-inject placeholder before the first upstream request
99
+ * (skips the 401 → consent → retry dance for cases where the
100
+ * user has already linked the credential). Default: `false`.
101
+ */
102
+ preInject: z.boolean().optional(),
103
+ /**
104
+ * Override the injection mode. Falls back to the
105
+ * `McpServiceConfig` table entry keyed by `serviceId`, which
106
+ * defaults to `bearer_header`.
107
+ */
108
+ injection: CredentialInjectionConfigSchema.optional(),
109
+ /**
110
+ * Optional OAuth scope hint forwarded to the hosted bridge at
111
+ * connect time. The platform consumes this when minting tokens
112
+ * against the upstream MCP server. Preserved here (2026-04-21)
113
+ * for wire-compat with `@guuey/bridge`'s existing inline shape,
114
+ * which flows `auth.scopes` through the bridge WebSocket config
115
+ * message.
116
+ */
117
+ scopes: z.array(z.string().min(1)).optional(),
118
+ });
119
+ /**
120
+ * A single `mcpServers` entry. `url` is the HTTP MCP server
121
+ * endpoint; `auth` scopes the credential injection.
122
+ */
123
+ const McpServerEntrySchema = z.strictObject({
124
+ /** HTTP MCP server endpoint. */
125
+ url: z.url(),
126
+ /** Optional auth block — omit for public endpoints. */
127
+ auth: McpServerAuthSchema.optional(),
128
+ });
129
+ /**
130
+ * The `mcpServers` section of `guuey.json`. Keys are MCP server
131
+ * display names (`gmail`, `calendar`, future `slack`, …) —
132
+ * arbitrary strings, by design. New servers are additive; a fixed
133
+ * literal union would force a schema change every time a new MCP
134
+ * server integration lands.
135
+ */
136
+ export const McpServersSchema = z.record(z.string().min(1), McpServerEntrySchema);
137
+ /**
138
+ * Parse a raw JSON value into a validated {@link McpServersConfig}.
139
+ * Throws a `ZodError` on invalid input.
140
+ */
141
+ export function parseMcpServers(raw) {
142
+ return McpServersSchema.parse(raw);
143
+ }
144
+ /** Safe-parse variant — see {@link parseMcpServers}. */
145
+ export function safeParseMcpServers(raw) {
146
+ return McpServersSchema.safeParse(raw);
147
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Model + framework registry — single source of truth per the model-release
3
+ * playbook §8 item A; a release = one entry change here + rate-card row.
4
+ */
5
+ export type ModelStatus = "ga" | "preview" | "announced" | "deprecated";
6
+ export interface ModelEntry {
7
+ readonly id: string;
8
+ readonly provider: "anthropic" | "openai" | "google" | "openrouter";
9
+ readonly label: string;
10
+ readonly status: ModelStatus;
11
+ readonly isDefault?: true;
12
+ readonly sunset?: string;
13
+ }
14
+ export interface FrameworkEntry {
15
+ readonly framework: "claude-agent-sdk" | "openai-agents-sdk" | "google-adk" | "vanilla";
16
+ readonly sdkPackage: string | null;
17
+ readonly platformPinnedVersion: string | null;
18
+ readonly facetSupportedRange: string | null;
19
+ readonly defaultProvider: "anthropic" | "openai" | "google";
20
+ }
21
+ export declare const MODEL_REGISTRY: readonly ModelEntry[];
22
+ export declare const FRAMEWORK_REGISTRY: readonly FrameworkEntry[];
23
+ /**
24
+ * Get all models for a provider, filtered to ga|preview only, with default first.
25
+ */
26
+ export declare function modelsForProvider(p: ModelEntry["provider"]): readonly ModelEntry[];
27
+ /**
28
+ * Get the default model id for a framework's default provider.
29
+ */
30
+ export declare function defaultModelFor(framework: FrameworkEntry["framework"]): string;
31
+ /**
32
+ * Look up a model entry by id.
33
+ */
34
+ export declare function modelEntry(id: string): ModelEntry | undefined;
35
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;IACpE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,mBAAmB,GAAG,YAAY,GAAG,SAAS,CAAC;IACxF,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC7D;AAED,eAAO,MAAM,cAAc,EAAE,SAAS,UAAU,EAe/C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,SAAS,cAAc,EA6BvD,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,SAAS,UAAU,EAAE,CAQlF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG,MAAM,CAM9E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAE7D"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Model + framework registry — single source of truth per the model-release
3
+ * playbook §8 item A; a release = one entry change here + rate-card row.
4
+ */
5
+ export const MODEL_REGISTRY = [
6
+ { id: "claude-sonnet-5", provider: "anthropic", label: "Claude Sonnet 5", status: "ga", isDefault: true },
7
+ { id: "claude-fable-5", provider: "anthropic", label: "Claude Fable 5", status: "ga" },
8
+ { id: "claude-sonnet-4-6", provider: "anthropic", label: "Claude Sonnet 4.6", status: "ga" },
9
+ { id: "claude-haiku-4-5", provider: "anthropic", label: "Claude Haiku 4.5", status: "ga" },
10
+ { id: "claude-opus-4-8", provider: "anthropic", label: "Claude Opus 4.8", status: "ga" },
11
+ { id: "gpt-5.5", provider: "openai", label: "GPT-5.5", status: "ga", isDefault: true },
12
+ { id: "gpt-5.4", provider: "openai", label: "GPT-5.4", status: "ga" },
13
+ { id: "gpt-4o", provider: "openai", label: "GPT-4o", status: "ga" },
14
+ { id: "gpt-4o-mini", provider: "openai", label: "GPT-4o Mini", status: "ga" },
15
+ { id: "gpt-5.6", provider: "openai", label: "GPT-5.6", status: "announced" },
16
+ { id: "gemini-3.5-flash", provider: "google", label: "Gemini 3.5 Flash", status: "ga", isDefault: true },
17
+ { id: "gemini-3.1-pro", provider: "google", label: "Gemini 3.1 Pro", status: "ga" },
18
+ { id: "gemini-2.5-flash", provider: "google", label: "Gemini 2.5 Flash", status: "ga" },
19
+ { id: "gemini-2.5-pro", provider: "google", label: "Gemini 2.5 Pro", status: "ga" },
20
+ ];
21
+ export const FRAMEWORK_REGISTRY = [
22
+ {
23
+ framework: "claude-agent-sdk",
24
+ sdkPackage: "@anthropic-ai/claude-agent-sdk",
25
+ platformPinnedVersion: "0.3.199",
26
+ facetSupportedRange: ">=0.2.76 <0.4",
27
+ defaultProvider: "anthropic",
28
+ },
29
+ {
30
+ framework: "openai-agents-sdk",
31
+ sdkPackage: "@openai/agents",
32
+ platformPinnedVersion: "0.12.0",
33
+ facetSupportedRange: ">=0.2.0 <0.13",
34
+ defaultProvider: "openai",
35
+ },
36
+ {
37
+ framework: "google-adk",
38
+ sdkPackage: "google-adk",
39
+ platformPinnedVersion: "2.3.0",
40
+ facetSupportedRange: null,
41
+ defaultProvider: "google",
42
+ },
43
+ {
44
+ framework: "vanilla",
45
+ sdkPackage: null,
46
+ platformPinnedVersion: null,
47
+ facetSupportedRange: null,
48
+ defaultProvider: "anthropic",
49
+ },
50
+ ];
51
+ /**
52
+ * Get all models for a provider, filtered to ga|preview only, with default first.
53
+ */
54
+ export function modelsForProvider(p) {
55
+ return MODEL_REGISTRY.filter((m) => m.provider === p && (m.status === "ga" || m.status === "preview")).sort((a, b) => {
56
+ if (a.isDefault)
57
+ return -1;
58
+ if (b.isDefault)
59
+ return 1;
60
+ return 0;
61
+ });
62
+ }
63
+ /**
64
+ * Get the default model id for a framework's default provider.
65
+ */
66
+ export function defaultModelFor(framework) {
67
+ const fw = FRAMEWORK_REGISTRY.find((f) => f.framework === framework);
68
+ if (!fw)
69
+ throw new Error(`Unknown framework: ${framework}`);
70
+ const model = MODEL_REGISTRY.find((m) => m.provider === fw.defaultProvider && m.isDefault && m.status === "ga");
71
+ if (!model)
72
+ throw new Error(`No default ga model for provider: ${fw.defaultProvider}`);
73
+ return model.id;
74
+ }
75
+ /**
76
+ * Look up a model entry by id.
77
+ */
78
+ export function modelEntry(id) {
79
+ return MODEL_REGISTRY.find((m) => m.id === id);
80
+ }
@@ -0,0 +1,204 @@
1
+ /**
2
+ * `guuey.json` v1 — the merged platform config.
3
+ *
4
+ * Single source of truth for a guuey-deployed project. Composed of:
5
+ *
6
+ * - `agent` (required for agent deploys) — declarative runtime + deploy config
7
+ * - `app` (optional) — App Store / Portal listing metadata
8
+ * - `ggui` (optional) — cross-protocol integration if the agent uses ggui rendering
9
+ *
10
+ * Plus top-level platform identity (`appId`, `workspaceId`) populated by
11
+ * the CLI after `guuey create` / `guuey link`.
12
+ *
13
+ * **Filename convention** (filename = artifact kind, see design doc §3):
14
+ * ```
15
+ * guuey.json ← agent deploy (this file's schema)
16
+ * guuey.mcp.json ← MCP server deploy (separate schema — see guuey-mcp.ts when added)
17
+ * ```
18
+ *
19
+ * **History.** Pre-2026-05-25 the repo carried two separate files:
20
+ * - `agent.json` — runtime contract (slice 2.0)
21
+ * - `guuey.json` — hosted overlay (project, deploy, deployments, mcpProxies, mcpServers)
22
+ *
23
+ * Slice 7.2 (2026-05-25) merged them per platform-architecture design doc §3.1
24
+ * + §14.2 field-by-field migration table. Pre-launch no-backcompat rule —
25
+ * the old shape is GONE, not deprecated.
26
+ *
27
+ * **Minimum valid `guuey.json`** (every other field defaults):
28
+ *
29
+ * ```jsonc
30
+ * {
31
+ * "schema": "1",
32
+ * "agent": {
33
+ * "framework": "claude-agent-sdk",
34
+ * "model": "claude-sonnet-4-6",
35
+ * "systemPrompt": { "file": "prompts/system.md" }
36
+ * }
37
+ * }
38
+ * ```
39
+ */
40
+ import { z } from 'zod';
41
+ import { type GuueyAgent } from './agent.js';
42
+ import { type GuueyApp } from './app.js';
43
+ import { type GuueyGguiSection } from './ggui.js';
44
+ /**
45
+ * Top-level guuey.json v1 schema.
46
+ *
47
+ * `agent` is required — there's no "empty" guuey.json. A repo that hosts
48
+ * only an MCP server uses `guuey.mcp.json` instead (separate schema).
49
+ *
50
+ * `appId` and `workspaceId` are platform-resolved identifiers stamped by
51
+ * the CLI after `guuey create` / `guuey link`. A fresh project has neither.
52
+ * After first `guuey create`, both may be present.
53
+ *
54
+ * Re-exports the sub-section types for consumer convenience.
55
+ */
56
+ export declare const GuueyJsonV1: z.ZodObject<{
57
+ schema: z.ZodLiteral<"1">;
58
+ appId: z.ZodOptional<z.ZodString>;
59
+ workspaceId: z.ZodOptional<z.ZodString>;
60
+ agent: z.ZodObject<{
61
+ mode: z.ZodOptional<z.ZodEnum<{
62
+ code: "code";
63
+ declarative: "declarative";
64
+ }>>;
65
+ framework: z.ZodOptional<z.ZodEnum<{
66
+ "claude-agent-sdk": "claude-agent-sdk";
67
+ "openai-agents-sdk": "openai-agents-sdk";
68
+ "google-adk": "google-adk";
69
+ vanilla: "vanilla";
70
+ }>>;
71
+ model: z.ZodOptional<z.ZodString>;
72
+ modelProvider: z.ZodOptional<z.ZodEnum<{
73
+ openai: "openai";
74
+ openrouter: "openrouter";
75
+ }>>;
76
+ systemPrompt: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
77
+ file: z.ZodString;
78
+ }, z.core.$strict>]>>;
79
+ mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
80
+ kind: z.ZodLiteral<"colocated">;
81
+ command: z.ZodString;
82
+ args: z.ZodOptional<z.ZodArray<z.ZodString>>;
83
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
84
+ }, z.core.$strict>, z.ZodObject<{
85
+ kind: z.ZodLiteral<"hosted">;
86
+ server: z.ZodOptional<z.ZodString>;
87
+ source: z.ZodOptional<z.ZodString>;
88
+ devPort: z.ZodOptional<z.ZodNumber>;
89
+ }, z.core.$strict>, z.ZodObject<{
90
+ kind: z.ZodLiteral<"proxied">;
91
+ connection: z.ZodString;
92
+ }, z.core.$strict>, z.ZodObject<{
93
+ kind: z.ZodLiteral<"external">;
94
+ url: z.ZodURL;
95
+ transport: z.ZodOptional<z.ZodEnum<{
96
+ http: "http";
97
+ sse: "sse";
98
+ }>>;
99
+ federate: z.ZodOptional<z.ZodBoolean>;
100
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
101
+ devPort: z.ZodOptional<z.ZodNumber>;
102
+ }, z.core.$strict>], "kind">>>;
103
+ tools: z.ZodOptional<z.ZodObject<{
104
+ allowlist: z.ZodOptional<z.ZodArray<z.ZodString>>;
105
+ denylist: z.ZodOptional<z.ZodArray<z.ZodString>>;
106
+ }, z.core.$strict>>;
107
+ runtime: z.ZodOptional<z.ZodObject<{
108
+ maxTurns: z.ZodOptional<z.ZodNumber>;
109
+ temperature: z.ZodOptional<z.ZodNumber>;
110
+ }, z.core.$strict>>;
111
+ claude: z.ZodOptional<z.ZodObject<{
112
+ permissions: z.ZodOptional<z.ZodObject<{
113
+ mode: z.ZodOptional<z.ZodEnum<{
114
+ default: "default";
115
+ acceptEdits: "acceptEdits";
116
+ bypassPermissions: "bypassPermissions";
117
+ }>>;
118
+ }, z.core.$strict>>;
119
+ }, z.core.$strict>>;
120
+ auth: z.ZodOptional<z.ZodEnum<{
121
+ optional: "optional";
122
+ anonymous: "anonymous";
123
+ required: "required";
124
+ }>>;
125
+ memory: z.ZodOptional<z.ZodEnum<{
126
+ thread: "thread";
127
+ none: "none";
128
+ }>>;
129
+ storage: z.ZodOptional<z.ZodArray<z.ZodEnum<{
130
+ user: "user";
131
+ app: "app";
132
+ }>>>;
133
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
134
+ secrets: z.ZodOptional<z.ZodArray<z.ZodString>>;
135
+ endpoint: z.ZodOptional<z.ZodObject<{
136
+ kind: z.ZodOptional<z.ZodLiteral<"invoke">>;
137
+ streaming: z.ZodOptional<z.ZodBoolean>;
138
+ }, z.core.$strict>>;
139
+ deploy: z.ZodOptional<z.ZodObject<{
140
+ size: z.ZodOptional<z.ZodEnum<{
141
+ xs: "xs";
142
+ sm: "sm";
143
+ md: "md";
144
+ lg: "lg";
145
+ xl: "xl";
146
+ }>>;
147
+ region: z.ZodOptional<z.ZodString>;
148
+ }, z.core.$strict>>;
149
+ }, z.core.$strict>;
150
+ app: z.ZodOptional<z.ZodObject<{
151
+ slug: z.ZodOptional<z.ZodString>;
152
+ name: z.ZodOptional<z.ZodString>;
153
+ description: z.ZodOptional<z.ZodString>;
154
+ iconUrl: z.ZodOptional<z.ZodURL>;
155
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
156
+ customDomain: z.ZodOptional<z.ZodString>;
157
+ }, z.core.$strict>>;
158
+ ggui: z.ZodOptional<z.ZodObject<{
159
+ appId: z.ZodOptional<z.ZodString>;
160
+ configFile: z.ZodOptional<z.ZodString>;
161
+ inline: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
162
+ }, z.core.$strict>>;
163
+ worker: z.ZodOptional<z.ZodString>;
164
+ protocol: z.ZodDefault<z.ZodEnum<{
165
+ silver: "silver";
166
+ bypass: "bypass";
167
+ }>>;
168
+ runtime: z.ZodOptional<z.ZodObject<{
169
+ router: z.ZodDefault<z.ZodEnum<{
170
+ v1: "v1";
171
+ }>>;
172
+ }, z.core.$strict>>;
173
+ }, z.core.$strict>;
174
+ /** Static TypeScript type for `guuey.json` v1. */
175
+ export type GuueyJsonV1 = z.infer<typeof GuueyJsonV1>;
176
+ /**
177
+ * Author-side shape for `guuey.json` v1 — what a writer may construct before
178
+ * `parseGuueyJson` applies schema defaults (e.g. `protocol` → `'silver'`).
179
+ * Fields with defaults are optional here and required on {@link GuueyJsonV1}.
180
+ */
181
+ export type GuueyJsonV1Input = z.input<typeof GuueyJsonV1>;
182
+ export type { GuueyAgent, GuueyApp, GuueyGguiSection };
183
+ /**
184
+ * Canonical filename — always at the project root, always this name.
185
+ * Exported so tooling uses the same constant instead of hard-coding.
186
+ */
187
+ export declare const GUUEY_JSON_FILENAME = "guuey.json";
188
+ /**
189
+ * Parse a raw JSON value into a validated {@link GuueyJsonV1}.
190
+ * Throws a `ZodError` with human-readable issues on invalid input.
191
+ *
192
+ * Callers must have already JSON-decoded the source. Does NOT resolve
193
+ * `agent.systemPrompt.file` references — that's the loader's job (see
194
+ * `./loader.ts#loadGuueyJson`). Pure parse is safe to run anywhere;
195
+ * file resolution requires a base directory and is Node-only.
196
+ */
197
+ export declare function parseGuueyJson(raw: unknown): GuueyJsonV1;
198
+ /**
199
+ * Safe-parse variant — returns a discriminated `z.safeParse` result.
200
+ * Prefer this inside CLI tooling where you want to render the issue
201
+ * list without try/catch.
202
+ */
203
+ export declare function safeParseGuueyJson(raw: unknown): ReturnType<typeof GuueyJsonV1.safeParse>;
204
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEjE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmDtB,CAAC;AAEH,kDAAkD;AAClD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAG3D,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CAExD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,GACX,UAAU,CAAC,OAAO,WAAW,CAAC,SAAS,CAAC,CAE1C"}