@guuey/config 0.1.1 → 0.1.2

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/agent.d.ts CHANGED
@@ -49,20 +49,30 @@ import { z } from 'zod';
49
49
  */
50
50
  export declare const AGENT_FRAMEWORKS: readonly ["claude-agent-sdk", "openai-agents-sdk", "google-adk", "vanilla"];
51
51
  export type AgentFramework = (typeof AGENT_FRAMEWORKS)[number];
52
+ /**
53
+ * Cross-app profile access posture. `'read'` = the agent may recall the
54
+ * user's cross-app profile; `'read-write'` additionally lets it write this
55
+ * app's section. Absent = no profile access (default-closed, consent-gated).
56
+ */
57
+ export declare const ProfileAccessSchema: z.ZodEnum<{
58
+ read: "read";
59
+ "read-write": "read-write";
60
+ }>;
61
+ /** Static TypeScript type derived from {@link ProfileAccessSchema}. */
62
+ export type ProfileAccess = z.infer<typeof ProfileAccessSchema>;
52
63
  /**
53
64
  * A single MCP server entry inside `agent.mcpServers`.
54
65
  *
55
66
  * Discriminated union on `kind` — one slot per hosting mode:
56
- * - `colocated` — stdio child inside the agent pod
67
+ * - `colocated` — guuey-managed HTTP child inside the agent pod
57
68
  * - `hosted` — guuey-hosted registry MCP (Starter+)
58
69
  * - `proxied` — 3rd-party SaaS via mcp-proxy credential broker (v2)
59
70
  * - `external` — builder-hosted, reached by URL (plain or federated)
60
71
  */
61
72
  declare const McpServerSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
62
73
  kind: z.ZodLiteral<"colocated">;
63
- command: z.ZodString;
64
- args: z.ZodOptional<z.ZodArray<z.ZodString>>;
65
- headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
74
+ source: z.ZodString;
75
+ devPort: z.ZodOptional<z.ZodNumber>;
66
76
  }, z.core.$strict>, z.ZodObject<{
67
77
  kind: z.ZodLiteral<"hosted">;
68
78
  server: z.ZodOptional<z.ZodString>;
@@ -81,6 +91,11 @@ declare const McpServerSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
81
91
  federate: z.ZodOptional<z.ZodBoolean>;
82
92
  headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
83
93
  devPort: z.ZodOptional<z.ZodNumber>;
94
+ mcpResourceUrl: z.ZodOptional<z.ZodURL>;
95
+ profileAccess: z.ZodOptional<z.ZodEnum<{
96
+ read: "read";
97
+ "read-write": "read-write";
98
+ }>>;
84
99
  }, z.core.$strict>], "kind">;
85
100
  /**
86
101
  * Tool-gate block — allowlist applied first (intersect with what the MCP
@@ -150,6 +165,40 @@ declare const DeploySchema: z.ZodObject<{
150
165
  * Exported as a zod object so the top-level `GuueyJsonV1` schema (in
151
166
  * `./schema.ts`) can nest it. Static type via {@link GuueyAgent}.
152
167
  */
