/** * `guuey.json#app` — the App Store / Portal listing section. * * Describes how the deployable surfaces to end-users in Portal Discover * and (optionally) at a custom domain. Read by the platform on first * deploy to upsert an `AgentListing` row. * * Lives at the same level as `agent` and `ggui` sections — the artifact * (agent or mcp-server) is what's deployable; this section is presentation. */ import { z } from 'zod'; import { type GuueyAppTheme } from './theme.js'; /** * End-user auth modes an app record accepts — mirrors the platform's * `USER_AUTH_MODES` (`@guuey-private/types` `security/user-auth-mode.ts`), * which this published package cannot import; the backend pins the two * lists equal (`handlers/reconcile.test.ts`). */ export declare const APP_USER_AUTH_MODES: readonly ["anonymous", "native_pool", "byo"]; export type AppUserAuthMode = (typeof APP_USER_AUTH_MODES)[number]; /** * `guuey.json#app.access` — the app record's ACCESS POLICY, declared in the * manifest so `guuey agent apply` (agents-as-code, guuey#190) converges it * alongside the agent definition. Field names ARE the platform API's * (`PUT /v1/apps/:id` / the reconcile `config` block): no translation. * * PUT-per-field semantics: a field that is absent is left untouched by a * reconcile (never reset). `userAuthConfig: null` is the explicit "clear the * issuer binding". The hosted `GuueyApp` row remains the only enforcement * source — this block is the DECLARATION reconcile makes it agree with; * the pod ignores it. * * Tier is deliberately absent (admin plane, never CI); slug/customDomain/ * listing stay declared-not-converged (they have their own ceremonies). */ export declare const AppAccessV1: z.ZodObject<{ userAuthMode: z.ZodOptional>; userAuthConfig: z.ZodOptional>>; allowedDomains: z.ZodOptional>; guestAccess: z.ZodOptional>; }, z.core.$strict>; /** Static TypeScript type for `app.access`. */ export type GuueyAppAccess = z.infer; /** * `guuey.json#app.page` — the STANDALONE PAGE's posture, declared in the * manifest so `guuey agent apply` converges it (posture-as-code, guuey#286; * requested by the first agents-as-code consumer, ggui#558). Field names ARE * the platform's `standalonePage` patch vocabulary (`PUT /v1/apps/:id` / * the reconcile `config` block, cli-wire `STANDALONE_PAGE_FIELDS`) — no * translation; the backend pins the two lists equal * (`handlers/reconcile.test.ts`, the APP_USER_AUTH_MODES pattern). * * Patch semantics, same as the PUT: an absent member is left untouched by a * reconcile, `null` clears the member to its default (page on, indexable, no * copy/CTA/endpoint). Values are shape-checked only — caps, the https rule * and the CTA both-or-neither pairing are the platform validator's * (`validateStandalonePagePatch`), so the CLI surfaces its exact message * (the same split as `app.theme`'s colour grammar). * * `slug` stays OUT: claiming has uniqueness/release semantics (a ceremony, * not a converged field). But the posture here REACHES the slug ceremony's * automatic arm: the first-Live default-slug claim (guuey#249) consults it * and skips when `enabled: false` — `--page off` in git means no auto-named * public host, ever. */ export declare const AppPageV1: z.ZodObject<{ enabled: z.ZodOptional>; welcomeCopy: z.ZodOptional>; ctaLabel: z.ZodOptional>; ctaUrl: z.ZodOptional>; identityEndpointUrl: z.ZodOptional>; noindex: z.ZodOptional>; }, z.core.$strict>; /** Static TypeScript type for `app.page`. */ export type GuueyAppPage = z.infer; /** * `app.theme` as a file reference — `{ "file": "theme.json" }`, the same * convention as `agent.systemPrompt` (guuey#400). The file's CONTENT is the * same {@link AppThemeV1} vocabulary — no new grammar. Resolution is * CLI-side (the loader reads the file relative to `guuey.json`); the server * only ever sees the inline document and 400s an unresolved reference. * * Discrimination against the inline form is unambiguous: a `{file}`-only * strict object can never collide with the theme vocabulary (which * requires `mode`/`colors`). */ export declare const ThemeFileRefV1: z.ZodObject<{ file: z.ZodString; }, z.core.$strict>; export type ThemeFileRef = z.infer; /** Narrow an `app.theme` value to the `{ file }` reference form. */ export declare function isThemeFileRef(theme: ThemeFileRef | GuueyAppTheme): theme is ThemeFileRef; /** * The app section schema. All fields optional in v1 — a project may carry * the bare minimum at first and grow the listing as it publishes. */ export declare const AppSectionV1: z.ZodObject<{ slug: z.ZodOptional; name: z.ZodOptional; description: z.ZodOptional; iconUrl: z.ZodOptional; tags: z.ZodOptional>; customDomain: z.ZodOptional; access: z.ZodOptional>; userAuthConfig: z.ZodOptional>>; allowedDomains: z.ZodOptional>; guestAccess: z.ZodOptional>; }, z.core.$strict>>; theme: z.ZodOptional, z.ZodObject<{ name: z.ZodOptional; mode: z.ZodEnum<{ light: "light"; dark: "dark"; }>; colors: z.ZodObject<{ light: z.ZodObject<{ accent: z.ZodString; onAccent: z.ZodString; ink: z.ZodString; inkMuted: z.ZodString; surface: z.ZodString; canvas: z.ZodString; canvasMuted: z.ZodString; error: z.ZodString; link: z.ZodOptional; secondaryAccent: z.ZodOptional; onSecondaryAccent: z.ZodOptional; success: z.ZodOptional; warning: z.ZodOptional; info: z.ZodOptional; }, z.core.$strict>; dark: z.ZodObject<{ accent: z.ZodString; onAccent: z.ZodString; ink: z.ZodString; inkMuted: z.ZodString; surface: z.ZodString; canvas: z.ZodString; canvasMuted: z.ZodString; error: z.ZodString; link: z.ZodOptional; secondaryAccent: z.ZodOptional; onSecondaryAccent: z.ZodOptional; success: z.ZodOptional; warning: z.ZodOptional; info: z.ZodOptional; }, z.core.$strict>; }, z.core.$strict>; typography: z.ZodOptional; monoFontFamily: z.ZodOptional; headingFontFamily: z.ZodOptional; scale: z.ZodOptional; faces: z.ZodOptional; style: z.ZodOptional; display: z.ZodOptional; }, z.core.$strict>>>; }, z.core.$strict>>; shape: z.ZodOptional; density: z.ZodEnum<{ compact: "compact"; comfortable: "comfortable"; }>; shadow: z.ZodOptional; intensity: z.ZodOptional; }, z.core.$strict>>; glass: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>; typeScale: z.ZodOptional; weight: z.ZodOptional; tracking: z.ZodOptional; leading: z.ZodOptional; }, z.core.$strict>>; h1: z.ZodOptional; weight: z.ZodOptional; tracking: z.ZodOptional; leading: z.ZodOptional; }, z.core.$strict>>; h2: z.ZodOptional; weight: z.ZodOptional; tracking: z.ZodOptional; leading: z.ZodOptional; }, z.core.$strict>>; body: z.ZodOptional; weight: z.ZodOptional; tracking: z.ZodOptional; leading: z.ZodOptional; }, z.core.$strict>>; label: z.ZodOptional; weight: z.ZodOptional; tracking: z.ZodOptional; leading: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>; rhythm: z.ZodOptional; inset: z.ZodOptional; }, z.core.$strict>>; motion: z.ZodOptional; base: z.ZodOptional; slow: z.ZodOptional; }, z.core.$strict>>; easing: z.ZodOptional; emphasized: z.ZodOptional; exit: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>; scrim: z.ZodOptional; opacity: z.ZodNumber; blur: z.ZodNumber; }, z.core.$strict>>; courts: z.ZodOptional; mode: z.ZodOptional>; colors: z.ZodOptional; onAccent: z.ZodOptional; ink: z.ZodOptional; inkMuted: z.ZodOptional; surface: z.ZodOptional; canvas: z.ZodOptional; canvasMuted: z.ZodOptional; error: z.ZodOptional; link: z.ZodOptional>; secondaryAccent: z.ZodOptional>; onSecondaryAccent: z.ZodOptional>; success: z.ZodOptional>; warning: z.ZodOptional>; info: z.ZodOptional>; }, z.core.$strict>>; dark: z.ZodOptional; onAccent: z.ZodOptional; ink: z.ZodOptional; inkMuted: z.ZodOptional; surface: z.ZodOptional; canvas: z.ZodOptional; canvasMuted: z.ZodOptional; error: z.ZodOptional; link: z.ZodOptional>; secondaryAccent: z.ZodOptional>; onSecondaryAccent: z.ZodOptional>; success: z.ZodOptional>; warning: z.ZodOptional>; info: z.ZodOptional>; }, z.core.$strict>>; }, z.core.$strict>>; typography: z.ZodOptional; monoFontFamily: z.ZodOptional; headingFontFamily: z.ZodOptional; scale: z.ZodOptional; faces: z.ZodOptional; style: z.ZodOptional; display: z.ZodOptional; }, z.core.$strict>>>; }, z.core.$strict>>; shape: z.ZodOptional>; density: z.ZodOptional>; shadow: z.ZodOptional; intensity: z.ZodOptional; }, z.core.$strict>>; glass: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>; typeScale: z.ZodOptional; weight: z.ZodOptional; tracking: z.ZodOptional; leading: z.ZodOptional; }, z.core.$strict>>; h1: z.ZodOptional; weight: z.ZodOptional; tracking: z.ZodOptional; leading: z.ZodOptional; }, z.core.$strict>>; h2: z.ZodOptional; weight: z.ZodOptional; tracking: z.ZodOptional; leading: z.ZodOptional; }, z.core.$strict>>; body: z.ZodOptional; weight: z.ZodOptional; tracking: z.ZodOptional; leading: z.ZodOptional; }, z.core.$strict>>; label: z.ZodOptional; weight: z.ZodOptional; tracking: z.ZodOptional; leading: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>; rhythm: z.ZodOptional; inset: z.ZodOptional; }, z.core.$strict>>; motion: z.ZodOptional; base: z.ZodOptional; slow: z.ZodOptional; }, z.core.$strict>>; easing: z.ZodOptional; emphasized: z.ZodOptional; exit: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>; scrim: z.ZodOptional; opacity: z.ZodNumber; blur: z.ZodNumber; }, z.core.$strict>>; }, z.core.$strict>>>; }, z.core.$strict>]>>; page: z.ZodOptional>; welcomeCopy: z.ZodOptional>; ctaLabel: z.ZodOptional>; ctaUrl: z.ZodOptional>; identityEndpointUrl: z.ZodOptional>; noindex: z.ZodOptional>; }, z.core.$strict>>; suggestions: z.ZodOptional>; }, z.core.$strict>; /** Static TypeScript type for the app section. */ export type GuueyApp = z.infer; //# sourceMappingURL=app.d.ts.map