@aigne/afs-ui 1.11.0-beta.12
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/LICENSE.md +26 -0
- package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
- package/dist/aup-protocol.cjs +235 -0
- package/dist/aup-protocol.d.cts +78 -0
- package/dist/aup-protocol.d.cts.map +1 -0
- package/dist/aup-protocol.d.mts +78 -0
- package/dist/aup-protocol.d.mts.map +1 -0
- package/dist/aup-protocol.mjs +235 -0
- package/dist/aup-protocol.mjs.map +1 -0
- package/dist/aup-registry.cjs +2489 -0
- package/dist/aup-registry.mjs +2487 -0
- package/dist/aup-registry.mjs.map +1 -0
- package/dist/aup-spec.cjs +1467 -0
- package/dist/aup-spec.mjs +1466 -0
- package/dist/aup-spec.mjs.map +1 -0
- package/dist/aup-types.cjs +165 -0
- package/dist/aup-types.d.cts +157 -0
- package/dist/aup-types.d.cts.map +1 -0
- package/dist/aup-types.d.mts +157 -0
- package/dist/aup-types.d.mts.map +1 -0
- package/dist/aup-types.mjs +157 -0
- package/dist/aup-types.mjs.map +1 -0
- package/dist/backend.cjs +14 -0
- package/dist/backend.d.cts +104 -0
- package/dist/backend.d.cts.map +1 -0
- package/dist/backend.d.mts +104 -0
- package/dist/backend.d.mts.map +1 -0
- package/dist/backend.mjs +13 -0
- package/dist/backend.mjs.map +1 -0
- package/dist/degradation.cjs +85 -0
- package/dist/degradation.d.cts +17 -0
- package/dist/degradation.d.cts.map +1 -0
- package/dist/degradation.d.mts +17 -0
- package/dist/degradation.d.mts.map +1 -0
- package/dist/degradation.mjs +84 -0
- package/dist/degradation.mjs.map +1 -0
- package/dist/index.cjs +36 -0
- package/dist/index.d.cts +12 -0
- package/dist/index.d.mts +12 -0
- package/dist/index.mjs +13 -0
- package/dist/runtime.cjs +117 -0
- package/dist/runtime.d.cts +59 -0
- package/dist/runtime.d.cts.map +1 -0
- package/dist/runtime.d.mts +59 -0
- package/dist/runtime.d.mts.map +1 -0
- package/dist/runtime.mjs +118 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/session.cjs +159 -0
- package/dist/session.d.cts +80 -0
- package/dist/session.d.cts.map +1 -0
- package/dist/session.d.mts +80 -0
- package/dist/session.d.mts.map +1 -0
- package/dist/session.mjs +159 -0
- package/dist/session.mjs.map +1 -0
- package/dist/snapshot.cjs +162 -0
- package/dist/snapshot.mjs +163 -0
- package/dist/snapshot.mjs.map +1 -0
- package/dist/term-page.cjs +264 -0
- package/dist/term-page.mjs +264 -0
- package/dist/term-page.mjs.map +1 -0
- package/dist/term.cjs +295 -0
- package/dist/term.d.cts +84 -0
- package/dist/term.d.cts.map +1 -0
- package/dist/term.d.mts +84 -0
- package/dist/term.d.mts.map +1 -0
- package/dist/term.mjs +296 -0
- package/dist/term.mjs.map +1 -0
- package/dist/tty.cjs +136 -0
- package/dist/tty.d.cts +53 -0
- package/dist/tty.d.cts.map +1 -0
- package/dist/tty.d.mts +53 -0
- package/dist/tty.d.mts.map +1 -0
- package/dist/tty.mjs +135 -0
- package/dist/tty.mjs.map +1 -0
- package/dist/ui-provider.cjs +4615 -0
- package/dist/ui-provider.d.cts +307 -0
- package/dist/ui-provider.d.cts.map +1 -0
- package/dist/ui-provider.d.mts +307 -0
- package/dist/ui-provider.d.mts.map +1 -0
- package/dist/ui-provider.mjs +4616 -0
- package/dist/ui-provider.mjs.map +1 -0
- package/dist/web-page/core.cjs +1388 -0
- package/dist/web-page/core.mjs +1387 -0
- package/dist/web-page/core.mjs.map +1 -0
- package/dist/web-page/css.cjs +1699 -0
- package/dist/web-page/css.mjs +1698 -0
- package/dist/web-page/css.mjs.map +1 -0
- package/dist/web-page/icons.cjs +248 -0
- package/dist/web-page/icons.mjs +248 -0
- package/dist/web-page/icons.mjs.map +1 -0
- package/dist/web-page/overlay-themes.cjs +514 -0
- package/dist/web-page/overlay-themes.mjs +513 -0
- package/dist/web-page/overlay-themes.mjs.map +1 -0
- package/dist/web-page/renderers/action.cjs +72 -0
- package/dist/web-page/renderers/action.mjs +72 -0
- package/dist/web-page/renderers/action.mjs.map +1 -0
- package/dist/web-page/renderers/broadcast.cjs +160 -0
- package/dist/web-page/renderers/broadcast.mjs +160 -0
- package/dist/web-page/renderers/broadcast.mjs.map +1 -0
- package/dist/web-page/renderers/calendar.cjs +137 -0
- package/dist/web-page/renderers/calendar.mjs +137 -0
- package/dist/web-page/renderers/calendar.mjs.map +1 -0
- package/dist/web-page/renderers/canvas.cjs +173 -0
- package/dist/web-page/renderers/canvas.mjs +173 -0
- package/dist/web-page/renderers/canvas.mjs.map +1 -0
- package/dist/web-page/renderers/cdn-loader.cjs +25 -0
- package/dist/web-page/renderers/cdn-loader.mjs +25 -0
- package/dist/web-page/renderers/cdn-loader.mjs.map +1 -0
- package/dist/web-page/renderers/chart.cjs +101 -0
- package/dist/web-page/renderers/chart.mjs +101 -0
- package/dist/web-page/renderers/chart.mjs.map +1 -0
- package/dist/web-page/renderers/deck.cjs +390 -0
- package/dist/web-page/renderers/deck.mjs +390 -0
- package/dist/web-page/renderers/deck.mjs.map +1 -0
- package/dist/web-page/renderers/device.cjs +1015 -0
- package/dist/web-page/renderers/device.mjs +1015 -0
- package/dist/web-page/renderers/device.mjs.map +1 -0
- package/dist/web-page/renderers/editor.cjs +127 -0
- package/dist/web-page/renderers/editor.mjs +127 -0
- package/dist/web-page/renderers/editor.mjs.map +1 -0
- package/dist/web-page/renderers/finance-chart.cjs +178 -0
- package/dist/web-page/renderers/finance-chart.mjs +178 -0
- package/dist/web-page/renderers/finance-chart.mjs.map +1 -0
- package/dist/web-page/renderers/frame.cjs +274 -0
- package/dist/web-page/renderers/frame.mjs +274 -0
- package/dist/web-page/renderers/frame.mjs.map +1 -0
- package/dist/web-page/renderers/globe.cjs +119 -0
- package/dist/web-page/renderers/globe.mjs +119 -0
- package/dist/web-page/renderers/globe.mjs.map +1 -0
- package/dist/web-page/renderers/input.cjs +137 -0
- package/dist/web-page/renderers/input.mjs +137 -0
- package/dist/web-page/renderers/input.mjs.map +1 -0
- package/dist/web-page/renderers/list.cjs +1243 -0
- package/dist/web-page/renderers/list.mjs +1243 -0
- package/dist/web-page/renderers/list.mjs.map +1 -0
- package/dist/web-page/renderers/map.cjs +126 -0
- package/dist/web-page/renderers/map.mjs +126 -0
- package/dist/web-page/renderers/map.mjs.map +1 -0
- package/dist/web-page/renderers/media.cjs +106 -0
- package/dist/web-page/renderers/media.mjs +106 -0
- package/dist/web-page/renderers/media.mjs.map +1 -0
- package/dist/web-page/renderers/moonphase.cjs +105 -0
- package/dist/web-page/renderers/moonphase.mjs +105 -0
- package/dist/web-page/renderers/moonphase.mjs.map +1 -0
- package/dist/web-page/renderers/natal-chart.cjs +222 -0
- package/dist/web-page/renderers/natal-chart.mjs +222 -0
- package/dist/web-page/renderers/natal-chart.mjs.map +1 -0
- package/dist/web-page/renderers/overlay.cjs +531 -0
- package/dist/web-page/renderers/overlay.mjs +531 -0
- package/dist/web-page/renderers/overlay.mjs.map +1 -0
- package/dist/web-page/renderers/table.cjs +74 -0
- package/dist/web-page/renderers/table.mjs +74 -0
- package/dist/web-page/renderers/table.mjs.map +1 -0
- package/dist/web-page/renderers/terminal.cjs +30 -0
- package/dist/web-page/renderers/terminal.mjs +30 -0
- package/dist/web-page/renderers/terminal.mjs.map +1 -0
- package/dist/web-page/renderers/text.cjs +109 -0
- package/dist/web-page/renderers/text.mjs +109 -0
- package/dist/web-page/renderers/text.mjs.map +1 -0
- package/dist/web-page/renderers/ticker.cjs +133 -0
- package/dist/web-page/renderers/ticker.mjs +133 -0
- package/dist/web-page/renderers/ticker.mjs.map +1 -0
- package/dist/web-page/renderers/time.cjs +69 -0
- package/dist/web-page/renderers/time.mjs +69 -0
- package/dist/web-page/renderers/time.mjs.map +1 -0
- package/dist/web-page/renderers/unknown.cjs +20 -0
- package/dist/web-page/renderers/unknown.mjs +20 -0
- package/dist/web-page/renderers/unknown.mjs.map +1 -0
- package/dist/web-page/renderers/view.cjs +161 -0
- package/dist/web-page/renderers/view.mjs +161 -0
- package/dist/web-page/renderers/view.mjs.map +1 -0
- package/dist/web-page/renderers/wm.cjs +669 -0
- package/dist/web-page/renderers/wm.mjs +669 -0
- package/dist/web-page/renderers/wm.mjs.map +1 -0
- package/dist/web-page/skeleton.cjs +103 -0
- package/dist/web-page/skeleton.mjs +103 -0
- package/dist/web-page/skeleton.mjs.map +1 -0
- package/dist/web-page.cjs +114 -0
- package/dist/web-page.d.cts +19 -0
- package/dist/web-page.d.cts.map +1 -0
- package/dist/web-page.d.mts +19 -0
- package/dist/web-page.d.mts.map +1 -0
- package/dist/web-page.mjs +115 -0
- package/dist/web-page.mjs.map +1 -0
- package/dist/web.cjs +827 -0
- package/dist/web.d.cts +144 -0
- package/dist/web.d.cts.map +1 -0
- package/dist/web.d.mts +144 -0
- package/dist/web.d.mts.map +1 -0
- package/dist/web.mjs +828 -0
- package/dist/web.mjs.map +1 -0
- package/dist/wm-state.cjs +172 -0
- package/dist/wm-state.mjs +171 -0
- package/dist/wm-state.mjs.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-provider.mjs","names":["root","store","degraded","opts","msg","page","config"],"sources":["../src/ui-provider.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n type AFSAccessMode,\n type AFSDeleteResult,\n type AFSEntry,\n type AFSExecResult,\n type AFSExplainResult,\n type AFSListResult,\n AFSNotFoundError,\n type AFSRoot,\n type AFSStatResult,\n type AFSWriteResult,\n type CapabilitiesManifest,\n type ProviderManifest,\n type ProviderTreeSchema,\n} from \"@aigne/afs\";\nimport {\n Actions,\n AFSBaseProvider,\n Delete,\n Explain,\n List,\n Meta,\n Read,\n type RouteContext,\n Stat,\n Write,\n} from \"@aigne/afs/provider\";\nimport { joinURL } from \"ufo\";\nimport { z } from \"zod\";\nimport { AUPNodeStore, AUPSceneManager } from \"./aup-protocol.js\";\nimport { OVERLAY_THEMES, PRIMITIVES, THEMES } from \"./aup-registry.js\";\nimport { AUP_EXAMPLES, AUP_SPEC } from \"./aup-spec.js\";\nimport {\n DEVICE_CAPS_TERM,\n DEVICE_CAPS_TTY,\n DEVICE_CAPS_WEB_FULL,\n type DeviceCaps,\n validateDeviceCaps,\n validateNode,\n} from \"./aup-types.js\";\nimport { isAUPTransport, isSessionAware, type UIBackend } from \"./backend.js\";\nimport { degradeTree } from \"./degradation.js\";\nimport { type Session, SessionManager } from \"./session.js\";\nimport { generateSnapshot } from \"./snapshot.js\";\nimport { TermBackend, type TermBackendOptions } from \"./term.js\";\nimport { TTYBackend, type TTYBackendOptions } from \"./tty.js\";\nimport { WebBackend, type WebBackendOptions } from \"./web.js\";\nimport { autoArrange, PANEL_PRESETS } from \"./wm-state.js\";\n\nexport interface AFSUIProviderOptions {\n name?: string;\n description?: string;\n backend?: \"tty\" | \"web\" | \"term\" | UIBackend;\n /** TTY backend options (only used when backend is \"tty\" and no web server needed) */\n ttyOptions?: TTYBackendOptions;\n /** Web backend options (only used when backend is \"web\") */\n webOptions?: WebBackendOptions;\n /** Term backend options (only used when backend is \"term\") */\n termOptions?: TermBackendOptions;\n /** Input timeout in ms (0 = no timeout) */\n inputTimeout?: number;\n /** Directory to persist pages (default: .afs-ui/pages). Set false to disable. */\n pagesDir?: string | false;\n}\n\ninterface PageData {\n content: string;\n format: string;\n layout?: Record<string, string>;\n createdAt: number;\n updatedAt: number;\n}\n\ninterface SharingEntryMeta {\n title?: string;\n description?: string;\n image?: string;\n}\n\ninterface SharingEntry {\n target: string;\n access: \"guest\" | \"link-only\" | \"user\" | \"admin\";\n mode: \"static\" | \"live\";\n slug: string;\n meta?: SharingEntryMeta;\n /** Frozen HTML snapshot (populated by Phase 1 snapshot action) */\n snapshot?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nconst VALID_ACCESS_LEVELS = new Set([\"guest\", \"link-only\", \"user\", \"admin\"]);\nconst VALID_SHARING_MODES = new Set([\"static\", \"live\"]);\n\nconst afsUISchema = z.object({\n backend: z.enum([\"tty\", \"web\", \"term\"]).default(\"tty\"),\n port: z.coerce.number().optional(),\n});\n\n// ── Static Registries (imported from aup-registry.ts) ──\n\nexport class AFSUIProvider extends AFSBaseProvider {\n readonly name: string;\n readonly description: string;\n override readonly accessMode: AFSAccessMode = \"readwrite\";\n\n private backend: UIBackend;\n private inputTimeout: number;\n private pages = new Map<string, PageData>();\n private pagesDir: string | false;\n private initPromise: Promise<void> | null = null;\n private serverUrl: string | null = null;\n /** Web sharing entries: slug -> SharingEntry */\n private sharingEntries = new Map<string, SharingEntry>();\n\n /** Session management */\n readonly sessions = new SessionManager();\n /** Per-session AUP node stores */\n private aupStores = new Map<string, AUPNodeStore>();\n /** Per-session AUP scene managers (for stage-to-live dual buffer) */\n private aupManagers = new Map<string, AUPSceneManager>();\n // WM state now lives in the AUP tree — wmStores removed\n /** AFS root reference for auto-dispatching AUP events to afs.exec() */\n private afsRoot: AFSRoot | null = null;\n /** Endpoint type derived from backend (tty, web, term) */\n readonly endpointType: string;\n /** External callback for AUP events — allows app code to handle navigation etc. */\n onAupEvent?: (\n sessionId: string,\n nodeId: string,\n event: string,\n config: { exec: string; args: Record<string, unknown> },\n ) => Promise<unknown> | unknown;\n constructor(options: AFSUIProviderOptions = {}) {\n super();\n this.name = options.name ?? \"ui\";\n this.description = options.description ?? \"Interactive UI device\";\n this.inputTimeout = options.inputTimeout ?? 0;\n this.pagesDir = options.pagesDir ?? \"\"; // empty = auto-discover in onMount\n\n if (typeof options.backend === \"object\") {\n this.backend = options.backend;\n // Auto-detect URL from already-constructed backend\n if (\"url\" in this.backend && typeof (this.backend as { url?: string }).url === \"string\") {\n this.serverUrl = (this.backend as { url: string }).url;\n }\n } else if (options.backend === \"web\") {\n const webOpts = { ...options.webOptions };\n if ((options as Record<string, unknown>).port != null) {\n webOpts.port = (options as Record<string, unknown>).port as number;\n }\n const web = new WebBackend(webOpts);\n this.backend = web;\n this.initPromise = web.listen().then(() => {\n this.serverUrl = web.url;\n });\n } else if (options.backend === \"term\") {\n const termOpts = { ...options.termOptions };\n if ((options as Record<string, unknown>).port != null) {\n termOpts.port = (options as Record<string, unknown>).port as number;\n }\n const term = new TermBackend(termOpts);\n this.backend = term;\n this.initPromise = term.listen().then(() => {\n this.serverUrl = term.url;\n });\n } else {\n // Default: plain TTY (no server)\n this.backend = new TTYBackend({\n ...options.ttyOptions,\n inputTimeout: this.inputTimeout,\n });\n }\n\n // Derive endpoint type from backend\n this.endpointType = this.backend.type;\n\n // Session-aware backends: allocate a session per connected client\n if (isSessionAware(this.backend)) {\n // Resolve default DeviceCaps based on backend type\n const defaultCaps: DeviceCaps =\n this.backend.type === \"term\" ? DEVICE_CAPS_TERM : DEVICE_CAPS_WEB_FULL;\n\n this.backend.setSessionFactory(\n (\n endpoint: string,\n requestedSid?: string,\n requestedSessionToken?: string,\n rawCaps?: Record<string, unknown>,\n ): { sessionId: string; sessionToken?: string } => {\n // Validate and resolve device caps from client handshake\n const caps: DeviceCaps =\n rawCaps && !validateDeviceCaps(rawCaps)\n ? (rawCaps as unknown as DeviceCaps)\n : defaultCaps;\n\n if (requestedSid && this.sessions.has(requestedSid)) {\n const existing = this.sessions.get(requestedSid);\n // Require token match for session resume; otherwise issue a fresh session.\n if (requestedSessionToken && requestedSessionToken === existing.resumeToken) {\n existing.touch();\n // Update caps on reconnect (device may have changed)\n existing.setDeviceCaps(caps);\n return { sessionId: requestedSid, sessionToken: existing.resumeToken };\n }\n const rotated = this.sessions.create(endpoint, caps);\n return { sessionId: rotated.id, sessionToken: rotated.resumeToken };\n }\n\n const fresh = this.sessions.create(endpoint, caps);\n return { sessionId: fresh.id, sessionToken: fresh.resumeToken };\n },\n );\n }\n\n // AUP transport: wire event handler + channel/session join handlers\n if (isAUPTransport(this.backend)) {\n this.backend.setAupEventHandler(async (msg, sessionId, channelId) => {\n const storeId = channelId ? this.channelAupKey(channelId) : sessionId;\n if (!storeId) throw new Error(\"No session or channel for AUP event\");\n return this.handleAupEvent(storeId, msg.nodeId, msg.event, msg.data);\n });\n this.backend.setChannelJoinHandler((channelId, send) => {\n const store = this.aupStores.get(this.channelAupKey(channelId));\n const root = store?.getRoot();\n if (store && root) {\n const opts = store.renderOptions;\n const msg: Record<string, unknown> = {\n type: \"aup\",\n action: \"render\",\n root,\n treeVersion: store.version,\n };\n if (opts.fullPage) msg.fullPage = true;\n if (opts.chrome) msg.chrome = true;\n if (opts.theme) msg.theme = opts.theme;\n if (opts.style) msg.style = opts.style;\n if (opts.locale) msg.locale = opts.locale;\n send(msg);\n }\n });\n\n // Replay AUP snapshot to reconnecting session clients (with degradation)\n this.backend.setSessionJoinHandler((sessionId, clientVersion, send) => {\n // Look up session for device caps degradation\n const session = this.sessions.has(sessionId) ? this.sessions.get(sessionId) : null;\n\n // Check scene manager first — if there's an active scene, replay that\n const mgr = this.aupManagers.get(sessionId);\n const activeScene = mgr?.getActiveScene();\n if (activeScene) {\n const { store } = activeScene;\n const root = store.getRoot();\n if (root) {\n if (clientVersion > 0 && clientVersion >= store.version) return;\n const degraded = session ? this.degradeForSession(root, session) : root;\n const opts = store.renderOptions;\n const msg: Record<string, unknown> = {\n type: \"aup\",\n action: \"stage\",\n sceneId: activeScene.sceneId,\n root: degraded,\n treeVersion: store.version,\n };\n if (opts.fullPage) msg.fullPage = true;\n if (opts.chrome) msg.chrome = true;\n if (opts.theme) msg.theme = opts.theme;\n if (opts.style) msg.style = opts.style;\n if (opts.locale) msg.locale = opts.locale;\n send(msg);\n // Also send take so client knows to activate it\n send({ type: \"aup\", action: \"take\", sceneId: activeScene.sceneId });\n return;\n }\n }\n\n // Fallback: legacy aup_render store\n const store = this.aupStores.get(sessionId);\n if (!store) return;\n const root = store.getRoot();\n if (!root) return;\n // Client is up-to-date — skip replay\n if (clientVersion > 0 && clientVersion >= store.version) return;\n const degraded = session ? this.degradeForSession(root, session) : root;\n const opts = store.renderOptions;\n const msg: Record<string, unknown> = {\n type: \"aup\",\n action: \"render\",\n root: degraded,\n treeVersion: store.version,\n };\n if (opts.fullPage) msg.fullPage = true;\n if (opts.chrome) msg.chrome = true;\n if (opts.theme) msg.theme = opts.theme;\n if (opts.style) msg.style = opts.style;\n if (opts.locale) msg.locale = opts.locale;\n send(msg);\n });\n\n // Wire page resolver for HTTP /p/:id serving (frame primitive)\n this.backend.setPageResolver(async (pageId, sessionId, sessionToken) => {\n if (sessionId && sessionToken && this.sessions.has(sessionId)) {\n const session = this.sessions.get(sessionId);\n if (session.resumeToken === sessionToken) {\n const page = session.getPage(pageId);\n if (page) return { content: page.content, format: page.format };\n }\n }\n const page = this.pages.get(pageId);\n if (page) return { content: page.content, format: page.format };\n return null;\n });\n\n // Wire snapshot resolver for HTTP /s/:slug serving (web sharing)\n if (\"setSnapshotResolver\" in this.backend) {\n (this.backend as import(\"./web.js\").WebBackend).setSnapshotResolver((slug: string) => {\n const entry = this.sharingEntries.get(slug);\n if (!entry?.snapshot) return null;\n return entry.snapshot;\n });\n }\n }\n\n // TTY: auto-create a default session (there's only one terminal)\n if (this.endpointType === \"tty\") {\n this.sessions.create(\"tty\", DEVICE_CAPS_TTY);\n }\n }\n\n /** Inject AFS root into AUP transport for browser AFS proxy + discover pages dir. */\n onMount(root: AFSRoot, _mountPath?: string): void {\n this.afsRoot = root;\n if (isAUPTransport(this.backend)) {\n this.backend.setAFS(root);\n }\n // Discover workspace path for page persistence (async, best-effort)\n if (this.pagesDir !== false) {\n this.discoverAndLoadPages(root);\n }\n }\n\n /** Discover workspace path from AFS root meta, then load persisted pages. */\n private async discoverAndLoadPages(root: AFSRoot): Promise<void> {\n try {\n // If pagesDir was explicitly set, use it directly\n if (this.pagesDir) {\n this.loadPagesFromDisk(this.pagesDir);\n return;\n }\n // Auto-discover: read /.meta for workspace storagePath\n if (root.read) {\n try {\n const result = await root.read(\"/.meta\");\n const storagePath = result?.data?.content?.storagePath as string | undefined;\n if (storagePath) {\n this.pagesDir = join(storagePath, \".afs-ui\", \"pages\");\n this.loadPagesFromDisk(this.pagesDir);\n return;\n }\n } catch {\n // no workspace meta\n }\n }\n // Fallback: cwd/.afs-ui/pages\n this.pagesDir = join(process.cwd(), \".afs-ui\", \"pages\");\n this.loadPagesFromDisk(this.pagesDir);\n } catch {\n // persistence disabled\n }\n }\n\n /** Load persisted page files from disk into the pages Map. */\n private loadPagesFromDisk(dir: string): void {\n if (!existsSync(dir)) return;\n for (const file of readdirSync(dir)) {\n if (file.startsWith(\".\")) continue;\n try {\n const content = readFileSync(join(dir, file), \"utf-8\");\n const now = Date.now();\n this.pages.set(file, { content, format: \"html\", createdAt: now, updatedAt: now });\n } catch {\n // skip unreadable files\n }\n }\n }\n\n /** Persist a page to disk as a plain file (best-effort). */\n private persistPageToDisk(pageId: string, data: PageData): void {\n if (!this.pagesDir) return;\n try {\n if (!existsSync(this.pagesDir)) mkdirSync(this.pagesDir, { recursive: true });\n writeFileSync(join(this.pagesDir, pageId), data.content, \"utf-8\");\n } catch {\n // best-effort\n }\n }\n\n /** Remove a persisted page from disk (best-effort). */\n private removePageFromDisk(pageId: string): void {\n if (!this.pagesDir) return;\n try {\n const filePath = join(this.pagesDir, pageId);\n if (existsSync(filePath)) unlinkSync(filePath);\n } catch {\n // best-effort\n }\n }\n\n /** Assert the endpoint param matches this provider's type */\n private assertEndpoint(ctx: RouteContext): string {\n const endpoint = ctx.params.endpoint as string;\n if (endpoint !== this.endpointType) throw new AFSNotFoundError(`/${endpoint}`);\n return endpoint;\n }\n\n /** Resolve session from route params, throwing if not found */\n private resolveSession(ctx: RouteContext): Session {\n this.assertEndpoint(ctx);\n const sid = ctx.params.sid as string;\n return this.sessions.get(sid);\n }\n\n /** Get or create AUP node store for a session */\n private getAupStore(sessionId: string): AUPNodeStore {\n let store = this.aupStores.get(sessionId);\n if (!store) {\n store = new AUPNodeStore();\n this.aupStores.set(sessionId, store);\n }\n return store;\n }\n\n /** Get or create AUP scene manager for a session */\n private getAupManager(sessionId: string): AUPSceneManager {\n let mgr = this.aupManagers.get(sessionId);\n if (!mgr) {\n mgr = new AUPSceneManager();\n this.aupManagers.set(sessionId, mgr);\n }\n return mgr;\n }\n\n /** Get the WM node from the AUP tree, or null if it doesn't exist yet. */\n private getWmNode(\n sessionId: string,\n ): { store: AUPNodeStore; wmNode: import(\"./aup-types.js\").AUPNode } | null {\n const store = this.aupStores.get(sessionId);\n if (!store) return null;\n const wmNode = store.findNode(\"wm\");\n if (!wmNode) return null;\n return { store, wmNode };\n }\n\n /**\n * Ensure a WM node exists in the session's AUP tree.\n * Creates a minimal root + wm node if the tree is empty.\n */\n private ensureWmNode(\n sessionId: string,\n strategy: string = \"floating\",\n ): { store: AUPNodeStore; wmNode: import(\"./aup-types.js\").AUPNode } {\n const store = this.getAupStore(sessionId);\n let wmNode = store.findNode(\"wm\");\n if (wmNode) return { store, wmNode };\n\n // No WM node yet. If tree is empty, create root + wm.\n if (!store.getRoot()) {\n store.setRoot({\n id: \"root\",\n type: \"view\",\n children: [{ id: \"wm\", type: \"wm\", props: { strategy } }],\n } as import(\"./aup-types.js\").AUPNode);\n // Send initial render so the client has a tree to patch against\n if (isAUPTransport(this.backend)) {\n this.backend.sendToSession(sessionId, {\n type: \"aup\",\n action: \"render\",\n root: store.getRoot(),\n treeVersion: store.version,\n fullPage: true,\n });\n }\n } else {\n // Tree exists but no WM node — add it as a child of root\n store.applyPatch([\n {\n op: \"create\",\n id: \"wm\",\n parentId: store.getRoot()!.id,\n node: { id: \"wm\", type: \"wm\", props: { strategy } } as import(\"./aup-types.js\").AUPNode,\n },\n ]);\n }\n wmNode = store.findNode(\"wm\")!;\n return { store, wmNode };\n }\n\n /**\n * Apply WM-related AUP patch ops and notify the client.\n */\n private applyWmPatch(\n sessionId: string,\n ctx: RouteContext,\n ops: import(\"./aup-types.js\").AUPPatchOp[],\n ): AUPNodeStore {\n const store = this.getAupStore(sessionId);\n store.applyPatch(ops);\n\n // Send patch to client\n if (isAUPTransport(this.backend)) {\n this.backend.sendToSession(sessionId, {\n type: \"aup\",\n action: \"patch\",\n ops,\n treeVersion: store.version,\n });\n }\n\n // Emit AFS event\n const endpoint = ctx.params.endpoint as string;\n const treePath = joinURL(\"/\", endpoint, \"sessions\", sessionId, \"tree\");\n this.emit({ type: \"afs:write\", path: treePath, data: { root: store.getRoot() } });\n\n return store;\n }\n\n /** Find a WM surface child node by surface name. */\n private findWmSurface(\n wmNode: import(\"./aup-types.js\").AUPNode,\n name: string,\n ): import(\"./aup-types.js\").AUPNode | undefined {\n return (wmNode.children || []).find(\n (c) =>\n c.type === \"wm-surface\" &&\n ((c.props as Record<string, unknown>)?.surfaceName === name ||\n c.id === `wm-surface-${name}`),\n );\n }\n\n /**\n * Handle built-in WM events from client-side panel interactions.\n * Returns undefined if the event is not a WM-specific event.\n */\n private handleWmEvent(\n sessionId: string,\n event: string,\n data: Record<string, unknown>,\n ): unknown | undefined {\n const wm = this.getWmNode(sessionId);\n if (!wm) return undefined;\n\n const wmProps = (wm.wmNode.props ?? {}) as Record<string, unknown>;\n const panels = (wmProps.panels ?? []) as Record<string, unknown>[];\n\n if (event === \"panel-collapse\") {\n const panelId = data.panelId as string;\n if (!panelId) return undefined;\n const updated = panels.map((p) => (p.id === panelId ? { ...p, collapsed: true } : p));\n this.applyWmPatchDirect(sessionId, [{ op: \"update\", id: \"wm\", props: { panels: updated } }]);\n return { success: true, panelId, collapsed: true };\n }\n\n if (event === \"panel-expand\") {\n const panelId = data.panelId as string;\n if (!panelId) return undefined;\n const updated = panels.map((p) => (p.id === panelId ? { ...p, collapsed: false } : p));\n this.applyWmPatchDirect(sessionId, [{ op: \"update\", id: \"wm\", props: { panels: updated } }]);\n return { success: true, panelId, collapsed: false };\n }\n\n if (event === \"panel-resize\") {\n const panelId = data.panelId as string;\n const size = data.size as string;\n if (!panelId || !size) return undefined;\n const updated = panels.map((p) => (p.id === panelId ? { ...p, defaultSize: size } : p));\n this.applyWmPatchDirect(sessionId, [{ op: \"update\", id: \"wm\", props: { panels: updated } }]);\n return { success: true, panelId, size };\n }\n\n return undefined;\n }\n\n /**\n * Apply WM patch directly without needing a RouteContext.\n * Used for client-initiated WM events.\n */\n private applyWmPatchDirect(sessionId: string, ops: import(\"./aup-types.js\").AUPPatchOp[]): void {\n const store = this.getAupStore(sessionId);\n store.applyPatch(ops);\n // Send patch to client so it re-renders the WM layout\n if (isAUPTransport(this.backend)) {\n this.backend.sendToSession(sessionId, {\n type: \"aup\",\n action: \"patch\",\n ops,\n treeVersion: store.version,\n });\n }\n }\n\n /** AUP store key for a live channel */\n private channelAupKey(channelId: string): string {\n return `live:${channelId}`;\n }\n\n /** Get or create AUP node store for a live channel */\n private getChannelAupStore(channelId: string): AUPNodeStore {\n const key = this.channelAupKey(channelId);\n let store = this.aupStores.get(key);\n if (!store) {\n store = new AUPNodeStore();\n this.aupStores.set(key, store);\n }\n return store;\n }\n\n /** Degrade an AUP root for a session's device capabilities (D14). */\n private degradeForSession(\n root: import(\"./aup-types.js\").AUPNode,\n session: Session,\n ): import(\"./aup-types.js\").AUPNode {\n return degradeTree(root, session.deviceCaps);\n }\n\n /** Count active live channels (stores with live: prefix that have content) */\n private getActiveChannelCount(): number {\n let count = 0;\n for (const key of this.aupStores.keys()) {\n if (key.startsWith(\"live:\")) count++;\n }\n return count;\n }\n\n /** List active channel IDs */\n private getActiveChannelIds(): string[] {\n const ids: string[] = [];\n for (const key of this.aupStores.keys()) {\n if (key.startsWith(\"live:\")) ids.push(key.slice(5));\n }\n // Also include channels with connected viewers (even if no tree yet)\n if (isAUPTransport(this.backend)) {\n for (const id of this.backend.getActiveChannelIds()) {\n if (!ids.includes(id)) ids.push(id);\n }\n }\n return ids;\n }\n\n /** Handle an AUP event from a client — resolve exec path and call it */\n private async handleAupEvent(\n sessionId: string,\n nodeId: string,\n event: string,\n data?: Record<string, unknown>,\n ): Promise<unknown> {\n const store = this.getAupStore(sessionId);\n const node = store.findNode(nodeId);\n if (!node) throw new Error(`AUP node not found: ${nodeId}`);\n\n // ── Built-in WM events (from client-side panel interactions) ──\n if (node.type === \"wm\") {\n const wmResult = this.handleWmEvent(sessionId, event, data ?? {});\n if (wmResult !== undefined) return wmResult;\n }\n\n const evtConfig = node.events?.[event];\n if (!evtConfig) {\n // Overlay-generated events (confirm, cancel, select) may not have exec config.\n // Pass them to onAupEvent with a synthetic config if a handler is registered.\n if (this.onAupEvent) {\n const config = { exec: event, args: data ?? {} };\n const result = await this.onAupEvent(sessionId, nodeId, event, config);\n if (result !== undefined) return result;\n }\n // No handler or handler didn't handle it — report error\n if (!node.events) throw new Error(`Node '${nodeId}' has no events`);\n throw new Error(`Node '${nodeId}' has no '${event}' event`);\n }\n\n // Validate exec path\n const execPath = evtConfig.exec;\n if (!execPath || typeof execPath !== \"string\") throw new Error(\"Event exec path is required\");\n if (execPath.includes(\"..\")) throw new Error(\"Event exec path cannot contain '..'\");\n\n const config = {\n exec: execPath,\n args: { ...(evtConfig.args ?? {}), ...(data ?? {}) } as Record<string, unknown>,\n };\n\n // Call external handler if registered (e.g. for page navigation)\n if (this.onAupEvent) {\n const result = await this.onAupEvent(sessionId, nodeId, event, config);\n if (result !== undefined) return result;\n }\n\n // Auto-dispatch to AFS if mounted (closes the reactive loop)\n if (this.afsRoot?.exec) {\n const execResult = await this.afsRoot.exec(config.exec, config.args, {});\n return execResult?.data;\n }\n\n // Fallback: return config (backward compat when no AFS available)\n return { ...config, nodeId, event };\n }\n\n static schema() {\n return afsUISchema;\n }\n\n static manifest(): ProviderManifest {\n return {\n name: \"ui\",\n description: \"Interactive UI device — terminal (xterm.js), web chat, or messaging\",\n uriTemplate: \"ui://{backend}\",\n category: \"device\",\n schema: afsUISchema,\n tags: [\"ui\", \"device\", \"interactive\", \"term\"],\n capabilityTags: [\"read-write\", \"auth:none\", \"local\"],\n security: {\n riskLevel: \"local\",\n resourceAccess: [\"local-network\"],\n notes: [\"Interacts with local terminal, web, or messaging backend\"],\n },\n capabilities: {\n network: { egress: true, ingress: true },\n },\n };\n }\n\n static treeSchema(): ProviderTreeSchema {\n return {\n operations: [\"list\", \"read\", \"write\", \"delete\", \"exec\", \"stat\", \"explain\"],\n tree: {\n \"/\": {\n kind: \"device\",\n operations: [\"list\", \"read\", \"exec\"],\n actions: [\n \"prompt\",\n \"clear\",\n \"notify\",\n \"navigate\",\n \"dialog\",\n \"progress\",\n \"form\",\n \"table\",\n \"toast\",\n ],\n },\n \"/input\": { kind: \"input-channel\", operations: [\"read\"] },\n \"/output\": { kind: \"output-channel\", operations: [\"read\", \"write\"] },\n \"/pages\": { kind: \"pages-directory\", operations: [\"list\", \"read\"] },\n \"/pages/{id}\": { kind: \"page\", operations: [\"read\", \"write\", \"delete\"] },\n },\n auth: { type: \"none\" },\n bestFor: [\"user interaction\", \"terminal UI\", \"web chat\"],\n notFor: [\"data storage\"],\n };\n }\n\n // ─── Capabilities ───────────────────────────────────────────\n\n @Read(\"/.meta/.capabilities\")\n async readCapabilities(_ctx: RouteContext): Promise<AFSEntry> {\n const manifest: CapabilitiesManifest = {\n schemaVersion: 1,\n provider: this.name,\n description: this.description,\n tools: [],\n actions: [],\n operations: this.getOperationsDeclaration(),\n };\n\n return {\n id: \"/.meta/.capabilities\",\n path: \"/.meta/.capabilities\",\n content: manifest,\n meta: { kind: \"afs:capabilities\" },\n };\n }\n\n // ─── Meta ───────────────────────────────────────────────────\n\n @Meta(\"/\")\n async metaRoot(_ctx: RouteContext): Promise<AFSEntry> {\n if (this.initPromise) await this.initPromise;\n const viewport = this.backend.getViewport();\n const meta: Record<string, unknown> = {\n kind: \"device\",\n backend: this.backend.type,\n supportedFormats: this.backend.supportedFormats,\n capabilities: this.backend.capabilities,\n viewport,\n childrenCount: 10,\n };\n if (this.serverUrl) {\n meta.url = this.serverUrl;\n }\n return {\n id: \".meta\",\n path: \"/.meta\",\n meta,\n };\n }\n\n @Meta(\"/input\")\n async metaInput(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \".meta\",\n path: \"/input/.meta\",\n meta: {\n kind: \"input-channel\",\n childrenCount: 0,\n description: \"Read user input from this device\",\n pending: this.backend.hasPendingInput(),\n },\n };\n }\n\n @Meta(\"/output\")\n async metaOutput(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \".meta\",\n path: \"/output/.meta\",\n meta: {\n kind: \"output-channel\",\n childrenCount: 0,\n description: \"Write content to this device\",\n },\n };\n }\n\n @Meta(\"/pages\")\n async metaPages(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \".meta\",\n path: \"/pages/.meta\",\n meta: {\n kind: \"pages-directory\",\n childrenCount: this.pages.size,\n description: \"Managed pages for full-page rendering\",\n },\n };\n }\n\n @Meta(\"/pages/:id\")\n async metaPage(ctx: RouteContext): Promise<AFSEntry> {\n const pageId = ctx.params.id as string;\n const page = this.pages.get(pageId);\n if (!page) throw new Error(`Page not found: ${pageId}`);\n return {\n id: \".meta\",\n path: joinURL(\"/pages\", pageId, \".meta\"),\n meta: {\n kind: \"page\",\n format: page.format,\n childrenCount: 0,\n createdAt: page.createdAt,\n updatedAt: page.updatedAt,\n },\n };\n }\n\n // ─── List ───────────────────────────────────────────────────\n\n @List(\"/input\")\n async listInput(_ctx: RouteContext): Promise<AFSListResult> {\n return { data: [] };\n }\n\n @List(\"/output\")\n async listOutput(_ctx: RouteContext): Promise<AFSListResult> {\n return { data: [] };\n }\n\n @List(\"/pages\")\n async listPages(_ctx: RouteContext): Promise<AFSListResult> {\n const entries: AFSEntry[] = [];\n for (const [id, page] of this.pages) {\n entries.push({\n id,\n path: joinURL(\"/pages\", id),\n meta: {\n kind: \"page\",\n format: page.format,\n childrenCount: 0,\n createdAt: page.createdAt,\n updatedAt: page.updatedAt,\n },\n });\n }\n return { data: entries };\n }\n\n @List(\"/\")\n async listRoot(_ctx: RouteContext): Promise<AFSListResult> {\n return {\n data: [\n {\n id: \"spec\",\n path: \"/spec\",\n meta: {\n kind: \"aup:spec\",\n description: \"AUP document format specification — start here\",\n },\n },\n {\n id: \"primitives\",\n path: \"/primitives\",\n meta: {\n kind: \"primitives-directory\",\n childrenCount: Object.keys(PRIMITIVES).length,\n description: \"Available UI components with full props, events, and examples\",\n },\n },\n {\n id: \"themes\",\n path: \"/themes\",\n meta: {\n kind: \"themes-directory\",\n childrenCount: Object.keys(THEMES).length,\n description: \"Visual themes with color tokens\",\n },\n },\n {\n id: \"overlay-themes\",\n path: \"/overlay-themes\",\n meta: {\n kind: \"overlay-themes-directory\",\n childrenCount: Object.keys(OVERLAY_THEMES).length,\n description: \"Broadcast overlay themes (graphics packages) for overlay-grid\",\n },\n },\n {\n id: \"examples\",\n path: \"/examples\",\n meta: {\n kind: \"examples-directory\",\n childrenCount: Object.keys(AUP_EXAMPLES).length,\n description: \"Complete working AUP documents to learn from\",\n },\n },\n {\n id: this.endpointType,\n path: joinURL(\"/\", this.endpointType),\n meta: {\n kind: \"endpoint\",\n childrenCount: 1,\n description: `${this.endpointType} endpoint with session management`,\n },\n },\n // Legacy compat\n {\n id: \"input\",\n path: \"/input\",\n meta: {\n kind: \"input-channel\",\n childrenCount: 0,\n description: \"Read user input (legacy — use sessions/:id/messages instead)\",\n },\n },\n {\n id: \"output\",\n path: \"/output\",\n meta: {\n kind: \"output-channel\",\n childrenCount: 0,\n description: \"Write content (legacy — use sessions/:id/messages instead)\",\n },\n },\n {\n id: \"pages\",\n path: \"/pages\",\n meta: {\n kind: \"pages-directory\",\n childrenCount: this.pages.size,\n description: \"Managed pages (legacy — use sessions/:id/pages instead)\",\n },\n },\n {\n id: \"sharing\",\n path: \"/sharing\",\n meta: {\n kind: \"sharing-directory\",\n childrenCount: this.sharingEntries.size,\n description: \"Web sharing entries — publish AFS subtrees as public URLs\",\n },\n },\n ],\n };\n }\n\n // ─── Read ───────────────────────────────────────────────────\n\n @Read(\"/\")\n async readRoot(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: this.name,\n path: \"/\",\n content: `UI Device (${this.backend.type})`,\n meta: {\n kind: \"device\",\n childrenCount: 10,\n backend: this.backend.type,\n },\n };\n }\n\n @Read(\"/input\")\n async readInput(_ctx: RouteContext): Promise<AFSEntry> {\n const content = await this.backend.read({ timeout: this.inputTimeout });\n return {\n id: \"input\",\n path: \"/input\",\n content,\n };\n }\n\n @Read(\"/output\")\n async readOutput(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"output\",\n path: \"/output\",\n content: \"\",\n meta: { kind: \"output-channel\" },\n };\n }\n\n @Read(\"/pages\")\n async readPages(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"pages\",\n path: \"/pages\",\n content: \"\",\n meta: {\n kind: \"pages-directory\",\n childrenCount: this.pages.size,\n },\n };\n }\n\n @Read(\"/pages/:id\")\n async readPage(ctx: RouteContext): Promise<AFSEntry> {\n const pageId = ctx.params.id as string;\n const page = this.pages.get(pageId);\n if (!page) throw new Error(`Page not found: ${pageId}`);\n return {\n id: pageId,\n path: joinURL(\"/pages\", pageId),\n content: page.content,\n meta: {\n kind: \"page\",\n format: page.format,\n layout: page.layout,\n },\n };\n }\n\n // ─── Primitives & Themes ───────────────────────────────────\n\n @List(\"/primitives\")\n async listPrimitives(_ctx: RouteContext): Promise<AFSListResult> {\n return {\n data: Object.values(PRIMITIVES).map((p) => ({\n id: p.name,\n name: p.name,\n path: joinURL(\"/primitives\", p.name),\n meta: { kind: \"aup:primitive\", category: p.category, description: p.description },\n })),\n };\n }\n\n @Read(\"/primitives\")\n async readPrimitivesDir(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"primitives\",\n path: \"/primitives\",\n content: `AUP Primitive Registry (${Object.keys(PRIMITIVES).length} primitives)`,\n meta: { kind: \"primitives-directory\", childrenCount: Object.keys(PRIMITIVES).length },\n };\n }\n\n @Stat(\"/primitives\")\n async statPrimitivesDir(_ctx: RouteContext): Promise<AFSStatResult> {\n return {\n data: {\n id: \"primitives\",\n path: \"/primitives\",\n meta: { kind: \"primitives-directory\", childrenCount: Object.keys(PRIMITIVES).length },\n },\n };\n }\n\n @Meta(\"/primitives\")\n async metaPrimitivesDir(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"primitives\",\n path: \"/primitives/.meta\",\n meta: { kind: \"primitives-directory\", childrenCount: Object.keys(PRIMITIVES).length },\n };\n }\n\n @Read(\"/primitives/:name\")\n async readPrimitive(ctx: RouteContext): Promise<AFSEntry> {\n const name = ctx.params.name as string;\n const prim = PRIMITIVES[name];\n if (!prim) throw new AFSNotFoundError(joinURL(\"/primitives\", name));\n return {\n id: prim.name,\n path: joinURL(\"/primitives\", prim.name),\n content: prim,\n meta: { kind: \"aup:primitive\", category: prim.category, description: prim.description },\n };\n }\n\n @Stat(\"/primitives/:name\")\n async statPrimitive(ctx: RouteContext): Promise<AFSStatResult> {\n const name = ctx.params.name as string;\n const prim = PRIMITIVES[name];\n if (!prim) throw new AFSNotFoundError(joinURL(\"/primitives\", name));\n return {\n data: {\n id: prim.name,\n path: joinURL(\"/primitives\", prim.name),\n meta: { kind: \"aup:primitive\", category: prim.category, description: prim.description },\n },\n };\n }\n\n @Meta(\"/primitives/:name\")\n async metaPrimitive(ctx: RouteContext): Promise<AFSEntry> {\n const name = ctx.params.name as string;\n const prim = PRIMITIVES[name];\n if (!prim) throw new AFSNotFoundError(joinURL(\"/primitives\", name));\n return {\n id: prim.name,\n path: joinURL(\"/primitives\", prim.name, \".meta\"),\n meta: { kind: \"aup:primitive\", category: prim.category, description: prim.description },\n };\n }\n\n @List(\"/themes\")\n async listThemes(_ctx: RouteContext): Promise<AFSListResult> {\n return {\n data: Object.values(THEMES).map((t) => ({\n id: t.name,\n name: t.name,\n path: joinURL(\"/themes\", t.name),\n meta: { kind: \"aup:theme\", description: t.description },\n })),\n };\n }\n\n @Read(\"/themes\")\n async readThemesDir(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"themes\",\n path: \"/themes\",\n content: `AUP Theme Registry (${Object.keys(THEMES).length} themes)`,\n meta: { kind: \"themes-directory\", childrenCount: Object.keys(THEMES).length },\n };\n }\n\n @Stat(\"/themes\")\n async statThemesDir(_ctx: RouteContext): Promise<AFSStatResult> {\n return {\n data: {\n id: \"themes\",\n path: \"/themes\",\n meta: { kind: \"themes-directory\", childrenCount: Object.keys(THEMES).length },\n },\n };\n }\n\n @Meta(\"/themes\")\n async metaThemesDir(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"themes\",\n path: \"/themes/.meta\",\n meta: { kind: \"themes-directory\", childrenCount: Object.keys(THEMES).length },\n };\n }\n\n @Read(\"/themes/:name\")\n async readTheme(ctx: RouteContext): Promise<AFSEntry> {\n const name = ctx.params.name as string;\n const theme = THEMES[name];\n if (!theme) throw new AFSNotFoundError(joinURL(\"/themes\", name));\n return {\n id: theme.name,\n path: joinURL(\"/themes\", theme.name),\n content: theme,\n meta: { kind: \"aup:theme\", description: theme.description },\n };\n }\n\n @Stat(\"/themes/:name\")\n async statTheme(ctx: RouteContext): Promise<AFSStatResult> {\n const name = ctx.params.name as string;\n const theme = THEMES[name];\n if (!theme) throw new AFSNotFoundError(joinURL(\"/themes\", name));\n return {\n data: {\n id: theme.name,\n path: joinURL(\"/themes\", theme.name),\n meta: { kind: \"aup:theme\", description: theme.description },\n },\n };\n }\n\n @Meta(\"/themes/:name\")\n async metaTheme(ctx: RouteContext): Promise<AFSEntry> {\n const name = ctx.params.name as string;\n const theme = THEMES[name];\n if (!theme) throw new AFSNotFoundError(joinURL(\"/themes\", name));\n return {\n id: theme.name,\n path: joinURL(\"/themes\", theme.name, \".meta\"),\n meta: { kind: \"aup:theme\", description: theme.description },\n };\n }\n\n // ─── Overlay Themes ────────────────────────────────────────\n\n @List(\"/overlay-themes\")\n async listOverlayThemes(_ctx: RouteContext): Promise<AFSListResult> {\n return {\n data: Object.values(OVERLAY_THEMES).map((t) => ({\n id: t.name,\n name: t.name,\n path: joinURL(\"/overlay-themes\", t.name),\n meta: { kind: \"aup:overlay-theme\", description: t.description },\n })),\n };\n }\n\n @Read(\"/overlay-themes\")\n async readOverlayThemesDir(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"overlay-themes\",\n path: \"/overlay-themes\",\n content: `AUP Overlay Theme Registry (${Object.keys(OVERLAY_THEMES).length} themes)\\n\\nBroadcast \"graphics packages\" for overlay-grid layouts. Apply via theme prop on view with layout: \"overlay-grid\".\\n\\nAvailable: ${Object.keys(OVERLAY_THEMES).join(\", \")}`,\n meta: { kind: \"overlay-themes-directory\", childrenCount: Object.keys(OVERLAY_THEMES).length },\n };\n }\n\n @Stat(\"/overlay-themes\")\n async statOverlayThemesDir(_ctx: RouteContext): Promise<AFSStatResult> {\n return {\n data: {\n id: \"overlay-themes\",\n path: \"/overlay-themes\",\n meta: {\n kind: \"overlay-themes-directory\",\n childrenCount: Object.keys(OVERLAY_THEMES).length,\n },\n },\n };\n }\n\n @Meta(\"/overlay-themes\")\n async metaOverlayThemesDir(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"overlay-themes\",\n path: \"/overlay-themes/.meta\",\n meta: { kind: \"overlay-themes-directory\", childrenCount: Object.keys(OVERLAY_THEMES).length },\n };\n }\n\n @Read(\"/overlay-themes/:name\")\n async readOverlayTheme(ctx: RouteContext): Promise<AFSEntry> {\n const name = ctx.params.name as string;\n const theme = OVERLAY_THEMES[name];\n if (!theme) throw new AFSNotFoundError(joinURL(\"/overlay-themes\", name));\n return {\n id: theme.name,\n path: joinURL(\"/overlay-themes\", theme.name),\n content: theme,\n meta: { kind: \"aup:overlay-theme\", description: theme.description },\n };\n }\n\n @Stat(\"/overlay-themes/:name\")\n async statOverlayTheme(ctx: RouteContext): Promise<AFSStatResult> {\n const name = ctx.params.name as string;\n const theme = OVERLAY_THEMES[name];\n if (!theme) throw new AFSNotFoundError(joinURL(\"/overlay-themes\", name));\n return {\n data: {\n id: theme.name,\n path: joinURL(\"/overlay-themes\", theme.name),\n meta: { kind: \"aup:overlay-theme\", description: theme.description },\n },\n };\n }\n\n @Meta(\"/overlay-themes/:name\")\n async metaOverlayTheme(ctx: RouteContext): Promise<AFSEntry> {\n const name = ctx.params.name as string;\n const theme = OVERLAY_THEMES[name];\n if (!theme) throw new AFSNotFoundError(joinURL(\"/overlay-themes\", name));\n return {\n id: theme.name,\n path: joinURL(\"/overlay-themes\", theme.name, \".meta\"),\n meta: { kind: \"aup:overlay-theme\", description: theme.description },\n };\n }\n\n // ─── Overlay Theme Examples ───────────────────────────────\n\n @List(\"/overlay-themes/:name/examples\")\n async listOverlayExamples(ctx: RouteContext): Promise<AFSListResult> {\n const name = ctx.params.name as string;\n const theme = OVERLAY_THEMES[name];\n if (!theme) throw new AFSNotFoundError(joinURL(\"/overlay-themes\", name));\n return {\n data: (theme.examples || []).map((ex) => ({\n id: ex.name,\n name: ex.name,\n path: joinURL(\"/overlay-themes\", name, \"examples\", ex.name),\n meta: { kind: \"aup:overlay-example\", description: ex.description },\n })),\n };\n }\n\n @Read(\"/overlay-themes/:name/examples/:example\")\n async readOverlayExample(ctx: RouteContext): Promise<AFSEntry> {\n const name = ctx.params.name as string;\n const exName = ctx.params.example as string;\n const theme = OVERLAY_THEMES[name];\n if (!theme) throw new AFSNotFoundError(joinURL(\"/overlay-themes\", name));\n const ex = (theme.examples || []).find((e) => e.name === exName);\n if (!ex) throw new AFSNotFoundError(joinURL(\"/overlay-themes\", name, \"examples\", exName));\n return {\n id: ex.name,\n path: joinURL(\"/overlay-themes\", name, \"examples\", ex.name),\n content: ex.tree,\n meta: { kind: \"aup:overlay-example\", description: ex.description },\n };\n }\n\n // ─── Spec & Examples ──────────────────────────────────────\n\n @Read(\"/spec\")\n async readSpec(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"spec\",\n path: \"/spec\",\n content: AUP_SPEC,\n meta: { kind: \"aup:spec\", version: AUP_SPEC.version },\n };\n }\n\n @Stat(\"/spec\")\n async statSpec(_ctx: RouteContext): Promise<AFSStatResult> {\n return {\n data: {\n id: \"spec\",\n path: \"/spec\",\n meta: { kind: \"aup:spec\", version: AUP_SPEC.version },\n },\n };\n }\n\n @List(\"/spec\")\n async listSpec(_ctx: RouteContext): Promise<AFSListResult> {\n return { data: [] };\n }\n\n @Meta(\"/spec\")\n async metaSpec(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \".meta\",\n path: \"/spec/.meta\",\n meta: { kind: \"aup:spec\", version: AUP_SPEC.version, childrenCount: 0 },\n };\n }\n\n @Explain(\"/spec\")\n async explainSpec(_ctx: RouteContext): Promise<AFSExplainResult> {\n return {\n format: \"markdown\",\n content: [\n \"# AUP Document Specification\",\n \"\",\n \"Read `/spec` to get the full AUP wire format definition,\",\n \"including node fields, spatial intent system, sizing, event model, and workflow.\",\n \"\",\n \"This is the starting point for any agent building UI with AUP.\",\n ].join(\"\\n\"),\n };\n }\n\n @List(\"/examples\")\n async listExamples(_ctx: RouteContext): Promise<AFSListResult> {\n return {\n data: Object.values(AUP_EXAMPLES).map((ex) => ({\n id: ex.name,\n name: ex.name,\n path: joinURL(\"/examples\", ex.name),\n meta: {\n kind: \"aup:example\",\n title: ex.title,\n description: ex.description,\n concepts: ex.concepts,\n },\n })),\n };\n }\n\n @Read(\"/examples\")\n async readExamplesDir(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"examples\",\n path: \"/examples\",\n content: `AUP Examples (${Object.keys(AUP_EXAMPLES).length} examples)`,\n meta: {\n kind: \"examples-directory\",\n childrenCount: Object.keys(AUP_EXAMPLES).length,\n },\n };\n }\n\n @Stat(\"/examples\")\n async statExamplesDir(_ctx: RouteContext): Promise<AFSStatResult> {\n return {\n data: {\n id: \"examples\",\n path: \"/examples\",\n meta: {\n kind: \"examples-directory\",\n childrenCount: Object.keys(AUP_EXAMPLES).length,\n },\n },\n };\n }\n\n @Meta(\"/examples\")\n async metaExamplesDir(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"examples\",\n path: \"/examples/.meta\",\n meta: {\n kind: \"examples-directory\",\n childrenCount: Object.keys(AUP_EXAMPLES).length,\n },\n };\n }\n\n @Read(\"/examples/:name\")\n async readExample(ctx: RouteContext): Promise<AFSEntry> {\n const name = ctx.params.name as string;\n const ex = AUP_EXAMPLES[name];\n if (!ex) throw new AFSNotFoundError(joinURL(\"/examples\", name));\n return {\n id: ex.name,\n path: joinURL(\"/examples\", ex.name),\n content: ex,\n meta: {\n kind: \"aup:example\",\n title: ex.title,\n description: ex.description,\n concepts: ex.concepts,\n },\n };\n }\n\n @Stat(\"/examples/:name\")\n async statExample(ctx: RouteContext): Promise<AFSStatResult> {\n const name = ctx.params.name as string;\n const ex = AUP_EXAMPLES[name];\n if (!ex) throw new AFSNotFoundError(joinURL(\"/examples\", name));\n return {\n data: {\n id: ex.name,\n path: joinURL(\"/examples\", ex.name),\n meta: {\n kind: \"aup:example\",\n title: ex.title,\n description: ex.description,\n },\n },\n };\n }\n\n @Meta(\"/examples/:name\")\n async metaExample(ctx: RouteContext): Promise<AFSEntry> {\n const name = ctx.params.name as string;\n const ex = AUP_EXAMPLES[name];\n if (!ex) throw new AFSNotFoundError(joinURL(\"/examples\", name));\n return {\n id: ex.name,\n path: joinURL(\"/examples\", ex.name, \".meta\"),\n meta: {\n kind: \"aup:example\",\n title: ex.title,\n description: ex.description,\n },\n };\n }\n\n // ─── Write ──────────────────────────────────────────────────\n\n @Write(\"/output\")\n async writeOutput(\n _ctx: RouteContext,\n payload: { content?: string; meta?: Record<string, unknown> },\n ): Promise<AFSWriteResult> {\n const content =\n typeof payload.content === \"string\" ? payload.content : String(payload.content ?? \"\");\n const format = (payload.meta?.format as string) ?? undefined;\n const component = (payload.meta?.component as string) ?? undefined;\n const componentProps = (payload.meta?.componentProps as Record<string, unknown>) ?? undefined;\n await this.backend.write(content, { format, component, componentProps });\n return {\n data: {\n id: \"output\",\n path: \"/output\",\n content,\n meta: { kind: \"output-channel\" },\n },\n };\n }\n\n @Write(\"/pages/:id\")\n async writePage(\n ctx: RouteContext,\n payload: { content?: string; meta?: Record<string, unknown> },\n ): Promise<AFSWriteResult> {\n const pageId = ctx.params.id as string;\n const content =\n typeof payload.content === \"string\" ? payload.content : String(payload.content ?? \"\");\n const format = (payload.meta?.format as string) ?? \"html\";\n const layout = (payload.meta?.layout as Record<string, string>) ?? undefined;\n const now = Date.now();\n\n const existing = this.pages.get(pageId);\n const pageData: PageData = {\n content,\n format,\n layout,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n };\n this.pages.set(pageId, pageData);\n this.persistPageToDisk(pageId, pageData);\n\n return {\n data: {\n id: pageId,\n path: joinURL(\"/pages\", pageId),\n content,\n meta: { kind: \"page\", format },\n },\n };\n }\n\n // ─── Delete ─────────────────────────────────────────────────\n\n @Delete(\"/pages/:id\")\n async deletePage(ctx: RouteContext): Promise<AFSDeleteResult> {\n const pageId = ctx.params.id as string;\n if (!this.pages.has(pageId)) {\n throw new Error(`Page not found: ${pageId}`);\n }\n this.pages.delete(pageId);\n this.removePageFromDisk(pageId);\n return { message: `Deleted page: ${pageId}` };\n }\n\n // ─── Sharing Declaration ────────────────────────────────────\n\n /** Validate and parse a sharing entry payload */\n private parseSharingPayload(\n payload: { content?: unknown },\n existingCreatedAt?: number,\n ): SharingEntry {\n const raw = payload.content as Record<string, unknown> | undefined;\n if (!raw || typeof raw !== \"object\") throw new Error(\"Sharing entry requires a content object\");\n\n const target = raw.target as string | undefined;\n if (!target || typeof target !== \"string\") {\n throw new Error(\"Sharing entry requires 'target' field\");\n }\n\n const access = (raw.access as string) ?? \"guest\";\n if (!VALID_ACCESS_LEVELS.has(access)) {\n throw new Error(\n `Invalid access level: '${access}'. Must be one of: ${[...VALID_ACCESS_LEVELS].join(\", \")}`,\n );\n }\n\n const mode = (raw.mode as string) ?? \"static\";\n if (!VALID_SHARING_MODES.has(mode)) {\n throw new Error(\n `Invalid sharing mode: '${mode}'. Must be one of: ${[...VALID_SHARING_MODES].join(\", \")}`,\n );\n }\n\n const now = Date.now();\n const entryMeta = raw.meta as SharingEntryMeta | undefined;\n\n return {\n target,\n access: access as SharingEntry[\"access\"],\n mode: mode as SharingEntry[\"mode\"],\n slug: \"\", // filled by caller\n meta: entryMeta,\n createdAt: existingCreatedAt ?? now,\n updatedAt: now,\n };\n }\n\n @Write(\"/sharing/:slug\")\n async writeSharingEntry(\n ctx: RouteContext,\n payload: { content?: unknown },\n ): Promise<AFSWriteResult> {\n const slug = ctx.params.slug as string;\n const existing = this.sharingEntries.get(slug);\n const entry = this.parseSharingPayload(payload, existing?.createdAt);\n entry.slug = slug;\n this.sharingEntries.set(slug, entry);\n\n return {\n data: {\n id: slug,\n path: joinURL(\"/sharing\", slug),\n content: entry,\n meta: { kind: \"sharing-entry\" },\n },\n };\n }\n\n @Read(\"/sharing/:slug\")\n async readSharingEntry(ctx: RouteContext): Promise<AFSEntry> {\n const slug = ctx.params.slug as string;\n const entry = this.sharingEntries.get(slug);\n if (!entry) throw new AFSNotFoundError(joinURL(\"/sharing\", slug));\n return {\n id: slug,\n path: joinURL(\"/sharing\", slug),\n content: entry,\n meta: { kind: \"sharing-entry\", access: entry.access, mode: entry.mode },\n };\n }\n\n @Read(\"/sharing\")\n async readSharingDir(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"sharing\",\n path: \"/sharing\",\n content: `Web Sharing Entries (${this.sharingEntries.size} entries)`,\n meta: {\n kind: \"sharing-directory\",\n childrenCount: this.sharingEntries.size,\n },\n };\n }\n\n @List(\"/sharing\")\n async listSharingEntries(_ctx: RouteContext): Promise<AFSListResult> {\n const entries: AFSEntry[] = [];\n for (const [slug, entry] of this.sharingEntries) {\n entries.push({\n id: slug,\n path: joinURL(\"/sharing\", slug),\n meta: {\n kind: \"sharing-entry\",\n target: entry.target,\n access: entry.access,\n mode: entry.mode,\n },\n });\n }\n return { data: entries };\n }\n\n @Delete(\"/sharing/:slug\")\n async deleteSharingEntry(ctx: RouteContext): Promise<AFSDeleteResult> {\n const slug = ctx.params.slug as string;\n if (!this.sharingEntries.has(slug)) {\n throw new AFSNotFoundError(joinURL(\"/sharing\", slug));\n }\n this.sharingEntries.delete(slug);\n return { message: `Deleted sharing entry: ${slug}` };\n }\n\n @Meta(\"/sharing\")\n async metaSharingDir(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"sharing\",\n path: \"/sharing/.meta\",\n meta: {\n kind: \"sharing-directory\",\n childrenCount: this.sharingEntries.size,\n },\n };\n }\n\n @Meta(\"/sharing/:slug\")\n async metaSharingEntry(ctx: RouteContext): Promise<AFSEntry> {\n const slug = ctx.params.slug as string;\n const entry = this.sharingEntries.get(slug);\n if (!entry) throw new AFSNotFoundError(joinURL(\"/sharing\", slug));\n return {\n id: slug,\n path: joinURL(\"/sharing\", slug, \".meta\"),\n meta: { kind: \"sharing-entry\", access: entry.access, mode: entry.mode },\n };\n }\n\n @Stat(\"/sharing\")\n async statSharingDir(_ctx: RouteContext): Promise<AFSStatResult> {\n return {\n data: {\n id: \"sharing\",\n path: \"/sharing\",\n meta: {\n kind: \"sharing-directory\",\n childrenCount: this.sharingEntries.size,\n },\n },\n };\n }\n\n @Stat(\"/sharing/:slug\")\n async statSharingEntry(ctx: RouteContext): Promise<AFSStatResult> {\n const slug = ctx.params.slug as string;\n const entry = this.sharingEntries.get(slug);\n if (!entry) throw new AFSNotFoundError(joinURL(\"/sharing\", slug));\n return {\n data: {\n id: slug,\n path: joinURL(\"/sharing\", slug),\n meta: { kind: \"sharing-entry\", access: entry.access, mode: entry.mode },\n },\n };\n }\n\n @Actions(\"/sharing/:slug\")\n async listSharingActions(ctx: RouteContext): Promise<AFSListResult> {\n const slug = ctx.params.slug as string;\n const entry = this.sharingEntries.get(slug);\n if (!entry) throw new AFSNotFoundError(joinURL(\"/sharing\", slug));\n const basePath = joinURL(\"/sharing\", slug, \".actions\");\n const actions: AFSEntry[] = [];\n if (entry.mode === \"static\") {\n actions.push({\n id: \"snapshot\",\n path: joinURL(basePath, \"snapshot\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Freeze the AUP tree from a session into a static HTML snapshot\",\n inputSchema: {\n type: \"object\",\n required: [\"sessionId\"],\n properties: {\n sessionId: {\n type: \"string\",\n description: \"Session ID whose AUP tree to snapshot\",\n },\n },\n },\n },\n });\n }\n return { data: actions };\n }\n\n @Actions.Exec(\"/sharing/:slug\", \"snapshot\")\n async execSharingSnapshot(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const slug = ctx.params.slug as string;\n const entry = this.sharingEntries.get(slug);\n if (!entry) throw new AFSNotFoundError(joinURL(\"/sharing\", slug));\n\n if (entry.mode !== \"static\") {\n throw new Error(\"Static snapshot not available for live mode entries\");\n }\n\n const sessionId = args.sessionId as string | undefined;\n if (!sessionId) {\n throw new Error(\"snapshot action requires 'sessionId' argument\");\n }\n\n // Get AUP tree from the session\n const store = this.aupStores.get(sessionId);\n const tree = store?.getRoot();\n if (!tree) {\n throw new Error(\"No AUP tree found for the specified session — render content first\");\n }\n\n // Generate snapshot HTML\n const html = generateSnapshot({\n tree,\n slug,\n meta: entry.meta,\n style: store!.renderOptions.style,\n locale: store!.renderOptions.locale,\n });\n\n // Store snapshot on the entry\n entry.snapshot = html;\n entry.updatedAt = Date.now();\n\n return { success: true, data: { slug, size: html.length } };\n }\n\n // ─── Stat ───────────────────────────────────────────────────\n\n @Stat(\"/\")\n async statRoot(_ctx: RouteContext): Promise<AFSStatResult> {\n if (this.initPromise) await this.initPromise;\n const meta: Record<string, unknown> = {\n kind: \"device\",\n childrenCount: 10,\n backend: this.backend.type,\n };\n if (this.serverUrl) {\n meta.url = this.serverUrl;\n }\n return {\n data: {\n id: this.name,\n path: \"/\",\n meta,\n },\n };\n }\n\n @Stat(\"/input\")\n async statInput(_ctx: RouteContext): Promise<AFSStatResult> {\n return {\n data: {\n id: \"input\",\n path: \"/input\",\n meta: {\n kind: \"input-channel\",\n childrenCount: 0,\n pending: this.backend.hasPendingInput(),\n },\n },\n };\n }\n\n @Stat(\"/output\")\n async statOutput(_ctx: RouteContext): Promise<AFSStatResult> {\n return {\n data: {\n id: \"output\",\n path: \"/output\",\n meta: {\n kind: \"output-channel\",\n childrenCount: 0,\n },\n },\n };\n }\n\n @Stat(\"/pages\")\n async statPages(_ctx: RouteContext): Promise<AFSStatResult> {\n return {\n data: {\n id: \"pages\",\n path: \"/pages\",\n meta: {\n kind: \"pages-directory\",\n childrenCount: this.pages.size,\n },\n },\n };\n }\n\n @Stat(\"/pages/:id\")\n async statPage(ctx: RouteContext): Promise<AFSStatResult> {\n const pageId = ctx.params.id as string;\n const page = this.pages.get(pageId);\n if (!page) throw new Error(`Page not found: ${pageId}`);\n return {\n data: {\n id: pageId,\n path: joinURL(\"/pages\", pageId),\n meta: {\n kind: \"page\",\n format: page.format,\n childrenCount: 0,\n },\n },\n };\n }\n\n // ─── Explain ────────────────────────────────────────────────\n\n @Explain(\"/\")\n async explainRoot(_ctx: RouteContext): Promise<AFSExplainResult> {\n return {\n format: \"markdown\",\n content: [\n `# UI Device (${this.backend.type})`,\n \"\",\n \"You can build **any UI** by composing AUP (Agentic UI Protocol) component trees.\",\n \"\",\n \"## Quick Start\",\n \"\",\n \"1. **Read `/spec`** — Full AUP document format, node fields, event model, and workflow\",\n `2. **Read \\`/primitives\\`** — ${Object.keys(PRIMITIVES).length} available components with complete props, events, and examples`,\n `3. **Read \\`/themes\\`** — ${Object.keys(THEMES).length} visual themes with color tokens`,\n `4. **Read \\`/overlay-themes\\`** — ${Object.keys(OVERLAY_THEMES).length} broadcast overlay themes (graphics packages) for overlay-grid`,\n `5. **Read \\`/examples\\`** — ${Object.keys(AUP_EXAMPLES).length} complete working documents to learn from`,\n \"\",\n \"## Creating a UI\",\n \"\",\n \"```\",\n \"// 1. Build a node tree\",\n '{ id: \"root\", type: \"view\", props: { layout: \"column\" }, children: [...] }',\n \"\",\n \"// 2. Render it via session action\",\n `exec('/${this.endpointType}/sessions/:sid/.actions/aup_render', {`,\n \" root: nodeTree,\",\n \" fullPage: true,\",\n \" style: 'midnight'\",\n \"})\",\n \"\",\n \"// 3. Handle events (user clicks, input changes)\",\n \"// Events call your AFS exec paths defined in node.events\",\n \"\",\n \"// 4. Update UI incrementally\",\n `exec('/${this.endpointType}/sessions/:sid/.actions/aup_patch', {`,\n ' ops: [{ op: \"update\", id: \"node-id\", props: { content: \"new text\" } }]',\n \"})\",\n \"```\",\n \"\",\n \"## Key Concepts\",\n \"\",\n `- **${Object.keys(PRIMITIVES).length} primitives**: view, text, action, input, media, overlay, table, time, chart, map, calendar, moonphase, natal-chart, chat, terminal, editor, explorer, canvas, globe, finance-chart, rtc`,\n \"- **Events**: click, change, send, sort, select, confirm, cancel — each triggers an AFS exec call\",\n \"- **Live data**: Set `node.src` to an AFS path for auto-updating charts, maps, etc.\",\n \"- **Themes**: midnight, clean, glass, brutalist, soft, cyber, editorial\",\n \"\",\n \"## Session Actions\",\n \"\",\n \"| Action | Description |\",\n \"|--------|-------------|\",\n \"| `aup_render` | Render a full AUP component tree |\",\n \"| `aup_patch` | Incremental updates (create/update/remove/reorder) |\",\n \"| `aup_stage` | Stage a scene off-screen (pre-render for instant switching) |\",\n \"| `aup_take` | Take a staged scene live (CSS swap, zero DOM teardown) |\",\n \"| `aup_release` | Release a staged scene's resources |\",\n \"| `aup_save` | Save current graph to a session page |\",\n \"| `aup_load` | Load a saved graph and render it |\",\n \"| `prompt` | Ask user a question (text/password/confirm/select) |\",\n \"| `dialog` | Show dialog with custom buttons |\",\n \"| `toast` | Lightweight toast notification |\",\n \"| `form` | Collect structured input |\",\n \"| `navigate` | Navigate to a page |\",\n \"\",\n `## Capabilities: ${this.backend.capabilities.join(\", \")}`,\n `## Formats: ${this.backend.supportedFormats.join(\", \")}`,\n ].join(\"\\n\"),\n };\n }\n\n @Explain(\"/input\")\n async explainInput(_ctx: RouteContext): Promise<AFSExplainResult> {\n return {\n format: \"text\",\n content:\n \"Input channel — use `read('/input')` to wait for user input. \" +\n \"Use `stat('/input')` to check if input is pending without blocking.\",\n };\n }\n\n @Explain(\"/output\")\n async explainOutput(_ctx: RouteContext): Promise<AFSExplainResult> {\n return {\n format: \"text\",\n content:\n \"Output channel — use `write('/output', { content: '...' })` to display content to the user.\",\n };\n }\n\n @Explain(\"/pages\")\n async explainPages(_ctx: RouteContext): Promise<AFSExplainResult> {\n return {\n format: \"text\",\n content:\n \"Pages directory — use `write('/pages/:id', { content, meta: { format } })` to create pages. \" +\n \"Use `exec('/.actions/navigate', { page: ':id' })` to display a page.\",\n };\n }\n\n // ─── Endpoint Routes ───────────────────────────────────────\n\n @Read(\"/:endpoint\")\n async readEndpoint(ctx: RouteContext): Promise<AFSEntry> {\n const endpoint = this.assertEndpoint(ctx);\n const sessions = this.sessions.list(endpoint);\n const isWeb = endpoint === \"web\";\n return {\n id: endpoint,\n path: joinURL(\"/\", endpoint),\n content: `${endpoint} endpoint — ${sessions.length} active session(s)`,\n meta: {\n kind: \"endpoint\",\n childrenCount: isWeb ? 2 : 1, // sessions + live (web only)\n },\n };\n }\n\n @Stat(\"/:endpoint\")\n async statEndpoint(ctx: RouteContext): Promise<AFSStatResult> {\n const endpoint = this.assertEndpoint(ctx);\n const isWeb = endpoint === \"web\";\n return {\n data: {\n id: endpoint,\n path: joinURL(\"/\", endpoint),\n meta: {\n kind: \"endpoint\",\n childrenCount: isWeb ? 2 : 1,\n },\n },\n };\n }\n\n @List(\"/:endpoint\")\n async listEndpoint(ctx: RouteContext): Promise<AFSListResult> {\n const endpoint = this.assertEndpoint(ctx);\n const sessions = this.sessions.list(endpoint);\n const entries: AFSEntry[] = [\n {\n id: \"sessions\",\n path: joinURL(\"/\", endpoint, \"sessions\"),\n meta: {\n kind: \"sessions-directory\",\n childrenCount: sessions.length,\n },\n },\n ];\n if (endpoint === \"web\") {\n const channelCount = this.getActiveChannelCount();\n entries.push({\n id: \"live\",\n path: joinURL(\"/\", endpoint, \"live\"),\n meta: {\n kind: \"live-directory\",\n childrenCount: channelCount,\n },\n });\n }\n return { data: entries };\n }\n\n @Meta(\"/:endpoint\")\n async metaEndpoint(ctx: RouteContext): Promise<AFSEntry> {\n const endpoint = this.assertEndpoint(ctx);\n const isWeb = endpoint === \"web\";\n return {\n id: endpoint,\n path: joinURL(\"/\", endpoint, \".meta\"),\n meta: {\n kind: \"endpoint\",\n childrenCount: isWeb ? 2 : 1,\n },\n };\n }\n\n @Read(\"/:endpoint/sessions\")\n async readSessions(ctx: RouteContext): Promise<AFSEntry> {\n const endpoint = this.assertEndpoint(ctx);\n const sessions = this.sessions.list(endpoint);\n return {\n id: \"sessions\",\n path: joinURL(\"/\", endpoint, \"sessions\"),\n content: `${sessions.length} active session(s)`,\n meta: {\n kind: \"sessions-directory\",\n childrenCount: sessions.length,\n },\n };\n }\n\n @Meta(\"/:endpoint/sessions\")\n async metaSessions(ctx: RouteContext): Promise<AFSEntry> {\n const endpoint = this.assertEndpoint(ctx);\n const sessions = this.sessions.list(endpoint);\n return {\n id: \"sessions\",\n path: joinURL(\"/\", endpoint, \"sessions\", \".meta\"),\n meta: {\n kind: \"sessions-directory\",\n childrenCount: sessions.length,\n },\n };\n }\n\n // ─── Session-Scoped Routes ─────────────────────────────────\n\n @List(\"/:endpoint/sessions\")\n async listSessions(_ctx: RouteContext): Promise<AFSListResult> {\n const endpoint = this.assertEndpoint(_ctx);\n const sessions = this.sessions.list(endpoint);\n return {\n data: sessions.map((s) => ({\n id: s.id,\n path: joinURL(\"/\", endpoint, \"sessions\", s.id),\n meta: { ...s.toMeta(), kind: \"session\", childrenCount: -1 },\n })),\n };\n }\n\n @List(\"/:endpoint/sessions/:sid\")\n async listSession(ctx: RouteContext): Promise<AFSListResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const basePath = joinURL(\"/\", endpoint, \"sessions\", session.id);\n return {\n data: [\n {\n id: \"messages\",\n path: joinURL(basePath, \"messages\"),\n meta: { kind: \"messages-directory\", childrenCount: session.listMessages().length },\n },\n {\n id: \"pages\",\n path: joinURL(basePath, \"pages\"),\n meta: { kind: \"pages-directory\", childrenCount: session.listPages().length },\n },\n {\n id: \"tree\",\n path: joinURL(basePath, \"tree\"),\n meta: { kind: \"aup:tree\", childrenCount: 0 },\n },\n {\n id: \"wm\",\n path: joinURL(basePath, \"wm\"),\n meta: { kind: \"wm\", childrenCount: 3 },\n },\n ],\n };\n }\n\n @Read(\"/:endpoint/sessions/:sid\")\n async readSession(ctx: RouteContext): Promise<AFSEntry> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n return {\n id: session.id,\n path: joinURL(\"/\", endpoint, \"sessions\", session.id),\n content: `Session ${session.id} (${session.endpoint})`,\n meta: { kind: \"session\", ...session.toMeta() },\n };\n }\n\n @Meta(\"/:endpoint/sessions/:sid\")\n async metaSession(ctx: RouteContext): Promise<AFSEntry> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n return {\n id: session.id,\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \".meta\"),\n meta: {\n kind: \"session\",\n ...session.toMeta(),\n capabilities: {\n supportedTypes: [\n \"text\",\n \"table\",\n \"form\",\n \"select\",\n \"confirm\",\n \"dialog\",\n \"progress\",\n \"notification\",\n \"markdown\",\n \"code\",\n ],\n interactive: [\"prompt\", \"select\", \"confirm\", \"form\", \"dialog\"],\n pages: true,\n fallback: \"degrade_to_text\",\n },\n viewport: this.backend.getViewport(),\n },\n };\n }\n\n @Stat(\"/:endpoint/sessions/:sid\")\n async statSession(ctx: RouteContext): Promise<AFSStatResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n return {\n data: {\n id: session.id,\n path: joinURL(\"/\", endpoint, \"sessions\", session.id),\n meta: { kind: \"session\", ...session.toMeta() },\n },\n };\n }\n\n // ── Messages ──\n\n @List(\"/:endpoint/sessions/:sid/messages\")\n async listSessionMessages(ctx: RouteContext): Promise<AFSListResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const msgs = session.listMessages();\n return {\n data: msgs.map((m) => ({\n id: m.id,\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \"messages\", m.id),\n content: m,\n meta: { kind: \"message\", type: m.type, from: m.from },\n })),\n };\n }\n\n @Read(\"/:endpoint/sessions/:sid/messages/:mid\")\n async readSessionMessage(ctx: RouteContext): Promise<AFSEntry> {\n const session = this.resolveSession(ctx);\n const mid = ctx.params.mid as string;\n const endpoint = ctx.params.endpoint as string;\n const msg = session.findMessage(mid);\n if (!msg) throw new Error(`Message not found: ${mid}`);\n return {\n id: msg.id,\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \"messages\", mid),\n content: msg,\n meta: { kind: \"message\", type: msg.type, from: msg.from },\n };\n }\n\n @Write(\"/:endpoint/sessions/:sid/messages\")\n async writeSessionMessage(\n ctx: RouteContext,\n payload: { content?: unknown; meta?: Record<string, unknown> },\n ): Promise<AFSWriteResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const msgData =\n typeof payload.content === \"object\" && payload.content !== null\n ? (payload.content as Record<string, unknown>)\n : { type: \"text\", from: \"agent\", content: String(payload.content ?? \"\") };\n const msg = session.addMessage(msgData);\n\n // Forward to backend for rendering (text messages go to write)\n if (msg.type === \"text\" && msg.from === \"agent\" && typeof msg.content === \"string\") {\n await this.backend.write(msg.content as string);\n }\n\n return {\n data: {\n id: msg.id,\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \"messages\", msg.id),\n content: msg,\n meta: { kind: \"message\", type: msg.type },\n },\n };\n }\n\n // ── Session Pages ──\n\n @List(\"/:endpoint/sessions/:sid/pages\")\n async listSessionPages(ctx: RouteContext): Promise<AFSListResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n return {\n data: session.listPages().map(({ id, page }) => ({\n id,\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \"pages\", id),\n meta: { kind: \"page\", format: page.format, childrenCount: 0 },\n })),\n };\n }\n\n @Read(\"/:endpoint/sessions/:sid/pages/:pid\")\n async readSessionPage(ctx: RouteContext): Promise<AFSEntry> {\n const session = this.resolveSession(ctx);\n const pid = ctx.params.pid as string;\n const endpoint = ctx.params.endpoint as string;\n const page = session.getPage(pid);\n if (!page) throw new Error(`Page not found: ${pid}`);\n return {\n id: pid,\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \"pages\", pid),\n content: page.content,\n meta: { kind: \"page\", format: page.format, layout: page.layout },\n };\n }\n\n @Write(\"/:endpoint/sessions/:sid/pages/:pid\")\n async writeSessionPage(\n ctx: RouteContext,\n payload: { content?: string; meta?: Record<string, unknown> },\n ): Promise<AFSWriteResult> {\n const session = this.resolveSession(ctx);\n const pid = ctx.params.pid as string;\n const endpoint = ctx.params.endpoint as string;\n const content =\n typeof payload.content === \"string\" ? payload.content : String(payload.content ?? \"\");\n const format = (payload.meta?.format as string) ?? \"html\";\n const layout = (payload.meta?.layout as Record<string, string>) ?? undefined;\n session.setPage(pid, { content, format, layout });\n return {\n data: {\n id: pid,\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \"pages\", pid),\n content,\n meta: { kind: \"page\", format },\n },\n };\n }\n\n // ── Session Device Caps (D13) ──\n\n @Read(\"/:endpoint/sessions/:sid/.caps\")\n async readSessionCaps(ctx: RouteContext): Promise<AFSEntry> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n return {\n id: \".caps\",\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \".caps\"),\n content: session.deviceCaps,\n meta: { kind: \"aup:device-caps\" },\n };\n }\n\n @Write(\"/:endpoint/sessions/:sid/.caps\")\n async writeSessionCaps(\n ctx: RouteContext,\n payload: { content?: unknown },\n ): Promise<AFSWriteResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const err = session.setDeviceCaps(payload.content);\n if (err) throw new Error(`Invalid DeviceCaps: ${err}`);\n const capsPath = joinURL(\"/\", endpoint, \"sessions\", session.id, \".caps\");\n return {\n data: { id: capsPath, path: capsPath },\n };\n }\n\n // ── Session AUP Tree ──\n\n @Read(\"/:endpoint/sessions/:sid/tree\")\n async readSessionTree(ctx: RouteContext): Promise<AFSEntry> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const store = this.aupStores.get(session.id);\n const root = store?.getRoot() ?? null;\n return {\n id: \"tree\",\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \"tree\"),\n content: root,\n meta: { kind: \"aup:tree\" },\n };\n }\n\n @Write(\"/:endpoint/sessions/:sid/tree\")\n async writeSessionTree(\n ctx: RouteContext,\n payload: { content?: unknown; meta?: Record<string, unknown> },\n ): Promise<AFSWriteResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const root = payload.content;\n if (!root || typeof root !== \"object\")\n throw new Error(\"tree write requires a node object as content\");\n\n const err = validateNode(root);\n if (err) throw new Error(`Invalid AUP node: ${err}`);\n\n const store = this.getAupStore(session.id);\n store.setRoot(root as import(\"./aup-types.js\").AUPNode);\n\n // Extract render options from meta\n const meta = payload.meta ?? {};\n const fullPage = meta.fullPage === true;\n const chrome = meta.chrome === true;\n const theme = typeof meta.theme === \"string\" ? meta.theme : undefined;\n const style = typeof meta.style === \"string\" ? meta.style : undefined;\n const locale = typeof meta.locale === \"string\" ? meta.locale : undefined;\n\n // Send to the session's connected client (degraded for device caps)\n if (isAUPTransport(this.backend)) {\n const degraded = this.degradeForSession(store.getRoot()!, session);\n const msg: Record<string, unknown> = { type: \"aup\", action: \"render\", root: degraded };\n if (fullPage) msg.fullPage = true;\n if (chrome) msg.chrome = true;\n if (theme) msg.theme = theme;\n if (style) msg.style = style;\n if (locale) msg.locale = locale;\n this.backend.sendToSession(session.id, msg);\n }\n\n // Emit event so subscribers get notified\n const treePath = joinURL(\"/\", endpoint, \"sessions\", session.id, \"tree\");\n this.emit({ type: \"afs:write\", path: treePath, data: { root: store.getRoot() } });\n\n return {\n data: {\n id: \"tree\",\n path: treePath,\n content: store.getRoot(),\n meta: { kind: \"aup:tree\" },\n },\n };\n }\n\n // ── Session WM (Window Manager) ──\n\n @Read(\"/:endpoint/sessions/:sid/wm\")\n async readSessionWm(ctx: RouteContext): Promise<AFSEntry> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const wm = this.getWmNode(session.id);\n const wmProps = (wm?.wmNode.props ?? {}) as Record<string, unknown>;\n const wmState = (wm?.wmNode.state ?? {}) as Record<string, unknown>;\n const surfaces = (wm?.wmNode.children ?? []).filter((c) => c.type === \"wm-surface\");\n return {\n id: \"wm\",\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \"wm\"),\n content: {\n strategy: wmProps.strategy ?? \"single\",\n active: wmState.active ?? null,\n surfaceCount: surfaces.length,\n },\n meta: { kind: \"wm\" },\n };\n }\n\n @List(\"/:endpoint/sessions/:sid/wm\")\n async listSessionWm(ctx: RouteContext): Promise<AFSListResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const basePath = joinURL(\"/\", endpoint, \"sessions\", session.id, \"wm\");\n return {\n data: [\n {\n id: \"strategy\",\n path: joinURL(basePath, \"strategy\"),\n meta: { kind: \"wm:strategy\" },\n },\n {\n id: \"layout\",\n path: joinURL(basePath, \"layout\"),\n meta: { kind: \"wm:layout\" },\n },\n {\n id: \"surfaces\",\n path: joinURL(basePath, \"surfaces\"),\n meta: { kind: \"wm:surfaces\" },\n },\n ],\n };\n }\n\n @Read(\"/:endpoint/sessions/:sid/wm/strategy\")\n async readWmStrategy(ctx: RouteContext): Promise<AFSEntry> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const wm = this.getWmNode(session.id);\n const strategy = ((wm?.wmNode.props ?? {}) as Record<string, unknown>).strategy ?? \"single\";\n return {\n id: \"strategy\",\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \"wm\", \"strategy\"),\n content: strategy,\n meta: { kind: \"wm:strategy\" },\n };\n }\n\n @Write(\"/:endpoint/sessions/:sid/wm/strategy\")\n async writeWmStrategy(\n ctx: RouteContext,\n payload: { content?: unknown },\n ): Promise<AFSWriteResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const value = payload.content;\n if (typeof value !== \"string\") {\n throw new Error(\"WM strategy must be a string\");\n }\n\n const { wmNode } = this.ensureWmNode(session.id, value);\n this.applyWmPatch(session.id, ctx, [\n { op: \"update\", id: wmNode.id, props: { strategy: value } },\n ]);\n\n const path = joinURL(\"/\", endpoint, \"sessions\", session.id, \"wm\", \"strategy\");\n return {\n data: {\n id: \"strategy\",\n path,\n content: value,\n meta: { kind: \"wm:strategy\" },\n },\n };\n }\n\n @Read(\"/:endpoint/sessions/:sid/wm/layout\")\n async readWmLayout(ctx: RouteContext): Promise<AFSEntry> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const wm = this.getWmNode(session.id);\n const wmProps = (wm?.wmNode.props ?? {}) as Record<string, unknown>;\n const wmState = (wm?.wmNode.state ?? {}) as Record<string, unknown>;\n return {\n id: \"layout\",\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \"wm\", \"layout\"),\n content: {\n active: wmState.active ?? null,\n panels: wmProps.panels ?? [],\n preset: wmProps.layoutPreset ?? null,\n panelActives: wmState.panelActives ?? null,\n },\n meta: { kind: \"wm:layout\" },\n };\n }\n\n @List(\"/:endpoint/sessions/:sid/wm/surfaces\")\n async listWmSurfaces(ctx: RouteContext): Promise<AFSListResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const wm = this.getWmNode(session.id);\n const surfaces = (wm?.wmNode.children ?? []).filter((c) => c.type === \"wm-surface\");\n const basePath = joinURL(\"/\", endpoint, \"sessions\", session.id, \"wm\", \"surfaces\");\n return {\n data: surfaces.map((c) => {\n const cp = (c.props ?? {}) as Record<string, unknown>;\n const name = (cp.surfaceName as string) || c.id.replace(/^wm-surface-/, \"\");\n return {\n id: name,\n path: joinURL(basePath, name),\n meta: {\n kind: \"wm:surface\",\n title: (cp.title as string) ?? name,\n panel: (cp.panel as string) || undefined,\n },\n };\n }),\n };\n }\n\n @Read(\"/:endpoint/sessions/:sid/wm/surfaces/:surfaceName\")\n async readWmSurface(ctx: RouteContext): Promise<AFSEntry> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const surfaceName = ctx.params.surfaceName as string;\n const wm = this.getWmNode(session.id);\n const surfNode = wm ? this.findWmSurface(wm.wmNode, surfaceName) : undefined;\n if (!surfNode) throw new AFSNotFoundError(`Surface not found: ${surfaceName}`);\n const cp = (surfNode.props ?? {}) as Record<string, unknown>;\n return {\n id: surfaceName,\n path: joinURL(\"/\", endpoint, \"sessions\", session.id, \"wm\", \"surfaces\", surfaceName),\n content: {\n session: surfNode.src,\n panel: cp.panel ?? undefined,\n title: cp.title ?? cp.surfaceName ?? surfaceName,\n position: cp.position,\n size: cp.size,\n docked: !!cp.docked,\n originalPanel: cp.originalPanel ?? undefined,\n },\n meta: { kind: \"wm:surface\", title: (cp.title as string) ?? surfaceName },\n };\n }\n\n // ── WM Actions ──\n\n @Actions(\"/:endpoint/sessions/:sid/wm\")\n async listWmActions(ctx: RouteContext): Promise<AFSListResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const basePath = joinURL(\"/\", endpoint, \"sessions\", session.id, \"wm\", \".actions\");\n return {\n data: [\n {\n id: \"open-surface\",\n path: joinURL(basePath, \"open-surface\"),\n meta: {\n kind: \"afs:executable\",\n description:\n \"Open (or replace) a WM surface. Universal: src can be ws:// URL, AFS path, or omitted for inline content.\",\n inputSchema: {\n type: \"object\",\n required: [\"name\"],\n properties: {\n name: { type: \"string\", description: \"Unique surface name\" },\n src: {\n type: \"string\",\n description: \"Source: ws:// URL, http:// URL, or /afs/path\",\n },\n session: { type: \"string\", description: \"Alias for src (backward compat)\" },\n content: { type: \"object\", description: \"Initial inline AUP tree (when no src)\" },\n panel: { type: \"string\", description: \"Panel assignment\" },\n title: { type: \"string\", description: \"Display title\" },\n },\n },\n },\n },\n {\n id: \"set-surface-content\",\n path: joinURL(basePath, \"set-surface-content\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Replace the inline AUP content of a surface.\",\n inputSchema: {\n type: \"object\",\n required: [\"surface\", \"content\"],\n properties: {\n surface: { type: \"string\", description: \"Surface name\" },\n content: { type: \"object\", description: \"AUP node tree to render\" },\n },\n },\n },\n },\n {\n id: \"close-surface\",\n path: joinURL(basePath, \"close-surface\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Close a WM surface.\",\n inputSchema: {\n type: \"object\",\n required: [\"name\"],\n properties: {\n name: { type: \"string\", description: \"Surface name to close\" },\n },\n },\n },\n },\n {\n id: \"set-strategy\",\n path: joinURL(basePath, \"set-strategy\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Change WM strategy.\",\n inputSchema: {\n type: \"object\",\n required: [\"strategy\"],\n properties: {\n strategy: {\n type: \"string\",\n enum: [\"single\", \"panels\", \"floating\", \"virtual\"],\n description: \"WM strategy\",\n },\n },\n },\n },\n },\n {\n id: \"set-active\",\n path: joinURL(basePath, \"set-active\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Set the active (focused) surface.\",\n inputSchema: {\n type: \"object\",\n required: [\"name\"],\n properties: {\n name: { type: \"string\", description: \"Surface name to activate\" },\n },\n },\n },\n },\n {\n id: \"pin-to-dock\",\n path: joinURL(basePath, \"pin-to-dock\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Pin a floating surface to the dock strip.\",\n inputSchema: {\n type: \"object\",\n required: [\"name\"],\n properties: {\n name: { type: \"string\", description: \"Surface name to dock\" },\n },\n },\n },\n },\n {\n id: \"unpin-from-dock\",\n path: joinURL(basePath, \"unpin-from-dock\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Unpin a surface from the dock, restore to floating.\",\n inputSchema: {\n type: \"object\",\n required: [\"name\"],\n properties: {\n name: { type: \"string\", description: \"Surface name to undock\" },\n },\n },\n },\n },\n {\n id: \"set-layout\",\n path: joinURL(basePath, \"set-layout\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Set panel layout preset (explorer, settings, simple, miller).\",\n inputSchema: {\n type: \"object\",\n required: [\"preset\"],\n properties: {\n preset: {\n type: \"string\",\n description:\n \"Panel preset name (explorer, settings, simple, miller). Unknown names fall back to simple.\",\n },\n },\n },\n },\n },\n {\n id: \"collapse-panel\",\n path: joinURL(basePath, \"collapse-panel\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Collapse a panel in the layout.\",\n inputSchema: {\n type: \"object\",\n required: [\"panelId\"],\n properties: {\n panelId: { type: \"string\", description: \"Panel ID to collapse\" },\n },\n },\n },\n },\n {\n id: \"expand-panel\",\n path: joinURL(basePath, \"expand-panel\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Expand a collapsed panel.\",\n inputSchema: {\n type: \"object\",\n required: [\"panelId\"],\n properties: {\n panelId: { type: \"string\", description: \"Panel ID to expand\" },\n },\n },\n },\n },\n {\n id: \"move-surface\",\n path: joinURL(basePath, \"move-surface\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Move a surface to a different panel.\",\n inputSchema: {\n type: \"object\",\n required: [\"name\", \"panel\"],\n properties: {\n name: { type: \"string\", description: \"Surface name to move\" },\n panel: { type: \"string\", description: \"Target panel ID\" },\n },\n },\n },\n },\n {\n id: \"add-to-panel\",\n path: joinURL(basePath, \"add-to-panel\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Add a surface to a panel as a new tab.\",\n inputSchema: {\n type: \"object\",\n required: [\"name\", \"session\", \"panel\"],\n properties: {\n name: { type: \"string\", description: \"Surface name\" },\n session: { type: \"string\", description: \"AUP session ID for this surface\" },\n panel: { type: \"string\", description: \"Target panel ID\" },\n title: { type: \"string\", description: \"Display title for the tab\" },\n },\n },\n },\n },\n {\n id: \"set-panel-active\",\n path: joinURL(basePath, \"set-panel-active\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Set the active tab (surface) within a specific panel.\",\n inputSchema: {\n type: \"object\",\n required: [\"panel\", \"surface\"],\n properties: {\n panel: { type: \"string\", description: \"Panel ID\" },\n surface: { type: \"string\", description: \"Surface name to activate in the panel\" },\n },\n },\n },\n },\n {\n id: \"popout\",\n path: joinURL(basePath, \"popout\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Detach a surface from its panel to a floating overlay.\",\n inputSchema: {\n type: \"object\",\n required: [\"name\"],\n properties: {\n name: { type: \"string\", description: \"Surface name to pop out\" },\n },\n },\n },\n },\n {\n id: \"redock\",\n path: joinURL(basePath, \"redock\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Return a floating overlay surface to its original panel.\",\n inputSchema: {\n type: \"object\",\n required: [\"name\"],\n properties: {\n name: { type: \"string\", description: \"Surface name to redock\" },\n },\n },\n },\n },\n {\n id: \"auto-arrange\",\n path: joinURL(basePath, \"auto-arrange\"),\n meta: {\n kind: \"afs:executable\",\n description:\n \"Tile all floating surfaces evenly within the viewport. \" +\n \"Computes non-overlapping positions using an optimal grid layout.\",\n inputSchema: {\n type: \"object\",\n required: [\"viewport\"],\n properties: {\n viewport: {\n type: \"object\",\n description: \"Desktop viewport size\",\n properties: {\n width: { type: \"number\", description: \"Viewport width in px\" },\n height: { type: \"number\", description: \"Viewport height in px\" },\n },\n required: [\"width\", \"height\"],\n },\n gap: { type: \"number\", description: \"Gap between windows in px (default 8)\" },\n padding: {\n type: \"number\",\n description: \"Padding from viewport edges in px (default 8)\",\n },\n preserveAspect: {\n type: \"boolean\",\n description: \"Preserve each window's aspect ratio (default false)\",\n },\n },\n },\n },\n },\n ],\n };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"open-surface\")\n async execWmOpenSurface(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const name = args.name as string | undefined;\n if (!name) throw new Error(\"open-surface action requires 'name' argument\");\n\n // Universal surface: src is optional\n // - ws:// or http:// URL → remote AUP device\n // - /afs/path → AFS introspection device\n // - omitted → inline content (set via content arg or set-surface-content action)\n const sessionRef = args.session as string | undefined;\n const src = (args.src as string | undefined) || sessionRef;\n\n const { wmNode } = this.ensureWmNode(session.id);\n const surfId = `wm-surface-${name}`;\n const existing = this.findWmSurface(wmNode, name);\n\n const surfProps: Record<string, unknown> = {\n surfaceName: name,\n title: typeof args.title === \"string\" ? args.title : name,\n };\n if (typeof args.panel === \"string\") surfProps.panel = args.panel;\n if (args.position) surfProps.position = args.position;\n if (args.size) surfProps.size = args.size;\n\n // Build the surface node — children hold inline AUP content\n const surfNode: import(\"./aup-types.js\").AUPNode = {\n id: surfId,\n type: \"wm-surface\",\n props: surfProps,\n };\n if (src) surfNode.src = src;\n // Initial inline content\n const content = args.content as Record<string, unknown> | undefined;\n if (content && typeof content === \"object\" && content.type) {\n surfNode.children = [content as unknown as import(\"./aup-types.js\").AUPNode];\n }\n\n const ops: import(\"./aup-types.js\").AUPPatchOp[] = [];\n if (existing) {\n ops.push({ op: \"remove\", id: existing.id });\n }\n ops.push({ op: \"create\", id: surfId, parentId: \"wm\", node: surfNode });\n ops.push({ op: \"update\", id: \"wm\", state: { active: name } });\n\n this.applyWmPatch(session.id, ctx, ops);\n\n return { success: true, data: { name, active: name } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"set-surface-content\")\n async execWmSetSurfaceContent(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const surfaceName = args.surface as string | undefined;\n if (!surfaceName) throw new Error(\"set-surface-content requires 'surface' argument\");\n const content = args.content as Record<string, unknown> | undefined;\n\n const wm = this.getWmNode(session.id);\n if (!wm) throw new Error(`No WM node for session ${session.id}`);\n\n const surfNode = this.findWmSurface(wm.wmNode, surfaceName);\n if (!surfNode) throw new Error(`Surface not found: ${surfaceName}`);\n\n // Replace children with new content\n if (content && typeof content === \"object\" && content.type) {\n surfNode.children = [content as unknown as import(\"./aup-types.js\").AUPNode];\n } else {\n surfNode.children = [];\n }\n\n // Re-set the root so the store rebuilds its index with the new children.\n // Without this, findNode() can't locate the new child nodes for event routing.\n const store = this.getAupStore(session.id);\n const root = store.getRoot();\n if (root) store.setRoot(root);\n\n // Send targeted surface update — only replaces this surface's DOM content,\n // preserving all other panels, divider positions, and scroll state.\n if (isAUPTransport(this.backend)) {\n this.backend.sendToSession(session.id, {\n type: \"aup\",\n action: \"surface-update\",\n surfaceId: surfNode.id,\n children: surfNode.children || [],\n treeVersion: store.version,\n });\n }\n\n return { success: true, data: { surface: surfaceName } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"close-surface\")\n async execWmCloseSurface(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const name = args.name as string | undefined;\n if (!name) throw new Error(\"close-surface action requires 'name' argument\");\n\n const wm = this.getWmNode(session.id);\n if (!wm) throw new Error(`Surface not found: ${name}`);\n\n const surfNode = this.findWmSurface(wm.wmNode, name);\n if (!surfNode) throw new Error(`Surface not found: ${name}`);\n\n const ops: import(\"./aup-types.js\").AUPPatchOp[] = [{ op: \"remove\", id: surfNode.id }];\n // If the closed surface was active, pick the next one\n const wmState = (wm.wmNode.state ?? {}) as Record<string, unknown>;\n if (wmState.active === name) {\n const remaining = (wm.wmNode.children ?? []).filter(\n (c) => c.type === \"wm-surface\" && c.id !== surfNode.id,\n );\n const next =\n remaining.length > 0\n ? ((remaining[0]!.props as Record<string, unknown>)?.surfaceName as string) ||\n remaining[0]!.id.replace(/^wm-surface-/, \"\")\n : null;\n ops.push({ op: \"update\", id: \"wm\", state: { active: next } });\n }\n\n // Update panelActives if the closed surface was the active tab in any panel\n const surfProps = (surfNode.props ?? {}) as Record<string, unknown>;\n const surfPanel = surfProps.panel as string | undefined;\n const panelActives = (wmState.panelActives as Record<string, string>) ?? {};\n if (surfPanel && panelActives[surfPanel] === name) {\n const remainingInPanel = (wm.wmNode.children ?? []).filter(\n (c) =>\n c.type === \"wm-surface\" &&\n c.id !== surfNode.id &&\n (c.props as Record<string, unknown>)?.panel === surfPanel,\n );\n const nextTab =\n remainingInPanel.length > 0\n ? ((remainingInPanel[0]!.props as Record<string, unknown>)?.surfaceName as string) ||\n remainingInPanel[0]!.id.replace(/^wm-surface-/, \"\")\n : undefined;\n const updatedPanelActives = { ...panelActives };\n if (nextTab) {\n updatedPanelActives[surfPanel] = nextTab;\n } else {\n delete updatedPanelActives[surfPanel];\n }\n ops.push({ op: \"update\", id: \"wm\", state: { panelActives: updatedPanelActives } });\n }\n\n this.applyWmPatch(session.id, ctx, ops);\n\n const updatedState = (wm.wmNode.state ?? {}) as Record<string, unknown>;\n return { success: true, data: { active: updatedState.active ?? null } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"set-strategy\")\n async execWmSetStrategy(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const strategy = args.strategy as string | undefined;\n if (!strategy) throw new Error(\"set-strategy action requires 'strategy' argument\");\n const validStrategies = [\"single\", \"panels\", \"floating\", \"virtual\"];\n if (!validStrategies.includes(strategy)) {\n throw new Error(\n `Invalid WM strategy: ${strategy}. Must be one of: ${validStrategies.join(\", \")}`,\n );\n }\n\n this.ensureWmNode(session.id, strategy);\n this.applyWmPatch(session.id, ctx, [{ op: \"update\", id: \"wm\", props: { strategy } }]);\n\n return { success: true, data: { strategy } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"set-active\")\n async execWmSetActive(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const name = args.name as string | undefined;\n if (!name) throw new Error(\"set-active action requires 'name' argument\");\n\n this.ensureWmNode(session.id);\n this.applyWmPatch(session.id, ctx, [{ op: \"update\", id: \"wm\", state: { active: name } }]);\n\n return { success: true, data: { active: name } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"pin-to-dock\")\n async execWmPinToDock(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const name = args.name as string | undefined;\n if (!name) throw new Error(\"pin-to-dock action requires 'name' argument\");\n\n const wm = this.getWmNode(session.id);\n const surfNode = wm ? this.findWmSurface(wm.wmNode, name) : undefined;\n if (!surfNode) throw new Error(`Surface not found: ${name}`);\n\n this.applyWmPatch(session.id, ctx, [\n { op: \"update\", id: surfNode.id, props: { docked: true } },\n ]);\n\n return { success: true, data: { name, docked: true } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"unpin-from-dock\")\n async execWmUnpinFromDock(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const name = args.name as string | undefined;\n if (!name) throw new Error(\"unpin-from-dock action requires 'name' argument\");\n\n const wm = this.getWmNode(session.id);\n const surfNode = wm ? this.findWmSurface(wm.wmNode, name) : undefined;\n if (!surfNode) throw new Error(`Surface not found: ${name}`);\n\n this.applyWmPatch(session.id, ctx, [\n { op: \"update\", id: surfNode.id, props: { docked: false } },\n ]);\n\n return { success: true, data: { name, docked: false } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"set-layout\")\n async execWmSetLayout(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const preset = args.preset as string | undefined;\n if (!preset) throw new Error(\"set-layout action requires 'preset' argument\");\n\n // Resolve preset to panel configs (fall back to \"simple\" for unknown presets)\n const resolved = PANEL_PRESETS[preset] ?? PANEL_PRESETS.simple!;\n const effectivePreset = PANEL_PRESETS[preset] ? preset : \"simple\";\n this.ensureWmNode(session.id, \"panels\");\n this.applyWmPatch(session.id, ctx, [\n {\n op: \"update\",\n id: \"wm\",\n props: { strategy: \"panels\", layoutPreset: effectivePreset, panels: resolved },\n },\n ]);\n\n return { success: true, data: { preset: effectivePreset } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"collapse-panel\")\n async execWmCollapsePanel(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const panelId = args.panelId as string | undefined;\n if (!panelId) throw new Error(\"collapse-panel action requires 'panelId' argument\");\n\n const wm = this.getWmNode(session.id);\n if (!wm) throw new Error(`Panel not found: ${panelId}`);\n\n const wmProps = (wm.wmNode.props ?? {}) as Record<string, unknown>;\n const panels = (wmProps.panels ?? []) as Record<string, unknown>[];\n const panel = panels.find((p) => p.id === panelId);\n if (!panel) throw new Error(`Panel not found: ${panelId}`);\n\n const updated = panels.map((p) => (p.id === panelId ? { ...p, collapsed: true } : p));\n this.applyWmPatch(session.id, ctx, [{ op: \"update\", id: \"wm\", props: { panels: updated } }]);\n\n return { success: true, data: { panelId, collapsed: true } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"expand-panel\")\n async execWmExpandPanel(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const panelId = args.panelId as string | undefined;\n if (!panelId) throw new Error(\"expand-panel action requires 'panelId' argument\");\n\n const wm = this.getWmNode(session.id);\n if (!wm) throw new Error(`Panel not found: ${panelId}`);\n\n const wmProps = (wm.wmNode.props ?? {}) as Record<string, unknown>;\n const panels = (wmProps.panels ?? []) as Record<string, unknown>[];\n const panel = panels.find((p) => p.id === panelId);\n if (!panel) throw new Error(`Panel not found: ${panelId}`);\n\n const updated = panels.map((p) => (p.id === panelId ? { ...p, collapsed: false } : p));\n this.applyWmPatch(session.id, ctx, [{ op: \"update\", id: \"wm\", props: { panels: updated } }]);\n\n return { success: true, data: { panelId, collapsed: false } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"move-surface\")\n async execWmMoveSurface(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const name = args.name as string | undefined;\n if (!name) throw new Error(\"move-surface action requires 'name' argument\");\n const panel = args.panel as string | undefined;\n if (!panel) throw new Error(\"move-surface action requires 'panel' argument\");\n\n const wm = this.getWmNode(session.id);\n const surfNode = wm ? this.findWmSurface(wm.wmNode, name) : undefined;\n if (!surfNode) throw new Error(`Surface not found: ${name}`);\n\n // Validate panel exists if panels are configured\n const wmProps = (wm!.wmNode.props ?? {}) as Record<string, unknown>;\n const panels = (wmProps.panels ?? []) as Record<string, unknown>[];\n if (panels.length > 0 && !panels.some((p) => p.id === panel)) {\n throw new Error(`Panel not found: ${panel}`);\n }\n\n this.applyWmPatch(session.id, ctx, [{ op: \"update\", id: surfNode.id, props: { panel } }]);\n\n return { success: true, data: { name, panel } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"add-to-panel\")\n async execWmAddToPanel(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const name = args.name as string | undefined;\n if (!name) throw new Error(\"add-to-panel action requires 'name' argument\");\n const sessionRef = args.session as string | undefined;\n if (!sessionRef) throw new Error(\"add-to-panel action requires 'session' argument\");\n const panel = args.panel as string | undefined;\n if (!panel) throw new Error(\"add-to-panel action requires 'panel' argument\");\n\n this.ensureWmNode(session.id, \"panels\");\n\n // Validate panel exists if panels are configured\n const wm = this.getWmNode(session.id)!;\n const wmProps = (wm.wmNode.props ?? {}) as Record<string, unknown>;\n const panels = (wmProps.panels ?? []) as Record<string, unknown>[];\n if (panels.length > 0 && !panels.some((p) => p.id === panel)) {\n throw new Error(`Panel not found: ${panel}`);\n }\n\n const surfId = `wm-surface-${name}`;\n const ops: import(\"./aup-types.js\").AUPPatchOp[] = [\n {\n op: \"create\",\n id: surfId,\n parentId: \"wm\",\n node: {\n id: surfId,\n type: \"wm-surface\",\n src: sessionRef,\n props: {\n surfaceName: name,\n title: typeof args.title === \"string\" ? args.title : name,\n panel,\n },\n } as import(\"./aup-types.js\").AUPNode,\n },\n { op: \"update\", id: \"wm\", state: { active: name } },\n ];\n\n this.applyWmPatch(session.id, ctx, ops);\n\n return { success: true, data: { name, panel, active: name } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"set-panel-active\")\n async execWmSetPanelActive(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const panel = args.panel as string | undefined;\n if (!panel) throw new Error(\"set-panel-active action requires 'panel' argument\");\n const surface = args.surface as string | undefined;\n if (!surface) throw new Error(\"set-panel-active action requires 'surface' argument\");\n\n this.ensureWmNode(session.id);\n const wm = this.getWmNode(session.id)!;\n\n // Validate surface exists\n const surfNode = this.findWmSurface(wm.wmNode, surface);\n if (!surfNode) throw new Error(`Surface not found: ${surface}`);\n\n // Store panel-active mapping in WM node state\n const panelActives = {\n ...((((wm.wmNode.state ?? {}) as Record<string, unknown>).panelActives as Record<\n string,\n string\n >) ?? {}),\n };\n panelActives[panel] = surface;\n this.applyWmPatch(session.id, ctx, [{ op: \"update\", id: \"wm\", state: { panelActives } }]);\n\n return { success: true, data: { panel, surface } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"popout\")\n async execWmPopout(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const name = args.name as string | undefined;\n if (!name) throw new Error(\"popout action requires 'name' argument\");\n\n const wm = this.getWmNode(session.id);\n const surfNode = wm ? this.findWmSurface(wm.wmNode, name) : undefined;\n if (!surfNode) throw new Error(`Surface not found: ${name}`);\n\n const cp = (surfNode.props ?? {}) as Record<string, unknown>;\n const originalPanel = cp.panel as string | undefined;\n if (!originalPanel) throw new Error(`Surface \"${name}\" has no panel to pop out from`);\n this.applyWmPatch(session.id, ctx, [\n { op: \"update\", id: surfNode.id, props: { panel: null, originalPanel } },\n ]);\n\n return { success: true, data: { name, originalPanel } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"redock\")\n async execWmRedock(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const name = args.name as string | undefined;\n if (!name) throw new Error(\"redock action requires 'name' argument\");\n\n const wm = this.getWmNode(session.id);\n const surfNode = wm ? this.findWmSurface(wm.wmNode, name) : undefined;\n if (!surfNode) throw new Error(`Surface not found: ${name}`);\n\n const cp = (surfNode.props ?? {}) as Record<string, unknown>;\n const panel = cp.originalPanel as string | undefined;\n if (!panel) throw new Error(`Surface \"${name}\" was not popped out`);\n this.applyWmPatch(session.id, ctx, [\n { op: \"update\", id: surfNode.id, props: { panel, originalPanel: null } },\n ]);\n\n return { success: true, data: { name, panel } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid/wm\", \"auto-arrange\")\n async execWmAutoArrange(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const viewport = args.viewport as { width: number; height: number } | undefined;\n if (!viewport || typeof viewport.width !== \"number\" || typeof viewport.height !== \"number\") {\n throw new Error(\"auto-arrange action requires 'viewport' with width and height\");\n }\n\n const wm = this.getWmNode(session.id);\n if (!wm) return { success: true, data: { arranged: [] } };\n\n const surfaces = (wm.wmNode.children ?? [])\n .filter((c) => c.type === \"wm-surface\" && !(c.props as Record<string, unknown>)?.docked)\n .map((c) => {\n const cp = (c.props ?? {}) as Record<string, unknown>;\n return {\n name: (cp.surfaceName as string) || c.id.replace(/^wm-surface-/, \"\"),\n size: cp.size as { width: number; height: number } | undefined,\n };\n });\n\n const arranged = autoArrange(surfaces, viewport, {\n gap: typeof args.gap === \"number\" ? args.gap : undefined,\n padding: typeof args.padding === \"number\" ? args.padding : undefined,\n preserveAspect: typeof args.preserveAspect === \"boolean\" ? args.preserveAspect : undefined,\n });\n\n // Apply arranged positions/sizes as patches\n const ops: import(\"./aup-types.js\").AUPPatchOp[] = [];\n for (const a of arranged) {\n const surfNode = this.findWmSurface(wm.wmNode, a.name);\n if (surfNode) {\n ops.push({\n op: \"update\",\n id: surfNode.id,\n props: {\n position: { x: a.x, y: a.y },\n size: { width: a.width, height: a.height },\n },\n });\n }\n }\n if (ops.length > 0) {\n this.applyWmPatch(session.id, ctx, ops);\n }\n\n return { success: true, data: { arranged } };\n }\n\n // ── Session Explain ──\n\n @Explain(\"/:endpoint/sessions/:sid\")\n async explainSession(ctx: RouteContext): Promise<AFSExplainResult> {\n const session = this.resolveSession(ctx);\n return {\n format: \"markdown\",\n content: [\n `# Session ${session.id}`,\n \"\",\n `Endpoint: ${session.endpoint}`,\n `Messages: ${session.listMessages().length}`,\n `Pages: ${session.listPages().length}`,\n \"\",\n \"## Paths\",\n \"- `messages/` — Message stream (read/write)\",\n \"- `pages/:id` — Managed pages (CRUD)\",\n \"- `.actions/*` — Interactive actions\",\n ].join(\"\\n\"),\n };\n }\n\n // ─── Live Channel Routes (web endpoint only) ─────────────────\n\n /** Assert web endpoint and return channelId from params */\n private assertLiveChannel(ctx: RouteContext): string {\n const endpoint = ctx.params.endpoint as string;\n if (endpoint !== \"web\") throw new AFSNotFoundError(`/${endpoint}/live`);\n this.assertEndpoint(ctx);\n return ctx.params.channelId as string;\n }\n\n @List(\"/:endpoint/live\")\n async listLiveChannels(ctx: RouteContext): Promise<AFSListResult> {\n const endpoint = ctx.params.endpoint as string;\n if (endpoint !== \"web\") throw new AFSNotFoundError(`/${endpoint}/live`);\n this.assertEndpoint(ctx);\n const ids = this.getActiveChannelIds();\n return {\n data: ids.map((id) => ({\n id,\n path: joinURL(\"/\", endpoint, \"live\", id),\n meta: { kind: \"live-channel\", childrenCount: 1 },\n })),\n };\n }\n\n @Read(\"/:endpoint/live\")\n async readLiveDirectory(ctx: RouteContext): Promise<AFSEntry> {\n const endpoint = ctx.params.endpoint as string;\n if (endpoint !== \"web\") throw new AFSNotFoundError(`/${endpoint}/live`);\n this.assertEndpoint(ctx);\n const ids = this.getActiveChannelIds();\n return {\n id: \"live\",\n path: joinURL(\"/\", endpoint, \"live\"),\n content: `${ids.length} active live channel(s)`,\n meta: { kind: \"live-directory\", childrenCount: ids.length },\n };\n }\n\n @Meta(\"/:endpoint/live\")\n async metaLiveDirectory(ctx: RouteContext): Promise<AFSEntry> {\n const endpoint = ctx.params.endpoint as string;\n if (endpoint !== \"web\") throw new AFSNotFoundError(`/${endpoint}/live`);\n this.assertEndpoint(ctx);\n const ids = this.getActiveChannelIds();\n return {\n id: \"live\",\n path: joinURL(\"/\", endpoint, \"live\", \".meta\"),\n meta: { kind: \"live-directory\", childrenCount: ids.length },\n };\n }\n\n @Read(\"/:endpoint/live/:channelId\")\n async readLiveChannel(ctx: RouteContext): Promise<AFSEntry> {\n const channelId = this.assertLiveChannel(ctx);\n const endpoint = ctx.params.endpoint as string;\n const store = this.aupStores.get(this.channelAupKey(channelId));\n const hasTree = !!store?.getRoot();\n return {\n id: channelId,\n path: joinURL(\"/\", endpoint, \"live\", channelId),\n content: `Live channel: ${channelId}`,\n meta: { kind: \"live-channel\", hasTree, childrenCount: 1 },\n };\n }\n\n @Meta(\"/:endpoint/live/:channelId\")\n async metaLiveChannel(ctx: RouteContext): Promise<AFSEntry> {\n const channelId = this.assertLiveChannel(ctx);\n const endpoint = ctx.params.endpoint as string;\n return {\n id: channelId,\n path: joinURL(\"/\", endpoint, \"live\", channelId, \".meta\"),\n meta: { kind: \"live-channel\", childrenCount: 1 },\n };\n }\n\n @List(\"/:endpoint/live/:channelId\")\n async listLiveChannel(ctx: RouteContext): Promise<AFSListResult> {\n const channelId = this.assertLiveChannel(ctx);\n const endpoint = ctx.params.endpoint as string;\n return {\n data: [\n {\n id: \"tree\",\n path: joinURL(\"/\", endpoint, \"live\", channelId, \"tree\"),\n meta: { kind: \"aup:tree\", childrenCount: 0 },\n },\n ],\n };\n }\n\n @Read(\"/:endpoint/live/:channelId/tree\")\n async readLiveChannelTree(ctx: RouteContext): Promise<AFSEntry> {\n const channelId = this.assertLiveChannel(ctx);\n const endpoint = ctx.params.endpoint as string;\n const store = this.aupStores.get(this.channelAupKey(channelId));\n const root = store?.getRoot() ?? null;\n return {\n id: \"tree\",\n path: joinURL(\"/\", endpoint, \"live\", channelId, \"tree\"),\n content: root,\n meta: { kind: \"aup:tree\" },\n };\n }\n\n @Meta(\"/:endpoint/live/:channelId/tree\")\n async metaLiveChannelTree(ctx: RouteContext): Promise<AFSEntry> {\n const channelId = this.assertLiveChannel(ctx);\n const endpoint = ctx.params.endpoint as string;\n return {\n id: \"tree\",\n path: joinURL(\"/\", endpoint, \"live\", channelId, \"tree\", \".meta\"),\n meta: { kind: \"aup:tree\" },\n };\n }\n\n @Write(\"/:endpoint/live/:channelId/tree\")\n async writeLiveChannelTree(\n ctx: RouteContext,\n payload: { content?: unknown; meta?: Record<string, unknown> },\n ): Promise<AFSWriteResult> {\n const channelId = this.assertLiveChannel(ctx);\n const endpoint = ctx.params.endpoint as string;\n const root = payload.content;\n if (!root || typeof root !== \"object\")\n throw new Error(\"tree write requires a node object as content\");\n\n const err = validateNode(root);\n if (err) throw new Error(`Invalid AUP node: ${err}`);\n\n const store = this.getChannelAupStore(channelId);\n store.setRoot(root as import(\"./aup-types.js\").AUPNode);\n\n // Extract render options from meta\n const meta = payload.meta ?? {};\n const fullPage = meta.fullPage !== false; // default true for channels\n const chrome = meta.chrome === true;\n const theme = typeof meta.theme === \"string\" ? meta.theme : undefined;\n const style = typeof meta.style === \"string\" ? meta.style : undefined;\n const locale = typeof meta.locale === \"string\" ? meta.locale : undefined;\n\n // Broadcast to all channel viewers\n if (isAUPTransport(this.backend)) {\n const msg: Record<string, unknown> = { type: \"aup\", action: \"render\", root: store.getRoot() };\n if (fullPage) msg.fullPage = true;\n if (chrome) msg.chrome = true;\n if (theme) msg.theme = theme;\n if (style) msg.style = style;\n if (locale) msg.locale = locale;\n this.backend.sendToLiveChannel(channelId, msg);\n }\n\n // Emit event for subscribers\n const treePath = joinURL(\"/\", endpoint, \"live\", channelId, \"tree\");\n this.emit({ type: \"afs:write\", path: treePath, data: { root: store.getRoot() } });\n\n return {\n data: {\n id: \"tree\",\n path: treePath,\n content: store.getRoot(),\n meta: { kind: \"aup:tree\" },\n },\n };\n }\n\n @Actions(\"/:endpoint/live/:channelId\")\n async listLiveChannelActions(ctx: RouteContext): Promise<AFSListResult> {\n const channelId = this.assertLiveChannel(ctx);\n const endpoint = ctx.params.endpoint as string;\n const basePath = joinURL(\"/\", endpoint, \"live\", channelId, \".actions\");\n return {\n data: [\n {\n id: \"aup_render\",\n path: joinURL(basePath, \"aup_render\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Render AUP tree to all live channel viewers\",\n inputSchema: {\n type: \"object\",\n required: [\"root\"],\n properties: {\n root: { type: \"object\", description: \"AUP node tree\" },\n fullPage: { type: \"boolean\", default: true },\n chrome: { type: \"boolean\", description: \"Show lang/theme/mode toolbar\" },\n theme: { type: \"string\", enum: [\"dark\", \"light\", \"auto\"] },\n style: { type: \"string\" },\n locale: { type: \"string\" },\n },\n },\n },\n },\n {\n id: \"aup_patch\",\n path: joinURL(basePath, \"aup_patch\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Patch AUP tree for all live channel viewers\",\n inputSchema: {\n type: \"object\",\n required: [\"ops\"],\n properties: {\n ops: {\n type: \"array\",\n description: \"Patch operations to apply\",\n items: {\n type: \"object\",\n required: [\"op\", \"id\"],\n properties: {\n op: {\n type: \"string\",\n enum: [\"create\", \"update\", \"remove\", \"reorder\"],\n description: \"Operation type\",\n },\n id: {\n type: \"string\",\n description:\n \"Target node id (for update/remove/reorder) or new node id (for create)\",\n },\n props: {\n type: \"object\",\n description: \"Props to merge into node (for update)\",\n },\n parentId: { type: \"string\", description: \"Parent node id (for create)\" },\n node: {\n type: \"object\",\n description: \"Full AUP node { id, type, props, children } (for create)\",\n },\n index: { type: \"number\", description: \"Position index (for create/reorder)\" },\n },\n },\n },\n },\n },\n },\n },\n ],\n };\n }\n\n @Actions.Exec(\"/:endpoint/live/:channelId\", \"aup_render\")\n async execLiveChannelAupRender(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const channelId = this.assertLiveChannel(ctx);\n const endpoint = ctx.params.endpoint as string;\n const root = args.root as Record<string, unknown> | undefined;\n if (!root) throw new Error(\"aup_render action requires 'root' argument\");\n const fullPage = args.fullPage !== false; // default true for channels\n const chrome = args.chrome === true;\n const theme = typeof args.theme === \"string\" ? args.theme : undefined;\n const style = typeof args.style === \"string\" ? args.style : undefined;\n const locale = typeof args.locale === \"string\" ? args.locale : undefined;\n\n const err = validateNode(root);\n if (err) throw new Error(`Invalid AUP node: ${err}`);\n\n const store = this.getChannelAupStore(channelId);\n store.setRoot(root as unknown as import(\"./aup-types.js\").AUPNode);\n store.setRenderOptions({ fullPage, chrome, theme, style, locale });\n\n // Broadcast to all channel viewers\n if (isAUPTransport(this.backend)) {\n const msg: Record<string, unknown> = {\n type: \"aup\",\n action: \"render\",\n root: store.getRoot(),\n treeVersion: store.version,\n };\n if (fullPage) msg.fullPage = true;\n if (chrome) msg.chrome = true;\n if (theme) msg.theme = theme;\n if (style) msg.style = style;\n if (locale) msg.locale = locale;\n this.backend.sendToLiveChannel(channelId, msg);\n }\n\n // Emit AFS event for subscribers\n const treePath = joinURL(\"/\", endpoint, \"live\", channelId, \"tree\");\n this.emit({ type: \"afs:write\", path: treePath, data: { root: store.getRoot() } });\n\n return { success: true };\n }\n\n @Actions.Exec(\"/:endpoint/live/:channelId\", \"aup_patch\")\n async execLiveChannelAupPatch(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const channelId = this.assertLiveChannel(ctx);\n const endpoint = ctx.params.endpoint as string;\n const ops = args.ops as unknown[] | undefined;\n if (!ops || !Array.isArray(ops))\n throw new Error(\"aup_patch action requires 'ops' array argument\");\n\n const store = this.getChannelAupStore(channelId);\n store.applyPatch(ops as import(\"./aup-types.js\").AUPPatchOp[]);\n\n // Broadcast patch to all channel viewers\n if (isAUPTransport(this.backend)) {\n this.backend.sendToLiveChannel(channelId, {\n type: \"aup\",\n action: \"patch\",\n ops,\n treeVersion: store.version,\n });\n }\n\n // Emit AFS event for subscribers\n const treePath = joinURL(\"/\", endpoint, \"live\", channelId, \"tree\");\n this.emit({ type: \"afs:write\", path: treePath, data: { root: store.getRoot() } });\n\n return { success: true };\n }\n\n // ─── Per-Session Actions ────────────────────────────────────\n\n private sessionActionEntries(basePath: string): AFSEntry[] {\n return [\n {\n id: \"prompt\",\n path: joinURL(basePath, \"prompt\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Ask user a question\",\n inputSchema: {\n type: \"object\",\n required: [\"message\"],\n properties: {\n message: { type: \"string\" },\n type: {\n type: \"string\",\n enum: [\"text\", \"password\", \"confirm\", \"select\", \"multiselect\"],\n default: \"text\",\n },\n options: { type: \"array\", items: { type: \"string\" } },\n },\n },\n },\n },\n {\n id: \"clear\",\n path: joinURL(basePath, \"clear\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Clear screen\",\n inputSchema: { type: \"object\", properties: {} },\n },\n },\n {\n id: \"notify\",\n path: joinURL(basePath, \"notify\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Send notification\",\n inputSchema: {\n type: \"object\",\n required: [\"message\"],\n properties: { message: { type: \"string\" } },\n },\n },\n },\n {\n id: \"navigate\",\n path: joinURL(basePath, \"navigate\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Navigate to a managed page\",\n inputSchema: {\n type: \"object\",\n required: [\"page\"],\n properties: { page: { type: \"string\" } },\n },\n },\n },\n {\n id: \"dialog\",\n path: joinURL(basePath, \"dialog\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Show dialog with custom buttons\",\n inputSchema: {\n type: \"object\",\n required: [\"title\", \"content\", \"buttons\"],\n properties: {\n title: { type: \"string\" },\n content: { type: \"string\" },\n buttons: { type: \"array\", items: { type: \"string\" } },\n },\n },\n },\n },\n {\n id: \"progress\",\n path: joinURL(basePath, \"progress\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Display/update progress indicator\",\n inputSchema: {\n type: \"object\",\n required: [\"label\", \"value\", \"max\"],\n properties: {\n label: { type: \"string\" },\n value: { type: \"number\" },\n max: { type: \"number\" },\n },\n },\n },\n },\n {\n id: \"form\",\n path: joinURL(basePath, \"form\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Collect structured input via form\",\n inputSchema: {\n type: \"object\",\n required: [\"fields\"],\n properties: {\n title: { type: \"string\" },\n fields: { type: \"array\", items: { type: \"object\" } },\n },\n },\n },\n },\n {\n id: \"table\",\n path: joinURL(basePath, \"table\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Display tabular data\",\n inputSchema: {\n type: \"object\",\n required: [\"headers\", \"rows\"],\n properties: {\n headers: { type: \"array\", items: { type: \"string\" } },\n rows: { type: \"array\", items: { type: \"array\", items: { type: \"string\" } } },\n },\n },\n },\n },\n {\n id: \"toast\",\n path: joinURL(basePath, \"toast\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Show lightweight toast notification\",\n inputSchema: {\n type: \"object\",\n required: [\"message\"],\n properties: {\n message: { type: \"string\" },\n toastType: {\n type: \"string\",\n enum: [\"info\", \"success\", \"warning\", \"error\"],\n default: \"info\",\n },\n },\n },\n },\n },\n {\n id: \"aup_render\",\n path: joinURL(basePath, \"aup_render\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Render an AUP node graph (full replacement)\",\n inputSchema: {\n type: \"object\",\n required: [\"root\"],\n properties: {\n root: { type: \"object\", description: \"AUP node tree (id, type, props, children)\" },\n fullPage: {\n type: \"boolean\",\n description: \"When true, renders AUP as full-page (no chat chrome)\",\n },\n chrome: {\n type: \"boolean\",\n description: \"When true, shows lang/theme/mode toolbar. Hidden by default.\",\n },\n theme: {\n type: \"string\",\n enum: [\"dark\", \"light\", \"auto\"],\n description: \"Color mode (default: auto, follows system preference)\",\n },\n style: {\n type: \"string\",\n enum: [\"midnight\", \"clean\", \"glass\", \"brutalist\", \"soft\", \"cyber\"],\n description: \"Structural style (default: midnight)\",\n },\n locale: {\n type: \"string\",\n description: \"Display locale for UI chrome (e.g. 'en', 'zh', 'ja')\",\n },\n },\n },\n },\n },\n {\n id: \"aup_patch\",\n path: joinURL(basePath, \"aup_patch\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Apply incremental patches to the AUP graph\",\n inputSchema: {\n type: \"object\",\n required: [\"ops\"],\n properties: {\n ops: {\n type: \"array\",\n description: \"Patch operations to apply\",\n items: {\n type: \"object\",\n required: [\"op\", \"id\"],\n properties: {\n op: {\n type: \"string\",\n enum: [\"create\", \"update\", \"remove\", \"reorder\"],\n description: \"Operation type\",\n },\n id: {\n type: \"string\",\n description:\n \"Target node id (for update/remove/reorder) or new node id (for create)\",\n },\n props: { type: \"object\", description: \"Props to merge into node (for update)\" },\n parentId: { type: \"string\", description: \"Parent node id (for create)\" },\n node: {\n type: \"object\",\n description: \"Full AUP node { id, type, props, children } (for create)\",\n },\n index: { type: \"number\", description: \"Position index (for create/reorder)\" },\n },\n },\n },\n },\n },\n },\n },\n {\n id: \"aup_save\",\n path: joinURL(basePath, \"aup_save\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Save current AUP graph to a session page\",\n inputSchema: {\n type: \"object\",\n required: [\"pageId\"],\n properties: {\n pageId: { type: \"string\", description: \"Page ID to save the graph under\" },\n },\n },\n },\n },\n {\n id: \"aup_load\",\n path: joinURL(basePath, \"aup_load\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Load a previously saved AUP graph from a session page\",\n inputSchema: {\n type: \"object\",\n required: [\"pageId\"],\n properties: {\n pageId: { type: \"string\", description: \"Page ID to load the graph from\" },\n fullPage: {\n type: \"boolean\",\n description: \"When true, renders AUP as full-page (no chat chrome)\",\n },\n chrome: {\n type: \"boolean\",\n description: \"When true, shows lang/theme/mode toolbar. Hidden by default.\",\n },\n theme: {\n type: \"string\",\n enum: [\"dark\", \"light\", \"auto\"],\n description: \"Color mode (default: auto, follows system preference)\",\n },\n style: {\n type: \"string\",\n enum: [\"midnight\", \"clean\", \"glass\", \"brutalist\", \"soft\", \"cyber\"],\n description: \"Structural style (default: midnight)\",\n },\n locale: {\n type: \"string\",\n description: \"Display locale for UI chrome (e.g. 'en', 'zh', 'ja')\",\n },\n },\n },\n },\n },\n {\n id: \"aup_stage\",\n path: joinURL(basePath, \"aup_stage\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Stage an AUP scene (pre-render off-screen). Use aup_take to swap it live.\",\n inputSchema: {\n type: \"object\",\n required: [\"sceneId\", \"root\"],\n properties: {\n sceneId: { type: \"string\", description: \"Unique scene identifier\" },\n root: { type: \"object\", description: \"AUP node tree\" },\n fullPage: { type: \"boolean\" },\n chrome: { type: \"boolean\" },\n theme: { type: \"string\" },\n style: { type: \"string\" },\n locale: { type: \"string\" },\n },\n },\n },\n },\n {\n id: \"aup_take\",\n path: joinURL(basePath, \"aup_take\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Take a staged scene live (CSS swap, zero DOM teardown).\",\n inputSchema: {\n type: \"object\",\n required: [\"sceneId\"],\n properties: {\n sceneId: { type: \"string\", description: \"Scene to take live\" },\n transition: {\n type: \"string\",\n enum: [\"cut\", \"dissolve\"],\n description: \"Transition type (default: cut)\",\n },\n duration: { type: \"number\", description: \"Transition duration in ms\" },\n },\n },\n },\n },\n {\n id: \"aup_release\",\n path: joinURL(basePath, \"aup_release\"),\n meta: {\n kind: \"afs:executable\",\n description: \"Release a staged scene's resources. Cannot release the active scene.\",\n inputSchema: {\n type: \"object\",\n required: [\"sceneId\"],\n properties: {\n sceneId: { type: \"string\", description: \"Scene to release\" },\n },\n },\n },\n },\n ];\n }\n\n @Actions(\"/:endpoint/sessions/:sid\")\n async listSessionActions(ctx: RouteContext): Promise<AFSListResult> {\n const session = this.resolveSession(ctx);\n const endpoint = ctx.params.endpoint as string;\n const basePath = joinURL(\"/\", endpoint, \"sessions\", session.id, \".actions\");\n return { data: this.sessionActionEntries(basePath) };\n }\n\n // ── Interactive Session Actions (write message + await response) ──\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"prompt\")\n async execSessionPrompt(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const message = args.message as string;\n if (!message) throw new Error(\"prompt action requires 'message' argument\");\n const type = (args.type as string) ?? \"text\";\n const options = args.options as string[] | undefined;\n\n // Write prompt message\n const promptMsg = session.addMessage({\n type: \"prompt\",\n from: \"agent\",\n message,\n promptType: type,\n ...(options ? { options } : {}),\n });\n\n // Call backend\n const result = await this.backend.prompt({\n message,\n type: type as \"text\" | \"password\" | \"confirm\" | \"select\" | \"multiselect\",\n options,\n });\n\n // Write response message\n session.addMessage({\n type: \"prompt.response\",\n from: \"user\",\n ref: promptMsg.id,\n value: result,\n });\n\n return { success: true, data: { response: result } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"form\")\n async execSessionForm(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const fields = args.fields as Array<{ name: string; label: string; type: string }> | undefined;\n if (!fields || fields.length === 0)\n throw new Error(\"form action requires non-empty 'fields' argument\");\n const title = args.title as string | undefined;\n\n // Write form message\n const formMsg = session.addMessage({\n type: \"form\",\n from: \"agent\",\n ...(title ? { title } : {}),\n fields,\n });\n\n // Collect values via sequential prompts\n const values: Record<string, unknown> = {};\n for (const field of fields) {\n const promptType = field.type === \"password\" ? \"password\" : \"text\";\n const result = await this.backend.prompt({\n message: `${field.label}:`,\n type: promptType as \"text\" | \"password\",\n });\n values[field.name] = result;\n }\n\n // Write response message\n session.addMessage({\n type: \"form.response\",\n from: \"user\",\n ref: formMsg.id,\n data: values,\n });\n\n return { success: true, data: { values } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"dialog\")\n async execSessionDialog(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const title = args.title as string;\n if (!title) throw new Error(\"dialog action requires 'title' argument\");\n const content = (args.content as string) ?? \"\";\n const buttons = args.buttons as string[] | undefined;\n if (!buttons || buttons.length === 0)\n throw new Error(\"dialog action requires 'buttons' argument\");\n\n // Write dialog message\n const dialogMsg = session.addMessage({\n type: \"dialog\",\n from: \"agent\",\n title,\n content,\n buttons,\n });\n\n // Use prompt with select\n const result = await this.backend.prompt({\n message: `${title}\\n${content}`,\n type: \"select\",\n options: buttons,\n });\n\n // Write response message\n session.addMessage({\n type: \"dialog.response\",\n from: \"user\",\n ref: dialogMsg.id,\n selected: result,\n });\n\n return { success: true, data: { selection: result as string } };\n }\n\n // ── Non-Interactive Session Actions (fire-and-forget with message trail) ──\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"table\")\n async execSessionTable(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const headers = args.headers as string[] | undefined;\n if (!headers || headers.length === 0)\n throw new Error(\"table action requires 'headers' argument\");\n const rows = (args.rows as string[][]) ?? [];\n\n // Write table message\n session.addMessage({ type: \"table\", from: \"agent\", headers, rows });\n\n // Format and write to backend\n const colWidths = headers.map((h, i) => {\n let max = h.length;\n for (const row of rows) {\n if (row[i] && row[i].length > max) max = row[i].length;\n }\n return max;\n });\n const pad = (s: string, w: number) => s + \" \".repeat(Math.max(0, w - s.length));\n const headerLine = headers.map((h, i) => pad(h, colWidths[i]!)).join(\" | \");\n const separator = colWidths.map((w) => \"-\".repeat(w)).join(\"-+-\");\n const dataLines = rows.map((row) =>\n headers.map((_, i) => pad(row[i] ?? \"\", colWidths[i]!)).join(\" | \"),\n );\n await this.backend.write([headerLine, separator, ...dataLines].join(\"\\n\"));\n\n return { success: true };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"toast\")\n async execSessionToast(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const message = args.message as string;\n if (!message) throw new Error(\"toast action requires 'message' argument\");\n\n session.addMessage({ type: \"notification\", from: \"agent\", message });\n await this.backend.notify(message);\n return { success: true };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"progress\")\n async execSessionProgress(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const label = (args.label as string) ?? \"\";\n const value = args.value as number | undefined;\n if (value === undefined || value === null)\n throw new Error(\"progress action requires 'value' argument\");\n const max = (args.max as number) ?? 100;\n const pct = Math.round((value / max) * 100);\n\n session.addMessage({ type: \"progress\", from: \"agent\", label, value, max });\n await this.backend.notify(`[${pct}%] ${label}`);\n return { success: true, data: { value, max, percent: pct } };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"clear\")\n async execSessionClear(\n ctx: RouteContext,\n _args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n this.resolveSession(ctx); // validate session exists\n await this.backend.clear();\n return { success: true };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"navigate\")\n async execSessionNavigate(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const pageId = args.page as string;\n if (!pageId) throw new Error(\"navigate action requires 'page' argument\");\n\n // Look in session pages first, then legacy pages\n const page = session.getPage(pageId) ?? this.pages.get(pageId);\n if (!page) throw new Error(`Page not found: ${pageId}`);\n\n if (this.backend.navigate) {\n await this.backend.navigate(pageId, page.content, page.format, page.layout);\n } else {\n await this.backend.write(page.content);\n }\n return { success: true };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"notify\")\n async execSessionNotify(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const message = args.message as string;\n if (!message) throw new Error(\"notify action requires 'message' argument\");\n session.addMessage({ type: \"notification\", from: \"agent\", message });\n await this.backend.notify(message);\n return { success: true };\n }\n\n // ── AUP Session Actions ──\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"aup_render\")\n async execSessionAupRender(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const root = args.root as Record<string, unknown> | undefined;\n if (!root) throw new Error(\"aup_render action requires 'root' argument\");\n const fullPage = args.fullPage === true;\n const chrome = args.chrome === true;\n const theme = typeof args.theme === \"string\" ? args.theme : undefined;\n const style = typeof args.style === \"string\" ? args.style : undefined;\n const locale = typeof args.locale === \"string\" ? args.locale : undefined;\n\n const err = validateNode(root);\n if (err) throw new Error(`Invalid AUP node: ${err}`);\n\n const store = this.getAupStore(session.id);\n store.setRoot(root as unknown as import(\"./aup-types.js\").AUPNode);\n store.setRenderOptions({ fullPage, chrome, theme, style, locale });\n\n // Send to the session's connected client (degraded for device caps)\n if (isAUPTransport(this.backend)) {\n const degraded = this.degradeForSession(store.getRoot()!, session);\n const msg: Record<string, unknown> = {\n type: \"aup\",\n action: \"render\",\n root: degraded,\n treeVersion: store.version,\n };\n if (fullPage) msg.fullPage = true;\n if (chrome) msg.chrome = true;\n if (theme) msg.theme = theme;\n if (style) msg.style = style;\n if (locale) msg.locale = locale;\n this.backend.sendToSession(session.id, msg);\n }\n\n // Emit AFS event for subscribers\n const endpoint = ctx.params.endpoint as string;\n const treePath = joinURL(\"/\", endpoint, \"sessions\", session.id, \"tree\");\n this.emit({ type: \"afs:write\", path: treePath, data: { root: store.getRoot() } });\n\n return { success: true };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"aup_patch\")\n async execSessionAupPatch(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const ops = args.ops as unknown[] | undefined;\n if (!ops || !Array.isArray(ops))\n throw new Error(\"aup_patch action requires 'ops' array argument\");\n\n const store = this.getAupStore(session.id);\n store.applyPatch(ops as import(\"./aup-types.js\").AUPPatchOp[]);\n\n // Send patch to the session's connected client\n if (isAUPTransport(this.backend)) {\n this.backend.sendToSession(session.id, {\n type: \"aup\",\n action: \"patch\",\n ops,\n treeVersion: store.version,\n });\n }\n\n // Emit AFS event for subscribers\n const endpoint = ctx.params.endpoint as string;\n const treePath = joinURL(\"/\", endpoint, \"sessions\", session.id, \"tree\");\n this.emit({ type: \"afs:write\", path: treePath, data: { root: store.getRoot() } });\n\n return { success: true };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"aup_save\")\n async execSessionAupSave(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const pageId = args.pageId as string | undefined;\n if (!pageId) throw new Error(\"aup_save action requires 'pageId' argument\");\n\n const store = this.aupStores.get(session.id);\n const root = store?.getRoot();\n if (!root) throw new Error(\"No active AUP graph to save\");\n\n // Save the graph as JSON in the session's pages\n const graphJson = JSON.stringify(root);\n session.setPage(pageId, { content: graphJson, format: \"application/json\" });\n\n return { success: true };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"aup_load\")\n async execSessionAupLoad(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const pageId = args.pageId as string | undefined;\n if (!pageId) throw new Error(\"aup_load action requires 'pageId' argument\");\n const fullPage = args.fullPage === true;\n const chrome = args.chrome === true;\n const theme = typeof args.theme === \"string\" ? args.theme : undefined;\n const style = typeof args.style === \"string\" ? args.style : undefined;\n const locale = typeof args.locale === \"string\" ? args.locale : undefined;\n\n const page = session.getPage(pageId);\n if (!page) throw new Error(`AUP page not found: ${pageId}`);\n\n // Parse the stored graph\n const root = JSON.parse(page.content) as import(\"./aup-types.js\").AUPNode;\n\n // Validate it\n const err = validateNode(root);\n if (err) throw new Error(`Invalid stored AUP graph: ${err}`);\n\n // Store it and send to the session's connected client (degraded for device caps)\n const store = this.getAupStore(session.id);\n store.setRoot(root);\n\n if (isAUPTransport(this.backend)) {\n const degraded = this.degradeForSession(store.getRoot()!, session);\n const msg: Record<string, unknown> = { type: \"aup\", action: \"render\", root: degraded };\n if (fullPage) msg.fullPage = true;\n if (chrome) msg.chrome = true;\n if (theme) msg.theme = theme;\n if (style) msg.style = style;\n if (locale) msg.locale = locale;\n this.backend.sendToSession(session.id, msg);\n }\n\n return { success: true };\n }\n\n // ── AUP Stage-to-Live Session Actions ──\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"aup_stage\")\n async execSessionAupStage(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const sceneId = args.sceneId as string | undefined;\n if (!sceneId) throw new Error(\"aup_stage action requires 'sceneId' argument\");\n const root = args.root as Record<string, unknown> | undefined;\n if (!root) throw new Error(\"aup_stage action requires 'root' argument\");\n const fullPage = args.fullPage === true;\n const chrome = args.chrome === true;\n const theme = typeof args.theme === \"string\" ? args.theme : undefined;\n const style = typeof args.style === \"string\" ? args.style : undefined;\n const locale = typeof args.locale === \"string\" ? args.locale : undefined;\n\n const err = validateNode(root);\n if (err) throw new Error(`Invalid AUP node: ${err}`);\n\n const mgr = this.getAupManager(session.id);\n const store = mgr.stage(sceneId, root as unknown as import(\"./aup-types.js\").AUPNode, {\n fullPage,\n chrome,\n theme,\n style,\n locale,\n });\n\n // Send stage message to the session's connected client (degraded for device caps)\n if (isAUPTransport(this.backend)) {\n const degraded = this.degradeForSession(store.getRoot()!, session);\n const msg: Record<string, unknown> = {\n type: \"aup\",\n action: \"stage\",\n sceneId,\n root: degraded,\n treeVersion: store.version,\n };\n if (fullPage) msg.fullPage = true;\n if (chrome) msg.chrome = true;\n if (theme) msg.theme = theme;\n if (style) msg.style = style;\n if (locale) msg.locale = locale;\n this.backend.sendToSession(session.id, msg);\n }\n\n return { success: true };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"aup_take\")\n async execSessionAupTake(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const sceneId = args.sceneId as string | undefined;\n if (!sceneId) throw new Error(\"aup_take action requires 'sceneId' argument\");\n const transition = typeof args.transition === \"string\" ? args.transition : undefined;\n const duration = typeof args.duration === \"number\" ? args.duration : undefined;\n\n const mgr = this.getAupManager(session.id);\n mgr.take(sceneId); // throws if not staged\n\n // Send take message to the session's connected client\n if (isAUPTransport(this.backend)) {\n const msg: Record<string, unknown> = {\n type: \"aup\",\n action: \"take\",\n sceneId,\n };\n if (transition) msg.transition = transition;\n if (duration) msg.duration = duration;\n this.backend.sendToSession(session.id, msg);\n }\n\n return { success: true };\n }\n\n @Actions.Exec(\"/:endpoint/sessions/:sid\", \"aup_release\")\n async execSessionAupRelease(\n ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const session = this.resolveSession(ctx);\n const sceneId = args.sceneId as string | undefined;\n if (!sceneId) throw new Error(\"aup_release action requires 'sceneId' argument\");\n\n const mgr = this.getAupManager(session.id);\n mgr.release(sceneId); // throws if active scene\n\n // Send release message to the session's connected client\n if (isAUPTransport(this.backend)) {\n this.backend.sendToSession(session.id, {\n type: \"aup\",\n action: \"release\",\n sceneId,\n });\n }\n\n return { success: true };\n }\n\n // ─── Root Actions (backward compat — delegate to default session) ──\n\n @Actions(\"/\")\n async listActions(_ctx: RouteContext): Promise<AFSListResult> {\n return {\n data: [\n {\n id: \"prompt\",\n path: \"/.actions/prompt\",\n meta: {\n kind: \"afs:executable\",\n description: \"Ask user a question\",\n inputSchema: {\n type: \"object\",\n required: [\"message\"],\n properties: {\n message: { type: \"string\", description: \"The question to ask\" },\n type: {\n type: \"string\",\n enum: [\"text\", \"password\", \"confirm\", \"select\", \"multiselect\"],\n default: \"text\",\n description: \"Input type\",\n },\n options: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Options for select/multiselect\",\n },\n },\n },\n },\n },\n {\n id: \"clear\",\n path: \"/.actions/clear\",\n meta: {\n kind: \"afs:executable\",\n description: \"Clear screen\",\n inputSchema: { type: \"object\", properties: {} },\n },\n },\n {\n id: \"notify\",\n path: \"/.actions/notify\",\n meta: {\n kind: \"afs:executable\",\n description: \"Send notification\",\n inputSchema: {\n type: \"object\",\n required: [\"message\"],\n properties: {\n message: { type: \"string\", description: \"Notification message\" },\n },\n },\n },\n },\n {\n id: \"navigate\",\n path: \"/.actions/navigate\",\n meta: {\n kind: \"afs:executable\",\n description: \"Navigate to a managed page\",\n inputSchema: {\n type: \"object\",\n required: [\"page\"],\n properties: {\n page: { type: \"string\", description: \"Page ID to navigate to\" },\n },\n },\n },\n },\n {\n id: \"dialog\",\n path: \"/.actions/dialog\",\n meta: {\n kind: \"afs:executable\",\n description: \"Show dialog with custom buttons\",\n inputSchema: {\n type: \"object\",\n required: [\"title\", \"content\", \"buttons\"],\n properties: {\n title: { type: \"string\", description: \"Dialog title\" },\n content: { type: \"string\", description: \"Dialog content\" },\n buttons: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Button labels\",\n },\n },\n },\n },\n },\n {\n id: \"progress\",\n path: \"/.actions/progress\",\n meta: {\n kind: \"afs:executable\",\n description: \"Display/update progress indicator\",\n inputSchema: {\n type: \"object\",\n required: [\"label\", \"value\", \"max\"],\n properties: {\n label: { type: \"string\", description: \"Progress label\" },\n value: { type: \"number\", description: \"Current value\" },\n max: { type: \"number\", description: \"Maximum value\" },\n },\n },\n },\n },\n {\n id: \"form\",\n path: \"/.actions/form\",\n meta: {\n kind: \"afs:executable\",\n description: \"Collect structured input via form\",\n inputSchema: {\n type: \"object\",\n required: [\"fields\"],\n properties: {\n title: { type: \"string\", description: \"Form title\" },\n fields: {\n type: \"array\",\n items: {\n type: \"object\",\n required: [\"name\", \"label\", \"type\"],\n properties: {\n name: { type: \"string\" },\n label: { type: \"string\" },\n type: {\n type: \"string\",\n enum: [\"text\", \"number\", \"password\", \"select\", \"checkbox\", \"textarea\"],\n },\n options: { type: \"array\", items: { type: \"string\" } },\n required: { type: \"boolean\" },\n },\n },\n description: \"Form field definitions\",\n },\n },\n },\n },\n },\n {\n id: \"table\",\n path: \"/.actions/table\",\n meta: {\n kind: \"afs:executable\",\n description: \"Display tabular data\",\n inputSchema: {\n type: \"object\",\n required: [\"headers\", \"rows\"],\n properties: {\n headers: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Column headers\",\n },\n rows: {\n type: \"array\",\n items: { type: \"array\", items: { type: \"string\" } },\n description: \"Table rows\",\n },\n },\n },\n },\n },\n {\n id: \"toast\",\n path: \"/.actions/toast\",\n meta: {\n kind: \"afs:executable\",\n description: \"Show lightweight toast notification\",\n inputSchema: {\n type: \"object\",\n required: [\"message\"],\n properties: {\n message: { type: \"string\", description: \"Toast message\" },\n toastType: {\n type: \"string\",\n enum: [\"info\", \"success\", \"warning\", \"error\"],\n default: \"info\",\n description: \"Toast type\",\n },\n },\n },\n },\n },\n ],\n };\n }\n\n // ─── Action Implementations ─────────────────────────────────\n\n @Actions.Exec(\"/\", \"prompt\")\n async execPrompt(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const message = args.message as string;\n if (!message) {\n throw new Error(\"prompt action requires 'message' argument\");\n }\n const type = (args.type as string) ?? \"text\";\n const validTypes = [\"text\", \"password\", \"confirm\", \"select\", \"multiselect\"];\n if (!validTypes.includes(type)) {\n throw new Error(`Invalid prompt type: ${type}. Must be one of: ${validTypes.join(\", \")}`);\n }\n const options = args.options as string[] | undefined;\n const result = await this.backend.prompt({\n message,\n type: type as \"text\" | \"password\" | \"confirm\" | \"select\" | \"multiselect\",\n options,\n });\n return { success: true, data: { response: result } };\n }\n\n @Actions.Exec(\"/\", \"clear\")\n async execClear(_ctx: RouteContext, _args: Record<string, unknown>): Promise<AFSExecResult> {\n await this.backend.clear();\n return { success: true };\n }\n\n @Actions.Exec(\"/\", \"notify\")\n async execNotify(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const message = args.message as string;\n if (!message) {\n throw new Error(\"notify action requires 'message' argument\");\n }\n await this.backend.notify(message);\n return { success: true };\n }\n\n @Actions.Exec(\"/\", \"navigate\")\n async execNavigate(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const pageId = args.page as string;\n if (!pageId) {\n throw new Error(\"navigate action requires 'page' argument\");\n }\n const page = this.pages.get(pageId);\n if (!page) {\n throw new Error(`Page not found: ${pageId}`);\n }\n\n if (this.backend.navigate) {\n await this.backend.navigate(pageId, page.content, page.format, page.layout);\n } else {\n // Fallback: write page content to output\n await this.backend.write(page.content);\n }\n return { success: true };\n }\n\n @Actions.Exec(\"/\", \"dialog\")\n async execDialog(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const title = args.title as string;\n if (!title) throw new Error(\"dialog action requires 'title' argument\");\n const content = (args.content as string) ?? \"\";\n const buttons = args.buttons as string[] | undefined;\n if (!buttons || buttons.length === 0) {\n throw new Error(\"dialog action requires 'buttons' argument\");\n }\n\n // Use prompt with select to implement dialog\n const result = await this.backend.prompt({\n message: `${title}\\n${content}`,\n type: \"select\",\n options: buttons,\n });\n return { success: true, data: { selection: result as string } };\n }\n\n @Actions.Exec(\"/\", \"progress\")\n async execProgress(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const label = (args.label as string) ?? \"\";\n const value = args.value as number | undefined;\n if (value === undefined || value === null) {\n throw new Error(\"progress action requires 'value' argument\");\n }\n const max = (args.max as number) ?? 100;\n const pct = Math.round((value / max) * 100);\n\n await this.backend.notify(`[${pct}%] ${label}`);\n return { success: true, data: { value, max, percent: pct } };\n }\n\n @Actions.Exec(\"/\", \"form\")\n async execForm(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const fields = args.fields as Array<{ name: string; label: string; type: string }> | undefined;\n if (!fields || fields.length === 0) {\n throw new Error(\"form action requires non-empty 'fields' argument\");\n }\n\n // Collect values via sequential prompts\n const values: Record<string, unknown> = {};\n for (const field of fields) {\n const promptType = field.type === \"password\" ? \"password\" : \"text\";\n const result = await this.backend.prompt({\n message: `${field.label}:`,\n type: promptType as \"text\" | \"password\",\n });\n values[field.name] = result;\n }\n\n return { success: true, data: { values } };\n }\n\n @Actions.Exec(\"/\", \"table\")\n async execTable(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const headers = args.headers as string[] | undefined;\n if (!headers || headers.length === 0) {\n throw new Error(\"table action requires 'headers' argument\");\n }\n const rows = (args.rows as string[][]) ?? [];\n\n // Format as text table\n const colWidths = headers.map((h, i) => {\n let max = h.length;\n for (const row of rows) {\n if (row[i] && row[i].length > max) max = row[i].length;\n }\n return max;\n });\n\n const pad = (s: string, w: number) => s + \" \".repeat(Math.max(0, w - s.length));\n const headerLine = headers.map((h, i) => pad(h, colWidths[i]!)).join(\" | \");\n const separator = colWidths.map((w) => \"-\".repeat(w)).join(\"-+-\");\n const dataLines = rows.map((row) =>\n headers.map((_, i) => pad(row[i] ?? \"\", colWidths[i]!)).join(\" | \"),\n );\n\n const tableText = [headerLine, separator, ...dataLines].join(\"\\n\");\n await this.backend.write(tableText);\n\n return { success: true };\n }\n\n @Actions.Exec(\"/\", \"toast\")\n async execToast(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n const message = args.message as string;\n if (!message) throw new Error(\"toast action requires 'message' argument\");\n\n await this.backend.notify(message);\n return { success: true };\n }\n}\n"],"mappings":"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"}
|