import type { McpTool } from "./index.ts"; const string = { type: "string" }; const fields: Record> = { package: { notes: string }, upgrade_plan: { source: string }, upgrade: { source: string }, inspect: {}, capabilities: {}, context: { components: { type: "array", items: string, maxItems: 12 } }, create: { source: string }, propose: { source: string, patches: { type: "array", maxItems: 48, items: { type: "object", properties: { path: string, value: {} }, required: ["path", "value"], additionalProperties: false, }, }, }, locks: { locks: { type: "array", items: string, maxItems: 128 } }, page: { page: { type: "object", properties: { id: string, title: string, components: { type: "array", minItems: 1, maxItems: 12, items: { type: "object", properties: { component: string, props: { type: "object" } }, required: ["component"], additionalProperties: false, }, }, }, required: ["id", "title", "components"], additionalProperties: false, }, }, validate: {}, preview: { pageId: string }, diff: {}, apply: { baseApplicationRevision: string }, revert: { target: { type: "string", enum: ["draft", "checkpoint", "application"] }, baseApplicationRevision: string, }, export: {}, conformance: { source: string, exceptions: { type: "array", maxItems: 64, items: { type: "object", properties: { code: string, path: string, reason: string }, required: ["code", "path", "reason"], additionalProperties: false, }, }, }, }; const descriptions: Record = { package: "Export a verified self-contained design package with a content digest. No filesystem or draft mutation.", upgrade_plan: "Review a shared package upgrade, including integrity, identity, locks and migration diagnostics, without changing the draft.", upgrade: "Adopt a verified shared design package as a recoverable history entry; draft revision and decision locks are rechecked.", inspect: "Inspect recoverable source, valid preview, locks, pages and revisions.", capabilities: "List contracted components, operations and explicit integration limits.", context: "Get resolved tokens, selected component APIs, parts, constraints and generation rules.", create: "Create a recoverable design draft from optional canonical source; invalid source remains recoverable.", propose: "Propose canonical source or token/recipe JSON-pointer patches respecting decision locks.", locks: "Set explicit decision locks for future edits.", page: "Save a bounded literal page specification composed of contracted components; returns generated .wrn source.", validate: "Validate draft and saved page specifications.", preview: "Render a saved page through trusted shipped components. Returns CSP-protected static HTML.", diff: "Review design changes against the applied baseline and affected page ids.", apply: "Save an application design bundle after checking draft and application revisions. Explicit app integration still required.", revert: "Undo a draft edit, swap the previous draft checkpoint, or revert the application bundle pointer.", export: "Export raw draft recovery data, valid design artifacts and generated page sources without writing routes.", conformance: "Statically check .wrn source for unknown APIs, invented variants and token bypasses. Warnings need exact reviewed exceptions.", }; export const DESIGN_WRITES = new Set([ "create", "propose", "locks", "page", "apply", "revert", "upgrade", ]); export function designTools(writable: boolean): McpTool[] { return Object.entries(fields) .filter(([name]) => writable || !DESIGN_WRITES.has(name)) .map(([name, properties]) => ({ name: "wrnexus_design_" + name, description: descriptions[name]!, inputSchema: { type: "object", properties: { ...properties, ...(["context", "preview", "export", "apply"].includes(name) ? { mode: string, density: string } : {}), ...(DESIGN_WRITES.has(name) ? { baseRevision: string } : {}), }, required: [ ...(DESIGN_WRITES.has(name) ? ["baseRevision"] : []), ...({ upgrade_plan: ["source"], upgrade: ["source"], page: ["page"], preview: ["pageId"], locks: ["locks"], apply: ["baseApplicationRevision"], conformance: ["source"], }[name] ?? []), ], additionalProperties: false, }, })); }