@fabricorg/sdk-mcp 0.1.15 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-c4qJ8sp9.js","names":[],"sources":["../src/ui-kit/a2ui-core.generated.js","../src/ui-kit/kit.generated.js","../src/ui-kit/index.ts","../src/mcp-apps.ts","../src/index.ts"],"sourcesContent":["/*\n * GENERATED by bin/build-ui-kit.mjs from worker/mcp/ui-kit/src/a2ui-core.js: do not edit. The same core the kit's\n * script renders with, for the server: visualize validates a document and writes its text with it.\n *\n * heddle: pending #217\n */\n/* ---- A2UI catalogs: GENERATED by bin/build-ui-kit.mjs from worker/mcp/ui-kit/a2ui/*.json; do not edit ----\n * The A2UI v0.9.1 basic catalog (a2ui-project/a2ui, Apache-2.0) and Fabric's published catalog\n * (https://agents.fabric.pro/a2ui/v0.9/fabric_catalog.json), as each component's properties (in the core's kinds), its required properties, and\n * the functions each catalog adds. src/a2ui-core.js reads them as A2UI_CATALOGS.\n */\nvar A2UI_CATALOGS = {\"basic\":{\"catalogId\":\"https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json\",\"components\":{\"Text\":{\"props\":{\"text\":\"string\",\"variant\":{\"enum\":[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"caption\",\"body\"]}},\"required\":[\"text\"]},\"Image\":{\"props\":{\"url\":\"string\",\"description\":\"string\",\"fit\":{\"enum\":[\"contain\",\"cover\",\"fill\",\"none\",\"scaleDown\"]},\"variant\":{\"enum\":[\"icon\",\"avatar\",\"smallFeature\",\"mediumFeature\",\"largeFeature\",\"header\"]}},\"required\":[\"url\"]},\"Icon\":{\"props\":{\"name\":\"value\"},\"required\":[\"name\"]},\"Video\":{\"props\":{\"url\":\"string\"},\"required\":[\"url\"]},\"AudioPlayer\":{\"props\":{\"url\":\"string\",\"description\":\"string\"},\"required\":[\"url\"]},\"Row\":{\"props\":{\"children\":\"children\",\"justify\":{\"enum\":[\"center\",\"end\",\"spaceAround\",\"spaceBetween\",\"spaceEvenly\",\"start\",\"stretch\"]},\"align\":{\"enum\":[\"start\",\"center\",\"end\",\"stretch\"]}},\"required\":[\"children\"]},\"Column\":{\"props\":{\"children\":\"children\",\"justify\":{\"enum\":[\"start\",\"center\",\"end\",\"spaceBetween\",\"spaceAround\",\"spaceEvenly\",\"stretch\"]},\"align\":{\"enum\":[\"center\",\"end\",\"start\",\"stretch\"]}},\"required\":[\"children\"]},\"List\":{\"props\":{\"children\":\"children\",\"direction\":{\"enum\":[\"vertical\",\"horizontal\"]},\"align\":{\"enum\":[\"start\",\"center\",\"end\",\"stretch\"]}},\"required\":[\"children\"]},\"Card\":{\"props\":{\"child\":\"id\"},\"required\":[\"child\"]},\"Tabs\":{\"props\":{\"tabs\":\"json\"},\"required\":[\"tabs\"]},\"Modal\":{\"props\":{\"trigger\":\"id\",\"content\":\"id\"},\"required\":[\"trigger\",\"content\"]},\"Divider\":{\"props\":{\"axis\":{\"enum\":[\"horizontal\",\"vertical\"]}},\"required\":[]},\"Button\":{\"props\":{\"checks\":\"checks\",\"child\":\"id\",\"variant\":{\"enum\":[\"default\",\"primary\",\"borderless\"]},\"action\":\"action\"},\"required\":[\"child\",\"action\"]},\"TextField\":{\"props\":{\"checks\":\"checks\",\"label\":\"string\",\"value\":\"string\",\"variant\":{\"enum\":[\"longText\",\"number\",\"shortText\",\"obscured\"]},\"validationRegexp\":\"literalString\"},\"required\":[\"label\"]},\"CheckBox\":{\"props\":{\"checks\":\"checks\",\"label\":\"string\",\"value\":\"boolean\"},\"required\":[\"label\",\"value\"]},\"ChoicePicker\":{\"props\":{\"checks\":\"checks\",\"label\":\"string\",\"variant\":{\"enum\":[\"multipleSelection\",\"mutuallyExclusive\"]},\"options\":\"json\",\"value\":\"stringList\",\"displayStyle\":{\"enum\":[\"checkbox\",\"chips\"]},\"filterable\":\"literalBoolean\"},\"required\":[\"options\",\"value\"]},\"Slider\":{\"props\":{\"checks\":\"checks\",\"label\":\"string\",\"min\":\"literalNumber\",\"max\":\"literalNumber\",\"value\":\"number\"},\"required\":[\"value\",\"max\"]},\"DateTimeInput\":{\"props\":{\"checks\":\"checks\",\"value\":\"string\",\"enableDate\":\"literalBoolean\",\"enableTime\":\"literalBoolean\",\"min\":\"string\",\"max\":\"string\",\"label\":\"string\"},\"required\":[\"value\"]}},\"functions\":[\"required\",\"regex\",\"length\",\"numeric\",\"email\",\"formatString\",\"formatNumber\",\"formatCurrency\",\"formatDate\",\"pluralize\",\"openUrl\",\"and\",\"or\",\"not\"]},\"fabric\":{\"catalogId\":\"https://agents.fabric.pro/a2ui/v0.9/fabric_catalog.json\",\"components\":{\"Chart\":{\"props\":{\"kind\":{\"enum\":[\"bar\",\"line\",\"area\",\"pie\"]},\"title\":\"string\",\"labels\":\"stringList\",\"series\":\"json\",\"x\":\"json\",\"format\":\"literalString\",\"xLabel\":\"string\",\"yLabel\":\"string\"},\"required\":[\"series\"]},\"Stat\":{\"props\":{\"label\":\"string\",\"value\":\"value\",\"format\":\"literalString\",\"hint\":\"string\"},\"required\":[\"label\",\"value\"]},\"Callout\":{\"props\":{\"tone\":{\"enum\":[\"info\",\"tip\",\"warning\",\"success\"]},\"title\":\"string\",\"text\":\"string\"},\"required\":[\"text\"]},\"Steps\":{\"props\":{\"steps\":\"json\",\"value\":\"number\"},\"required\":[\"steps\"]},\"Quiz\":{\"props\":{\"questions\":\"json\",\"results\":\"binding\"},\"required\":[\"questions\"]},\"Flashcards\":{\"props\":{\"cards\":\"json\"},\"required\":[\"cards\"]},\"Timeline\":{\"props\":{\"events\":\"json\"},\"required\":[\"events\"]},\"Compare\":{\"props\":{\"items\":\"json\"},\"required\":[\"items\"]},\"Diagram\":{\"props\":{\"mermaid\":\"string\",\"caption\":\"string\"},\"required\":[\"mermaid\"]},\"Code\":{\"props\":{\"code\":\"string\",\"language\":\"literalString\",\"title\":\"string\"},\"required\":[\"code\"]},\"Table\":{\"props\":{\"columns\":\"json\",\"rows\":\"value\"},\"required\":[\"columns\",\"rows\"]}},\"functions\":[\"calc\",\"formatValue\"]}};\n/* ---- A2UI v0.9.1 core: messages to surfaces, the catalog check, bindings, functions and formulas ----\n * One source for both sides: the kit's script (the view renders with it) and the server (bin/build-ui-kit.mjs also\n * writes it as an ES module, a2ui-core.generated.js, which `visualize` validates with and renders to text with).\n * Ported from Fabric's renderer (fabric-agents packages/ui/src/components/a2ui: protocol.ts, catalog.ts,\n * expression.ts, functions.ts, template.ts, format.ts, regex-guard.ts; Fabric 0.15.14) so a document behaves the same\n * here as in Fabric. Formulas are parsed, never evaluated as code. The catalogs are Fabric's published schema\n * (https://agents.fabric.pro/a2ui/v0.9/fabric_catalog.json) and the A2UI basic catalog, vendored in\n * worker/mcp/ui-kit/a2ui/ and read through src/a2ui-catalog.js, which the build generates from them.\n */\nvar A2UI = (function () {\n \"use strict\";\n var hasOwn = function (o, k) { return Object.prototype.hasOwnProperty.call(o, k); };\n var isObj = function (v) { return !!v && typeof v === \"object\" && !Array.isArray(v); };\n var A2UI_VERSION = \"v0.9.1\", VERSIONS = [\"v0.9\", \"v0.9.1\"];\n var BASIC_CATALOG_ID = \"https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json\";\n var BASIC_ALIASES = [\"https://a2ui.org/specification/v0_9_1/catalogs/basic/catalog.json\"];\n var FABRIC_CATALOG_ID = \"https://agents.fabric.pro/a2ui/v0.9/fabric_catalog.json\";\n\n /* ---- the catalogs: generated from the vendored schemas (src/a2ui-catalog.js, from worker/mcp/ui-kit/a2ui/) ---- */\n var CATALOG = { basic: A2UI_CATALOGS.basic.components, fabric: A2UI_CATALOGS.fabric.components };\n var BASIC_FUNCTIONS = A2UI_CATALOGS.basic.functions;\n var FABRIC_FUNCTIONS = A2UI_CATALOGS.fabric.functions;\n /** Extensions this renderer accepts beyond the published schema: none (Compare's pick is standard since Fabric d038bc4ba). */\n var EXTENSIONS = {};\n var mk = function (ids, fabric) { var comps = {}; var k; for (k in CATALOG.basic) comps[k] = CATALOG.basic[k]; if (fabric) for (k in CATALOG.fabric) comps[k] = CATALOG.fabric[k]; var fns = {}; BASIC_FUNCTIONS.concat(fabric ? FABRIC_FUNCTIONS : []).forEach(function (f) { fns[f] = true; }); return { catalogId: ids, components: comps, functions: fns, fabric: fabric }; };\n var BASIC_INFO = mk(BASIC_CATALOG_ID, false), FABRIC_INFO = mk(FABRIC_CATALOG_ID, true);\n function catalogFor(id) { if (id === BASIC_CATALOG_ID || BASIC_ALIASES.indexOf(id) >= 0) return BASIC_INFO; if (id === FABRIC_CATALOG_ID) return FABRIC_INFO; return null; }\n\n var isBinding = function (v) { return isObj(v) && typeof v.path === \"string\" && Object.keys(v).length === 1; };\n var isCall = function (v) { return isObj(v) && typeof v.call === \"string\" && Object.keys(v).every(function (k) { return k === \"call\" || k === \"args\" || k === \"returnType\"; }) && (v.args === undefined || isObj(v.args)); };\n function kindOk(kind, v) {\n if (typeof kind === \"object\") return typeof v === \"string\" && kind[\"enum\"].indexOf(v) >= 0;\n switch (kind) {\n case \"string\": return typeof v === \"string\" || isBinding(v) || isCall(v);\n case \"number\": return typeof v === \"number\" || isBinding(v) || isCall(v);\n case \"boolean\": return typeof v === \"boolean\" || isBinding(v) || isCall(v);\n case \"stringList\": return (Array.isArray(v) && v.every(function (s) { return typeof s === \"string\"; })) || isBinding(v) || isCall(v);\n case \"value\": return v !== null && v !== undefined;\n case \"id\": return typeof v === \"string\";\n case \"children\": return (Array.isArray(v) && v.every(function (s) { return typeof s === \"string\"; })) || (isObj(v) && typeof v.path === \"string\" && typeof v.componentId === \"string\");\n case \"action\": return isObj(v) && (isObj(v.event) ? typeof v.event.name === \"string\" && (v.event.context === undefined || isObj(v.event.context)) : isObj(v.functionCall) && isCall(v.functionCall));\n case \"checks\": return Array.isArray(v) && v.every(function (c) { return isObj(c) && typeof c.message === \"string\" && (\"condition\" in c ? typeof c.condition === \"boolean\" || isBinding(c.condition) || isCall(c.condition) : typeof c.call === \"string\" && (c.args === undefined || isObj(c.args))); });\n case \"binding\": return isBinding(v);\n case \"literalString\": return typeof v === \"string\";\n case \"literalNumber\": return typeof v === \"number\";\n case \"literalBoolean\": return typeof v === \"boolean\";\n case \"json\": return true;\n }\n return false;\n }\n var dynString = function (v) { return typeof v === \"string\" || isBinding(v) || isCall(v); };\n var listOf = function (v, item, min, max) { min = min == null ? 1 : min; max = max == null ? 500 : max; return Array.isArray(v) && v.length >= min && v.length <= max && v.every(function (x) { return isObj(x) && item(x); }); };\n var optional = function (v, ok) { return v === undefined || ok(v); };\n var validAnswer = function (v, n) { return (typeof v === \"number\" && v === Math.floor(v) && v >= 0 && v < n) || isBinding(v) || isCall(v); };\n var STRUCTURES = {\n Tabs: { tabs: [function (v) { return listOf(v, function (t) { return dynString(t.title) && typeof t.child === \"string\"; }, 1, 12); }, \"a list of { title, child }\"] },\n ChoicePicker: { options: [function (v) { return listOf(v, function (o) { return dynString(o.label) && typeof o.value === \"string\"; }, 1, 100); }, \"a list of { label, value } (value a string)\"] },\n Chart: {\n series: [function (v) { return listOf(v, function (x) { return optional(x.name, dynString) && optional(x.expr, function (e) { return typeof e === \"string\"; }) && optional(x.values, function (vs) { return Array.isArray(vs) || isBinding(vs) || isCall(vs); }) && (x.values !== undefined || x.expr !== undefined); }, 1, 8); }, \"a list (1-8) of { name, values } or { name, expr }\"],\n x: [function (v) { return isObj(v) && v.from != null && v.to != null; }, \"{ from, to, steps }\"],\n },\n Steps: { steps: [function (v) { return listOf(v, function (x) { return dynString(x.title) && optional(x.text, dynString) && optional(x.child, function (c) { return typeof c === \"string\"; }); }, 1, 40); }, \"a list of { title, text, child }\"] },\n Quiz: { questions: [function (v) { return listOf(v, function (q) { return dynString(q.question) && Array.isArray(q.choices) && q.choices.length >= 2 && q.choices.length <= 8 && validAnswer(q.answer, q.choices.length) && optional(q.explain, dynString); }, 1, 40); }, \"a list of { question, choices (2-8), answer (the index of the right choice), explain }\"] },\n Flashcards: { cards: [function (v) { return listOf(v, function (c) { return dynString(c.front) && dynString(c.back); }, 1, 60); }, \"a list of { front, back }\"] },\n Timeline: { events: [function (v) { return listOf(v, function (e) { return dynString(e.title) && optional(e.label, dynString) && optional(e.text, dynString); }, 1, 40); }, \"a list of { label, title, text }\"] },\n Compare: { items: [function (v) { return listOf(v, function (i) { return dynString(i.title) && optional(i.points, function (p) { return Array.isArray(p) || isBinding(p) || isCall(p); }); }, 1, 4); }, \"a list (1-4) of { title, points, badge, verdict }\"] },\n Code: { code: [function (v) { return typeof v !== \"string\" || v.length <= 20000; }, \"at most 20,000 characters\"] },\n Table: { rows: [function (v) { return !Array.isArray(v) || v.length <= 500; }, \"at most 500 rows\"], columns: [function (v) { return Array.isArray(v) && v.length >= 1 && v.length <= 12 && v.every(function (c) { return typeof c === \"string\" || (isObj(c) && dynString(c.label)); }); }, \"a list (1-12) of labels or { label, key, format, align }\"] },\n };\n var TEMPLATE_ARG = { formatString: \"value\", openUrl: \"url\" };\n /** The catalog check for one component: what doesn't match, as paths relative to it. */\n function checkComponent(catalog, component) {\n if (!catalog) return [];\n var def = hasOwn(catalog.components, component.component) ? catalog.components[component.component] : undefined;\n if (!def) return [{ path: \"/component\", message: \"\\\"\" + component.component + \"\\\" is not in this surface's catalog\" }];\n var problems = [];\n def.required.forEach(function (name) { if (!(name in component)) problems.push({ path: \"/\" + name, message: component.component + \" requires \\\"\" + name + \"\\\"\" }); });\n var unknown = {};\n var interpolated = function (text) { templateCalls(text).forEach(function (n) { if (!catalog.functions[n]) unknown[n] = true; }); };\n var walk = function (v, depth, mapOfValues) {\n if (depth > 30 || v === null || typeof v !== \"object\") return;\n if (Array.isArray(v)) { v.forEach(function (x) { walk(x, depth + 1); }); return; }\n if (mapOfValues) { Object.keys(v).forEach(function (k) { walk(v[k], depth + 1); }); return; }\n if (isObj(v.event)) {\n var ev = {}; Object.keys(v.event).forEach(function (k) { if (k !== \"context\") ev[k] = v.event[k]; });\n walk(ev, depth + 1);\n if (isObj(v.event.context)) walk(v.event.context, depth + 1, true);\n Object.keys(v).forEach(function (k) { if (k !== \"event\") walk(v[k], depth + 1); });\n return;\n }\n if (isCall(v)) {\n if (!catalog.functions[v.call]) unknown[v.call] = true;\n var ta = hasOwn(TEMPLATE_ARG, v.call) ? TEMPLATE_ARG[v.call] : undefined;\n if (ta && v.args && typeof v.args[ta] === \"string\") interpolated(v.args[ta]);\n if (v.args) Object.keys(v.args).forEach(function (k) { walk(v.args[k], depth + 1, v.call === \"calc\" && k === \"vars\"); });\n return;\n }\n Object.keys(v).forEach(function (k) { walk(v[k], depth + 1); });\n };\n if (Array.isArray(component.checks)) component.checks.forEach(function (rule) { if (isObj(rule) && typeof rule.call === \"string\") { var cp = {}; Object.keys(rule).forEach(function (k) { if (k !== \"message\") cp[k] = rule[k]; }); walk(cp, 1); } });\n if (component.component === \"Table\" && Array.isArray(component.rows)) {\n var rest = {}; Object.keys(component).forEach(function (k) { if (k !== \"rows\") rest[k] = component[k]; }); walk(rest, 0);\n component.rows.forEach(function (row) { var cells = Array.isArray(row) ? row : isObj(row) ? Object.keys(row).map(function (k) { return row[k]; }) : []; cells.forEach(function (cell) { if (isObj(cell) && isCall(cell) && \"args\" in cell) walk(cell, 1); }); });\n } else walk(component, 0);\n Object.keys(unknown).forEach(function (fn) { problems.push({ path: \"\", message: \"\\\"\" + fn + \"\\\" is not a function in this surface's catalog\" }); });\n Object.keys(component).forEach(function (name) {\n if (name === \"id\" || name === \"component\") return;\n var value = component[name];\n if (name === \"accessibility\") { if (!isObj(value)) problems.push({ path: \"/accessibility\", message: \"accessibility must be an object\" }); return; }\n if (name === \"weight\") { if (typeof value !== \"number\") problems.push({ path: \"/weight\", message: \"weight must be a number\" }); return; }\n var kind = hasOwn(def.props, name) ? def.props[name] : undefined;\n if (!kind) { problems.push({ path: \"/\" + name, message: component.component + \" has no property \\\"\" + name + \"\\\"\" }); return; }\n var st = STRUCTURES[component.component], shape = st && hasOwn(st, name) ? st[name] : undefined;\n if (shape && !shape[0](value)) { problems.push({ path: \"/\" + name, message: component.component + \".\" + name + \" must be \" + shape[1] }); return; }\n if (!kindOk(kind, value)) problems.push({ path: \"/\" + name, message: component.component + \".\" + name + \" must be \" + (typeof kind === \"object\" ? \"one of \" + kind[\"enum\"].join(\", \") : kind) });\n });\n return problems;\n }\n\n /* ---- messages to surfaces ---- */\n var MAX_MESSAGES = 500, MAX_COMPONENTS = 600, MAX_ERRORS = 50;\n /** A document's messages: a JSON array, one object, or JSONL (one message a line). */\n function readMessages(text) {\n var t = String(text == null ? \"\" : text).trim();\n if (!t) return [];\n try { var whole = JSON.parse(t); return Array.isArray(whole) ? whole : [whole]; } catch (x) {}\n return t.split(\"\\n\").map(function (l) { return l.trim(); }).filter(Boolean).map(function (line) { try { return JSON.parse(line); } catch (x) { return { __unparsable: line.slice(0, 120) }; } });\n }\n /** Applies a document's messages in order: { surfaces: [..] in order, errors: [VALIDATION_FAILED, …] }. */\n function buildSurfaces(input) {\n var messages = Array.isArray(input) ? input : readMessages(input);\n var surfaces = {}, order = [], errors = [];\n var fail = function (surfaceId, path, message) { if (errors.length < MAX_ERRORS) errors.push({ code: \"VALIDATION_FAILED\", surfaceId: surfaceId, path: path, message: message }); };\n if (messages.length > MAX_MESSAGES) fail(\"\", \"\", \"A document holds at most \" + MAX_MESSAGES + \" messages\");\n messages.slice(0, MAX_MESSAGES).forEach(function (message, index) {\n var at = \"/\" + index;\n if (!isObj(message)) return fail(\"\", at, \"A message must be a JSON object\");\n if (\"__unparsable\" in message) return fail(\"\", at, \"Not valid JSON: \" + String(message.__unparsable));\n if (typeof message.version !== \"string\" || VERSIONS.indexOf(message.version) < 0) return fail(\"\", at + \"/version\", \"version must be \\\"\" + A2UI_VERSION + \"\\\"\");\n var kinds = [\"createSurface\", \"updateComponents\", \"updateDataModel\", \"deleteSurface\"].filter(function (k) { return k in message; });\n if (kinds.length !== 1) return fail(\"\", at, \"A message has exactly one of createSurface, updateComponents, updateDataModel, deleteSurface\");\n var kind = kinds[0], body = message[kind];\n if (!isObj(body)) return fail(\"\", at + \"/\" + kind, kind + \" must be an object\");\n var sid = typeof body.surfaceId === \"string\" ? body.surfaceId : \"\";\n if (!sid) return fail(\"\", at + \"/\" + kind + \"/surfaceId\", \"surfaceId is required\");\n var s = hasOwn(surfaces, sid) ? surfaces[sid] : null;\n if (kind === \"createSurface\") {\n if (s) return fail(sid, at + \"/createSurface\", \"The surface already exists (delete it first)\");\n var cid = typeof body.catalogId === \"string\" ? body.catalogId : \"\";\n if (!cid) return fail(sid, at + \"/createSurface/catalogId\", \"catalogId is required\");\n var cat = catalogFor(cid);\n if (!cat) return fail(sid, at + \"/createSurface/catalogId\", \"Unsupported catalog \\\"\" + cid + \"\\\"\");\n surfaces[sid] = { surfaceId: sid, catalogId: cid, catalog: cat, theme: isObj(body.theme) ? body.theme : undefined, sendDataModel: body.sendDataModel === true, components: {}, count: 0, dataModel: {} };\n order.push(sid);\n return;\n }\n if (kind === \"deleteSurface\") { if (!s) return fail(sid, at + \"/deleteSurface\", \"Unknown surface\"); delete surfaces[sid]; order = order.filter(function (x) { return x !== sid; }); return; }\n if (kind === \"updateComponents\") {\n if (!s) return fail(sid, at + \"/updateComponents\", \"Create the surface before updating it\");\n if (!Array.isArray(body.components)) return fail(sid, at + \"/updateComponents/components\", \"components must be a list\");\n var pending = {}, valid = true;\n var reject = function (path, msg) { valid = false; fail(sid, path, msg); };\n body.components.forEach(function (raw, i) {\n var path = at + \"/updateComponents/components/\" + i;\n if (!isObj(raw)) return reject(path, \"A component must be an object\");\n if (typeof raw.id !== \"string\" || !raw.id) return reject(path + \"/id\", \"id is required\");\n if (typeof raw.component !== \"string\") return reject(path + \"/component\", \"component is required\");\n checkComponent(s.catalog, raw).forEach(function (p) { reject(path + p.path, p.message); });\n pending[raw.id] = raw;\n });\n var added = Object.keys(pending).filter(function (id) { return !hasOwn(s.components, id); }).length;\n if (s.count + added > MAX_COMPONENTS) reject(at + \"/updateComponents\", \"A surface holds at most \" + MAX_COMPONENTS + \" components\");\n if (!valid) return;\n Object.keys(pending).forEach(function (id) { s.components[id] = pending[id]; });\n s.count += added;\n return;\n }\n if (!s) return fail(sid, at + \"/updateDataModel\", \"Create the surface before updating it\");\n if (\"path\" in body && typeof body.path !== \"string\") return fail(sid, at + \"/updateDataModel/path\", \"path must be a JSON Pointer string\");\n var ptr = typeof body.path === \"string\" ? body.path : \"/\";\n if (ptr.charAt(0) !== \"/\") return fail(sid, at + \"/updateDataModel/path\", \"path must be an absolute JSON Pointer\");\n try { s.dataModel = setPointer(s.dataModel, ptr, \"value\" in body ? body.value : undefined); } catch (e) { fail(sid, at + \"/updateDataModel/path\", e.message); }\n });\n order.forEach(function (sid) {\n var s = surfaces[sid];\n if (!hasOwn(s.components, \"root\")) fail(sid, \"\", \"No component has id \\\"root\\\"\");\n Object.keys(s.components).forEach(function (id) { var c = s.components[id]; referencedIds(c).forEach(function (r) { if (!hasOwn(s.components, r)) fail(sid, \"/components/\" + id, c.component + \" \\\"\" + id + \"\\\" refers to \\\"\" + r + \"\\\", which no component defines\"); }); });\n // A component may not contain itself, however far down: such a surface draws nothing.\n var loop = findLoop(s.components);\n if (loop) { s.loop = loop; fail(sid, \"/components/\" + loop[0], \"Components form a loop: \" + loop.join(\" → \")); }\n });\n return { surfaces: order.map(function (sid) { return surfaces[sid]; }), errors: errors };\n }\n /** A cycle in the components' references (ids in order, the first repeated at the end), or null. */\n function findLoop(components) {\n var state = {}, path = [];\n var visit = function (id) {\n if (state[id] === 2 || !hasOwn(components, id)) return null;\n if (state[id] === 1) return path.slice(path.indexOf(id)).concat(id);\n state[id] = 1; path.push(id);\n var refs = referencedIds(components[id]);\n for (var i = 0; i < refs.length; i++) { var f = visit(refs[i]); if (f) return f; }\n path.pop(); state[id] = 2; return null;\n };\n var ids = Object.keys(components);\n for (var i = 0; i < ids.length; i++) { var f = visit(ids[i]); if (f) return f; }\n return null;\n }\n function referencedIds(c) {\n var ids = [], push = function (v) { if (typeof v === \"string\") ids.push(v); };\n if (Array.isArray(c.children)) c.children.forEach(push); else if (isObj(c.children)) push(c.children.componentId);\n [\"child\", \"trigger\", \"content\"].forEach(function (p) { push(c[p]); });\n [\"tabs\", \"steps\"].forEach(function (p) { if (Array.isArray(c[p])) c[p].forEach(function (e) { if (isObj(e)) push(e.child); }); });\n return ids;\n }\n\n /* ---- JSON Pointer ---- */\n var forbidden = function (k) { return k === \"__proto__\" || k === \"prototype\" || k === \"constructor\"; };\n var unesc = function (s) { return s.replace(/~1/g, \"/\").replace(/~0/g, \"~\"); };\n var esc = function (s) { return s.replace(/~/g, \"~0\").replace(/\\//g, \"~1\"); };\n function segments(p) { return p === \"\" || p === \"/\" ? [] : p.replace(/^\\//, \"\").split(\"/\").map(unesc); }\n function resolvePath(path, base) { if (path.charAt(0) === \"/\") return path; var prefix = base === \"/\" ? \"\" : base; return path === \"\" || path === \".\" ? base || \"/\" : prefix + \"/\" + path; }\n function getPointer(model, p) {\n var node = model, segs = segments(p);\n for (var i = 0; i < segs.length; i++) {\n var seg = segs[i];\n if (node === null || node === undefined || typeof node !== \"object\") return undefined;\n if (Array.isArray(node)) { if (!/^\\d+$/.test(seg)) return undefined; node = node[Number(seg)]; }\n else { if (forbidden(seg) || !hasOwn(node, seg)) return undefined; node = node[seg]; }\n }\n return node;\n }\n var clone = function (v) { return v === null || typeof v !== \"object\" ? v : JSON.parse(JSON.stringify(v)); };\n function setPointer(model, p, value) {\n var segs = segments(p);\n if (!segs.length) return value === undefined ? {} : clone(value);\n var root = model !== null && typeof model === \"object\" ? clone(model) : {}, node = root;\n segs.forEach(function (seg, i) {\n if (forbidden(seg)) throw new Error(\"\\\"\" + seg + \"\\\" can't be used in a path\");\n var last = i === segs.length - 1, nextIsIndex = !last && /^\\d+$/.test(segs[i + 1]);\n if (Array.isArray(node)) {\n if (!/^\\d+$/.test(seg)) throw new Error(\"\\\"\" + seg + \"\\\" is not an index of a list\");\n var k = Number(seg); if (k > 10000) throw new Error(\"List index is too large\");\n if (last) { node[k] = value === undefined ? null : clone(value); return; }\n if (node[k] === null || typeof node[k] !== \"object\") node[k] = nextIsIndex ? [] : {};\n node = node[k];\n } else {\n if (last) { if (value === undefined) delete node[seg]; else node[seg] = clone(value); return; }\n if (node[seg] === null || typeof node[seg] !== \"object\") node[seg] = nextIsIndex ? [] : {};\n node = node[seg];\n }\n });\n return root;\n }\n function joinPointer(base) { var segs = Array.prototype.slice.call(arguments, 1); return (base === \"/\" ? \"\" : base) + segs.map(function (s) { return \"/\" + esc(String(s)); }).join(\"\") || \"/\"; }\n\n /* ---- formulas (calc): parsed, never run as code ---- */\n var OPS = [\"==\", \"!=\", \"<=\", \">=\", \"&&\", \"||\", \"<\", \">\", \"+\", \"-\", \"*\", \"/\", \"%\", \"^\", \"!\", \"?\", \":\", \"(\", \")\", \"[\", \"]\", \",\", \".\"];\n function tokenize(src) {\n if (src.length > 1000) throw new Error(\"Formula is longer than 1000 characters\");\n var out = [], i = 0;\n while (i < src.length) {\n var ch = src.charAt(i);\n if (/\\s/.test(ch)) { i++; continue; }\n if (/[0-9]/.test(ch) || (ch === \".\" && /[0-9]/.test(src.charAt(i + 1)))) { var m = /^(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?/.exec(src.slice(i)); out.push({ k: \"num\", v: Number(m[0]) }); i += m[0].length; continue; }\n if (ch === \"\\\"\" || ch === \"'\") { var j = i + 1, txt = \"\"; while (j < src.length && src.charAt(j) !== ch) { if (src.charAt(j) === \"\\\\\" && j + 1 < src.length) { txt += src.charAt(j + 1); j += 2; continue; } txt += src.charAt(j); j++; } if (j >= src.length) throw new Error(\"Unclosed string\"); out.push({ k: \"str\", v: txt }); i = j + 1; continue; }\n if (/[A-Za-z_$]/.test(ch)) { var n = /^[A-Za-z_$][A-Za-z0-9_$]*/.exec(src.slice(i))[0]; out.push({ k: \"name\", v: n }); i += n.length; continue; }\n var op = null; for (var q = 0; q < OPS.length; q++) if (src.substr(i, OPS[q].length) === OPS[q]) { op = OPS[q]; break; }\n if (!op) throw new Error(\"Unexpected \\\"\" + ch + \"\\\"\");\n out.push({ k: \"op\", v: op }); i += op.length;\n }\n return out;\n }\n var num = function (v, fn) { if (typeof v === \"number\") return v; if (typeof v === \"boolean\") return v ? 1 : 0; if (typeof v === \"string\" && v.trim() !== \"\" && isFinite(Number(v))) return Number(v); throw new Error(fn + \" needs a number\"); };\n var nums = function (a, fn) { return (a.length === 1 && Array.isArray(a[0]) ? a[0] : a).map(function (v) { return num(v, fn); }); };\n var truthy = function (v) { return !(v === null || v === undefined || v === false || v === 0 || v === \"\" || (typeof v === \"number\" && isNaN(v))); };\n var FNS = {\n min: function (a) { return Math.min.apply(null, nums(a, \"min\")); }, max: function (a) { return Math.max.apply(null, nums(a, \"max\")); },\n sum: function (a) { return nums(a, \"sum\").reduce(function (s, n) { return s + n; }, 0); }, avg: function (a) { var n = nums(a, \"avg\"); return n.length ? n.reduce(function (s, x) { return s + x; }, 0) / n.length : 0; },\n abs: function (a) { return Math.abs(num(a[0], \"abs\")); }, round: function (a) { var d = a[1] === undefined ? 0 : num(a[1], \"round\"), f = Math.pow(10, d); return Math.round(num(a[0], \"round\") * f) / f; },\n floor: function (a) { return Math.floor(num(a[0], \"floor\")); }, ceil: function (a) { return Math.ceil(num(a[0], \"ceil\")); }, sqrt: function (a) { return Math.sqrt(num(a[0], \"sqrt\")); },\n pow: function (a) { return Math.pow(num(a[0], \"pow\"), num(a[1], \"pow\")); }, log: function (a) { return Math.log(num(a[0], \"log\")); }, log2: function (a) { return Math.log(num(a[0], \"log2\")) / Math.LN2; },\n log10: function (a) { return Math.log(num(a[0], \"log10\")) / Math.LN10; }, exp: function (a) { return Math.exp(num(a[0], \"exp\")); },\n clamp: function (a) { return Math.min(Math.max(num(a[0], \"clamp\"), num(a[1], \"clamp\")), num(a[2], \"clamp\")); },\n \"if\": function (a) { return truthy(a[0]) ? (a[1] === undefined ? null : a[1]) : (a[2] === undefined ? null : a[2]); },\n len: function (a) { var v = a[0]; return typeof v === \"string\" || Array.isArray(v) ? v.length : 0; },\n range: function (a) { var from = num(a[0], \"range\"), to = num(a[1], \"range\"), step = a[2] === undefined ? 1 : num(a[2], \"range\"); if (step <= 0) throw new Error(\"range needs a positive step\"); var o = []; for (var x = from; x <= to + 1e-9 && o.length < 1000; x += step) o.push(Math.round(x * 1e9) / 1e9); return o; },\n __array: function (a) { return a; },\n };\n function parse(tokens) {\n var pos = 0, depth = 0;\n var peek = function () { var t = tokens[pos]; if (!t) return false; for (var i = 0; i < arguments.length; i++) if ((t.k === \"op\" || t.k === \"name\") && t.v === arguments[i]) return true; return false; };\n var take = function () { var t = tokens[pos++]; if (!t) throw new Error(\"Formula ends too early\"); return t; };\n var expect = function (op) { var t = take(); if (t.k !== \"op\" || t.v !== op) throw new Error(\"Expected \\\"\" + op + \"\\\"\"); };\n var nest = function (fn) { if (++depth > 64) throw new Error(\"Formula is nested too deeply\"); try { return fn(); } finally { depth--; } };\n function ternary() { return nest(function () { var c = or(); if (!peek(\"?\")) return c; take(); var a = ternary(); expect(\":\"); return { t: \"cond\", c: c, a: a, b: ternary() }; }); }\n function or() { var a = and(); while (peek(\"||\", \"or\")) { take(); a = { t: \"bin\", op: \"||\", a: a, b: and() }; } return a; }\n function and() { var a = cmp(); while (peek(\"&&\", \"and\")) { take(); a = { t: \"bin\", op: \"&&\", a: a, b: cmp() }; } return a; }\n function cmp() { var a = addE(); if (peek(\"==\", \"!=\", \"<\", \"<=\", \">\", \">=\")) { var op = take().v; return { t: \"bin\", op: op, a: a, b: addE() }; } return a; }\n function addE() { var a = mul(); while (peek(\"+\", \"-\")) { var op = take().v; a = { t: \"bin\", op: op, a: a, b: mul() }; } return a; }\n function mul() { var a = pw(); while (peek(\"*\", \"/\", \"%\")) { var op = take().v; a = { t: \"bin\", op: op, a: a, b: pw() }; } return a; }\n function pw() { var a = unary(); if (peek(\"^\")) { take(); return { t: \"bin\", op: \"^\", a: a, b: nest(pw) }; } return a; }\n function unary() { if (peek(\"-\", \"!\", \"not\")) { var op = take().v === \"-\" ? \"-\" : \"!\"; return { t: \"un\", op: op, a: nest(unary) }; } return postfix(); }\n function postfix() { var node = primary(); for (;;) { if (peek(\".\")) { take(); var k = take(); if (k.k !== \"name\") throw new Error(\"Expected a name after \\\".\\\"\"); node = { t: \"member\", o: node, k: { t: \"lit\", v: k.v } }; } else if (peek(\"[\")) { take(); var kk = ternary(); expect(\"]\"); node = { t: \"member\", o: node, k: kk }; } else return node; } }\n function args() { var list = []; if (!peek(\")\") && !peek(\"]\")) { do { list.push(ternary()); } while (peek(\",\") && take()); } return list; }\n function primary() {\n var t = take();\n if (t.k === \"num\" || t.k === \"str\") return { t: \"lit\", v: t.v };\n if (t.k === \"op\" && t.v === \"(\") { var n = ternary(); expect(\")\"); return n; }\n if (t.k === \"op\" && t.v === \"[\") { var items = args(); expect(\"]\"); return { t: \"call\", f: \"__array\", args: items }; }\n if (t.k === \"name\") {\n if (t.v === \"true\") return { t: \"lit\", v: true }; if (t.v === \"false\") return { t: \"lit\", v: false }; if (t.v === \"null\") return { t: \"lit\", v: null };\n if (peek(\"(\")) { take(); var a = args(); expect(\")\"); if (!hasOwn(FNS, t.v)) throw new Error(\"Unknown function \\\"\" + t.v + \"\\\"\"); return { t: \"call\", f: t.v, args: a }; }\n return { t: \"name\", n: t.v };\n }\n throw new Error(\"Unexpected \\\"\" + t.v + \"\\\"\");\n }\n var node = ternary();\n if (pos < tokens.length) throw new Error(\"Unexpected \\\"\" + tokens[pos].v + \"\\\"\");\n return node;\n }\n var eq = function (a, b) { return a === b || (typeof a !== typeof b && a !== null && b !== null && String(a) === String(b)); };\n function evalNode(n, scope) {\n switch (n.t) {\n case \"lit\": return n.v;\n case \"name\": if (!hasOwn(scope, n.n)) throw new Error(\"Unknown name \\\"\" + n.n + \"\\\"\"); return scope[n.n] === undefined ? null : scope[n.n];\n case \"un\": var u = evalNode(n.a, scope); return n.op === \"-\" ? -num(u, \"-\") : !truthy(u);\n case \"cond\": return truthy(evalNode(n.c, scope)) ? evalNode(n.a, scope) : evalNode(n.b, scope);\n case \"member\":\n var o = evalNode(n.o, scope), k = evalNode(n.k, scope);\n if (Array.isArray(o)) { var ix = num(k, \"index\"); return ix === Math.floor(ix) && ix >= 0 && ix < o.length ? (o[ix] === undefined ? null : o[ix]) : null; }\n if (o && typeof o === \"object\" && (typeof k === \"string\" || typeof k === \"number\")) return hasOwn(o, String(k)) && !forbidden(String(k)) ? (o[String(k)] === undefined ? null : o[String(k)]) : null;\n return null;\n case \"call\": return FNS[n.f](n.args.map(function (a) { return evalNode(a, scope); }));\n case \"bin\":\n if (n.op === \"&&\") { var x = evalNode(n.a, scope); return truthy(x) ? evalNode(n.b, scope) : x; }\n if (n.op === \"||\") { var y = evalNode(n.a, scope); return truthy(y) ? y : evalNode(n.b, scope); }\n var a = evalNode(n.a, scope), b = evalNode(n.b, scope);\n switch (n.op) {\n case \"==\": return eq(a, b); case \"!=\": return !eq(a, b);\n case \"+\":\n if (typeof a === \"string\" || typeof b === \"string\") {\n // Text joins within the budget, checked before it is built: nested formulas can't double their way out.\n var sa = String(a == null ? \"\" : a), sb = String(b == null ? \"\" : b);\n if (sa.length + sb.length > MAX_STRING) throw new Error(\"text longer than \" + MAX_STRING + \" characters\");\n return sa + sb;\n }\n return num(a, \"+\") + num(b, \"+\");\n case \"-\": return num(a, \"-\") - num(b, \"-\"); case \"*\": return num(a, \"*\") * num(b, \"*\"); case \"/\": return num(a, \"/\") / num(b, \"/\");\n case \"%\": return num(a, \"%\") % num(b, \"%\"); case \"^\": return Math.pow(num(a, \"^\"), num(b, \"^\"));\n case \"<\": return typeof a === \"string\" && typeof b === \"string\" ? a < b : num(a, \"<\") < num(b, \"<\");\n case \"<=\": return typeof a === \"string\" && typeof b === \"string\" ? a <= b : num(a, \"<=\") <= num(b, \"<=\");\n case \">\": return typeof a === \"string\" && typeof b === \"string\" ? a > b : num(a, \">\") > num(b, \">\");\n case \">=\": return typeof a === \"string\" && typeof b === \"string\" ? a >= b : num(a, \">=\") >= num(b, \">=\");\n }\n }\n throw new Error(\"Unsupported formula\");\n }\n var compiled = {};\n function compile(src) { if (hasOwn(compiled, src)) return compiled[src]; var n = parse(tokenize(src)); compiled[src] = n; return n; }\n function tryEvaluate(src, scope) { try { return { value: evalNode(compile(src), scope) }; } catch (e) { return { value: null, error: e.message }; } }\n\n /* ---- formats ---- */\n function formatValue(value, format) {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (typeof value === \"object\") return JSON.stringify(value);\n if (typeof value === \"string\" && !format) return value;\n var n = typeof value === \"number\" ? value : Number(value);\n if (!isFinite(n)) return typeof value === \"string\" ? value : \"—\";\n var parts = String(format || \"number\").split(\":\"), kind = parts[0] || \"number\", arg = parts[1];\n var dec = arg !== undefined && /^\\d+$/.test(arg) ? Math.min(Number(arg), 10) : undefined;\n switch (kind) {\n case \"integer\": return Math.round(n).toLocaleString(\"en-US\");\n case \"percent\": return (n * 100).toLocaleString(\"en-US\", { maximumFractionDigits: dec == null ? 1 : dec, minimumFractionDigits: dec == null ? 0 : dec }) + \"%\";\n case \"currency\": var cur = arg && /^[A-Za-z]{3}$/.test(arg) ? arg.toUpperCase() : \"USD\", big = Math.abs(n) >= 100 || n === Math.floor(n); try { return n.toLocaleString(\"en-US\", { style: \"currency\", currency: cur, maximumFractionDigits: big ? 0 : 2, minimumFractionDigits: big ? 0 : 2 }); } catch (x) { return cur + \" \" + n.toFixed(2); }\n case \"compact\": return n.toLocaleString(\"en-US\", { notation: \"compact\", maximumFractionDigits: dec == null ? 1 : dec });\n case \"bytes\": var units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"], v = Math.abs(n), u = 0; while (v >= 1024 && u < units.length - 1) { v /= 1024; u++; } return (n < 0 ? \"-\" : \"\") + v.toLocaleString(\"en-US\", { maximumFractionDigits: dec == null ? (v < 10 ? 1 : 0) : dec }) + \" \" + units[u];\n case \"duration\": var s = Math.max(0, Math.round(n)), d = Math.floor(s / 86400); s -= d * 86400; var h = Math.floor(s / 3600); s -= h * 3600; var m = Math.floor(s / 60); s -= m * 60; return [d && d + \"d\", h && h + \"h\", m && m + \"m\", (s || (!d && !h && !m)) && s + \"s\"].filter(Boolean).slice(0, 2).join(\" \");\n default: return n.toLocaleString(\"en-US\", { maximumFractionDigits: dec == null ? 2 : dec, minimumFractionDigits: dec == null ? 0 : dec });\n }\n }\n\n /* ---- formatString templates ---- */\n function matchingBrace(text, open) { var depth = 0, quote = null; for (var i = open; i < text.length; i++) { var ch = text.charAt(i); if (quote) { if (ch === quote) quote = null; continue; } if (ch === \"'\" || ch === \"\\\"\") { quote = ch; continue; } if (ch === \"{\") depth++; else if (ch === \"}\") { depth--; if (depth === 0) return i; } } return -1; }\n function splitArgs(text) { var parts = [], depth = 0, quote = null, start = 0; for (var i = 0; i < text.length; i++) { var ch = text.charAt(i); if (quote) { if (ch === quote) quote = null; continue; } if (ch === \"'\" || ch === \"\\\"\") quote = ch; else if (ch === \"{\" || ch === \"(\") depth++; else if (ch === \"}\" || ch === \")\") depth--; else if (ch === \",\" && depth === 0) { parts.push(text.slice(start, i)); start = i + 1; } } if (text.slice(start).trim()) parts.push(text.slice(start)); return parts; }\n function parseTemplate(template, depth) {\n depth = depth || 0;\n var parts = [], text = \"\", i = 0;\n while (i < template.length) {\n if (template.charAt(i) === \"\\\\\" && template.substr(i + 1, 2) === \"${\") { text += \"${\"; i += 3; continue; }\n if (template.substr(i, 2) === \"${\") { var end = matchingBrace(template, i + 1); if (end < 0) { text += template.slice(i); break; } if (text) { parts.push(text); text = \"\"; } parts.push(parseExpr(template.slice(i + 2, end), depth + 1)); i = end + 1; continue; }\n text += template.charAt(i); i++;\n }\n if (text) parts.push(text);\n return parts;\n }\n function parseExpr(source, depth) {\n var expr = source.trim();\n if (depth > 32) return { kind: \"path\", path: \"\" };\n var cm = /^([A-Za-z_][A-Za-z0-9_]*)\\s*\\(([\\s\\S]*)\\)$/.exec(expr);\n if (cm) { var args = []; splitArgs(cm[2]).forEach(function (part) { var c = part.indexOf(\":\"); if (c < 0) return; args.push({ key: part.slice(0, c).trim(), value: parseArg(part.slice(c + 1).trim(), depth + 1) }); }); return { kind: \"call\", name: cm[1], args: args }; }\n if (expr.slice(0, 2) === \"${\" && expr.slice(-1) === \"}\") return parseExpr(expr.slice(2, -1), depth + 1);\n return { kind: \"path\", path: expr };\n }\n function parseArg(text, depth) {\n if (text.length >= 2 && ((text.charAt(0) === \"'\" && text.slice(-1) === \"'\") || (text.charAt(0) === \"\\\"\" && text.slice(-1) === \"\\\"\"))) return { kind: \"literal\", value: text.slice(1, -1) };\n if (text === \"true\" || text === \"false\") return { kind: \"literal\", value: text === \"true\" };\n if (text !== \"\" && isFinite(Number(text))) return { kind: \"literal\", value: Number(text) };\n if (text.slice(0, 2) === \"${\") return parseExpr(text, depth);\n return { kind: \"path\", path: text };\n }\n function templateCalls(template, depth) {\n depth = depth || 0; var names = []; if (depth > 32) return names;\n var visit = function (e) { if (e.kind !== \"call\") return; names.push(e.name); e.args.forEach(function (a) { if (e.name === \"formatString\" && a.key === \"value\" && a.value.kind === \"literal\" && typeof a.value.value === \"string\") names.push.apply(names, templateCalls(a.value.value, depth + 1)); else visit(a.value); }); };\n parseTemplate(template).forEach(function (p) { if (typeof p !== \"string\") visit(p); });\n return names;\n }\n\n /* ---- regex checks that can't freeze the page ---- */\n function isSafePattern(p) {\n if (p.length > 300) return false;\n var stack = [], variable = 0, unbounded = 0;\n var quantAt = function (j) { var c = p.charAt(j); return c === \"*\" || c === \"+\" || c === \"?\" || (c === \"{\" && /^\\{\\d+(,\\d*)?\\}/.test(p.slice(j))); };\n var repeatsAt = function (j) { var c = p.charAt(j); if (c === \"*\" || c === \"+\") return true; var m = /^\\{(\\d+)(,(\\d*))?\\}/.exec(p.slice(j)); if (!m) return false; var max = m[2] === undefined ? Number(m[1]) : m[3] === \"\" ? Infinity : Number(m[3]); return max > 1; };\n var isVar = function (i) { var c = p.charAt(i); if (c === \"*\" || c === \"+\" || c === \"?\") return true; var m = /^\\{(\\d+)(,(\\d*))?\\}/.exec(p.slice(i)); if (!m || m[2] === undefined) return false; return m[3] === \"\" || Number(m[3]) > Number(m[1]); };\n for (var i = 0; i < p.length; i++) {\n var ch = p.charAt(i);\n if (ch === \"\\\\\") { var nx = p.charAt(i + 1); if (!nx || /[1-9k]/.test(nx)) return false; i++; continue; }\n if (ch === \"[\") { var j = i + 1; if (p.charAt(j) === \"^\") j++; while (j < p.length && p.charAt(j) !== \"]\") j += p.charAt(j) === \"\\\\\" ? 2 : 1; if (j >= p.length) return false; i = j; continue; }\n if (ch === \"(\") { if (p.charAt(i + 1) === \"?\") { if (p.charAt(i + 2) !== \":\") return false; i += 2; } stack.push({ risky: false }); continue; }\n if (ch === \")\") { var g = stack.pop(); if (!g) return false; if (stack.length) stack[stack.length - 1].risky = stack[stack.length - 1].risky || g.risky; if (g.risky && repeatsAt(i + 1)) return false; continue; }\n if (ch === \"|\") return false;\n // At most two unbounded repeats (\"a*a*a*\" backtracks cubically), at most three variable ones in all.\n if (quantAt(i)) { if (stack.length) stack[stack.length - 1].risky = true; if (isVar(i) && ++variable > 3) return false; if ((ch === \"*\" || ch === \"+\" || /^\\{\\d+,\\}/.test(p.slice(i))) && ++unbounded > 2) return false; if (ch === \"{\") i = p.indexOf(\"}\", i); if (p.charAt(i + 1) === \"?\") i++; continue; }\n }\n return stack.length === 0;\n }\n function safeTest(pattern, input) { if (!isSafePattern(pattern) || input.length > 160) return false; try { return new RegExp(pattern).test(input); } catch (x) { return false; } }\n\n /* ---- values: literals, bindings, calls ---- */\n function toText(v) { if (v === undefined || v === null) return \"\"; if (typeof v === \"string\") return v; if (typeof v === \"number\" || typeof v === \"boolean\") return String(v); return JSON.stringify(v); }\n var toNum = function (v) { return typeof v === \"number\" ? v : typeof v === \"string\" && v.trim() !== \"\" ? Number(v) : typeof v === \"boolean\" ? Number(v) : NaN; };\n var depthNow = 0, callsMade = 0;\n /** ctx: { model, base (\"/\" or the item's pointer), functions (the surface catalog's) }. */\n function resolve(value, ctx) {\n if (value === undefined || value === null || typeof value !== \"object\") return value;\n if (Array.isArray(value)) return value.map(function (v) { if (isBinding(v) || isCall(v)) { var r = resolve(v, ctx); return r === undefined ? null : r; } return v; });\n if (isBinding(value)) return getPointer(ctx.model, resolvePath(value.path, ctx.base));\n if (isCall(value)) return call(value.call, value.args || {}, ctx);\n return value;\n }\n function call(name, args, ctx) {\n if (depthNow === 0) callsMade = 0;\n if (!ctx.functions[name] || depthNow >= 32 || ++callsMade > 2000) return undefined;\n depthNow++;\n try { return callFn(name, args, ctx); } finally { depthNow--; }\n }\n function isEmail(v) { if (v.length > 254 || /\\s/.test(v)) return false; var at = v.indexOf(\"@\"); if (at <= 0 || at !== v.lastIndexOf(\"@\")) return false; var d = v.slice(at + 1), dot = d.lastIndexOf(\".\"); return dot > 0 && dot < d.length - 1; }\n function callFn(name, raw, ctx) {\n var arg = function (k) { return resolve(raw[k], ctx); };\n switch (name) {\n case \"required\": var v = arg(\"value\"); return !(v === undefined || v === null || v === \"\" || (Array.isArray(v) && !v.length));\n case \"regex\": return typeof raw.pattern === \"string\" && safeTest(raw.pattern, toText(arg(\"value\")));\n case \"length\": var n = toText(arg(\"value\")).length; return (typeof raw.min !== \"number\" || n >= raw.min) && (typeof raw.max !== \"number\" || n <= raw.max);\n case \"numeric\": var x = toNum(arg(\"value\")); if (isNaN(x)) return false; return (typeof raw.min !== \"number\" || x >= raw.min) && (typeof raw.max !== \"number\" || x <= raw.max);\n case \"email\": return isEmail(toText(arg(\"value\")));\n case \"formatString\": return formatString(toText(arg(\"value\")), ctx);\n case \"formatNumber\": var fnn = toNum(arg(\"value\")); if (isNaN(fnn)) return \"\"; var dd = arg(\"decimals\"), dec = typeof dd === \"number\" ? Math.min(Math.max(Math.round(dd), 0), 10) : undefined; return fnn.toLocaleString(\"en-US\", { minimumFractionDigits: dec, maximumFractionDigits: dec == null ? 2 : dec, useGrouping: arg(\"grouping\") !== false });\n case \"formatCurrency\": var fc = toNum(arg(\"value\")); if (isNaN(fc)) return \"\"; var cur = toText(arg(\"currency\")) || \"USD\", d2 = arg(\"decimals\"), dc = typeof d2 === \"number\" ? Math.min(Math.max(Math.round(d2), 0), 10) : undefined; try { return fc.toLocaleString(\"en-US\", { style: \"currency\", currency: cur, minimumFractionDigits: dc, maximumFractionDigits: dc, useGrouping: arg(\"grouping\") !== false }); } catch (e) { return cur + \" \" + fc.toFixed(dc == null ? 2 : dc); }\n case \"formatDate\": return formatDate(arg(\"value\"), toText(arg(\"format\")));\n case \"pluralize\": var pn = toNum(arg(\"value\")); if (pn === 0 && raw.zero !== undefined) return toText(arg(\"zero\")); var cat = isNaN(pn) ? \"other\" : new Intl.PluralRules(\"en-US\").select(pn); return toText(raw[cat] !== undefined ? arg(cat) : arg(\"other\"));\n case \"openUrl\": return null;\n case \"and\": return Array.isArray(raw.values) && raw.values.every(function (y) { return truthy(resolve(y, ctx)); });\n case \"or\": return Array.isArray(raw.values) && raw.values.some(function (y) { return truthy(resolve(y, ctx)); });\n case \"not\": return !truthy(arg(\"value\"));\n case \"calc\": if (typeof raw.expr !== \"string\") return undefined; var r = tryEvaluate(raw.expr, formulaScope(ctx, raw.vars)); return r.error ? undefined : r.value;\n case \"formatValue\": var fv = arg(\"value\"); return formatValue(fv === undefined ? null : fv, toText(arg(\"format\")) || undefined);\n }\n return undefined;\n }\n function formulaScope(ctx, vars) {\n var scope = {};\n var copy = function (o) { Object.keys(o).forEach(function (k) { if (!forbidden(k)) scope[k] = o[k]; }); };\n if (isObj(ctx.model)) copy(ctx.model);\n var item = ctx.base !== \"/\" ? getPointer(ctx.model, ctx.base) : undefined;\n if (isObj(item)) copy(item);\n if (isObj(vars)) Object.keys(vars).forEach(function (k) { if (!forbidden(k)) { var v = resolve(vars[k], ctx); scope[k] = v === undefined ? null : v; } });\n return scope;\n }\n /** The longest string one value may expand to: a short document can't grow past what a page can hold. */\n var MAX_STRING = 4000;\n function clip(s) { return s.length > MAX_STRING ? s.slice(0, MAX_STRING - 1) + \"…\" : s; }\n function formatString(template, ctx) {\n var ev = function (e) { if (e.kind === \"literal\") return e.value; if (e.kind === \"path\") return getPointer(ctx.model, resolvePath(e.path, ctx.base)); var a = {}; e.args.forEach(function (x) { var v = ev(x.value); a[x.key] = v === undefined ? null : v; }); return call(e.name, a, ctx); };\n // Built piece by piece against the budget, never whole first.\n var out = \"\", parts = parseTemplate(clip(template));\n for (var i = 0; i < parts.length && out.length < MAX_STRING; i++) { var p = parts[i]; out += clip(typeof p === \"string\" ? p : toText(ev(p))); }\n return clip(out);\n }\n function formatDate(value, pattern) {\n var date = null;\n if (typeof value === \"number\") date = new Date(value);\n else if (typeof value === \"string\") { var dm = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value); date = dm ? new Date(Number(dm[1]), Number(dm[2]) - 1, Number(dm[3])) : new Date(value); }\n if (!date || isNaN(date.getTime())) return \"\";\n var pad = function (n, w) { return String(n).padStart(w || 2, \"0\"); }, h12 = date.getHours() % 12 || 12;\n var T = { yyyy: function () { return String(date.getFullYear()); }, yy: function () { return pad(date.getFullYear() % 100); }, MMMM: function () { return date.toLocaleString(\"en-US\", { month: \"long\" }); }, MMM: function () { return date.toLocaleString(\"en-US\", { month: \"short\" }); }, MM: function () { return pad(date.getMonth() + 1); }, M: function () { return String(date.getMonth() + 1); }, EEEE: function () { return date.toLocaleString(\"en-US\", { weekday: \"long\" }); }, E: function () { return date.toLocaleString(\"en-US\", { weekday: \"short\" }); }, dd: function () { return pad(date.getDate()); }, d: function () { return String(date.getDate()); }, HH: function () { return pad(date.getHours()); }, H: function () { return String(date.getHours()); }, hh: function () { return pad(h12); }, h: function () { return String(h12); }, mm: function () { return pad(date.getMinutes()); }, ss: function () { return pad(date.getSeconds()); }, a: function () { return date.getHours() < 12 ? \"AM\" : \"PM\"; } };\n var order = Object.keys(T).sort(function (a, b) { return b.length - a.length; }), out = \"\";\n for (var i = 0; i < pattern.length;) {\n if (pattern.charAt(i) === \"'\") { var end = pattern.indexOf(\"'\", i + 1); out += end < 0 ? pattern.slice(i + 1) : pattern.slice(i + 1, end); i = end < 0 ? pattern.length : end + 1; continue; }\n var tok = null; for (var k = 0; k < order.length; k++) if (pattern.substr(i, order[k].length) === order[k]) { tok = order[k]; break; }\n if (tok) { out += T[tok](); i += tok.length; } else { out += pattern.charAt(i); i++; }\n }\n return out;\n }\n\n\n /* ---- a document as text: complete without any view (the tool's text result) ---- */\n /** Every surface of a built document as plain text: headings, values as they resolve now, every quiz answer. */\n var MAX_TEXT = 100000, MAX_WALK = 3000, MAX_CODE = 20000;\n function documentText(built) {\n var out = [], size = 0, walked = 0, cut = false;\n var push0 = out.push;\n var pushWhole = function (s) { if (cut) return; size += s.length + 1; if (size > MAX_TEXT) { cut = true; push0.call(out, \"\", \"(The rest is cut: the document's text runs past \" + MAX_TEXT + \" characters.)\"); return; } push0.call(out, s); };\n out.push = function () { for (var a = 0; a < arguments.length; a++) { if (cut) return; var line = clip(String(arguments[a])); size += line.length + 1; if (size > MAX_TEXT) { cut = true; push0.call(out, \"\", \"(The rest is cut: the document's text runs past \" + MAX_TEXT + \" characters.)\"); return; } push0.call(out, line); } };\n built.surfaces.forEach(function (s, si) {\n if (s.loop) return;\n if (si) out.push(\"\", \"---\", \"\");\n var fns = s.catalog ? s.catalog.functions : {};\n var seen = {};\n var walk = function (id, base, depth) {\n if (depth > 40 || !hasOwn(s.components, id) || cut || ++walked > MAX_WALK) return;\n var key = id + \"@\" + base; if (seen[key]) return; seen[key] = 1;\n var c = s.components[id], ctx = { model: s.dataModel, base: base, functions: fns };\n var r = function (v) { return resolve(v, ctx); }, t = function (v) { return toText(r(v)); };\n var kids = function (ch) {\n if (Array.isArray(ch)) ch.forEach(function (k) { walk(k, base, depth + 1); });\n else if (isObj(ch) && typeof ch.path === \"string\") { var list = getPointer(s.dataModel, resolvePath(ch.path, base)); if (Array.isArray(list)) list.forEach(function (_, i) { walk(ch.componentId, joinPointer(resolvePath(ch.path, base), i), depth + 1); }); }\n };\n var label = function (cid) { if (!hasOwn(s.components, cid)) return \"\"; var x = s.components[cid]; return x.component === \"Text\" ? toText(resolve(x.text, ctx)) : x.component === \"Icon\" ? \"\" : \"\"; };\n switch (c.component) {\n case \"Text\": var v = c.variant; out.push(v === \"h1\" ? \"# \" + t(c.text) : v === \"h2\" ? \"## \" + t(c.text) : /^h[345]$/.test(v || \"\") ? \"### \" + t(c.text) : t(c.text)); break;\n case \"Image\": out.push(\"[Image\" + (c.description ? \": \" + t(c.description) : \"\") + \"] \" + t(c.url)); break;\n case \"Video\": out.push(\"[Video] \" + t(c.url)); break;\n case \"AudioPlayer\": out.push(\"[Audio\" + (c.description ? \": \" + t(c.description) : \"\") + \"] \" + t(c.url)); break;\n case \"Icon\": break;\n case \"Row\": case \"Column\": case \"List\": kids(c.children); break;\n case \"Card\": walk(c.child, base, depth + 1); break;\n case \"Tabs\": (c.tabs || []).forEach(function (tb) { out.push(\"\", \"### \" + t(tb.title)); walk(tb.child, base, depth + 1); }); break;\n case \"Modal\": walk(c.trigger, base, depth + 1); walk(c.content, base, depth + 1); break;\n case \"Divider\": out.push(\"---\"); break;\n case \"Button\":\n var a = c.action || {};\n out.push(\"[\" + (label(c.child) || \"Button\") + \"]\" + (a.functionCall && a.functionCall.call === \"openUrl\" ? \" \" + t((a.functionCall.args || {}).url) : \"\"));\n break;\n case \"TextField\": out.push(t(c.label) + \": \" + t(c.value)); break;\n case \"CheckBox\": out.push(\"[\" + (r(c.value) ? \"x\" : \" \") + \"] \" + t(c.label)); break;\n case \"ChoicePicker\":\n var sel = r(c.value); sel = Array.isArray(sel) ? sel : [];\n out.push((c.label ? t(c.label) + \": \" : \"\") + (c.options || []).map(function (o) { return (sel.indexOf(o.value) >= 0 ? \"[x] \" : \"[ ] \") + t(o.label); }).join(\", \"));\n break;\n case \"Slider\": out.push(t(c.label) + \": \" + t(c.value) + \" (\" + (c.min == null ? 0 : c.min) + \" to \" + c.max + \")\"); break;\n case \"DateTimeInput\": out.push((c.label ? t(c.label) + \": \" : \"\") + t(c.value)); break;\n case \"Stat\": out.push(t(c.label) + \": \" + formatValue(r(c.value) === undefined ? null : r(c.value), c.format) + (c.hint ? \" (\" + t(c.hint) + \")\" : \"\")); break;\n case \"Callout\": out.push((c.tone === \"warning\" ? \"Warning\" : c.tone === \"tip\" ? \"Tip\" : c.tone === \"success\" ? \"Done\" : \"Note\") + \": \" + (c.title ? t(c.title) + \". \" : \"\") + t(c.text)); break;\n case \"Chart\":\n var cd = chartData(c, ctx);\n if (c.title) out.push(\"### \" + t(c.title));\n cd.labels.forEach(function (lb, i) { out.push(\"- \" + lb + \": \" + cd.series.map(function (x) { return (cd.series.length > 1 ? x.name + \" \" : \"\") + formatValue(x.values[i] == null ? null : x.values[i], c.format); }).join(\", \")); });\n break;\n case \"Steps\": (c.steps || []).forEach(function (st, i) { out.push((i + 1) + \". \" + t(st.title) + (st.text ? \": \" + t(st.text) : \"\")); if (st.child) walk(st.child, base, depth + 1); }); break;\n case \"Quiz\": (c.questions || []).forEach(function (q, i) { var ch = (q.choices || []).map(function (x) { return toText(r(x)); }), ans = Number(r(q.answer)); out.push(\"Q\" + (i + 1) + \". \" + t(q.question)); ch.forEach(function (x, k) { out.push(\" \" + \"ABCDEFGH\"[k] + \") \" + x); }); out.push(\" Answer: \" + (\"ABCDEFGH\"[ans] || \"?\") + (q.explain ? \". \" + t(q.explain) : \"\")); }); break;\n case \"Flashcards\": (c.cards || []).forEach(function (cc) { out.push(\"Q: \" + t(cc.front), \"A: \" + t(cc.back)); }); break;\n case \"Timeline\": (c.events || []).forEach(function (e) { out.push(\"- \" + (e.label ? t(e.label) + \": \" : \"\") + t(e.title) + (e.text ? \". \" + t(e.text) : \"\")); }); break;\n case \"Compare\": (c.items || []).forEach(function (it) { var pts = r(it.points); out.push(\"### \" + t(it.title) + (it.badge ? \" (\" + t(it.badge) + \")\" : \"\")); (Array.isArray(pts) ? pts : []).forEach(function (p) { out.push(\"- \" + toText(p)); }); if (it.verdict) out.push(\"Verdict: \" + t(it.verdict)); }); break;\n case \"Diagram\": out.push((c.caption ? \"Diagram: \" + t(c.caption) : \"Diagram\"), \"```mermaid\", t(c.mermaid), \"```\"); break;\n // Code is kept whole (up to MAX_CODE), never clipped like a line of prose: a copy must run.\n case \"Code\": out.push((c.title ? t(c.title) + \":\" : \"\"), \"```\" + (c.language || \"\")); var src = toText(r(c.code)); pushWhole(src.length > MAX_CODE ? \"(code longer than \" + MAX_CODE + \" characters: not shown)\" : src); out.push(\"```\"); break;\n case \"Table\":\n var td = tableData(c, ctx);\n out.push(\"| \" + td.columns.map(function (x) { return x.label; }).join(\" | \") + \" |\", \"| \" + td.columns.map(function () { return \"---\"; }).join(\" | \") + \" |\");\n td.rows.forEach(function (row) { out.push(\"| \" + row.map(function (x) { return String(x).replace(/\\|/g, \"\\\\|\"); }).join(\" | \") + \" |\"); });\n if (td.total > td.rows.length) out.push(\"(\" + td.rows.length + \" of \" + td.total + \" rows: a table shows at most 500)\");\n break;\n }\n };\n walk(\"root\", \"/\", 0);\n });\n return out.filter(function (l, i, a) { return !(l === \"\" && a[i - 1] === \"\"); }).join(\"\\n\").trim();\n }\n /** A chart's labels and series as numbers: literal values, bindings, calls, or a formula over x. */\n function chartData(c, ctx) {\n var r = function (v) { return resolve(v, ctx); };\n var series = Array.isArray(c.series) ? c.series : [], labels = r(c.labels);\n var out = [], xs = null;\n if (isObj(c.x)) {\n var from = Number(r(c.x.from)), to = Number(r(c.x.to)), steps = Math.max(2, Math.min(200, Number(r(c.x.steps)) || 20));\n if (isFinite(from) && isFinite(to)) { xs = []; for (var i = 0; i < steps; i++) xs.push(Math.round((from + ((to - from) * i) / (steps - 1)) * 1e6) / 1e6); }\n }\n series.forEach(function (x, si) {\n var vals;\n if (x.expr && xs) { vals = xs.map(function (xv) { var sc = formulaScope(ctx, null); sc.x = xv; var e = tryEvaluate(x.expr, sc); return typeof e.value === \"number\" && isFinite(e.value) ? e.value : null; }); }\n else { var raw = r(x.values); vals = Array.isArray(raw) ? raw.map(function (v) { var n = Number(resolve(v, ctx)); return isFinite(n) ? n : null; }) : []; }\n out.push({ name: toText(r(x.name)) || \"Series \" + (si + 1), values: vals });\n });\n var n = out.reduce(function (m, x) { return Math.max(m, x.values.length); }, 0);\n var lab = xs ? xs.map(function (v) { return formatValue(v); }) : Array.isArray(labels) ? labels.map(function (l) { return toText(l); }) : [];\n for (var k = lab.length; k < n; k++) lab.push(String(k + 1));\n return { labels: lab.slice(0, n), series: out };\n }\n /** A table's columns and rows as text, each cell formatted by its column. */\n function tableData(c, ctx) {\n var cols = (c.columns || []).map(function (x, i) { return typeof x === \"string\" ? { label: x, key: i } : { label: toText(resolve(x.label, ctx)), key: x.key != null ? x.key : i, format: x.format, align: x.align }; });\n var raw = resolve(c.rows, ctx), rows = Array.isArray(raw) ? raw : [];\n return { columns: cols, total: rows.length, rows: rows.slice(0, 500).map(function (row) { return cols.map(function (col, i) { var v = Array.isArray(row) ? row[i] : isObj(row) ? row[col.key] : \"\"; v = resolve(v, ctx); return col.format ? formatValue(v == null ? null : v, col.format) : toText(v); }); }) };\n }\n\n return {\n EXTENSIONS: EXTENSIONS, MAX_STRING: MAX_STRING, MAX_CODE: MAX_CODE, clip: clip, findLoop: findLoop, VERSION: A2UI_VERSION, documentText: documentText, chartData: chartData, tableData: tableData, formulaScope: formulaScope, BASIC_CATALOG_ID: BASIC_CATALOG_ID, FABRIC_CATALOG_ID: FABRIC_CATALOG_ID, CATALOG: CATALOG,\n catalogFor: catalogFor, checkComponent: checkComponent, readMessages: readMessages, buildSurfaces: buildSurfaces, referencedIds: referencedIds,\n isBinding: isBinding, isCall: isCall, getPointer: getPointer, setPointer: setPointer, resolvePath: resolvePath, joinPointer: joinPointer,\n resolve: resolve, call: call, formatString: formatString, formatValue: formatValue, formatDate: formatDate, tryEvaluate: tryEvaluate, truthy: truthy,\n isSafePattern: isSafePattern, safeTest: safeTest, toText: toText, templateCalls: templateCalls,\n };\n})();\nexport default A2UI;\n","/*\n * GENERATED by bin/build-ui-kit.mjs from worker/mcp/ui-kit/src/: do not edit; edit the sources and run\n * `node bin/build-ui-kit.mjs`. The Fabric UI kit for MCP Apps, as strings a view's page inlines.\n *\n * heddle: pending #217\n */\nexport const KIT_VERSION = \"1.0.0\";\nexport const KIT_CSS = \"/* tokens.css */\\n/* Fabric UI kit for MCP Apps: tokens (docs/mcp-app-design.md, section 1). Fallbacks first, light and dark; then the\\n kit's own names, which take the host's style variables first, the site's tokens second and the fallbacks last. */\\n:root, :root[data-theme=\\\"light\\\"] {\\n color-scheme: light;\\n --k-f-ground: transparent; --k-f-card: #ffffff; --k-f-stage: #f5f5f4; --k-f-raised: #efefed; --k-f-hair: #e7e7e5; --k-f-line: #cfcfcc;\\n --k-f-ink: #1c1c1c; --k-f-body: #3a3a3a; --k-f-muted: #646464; --k-f-faint: #8c8c8c;\\n --k-f-accent: #bc3e0b; --k-f-accent-tint: #fdf0ea; --k-f-accent-ink: #9a3006;\\n --k-f-ok: #2b7a0b; --k-f-ok-tint: #ebf5e4; --k-f-warn: #8a5d00; --k-f-warn-tint: #fbf1dc; --k-f-bad: #a3140c; --k-f-bad-tint: #fcebea; --k-f-info: #1f4fb3; --k-f-info-tint: #e9effb;\\n --k-f-primary: #1c1c1c; --k-f-on-primary: #ffffff; --k-f-on-primary-mark: #ff8547; --k-f-shadow: 0 1px 2px rgba(0,0,0,.04), 0 8px 24px rgba(0,0,0,.07);\\n --k-f-s1: #bc3e0b; --k-f-s2: #3f73b8; --k-f-s3: #d0843a; --k-f-s4: #4f9a3c; --k-f-s5: #7f68c4;\\n --k-t-blue: #e6f0fa; --k-t-blue-s: #8fb3da; --k-t-orange: #fdebdb; --k-t-orange-s: #e3a26a; --k-t-green: #e4f2df; --k-t-green-s: #8cbf7a;\\n --k-t-violet: #eee9fa; --k-t-violet-s: #a895d9; --k-t-sand: #f5eedf; --k-t-sand-s: #c9b27f; --k-t-teal: #dff1ef; --k-t-teal-s: #73b8ae;\\n}\\n:root[data-theme=\\\"dark\\\"] {\\n color-scheme: dark;\\n --k-f-ground: transparent; --k-f-card: #1c1c1c; --k-f-stage: #252525; --k-f-raised: #2c2c2c; --k-f-hair: #303030; --k-f-line: #4a4a4a;\\n --k-f-ink: #f4f4f4; --k-f-body: #d9d9d9; --k-f-muted: #a6a6a6; --k-f-faint: #7d7d7d;\\n --k-f-accent: #ff8547; --k-f-accent-tint: #381c11; --k-f-accent-ink: #ffb088;\\n --k-f-ok: #6fcf3a; --k-f-ok-tint: #1d2c14; --k-f-warn: #f2b33d; --k-f-warn-tint: #33280f; --k-f-bad: #ff8a82; --k-f-bad-tint: #3b1a17; --k-f-info: #8ab4ff; --k-f-info-tint: #172238;\\n --k-f-primary: #f4f4f4; --k-f-on-primary: #111111; --k-f-on-primary-mark: #bc3e0b; --k-f-shadow: 0 1px 2px rgba(0,0,0,.4), 0 8px 24px rgba(0,0,0,.35);\\n --k-f-s1: #ff8547; --k-f-s2: #8ab4ff; --k-f-s3: #f0a35e; --k-f-s4: #7fc96a; --k-f-s5: #b9a6f2;\\n --k-t-blue: #172838; --k-t-blue-s: #4c77a6; --k-t-orange: #3a2617; --k-t-orange-s: #b9773c; --k-t-green: #1a2e1a; --k-t-green-s: #5e9450;\\n --k-t-violet: #261f3a; --k-t-violet-s: #7e6ab8; --k-t-sand: #302a1c; --k-t-sand-s: #9c8655; --k-t-teal: #142e2b; --k-t-teal-s: #4f938a;\\n}\\n@media (prefers-color-scheme: dark) {\\n :root:not([data-theme]) {\\n color-scheme: dark;\\n --k-f-ground: transparent; --k-f-card: #1c1c1c; --k-f-stage: #252525; --k-f-raised: #2c2c2c; --k-f-hair: #303030; --k-f-line: #4a4a4a;\\n --k-f-ink: #f4f4f4; --k-f-body: #d9d9d9; --k-f-muted: #a6a6a6; --k-f-faint: #7d7d7d;\\n --k-f-accent: #ff8547; --k-f-accent-tint: #381c11; --k-f-accent-ink: #ffb088;\\n --k-f-ok: #6fcf3a; --k-f-ok-tint: #1d2c14; --k-f-warn: #f2b33d; --k-f-warn-tint: #33280f; --k-f-bad: #ff8a82; --k-f-bad-tint: #3b1a17; --k-f-info: #8ab4ff; --k-f-info-tint: #172238;\\n --k-f-primary: #f4f4f4; --k-f-on-primary: #111111; --k-f-on-primary-mark: #bc3e0b; --k-f-shadow: 0 1px 2px rgba(0,0,0,.4), 0 8px 24px rgba(0,0,0,.35);\\n --k-f-s1: #ff8547; --k-f-s2: #8ab4ff; --k-f-s3: #f0a35e; --k-f-s4: #7fc96a; --k-f-s5: #b9a6f2;\\n --k-t-blue: #172838; --k-t-blue-s: #4c77a6; --k-t-orange: #3a2617; --k-t-orange-s: #b9773c; --k-t-green: #1a2e1a; --k-t-green-s: #5e9450;\\n --k-t-violet: #261f3a; --k-t-violet-s: #7e6ab8; --k-t-sand: #302a1c; --k-t-sand-s: #9c8655; --k-t-teal: #142e2b; --k-t-teal-s: #4f938a;\\n }\\n}\\n:root {\\n /* Surfaces and ink: the host's MCP Apps style variables, then the site's own tokens, then the fallbacks above. The\\n accent is the site's (a view passes it; see kitDocument), never the host's: it is the brand. */\\n --k-card: var(--color-background-primary, var(--k-f-card));\\n --k-stage: var(--color-background-secondary, var(--k-f-stage));\\n --k-raised: var(--color-background-tertiary, var(--k-f-raised));\\n --k-hair: var(--color-border-tertiary, var(--color-border-secondary, var(--k-f-hair)));\\n --k-line: var(--color-border-primary, var(--k-f-line));\\n --k-ink: var(--color-text-primary, var(--k-f-ink));\\n --k-body: var(--color-text-primary, var(--k-f-body));\\n --k-muted: var(--color-text-secondary, var(--k-f-muted));\\n --k-faint: var(--color-text-tertiary, var(--k-f-faint));\\n --k-accent: var(--k-site-accent, var(--k-f-accent));\\n --k-accent-tint: var(--k-site-accent-tint, var(--k-f-accent-tint));\\n --k-accent-ink: var(--k-site-accent-ink, var(--k-f-accent-ink));\\n --k-ok: var(--color-text-success, var(--k-f-ok)); --k-ok-tint: var(--k-f-ok-tint);\\n --k-warn: var(--color-text-warning, var(--k-f-warn)); --k-warn-tint: var(--k-f-warn-tint);\\n --k-bad: var(--color-text-danger, var(--k-f-bad)); --k-bad-tint: var(--k-f-bad-tint);\\n --k-info: var(--color-text-info, var(--k-f-info)); --k-info-tint: var(--k-f-info-tint);\\n --k-primary: var(--k-f-primary); --k-on-primary: var(--k-f-on-primary);\\n --k-ring: var(--k-accent);\\n --k-shadow: var(--k-f-shadow);\\n --k-font: var(--font-sans, \\\"Inter\\\", ui-sans-serif, system-ui, -apple-system, \\\"Segoe UI\\\", Roboto, sans-serif);\\n --k-display: var(--k-site-display, var(--k-font));\\n --k-mono: var(--font-mono, \\\"JetBrains Mono\\\", ui-monospace, \\\"SFMono-Regular\\\", Menlo, Consolas, monospace);\\n /* Radii: four and only four. Space: an 8px grid (4 for the tightest pairs). */\\n --k-r-chip: 6px; --k-r-box: 12px; --k-r-card: 20px; --k-r-pill: 999px;\\n --k-pad: 20px; --k-gap: 16px; --k-gap-s: 8px;\\n --k-stage-h: 196px;\\n --k-ease: cubic-bezier(0.2, 0, 0, 1);\\n --k-t-fast: 160ms; --k-t: 280ms; --k-t-slow: 480ms;\\n}\\n\\n/* kit.css */\\n/* Fabric UI kit for MCP Apps: components (docs/mcp-app-design.md, sections 2 to 5). Every block on a card starts at\\n the card's inner left edge; nothing inside a card is raised; one primary button a card. */\\n[hidden] { display: none !important; }\\nhtml, body { margin: 0; padding: 0; background: var(--k-f-ground); color: var(--k-ink); }\\nbody { font: 400 15px/24px var(--k-font); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; }\\n*, *::before, *::after { box-sizing: border-box; }\\n.k-app { padding: 4px 6px 12px; min-width: 0; container: kit / inline-size; }\\n.k-app--full { padding: 0; min-height: 100vh; }\\n:where(.k-app) :where(button, input, select, textarea) { font: inherit; color: inherit; }\\n:where(.k-app) button { cursor: pointer; -webkit-tap-highlight-color: transparent; }\\n.k-app :focus-visible { outline: 2px solid var(--k-ring); outline-offset: 2px; }\\n.k-sr { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }\\n.k-reduce *, .k-reduce *::before, .k-reduce *::after { transition: none !important; animation: none !important; }\\n@media (prefers-reduced-motion: reduce) { .k-app *, .k-app *::before, .k-app *::after { transition: none !important; animation: none !important; } }\\n\\n/* ---- card ---- */\\n.k-card { --k-pad: 20px; position: relative; display: flex; flex-direction: column; gap: var(--k-gap); padding: var(--k-pad); border-radius: var(--k-r-card); background: var(--k-card); border: 1px solid var(--k-hair); box-shadow: var(--k-shadow); min-width: 0; text-align: left; }\\n.k-card--steps { gap: 12px; }\\n.k-app--full .k-card { border-radius: 0; border: 0; box-shadow: none; min-height: 100vh; max-width: 880px; margin: 0 auto; padding: 32px 24px; justify-content: flex-start; align-content: start; }\\n.k-card:focus { outline: none; }\\n.k-card:focus-visible { outline: 2px solid var(--k-ring); outline-offset: 2px; }\\n.k-head { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\\n.k-headrow { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; min-height: 28px; }\\n.k-headrow > .k-lead { display: flex; align-items: center; gap: 8px; min-width: 0; }\\n.k-headrow > .k-tools { display: flex; align-items: center; gap: 4px; flex: none; margin-right: -6px; }\\n.k-mark { width: 18px; height: 18px; border-radius: var(--k-r-chip); flex: none; display: block; }\\n/* An eyebrow wraps beside the card's tools; it is never cut short. */\\n.k-eyebrow { margin: 0; font: 600 12px/16px var(--k-font); letter-spacing: .06em; text-transform: uppercase; color: var(--k-accent); min-width: 0; overflow-wrap: anywhere; }\\n.k-eyebrow .k-eyebrow-meta { color: var(--k-muted); font-weight: 500; letter-spacing: .02em; text-transform: none; }\\n.k-title { margin: 0; font: 600 20px/28px var(--k-display); letter-spacing: -0.01em; color: var(--k-ink); text-wrap: balance; overflow-wrap: anywhere; }\\n.k-sub { margin: 0; font: 400 13px/20px var(--k-font); color: var(--k-muted); text-wrap: pretty; }\\n.k-section { display: flex; flex-direction: column; gap: var(--k-gap-s); min-width: 0; }\\n.k-section-h { margin: 0; font: 600 13px/20px var(--k-font); color: var(--k-ink); }\\n.k-stack { display: flex; flex-direction: column; gap: var(--k-gap); min-width: 0; }\\n.k-stack--s { gap: var(--k-gap-s); }\\n.k-row { display: flex; align-items: center; gap: var(--k-gap-s); min-width: 0; flex-wrap: wrap; }\\n.k-row--between { justify-content: space-between; }\\n.k-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(var(--k-min, 140px), 1fr)); gap: var(--k-gap-s); min-width: 0; }\\n.k-divider { height: 1px; background: var(--k-hair); border: 0; margin: 0; }\\n\\n/* ---- text ---- */\\n.k-h { margin: 0; font: 600 16px/24px var(--k-font); color: var(--k-ink); }\\n.k-h--l { font: 600 18px/26px var(--k-display); }\\n.k-body { margin: 0; font: 400 15px/24px var(--k-font); color: var(--k-body); text-wrap: pretty; overflow-wrap: anywhere; }\\n.k-caption { margin: 0; font: 400 12px/16px var(--k-font); color: var(--k-muted); }\\n.k-body code, .k-caption code, .k-mono { font-family: var(--k-mono); font-size: .88em; }\\n.k-body code { padding: 1px 4px; border-radius: var(--k-r-chip); background: var(--k-stage); }\\n.k-body strong { font-weight: 600; color: var(--k-ink); }\\n.k-chip { display: inline-flex; align-items: center; gap: 4px; height: 22px; padding: 0 8px; border-radius: var(--k-r-chip); background: var(--k-stage); color: var(--k-muted); font: 500 12px/16px var(--k-font); white-space: nowrap; flex: none; }\\n.k-chip--accent { background: var(--k-accent-tint); color: var(--k-accent-ink); }\\n.k-chip--ok { background: var(--k-ok-tint); color: var(--k-ok); }\\n.k-chip--warn { background: var(--k-warn-tint); color: var(--k-warn); }\\n.k-chip--bad { background: var(--k-bad-tint); color: var(--k-bad); }\\n.k-chip--info { background: var(--k-info-tint); color: var(--k-info); }\\n.k-link { display: inline; padding: 0; border: 0; background: none; color: var(--k-ink); font: inherit; text-decoration: underline; text-decoration-color: var(--k-line); text-decoration-thickness: 1px; text-underline-offset: 3px; cursor: pointer; text-align: left; }\\n.k-link:hover { text-decoration-color: var(--k-accent); }\\n.k-link .k-arr { color: var(--k-accent); width: 12px; height: 12px; margin-left: 2px; vertical-align: -1px; }\\n\\n/* ---- buttons: one primary a card ---- */\\n.k-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 40px; padding: 0 16px; border-radius: var(--k-r-pill); border: 1px solid transparent; font: 600 14px/20px var(--k-font); white-space: nowrap; text-decoration: none; transition: background-color var(--k-t-fast) var(--k-ease), border-color var(--k-t-fast) var(--k-ease), color var(--k-t-fast) var(--k-ease), opacity var(--k-t-fast); }\\n.k-btn--primary { background: var(--k-primary); color: var(--k-on-primary); }\\n.k-btn--primary:hover:not(:disabled) { opacity: .88; }\\n.k-btn--primary .k-arr { color: var(--k-f-on-primary-mark); }\\n.k-btn .k-arr { width: 15px; height: 15px; }\\n.k-btn--outline { background: var(--k-card); color: var(--k-ink); border-color: var(--k-line); }\\n.k-btn--outline:hover:not(:disabled) { border-color: var(--k-ink); }\\n.k-btn--quiet { background: none; color: var(--k-muted); padding: 0 10px; font-weight: 500; }\\n.k-btn--quiet:hover:not(:disabled) { color: var(--k-ink); background: var(--k-stage); }\\n.k-btn--icon { width: 32px; min-height: 32px; height: 32px; padding: 0; color: var(--k-muted); background: none; font-weight: 500; }\\n.k-btn--icon:hover:not(:disabled) { color: var(--k-ink); background: var(--k-stage); }\\n.k-btn--sm { min-height: 32px; padding: 0 12px; font-size: 13px; }\\n.k-btn:disabled { opacity: .4; cursor: default; }\\n.k-btn svg { width: 16px; height: 16px; flex: none; }\\n.k-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }\\n.k-actions > .k-btn--quiet:first-child { margin-left: -10px; }\\n\\n/* ---- segmented toggle, tabs ---- */\\n.k-seg { display: inline-flex; padding: 3px; gap: 2px; border-radius: var(--k-r-pill); background: var(--k-stage); flex: none; max-width: 100%; }\\n.k-seg button { min-height: 24px; padding: 0 12px; border: 0; border-radius: var(--k-r-pill); background: none; color: var(--k-muted); font: 500 12px/16px var(--k-font); white-space: nowrap; transition: background-color var(--k-t-fast), color var(--k-t-fast); }\\n.k-seg button:hover { color: var(--k-ink); }\\n.k-seg button[aria-pressed=\\\"true\\\"], .k-seg button[aria-selected=\\\"true\\\"] { background: var(--k-primary); color: var(--k-on-primary); font-weight: 600; }\\n.k-tabs { display: flex; flex-direction: column; gap: var(--k-gap); min-width: 0; }\\n.k-tablist { display: flex; gap: 4px; border-bottom: 1px solid var(--k-hair); overflow-x: auto; scrollbar-width: none; }\\n.k-tablist button { flex: none; min-height: 36px; padding: 0 12px; border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; background: none; color: var(--k-muted); font: 500 14px/20px var(--k-font); }\\n.k-tablist > button:first-child { padding-left: 0; }\\n.k-tablist button[aria-selected=\\\"true\\\"] { color: var(--k-ink); border-bottom-color: var(--k-accent); font-weight: 600; }\\n\\n/* ---- slider, text field ---- */\\n.k-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }\\n.k-field-top { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; }\\n.k-field label, .k-field .k-label { font: 500 13px/20px var(--k-font); color: var(--k-muted); }\\n.k-field output { font: 600 14px/20px var(--k-font); color: var(--k-ink); font-variant-numeric: tabular-nums; white-space: nowrap; }\\n.k-range { -webkit-appearance: none; appearance: none; width: 100%; height: 24px; margin: 0; background: none; cursor: pointer; --k-p: 50%; }\\n.k-range::-webkit-slider-runnable-track { height: 4px; border-radius: var(--k-r-pill); background: linear-gradient(to right, var(--k-ink) 0 var(--k-p), var(--k-hair) var(--k-p) 100%); }\\n.k-range::-moz-range-track { height: 4px; border-radius: var(--k-r-pill); background: var(--k-hair); }\\n.k-range::-moz-range-progress { height: 4px; border-radius: var(--k-r-pill); background: var(--k-ink); }\\n.k-range::-webkit-slider-thumb { -webkit-appearance: none; width: 20px; height: 20px; margin-top: -8px; border-radius: 50%; background: var(--k-card); border: 1px solid var(--k-line); box-shadow: 0 1px 3px rgba(0,0,0,.18); }\\n.k-range::-moz-range-thumb { width: 20px; height: 20px; border-radius: 50%; background: var(--k-card); border: 1px solid var(--k-line); box-shadow: 0 1px 3px rgba(0,0,0,.18); }\\n.k-range:focus-visible { outline: none; }\\n.k-range:focus-visible::-webkit-slider-thumb { outline: 2px solid var(--k-ring); outline-offset: 2px; }\\n.k-range:focus-visible::-moz-range-thumb { outline: 2px solid var(--k-ring); outline-offset: 2px; }\\n.k-input { width: 100%; min-height: 40px; padding: 8px 12px; border-radius: var(--k-r-box); border: 1px solid var(--k-line); background: var(--k-card); color: var(--k-ink); font: 400 14px/20px var(--k-font); }\\n.k-input:focus-visible { outline: 2px solid var(--k-ring); outline-offset: 0; border-color: transparent; }\\ntextarea.k-input { min-height: 88px; resize: vertical; }\\n.k-check { display: inline-flex; align-items: center; gap: 8px; min-height: 32px; font: 400 14px/20px var(--k-font); color: var(--k-body); cursor: pointer; }\\n.k-check input { width: 18px; height: 18px; margin: 0; accent-color: var(--k-ink); }\\n\\n/* ---- choice tiles and swatches (discrete choices; sliders only for continuous values) ---- */\\n.k-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--k-min, 112px), 1fr)); gap: 8px; min-width: 0; }\\n.k-tile { position: relative; display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; gap: 2px; min-height: 56px; padding: 10px 12px; border-radius: var(--k-r-box); border: 1px solid var(--k-hair); background: var(--k-card); text-align: left; min-width: 0; color: var(--k-ink); transition: border-color var(--k-t-fast), background-color var(--k-t-fast), box-shadow var(--k-t-fast); }\\n.k-tile:hover { border-color: var(--k-line); }\\n.k-tile b { font: 600 14px/20px var(--k-font); color: var(--k-ink); overflow-wrap: anywhere; }\\n.k-tile span { font: 400 12px/16px var(--k-font); color: var(--k-muted); overflow-wrap: anywhere; }\\n.k-tile[aria-pressed=\\\"true\\\"], .k-tile[aria-checked=\\\"true\\\"] { border-color: var(--k-ink); box-shadow: inset 0 0 0 1px var(--k-ink); }\\n.k-tiles--compact .k-tile { min-height: 0; padding: 6px 10px; }\\n.k-tile .k-icon { width: 20px; height: 20px; color: var(--k-accent); margin-bottom: 4px; }\\n.k-tile--swatch { padding: 0; overflow: hidden; gap: 0; min-height: 0; }\\n.k-tile--swatch .k-sw { display: block; width: 100%; height: 56px; }\\n.k-tile--swatch .k-swt { display: flex; flex-direction: column; padding: 8px 10px; gap: 0; }\\n.k-picked { display: flex; align-items: center; gap: 10px; min-height: 40px; }\\n.k-picked .k-sw { width: 28px; height: 28px; border-radius: var(--k-r-chip); background: var(--k-stage); border: 1px solid var(--k-hair); flex: none; }\\n.k-picked b { display: block; font: 600 14px/20px var(--k-font); }\\n.k-picked span { display: block; font: 400 12px/16px var(--k-font); color: var(--k-muted); }\\n\\n/* ---- stepper: the guided step card ---- */\\n.k-progress { display: flex; gap: 4px; min-width: 0; }\\n.k-progress button { flex: 1 1 0; min-width: 0; height: 16px; padding: 6px 0; border: 0; background: none; }\\n.k-progress button::before { content: \\\"\\\"; display: block; height: 4px; border-radius: var(--k-r-pill); background: var(--k-hair); transition: background-color var(--k-t) var(--k-ease); }\\n.k-progress button.is-done::before, .k-progress button[aria-current=\\\"step\\\"]::before { background: var(--k-accent); }\\n.k-stage { position: relative; display: flex; align-items: center; justify-content: center; height: var(--k-stage-h); border-radius: var(--k-r-box); background: var(--k-stage); overflow: hidden; min-width: 0; }\\n.k-stage > svg { display: block; width: 100%; height: 100%; }\\n.k-stage-wrap { display: flex; flex-direction: column; gap: 8px; min-width: 0; }\\n.k-steptext { display: grid; min-width: 0; }\\n.k-steptext > * { grid-area: 1 / 1; display: flex; flex-direction: column; gap: 4px; min-width: 0; transition: opacity var(--k-t) var(--k-ease); }\\n.k-steptext > [aria-hidden=\\\"true\\\"] { visibility: hidden; opacity: 0; }\\n.k-steptext .k-cite { font: 500 14px/20px var(--k-font); }\\n.k-tipbox { display: flex; gap: 8px; align-items: flex-start; margin-top: 4px; padding: 8px 12px; border-radius: var(--k-r-box); background: var(--k-stage); font: 400 14px/20px var(--k-font); color: var(--k-muted); }\\n.k-tipbox--more { display: block; padding: 6px 12px; }\\n.k-tipbox--more > summary { cursor: pointer; font-weight: 600; color: var(--k-ink); }\\n.k-tipbox--more[open] > summary { margin-bottom: 4px; }\\n.k-tipbox--more::before { display: none; }\\n.k-tipbox::before { content: \\\"\\\"; flex: none; width: 6px; height: 6px; margin-top: 7px; border-radius: 50%; background: var(--k-accent); }\\n.k-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 40px; }\\n.k-foot > .k-btn--quiet:first-child { margin-left: -10px; }\\n.k-foot .k-right { display: flex; align-items: center; gap: 4px; margin-left: auto; }\\n.k-dots { display: flex; gap: 6px; align-items: center; }\\n.k-dots i { width: 6px; height: 6px; border-radius: 50%; background: var(--k-line); }\\n.k-dots i.is-on { background: var(--k-ink); width: 16px; border-radius: var(--k-r-pill); }\\n.k-recap { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }\\n.k-recap li { position: relative; display: flex; gap: 10px; align-items: flex-start; font: 400 15px/24px var(--k-font); color: var(--k-body); }\\n.k-recap li::before { content: \\\"\\\"; flex: none; width: 20px; height: 20px; margin-top: 2px; border-radius: 50%; background: var(--k-accent-tint); }\\n.k-recap li::after { content: \\\"\\\"; position: absolute; left: 7px; top: 7px; width: 5px; height: 9px; border: solid var(--k-accent); border-width: 0 2px 2px 0; transform: rotate(45deg); }\\n.k-missed { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }\\n.k-missed li { position: relative; padding-left: 18px; font: 400 14px/22px var(--k-font); color: var(--k-body); }\\n.k-missed li::before { content: \\\"\\\"; position: absolute; left: 2px; top: 8px; width: 7px; height: 7px; border-radius: 50%; background: var(--k-bad); }\\n.k-fadein { animation: k-fade var(--k-t) var(--k-ease) both; }\\n@keyframes k-fade { from { opacity: 0; } to { opacity: 1; } }\\n\\n/* ---- comparison ---- */\\n.k-compare { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 8px; min-width: 0; }\\n.k-cmp { display: flex; flex-direction: column; gap: 8px; padding: 14px; border-radius: var(--k-r-box); background: var(--k-stage); border: 1px solid transparent; min-width: 0; }\\n.k-cmp.is-pick { background: var(--k-card); border-color: var(--k-ink); box-shadow: inset 0 0 0 1px var(--k-ink); }\\n/* The badge drops under a title that needs the room; a word is never broken to make space for it. */\\n.k-cmp-h { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: 4px 8px; }\\n.k-cmp-h b { font: 600 15px/22px var(--k-font); color: var(--k-ink); overflow-wrap: break-word; flex: 1 1 auto; min-width: min(100%, 8ch); }\\n.k-cmp ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }\\n.k-cmp li { position: relative; padding-left: 14px; font: 400 14px/20px var(--k-font); color: var(--k-body); }\\n.k-cmp li::before { content: \\\"\\\"; position: absolute; left: 0; top: 8px; width: 5px; height: 5px; border-radius: 50%; background: var(--k-line); }\\n.k-cmp.is-pick li::before { background: var(--k-accent); }\\n.k-cmp-v { margin: auto 0 0; padding-top: 8px; border-top: 1px solid var(--k-hair); font: 500 14px/20px var(--k-font); color: var(--k-ink); }\\n.k-proscons { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 8px; }\\n.k-pc { padding: 12px 14px; border-radius: var(--k-r-box); background: var(--k-stage); }\\n.k-pc h4 { margin: 0 0 6px; font: 600 13px/20px var(--k-font); display: flex; align-items: center; gap: 6px; }\\n.k-pc--pro h4 { color: var(--k-ok); } .k-pc--con h4 { color: var(--k-bad); }\\n.k-pc ul { margin: 0; padding: 0 0 0 16px; font: 400 14px/20px var(--k-font); color: var(--k-body); }\\n.k-pc li + li { margin-top: 4px; }\\n.k-matrix { width: 100%; border-collapse: collapse; font: 400 14px/20px var(--k-font); }\\n.k-matrix th, .k-matrix td { padding: 8px 6px; border-bottom: 1px solid var(--k-hair); text-align: center; }\\n.k-matrix th:first-child, .k-matrix td:first-child { text-align: left; padding-left: 0; }\\n.k-matrix thead th { font-weight: 600; color: var(--k-muted); font-size: 12px; }\\n.k-matrix tfoot td { font-weight: 600; color: var(--k-ink); border-bottom: 0; }\\n.k-matrix .is-best { color: var(--k-accent-ink); }\\n.k-matrix input[type=range] { width: 72px; }\\n.k-score { display: inline-block; min-width: 24px; padding: 0 6px; border-radius: var(--k-r-chip); background: var(--k-stage); font-variant-numeric: tabular-nums; }\\n\\n/* ---- data ---- */\\n.k-bento { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 8px; min-width: 0; }\\n.k-bento > * { min-width: 0; }\\n.k-bento .k-span2 { grid-column: span 2; }\\n.k-bento .k-spanall { grid-column: 1 / -1; }\\n.k-stat { display: flex; flex-direction: column; gap: 2px; padding: 12px 14px; border-radius: var(--k-r-box); background: var(--k-stage); min-width: 0; }\\n.k-stat .k-stat-l { font: 500 12px/16px var(--k-font); color: var(--k-muted); }\\n.k-stat .k-stat-v { font: 600 18px/26px var(--k-font); color: var(--k-ink); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }\\n.k-stat .k-stat-h { font: 400 12px/16px var(--k-font); color: var(--k-muted); }\\n.k-stat--ok .k-stat-v { color: var(--k-ok); } .k-stat--bad .k-stat-v { color: var(--k-bad); } .k-stat--accent .k-stat-v { color: var(--k-accent); }\\n.k-big { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\\n.k-big .k-big-v { margin: 0; font: 600 36px/44px var(--k-display); letter-spacing: -0.02em; color: var(--k-ink); font-variant-numeric: tabular-nums; }\\n.k-big .k-big-l { margin: 0; font: 400 13px/20px var(--k-font); color: var(--k-muted); }\\n.k-chart { display: flex; flex-direction: column; gap: 8px; min-width: 0; }\\n.k-chart svg { display: block; width: 100%; height: auto; overflow: visible; }\\n.k-chart .k-ax { stroke: var(--k-hair); stroke-width: 1; }\\n.k-chart .k-axt { font: 400 11px var(--k-font); fill: var(--k-muted); }\\n.k-chart .k-bar { transition: height var(--k-t) var(--k-ease), y var(--k-t) var(--k-ease); }\\n.k-chart .k-ln { fill: none; stroke-width: 2.25; stroke-linejoin: round; stroke-linecap: round; }\\n.k-chart .k-area { opacity: .14; }\\n.k-chart .k-val { font: 600 11px var(--k-font); fill: var(--k-ink); }\\n.k-legend { display: flex; flex-wrap: wrap; gap: 4px 14px; font: 400 12px/16px var(--k-font); color: var(--k-muted); }\\n.k-legend i { display: inline-block; width: 8px; height: 8px; border-radius: var(--k-r-chip); margin-right: 6px; vertical-align: 0; }\\n.k-timeline { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }\\n.k-timeline li { position: relative; display: grid; grid-template-columns: 16px 1fr; column-gap: 12px; padding-bottom: 14px; }\\n.k-timeline li::before { content: \\\"\\\"; grid-column: 1; grid-row: 1 / span 3; justify-self: center; width: 2px; background: var(--k-hair); margin-top: 14px; }\\n.k-timeline li:last-child::before { display: none; }\\n.k-timeline .k-tdot { position: absolute; left: 3px; top: 5px; width: 10px; height: 10px; border-radius: 50%; background: var(--k-card); border: 2px solid var(--k-line); }\\n.k-timeline li.is-on .k-tdot { border-color: var(--k-accent); background: var(--k-accent); }\\n.k-timeline .k-tl { grid-column: 2; font: 600 12px/20px var(--k-font); color: var(--k-muted); letter-spacing: .02em; }\\n.k-timeline .k-tt { grid-column: 2; font: 600 14px/20px var(--k-font); color: var(--k-ink); }\\n.k-timeline .k-tx { grid-column: 2; font: 400 14px/20px var(--k-font); color: var(--k-body); margin-top: 2px; }\\n.k-tablewrap { overflow-x: auto; min-width: 0; border-radius: var(--k-r-box); border: 1px solid var(--k-hair); }\\n.k-table { width: 100%; border-collapse: collapse; font: 400 14px/20px var(--k-font); font-variant-numeric: tabular-nums; }\\n.k-table th { text-align: left; font: 600 12px/16px var(--k-font); color: var(--k-muted); background: var(--k-stage); padding: 8px 12px; white-space: nowrap; }\\n.k-table td { padding: 8px 12px; border-top: 1px solid var(--k-hair); color: var(--k-body); vertical-align: top; }\\n.k-table .is-num { text-align: right; }\\n.k-table tr.is-pick td { background: var(--k-accent-tint); }\\n\\n/* ---- notes ---- */\\n.k-callout { display: flex; gap: 10px; padding: 12px 14px; border-radius: var(--k-r-box); background: var(--k-stage); min-width: 0; }\\n.k-callout svg { flex: none; width: 18px; height: 18px; margin-top: 1px; color: var(--k-muted); }\\n.k-callout b { display: block; font: 600 14px/20px var(--k-font); color: var(--k-ink); }\\n.k-callout p { margin: 0; font: 400 14px/20px var(--k-font); color: var(--k-body); }\\n.k-callout--tip svg { color: var(--k-accent); }\\n.k-callout--warning { background: var(--k-warn-tint); } .k-callout--warning svg { color: var(--k-warn); }\\n.k-callout--success { background: var(--k-ok-tint); } .k-callout--success svg { color: var(--k-ok); }\\n.k-callout--info svg { color: var(--k-info); }\\n.k-sources { display: flex; flex-direction: column; gap: 6px; min-width: 0; }\\n.k-sources-h { margin: 0; font: 600 12px/16px var(--k-font); color: var(--k-muted); letter-spacing: .04em; text-transform: uppercase; }\\n.k-sources ol { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; counter-reset: k-src; }\\n.k-sources li { display: flex; gap: 8px; align-items: baseline; counter-increment: k-src; min-width: 0; font: 400 14px/20px var(--k-font); }\\n.k-sources li::before { content: counter(k-src); flex: none; width: 18px; height: 18px; border-radius: 50%; background: var(--k-stage); color: var(--k-muted); font: 600 11px/18px var(--k-font); text-align: center; }\\n.k-sources .k-link { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }\\n.k-sources .k-src-m { color: var(--k-muted); white-space: nowrap; flex: none; }\\n.k-provenance { display: inline-flex; align-items: center; gap: 6px; font: 500 12px/16px var(--k-font); color: var(--k-muted); }\\n.k-provenance::before { content: \\\"\\\"; width: 6px; height: 6px; border-radius: 50%; background: var(--k-faint); }\\n.k-provenance--guide::before { background: var(--k-accent); }\\n\\n/* ---- diagram scenes ---- */\\n.k-scene { overflow: visible; }\\n.k-scene text { font-family: var(--k-font); font-size: calc(13px * var(--k-k, 1)); fill: var(--k-muted); }\\n.k-scene .lbl { fill: var(--k-ink); font-weight: 600; font-size: calc(14px * var(--k-k, 1)); }\\n.k-scene .mono { font-family: var(--k-mono); font-size: calc(13px * var(--k-k, 1)); }\\n.k-scene .sub { font-size: calc(13px * var(--k-k, 1)); fill: var(--k-muted); font-weight: 400; }\\n.k-scene .shape { fill: var(--k-card); stroke: var(--k-hair); stroke-width: 1; transition: fill var(--k-t), stroke var(--k-t); }\\n.k-scene .fold { fill: none; stroke: var(--k-line); stroke-width: 1.25; }\\n.k-scene .rule { stroke: var(--k-hair); stroke-width: 2; stroke-linecap: round; }\\n.k-scene .mark { fill: var(--k-card); stroke: var(--k-line); stroke-width: 1.5; }\\n.k-scene .lane { fill: var(--k-stage); stroke: var(--k-hair); stroke-width: 1; }\\n.k-scene .bar { fill: var(--k-raised); }\\n.k-scene .line { stroke: var(--k-faint); stroke-width: 1.5; fill: none; stroke-linecap: round; }\\n.k-scene .line.thin { stroke-width: 1; } .k-scene .line.dash { stroke-dasharray: 4 4; }\\n.k-scene .head { fill: var(--k-faint); }\\n.k-scene .dot { fill: var(--k-faint); }\\n.k-scene .elabel { paint-order: stroke; stroke: var(--k-stage); stroke-width: 5px; stroke-linejoin: round; fill: var(--k-muted); }\\n.k-scene .st-focus .shape, .k-scene .st-new .shape, .k-scene .st-focus .bar, .k-scene .st-new .bar { fill: var(--k-ink); stroke: none; }\\n.k-scene .st-focus .in, .k-scene .st-new .in { fill: var(--k-on-primary); }\\n.k-scene .st-focus .fold, .k-scene .st-new .fold { stroke: var(--k-on-primary); }\\n.k-scene .st-focus .lane, .k-scene .st-new .lane { fill: var(--k-stage); stroke: var(--k-hair); stroke-width: 1; }\\n.k-scene .st-focus .line, .k-scene .st-new .line { stroke: var(--k-accent); stroke-width: 2; }\\n.k-scene .st-focus .head, .k-scene .st-new .head, .k-scene .st-focus .dot, .k-scene .st-new .dot { fill: var(--k-accent); }\\n.k-scene .st-focus .mark, .k-scene .st-new .mark { fill: var(--k-accent); stroke: var(--k-accent); }\\n.k-scene .st-focus .rule, .k-scene .st-new .rule { stroke: var(--k-accent); opacity: .45; }\\n.k-scene .st-ok .shape, .k-scene .st-ok .bar { stroke: var(--k-ok); fill: var(--k-ok-tint); stroke-width: 1.75; } .k-scene .st-ok .dot { fill: var(--k-ok); }\\n.k-scene .st-bad .shape, .k-scene .st-bad .bar { stroke: var(--k-bad); fill: var(--k-bad-tint); stroke-width: 1.75; } .k-scene .st-bad .dot { fill: var(--k-bad); }\\n/* A muted secondary palette for context in pictures (docs/mcp-app-design.md, section 1): soft fills, never the accent. */\\n.k-scene .tone-blue:not(.st-focus):not(.st-new):not(.st-ok):not(.st-bad) .shape { fill: var(--k-t-blue); stroke: var(--k-t-blue-s); }\\n.k-scene .tone-blue .glyph { stroke: var(--k-t-blue-s); }\\n.k-scene .tone-orange:not(.st-focus):not(.st-new):not(.st-ok):not(.st-bad) .shape { fill: var(--k-t-orange); stroke: var(--k-t-orange-s); }\\n.k-scene .tone-orange .glyph { stroke: var(--k-t-orange-s); }\\n.k-scene .tone-green:not(.st-focus):not(.st-new):not(.st-ok):not(.st-bad) .shape { fill: var(--k-t-green); stroke: var(--k-t-green-s); }\\n.k-scene .tone-green .glyph { stroke: var(--k-t-green-s); }\\n.k-scene .tone-violet:not(.st-focus):not(.st-new):not(.st-ok):not(.st-bad) .shape { fill: var(--k-t-violet); stroke: var(--k-t-violet-s); }\\n.k-scene .tone-violet .glyph { stroke: var(--k-t-violet-s); }\\n.k-scene .tone-sand:not(.st-focus):not(.st-new):not(.st-ok):not(.st-bad) .shape { fill: var(--k-t-sand); stroke: var(--k-t-sand-s); }\\n.k-scene .tone-sand .glyph { stroke: var(--k-t-sand-s); }\\n.k-scene .tone-teal:not(.st-focus):not(.st-new):not(.st-ok):not(.st-bad) .shape { fill: var(--k-t-teal); stroke: var(--k-t-teal-s); }\\n.k-scene .tone-teal .glyph { stroke: var(--k-t-teal-s); }\\n.k-scene .glyph { fill: none; stroke: var(--k-muted); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }\\n.k-scene .st-focus .glyph, .k-scene .st-new .glyph { stroke: var(--k-on-primary); }\\n.k-scene .st-dim { opacity: .5; } .k-scene .st-off { opacity: .2; } .k-scene .st-gone { opacity: .55; }\\n.k-scene .strike { stroke: var(--k-bad); stroke-width: 2; stroke-linecap: round; }\\n.k-scene .st-new { animation: k-enter var(--k-t) var(--k-ease) both; }\\n.k-scene .st-new .line { stroke-dasharray: 600; animation: k-draw var(--k-t-slow) var(--k-ease) both; }\\n.k-scene .st-gone .strike { stroke-dasharray: 400; animation: k-draw var(--k-t-slow) var(--k-ease) both; }\\n.k-scene .badge { fill: var(--k-accent); } .k-scene .badge-t { fill: var(--k-on-primary); font-size: calc(13px * var(--k-k, 1)); font-weight: 700; }\\n.k-scene .co { cursor: pointer; }\\n.k-scene .co circle { fill: var(--k-card); stroke: var(--k-hair); stroke-width: 1; transition: fill var(--k-t), stroke var(--k-t); }\\n.k-scene .co text { font-size: calc(13px * var(--k-k, 1)); font-weight: 600; fill: var(--k-muted); font-variant-numeric: tabular-nums; }\\n.k-scene .co.on circle { fill: var(--k-ink); stroke: none; } .k-scene .co.on text { fill: var(--k-on-primary); }\\n.k-scene .co:focus { outline: none; } .k-scene .co:focus-visible circle { stroke: var(--k-ring); stroke-width: 2.5; }\\n.k-scene .hot { cursor: pointer; } .k-scene .hot:focus { outline: none; }\\n.k-scene .hot:hover .shape, .k-scene .hot:focus-visible .shape { stroke: var(--k-ring); stroke-width: 2; }\\n@keyframes k-enter { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }\\n@keyframes k-draw { from { stroke-dashoffset: 600; } to { stroke-dashoffset: 0; } }\\n/* A chapter's own Mermaid diagram (beautiful-mermaid). The step frames the current edge; the whole picture shows on Expand.\\n Absolute, because a percentage height inside the stage's flex row collapses to nothing. */\\n.k-mermaid { position: absolute; inset: 0; min-width: 0; }\\n.k-mermaid svg { width: 100%; height: 100%; display: block; }\\n.k-mermaid.is-step [data-from] { opacity: .35; }\\n.k-mermaid.is-step [data-from].is-current { opacity: 1; }\\n.k-mermaid.is-step [data-id] { opacity: .5; }\\n.k-mermaid.is-step [data-id].is-end { opacity: 1; }\\n.k-mermaid [data-id].is-accent > :where(rect, polygon, ellipse, path) { stroke: var(--k-accent); }\\n.k-mermaid:not(.is-step) [data-id].is-quiet { opacity: .72; }\\n.k-mermaid [data-id].is-end > :where(rect, polygon, ellipse) { fill: var(--k-accent-tint); stroke: var(--k-accent); }\\n.k-mermaid [data-from].is-current,\\n.k-mermaid [data-from].is-current :where(path, line, polygon, polyline) { stroke: var(--k-accent); }\\n\\n/* ---- map explorer ---- */\\n.k-map { position: relative; border-radius: var(--k-r-box); background: var(--k-stage); overflow: hidden; min-width: 0; }\\n.k-map svg { display: block; width: 100%; height: auto; }\\n.k-map-tools { position: absolute; left: 10px; right: 10px; top: 10px; display: flex; justify-content: space-between; gap: 8px; pointer-events: none; }\\n.k-map-tools > * { pointer-events: auto; }\\n.k-map-chip { display: inline-flex; align-items: center; gap: 4px; min-height: 28px; padding: 0 10px; border-radius: var(--k-r-pill); border: 1px solid var(--k-hair); background: var(--k-card); color: var(--k-ink); font: 500 12px/16px var(--k-font); box-shadow: 0 1px 2px rgba(0,0,0,.06); }\\n.k-map-chip svg { width: 14px; height: 14px; }\\nselect.k-map-chip { -webkit-appearance: none; appearance: none; padding-right: 26px; }\\n.k-selwrap { position: relative; display: inline-flex; }\\n.k-selwrap::after { content: \\\"\\\"; position: absolute; right: 11px; top: 50%; width: 5px; height: 5px; margin-top: -4px; border: solid var(--k-muted); border-width: 0 1.5px 1.5px 0; transform: rotate(45deg); pointer-events: none; }\\n.k-map .k-route { fill: none; stroke: var(--k-hair); stroke-width: 1.5; stroke-linecap: round; }\\n.k-map .k-route.is-done { stroke: var(--k-ink); }\\n.k-map .k-route.is-plan { stroke: var(--k-ink); stroke-dasharray: 1 5; stroke-width: 1.5; }\\n.k-map .k-region { fill: var(--k-card); stroke: var(--k-hair); stroke-width: 1; }\\n.k-map .k-region-t { font: 600 10.5px var(--k-font); fill: var(--k-faint); letter-spacing: .08em; text-transform: uppercase; }\\n.k-map .k-stop { cursor: pointer; }\\n.k-map .k-stop circle { fill: var(--k-card); stroke: var(--k-hair); stroke-width: 1; transition: r var(--k-t) var(--k-ease), fill var(--k-t); }\\n.k-map .k-stop text { font: 600 13px var(--k-font); fill: var(--k-muted); font-variant-numeric: tabular-nums; pointer-events: none; }\\n.k-map .k-stop .k-stop-l { font: 500 13px var(--k-font); fill: var(--k-body); paint-order: stroke; stroke: var(--k-stage); stroke-width: 4px; stroke-linejoin: round; }\\n.k-map .k-stop.is-done circle { fill: var(--k-ink); stroke: none; }\\n.k-map .k-stop.is-done text { fill: var(--k-on-primary); }\\n.k-map .k-stop-tick { fill: none; stroke: var(--k-on-primary); stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }\\n.k-map .k-stop.is-plan circle { stroke: var(--k-ink); stroke-width: 2; }\\n.k-map .k-stop.is-on circle { fill: var(--k-ink); stroke: var(--k-ink); }\\n.k-map .k-stop.is-on text:not(.k-stop-l) { fill: var(--k-card); }\\n.k-map .k-stop.is-on .k-stop-l { fill: var(--k-ink); font-weight: 600; }\\n.k-map .k-stop.is-far { opacity: .42; }\\n.k-map .k-stop-name { pointer-events: none; }\\n.k-map .k-stop-name rect { fill: none; stroke: none; }\\n.k-map .k-stop-name text { font: 600 13px var(--k-font); fill: var(--k-ink); paint-order: stroke; stroke: var(--k-stage); stroke-width: 5px; stroke-linejoin: round; }\\n.k-map .k-stop-name.is-picked rect { fill: none; stroke: none; }\\n.k-map .k-stop-name.is-picked text { fill: var(--k-ink); font-weight: 600; }\\n.k-map .k-stop:focus { outline: none; } .k-map .k-stop:focus-visible circle { stroke: var(--k-ring); stroke-width: 3; }\\n.k-detail { display: flex; flex-direction: column; gap: 10px; min-width: 0; }\\n.k-detail-h { display: flex; flex-direction: column; gap: 2px; }\\n.k-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; font: 400 12px/16px var(--k-font); color: var(--k-muted); }\\n.k-meta > span { display: inline-flex; align-items: center; gap: 4px; }\\n.k-meta svg { width: 13px; height: 13px; }\\n.k-kv { display: flex; flex-direction: column; gap: 2px; }\\n.k-kv b { font: 600 13px/20px var(--k-font); color: var(--k-ink); }\\n.k-kv p { margin: 0; font: 400 14px/22px var(--k-font); color: var(--k-body); }\\n.k-strip { display: flex; gap: 8px; overflow-x: auto; scrollbar-width: none; margin: 0 calc(-1 * var(--k-pad)); padding: 0 var(--k-pad); scroll-padding: var(--k-pad); }\\n.k-strip > * { flex: none; }\\n\\n/* ---- quiz ---- */\\n.k-q { margin: 0; font: 600 16px/24px var(--k-font); color: var(--k-ink); text-wrap: pretty; overflow-wrap: anywhere; }\\n.k-options { display: flex; flex-direction: column; gap: 8px; min-width: 0; }\\n.k-option { display: flex; align-items: flex-start; gap: 12px; width: 100%; min-height: 44px; padding: 10px 12px; border-radius: var(--k-r-box); border: 1px solid var(--k-hair); background: var(--k-card); color: var(--k-ink); text-align: left; font: 400 14px/20px var(--k-font); transition: border-color var(--k-t-fast), background-color var(--k-t-fast); }\\n.k-option:hover:not(:disabled) { border-color: var(--k-line); background: var(--k-stage); }\\n.k-option .k-key { flex: none; width: 22px; height: 22px; border-radius: 50%; border: 1px solid var(--k-line); display: inline-flex; align-items: center; justify-content: center; font: 600 11px/1 var(--k-font); color: var(--k-muted); margin-top: -1px; }\\n.k-option > span:last-child { min-width: 0; overflow-wrap: anywhere; padding-top: 0; }\\n.k-option.is-right { border-color: var(--k-ok); background: var(--k-ok-tint); }\\n.k-option.is-right .k-key { background: var(--k-ok); border-color: var(--k-ok); color: var(--k-card); }\\n.k-option.is-wrong { border-color: var(--k-bad); background: var(--k-bad-tint); }\\n.k-option.is-wrong .k-key { background: var(--k-bad); border-color: var(--k-bad); color: var(--k-card); }\\n.k-option:disabled { cursor: default; }\\n.k-option.is-picked { border-color: var(--k-ink); box-shadow: inset 0 0 0 1px var(--k-ink); }\\n.k-why { display: flex; flex-direction: column; gap: 4px; padding: 10px 12px; border-radius: var(--k-r-box); background: var(--k-stage); }\\n.k-why b { font: 600 14px/20px var(--k-font); }\\n.k-why b.is-right { color: var(--k-ok); } .k-why b.is-wrong { color: var(--k-bad); }\\n.k-why p { margin: 0; font: 400 14px/20px var(--k-font); color: var(--k-body); }\\n.k-ring { display: block; flex: none; }\\n.k-ring .track { fill: none; stroke: var(--k-hair); }\\n.k-ring .val { fill: none; stroke: var(--k-accent); stroke-linecap: round; transform: rotate(-90deg); transform-origin: 50% 50%; transition: stroke-dashoffset .8s var(--k-ease); }\\n.k-ring text { font-family: var(--k-display); font-weight: 600; fill: var(--k-ink); }\\n.k-ring .k-ring-s { font-family: var(--k-font); font-weight: 400; fill: var(--k-muted); }\\n.k-result { display: flex; align-items: center; gap: 20px; min-width: 0; }\\n.k-flash { position: relative; display: flex; flex-direction: column; justify-content: center; min-height: 160px; padding: 20px; border-radius: var(--k-r-box); background: var(--k-stage); border: 0; text-align: left; width: 100%; color: var(--k-ink); }\\n.k-flash .k-flash-side { font: 600 11px/16px var(--k-font); letter-spacing: .06em; text-transform: uppercase; color: var(--k-muted); margin-bottom: 6px; }\\n.k-flash .k-flash-t { font: 500 16px/24px var(--k-font); }\\n.k-flash .k-flash-q { font: 600 14px/20px var(--k-font); color: var(--k-muted); margin-bottom: 4px; }\\n.k-flash.is-back { background: var(--k-accent-tint); }\\n\\n/* ---- code ---- */\\n.k-code { position: relative; margin: 0; border-radius: var(--k-r-box); background: var(--k-stage); min-width: 0; }\\n.k-code-h { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 6px 6px 0 12px; font: 500 12px/16px var(--k-font); color: var(--k-muted); }\\n.k-code pre { margin: 0; padding: 10px 12px 12px; overflow-x: auto; font: 400 12.5px/20px var(--k-mono); color: var(--k-ink); white-space: pre; tab-size: 2; }\\n\\n/* ---- A2UI surfaces ---- */\\n.k-a2 { min-width: 0; }\\n.k-a2-row { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px; min-width: 0; }\\n.k-a2-row > * { min-width: 0; }\\n.k-a2-row > .k-stat, .k-a2-row > .k-field { flex: 1 1 140px; }\\n.k-a2-panel { display: flex; flex-direction: column; gap: 8px; padding: 14px; border-radius: var(--k-r-box); background: var(--k-stage); min-width: 0; }\\n.k-a2-dialog { border: 1px solid var(--k-hair); border-radius: var(--k-r-card); background: var(--k-card); color: var(--k-ink); padding: 20px; max-width: min(560px, 92vw); box-shadow: var(--k-shadow); }\\n.k-a2-dialog::backdrop { background: rgba(0,0,0,.35); }\\n.k-a2-icon { display: inline-flex; color: var(--k-accent); }\\n.k-a2-media { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border-radius: var(--k-r-box); border: 1px dashed var(--k-line); font: 400 14px/20px var(--k-font); color: var(--k-body); }\\n.k-a2-media svg { width: 18px; height: 18px; color: var(--k-muted); }\\n.k-a2-err:empty { display: none; }\\n.k-a2-err { color: var(--k-bad); }\\n.k-clamp { position: relative; overflow: hidden; }\\n.k-clamp::after { content: \\\"\\\"; position: absolute; left: 0; right: 0; bottom: 0; height: 48px; background: linear-gradient(to bottom, transparent, var(--k-card)); pointer-events: none; }\\n\\n/* ---- states ---- */\\n.k-empty { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; padding: 8px 0; }\\n.k-empty svg { width: 40px; height: 40px; color: var(--k-faint); }\\n.k-error { display: flex; gap: 10px; padding: 12px 14px; border-radius: var(--k-r-box); background: var(--k-bad-tint); color: var(--k-ink); font: 400 14px/20px var(--k-font); }\\n.k-error svg { flex: none; width: 18px; height: 18px; color: var(--k-bad); margin-top: 1px; }\\n.k-error p { margin: 0; }\\n.k-copybox { margin: 6px 0 0; padding: 8px 10px; border-radius: var(--k-r-chip); background: var(--k-card); font: 400 12px/18px var(--k-mono); white-space: pre-wrap; overflow-wrap: anywhere; user-select: all; }\\n/* In a card's tools the keep button overhangs the head row a little, so a card without other tools keeps its height. */\\n.k-tools > .k-keep-btn { margin: -2px 0; }\\n.k-keep { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }\\n.k-keep-out:empty { display: none; }\\n.k-keep-out { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; max-width: 100%; }\\n.k-keep-out .k-copybox { max-width: 100%; background: var(--k-stage); }\\n.k-status { margin: 8px 4px 0; font: 400 12px/16px var(--k-font); color: var(--k-muted); min-height: 0; }\\n.k-status:empty { display: none; }\\n.k-skel { display: flex; flex-direction: column; gap: 12px; }\\n.k-skel i { display: block; height: 12px; border-radius: var(--k-r-pill); background: var(--k-stage); }\\n.k-skel i:nth-child(1) { width: 30%; } .k-skel i:nth-child(2) { width: 70%; height: 20px; } .k-skel i:nth-child(3) { height: 160px; border-radius: var(--k-r-box); } .k-skel i:nth-child(4) { width: 85%; }\\n.k-nowrap { white-space: nowrap; }\\n.k-icon { display: inline-block; width: 16px; height: 16px; flex: none; }\\n\\n/* ---- wide: a step card 600px or more puts the picture and its words side by side, so the picture fills its stage ---- */\\n@container kit (min-width: 600px) {\\n .k-card--steps { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); column-gap: 24px; row-gap: 12px; align-items: start; }\\n .k-card--steps > .k-head, .k-card--steps > .k-progress, .k-card--steps > .k-foot, .k-card--steps > .k-stack { grid-column: 1 / -1; }\\n .k-card--steps > .k-stage-wrap { grid-column: 1; --k-stage-h: 224px; }\\n .k-card--steps > .k-steptext { grid-column: 2; align-self: center; }\\n .k-app--full .k-card--steps > .k-stage-wrap { --k-stage-h: 300px; }\\n}\\n/* ---- wide: the map explorer puts the picked stop's story beside the map ---- */\\n@container kit (min-width: 600px) {\\n .k-mapx { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); column-gap: 20px; align-items: start; }\\n}\\n/* ---- narrow: a 400px card (a container query: the card's own width, not the window's) ---- */\\n@container kit (max-width: 470px) {\\n .k-card { --k-pad: 16px; --k-stage-h: 150px; }\\n .k-card--steps { gap: 12px; }\\n .k-sub--wide { display: none; }\\n /* Three or more options stack, the pick first: nothing in a card ever scrolls sideways. */\\n .k-compare--many { grid-template-columns: 1fr; }\\n .k-title { font-size: 18px; line-height: 24px; }\\n .k-body { font-size: 14px; line-height: 22px; }\\n .k-recap li, .k-missed li { font-size: 14px; line-height: 22px; }\\n .k-big .k-big-v { font-size: 30px; line-height: 38px; }\\n .k-option { min-height: 40px; padding: 8px 10px; }\\n .k-q { font-size: 15px; line-height: 22px; }\\n}\\n\\n/* ---- framing: the camera holds the step's subject; context fades at the stage's edge ---- */\\n.k-scene.k-zoom { -webkit-mask-image: linear-gradient(to right, transparent 0, #000 16px, #000 calc(100% - 16px), transparent 100%), linear-gradient(to bottom, transparent 0, #000 16px, #000 calc(100% - 16px), transparent 100%); -webkit-mask-composite: source-in; mask-image: linear-gradient(to right, transparent 0, #000 16px, #000 calc(100% - 16px), transparent 100%), linear-gradient(to bottom, transparent 0, #000 16px, #000 calc(100% - 16px), transparent 100%); mask-composite: intersect; }\\n.k-scene.k-zoom.k-tight .sub { display: none; }\\n.k-scene.k-zoom.k-tight .it:not(.st-new):not(.st-focus):not(.st-gone):not(.st-bad):not(.st-ok) text { display: none; }\\n.k-app [tabindex=\\\"-1\\\"]:focus { outline: none; }\\n\\n/* compact.css */\\n/* compactStatus (src/compact.js): the card kept in view. Self-contained: it reads only the kit's tokens, so a page that\\n doesn't carry the kit's components can inline this file alone and map the tokens to its own. */\\n.k-card.k-compact { --k-pad: 16px; display: flex; flex-direction: column; gap: 8px; box-sizing: border-box; min-width: 0; max-width: 100%; padding: 16px; border-radius: var(--k-r-card); border: 1px solid var(--k-hair); background: var(--k-card); color: var(--k-ink); box-shadow: var(--k-shadow); font: 400 14px/20px var(--k-font); text-align: left; overflow: hidden; }\\n.k-card.k-compact--fill { height: 100%; border: 0; border-radius: 0; box-shadow: none; }\\n.k-card.k-compact--dense { padding: 12px 16px; }\\n.k-compact *, .k-compact *::before, .k-compact *::after { box-sizing: border-box; }\\n.k-compact .k-sr { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }\\n.k-compact .k-cs-eyebrow { margin: 0; font: 600 12px/16px var(--k-font); letter-spacing: .06em; text-transform: uppercase; color: var(--k-accent); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\\n.k-compact .k-cs-head { display: flex; align-items: center; gap: 8px; min-width: 0; }\\n.k-compact .k-cs-title { flex: 1 1 auto; min-width: 0; margin: 0; font: 600 15px/22px var(--k-font); color: var(--k-ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\\n.k-compact .k-cs-chip { display: inline-flex; align-items: center; flex: none; height: 22px; padding: 0 8px; border-radius: var(--k-r-chip); background: var(--k-stage); color: var(--k-muted); font: 500 12px/16px var(--k-font); white-space: nowrap; }\\n.k-compact .k-cs-chip.k-chip--ok { background: var(--k-ok-tint); color: var(--k-ok); }\\n.k-compact .k-cs-chip.k-chip--bad { background: var(--k-bad-tint); color: var(--k-bad); }\\n.k-compact .k-cs-chip.k-chip--warn { background: var(--k-warn-tint); color: var(--k-warn); }\\n.k-compact .k-cs-chip.k-chip--info { background: var(--k-info-tint); color: var(--k-info); }\\n.k-compact .k-cs-steps { display: flex; gap: 4px; margin: 0; padding: 0; list-style: none; min-width: 0; }\\n.k-compact .k-cs-step { position: relative; flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 4px; }\\n.k-compact .k-cs-bar { display: block; height: 4px; border-radius: var(--k-r-pill); background: var(--k-hair); }\\n.k-compact .k-cs-step.is-done .k-cs-bar { background: var(--k-ok); }\\n.k-compact .k-cs-step.is-now .k-cs-bar { background: var(--k-accent); }\\n.k-compact .k-cs-step.is-bad .k-cs-bar { background: var(--k-bad); }\\n.k-compact .k-cs-name { font: 500 12px/16px var(--k-font); color: var(--k-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\\n.k-compact .k-cs-step.is-now .k-cs-name { color: var(--k-ink); font-weight: 600; }\\n.k-compact .k-cs-line { display: flex; align-items: baseline; gap: 12px; min-width: 0; }\\n.k-compact .k-cs-status { flex: 1 1 auto; min-width: 0; margin: 0; font: 400 14px/20px var(--k-font); color: var(--k-body); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\\n.k-compact .k-cs-link { flex: none; padding: 0; border: 0; background: none; color: var(--k-ink); font: 500 14px/20px var(--k-font); text-decoration: underline; text-decoration-color: var(--k-line); text-underline-offset: 3px; cursor: pointer; white-space: nowrap; }\\n.k-compact .k-cs-link:hover { text-decoration-color: var(--k-accent); }\\n.k-compact .k-cs-actions { display: flex; gap: 8px; align-items: center; justify-content: flex-start; min-width: 0; margin-top: auto; }\\n.k-compact .k-cs-btn { display: inline-flex; align-items: center; justify-content: center; min-height: 40px; min-width: 0; padding: 0 16px; border-radius: var(--k-r-pill); border: 1px solid var(--k-line); background: var(--k-card); color: var(--k-ink); font: 600 14px/20px var(--k-font); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; }\\n.k-compact .k-cs-btn:hover:not(:disabled) { border-color: var(--k-ink); }\\n.k-compact .k-cs-btn--primary { border-color: transparent; background: var(--k-primary); color: var(--k-on-primary); }\\n.k-compact .k-cs-btn--primary:hover:not(:disabled) { border-color: transparent; opacity: .88; }\\n.k-compact .k-cs-btn:disabled { opacity: .4; cursor: default; }\\n.k-compact .k-cs-link:focus-visible, .k-compact .k-cs-btn:focus-visible { outline: 2px solid var(--k-ring); outline-offset: 2px; }\\n.k-compact .k-cs-btn[aria-busy=\\\"true\\\"] { gap: 8px; opacity: .72; cursor: progress; }\\n.k-compact .k-cs-spin { display: inline-block; flex: none; width: 14px; height: 14px; border-radius: 50%; border: 2px solid currentColor; border-right-color: transparent; animation: k-cs-spin 800ms linear infinite; }\\n@keyframes k-cs-spin { to { transform: rotate(360deg); } }\\n@media (prefers-reduced-motion: reduce) { .k-compact .k-cs-spin { animation: none; } }\\n\";\nexport const KIT_SCRIPT = \"var Kit = (function () {\\n\\\"use strict\\\";\\nvar K = { VERSION: \\\"1.0.0\\\" };\\n/* dom.js */\\n/* ---- DOM: text is set with textContent only; never innerHTML ---- */\\nvar SVGNS = \\\"http://www.w3.org/2000/svg\\\";\\nvar uidN = 0;\\nfunction uid(p) { uidN++; return \\\"k-\\\" + (p || \\\"x\\\") + \\\"-\\\" + uidN; }\\nfunction el(tag, cls, text) { var n = document.createElement(tag); if (cls) n.className = cls; if (text != null) n.textContent = String(text); return n; }\\nfunction add(parent) { for (var i = 1; i < arguments.length; i++) { var c = arguments[i]; if (c == null || c === false) continue; if (Array.isArray(c)) c.forEach(function (x) { add(parent, x); }); else parent.appendChild(typeof c === \\\"string\\\" ? document.createTextNode(c) : c); } return parent; }\\nfunction svg(tag, attrs, text) { var n = document.createElementNS(SVGNS, tag); for (var k in attrs || {}) if (attrs[k] != null) n.setAttribute(k, String(attrs[k])); if (text != null) n.textContent = String(text); return n; }\\nfunction attr(n, attrs) { for (var k in attrs) if (attrs[k] != null) n.setAttribute(k, String(attrs[k])); return n; }\\nfunction clear(n) { while (n && n.firstChild) n.removeChild(n.firstChild); return n; }\\nfunction clamp(v, a, b) { return Math.max(a, Math.min(b, v)); }\\n\\n/* Icons: 16px strokes on a 24px grid, currentColor. Names a model may ask for (A2UI Icon) map onto these. */\\nvar ICONS = {\\n arrowRight: \\\"M5 12h14M13 6l6 6-6 6\\\", arrowLeft: \\\"M19 12H5M11 6l-6 6 6 6\\\", external: \\\"M7 17L17 7M9 7h8v8\\\",\\n play: \\\"M8 5.5v13l10.5-6.5z\\\", pause: \\\"M8 5v14M16 5v14\\\", expand: \\\"M14 4h6v6M10 20H4v-6M20 4l-7 7M4 20l7-7\\\", collapse: \\\"M4 14h6v6M20 10h-6V4M10 14l-7 7M14 10l7-7\\\",\\n check: \\\"M5 12.5l4.5 4.5L19 7.5\\\", close: \\\"M6 6l12 12M18 6L6 18\\\", info: \\\"M12 11v6M12 7.5v.5M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18z\\\",\\n tip: \\\"M9 18h6M10 21h4M12 3a6 6 0 0 0-3.6 10.8c.6.5 1.1 1.2 1.1 2V16h5v-.2c0-.8.5-1.5 1.1-2A6 6 0 0 0 12 3z\\\",\\n warning: \\\"M12 9v4M12 17v.5M10.3 3.9L2.4 17.5A2 2 0 0 0 4.1 20.5h15.8a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z\\\",\\n success: \\\"M8 12.5l3 3 5-6M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18z\\\", clock: \\\"M12 7v5l3 2M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18z\\\",\\n copy: \\\"M9 9h10v10H9zM5 15V5h10\\\", search: \\\"M11 18a7 7 0 1 0 0-14 7 7 0 0 0 0 14zM20 20l-4-4\\\", settings: \\\"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z\\\",\\n star: \\\"M12 3.5l2.6 5.3 5.9.9-4.3 4.1 1 5.8L12 16.9l-5.2 2.7 1-5.8-4.3-4.1 5.9-.9z\\\", book: \\\"M4 5a2 2 0 0 1 2-2h13v16H6a2 2 0 0 0-2 2zM4 21a2 2 0 0 1 2-2h13\\\",\\n chat: \\\"M5 18l-1.5 3.5L8 20h10a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v10\\\", plus: \\\"M12 5v14M5 12h14\\\", minus: \\\"M5 12h14\\\",\\n database: \\\"M4 6c0-1.7 3.6-3 8-3s8 1.3 8 3-3.6 3-8 3-8-1.3-8-3zM4 6v12c0 1.7 3.6 3 8 3s8-1.3 8-3V6M4 12c0 1.7 3.6 3 8 3s8-1.3 8-3\\\",\\n layers: \\\"M12 3l9 5-9 5-9-5zM3 13l9 5 9-5\\\", bolt: \\\"M13 3L5 14h6l-1 7 8-11h-6z\\\", lock: \\\"M6 11h12v10H6zM8 11V7a4 4 0 0 1 8 0v4\\\",\\n chart: \\\"M4 20V10M10 20V4M16 20v-7M22 20H2\\\", map: \\\"M9 4L3 6v14l6-2 6 2 6-2V4l-6 2zM9 4v14M15 6v14\\\", route: \\\"M6 19a2 2 0 1 0 0-4 2 2 0 0 0 0 4zM18 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4zM8 17h6a3 3 0 0 0 0-6h-4a3 3 0 0 1 0-6h6\\\",\\n flag: \\\"M5 21V4h11l-2 4 2 4H5\\\", bookmark: \\\"M6 3h12v18l-6-4.5L6 21z\\\", dollar: \\\"M12 3v18M16.5 7.5c0-1.7-2-3-4.5-3s-4.5 1.3-4.5 3S9.5 10 12 10.5s4.5 1.7 4.5 3.5-2 3-4.5 3-4.5-1.3-4.5-3\\\",\\n question: \\\"M9.5 9a2.5 2.5 0 1 1 3.6 2.2c-.7.4-1.1 1-1.1 1.8v.5M12 17v.5M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18z\\\", refresh: \\\"M20 11a8 8 0 1 0-2.3 5.7M20 4v7h-7\\\",\\n chevronDown: \\\"M6 9l6 6 6-6\\\", chevronRight: \\\"M9 6l6 6-6 6\\\", dot: \\\"M12 13a1 1 0 1 0 0-2 1 1 0 0 0 0 2z\\\",\\n};\\nvar ICON_ALIASES = { arrow: \\\"arrowRight\\\", next: \\\"arrowRight\\\", back: \\\"arrowLeft\\\", link: \\\"external\\\", open: \\\"external\\\", help: \\\"question\\\", warn: \\\"warning\\\", error: \\\"warning\\\", ok: \\\"success\\\", done: \\\"check\\\", time: \\\"clock\\\", schedule: \\\"clock\\\", money: \\\"dollar\\\", cost: \\\"dollar\\\", data: \\\"database\\\", table: \\\"database\\\", fast: \\\"bolt\\\", speed: \\\"bolt\\\", security: \\\"lock\\\", graph: \\\"chart\\\", trending: \\\"chart\\\", idea: \\\"tip\\\", lightbulb: \\\"tip\\\", favorite: \\\"star\\\", add: \\\"plus\\\", remove: \\\"minus\\\", expandMore: \\\"chevronDown\\\", fullscreen: \\\"expand\\\", read: \\\"book\\\", ask: \\\"chat\\\", message: \\\"chat\\\" };\\nfunction icon(name, cls) {\\n var key = ICONS[name] ? name : ICON_ALIASES[name] || \\\"dot\\\";\\n var s = svg(\\\"svg\\\", { viewBox: \\\"0 0 24 24\\\", class: \\\"k-icon\\\" + (cls ? \\\" \\\" + cls : \\\"\\\"), \\\"aria-hidden\\\": \\\"true\\\", focusable: \\\"false\\\" });\\n add(s, svg(\\\"path\\\", { d: ICONS[key], fill: key === \\\"play\\\" ? \\\"currentColor\\\" : \\\"none\\\", stroke: \\\"currentColor\\\", \\\"stroke-width\\\": key === \\\"play\\\" ? 1 : 1.75, \\\"stroke-linecap\\\": \\\"round\\\", \\\"stroke-linejoin\\\": \\\"round\\\" }));\\n return s;\\n}\\n\\n/* ---- numbers in words ---- */\\nfunction fmt(v, format) {\\n if (v == null || v === \\\"\\\") return \\\"\\\";\\n var f = String(format || \\\"\\\"), n = Number(v);\\n if (typeof v !== \\\"number\\\" && (v === true || v === false || !isFinite(n) || String(v).trim() === \\\"\\\")) return String(v);\\n var parts = f.split(\\\":\\\"), kind = parts[0], arg = parts[1];\\n var dp = function (d) { return { minimumFractionDigits: d, maximumFractionDigits: d }; };\\n try {\\n if (kind === \\\"currency\\\") { var cur = (arg || \\\"USD\\\").toUpperCase(); var big = Math.abs(n) >= 1000 || Number.isInteger(n); return n.toLocaleString(\\\"en-US\\\", { style: \\\"currency\\\", currency: cur, maximumFractionDigits: big ? 0 : 2, minimumFractionDigits: big ? 0 : 2 }); }\\n if (kind === \\\"percent\\\") return (n * 100).toLocaleString(\\\"en-US\\\", { maximumFractionDigits: arg ? Number(arg) : 1 }) + \\\"%\\\";\\n if (kind === \\\"integer\\\") return Math.round(n).toLocaleString(\\\"en-US\\\");\\n if (kind === \\\"number\\\") return n.toLocaleString(\\\"en-US\\\", arg != null ? dp(Number(arg)) : { maximumFractionDigits: 2 });\\n if (kind === \\\"compact\\\") return n.toLocaleString(\\\"en-US\\\", { notation: \\\"compact\\\", maximumFractionDigits: 1 });\\n if (kind === \\\"bytes\\\") { var u = [\\\"B\\\", \\\"KB\\\", \\\"MB\\\", \\\"GB\\\", \\\"TB\\\", \\\"PB\\\"], i = 0, x = Math.abs(n); while (x >= 1024 && i < u.length - 1) { x /= 1024; i++; } return (n < 0 ? \\\"-\\\" : \\\"\\\") + x.toLocaleString(\\\"en-US\\\", { maximumFractionDigits: x < 10 ? 1 : 0 }) + \\\" \\\" + u[i]; }\\n if (kind === \\\"duration\\\") { var s = Math.round(Math.abs(n)), h = Math.floor(s / 3600), m = Math.floor((s % 3600) / 60), sec = s % 60; return h ? h + \\\"h \\\" + m + \\\"m\\\" : m ? m + \\\"m \\\" + (sec ? sec + \\\"s\\\" : \\\"\\\") : sec + \\\"s\\\"; }\\n } catch (x) {}\\n return Number.isInteger(n) ? n.toLocaleString(\\\"en-US\\\") : n.toLocaleString(\\\"en-US\\\", { maximumFractionDigits: 2 });\\n}\\nfunction plural(n, one, many) { return n + \\\" \\\" + (n === 1 ? one : many || one + \\\"s\\\"); }\\n\\n/** Run fn again once web fonts finish loading: a picture measured in a fallback face is redrawn in the real one. */\\nfunction onFonts(fn) {\\n try {\\n if (!document.fonts) return;\\n document.fonts.ready.then(function () { fn(); });\\n document.fonts.addEventListener(\\\"loadingdone\\\", function () { fn(); });\\n } catch (x) {}\\n}\\n/** Run fn when node's own width changes (a host resizing its frame, a scrollbar coming or going): pictures are drawn\\n at their real width, never scaled after the fact. */\\nfunction onWidth(node, fn) {\\n var last = -1, queued = false;\\n var check = function () { queued = false; if (!node.isConnected) return; var w = Math.round(node.clientWidth); if (w && w !== last) { var first = last < 0; last = w; if (!first) fn(w); } };\\n var later = function () { if (!queued) { queued = true; requestAnimationFrame(check); } };\\n if (window.ResizeObserver) new ResizeObserver(later).observe(node); else window.addEventListener(\\\"resize\\\", later);\\n requestAnimationFrame(function () { last = Math.round(node.clientWidth) || -1; });\\n}\\n/*\\n * Keys for the whole view: a host passes keys to the frame wherever focus is in it (Fabric does), so the step card and\\n * the quiz listen on the document, not on one element the reader must click first. The owner is the one holding focus,\\n * else the last one drawn; a key a control already used (tabs, tiles, a slider, a field) is left alone.\\n */\\nvar keyOwners = [];\\nfunction keys(node, handler) { keyOwners.push({ node: node, handler: handler }); }\\ndocument.addEventListener(\\\"keydown\\\", function (e) {\\n if (e.defaultPrevented || e.altKey || e.ctrlKey || e.metaKey) return;\\n var t = e.target, tag = t && t.tagName;\\n if (tag === \\\"INPUT\\\" || tag === \\\"SELECT\\\" || tag === \\\"TEXTAREA\\\" || (t && t.isContentEditable)) return;\\n keyOwners = keyOwners.filter(function (o) { return o.node.isConnected; });\\n var active = document.activeElement, own = null;\\n for (var i = keyOwners.length - 1; i >= 0; i--) if (active && keyOwners[i].node.contains(active)) { own = keyOwners[i]; break; }\\n if (!own) own = keyOwners[keyOwners.length - 1];\\n if (own) own.handler(e);\\n});\\nK.onFonts = onFonts; K.onWidth = onWidth; K.keys = keys;\\nK.el = el; K.add = add; K.svg = svg; K.attr = attr; K.clear = clear; K.uid = uid; K.clamp = clamp; K.icon = icon; K.ICONS = ICONS; K.fmt = fmt; K.plural = plural;\\n\\n/* host.js */\\n/* ---- host adapter: the MCP Apps bridge (io.modelcontextprotocol/ui, 2026-01-26), JSON-RPC over postMessage ----\\n * Detect every capability; assume none. A view computes from the result it is handed and never calls tools/call.\\n * Fabric's extras are additive and feature-detected: hostContext[\\\"fabric.pro/reducedMotion\\\"], the\\n * \\\"fabric.pro/view-state\\\" notification and hostContext[\\\"fabric.pro/viewState\\\"] handed back once. */\\nvar PROTOCOL = \\\"2026-01-26\\\";\\nvar host = { caps: {}, ctx: {}, known: false, info: null };\\nvar cfg = {}, nextId = 1, pending = {}, timers = [], ctxTimer = null, stateTimer = null, restoreUsed = false, lastSize = 0;\\nvar OS_REDUCED = Boolean(window.matchMedia && window.matchMedia(\\\"(prefers-reduced-motion: reduce)\\\").matches);\\n\\nfunction reduced() { return OS_REDUCED || Boolean(host.ctx && host.ctx[\\\"fabric.pro/reducedMotion\\\"] === true); }\\nfunction inFrame() { try { return window.parent && window.parent !== window; } catch (x) { return true; } }\\nfunction post(m) { if (inFrame()) window.parent.postMessage(m, \\\"*\\\"); }\\nfunction request(method, params, timeoutMs) {\\n var id = nextId++;\\n post({ jsonrpc: \\\"2.0\\\", id: id, method: method, params: params || {} });\\n return new Promise(function (resolve, reject) {\\n if (!inFrame()) { reject(new Error(\\\"No host.\\\")); return; }\\n pending[id] = { resolve: resolve, reject: reject };\\n setTimeout(function () { if (pending[id]) { delete pending[id]; reject(new Error(\\\"The host did not answer \\\" + method + \\\".\\\")); } }, timeoutMs || 30000);\\n });\\n}\\nfunction notify(method, params) { post({ jsonrpc: \\\"2.0\\\", method: method, params: params || {} }); }\\nfunction reply(id, result) { post({ jsonrpc: \\\"2.0\\\", id: id, result: result || {} }); }\\n\\nwindow.addEventListener(\\\"message\\\", function (e) {\\n if (e.source !== window.parent) return;\\n var m = e.data;\\n if (!m || m.jsonrpc !== \\\"2.0\\\") return;\\n if (m.id !== undefined && m.id !== null && !m.method) {\\n var p = pending[m.id];\\n if (!p) return;\\n delete pending[m.id];\\n if (m.error) { var err = new Error(String(m.error.message || \\\"\\\")); err.code = m.error.code; p.reject(err); } else p.resolve(m.result);\\n return;\\n }\\n var params = m.params || {};\\n if (m.method === \\\"ui/notifications/tool-input\\\") { if (cfg.onInput) safely(function () { cfg.onInput(params.arguments || null); }); return; }\\n if (m.method === \\\"ui/notifications/tool-input-partial\\\") { if (cfg.onPartial) safely(function () { cfg.onPartial(params.arguments || null); }); return; }\\n if (m.method === \\\"ui/notifications/tool-result\\\") { stopAll(); keptLine = \\\"\\\"; lastContext = null; safely(function () { if (cfg.onResult) cfg.onResult(params); }); return; }\\n if (m.method === \\\"ui/notifications/tool-cancelled\\\") { status(\\\"The tool call was cancelled.\\\"); return; }\\n if (m.method === \\\"ui/notifications/host-context-changed\\\") {\\n // The host sends only what changed: merge it.\\n // The mode as the view draws it (displayMode()): a pip the view didn't declare stays inline to it.\\n var was = displayMode();\\n for (var k in params) host.ctx[k] = params[k];\\n applyTheme(); applyLayout();\\n if (displayMode() !== was && cfg.onDisplay) safely(function () { cfg.onDisplay(displayMode()); });\\n if (cfg.onContext) safely(function () { cfg.onContext(host.ctx); });\\n return;\\n }\\n if (m.method === \\\"ui/resource-teardown\\\") { flushState(); stopAll(); if (cfg.onTeardown) safely(cfg.onTeardown); reply(m.id, {}); return; }\\n if (m.method === \\\"ping\\\") { reply(m.id, {}); return; }\\n if (m.id !== undefined && m.method) post({ jsonrpc: \\\"2.0\\\", id: m.id, error: { code: -32601, message: \\\"Not handled: \\\" + m.method } });\\n});\\n\\n/* What the host takes. Unknown until ui/initialize answers; afterwards only what it said. */\\n/** A capability's content modality: listed, or (a host that lists none, from before modalities) assumed text only. */\\nfunction modality(cap, kind) {\\n if (!cap || typeof cap !== \\\"object\\\") return false;\\n var keys = Object.keys(cap);\\n return keys.length ? Boolean(cap[kind]) : kind === \\\"text\\\";\\n}\\nfunction can(what) {\\n if (what === \\\"openLinks\\\") return !host.known || Boolean(host.caps.openLinks);\\n if (what === \\\"message\\\") return !host.known || modality(host.caps.message, \\\"text\\\");\\n if (what === \\\"context\\\") return !host.known || modality(host.caps.updateModelContext, \\\"text\\\");\\n if (what === \\\"contextStructured\\\") return host.known && modality(host.caps.updateModelContext, \\\"structuredContent\\\");\\n if (what === \\\"fullscreen\\\") return offered(\\\"fullscreen\\\");\\n // Picture-in-picture only where the view declared it (Kit.start({ displayModes })) and the host lists it.\\n if (what === \\\"pip\\\") return declared(\\\"pip\\\") && offered(\\\"pip\\\");\\n return false;\\n}\\n/* ---- display modes: what the view declares in ui/initialize, and what the host lists (hostContext) ---- */\\nvar MODES = [\\\"inline\\\", \\\"fullscreen\\\", \\\"pip\\\"];\\nfunction declaredModes() {\\n var want = Array.isArray(cfg.displayModes) ? cfg.displayModes.filter(function (m) { return MODES.indexOf(m) >= 0; }) : [];\\n if (!want.length) want = [\\\"inline\\\", \\\"fullscreen\\\"];\\n if (want.indexOf(\\\"inline\\\") < 0) want.unshift(\\\"inline\\\");\\n return want;\\n}\\nfunction declared(mode) { return declaredModes().indexOf(mode) >= 0; }\\nfunction offered(mode) { return (host.ctx.availableDisplayModes || []).indexOf(mode) >= 0; }\\n/** The mode the view is in: pip only where the view declared it, so a reader view never draws for a mode it can't fill. */\\nfunction displayMode() {\\n var m = host.ctx.displayMode;\\n if (m === \\\"fullscreen\\\") return \\\"fullscreen\\\";\\n if (m === \\\"pip\\\" && declared(\\\"pip\\\")) return \\\"pip\\\";\\n return \\\"inline\\\";\\n}\\n\\n/* ---- timers, stopped on a new result or teardown ---- */\\nfunction every(ms, fn) { var t = setInterval(fn, ms); timers.push(t); return t; }\\nfunction stop(t) { clearInterval(t); timers = timers.filter(function (x) { return x !== t; }); }\\n/** Stop everything a view started: its intervals, and a context update still waiting (it would describe a view that is\\n gone). A view state still waiting is sent now, so the host keeps the reader's last move. */\\nfunction stopAll() { timers.forEach(function (t) { clearInterval(t); }); timers = []; if (ctxTimer) { clearTimeout(ctxTimer); ctxTimer = null; } flushState(); }\\n\\n/* ---- links, messages, context, state ---- */\\nfunction safeUrl(raw) {\\n var v = String(raw || \\\"\\\").replace(/[\\\\u0000- \\\\u007f-\\\\u009f]+/g, \\\"\\\");\\n try { var u = new URL(v); return u.protocol === \\\"https:\\\" || u.protocol === \\\"http:\\\" ? u.href : null; } catch (x) { return null; }\\n}\\nfunction anchorOpen(href) {\\n try { var a = document.createElement(\\\"a\\\"); a.setAttribute(\\\"data-k-direct\\\", \\\"\\\"); a.href = href; a.target = \\\"_blank\\\"; a.rel = \\\"noopener noreferrer\\\"; a.style.display = \\\"none\\\"; document.body.appendChild(a); a.click(); a.remove(); } catch (x) {}\\n status(\\\"If it didn't open, the link is \\\" + href);\\n}\\n/** ui/open-link where the host takes it; else a plain anchor, with the URL said in case the frame can't open it. */\\nfunction openLink(url) {\\n var href = safeUrl(url);\\n if (!href) return;\\n var fallback = function () { anchorOpen(href); };\\n if (can(\\\"openLinks\\\") && inFrame()) request(\\\"ui/open-link\\\", { url: href }).then(function (r) { if (r && r.isError) fallback(); }).catch(fallback);\\n else fallback();\\n}\\n/** The reader's words to their agent (ui/message, role user). Where the host won't take it, the text to copy. */\\nfunction sendMessage(text, done) {\\n var copy = function (why) { showCopy(why, text); };\\n if (!can(\\\"message\\\")) { copy(\\\"Copy this to your assistant:\\\"); return; }\\n request(\\\"ui/message\\\", { role: \\\"user\\\", content: [{ type: \\\"text\\\", text: String(text) }] }, 30000)\\n .then(function (r) { if (r && r.isError) copy(\\\"Your app didn't take the message. Copy it to your assistant:\\\"); else if (done !== \\\"\\\") status(done || \\\"Sent to your assistant.\\\"); })\\n .catch(function () { copy(\\\"Your app didn't take the message. Copy it to your assistant:\\\"); });\\n}\\n/** What the reader is looking at, for the agent's next turn, once they stop moving things. A refusal is ignored. */\\nvar keptLine = \\\"\\\", lastContext = null;\\nfunction updateContext(text, structured) {\\n if (!can(\\\"context\\\")) return;\\n lastContext = { text: text, structured: structured };\\n if (ctxTimer) clearTimeout(ctxTimer);\\n ctxTimer = setTimeout(function () {\\n // A resume code the reader kept (keep.js) stays in every later context update, so a newer move doesn't drop it.\\n var p = { content: [{ type: \\\"text\\\", text: String(text) + (keptLine ? \\\"\\\\n\\\" + keptLine : \\\"\\\") }] };\\n if (structured && typeof structured === \\\"object\\\" && can(\\\"contextStructured\\\")) p.structuredContent = structured;\\n request(\\\"ui/update-model-context\\\", p, 15000).catch(function () {});\\n }, 1200);\\n}\\n/** The reader's kept resume code, said to the assistant from now on with whatever the view says. */\\nfunction keepInContext(line) { keptLine = String(line || \\\"\\\"); updateContext(lastContext ? lastContext.text : \\\"The reader kept their progress.\\\", lastContext ? lastContext.structured : null); }\\n/** Fabric's view-state: sent (16 KB at most) on each step or choice; any other host ignores the notification. */\\nvar pendingState = null;\\nfunction sendState(state) { try { var j = JSON.stringify(state); if (j.length <= 16000) notify(\\\"fabric.pro/view-state\\\", { state: state }); } catch (x) {} }\\nfunction saveState(state) {\\n if (stateTimer) clearTimeout(stateTimer);\\n pendingState = state;\\n stateTimer = setTimeout(flushState, 250);\\n}\\nfunction flushState() { if (stateTimer) { clearTimeout(stateTimer); stateTimer = null; } if (pendingState) { var st = pendingState; pendingState = null; sendState(st); } }\\n/** The state a host handed back, once: after it is applied the reader's own moves win. */\\nfunction restoreState(key) {\\n if (restoreUsed) return null;\\n var v = host.ctx && host.ctx[\\\"fabric.pro/viewState\\\"];\\n if (!v || typeof v !== \\\"object\\\" || (key && v.key !== key)) return null;\\n restoreUsed = true;\\n return v;\\n}\\n/**\\n * Ask the host for a mode, only one it lists (and, for pip, one the view declared): anything else is refused here, never\\n * sent. The host may grant another mode than the one asked: the view takes what it is given (r.mode).\\n */\\nfunction requestDisplayMode(mode) {\\n var want = mode || (displayMode() === \\\"fullscreen\\\" ? \\\"inline\\\" : \\\"fullscreen\\\");\\n if (MODES.indexOf(want) < 0 || (want !== \\\"inline\\\" && !offered(want)) || !declared(want)) return Promise.reject(new Error(\\\"Your app doesn't offer \\\" + want + \\\".\\\"));\\n return request(\\\"ui/request-display-mode\\\", { mode: want }).then(function (r) {\\n if (r && MODES.indexOf(r.mode) >= 0) host.ctx.displayMode = r.mode;\\n applyLayout();\\n if (cfg.onDisplay) cfg.onDisplay(displayMode());\\n return r;\\n });\\n}\\nfunction payload(r) {\\n if (r && r.structuredContent && typeof r.structuredContent === \\\"object\\\") return r.structuredContent;\\n var c = (r && r.content) || [];\\n for (var i = 0; i < c.length; i++) if (c[i] && c[i].type === \\\"text\\\") { try { var v = JSON.parse(String(c[i].text)); if (v && typeof v === \\\"object\\\") return v; } catch (x) {} }\\n return null;\\n}\\nfunction resultText(r) { var c = (r && r.content) || []; for (var i = 0; i < c.length; i++) if (c[i] && c[i].type === \\\"text\\\") return String(c[i].text); return \\\"\\\"; }\\n\\n/* ---- theme, layout, size ---- */\\nfunction applyStyleVariables(vars) {\\n if (!vars || typeof vars !== \\\"object\\\") return;\\n for (var k in vars) {\\n var val = vars[k];\\n if (/^--[A-Za-z0-9-]{1,64}$/.test(k) && typeof val === \\\"string\\\" && val.length <= 300 && !/[;{}<>\\\\\\\\]|url\\\\(|expression\\\\(/i.test(val)) document.documentElement.style.setProperty(k, val);\\n }\\n}\\nfunction applyTheme() {\\n var c = host.ctx || {};\\n applyStyleVariables(c.styles && c.styles.variables);\\n document.documentElement.classList.toggle(\\\"k-reduce\\\", reduced());\\n var t = c.theme;\\n if (t === \\\"dark\\\" || t === \\\"light\\\") document.documentElement.setAttribute(\\\"data-theme\\\", t);\\n}\\nfunction applyLayout() {\\n var app = document.getElementById(\\\"kit-app\\\");\\n if (!app) return;\\n var mode = displayMode();\\n app.classList.toggle(\\\"k-app--full\\\", mode === \\\"fullscreen\\\");\\n app.classList.toggle(\\\"k-app--pip\\\", mode === \\\"pip\\\");\\n app.setAttribute(\\\"data-mode\\\", mode);\\n}\\nfunction reportSize() {\\n var app = document.getElementById(\\\"kit-app\\\");\\n if (!app) return;\\n var h = Math.ceil(app.getBoundingClientRect().height);\\n if (h === lastSize) return;\\n lastSize = h;\\n notify(\\\"ui/notifications/size-changed\\\", { width: Math.ceil(window.innerWidth), height: h });\\n // ChatGPT's older widget API, where it is present: additive, ignored everywhere else.\\n if (window.openai && typeof window.openai.notifyIntrinsicHeight === \\\"function\\\") { try { window.openai.notifyIntrinsicHeight(h); } catch (x) {} }\\n}\\nfunction sizeLoop() {\\n var app = document.getElementById(\\\"kit-app\\\");\\n if (window.ResizeObserver && app) new ResizeObserver(reportSize).observe(app);\\n reportSize();\\n}\\n\\n/* ---- what goes wrong is said in one plain line ---- */\\nfunction status(s) { var n = document.getElementById(\\\"kit-status\\\"); if (n) n.textContent = s == null ? \\\"\\\" : String(s); }\\nfunction showCopy(why, text) {\\n var n = document.getElementById(\\\"kit-status\\\"); if (!n) return;\\n n.textContent = \\\"\\\";\\n n.appendChild(document.createTextNode(why));\\n var pre = document.createElement(\\\"div\\\"); pre.className = \\\"k-copybox\\\"; pre.textContent = String(text); n.appendChild(pre);\\n}\\nfunction fail(why) {\\n var root = document.getElementById(\\\"kit-root\\\");\\n if (!root) return;\\n root.textContent = \\\"\\\";\\n root.appendChild(errorState(\\\"This view couldn't be drawn: \\\" + String(why || \\\"an unknown error\\\").slice(0, 160) + \\\". Your assistant has the whole answer as text.\\\"));\\n}\\nfunction safely(fn) { try { fn(); } catch (x) { fail(x && x.message); } }\\nwindow.addEventListener(\\\"error\\\", function (e) { fail(e && (e.message || (e.error && e.error.message))); });\\n\\n/**\\n * Start: the handshake, then theme, layout and size. c: { appName, appVersion, displayModes (what the view can draw;\\n * default [\\\"inline\\\", \\\"fullscreen\\\"]: add \\\"pip\\\" only with a compact layout for it), onResult(result), onInput(args),\\n * onPartial(args), onDisplay(mode), onContext(ctx), onTeardown(), onReady() }.\\n */\\nfunction start(c) {\\n cfg = c || {};\\n document.addEventListener(\\\"click\\\", function (e) {\\n var a = e.target && e.target.closest ? e.target.closest(\\\"a[href]\\\") : null;\\n if (!a || a.hasAttribute(\\\"data-k-direct\\\")) return;\\n e.preventDefault();\\n openLink(a.getAttribute(\\\"href\\\") || \\\"\\\");\\n });\\n applyLayout();\\n if (!inFrame()) { host.known = false; if (cfg.onReady) safely(cfg.onReady); return; }\\n request(\\\"ui/initialize\\\", { appInfo: { name: cfg.appName || \\\"mcp-view\\\", version: cfg.appVersion || \\\"1.0.0\\\" }, appCapabilities: { availableDisplayModes: declaredModes() }, protocolVersion: PROTOCOL }, 30000)\\n .then(function (r) {\\n host.caps = (r && r.hostCapabilities) || {};\\n host.ctx = (r && r.hostContext) || {};\\n host.info = (r && r.hostInfo) || null;\\n host.known = true;\\n applyTheme(); applyLayout();\\n notify(\\\"ui/notifications/initialized\\\", {});\\n sizeLoop();\\n if (cfg.onReady) safely(cfg.onReady);\\n })\\n .catch(function () { status(\\\"This view couldn't reach your app; your assistant has the answer as text.\\\"); sizeLoop(); });\\n}\\n\\nK.PROTOCOL = PROTOCOL; K.host = host; K.start = start; K.request = request; K.notify = notify;\\nK.reduced = reduced; K.can = can; K.displayMode = displayMode; K.requestDisplayMode = requestDisplayMode;\\nK.openLink = openLink; K.safeUrl = safeUrl; K.sendMessage = sendMessage; K.updateContext = updateContext;\\nK.saveState = saveState; K.restoreState = restoreState; K.payload = payload; K.resultText = resultText;\\nK.every = every; K.stop = stop; K.stopAll = stopAll; K.status = status; K.fail = fail; K.safely = safely; K.reportSize = reportSize;\\nK.applyTheme = applyTheme;\\n\\n/* components.js */\\n/* ---- layout ---- */\\n/**\\n * card(o): the one card a view is. o: { mark (img src), eyebrow, eyebrowMeta, title, sub, tools: [nodes on the\\n * eyebrow's row, right-aligned], body: [nodes], label }. Returns the section; .body is where content goes, .tools the\\n * header's right side.\\n */\\nfunction card(o) {\\n o = o || {};\\n var c = el(\\\"section\\\", \\\"k-card\\\"), head = el(\\\"div\\\", \\\"k-head\\\");\\n c.setAttribute(\\\"aria-label\\\", o.label || o.title || \\\"Card\\\");\\n var row = el(\\\"div\\\", \\\"k-headrow\\\"), lead = el(\\\"div\\\", \\\"k-lead\\\"), tools = el(\\\"div\\\", \\\"k-tools\\\");\\n if (o.mark) { var m = el(\\\"img\\\", \\\"k-mark\\\"); m.alt = \\\"\\\"; m.src = o.mark; m.width = 18; m.height = 18; add(lead, m); }\\n var eb = el(\\\"p\\\", \\\"k-eyebrow\\\");\\n if (o.eyebrow) add(eb, String(o.eyebrow));\\n if (o.eyebrowMeta) add(eb, el(\\\"span\\\", \\\"k-eyebrow-meta\\\", (o.eyebrow ? \\\" · \\\" : \\\"\\\") + o.eyebrowMeta));\\n add(lead, eb);\\n add(tools, o.tools || []);\\n add(row, lead, tools);\\n if (o.eyebrow != null || o.eyebrowMeta || o.mark || (o.tools && o.tools.filter(Boolean).length)) add(head, row);\\n if (o.title) add(head, el(\\\"h1\\\", \\\"k-title\\\", o.title));\\n // A subtitle the card can spare: o.subWide shows it only when the card is wide.\\n if (o.sub) add(head, el(\\\"p\\\", \\\"k-sub\\\" + (o.subWide ? \\\" k-sub--wide\\\" : \\\"\\\"), o.sub));\\n add(c, head);\\n var body = el(\\\"div\\\", \\\"k-stack\\\");\\n add(body, o.body || []);\\n add(c, body);\\n c.head = head; c.body = body; c.tools = tools; c.eyebrowNode = eb;\\n return c;\\n}\\nfunction section(title, children) { var s = el(\\\"section\\\", \\\"k-section\\\"); if (title) add(s, el(\\\"h2\\\", \\\"k-section-h\\\", title)); add(s, children || []); return s; }\\nfunction stack(children, small) { return add(el(\\\"div\\\", \\\"k-stack\\\" + (small ? \\\" k-stack--s\\\" : \\\"\\\")), children || []); }\\nfunction row(children, between) { return add(el(\\\"div\\\", \\\"k-row\\\" + (between ? \\\" k-row--between\\\" : \\\"\\\")), children || []); }\\nfunction grid(children, min) { var g = add(el(\\\"div\\\", \\\"k-grid\\\"), children || []); if (min) g.style.setProperty(\\\"--k-min\\\", min + \\\"px\\\"); return g; }\\nfunction divider() { return el(\\\"hr\\\", \\\"k-divider\\\"); }\\n\\n/* ---- text ---- */\\nfunction title(s) { return el(\\\"h1\\\", \\\"k-title\\\", s); }\\nfunction heading(s, large) { return el(\\\"h2\\\", \\\"k-h\\\" + (large ? \\\" k-h--l\\\" : \\\"\\\"), s); }\\n/** Body text; `code` spans become mono, **bold** becomes strong. Nothing else is interpreted. */\\nfunction body(s, cls) {\\n var p = el(\\\"p\\\", \\\"k-body\\\" + (cls ? \\\" \\\" + cls : \\\"\\\"));\\n String(s == null ? \\\"\\\" : s).split(/(`[^`]+`|\\\\*\\\\*[^*]+\\\\*\\\\*)/).forEach(function (part) {\\n if (/^`[^`]+`$/.test(part)) add(p, el(\\\"code\\\", \\\"\\\", part.slice(1, -1)));\\n else if (/^\\\\*\\\\*[^*]+\\\\*\\\\*$/.test(part)) add(p, el(\\\"strong\\\", \\\"\\\", part.slice(2, -2)));\\n else if (part) add(p, part);\\n });\\n return p;\\n}\\nfunction caption(s) { return el(\\\"p\\\", \\\"k-caption\\\", s); }\\nfunction chip(s, tone) { return el(\\\"span\\\", \\\"k-chip\\\" + (tone ? \\\" k-chip--\\\" + tone : \\\"\\\"), s); }\\n/** A link that opens through the host: text, then a small accent arrow. */\\nfunction link(label, url, aria) {\\n var b = el(\\\"button\\\", \\\"k-link\\\"); b.type = \\\"button\\\";\\n add(b, String(label)); add(b, icon(\\\"external\\\", \\\"k-arr\\\"));\\n b.setAttribute(\\\"aria-label\\\", aria || label + \\\" (opens a page)\\\");\\n b.onclick = function () { openLink(url); };\\n return b;\\n}\\n\\n/* ---- buttons ---- */\\n/**\\n * button(label, fn, o): o.variant primary (the card's one filled pill), outline, quiet (text), icon (a 32px round\\n * target with o.icon and label as its name); o.icon leads, o.arrow (\\\"→\\\" or \\\"↗\\\") trails in the accent; o.aria; o.small.\\n */\\nfunction button(label, fn, o) {\\n o = o || {};\\n var v = o.variant || \\\"outline\\\";\\n var b = el(\\\"button\\\", \\\"k-btn k-btn--\\\" + v + (o.small ? \\\" k-btn--sm\\\" : \\\"\\\")); b.type = \\\"button\\\";\\n if (v === \\\"icon\\\") { add(b, icon(o.icon || \\\"dot\\\")); b.setAttribute(\\\"aria-label\\\", label); b.title = label; }\\n else {\\n if (o.icon) add(b, icon(o.icon));\\n add(b, el(\\\"span\\\", \\\"\\\", label));\\n // The arrow is drawn, not typed: a font's arrow glyph differs from host to host.\\n if (o.arrow) add(b, icon(o.arrow === \\\"↗\\\" ? \\\"external\\\" : \\\"arrowRight\\\", \\\"k-arr\\\"));\\n if (o.aria) b.setAttribute(\\\"aria-label\\\", o.aria);\\n }\\n b.onclick = function (e) { if (fn) fn(e); };\\n return b;\\n}\\nfunction actions(children) { return add(el(\\\"div\\\", \\\"k-actions\\\"), children || []); }\\n/** Expand to full screen (or back): only where the host offers full screen. */\\nfunction expandButton() {\\n if (!can(\\\"fullscreen\\\")) return null;\\n var full = displayMode() === \\\"fullscreen\\\";\\n return button(full ? \\\"Exit full screen\\\" : \\\"Expand\\\", function () { requestDisplayMode().catch(function () { status(\\\"Your app didn't switch to full screen.\\\"); }); }, { variant: \\\"icon\\\", icon: full ? \\\"collapse\\\" : \\\"expand\\\" });\\n}\\n\\n/* ---- controls ---- */\\n/** A segmented toggle: two or more views of the same thing. labels, value (index), onChange(index), aria. */\\nfunction segmented(labels, value, onChange, aria) {\\n var box = el(\\\"div\\\", \\\"k-seg\\\"); box.setAttribute(\\\"role\\\", \\\"group\\\"); if (aria) box.setAttribute(\\\"aria-label\\\", aria);\\n var bs = labels.map(function (l, i) { var b = el(\\\"button\\\", \\\"\\\", l); b.type = \\\"button\\\"; b.setAttribute(\\\"aria-pressed\\\", String(i === value)); b.onclick = function () { set(i); onChange(i); }; add(box, b); return b; });\\n function set(i) { bs.forEach(function (b, k) { b.setAttribute(\\\"aria-pressed\\\", String(k === i)); }); }\\n box.set = set;\\n return box;\\n}\\n/** Tabs: [{ title, render() -> node }]; the panel is drawn when its tab is chosen. */\\nfunction tabs(list, value, onChange) {\\n var box = el(\\\"div\\\", \\\"k-tabs\\\"), tl = el(\\\"div\\\", \\\"k-tablist\\\"), panel = el(\\\"div\\\", \\\"k-stack\\\"), id = uid(\\\"tab\\\"), cur = value || 0;\\n tl.setAttribute(\\\"role\\\", \\\"tablist\\\"); panel.setAttribute(\\\"role\\\", \\\"tabpanel\\\");\\n var bs = list.map(function (t, i) {\\n var b = el(\\\"button\\\", \\\"\\\", t.title); b.type = \\\"button\\\"; b.id = id + \\\"-\\\" + i; b.setAttribute(\\\"role\\\", \\\"tab\\\");\\n b.onclick = function () { show(i); if (onChange) onChange(i); };\\n b.onkeydown = function (e) { if (e.key === \\\"ArrowRight\\\" || e.key === \\\"ArrowLeft\\\") { e.preventDefault(); var n = (i + (e.key === \\\"ArrowRight\\\" ? 1 : -1) + list.length) % list.length; show(n); bs[n].focus(); if (onChange) onChange(n); } };\\n add(tl, b); return b;\\n });\\n function show(i) {\\n cur = i;\\n bs.forEach(function (b, k) { b.setAttribute(\\\"aria-selected\\\", String(k === i)); b.tabIndex = k === i ? 0 : -1; });\\n panel.setAttribute(\\\"aria-labelledby\\\", id + \\\"-\\\" + i);\\n clear(panel); add(panel, list[i].render ? list[i].render() : list[i].node);\\n }\\n add(box, tl, panel); show(cur);\\n box.show = show; box.current = function () { return cur; };\\n return box;\\n}\\n/** A slider for a continuous value: { label, min, max, step, value, format(v) -> text, onInput(v) }. */\\nfunction slider(o) {\\n var f = el(\\\"div\\\", \\\"k-field\\\"), id = uid(\\\"r\\\"), top = el(\\\"div\\\", \\\"k-field-top\\\"), l = el(\\\"label\\\", \\\"\\\", o.label), out = el(\\\"output\\\"), i = el(\\\"input\\\", \\\"k-range\\\");\\n l.htmlFor = id; i.id = id; i.type = \\\"range\\\"; i.min = String(o.min); i.max = String(o.max); i.step = String(o.step || 1); i.value = String(o.value);\\n out.htmlFor = id;\\n var show = function () {\\n var v = Number(i.value), t = o.format ? o.format(v) : fmt(v);\\n out.textContent = t; i.setAttribute(\\\"aria-valuetext\\\", t);\\n var p = (Number(o.max) - Number(o.min)) ? ((v - Number(o.min)) / (Number(o.max) - Number(o.min))) * 100 : 0;\\n i.style.setProperty(\\\"--k-p\\\", p.toFixed(1) + \\\"%\\\");\\n };\\n i.addEventListener(\\\"input\\\", function () { show(); if (o.onInput) o.onInput(Number(i.value)); });\\n show();\\n add(top, l, out); add(f, top, i);\\n f.input = i; f.set = function (v) { i.value = String(v); show(); }; f.value = function () { return Number(i.value); };\\n return f;\\n}\\nfunction textField(o) {\\n var f = el(\\\"div\\\", \\\"k-field\\\"), id = uid(\\\"f\\\"), l = el(\\\"label\\\", \\\"\\\", o.label), i = el(o.variant === \\\"longText\\\" ? \\\"textarea\\\" : \\\"input\\\", \\\"k-input\\\");\\n l.htmlFor = id; i.id = id;\\n if (i.tagName === \\\"INPUT\\\") i.type = o.variant === \\\"number\\\" ? \\\"number\\\" : o.variant === \\\"obscured\\\" ? \\\"password\\\" : \\\"text\\\";\\n if (o.placeholder) i.placeholder = o.placeholder;\\n i.value = o.value == null ? \\\"\\\" : String(o.value);\\n i.addEventListener(\\\"input\\\", function () { if (o.onInput) o.onInput(i.value); });\\n add(f, l, i); f.input = i;\\n return f;\\n}\\nfunction checkbox(o) {\\n var l = el(\\\"label\\\", \\\"k-check\\\"), i = el(\\\"input\\\"); i.type = \\\"checkbox\\\"; i.checked = Boolean(o.value);\\n i.addEventListener(\\\"change\\\", function () { if (o.onChange) o.onChange(i.checked); });\\n add(l, i, o.label); l.input = i;\\n return l;\\n}\\n/**\\n * Choice tiles for a discrete choice (swatch style when an item has a swatch colour): { label, items: [{ value, label,\\n * spec, swatch, icon }], value (or values with multi), multi, min (tile width), onPick(value | values) }.\\n */\\nfunction choiceTiles(o) {\\n var wrap = el(\\\"div\\\", \\\"k-field\\\"), id = uid(\\\"t\\\"), grid0 = el(\\\"div\\\", \\\"k-tiles\\\" + (o.compact ? \\\" k-tiles--compact\\\" : \\\"\\\"));\\n var picked = o.multi ? (o.values || []).map(String) : o.value == null ? [] : [String(o.value)];\\n if (o.label) { var l = el(\\\"span\\\", \\\"k-label\\\", o.label); l.id = id; add(wrap, l); grid0.setAttribute(\\\"aria-labelledby\\\", id); }\\n grid0.setAttribute(\\\"role\\\", o.multi ? \\\"group\\\" : \\\"radiogroup\\\");\\n if (o.min) grid0.style.setProperty(\\\"--k-min\\\", o.min + \\\"px\\\");\\n var bs = (o.items || []).map(function (it) {\\n var b = el(\\\"button\\\", \\\"k-tile\\\" + (it.swatch ? \\\" k-tile--swatch\\\" : \\\"\\\")); b.type = \\\"button\\\";\\n if (!o.multi) b.setAttribute(\\\"role\\\", \\\"radio\\\");\\n if (it.swatch) { var sw = el(\\\"span\\\", \\\"k-sw\\\"); sw.style.background = it.swatch; add(b, sw); var t = el(\\\"span\\\", \\\"k-swt\\\"); add(t, el(\\\"b\\\", \\\"\\\", it.label), it.spec ? el(\\\"span\\\", \\\"\\\", it.spec) : null); add(b, t); }\\n else { if (it.icon) add(b, icon(it.icon)); add(b, el(\\\"b\\\", \\\"\\\", it.label), it.spec ? el(\\\"span\\\", \\\"\\\", it.spec) : null); }\\n b.onclick = function () {\\n var v = String(it.value);\\n if (o.multi) { picked = picked.indexOf(v) >= 0 ? picked.filter(function (x) { return x !== v; }) : picked.concat([v]); }\\n else picked = [v];\\n sync();\\n if (o.onPick) o.onPick(o.multi ? picked.slice() : it.value);\\n };\\n b.value2 = String(it.value); add(grid0, b); return b;\\n });\\n function sync() { bs.forEach(function (b) { var on = picked.indexOf(b.value2) >= 0; b.setAttribute(o.multi ? \\\"aria-pressed\\\" : \\\"aria-checked\\\", String(on)); if (!o.multi) b.tabIndex = on || (!picked.length && b === bs[0]) ? 0 : -1; }); }\\n grid0.addEventListener(\\\"keydown\\\", function (e) {\\n if (o.multi || [\\\"ArrowRight\\\", \\\"ArrowLeft\\\", \\\"ArrowDown\\\", \\\"ArrowUp\\\"].indexOf(e.key) < 0) return;\\n var i = bs.indexOf(document.activeElement); if (i < 0) return;\\n e.preventDefault(); var n = (i + (e.key === \\\"ArrowRight\\\" || e.key === \\\"ArrowDown\\\" ? 1 : -1) + bs.length) % bs.length; bs[n].focus(); bs[n].click();\\n });\\n sync(); add(wrap, grid0);\\n wrap.set = function (v) { picked = o.multi ? v.map(String) : [String(v)]; sync(); };\\n return wrap;\\n}\\n/** The live preview's \\\"what is picked\\\" line: a swatch, a name and a spec; \\\"Not selected\\\" when empty. */\\nfunction picked(o) {\\n var p = el(\\\"div\\\", \\\"k-picked\\\"), sw = el(\\\"span\\\", \\\"k-sw\\\"), t = el(\\\"div\\\");\\n var set = function (it) {\\n sw.style.background = it && it.swatch ? it.swatch : \\\"\\\";\\n clear(t); add(t, el(\\\"b\\\", \\\"\\\", it ? it.label : (o && o.empty) || \\\"Not selected\\\"), el(\\\"span\\\", \\\"\\\", it ? it.spec || \\\"\\\" : (o && o.emptySpec) || \\\"Pick one below\\\"));\\n };\\n add(p, sw, t); set(o && o.item); p.set = set;\\n return p;\\n}\\n\\n/* ---- notes ---- */\\nvar TONE_ICON = { info: \\\"info\\\", tip: \\\"tip\\\", warning: \\\"warning\\\", success: \\\"success\\\" };\\nfunction callout(o) {\\n var c = el(\\\"div\\\", \\\"k-callout k-callout--\\\" + (o.tone || \\\"info\\\")), t = el(\\\"div\\\");\\n c.setAttribute(\\\"role\\\", o.tone === \\\"warning\\\" ? \\\"note\\\" : \\\"note\\\");\\n add(c, icon(TONE_ICON[o.tone] || \\\"info\\\"));\\n if (o.title) add(t, el(\\\"b\\\", \\\"\\\", o.title));\\n add(t, el(\\\"p\\\", \\\"\\\", o.text || \\\"\\\"));\\n add(c, t);\\n return c;\\n}\\nfunction tip(text) { return el(\\\"p\\\", \\\"k-tipbox\\\", text); }\\n/** Sources: [{ title, url, meta }] as a compact numbered list; each opens through the host. */\\nfunction sources(items, heading0) {\\n var box = el(\\\"div\\\", \\\"k-sources\\\"), ol = el(\\\"ol\\\");\\n add(box, el(\\\"p\\\", \\\"k-sources-h\\\", heading0 || \\\"Sources\\\"));\\n (items || []).forEach(function (s) {\\n var li = el(\\\"li\\\"); add(li, s.url && safeUrl(s.url) ? link(s.title || s.url, s.url, \\\"Source: \\\" + (s.title || s.url)) : el(\\\"span\\\", \\\"\\\", s.title || \\\"\\\"));\\n if (s.meta) add(li, el(\\\"span\\\", \\\"k-src-m\\\", s.meta));\\n add(ol, li);\\n });\\n add(box, ol);\\n return box;\\n}\\n/** Where the content came from: \\\"guide\\\" (from a cited source) or \\\"assistant\\\" (\\\"Composed by your assistant\\\"). */\\nfunction provenance(kind, text) { return el(\\\"span\\\", \\\"k-provenance k-provenance--\\\" + kind, text || (kind === \\\"assistant\\\" ? \\\"Composed by your assistant\\\" : \\\"From the guide\\\")); }\\n\\n/* ---- data ---- */\\nfunction stat(o) {\\n var d = el(\\\"div\\\", \\\"k-stat\\\" + (o.tone ? \\\" k-stat--\\\" + o.tone : \\\"\\\")), v = el(\\\"span\\\", \\\"k-stat-v\\\", o.value);\\n add(d, el(\\\"span\\\", \\\"k-stat-l\\\", o.label), v, o.hint ? el(\\\"span\\\", \\\"k-stat-h\\\", o.hint) : null);\\n d.set = function (x, hint) { v.textContent = x; if (hint != null && d.lastChild.className === \\\"k-stat-h\\\") d.lastChild.textContent = hint; };\\n return d;\\n}\\nfunction bigNumber(o) {\\n var d = el(\\\"div\\\", \\\"k-big\\\"), v = el(\\\"p\\\", \\\"k-big-v\\\", o.value);\\n v.setAttribute(\\\"aria-live\\\", \\\"polite\\\");\\n add(d, v, o.label ? el(\\\"p\\\", \\\"k-big-l\\\", o.label) : null);\\n d.set = function (x) { v.textContent = x; };\\n return d;\\n}\\n/** Bento: tiles of figures. children are nodes; give one class k-span2 or k-spanall to widen it. */\\nfunction bento(children) { return add(el(\\\"div\\\", \\\"k-bento\\\"), children || []); }\\nfunction timeline(events, current) {\\n var ol = el(\\\"ol\\\", \\\"k-timeline\\\");\\n (events || []).forEach(function (e, i) {\\n var li = el(\\\"li\\\", i === current ? \\\"is-on\\\" : \\\"\\\"); add(li, el(\\\"span\\\", \\\"k-tdot\\\"));\\n if (e.label) add(li, el(\\\"span\\\", \\\"k-tl\\\", e.label));\\n add(li, el(\\\"span\\\", \\\"k-tt\\\", e.title || \\\"\\\"));\\n if (e.text) add(li, el(\\\"span\\\", \\\"k-tx\\\", e.text));\\n add(ol, li);\\n });\\n return ol;\\n}\\n/** A table: columns [{ label, key, format, align }] or labels; rows as lists or objects by key. */\\nfunction table(columns, rows, o) {\\n o = o || {};\\n var wrap = el(\\\"div\\\", \\\"k-tablewrap\\\"), t = el(\\\"table\\\", \\\"k-table\\\"), th = el(\\\"thead\\\"), tr = el(\\\"tr\\\"), tb = el(\\\"tbody\\\");\\n var cols = (columns || []).map(function (c, i) { return typeof c === \\\"string\\\" ? { label: c, key: i } : { label: c.label, key: c.key != null ? c.key : i, format: c.format, align: c.align }; });\\n cols.forEach(function (c) { var h = el(\\\"th\\\", c.align === \\\"end\\\" || c.align === \\\"right\\\" ? \\\"is-num\\\" : \\\"\\\", c.label); h.scope = \\\"col\\\"; add(tr, h); });\\n add(th, tr);\\n (rows || []).forEach(function (r, ri) {\\n var row0 = el(\\\"tr\\\", o.pick === ri ? \\\"is-pick\\\" : \\\"\\\");\\n cols.forEach(function (c, ci) {\\n var v = Array.isArray(r) ? r[ci] : r && typeof r === \\\"object\\\" ? r[c.key] : \\\"\\\";\\n var num = typeof v === \\\"number\\\";\\n add(row0, el(\\\"td\\\", num || c.align === \\\"end\\\" || c.align === \\\"right\\\" ? \\\"is-num\\\" : \\\"\\\", c.format ? fmt(v, c.format) : v == null ? \\\"\\\" : typeof v === \\\"number\\\" ? fmt(v) : String(v)));\\n });\\n add(tb, row0);\\n });\\n add(t, th, tb);\\n if (o.caption) { var cap = el(\\\"caption\\\", \\\"k-sr\\\", o.caption); t.insertBefore(cap, th); }\\n add(wrap, t);\\n wrap.tabIndex = 0; wrap.setAttribute(\\\"role\\\", \\\"region\\\"); wrap.setAttribute(\\\"aria-label\\\", o.caption || \\\"Table\\\");\\n return wrap;\\n}\\n\\n/* ---- comparison ---- */\\n/** Compare: items (2 to 4) [{ title, badge, points, verdict, pick }]: cards, the picked one outlined; or a table. */\\nfunction compare(items, o) {\\n o = o || {};\\n if (o.toggle) {\\n // Cards first (they read at any width); the table is one tap away for those who want the grid.\\n var wrap = el(\\\"div\\\", \\\"k-stack k-stack--s\\\"), holder = el(\\\"div\\\"), mode = o.mode === \\\"table\\\" ? 1 : 0;\\n var draw = function () { clear(holder); add(holder, compare(items, { mode: mode ? \\\"table\\\" : \\\"cards\\\", caption: o.caption })); };\\n add(wrap, segmented([\\\"Cards\\\", \\\"Table\\\"], mode, function (i) { mode = i; draw(); }, \\\"Show the comparison as\\\"), holder);\\n draw();\\n return wrap;\\n }\\n if (o.mode === \\\"table\\\") {\\n var max = Math.max.apply(null, items.map(function (i) { return (i.points || []).length; }).concat([0]));\\n var rows = [];\\n for (var r = 0; r < max; r++) rows.push(items.map(function (i) { return (i.points || [])[r] || \\\"\\\"; }));\\n if (items.some(function (i) { return i.verdict; })) rows.push(items.map(function (i) { return i.verdict || \\\"\\\"; }));\\n return table(items.map(function (i) { return i.title; }), rows, { caption: o.caption || \\\"Comparison\\\" });\\n }\\n var g = el(\\\"div\\\", \\\"k-compare\\\" + (items.length >= 3 ? \\\" k-compare--many\\\" : \\\"\\\"));\\n // Three or more: the pick leads, in reading order as well as on screen.\\n if (items.length >= 3) items = items.filter(function (it) { return it.pick; }).concat(items.filter(function (it) { return !it.pick; }));\\n items.forEach(function (it) {\\n var c = el(\\\"article\\\", \\\"k-cmp\\\" + (it.pick ? \\\" is-pick\\\" : \\\"\\\")), h = el(\\\"div\\\", \\\"k-cmp-h\\\");\\n add(h, el(\\\"b\\\", \\\"\\\", it.title), it.badge ? chip(it.badge, it.pick ? \\\"accent\\\" : null) : null);\\n var ul = el(\\\"ul\\\"); (it.points || []).forEach(function (p) { add(ul, el(\\\"li\\\", \\\"\\\", p)); });\\n add(c, h, ul, it.verdict ? el(\\\"p\\\", \\\"k-cmp-v\\\", it.verdict) : null);\\n add(g, c);\\n });\\n return g;\\n}\\nfunction prosCons(o) {\\n var g = el(\\\"div\\\", \\\"k-proscons\\\");\\n [[\\\"pro\\\", o.prosTitle || \\\"For\\\", o.pros], [\\\"con\\\", o.consTitle || \\\"Against\\\", o.cons]].forEach(function (x) {\\n var b = el(\\\"div\\\", \\\"k-pc k-pc--\\\" + x[0]), h = el(\\\"h4\\\"); add(h, icon(x[0] === \\\"pro\\\" ? \\\"check\\\" : \\\"close\\\"), x[1]);\\n var ul = el(\\\"ul\\\"); (x[2] || []).forEach(function (p) { add(ul, el(\\\"li\\\", \\\"\\\", p)); });\\n add(b, h, ul); add(g, b);\\n });\\n return g;\\n}\\n/**\\n * A decision matrix: criteria [{ name, weight 0..5 }], options [{ name, scores: [0..5 per criterion] }]. Weights are\\n * sliders; the weighted totals and the leader update as they move. onChange(totals).\\n */\\nfunction decisionMatrix(o) {\\n var box = el(\\\"div\\\", \\\"k-stack k-stack--s\\\"), t = el(\\\"table\\\", \\\"k-matrix\\\"), thead = el(\\\"thead\\\"), tbody = el(\\\"tbody\\\"), tfoot = el(\\\"tfoot\\\");\\n var weights = o.criteria.map(function (c) { return c.weight == null ? 3 : c.weight; });\\n var hr = el(\\\"tr\\\"); add(hr, el(\\\"th\\\", \\\"\\\", \\\"Criterion\\\"), el(\\\"th\\\", \\\"\\\", \\\"Weight\\\")); o.options.forEach(function (op) { add(hr, el(\\\"th\\\", \\\"\\\", op.name)); }); add(thead, hr);\\n var totals = o.options.map(function () { return el(\\\"td\\\"); });\\n o.criteria.forEach(function (c, ci) {\\n var tr = el(\\\"tr\\\"), wcell = el(\\\"td\\\"), r = el(\\\"input\\\", \\\"k-range\\\"); r.type = \\\"range\\\"; r.min = \\\"0\\\"; r.max = \\\"5\\\"; r.step = \\\"1\\\"; r.value = String(weights[ci]);\\n r.setAttribute(\\\"aria-label\\\", \\\"Weight of \\\" + c.name);\\n r.style.setProperty(\\\"--k-p\\\", (weights[ci] / 5 * 100) + \\\"%\\\");\\n r.oninput = function () { weights[ci] = Number(r.value); r.style.setProperty(\\\"--k-p\\\", (weights[ci] / 5 * 100) + \\\"%\\\"); total(); };\\n add(wcell, r);\\n add(tr, el(\\\"td\\\", \\\"\\\", c.name), wcell);\\n o.options.forEach(function (op) { var cell = el(\\\"td\\\"); add(cell, el(\\\"span\\\", \\\"k-score\\\", String((op.scores || [])[ci] == null ? \\\"–\\\" : op.scores[ci]))); add(tr, cell); });\\n add(tbody, tr);\\n });\\n var fr = el(\\\"tr\\\"); add(fr, el(\\\"td\\\", \\\"\\\", \\\"Weighted\\\"), el(\\\"td\\\")); totals.forEach(function (c) { add(fr, c); }); add(tfoot, fr);\\n function total() {\\n var sums = o.options.map(function (op) { return o.criteria.reduce(function (a, c, ci) { return a + weights[ci] * Number((op.scores || [])[ci] || 0); }, 0); });\\n var best = Math.max.apply(null, sums);\\n sums.forEach(function (s, i) { totals[i].textContent = fmt(s); totals[i].className = s === best && best > 0 ? \\\"is-best\\\" : \\\"\\\"; });\\n if (o.onChange) o.onChange(sums, weights.slice());\\n }\\n add(t, thead, tbody, tfoot); add(box, t); total();\\n return box;\\n}\\n\\n/* ---- quiz ---- */\\nvar KEYS = \\\"ABCDEFGH\\\";\\nfunction quizOption(label, i, fn) {\\n var b = el(\\\"button\\\", \\\"k-option\\\"); b.type = \\\"button\\\";\\n add(b, el(\\\"span\\\", \\\"k-key\\\", KEYS[i] || String(i + 1)), el(\\\"span\\\", \\\"\\\", label));\\n b.onclick = function (e) { fn(i, e); };\\n return b;\\n}\\n/** A score ring: right of total, size (default 96). */\\nfunction scoreRing(right, total, size) {\\n var S = size || 96, sw = Math.max(6, Math.round(S / 12)), r = (S - sw) / 2, c = 2 * Math.PI * r;\\n var s = svg(\\\"svg\\\", { viewBox: \\\"0 0 \\\" + S + \\\" \\\" + S, width: S, height: S, class: \\\"k-ring\\\", role: \\\"img\\\", \\\"aria-label\\\": right + \\\" of \\\" + total + \\\" right\\\" });\\n add(s, svg(\\\"circle\\\", { cx: S / 2, cy: S / 2, r: r, class: \\\"track\\\", \\\"stroke-width\\\": sw }));\\n var v = svg(\\\"circle\\\", { cx: S / 2, cy: S / 2, r: r, class: \\\"val\\\", \\\"stroke-width\\\": sw, \\\"stroke-dasharray\\\": c.toFixed(2), \\\"stroke-dashoffset\\\": c.toFixed(2) });\\n add(s, v, svg(\\\"text\\\", { x: S / 2, y: S / 2 + S * 0.02, \\\"text-anchor\\\": \\\"middle\\\", \\\"font-size\\\": Math.round(S * 0.24) }, String(right)), svg(\\\"text\\\", { x: S / 2, y: S / 2 + S * 0.2, \\\"text-anchor\\\": \\\"middle\\\", class: \\\"k-ring-s\\\", \\\"font-size\\\": Math.round(S * 0.12) }, \\\"of \\\" + total));\\n var final = String(c * (1 - (total ? right / total : 0)));\\n if (reduced()) v.setAttribute(\\\"stroke-dashoffset\\\", final); else setTimeout(function () { v.setAttribute(\\\"stroke-dashoffset\\\", final); }, 40);\\n return s;\\n}\\n\\n/* ---- code ---- */\\nfunction code(o) {\\n var f = el(\\\"figure\\\", \\\"k-code\\\"), h = el(\\\"div\\\", \\\"k-code-h\\\"), pre = el(\\\"pre\\\"), c = el(\\\"code\\\", \\\"\\\", o.code || \\\"\\\");\\n add(h, el(\\\"span\\\", \\\"\\\", o.title || o.language || \\\"Code\\\"));\\n var copyB = button(\\\"Copy\\\", function () {\\n var done = function () { copyB.lastChild.textContent = \\\"Copied\\\"; setTimeout(function () { copyB.lastChild.textContent = \\\"Copy\\\"; }, 1600); };\\n try { navigator.clipboard.writeText(o.code || \\\"\\\").then(done, function () { status(\\\"Select the code to copy it.\\\"); }); } catch (x) { status(\\\"Select the code to copy it.\\\"); }\\n }, { variant: \\\"quiet\\\", small: true, icon: \\\"copy\\\" });\\n add(h, copyB);\\n pre.tabIndex = 0; pre.setAttribute(\\\"aria-label\\\", (o.title || \\\"Code\\\") + (o.language ? \\\", \\\" + o.language : \\\"\\\"));\\n add(pre, c); add(f, h, pre);\\n return f;\\n}\\n\\n/* ---- states ---- */\\nfunction emptyState(o) {\\n var d = el(\\\"div\\\", \\\"k-empty\\\"); add(d, icon(o.icon || \\\"search\\\"), el(\\\"p\\\", \\\"k-h\\\", o.title || \\\"Nothing here yet\\\"), o.text ? body(o.text) : null, o.action || null);\\n return d;\\n}\\nfunction errorState(text) { var d = el(\\\"div\\\", \\\"k-error\\\"); d.setAttribute(\\\"role\\\", \\\"alert\\\"); add(d, icon(\\\"warning\\\"), el(\\\"p\\\", \\\"\\\", text)); return d; }\\nfunction skeleton() { var d = el(\\\"div\\\", \\\"k-skel\\\"); d.setAttribute(\\\"role\\\", \\\"status\\\"); d.setAttribute(\\\"aria-label\\\", \\\"Loading\\\"); add(d, el(\\\"i\\\"), el(\\\"i\\\"), el(\\\"i\\\"), el(\\\"i\\\")); return d; }\\n\\n/* ---- flashcards ----\\n * flashcards(cards, o): cards [{ id, front, back, kind, source: { url, label } }]. Tap (or Space, Enter) turns a card.\\n * o.spaced: after turning, \\\"Got it\\\" takes the card out and \\\"Not yet\\\" puts it three cards back; o.hint, the line under the front saying what to do; the count of cards\\n * left shows, and o.onState({ queue, done }) gets every change (o.state restores it). Without o.spaced: Back and Next.\\n */\\nfunction flashcards(cards, o) {\\n o = o || {};\\n var byId = {}; cards.forEach(function (c, i) { c.id = c.id || \\\"c\\\" + (i + 1); byId[c.id] = c; });\\n var st = o.state && Array.isArray(o.state.queue) ? { queue: o.state.queue.filter(function (id) { return byId[id]; }), done: (o.state.done || []).filter(function (id) { return byId[id]; }) } : { queue: cards.map(function (c) { return c.id; }), done: [] };\\n var i = 0, back = false, box = el(\\\"div\\\", \\\"k-stack k-stack--s\\\"), live = el(\\\"p\\\", \\\"k-sr\\\"); live.setAttribute(\\\"aria-live\\\", \\\"polite\\\");\\n // One id per deck: two decks on a page never describe each other's cards.\\n var hintId = uid(\\\"flash-hint\\\");\\n var inner = el(\\\"div\\\", \\\"k-stack k-stack--s\\\"); add(box, inner, live);\\n function current() { return o.spaced ? byId[st.queue[0]] : cards[i]; }\\n function save() { if (o.onState) o.onState({ queue: st.queue.slice(), done: st.done.slice() }); }\\n function draw(focus) {\\n clear(inner);\\n var c = current();\\n if (!c) {\\n add(inner, el(\\\"h2\\\", \\\"k-h k-h--l\\\", \\\"All \\\" + cards.length + \\\" cards done\\\"), body(\\\"Every card is marked Got it. Go round again whenever you like.\\\"), actions([button(\\\"Start over\\\", function () { st = { queue: cards.map(function (x) { return x.id; }), done: [] }; save(); draw(true); }, { variant: \\\"primary\\\", arrow: \\\"→\\\" })]));\\n live.textContent = \\\"All cards done.\\\"; return;\\n }\\n var face = el(\\\"button\\\", \\\"k-flash\\\" + (back ? \\\" is-back\\\" : \\\"\\\")); face.type = \\\"button\\\";\\n // What to do with the front, said once under it (27 Oct 2026: a bare term on a card read as a riddle). It keeps its\\n // place on the back too, hidden, so turning the card never changes its height; the face points at it for readers.\\n var hintN = o.hint ? el(\\\"p\\\", \\\"k-caption\\\", o.hint) : null;\\n if (hintN) { hintN.id = hintId; if (back) hintN.style.visibility = \\\"hidden\\\"; else face.setAttribute(\\\"aria-describedby\\\", hintN.id); }\\n var side = el(\\\"span\\\", \\\"k-flash-side\\\", back ? \\\"Answer\\\" : (c.kind || \\\"Card\\\") + (o.spaced ? \\\"\\\" : \\\" · \\\" + (i + 1) + \\\" of \\\" + cards.length));\\n add(face, side, back ? el(\\\"span\\\", \\\"k-flash-q\\\", c.front) : null, el(\\\"span\\\", \\\"k-flash-t\\\", back ? c.back : c.front), el(\\\"span\\\", \\\"k-sr\\\", back ? \\\"\\\" : \\\" (press to turn over)\\\"));\\n face.onclick = function () { back = !back; draw(true); };\\n add(inner, face, hintN);\\n if (back && c.source && c.source.url) add(inner, link(\\\"Read more: \\\" + (c.source.label || \\\"the section\\\"), c.source.url));\\n var foot = el(\\\"div\\\", \\\"k-foot\\\"), rt = el(\\\"div\\\", \\\"k-right\\\");\\n if (o.spaced) {\\n add(foot, el(\\\"span\\\", \\\"k-caption\\\", st.queue.length + \\\" left · \\\" + st.done.length + \\\" got\\\"));\\n if (back) {\\n add(rt, button(\\\"Not yet\\\", function () { var id = st.queue.shift(); st.queue.splice(Math.min(3, st.queue.length), 0, id); back = false; save(); draw(true); }, { variant: \\\"quiet\\\" }),\\n button(\\\"Got it\\\", function () { st.done.push(st.queue.shift()); back = false; save(); draw(true); }, { variant: \\\"primary\\\", icon: \\\"check\\\" }));\\n } else add(rt, button(\\\"Turn over\\\", function () { back = true; draw(true); }, { variant: \\\"outline\\\" }));\\n } else {\\n var prev = button(\\\"Back\\\", function () { i = clamp(i - 1, 0, cards.length - 1); back = false; draw(true); }, { variant: \\\"quiet\\\" }); prev.disabled = i === 0;\\n var next = button(\\\"Next\\\", function () { i = clamp(i + 1, 0, cards.length - 1); back = false; draw(true); }, { variant: \\\"outline\\\", arrow: \\\"→\\\" }); next.disabled = i >= cards.length - 1;\\n add(foot, el(\\\"span\\\", \\\"k-caption\\\", \\\"Tap the card to turn it over\\\")); add(rt, prev, next);\\n }\\n add(foot, rt); add(inner, foot);\\n live.textContent = (back ? \\\"Answer: \\\" + c.back : \\\"Card: \\\" + c.front);\\n if (focus) { var f = inner.querySelector(\\\".k-flash\\\"); if (f) f.focus({ preventScroll: true }); }\\n }\\n keys(box, function (e) {\\n var c = current(); if (!c) return;\\n if (o.spaced && back && (e.key === \\\"ArrowRight\\\" || e.key === \\\"g\\\")) { e.preventDefault(); st.done.push(st.queue.shift()); back = false; save(); draw(true); }\\n else if (o.spaced && back && (e.key === \\\"ArrowLeft\\\" || e.key === \\\"r\\\" || e.key === \\\"n\\\")) { e.preventDefault(); var id = st.queue.shift(); st.queue.splice(Math.min(3, st.queue.length), 0, id); back = false; save(); draw(true); }\\n else if (!o.spaced && e.key === \\\"ArrowRight\\\") { e.preventDefault(); i = clamp(i + 1, 0, cards.length - 1); back = false; draw(true); }\\n else if (!o.spaced && e.key === \\\"ArrowLeft\\\") { e.preventDefault(); i = clamp(i - 1, 0, cards.length - 1); back = false; draw(true); }\\n });\\n draw();\\n return box;\\n}\\n\\nK.card = card; K.section = section; K.stack = stack; K.row = row; K.grid = grid; K.divider = divider;\\nK.title = title; K.heading = heading; K.body = body; K.caption = caption; K.chip = chip; K.link = link;\\nK.button = button; K.actions = actions; K.expandButton = expandButton;\\nK.segmented = segmented; K.tabs = tabs; K.slider = slider; K.textField = textField; K.checkbox = checkbox; K.choiceTiles = choiceTiles; K.picked = picked;\\nK.callout = callout; K.tip = tip; K.sources = sources; K.provenance = provenance;\\nK.stat = stat; K.bigNumber = bigNumber; K.bento = bento; K.timeline = timeline; K.table = table;\\nK.compare = compare; K.prosCons = prosCons; K.decisionMatrix = decisionMatrix;\\nK.quizOption = quizOption; K.scoreRing = scoreRing; K.code = code; K.flashcards = flashcards;\\nK.emptyState = emptyState; K.errorState = errorState; K.skeleton = skeleton;\\n\\n/* chart.js */\\n/* ---- charts: bar, line, area, pie; SVG, drawn to the card's width, read out as a table to a screen reader ---- */\\nvar SERIES = [\\\"var(--k-f-s1)\\\", \\\"var(--k-f-s2)\\\", \\\"var(--k-f-s3)\\\", \\\"var(--k-f-s4)\\\", \\\"var(--k-f-s5)\\\"];\\n/** The top of the axis: four steps of a round size (1, 2, 2.5 or 5 times a power of ten). */\\nfunction niceMax(v) { if (v <= 0) return 4; var raw = v / 4, p = Math.pow(10, Math.floor(Math.log10(raw))), n = raw / p; return (n <= 1 ? 1 : n <= 2 ? 2 : n <= 2.5 ? 2.5 : n <= 5 ? 5 : 10) * p * 4; }\\n/**\\n * chart(o): { kind: bar | line | area | pie, title, labels: [..], series: [{ name, values: [numbers] }], format,\\n * xLabel, yLabel, height, highlight (index of the label to mark) }. Returns a figure with .update(o2) to redraw.\\n */\\nfunction chart(o) {\\n var fig = el(\\\"figure\\\", \\\"k-chart\\\"), cap = el(\\\"figcaption\\\", \\\"k-h\\\"), holder = el(\\\"div\\\"), legend = el(\\\"div\\\", \\\"k-legend\\\"), sr = el(\\\"table\\\", \\\"k-sr\\\");\\n fig.style.margin = \\\"0\\\";\\n add(fig, cap, holder, legend, sr);\\n function draw(c) {\\n o = c;\\n cap.textContent = c.title || \\\"\\\"; cap.hidden = !c.title;\\n clear(holder); clear(legend); clear(sr);\\n var series = (c.series || []).filter(function (s) { return s && Array.isArray(s.values); }).slice(0, 5);\\n var labels = c.labels || (series[0] ? series[0].values.map(function (_, i) { return String(i + 1); }) : []);\\n var W = Math.max(240, holder.clientWidth || fig.clientWidth || 520), H = c.height || 180;\\n var kind = c.kind || \\\"bar\\\";\\n var s = svg(\\\"svg\\\", { viewBox: \\\"0 0 \\\" + W + \\\" \\\" + H, role: \\\"img\\\", \\\"aria-label\\\": (c.title || \\\"Chart\\\") + \\\": \\\" + series.map(function (x) { return (x.name || \\\"\\\") + \\\" \\\" + x.values.map(function (v, i) { return (labels[i] || \\\"\\\") + \\\" \\\" + fmt(v, c.format); }).join(\\\", \\\"); }).join(\\\"; \\\") });\\n if (kind === \\\"pie\\\") drawPie(s, series[0] || { values: [] }, labels, W, H, c);\\n else drawXY(s, series, labels, W, H, c, kind);\\n add(holder, s);\\n if (series.length > 1 && kind !== \\\"pie\\\") {\\n var names = kind === \\\"pie\\\" ? labels : series.map(function (x) { return x.name || \\\"\\\"; });\\n names.forEach(function (n, i) { var it = el(\\\"span\\\"); var sw = el(\\\"i\\\"); sw.style.background = SERIES[i % SERIES.length]; add(it, sw, n); add(legend, it); });\\n }\\n legend.hidden = !legend.firstChild;\\n // The figures as a table, for a screen reader.\\n var hr = el(\\\"tr\\\"); add(hr, el(\\\"th\\\", \\\"\\\", c.xLabel || \\\"\\\")); series.forEach(function (x) { add(hr, el(\\\"th\\\", \\\"\\\", x.name || c.yLabel || \\\"Value\\\")); }); add(sr, hr);\\n labels.forEach(function (l, i) { var tr = el(\\\"tr\\\"); add(tr, el(\\\"td\\\", \\\"\\\", l)); series.forEach(function (x) { add(tr, el(\\\"td\\\", \\\"\\\", fmt(x.values[i], c.format))); }); add(sr, tr); });\\n }\\n function drawXY(s, series, labels, W, H, c, kind) {\\n var all = [];\\n series.forEach(function (x) { x.values.forEach(function (v) { if (isFinite(Number(v))) all.push(Number(v)); }); });\\n var max = niceMax(Math.max.apply(null, all.concat([0]))), min = Math.min(0, Math.min.apply(null, all.concat([0])));\\n var L = 44, R = 8, T = 10, B = c.xLabel ? 38 : 24, pw = W - L - R, ph = H - T - B;\\n var y = function (v) { return T + ph - ((v - min) / (max - min || 1)) * ph; };\\n for (var g = 0; g <= 4; g++) {\\n var gv = min + ((max - min) * g) / 4, gy = y(gv);\\n add(s, svg(\\\"line\\\", { x1: L, x2: W - R, y1: gy, y2: gy, class: \\\"k-ax\\\", \\\"stroke-dasharray\\\": g ? \\\"2 4\\\" : null }));\\n add(s, svg(\\\"text\\\", { x: L - 8, y: gy + 4, \\\"text-anchor\\\": \\\"end\\\", class: \\\"k-axt\\\" }, fmt(gv, c.format === \\\"percent\\\" ? \\\"percent:0\\\" : c.format && c.format.indexOf(\\\"currency\\\") === 0 ? c.format : \\\"compact\\\")));\\n }\\n var n = labels.length || 1, band = pw / n, every0 = Math.max(1, Math.ceil(n / Math.floor(pw / 56)));\\n labels.forEach(function (l, i) { if (i % every0) return; add(s, svg(\\\"text\\\", { x: L + band * i + band / 2, y: H - B + 16, \\\"text-anchor\\\": \\\"middle\\\", class: \\\"k-axt\\\" }, String(l).length > 10 ? String(l).slice(0, 9) + \\\"…\\\" : l)); });\\n if (c.xLabel) add(s, svg(\\\"text\\\", { x: L + pw / 2, y: H - 4, \\\"text-anchor\\\": \\\"middle\\\", class: \\\"k-axt\\\" }, c.xLabel));\\n if (kind === \\\"bar\\\") {\\n var gw = Math.min(band * 0.7, 56), bw = gw / Math.max(1, series.length);\\n series.forEach(function (x, si) {\\n x.values.forEach(function (v, i) {\\n var val = Number(v) || 0, bx = L + band * i + (band - gw) / 2 + si * bw, top = y(Math.max(0, val)), bh = Math.abs(y(val) - y(0));\\n var hl = c.highlight != null && c.highlight === i;\\n add(s, svg(\\\"rect\\\", { x: bx + 1, y: top, width: Math.max(2, bw - 2), height: Math.max(1, bh), rx: Math.min(4, bw / 3), class: \\\"k-bar\\\", fill: series.length > 1 ? SERIES[si % SERIES.length] : hl || c.highlight == null ? SERIES[0] : \\\"var(--k-line)\\\" }));\\n if (series.length === 1 && n <= 8) add(s, svg(\\\"text\\\", { x: bx + bw / 2, y: top - 5, \\\"text-anchor\\\": \\\"middle\\\", class: \\\"k-val\\\" }, fmt(val, c.format)));\\n });\\n });\\n } else {\\n series.forEach(function (x, si) {\\n var pts = x.values.map(function (v, i) { return [L + band * i + band / 2, y(Number(v) || 0)]; });\\n var d = pts.map(function (p, i) { return (i ? \\\"L\\\" : \\\"M\\\") + p[0].toFixed(1) + \\\",\\\" + p[1].toFixed(1); }).join(\\\" \\\");\\n if (kind === \\\"area\\\" && pts.length) add(s, svg(\\\"path\\\", { d: d + \\\" L\\\" + pts[pts.length - 1][0].toFixed(1) + \\\",\\\" + y(0) + \\\" L\\\" + pts[0][0].toFixed(1) + \\\",\\\" + y(0) + \\\" Z\\\", class: \\\"k-area\\\", fill: SERIES[si % SERIES.length] }));\\n add(s, svg(\\\"path\\\", { d: d, class: \\\"k-ln\\\", stroke: SERIES[si % SERIES.length] }));\\n if (c.highlight != null && pts[c.highlight]) add(s, svg(\\\"circle\\\", { cx: pts[c.highlight][0], cy: pts[c.highlight][1], r: 4.5, fill: SERIES[si % SERIES.length], stroke: \\\"var(--k-card)\\\", \\\"stroke-width\\\": 2 }));\\n });\\n }\\n }\\n function drawPie(s, x, labels, W, H, c) {\\n var vals = x.values.map(function (v) { return Math.max(0, Number(v) || 0); }), tot = vals.reduce(function (a, b) { return a + b; }, 0) || 1;\\n var r = Math.min(H / 2 - 12, W / 5), cx = r + 8, cy = H / 2, a0 = -Math.PI / 2;\\n vals.forEach(function (v, i) {\\n var a1 = a0 + (v / tot) * Math.PI * 2, large = a1 - a0 > Math.PI ? 1 : 0;\\n var p = v / tot >= 0.999 ? svg(\\\"circle\\\", { cx: cx, cy: cy, r: r, fill: SERIES[i % SERIES.length] }) : svg(\\\"path\\\", { d: \\\"M\\\" + cx + \\\",\\\" + cy + \\\" L\\\" + (cx + r * Math.cos(a0)) + \\\",\\\" + (cy + r * Math.sin(a0)) + \\\" A\\\" + r + \\\",\\\" + r + \\\" 0 \\\" + large + \\\",1 \\\" + (cx + r * Math.cos(a1)) + \\\",\\\" + (cy + r * Math.sin(a1)) + \\\" Z\\\", fill: SERIES[i % SERIES.length], stroke: \\\"var(--k-card)\\\", \\\"stroke-width\\\": 2 });\\n add(s, p); a0 = a1;\\n });\\n add(s, svg(\\\"circle\\\", { cx: cx, cy: cy, r: r * 0.55, fill: \\\"var(--k-card)\\\" }));\\n vals.forEach(function (v, i) {\\n var ly = cy - (vals.length - 1) * 12 + i * 24, lx = cx + r + 24;\\n add(s, svg(\\\"rect\\\", { x: lx, y: ly - 9, width: 10, height: 10, rx: 2, fill: SERIES[i % SERIES.length] }));\\n add(s, svg(\\\"text\\\", { x: lx + 18, y: ly, class: \\\"k-axt\\\" }, (labels[i] || \\\"\\\") + \\\" \\\" + fmt(v / tot, \\\"percent:0\\\")));\\n });\\n }\\n draw(o);\\n fig.update = function (c2) { draw(c2); };\\n // Redrawn at its real width once it is on the page.\\n requestAnimationFrame(function () { if (fig.isConnected) draw(o); });\\n onFonts(function () { if (fig.isConnected) draw(o); });\\n onWidth(holder, function () { draw(o); });\\n return fig;\\n}\\nK.chart = chart;\\n\\n/* scene.js */\\n/* ---- diagrams: a scene is plain data (boxes, cylinders, files, pills, lanes, arrows, bars, dots, ticks, text), drawn\\n * as SVG. Each item has a state: new (it enters, an arrow draws on), focus (the accent), dim, off, gone (struck through),\\n * ok, bad; anything else is grey context. The step's subject wears the accent; exactly one change a step.\\n * Ported from the Field Guide's view runtime (23 Oct 2026), where it was proven against host fonts: labels stay 13px or\\n * more as rendered, a label that would spill out of its box in a wide font is drawn narrower (textLength), callouts\\n * move off labels, and the camera frames the step's subject with 32px of air. */\\n function scene(spec, o) {\\n o = o || {};\\n var W = spec.w || 640, H = spec.h || 260, mid = uid(\\\"m\\\");\\n var box = o.fit ? fitBox(spec, o.fit, W, H) : [0, 0, W, H];\\n var root = svg(\\\"svg\\\", { viewBox: box.join(\\\" \\\"), class: \\\"k-scene\\\" + (o.fit ? \\\" k-fit\\\" : \\\"\\\"), role: (o.callouts && o.callouts.length) || (spec.items || []).some(function (it) { return it.href; }) ? \\\"group\\\" : \\\"img\\\", preserveAspectRatio: \\\"xMidYMid meet\\\" });\\n root.box = box;\\n root.setAttribute(\\\"data-w\\\", W); root.setAttribute(\\\"data-h\\\", H);\\n var kk = 1;\\n // Labels keep at least 13px however far the stage is scaled down: the text is scaled back up, and the small print\\n // (each box's second line) gives way when there is no room for it.\\n if (o.fit && o.fit.w) {\\n // The stage is never taller than its budget: the picture fits inside it, and its scale is what the labels answer to.\\n root.style.height = o.fit.h + \\\"px\\\";\\n var scale = Math.min(o.fit.w / box[2], o.fit.h / box[3]), k = Math.max(1, 1 / scale);\\n kk = k;\\n root.style.setProperty(\\\"--k-k\\\", k.toFixed(3));\\n if (k > 1.12) root.classList.add(\\\"k-tight\\\");\\n }\\n if (o.fromBox && !o.frameLater && !reduced()) tweenBox(root, o.fromBox, box);\\n if (o.label) root.setAttribute(\\\"aria-label\\\", o.label);\\n var defs = svg(\\\"defs\\\"), mk = svg(\\\"marker\\\", { id: mid, viewBox: \\\"0 0 10 10\\\", refX: 9, refY: 5, markerWidth: 7, markerHeight: 7, orient: \\\"auto-start-reverse\\\" });\\n add(mk, svg(\\\"path\\\", { d: \\\"M0,0 L10,5 L0,10 z\\\", class: \\\"head\\\" })); add(defs, mk); add(root, defs);\\n function txt(x, y, s, cls, anchor) { return svg(\\\"text\\\", { x: x, y: y, class: cls || \\\"\\\", \\\"text-anchor\\\": anchor || \\\"start\\\" }, s); }\\n (spec.items || []).forEach(function (it) {\\n if ((it.view && o.view && it.view !== o.view) || it.t === \\\"cam\\\") return;\\n var g = svg(\\\"g\\\", { class: \\\"it st-\\\" + (it.st || \\\"base\\\") + (it.tone ? \\\" tone-\\\" + it.tone : \\\"\\\"), \\\"data-id\\\": it.id });\\n var x = it.x, y = it.y, w = it.w, h = it.h, cls = it.mono ? \\\"lbl mono\\\" : \\\"lbl\\\";\\n if ((it.t === \\\"rect\\\" || it.t === \\\"pill\\\" || it.t === \\\"db\\\") && it.lines && it.lines.length > 1) {\\n // A label of several lines (a diagram's node): one line under another, centred.\\n if (it.t === \\\"db\\\") { var ry0 = Math.min(10, h / 5); add(g, svg(\\\"path\\\", { d: \\\"M\\\" + x + \\\",\\\" + (y + ry0) + \\\" a\\\" + w / 2 + \\\",\\\" + ry0 + \\\" 0 0,1 \\\" + w + \\\",0 v\\\" + (h - 2 * ry0) + \\\" a\\\" + w / 2 + \\\",\\\" + ry0 + \\\" 0 0,1 -\\\" + w + \\\",0 z\\\", class: \\\"shape\\\" })); }\\n else add(g, svg(\\\"rect\\\", { x: x, y: y, width: w, height: h, rx: it.t === \\\"pill\\\" ? Math.min(h / 2, 18) : 8, class: \\\"shape\\\" }));\\n // Line spacing in em, so it grows with the label when a scaled-down stage scales the text back up to 13px.\\n var t0 = svg(\\\"text\\\", { x: x + w / 2, y: y + h / 2, class: cls + \\\" in\\\", \\\"text-anchor\\\": \\\"middle\\\" });\\n it.lines.forEach(function (ln, li) { var ts = svg(\\\"tspan\\\", { x: x + w / 2, dy: li ? \\\"1.3em\\\" : (0.35 - (it.lines.length - 1) * 0.65).toFixed(2) + \\\"em\\\" }); ts.textContent = li < it.lines.length - 1 ? ln + \\\" \\\" : ln; add(t0, ts); });\\n add(g, t0);\\n add(g, svg(\\\"title\\\", {}, it.lines.join(\\\" \\\")));\\n } else if (it.t === \\\"rect\\\" || it.t === \\\"pill\\\") {\\n add(g, svg(\\\"rect\\\", { x: x, y: y, width: w, height: h, rx: it.t === \\\"pill\\\" ? h / 2 : 10, class: \\\"shape\\\" }));\\n // A glyph on the box's left (a table, a stack of files, a cylinder, a person…): an illustration, not boxed text.\\n var gx = 0;\\n if (it.icon && glyph(it.icon)) { gx = 26; var gl = glyph(it.icon); add(g, svg(\\\"path\\\", { d: gl, class: \\\"glyph\\\", transform: \\\"translate(\\\" + (x + 10) + \\\",\\\" + (y + h / 2 - 9) + \\\") scale(0.75)\\\" })); }\\n var cx0 = x + gx + (w - gx) / 2;\\n if (it.sub) { add(g, txt(cx0, y + h / 2 - 3, it.label, cls + \\\" in\\\", \\\"middle\\\"), txt(cx0, y + h / 2 + 14, it.sub, \\\"sub in\\\", \\\"middle\\\")); }\\n else if (it.label) add(g, txt(cx0, y + h / 2 + 5, it.label, cls + \\\" in\\\", \\\"middle\\\"));\\n if (it.badge) { add(g, svg(\\\"rect\\\", { x: x + w - 34, y: y - 10, width: 32, height: 20, rx: 10, class: \\\"badge\\\" }), txt(x + w - 18, y + 4.5, it.badge, \\\"badge-t\\\", \\\"middle\\\")); }\\n } else if (it.t === \\\"stack\\\") {\\n // A stack of tiles, offset, the front one carrying the name and size. No folded page.\\n var sw0 = w || 30, sh0 = h || 36;\\n [[6, -6], [3, -3], [0, 0]].forEach(function (o2, si) { add(g, svg(\\\"rect\\\", { x: x + o2[0], y: y + o2[1], width: sw0, height: sh0, rx: 6, class: \\\"shape\\\", opacity: si < 2 ? 0.55 : 1 })); });\\n if (it.label) add(g, txt(x + sw0 / 2 + 3, y + sh0 + 26, it.label, cls, \\\"middle\\\"));\\n if (it.sub) add(g, txt(x + sw0 / 2 + 3, y + sh0 + 42, it.sub, \\\"sub\\\", \\\"middle\\\"));\\n } else if (it.t === \\\"file\\\") {\\n // A data tile: a rounded panel with one mark, its name under it and its size or state beneath.\\n var fw = w || 36, fh = h || 44, fx = x, fy = y;\\n add(g, svg(\\\"rect\\\", { x: fx, y: fy, width: fw, height: fh, rx: Math.min(8, fw / 3, fh / 3), class: \\\"shape\\\" }));\\n if (it.label) add(g, txt(fx + fw / 2, fy + fh + 16, it.label, cls, \\\"middle\\\"));\\n if (it.sub) add(g, txt(fx + fw / 2, fy + fh + 31, it.sub, \\\"sub\\\", \\\"middle\\\"));\\n if (it.badge) { add(g, svg(\\\"rect\\\", { x: fx + fw - 14, y: fy - 10, width: 32, height: 20, rx: 10, class: \\\"badge\\\" }), txt(fx + fw + 2, fy + 4.5, it.badge, \\\"badge-t\\\", \\\"middle\\\")); }\\n } else if (it.t === \\\"tick\\\") {\\n // A mark on a timeline: a dot (or a diamond for a checkpoint), the entry's name to its right and what it did beneath.\\n if (it.shape === \\\"diamond\\\") add(g, svg(\\\"path\\\", { d: \\\"M\\\" + x + \\\",\\\" + (y - 8) + \\\" l8,8 l-8,8 l-8,-8 z\\\", class: \\\"mark\\\" }));\\n else add(g, svg(\\\"circle\\\", { cx: x, cy: y, r: 6, class: \\\"mark\\\" }));\\n if (it.label) add(g, txt(x + 16, y + (it.sub ? -2 : 5), it.label, cls));\\n if (it.sub) add(g, txt(x + 16, y + 15, it.sub, \\\"sub\\\"));\\n } else if (it.t === \\\"doc\\\") {\\n add(g, svg(\\\"rect\\\", { x: x, y: y, width: w, height: h, rx: 10, class: \\\"shape\\\" }));\\n if (it.label) add(g, txt(x + 10, y + (it.sub ? h / 2 - 3 : h / 2 + 4), it.label, cls + \\\" in\\\"));\\n if (it.sub) add(g, txt(x + 10, y + h / 2 + 12, it.sub, \\\"sub in\\\"));\\n } else if (it.t === \\\"db\\\") {\\n var ry = Math.min(10, h / 5);\\n add(g, svg(\\\"path\\\", { d: \\\"M\\\" + x + \\\",\\\" + (y + ry) + \\\" a\\\" + w / 2 + \\\",\\\" + ry + \\\" 0 0,1 \\\" + w + \\\",0 v\\\" + (h - 2 * ry) + \\\" a\\\" + w / 2 + \\\",\\\" + ry + \\\" 0 0,1 -\\\" + w + \\\",0 z\\\", class: \\\"shape\\\" }));\\n add(g, svg(\\\"path\\\", { d: \\\"M\\\" + x + \\\",\\\" + (y + ry) + \\\" a\\\" + w / 2 + \\\",\\\" + ry + \\\" 0 0,0 \\\" + w + \\\",0\\\", class: \\\"shape\\\" }));\\n if (it.label) add(g, txt(x + w / 2, y + h / 2 + 8, it.label, cls + \\\" in\\\", \\\"middle\\\"));\\n } else if (it.t === \\\"lane\\\") {\\n add(g, svg(\\\"rect\\\", { x: x, y: y, width: w, height: h, rx: 12, class: \\\"lane\\\" }));\\n if (it.label) add(g, txt(x + 12, y + 16, it.label, it.mono ? \\\"mono\\\" : \\\"\\\"));\\n } else if (it.t === \\\"arrow\\\") {\\n var la = { x1: x, y1: y, x2: it.x2, y2: it.y2, class: \\\"line\\\" + (it.thin ? \\\" thin\\\" : \\\"\\\") + (it.dashed ? \\\" dash\\\" : \\\"\\\") };\\n if (!it.nohead) la[\\\"marker-end\\\"] = \\\"url(#\\\" + mid + \\\")\\\";\\n add(g, svg(\\\"line\\\", la));\\n if (it.label) {\\n // An edge's words, wrapped to short lines so a long one never runs off the frame.\\n var words0 = String(it.label).split(/\\\\s+/), lines0 = [], cur0 = \\\"\\\";\\n words0.forEach(function (w0) { if (cur0 && (cur0 + \\\" \\\" + w0).length > 18) { lines0.push(cur0); cur0 = w0; } else cur0 = cur0 ? cur0 + \\\" \\\" + w0 : w0; });\\n if (cur0) lines0.push(cur0);\\n var et = txt((x + it.x2) / 2 + 6, (y + it.y2) / 2 - 6 - (lines0.length - 1) * 8, \\\"\\\", \\\"elabel\\\");\\n lines0.forEach(function (ln, li) { var ts = svg(\\\"tspan\\\", { x: (x + it.x2) / 2 + 6, dy: li ? 16 : 0 }); ts.textContent = ln; add(et, ts); });\\n add(g, et);\\n }\\n } else if (it.t === \\\"bar\\\") {\\n add(g, svg(\\\"rect\\\", { x: x, y: y, width: Math.max(2, w), height: h, rx: Math.min(6, h / 2), class: \\\"bar\\\" }));\\n if (it.label) add(g, w >= String(it.label).length * 7.6 + 14 ? txt(x + 8, y + h / 2 + 5, it.label, \\\"lbl\\\") : txt(x + w + 6, y + h / 2 + 5, it.label, \\\"\\\"));\\n } else if (it.t === \\\"dot\\\") {\\n add(g, svg(\\\"circle\\\", { cx: x, cy: y, r: 5, class: \\\"dot\\\" }));\\n } else if (it.t === \\\"text\\\") {\\n add(g, txt(x, y, it.label, it.mono ? \\\"mono\\\" : \\\"\\\"));\\n }\\n if (it.st === \\\"gone\\\" && it.t !== \\\"arrow\\\") add(g, svg(\\\"line\\\", { x1: x - 2, y1: y + (h || 10) / 2, x2: x + (w || 10) + 2, y2: y + (h || 10) / 2, class: \\\"strike\\\" }));\\n if (it.label || it.sub) { var t = svg(\\\"title\\\"); t.textContent = [it.label, it.sub].filter(Boolean).join(\\\": \\\"); add(g, t); }\\n if (it.href && safeUrl(it.href)) {\\n // A shape that opens its section: a link, by pointer or keyboard.\\n g.setAttribute(\\\"role\\\", \\\"link\\\"); g.setAttribute(\\\"tabindex\\\", \\\"0\\\"); g.setAttribute(\\\"aria-label\\\", (it.label || \\\"Open\\\") + \\\": open its section\\\");\\n g.classList.add(\\\"hot\\\");\\n var openIt = function () { if (o.onLink) o.onLink(it.href, it); else openLink(it.href); };\\n g.addEventListener(\\\"click\\\", openIt);\\n g.addEventListener(\\\"keydown\\\", function (e) { if (e.key === \\\"Enter\\\" || e.key === \\\" \\\") { e.preventDefault(); openIt(); } });\\n }\\n add(root, g);\\n });\\n (o.callouts || []).forEach(function (c, i) {\\n // Marks appear as the steps reach them: a picture never carries a number for a part it hasn't shown yet.\\n if (o.current != null && c.step > o.current) return;\\n var on = c.step === o.current;\\n var g = svg(\\\"g\\\", { \\\"data-step\\\": String(c.step), class: \\\"co\\\" + (on ? \\\" on\\\" : \\\"\\\"), tabindex: \\\"0\\\", role: \\\"button\\\", \\\"aria-label\\\": c.n + \\\": \\\" + c.label + (on ? \\\" (this step)\\\" : \\\"\\\") });\\n // Numbered marks scale back up with the labels: readable numerals and a target a finger can press (codex, round 2).\\n add(g, svg(\\\"circle\\\", { cx: c.x, cy: c.y, r: 13 * kk }), svg(\\\"text\\\", { x: c.x, y: c.y + 4.8 * kk, \\\"text-anchor\\\": \\\"middle\\\" }, c.n));\\n var go = function () { if (o.onCallout) o.onCallout(c.step); };\\n g.addEventListener(\\\"click\\\", go);\\n g.addEventListener(\\\"keydown\\\", function (e) { if (e.key === \\\"Enter\\\" || e.key === \\\" \\\") { e.preventDefault(); go(); } });\\n add(root, g);\\n });\\n return root;\\n }\\n\\n /**\\n * Labels that would spill out of their box in this host's font are drawn narrower to fit (SVG textLength), at the\\n * same height: fonts differ between hosts and systems, and a label must stay inside its box and readable in each.\\n * Called once the scene is on the page, where text can be measured.\\n */\\n function fitLabels(root) {\\n try {\\n Array.prototype.forEach.call(root.querySelectorAll(\\\"g.it\\\"), function (g) {\\n var shape = g.querySelector(\\\"rect.shape, path.shape\\\");\\n if (!shape) return;\\n var sb = shape.getBBox();\\n Array.prototype.forEach.call(g.querySelectorAll(\\\"text\\\"), function (t) {\\n if (getComputedStyle(t).display === \\\"none\\\") return;\\n // Only a label that sits in its box (not a file's name under its glyph, or a timeline entry beside its mark).\\n var tb = t.getBBox(), cy = tb.y + tb.height / 2;\\n if (cy < sb.y || cy > sb.y + sb.height) return;\\n // Centred text has the box's width less a margin; text set from the left, what is left of the box after it.\\n var max = t.getAttribute(\\\"text-anchor\\\") === \\\"middle\\\" ? sb.width - 8 : sb.x + sb.width - 4 - Number(t.getAttribute(\\\"x\\\"));\\n // A label of several lines that its box can't hold at this scale is rewrapped into the lines that fit, whole,\\n // and squeezed to the box's width; only when that would squeeze it past 60% do the last words give way to \\\"…\\\"\\n // (the whole label is the item's title). Never a silent cut where the words can fit (codex, 1.7.1).\\n var spans = t.querySelectorAll(\\\"tspan\\\");\\n if (spans.length > 1) {\\n Array.prototype.forEach.call(spans, function (sp) { if (sp.hasAttribute(\\\"data-full\\\")) sp.textContent = sp.getAttribute(\\\"data-full\\\"); else sp.setAttribute(\\\"data-full\\\", sp.textContent); sp.style.display = \\\"\\\"; sp.removeAttribute(\\\"textLength\\\"); sp.removeAttribute(\\\"lengthAdjust\\\"); });\\n var unit = parseFloat(getComputedStyle(t).fontSize) || 13;\\n var room = Math.floor((sb.height - 2) / (unit * 1.3));\\n var lead = function (n) { return (0.35 - (n - 1) * 0.65).toFixed(2) + \\\"em\\\"; };\\n if (room < 1) Array.prototype.forEach.call(spans, function (sp) { sp.style.display = \\\"none\\\"; });\\n else if (room < spans.length) {\\n var words = Array.prototype.map.call(spans, function (sp) { return sp.getAttribute(\\\"data-full\\\"); }).join(\\\" \\\").split(/\\\\s+/).filter(Boolean);\\n var per = Math.ceil(words.length / room);\\n Array.prototype.forEach.call(spans, function (sp, i) { if (i < room) { var w = words.slice(i * per, (i + 1) * per).join(\\\" \\\"); sp.textContent = i < room - 1 ? w + \\\" \\\" : w; } else sp.style.display = \\\"none\\\"; });\\n spans[0].setAttribute(\\\"dy\\\", lead(room));\\n // Past 60%, the last resort: the last line ends where it fits, with an ellipsis. Measured at its natural width: the\\n // squeeze of an earlier pass was cleared above, or the loop would see a line already shrunk to the box.\\n var last = spans[room - 1];\\n while (last.getComputedTextLength && last.getComputedTextLength() * 0.6 > sb.width - 8 && last.textContent.length > 2) last.textContent = last.textContent.replace(/\\\\s*\\\\S+…?\\\\s*$/, \\\"\\\") + \\\"…\\\";\\n } else spans[0].setAttribute(\\\"dy\\\", lead(spans.length));\\n }\\n var parts = spans.length ? Array.prototype.filter.call(spans, function (sp) { return sp.style.display !== \\\"none\\\"; }) : [t];\\n if (!parts.length) return;\\n Array.prototype.forEach.call(parts, function (p) {\\n p.removeAttribute(\\\"textLength\\\");\\n if (p.getComputedTextLength() > max && max > 0) { p.setAttribute(\\\"textLength\\\", String(Math.floor(max))); p.setAttribute(\\\"lengthAdjust\\\", \\\"spacingAndGlyphs\\\"); }\\n });\\n });\\n });\\n } catch (x) {}\\n return root;\\n }\\n\\n /**\\n * Frame a scene once it is on the page, where its text can be measured: the camera holds the step's focal group\\n * (what is new, else what is lit) and the step's own callout, with their labels as drawn in this host's font, plus at\\n * least 32 screen pixels round them, so nothing of the subject is cut and the stage's faded edge falls on context\\n * only. Labels are scaled back up to 13px or more, squeezed into their boxes where a font sets wide, and each callout\\n * is moved off any label it would cover; a callout the camera can't show is hidden. Then the camera eases there.\\n */\\n function frameScene(root, fit, fromBox) {\\n root.classList.add(\\\"k-zoom\\\");\\n var W = Number(root.getAttribute(\\\"data-w\\\")), H = Number(root.getAttribute(\\\"data-h\\\"));\\n var all = Array.prototype.slice.call(root.querySelectorAll(\\\"g.it\\\"));\\n var has = function (g, c) { return g.classList.contains(c); };\\n var focal = all.filter(function (g) { return has(g, \\\"st-new\\\"); });\\n if (!focal.length) focal = all.filter(function (g) { return has(g, \\\"st-focus\\\") || has(g, \\\"st-gone\\\") || has(g, \\\"st-bad\\\") || has(g, \\\"st-ok\\\"); });\\n var noLanes = focal.filter(function (g) { return !g.querySelector(\\\".lane\\\"); });\\n if (noLanes.length) focal = noLanes;\\n if (!focal.length) focal = all;\\n var mine = root.querySelector(\\\"g.co.on\\\");\\n var box = null, k = 1;\\n for (var pass = 0; pass < 8; pass++) {\\n root.style.setProperty(\\\"--k-k\\\", k.toFixed(3));\\n root.classList.toggle(\\\"k-tight\\\", k > 1.12);\\n fitLabels(root);\\n placeCallouts(root, k);\\n var x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\\n focal.concat(mine ? [mine] : []).forEach(function (g) { var b = g.getBBox(); if (!b.width && !b.height) return; x0 = Math.min(x0, b.x); y0 = Math.min(y0, b.y); x1 = Math.max(x1, b.x + b.width); y1 = Math.max(y1, b.y + b.height); });\\n if (x0 === Infinity) return root;\\n var scale = box ? Math.min(fit.w / box[2], fit.h / box[3]) : 1;\\n var pad = 32 / scale;\\n x0 -= pad; y0 -= pad; x1 += pad; y1 += pad;\\n var bw = x1 - x0, bh = y1 - y0, aspect = fit.w / fit.h;\\n // At most one canvas unit a pixel; never less than the focal group needs.\\n var vw = Math.max(bw, Math.min(W, fit.w)), vh = Math.max(bh, Math.min(H, fit.h));\\n if (vw / vh > aspect) vh = vw / aspect; else vw = vh * aspect;\\n var cx = (x0 + x1) / 2, cy = (y0 + y1) / 2;\\n var x = clamp(cx - vw / 2, Math.min(0, x0), Math.max(W - vw, x1 - vw)), y = clamp(cy - vh / 2, Math.min(0, y0), Math.max(H - vh, y1 - vh));\\n box = [x, y, vw, vh].map(function (v) { return Math.round(v * 10) / 10; });\\n root.setAttribute(\\\"viewBox\\\", box.join(\\\" \\\"));\\n var nk = Math.max(1, 1 / Math.min(fit.w / vw, fit.h / vh));\\n if (Math.abs(nk - k) < 0.01 && pass > 0) break;\\n k = nk;\\n }\\n // The labels at the scale the camera settled on.\\n root.style.setProperty(\\\"--k-k\\\", k.toFixed(3));\\n root.classList.toggle(\\\"k-tight\\\", k > 1.12);\\n fitLabels(root);\\n placeCallouts(root, k);\\n root.box = box;\\n // A callout the camera can't show whole is hidden (it couldn't be pressed).\\n Array.prototype.forEach.call(root.querySelectorAll(\\\"g.co\\\"), function (g) {\\n var b = g.getBBox();\\n if (g.style.display === \\\"none\\\") return;\\n g.style.display = b.x >= box[0] && b.y >= box[1] && b.x + b.width <= box[0] + box[2] && b.y + b.height <= box[1] + box[3] ? \\\"\\\" : \\\"none\\\";\\n });\\n if (fromBox && !reduced()) tweenBox(root, fromBox, box);\\n return root;\\n }\\n /**\\n * A whole scene in the stage (a concept's compact canvas, drawn to be read at full size): the canvas and a small\\n * margin, the labels kept at 13px or more for the scale it lands at, squeezed into their boxes in a wide font, and the\\n * callouts moved off any label.\\n */\\n function wholeScene(root, fit) {\\n var W = Number(root.getAttribute(\\\"data-w\\\")), H = Number(root.getAttribute(\\\"data-h\\\")), m = 8;\\n var box = [-m, -m, W + 2 * m, H + 2 * m];\\n root.setAttribute(\\\"viewBox\\\", box.join(\\\" \\\"));\\n root.style.height = fit.h + \\\"px\\\";\\n root.classList.remove(\\\"k-zoom\\\");\\n var k = Math.max(1, 1 / Math.min(fit.w / box[2], fit.h / box[3]));\\n root.style.setProperty(\\\"--k-k\\\", k.toFixed(3));\\n root.classList.toggle(\\\"k-tight\\\", k > 1.12);\\n fitLabels(root);\\n placeCallouts(root, k);\\n root.box = box;\\n return root;\\n }\\n /** Move each callout off any label it would cover: the first clear spot round where it was placed. */\\n function placeCallouts(root, k) {\\n var texts = Array.prototype.slice.call(root.querySelectorAll(\\\"g.it text\\\")).filter(function (t) { return getComputedStyle(t).display !== \\\"none\\\" && t.textContent; }).map(function (t) { return t.getBBox(); });\\n var hit = function (cx, cy, r) { return texts.some(function (b) { return cx + r > b.x && cx - r < b.x + b.width && cy + r > b.y && cy - r < b.y + b.height; }); };\\n Array.prototype.forEach.call(root.querySelectorAll(\\\"g.co\\\"), function (g) {\\n var c = g.querySelector(\\\"circle\\\"), t = g.querySelector(\\\"text\\\");\\n var ox = Number(g.getAttribute(\\\"data-x\\\") || c.getAttribute(\\\"cx\\\")), oy = Number(g.getAttribute(\\\"data-y\\\") || c.getAttribute(\\\"cy\\\"));\\n g.setAttribute(\\\"data-x\\\", ox); g.setAttribute(\\\"data-y\\\", oy);\\n var r = 13 * k, d = r * 2.2, best = null;\\n var tries = [[0, 0], [d, 0], [-d, 0], [0, -d], [0, d], [d, -d], [-d, -d], [d, d], [-d, d], [2 * d, 0], [-2 * d, 0], [0, -2 * d], [0, 2 * d]];\\n var W = Number(root.getAttribute(\\\"data-w\\\")), H = Number(root.getAttribute(\\\"data-h\\\"));\\n var onCanvas = function (cx, cy) { return cx - r >= -4 && cy - r >= -4 && cx + r <= W + 4 && cy + r <= H + 4; };\\n for (var i = 0; i < tries.length; i++) { var tx = ox + tries[i][0], ty = oy + tries[i][1]; if (onCanvas(tx, ty) && !hit(tx, ty, r + 2)) { best = [tx, ty]; break; } }\\n // No clear spot: the mark is left out rather than laid over a label (it is the picture's aid, not its content).\\n g.style.display = best ? \\\"\\\" : \\\"none\\\";\\n if (!best) best = [ox, oy];\\n c.setAttribute(\\\"cx\\\", best[0]); c.setAttribute(\\\"cy\\\", best[1]); c.setAttribute(\\\"r\\\", r);\\n t.setAttribute(\\\"x\\\", best[0]); t.setAttribute(\\\"y\\\", best[1] + 4.8 * k);\\n });\\n }\\n\\n /** The bounds of one scene item, in canvas units. */\\n function itemBounds(it) {\\n if (it.t === \\\"arrow\\\") return [Math.min(it.x, it.x2), Math.min(it.y, it.y2), Math.abs(it.x2 - it.x), Math.abs(it.y2 - it.y)];\\n if (it.t === \\\"text\\\") return [it.x, it.y - 13, String(it.label || \\\"\\\").length * 7.2, 17];\\n if (it.t === \\\"dot\\\") return [it.x - 6, it.y - 6, 12, 12];\\n if (it.t === \\\"file\\\") return [it.x - 30, it.y - 10, (it.w || 36) + 60, (it.h || 44) + 46];\\n if (it.t === \\\"tick\\\") return [it.x - 9, it.y - 12, 16 + String(it.sub || it.label || \\\"\\\").length * 7.4, 34];\\n if (it.t === \\\"cam\\\") return [it.x + 14, it.y + 14, it.w - 28, it.h - 28];\\n return [it.x, it.y, it.w || 0, it.h || 0];\\n }\\n /**\\n * The part of the canvas a step is about, at a scale that keeps its labels readable: the bounds of what is new (else\\n * what is lit, else everything), widened to the stage's own size at one canvas unit a pixel where it fits, so a\\n * narrow card zooms in on the step's subject instead of shrinking the whole picture. fit: { w, h } in pixels.\\n */\\n function fitBox(spec, fit, W, H) {\\n var items = (spec.items || []).filter(function (it) { return !it.view || !fit.view || it.view === fit.view; });\\n // A scene can name its camera outright (an item of type \\\"cam\\\"): the part of the picture the step is about.\\n var cam = items.filter(function (it) { return it.t === \\\"cam\\\"; })[0];\\n var pick = function (sts) { return items.filter(function (it) { return sts.indexOf(it.st) >= 0 && it.t !== \\\"lane\\\"; }); };\\n var f = cam ? [cam] : pick([\\\"new\\\"]); if (!f.length) f = pick([\\\"focus\\\", \\\"gone\\\", \\\"bad\\\", \\\"ok\\\"]); if (!f.length) f = items.filter(function (it) { return it.t !== \\\"lane\\\"; }); if (!f.length) return [0, 0, W, H];\\n var x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\\n f.forEach(function (it) { var b = itemBounds(it); x0 = Math.min(x0, b[0]); y0 = Math.min(y0, b[1]); x1 = Math.max(x1, b[0] + b[2]); y1 = Math.max(y1, b[1] + b[3]); });\\n x0 -= 14; y0 -= 14; x1 += 14; y1 += 14;\\n var bw = x1 - x0, bh = y1 - y0, tw = Math.min(fit.w, W), th = Math.min(fit.h, H);\\n var s = Math.min(1, tw / bw, th / bh);\\n var vw = Math.min(W, Math.max(bw, tw / s)), vh = Math.min(H, Math.max(bh, th / s));\\n // Keep the stage's own shape.\\n var aspect = fit.w / fit.h;\\n if (vw / vh > aspect) vh = Math.min(H, vw / aspect); else vw = Math.min(W, vh * aspect);\\n var cx = (x0 + x1) / 2, cy = (y0 + y1) / 2;\\n var x = clamp(cx - vw / 2, 0, Math.max(0, W - vw)), y = clamp(cy - vh / 2, 0, Math.max(0, H - vh));\\n return [Math.round(x), Math.round(y), Math.round(vw), Math.round(vh)];\\n }\\n /** Ease the camera from the last step's box to this one's. */\\n function tweenBox(root, a, b) {\\n var t0 = null, D = 320;\\n root.setAttribute(\\\"viewBox\\\", a.join(\\\" \\\"));\\n var stepF = function (t) {\\n if (t0 === null) t0 = t;\\n var k = Math.min(1, (t - t0) / D), e = 1 - Math.pow(1 - k, 3);\\n root.setAttribute(\\\"viewBox\\\", a.map(function (v, i) { return (v + (b[i] - v) * e).toFixed(1); }).join(\\\" \\\"));\\n if (k < 1 && root.isConnected !== false) requestAnimationFrame(stepF);\\n };\\n requestAnimationFrame(stepF);\\n }\\n\\n/** Glyphs a scene's boxes can carry (24-unit paths, drawn at 18px). */\\nvar GLYPHS = {\\n table: \\\"M3 5h18v14H3zM3 10h18M3 15h18M9 5v14\\\", files: \\\"M8 3h8l4 4v12H8zM16 3v4h4M4 7v14h11\\\", file: \\\"M6 3h9l4 4v14H6zM15 3v4h4\\\",\\n db: \\\"M4 6c0-1.7 3.6-3 8-3s8 1.3 8 3-3.6 3-8 3-8-1.3-8-3zM4 6v12c0 1.7 3.6 3 8 3s8-1.3 8-3V6M4 12c0 1.7 3.6 3 8 3s8-1.3 8-3\\\",\\n folder: \\\"M3 6h6l2 2h10v11H3z\\\", user: \\\"M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM4 21c1-4 4-6 8-6s7 2 8 6\\\", users: \\\"M9 11a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7zM2 20c.8-3.4 3.4-5 7-5s6.2 1.6 7 5M16 4.5a3.5 3.5 0 0 1 0 6.5M18 15c2 .6 3.4 2.2 4 5\\\",\\n gear: \\\"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9l2.1 2.1M17 17l2.1 2.1M4.9 19.1L7 17M17 7l2.1-2.1\\\",\\n chart: \\\"M4 20V10M10 20V4M16 20v-7M22 20H2\\\", bolt: \\\"M13 3L5 14h6l-1 7 8-11h-6z\\\", lock: \\\"M6 11h12v10H6zM8 11V7a4 4 0 0 1 8 0v4\\\",\\n cloud: \\\"M7 18h10a4 4 0 0 0 .5-8A6 6 0 0 0 6 9.5 4.3 4.3 0 0 0 7 18z\\\", stream: \\\"M3 8c3-3 6 3 9 0s6 3 9 0M3 14c3-3 6 3 9 0s6 3 9 0\\\",\\n clock: \\\"M12 7v5l3 2M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18z\\\", model: \\\"M12 3l8 4.5v9L12 21l-8-4.5v-9zM12 12l8-4.5M12 12v9M12 12L4 7.5\\\",\\n branch: \\\"M6 3v12M6 15a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM18 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM18 9c0 6-12 3-12 9\\\", check: \\\"M5 12.5l4.5 4.5L19 7.5\\\",\\n};\\nfunction glyph(name) { return Object.prototype.hasOwnProperty.call(GLYPHS, name) ? GLYPHS[name] : null; }\\n\\n/* ---- flow diagrams from a graph or Mermaid source (the subset the guide uses; also A2UI's Diagram) ---- */\\n/** A dictionary with no prototype: keys are only what was put in. */\\nfunction dict() { return Object.create(null); }\\nfunction mLabel(s) { return String(s == null ? \\\"\\\" : s).replace(/^\\\"|\\\"$/g, \\\"\\\").replace(/<br\\\\s*\\\\/?>/gi, \\\"\\\\n\\\").replace(/&quot;/g, '\\\"').replace(/&amp;/g, \\\"&\\\").replace(/[`*]/g, \\\"\\\").trim(); }\\nvar M_SHAPES = [[/^\\\\[\\\\((.*?)\\\\)\\\\]/, \\\"db\\\"], [/^\\\\(\\\\((.*?)\\\\)\\\\)/, \\\"pill\\\"], [/^\\\\{\\\\{(.*?)\\\\}\\\\}/, \\\"rect\\\"], [/^\\\\[\\\\/(.*?)\\\\/\\\\]/, \\\"rect\\\"], [/^\\\\[\\\\\\\\(.*?)\\\\\\\\\\\\]/, \\\"rect\\\"], [/^\\\\[(.*?)\\\\]/, \\\"rect\\\"], [/^\\\\((.*?)\\\\)/, \\\"pill\\\"], [/^\\\\{(.*?)\\\\}/, \\\"rect\\\"], [/^>(.*?)\\\\]/, \\\"rect\\\"]];\\nvar M_LINK = /^\\\\s*(-\\\\.->|-\\\\.-|==>|-->|---|~~~|--\\\\s+([^-][^>]*?)\\\\s+-->|-\\\\.\\\\s+([^.][^>]*?)\\\\s+\\\\.->)\\\\s*(?:\\\\|([^|]*)\\\\|)?\\\\s*/;\\nfunction mNode(s) {\\n var m = s.match(/^\\\\s*([A-Za-z0-9_][A-Za-z0-9_-]*)/);\\n if (!m) return null;\\n var rest = s.slice(m[0].length), text = null, shape = null;\\n for (var i = 0; i < M_SHAPES.length; i++) { var k = rest.match(M_SHAPES[i][0]); if (k) { text = mLabel(k[1]); shape = M_SHAPES[i][1]; rest = rest.slice(k[0].length); break; } }\\n rest = rest.replace(/^:::[A-Za-z0-9_-]+/, \\\"\\\");\\n return { id: m[1], text: text, shape: shape, rest: rest };\\n}\\n/** Mermaid flowchart or sequence source to { kind, nodes: [{ id, text, shape }], edges: [{ from, to, text, kind }] }, or null. */\\nfunction parseMermaid(source) {\\n var lines = String(source || \\\"\\\").replace(/\\\\r/g, \\\"\\\").split(\\\"\\\\n\\\").filter(function (l) { return l.trim() && !/^\\\\s*%%/.test(l); });\\n if (!lines.length) return null;\\n var head = lines[0].trim(), nodes = dict(), order = [], edges = [];\\n var seen = function (r) { var n = nodes[r.id]; if (!n) { n = nodes[r.id] = { id: r.id, text: r.id, shape: \\\"rect\\\" }; order.push(r.id); } if (r.text !== null && r.text !== undefined) { n.text = r.text; n.shape = r.shape || n.shape; } return n; };\\n if (/^(flowchart|graph)\\\\b/.test(head)) {\\n lines.slice(1).forEach(function (raw) {\\n var line = raw.replace(/%%.*$/, \\\"\\\").trim();\\n if (!line || /^(class|classDef|style|linkStyle|click|subgraph|end|direction)\\\\b/.test(line)) return;\\n var cur = mNode(line); if (!cur) return;\\n var groups = [cur], rest = cur.rest;\\n while (/^\\\\s*&/.test(rest)) { var r0 = mNode(rest.replace(/^\\\\s*&/, \\\"\\\")); if (!r0) break; groups.push(r0); rest = r0.rest; }\\n groups.forEach(seen);\\n for (var guard = 0; guard < 50; guard++) {\\n var l = rest.match(M_LINK); if (!l) break;\\n var kind = l[1].indexOf(\\\"~~~\\\") === 0 ? \\\"invisible\\\" : l[1].indexOf(\\\".\\\") >= 0 ? \\\"dotted\\\" : \\\"solid\\\";\\n var text = mLabel(l[4] || l[2] || l[3] || \\\"\\\") || null;\\n rest = rest.slice(l[0].length);\\n var r = mNode(rest); if (!r) break; rest = r.rest;\\n var next = [r];\\n while (/^\\\\s*&/.test(rest)) { var r2 = mNode(rest.replace(/^\\\\s*&/, \\\"\\\")); if (!r2) break; next.push(r2); rest = r2.rest; }\\n next.forEach(seen);\\n groups.forEach(function (a) { next.forEach(function (b) { edges.push({ from: a.id, to: b.id, text: text, kind: kind }); }); });\\n groups = next;\\n }\\n });\\n var dm = head.match(/^(?:flowchart|graph)\\\\s+(TB|TD|BT|LR|RL)/);\\n return { kind: \\\"flowchart\\\", dir: dm && (dm[1] === \\\"LR\\\" || dm[1] === \\\"RL\\\") ? \\\"LR\\\" : \\\"TB\\\", nodes: order.map(function (id) { return nodes[id]; }), edges: edges };\\n }\\n if (/^sequenceDiagram\\\\b/.test(head)) {\\n lines.slice(1).forEach(function (raw) {\\n var line = raw.trim(), p = line.match(/^(?:participant|actor)\\\\s+([^\\\\s]+)(?:\\\\s+as\\\\s+(.+))?$/);\\n if (p) { seen({ id: p[1], text: p[2] ? mLabel(p[2]) : null, shape: \\\"rect\\\" }); return; }\\n var note = line.match(/^Note\\\\s+(?:over|left of|right of)\\\\s+([^\\\\s,:]+)(?:\\\\s*,\\\\s*[^\\\\s:]+)?\\\\s*:\\\\s*(.*)$/i);\\n if (note) { seen({ id: note[1], text: null }); edges.push({ from: note[1], to: note[1], text: mLabel(note[2]) || null, kind: \\\"note\\\" }); return; }\\n var m = line.match(/^([^\\\\s\\\\-+>]+?)\\\\s*(-?->>|-?->|-?-x|-?-\\\\))\\\\s*[+-]?([^\\\\s:]+?)\\\\s*:\\\\s*(.*)$/);\\n if (m) { seen({ id: m[1], text: null }); seen({ id: m[3], text: null }); edges.push({ from: m[1], to: m[3], text: mLabel(m[4]) || null, kind: m[2].indexOf(\\\"--\\\") === 0 ? \\\"dotted\\\" : \\\"solid\\\" }); }\\n });\\n return { kind: \\\"sequence\\\", nodes: order.map(function (id) { return nodes[id]; }), edges: edges };\\n }\\n return null;\\n}\\nfunction wrapWords(s, n) { var out = [], cur = \\\"\\\"; String(s).split(/\\\\s+/).forEach(function (w) { if (cur && (cur + \\\" \\\" + w).length > n) { out.push(cur); cur = w; } else cur = cur ? cur + \\\" \\\" + w : w; }); if (cur) out.push(cur); return out.length ? out : [\\\"\\\"]; }\\nfunction wrapLines(t, n) { var out = []; String(t).split(\\\"\\\\n\\\").forEach(function (l) { out = out.concat(wrapWords(l, n || 18)); }); return out; }\\n/** Positions for a graph's nodes, in layers top to bottom (longest path from the sources, barycentre ordering). */\\nfunction layoutGraph(g) {\\n var ids = g.nodes.map(function (n) { return n.id; }), out = dict(), inc = dict();\\n ids.forEach(function (id) { out[id] = []; inc[id] = []; });\\n g.edges.forEach(function (e) { if (e.kind !== \\\"invisible\\\" && e.from !== e.to && out[e.from] && inc[e.to]) { out[e.from].push(e.to); inc[e.to].push(e.from); } });\\n var place = dict();\\n if (g.kind === \\\"sequence\\\") {\\n g.nodes.forEach(function (n, i) { var ls = wrapLines(n.text, 14); place[n.id] = { x: 20 + i * 170, y: 20, w: 150, h: 22 + ls.length * 17, ls: ls }; });\\n return place;\\n }\\n var state = dict(), back = dict();\\n var visit = function (id) { state[id] = 1; out[id].forEach(function (t) { if (state[t] === 1) back[id + \\\">\\\" + t] = 1; else if (!state[t]) visit(t); }); state[id] = 2; };\\n ids.forEach(function (id) { if (!state[id]) visit(id); });\\n var rank = dict();\\n var rankOf = function (id, stackS) { if (rank[id] != null) return rank[id]; stackS[id] = 1; var r = 0; inc[id].forEach(function (f) { if (!back[f + \\\">\\\" + id] && !stackS[f]) r = Math.max(r, rankOf(f, stackS) + 1); }); delete stackS[id]; rank[id] = r; return r; };\\n ids.forEach(function (id) { rankOf(id, dict()); });\\n var layers = [];\\n ids.forEach(function (id) { (layers[rank[id]] = layers[rank[id]] || []).push(id); });\\n layers = layers.filter(Boolean);\\n var pos = dict();\\n layers.forEach(function (l) { l.forEach(function (id, i) { pos[id] = i; }); });\\n var bary = function (id, nb) { return nb.length ? nb.reduce(function (a, n) { return a + pos[n]; }, 0) / nb.length : pos[id]; };\\n for (var pass = 0; pass < 2; pass++) {\\n for (var r = 1; r < layers.length; r++) { layers[r].sort(function (a, b) { return bary(a, inc[a]) - bary(b, inc[b]); }); layers[r].forEach(function (id, i) { pos[id] = i; }); }\\n for (var r2 = layers.length - 2; r2 >= 0; r2--) { layers[r2].sort(function (a, b) { return bary(a, out[a]) - bary(b, out[b]); }); layers[r2].forEach(function (id, i) { pos[id] = i; }); }\\n }\\n var size = dict();\\n g.nodes.forEach(function (n) { var ls = wrapLines(n.text, g.dir === \\\"LR\\\" ? 14 : 18); size[n.id] = { w: Math.max(96, Math.max.apply(null, ls.map(function (l) { return l.length; })) * 8.2 + 24), h: 22 + ls.length * 17, ls: ls }; });\\n if (g.dir === \\\"LR\\\") {\\n // Left to right: a layer a column, its nodes stacked and centred on the column.\\n var x0 = 20;\\n layers.forEach(function (l) {\\n var w0 = Math.max.apply(null, l.map(function (id) { return size[id].w; }));\\n var total0 = l.reduce(function (a, id) { return a + size[id].h; }, 0) + 20 * (l.length - 1), y0 = 20 - total0 / 2;\\n l.forEach(function (id) { var s = size[id]; place[id] = { x: x0 + (w0 - s.w) / 2, y: y0, w: s.w, h: s.h, ls: s.ls }; y0 += s.h + 20; });\\n x0 += w0 + 48;\\n });\\n } else {\\n var y = 20;\\n layers.forEach(function (l) {\\n var h = Math.max.apply(null, l.map(function (id) { return size[id].h; }));\\n var total = l.reduce(function (a, id) { return a + size[id].w; }, 0) + 24 * (l.length - 1), x = 20 - total / 2;\\n l.forEach(function (id) { var s = size[id]; place[id] = { x: x, y: y + (h - s.h) / 2, w: s.w, h: s.h, ls: s.ls }; x += s.w + 24; });\\n y += h + 56;\\n });\\n }\\n var minX = Infinity, minY = Infinity;\\n for (var k in place) { minX = Math.min(minX, place[k].x); minY = Math.min(minY, place[k].y); }\\n for (var k2 in place) { place[k2].x = Math.round(place[k2].x - minX + 20); place[k2].y = Math.round(place[k2].y - minY + 20); }\\n return place;\\n}\\nfunction edgePoint(p, tx, ty) {\\n var cx = p.x + p.w / 2, cy = p.y + p.h / 2, dx = tx - cx, dy = ty - cy;\\n if (!dx && !dy) return [cx, cy];\\n var s = Math.min(Math.abs((p.w / 2 + 2) / (dx || 1e-9)), Math.abs((p.h / 2 + 2) / (dy || 1e-9)));\\n return [Math.round(cx + dx * s), Math.round(cy + dy * s)];\\n}\\n/** The scene for step k of a graph: edges 0..k drawn, edge k new and labelled, its ends lit; k >= edges, the whole. */\\nfunction graphScene(g, place, k, hrefs) {\\n var items = [], W = 0, H = 0, E = g.edges.length;\\n for (var id in place) { W = Math.max(W, place[id].x + place[id].w + 20); H = Math.max(H, place[id].y + place[id].h + 20); }\\n var cur = k >= 0 && k < E ? g.edges[k] : null;\\n if (g.kind === \\\"sequence\\\") {\\n H = Math.max(H, 90 + E * 44 + 20);\\n g.nodes.forEach(function (n) { var p = place[n.id]; items.push({ id: \\\"life-\\\" + n.id, t: \\\"arrow\\\", x: p.x + p.w / 2, y: p.y + p.h, x2: p.x + p.w / 2, y2: H - 10, dashed: true, thin: true, nohead: true }); });\\n g.edges.forEach(function (e, i) {\\n if (i > k && k < E) return;\\n var a = place[e.from], b = place[e.to], yy = 90 + i * 44;\\n if (e.kind === \\\"note\\\") { var t = e.text || \\\"\\\", w = Math.max(120, Math.min(260, t.length * 7.6 + 24)); items.push({ id: \\\"m\\\" + i, t: \\\"pill\\\", x: a.x + a.w / 2 - w / 2, y: yy - 14, w: w, h: 28, label: t, st: i === k ? \\\"new\\\" : undefined }); return; }\\n items.push({ id: \\\"m\\\" + i, t: \\\"arrow\\\", x: a.x + a.w / 2, y: yy, x2: b.x + b.w / 2 + (e.from === e.to ? 40 : 0), y2: yy + (e.from === e.to ? 14 : 0), dashed: e.kind === \\\"dotted\\\", label: i === k || k >= E ? e.text || undefined : undefined, st: i === k ? \\\"new\\\" : undefined });\\n });\\n } else {\\n g.edges.forEach(function (e, i) {\\n if (e.kind === \\\"invisible\\\" || (k < E && i > k) || !place[e.from] || !place[e.to]) return;\\n var a = place[e.from], b = place[e.to], p1 = edgePoint(a, b.x + b.w / 2, b.y + b.h / 2), p2 = edgePoint(b, a.x + a.w / 2, a.y + a.h / 2);\\n items.push({ id: \\\"e\\\" + i, t: \\\"arrow\\\", x: p1[0], y: p1[1], x2: p2[0], y2: p2[1], dashed: e.kind === \\\"dotted\\\", label: i === k || k >= E ? e.text || undefined : undefined, st: i === k ? \\\"new\\\" : undefined });\\n });\\n }\\n g.nodes.forEach(function (n) {\\n var p = place[n.id], lit = cur && (cur.from === n.id || cur.to === n.id);\\n items.push({ id: \\\"n-\\\" + n.id, t: n.shape === \\\"db\\\" ? \\\"db\\\" : n.shape === \\\"pill\\\" ? \\\"pill\\\" : \\\"rect\\\", x: p.x, y: p.y, w: p.w, h: p.h, label: p.ls.join(\\\" \\\"), lines: p.ls, st: lit ? \\\"focus\\\" : undefined, href: hrefs && Object.prototype.hasOwnProperty.call(hrefs, n.id) ? hrefs[n.id] : undefined });\\n });\\n return { w: Math.max(200, Math.round(W)), h: Math.max(120, Math.round(H)), items: items, zoom: k < E };\\n}\\n\\n/**\\n * stage(o): the illustration panel. o: { scene, fit: { h } (default the stage height), callouts, current, view,\\n * onCallout(step), label, fromBox, whole (true: the whole canvas; else frame the step's subject when scene.zoom) }.\\n * Returns a div.k-stage holding the SVG; .box is the camera it settled on (pass it as fromBox next time to ease).\\n */\\nfunction stage(o) {\\n var box = el(\\\"div\\\", \\\"k-stage\\\");\\n if (o.height) box.style.height = o.height + \\\"px\\\";\\n box.setAttribute(\\\"data-k-stage\\\", \\\"\\\");\\n var draw = function () {\\n clear(box);\\n var w = Math.max(200, box.clientWidth || 600), h = o.height || box.clientHeight || 208;\\n var fit = { w: w, h: h, view: o.view || null };\\n var sc = scene(o.scene, { view: o.view, callouts: o.callouts, current: o.current, onCallout: o.onCallout, label: o.label, fit: fit, fromBox: o.fromBox, frameLater: true, onLink: o.onLink });\\n add(box, sc);\\n if (o.scene.zoom && !o.whole) frameScene(sc, fit, o.fromBox); else wholeScene(sc, fit, o.fromBox);\\n box.box = sc.box; box.svg = sc;\\n };\\n box.draw = draw;\\n // Drawn when it is on the page and has its real width.\\n requestAnimationFrame(function () { if (box.isConnected) draw(); });\\n onFonts(function () { if (box.isConnected) draw(); });\\n onWidth(box, function () { draw(); });\\n return box;\\n}\\nK.GLYPHS = GLYPHS; K.scene = scene; K.frameScene = frameScene; K.wholeScene = wholeScene; K.fitLabels = fitLabels; K.stage = stage;\\nK.parseMermaid = parseMermaid; K.layoutGraph = layoutGraph; K.graphScene = graphScene;\\n\\n/* stepper.js */\\n/* ---- the guided step card ----\\n * stepper(o): STEP n OF N with segmented progress, one illustration that changes one thing a step, a short title, a\\n * sentence or two, an optional tip; Back and a Next pill; Play advances every 4 s (6 s with reduced motion) and pauses\\n * while the pointer or focus is on the card; arrow keys and a swipe step too; callouts on the picture jump to their\\n * step. The last card is the recap. Every step's text is laid in one grid cell, so the card never jumps in height.\\n *\\n * o: { title, sub, level, mark, steps: [{ title, body, tip, scene, render(stageNode), cite: { url, label } }], caption,\\n * views: [labelA, labelB] (a toggle on the same picture; scene items carry view \\\"a\\\" or \\\"b\\\"), callouts,\\n * recap: { title, bullets, actions: [{ label, fn, primary, icon, arrow }] }, tools: [nodes], onStep(i, step),\\n * onView(i), stateKey, start, stageHeight, label }\\n */\\nfunction stepper(o) {\\n var steps = o.steps || [], N = steps.length + (o.recap ? 1 : 0), cur = 0, view = 0, playing = null, hover = false, lastBox = null;\\n var c = el(\\\"section\\\", \\\"k-card k-card--steps\\\");\\n c.setAttribute(\\\"aria-roledescription\\\", \\\"step-by-step guide\\\"); c.setAttribute(\\\"aria-label\\\", o.label || o.title || \\\"Guide\\\");\\n var head = el(\\\"div\\\", \\\"k-head\\\"), row0 = el(\\\"div\\\", \\\"k-headrow\\\"), lead = el(\\\"div\\\", \\\"k-lead\\\"), tools = el(\\\"div\\\", \\\"k-tools\\\");\\n if (o.mark) { var m = el(\\\"img\\\", \\\"k-mark\\\"); m.alt = \\\"\\\"; m.src = o.mark; m.width = 18; m.height = 18; add(lead, m); }\\n var eb = el(\\\"p\\\", \\\"k-eyebrow\\\"), ebStep = el(\\\"span\\\"), ebMeta = el(\\\"span\\\", \\\"k-eyebrow-meta\\\", o.level ? \\\" · \\\" + o.level : \\\"\\\");\\n add(eb, ebStep, ebMeta); add(lead, eb);\\n var tg = null;\\n if (o.views && o.views.length === 2) tg = segmented(o.views, 0, function (i) { view = i; draw(false); if (o.onView) o.onView(i); }, \\\"View\\\");\\n add(tools, tg, o.tools || [], expandButton());\\n add(row0, lead, tools);\\n add(head, row0, el(\\\"h1\\\", \\\"k-title\\\", o.title || \\\"\\\"), o.sub ? el(\\\"p\\\", \\\"k-sub\\\", o.sub) : null);\\n var prog = el(\\\"div\\\", \\\"k-progress\\\"); prog.setAttribute(\\\"role\\\", \\\"group\\\"); prog.setAttribute(\\\"aria-label\\\", \\\"Steps\\\");\\n var segs = [];\\n for (var i = 0; i < N; i++) (function (k) { var b = el(\\\"button\\\"); b.type = \\\"button\\\"; b.setAttribute(\\\"aria-label\\\", \\\"Go to step \\\" + (k + 1) + (o.recap && k === N - 1 ? \\\" (recap)\\\" : \\\": \\\" + steps[k].title)); b.onclick = function () { halt(); go(k); }; segs.push(b); add(prog, b); })(i);\\n var stageWrap = el(\\\"div\\\", \\\"k-stage-wrap\\\"), stageBox = el(\\\"div\\\", \\\"k-stage\\\"), cap = el(\\\"p\\\", \\\"k-caption\\\", o.caption || \\\"\\\");\\n if (o.stageHeight) stageBox.style.height = o.stageHeight + \\\"px\\\";\\n add(stageWrap, stageBox, o.caption ? cap : null);\\n // Every step's words in one cell: the tallest sets the height, so stepping never moves the footer.\\n var text = el(\\\"div\\\", \\\"k-steptext\\\"), panes = steps.map(function (s) {\\n var p = el(\\\"div\\\"); p.setAttribute(\\\"aria-hidden\\\", \\\"true\\\");\\n var bodyP = body(s.body || \\\"\\\");\\n if (s.cite && s.cite.url) { add(bodyP, \\\" \\\"); add(bodyP, link(s.cite.label || \\\"Source\\\", s.cite.url, \\\"Read it: \\\" + (s.cite.label || s.cite.url))); }\\n // A short tip shows; a long one is a tap away, so one wordy step doesn't set every step's height.\\n var tipN = null;\\n if (s.tip && String(s.tip).length <= 64) tipN = tip(s.tip);\\n else if (s.tip) { tipN = el(\\\"details\\\", \\\"k-tipbox k-tipbox--more\\\"); add(tipN, el(\\\"summary\\\", \\\"\\\", \\\"Tip\\\"), el(\\\"span\\\", \\\"\\\", s.tip)); }\\n add(p, el(\\\"h2\\\", \\\"k-h\\\", s.title), bodyP, tipN);\\n add(text, p); return p;\\n });\\n var recapBox = el(\\\"div\\\", \\\"k-stack\\\");\\n var live = el(\\\"p\\\", \\\"k-sr\\\"); live.setAttribute(\\\"aria-live\\\", \\\"polite\\\");\\n var foot = el(\\\"div\\\", \\\"k-foot\\\"), right = el(\\\"div\\\", \\\"k-right\\\");\\n var playB = button(\\\"Play\\\", function () { playing ? halt() : play(); }, { variant: \\\"quiet\\\", icon: \\\"play\\\", aria: \\\"Play the steps\\\" });\\n var back = button(\\\"Back\\\", function () { halt(); go(cur - 1); }, { variant: \\\"quiet\\\" });\\n var next = button(\\\"Next\\\", function () { halt(); go(cur + 1); }, { variant: \\\"primary\\\", arrow: \\\"→\\\" });\\n add(right, back, next); add(foot, playB, right);\\n add(c, head, prog, stageWrap, text, recapBox, foot, live);\\n\\n function isRecap(k) { return Boolean(o.recap) && k === N - 1; }\\n function drawStage() {\\n var s = steps[cur];\\n clear(stageBox);\\n if (!s) return;\\n stageBox.hidden = !s.render && !s.scene;\\n if (s.render) { s.render(stageBox, { view: view, current: cur }); return; }\\n if (!s.scene) return;\\n var w = Math.max(200, stageBox.clientWidth || c.clientWidth - 40 || 360), h = stageBox.clientHeight || 208;\\n var full = displayMode() === \\\"fullscreen\\\";\\n var fit = { w: w, h: h, view: tg ? (view === 0 ? \\\"a\\\" : \\\"b\\\") : null };\\n var sc = scene(s.scene, { view: fit.view, callouts: o.callouts, current: cur, onCallout: function (k) { halt(); go(k); }, label: s.title, fit: fit, fromBox: lastBox, frameLater: true });\\n add(stageBox, sc);\\n if (s.scene.zoom && !full) frameScene(sc, fit, lastBox); else wholeScene(sc, fit);\\n lastBox = sc.box;\\n }\\n function draw(fade) {\\n var rc = isRecap(cur);\\n ebStep.textContent = rc ? \\\"Recap\\\" : \\\"Step \\\" + (cur + 1) + \\\" of \\\" + N;\\n segs.forEach(function (b, k) { b.classList.toggle(\\\"is-done\\\", k < cur); if (k === cur) b.setAttribute(\\\"aria-current\\\", \\\"step\\\"); else b.removeAttribute(\\\"aria-current\\\"); });\\n back.disabled = cur === 0;\\n next.hidden = cur >= N - 1; playB.hidden = cur >= N - 1;\\n stageWrap.hidden = rc; text.hidden = rc; recapBox.hidden = !rc;\\n if (rc) {\\n clear(recapBox);\\n var ul = el(\\\"ul\\\", \\\"k-recap\\\"); (o.recap.bullets || []).forEach(function (b) { add(ul, el(\\\"li\\\", \\\"\\\", b)); });\\n var acts = actions((o.recap.actions || []).map(function (a) { return button(a.label, a.fn, { variant: a.primary ? \\\"primary\\\" : a.outline ? \\\"outline\\\" : \\\"quiet\\\", icon: a.icon, arrow: a.arrow }); }));\\n add(recapBox, el(\\\"h2\\\", \\\"k-h k-h--l\\\", o.recap.title || \\\"What to remember\\\"), ul, acts);\\n } else {\\n panes.forEach(function (p, k) { p.setAttribute(\\\"aria-hidden\\\", String(k !== cur)); p.inert = k !== cur; });\\n drawStage();\\n }\\n if (fade !== false && !reduced()) { var tgt = rc ? recapBox : panes[cur]; tgt.classList.remove(\\\"k-fadein\\\"); void tgt.offsetWidth; tgt.classList.add(\\\"k-fadein\\\"); }\\n live.textContent = rc ? \\\"Recap\\\" : \\\"Step \\\" + (cur + 1) + \\\" of \\\" + N + \\\": \\\" + steps[cur].title;\\n if (o.onStep) o.onStep(cur, rc ? null : steps[cur]);\\n if (o.stateKey) saveState({ key: o.stateKey, step: cur, view: view });\\n }\\n function go(k) { var k2 = clamp(k, 0, N - 1); if (k2 === cur) return; cur = k2; draw(); }\\n function play() {\\n if (cur >= N - 1) { cur = 0; draw(); }\\n clear(playB); add(playB, icon(\\\"pause\\\"), el(\\\"span\\\", \\\"\\\", \\\"Pause\\\"));\\n playing = every(reduced() ? 6000 : 4000, function () { if (hover) return; go(cur + 1); if (cur >= N - 1) halt(); });\\n }\\n function halt() { if (playing) { stop(playing); playing = null; } clear(playB); add(playB, icon(\\\"play\\\"), el(\\\"span\\\", \\\"\\\", \\\"Play\\\")); }\\n // Play pauses while the reader is on the picture or the words (not on the footer, where Play itself is).\\n [stageWrap, text].forEach(function (n) { n.addEventListener(\\\"pointerenter\\\", function () { hover = true; }); n.addEventListener(\\\"pointerleave\\\", function () { hover = false; }); });\\n c.addEventListener(\\\"focusin\\\", function (e) { hover = !foot.contains(e.target) && e.target !== c; }); c.addEventListener(\\\"focusout\\\", function () { hover = false; });\\n keys(c, function (e) {\\n if (e.key === \\\"ArrowRight\\\") { e.preventDefault(); halt(); go(cur + 1); }\\n else if (e.key === \\\"ArrowLeft\\\") { e.preventDefault(); halt(); go(cur - 1); }\\n // Space plays and pauses, unless a button has focus (Space presses it).\\n // Space plays and pauses, unless focus is on something Space already works (a button, a tip, a link).\\n else if ((e.key === \\\" \\\" || e.key === \\\"Spacebar\\\") && !(e.target && e.target.closest && e.target.closest(\\\"button, summary, a, [role=button], [role=link], [role=radio], [tabindex]:not(body)\\\"))) { e.preventDefault(); playing ? halt() : play(); }\\n });\\n var sx = null;\\n c.addEventListener(\\\"pointerdown\\\", function (e) { if (e.pointerType !== \\\"mouse\\\") sx = e.clientX; });\\n c.addEventListener(\\\"pointerup\\\", function (e) { if (sx === null) return; var dx = e.clientX - sx; sx = null; if (Math.abs(dx) > 50) { halt(); go(cur + (dx < 0 ? 1 : -1)); } });\\n if (o.start) cur = clamp(o.start, 0, N - 1);\\n var rs = o.stateKey ? restoreState(o.stateKey) : null;\\n if (rs) { cur = clamp(Number(rs.step) || 0, 0, N - 1); if (tg && rs.view === 1) { view = 1; tg.set(1); } }\\n draw(false);\\n // Drawn again with its real width once on the page, and on a resize: the camera fits the stage it is in.\\n requestAnimationFrame(function () { if (c.isConnected) drawStage(); });\\n onWidth(stageBox, function () { drawStage(); });\\n onFonts(function () { if (c.isConnected) drawStage(); });\\n c.go = go; c.current = function () { return cur; }; c.total = N; c.view = function () { return view; };\\n return c;\\n}\\nK.stepper = stepper;\\n\\n/* map.js */\\n/* ---- map explorer: a canvas of numbered stops on a dashed route, and a detail panel for the one picked ----\\n * mapExplorer(o): o: { stops: [{ id, n, title, short, meta: [text], story, before, status: done | next | plan,\\n * actions: [{ label, fn, primary, icon }] }], selected (id), regions: [{ label, x, y, w, h } in 0..1], filter: { label,\\n * options: [{ value, label }], value, onChange(value) }, height (px, default 196), onSelect(stop), storyLabel,\\n * beforeLabel, ariaLabel }. Stops without x and y are laid out on a gentle serpentine. Returns a node with .select(id).\\n */\\nfunction serpentine(n) {\\n // Two rows for up to fourteen stops: the gap between rows holds a stop's name without covering another stop.\\n var perRow = n <= 6 ? n : n <= 14 ? Math.ceil(n / 2) : Math.ceil(n / 3);\\n var rows = Math.ceil(n / perRow), pts = [];\\n for (var i = 0; i < n; i++) {\\n var r = Math.floor(i / perRow), k = i % perRow, cols = Math.min(perRow, n - r * perRow);\\n var span = perRow > 1 ? k / (perRow - 1) : 0.5;\\n if (cols < perRow && perRow > 1) span = k / (perRow - 1);\\n var x = 0.1 + 0.8 * (r % 2 ? 1 - span : span);\\n var y = rows > 1 ? 0.36 + (0.46 * r) / (rows - 1) : 0.58;\\n // A little drift, so the route reads as a path and not a grid; deterministic.\\n y += ((i * 37) % 7 - 3) * 0.012;\\n pts.push([x, y]);\\n }\\n return pts;\\n}\\nfunction smoothPath(pts) {\\n if (!pts.length) return \\\"\\\";\\n var d = \\\"M\\\" + pts[0][0].toFixed(1) + \\\",\\\" + pts[0][1].toFixed(1);\\n for (var i = 1; i < pts.length; i++) {\\n var p0 = pts[i - 2] || pts[i - 1], p1 = pts[i - 1], p2 = pts[i], p3 = pts[i + 1] || p2;\\n var c1 = [p1[0] + (p2[0] - p0[0]) / 6, p1[1] + (p2[1] - p0[1]) / 6], c2 = [p2[0] - (p3[0] - p1[0]) / 6, p2[1] - (p3[1] - p1[1]) / 6];\\n d += \\\" C\\\" + c1[0].toFixed(1) + \\\",\\\" + c1[1].toFixed(1) + \\\" \\\" + c2[0].toFixed(1) + \\\",\\\" + c2[1].toFixed(1) + \\\" \\\" + p2[0].toFixed(1) + \\\",\\\" + p2[1].toFixed(1);\\n }\\n return d;\\n}\\nfunction mapExplorer(o) {\\n var stops = o.stops || [], sel = o.selected || (stops[0] && stops[0].id), wrap = el(\\\"div\\\", \\\"k-stack k-mapx\\\");\\n var mapBox = el(\\\"div\\\", \\\"k-map\\\"), toolsBox = el(\\\"div\\\", \\\"k-map-tools\\\"), canvas = el(\\\"div\\\"), detail = el(\\\"div\\\", \\\"k-detail\\\");\\n detail.setAttribute(\\\"aria-live\\\", \\\"polite\\\");\\n var auto = serpentine(stops.length);\\n stops.forEach(function (s, i) { if (s.x == null || s.y == null) { s.x = auto[i][0]; s.y = auto[i][1]; } });\\n var left = el(\\\"div\\\"), rightT = el(\\\"div\\\");\\n if (o.filter) {\\n var sw = el(\\\"span\\\", \\\"k-selwrap\\\"), sel0 = el(\\\"select\\\", \\\"k-map-chip\\\"); sel0.setAttribute(\\\"aria-label\\\", o.filter.label || \\\"Filter\\\");\\n o.filter.options.forEach(function (op) { var x = el(\\\"option\\\", \\\"\\\", op.label); x.value = op.value; if (String(op.value) === String(o.filter.value)) x.selected = true; add(sel0, x); });\\n sel0.onchange = function () { o.filter.onChange(sel0.value); };\\n add(sw, sel0); add(left, sw);\\n }\\n if (can(\\\"fullscreen\\\")) {\\n var full = displayMode() === \\\"fullscreen\\\";\\n var ex = el(\\\"button\\\", \\\"k-map-chip\\\"); ex.type = \\\"button\\\"; add(ex, el(\\\"span\\\", \\\"\\\", full ? \\\"Close\\\" : \\\"Expand\\\"), icon(full ? \\\"collapse\\\" : \\\"expand\\\"));\\n ex.onclick = function () { requestDisplayMode().catch(function () { status(\\\"Your app didn't switch to full screen.\\\"); }); };\\n add(rightT, ex);\\n }\\n add(toolsBox, left, rightT);\\n add(mapBox, canvas, toolsBox);\\n add(wrap, mapBox, detail);\\n function drawMap() {\\n clear(canvas);\\n var W = Math.max(280, mapBox.clientWidth || 600), H = o.height || (W < 460 ? 168 : 252);\\n var s = svg(\\\"svg\\\", { viewBox: \\\"0 0 \\\" + W + \\\" \\\" + H, width: W, height: H, role: \\\"group\\\", \\\"aria-label\\\": o.ariaLabel || \\\"Map of the stops\\\" });\\n add(canvas, s); // on the page first, so the stop names can be measured\\n var px = function (st) { return [st.x * W, st.y * H]; };\\n (o.regions || []).forEach(function (r) {\\n add(s, svg(\\\"rect\\\", { x: r.x * W, y: r.y * H, width: r.w * W, height: r.h * H, rx: 12, class: \\\"k-region\\\" }));\\n add(s, svg(\\\"text\\\", { x: r.x * W + 12, y: r.y * H + 20, class: \\\"k-region-t\\\" }, r.label));\\n });\\n var pts = stops.map(px), labels = [];\\n add(s, svg(\\\"path\\\", { d: smoothPath(pts), class: \\\"k-route\\\" }));\\n // The part of the route already walked, solid.\\n var lastDone = -1; stops.forEach(function (st, i) { if (st.status === \\\"done\\\") lastDone = i; });\\n if (lastDone > 0) add(s, svg(\\\"path\\\", { d: smoothPath(pts.slice(0, lastDone + 1)), class: \\\"k-route is-done\\\" }));\\n var selIdx = stops.findIndex(function (x) { return x.id === sel; });\\n // A stop's name in a pill beside it: always for the picked stop, on hover or focus for the others.\\n var nameAt = function (i, cls) {\\n var st = stops[i], p = pts[i], R = st.id === sel ? 15 : 12, text0 = st.short || st.title;\\n if (text0.length > 34) text0 = text0.slice(0, 33) + \\\"…\\\";\\n var below = p[1] < H * 0.55, g0 = svg(\\\"g\\\", { class: \\\"k-stop-name \\\" + cls, \\\"aria-hidden\\\": \\\"true\\\" });\\n var t = svg(\\\"text\\\", { x: 0, y: 0, \\\"text-anchor\\\": \\\"middle\\\" }, text0);\\n add(g0, svg(\\\"rect\\\", { rx: 11 }), t); add(s, g0);\\n var tw = 0; try { tw = t.getComputedTextLength(); } catch (x) {} if (!tw) tw = text0.length * 6.6;\\n // Below, above, then beside: the first place that covers no other stop and stays on the canvas.\\n var half = tw / 2 + 10, spots = [[0, R + 18], [0, -R - 12], [R + half + 6, 0], [-R - half - 6, 0]], cx = 0, cy = 0;\\n if (!below) spots = [spots[1], spots[0], spots[2], spots[3]];\\n for (var si = 0; si < spots.length; si++) {\\n cx = clamp(p[0] + spots[si][0], half + 4, W - half - 4); cy = clamp(p[1] + spots[si][1], 14, H - 14);\\n // The top band holds the filter and Expand chips: a name never goes under them.\\n var hits = cy - 11 < 46 || pts.some(function (q, j) { return j !== i && Math.abs(q[0] - cx) < half + 14 && Math.abs(q[1] - cy) < 11 + 14; });\\n if (!hits) break;\\n }\\n t.setAttribute(\\\"x\\\", cx); t.setAttribute(\\\"y\\\", cy + 4);\\n var r = g0.querySelector(\\\"rect\\\"); r.setAttribute(\\\"x\\\", cx - half); r.setAttribute(\\\"y\\\", cy - 11); r.setAttribute(\\\"width\\\", half * 2); r.setAttribute(\\\"height\\\", 22);\\n return g0;\\n };\\n var hoverName = null;\\n var showName = function (i) { if (hoverName) { hoverName.remove(); hoverName = null; } if (i >= 0 && stops[i].id !== sel) hoverName = nameAt(i, \\\"is-hover\\\"); };\\n stops.forEach(function (st, i) {\\n var p = pts[i], on = st.id === sel, R = on ? 15 : 12;\\n var far = selIdx >= 0 && Math.abs(i - selIdx) > 2;\\n var g = svg(\\\"g\\\", { class: \\\"k-stop\\\" + (on ? \\\" is-on\\\" : \\\"\\\") + (st.status ? \\\" is-\\\" + st.status : \\\"\\\") + (far ? \\\" is-far\\\" : \\\"\\\"), tabindex: on ? 0 : -1, role: \\\"button\\\", \\\"aria-pressed\\\": String(on), \\\"aria-label\\\": (st.n || i + 1) + \\\": \\\" + st.title + (st.status === \\\"done\\\" ? \\\" (done)\\\" : st.status === \\\"next\\\" ? \\\" (next)\\\" : \\\"\\\") });\\n add(g, svg(\\\"circle\\\", { cx: p[0], cy: p[1], r: R }));\\n if (st.status === \\\"done\\\" && !on) add(g, svg(\\\"path\\\", { d: \\\"M\\\" + (p[0] - 4.5) + \\\",\\\" + p[1] + \\\" l3,3 l6,-6.5\\\", class: \\\"k-stop-tick\\\" }));\\n else add(g, svg(\\\"text\\\", { x: p[0], y: p[1] + 4, \\\"text-anchor\\\": \\\"middle\\\" }, String(st.n || i + 1)));\\n var pick = function (e) { select(st.id, true, e && e.type === \\\"keydown\\\" ? \\\"stop\\\" : null); };\\n g.addEventListener(\\\"click\\\", pick);\\n g.addEventListener(\\\"pointerenter\\\", function () { showName(i); });\\n g.addEventListener(\\\"pointerleave\\\", function () { showName(-1); });\\n g.addEventListener(\\\"focus\\\", function () { showName(i); });\\n g.addEventListener(\\\"blur\\\", function () { showName(-1); });\\n g.addEventListener(\\\"keydown\\\", function (e) {\\n if (e.key === \\\"Enter\\\" || e.key === \\\" \\\") { e.preventDefault(); pick(e); }\\n if (e.key === \\\"ArrowRight\\\" || e.key === \\\"ArrowDown\\\") { e.preventDefault(); e.stopPropagation(); select(stops[Math.min(stops.length - 1, i + 1)].id, true, \\\"stop\\\"); }\\n if (e.key === \\\"ArrowLeft\\\" || e.key === \\\"ArrowUp\\\") { e.preventDefault(); e.stopPropagation(); select(stops[Math.max(0, i - 1)].id, true, \\\"stop\\\"); }\\n });\\n add(s, g);\\n });\\n if (selIdx >= 0) nameAt(selIdx, \\\"is-picked\\\");\\n }\\n function drawDetail() {\\n clear(detail);\\n var i = stops.findIndex(function (x) { return x.id === sel; }), st = stops[i];\\n if (!st) { add(detail, emptyState({ title: \\\"Pick a stop on the map\\\", text: \\\"Each stop opens its story here.\\\" })); return; }\\n var h = el(\\\"div\\\", \\\"k-detail-h\\\"), top = el(\\\"div\\\", \\\"k-headrow\\\"), meta = el(\\\"div\\\", \\\"k-meta\\\");\\n (st.meta || []).forEach(function (m, k) { var sp = el(\\\"span\\\"); if (k === 0) add(sp, icon(\\\"clock\\\")); add(sp, m); add(meta, sp); });\\n var nav = el(\\\"div\\\", \\\"k-tools\\\");\\n var pb = button(\\\"Previous stop\\\", function () { select(stops[i - 1].id, true, \\\"prev\\\"); }, { variant: \\\"icon\\\", icon: \\\"arrowLeft\\\" }); pb.disabled = i <= 0;\\n var nb = button(\\\"Next stop\\\", function () { select(stops[i + 1].id, true, \\\"next\\\"); }, { variant: \\\"icon\\\", icon: \\\"arrowRight\\\" }); nb.disabled = i >= stops.length - 1;\\n add(nav, el(\\\"span\\\", \\\"k-caption k-nowrap\\\", (i + 1) + \\\" of \\\" + stops.length), pb, nb);\\n add(top, el(\\\"h2\\\", \\\"k-h k-h--l\\\", st.title), nav);\\n add(h, top, (st.meta || []).length ? meta : null);\\n add(detail, h);\\n if (st.story) { var a = el(\\\"div\\\", \\\"k-kv\\\"); add(a, el(\\\"b\\\", \\\"\\\", o.storyLabel || \\\"The story\\\"), el(\\\"p\\\", \\\"\\\", st.story)); add(detail, a); }\\n if (st.before) { var b = el(\\\"div\\\", \\\"k-kv\\\"); add(b, el(\\\"b\\\", \\\"\\\", o.beforeLabel || \\\"Before you go\\\"), el(\\\"p\\\", \\\"\\\", st.before)); add(detail, b); }\\n var acts = el(\\\"div\\\", \\\"k-actions\\\");\\n (st.actions || []).forEach(function (a2) { add(acts, button(a2.label, a2.fn, { variant: a2.primary ? \\\"primary\\\" : a2.outline ? \\\"outline\\\" : \\\"quiet\\\", icon: a2.icon, arrow: a2.arrow })); });\\n if ((st.actions || []).length) add(detail, acts);\\n }\\n function select(id, user, focusIt) {\\n sel = id; drawMap(); drawDetail();\\n // Focus follows the reader to the replacement of what they used: the picked stop, or the same arrow (or, at an end\\n // of the route where it is disabled, the other one).\\n var f = null;\\n if (focusIt === \\\"stop\\\") f = canvas.querySelector(\\\".k-stop.is-on[role=button]\\\");\\n if (focusIt === \\\"prev\\\" || focusIt === \\\"next\\\") { var bs = detail.querySelectorAll(\\\".k-tools .k-btn--icon\\\"); f = focusIt === \\\"prev\\\" ? (bs[0] && !bs[0].disabled ? bs[0] : bs[1]) : (bs[1] && !bs[1].disabled ? bs[1] : bs[0]); }\\n if (f) f.focus();\\n if (user && o.onSelect) o.onSelect(stops.find(function (x) { return x.id === id; }));\\n }\\n drawDetail();\\n requestAnimationFrame(function () { if (wrap.isConnected) drawMap(); });\\n onWidth(mapBox, function () { drawMap(); });\\n onFonts(function () { if (wrap.isConnected) drawMap(); });\\n drawMap();\\n wrap.select = function (id) { select(id, false); };\\n wrap.redraw = function () { drawMap(); drawDetail(); };\\n return wrap;\\n}\\nK.mapExplorer = mapExplorer;\\n\\n/* quiz.js */\\n/* ---- quiz: one question at a time ----\\n * quiz(o): o: { questions: [{ question, choices, answer (index), explain, source: { url, label } }], counterLabel\\n * (\\\"Question\\\"), onAnswer(i, pick, right), onDone(result), endActions(result) -> [nodes], endText(result) -> string,\\n * start (answers so far, for a restore), onState(picks) }. result: { score, total, picks, missed: [index] }.\\n * Choices are large rows; an answer shows right or wrong with the one-line why and its source, then Next. The end is a\\n * score ring and the actions the view passes (e.g. explain the ones I missed; retry them).\\n */\\nfunction quiz(o) {\\n var qs = o.questions || [], picks = (o.start || []).slice(0, qs.length), outer = el(\\\"div\\\", \\\"k-stack\\\"), box = el(\\\"div\\\", \\\"k-stack\\\"), live = el(\\\"p\\\", \\\"k-sr\\\");\\n // The announcement lives outside what is redrawn, so a screen reader hears each new question and the score.\\n live.setAttribute(\\\"aria-live\\\", \\\"polite\\\"); add(outer, box, live);\\n // Where the reader was: o.at when a view kept it, else after the last answer.\\n var cur = o.at != null ? Math.max(0, Math.min(Number(o.at) || 0, qs.length)) : Math.min(picks.length, qs.length);\\n var tellState = function () { if (o.onState) o.onState(picks.slice(), cur); };\\n function result() { var missed = []; var score = 0; qs.forEach(function (q, i) { if (picks[i] === q.answer) score++; else missed.push(i); }); return { score: score, total: qs.length, picks: picks.slice(), missed: missed }; }\\n function draw() {\\n clear(box);\\n var top = el(\\\"div\\\", \\\"k-headrow\\\"), counter = el(\\\"p\\\", \\\"k-eyebrow\\\");\\n var prog = el(\\\"div\\\", \\\"k-progress\\\");\\n qs.forEach(function (q, i) { var s = el(\\\"button\\\"); s.type = \\\"button\\\"; s.tabIndex = -1; s.setAttribute(\\\"aria-hidden\\\", \\\"true\\\"); s.disabled = true; s.style.cursor = \\\"default\\\"; if (i < cur || (i === cur && picks[i] != null)) s.classList.add(\\\"is-done\\\"); if (i === cur) s.setAttribute(\\\"aria-current\\\", \\\"step\\\"); add(prog, s); });\\n if (cur >= qs.length) {\\n var r = result();\\n counter.textContent = \\\"Your score\\\";\\n head(top, counter, prog);\\n var res = el(\\\"div\\\", \\\"k-result\\\"), t = el(\\\"div\\\", \\\"k-stack k-stack--s\\\");\\n add(t, el(\\\"h2\\\", \\\"k-h k-h--l\\\", r.score === r.total ? \\\"All \\\" + r.total + \\\" right\\\" : r.score + \\\" of \\\" + r.total + \\\" right\\\"), body(o.endText ? o.endText(r) : r.missed.length === 1 ? \\\"Go over the one you missed, then try it again.\\\" : r.missed.length ? \\\"Go over the \\\" + r.missed.length + \\\" you missed, then try them again.\\\" : \\\"Nothing missed.\\\"));\\n add(res, scoreRing(r.score, r.total, 88), t);\\n add(box, res);\\n if (r.missed.length) {\\n var ul = el(\\\"ul\\\", \\\"k-missed\\\"); ul.setAttribute(\\\"aria-label\\\", \\\"Missed\\\");\\n r.missed.slice(0, 3).forEach(function (i) { var li = el(\\\"li\\\", \\\"\\\", qs[i].question.length > 90 ? qs[i].question.slice(0, 88) + \\\"…\\\" : qs[i].question); add(ul, li); });\\n add(box, ul);\\n }\\n add(box, actions(o.endActions ? o.endActions(r, restart) : [button(\\\"Try again\\\", function () { restart(); }, { variant: \\\"primary\\\" })]));\\n live.textContent = \\\"Your score: \\\" + r.score + \\\" of \\\" + r.total + \\\" right.\\\";\\n return;\\n }\\n var q = qs[cur], answered = picks[cur] != null;\\n counter.textContent = (o.counterLabel || \\\"Question\\\") + \\\" \\\" + (cur + 1) + \\\" of \\\" + qs.length;\\n head(top, counter, prog);\\n var qn = el(\\\"h2\\\", \\\"k-q\\\", q.question); qn.tabIndex = -1;\\n var opts = el(\\\"div\\\", \\\"k-options\\\"); opts.setAttribute(\\\"role\\\", \\\"group\\\"); opts.setAttribute(\\\"aria-label\\\", \\\"Choices\\\");\\n q.choices.forEach(function (c, i) {\\n var b = quizOption(c, i, function (k, e) { if (picks[cur] != null) return; picks[cur] = k; tellState(); if (o.onAnswer) o.onAnswer(cur, k, k === q.answer); draw(); var n = box.querySelector(\\\".k-foot .k-btn--primary\\\"); if (n && e && e.detail === 0) n.focus(); });\\n if (answered) {\\n b.disabled = true;\\n if (i === q.answer) b.classList.add(\\\"is-right\\\");\\n else if (i === picks[cur]) b.classList.add(\\\"is-wrong\\\");\\n else b.hidden = true;\\n }\\n add(opts, b);\\n });\\n add(box, qn, opts);\\n if (answered) {\\n var right = picks[cur] === q.answer, why = el(\\\"div\\\", \\\"k-why\\\");\\n add(why, el(\\\"b\\\", right ? \\\"is-right\\\" : \\\"is-wrong\\\", right ? \\\"Right.\\\" : \\\"Not quite.\\\"));\\n var p = body(q.explain || \\\"\\\");\\n if (q.source && q.source.url) { add(p, \\\" \\\"); add(p, link(q.source.label || \\\"Source\\\", q.source.url)); }\\n add(why, p); add(box, why);\\n live.textContent = (right ? \\\"Right. \\\" : \\\"Not quite. \\\") + (q.explain || \\\"\\\");\\n } else live.textContent = (o.counterLabel || \\\"Question\\\") + \\\" \\\" + (cur + 1) + \\\" of \\\" + qs.length + \\\": \\\" + q.question;\\n var foot = el(\\\"div\\\", \\\"k-foot\\\"), rt = el(\\\"div\\\", \\\"k-right\\\");\\n var backB = button(\\\"Back\\\", function () { cur = Math.max(0, cur - 1); tellState(); draw(); focusTop(); }, { variant: \\\"quiet\\\" }); backB.disabled = cur === 0;\\n var nextB = button(cur === qs.length - 1 ? \\\"See score\\\" : \\\"Next\\\", function () { cur++; tellState(); if (cur >= qs.length && o.onDone) o.onDone(result()); draw(); focusTop(); }, { variant: \\\"primary\\\", arrow: \\\"→\\\" });\\n nextB.disabled = !answered;\\n var skipB = answered || o.noSkip ? el(\\\"span\\\") : button(\\\"Skip\\\", function () { picks[cur] = null; cur++; tellState(); if (cur >= qs.length && o.onDone) o.onDone(result()); draw(); focusTop(); }, { variant: \\\"quiet\\\" });\\n add(rt, backB, nextB); add(foot, skipB, rt); add(box, foot);\\n }\\n /** The counter goes in the card's eyebrow when the card gives one (o.counter), else on its own row. */\\n function head(top, counter, prog) { if (o.counter) { o.counter.textContent = counter.textContent; add(box, prog); } else { add(top, counter); add(box, top, prog); } }\\n /** After moving, focus goes to the new question (or the score), so a keyboard reader keeps their place. */\\n function focusTop() { var h = box.querySelector(\\\"h2\\\"); if (h) { h.tabIndex = -1; try { h.focus({ preventScroll: true }); } catch (x) { h.focus(); } } }\\n function restart(only) {\\n if (only && only.length) { qs = only.map(function (i) { return qs[i]; }); }\\n picks = []; cur = 0; tellState(); draw(); focusTop();\\n }\\n keys(outer, function (e) {\\n var b = e.key === \\\"ArrowRight\\\" ? box.querySelector(\\\".k-foot .k-btn--primary\\\") : e.key === \\\"ArrowLeft\\\" ? box.querySelector(\\\".k-foot .k-right .k-btn--quiet\\\") : null;\\n if (b && !b.disabled) { e.preventDefault(); b.click(); }\\n });\\n draw();\\n outer.result = result; outer.restart = restart;\\n return outer;\\n}\\nK.quiz = quiz;\\n\\n/* progress.js */\\n/* ---- progress: the resume code a reader keeps (25 October 2026) ----\\n * One source for both sides, like the A2UI core: the kit's script (a view makes the code when the reader presses\\n * Keep my progress) and the server (bin/build-ui-kit.mjs also writes it as an ES module, progress.generated.js, which a\\n * tool's `resume` argument is read with). The code holds the reader's place and nothing else: a scope the server wrote\\n * into the result (which quiz, which deck) and the answers or cards so far. It is printable ASCII, base64url-encoded\\n * with an FNV-1a checksum so a mistyped code is refused rather than misread, and versioned by its prefix. Nothing is\\n * stored anywhere: the reader keeps the code, the server only reads it back.\\n */\\nvar PROGRESS = (function () {\\n \\\"use strict\\\";\\n var PREFIX = \\\"kp1.\\\", MAX = 600;\\n function checksum(s) {\\n var h = 0x811c9dc5;\\n for (var i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); h = Math.imul(h, 0x01000193) >>> 0; }\\n return h.toString(36);\\n }\\n function printable(s) { return /^[\\\\x20-\\\\x7e]*$/.test(s); }\\n function encode(payload) {\\n var p = String(payload == null ? \\\"\\\" : payload);\\n if (!p || !printable(p)) return null;\\n var b = btoa(p + \\\"~\\\" + checksum(p)).replace(/\\\\+/g, \\\"-\\\").replace(/\\\\//g, \\\"_\\\").replace(/=+$/, \\\"\\\");\\n var code = PREFIX + b;\\n return code.length <= MAX ? code : null;\\n }\\n /** The payload a code carries, or null for anything that is not a whole, unaltered code of this version. */\\n function decode(code) {\\n if (typeof code !== \\\"string\\\") return null;\\n var c = code.trim();\\n if (c.length > MAX || c.indexOf(PREFIX) !== 0) return null;\\n var b = c.slice(PREFIX.length);\\n if (!b || !/^[A-Za-z0-9_-]+$/.test(b)) return null;\\n b = b.replace(/-/g, \\\"+\\\").replace(/_/g, \\\"/\\\");\\n while (b.length % 4) b += \\\"=\\\";\\n var raw;\\n try { raw = atob(b); } catch (x) { return null; }\\n if (!printable(raw)) return null;\\n var i = raw.lastIndexOf(\\\"~\\\");\\n if (i < 1) return null;\\n var p = raw.slice(0, i);\\n return checksum(p) === raw.slice(i + 1) ? p : null;\\n }\\n return { PREFIX: PREFIX, MAX: MAX, encode: encode, decode: decode, checksum: checksum };\\n})();\\n\\n/* keep.js */\\n/* ---- keep my progress: the resume code, offered where the host keeps no view state ----\\n * Fabric hands a view its own state back (fabric.pro/view-state); other hosts (Claude, ChatGPT, VS Code) forget a\\n * view's place when the conversation ends. There a view offers Keep my progress: nothing is made or sent until the\\n * reader presses it. Then the code (PROGRESS.encode of the payload o.payload() returns) is shown to copy and goes to the\\n * reader's assistant as context (ui/update-model-context), with o.context(code) as the words, so it can resume later\\n * in this conversation; the reader keeps the code for a new one. The code holds the reader's answers or cards, never\\n * who they are, and the server stores nothing.\\n *\\n * keepProgress(o): o: { payload() -> string|null (encoded), or plain() -> string (shown as it is, for a tool whose own\\n * arguments already carry the place), context(code) -> string, label (\\\"Keep my progress\\\"),\\n * note (\\\"Paste it into a new conversation to pick up here.\\\"), compact (an icon button, for a card's tools) }. Returns the control (its button as .trigger, the code's\\n * place as .out, for a card to place apart), or null where the host keeps state.\\n */\\n/** Whether the host keeps a view's state itself (Fabric: it sends its own context keys). */\\nfunction hostKeepsState() { var c = host.ctx || {}; return \\\"fabric.pro/viewState\\\" in c || \\\"fabric.pro/permissionMode\\\" in c || \\\"fabric.pro/reducedMotion\\\" in c; }\\nfunction keepProgress(o) {\\n if (hostKeepsState()) return null;\\n o = o || {};\\n var box = el(\\\"div\\\", \\\"k-keep\\\"), out = el(\\\"div\\\", \\\"k-keep-out\\\");\\n out.setAttribute(\\\"role\\\", \\\"status\\\"); out.setAttribute(\\\"aria-live\\\", \\\"polite\\\");\\n var b = button(o.label || \\\"Keep my progress\\\", function () {\\n var p = null; try { p = o.plain ? o.plain() : o.payload ? o.payload() : null; } catch (x) { p = null; }\\n var code = o.plain ? p : p ? PROGRESS.encode(p) : null;\\n clear(out);\\n if (!code) { add(out, caption(\\\"This progress is too long to fit in a code. Your assistant has where you are in this conversation.\\\")); return; }\\n var pre = el(\\\"div\\\", \\\"k-copybox\\\", code);\\n var copy = button(\\\"Copy\\\", function () {\\n var done = function () { copy.textContent = \\\"Copied\\\"; };\\n try { if (navigator.clipboard && navigator.clipboard.writeText) navigator.clipboard.writeText(code).then(done, function () { selectIn(pre); }); else selectIn(pre); } catch (x) { selectIn(pre); }\\n }, { variant: \\\"quiet\\\", small: true });\\n add(out, el(\\\"p\\\", \\\"k-caption\\\", (o.plain ? \\\"To resume: \\\" : \\\"Your resume code. \\\") + (o.note || \\\"Paste it into a new conversation to pick up here.\\\") + \\\" It holds your place, not who you are.\\\"), pre, copy);\\n if (o.context) keepInContext(o.context(code));\\n }, o.compact ? { variant: \\\"icon\\\", icon: \\\"bookmark\\\" } : { variant: \\\"quiet\\\", small: true, icon: \\\"bookmark\\\" });\\n add(box, b, out);\\n // A card can put the button in its tools and the code under its body (box.trigger, box.out), so keeping costs no height until pressed.\\n b.classList.add(\\\"k-keep-btn\\\");\\n box.trigger = b; box.out = out;\\n return box;\\n}\\nfunction selectIn(node) { try { var r = document.createRange(); r.selectNodeContents(node); var s = window.getSelection(); s.removeAllRanges(); s.addRange(r); } catch (x) {} }\\nK.progress = PROGRESS; K.keepProgress = keepProgress; K.hostKeepsState = hostKeepsState;\\n\\n/* compact.js */\\n/* ---- compactStatus: the card kept in view (picture-in-picture), 26 October 2026 ----\\n * One small card a host can float beside the chat: the title on one line, a state chip, a strip of steps, one status\\n * line with one link, and one or two actions (one primary). It draws only what it is handed and calls nothing: every\\n * action is the caller's function. Self-contained (DOM calls only, no other kit part), so a page that doesn't carry the\\n * whole kit inlines just this file and compact.css (compact.generated.js: COMPACT_SCRIPT, COMPACT_CSS).\\n *\\n * compactStatus({ eyebrow, title, state: { label, tone: \\\"ok\\\" | \\\"bad\\\" | \\\"warn\\\" | \\\"info\\\" },\\n * steps: [{ label, state: \\\"done\\\" | \\\"now\\\" | \\\"bad\\\" | \\\"todo\\\" }], status, link: { label, onOpen },\\n * actions: [{ label, fn, primary, disabled, busy }], fill, maxHeight })\\n *\\n * busy: the action is under way (a message sent and not yet answered): disabled, a spinner before its label, no arrow.\\n *\\n * fill: the card is the whole frame (no border, radius or shadow), as a pip window shows it. maxHeight: the frame's\\n * height; under 176 the eyebrow and the steps' names go (the steps keep them for a screen reader). */\\nfunction compactStatus(o) {\\n o = o || {};\\n var mk = function (tag, cls, text) { var n = document.createElement(tag); if (cls) n.className = cls; if (text != null) n.textContent = String(text); return n; };\\n var dense = typeof o.maxHeight === \\\"number\\\" && o.maxHeight > 0 && o.maxHeight < 176;\\n var card = mk(\\\"section\\\", \\\"k-card k-compact\\\" + (o.fill ? \\\" k-compact--fill\\\" : \\\"\\\") + (dense ? \\\" k-compact--dense\\\" : \\\"\\\"));\\n card.setAttribute(\\\"aria-label\\\", String(o.title || \\\"Status\\\"));\\n if (o.eyebrow && !dense) card.appendChild(mk(\\\"p\\\", \\\"k-eyebrow k-cs-eyebrow\\\", o.eyebrow));\\n var head = mk(\\\"div\\\", \\\"k-cs-head\\\");\\n var title = mk(\\\"p\\\", \\\"k-cs-title\\\", o.title || \\\"\\\");\\n title.title = String(o.title || \\\"\\\");\\n head.appendChild(title);\\n if (o.state && o.state.label) head.appendChild(mk(\\\"span\\\", \\\"k-chip k-cs-chip\\\" + (/^(ok|bad|warn|info)$/.test(o.state.tone) ? \\\" k-chip--\\\" + o.state.tone : \\\"\\\"), o.state.label));\\n card.appendChild(head);\\n var steps = (o.steps || []).slice(0, 6);\\n if (steps.length) {\\n var strip = mk(\\\"ol\\\", \\\"k-cs-steps\\\");\\n strip.setAttribute(\\\"aria-label\\\", \\\"Steps\\\");\\n var SAY = { done: \\\"done\\\", now: \\\"now\\\", bad: \\\"failing\\\", todo: \\\"not yet\\\" };\\n steps.forEach(function (s) {\\n var st = /^(done|now|bad|todo)$/.test(s.state) ? s.state : \\\"todo\\\";\\n var li = mk(\\\"li\\\", \\\"k-cs-step is-\\\" + st);\\n if (st === \\\"now\\\") li.setAttribute(\\\"aria-current\\\", \\\"step\\\");\\n li.appendChild(mk(\\\"span\\\", \\\"k-cs-bar\\\"));\\n li.appendChild(mk(\\\"span\\\", \\\"k-meta k-cs-name\\\" + (dense ? \\\" k-sr\\\" : \\\"\\\"), s.label));\\n li.appendChild(mk(\\\"span\\\", \\\"k-sr\\\", \\\": \\\" + SAY[st]));\\n strip.appendChild(li);\\n });\\n card.appendChild(strip);\\n }\\n if (o.status || (o.link && o.link.label)) {\\n var line = mk(\\\"div\\\", \\\"k-cs-line\\\");\\n if (o.status) line.appendChild(mk(\\\"p\\\", \\\"k-cs-status\\\", o.status));\\n if (o.link && o.link.label) {\\n var a = mk(\\\"button\\\", \\\"k-cs-link\\\", o.link.label + \\\" ↗\\\");\\n a.type = \\\"button\\\";\\n a.onclick = function () { if (typeof o.link.onOpen === \\\"function\\\") o.link.onOpen(); };\\n line.appendChild(a);\\n }\\n card.appendChild(line);\\n }\\n var acts = (o.actions || []).filter(function (x) { return x && x.label; }).slice(0, 2);\\n if (acts.length) {\\n var row = mk(\\\"div\\\", \\\"k-cs-actions\\\");\\n var primaryUsed = false;\\n acts.forEach(function (x) {\\n var primary = Boolean(x.primary) && !primaryUsed;\\n if (primary) primaryUsed = true;\\n var b = mk(\\\"button\\\", \\\"k-cs-btn\\\" + (primary ? \\\" k-cs-btn--primary\\\" : \\\"\\\"), x.label + (primary && !x.busy ? \\\" →\\\" : \\\"\\\"));\\n b.type = \\\"button\\\";\\n if (x.busy) { var sp = mk(\\\"span\\\", \\\"k-cs-spin\\\"); sp.setAttribute(\\\"aria-hidden\\\", \\\"true\\\"); b.insertBefore(sp, b.firstChild); b.setAttribute(\\\"aria-busy\\\", \\\"true\\\"); }\\n if (x.disabled || x.busy) b.disabled = true;\\n b.onclick = function () { if (typeof x.fn === \\\"function\\\") x.fn(); };\\n row.appendChild(b);\\n });\\n card.appendChild(row);\\n }\\n return card;\\n}\\nK.compactStatus = compactStatus;\\n\\n/* a2ui-catalog.js */\\n/* ---- A2UI catalogs: GENERATED by bin/build-ui-kit.mjs from worker/mcp/ui-kit/a2ui/*.json; do not edit ----\\n * The A2UI v0.9.1 basic catalog (a2ui-project/a2ui, Apache-2.0) and Fabric's published catalog\\n * (https://agents.fabric.pro/a2ui/v0.9/fabric_catalog.json), as each component's properties (in the core's kinds), its required properties, and\\n * the functions each catalog adds. src/a2ui-core.js reads them as A2UI_CATALOGS.\\n */\\nvar A2UI_CATALOGS = {\\\"basic\\\":{\\\"catalogId\\\":\\\"https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json\\\",\\\"components\\\":{\\\"Text\\\":{\\\"props\\\":{\\\"text\\\":\\\"string\\\",\\\"variant\\\":{\\\"enum\\\":[\\\"h1\\\",\\\"h2\\\",\\\"h3\\\",\\\"h4\\\",\\\"h5\\\",\\\"caption\\\",\\\"body\\\"]}},\\\"required\\\":[\\\"text\\\"]},\\\"Image\\\":{\\\"props\\\":{\\\"url\\\":\\\"string\\\",\\\"description\\\":\\\"string\\\",\\\"fit\\\":{\\\"enum\\\":[\\\"contain\\\",\\\"cover\\\",\\\"fill\\\",\\\"none\\\",\\\"scaleDown\\\"]},\\\"variant\\\":{\\\"enum\\\":[\\\"icon\\\",\\\"avatar\\\",\\\"smallFeature\\\",\\\"mediumFeature\\\",\\\"largeFeature\\\",\\\"header\\\"]}},\\\"required\\\":[\\\"url\\\"]},\\\"Icon\\\":{\\\"props\\\":{\\\"name\\\":\\\"value\\\"},\\\"required\\\":[\\\"name\\\"]},\\\"Video\\\":{\\\"props\\\":{\\\"url\\\":\\\"string\\\"},\\\"required\\\":[\\\"url\\\"]},\\\"AudioPlayer\\\":{\\\"props\\\":{\\\"url\\\":\\\"string\\\",\\\"description\\\":\\\"string\\\"},\\\"required\\\":[\\\"url\\\"]},\\\"Row\\\":{\\\"props\\\":{\\\"children\\\":\\\"children\\\",\\\"justify\\\":{\\\"enum\\\":[\\\"center\\\",\\\"end\\\",\\\"spaceAround\\\",\\\"spaceBetween\\\",\\\"spaceEvenly\\\",\\\"start\\\",\\\"stretch\\\"]},\\\"align\\\":{\\\"enum\\\":[\\\"start\\\",\\\"center\\\",\\\"end\\\",\\\"stretch\\\"]}},\\\"required\\\":[\\\"children\\\"]},\\\"Column\\\":{\\\"props\\\":{\\\"children\\\":\\\"children\\\",\\\"justify\\\":{\\\"enum\\\":[\\\"start\\\",\\\"center\\\",\\\"end\\\",\\\"spaceBetween\\\",\\\"spaceAround\\\",\\\"spaceEvenly\\\",\\\"stretch\\\"]},\\\"align\\\":{\\\"enum\\\":[\\\"center\\\",\\\"end\\\",\\\"start\\\",\\\"stretch\\\"]}},\\\"required\\\":[\\\"children\\\"]},\\\"List\\\":{\\\"props\\\":{\\\"children\\\":\\\"children\\\",\\\"direction\\\":{\\\"enum\\\":[\\\"vertical\\\",\\\"horizontal\\\"]},\\\"align\\\":{\\\"enum\\\":[\\\"start\\\",\\\"center\\\",\\\"end\\\",\\\"stretch\\\"]}},\\\"required\\\":[\\\"children\\\"]},\\\"Card\\\":{\\\"props\\\":{\\\"child\\\":\\\"id\\\"},\\\"required\\\":[\\\"child\\\"]},\\\"Tabs\\\":{\\\"props\\\":{\\\"tabs\\\":\\\"json\\\"},\\\"required\\\":[\\\"tabs\\\"]},\\\"Modal\\\":{\\\"props\\\":{\\\"trigger\\\":\\\"id\\\",\\\"content\\\":\\\"id\\\"},\\\"required\\\":[\\\"trigger\\\",\\\"content\\\"]},\\\"Divider\\\":{\\\"props\\\":{\\\"axis\\\":{\\\"enum\\\":[\\\"horizontal\\\",\\\"vertical\\\"]}},\\\"required\\\":[]},\\\"Button\\\":{\\\"props\\\":{\\\"checks\\\":\\\"checks\\\",\\\"child\\\":\\\"id\\\",\\\"variant\\\":{\\\"enum\\\":[\\\"default\\\",\\\"primary\\\",\\\"borderless\\\"]},\\\"action\\\":\\\"action\\\"},\\\"required\\\":[\\\"child\\\",\\\"action\\\"]},\\\"TextField\\\":{\\\"props\\\":{\\\"checks\\\":\\\"checks\\\",\\\"label\\\":\\\"string\\\",\\\"value\\\":\\\"string\\\",\\\"variant\\\":{\\\"enum\\\":[\\\"longText\\\",\\\"number\\\",\\\"shortText\\\",\\\"obscured\\\"]},\\\"validationRegexp\\\":\\\"literalString\\\"},\\\"required\\\":[\\\"label\\\"]},\\\"CheckBox\\\":{\\\"props\\\":{\\\"checks\\\":\\\"checks\\\",\\\"label\\\":\\\"string\\\",\\\"value\\\":\\\"boolean\\\"},\\\"required\\\":[\\\"label\\\",\\\"value\\\"]},\\\"ChoicePicker\\\":{\\\"props\\\":{\\\"checks\\\":\\\"checks\\\",\\\"label\\\":\\\"string\\\",\\\"variant\\\":{\\\"enum\\\":[\\\"multipleSelection\\\",\\\"mutuallyExclusive\\\"]},\\\"options\\\":\\\"json\\\",\\\"value\\\":\\\"stringList\\\",\\\"displayStyle\\\":{\\\"enum\\\":[\\\"checkbox\\\",\\\"chips\\\"]},\\\"filterable\\\":\\\"literalBoolean\\\"},\\\"required\\\":[\\\"options\\\",\\\"value\\\"]},\\\"Slider\\\":{\\\"props\\\":{\\\"checks\\\":\\\"checks\\\",\\\"label\\\":\\\"string\\\",\\\"min\\\":\\\"literalNumber\\\",\\\"max\\\":\\\"literalNumber\\\",\\\"value\\\":\\\"number\\\"},\\\"required\\\":[\\\"value\\\",\\\"max\\\"]},\\\"DateTimeInput\\\":{\\\"props\\\":{\\\"checks\\\":\\\"checks\\\",\\\"value\\\":\\\"string\\\",\\\"enableDate\\\":\\\"literalBoolean\\\",\\\"enableTime\\\":\\\"literalBoolean\\\",\\\"min\\\":\\\"string\\\",\\\"max\\\":\\\"string\\\",\\\"label\\\":\\\"string\\\"},\\\"required\\\":[\\\"value\\\"]}},\\\"functions\\\":[\\\"required\\\",\\\"regex\\\",\\\"length\\\",\\\"numeric\\\",\\\"email\\\",\\\"formatString\\\",\\\"formatNumber\\\",\\\"formatCurrency\\\",\\\"formatDate\\\",\\\"pluralize\\\",\\\"openUrl\\\",\\\"and\\\",\\\"or\\\",\\\"not\\\"]},\\\"fabric\\\":{\\\"catalogId\\\":\\\"https://agents.fabric.pro/a2ui/v0.9/fabric_catalog.json\\\",\\\"components\\\":{\\\"Chart\\\":{\\\"props\\\":{\\\"kind\\\":{\\\"enum\\\":[\\\"bar\\\",\\\"line\\\",\\\"area\\\",\\\"pie\\\"]},\\\"title\\\":\\\"string\\\",\\\"labels\\\":\\\"stringList\\\",\\\"series\\\":\\\"json\\\",\\\"x\\\":\\\"json\\\",\\\"format\\\":\\\"literalString\\\",\\\"xLabel\\\":\\\"string\\\",\\\"yLabel\\\":\\\"string\\\"},\\\"required\\\":[\\\"series\\\"]},\\\"Stat\\\":{\\\"props\\\":{\\\"label\\\":\\\"string\\\",\\\"value\\\":\\\"value\\\",\\\"format\\\":\\\"literalString\\\",\\\"hint\\\":\\\"string\\\"},\\\"required\\\":[\\\"label\\\",\\\"value\\\"]},\\\"Callout\\\":{\\\"props\\\":{\\\"tone\\\":{\\\"enum\\\":[\\\"info\\\",\\\"tip\\\",\\\"warning\\\",\\\"success\\\"]},\\\"title\\\":\\\"string\\\",\\\"text\\\":\\\"string\\\"},\\\"required\\\":[\\\"text\\\"]},\\\"Steps\\\":{\\\"props\\\":{\\\"steps\\\":\\\"json\\\",\\\"value\\\":\\\"number\\\"},\\\"required\\\":[\\\"steps\\\"]},\\\"Quiz\\\":{\\\"props\\\":{\\\"questions\\\":\\\"json\\\",\\\"results\\\":\\\"binding\\\"},\\\"required\\\":[\\\"questions\\\"]},\\\"Flashcards\\\":{\\\"props\\\":{\\\"cards\\\":\\\"json\\\"},\\\"required\\\":[\\\"cards\\\"]},\\\"Timeline\\\":{\\\"props\\\":{\\\"events\\\":\\\"json\\\"},\\\"required\\\":[\\\"events\\\"]},\\\"Compare\\\":{\\\"props\\\":{\\\"items\\\":\\\"json\\\"},\\\"required\\\":[\\\"items\\\"]},\\\"Diagram\\\":{\\\"props\\\":{\\\"mermaid\\\":\\\"string\\\",\\\"caption\\\":\\\"string\\\"},\\\"required\\\":[\\\"mermaid\\\"]},\\\"Code\\\":{\\\"props\\\":{\\\"code\\\":\\\"string\\\",\\\"language\\\":\\\"literalString\\\",\\\"title\\\":\\\"string\\\"},\\\"required\\\":[\\\"code\\\"]},\\\"Table\\\":{\\\"props\\\":{\\\"columns\\\":\\\"json\\\",\\\"rows\\\":\\\"value\\\"},\\\"required\\\":[\\\"columns\\\",\\\"rows\\\"]}},\\\"functions\\\":[\\\"calc\\\",\\\"formatValue\\\"]}};\\n\\n/* a2ui-core.js */\\n/* ---- A2UI v0.9.1 core: messages to surfaces, the catalog check, bindings, functions and formulas ----\\n * One source for both sides: the kit's script (the view renders with it) and the server (bin/build-ui-kit.mjs also\\n * writes it as an ES module, a2ui-core.generated.js, which `visualize` validates with and renders to text with).\\n * Ported from Fabric's renderer (fabric-agents packages/ui/src/components/a2ui: protocol.ts, catalog.ts,\\n * expression.ts, functions.ts, template.ts, format.ts, regex-guard.ts; Fabric 0.15.14) so a document behaves the same\\n * here as in Fabric. Formulas are parsed, never evaluated as code. The catalogs are Fabric's published schema\\n * (https://agents.fabric.pro/a2ui/v0.9/fabric_catalog.json) and the A2UI basic catalog, vendored in\\n * worker/mcp/ui-kit/a2ui/ and read through src/a2ui-catalog.js, which the build generates from them.\\n */\\nvar A2UI = (function () {\\n \\\"use strict\\\";\\n var hasOwn = function (o, k) { return Object.prototype.hasOwnProperty.call(o, k); };\\n var isObj = function (v) { return !!v && typeof v === \\\"object\\\" && !Array.isArray(v); };\\n var A2UI_VERSION = \\\"v0.9.1\\\", VERSIONS = [\\\"v0.9\\\", \\\"v0.9.1\\\"];\\n var BASIC_CATALOG_ID = \\\"https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json\\\";\\n var BASIC_ALIASES = [\\\"https://a2ui.org/specification/v0_9_1/catalogs/basic/catalog.json\\\"];\\n var FABRIC_CATALOG_ID = \\\"https://agents.fabric.pro/a2ui/v0.9/fabric_catalog.json\\\";\\n\\n /* ---- the catalogs: generated from the vendored schemas (src/a2ui-catalog.js, from worker/mcp/ui-kit/a2ui/) ---- */\\n var CATALOG = { basic: A2UI_CATALOGS.basic.components, fabric: A2UI_CATALOGS.fabric.components };\\n var BASIC_FUNCTIONS = A2UI_CATALOGS.basic.functions;\\n var FABRIC_FUNCTIONS = A2UI_CATALOGS.fabric.functions;\\n /** Extensions this renderer accepts beyond the published schema: none (Compare's pick is standard since Fabric d038bc4ba). */\\n var EXTENSIONS = {};\\n var mk = function (ids, fabric) { var comps = {}; var k; for (k in CATALOG.basic) comps[k] = CATALOG.basic[k]; if (fabric) for (k in CATALOG.fabric) comps[k] = CATALOG.fabric[k]; var fns = {}; BASIC_FUNCTIONS.concat(fabric ? FABRIC_FUNCTIONS : []).forEach(function (f) { fns[f] = true; }); return { catalogId: ids, components: comps, functions: fns, fabric: fabric }; };\\n var BASIC_INFO = mk(BASIC_CATALOG_ID, false), FABRIC_INFO = mk(FABRIC_CATALOG_ID, true);\\n function catalogFor(id) { if (id === BASIC_CATALOG_ID || BASIC_ALIASES.indexOf(id) >= 0) return BASIC_INFO; if (id === FABRIC_CATALOG_ID) return FABRIC_INFO; return null; }\\n\\n var isBinding = function (v) { return isObj(v) && typeof v.path === \\\"string\\\" && Object.keys(v).length === 1; };\\n var isCall = function (v) { return isObj(v) && typeof v.call === \\\"string\\\" && Object.keys(v).every(function (k) { return k === \\\"call\\\" || k === \\\"args\\\" || k === \\\"returnType\\\"; }) && (v.args === undefined || isObj(v.args)); };\\n function kindOk(kind, v) {\\n if (typeof kind === \\\"object\\\") return typeof v === \\\"string\\\" && kind[\\\"enum\\\"].indexOf(v) >= 0;\\n switch (kind) {\\n case \\\"string\\\": return typeof v === \\\"string\\\" || isBinding(v) || isCall(v);\\n case \\\"number\\\": return typeof v === \\\"number\\\" || isBinding(v) || isCall(v);\\n case \\\"boolean\\\": return typeof v === \\\"boolean\\\" || isBinding(v) || isCall(v);\\n case \\\"stringList\\\": return (Array.isArray(v) && v.every(function (s) { return typeof s === \\\"string\\\"; })) || isBinding(v) || isCall(v);\\n case \\\"value\\\": return v !== null && v !== undefined;\\n case \\\"id\\\": return typeof v === \\\"string\\\";\\n case \\\"children\\\": return (Array.isArray(v) && v.every(function (s) { return typeof s === \\\"string\\\"; })) || (isObj(v) && typeof v.path === \\\"string\\\" && typeof v.componentId === \\\"string\\\");\\n case \\\"action\\\": return isObj(v) && (isObj(v.event) ? typeof v.event.name === \\\"string\\\" && (v.event.context === undefined || isObj(v.event.context)) : isObj(v.functionCall) && isCall(v.functionCall));\\n case \\\"checks\\\": return Array.isArray(v) && v.every(function (c) { return isObj(c) && typeof c.message === \\\"string\\\" && (\\\"condition\\\" in c ? typeof c.condition === \\\"boolean\\\" || isBinding(c.condition) || isCall(c.condition) : typeof c.call === \\\"string\\\" && (c.args === undefined || isObj(c.args))); });\\n case \\\"binding\\\": return isBinding(v);\\n case \\\"literalString\\\": return typeof v === \\\"string\\\";\\n case \\\"literalNumber\\\": return typeof v === \\\"number\\\";\\n case \\\"literalBoolean\\\": return typeof v === \\\"boolean\\\";\\n case \\\"json\\\": return true;\\n }\\n return false;\\n }\\n var dynString = function (v) { return typeof v === \\\"string\\\" || isBinding(v) || isCall(v); };\\n var listOf = function (v, item, min, max) { min = min == null ? 1 : min; max = max == null ? 500 : max; return Array.isArray(v) && v.length >= min && v.length <= max && v.every(function (x) { return isObj(x) && item(x); }); };\\n var optional = function (v, ok) { return v === undefined || ok(v); };\\n var validAnswer = function (v, n) { return (typeof v === \\\"number\\\" && v === Math.floor(v) && v >= 0 && v < n) || isBinding(v) || isCall(v); };\\n var STRUCTURES = {\\n Tabs: { tabs: [function (v) { return listOf(v, function (t) { return dynString(t.title) && typeof t.child === \\\"string\\\"; }, 1, 12); }, \\\"a list of { title, child }\\\"] },\\n ChoicePicker: { options: [function (v) { return listOf(v, function (o) { return dynString(o.label) && typeof o.value === \\\"string\\\"; }, 1, 100); }, \\\"a list of { label, value } (value a string)\\\"] },\\n Chart: {\\n series: [function (v) { return listOf(v, function (x) { return optional(x.name, dynString) && optional(x.expr, function (e) { return typeof e === \\\"string\\\"; }) && optional(x.values, function (vs) { return Array.isArray(vs) || isBinding(vs) || isCall(vs); }) && (x.values !== undefined || x.expr !== undefined); }, 1, 8); }, \\\"a list (1-8) of { name, values } or { name, expr }\\\"],\\n x: [function (v) { return isObj(v) && v.from != null && v.to != null; }, \\\"{ from, to, steps }\\\"],\\n },\\n Steps: { steps: [function (v) { return listOf(v, function (x) { return dynString(x.title) && optional(x.text, dynString) && optional(x.child, function (c) { return typeof c === \\\"string\\\"; }); }, 1, 40); }, \\\"a list of { title, text, child }\\\"] },\\n Quiz: { questions: [function (v) { return listOf(v, function (q) { return dynString(q.question) && Array.isArray(q.choices) && q.choices.length >= 2 && q.choices.length <= 8 && validAnswer(q.answer, q.choices.length) && optional(q.explain, dynString); }, 1, 40); }, \\\"a list of { question, choices (2-8), answer (the index of the right choice), explain }\\\"] },\\n Flashcards: { cards: [function (v) { return listOf(v, function (c) { return dynString(c.front) && dynString(c.back); }, 1, 60); }, \\\"a list of { front, back }\\\"] },\\n Timeline: { events: [function (v) { return listOf(v, function (e) { return dynString(e.title) && optional(e.label, dynString) && optional(e.text, dynString); }, 1, 40); }, \\\"a list of { label, title, text }\\\"] },\\n Compare: { items: [function (v) { return listOf(v, function (i) { return dynString(i.title) && optional(i.points, function (p) { return Array.isArray(p) || isBinding(p) || isCall(p); }); }, 1, 4); }, \\\"a list (1-4) of { title, points, badge, verdict }\\\"] },\\n Code: { code: [function (v) { return typeof v !== \\\"string\\\" || v.length <= 20000; }, \\\"at most 20,000 characters\\\"] },\\n Table: { rows: [function (v) { return !Array.isArray(v) || v.length <= 500; }, \\\"at most 500 rows\\\"], columns: [function (v) { return Array.isArray(v) && v.length >= 1 && v.length <= 12 && v.every(function (c) { return typeof c === \\\"string\\\" || (isObj(c) && dynString(c.label)); }); }, \\\"a list (1-12) of labels or { label, key, format, align }\\\"] },\\n };\\n var TEMPLATE_ARG = { formatString: \\\"value\\\", openUrl: \\\"url\\\" };\\n /** The catalog check for one component: what doesn't match, as paths relative to it. */\\n function checkComponent(catalog, component) {\\n if (!catalog) return [];\\n var def = hasOwn(catalog.components, component.component) ? catalog.components[component.component] : undefined;\\n if (!def) return [{ path: \\\"/component\\\", message: \\\"\\\\\\\"\\\" + component.component + \\\"\\\\\\\" is not in this surface's catalog\\\" }];\\n var problems = [];\\n def.required.forEach(function (name) { if (!(name in component)) problems.push({ path: \\\"/\\\" + name, message: component.component + \\\" requires \\\\\\\"\\\" + name + \\\"\\\\\\\"\\\" }); });\\n var unknown = {};\\n var interpolated = function (text) { templateCalls(text).forEach(function (n) { if (!catalog.functions[n]) unknown[n] = true; }); };\\n var walk = function (v, depth, mapOfValues) {\\n if (depth > 30 || v === null || typeof v !== \\\"object\\\") return;\\n if (Array.isArray(v)) { v.forEach(function (x) { walk(x, depth + 1); }); return; }\\n if (mapOfValues) { Object.keys(v).forEach(function (k) { walk(v[k], depth + 1); }); return; }\\n if (isObj(v.event)) {\\n var ev = {}; Object.keys(v.event).forEach(function (k) { if (k !== \\\"context\\\") ev[k] = v.event[k]; });\\n walk(ev, depth + 1);\\n if (isObj(v.event.context)) walk(v.event.context, depth + 1, true);\\n Object.keys(v).forEach(function (k) { if (k !== \\\"event\\\") walk(v[k], depth + 1); });\\n return;\\n }\\n if (isCall(v)) {\\n if (!catalog.functions[v.call]) unknown[v.call] = true;\\n var ta = hasOwn(TEMPLATE_ARG, v.call) ? TEMPLATE_ARG[v.call] : undefined;\\n if (ta && v.args && typeof v.args[ta] === \\\"string\\\") interpolated(v.args[ta]);\\n if (v.args) Object.keys(v.args).forEach(function (k) { walk(v.args[k], depth + 1, v.call === \\\"calc\\\" && k === \\\"vars\\\"); });\\n return;\\n }\\n Object.keys(v).forEach(function (k) { walk(v[k], depth + 1); });\\n };\\n if (Array.isArray(component.checks)) component.checks.forEach(function (rule) { if (isObj(rule) && typeof rule.call === \\\"string\\\") { var cp = {}; Object.keys(rule).forEach(function (k) { if (k !== \\\"message\\\") cp[k] = rule[k]; }); walk(cp, 1); } });\\n if (component.component === \\\"Table\\\" && Array.isArray(component.rows)) {\\n var rest = {}; Object.keys(component).forEach(function (k) { if (k !== \\\"rows\\\") rest[k] = component[k]; }); walk(rest, 0);\\n component.rows.forEach(function (row) { var cells = Array.isArray(row) ? row : isObj(row) ? Object.keys(row).map(function (k) { return row[k]; }) : []; cells.forEach(function (cell) { if (isObj(cell) && isCall(cell) && \\\"args\\\" in cell) walk(cell, 1); }); });\\n } else walk(component, 0);\\n Object.keys(unknown).forEach(function (fn) { problems.push({ path: \\\"\\\", message: \\\"\\\\\\\"\\\" + fn + \\\"\\\\\\\" is not a function in this surface's catalog\\\" }); });\\n Object.keys(component).forEach(function (name) {\\n if (name === \\\"id\\\" || name === \\\"component\\\") return;\\n var value = component[name];\\n if (name === \\\"accessibility\\\") { if (!isObj(value)) problems.push({ path: \\\"/accessibility\\\", message: \\\"accessibility must be an object\\\" }); return; }\\n if (name === \\\"weight\\\") { if (typeof value !== \\\"number\\\") problems.push({ path: \\\"/weight\\\", message: \\\"weight must be a number\\\" }); return; }\\n var kind = hasOwn(def.props, name) ? def.props[name] : undefined;\\n if (!kind) { problems.push({ path: \\\"/\\\" + name, message: component.component + \\\" has no property \\\\\\\"\\\" + name + \\\"\\\\\\\"\\\" }); return; }\\n var st = STRUCTURES[component.component], shape = st && hasOwn(st, name) ? st[name] : undefined;\\n if (shape && !shape[0](value)) { problems.push({ path: \\\"/\\\" + name, message: component.component + \\\".\\\" + name + \\\" must be \\\" + shape[1] }); return; }\\n if (!kindOk(kind, value)) problems.push({ path: \\\"/\\\" + name, message: component.component + \\\".\\\" + name + \\\" must be \\\" + (typeof kind === \\\"object\\\" ? \\\"one of \\\" + kind[\\\"enum\\\"].join(\\\", \\\") : kind) });\\n });\\n return problems;\\n }\\n\\n /* ---- messages to surfaces ---- */\\n var MAX_MESSAGES = 500, MAX_COMPONENTS = 600, MAX_ERRORS = 50;\\n /** A document's messages: a JSON array, one object, or JSONL (one message a line). */\\n function readMessages(text) {\\n var t = String(text == null ? \\\"\\\" : text).trim();\\n if (!t) return [];\\n try { var whole = JSON.parse(t); return Array.isArray(whole) ? whole : [whole]; } catch (x) {}\\n return t.split(\\\"\\\\n\\\").map(function (l) { return l.trim(); }).filter(Boolean).map(function (line) { try { return JSON.parse(line); } catch (x) { return { __unparsable: line.slice(0, 120) }; } });\\n }\\n /** Applies a document's messages in order: { surfaces: [..] in order, errors: [VALIDATION_FAILED, …] }. */\\n function buildSurfaces(input) {\\n var messages = Array.isArray(input) ? input : readMessages(input);\\n var surfaces = {}, order = [], errors = [];\\n var fail = function (surfaceId, path, message) { if (errors.length < MAX_ERRORS) errors.push({ code: \\\"VALIDATION_FAILED\\\", surfaceId: surfaceId, path: path, message: message }); };\\n if (messages.length > MAX_MESSAGES) fail(\\\"\\\", \\\"\\\", \\\"A document holds at most \\\" + MAX_MESSAGES + \\\" messages\\\");\\n messages.slice(0, MAX_MESSAGES).forEach(function (message, index) {\\n var at = \\\"/\\\" + index;\\n if (!isObj(message)) return fail(\\\"\\\", at, \\\"A message must be a JSON object\\\");\\n if (\\\"__unparsable\\\" in message) return fail(\\\"\\\", at, \\\"Not valid JSON: \\\" + String(message.__unparsable));\\n if (typeof message.version !== \\\"string\\\" || VERSIONS.indexOf(message.version) < 0) return fail(\\\"\\\", at + \\\"/version\\\", \\\"version must be \\\\\\\"\\\" + A2UI_VERSION + \\\"\\\\\\\"\\\");\\n var kinds = [\\\"createSurface\\\", \\\"updateComponents\\\", \\\"updateDataModel\\\", \\\"deleteSurface\\\"].filter(function (k) { return k in message; });\\n if (kinds.length !== 1) return fail(\\\"\\\", at, \\\"A message has exactly one of createSurface, updateComponents, updateDataModel, deleteSurface\\\");\\n var kind = kinds[0], body = message[kind];\\n if (!isObj(body)) return fail(\\\"\\\", at + \\\"/\\\" + kind, kind + \\\" must be an object\\\");\\n var sid = typeof body.surfaceId === \\\"string\\\" ? body.surfaceId : \\\"\\\";\\n if (!sid) return fail(\\\"\\\", at + \\\"/\\\" + kind + \\\"/surfaceId\\\", \\\"surfaceId is required\\\");\\n var s = hasOwn(surfaces, sid) ? surfaces[sid] : null;\\n if (kind === \\\"createSurface\\\") {\\n if (s) return fail(sid, at + \\\"/createSurface\\\", \\\"The surface already exists (delete it first)\\\");\\n var cid = typeof body.catalogId === \\\"string\\\" ? body.catalogId : \\\"\\\";\\n if (!cid) return fail(sid, at + \\\"/createSurface/catalogId\\\", \\\"catalogId is required\\\");\\n var cat = catalogFor(cid);\\n if (!cat) return fail(sid, at + \\\"/createSurface/catalogId\\\", \\\"Unsupported catalog \\\\\\\"\\\" + cid + \\\"\\\\\\\"\\\");\\n surfaces[sid] = { surfaceId: sid, catalogId: cid, catalog: cat, theme: isObj(body.theme) ? body.theme : undefined, sendDataModel: body.sendDataModel === true, components: {}, count: 0, dataModel: {} };\\n order.push(sid);\\n return;\\n }\\n if (kind === \\\"deleteSurface\\\") { if (!s) return fail(sid, at + \\\"/deleteSurface\\\", \\\"Unknown surface\\\"); delete surfaces[sid]; order = order.filter(function (x) { return x !== sid; }); return; }\\n if (kind === \\\"updateComponents\\\") {\\n if (!s) return fail(sid, at + \\\"/updateComponents\\\", \\\"Create the surface before updating it\\\");\\n if (!Array.isArray(body.components)) return fail(sid, at + \\\"/updateComponents/components\\\", \\\"components must be a list\\\");\\n var pending = {}, valid = true;\\n var reject = function (path, msg) { valid = false; fail(sid, path, msg); };\\n body.components.forEach(function (raw, i) {\\n var path = at + \\\"/updateComponents/components/\\\" + i;\\n if (!isObj(raw)) return reject(path, \\\"A component must be an object\\\");\\n if (typeof raw.id !== \\\"string\\\" || !raw.id) return reject(path + \\\"/id\\\", \\\"id is required\\\");\\n if (typeof raw.component !== \\\"string\\\") return reject(path + \\\"/component\\\", \\\"component is required\\\");\\n checkComponent(s.catalog, raw).forEach(function (p) { reject(path + p.path, p.message); });\\n pending[raw.id] = raw;\\n });\\n var added = Object.keys(pending).filter(function (id) { return !hasOwn(s.components, id); }).length;\\n if (s.count + added > MAX_COMPONENTS) reject(at + \\\"/updateComponents\\\", \\\"A surface holds at most \\\" + MAX_COMPONENTS + \\\" components\\\");\\n if (!valid) return;\\n Object.keys(pending).forEach(function (id) { s.components[id] = pending[id]; });\\n s.count += added;\\n return;\\n }\\n if (!s) return fail(sid, at + \\\"/updateDataModel\\\", \\\"Create the surface before updating it\\\");\\n if (\\\"path\\\" in body && typeof body.path !== \\\"string\\\") return fail(sid, at + \\\"/updateDataModel/path\\\", \\\"path must be a JSON Pointer string\\\");\\n var ptr = typeof body.path === \\\"string\\\" ? body.path : \\\"/\\\";\\n if (ptr.charAt(0) !== \\\"/\\\") return fail(sid, at + \\\"/updateDataModel/path\\\", \\\"path must be an absolute JSON Pointer\\\");\\n try { s.dataModel = setPointer(s.dataModel, ptr, \\\"value\\\" in body ? body.value : undefined); } catch (e) { fail(sid, at + \\\"/updateDataModel/path\\\", e.message); }\\n });\\n order.forEach(function (sid) {\\n var s = surfaces[sid];\\n if (!hasOwn(s.components, \\\"root\\\")) fail(sid, \\\"\\\", \\\"No component has id \\\\\\\"root\\\\\\\"\\\");\\n Object.keys(s.components).forEach(function (id) { var c = s.components[id]; referencedIds(c).forEach(function (r) { if (!hasOwn(s.components, r)) fail(sid, \\\"/components/\\\" + id, c.component + \\\" \\\\\\\"\\\" + id + \\\"\\\\\\\" refers to \\\\\\\"\\\" + r + \\\"\\\\\\\", which no component defines\\\"); }); });\\n // A component may not contain itself, however far down: such a surface draws nothing.\\n var loop = findLoop(s.components);\\n if (loop) { s.loop = loop; fail(sid, \\\"/components/\\\" + loop[0], \\\"Components form a loop: \\\" + loop.join(\\\" → \\\")); }\\n });\\n return { surfaces: order.map(function (sid) { return surfaces[sid]; }), errors: errors };\\n }\\n /** A cycle in the components' references (ids in order, the first repeated at the end), or null. */\\n function findLoop(components) {\\n var state = {}, path = [];\\n var visit = function (id) {\\n if (state[id] === 2 || !hasOwn(components, id)) return null;\\n if (state[id] === 1) return path.slice(path.indexOf(id)).concat(id);\\n state[id] = 1; path.push(id);\\n var refs = referencedIds(components[id]);\\n for (var i = 0; i < refs.length; i++) { var f = visit(refs[i]); if (f) return f; }\\n path.pop(); state[id] = 2; return null;\\n };\\n var ids = Object.keys(components);\\n for (var i = 0; i < ids.length; i++) { var f = visit(ids[i]); if (f) return f; }\\n return null;\\n }\\n function referencedIds(c) {\\n var ids = [], push = function (v) { if (typeof v === \\\"string\\\") ids.push(v); };\\n if (Array.isArray(c.children)) c.children.forEach(push); else if (isObj(c.children)) push(c.children.componentId);\\n [\\\"child\\\", \\\"trigger\\\", \\\"content\\\"].forEach(function (p) { push(c[p]); });\\n [\\\"tabs\\\", \\\"steps\\\"].forEach(function (p) { if (Array.isArray(c[p])) c[p].forEach(function (e) { if (isObj(e)) push(e.child); }); });\\n return ids;\\n }\\n\\n /* ---- JSON Pointer ---- */\\n var forbidden = function (k) { return k === \\\"__proto__\\\" || k === \\\"prototype\\\" || k === \\\"constructor\\\"; };\\n var unesc = function (s) { return s.replace(/~1/g, \\\"/\\\").replace(/~0/g, \\\"~\\\"); };\\n var esc = function (s) { return s.replace(/~/g, \\\"~0\\\").replace(/\\\\//g, \\\"~1\\\"); };\\n function segments(p) { return p === \\\"\\\" || p === \\\"/\\\" ? [] : p.replace(/^\\\\//, \\\"\\\").split(\\\"/\\\").map(unesc); }\\n function resolvePath(path, base) { if (path.charAt(0) === \\\"/\\\") return path; var prefix = base === \\\"/\\\" ? \\\"\\\" : base; return path === \\\"\\\" || path === \\\".\\\" ? base || \\\"/\\\" : prefix + \\\"/\\\" + path; }\\n function getPointer(model, p) {\\n var node = model, segs = segments(p);\\n for (var i = 0; i < segs.length; i++) {\\n var seg = segs[i];\\n if (node === null || node === undefined || typeof node !== \\\"object\\\") return undefined;\\n if (Array.isArray(node)) { if (!/^\\\\d+$/.test(seg)) return undefined; node = node[Number(seg)]; }\\n else { if (forbidden(seg) || !hasOwn(node, seg)) return undefined; node = node[seg]; }\\n }\\n return node;\\n }\\n var clone = function (v) { return v === null || typeof v !== \\\"object\\\" ? v : JSON.parse(JSON.stringify(v)); };\\n function setPointer(model, p, value) {\\n var segs = segments(p);\\n if (!segs.length) return value === undefined ? {} : clone(value);\\n var root = model !== null && typeof model === \\\"object\\\" ? clone(model) : {}, node = root;\\n segs.forEach(function (seg, i) {\\n if (forbidden(seg)) throw new Error(\\\"\\\\\\\"\\\" + seg + \\\"\\\\\\\" can't be used in a path\\\");\\n var last = i === segs.length - 1, nextIsIndex = !last && /^\\\\d+$/.test(segs[i + 1]);\\n if (Array.isArray(node)) {\\n if (!/^\\\\d+$/.test(seg)) throw new Error(\\\"\\\\\\\"\\\" + seg + \\\"\\\\\\\" is not an index of a list\\\");\\n var k = Number(seg); if (k > 10000) throw new Error(\\\"List index is too large\\\");\\n if (last) { node[k] = value === undefined ? null : clone(value); return; }\\n if (node[k] === null || typeof node[k] !== \\\"object\\\") node[k] = nextIsIndex ? [] : {};\\n node = node[k];\\n } else {\\n if (last) { if (value === undefined) delete node[seg]; else node[seg] = clone(value); return; }\\n if (node[seg] === null || typeof node[seg] !== \\\"object\\\") node[seg] = nextIsIndex ? [] : {};\\n node = node[seg];\\n }\\n });\\n return root;\\n }\\n function joinPointer(base) { var segs = Array.prototype.slice.call(arguments, 1); return (base === \\\"/\\\" ? \\\"\\\" : base) + segs.map(function (s) { return \\\"/\\\" + esc(String(s)); }).join(\\\"\\\") || \\\"/\\\"; }\\n\\n /* ---- formulas (calc): parsed, never run as code ---- */\\n var OPS = [\\\"==\\\", \\\"!=\\\", \\\"<=\\\", \\\">=\\\", \\\"&&\\\", \\\"||\\\", \\\"<\\\", \\\">\\\", \\\"+\\\", \\\"-\\\", \\\"*\\\", \\\"/\\\", \\\"%\\\", \\\"^\\\", \\\"!\\\", \\\"?\\\", \\\":\\\", \\\"(\\\", \\\")\\\", \\\"[\\\", \\\"]\\\", \\\",\\\", \\\".\\\"];\\n function tokenize(src) {\\n if (src.length > 1000) throw new Error(\\\"Formula is longer than 1000 characters\\\");\\n var out = [], i = 0;\\n while (i < src.length) {\\n var ch = src.charAt(i);\\n if (/\\\\s/.test(ch)) { i++; continue; }\\n if (/[0-9]/.test(ch) || (ch === \\\".\\\" && /[0-9]/.test(src.charAt(i + 1)))) { var m = /^(?:\\\\d+\\\\.?\\\\d*|\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?/.exec(src.slice(i)); out.push({ k: \\\"num\\\", v: Number(m[0]) }); i += m[0].length; continue; }\\n if (ch === \\\"\\\\\\\"\\\" || ch === \\\"'\\\") { var j = i + 1, txt = \\\"\\\"; while (j < src.length && src.charAt(j) !== ch) { if (src.charAt(j) === \\\"\\\\\\\\\\\" && j + 1 < src.length) { txt += src.charAt(j + 1); j += 2; continue; } txt += src.charAt(j); j++; } if (j >= src.length) throw new Error(\\\"Unclosed string\\\"); out.push({ k: \\\"str\\\", v: txt }); i = j + 1; continue; }\\n if (/[A-Za-z_$]/.test(ch)) { var n = /^[A-Za-z_$][A-Za-z0-9_$]*/.exec(src.slice(i))[0]; out.push({ k: \\\"name\\\", v: n }); i += n.length; continue; }\\n var op = null; for (var q = 0; q < OPS.length; q++) if (src.substr(i, OPS[q].length) === OPS[q]) { op = OPS[q]; break; }\\n if (!op) throw new Error(\\\"Unexpected \\\\\\\"\\\" + ch + \\\"\\\\\\\"\\\");\\n out.push({ k: \\\"op\\\", v: op }); i += op.length;\\n }\\n return out;\\n }\\n var num = function (v, fn) { if (typeof v === \\\"number\\\") return v; if (typeof v === \\\"boolean\\\") return v ? 1 : 0; if (typeof v === \\\"string\\\" && v.trim() !== \\\"\\\" && isFinite(Number(v))) return Number(v); throw new Error(fn + \\\" needs a number\\\"); };\\n var nums = function (a, fn) { return (a.length === 1 && Array.isArray(a[0]) ? a[0] : a).map(function (v) { return num(v, fn); }); };\\n var truthy = function (v) { return !(v === null || v === undefined || v === false || v === 0 || v === \\\"\\\" || (typeof v === \\\"number\\\" && isNaN(v))); };\\n var FNS = {\\n min: function (a) { return Math.min.apply(null, nums(a, \\\"min\\\")); }, max: function (a) { return Math.max.apply(null, nums(a, \\\"max\\\")); },\\n sum: function (a) { return nums(a, \\\"sum\\\").reduce(function (s, n) { return s + n; }, 0); }, avg: function (a) { var n = nums(a, \\\"avg\\\"); return n.length ? n.reduce(function (s, x) { return s + x; }, 0) / n.length : 0; },\\n abs: function (a) { return Math.abs(num(a[0], \\\"abs\\\")); }, round: function (a) { var d = a[1] === undefined ? 0 : num(a[1], \\\"round\\\"), f = Math.pow(10, d); return Math.round(num(a[0], \\\"round\\\") * f) / f; },\\n floor: function (a) { return Math.floor(num(a[0], \\\"floor\\\")); }, ceil: function (a) { return Math.ceil(num(a[0], \\\"ceil\\\")); }, sqrt: function (a) { return Math.sqrt(num(a[0], \\\"sqrt\\\")); },\\n pow: function (a) { return Math.pow(num(a[0], \\\"pow\\\"), num(a[1], \\\"pow\\\")); }, log: function (a) { return Math.log(num(a[0], \\\"log\\\")); }, log2: function (a) { return Math.log(num(a[0], \\\"log2\\\")) / Math.LN2; },\\n log10: function (a) { return Math.log(num(a[0], \\\"log10\\\")) / Math.LN10; }, exp: function (a) { return Math.exp(num(a[0], \\\"exp\\\")); },\\n clamp: function (a) { return Math.min(Math.max(num(a[0], \\\"clamp\\\"), num(a[1], \\\"clamp\\\")), num(a[2], \\\"clamp\\\")); },\\n \\\"if\\\": function (a) { return truthy(a[0]) ? (a[1] === undefined ? null : a[1]) : (a[2] === undefined ? null : a[2]); },\\n len: function (a) { var v = a[0]; return typeof v === \\\"string\\\" || Array.isArray(v) ? v.length : 0; },\\n range: function (a) { var from = num(a[0], \\\"range\\\"), to = num(a[1], \\\"range\\\"), step = a[2] === undefined ? 1 : num(a[2], \\\"range\\\"); if (step <= 0) throw new Error(\\\"range needs a positive step\\\"); var o = []; for (var x = from; x <= to + 1e-9 && o.length < 1000; x += step) o.push(Math.round(x * 1e9) / 1e9); return o; },\\n __array: function (a) { return a; },\\n };\\n function parse(tokens) {\\n var pos = 0, depth = 0;\\n var peek = function () { var t = tokens[pos]; if (!t) return false; for (var i = 0; i < arguments.length; i++) if ((t.k === \\\"op\\\" || t.k === \\\"name\\\") && t.v === arguments[i]) return true; return false; };\\n var take = function () { var t = tokens[pos++]; if (!t) throw new Error(\\\"Formula ends too early\\\"); return t; };\\n var expect = function (op) { var t = take(); if (t.k !== \\\"op\\\" || t.v !== op) throw new Error(\\\"Expected \\\\\\\"\\\" + op + \\\"\\\\\\\"\\\"); };\\n var nest = function (fn) { if (++depth > 64) throw new Error(\\\"Formula is nested too deeply\\\"); try { return fn(); } finally { depth--; } };\\n function ternary() { return nest(function () { var c = or(); if (!peek(\\\"?\\\")) return c; take(); var a = ternary(); expect(\\\":\\\"); return { t: \\\"cond\\\", c: c, a: a, b: ternary() }; }); }\\n function or() { var a = and(); while (peek(\\\"||\\\", \\\"or\\\")) { take(); a = { t: \\\"bin\\\", op: \\\"||\\\", a: a, b: and() }; } return a; }\\n function and() { var a = cmp(); while (peek(\\\"&&\\\", \\\"and\\\")) { take(); a = { t: \\\"bin\\\", op: \\\"&&\\\", a: a, b: cmp() }; } return a; }\\n function cmp() { var a = addE(); if (peek(\\\"==\\\", \\\"!=\\\", \\\"<\\\", \\\"<=\\\", \\\">\\\", \\\">=\\\")) { var op = take().v; return { t: \\\"bin\\\", op: op, a: a, b: addE() }; } return a; }\\n function addE() { var a = mul(); while (peek(\\\"+\\\", \\\"-\\\")) { var op = take().v; a = { t: \\\"bin\\\", op: op, a: a, b: mul() }; } return a; }\\n function mul() { var a = pw(); while (peek(\\\"*\\\", \\\"/\\\", \\\"%\\\")) { var op = take().v; a = { t: \\\"bin\\\", op: op, a: a, b: pw() }; } return a; }\\n function pw() { var a = unary(); if (peek(\\\"^\\\")) { take(); return { t: \\\"bin\\\", op: \\\"^\\\", a: a, b: nest(pw) }; } return a; }\\n function unary() { if (peek(\\\"-\\\", \\\"!\\\", \\\"not\\\")) { var op = take().v === \\\"-\\\" ? \\\"-\\\" : \\\"!\\\"; return { t: \\\"un\\\", op: op, a: nest(unary) }; } return postfix(); }\\n function postfix() { var node = primary(); for (;;) { if (peek(\\\".\\\")) { take(); var k = take(); if (k.k !== \\\"name\\\") throw new Error(\\\"Expected a name after \\\\\\\".\\\\\\\"\\\"); node = { t: \\\"member\\\", o: node, k: { t: \\\"lit\\\", v: k.v } }; } else if (peek(\\\"[\\\")) { take(); var kk = ternary(); expect(\\\"]\\\"); node = { t: \\\"member\\\", o: node, k: kk }; } else return node; } }\\n function args() { var list = []; if (!peek(\\\")\\\") && !peek(\\\"]\\\")) { do { list.push(ternary()); } while (peek(\\\",\\\") && take()); } return list; }\\n function primary() {\\n var t = take();\\n if (t.k === \\\"num\\\" || t.k === \\\"str\\\") return { t: \\\"lit\\\", v: t.v };\\n if (t.k === \\\"op\\\" && t.v === \\\"(\\\") { var n = ternary(); expect(\\\")\\\"); return n; }\\n if (t.k === \\\"op\\\" && t.v === \\\"[\\\") { var items = args(); expect(\\\"]\\\"); return { t: \\\"call\\\", f: \\\"__array\\\", args: items }; }\\n if (t.k === \\\"name\\\") {\\n if (t.v === \\\"true\\\") return { t: \\\"lit\\\", v: true }; if (t.v === \\\"false\\\") return { t: \\\"lit\\\", v: false }; if (t.v === \\\"null\\\") return { t: \\\"lit\\\", v: null };\\n if (peek(\\\"(\\\")) { take(); var a = args(); expect(\\\")\\\"); if (!hasOwn(FNS, t.v)) throw new Error(\\\"Unknown function \\\\\\\"\\\" + t.v + \\\"\\\\\\\"\\\"); return { t: \\\"call\\\", f: t.v, args: a }; }\\n return { t: \\\"name\\\", n: t.v };\\n }\\n throw new Error(\\\"Unexpected \\\\\\\"\\\" + t.v + \\\"\\\\\\\"\\\");\\n }\\n var node = ternary();\\n if (pos < tokens.length) throw new Error(\\\"Unexpected \\\\\\\"\\\" + tokens[pos].v + \\\"\\\\\\\"\\\");\\n return node;\\n }\\n var eq = function (a, b) { return a === b || (typeof a !== typeof b && a !== null && b !== null && String(a) === String(b)); };\\n function evalNode(n, scope) {\\n switch (n.t) {\\n case \\\"lit\\\": return n.v;\\n case \\\"name\\\": if (!hasOwn(scope, n.n)) throw new Error(\\\"Unknown name \\\\\\\"\\\" + n.n + \\\"\\\\\\\"\\\"); return scope[n.n] === undefined ? null : scope[n.n];\\n case \\\"un\\\": var u = evalNode(n.a, scope); return n.op === \\\"-\\\" ? -num(u, \\\"-\\\") : !truthy(u);\\n case \\\"cond\\\": return truthy(evalNode(n.c, scope)) ? evalNode(n.a, scope) : evalNode(n.b, scope);\\n case \\\"member\\\":\\n var o = evalNode(n.o, scope), k = evalNode(n.k, scope);\\n if (Array.isArray(o)) { var ix = num(k, \\\"index\\\"); return ix === Math.floor(ix) && ix >= 0 && ix < o.length ? (o[ix] === undefined ? null : o[ix]) : null; }\\n if (o && typeof o === \\\"object\\\" && (typeof k === \\\"string\\\" || typeof k === \\\"number\\\")) return hasOwn(o, String(k)) && !forbidden(String(k)) ? (o[String(k)] === undefined ? null : o[String(k)]) : null;\\n return null;\\n case \\\"call\\\": return FNS[n.f](n.args.map(function (a) { return evalNode(a, scope); }));\\n case \\\"bin\\\":\\n if (n.op === \\\"&&\\\") { var x = evalNode(n.a, scope); return truthy(x) ? evalNode(n.b, scope) : x; }\\n if (n.op === \\\"||\\\") { var y = evalNode(n.a, scope); return truthy(y) ? y : evalNode(n.b, scope); }\\n var a = evalNode(n.a, scope), b = evalNode(n.b, scope);\\n switch (n.op) {\\n case \\\"==\\\": return eq(a, b); case \\\"!=\\\": return !eq(a, b);\\n case \\\"+\\\":\\n if (typeof a === \\\"string\\\" || typeof b === \\\"string\\\") {\\n // Text joins within the budget, checked before it is built: nested formulas can't double their way out.\\n var sa = String(a == null ? \\\"\\\" : a), sb = String(b == null ? \\\"\\\" : b);\\n if (sa.length + sb.length > MAX_STRING) throw new Error(\\\"text longer than \\\" + MAX_STRING + \\\" characters\\\");\\n return sa + sb;\\n }\\n return num(a, \\\"+\\\") + num(b, \\\"+\\\");\\n case \\\"-\\\": return num(a, \\\"-\\\") - num(b, \\\"-\\\"); case \\\"*\\\": return num(a, \\\"*\\\") * num(b, \\\"*\\\"); case \\\"/\\\": return num(a, \\\"/\\\") / num(b, \\\"/\\\");\\n case \\\"%\\\": return num(a, \\\"%\\\") % num(b, \\\"%\\\"); case \\\"^\\\": return Math.pow(num(a, \\\"^\\\"), num(b, \\\"^\\\"));\\n case \\\"<\\\": return typeof a === \\\"string\\\" && typeof b === \\\"string\\\" ? a < b : num(a, \\\"<\\\") < num(b, \\\"<\\\");\\n case \\\"<=\\\": return typeof a === \\\"string\\\" && typeof b === \\\"string\\\" ? a <= b : num(a, \\\"<=\\\") <= num(b, \\\"<=\\\");\\n case \\\">\\\": return typeof a === \\\"string\\\" && typeof b === \\\"string\\\" ? a > b : num(a, \\\">\\\") > num(b, \\\">\\\");\\n case \\\">=\\\": return typeof a === \\\"string\\\" && typeof b === \\\"string\\\" ? a >= b : num(a, \\\">=\\\") >= num(b, \\\">=\\\");\\n }\\n }\\n throw new Error(\\\"Unsupported formula\\\");\\n }\\n var compiled = {};\\n function compile(src) { if (hasOwn(compiled, src)) return compiled[src]; var n = parse(tokenize(src)); compiled[src] = n; return n; }\\n function tryEvaluate(src, scope) { try { return { value: evalNode(compile(src), scope) }; } catch (e) { return { value: null, error: e.message }; } }\\n\\n /* ---- formats ---- */\\n function formatValue(value, format) {\\n if (value === null || value === undefined) return \\\"—\\\";\\n if (typeof value === \\\"boolean\\\") return value ? \\\"Yes\\\" : \\\"No\\\";\\n if (typeof value === \\\"object\\\") return JSON.stringify(value);\\n if (typeof value === \\\"string\\\" && !format) return value;\\n var n = typeof value === \\\"number\\\" ? value : Number(value);\\n if (!isFinite(n)) return typeof value === \\\"string\\\" ? value : \\\"—\\\";\\n var parts = String(format || \\\"number\\\").split(\\\":\\\"), kind = parts[0] || \\\"number\\\", arg = parts[1];\\n var dec = arg !== undefined && /^\\\\d+$/.test(arg) ? Math.min(Number(arg), 10) : undefined;\\n switch (kind) {\\n case \\\"integer\\\": return Math.round(n).toLocaleString(\\\"en-US\\\");\\n case \\\"percent\\\": return (n * 100).toLocaleString(\\\"en-US\\\", { maximumFractionDigits: dec == null ? 1 : dec, minimumFractionDigits: dec == null ? 0 : dec }) + \\\"%\\\";\\n case \\\"currency\\\": var cur = arg && /^[A-Za-z]{3}$/.test(arg) ? arg.toUpperCase() : \\\"USD\\\", big = Math.abs(n) >= 100 || n === Math.floor(n); try { return n.toLocaleString(\\\"en-US\\\", { style: \\\"currency\\\", currency: cur, maximumFractionDigits: big ? 0 : 2, minimumFractionDigits: big ? 0 : 2 }); } catch (x) { return cur + \\\" \\\" + n.toFixed(2); }\\n case \\\"compact\\\": return n.toLocaleString(\\\"en-US\\\", { notation: \\\"compact\\\", maximumFractionDigits: dec == null ? 1 : dec });\\n case \\\"bytes\\\": var units = [\\\"B\\\", \\\"KB\\\", \\\"MB\\\", \\\"GB\\\", \\\"TB\\\", \\\"PB\\\"], v = Math.abs(n), u = 0; while (v >= 1024 && u < units.length - 1) { v /= 1024; u++; } return (n < 0 ? \\\"-\\\" : \\\"\\\") + v.toLocaleString(\\\"en-US\\\", { maximumFractionDigits: dec == null ? (v < 10 ? 1 : 0) : dec }) + \\\" \\\" + units[u];\\n case \\\"duration\\\": var s = Math.max(0, Math.round(n)), d = Math.floor(s / 86400); s -= d * 86400; var h = Math.floor(s / 3600); s -= h * 3600; var m = Math.floor(s / 60); s -= m * 60; return [d && d + \\\"d\\\", h && h + \\\"h\\\", m && m + \\\"m\\\", (s || (!d && !h && !m)) && s + \\\"s\\\"].filter(Boolean).slice(0, 2).join(\\\" \\\");\\n default: return n.toLocaleString(\\\"en-US\\\", { maximumFractionDigits: dec == null ? 2 : dec, minimumFractionDigits: dec == null ? 0 : dec });\\n }\\n }\\n\\n /* ---- formatString templates ---- */\\n function matchingBrace(text, open) { var depth = 0, quote = null; for (var i = open; i < text.length; i++) { var ch = text.charAt(i); if (quote) { if (ch === quote) quote = null; continue; } if (ch === \\\"'\\\" || ch === \\\"\\\\\\\"\\\") { quote = ch; continue; } if (ch === \\\"{\\\") depth++; else if (ch === \\\"}\\\") { depth--; if (depth === 0) return i; } } return -1; }\\n function splitArgs(text) { var parts = [], depth = 0, quote = null, start = 0; for (var i = 0; i < text.length; i++) { var ch = text.charAt(i); if (quote) { if (ch === quote) quote = null; continue; } if (ch === \\\"'\\\" || ch === \\\"\\\\\\\"\\\") quote = ch; else if (ch === \\\"{\\\" || ch === \\\"(\\\") depth++; else if (ch === \\\"}\\\" || ch === \\\")\\\") depth--; else if (ch === \\\",\\\" && depth === 0) { parts.push(text.slice(start, i)); start = i + 1; } } if (text.slice(start).trim()) parts.push(text.slice(start)); return parts; }\\n function parseTemplate(template, depth) {\\n depth = depth || 0;\\n var parts = [], text = \\\"\\\", i = 0;\\n while (i < template.length) {\\n if (template.charAt(i) === \\\"\\\\\\\\\\\" && template.substr(i + 1, 2) === \\\"${\\\") { text += \\\"${\\\"; i += 3; continue; }\\n if (template.substr(i, 2) === \\\"${\\\") { var end = matchingBrace(template, i + 1); if (end < 0) { text += template.slice(i); break; } if (text) { parts.push(text); text = \\\"\\\"; } parts.push(parseExpr(template.slice(i + 2, end), depth + 1)); i = end + 1; continue; }\\n text += template.charAt(i); i++;\\n }\\n if (text) parts.push(text);\\n return parts;\\n }\\n function parseExpr(source, depth) {\\n var expr = source.trim();\\n if (depth > 32) return { kind: \\\"path\\\", path: \\\"\\\" };\\n var cm = /^([A-Za-z_][A-Za-z0-9_]*)\\\\s*\\\\(([\\\\s\\\\S]*)\\\\)$/.exec(expr);\\n if (cm) { var args = []; splitArgs(cm[2]).forEach(function (part) { var c = part.indexOf(\\\":\\\"); if (c < 0) return; args.push({ key: part.slice(0, c).trim(), value: parseArg(part.slice(c + 1).trim(), depth + 1) }); }); return { kind: \\\"call\\\", name: cm[1], args: args }; }\\n if (expr.slice(0, 2) === \\\"${\\\" && expr.slice(-1) === \\\"}\\\") return parseExpr(expr.slice(2, -1), depth + 1);\\n return { kind: \\\"path\\\", path: expr };\\n }\\n function parseArg(text, depth) {\\n if (text.length >= 2 && ((text.charAt(0) === \\\"'\\\" && text.slice(-1) === \\\"'\\\") || (text.charAt(0) === \\\"\\\\\\\"\\\" && text.slice(-1) === \\\"\\\\\\\"\\\"))) return { kind: \\\"literal\\\", value: text.slice(1, -1) };\\n if (text === \\\"true\\\" || text === \\\"false\\\") return { kind: \\\"literal\\\", value: text === \\\"true\\\" };\\n if (text !== \\\"\\\" && isFinite(Number(text))) return { kind: \\\"literal\\\", value: Number(text) };\\n if (text.slice(0, 2) === \\\"${\\\") return parseExpr(text, depth);\\n return { kind: \\\"path\\\", path: text };\\n }\\n function templateCalls(template, depth) {\\n depth = depth || 0; var names = []; if (depth > 32) return names;\\n var visit = function (e) { if (e.kind !== \\\"call\\\") return; names.push(e.name); e.args.forEach(function (a) { if (e.name === \\\"formatString\\\" && a.key === \\\"value\\\" && a.value.kind === \\\"literal\\\" && typeof a.value.value === \\\"string\\\") names.push.apply(names, templateCalls(a.value.value, depth + 1)); else visit(a.value); }); };\\n parseTemplate(template).forEach(function (p) { if (typeof p !== \\\"string\\\") visit(p); });\\n return names;\\n }\\n\\n /* ---- regex checks that can't freeze the page ---- */\\n function isSafePattern(p) {\\n if (p.length > 300) return false;\\n var stack = [], variable = 0, unbounded = 0;\\n var quantAt = function (j) { var c = p.charAt(j); return c === \\\"*\\\" || c === \\\"+\\\" || c === \\\"?\\\" || (c === \\\"{\\\" && /^\\\\{\\\\d+(,\\\\d*)?\\\\}/.test(p.slice(j))); };\\n var repeatsAt = function (j) { var c = p.charAt(j); if (c === \\\"*\\\" || c === \\\"+\\\") return true; var m = /^\\\\{(\\\\d+)(,(\\\\d*))?\\\\}/.exec(p.slice(j)); if (!m) return false; var max = m[2] === undefined ? Number(m[1]) : m[3] === \\\"\\\" ? Infinity : Number(m[3]); return max > 1; };\\n var isVar = function (i) { var c = p.charAt(i); if (c === \\\"*\\\" || c === \\\"+\\\" || c === \\\"?\\\") return true; var m = /^\\\\{(\\\\d+)(,(\\\\d*))?\\\\}/.exec(p.slice(i)); if (!m || m[2] === undefined) return false; return m[3] === \\\"\\\" || Number(m[3]) > Number(m[1]); };\\n for (var i = 0; i < p.length; i++) {\\n var ch = p.charAt(i);\\n if (ch === \\\"\\\\\\\\\\\") { var nx = p.charAt(i + 1); if (!nx || /[1-9k]/.test(nx)) return false; i++; continue; }\\n if (ch === \\\"[\\\") { var j = i + 1; if (p.charAt(j) === \\\"^\\\") j++; while (j < p.length && p.charAt(j) !== \\\"]\\\") j += p.charAt(j) === \\\"\\\\\\\\\\\" ? 2 : 1; if (j >= p.length) return false; i = j; continue; }\\n if (ch === \\\"(\\\") { if (p.charAt(i + 1) === \\\"?\\\") { if (p.charAt(i + 2) !== \\\":\\\") return false; i += 2; } stack.push({ risky: false }); continue; }\\n if (ch === \\\")\\\") { var g = stack.pop(); if (!g) return false; if (stack.length) stack[stack.length - 1].risky = stack[stack.length - 1].risky || g.risky; if (g.risky && repeatsAt(i + 1)) return false; continue; }\\n if (ch === \\\"|\\\") return false;\\n // At most two unbounded repeats (\\\"a*a*a*\\\" backtracks cubically), at most three variable ones in all.\\n if (quantAt(i)) { if (stack.length) stack[stack.length - 1].risky = true; if (isVar(i) && ++variable > 3) return false; if ((ch === \\\"*\\\" || ch === \\\"+\\\" || /^\\\\{\\\\d+,\\\\}/.test(p.slice(i))) && ++unbounded > 2) return false; if (ch === \\\"{\\\") i = p.indexOf(\\\"}\\\", i); if (p.charAt(i + 1) === \\\"?\\\") i++; continue; }\\n }\\n return stack.length === 0;\\n }\\n function safeTest(pattern, input) { if (!isSafePattern(pattern) || input.length > 160) return false; try { return new RegExp(pattern).test(input); } catch (x) { return false; } }\\n\\n /* ---- values: literals, bindings, calls ---- */\\n function toText(v) { if (v === undefined || v === null) return \\\"\\\"; if (typeof v === \\\"string\\\") return v; if (typeof v === \\\"number\\\" || typeof v === \\\"boolean\\\") return String(v); return JSON.stringify(v); }\\n var toNum = function (v) { return typeof v === \\\"number\\\" ? v : typeof v === \\\"string\\\" && v.trim() !== \\\"\\\" ? Number(v) : typeof v === \\\"boolean\\\" ? Number(v) : NaN; };\\n var depthNow = 0, callsMade = 0;\\n /** ctx: { model, base (\\\"/\\\" or the item's pointer), functions (the surface catalog's) }. */\\n function resolve(value, ctx) {\\n if (value === undefined || value === null || typeof value !== \\\"object\\\") return value;\\n if (Array.isArray(value)) return value.map(function (v) { if (isBinding(v) || isCall(v)) { var r = resolve(v, ctx); return r === undefined ? null : r; } return v; });\\n if (isBinding(value)) return getPointer(ctx.model, resolvePath(value.path, ctx.base));\\n if (isCall(value)) return call(value.call, value.args || {}, ctx);\\n return value;\\n }\\n function call(name, args, ctx) {\\n if (depthNow === 0) callsMade = 0;\\n if (!ctx.functions[name] || depthNow >= 32 || ++callsMade > 2000) return undefined;\\n depthNow++;\\n try { return callFn(name, args, ctx); } finally { depthNow--; }\\n }\\n function isEmail(v) { if (v.length > 254 || /\\\\s/.test(v)) return false; var at = v.indexOf(\\\"@\\\"); if (at <= 0 || at !== v.lastIndexOf(\\\"@\\\")) return false; var d = v.slice(at + 1), dot = d.lastIndexOf(\\\".\\\"); return dot > 0 && dot < d.length - 1; }\\n function callFn(name, raw, ctx) {\\n var arg = function (k) { return resolve(raw[k], ctx); };\\n switch (name) {\\n case \\\"required\\\": var v = arg(\\\"value\\\"); return !(v === undefined || v === null || v === \\\"\\\" || (Array.isArray(v) && !v.length));\\n case \\\"regex\\\": return typeof raw.pattern === \\\"string\\\" && safeTest(raw.pattern, toText(arg(\\\"value\\\")));\\n case \\\"length\\\": var n = toText(arg(\\\"value\\\")).length; return (typeof raw.min !== \\\"number\\\" || n >= raw.min) && (typeof raw.max !== \\\"number\\\" || n <= raw.max);\\n case \\\"numeric\\\": var x = toNum(arg(\\\"value\\\")); if (isNaN(x)) return false; return (typeof raw.min !== \\\"number\\\" || x >= raw.min) && (typeof raw.max !== \\\"number\\\" || x <= raw.max);\\n case \\\"email\\\": return isEmail(toText(arg(\\\"value\\\")));\\n case \\\"formatString\\\": return formatString(toText(arg(\\\"value\\\")), ctx);\\n case \\\"formatNumber\\\": var fnn = toNum(arg(\\\"value\\\")); if (isNaN(fnn)) return \\\"\\\"; var dd = arg(\\\"decimals\\\"), dec = typeof dd === \\\"number\\\" ? Math.min(Math.max(Math.round(dd), 0), 10) : undefined; return fnn.toLocaleString(\\\"en-US\\\", { minimumFractionDigits: dec, maximumFractionDigits: dec == null ? 2 : dec, useGrouping: arg(\\\"grouping\\\") !== false });\\n case \\\"formatCurrency\\\": var fc = toNum(arg(\\\"value\\\")); if (isNaN(fc)) return \\\"\\\"; var cur = toText(arg(\\\"currency\\\")) || \\\"USD\\\", d2 = arg(\\\"decimals\\\"), dc = typeof d2 === \\\"number\\\" ? Math.min(Math.max(Math.round(d2), 0), 10) : undefined; try { return fc.toLocaleString(\\\"en-US\\\", { style: \\\"currency\\\", currency: cur, minimumFractionDigits: dc, maximumFractionDigits: dc, useGrouping: arg(\\\"grouping\\\") !== false }); } catch (e) { return cur + \\\" \\\" + fc.toFixed(dc == null ? 2 : dc); }\\n case \\\"formatDate\\\": return formatDate(arg(\\\"value\\\"), toText(arg(\\\"format\\\")));\\n case \\\"pluralize\\\": var pn = toNum(arg(\\\"value\\\")); if (pn === 0 && raw.zero !== undefined) return toText(arg(\\\"zero\\\")); var cat = isNaN(pn) ? \\\"other\\\" : new Intl.PluralRules(\\\"en-US\\\").select(pn); return toText(raw[cat] !== undefined ? arg(cat) : arg(\\\"other\\\"));\\n case \\\"openUrl\\\": return null;\\n case \\\"and\\\": return Array.isArray(raw.values) && raw.values.every(function (y) { return truthy(resolve(y, ctx)); });\\n case \\\"or\\\": return Array.isArray(raw.values) && raw.values.some(function (y) { return truthy(resolve(y, ctx)); });\\n case \\\"not\\\": return !truthy(arg(\\\"value\\\"));\\n case \\\"calc\\\": if (typeof raw.expr !== \\\"string\\\") return undefined; var r = tryEvaluate(raw.expr, formulaScope(ctx, raw.vars)); return r.error ? undefined : r.value;\\n case \\\"formatValue\\\": var fv = arg(\\\"value\\\"); return formatValue(fv === undefined ? null : fv, toText(arg(\\\"format\\\")) || undefined);\\n }\\n return undefined;\\n }\\n function formulaScope(ctx, vars) {\\n var scope = {};\\n var copy = function (o) { Object.keys(o).forEach(function (k) { if (!forbidden(k)) scope[k] = o[k]; }); };\\n if (isObj(ctx.model)) copy(ctx.model);\\n var item = ctx.base !== \\\"/\\\" ? getPointer(ctx.model, ctx.base) : undefined;\\n if (isObj(item)) copy(item);\\n if (isObj(vars)) Object.keys(vars).forEach(function (k) { if (!forbidden(k)) { var v = resolve(vars[k], ctx); scope[k] = v === undefined ? null : v; } });\\n return scope;\\n }\\n /** The longest string one value may expand to: a short document can't grow past what a page can hold. */\\n var MAX_STRING = 4000;\\n function clip(s) { return s.length > MAX_STRING ? s.slice(0, MAX_STRING - 1) + \\\"…\\\" : s; }\\n function formatString(template, ctx) {\\n var ev = function (e) { if (e.kind === \\\"literal\\\") return e.value; if (e.kind === \\\"path\\\") return getPointer(ctx.model, resolvePath(e.path, ctx.base)); var a = {}; e.args.forEach(function (x) { var v = ev(x.value); a[x.key] = v === undefined ? null : v; }); return call(e.name, a, ctx); };\\n // Built piece by piece against the budget, never whole first.\\n var out = \\\"\\\", parts = parseTemplate(clip(template));\\n for (var i = 0; i < parts.length && out.length < MAX_STRING; i++) { var p = parts[i]; out += clip(typeof p === \\\"string\\\" ? p : toText(ev(p))); }\\n return clip(out);\\n }\\n function formatDate(value, pattern) {\\n var date = null;\\n if (typeof value === \\\"number\\\") date = new Date(value);\\n else if (typeof value === \\\"string\\\") { var dm = /^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})$/.exec(value); date = dm ? new Date(Number(dm[1]), Number(dm[2]) - 1, Number(dm[3])) : new Date(value); }\\n if (!date || isNaN(date.getTime())) return \\\"\\\";\\n var pad = function (n, w) { return String(n).padStart(w || 2, \\\"0\\\"); }, h12 = date.getHours() % 12 || 12;\\n var T = { yyyy: function () { return String(date.getFullYear()); }, yy: function () { return pad(date.getFullYear() % 100); }, MMMM: function () { return date.toLocaleString(\\\"en-US\\\", { month: \\\"long\\\" }); }, MMM: function () { return date.toLocaleString(\\\"en-US\\\", { month: \\\"short\\\" }); }, MM: function () { return pad(date.getMonth() + 1); }, M: function () { return String(date.getMonth() + 1); }, EEEE: function () { return date.toLocaleString(\\\"en-US\\\", { weekday: \\\"long\\\" }); }, E: function () { return date.toLocaleString(\\\"en-US\\\", { weekday: \\\"short\\\" }); }, dd: function () { return pad(date.getDate()); }, d: function () { return String(date.getDate()); }, HH: function () { return pad(date.getHours()); }, H: function () { return String(date.getHours()); }, hh: function () { return pad(h12); }, h: function () { return String(h12); }, mm: function () { return pad(date.getMinutes()); }, ss: function () { return pad(date.getSeconds()); }, a: function () { return date.getHours() < 12 ? \\\"AM\\\" : \\\"PM\\\"; } };\\n var order = Object.keys(T).sort(function (a, b) { return b.length - a.length; }), out = \\\"\\\";\\n for (var i = 0; i < pattern.length;) {\\n if (pattern.charAt(i) === \\\"'\\\") { var end = pattern.indexOf(\\\"'\\\", i + 1); out += end < 0 ? pattern.slice(i + 1) : pattern.slice(i + 1, end); i = end < 0 ? pattern.length : end + 1; continue; }\\n var tok = null; for (var k = 0; k < order.length; k++) if (pattern.substr(i, order[k].length) === order[k]) { tok = order[k]; break; }\\n if (tok) { out += T[tok](); i += tok.length; } else { out += pattern.charAt(i); i++; }\\n }\\n return out;\\n }\\n\\n\\n /* ---- a document as text: complete without any view (the tool's text result) ---- */\\n /** Every surface of a built document as plain text: headings, values as they resolve now, every quiz answer. */\\n var MAX_TEXT = 100000, MAX_WALK = 3000, MAX_CODE = 20000;\\n function documentText(built) {\\n var out = [], size = 0, walked = 0, cut = false;\\n var push0 = out.push;\\n var pushWhole = function (s) { if (cut) return; size += s.length + 1; if (size > MAX_TEXT) { cut = true; push0.call(out, \\\"\\\", \\\"(The rest is cut: the document's text runs past \\\" + MAX_TEXT + \\\" characters.)\\\"); return; } push0.call(out, s); };\\n out.push = function () { for (var a = 0; a < arguments.length; a++) { if (cut) return; var line = clip(String(arguments[a])); size += line.length + 1; if (size > MAX_TEXT) { cut = true; push0.call(out, \\\"\\\", \\\"(The rest is cut: the document's text runs past \\\" + MAX_TEXT + \\\" characters.)\\\"); return; } push0.call(out, line); } };\\n built.surfaces.forEach(function (s, si) {\\n if (s.loop) return;\\n if (si) out.push(\\\"\\\", \\\"---\\\", \\\"\\\");\\n var fns = s.catalog ? s.catalog.functions : {};\\n var seen = {};\\n var walk = function (id, base, depth) {\\n if (depth > 40 || !hasOwn(s.components, id) || cut || ++walked > MAX_WALK) return;\\n var key = id + \\\"@\\\" + base; if (seen[key]) return; seen[key] = 1;\\n var c = s.components[id], ctx = { model: s.dataModel, base: base, functions: fns };\\n var r = function (v) { return resolve(v, ctx); }, t = function (v) { return toText(r(v)); };\\n var kids = function (ch) {\\n if (Array.isArray(ch)) ch.forEach(function (k) { walk(k, base, depth + 1); });\\n else if (isObj(ch) && typeof ch.path === \\\"string\\\") { var list = getPointer(s.dataModel, resolvePath(ch.path, base)); if (Array.isArray(list)) list.forEach(function (_, i) { walk(ch.componentId, joinPointer(resolvePath(ch.path, base), i), depth + 1); }); }\\n };\\n var label = function (cid) { if (!hasOwn(s.components, cid)) return \\\"\\\"; var x = s.components[cid]; return x.component === \\\"Text\\\" ? toText(resolve(x.text, ctx)) : x.component === \\\"Icon\\\" ? \\\"\\\" : \\\"\\\"; };\\n switch (c.component) {\\n case \\\"Text\\\": var v = c.variant; out.push(v === \\\"h1\\\" ? \\\"# \\\" + t(c.text) : v === \\\"h2\\\" ? \\\"## \\\" + t(c.text) : /^h[345]$/.test(v || \\\"\\\") ? \\\"### \\\" + t(c.text) : t(c.text)); break;\\n case \\\"Image\\\": out.push(\\\"[Image\\\" + (c.description ? \\\": \\\" + t(c.description) : \\\"\\\") + \\\"] \\\" + t(c.url)); break;\\n case \\\"Video\\\": out.push(\\\"[Video] \\\" + t(c.url)); break;\\n case \\\"AudioPlayer\\\": out.push(\\\"[Audio\\\" + (c.description ? \\\": \\\" + t(c.description) : \\\"\\\") + \\\"] \\\" + t(c.url)); break;\\n case \\\"Icon\\\": break;\\n case \\\"Row\\\": case \\\"Column\\\": case \\\"List\\\": kids(c.children); break;\\n case \\\"Card\\\": walk(c.child, base, depth + 1); break;\\n case \\\"Tabs\\\": (c.tabs || []).forEach(function (tb) { out.push(\\\"\\\", \\\"### \\\" + t(tb.title)); walk(tb.child, base, depth + 1); }); break;\\n case \\\"Modal\\\": walk(c.trigger, base, depth + 1); walk(c.content, base, depth + 1); break;\\n case \\\"Divider\\\": out.push(\\\"---\\\"); break;\\n case \\\"Button\\\":\\n var a = c.action || {};\\n out.push(\\\"[\\\" + (label(c.child) || \\\"Button\\\") + \\\"]\\\" + (a.functionCall && a.functionCall.call === \\\"openUrl\\\" ? \\\" \\\" + t((a.functionCall.args || {}).url) : \\\"\\\"));\\n break;\\n case \\\"TextField\\\": out.push(t(c.label) + \\\": \\\" + t(c.value)); break;\\n case \\\"CheckBox\\\": out.push(\\\"[\\\" + (r(c.value) ? \\\"x\\\" : \\\" \\\") + \\\"] \\\" + t(c.label)); break;\\n case \\\"ChoicePicker\\\":\\n var sel = r(c.value); sel = Array.isArray(sel) ? sel : [];\\n out.push((c.label ? t(c.label) + \\\": \\\" : \\\"\\\") + (c.options || []).map(function (o) { return (sel.indexOf(o.value) >= 0 ? \\\"[x] \\\" : \\\"[ ] \\\") + t(o.label); }).join(\\\", \\\"));\\n break;\\n case \\\"Slider\\\": out.push(t(c.label) + \\\": \\\" + t(c.value) + \\\" (\\\" + (c.min == null ? 0 : c.min) + \\\" to \\\" + c.max + \\\")\\\"); break;\\n case \\\"DateTimeInput\\\": out.push((c.label ? t(c.label) + \\\": \\\" : \\\"\\\") + t(c.value)); break;\\n case \\\"Stat\\\": out.push(t(c.label) + \\\": \\\" + formatValue(r(c.value) === undefined ? null : r(c.value), c.format) + (c.hint ? \\\" (\\\" + t(c.hint) + \\\")\\\" : \\\"\\\")); break;\\n case \\\"Callout\\\": out.push((c.tone === \\\"warning\\\" ? \\\"Warning\\\" : c.tone === \\\"tip\\\" ? \\\"Tip\\\" : c.tone === \\\"success\\\" ? \\\"Done\\\" : \\\"Note\\\") + \\\": \\\" + (c.title ? t(c.title) + \\\". \\\" : \\\"\\\") + t(c.text)); break;\\n case \\\"Chart\\\":\\n var cd = chartData(c, ctx);\\n if (c.title) out.push(\\\"### \\\" + t(c.title));\\n cd.labels.forEach(function (lb, i) { out.push(\\\"- \\\" + lb + \\\": \\\" + cd.series.map(function (x) { return (cd.series.length > 1 ? x.name + \\\" \\\" : \\\"\\\") + formatValue(x.values[i] == null ? null : x.values[i], c.format); }).join(\\\", \\\")); });\\n break;\\n case \\\"Steps\\\": (c.steps || []).forEach(function (st, i) { out.push((i + 1) + \\\". \\\" + t(st.title) + (st.text ? \\\": \\\" + t(st.text) : \\\"\\\")); if (st.child) walk(st.child, base, depth + 1); }); break;\\n case \\\"Quiz\\\": (c.questions || []).forEach(function (q, i) { var ch = (q.choices || []).map(function (x) { return toText(r(x)); }), ans = Number(r(q.answer)); out.push(\\\"Q\\\" + (i + 1) + \\\". \\\" + t(q.question)); ch.forEach(function (x, k) { out.push(\\\" \\\" + \\\"ABCDEFGH\\\"[k] + \\\") \\\" + x); }); out.push(\\\" Answer: \\\" + (\\\"ABCDEFGH\\\"[ans] || \\\"?\\\") + (q.explain ? \\\". \\\" + t(q.explain) : \\\"\\\")); }); break;\\n case \\\"Flashcards\\\": (c.cards || []).forEach(function (cc) { out.push(\\\"Q: \\\" + t(cc.front), \\\"A: \\\" + t(cc.back)); }); break;\\n case \\\"Timeline\\\": (c.events || []).forEach(function (e) { out.push(\\\"- \\\" + (e.label ? t(e.label) + \\\": \\\" : \\\"\\\") + t(e.title) + (e.text ? \\\". \\\" + t(e.text) : \\\"\\\")); }); break;\\n case \\\"Compare\\\": (c.items || []).forEach(function (it) { var pts = r(it.points); out.push(\\\"### \\\" + t(it.title) + (it.badge ? \\\" (\\\" + t(it.badge) + \\\")\\\" : \\\"\\\")); (Array.isArray(pts) ? pts : []).forEach(function (p) { out.push(\\\"- \\\" + toText(p)); }); if (it.verdict) out.push(\\\"Verdict: \\\" + t(it.verdict)); }); break;\\n case \\\"Diagram\\\": out.push((c.caption ? \\\"Diagram: \\\" + t(c.caption) : \\\"Diagram\\\"), \\\"```mermaid\\\", t(c.mermaid), \\\"```\\\"); break;\\n // Code is kept whole (up to MAX_CODE), never clipped like a line of prose: a copy must run.\\n case \\\"Code\\\": out.push((c.title ? t(c.title) + \\\":\\\" : \\\"\\\"), \\\"```\\\" + (c.language || \\\"\\\")); var src = toText(r(c.code)); pushWhole(src.length > MAX_CODE ? \\\"(code longer than \\\" + MAX_CODE + \\\" characters: not shown)\\\" : src); out.push(\\\"```\\\"); break;\\n case \\\"Table\\\":\\n var td = tableData(c, ctx);\\n out.push(\\\"| \\\" + td.columns.map(function (x) { return x.label; }).join(\\\" | \\\") + \\\" |\\\", \\\"| \\\" + td.columns.map(function () { return \\\"---\\\"; }).join(\\\" | \\\") + \\\" |\\\");\\n td.rows.forEach(function (row) { out.push(\\\"| \\\" + row.map(function (x) { return String(x).replace(/\\\\|/g, \\\"\\\\\\\\|\\\"); }).join(\\\" | \\\") + \\\" |\\\"); });\\n if (td.total > td.rows.length) out.push(\\\"(\\\" + td.rows.length + \\\" of \\\" + td.total + \\\" rows: a table shows at most 500)\\\");\\n break;\\n }\\n };\\n walk(\\\"root\\\", \\\"/\\\", 0);\\n });\\n return out.filter(function (l, i, a) { return !(l === \\\"\\\" && a[i - 1] === \\\"\\\"); }).join(\\\"\\\\n\\\").trim();\\n }\\n /** A chart's labels and series as numbers: literal values, bindings, calls, or a formula over x. */\\n function chartData(c, ctx) {\\n var r = function (v) { return resolve(v, ctx); };\\n var series = Array.isArray(c.series) ? c.series : [], labels = r(c.labels);\\n var out = [], xs = null;\\n if (isObj(c.x)) {\\n var from = Number(r(c.x.from)), to = Number(r(c.x.to)), steps = Math.max(2, Math.min(200, Number(r(c.x.steps)) || 20));\\n if (isFinite(from) && isFinite(to)) { xs = []; for (var i = 0; i < steps; i++) xs.push(Math.round((from + ((to - from) * i) / (steps - 1)) * 1e6) / 1e6); }\\n }\\n series.forEach(function (x, si) {\\n var vals;\\n if (x.expr && xs) { vals = xs.map(function (xv) { var sc = formulaScope(ctx, null); sc.x = xv; var e = tryEvaluate(x.expr, sc); return typeof e.value === \\\"number\\\" && isFinite(e.value) ? e.value : null; }); }\\n else { var raw = r(x.values); vals = Array.isArray(raw) ? raw.map(function (v) { var n = Number(resolve(v, ctx)); return isFinite(n) ? n : null; }) : []; }\\n out.push({ name: toText(r(x.name)) || \\\"Series \\\" + (si + 1), values: vals });\\n });\\n var n = out.reduce(function (m, x) { return Math.max(m, x.values.length); }, 0);\\n var lab = xs ? xs.map(function (v) { return formatValue(v); }) : Array.isArray(labels) ? labels.map(function (l) { return toText(l); }) : [];\\n for (var k = lab.length; k < n; k++) lab.push(String(k + 1));\\n return { labels: lab.slice(0, n), series: out };\\n }\\n /** A table's columns and rows as text, each cell formatted by its column. */\\n function tableData(c, ctx) {\\n var cols = (c.columns || []).map(function (x, i) { return typeof x === \\\"string\\\" ? { label: x, key: i } : { label: toText(resolve(x.label, ctx)), key: x.key != null ? x.key : i, format: x.format, align: x.align }; });\\n var raw = resolve(c.rows, ctx), rows = Array.isArray(raw) ? raw : [];\\n return { columns: cols, total: rows.length, rows: rows.slice(0, 500).map(function (row) { return cols.map(function (col, i) { var v = Array.isArray(row) ? row[i] : isObj(row) ? row[col.key] : \\\"\\\"; v = resolve(v, ctx); return col.format ? formatValue(v == null ? null : v, col.format) : toText(v); }); }) };\\n }\\n\\n return {\\n EXTENSIONS: EXTENSIONS, MAX_STRING: MAX_STRING, MAX_CODE: MAX_CODE, clip: clip, findLoop: findLoop, VERSION: A2UI_VERSION, documentText: documentText, chartData: chartData, tableData: tableData, formulaScope: formulaScope, BASIC_CATALOG_ID: BASIC_CATALOG_ID, FABRIC_CATALOG_ID: FABRIC_CATALOG_ID, CATALOG: CATALOG,\\n catalogFor: catalogFor, checkComponent: checkComponent, readMessages: readMessages, buildSurfaces: buildSurfaces, referencedIds: referencedIds,\\n isBinding: isBinding, isCall: isCall, getPointer: getPointer, setPointer: setPointer, resolvePath: resolvePath, joinPointer: joinPointer,\\n resolve: resolve, call: call, formatString: formatString, formatValue: formatValue, formatDate: formatDate, tryEvaluate: tryEvaluate, truthy: truthy,\\n isSafePattern: isSafePattern, safeTest: safeTest, toText: toText, templateCalls: templateCalls,\\n };\\n})();\\n\\n/* a2ui.js */\\n/* ---- A2UI v0.9.1 surfaces drawn with the kit ----\\n * a2uiSurface(surface, o): every component of the basic catalog and Fabric's (A2UI.CATALOG) as the kit's own: Text,\\n * Row, Column, List, Card, Tabs, Modal, Divider, Button, TextField, CheckBox, ChoicePicker, Slider, DateTimeInput, Image,\\n * Video, AudioPlayer, Icon; Chart, Stat, Callout, Steps, Quiz, Flashcards, Timeline, Compare, Diagram, Code, Table.\\n * Inputs write to the surface's data model as the reader moves them; whatever is bound to what changed redraws in place\\n * (an input is never rebuilt under the reader's hand). Nothing reaches the assistant until an action: a Button's event\\n * is o.onAction(visibleText, envelope), the spec's client action message; openUrl is o.onOpenUrl(url).\\n * Media can't load past the view's CSP, so an Image, Video or AudioPlayer is a link to it.\\n */\\nvar A2 = A2UI;\\n/** Quiz progress by surface, component and item, so a redraw (full screen, a resize) keeps the reader's answers. */\\nvar A2_QUIZ_KEPT = {};\\nfunction a2uiSurface(surface, o) {\\n o = o || {};\\n var refreshers = [];\\n var fns = surface.catalog ? surface.catalog.functions : {};\\n var ctxOf = function (base) { return { model: surface.dataModel, base: base, functions: fns }; };\\n var r = function (v, base) { return A2.resolve(v, ctxOf(base)); };\\n var t = function (v, base) { return A2.clip(A2.toText(r(v, base))); };\\n var setPath = function (path, base, value, except) {\\n surface.dataModel = A2.setPointer(surface.dataModel, A2.resolvePath(path, base), value);\\n refreshers.slice().forEach(function (f) { if (!f.dead && f.node !== except) f.fn(); });\\n refreshers = refreshers.filter(function (f) { return !f.dead; });\\n if (o.onChange) o.onChange(surface);\\n };\\n var boundPath = function (v) { return A2.isBinding(v) ? v.path : null; };\\n /** A derived node: rebuilt in place when the model changes (or, given a key, only when its key does). What its\\n * last build registered is retired with it, so a rebuild never leaves refreshers behind on detached nodes. */\\n var live = function (build, keyOf) {\\n var owned = [], mine = cur;\\n var make = function () { var from = refreshers.length; var n0 = build(); owned = refreshers.slice(from); return n0; };\\n var key = keyOf ? keyOf() : null;\\n var n = make();\\n var rec = { node: n, fn: function () {\\n if (keyOf) { var k = keyOf(); if (k === key) return; key = k; }\\n owned.forEach(function (f) { f.dead = true; });\\n var n2 = make(); if (mine) labelled(mine.c, n2, mine.base); if (rec.node.parentNode) rec.node.parentNode.replaceChild(n2, rec.node); rec.node = n2;\\n } };\\n refreshers.push(rec);\\n return n;\\n };\\n // A surface draws at most this many components in all, and never one inside itself.\\n // The budget is per drawing (the whole surface, a tab's content, a rebuilt list), never spent for good.\\n var MAX_DRAWN = 1500, drawn = 0, open = {}, nest = 0, cur = null;\\n function render(id, base) {\\n if (nest === 0) drawn = 0;\\n if (!Object.prototype.hasOwnProperty.call(surface.components, id) || open[id] || drawn >= MAX_DRAWN) return null;\\n drawn++; open[id] = true; nest++;\\n var was = cur; cur = { c: surface.components[id], base: base };\\n try { return labelled(surface.components[id], renderOne(surface.components[id], base), base); } catch (x) { return errorState(\\\"This part couldn't be drawn: \\\" + String(x && x.message || x).slice(0, 120)); } finally { delete open[id]; nest--; cur = was; }\\n }\\n /** A component's accessibility label and description, on the control a reader reaches. */\\n function labelled(c, node, base) {\\n var a = c && c.accessibility;\\n if (!node || !a || typeof a !== \\\"object\\\") return node;\\n var target = node.matches && node.matches(\\\"input, button, select, textarea\\\") ? node : (node.querySelector && node.querySelector(\\\"input, button, select, textarea, [tabindex]\\\")) || node;\\n if (a.label != null) { var l = t(a.label, base); if (l) target.setAttribute(\\\"aria-label\\\", l); }\\n if (a.description != null) { var d = t(a.description, base); if (d) target.setAttribute(\\\"aria-description\\\", d); }\\n return node;\\n }\\n function children(ch, base, into) {\\n if (Array.isArray(ch)) { ch.forEach(function (k) { add(into, wrapWeight(k, render(k, base))); }); return; }\\n if (ch && typeof ch === \\\"object\\\" && typeof ch.path === \\\"string\\\") {\\n var path = A2.resolvePath(ch.path, base), list = A2.getPointer(surface.dataModel, path);\\n (Array.isArray(list) ? list : []).slice(0, 200).forEach(function (_, i) { add(into, render(ch.componentId, A2.joinPointer(path, i))); });\\n }\\n }\\n function wrapWeight(id, node) {\\n var c = surface.components[id];\\n if (node && c && typeof c.weight === \\\"number\\\") { node.style.flex = String(Math.max(0, c.weight)) + \\\" 1 0\\\"; node.style.minWidth = \\\"0\\\"; }\\n return node;\\n }\\n function failingChecks(checks, base) {\\n if (!Array.isArray(checks)) return [];\\n return checks.filter(function (ck) {\\n var ok = \\\"condition\\\" in ck ? r(ck.condition, base) : r({ call: ck.call, args: ck.args }, base);\\n return !A2.truthy(ok);\\n }).map(function (ck) { return ck.message; });\\n }\\n var JUSTIFY = { start: \\\"flex-start\\\", center: \\\"center\\\", end: \\\"flex-end\\\", spaceBetween: \\\"space-between\\\", spaceAround: \\\"space-around\\\", spaceEvenly: \\\"space-evenly\\\", stretch: \\\"stretch\\\" };\\n var ALIGN = { start: \\\"flex-start\\\", center: \\\"center\\\", end: \\\"flex-end\\\", stretch: \\\"stretch\\\" };\\n function renderOne(c, base) {\\n switch (c.component) {\\n case \\\"Text\\\": return live(function () {\\n var v = c.variant || \\\"body\\\", txt = t(c.text, base);\\n if (v === \\\"h1\\\" || v === \\\"h2\\\") return heading(txt, true);\\n if (/^h[345]$/.test(v)) return heading(txt);\\n if (v === \\\"caption\\\") return caption(txt);\\n return body(txt.replace(/\\\\[([^\\\\]]+)\\\\]\\\\([^)]*\\\\)/g, \\\"$1\\\").replace(/!\\\\[([^\\\\]]*)\\\\]\\\\([^)]*\\\\)/g, \\\"$1\\\"));\\n });\\n case \\\"Row\\\": case \\\"Column\\\": case \\\"List\\\": {\\n var horiz = c.component === \\\"Row\\\" || (c.component === \\\"List\\\" && c.direction === \\\"horizontal\\\");\\n var box = el(\\\"div\\\", horiz ? \\\"k-a2-row\\\" : \\\"k-stack k-stack--s\\\");\\n if (c.justify) box.style.justifyContent = JUSTIFY[c.justify] || \\\"\\\";\\n if (c.align) box.style.alignItems = ALIGN[c.align] || \\\"\\\";\\n if (A2.isBinding(c.children) || (c.children && c.children.path)) return live(function () { var b2 = box.cloneNode(false); children(c.children, base, b2); return b2; }, function () { var l = A2.getPointer(surface.dataModel, A2.resolvePath(c.children.path, base)); return Array.isArray(l) ? l.length : -1; });\\n children(c.children, base, box);\\n return box;\\n }\\n case \\\"Card\\\": { var p = el(\\\"div\\\", \\\"k-a2-panel\\\"); add(p, render(c.child, base)); return p; }\\n case \\\"Tabs\\\": return tabs((c.tabs || []).map(function (tb) { return { title: t(tb.title, base), render: function () { return render(tb.child, base); } }; }));\\n case \\\"Modal\\\": {\\n var wrap = el(\\\"div\\\", \\\"k-stack k-stack--s\\\"), dlg = el(\\\"dialog\\\", \\\"k-a2-dialog\\\"), inner = el(\\\"div\\\", \\\"k-stack\\\");\\n add(inner, render(c.content, base), actions([button(\\\"Close\\\", function () { dlg.close(); }, { variant: \\\"quiet\\\" })]));\\n add(dlg, inner);\\n var trig = render(c.trigger, base);\\n if (trig) trig.addEventListener(\\\"click\\\", function (e) { e.stopImmediatePropagation(); try { dlg.showModal(); } catch (x) { dlg.setAttribute(\\\"open\\\", \\\"\\\"); } }, true);\\n add(wrap, trig, dlg);\\n return wrap;\\n }\\n case \\\"Divider\\\": return divider();\\n case \\\"Icon\\\": return live(function () { var s = el(\\\"span\\\", \\\"k-a2-icon\\\"); add(s, icon(String(r(c.name, base) || \\\"dot\\\"))); return s; });\\n case \\\"Image\\\": case \\\"Video\\\": case \\\"AudioPlayer\\\": return live(function () {\\n var url = safeUrl(t(c.url, base)), what = c.component === \\\"Image\\\" ? \\\"Image\\\" : c.component === \\\"Video\\\" ? \\\"Video\\\" : \\\"Audio\\\";\\n var d = el(\\\"div\\\", \\\"k-a2-media\\\"); add(d, icon(what === \\\"Image\\\" ? \\\"map\\\" : \\\"play\\\"), el(\\\"span\\\", \\\"\\\", (c.description ? t(c.description, base) : what)));\\n if (url) add(d, link(\\\"Open \\\" + what.toLowerCase(), url));\\n return d;\\n });\\n case \\\"Button\\\": {\\n var lbl = c.child && surface.components[c.child] ? (surface.components[c.child].component === \\\"Text\\\" ? t(surface.components[c.child].text, base) : \\\"\\\") : \\\"\\\";\\n var variant = c.variant === \\\"primary\\\" ? \\\"primary\\\" : c.variant === \\\"borderless\\\" ? \\\"quiet\\\" : \\\"outline\\\";\\n var a = c.action || {}, ev = a.event, fc = a.functionCall;\\n var b = button(lbl || (ev && ev.name) || \\\"Go\\\", function () {\\n if (failingChecks(c.checks, base).length) return;\\n if (ev) {\\n var context = {};\\n if (ev.context && typeof ev.context === \\\"object\\\") Object.keys(ev.context).forEach(function (k) { var v = r(ev.context[k], base); context[k] = v === undefined ? null : v; });\\n var visible = typeof context.message === \\\"string\\\" && context.message.trim() ? context.message : lbl || String(ev.name);\\n var env = [{ version: A2.VERSION, action: { name: String(ev.name), surfaceId: surface.surfaceId, sourceComponentId: c.id, timestamp: new Date().toISOString(), context: context } }];\\n if (surface.sendDataModel) { var models = {}; models[surface.surfaceId] = surface.dataModel; env.push({ a2uiClientDataModel: { version: A2.VERSION, surfaces: models } }); }\\n if (o.onAction) o.onAction(visible, env);\\n } else if (fc && fc.call === \\\"openUrl\\\") {\\n var args = fc.args || {}, raw = args.url;\\n var url = typeof raw === \\\"string\\\" && raw.indexOf(\\\"${\\\") >= 0 ? A2.toText(A2.call(\\\"formatString\\\", { value: raw }, ctxOf(base))) : t(raw, base);\\n if (/^https?:\\\\/\\\\//i.test(url) && o.onOpenUrl) o.onOpenUrl(url);\\n } else if (fc && typeof fc.call === \\\"string\\\") A2.call(fc.call, fc.args || {}, ctxOf(base));\\n }, { variant: variant, arrow: variant === \\\"primary\\\" ? (fc && fc.call === \\\"openUrl\\\" ? \\\"↗\\\" : \\\"→\\\") : null });\\n var sync = function () { var fails = failingChecks(c.checks, base); b.disabled = fails.length > 0 || (!ev && !fc); b.title = fails[0] || \\\"\\\"; };\\n sync(); refreshers.push({ node: b, fn: sync });\\n return b;\\n }\\n case \\\"TextField\\\": {\\n var path = boundPath(c.value);\\n var f = textField({ label: t(c.label, base), value: t(c.value, base), variant: c.variant, onInput: function (v) { if (path) setPath(path, base, c.variant === \\\"number\\\" && v !== \\\"\\\" && isFinite(Number(v)) ? Number(v) : v, null); } });\\n var err = el(\\\"span\\\", \\\"k-caption k-a2-err\\\"); add(f, err);\\n var sync2 = function () { if (document.activeElement !== f.input) f.input.value = t(c.value, base); var fails = failingChecks(c.checks, base); var re = c.validationRegexp && f.input.value && !A2.safeTest(c.validationRegexp, f.input.value); err.textContent = fails[0] || (re ? \\\"That doesn't look right.\\\" : \\\"\\\"); };\\n sync2(); refreshers.push({ node: f, fn: sync2 });\\n return f;\\n }\\n case \\\"CheckBox\\\": {\\n var cp = boundPath(c.value);\\n var cb = checkbox({ label: t(c.label, base), value: Boolean(r(c.value, base)), onChange: function (v) { if (cp) setPath(cp, base, v, cb); } });\\n refreshers.push({ node: cb, fn: function () { cb.input.checked = Boolean(r(c.value, base)); } });\\n return cb;\\n }\\n case \\\"ChoicePicker\\\": {\\n var pp = boundPath(c.value), multi = c.variant === \\\"multipleSelection\\\";\\n var opts = (c.options || []).map(function (op) { return { value: op.value, label: t(op.label, base) }; });\\n var cur = r(c.value, base); cur = Array.isArray(cur) ? cur.map(String) : [];\\n var ch = choiceTiles({ label: c.label ? t(c.label, base) : null, items: opts, multi: multi, values: cur, value: cur[0], compact: true, min: 96, onPick: function (v) { if (pp) setPath(pp, base, multi ? v : [v], ch); } });\\n refreshers.push({ node: ch, fn: function () { var v = r(c.value, base); v = Array.isArray(v) ? v.map(String) : []; ch.set(multi ? v : v[0]); } });\\n return ch;\\n }\\n case \\\"Slider\\\": {\\n var sp = boundPath(c.value), min = typeof c.min === \\\"number\\\" ? c.min : 0, max = typeof c.max === \\\"number\\\" ? c.max : 100;\\n var span = max - min, step = span <= 10 ? (Number.isInteger(min) && Number.isInteger(max) && span >= 2 ? 1 : span / 100) : span <= 200 ? 1 : Math.pow(10, Math.floor(Math.log10(span)) - 2);\\n var num = function () { var x = Number(r(c.value, base)); return isFinite(x) ? x : min; };\\n var sl = slider({ label: t(c.label, base), min: min, max: max, step: step, value: num(), onInput: function (v) { if (sp) setPath(sp, base, v, sl); } });\\n refreshers.push({ node: sl, fn: function () { if (document.activeElement !== sl.input) sl.set(num()); } });\\n return sl;\\n }\\n case \\\"DateTimeInput\\\": {\\n var dp = boundPath(c.value), fld = el(\\\"div\\\", \\\"k-field\\\"), id = uid(\\\"d\\\"), lab = el(\\\"label\\\", \\\"\\\", c.label ? t(c.label, base) : \\\"Date\\\"), inp = el(\\\"input\\\", \\\"k-input\\\");\\n inp.id = id; lab.htmlFor = id; inp.type = c.enableTime && c.enableDate !== false ? \\\"datetime-local\\\" : c.enableTime ? \\\"time\\\" : \\\"date\\\";\\n var shown = function (raw) { var tm = /(?:T|^)(\\\\d{2}:\\\\d{2})/.exec(raw); return inp.type === \\\"time\\\" ? (tm ? tm[1] : \\\"\\\") : raw.slice(0, inp.type === \\\"date\\\" ? 10 : 16); };\\n inp.value = shown(t(c.value, base));\\n [\\\"min\\\", \\\"max\\\"].forEach(function (k) { if (c[k] != null) { var b0 = shown(t(c[k], base)); if (b0) inp[k] = b0; } });\\n inp.addEventListener(\\\"change\\\", function () { if (dp) setPath(dp, base, inp.value, fld); });\\n refreshers.push({ node: fld, fn: function () { if (document.activeElement !== inp) inp.value = shown(t(c.value, base)); } });\\n add(fld, lab, inp); return fld;\\n }\\n case \\\"Stat\\\": return live(function () { var v = r(c.value, base); return stat({ label: t(c.label, base), value: A2.formatValue(v === undefined ? null : v, c.format), hint: c.hint ? t(c.hint, base) : null }); });\\n case \\\"Callout\\\": return live(function () { return callout({ tone: c.tone || \\\"info\\\", title: c.title ? t(c.title, base) : null, text: t(c.text, base) }); });\\n case \\\"Chart\\\": {\\n var fig = null;\\n var draw = function () { var cd = A2.chartData(c, ctxOf(base)); var spec = { kind: c.kind || \\\"bar\\\", title: c.title ? t(c.title, base) : null, labels: cd.labels, series: cd.series, format: c.format, xLabel: c.xLabel ? t(c.xLabel, base) : null, yLabel: c.yLabel ? t(c.yLabel, base) : null }; if (!fig) fig = chart(spec); else fig.update(spec); };\\n draw(); refreshers.push({ node: fig, fn: draw });\\n return fig;\\n }\\n case \\\"Steps\\\": {\\n var sv = boundPath(c.value);\\n var steps0 = (c.steps || []).map(function (s0) { return s0; });\\n var holder = el(\\\"div\\\", \\\"k-stack k-stack--s\\\"), cur2 = Math.max(0, Math.min(steps0.length - 1, Number(r(c.value, base)) || 0));\\n var drawSteps = function () {\\n clear(holder);\\n var prog = el(\\\"div\\\", \\\"k-progress\\\");\\n steps0.forEach(function (s1, i) { var bb = el(\\\"button\\\"); bb.type = \\\"button\\\"; bb.setAttribute(\\\"aria-label\\\", \\\"Step \\\" + (i + 1) + \\\": \\\" + t(s1.title, base)); if (i < cur2) bb.classList.add(\\\"is-done\\\"); if (i === cur2) bb.setAttribute(\\\"aria-current\\\", \\\"step\\\"); bb.onclick = function () { go(i); }; add(prog, bb); });\\n var s2 = steps0[cur2];\\n var head = el(\\\"p\\\", \\\"k-eyebrow\\\", \\\"Step \\\" + (cur2 + 1) + \\\" of \\\" + steps0.length);\\n add(holder, head, prog, el(\\\"h3\\\", \\\"k-h\\\", t(s2.title, base)), s2.text ? body(t(s2.text, base)) : null, s2.child ? render(s2.child, base) : null);\\n var foot = el(\\\"div\\\", \\\"k-foot\\\"), rt = el(\\\"div\\\", \\\"k-right\\\");\\n var bk = button(\\\"Back\\\", function () { go(cur2 - 1); }, { variant: \\\"quiet\\\" }); bk.disabled = cur2 === 0;\\n var nx = button(\\\"Next\\\", function () { go(cur2 + 1); }, { variant: \\\"outline\\\", arrow: \\\"→\\\" }); nx.disabled = cur2 >= steps0.length - 1;\\n add(rt, bk, nx); add(foot, el(\\\"span\\\"), rt); add(holder, foot);\\n };\\n var go = function (k) { cur2 = Math.max(0, Math.min(steps0.length - 1, k)); if (sv) setPath(sv, base, cur2, holder); drawSteps(); };\\n keys(holder, function (e) { if (e.key === \\\"ArrowRight\\\") { e.preventDefault(); go(cur2 + 1); } else if (e.key === \\\"ArrowLeft\\\") { e.preventDefault(); go(cur2 - 1); } });\\n drawSteps();\\n refreshers.push({ node: holder, fn: function () { if (sv) { var k2 = Number(r(c.value, base)) || 0; if (k2 !== cur2) { cur2 = Math.max(0, Math.min(steps0.length - 1, k2)); drawSteps(); } } } });\\n return holder;\\n }\\n case \\\"Quiz\\\": {\\n var rp = A2.isBinding(c.results) ? c.results.path : null;\\n var qs = (c.questions || []).map(function (q) { return { question: t(q.question, base), choices: (q.choices || []).map(function (x) { return A2.toText(r(x, base)); }), answer: Number(r(q.answer, base)), explain: q.explain ? t(q.explain, base) : \\\"\\\" }; }).filter(function (q) { return q.choices.length >= 2 && q.answer >= 0 && q.answer < q.choices.length; });\\n var publish = function (picks) {\\n if (!rp) return;\\n var missed = []; qs.forEach(function (q, i) { if (picks[i] !== undefined && picks[i] !== null && picks[i] !== q.answer) missed.push(i); });\\n var answered = picks.filter(function (x) { return x !== undefined && x !== null; }).length;\\n setPath(rp, base, { score: answered - missed.length, total: qs.length, answered: answered, done: answered >= qs.length, missed: missed.map(function (i) { return i + 1; }), missedQuestions: missed.map(function (i) { return qs[i].question; }) }, null);\\n };\\n var qk = surface.surfaceId + \\\"/\\\" + c.id + \\\"@\\\" + base, kept = A2_QUIZ_KEPT[qk] || { picks: [], at: 0 };\\n return quiz({ questions: qs, noSkip: true, start: kept.picks, at: kept.at, onState: function (picks, at) { A2_QUIZ_KEPT[qk] = { picks: picks.slice(), at: at }; publish(picks); }, endActions: function (res, restart) { return [button(\\\"Try again\\\", function () { A2_QUIZ_KEPT[qk] = { picks: [], at: 0 }; restart(); publish([]); }, { variant: \\\"quiet\\\" })]; } });\\n }\\n case \\\"Flashcards\\\": return flashcards((c.cards || []).map(function (cc) { return { front: t(cc.front, base), back: t(cc.back, base) }; }), {});\\n case \\\"Timeline\\\": return live(function () { return timeline((c.events || []).map(function (e) { return { label: e.label ? t(e.label, base) : null, title: t(e.title, base), text: e.text ? t(e.text, base) : null }; })); });\\n case \\\"Compare\\\": return live(function () { return compare((c.items || []).map(function (it) { var pts = r(it.points, base); return { title: t(it.title, base), badge: it.badge ? t(it.badge, base) : null, points: Array.isArray(pts) ? pts.map(function (x) { return A2.toText(x); }) : [], verdict: it.verdict ? t(it.verdict, base) : null, pick: Boolean(it.pick) }; }), { toggle: (c.items || []).length > 1 && displayMode() === \\\"fullscreen\\\" }); });\\n case \\\"Diagram\\\": return live(function () {\\n var src = t(c.mermaid, base), g = A2 && parseMermaid(src), wrapD = el(\\\"figure\\\", \\\"k-stack k-stack--s\\\"); wrapD.style.margin = \\\"0\\\";\\n if (!g || !g.nodes.length) { add(wrapD, code({ code: src, language: \\\"mermaid\\\", title: \\\"Diagram\\\" })); }\\n else {\\n var place = layoutGraph(g), sc = graphScene(g, place, g.edges.length);\\n // Left to right only while it fits the card without squeezing its labels; else top to bottom.\\n if (g.dir === \\\"LR\\\" && sc.w > Math.max(280, (window.innerWidth || 600) - 64) * 1.1) { g.dir = \\\"TB\\\"; place = layoutGraph(g); sc = graphScene(g, place, g.edges.length); }\\n var st = stage({ scene: sc, whole: true, label: c.caption ? t(c.caption, base) : \\\"Diagram\\\", height: Math.round(Math.max(150, Math.min(320, sc.h * 0.9))) });\\n add(wrapD, st);\\n }\\n if (c.caption) add(wrapD, el(\\\"figcaption\\\", \\\"k-caption\\\", t(c.caption, base)));\\n return wrapD;\\n });\\n // Code whole (the core caps it at A2UI.MAX_CODE): Copy must give back what runs.\\n case \\\"Code\\\": return live(function () {\\n var src = A2.toText(r(c.code, base));\\n // Past the cap it is refused, never shown cut: a copy must run.\\n if (src.length > A2.MAX_CODE) return errorState(\\\"This code is longer than \\\" + A2.MAX_CODE + \\\" characters, so it isn't shown here; your assistant has it.\\\");\\n return code({ code: src, language: c.language, title: c.title ? t(c.title, base) : null });\\n });\\n case \\\"Table\\\": return live(function () {\\n var td = A2.tableData(c, ctxOf(base)), tb = table(td.columns.map(function (x, i) { return { label: x.label, key: i, align: x.align }; }), td.rows);\\n if (td.total <= td.rows.length) return tb;\\n var w = el(\\\"div\\\", \\\"k-stack k-stack--s\\\"); add(w, tb, caption(td.rows.length + \\\" of \\\" + td.total + \\\" rows: a table shows at most 500.\\\")); return w;\\n });\\n }\\n return null;\\n }\\n var rootNode = el(\\\"div\\\", \\\"k-stack k-a2\\\");\\n add(rootNode, render(\\\"root\\\", \\\"/\\\"));\\n rootNode.surface = surface;\\n return rootNode;\\n}\\nK.A2UI = A2; K.a2uiSurface = a2uiSurface;\\n\\nreturn K;\\n})();\\n\";\n","/**\n * The Fabric UI kit for MCP Apps (`io.modelcontextprotocol/ui`, spec 2026-01-26):\n * Shared design system and A2UI v0.9.1 surface renderer used across Fabric MCP\n * servers (`/mcp` portal gateway and `@fabricorg/sdk-mcp`).\n */\n\nimport { createHash } from \"node:crypto\";\nimport A2UI from \"./a2ui-core.generated.js\";\nimport { KIT_CSS, KIT_SCRIPT, KIT_VERSION } from \"./kit.generated.js\";\n\nexport { A2UI, KIT_CSS, KIT_SCRIPT, KIT_VERSION };\n\n/**\n * Official Fabric 3-arc brand mark encoded as an inline SVG data URI\n * in Fabric's warm bright-orange primary accent (`#bc3e0b`).\n * Requires zero external network requests (`img-src data:` CSP-safe).\n */\nexport const FABRIC_MARK_DATA_URI =\n\t\"data:image/svg+xml,\" +\n\tencodeURIComponent(\n\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 180 220\">' +\n\t\t\t'<path fill=\"#bc3e0b\" d=\"M115.14,219.89h-21v-87.3c.028-21.221,17.239-38.41,38.46-38.41h7v21h-7c-9.634.011-17.443,7.816-17.46,17.45v87.26Z\"/>' +\n\t\t\t'<path fill=\"#bc3e0b\" d=\"M83,181.48h-20.93v-53.08c.044-36.62,29.72-66.296,66.34-66.34h26.59v20.94h-26.59c-25.068.017-45.388,20.332-45.41,45.4v53.08Z\"/>' +\n\t\t\t'<path fill=\"#bc3e0b\" d=\"M50.9,143.07h-20.9v-18.86c.061-52.039,42.231-94.209,94.27-94.27h46.09v21h-46.14c-40.456.044-73.248,32.814-73.32,73.27v18.86Z\"/>' +\n\t\t\t\"</svg>\",\n\t);\n\nexport interface KitAccent {\n\tlight?: string;\n\tdark?: string;\n\ttintLight?: string;\n\ttintDark?: string;\n\tinkLight?: string;\n\tinkDark?: string;\n}\n\nexport const FABRIC_BRAND: {\n\taccent: Required<KitAccent>;\n\tdisplay: string;\n\tmark: string;\n} = {\n\taccent: {\n\t\tlight: \"#bc3e0b\",\n\t\tdark: \"#ff8547\",\n\t\ttintLight: \"#fdf0ea\",\n\t\ttintDark: \"#381c11\",\n\t\tinkLight: \"#9a3006\",\n\t\tinkDark: \"#ffb088\",\n\t},\n\tdisplay: '\"Poppins\", \"Inter\", ui-sans-serif, system-ui, sans-serif',\n\tmark: FABRIC_MARK_DATA_URI,\n};\n\nconst esc = (s: unknown): string =>\n\tString(s ?? \"\")\n\t\t.replace(/&/g, \"&amp;\")\n\t\t.replace(/</g, \"&lt;\")\n\t\t.replace(/>/g, \"&gt;\")\n\t\t.replace(/\"/g, \"&quot;\");\n\nconst cssValue = (s: unknown): string =>\n\tString(s ?? \"\").replace(/[;{}<>\\\\]/g, \"\");\n\n/** Synchronous SHA-256 base64 CSP source expression (`'sha256-...'`). */\nexport function cspHashSync(text: string): string {\n\tconst digest = createHash(\"sha256\").update(text).digest(\"base64\");\n\treturn `'sha256-${digest}'`;\n}\n\n/** Async SHA-256 base64 CSP source expression (`'sha256-...'`). */\nexport async function cspHash(text: string): Promise<string> {\n\treturn cspHashSync(text);\n}\n\n/** The page's own CSP (on top of the host's): its one script by hash; styles, fonts and images from the site only. */\nexport function kitCsp(scriptHash: string, domains: string[] = []): string {\n\tconst ds = domains.join(\" \");\n\treturn [\n\t\t\"default-src 'none'\",\n\t\t`script-src ${scriptHash}`,\n\t\t`style-src 'unsafe-inline' ${ds}`.trim(),\n\t\t`img-src data: ${ds}`.trim(),\n\t\t`font-src data: ${ds}`.trim(),\n\t\t\"connect-src 'none'\",\n\t\t\"frame-src 'none'\",\n\t\t\"object-src 'none'\",\n\t\t\"form-action 'none'\",\n\t\t\"base-uri 'none'\",\n\t].join(\"; \");\n}\n\n/** The site's accent and display face as CSS: the kit's only brand inputs. */\nexport function siteCss(\n\toptions: { accent?: KitAccent; display?: string } = {},\n): string {\n\tconst a = options.accent ?? FABRIC_BRAND.accent;\n\tconst display = options.display ?? FABRIC_BRAND.display;\n\tconst light = [\n\t\ta.light && `--k-site-accent: ${cssValue(a.light)};`,\n\t\ta.tintLight && `--k-site-accent-tint: ${cssValue(a.tintLight)};`,\n\t\ta.inkLight && `--k-site-accent-ink: ${cssValue(a.inkLight)};`,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\tconst dark = [\n\t\ta.dark && `--k-site-accent: ${cssValue(a.dark)};`,\n\t\ta.tintDark && `--k-site-accent-tint: ${cssValue(a.tintDark)};`,\n\t\ta.inkDark && `--k-site-accent-ink: ${cssValue(a.inkDark)};`,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\treturn [\n\t\tdisplay ? `:root { --k-site-display: ${cssValue(display)}; }` : \"\",\n\t\tlight ? `:root, :root[data-theme=\"light\"] { ${light} }` : \"\",\n\t\tdark\n\t\t\t? `:root[data-theme=\"dark\"] { ${dark} } @media (prefers-color-scheme: dark) { :root:not([data-theme]) { ${dark} } }`\n\t\t\t: \"\",\n\t]\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\");\n}\n\nexport interface KitPageOptions {\n\turi?: string;\n\ttitle?: string;\n\tstylesheets?: string[];\n\tcss?: string;\n\tscript: string;\n\tdomains?: string[];\n\taccent?: KitAccent;\n\tdisplay?: string;\n\tbuildMeta?: string;\n\tloading?: string;\n}\n\n/** The one inline script: the kit, then the view. */\nexport const pageScript = (viewScript: string): string =>\n\t`${KIT_SCRIPT}\\n${viewScript ?? \"\"}`;\n\n/**\n * The page around a view: the kit's CSS and the site's, the kit's script then the view's,\n * as one inline script under the CSP hash.\n */\nexport function kitDocument(\n\to: KitPageOptions & { csp: string; build: string },\n): string {\n\treturn [\n\t\t\"<!doctype html>\",\n\t\t'<html lang=\"en\">',\n\t\t\"<head>\",\n\t\t'<meta charset=\"utf-8\">',\n\t\t`<meta http-equiv=\"Content-Security-Policy\" content=\"${esc(o.csp)}\">`,\n\t\t...(o.build && o.buildMeta\n\t\t\t? [\n\t\t\t\t\t`<meta name=\"${esc(o.buildMeta)}\" content=\"${String(o.build).replace(/[^A-Za-z0-9+/=_-]/g, \"\")}\">`,\n\t\t\t\t]\n\t\t\t: []),\n\t\t`<meta name=\"ui-kit\" content=\"${esc(KIT_VERSION)}\">`,\n\t\t'<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">',\n\t\t`<title>${esc(o.title ?? \"Fabric View\")}</title>`,\n\t\t...(o.stylesheets ?? []).map(\n\t\t\t(href) => `<link rel=\"stylesheet\" href=\"${esc(href)}\">`,\n\t\t),\n\t\t`<style>${KIT_CSS}\\n${siteCss(o)}\\n${o.css ?? \"\"}</style>`,\n\t\t\"</head>\",\n\t\t\"<body>\",\n\t\t`<div id=\"kit-app\" class=\"k-app\" data-mode=\"inline\"${o.uri ? ` data-mcp-app-uri=\"${esc(o.uri)}\"` : \"\"}>`,\n\t\t`<div id=\"kit-root\"><div class=\"k-card\" aria-busy=\"true\"><span class=\"k-sr\">${esc(o.loading ?? \"Loading Fabric view.\")}</span><div class=\"k-skel\"><i></i><i></i><i></i><i></i></div></div></div>`,\n\t\t'<p id=\"kit-status\" class=\"k-status\" role=\"status\" aria-live=\"polite\"></p>',\n\t\t\"</div>\",\n\t\t`<script>${pageScript(o.script)}</script>`,\n\t\t\"</body>\",\n\t\t\"</html>\",\n\t].join(\"\\n\");\n}\n\n/** Synchronous builder for an MCP App view HTML page with SHA-256 CSP hash. */\nexport function kitPageSync(o: KitPageOptions): {\n\thtml: string;\n\thash: string;\n\tbuild: string;\n} {\n\tconst hash = cspHashSync(pageScript(o.script));\n\tconst build = hash.slice(\"'sha256-\".length, \"'sha256-\".length + 16);\n\treturn {\n\t\thtml: kitDocument({\n\t\t\t...o,\n\t\t\taccent: o.accent ?? FABRIC_BRAND.accent,\n\t\t\tdisplay: o.display ?? FABRIC_BRAND.display,\n\t\t\tcsp: kitCsp(hash, o.domains ?? []),\n\t\t\tbuild,\n\t\t}),\n\t\thash,\n\t\tbuild,\n\t};\n}\n\n/** Async builder for an MCP App view HTML page with SHA-256 CSP hash. */\nexport async function kitPage(o: KitPageOptions): Promise<{\n\thtml: string;\n\thash: string;\n\tbuild: string;\n}> {\n\treturn kitPageSync(o);\n}\n\nexport interface FabricVisualizeResult {\n\ttitle: string;\n\tprovenance: string;\n\tdocument: unknown[];\n\tsurfaces: Array<{ surfaceId: string; catalogId: string; components: number }>;\n\terrors: Array<{\n\t\tcode: string;\n\t\tsurfaceId: string;\n\t\tpath: string;\n\t\tmessage: string;\n\t}>;\n\tsources: Array<{ title: string; page: string; url: string }>;\n\ttextSummary: string;\n}\n\n/**\n * Validates an A2UI v0.9.1 document (JSONL string or JSON array of messages)\n * against the Fabric A2UI catalog (`https://agents.fabric.pro/a2ui/v0.9/fabric_catalog.json`)\n * and produces both the structured payload for `ui://fabric/visualize` and a complete\n * text fallback for non-App MCP clients.\n */\nexport function buildFabricVisualizePayload(args: {\n\tdocument?: unknown;\n\ttitle?: unknown;\n\tsources?: unknown;\n}): FabricVisualizeResult {\n\tconst doc = args.document;\n\tif (typeof doc !== \"string\" && !Array.isArray(doc)) {\n\t\tthrow new Error(\n\t\t\t\"document is required: A2UI v0.9.1 messages as JSONL (one per line) or a JSON array.\",\n\t\t);\n\t}\n\tconst text = typeof doc === \"string\" ? doc : JSON.stringify(doc);\n\tif (text.length > 64000) {\n\t\tthrow new Error(\n\t\t\t`document is ${text.length} characters; the maximum is 64000. Split it into fewer, smaller surfaces.`,\n\t\t);\n\t}\n\tconst messages = Array.isArray(doc) ? doc : A2UI.readMessages(doc);\n\tconst built = A2UI.buildSurfaces(messages);\n\tconst drawable = built.surfaces.filter(\n\t\t(s: { components: object; loop?: unknown }) =>\n\t\t\tObject.prototype.hasOwnProperty.call(s.components, \"root\") && !s.loop,\n\t);\n\tif (!drawable.length) {\n\t\tconst why = built.errors.length\n\t\t\t? built.errors\n\t\t\t\t\t.slice(0, 12)\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(e: { path?: string; message: string }) =>\n\t\t\t\t\t\t\t`${e.path || \"/\"}: ${e.message}`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"; \")\n\t\t\t: 'no surface with a component whose id is \"root\"';\n\t\tthrow new Error(\n\t\t\t`Nothing in this document would draw (VALIDATION_FAILED): ${why}. Fix it and call fabric_visualize again.`,\n\t\t);\n\t}\n\tconst rawSources = Array.isArray(args.sources)\n\t\t? args.sources.slice(0, 20)\n\t\t: [];\n\tconst sources: Array<{ title: string; page: string; url: string }> = [];\n\tfor (const item of rawSources) {\n\t\tif (typeof item === \"string\" && item.startsWith(\"http\")) {\n\t\t\tsources.push({ title: item, page: \"Fabric Workspace\", url: item });\n\t\t} else if (item && typeof item === \"object\") {\n\t\t\tconst obj = item as Record<string, unknown>;\n\t\t\tif (typeof obj.url === \"string\" && obj.url.startsWith(\"http\")) {\n\t\t\t\tsources.push({\n\t\t\t\t\ttitle: String(obj.title || obj.url),\n\t\t\t\t\tpage: String(obj.page || \"Fabric Workspace\"),\n\t\t\t\t\turl: obj.url,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tconst title =\n\t\tString(args.title ?? \"\")\n\t\t\t.trim()\n\t\t\t.slice(0, 120) || \"Fabric Interactive View\";\n\tconst provenance = \"Composed by your Fabric assistant\";\n\tconst docText = A2UI.documentText({ surfaces: drawable });\n\tconst lines = [`# ${title}`, \"\", `${provenance}.`, \"\", docText];\n\tif (sources.length) {\n\t\tlines.push(\"\", \"Sources:\");\n\t\tfor (const s of sources) {\n\t\t\tlines.push(`- ${s.title}: ${s.url}`);\n\t\t}\n\t}\n\treturn {\n\t\ttitle,\n\t\tprovenance,\n\t\tdocument: messages,\n\t\tsurfaces: drawable.map(\n\t\t\t(s: { surfaceId: string; catalogId: string; count: number }) => ({\n\t\t\t\tsurfaceId: s.surfaceId,\n\t\t\t\tcatalogId: s.catalogId,\n\t\t\t\tcomponents: s.count,\n\t\t\t}),\n\t\t),\n\t\terrors: built.errors,\n\t\tsources,\n\t\ttextSummary: lines.join(\"\\n\"),\n\t};\n}\n","import {\n\tbuildFabricVisualizePayload,\n\tFABRIC_BRAND,\n\tFABRIC_MARK_DATA_URI,\n\ttype FabricVisualizeResult,\n\tkitPageSync,\n} from \"./ui-kit/index.js\";\n\nexport {\n\tbuildFabricVisualizePayload,\n\tFABRIC_BRAND,\n\tFABRIC_MARK_DATA_URI,\n\ttype FabricVisualizeResult,\n};\n\nexport interface FabricMcpAppResourceDescriptor {\n\turi: string;\n\tname: string;\n\tdescription: string;\n\tmimeType: string;\n\t_meta: {\n\t\tui: {\n\t\t\tcsp: {\n\t\t\t\tconnectDomains: string[];\n\t\t\t\tresourceDomains: string[];\n\t\t\t\tframeDomains: string[];\n\t\t\t\tbaseUriDomains: string[];\n\t\t\t};\n\t\t\tpermissions: string[];\n\t\t\tprefersBorder: boolean;\n\t\t};\n\t\t\"openai/widgetCSP\": {\n\t\t\tconnect_domains: string[];\n\t\t\tresource_domains: string[];\n\t\t\tredirect_domains: string[];\n\t\t};\n\t\t\"openai/widgetDomain\": string;\n\t\t\"openai/widgetPrefersBorder\": boolean;\n\t\t\"openai/widgetDescription\": string;\n\t};\n}\n\nexport interface FabricMcpAppResourceContent {\n\turi: string;\n\tmimeType: string;\n\ttext: string;\n\t_meta?: Record<string, unknown>;\n}\n\nconst WIDGET_DOMAINS = [\"https://fabric.pro\", \"https://agents.fabric.pro\"];\n\nfunction createResourceMeta(description: string, prefersBorder = true) {\n\treturn {\n\t\tui: {\n\t\t\tcsp: {\n\t\t\t\tconnectDomains: [] as string[],\n\t\t\t\tresourceDomains: [] as string[],\n\t\t\t\tframeDomains: [] as string[],\n\t\t\t\tbaseUriDomains: [] as string[],\n\t\t\t},\n\t\t\tpermissions: [\"clipboard-write\"],\n\t\t\tprefersBorder,\n\t\t},\n\t\t\"openai/widgetCSP\": {\n\t\t\tconnect_domains: [] as string[],\n\t\t\tresource_domains: [] as string[],\n\t\t\tredirect_domains: [...WIDGET_DOMAINS],\n\t\t},\n\t\t\"openai/widgetDomain\": WIDGET_DOMAINS[0],\n\t\t\"openai/widgetPrefersBorder\": prefersBorder,\n\t\t\"openai/widgetDescription\": description,\n\t};\n}\n\n/**\n * Helper to attach an MCP App resource URI (`_meta.ui.resourceUri` and flat `\"ui/resourceUri\"`)\n * to a tool's `_meta` definition or result.\n */\nexport function withFabricApp<T extends Record<string, unknown> = Record<string, unknown>>(\n\tresourceUri: string,\n\tmeta: T = {} as T,\n): T & { ui: { resourceUri: string }; \"ui/resourceUri\": string } {\n\treturn {\n\t\t...meta,\n\t\tui: { resourceUri },\n\t\t\"ui/resourceUri\": resourceUri,\n\t};\n}\n\nexport const FABRIC_MCP_APP_RESOURCES: readonly FabricMcpAppResourceDescriptor[] =\n\t[\n\t\t{\n\t\t\turi: \"ui://fabric/project-dashboard\",\n\t\t\tname: \"Fabric Project Overview & Desktop Launcher\",\n\t\t\tdescription:\n\t\t\t\t\"Interactive Fabric-branded project overview card with backlog metrics, living memory status, artifact tables, and 1-click launch into Fabric Desktop or Remote Fabric Agents Server.\",\n\t\t\tmimeType: \"text/html;profile=mcp-app\",\n\t\t\t_meta: createResourceMeta(\n\t\t\t\t\"Interactive Fabric project overview with metrics, artifacts, and 1-click launch into Fabric Desktop.\",\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\turi: \"ui://fabric/agent-delegation\",\n\t\t\tname: \"Fabric Agents Delegation & Subscription Credits\",\n\t\t\tdescription:\n\t\t\t\t\"Interactive Fabric-branded delegation console to dispatch coding tasks to Fabric Desktop (fabricagents://) or Remote Fabric Agents Server using subscription harnesses (Claude, Codex, Droid, Grok, Kimi).\",\n\t\t\tmimeType: \"text/html;profile=mcp-app\",\n\t\t\t_meta: createResourceMeta(\n\t\t\t\t\"Delegate coding tasks to Fabric Desktop or Remote Fabric Agents Server using subscription harnesses and inspect connected integrations.\",\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\turi: \"ui://fabric/workflow-visualizer\",\n\t\t\tname: \"Fabric Visual Data Prep & Durable Temporal Workflow Inspector\",\n\t\t\tdescription:\n\t\t\t\t\"Interactive Fabric-branded DAG pipeline stepper and Temporal workflow execution monitor with step-by-step stage diagrams and durable replay metadata.\",\n\t\t\tmimeType: \"text/html;profile=mcp-app\",\n\t\t\t_meta: createResourceMeta(\n\t\t\t\t\"Step through Fabric Visual Data Prep pipelines and durable Temporal workflow executions interactively.\",\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\turi: \"ui://fabric/genie-insights\",\n\t\t\tname: \"Fabric Genie Agent & Lakebase Query Explorer\",\n\t\t\tdescription:\n\t\t\t\t\"Interactive Fabric-branded Genie Agent SQL/workspace query explorer with structured table rendering, relevance charts, and source citation inspection.\",\n\t\t\tmimeType: \"text/html;profile=mcp-app\",\n\t\t\t_meta: createResourceMeta(\n\t\t\t\t\"Explore Fabric Genie workspace answers, structured data tables, charts, and cited documents.\",\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\turi: \"ui://fabric/visualize\",\n\t\t\tname: \"Fabric Interactive A2UI Card Composer\",\n\t\t\tdescription:\n\t\t\t\t\"An interactive Fabric-branded card drawn from an A2UI v0.9.1 document: comparisons, step-by-step plans, interactive charts with sliders, quizzes, flashcards, tables, and diagrams.\",\n\t\t\tmimeType: \"text/html;profile=mcp-app\",\n\t\t\t_meta: createResourceMeta(\n\t\t\t\t\"An answer drawn as an interactive Fabric card: comparisons, plans, charts, quizzes, tables, and diagrams composed by your assistant.\",\n\t\t\t\tfalse,\n\t\t\t),\n\t\t},\n\t] as const;\n\nconst FABRIC_VIEW_CSS = String.raw`\n.viz-foot { display: flex; flex-direction: column; gap: 8px; }\n.viz-line { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 32px; }\n.viz-sources > summary { cursor: pointer; font: 500 13px/20px var(--k-font); color: var(--k-muted); }\n.viz-sources[open] > summary { margin-bottom: 6px; color: var(--k-ink); }\n.viz-sources .k-sources-h:empty, .viz-sources .k-sources-h { display: none; }\n.fb-meta-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }\n`;\n\nfunction buildFabricMcpViewScript(options: {\n\turi: string;\n\ttitle: string;\n\tsubtitle: string;\n\tbadge: string;\n\tdefaultToolName: string;\n}): string {\n\tconst cfgJson = JSON.stringify({\n\t\turi: options.uri,\n\t\ttitle: options.title,\n\t\tsubtitle: options.subtitle,\n\t\tbadge: options.badge,\n\t\tdefaultToolName: options.defaultToolName,\n\t\tmark: FABRIC_MARK_DATA_URI,\n\t});\n\n\treturn String.raw`\n(function () {\n \"use strict\";\n try {\n var K = Kit, el = K.el, add = K.add, A2 = K.A2UI;\n var CFG = ${cfgJson};\n var FENCE = \"\\x60\\x60\\x60\";\n var S = { r: null, v: null, mode: 0, harness: \"claude-max\", step: 0, models: {}, all: false, key: \"fb:\" + CFG.uri };\n var root = function () { return document.getElementById(\"kit-root\"); };\n\n function canAsk() { return K.can(\"message\"); }\n function ask(text, done) { K.sendMessage(text, done == null ? \"Sent to your Fabric assistant.\" : done); }\n function tell(text, structured) { K.updateContext(text, structured); }\n function callServerTool(name, args) {\n if (K.host && K.host.caps && K.host.caps.serverTools) {\n return K.request(\"tools/call\", { name: name, arguments: args || {}, _meta: { durable: true } });\n }\n ask(\"Please run \" + name + \" with \" + JSON.stringify(args || {}) + \" and show the updated result.\");\n return Promise.resolve(null);\n }\n\n function onResult(r) {\n S.r = r;\n S.v = K.payload(r);\n S.step = 0;\n S.all = false;\n draw();\n }\n\n function draw() {\n var box = root();\n if (!box) return;\n K.clear(box);\n\n if (S.r && S.r.isError) {\n add(box, K.card({\n mark: CFG.mark,\n eyebrow: CFG.badge,\n eyebrowMeta: \"Fabric MCP\",\n title: \"That request couldn't complete\",\n body: [K.errorState(K.resultText(S.r) || \"The Fabric server returned an error.\")]\n }));\n return;\n }\n\n var v = S.v;\n if (v && Array.isArray(v.document)) {\n drawA2ui(box, v);\n return;\n }\n\n if (CFG.uri === \"ui://fabric/project-dashboard\") {\n add(box, drawProjectCard(v));\n } else if (CFG.uri === \"ui://fabric/agent-delegation\") {\n add(box, drawDelegationCard(v));\n } else if (CFG.uri === \"ui://fabric/workflow-visualizer\") {\n add(box, drawWorkflowCard(v));\n } else if (CFG.uri === \"ui://fabric/genie-insights\") {\n add(box, drawGenieCard(v));\n } else {\n add(box, drawGenericFabricCard(v));\n }\n }\n\n function drawA2ui(box, v) {\n var built = A2.buildSurfaces(v.document);\n var full = K.displayMode() === \"fullscreen\";\n var drawable = built.surfaces.filter(function (s) {\n return Object.prototype.hasOwnProperty.call(s.components, \"root\") && !s.loop;\n });\n if (!drawable.length) {\n add(box, drawGenericFabricCard(v));\n return;\n }\n drawable.forEach(function (s, i) {\n if (S.models[s.surfaceId] && typeof S.models[s.surfaceId] === \"object\") {\n s.dataModel = S.models[s.surfaceId];\n }\n var card = K.card({\n mark: CFG.mark,\n eyebrow: \"FABRIC INTERACTIVE VIEW\",\n eyebrowMeta: v.provenance || \"A2UI v0.9.1\",\n title: i === 0 ? (v.title || CFG.title) : null,\n tools: i === 0 ? [K.expandButton()] : [],\n label: v.title || CFG.title\n });\n var surfaceNode = K.a2uiSurface(s, {\n onAction: function (visible, env) {\n K.sendMessage(\n visible + \"\\n\\n\" + FENCE + \"a2ui\\n\" + env.map(function (m) { return JSON.stringify(m); }).join(\"\\n\") + \"\\n\" + FENCE,\n \"Sent to your Fabric assistant.\"\n );\n },\n onOpenUrl: function (u) { K.openLink(u); },\n onChange: function (sf) {\n S.models[sf.surfaceId] = sf.dataModel;\n K.saveState({ key: S.key, models: S.models });\n tell(\"In Fabric view \\\"\" + (v.title || CFG.title) + \"\\\", the user updated controls.\", { view: CFG.uri, models: S.models });\n }\n });\n var bodyBox = el(\"div\", \"k-stack\");\n add(bodyBox, surfaceNode);\n add(card.body, bodyBox);\n var foot = el(\"div\", \"viz-foot\");\n var line0 = el(\"div\", \"viz-line\");\n add(line0, K.provenance(\"assistant\", v.provenance || \"Composed by your Fabric assistant\"));\n add(foot, line0);\n if (i === drawable.length - 1 && (v.sources || []).length) {\n var det = el(\"details\", \"viz-sources\");\n if (full) det.open = true;\n add(\n det,\n el(\"summary\", \"\", \"Sources in Fabric (\" + v.sources.length + \")\"),\n K.sources(v.sources.map(function (x) { return { title: x.title, url: x.url, meta: x.page || null }; }), \" \")\n );\n add(foot, det);\n }\n add(card.body, foot);\n add(box, card);\n });\n }\n\n function extractItems(v) {\n if (!v) return [];\n if (Array.isArray(v)) return v;\n var keys = [\"projects\", \"features\", \"tickets\", \"frames\", \"artifacts\", \"workspaces\", \"workflows\", \"executions\", \"documents\", \"contexts\", \"results\", \"chunks\", \"matches\", \"integrations\", \"servers\", \"items\", \"itemIds\", \"harnesses\", \"operations\", \"organizations\"];\n for (var i = 0; i < keys.length; i++) {\n if (Array.isArray(v[keys[i]])) return v[keys[i]];\n }\n return [];\n }\n\n function isArtifactPayload(v) {\n if (!v || typeof v !== \"object\") return false;\n return Array.isArray(v.frames) || Array.isArray(v.artifacts) || Array.isArray(v.workspaces) || Boolean(v.frameId || v.blocks || v.surface === \"artifact\" || v.surface === \"workspace\");\n }\n\n function isTicketPayload(v) {\n if (!v || typeof v !== \"object\") return false;\n return Array.isArray(v.features) || Array.isArray(v.tickets) || Array.isArray(v.itemIds) || Array.isArray(v.items) || Boolean(v.feature || v.identifier || v.draftingStage || v.acceptanceCriteria);\n }\n\n function drawProjectCard(v) {\n if (isArtifactPayload(v)) {\n var artItems = extractItems(v);\n var singleArt = (!artItems.length && v && (v.title || v.frameId || v.id)) ? v : null;\n var list = artItems.length ? artItems : (singleArt ? [singleArt] : []);\n var artTitle = (v && v.title) || (list.length ? list.length + \" Fabric Artifacts & Workspaces\" : \"Fabric Artifacts & Workspaces\");\n var artSub = (v && v.description) || \"Interactive frames, project artifacts, slideshows, and organization workspaces accessible with your Fabric credentials.\";\n var artCard = K.card({\n mark: CFG.mark,\n eyebrow: \"FABRIC ARTIFACTS & WORKSPACES\",\n eyebrowMeta: \"Authenticated Tenant Access\",\n title: String(artTitle),\n sub: String(artSub),\n tools: [K.expandButton()],\n label: String(artTitle)\n });\n\n var workspaceCount = list.filter(function (x) { return x && x.surface === \"workspace\"; }).length;\n var artifactCount = list.length - workspaceCount;\n add(artCard.body, K.grid([\n K.stat({ label: \"Total Artifacts\", value: String(list.length || \"0\"), meta: \"Frames & pages\" }),\n K.stat({ label: \"Project Artifacts\", value: String(artifactCount), meta: \"Surface: artifact\" }),\n K.stat({ label: \"Org Workspaces\", value: String(workspaceCount || (v && Array.isArray(v.workspaces) ? v.workspaces.length : 0)), meta: \"Shared canvases\" })\n ], 140));\n\n if (list.length) {\n var artRows = list.slice(0, 10).map(function (it) {\n var kindStr = (it.surface ? it.surface : \"artifact\") + (it.kind ? \" · \" + it.kind : \"\");\n var detailStr = it.shareScope || (it.updatedAt ? String(it.updatedAt).slice(0, 10) : (it.description || \"Accessible\"));\n return [\n String(it.title || it.name || it.id || \"Artifact\"),\n String(kindStr),\n String(detailStr).slice(0, 56)\n ];\n });\n add(artCard.body, K.table([\"Artifact / Workspace\", \"Surface & Kind\", \"Sharing / Updated\"], artRows));\n }\n\n var firstUrl = (singleArt && singleArt.url) || (list[0] && list[0].url) || null;\n var artActions = [];\n if (firstUrl) {\n artActions.push(K.button(\"Open Artifact in Portal\", function () { K.openLink(String(firstUrl)); }, { variant: \"primary\", arrow: \"↗\" }));\n }\n artActions.push(\n K.button(\"Open in Fabric Desktop\", function () { K.openLink(\"fabricagents://action/new-chat\"); }, { variant: firstUrl ? \"outline\" : \"primary\", arrow: \"↗\" }),\n K.button(\"List All Artifacts\", function () { callServerTool(\"fabric_list_artifacts\", {}); }, { variant: \"quiet\", arrow: \"→\" })\n );\n add(artCard.body, K.actions(artActions));\n return artCard;\n }\n\n var p = (v && (v.project || v)) || {};\n var items = extractItems(v);\n var projName = p.name || p.title || (items.length ? items.length + \" Fabric Projects\" : CFG.title);\n var projSlug = p.slug || p.id || (items[0] && (items[0].slug || items[0].id)) || \"fabric-workspace\";\n var projId = p.id || (items[0] && items[0].id) || \"\";\n var desc = p.description || p.summary || CFG.subtitle;\n var card = K.card({\n mark: CFG.mark,\n eyebrow: \"FABRIC PROJECTS\",\n eyebrowMeta: CFG.badge,\n title: String(projName),\n sub: String(desc),\n tools: [K.expandButton()],\n label: String(projName)\n });\n\n var totalFeatures = p.featureCount != null ? p.featureCount : (p._count && p._count.features != null ? p._count.features : items.reduce(function (acc, it) { return acc + (Number(it.featureCount || (it._count && it._count.features) || 0)); }, 0));\n var totalDocs = p.contextCount != null ? p.contextCount : (p.documentCount != null ? p.documentCount : items.reduce(function (acc, it) { return acc + (Number(it.documentCount || it.contextCount || 0)); }, 0));\n\n var stats = K.grid([\n K.stat({ label: \"Projects\", value: String(items.length || (p.id ? 1 : \"Ready\")), meta: p.status || \"Active tenant\" }),\n K.stat({ label: \"Tickets & Features\", value: String(totalFeatures || \"Synced\"), meta: \"Backlog & specs\" }),\n K.stat({ label: \"Docs & Artifacts\", value: String(totalDocs || \"Active\"), meta: \"Living memory & frames\" })\n ], 140);\n add(card.body, stats);\n\n if (items.length) {\n var rows = items.slice(0, 10).map(function (it) {\n var statusBadge = String(it.status || it.state || it.role || \"ACTIVE\");\n var detail = it.description || it.repositoryUrl || (it.updatedAt ? \"Updated \" + String(it.updatedAt).slice(0, 10) : \"—\");\n return [\n String(it.name || it.title || it.slug || it.id || \"Project\"),\n statusBadge,\n String(detail).slice(0, 60)\n ];\n });\n add(card.body, K.table([\"Project\", \"Status\", \"Description / Repository\"], rows));\n }\n\n var deepLink = \"fabricagents://action/new-chat?workspace=\" + encodeURIComponent(String(projSlug));\n add(card.body, K.actions([\n K.button(\"Open in Fabric Desktop\", function () { K.openLink(deepLink); }, { variant: \"primary\", arrow: \"↗\" }),\n K.button(\"My Assigned Tickets\", function () {\n callServerTool(\"fabric_list_tickets\", projId ? { projectId: String(projId), assignedToMe: true } : { assignedToMe: true });\n }, { variant: \"outline\", arrow: \"→\" }),\n K.button(\"View Artifacts\", function () {\n callServerTool(\"fabric_list_artifacts\", projId ? { projectId: String(projId) } : {});\n }, { variant: \"quiet\", arrow: \"→\" })\n ]));\n return card;\n }\n\n function drawDelegationCard(v) {\n var items = extractItems(v);\n var seg = K.segmented([\"Remote Server\", \"Fabric Desktop\"], S.mode, function (i) {\n S.mode = i;\n tell(\"User selected delegation target: \" + (i === 0 ? \"Remote Fabric Agents Server\" : \"Fabric Desktop\"), { target: i === 0 ? \"remote\" : \"desktop\", harness: S.harness });\n draw();\n }, \"Execution target\");\n\n if (isTicketPayload(v)) {\n var singleTicket = (!items.length && v && (v.id || v.identifier || v.title)) ? v : (v && v.feature ? v.feature : null);\n var ticketList = items.length ? items : (singleTicket ? [singleTicket] : []);\n var totalTickets = (v && v.total != null) ? v.total : ticketList.length;\n var assignedCount = ticketList.filter(function (t) { return t && (t.assigneeId || t.assignedToMe || t.draftingStage === \"PUBLISHED\"); }).length || ticketList.length;\n var totalTasks = ticketList.reduce(function (acc, t) { return acc + Number(t && (t.taskCount != null ? t.taskCount : (Array.isArray(t.tasks) ? t.tasks.length : 0))); }, 0);\n var doneTasks = ticketList.reduce(function (acc, t) { return acc + Number(t && (t.completedTaskCount != null ? t.completedTaskCount : (Array.isArray(t.tasks) ? t.tasks.filter(function (x) { return x.isCompleted || x.completed; }).length : 0))); }, 0);\n\n var ticketHeading = singleTicket\n ? ((singleTicket.identifier ? singleTicket.identifier + \" · \" : \"\") + (singleTicket.title || \"Ticket Detail\"))\n : (v && v.assignedToMe ? (totalTickets + \" Tickets Assigned to You\") : (totalTickets + \" Project Tickets & Features\"));\n\n var ticketCard = K.card({\n mark: CFG.mark,\n eyebrow: \"FABRIC TICKETS & BACKLOG\",\n eyebrowMeta: v && v.assignedToMe ? \"Assigned to You\" : \"Features, Bugs & Tasks\",\n title: String(ticketHeading),\n sub: singleTicket && singleTicket.description ? String(singleTicket.description).slice(0, 180) : \"Live tickets, bugs, and stories from your Fabric projects. Select any item to delegate to Fabric Desktop or Remote Fabric Agents Server.\",\n tools: [seg, K.expandButton()],\n label: String(ticketHeading)\n });\n\n add(ticketCard.body, K.grid([\n K.stat({ label: \"Tickets / Stories\", value: String(totalTickets), meta: v && v.assignedToMe ? \"Assigned to you\" : \"Active backlog\" }),\n K.stat({ label: \"Ready / Assigned\", value: String(assignedCount), meta: \"Spec & ownership\" }),\n K.stat({ label: \"Tasks Completed\", value: totalTasks ? (doneTasks + \" / \" + totalTasks) : \"Synced\", meta: \"Implementation tasks\" })\n ], 140));\n\n if (ticketList.length) {\n var ticketRows = ticketList.slice(0, 10).map(function (t, idx) {\n if (typeof t === \"number\" || typeof t === \"string\") {\n return [\"#\" + String(t), \"ADO Assigned Work Item\", \"Assigned\", \"Snapshot ready\"];\n }\n var keyStr = String(t.identifier || t.key || (t.id ? String(t.id).slice(0, 8) : (\"#\" + (idx + 1))));\n var kindPrefix = t.kind === \"BUG\" ? \"[BUG] \" : (t.kind === \"FEATURE\" ? \"[FEAT] \" : \"\");\n var statusStr = (t.status && t.status.name) ? t.status.name : String(t.status || t.state || t.draftingStage || \"Open\");\n var prioStr = String(t.priority || \"P2\").replace(\"_\", \" \");\n var taskInfo = t.taskCount != null ? (\" · \" + (t.completedTaskCount || 0) + \"/\" + t.taskCount + \" tasks\") : \"\";\n return [\n keyStr,\n kindPrefix + String(t.title || t.name || \"Untitled Ticket\").slice(0, 52),\n statusStr,\n prioStr + taskInfo\n ];\n });\n add(ticketCard.body, K.table([\"Key\", \"Ticket / Feature\", \"Status\", \"Priority & Tasks\"], ticketRows));\n } else {\n add(ticketCard.body, K.callout({\n tone: \"ok\",\n title: \"No Open Tickets Matched\",\n text: \"You have no matching open tickets for this filter, or all assigned items are completed.\"\n }));\n }\n\n var firstTicket = ticketList[0] && typeof ticketList[0] === \"object\" ? ticketList[0] : null;\n var ticketPrompt = firstTicket\n ? (\"Implement ticket \" + (firstTicket.identifier || firstTicket.id || \"\") + \": \" + (firstTicket.title || \"\"))\n : \"Implement my highest-priority assigned Fabric ticket.\";\n var ticketDeepLink = \"fabricagents://action/new-chat?harness=\" + encodeURIComponent(S.harness) + \"&input=\" + encodeURIComponent(ticketPrompt) + \"&send=true\";\n\n add(ticketCard.body, K.actions([\n K.button(\n S.mode === 1 ? \"Start Ticket in Fabric Desktop\" : \"Delegate Ticket to Remote Server\",\n function () {\n if (S.mode === 1) {\n K.openLink(ticketDeepLink);\n } else {\n ask(\"Delegate \\\"\" + ticketPrompt + \"\\\" to the Remote Fabric Agents Server using \" + S.harness + \".\");\n }\n },\n { variant: \"primary\", arrow: S.mode === 1 ? \"↗\" : \"→\" }\n ),\n K.button(\"Open in Fabric Desktop\", function () { K.openLink(ticketDeepLink); }, { variant: \"outline\", arrow: \"↗\" })\n ]));\n return ticketCard;\n }\n\n var titleText = (v && (v.projectName || v.title)) || (items.length ? items.length + \" Workspace Items Ready\" : CFG.title);\n var card = K.card({\n mark: CFG.mark,\n eyebrow: \"FABRIC AGENTS\",\n eyebrowMeta: S.mode === 0 ? \"Remote Subscription Server\" : \"Fabric Desktop App\",\n title: String(titleText),\n sub: CFG.subtitle,\n tools: [seg, K.expandButton()],\n label: String(titleText)\n });\n\n var chipRow = el(\"div\", \"fb-meta-row\");\n add(\n chipRow,\n K.chip(v && v.billingMode ? String(v.billingMode) : \"Subscription Credits Active\", \"ok\"),\n K.chip(\"Fallback: \" + ((v && (v.fallbackPolicy || v.fallback)) || \"subscription_harnesses\"), \"info\"),\n K.chip(\"Durable Temporal Envelope\", \"ok\")\n );\n add(card.body, chipRow);\n\n var harnesses = (v && Array.isArray(v.harnesses) && v.harnesses.length) ? v.harnesses : [\n { id: \"claude-max\", label: \"Claude (Opus 4.6 / Sonnet 4.6)\", spec: \"Subscription OAuth · Primary\" },\n { id: \"codex\", label: \"Codex (GPT-5.4 / o3)\", spec: \"ChatGPT Pro/Team Subscription\" },\n { id: \"droid-cli\", label: \"Droid (Factory Multi-Model)\", spec: \"Subscription OAuth\" },\n { id: \"grok-cli\", label: \"Grok (Grok 4 Heavy / Fast)\", spec: \"Subscription OAuth\" },\n { id: \"kimi-cli\", label: \"Kimi (K2.5 Thinking)\", spec: \"Subscription OAuth\" }\n ];\n\n var tiles = K.choiceTiles({\n label: \"Subscription Harness\",\n value: (v && v.harness) || S.harness,\n items: harnesses.map(function (h) {\n return {\n value: String(h.id || h.slug || h.name),\n label: String(h.label || h.name || h.id),\n spec: String(h.spec || h.status || h.mode || \"Active\")\n };\n }),\n onChange: function (val) {\n S.harness = val;\n tell(\"User selected subscription harness \" + val, { harness: val, target: S.mode === 0 ? \"remote\" : \"desktop\" });\n }\n });\n add(card.body, tiles);\n\n if (items.length && !(v && Array.isArray(v.harnesses))) {\n var rows = items.slice(0, 6).map(function (it) {\n return [\n String(it.title || it.name || it.slug || it.operation || it.id || \"Item\"),\n String(it.status || it.priority || it.mode || it.riskLevel || \"ready\"),\n String(it.source || it.category || it.description || \"Fabric\").slice(0, 48)\n ];\n });\n add(card.body, K.table([\"Item / Integration\", \"Status\", \"Detail\"], rows));\n }\n\n var deepLink = (v && v.desktopDeepLink) || (\"fabricagents://action/new-chat?harness=\" + encodeURIComponent(S.harness) + \"&send=true\");\n add(card.body, K.actions([\n K.button(\n S.mode === 1 ? \"Launch Fabric Desktop\" : \"Delegate to Remote Server\",\n function () {\n if (S.mode === 1) {\n K.openLink(deepLink);\n } else {\n callServerTool(CFG.defaultToolName, { target: \"remote\", harness: S.harness, fallback: \"subscription_harnesses\" });\n }\n },\n { variant: \"primary\", arrow: S.mode === 1 ? \"↗\" : \"→\" }\n ),\n K.button(\"Open in Fabric Desktop\", function () { K.openLink(deepLink); }, { variant: \"outline\", arrow: \"↗\" })\n ]));\n return card;\n }\n\n function drawWorkflowCard(v) {\n var items = extractItems(v);\n var wf = (v && (v.workflow || v.execution || v)) || {};\n var wfTitle = wf.name || wf.title || wf.workflowId || (items.length ? items.length + \" Fabric Workflows\" : CFG.title);\n var rawSteps = (wf && Array.isArray(wf.steps) && wf.steps) || (items.length ? items : [\n { id: \"ingest\", name: \"Ingest & Validate Context\", status: \"COMPLETED\", detail: \"Tenant-isolated input verified in Temporal activity.\" },\n { id: \"transform\", name: \"Visual Data Prep & Agent Transform\", status: \"COMPLETED\", detail: \"Structured transformation and schema validation complete.\" },\n { id: \"persist\", name: \"Durable Checkpoint & Audit\", status: \"COMPLETED\", detail: \"Persisted with deterministic replay history and audit log.\" }\n ]);\n\n var nodes = rawSteps.slice(0, 6).map(function (st, idx) {\n return { id: \"s\" + idx, text: String(st.name || st.title || st.label || st.id || (\"Step \" + (idx + 1))).slice(0, 32) };\n });\n var edges = [];\n for (var i = 1; i < nodes.length; i++) {\n edges.push({ from: \"s\" + (i - 1), to: \"s\" + i, text: \"\" });\n }\n var g = { kind: \"flow\", dir: \"LR\", nodes: nodes, edges: edges };\n var baseScene = K.graphScene(g, K.layoutGraph(g), edges.length);\n\n var steps = rawSteps.slice(0, 6).map(function (st, idx) {\n var sc = JSON.parse(JSON.stringify(baseScene));\n sc.items.forEach(function (it) {\n if (it.id === \"n-s\" + idx) it.st = \"focus\";\n else if (it.id.indexOf(\"n-s\") === 0) {\n var k = Number(it.id.slice(3));\n if (k < idx) it.st = \"ok\";\n }\n });\n sc.zoom = false;\n return {\n title: String(st.name || st.title || st.label || (\"Step \" + (idx + 1))),\n body: String(st.detail || st.description || st.summary || (\"Status: \" + (st.status || \"READY\"))),\n tip: wf.workflowId ? (\"Temporal Workflow ID: \" + wf.workflowId) : \"Executed durably via Temporal workflow engine\",\n scene: sc\n };\n });\n\n return K.stepper({\n title: String(wfTitle),\n level: (wf.status || \"Durable Temporal\"),\n label: String(wfTitle),\n caption: \"Fabric Visual Data Prep & Durable Temporal Pipeline\",\n steps: steps,\n start: S.step,\n stateKey: \"wf:\" + String(wfTitle),\n recap: {\n title: \"Pipeline Summary\",\n bullets: steps.slice(0, 3).map(function (s) { return s.title; }),\n actions: [\n { label: \"Run via MCP\", primary: true, arrow: \"→\", fn: function () { callServerTool(CFG.defaultToolName, {}); } },\n { label: \"Open in Fabric Desktop\", arrow: \"↗\", fn: function () { K.openLink(\"fabricagents://action/new-chat\"); } }\n ]\n }\n });\n }\n\n function drawGenieCard(v) {\n var items = extractItems(v);\n var answer = (v && (v.answer || v.summary || v.content || v.text)) || null;\n var queryText = (v && (v.query || v.question || v.title)) || CFG.title;\n var card = K.card({\n mark: CFG.mark,\n eyebrow: \"FABRIC GENIE\",\n eyebrowMeta: \"Workspace & Lakebase Intelligence\",\n title: String(queryText),\n sub: answer ? String(answer).slice(0, 240) : CFG.subtitle,\n tools: [K.expandButton()],\n label: String(queryText)\n });\n\n var stats = K.grid([\n K.stat({ label: \"Matched Sources\", value: String(items.length || \"Ready\"), meta: \"Tenant-scoped RAG\" }),\n K.stat({ label: \"Engine\", value: \"Genie Agent\", meta: \"Lakebase & Vector Hybrid\" })\n ], 160);\n add(card.body, stats);\n\n if (items.length) {\n var rows = items.slice(0, 6).map(function (it, idx) {\n return [\n String(it.title || it.name || it.documentTitle || it.path || (\"Source \" + (idx + 1))),\n String(it.score != null ? (Math.round(Number(it.score) * 100) + \"%\") : (it.status || (\"#\" + (idx + 1)))),\n String(it.snippet || it.excerpt || it.description || it.content || \"Matched workspace knowledge\").slice(0, 72)\n ];\n });\n add(card.body, K.table([\"Source / Document\", \"Match\", \"Excerpt\"], rows));\n }\n\n add(card.body, K.actions([\n K.button(\"Ask Genie Follow-Up\", function () {\n ask(\"Using Fabric Genie, dig deeper into \\\"\" + queryText + \"\\\" and compare the top findings.\");\n }, { variant: \"primary\", arrow: \"→\" }),\n K.button(\"Open in Fabric Desktop\", function () {\n K.openLink(\"fabricagents://action/new-chat\");\n }, { variant: \"outline\", arrow: \"↗\" })\n ]));\n return card;\n }\n\n function drawGenericFabricCard(v) {\n var card = K.card({\n mark: CFG.mark,\n eyebrow: CFG.badge,\n eyebrowMeta: \"Fabric MCP App\",\n title: CFG.title,\n sub: CFG.subtitle,\n tools: [K.expandButton()],\n label: CFG.title\n });\n if (v && typeof v === \"object\") {\n add(card.body, K.code({ code: JSON.stringify(v, null, 2).slice(0, 2000), language: \"json\", title: \"Structured Payload\" }));\n }\n add(card.body, K.actions([\n K.button(\"Open in Fabric Desktop\", function () { K.openLink(\"fabricagents://action/new-chat\"); }, { variant: \"primary\", arrow: \"↗\" }),\n K.button(\"Refresh via MCP\", function () { callServerTool(CFG.defaultToolName, {}); }, { variant: \"outline\", arrow: \"→\" })\n ]));\n return card;\n }\n\n draw();\n K.start({\n appName: CFG.uri.replace(\"ui://fabric/\", \"fabric-\"),\n appVersion: \"2.0.0\",\n onResult: onResult,\n onReady: draw,\n onDisplay: draw\n });\n } catch (e) {\n if (typeof Kit !== \"undefined\" && Kit.fail) Kit.fail(e && e.message);\n }\n})();\n`;\n}\n\nconst renderedPageCache = new Map<string, string>();\n\nexport function readFabricMcpAppResource(\n\turi: string,\n): { contents: FabricMcpAppResourceContent[] } | null {\n\tconst descriptor = FABRIC_MCP_APP_RESOURCES.find((r) => r.uri === uri);\n\tif (!descriptor) {\n\t\treturn null;\n\t}\n\n\tconst defaultToolByUri: Record<string, { badge: string; tool: string }> = {\n\t\t\"ui://fabric/project-dashboard\": {\n\t\t\tbadge: \"Project MCP App\",\n\t\t\ttool: \"fabric_get_project\",\n\t\t},\n\t\t\"ui://fabric/agent-delegation\": {\n\t\t\tbadge: \"Subscription & Delegation\",\n\t\t\ttool: \"fabric_delegate_agent\",\n\t\t},\n\t\t\"ui://fabric/workflow-visualizer\": {\n\t\t\tbadge: \"Durable Temporal\",\n\t\t\ttool: \"fabric_call\",\n\t\t},\n\t\t\"ui://fabric/genie-insights\": {\n\t\t\tbadge: \"Genie Agent\",\n\t\t\ttool: \"fabric_call\",\n\t\t},\n\t\t\"ui://fabric/visualize\": {\n\t\t\tbadge: \"Interactive A2UI\",\n\t\t\ttool: \"fabric_visualize\",\n\t\t},\n\t};\n\n\tconst meta = defaultToolByUri[uri] ?? {\n\t\tbadge: \"Fabric MCP App\",\n\t\ttool: \"fabric_list_integrations\",\n\t};\n\n\tlet html = renderedPageCache.get(descriptor.uri);\n\tif (!html) {\n\t\thtml = kitPageSync({\n\t\t\turi: descriptor.uri,\n\t\t\ttitle: descriptor.name,\n\t\t\tcss: FABRIC_VIEW_CSS,\n\t\t\tscript: buildFabricMcpViewScript({\n\t\t\t\turi: descriptor.uri,\n\t\t\t\ttitle: descriptor.name,\n\t\t\t\tsubtitle: descriptor.description,\n\t\t\t\tbadge: meta.badge,\n\t\t\t\tdefaultToolName: meta.tool,\n\t\t\t}),\n\t\t\tdomains: [],\n\t\t\taccent: FABRIC_BRAND.accent,\n\t\t\tdisplay: FABRIC_BRAND.display,\n\t\t\tbuildMeta: \"fabric-mcp-app-build\",\n\t\t\tloading: `Loading ${descriptor.name}…`,\n\t\t}).html;\n\t\trenderedPageCache.set(descriptor.uri, html);\n\t}\n\n\treturn {\n\t\tcontents: [\n\t\t\t{\n\t\t\t\turi: descriptor.uri,\n\t\t\t\tmimeType: descriptor.mimeType,\n\t\t\t\ttext: html,\n\t\t\t\t_meta: descriptor._meta,\n\t\t\t},\n\t\t],\n\t};\n}\n","/**\n * @fabricorg/sdk-mcp\n *\n * Builds an MCP (Model Context Protocol) server that exposes a Fabric\n * workspace's whole integration catalog, agent delegation, and Fabric-branded\n * MCP Apps (`ui://fabric/*`) as MCP tools and resources — any MCP-compatible\n * agent (Claude Desktop, claude.ai, ChatGPT, Cursor, Fabric Desktop, …) can\n * point at one endpoint and get every connected vendor plus interactive\n * Fabric UI cards.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n\tbuildFabricVisualizePayload,\n\tFABRIC_BRAND,\n\tFABRIC_MARK_DATA_URI,\n\tFABRIC_MCP_APP_RESOURCES,\n\ttype FabricMcpAppResourceContent,\n\ttype FabricMcpAppResourceDescriptor,\n\ttype FabricVisualizeResult,\n\treadFabricMcpAppResource,\n\twithFabricApp,\n} from \"./mcp-apps.js\";\n\nexport {\n\tbuildFabricVisualizePayload,\n\tFABRIC_BRAND,\n\tFABRIC_MARK_DATA_URI,\n\tFABRIC_MCP_APP_RESOURCES,\n\ttype FabricMcpAppResourceContent,\n\ttype FabricMcpAppResourceDescriptor,\n\ttype FabricVisualizeResult,\n\treadFabricMcpAppResource,\n\twithFabricApp,\n};\n\n// Avoid importing @fabricorg/sdk concrete types at runtime; we only need its\n// shape so the server is decoupled from a specific SDK version. Consumers\n// pass an `FabricClient` instance. Exported because the declaration bundler\n// drops the `export {}` marker that keeps unexported types in a .d.ts private.\nexport type FabricLike = {\n\tintegrations: {\n\t\tlist(): Promise<\n\t\t\tArray<{\n\t\t\t\tslug: string;\n\t\t\t\tname: string;\n\t\t\t\tstatus: string;\n\t\t\t\tmode: string;\n\t\t\t\tsource: string;\n\t\t\t}>\n\t\t>;\n\t\t[slug: string]: unknown;\n\t};\n\tauth?: {\n\t\twhoami(): Promise<{\n\t\t\tuser?: { id: string; name?: string | null; email?: string | null };\n\t\t\tid?: string;\n\t\t\tname?: string | null;\n\t\t\temail?: string | null;\n\t\t\torganizations?: Array<{\n\t\t\t\tid: string;\n\t\t\t\tname: string;\n\t\t\t\tslug?: string;\n\t\t\t\trole?: string;\n\t\t\t}>;\n\t\t\t[key: string]: unknown;\n\t\t}>;\n\t};\n\tprojects?: {\n\t\tlist(options?: Record<string, unknown>): Promise<\n\t\t\tArray<{\n\t\t\t\tid: string;\n\t\t\t\tname: string;\n\t\t\t\tslug?: string;\n\t\t\t\tstatus?: string;\n\t\t\t\tdescription?: string | null;\n\t\t\t\t[key: string]: unknown;\n\t\t\t}>\n\t\t>;\n\t\tget(\n\t\t\tid: string,\n\t\t\toptions?: Record<string, unknown>,\n\t\t): Promise<Record<string, unknown>>;\n\t\tlistFeatures(\n\t\t\tprojectId: string,\n\t\t\toptions?: Record<string, unknown>,\n\t\t): Promise<Array<Record<string, unknown>>>;\n\t\tgetFeature?(\n\t\t\tprojectId: string,\n\t\t\tfeatureId: string,\n\t\t\toptions?: Record<string, unknown>,\n\t\t): Promise<Record<string, unknown>>;\n\t\tlistDocuments?(\n\t\t\tprojectId: string,\n\t\t\toptions?: Record<string, unknown>,\n\t\t): Promise<Array<Record<string, unknown>>>;\n\t\tgetDocument?(\n\t\t\tdocumentId: string,\n\t\t\toptions?: Record<string, unknown>,\n\t\t): Promise<Record<string, unknown>>;\n\t};\n\tframes?: {\n\t\tlist(\n\t\t\toptions?: Record<string, unknown>,\n\t\t): Promise<Array<Record<string, unknown>>>;\n\t\tget(\n\t\t\tid: string,\n\t\t\toptions?: Record<string, unknown>,\n\t\t): Promise<Record<string, unknown>>;\n\t};\n\tworkspaces?: {\n\t\tlist(\n\t\t\toptions?: Record<string, unknown>,\n\t\t): Promise<Array<Record<string, unknown>>>;\n\t\tget(\n\t\t\tid: string,\n\t\t\toptions?: Record<string, unknown>,\n\t\t): Promise<Record<string, unknown>>;\n\t};\n};\n\nexport interface CreateFabricMcpServerOptions {\n\t/** A configured FabricClient (createFabric) instance. Required. */\n\tfabric: FabricLike;\n\t/** Server name reported on the MCP handshake. Default `\"fabric\"`. */\n\tname?: string;\n\t/** Server version. Default `\"0.1.0\"`. */\n\tversion?: string;\n}\n\n/**\n * Build a configured `McpServer` exposing the workspace catalog and\n * built-in Fabric MCP App resources (`ui://fabric/*`). Caller is\n * responsible for `.connect(transport)` so the same server works over stdio,\n * HTTP, or any other MCP transport.\n */\nexport function createFabricMcpServer(\n\toptions: CreateFabricMcpServerOptions,\n): McpServer {\n\tconst fabric = options.fabric;\n\tconst server = new McpServer({\n\t\tname: options.name ?? \"fabric\",\n\t\tversion: options.version ?? \"0.1.17\",\n\t});\n\n\t// Register all built-in Fabric MCP App resources (`ui://fabric/*`)\n\tfor (const appResource of FABRIC_MCP_APP_RESOURCES) {\n\t\tserver.registerResource(\n\t\t\tappResource.name,\n\t\t\tappResource.uri,\n\t\t\t{\n\t\t\t\ttitle: appResource.name,\n\t\t\t\tdescription: appResource.description,\n\t\t\t\tmimeType: appResource.mimeType,\n\t\t\t\t_meta: appResource._meta,\n\t\t\t},\n\t\t\tasync (uri) => {\n\t\t\t\tconst rendered = readFabricMcpAppResource(uri.href);\n\t\t\t\tif (!rendered) {\n\t\t\t\t\treturn { contents: [] };\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontents: rendered.contents.map((c) => ({\n\t\t\t\t\t\turi: c.uri,\n\t\t\t\t\t\tmimeType: c.mimeType,\n\t\t\t\t\t\ttext: c.text,\n\t\t\t\t\t\t_meta: c._meta,\n\t\t\t\t\t})),\n\t\t\t\t};\n\t\t\t},\n\t\t);\n\t}\n\n\tserver.registerTool(\n\t\t\"fabric_list_integrations\",\n\t\t{\n\t\t\ttitle: \"List Fabric Integrations\",\n\t\t\tdescription:\n\t\t\t\t\"List integrations connected for the authenticated Fabric workspace. \" +\n\t\t\t\t\"Returns slug, display name, current connection status, permission mode \" +\n\t\t\t\t\"(open/cautious/strict/readonly), and source (plugin/mcp-server/connector). \" +\n\t\t\t\t\"Renders an interactive Fabric MCP App card in MCP App-capable hosts.\",\n\t\t\tinputSchema: {},\n\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t},\n\t\tasync () => {\n\t\t\tconst integrations = await fabric.integrations.list();\n\t\t\tconst payload = {\n\t\t\t\ttitle: \"Connected Fabric Integrations\",\n\t\t\t\tintegrations,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tstructuredContent: payload,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: JSON.stringify(integrations, null, 2),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.registerTool(\n\t\t\"fabric_list_operations\",\n\t\t{\n\t\t\ttitle: \"List Operations for an Integration\",\n\t\t\tdescription:\n\t\t\t\t\"List the dot-notation operations available on a single Fabric integration. \" +\n\t\t\t\t\"Returns an array of `{ operation, riskLevel, description }`. Supply the \" +\n\t\t\t\t\"slug from `fabric_list_integrations`.\",\n\t\t\tinputSchema: {\n\t\t\t\tslug: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t'Integration slug, e.g. \"slack\", \"github\", \"linear\".',\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t},\n\t\tasync ({ slug }) => {\n\t\t\tconst integration = (\n\t\t\t\tfabric.integrations as Record<string, unknown>\n\t\t\t)[slug] as\n\t\t\t\t| {\n\t\t\t\t\t\tcall?: (op: string, args?: unknown) => Promise<unknown>;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t\tif (!integration) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Integration \"${slug}\" is not registered for this workspace.`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst ops = await integration.call?.(\"__operations\");\n\t\t\t\tconst operations = Array.isArray(ops) ? ops : [];\n\t\t\t\treturn {\n\t\t\t\t\tstructuredContent: {\n\t\t\t\t\t\ttitle: `${slug} Operations`,\n\t\t\t\t\t\tslug,\n\t\t\t\t\t\toperations,\n\t\t\t\t\t},\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\", text: JSON.stringify(ops, null, 2) },\n\t\t\t\t\t],\n\t\t\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Operation listing for \"${slug}\" requires portal endpoint /api/v1/integrations/${slug}/operations (not yet exposed). Use fabric_call with a known operation path in the meantime.`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\tserver.registerTool(\n\t\t\"fabric_call\",\n\t\t{\n\t\t\ttitle: \"Call a Fabric Integration Operation\",\n\t\t\tdescription:\n\t\t\t\t\"Execute an operation on a connected Fabric integration. Args is a JSON \" +\n\t\t\t\t\"object whose shape depends on the specific operation. Returns the \" +\n\t\t\t\t\"upstream response, or { status: 'pending_approval' | 'denied' } when \" +\n\t\t\t\t\"the workspace permission policy gates the call.\",\n\t\t\tinputSchema: {\n\t\t\t\tslug: z.string().describe('Integration slug, e.g. \"slack\".'),\n\t\t\t\toperation: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t'Dot-notation operation, e.g. \"messages.send\" or \"channels.list\".',\n\t\t\t\t\t),\n\t\t\t\targs: z\n\t\t\t\t\t.record(z.string(), z.unknown())\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"Arguments object. Shape depends on the operation.\",\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t},\n\t\tasync ({ slug, operation, args }) => {\n\t\t\tconst integration = (\n\t\t\t\tfabric.integrations as Record<string, unknown>\n\t\t\t)[slug] as\n\t\t\t\t| {\n\t\t\t\t\t\tcall?: (op: string, args?: unknown) => Promise<unknown>;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t\tif (!integration?.call) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Integration \"${slug}\" is not registered for this workspace.`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst result = await integration.call(operation, args ?? {});\n\t\t\t\tconst structured =\n\t\t\t\t\tresult && typeof result === \"object\"\n\t\t\t\t\t\t? (result as Record<string, unknown>)\n\t\t\t\t\t\t: { slug, operation, result };\n\t\t\t\treturn {\n\t\t\t\t\tstructuredContent: structured,\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\", text: JSON.stringify(result, null, 2) },\n\t\t\t\t\t],\n\t\t\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t\t\t};\n\t\t\t} catch (err) {\n\t\t\t\tconst message =\n\t\t\t\t\terr instanceof Error ? err.message : String(err);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Error: ${message}` }],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\tserver.registerTool(\n\t\t\"fabric_delegate_agent\",\n\t\t{\n\t\t\ttitle: \"Delegate Task to Fabric Desktop or Remote Fabric Agents Server\",\n\t\t\tdescription:\n\t\t\t\t\"Delegate a coding or workspace task to either Fabric Desktop (fabricagents:// deep link) \" +\n\t\t\t\t\"or a Remote Fabric Agents Server using subscription harnesses (Claude, Codex, Droid, Grok, Kimi) \" +\n\t\t\t\t\"with configurable fallback policies.\",\n\t\t\tinputSchema: {\n\t\t\t\ttarget: z\n\t\t\t\t\t.enum([\"desktop\", \"remote\"])\n\t\t\t\t\t.default(\"remote\")\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t'Execution target: \"desktop\" for local Fabric Desktop app or \"remote\" for Remote Fabric Agents Server.',\n\t\t\t\t\t),\n\t\t\t\tprojectId: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Optional Fabric project ID.\"),\n\t\t\t\tprojectSlug: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Optional Fabric project slug.\"),\n\t\t\t\tprompt: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.describe(\"Task prompt to execute on the target agent.\"),\n\t\t\t\tharness: z\n\t\t\t\t\t.enum([\n\t\t\t\t\t\t\"auto\",\n\t\t\t\t\t\t\"claude-max\",\n\t\t\t\t\t\t\"codex\",\n\t\t\t\t\t\t\"droid-cli\",\n\t\t\t\t\t\t\"grok-cli\",\n\t\t\t\t\t\t\"kimi-cli\",\n\t\t\t\t\t\t\"antigravity-cli\",\n\t\t\t\t\t\t\"cursor\",\n\t\t\t\t\t])\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Subscription harness to run the task with.\"),\n\t\t\t\tfallback: z\n\t\t\t\t\t.enum([\n\t\t\t\t\t\t\"subscription_harnesses\",\n\t\t\t\t\t\t\"org_paid_api\",\n\t\t\t\t\t\t\"pause_on_limit\",\n\t\t\t\t\t])\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Quota & billing fallback policy.\"),\n\t\t\t\tserverUrl: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"Remote Fabric Agents Server URL (e.g. https://agents.example.com or http://127.0.0.1:9100).\",\n\t\t\t\t\t),\n\t\t\t\tdurable: z\n\t\t\t\t\t.boolean()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"Whether to track execution inside a durable Temporal workflow envelope.\",\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t},\n\t\tasync ({\n\t\t\ttarget,\n\t\t\tprojectId,\n\t\t\tprojectSlug,\n\t\t\tprompt,\n\t\t\tharness,\n\t\t\tfallback,\n\t\t\tserverUrl,\n\t\t\tdurable,\n\t\t}) => {\n\t\t\tconst selectedHarness = harness ?? \"claude-max\";\n\t\t\tconst selectedFallback = fallback ?? \"subscription_harnesses\";\n\t\t\tconst query = new URLSearchParams();\n\t\t\tif (projectSlug) query.set(\"workspace\", projectSlug);\n\t\t\tif (projectId) query.set(\"projectId\", projectId);\n\t\t\tquery.set(\"harness\", selectedHarness);\n\t\t\tquery.set(\"fallback\", selectedFallback);\n\t\t\tquery.set(\"input\", prompt);\n\t\t\tquery.set(\"send\", \"true\");\n\n\t\t\tconst desktopDeepLink = `fabricagents://action/new-chat?${query.toString()}`;\n\t\t\tconst baseRemoteUrl = (\n\t\t\t\tserverUrl || \"https://agents.example.com\"\n\t\t\t).replace(/\\/+$/, \"\");\n\t\t\tconst remoteUrl = `${baseRemoteUrl}/?${query.toString()}`;\n\n\t\t\tconst payload = {\n\t\t\t\tstatus: \"delegated\",\n\t\t\t\ttitle: projectSlug\n\t\t\t\t\t? `Delegated to ${projectSlug}`\n\t\t\t\t\t: \"Fabric Agent Delegation Ready\",\n\t\t\t\ttarget,\n\t\t\t\tharness: selectedHarness,\n\t\t\t\tfallbackPolicy: selectedFallback,\n\t\t\t\tdurable: Boolean(durable),\n\t\t\t\tdesktopDeepLink,\n\t\t\t\tremoteDelegationUrl: remoteUrl,\n\t\t\t\tuiResourceUri: \"ui://fabric/agent-delegation\",\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tstructuredContent: payload,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: JSON.stringify(payload, null, 2),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.registerTool(\n\t\t\"fabric_subscription_status\",\n\t\t{\n\t\t\ttitle: \"Check Fabric Remote Server Subscription Credits & Harnesses\",\n\t\t\tdescription:\n\t\t\t\t\"Inspect connected subscription harnesses (Claude, Codex, Droid, Grok, Kimi) and fallback routing on the Fabric Agents Server.\",\n\t\t\tinputSchema: {\n\t\t\t\tserverUrl: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"Optional Remote Fabric Agents Server URL to inspect.\",\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t},\n\t\tasync ({ serverUrl }) => {\n\t\t\tconst payload = {\n\t\t\t\ttitle: \"Fabric Subscription Harnesses & Credits\",\n\t\t\t\tserverUrl: serverUrl || \"https://agents.example.com\",\n\t\t\t\tbillingMode: \"subscription_tokens\",\n\t\t\t\tfallbackPolicy: \"subscription_harnesses\",\n\t\t\t\tharnesses: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"claude-max\",\n\t\t\t\t\t\tlabel: \"Claude (Opus 4.6 / Sonnet 4.6)\",\n\t\t\t\t\t\tstatus: \"active\",\n\t\t\t\t\t\tauth: \"subscription_oauth\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"codex\",\n\t\t\t\t\t\tlabel: \"Codex (GPT-5.4 / o3)\",\n\t\t\t\t\t\tstatus: \"active\",\n\t\t\t\t\t\tauth: \"subscription_oauth\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"droid-cli\",\n\t\t\t\t\t\tlabel: \"Droid (Factory Multi-Model)\",\n\t\t\t\t\t\tstatus: \"active\",\n\t\t\t\t\t\tauth: \"subscription_oauth\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"grok-cli\",\n\t\t\t\t\t\tlabel: \"Grok (Grok 4 Heavy / Fast)\",\n\t\t\t\t\t\tstatus: \"active\",\n\t\t\t\t\t\tauth: \"subscription_oauth\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"kimi-cli\",\n\t\t\t\t\t\tlabel: \"Kimi (Kimi K2.5 Thinking)\",\n\t\t\t\t\t\tstatus: \"active\",\n\t\t\t\t\t\tauth: \"subscription_oauth\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tstructuredContent: payload,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: JSON.stringify(payload, null, 2),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.registerTool(\n\t\t\"fabric_visualize\",\n\t\t{\n\t\t\ttitle: \"Draw Interactive Fabric Card (A2UI v0.9.1)\",\n\t\t\tdescription:\n\t\t\t\t\"Render an interactive Fabric-branded MCP App card (comparisons, step-by-step plans, charts with sliders, quizzes, flashcards, tables, or diagrams) from an A2UI v0.9.1 document (`createSurface`, `updateComponents`, `updateDataModel`).\",\n\t\t\tinputSchema: {\n\t\t\t\ttitle: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Card heading shown at the top of the Fabric view.\"),\n\t\t\t\tdocument: z\n\t\t\t\t\t.union([z.string(), z.array(z.record(z.string(), z.unknown()))])\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"A2UI v0.9.1 messages as JSONL (one JSON object per line) or a JSON array of messages.\",\n\t\t\t\t\t),\n\t\t\t\tsources: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Optional source URLs cited in the card.\"),\n\t\t\t},\n\t\t\t_meta: withFabricApp(\"ui://fabric/visualize\"),\n\t\t},\n\t\tasync ({ title, document, sources }) => {\n\t\t\ttry {\n\t\t\t\tconst built = buildFabricVisualizePayload({\n\t\t\t\t\ttitle,\n\t\t\t\t\tdocument,\n\t\t\t\t\tsources,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tstructuredContent: built as unknown as Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: built.textSummary,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t_meta: withFabricApp(\"ui://fabric/visualize\"),\n\t\t\t\t};\n\t\t\t} catch (err) {\n\t\t\t\tconst message =\n\t\t\t\t\terr instanceof Error ? err.message : String(err);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Error: ${message}` }],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\tserver.registerTool(\n\t\t\"fabric_get_identity\",\n\t\t{\n\t\t\ttitle: \"Get Authenticated Fabric Identity & Organizations\",\n\t\t\tdescription:\n\t\t\t\t\"Return the currently signed-in Fabric user identity, active credential scopes, and organization memberships.\",\n\t\t\tinputSchema: {},\n\t\t\t_meta: withFabricApp(\"ui://fabric/project-dashboard\"),\n\t\t},\n\t\tasync () => {\n\t\t\tif (!fabric.auth?.whoami) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Identity lookup requires an authenticated FabricClient (`fabric login`).\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst whoami = await fabric.auth.whoami();\n\t\t\tconst payload = {\n\t\t\t\ttitle: \"Authenticated Fabric Identity\",\n\t\t\t\t...whoami,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tstructuredContent: payload,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: JSON.stringify(whoami, null, 2),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t_meta: withFabricApp(\"ui://fabric/project-dashboard\"),\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.registerTool(\n\t\t\"fabric_list_projects\",\n\t\t{\n\t\t\ttitle: \"List Fabric Projects\",\n\t\t\tdescription:\n\t\t\t\t\"List all Fabric projects accessible to the signed-in user in the active organization. Renders an interactive Fabric Projects MCP App card with 1-click Open in Fabric Desktop and ticket/artifact actions.\",\n\t\t\tinputSchema: {\n\t\t\t\tstatus: z\n\t\t\t\t\t.enum([\"DRAFT\", \"ACTIVE\", \"COMPLETED\", \"ARCHIVED\"])\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Optional project status filter.\"),\n\t\t\t\tsearch: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Optional search query by project name or description.\"),\n\t\t\t\tlimit: z\n\t\t\t\t\t.number()\n\t\t\t\t\t.int()\n\t\t\t\t\t.min(1)\n\t\t\t\t\t.max(100)\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Maximum projects to return (default 50).\"),\n\t\t\t},\n\t\t\t_meta: withFabricApp(\"ui://fabric/project-dashboard\"),\n\t\t},\n\t\tasync ({ status, search, limit }) => {\n\t\t\tif (!fabric.projects?.list) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Listing projects requires an authenticated FabricClient (`fabric login`).\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst projects = await fabric.projects.list({\n\t\t\t\tstatus,\n\t\t\t\tsearch,\n\t\t\t\tlimit: limit ?? 50,\n\t\t\t});\n\t\t\tconst payload = {\n\t\t\t\ttitle: \"Your Fabric Projects\",\n\t\t\t\tprojects,\n\t\t\t\ttotal: projects.length,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tstructuredContent: payload,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: JSON.stringify(payload, null, 2),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t_meta: withFabricApp(\"ui://fabric/project-dashboard\"),\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.registerTool(\n\t\t\"fabric_get_project\",\n\t\t{\n\t\t\ttitle: \"Get Fabric Project Details\",\n\t\t\tdescription:\n\t\t\t\t\"Get detailed metadata, feature/bug counts, and document summary for a specific Fabric project.\",\n\t\t\tinputSchema: {\n\t\t\t\tprojectId: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.describe(\"Project ID from `fabric_list_projects`.\"),\n\t\t\t},\n\t\t\t_meta: withFabricApp(\"ui://fabric/project-dashboard\"),\n\t\t},\n\t\tasync ({ projectId }) => {\n\t\t\tif (!fabric.projects?.get) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Project lookup requires an authenticated FabricClient (`fabric login`).\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst project = await fabric.projects.get(projectId);\n\t\t\treturn {\n\t\t\t\tstructuredContent: project,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: JSON.stringify(project, null, 2),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t_meta: withFabricApp(\"ui://fabric/project-dashboard\"),\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.registerTool(\n\t\t\"fabric_list_artifacts\",\n\t\t{\n\t\t\ttitle: \"List Fabric Artifacts, Frames, Workspaces & Documents\",\n\t\t\tdescription:\n\t\t\t\t\"List all Fabric artifacts (interactive HTML frames, workspaces, and project documents/specs) accessible to the signed-in user. Renders an interactive Fabric Artifacts & Workspaces MCP App card.\",\n\t\t\tinputSchema: {\n\t\t\t\tprojectId: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"Optional project ID to filter artifacts and include project documents (PRDs, specs, architecture docs).\",\n\t\t\t\t\t),\n\t\t\t\tsurface: z\n\t\t\t\t\t.enum([\"all\", \"artifact\", \"workspace\", \"document\"])\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"Filter by artifact surface: 'artifact' (frames), 'workspace', 'document', or 'all' (default).\",\n\t\t\t\t\t),\n\t\t\t\tsearch: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Optional search query by title.\"),\n\t\t\t},\n\t\t\t_meta: withFabricApp(\"ui://fabric/project-dashboard\"),\n\t\t},\n\t\tasync ({ projectId, surface, search }) => {\n\t\t\tconst effectiveSurface = surface ?? \"all\";\n\t\t\tconst artifacts: Array<Record<string, unknown>> = [];\n\n\t\t\tif (\n\t\t\t\t(effectiveSurface === \"all\" ||\n\t\t\t\t\teffectiveSurface === \"artifact\" ||\n\t\t\t\t\teffectiveSurface === \"workspace\") &&\n\t\t\t\tfabric.frames?.list\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\tconst frames = await fabric.frames.list(\n\t\t\t\t\t\tsearch ? { search } : {},\n\t\t\t\t\t);\n\t\t\t\t\tfor (const f of frames) {\n\t\t\t\t\t\tif (projectId && f.projectId && f.projectId !== projectId) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst frameSurface =\n\t\t\t\t\t\t\ttypeof f.surface === \"string\"\n\t\t\t\t\t\t\t\t? f.surface\n\t\t\t\t\t\t\t\t: f.projectId\n\t\t\t\t\t\t\t\t\t? \"artifact\"\n\t\t\t\t\t\t\t\t\t: \"workspace\";\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\teffectiveSurface !== \"all\" &&\n\t\t\t\t\t\t\tframeSurface !== effectiveSurface\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tartifacts.push({\n\t\t\t\t\t\t\t...f,\n\t\t\t\t\t\t\tsurface: frameSurface,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Continue if frames endpoint is unavailable\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(effectiveSurface === \"all\" ||\n\t\t\t\t\teffectiveSurface === \"workspace\") &&\n\t\t\t\tfabric.workspaces?.list\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\tconst workspaces = await fabric.workspaces.list();\n\t\t\t\t\tfor (const w of workspaces) {\n\t\t\t\t\t\tartifacts.push({\n\t\t\t\t\t\t\t...w,\n\t\t\t\t\t\t\tsurface: \"workspace\",\n\t\t\t\t\t\t\tkind: w.kind ?? \"WORKSPACE\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Continue if workspaces endpoint is unavailable\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tprojectId &&\n\t\t\t\t(effectiveSurface === \"all\" ||\n\t\t\t\t\teffectiveSurface === \"document\") &&\n\t\t\t\tfabric.projects?.listDocuments\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\tconst docs = await fabric.projects.listDocuments(projectId);\n\t\t\t\t\tfor (const d of docs) {\n\t\t\t\t\t\tartifacts.push({\n\t\t\t\t\t\t\t...d,\n\t\t\t\t\t\t\tprojectId,\n\t\t\t\t\t\t\tsurface: \"artifact\",\n\t\t\t\t\t\t\tkind: d.type ?? \"DOCUMENT\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Continue if documents endpoint is unavailable\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst filtered = search\n\t\t\t\t? artifacts.filter((a) =>\n\t\t\t\t\t\tString(a.title ?? a.name ?? \"\")\n\t\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t\t.includes(search.toLowerCase()),\n\t\t\t\t\t)\n\t\t\t\t: artifacts;\n\n\t\t\tconst payload = {\n\t\t\t\ttitle: \"Fabric Artifacts & Workspaces\",\n\t\t\t\tframes: filtered,\n\t\t\t\ttotal: filtered.length,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tstructuredContent: payload,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: JSON.stringify(payload, null, 2),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t_meta: withFabricApp(\"ui://fabric/project-dashboard\"),\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.registerTool(\n\t\t\"fabric_get_artifact\",\n\t\t{\n\t\t\ttitle: \"Get Fabric Artifact, Frame, or Document Content\",\n\t\t\tdescription:\n\t\t\t\t\"Fetch the full content and metadata of a Fabric artifact (interactive HTML frame, workspace, or project document) by ID.\",\n\t\t\tinputSchema: {\n\t\t\t\tartifactId: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.describe(\"ID of the frame, workspace, or document.\"),\n\t\t\t\tkind: z\n\t\t\t\t\t.enum([\"frame\", \"workspace\", \"document\"])\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"Artifact kind hint ('frame' default, 'workspace', or 'document').\",\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t_meta: withFabricApp(\"ui://fabric/project-dashboard\"),\n\t\t},\n\t\tasync ({ artifactId, kind }) => {\n\t\t\tconst effectiveKind = kind ?? \"frame\";\n\t\t\tlet record: Record<string, unknown> | null = null;\n\t\t\tif (effectiveKind === \"document\" && fabric.projects?.getDocument) {\n\t\t\t\trecord = await fabric.projects.getDocument(artifactId);\n\t\t\t} else if (\n\t\t\t\teffectiveKind === \"workspace\" &&\n\t\t\t\tfabric.workspaces?.get\n\t\t\t) {\n\t\t\t\trecord = await fabric.workspaces.get(artifactId);\n\t\t\t} else if (fabric.frames?.get) {\n\t\t\t\trecord = await fabric.frames.get(artifactId);\n\t\t\t}\n\t\t\tif (!record) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Artifact \"${artifactId}\" could not be loaded.`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst payload = {\n\t\t\t\ttitle: String(record.title ?? record.name ?? artifactId),\n\t\t\t\tframes: [\n\t\t\t\t\t{\n\t\t\t\t\t\t...record,\n\t\t\t\t\t\tsurface:\n\t\t\t\t\t\t\trecord.surface ??\n\t\t\t\t\t\t\t(effectiveKind === \"workspace\"\n\t\t\t\t\t\t\t\t? \"workspace\"\n\t\t\t\t\t\t\t\t: \"artifact\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tartifact: record,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tstructuredContent: payload,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: JSON.stringify(record, null, 2),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t_meta: withFabricApp(\"ui://fabric/project-dashboard\"),\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.registerTool(\n\t\t\"fabric_list_tickets\",\n\t\t{\n\t\t\ttitle: \"List Fabric Tickets, Features & Bugs (Including Assigned to Me)\",\n\t\t\tdescription:\n\t\t\t\t\"List tickets (features and bugs) for a project or across all accessible projects, with optional `assignedToMe: true` filtering for tickets assigned to the signed-in user. Renders an interactive Fabric Tickets & Backlog MCP App card with 1-click Start in Fabric Desktop and Remote Agent Delegation.\",\n\t\t\tinputSchema: {\n\t\t\t\tprojectId: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"Optional project ID. When omitted, aggregates tickets across your active projects.\",\n\t\t\t\t\t),\n\t\t\t\tassignedToMe: z\n\t\t\t\t\t.boolean()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"When true, filters to tickets assigned to the currently authenticated Fabric user.\",\n\t\t\t\t\t),\n\t\t\t\tassigneeId: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Optional explicit assignee user ID filter.\"),\n\t\t\t\tpriority: z\n\t\t\t\t\t.enum([\"P0_CRITICAL\", \"P1_HIGH\", \"P2_MEDIUM\", \"P3_LOW\"])\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Optional priority filter.\"),\n\t\t\t\tkind: z\n\t\t\t\t\t.enum([\"FEATURE\", \"BUG\"])\n\t\t\t\t\t.optional()\n\t\t\t\t\t.describe(\"Optional ticket kind filter ('FEATURE' or 'BUG').\"),\n\t\t\t},\n\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t},\n\t\tasync ({ projectId, assignedToMe, assigneeId, priority, kind }) => {\n\t\t\tif (!fabric.projects?.listFeatures || !fabric.projects?.list) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Listing tickets requires an authenticated FabricClient (`fabric login`).\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tlet effectiveAssigneeId = assigneeId;\n\t\t\tif (assignedToMe && !effectiveAssigneeId && fabric.auth?.whoami) {\n\t\t\t\ttry {\n\t\t\t\t\tconst me = await fabric.auth.whoami();\n\t\t\t\t\teffectiveAssigneeId = me.user?.id ?? me.id;\n\t\t\t\t} catch {\n\t\t\t\t\t// Continue if whoami lookup fails\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst targetProjectIds: string[] = [];\n\t\t\tif (projectId) {\n\t\t\t\ttargetProjectIds.push(projectId);\n\t\t\t} else {\n\t\t\t\tconst projects = await fabric.projects.list({ limit: 10 });\n\t\t\t\tfor (const p of projects) {\n\t\t\t\t\tif (p.id) targetProjectIds.push(p.id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst allTickets: Array<Record<string, unknown>> = [];\n\t\t\tfor (const pid of targetProjectIds) {\n\t\t\t\ttry {\n\t\t\t\t\tconst items = await fabric.projects.listFeatures(pid, {\n\t\t\t\t\t\t...(priority ? { priority } : {}),\n\t\t\t\t\t\t...(effectiveAssigneeId\n\t\t\t\t\t\t\t? { assigneeId: effectiveAssigneeId }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t});\n\t\t\t\t\tfor (const item of items) {\n\t\t\t\t\t\tif (kind && item.kind && item.kind !== kind) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\teffectiveAssigneeId &&\n\t\t\t\t\t\t\titem.assigneeId &&\n\t\t\t\t\t\t\titem.assigneeId !== effectiveAssigneeId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tallTickets.push({\n\t\t\t\t\t\t\t...item,\n\t\t\t\t\t\t\tprojectId: item.projectId ?? pid,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Skip inaccessible project\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst payload = {\n\t\t\t\ttitle: assignedToMe\n\t\t\t\t\t? \"Tickets Assigned to You\"\n\t\t\t\t\t: \"Fabric Tickets & Backlog\",\n\t\t\t\tfeatures: allTickets,\n\t\t\t\ttotal: allTickets.length,\n\t\t\t\tassignedToMe: Boolean(assignedToMe),\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tstructuredContent: payload,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: JSON.stringify(payload, null, 2),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t_meta: withFabricApp(\"ui://fabric/agent-delegation\"),\n\t\t\t};\n\t\t},\n\t);\n\n\treturn server;\n}\n"],"mappings":"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"}