168
+ /**
169
+ * The `agent.mcpServers` map alone — for consumers that resolve/lower the
170
+ * servers SUBTREE without validating the whole snapshot (deploy-controller's
171
+ * resolve-mcp): whole-snapshot strictness made lowering fail open on any
172
+ * schema field the running consumer predates.
173
+ */
174
+ export declare const McpServersSection: z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
175
+ kind: z.ZodLiteral<"colocated">;
176
+ source: z.ZodString;
177
+ devPort: z.ZodOptional<z.ZodNumber>;
178
+ }, z.core.$strict>, z.ZodObject<{
179
+ kind: z.ZodLiteral<"hosted">;
180
+ server: z.ZodOptional<z.ZodString>;
181
+ source: z.ZodOptional<z.ZodString>;
182
+ devPort: z.ZodOptional<z.ZodNumber>;
183
+ }, z.core.$strict>, z.ZodObject<{
184
+ kind: z.ZodLiteral<"proxied">;
185
+ connection: z.ZodString;
186
+ }, z.core.$strict>, z.ZodObject<{
187
+ kind: z.ZodLiteral<"external">;
188
+ url: z.ZodURL;
189
+ transport: z.ZodOptional<z.ZodEnum<{
190
+ http: "http";
191
+ sse: "sse";
192
+ }>>;
193
+ federate: z.ZodOptional<z.ZodBoolean>;
194
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
195
+ devPort: z.ZodOptional<z.ZodNumber>;
196
+ mcpResourceUrl: z.ZodOptional<z.ZodURL>;
197
+ profileAccess: z.ZodOptional<z.ZodEnum<{
198
+ read: "read";
199
+ "read-write": "read-write";
200
+ }>>;
201
+ }, z.core.$strict>], "kind">>;
153
202
  export declare const AgentSectionV1: z.ZodObject<{
154
203
  mode: z.ZodOptional<z.ZodEnum<{
155
204
  code: "code";
@@ -161,6 +210,7 @@ export declare const AgentSectionV1: z.ZodObject<{
161
210
  "google-adk": "google-adk";
162
211
  vanilla: "vanilla";
163
212
  }>>;
213
+ entry: z.ZodOptional<z.ZodString>;
164
214
  model: z.ZodOptional<z.ZodString>;
165
215
  modelProvider: z.ZodOptional<z.ZodEnum<{
166
216
  openai: "openai";
@@ -171,9 +221,8 @@ export declare const AgentSectionV1: z.ZodObject<{
171
221
  }, z.core.$strict>]>>;
172
222
  mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
173
223
  kind: z.ZodLiteral<"colocated">;
174
- command: z.ZodString;
175
- args: z.ZodOptional<z.ZodArray<z.ZodString>>;
176
- headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
224
+ source: z.ZodString;
225
+ devPort: z.ZodOptional<z.ZodNumber>;
177
226
  }, z.core.$strict>, z.ZodObject<{
178
227
  kind: z.ZodLiteral<"hosted">;
179
228
  server: z.ZodOptional<z.ZodString>;
@@ -192,6 +241,11 @@ export declare const AgentSectionV1: z.ZodObject<{
192
241
  federate: z.ZodOptional<z.ZodBoolean>;
193
242
  headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
194
243
  devPort: z.ZodOptional<z.ZodNumber>;
244
+ mcpResourceUrl: z.ZodOptional<z.ZodURL>;
245
+ profileAccess: z.ZodOptional<z.ZodEnum<{
246
+ read: "read";
247
+ "read-write": "read-write";
248
+ }>>;
195
249
  }, z.core.$strict>], "kind">>>;
196
250
  tools: z.ZodOptional<z.ZodObject<{
197
251
  allowlist: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -223,6 +277,10 @@ export declare const AgentSectionV1: z.ZodObject<{
223
277
  user: "user";
224
278
  app: "app";
225
279
  }>>>;
280
+ profileAccess: z.ZodOptional<z.ZodEnum<{
281
+ read: "read";
282
+ "read-write": "read-write";
283
+ }>>;
226
284
  env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
227
285
  secrets: z.ZodOptional<z.ZodArray<z.ZodString>>;
228
286
  endpoint: z.ZodOptional<z.ZodObject<{
@@ -270,6 +328,49 @@ export type GuueyAgentDeploy = z.infer<typeof DeploySchema>;
270
328
  * `X-API-Key: ${env.KEY}`) and non-secret literals (`Content-Type`) pass.
271
329
  */
272
330
  export declare function validateNoLiteralSecrets(agent: GuueyAgent | undefined): string[];
331
+ /**
332
+ * Validate that every `kind: 'colocated'` entry's NAME (the `mcpServers`
333
+ * map key) is safe to compose into `colocatedResourceUrl` — i.e. passes
334
+ * {@link isValidColocatedServerName} (from `./colocated.ts`, the single
335
+ * source of truth for the rule). Returns a list of human-readable
336
+ * violation messages (empty = clean).
337
+ */
338
+ export declare function validateColocatedServerNames(agent: GuueyAgent | undefined): string[];
339
+ /**
340
+ * Validate that no `agent.mcpServers` entry uses `kind: 'proxied'`. Returns a
341
+ * list of human-readable violation messages (empty = clean), one per proxied
342
+ * entry, naming the server so the builder knows which ref to change.
343
+ */
344
+ export declare function validateNoProxiedServers(agent: GuueyAgent | undefined): string[];
345
+ /**
346
+ * The reserved colocated key the auto-injected memory MCP is booted + spliced
347
+ * under (memmcp). NEVER builder-declarable — the memory child's own server
348
+ * advertises this same name and its aud is `colocatedResourceUrl(appId, this)`.
349
+ */
350
+ export declare const RESERVED_MEMORY_SERVER_NAME = "guuey-memory";
351
+ /**
352
+ * The reserved colocated key the auto-injected cross-app profile MCP is
353
+ * booted + spliced under (profile T1+). NEVER builder-declarable — mirrors
354
+ * {@link RESERVED_MEMORY_SERVER_NAME}'s reservation for the same reason: a
355
+ * builder-declared server under this key would be silently replaced by the
356
+ * platform entry at invoke time.
357
+ */
358
+ export declare const RESERVED_PROFILE_SERVER_NAME = "guuey-profile";
359
+ /**
360
+ * Every `mcpServers` map key the platform reserves. Extensible — one entry
361
+ * today ({@link RESERVED_MEMORY_SERVER_NAME}); future platform-injected
362
+ * servers add their key here and inherit the deploy-time rejection for free.
363
+ */
364
+ export declare const RESERVED_MCP_SERVER_NAMES: readonly string[];
365
+ /**
366
+ * Validate that no `agent.mcpServers` entry uses a platform-RESERVED name
367
+ * ({@link RESERVED_MCP_SERVER_NAMES}) — regardless of `kind` (the key is
368
+ * reserved, not just one hosting mode; a builder must not shadow it as
369
+ * `colocated`, `external`, or anything else). Returns a list of human-readable
370
+ * violation messages (empty = clean), one per reserved entry. Mirrors
371
+ * {@link validateNoProxiedServers}'s shape.
372
+ */
373
+ export declare function validateReservedServerNames(agent: GuueyAgent | undefined): string[];
273
374
  /**
274
375
  * Platform default MCP server map. Applied by the pod when `agent.mcpServers`
275
376
  * is absent. Exposed here so non-pod consumers (CLI dry-run, lints) can show
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,6EAKnB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAoF/D;;;;;;;;GAQG;AACH,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;4BAKnB,CAAC;AAEH;;;;GAIG;AACH,QAAA,MAAM,eAAe;;;kBAGnB,CAAC;AAEH;;;;;;;;GAQG;AACH,QAAA,MAAM,mBAAmB;;;kBAGvB,CAAC;AAcH;;;;GAIG;AACH,QAAA,MAAM,kBAAkB;;oBAGtB,CAAC;AAEH;;;;;;GAMG;AACH,QAAA,MAAM,oBAAoB;;;kBAGxB,CAAC;AAEH;;;;;;;;;;GAUG;AACH,QAAA,MAAM,YAAY;;;;;;;;;kBAKhB,CAAC;AAsBH;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAoEzB,CAAC;AAEH,kEAAkE;AAClE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAExD,oCAAoC;AACpC,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAElE,4BAA4B;AAC5B,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAElE,iCAAiC;AACjC,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEpE,kDAAkD;AAClD,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAExE,4BAA4B;AAC5B,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEtE,0BAA0B;AAC1B,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAuE5D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,UAAU,GAAG,SAAS,GAC5B,MAAM,EAAE,CAiCV;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAEzE,CAAC"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,6EAKnB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAS/D;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;;;EAAiC,CAAC;AAClE,uEAAuE;AACvE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AA0FhE;;;;;;;;GAQG;AACH,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAKnB,CAAC;AAEH;;;;GAIG;AACH,QAAA,MAAM,eAAe;;;kBAGnB,CAAC;AAEH;;;;;;;;GAQG;AACH,QAAA,MAAM,mBAAmB;;;kBAGvB,CAAC;AAcH;;;;GAIG;AACH,QAAA,MAAM,kBAAkB;;oBAGtB,CAAC;AAEH;;;;;;GAMG;AACH,QAAA,MAAM,oBAAoB;;;kBAGxB,CAAC;AAEH;;;;;;;;;;GAUG;AACH,QAAA,MAAM,YAAY;;;;;;;;;kBAKhB,CAAC;AAsBH;;;;;GAKG;AACH;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAA+C,CAAC;AAE9E,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6EzB,CAAC;AAEH,kEAAkE;AAClE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAExD,oCAAoC;AACpC,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAElE,4BAA4B;AAC5B,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAElE,iCAAiC;AACjC,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEpE,kDAAkD;AAClD,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAExE,4BAA4B;AAC5B,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEtE,0BAA0B;AAC1B,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAuE5D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,UAAU,GAAG,SAAS,GAC5B,MAAM,EAAE,CAiCV;AAeD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,UAAU,GAAG,SAAS,GAC5B,MAAM,EAAE,CAaV;AAaD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,UAAU,GAAG,SAAS,GAC5B,MAAM,EAAE,CAaV;AAgBD;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAE1D;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,kBAAkB,CAAC;AAE5D;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAGtD,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,UAAU,GAAG,SAAS,GAC5B,MAAM,EAAE,CAaV;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAEzE,CAAC"}
package/dist/agent.js CHANGED
@@ -41,6 +41,7 @@
41
41
  */
42
42
  import { z } from 'zod';
43
43
  import { AGENT_SIZES } from './hosting.js';
44
+ import { isValidColocatedServerName } from './colocated.js';
44
45
  /**
45
46
  * Supported framework adapters. The pod runtime selects the matching
46
47
  * `@guuey/framework-*` adapter at boot. `vanilla` skips the framework
@@ -61,18 +62,25 @@ export const AGENT_FRAMEWORKS = [
61
62
  */
62
63
  const HeadersSchema = z.record(z.string().min(1), z.string());
63
64
  /**
64
- * `kind: 'colocated'` MCP server runs as a stdio child **inside the agent
65
- * pod** (co-locate = same gVisor sandbox). COGS: ~$0 (rides the agent pod).
66
- * Nocode runtime spawns `command [args…]` at boot.
65
+ * Cross-app profile access posture. `'read'` = the agent may recall the
66
+ * user's cross-app profile; `'read-write'` additionally lets it write this
67
+ * app's section. Absent = no profile access (default-closed, consent-gated).
68
+ */
69
+ export const ProfileAccessSchema = z.enum(['read', 'read-write']);
70
+ /**
71
+ * `kind: 'colocated'` — MCP server runs as a guuey-managed HTTP child
72
+ * **inside the agent pod** (co-locate = same gVisor sandbox). COGS: ~$0
73
+ * (rides the agent pod). `source` is a project-relative path the Router
74
+ * lowering builds/boots as a local HTTP server; `devPort` mirrors the
75
+ * `hosted`/`external` dev-loop story (name→localhost URL resolution for
76
+ * `guuey dev`).
67
77
  */
68
78
  const ColocatedMcp = z.strictObject({
69
79
  kind: z.literal('colocated'),
70
- /** Executable name or path. Required. */
71
- command: z.string().min(1),
72
- /** Argv beyond `command`. */
73
- args: z.array(z.string()).optional(),
74
- /** Static headers (less common for stdio, but supported for symmetry). */
75
- headers: HeadersSchema.optional(),
80
+ /** Source directory relative to `guuey.json`. Required. */
81
+ source: z.string().min(1),
82
+ /** Local dev-loop port (`guuey dev`) this MCP is served on for name→localhost URL resolution. */
83
+ devPort: z.number().int().min(1).max(65535).optional(),
76
84
  });
77
85
  /**
78
86
  * `kind: 'hosted'` — a workspace-owned registry MCP running on guuey's
@@ -104,7 +112,7 @@ const HostedMcp = z
104
112
  */
105
113
  const ProxiedMcp = z.strictObject({
106
114
  kind: z.literal('proxied'),
107
- /** mcp-proxy connection id (from `guuey connections add`). */
115
+ /** mcp-proxy connection id (not yet available — rides with the mcp-proxy credential broker). */
108
116
  connection: z.string().min(1),
109
117
  });
110
118
  /**
@@ -130,12 +138,24 @@ const ExternalMcp = z.strictObject({
130
138
  headers: HeadersSchema.optional(),
131
139
  /** Local dev-loop port (`guuey dev`) this MCP is served on for name→localhost URL resolution. */
132
140
  devPort: z.number().int().min(1).max(65535).optional(),
141
+ /**
142
+ * INTERNAL — set only by Router lowering; when present the federation mint
143
+ * uses this as the RFC 8707 resource instead of `url`.
144
+ */
145
+ mcpResourceUrl: z.url().optional(),
146
+ /**
147
+ * INTERNAL — set only by Router lowering when this entry is the spliced
148
+ * profile MCP; carries the agent's `profileAccess` posture onto the entry
149
+ * itself so the profile child's tool gate (read vs read-write) survives
150
+ * independent of the top-level `agent.profileAccess` field.
151
+ */
152
+ profileAccess: ProfileAccessSchema.optional(),
133
153
  });
134
154
  /**
135
155
  * A single MCP server entry inside `agent.mcpServers`.
136
156
  *
137
157
  * Discriminated union on `kind` — one slot per hosting mode:
138
- * - `colocated` — stdio child inside the agent pod
158
+ * - `colocated` — guuey-managed HTTP child inside the agent pod
139
159
  * - `hosted` — guuey-hosted registry MCP (Starter+)
140
160
  * - `proxied` — 3rd-party SaaS via mcp-proxy credential broker (v2)
141
161
  * - `external` — builder-hosted, reached by URL (plain or federated)
@@ -238,6 +258,13 @@ const StorageScopeSchema = z.array(z.enum(['user', 'app']));
238
258
  * Exported as a zod object so the top-level `GuueyJsonV1` schema (in
239
259
  * `./schema.ts`) can nest it. Static type via {@link GuueyAgent}.
240
260
  */
261
+ /**
262
+ * The `agent.mcpServers` map alone — for consumers that resolve/lower the
263
+ * servers SUBTREE without validating the whole snapshot (deploy-controller's
264
+ * resolve-mcp): whole-snapshot strictness made lowering fail open on any
265
+ * schema field the running consumer predates.
266
+ */
267
+ export const McpServersSection = z.record(z.string().min(1), McpServerSchema);
241
268
  export const AgentSectionV1 = z.strictObject({
242
269
  // ── Deploy routing ──
243
270
  /**
@@ -256,6 +283,14 @@ export const AgentSectionV1 = z.strictObject({
256
283
  mode: z.enum(['code', 'declarative']).optional(),
257
284
  // ── Framework + runtime ──
258
285
  framework: z.enum(AGENT_FRAMEWORKS).optional(),
286
+ /**
287
+ * Graceful code-mode: a module (path relative to the project root, built
288
+ * output) whose default export is the framework-native agent object or a
289
+ * factory `(guuey: GuueyContext) => agent`. The platform host imports and
290
+ * runs it — the dev writes zero harness code. Mutually exclusive with the
291
+ * full-worker `worker` field (which wins when both are present).
292
+ */
293
+ entry: z.string().min(1).optional(),
259
294
  model: z.string().min(1).optional(),
260
295
  /**
261
296
  * Managed-LLM provider selector — only meaningful for
@@ -274,7 +309,7 @@ export const AgentSectionV1 = z.strictObject({
274
309
  * `ggui` explicitly to keep it alongside other servers.
275
310
  *
276
311
  * Each entry is a discriminated union on `kind`:
277
- * - `'colocated'` — stdio child inside the agent pod
312
+ * - `'colocated'` — guuey-managed HTTP child inside the agent pod
278
313
  * - `'hosted'` — guuey-hosted registry MCP (Starter+)
279
314
  * - `'proxied'` — 3rd-party SaaS via mcp-proxy (v2)
280
315
  * - `'external'` — builder-hosted URL (plain or federated)
@@ -288,6 +323,7 @@ export const AgentSectionV1 = z.strictObject({
288
323
  auth: AuthSchema.optional(),
289
324
  memory: MemorySchema.optional(),
290
325
  storage: StorageScopeSchema.optional(),
326
+ profileAccess: ProfileAccessSchema.optional(),
291
327
  // ── Env + secrets ──
292
328
  /** Literal non-sensitive env vars baked into the pod at boot. */
293
329
  env: z.record(z.string().min(1), z.string()).optional(),
@@ -389,7 +425,7 @@ export function validateNoLiteralSecrets(agent) {
389
425
  if (!servers)
390
426
  return violations;
391
427
  for (const [serverName, server] of Object.entries(servers)) {
392
- // Only `colocated` and `external` union arms carry a `headers` field.
428
+ // Only the `external` union arm carries a `headers` field.
393
429
  const headers = 'headers' in server ? server.headers : undefined;
394
430
  if (!headers)
395
431
  continue;
@@ -412,6 +448,120 @@ export function validateNoLiteralSecrets(agent) {
412
448
  }
413
449
  return violations;
414
450
  }
451
+ // ── No-invalid-colocated-names validation (deploy-time contract enforcement) ──
452
+ //
453
+ // `agent.mcpServers`' key is schema-typed only `z.string().min(1)` — any
454
+ // non-empty string parses. But at pod boot, `lowerColocated` composes the
455
+ // KEY (not just `source`) into `colocatedResourceUrl(appId, name)`, which
456
+ // THROWS for anything outside `/^[A-Za-z0-9_-]+$/` (see `./colocated.ts`).
457
+ // An invalid colocated name therefore parses fine client-side and only
458
+ // fails once the pod is already booting, as an unactionable
459
+ // `POD_FATAL_BOOT_ERROR` crash-loop. `validateColocatedServerNames` is the
460
+ // deploy-time pre-flight that catches it first — mirrors
461
+ // `validateNoLiteralSecrets`'s shape (explicit lint, called by
462
+ // `@guuey/cli`'s `commands/deploy.ts` right before upload).
463
+ /**
464
+ * Validate that every `kind: 'colocated'` entry's NAME (the `mcpServers`
465
+ * map key) is safe to compose into `colocatedResourceUrl` — i.e. passes
466
+ * {@link isValidColocatedServerName} (from `./colocated.ts`, the single
467
+ * source of truth for the rule). Returns a list of human-readable
468
+ * violation messages (empty = clean).
469
+ */
470
+ export function validateColocatedServerNames(agent) {
471
+ const violations = [];
472
+ const servers = agent?.mcpServers;
473
+ if (!servers)
474
+ return violations;
475
+ for (const [name, server] of Object.entries(servers)) {
476
+ if (server.kind === 'colocated' && !isValidColocatedServerName(name)) {
477
+ violations.push(`colocated MCP server name "${name}" is invalid — use only letters, digits, hyphen, underscore (it becomes part of a URL and a storage scope)`);
478
+ }
479
+ }
480
+ return violations;
481
+ }
482
+ // ── No-proxied-servers validation (deploy-time contract enforcement) ────────
483
+ //
484
+ // `kind: 'proxied'` keeps its schema arm (the documented mcp-proxy
485
+ // credential-broker deferral — wires when the 2nd stored-creds customer signs
486
+ // up) but has NO runtime support today: a pod that booted one would silently
487
+ // miss those tools. `validateNoProxiedServers` is the synchronous deploy-time
488
+ // pre-flight (mirrors `validateColocatedServerNames`'s shape) that rejects it
489
+ // with a fast, actionable error. The deploy-controller's
490
+ // `resolveMcpServersInSnapshot` carries the authoritative backstop throw for
491
+ // code deploys, which never pass through this validator.
492
+ /**
493
+ * Validate that no `agent.mcpServers` entry uses `kind: 'proxied'`. Returns a
494
+ * list of human-readable violation messages (empty = clean), one per proxied
495
+ * entry, naming the server so the builder knows which ref to change.
496
+ */
497
+ export function validateNoProxiedServers(agent) {
498
+ const violations = [];
499
+ const servers = agent?.mcpServers;
500
+ if (!servers)
501
+ return violations;
502
+ for (const [name, server] of Object.entries(servers)) {
503
+ if (server.kind === 'proxied') {
504
+ violations.push(`MCP server "${name}": kind 'proxied' (the mcp-proxy credential broker) is not yet supported — use 'external', 'hosted', or 'colocated'.`);
505
+ }
506
+ }
507
+ return violations;
508
+ }
509
+ // ── Reserved platform MCP server names (deploy-time reservation) ────────────
510
+ //
511
+ // Some `mcpServers` map keys are OWNED by the platform: the runtime splices a
512
+ // platform-managed entry under them (memmcp — the auto-injected memory MCP is
513
+ // spliced under `guuey-memory` for authenticated invokes; see
514
+ // `nocode-runtime/src/run-seam.ts` + `boot-colocated.ts`). A builder that
515
+ // declares a server under a reserved key would (a) boot as builder code under
516
+ // the same key the platform child owns, and (b) be silently REPLACED by the
517
+ // platform entry at invoke time. `validateReservedServerNames` is the
518
+ // synchronous deploy-time pre-flight that rejects it with a fast, actionable
519
+ // 400 — the primary guard; the run-seam collision guard is defense-in-depth for
520
+ // stale pre-validator snapshots. Single source of the reserved literal: this
521
+ // module. The boot/splice layer (`boot-colocated.ts`) imports it from here.
522
+ /**
523
+ * The reserved colocated key the auto-injected memory MCP is booted + spliced
524
+ * under (memmcp). NEVER builder-declarable — the memory child's own server
525
+ * advertises this same name and its aud is `colocatedResourceUrl(appId, this)`.
526
+ */
527
+ export const RESERVED_MEMORY_SERVER_NAME = 'guuey-memory';
528
+ /**
529
+ * The reserved colocated key the auto-injected cross-app profile MCP is
530
+ * booted + spliced under (profile T1+). NEVER builder-declarable — mirrors
531
+ * {@link RESERVED_MEMORY_SERVER_NAME}'s reservation for the same reason: a
532
+ * builder-declared server under this key would be silently replaced by the
533
+ * platform entry at invoke time.
534
+ */
535
+ export const RESERVED_PROFILE_SERVER_NAME = 'guuey-profile';
536
+ /**
537
+ * Every `mcpServers` map key the platform reserves. Extensible — one entry
538
+ * today ({@link RESERVED_MEMORY_SERVER_NAME}); future platform-injected
539
+ * servers add their key here and inherit the deploy-time rejection for free.
540
+ */
541
+ export const RESERVED_MCP_SERVER_NAMES = [
542
+ RESERVED_MEMORY_SERVER_NAME,
543
+ RESERVED_PROFILE_SERVER_NAME,
544
+ ];
545
+ /**
546
+ * Validate that no `agent.mcpServers` entry uses a platform-RESERVED name
547
+ * ({@link RESERVED_MCP_SERVER_NAMES}) — regardless of `kind` (the key is
548
+ * reserved, not just one hosting mode; a builder must not shadow it as
549
+ * `colocated`, `external`, or anything else). Returns a list of human-readable
550
+ * violation messages (empty = clean), one per reserved entry. Mirrors
551
+ * {@link validateNoProxiedServers}'s shape.
552
+ */
553
+ export function validateReservedServerNames(agent) {
554
+ const violations = [];
555
+ const servers = agent?.mcpServers;
556
+ if (!servers)
557
+ return violations;
558
+ for (const name of Object.keys(servers)) {
559
+ if (RESERVED_MCP_SERVER_NAMES.includes(name)) {
560
+ violations.push(`MCP server "${name}": that name is reserved by the platform (an auto-injected server uses it) — rename this server.`);
561
+ }
562
+ }
563
+ return violations;
564
+ }
415
565
  /**
416
566
  * Platform default MCP server map. Applied by the pod when `agent.mcpServers`
417
567
  * is absent. Exposed here so non-pod consumers (CLI dry-run, lints) can show
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `@guuey/config/browser` — the package minus `loader.js`.
3
+ *
4
+ * `loader.js` imports `node:fs` (guuey.json file resolution), which a
5
+ * browser bundler cannot chunk — importing the root barrel from client
6
+ * code fails `next build` outright (Turbopack: "does not support
7
+ * external modules (request: node:fs)"). Browser consumers (Guuey
8
+ * Studio's agent-config) import this entry instead; Node consumers
9
+ * (CLI, backend, pods) keep the root barrel.
10
+ *
11
+ * Every module re-exported here must stay free of Node builtins.
12
+ */
13
+ export * from './schema.js';
14
+ export * from './agent.js';
15
+ export * from './app.js';
16
+ export * from './ggui.js';
17
+ export * from './hosting.js';
18
+ export * from './system-prompt.js';
19
+ export * from './registry.js';
20
+ export * from './guuey-context.js';
21
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * `@guuey/config/browser` — the package minus `loader.js`.
3
+ *
4
+ * `loader.js` imports `node:fs` (guuey.json file resolution), which a
5
+ * browser bundler cannot chunk — importing the root barrel from client
6
+ * code fails `next build` outright (Turbopack: "does not support
7
+ * external modules (request: node:fs)"). Browser consumers (Guuey
8
+ * Studio's agent-config) import this entry instead; Node consumers
9
+ * (CLI, backend, pods) keep the root barrel.
10
+ *
11
+ * Every module re-exported here must stay free of Node builtins.
12
+ */
13
+ export * from './schema.js';
14
+ export * from './agent.js';
15
+ export * from './app.js';
16
+ export * from './ggui.js';
17
+ export * from './hosting.js';
18
+ export * from './system-prompt.js';
19
+ export * from './registry.js';
20
+ export * from './guuey-context.js';
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Synthetic resource-URL helper for `kind: 'colocated'` MCP servers.
3
+ *
4
+ * A colocated MCP has no real network URL (it's a guuey-managed HTTP child
5
+ * inside the agent pod, reached over a loopback/localhost hop the Router
6
+ * wires up) — but RFC 8707 federation still needs a stable `aud`/resource
7
+ * value to mint against, and `@guuey/state`'s KV needs a stable scope key.
8
+ * `colocatedResourceUrl` composes both from `(appId, serverName)`.
9
+ *
10
+ * The returned URL is consumed by `backend/amplify/functions/oidcMint/
11
+ * handler.ts`'s `parseMcpResourceUrl`, which requires: `https://` prefix,
12
+ * a trailing `/`, and a total length ≤ 512 chars. Both segments are
13
+ * validated against `/^[A-Za-z0-9_-]+$/` BEFORE composing the URL — they
14
+ * are used verbatim as URL path segments AND as a KV scope key, so an
15
+ * unvalidated segment (e.g. containing `/` or whitespace) could smuggle an
16
+ * extra path segment or break the scope contract.
17
+ */
18
+ /**
19
+ * The synthetic origin every colocated resource URL lives on. Guuey-owned
20
+ * and compile-time-fixed (NOT env-varying — the host never resolves; it
21
+ * exists only as a stable RFC 8707 `aud` / KV-scope namespace), so
22
+ * consumers that must recognize "is this URL guuey-controlled?" (e.g. the
23
+ * stateApi admin-ownership walk's origin filter) import THIS constant
24
+ * instead of re-declaring the string or threading a new env var.
25
+ */
26
+ export declare const COLOCATED_ORIGIN = "https://colocated.guuey.com";
27
+ /**
28
+ * Whether `value` is safe to use as a `colocatedResourceUrl` path segment /
29
+ * KV scope key (letters, digits, hyphen, underscore only). Single source of
30
+ * truth for that rule — reused by {@link assertSafeSegment} here AND by
31
+ * `./agent.ts#validateColocatedServerNames` (the CLI deploy-time check
32
+ * `@guuey/cli`'s `commands/deploy.ts` runs before upload), so a bad
33
+ * colocated server name is rejected before deploy instead of surfacing only
34
+ * as a `POD_FATAL_BOOT_ERROR` crash-loop when the pod's `lowerColocated`
35
+ * calls `colocatedResourceUrl` at boot.
36
+ */
37
+ export declare function isValidColocatedServerName(value: string): boolean;
38
+ /**
39
+ * Build the synthetic `https://colocated.guuey.com/<appId>/<serverName>/`
40
+ * resource URL for a colocated MCP server. Throws if either segment fails
41
+ * the safe-segment check.
42
+ */
43
+ export declare function colocatedResourceUrl(appId: string, serverName: string): string;
44
+ //# sourceMappingURL=colocated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colocated.d.ts","sourceRoot":"","sources":["../src/colocated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,gCAAgC,CAAC;AAE9D;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjE;AAUD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAI9E"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Synthetic resource-URL helper for `kind: 'colocated'` MCP servers.
3
+ *
4
+ * A colocated MCP has no real network URL (it's a guuey-managed HTTP child
5
+ * inside the agent pod, reached over a loopback/localhost hop the Router
6
+ * wires up) — but RFC 8707 federation still needs a stable `aud`/resource
7
+ * value to mint against, and `@guuey/state`'s KV needs a stable scope key.
8
+ * `colocatedResourceUrl` composes both from `(appId, serverName)`.
9
+ *
10
+ * The returned URL is consumed by `backend/amplify/functions/oidcMint/
11
+ * handler.ts`'s `parseMcpResourceUrl`, which requires: `https://` prefix,
12
+ * a trailing `/`, and a total length ≤ 512 chars. Both segments are
13
+ * validated against `/^[A-Za-z0-9_-]+$/` BEFORE composing the URL — they
14
+ * are used verbatim as URL path segments AND as a KV scope key, so an
15
+ * unvalidated segment (e.g. containing `/` or whitespace) could smuggle an
16
+ * extra path segment or break the scope contract.
17
+ */
18
+ const SAFE_SEGMENT_RE = /^[A-Za-z0-9_-]+$/;
19
+ /**
20
+ * The synthetic origin every colocated resource URL lives on. Guuey-owned
21
+ * and compile-time-fixed (NOT env-varying — the host never resolves; it
22
+ * exists only as a stable RFC 8707 `aud` / KV-scope namespace), so
23
+ * consumers that must recognize "is this URL guuey-controlled?" (e.g. the
24
+ * stateApi admin-ownership walk's origin filter) import THIS constant
25
+ * instead of re-declaring the string or threading a new env var.
26
+ */
27
+ export const COLOCATED_ORIGIN = 'https://colocated.guuey.com';
28
+ /**
29
+ * Whether `value` is safe to use as a `colocatedResourceUrl` path segment /
30
+ * KV scope key (letters, digits, hyphen, underscore only). Single source of
31
+ * truth for that rule — reused by {@link assertSafeSegment} here AND by
32
+ * `./agent.ts#validateColocatedServerNames` (the CLI deploy-time check
33
+ * `@guuey/cli`'s `commands/deploy.ts` runs before upload), so a bad
34
+ * colocated server name is rejected before deploy instead of surfacing only
35
+ * as a `POD_FATAL_BOOT_ERROR` crash-loop when the pod's `lowerColocated`
36
+ * calls `colocatedResourceUrl` at boot.
37
+ */
38
+ export function isValidColocatedServerName(value) {
39
+ return SAFE_SEGMENT_RE.test(value);
40
+ }
41
+ function assertSafeSegment(value, label) {
42
+ if (!isValidColocatedServerName(value)) {
43
+ throw new Error(`colocatedResourceUrl: ${label} "${value}" must match ${SAFE_SEGMENT_RE.source} (it composes a URL path segment and a KV scope key)`);
44
+ }
45
+ }
46
+ /**
47
+ * Build the synthetic `https://colocated.guuey.com/<appId>/<serverName>/`
48
+ * resource URL for a colocated MCP server. Throws if either segment fails
49
+ * the safe-segment check.
50
+ */
51
+ export function colocatedResourceUrl(appId, serverName) {
52
+ assertSafeSegment(appId, 'appId');
53
+ assertSafeSegment(serverName, 'serverName');
54
+ return `${COLOCATED_ORIGIN}/${appId}/${serverName}/`;
55
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * `GuueyContext` — everything the platform resolved for one turn, handed to a
3
+ * graceful-mode agent factory. THE import channel for graceful devs:
4
+ *
5
+ * ```ts
6
+ * import type { GuueyContext } from "@guuey/config";
7
+ * export default (guuey: GuueyContext) => new LlmAgent({
8
+ * model: guuey.model,
9
+ * // Function form — safe for every framework; required for ADK, which
10
+ * // applies `{var}` substitution to a plain-string instruction.
11
+ * instruction: () => guuey.instruction,
12
+ * tools: [myTool, ...guuey.mcpToolsets],
13
+ * });
14
+ * ```
15
+ *
16
+ * Types-only and dependency-free by design (`@guuey/config` is already a
17
+ * template dependency; the host — which ASSEMBLES the context — is not). The
18
+ * tiny shapes below are structurally identical to `@guuey/worker`'s protocol
19
+ * types; duplicating them here keeps config free of a runtime package
20
+ * dependency for what is purely a type channel.
21
+ *
22
+ * The factory runs PER INVOKE (matching the per-invoke agent construction the
23
+ * platform host has always done), so per-turn surfaces — the user, this
24
+ * turn's state — are first-class, not bolted on.
25
+ */
26
+ /** Router-vouched end-user identity for this turn (multi-tenant). */
27
+ export interface GuueyContextUser {
28
+ id: string;
29
+ authMode: "anonymous" | "authenticated";
30
+ }
31
+ /**
32
+ * The three GuueyFS layer mounts (absolute paths):
33
+ * - `app` — read-only app assets,
34
+ * - `home` — per-USER durable storage,
35
+ * - `session` — per-session scratch.
36
+ */
37
+ export interface GuueyContextFiles {
38
+ app: string;
39
+ home: string;
40
+ session: string;
41
+ }
42
+ /** One prior message from the recent history window. */
43
+ export interface GuueyContextMessage {
44
+ role: "user" | "agent";
45
+ text: string;
46
+ }
47
+ /** One thread-memory record folded from prior turns. */
48
+ export interface GuueyContextMemoryRecord {
49
+ key?: string;
50
+ value: unknown;
51
+ }
52
+ /**
53
+ * The full per-turn platform context. `TToolset` is the framework's MCP
54
+ * toolset type (e.g. `MCPToolset` from `@google/adk`) — defaults to `unknown`
55
+ * so the type stays framework-neutral.
56
+ *
57
+ * History, memory, and working state are ALSO auto-injected into
58
+ * `instruction` as the standard context preamble — a factory that ignores
59
+ * them still yields a conversational agent. They appear here read-only so an
60
+ * advanced factory can do better than the default preamble.
61
+ */
62
+ export interface GuueyContext<TToolset = unknown> {
63
+ /** Resolved model id (from guuey.json / registry default). */
64
+ model: string;
65
+ /**
66
+ * The system prompt WITH the standard context preamble (history, thread
67
+ * memory, working state) already prepended. Feed this to the agent unless
68
+ * you are rendering context yourself from the raw fields below.
69
+ */
70
+ instruction: string;
71
+ /** Ready-to-use MCP toolsets for every server declared in guuey.json. */
72
+ mcpToolsets: TToolset[];
73
+ /** The end user this turn serves. */
74
+ user: GuueyContextUser;
75
+ /** The three-tier file storage paths. */
76
+ files: GuueyContextFiles;
77
+ /** Recent conversation window (read side; auto-preambled). */
78
+ history: GuueyContextMessage[];
79
+ /** Thread memory records (read side; auto-preambled). */
80
+ memory: GuueyContextMemoryRecord[];
81
+ /** Prior working state carried from the previous turn (read side). */
82
+ workingState: unknown | undefined;
83
+ }
84
+ /**
85
+ * What a graceful agent module's default export may be: the framework-native
86
+ * agent object itself, or a factory receiving the {@link GuueyContext}.
87
+ * Factories may be async.
88
+ */
89
+ export type GuueyAgentExport<TAgent = object, TToolset = unknown> = TAgent | ((guuey: GuueyContext<TToolset>) => TAgent | Promise<TAgent>);
90
+ //# sourceMappingURL=guuey-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guuey-context.d.ts","sourceRoot":"","sources":["../src/guuey-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,qEAAqE;AACrE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,WAAW,GAAG,eAAe,CAAC;CACzC;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wDAAwD;AACxD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wDAAwD;AACxD,MAAM,WAAW,wBAAwB;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY,CAAC,QAAQ,GAAG,OAAO;IAC9C,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,qCAAqC;IACrC,IAAI,EAAE,gBAAgB,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,iBAAiB,CAAC;IACzB,8DAA8D;IAC9D,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,yDAAyD;IACzD,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACnC,sEAAsE;IACtE,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,CAAC,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAG,OAAO,IAC5D,MAAM,GACN,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `GuueyContext` — everything the platform resolved for one turn, handed to a
3
+ * graceful-mode agent factory. THE import channel for graceful devs:
4
+ *
5
+ * ```ts
6
+ * import type { GuueyContext } from "@guuey/config";
7
+ * export default (guuey: GuueyContext) => new LlmAgent({
8
+ * model: guuey.model,
9
+ * // Function form — safe for every framework; required for ADK, which
10
+ * // applies `{var}` substitution to a plain-string instruction.
11
+ * instruction: () => guuey.instruction,
12
+ * tools: [myTool, ...guuey.mcpToolsets],
13
+ * });
14
+ * ```
15
+ *
16
+ * Types-only and dependency-free by design (`@guuey/config` is already a
17
+ * template dependency; the host — which ASSEMBLES the context — is not). The
18
+ * tiny shapes below are structurally identical to `@guuey/worker`'s protocol
19
+ * types; duplicating them here keeps config free of a runtime package
20
+ * dependency for what is purely a type channel.
21
+ *
22
+ * The factory runs PER INVOKE (matching the per-invoke agent construction the
23
+ * platform host has always done), so per-turn surfaces — the user, this
24
+ * turn's state — are first-class, not bolted on.
25
+ */
26
+ export {};
package/dist/index.d.ts CHANGED
@@ -12,10 +12,12 @@
12
12
  */
13
13
  export * from './schema.js';
14
14
  export * from './agent.js';
15
+ export * from './colocated.js';
15
16
  export * from './app.js';
16
17
  export * from './ggui.js';
17
18
  export * from './loader.js';
18
19
  export * from './hosting.js';
19
20
  export * from './system-prompt.js';
20
21
  export * from './registry.js';
22
+ export * from './guuey-context.js';
21
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -12,9 +12,11 @@
12
12
  */
13
13
  export * from './schema.js';
14
14
  export * from './agent.js';
15
+ export * from './colocated.js';
15
16
  export * from './app.js';
16
17
  export * from './ggui.js';
17
18
  export * from './loader.js';
18
19
  export * from './hosting.js';
19
20
  export * from './system-prompt.js';
20
21
  export * from './registry.js';
22
+ export * from './guuey-context.js';
@@ -18,6 +18,13 @@ export interface FrameworkEntry {
18
18
  readonly facetSupportedRange: string | null;
19
19
  readonly defaultProvider: "anthropic" | "openai" | "google";
20
20
  }
21
+ /**
22
+ * Array order is picker order AFTER `modelsForProvider` floats the default to
23
+ * the front — the platform's app-behavior picker shows only `.slice(0, 2)` for
24
+ * google + openai, so the second array entry per provider is a product-visible
25
+ * choice, not incidental. Pinned by
26
+ * `apps/platform/.../ModelSection/ModelSection.test.ts`.
27
+ */
21
28
  export declare const MODEL_REGISTRY: readonly ModelEntry[];
22
29
  export declare const FRAMEWORK_REGISTRY: readonly FrameworkEntry[];
23
30
  /**
@@ -1 +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"}
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;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,UAAU,EA0B/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"}
package/dist/registry.js CHANGED
@@ -2,18 +2,36 @@
2
2
  * Model + framework registry — single source of truth per the model-release
3
3
  * playbook §8 item A; a release = one entry change here + rate-card row.
4
4
  */
5
+ /**
6
+ * Array order is picker order AFTER `modelsForProvider` floats the default to
7
+ * the front — the platform's app-behavior picker shows only `.slice(0, 2)` for
8
+ * google + openai, so the second array entry per provider is a product-visible
9
+ * choice, not incidental. Pinned by
10
+ * `apps/platform/.../ModelSection/ModelSection.test.ts`.
11
+ */
5
12
  export const MODEL_REGISTRY = [
6
13
  { id: "claude-sonnet-5", provider: "anthropic", label: "Claude Sonnet 5", status: "ga", isDefault: true },
7
14
  { id: "claude-fable-5", provider: "anthropic", label: "Claude Fable 5", status: "ga" },
15
+ { id: "claude-opus-5", provider: "anthropic", label: "Claude Opus 5", status: "ga" },
8
16
  { id: "claude-sonnet-4-6", provider: "anthropic", label: "Claude Sonnet 4.6", status: "ga" },
9
17
  { id: "claude-haiku-4-5", provider: "anthropic", label: "Claude Haiku 4.5", status: "ga" },
10
18
  { 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 },
19
+ // Terra guuey's OpenAI default (founder call 2026-07-25). This DELIBERATELY
20
+ // diverges from OpenAI's own `gpt-5.6` alias, which routes to Sol: Terra is
21
+ // half Sol's price and the better cost/balance pick for hosted agent
22
+ // workloads. The bare `gpt-5.6` alias is intentionally NOT a registry id
23
+ // (never offered in a picker) — the rate card still rows it at Sol's price so
24
+ // an alias call from BYO config can't under-meter.
25
+ { id: "gpt-5.6-terra", provider: "openai", label: "GPT-5.6 Terra", status: "ga", isDefault: true },
26
+ { id: "gpt-5.6-sol", provider: "openai", label: "GPT-5.6 Sol", status: "ga" },
27
+ { id: "gpt-5.6-luna", provider: "openai", label: "GPT-5.6 Luna", status: "ga" },
28
+ { id: "gpt-5.5", provider: "openai", label: "GPT-5.5", status: "ga" },
12
29
  { id: "gpt-5.4", provider: "openai", label: "GPT-5.4", status: "ga" },
13
30
  { id: "gpt-4o", provider: "openai", label: "GPT-4o", status: "ga" },
14
31
  { 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 },
32
+ { id: "gemini-3.6-flash", provider: "google", label: "Gemini 3.6 Flash", status: "ga", isDefault: true },
33
+ { id: "gemini-3.5-flash-lite", provider: "google", label: "Gemini 3.5 Flash Lite", status: "ga" },
34
+ { id: "gemini-3.5-flash", provider: "google", label: "Gemini 3.5 Flash", status: "ga" },
17
35
  { id: "gemini-3.1-pro", provider: "google", label: "Gemini 3.1 Pro", status: "ga" },
18
36
  { id: "gemini-2.5-flash", provider: "google", label: "Gemini 2.5 Flash", status: "ga" },
19
37
  { id: "gemini-2.5-pro", provider: "google", label: "Gemini 2.5 Pro", status: "ga" },
@@ -35,9 +53,9 @@ export const FRAMEWORK_REGISTRY = [
35
53
  },
36
54
  {
37
55
  framework: "google-adk",
38
- sdkPackage: "google-adk",
39
- platformPinnedVersion: "2.3.0",
40
- facetSupportedRange: null,
56
+ sdkPackage: "@google/adk", // the OFFICIAL JS ADK (the Python lane retired with guuey_adk_host)
57
+ platformPinnedVersion: "1.3.0", // pinned in @guuey-private/host-shared
58
+ facetSupportedRange: ">=1.0.0 <2", // @silverprotocol/google-adk peer range
41
59
  defaultProvider: "google",
42
60
  },
43
61
  {
package/dist/schema.d.ts CHANGED
@@ -8,7 +8,7 @@
8
8
  * - `ggui` (optional) — cross-protocol integration if the agent uses ggui rendering
9
9
  *
10
10
  * Plus top-level platform identity (`appId`, `workspaceId`) populated by
11
- * the CLI after `guuey create` / `guuey link`.
11
+ * the CLI after `guuey create` / `guuey pull --app-id`.
12
12
  *
13
13
  * **Filename convention** (filename = artifact kind, see design doc §3):
14
14
  * ```
@@ -48,8 +48,8 @@ import { type GuueyGguiSection } from './ggui.js';
48
48
  * only an MCP server uses `guuey.mcp.json` instead (separate schema).
49
49
  *
50
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.
51
+ * the CLI after `guuey create` / `guuey pull --app-id`. A fresh project has
52
+ * neither. After first `guuey create`, both may be present.
53
53
  *
54
54
  * Re-exports the sub-section types for consumer convenience.
55
55
  */
@@ -68,6 +68,7 @@ export declare const GuueyJsonV1: z.ZodObject<{
68
68
  "google-adk": "google-adk";
69
69
  vanilla: "vanilla";
70
70
  }>>;
71
+ entry: z.ZodOptional<z.ZodString>;
71
72
  model: z.ZodOptional<z.ZodString>;
72
73
  modelProvider: z.ZodOptional<z.ZodEnum<{
73
74
  openai: "openai";
@@ -78,9 +79,8 @@ export declare const GuueyJsonV1: z.ZodObject<{
78
79
  }, z.core.$strict>]>>;
79
80
  mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
80
81
  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>>;
82
+ source: z.ZodString;
83
+ devPort: z.ZodOptional<z.ZodNumber>;
84
84
  }, z.core.$strict>, z.ZodObject<{
85
85
  kind: z.ZodLiteral<"hosted">;
86
86
  server: z.ZodOptional<z.ZodString>;
@@ -99,6 +99,11 @@ export declare const GuueyJsonV1: z.ZodObject<{
99
99
  federate: z.ZodOptional<z.ZodBoolean>;
100
100
  headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
101
101
  devPort: z.ZodOptional<z.ZodNumber>;
102
+ mcpResourceUrl: z.ZodOptional<z.ZodURL>;
103
+ profileAccess: z.ZodOptional<z.ZodEnum<{
104
+ read: "read";
105
+ "read-write": "read-write";
106
+ }>>;
102
107
  }, z.core.$strict>], "kind">>>;
103
108
  tools: z.ZodOptional<z.ZodObject<{
104
109
  allowlist: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -130,6 +135,10 @@ export declare const GuueyJsonV1: z.ZodObject<{
130
135
  user: "user";
131
136
  app: "app";
132
137
  }>>>;
138
+ profileAccess: z.ZodOptional<z.ZodEnum<{
139
+ read: "read";
140
+ "read-write": "read-write";
141
+ }>>;
133
142
  env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
134
143
  secrets: z.ZodOptional<z.ZodArray<z.ZodString>>;
135
144
  endpoint: z.ZodOptional<z.ZodObject<{
@@ -1 +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"}
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"}
package/dist/schema.js CHANGED
@@ -8,7 +8,7 @@
8
8
  * - `ggui` (optional) — cross-protocol integration if the agent uses ggui rendering
9
9
  *
10
10
  * Plus top-level platform identity (`appId`, `workspaceId`) populated by
11
- * the CLI after `guuey create` / `guuey link`.
11
+ * the CLI after `guuey create` / `guuey pull --app-id`.
12
12
  *
13
13
  * **Filename convention** (filename = artifact kind, see design doc §3):
14
14
  * ```
@@ -48,8 +48,8 @@ import { GguiSectionV1 } from './ggui.js';
48
48
  * only an MCP server uses `guuey.mcp.json` instead (separate schema).
49
49
  *
50
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.
51
+ * the CLI after `guuey create` / `guuey pull --app-id`. A fresh project has
52
+ * neither. After first `guuey create`, both may be present.
53
53
  *
54
54
  * Re-exports the sub-section types for consumer convenience.
55
55
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guuey/config",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Open-source schemas + loaders for the three guuey config files: agent.json (declarative agent definition), guuey.json (hosted-deploy overlay), and the helper types around them. Consumed by @guuey/cli, the guuey backend, and devs writing their own agent or MCP server.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -16,6 +16,16 @@
16
16
  "types": "./dist/index.d.ts",
17
17
  "import": "./dist/index.js",
18
18
  "default": "./dist/index.js"
19
+ },
20
+ "./registry": {
21
+ "types": "./dist/registry.d.ts",
22
+ "import": "./dist/registry.js",
23
+ "default": "./dist/registry.js"
24
+ },
25
+ "./browser": {
26
+ "types": "./dist/browser.d.ts",
27
+ "import": "./dist/browser.js",
28
+ "default": "./dist/browser.js"
19
29
  }
20
30
  },
21
31
  "dependencies": {