getkova 2026.4.21 → 2026.4.22

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.
Files changed (102) hide show
  1. package/dist/control-ui/apple-touch-icon.png +0 -0
  2. package/dist/control-ui/assets/agents-CLtFQRXd.js +918 -0
  3. package/dist/control-ui/assets/agents-CLtFQRXd.js.map +1 -0
  4. package/dist/control-ui/assets/anthropic-CFEPAL-v.js +37 -0
  5. package/dist/control-ui/assets/anthropic-CFEPAL-v.js.map +1 -0
  6. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js +2 -0
  7. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js.map +1 -0
  8. package/dist/control-ui/assets/briefing-DS4VWpUL.js +121 -0
  9. package/dist/control-ui/assets/briefing-DS4VWpUL.js.map +1 -0
  10. package/dist/control-ui/assets/canvas-BfC_2Nqy.js +17 -0
  11. package/dist/control-ui/assets/canvas-BfC_2Nqy.js.map +1 -0
  12. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js +2 -0
  13. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js.map +1 -0
  14. package/dist/control-ui/assets/channels-BKdM7i5r.js +471 -0
  15. package/dist/control-ui/assets/channels-BKdM7i5r.js.map +1 -0
  16. package/dist/control-ui/assets/cron-C11m3yJi.js +928 -0
  17. package/dist/control-ui/assets/cron-C11m3yJi.js.map +1 -0
  18. package/dist/control-ui/assets/de-rLAkQOBc.js +2 -0
  19. package/dist/control-ui/assets/de-rLAkQOBc.js.map +1 -0
  20. package/dist/control-ui/assets/debug-DFf2qCcM.js +94 -0
  21. package/dist/control-ui/assets/debug-DFf2qCcM.js.map +1 -0
  22. package/dist/control-ui/assets/dist-D8DZLmCF.js +18 -0
  23. package/dist/control-ui/assets/dist-D8DZLmCF.js.map +1 -0
  24. package/dist/control-ui/assets/employees-DV-5FV4K.js +104 -0
  25. package/dist/control-ui/assets/employees-DV-5FV4K.js.map +1 -0
  26. package/dist/control-ui/assets/es-CIeD3O54.js +2 -0
  27. package/dist/control-ui/assets/es-CIeD3O54.js.map +1 -0
  28. package/dist/control-ui/assets/event-stream-B8X6sYaV.js +2 -0
  29. package/dist/control-ui/assets/event-stream-B8X6sYaV.js.map +1 -0
  30. package/dist/control-ui/assets/format-BahKhiOC.js +2 -0
  31. package/dist/control-ui/assets/format-BahKhiOC.js.map +1 -0
  32. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js +2 -0
  33. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js.map +1 -0
  34. package/dist/control-ui/assets/google-BT0bmsh5.js +2 -0
  35. package/dist/control-ui/assets/google-BT0bmsh5.js.map +1 -0
  36. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js +3 -0
  37. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js.map +1 -0
  38. package/dist/control-ui/assets/google-shared-CbPHVnPr.js +12 -0
  39. package/dist/control-ui/assets/google-shared-CbPHVnPr.js.map +1 -0
  40. package/dist/control-ui/assets/google-vertex-lQwbjEII.js +2 -0
  41. package/dist/control-ui/assets/google-vertex-lQwbjEII.js.map +1 -0
  42. package/dist/control-ui/assets/hash-Bt1aVMQ3.js +2 -0
  43. package/dist/control-ui/assets/hash-Bt1aVMQ3.js.map +1 -0
  44. package/dist/control-ui/assets/inbox-C4tOnlJr.js +100 -0
  45. package/dist/control-ui/assets/inbox-C4tOnlJr.js.map +1 -0
  46. package/dist/control-ui/assets/index-DYMuTfvX.css +1 -0
  47. package/dist/control-ui/assets/index-XGDpaFxG.js +5482 -0
  48. package/dist/control-ui/assets/index-XGDpaFxG.js.map +1 -0
  49. package/dist/control-ui/assets/instances-Cyr-tbN6.js +57 -0
  50. package/dist/control-ui/assets/instances-Cyr-tbN6.js.map +1 -0
  51. package/dist/control-ui/assets/kova-logo.png +0 -0
  52. package/dist/control-ui/assets/lit-zdTgzAJI.js +3 -0
  53. package/dist/control-ui/assets/lit-zdTgzAJI.js.map +1 -0
  54. package/dist/control-ui/assets/local-storage-D3baoRWx.js +2 -0
  55. package/dist/control-ui/assets/local-storage-D3baoRWx.js.map +1 -0
  56. package/dist/control-ui/assets/logs-B7--7dYP.js +74 -0
  57. package/dist/control-ui/assets/logs-B7--7dYP.js.map +1 -0
  58. package/dist/control-ui/assets/meetings-DSqn6s7n.js +185 -0
  59. package/dist/control-ui/assets/meetings-DSqn6s7n.js.map +1 -0
  60. package/dist/control-ui/assets/mistral-CBrDC_Gv.js +8 -0
  61. package/dist/control-ui/assets/mistral-CBrDC_Gv.js.map +1 -0
  62. package/dist/control-ui/assets/nodes-Cvq_sAqT.js +430 -0
  63. package/dist/control-ui/assets/nodes-Cvq_sAqT.js.map +1 -0
  64. package/dist/control-ui/assets/openai-Cn7eGqwa.js +17 -0
  65. package/dist/control-ui/assets/openai-Cn7eGqwa.js.map +1 -0
  66. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js +8 -0
  67. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js.map +1 -0
  68. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js +6 -0
  69. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js.map +1 -0
  70. package/dist/control-ui/assets/openai-responses-BPxpapOg.js +2 -0
  71. package/dist/control-ui/assets/openai-responses-BPxpapOg.js.map +1 -0
  72. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js +11 -0
  73. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js.map +1 -0
  74. package/dist/control-ui/assets/pdf-BwYFZMZM.js +57 -0
  75. package/dist/control-ui/assets/pdf-BwYFZMZM.js.map +1 -0
  76. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js +2 -0
  77. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js.map +1 -0
  78. package/dist/control-ui/assets/pdf.worker.min-C8PGFc0r.mjs +28 -0
  79. package/dist/control-ui/assets/preload-helper-Chd9yIcd.js +1 -0
  80. package/dist/control-ui/assets/pt-BR-lSsBb08k.js +2 -0
  81. package/dist/control-ui/assets/pt-BR-lSsBb08k.js.map +1 -0
  82. package/dist/control-ui/assets/routing-DizI_FiJ.js +157 -0
  83. package/dist/control-ui/assets/routing-DizI_FiJ.js.map +1 -0
  84. package/dist/control-ui/assets/sessions-N9rgJP2R.js +236 -0
  85. package/dist/control-ui/assets/sessions-N9rgJP2R.js.map +1 -0
  86. package/dist/control-ui/assets/skills-D1vP4MkL.js +280 -0
  87. package/dist/control-ui/assets/skills-D1vP4MkL.js.map +1 -0
  88. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js +11 -0
  89. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js.map +1 -0
  90. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js +2 -0
  91. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js.map +1 -0
  92. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js +2 -0
  93. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js.map +1 -0
  94. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js +2 -0
  95. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js.map +1 -0
  96. package/dist/control-ui/favicon-32.png +0 -0
  97. package/dist/control-ui/favicon.ico +0 -0
  98. package/dist/control-ui/favicon.png +0 -0
  99. package/dist/control-ui/favicon.svg +22 -0
  100. package/dist/control-ui/index.html +73 -0
  101. package/dist/control-ui/openclaw-canvas-auth-sw.js +57 -0
  102. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[1],"sources":["../../../ui/src/ui/views/agents-panels-overview.ts","../../../node_modules/@create-markdown/preview/dist/index.js","../../../ui/src/ui/views/agents-panels-status-files.ts","../../../ui/src/ui/views/agents-panels-tools-skills.ts","../../../ui/src/ui/views/agents.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport type {\n AgentIdentityResult,\n AgentsFilesListResult,\n AgentsListResult,\n ModelCatalogEntry,\n} from \"../types.ts\";\nimport {\n buildModelOptions,\n normalizeModelValue,\n parseFallbackList,\n resolveAgentConfig,\n resolveModelFallbacks,\n resolveModelLabel,\n resolveModelPrimary,\n} from \"./agents-utils.ts\";\nimport type { AgentsPanel } from \"./agents.ts\";\n\nexport function renderAgentOverview(params: {\n agent: AgentsListResult[\"agents\"][number];\n basePath: string;\n defaultId: string | null;\n configForm: Record<string, unknown> | null;\n agentFilesList: AgentsFilesListResult | null;\n agentIdentity: AgentIdentityResult | null;\n agentIdentityLoading: boolean;\n agentIdentityError: string | null;\n configLoading: boolean;\n configSaving: boolean;\n configDirty: boolean;\n modelCatalog: ModelCatalogEntry[];\n onConfigReload: () => void;\n onConfigSave: () => void;\n onModelChange: (agentId: string, modelId: string | null) => void;\n onModelFallbacksChange: (agentId: string, fallbacks: string[]) => void;\n onSelectPanel: (panel: AgentsPanel) => void;\n}) {\n const {\n agent,\n configForm,\n agentFilesList,\n configLoading,\n configSaving,\n configDirty,\n onConfigReload,\n onConfigSave,\n onModelChange,\n onModelFallbacksChange,\n onSelectPanel,\n } = params;\n const config = resolveAgentConfig(configForm, agent.id);\n const agentModel = agent.model;\n const workspaceFromFiles =\n agentFilesList && agentFilesList.agentId === agent.id ? agentFilesList.workspace : null;\n const workspace =\n workspaceFromFiles ||\n config.entry?.workspace ||\n config.defaults?.workspace ||\n agent.workspace ||\n \"default\";\n const model = config.entry?.model\n ? resolveModelLabel(config.entry?.model)\n : config.defaults?.model\n ? resolveModelLabel(config.defaults?.model)\n : resolveModelLabel(agentModel);\n const defaultModel = resolveModelLabel(config.defaults?.model ?? agentModel);\n const entryPrimary = resolveModelPrimary(config.entry?.model);\n const defaultPrimary =\n resolveModelPrimary(config.defaults?.model) ||\n (defaultModel !== \"-\" ? normalizeModelValue(defaultModel) : null) ||\n (configForm ? null : resolveModelPrimary(agentModel));\n const effectivePrimary = entryPrimary ?? defaultPrimary ?? null;\n const modelFallbacks =\n resolveModelFallbacks(config.entry?.model) ??\n resolveModelFallbacks(config.defaults?.model) ??\n (configForm ? null : resolveModelFallbacks(agentModel));\n const fallbackChips = modelFallbacks ?? [];\n const skillFilter = Array.isArray(config.entry?.skills) ? config.entry?.skills : null;\n const skillCount = skillFilter?.length ?? null;\n const isDefault = Boolean(params.defaultId && agent.id === params.defaultId);\n const disabled = !configForm || configLoading || configSaving;\n\n const removeChip = (index: number) => {\n const next = fallbackChips.filter((_, i) => i !== index);\n onModelFallbacksChange(agent.id, next);\n };\n\n const handleChipKeydown = (e: KeyboardEvent) => {\n const input = e.target as HTMLInputElement;\n if (e.key === \"Enter\" || e.key === \",\") {\n e.preventDefault();\n const parsed = parseFallbackList(input.value);\n if (parsed.length > 0) {\n onModelFallbacksChange(agent.id, [...fallbackChips, ...parsed]);\n input.value = \"\";\n }\n }\n };\n\n return html`\n <section class=\"card\">\n <div class=\"card-title\">Overview</div>\n <div class=\"card-sub\">Workspace paths and identity metadata.</div>\n\n <div class=\"agents-overview-grid\" style=\"margin-top: 16px;\">\n <div class=\"agent-kv\">\n <div class=\"label\">Workspace</div>\n <div>\n <button\n type=\"button\"\n class=\"workspace-link mono\"\n @click=${() => onSelectPanel(\"files\")}\n title=\"Open Files tab\"\n >\n ${workspace}\n </button>\n </div>\n </div>\n <div class=\"agent-kv\">\n <div class=\"label\">Primary Model</div>\n <div class=\"mono\">${model}</div>\n </div>\n <div class=\"agent-kv\">\n <div class=\"label\">Skills Filter</div>\n <div>${skillFilter ? `${skillCount} selected` : \"all skills\"}</div>\n </div>\n </div>\n\n ${configDirty\n ? html`\n <div class=\"callout warn\" style=\"margin-top: 16px\">\n You have unsaved config changes.\n </div>\n `\n : nothing}\n\n <div class=\"agent-model-select\" style=\"margin-top: 20px;\">\n <div class=\"label\">Model Selection</div>\n <div class=\"agent-model-fields\">\n <label class=\"field\">\n <span>Primary model${isDefault ? \" (default)\" : \"\"}</span>\n <select\n .value=${isDefault ? (effectivePrimary ?? \"\") : (entryPrimary ?? \"\")}\n ?disabled=${disabled}\n @change=${(e: Event) =>\n onModelChange(agent.id, (e.target as HTMLSelectElement).value || null)}\n >\n ${isDefault\n ? html` <option value=\"\">Not set</option> `\n : html`\n <option value=\"\">\n ${defaultPrimary ? `Inherit default (${defaultPrimary})` : \"Inherit default\"}\n </option>\n `}\n ${buildModelOptions(configForm, effectivePrimary ?? undefined, params.modelCatalog)}\n </select>\n </label>\n <div class=\"field\">\n <span>Fallbacks</span>\n <div\n class=\"agent-chip-input\"\n @click=${(e: Event) => {\n const container = e.currentTarget as HTMLElement;\n const input = container.querySelector(\"input\");\n if (input) {\n input.focus();\n }\n }}\n >\n ${fallbackChips.map(\n (chip, i) => html`\n <span class=\"chip\">\n ${chip}\n <button\n type=\"button\"\n class=\"chip-remove\"\n ?disabled=${disabled}\n @click=${() => removeChip(i)}\n >\n &times;\n </button>\n </span>\n `,\n )}\n <input\n ?disabled=${disabled}\n placeholder=${fallbackChips.length === 0 ? \"provider/model\" : \"\"}\n @keydown=${handleChipKeydown}\n @blur=${(e: Event) => {\n const input = e.target as HTMLInputElement;\n const parsed = parseFallbackList(input.value);\n if (parsed.length > 0) {\n onModelFallbacksChange(agent.id, [...fallbackChips, ...parsed]);\n input.value = \"\";\n }\n }}\n />\n </div>\n </div>\n </div>\n <div class=\"agent-model-actions\">\n <button\n type=\"button\"\n class=\"btn btn--sm\"\n ?disabled=${configLoading}\n @click=${onConfigReload}\n >\n Reload Config\n </button>\n <button\n type=\"button\"\n class=\"btn btn--sm primary\"\n ?disabled=${configSaving || !configDirty}\n @click=${onConfigSave}\n >\n ${configSaving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n </div>\n </section>\n `;\n}\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/html-serializer.ts\nasync function lazyParse(markdown) {\n try {\n const core = await import(\"@create-markdown/core\");\n return core.parse(markdown);\n } catch {\n throw new Error(\n \"@create-markdown/core is required for markdownToHTML(). Install it as a dependency, or use applyPreviewTheme() with your own parser instead.\"\n );\n }\n}\nvar DEFAULT_OPTIONS = {\n classPrefix: \"cm-\",\n theme: \"github\",\n linkTarget: \"_blank\",\n sanitize: false,\n plugins: [],\n customRenderers: {}\n};\nfunction resolveOptions(options) {\n return {\n ...DEFAULT_OPTIONS,\n ...options,\n plugins: options?.plugins ?? [],\n customRenderers: options?.customRenderers ?? {}\n };\n}\nfunction applySanitize(html, sanitize) {\n if (typeof sanitize === \"function\") {\n return sanitize(html);\n }\n return html;\n}\nfunction blocksToHTML(blocks, options) {\n const opts = resolveOptions(options);\n const prefix = opts.classPrefix;\n let transformedBlocks = blocks;\n for (const plugin of opts.plugins) {\n if (plugin.transformBlock) {\n transformedBlocks = transformedBlocks.map(plugin.transformBlock);\n }\n }\n const htmlParts = transformedBlocks.map((block) => {\n for (const plugin of opts.plugins) {\n if (plugin.renderBlock) {\n const result = plugin.renderBlock(block, () => renderBlock(block, opts));\n if (result !== null) {\n return result;\n }\n }\n }\n const customRenderer = opts.customRenderers[block.type];\n if (customRenderer) {\n return customRenderer(block);\n }\n return renderBlock(block, opts);\n });\n let html = `<div class=\"${prefix}preview\">${htmlParts.join(\"\\n\")}</div>`;\n html = applySanitize(html, opts.sanitize);\n return html;\n}\nasync function markdownToHTML(markdown, options) {\n const blocks = await lazyParse(markdown);\n return blocksToHTML(blocks, options);\n}\nasync function renderAsync(blocks, options) {\n const opts = resolveOptions(options);\n for (const plugin of opts.plugins) {\n if (plugin.init) {\n await plugin.init();\n }\n }\n let html = blocksToHTML(blocks, options);\n for (const plugin of opts.plugins) {\n if (plugin.postProcess) {\n html = await plugin.postProcess(html);\n }\n }\n return html;\n}\nfunction renderBlock(block, opts) {\n const prefix = opts.classPrefix;\n switch (block.type) {\n case \"paragraph\":\n return `<p class=\"${prefix}paragraph\">${renderInlineContent(block.content, opts)}</p>`;\n case \"heading\":\n return renderHeading(block, opts);\n case \"bulletList\":\n return renderBulletList(block, opts);\n case \"numberedList\":\n return renderNumberedList(block, opts);\n case \"checkList\":\n return renderCheckList(block, opts);\n case \"codeBlock\":\n return renderCodeBlock(block, opts);\n case \"blockquote\":\n return `<blockquote class=\"${prefix}blockquote\">${renderInlineContent(block.content, opts)}</blockquote>`;\n case \"table\":\n return renderTable(block, opts);\n case \"image\":\n return renderImage(block, opts);\n case \"divider\":\n return `<hr class=\"${prefix}divider\" />`;\n case \"callout\":\n return renderCallout(block, opts);\n default:\n return `<div class=\"${prefix}unknown\">${renderInlineContent(block.content, opts)}</div>`;\n }\n}\nfunction renderHeading(block, opts) {\n const prefix = opts.classPrefix;\n const level = block.props.level;\n const tag = `h${level}`;\n const content = renderInlineContent(block.content, opts);\n return `<${tag} class=\"${prefix}heading ${prefix}h${level}\">${content}</${tag}>`;\n}\nfunction renderBulletList(block, opts) {\n const prefix = opts.classPrefix;\n const items = block.children.map((child) => `<li>${renderInlineContent(child.content, opts)}</li>`).join(\"\\n\");\n return `<ul class=\"${prefix}bullet-list\">\n${items}\n</ul>`;\n}\nfunction renderNumberedList(block, opts) {\n const prefix = opts.classPrefix;\n const items = block.children.map((child) => `<li>${renderInlineContent(child.content, opts)}</li>`).join(\"\\n\");\n return `<ol class=\"${prefix}numbered-list\">\n${items}\n</ol>`;\n}\nfunction renderCheckList(block, opts) {\n const prefix = opts.classPrefix;\n const checked = block.props.checked;\n const checkboxAttr = checked ? \"checked disabled\" : \"disabled\";\n const textClass = checked ? `${prefix}checked` : \"\";\n return `\n<div class=\"${prefix}checklist-item\">\n <input type=\"checkbox\" ${checkboxAttr} />\n <span class=\"${textClass}\">${renderInlineContent(block.content, opts)}</span>\n</div>`.trim();\n}\nfunction renderCodeBlock(block, opts) {\n const prefix = opts.classPrefix;\n const code = block.content.map((span) => span.text).join(\"\");\n const language = block.props.language || \"\";\n const escapedCode = escapeHtml(code);\n const langClass = language ? ` language-${language}` : \"\";\n const dataLang = language ? ` data-language=\"${language}\"` : \"\";\n return `<pre class=\"${prefix}code-block\"${dataLang}><code class=\"${prefix}code${langClass}\">${escapedCode}</code></pre>`;\n}\nfunction renderTable(block, opts) {\n const prefix = opts.classPrefix;\n const { headers, rows, alignments } = block.props;\n const getStyle = (index) => {\n const align = alignments?.[index];\n return align ? ` style=\"text-align: ${align}\"` : \"\";\n };\n const headerRow = headers.length > 0 ? `<thead><tr>${headers.map((h, i) => `<th${getStyle(i)}>${escapeHtml(h)}</th>`).join(\"\")}</tr></thead>` : \"\";\n const bodyRows = rows.map((row) => `<tr>${row.map((cell, i) => `<td${getStyle(i)}>${escapeHtml(cell)}</td>`).join(\"\")}</tr>`).join(\"\\n\");\n return `<table class=\"${prefix}table\">\n${headerRow}\n<tbody>\n${bodyRows}\n</tbody>\n</table>`;\n}\nfunction renderImage(block, opts) {\n const prefix = opts.classPrefix;\n const { url, alt, title, width, height } = block.props;\n const altAttr = alt ? ` alt=\"${escapeHtml(alt)}\"` : ' alt=\"\"';\n const titleAttr = title ? ` title=\"${escapeHtml(title)}\"` : \"\";\n const widthAttr = width ? ` width=\"${width}\"` : \"\";\n const heightAttr = height ? ` height=\"${height}\"` : \"\";\n const img = `<img src=\"${escapeHtml(url)}\"${altAttr}${titleAttr}${widthAttr}${heightAttr} />`;\n const caption = alt ? `<figcaption>${escapeHtml(alt)}</figcaption>` : \"\";\n return `<figure class=\"${prefix}image\">${img}${caption}</figure>`;\n}\nfunction renderCallout(block, opts) {\n const prefix = opts.classPrefix;\n const type = block.props.type;\n const content = renderInlineContent(block.content, opts);\n return `\n<div class=\"${prefix}callout ${prefix}callout-${type}\" role=\"alert\">\n <strong class=\"${prefix}callout-title\">${type}</strong>\n <div class=\"${prefix}callout-content\">${content}</div>\n</div>`.trim();\n}\nfunction renderInlineContent(spans, opts) {\n return spans.map((span) => renderSpan(span, opts)).join(\"\");\n}\nfunction renderSpan(span, opts) {\n let html = escapeHtml(span.text);\n const styles = span.styles;\n if (styles.code) {\n html = `<code>${html}</code>`;\n }\n if (styles.highlight) {\n html = `<mark>${html}</mark>`;\n }\n if (styles.strikethrough) {\n html = `<del>${html}</del>`;\n }\n if (styles.underline) {\n html = `<u>${html}</u>`;\n }\n if (styles.italic) {\n html = `<em>${html}</em>`;\n }\n if (styles.bold) {\n html = `<strong>${html}</strong>`;\n }\n if (styles.link) {\n const target = opts.linkTarget === \"_blank\" ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : \"\";\n const title = styles.link.title ? ` title=\"${escapeHtml(styles.link.title)}\"` : \"\";\n html = `<a href=\"${escapeHtml(styles.link.url)}\"${title}${target}>${html}</a>`;\n }\n return html;\n}\nfunction escapeHtml(text) {\n return text.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&#039;\");\n}\n\n// src/apply-theme.ts\nfunction buildTagMappings(prefix) {\n const headings = [1, 2, 3, 4, 5, 6].map((level) => ({\n tag: `h${level}`,\n classes: [`${prefix}heading`, `${prefix}h${level}`]\n }));\n return [\n ...headings,\n { tag: \"p\", classes: [`${prefix}paragraph`] },\n { tag: \"ul\", classes: [`${prefix}bullet-list`] },\n { tag: \"ol\", classes: [`${prefix}numbered-list`] },\n { tag: \"pre\", classes: [`${prefix}code-block`] },\n { tag: \"blockquote\", classes: [`${prefix}blockquote`] },\n { tag: \"hr\", classes: [`${prefix}divider`] },\n { tag: \"table\", classes: [`${prefix}table`] },\n { tag: \"figure\", classes: [`${prefix}image`] }\n ];\n}\nfunction injectClasses(openTag, classes) {\n const classStr = classes.join(\" \");\n const classAttrRe = /\\bclass\\s*=\\s*\"([^\"]*)\"/i;\n const match = openTag.match(classAttrRe);\n if (match) {\n return openTag.replace(classAttrRe, `class=\"${classStr} ${match[1]}\"`);\n }\n if (openTag.endsWith(\"/>\")) {\n return openTag.slice(0, -2) + ` class=\"${classStr}\" />`;\n }\n return openTag.slice(0, -1) + ` class=\"${classStr}\">`;\n}\nfunction wrapStandaloneImages(html, prefix) {\n return html.replace(\n /(?<!<figure[^>]*>\\s*)(<img\\s[^>]*\\/?>)(?!\\s*<\\/figure>)/gi,\n `<figure class=\"${prefix}image\">$1</figure>`\n );\n}\nfunction applyPreviewTheme(html, options) {\n const prefix = options?.classPrefix ?? \"cm-\";\n const wrapperClass = options?.wrapperClass ?? `${prefix}preview`;\n const mappings = buildTagMappings(prefix);\n let result = html;\n for (const { tag, classes } of mappings) {\n const fullTagRe = new RegExp(`<${tag}(\\\\s[^>]*)?>|<${tag}\\\\s*\\\\/?>`, \"gi\");\n result = result.replace(fullTagRe, (match) => injectClasses(match, classes));\n }\n result = wrapStandaloneImages(result, prefix);\n result = `<div class=\"${wrapperClass}\">${result}</div>`;\n if (typeof options?.sanitize === \"function\") {\n result = options.sanitize(result);\n }\n return result;\n}\n\n// src/themes/css-strings.ts\nvar githubDark = `/**\n * @create-markdown/preview - GitHub Dark Theme\n * Dark theme inspired by GitHub's dark mode markdown rendering\n */\n\n.cm-preview {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;\n font-size: 16px;\n line-height: 1.6;\n color: #e6edf3;\n background-color: #0d1117;\n max-width: 100%;\n overflow-wrap: break-word;\n}\n\n/* Headings */\n.cm-heading {\n margin-top: 24px;\n margin-bottom: 16px;\n font-weight: 600;\n line-height: 1.25;\n}\n\n.cm-h1 {\n font-size: 2em;\n padding-bottom: 0.3em;\n border-bottom: 1px solid #30363d;\n}\n\n.cm-h2 {\n font-size: 1.5em;\n padding-bottom: 0.3em;\n border-bottom: 1px solid #30363d;\n}\n\n.cm-h3 { font-size: 1.25em; }\n.cm-h4 { font-size: 1em; }\n.cm-h5 { font-size: 0.875em; }\n.cm-h6 { font-size: 0.85em; color: #8b949e; }\n\n/* Paragraphs */\n.cm-paragraph {\n margin-top: 0;\n margin-bottom: 16px;\n}\n\n/* Lists */\n.cm-bullet-list,\n.cm-numbered-list {\n margin-top: 0;\n margin-bottom: 16px;\n padding-left: 2em;\n}\n\n.cm-bullet-list li,\n.cm-numbered-list li {\n margin-bottom: 4px;\n}\n\n/* Checklist */\n.cm-checklist-item {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-bottom: 4px;\n}\n\n.cm-checklist-item input[type=\"checkbox\"] {\n margin-top: 0.25rem;\n}\n\n.cm-checked {\n text-decoration: line-through;\n color: #8b949e;\n}\n\n/* Code */\n.cm-code-block {\n background-color: #161b22;\n border-radius: 6px;\n padding: 16px;\n overflow-x: auto;\n margin-bottom: 16px;\n font-size: 0.875em;\n}\n\n.cm-code {\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;\n background: transparent;\n padding: 0;\n white-space: pre;\n}\n\ncode {\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;\n font-size: 0.875em;\n background-color: rgba(110, 118, 129, 0.4);\n padding: 0.2em 0.4em;\n border-radius: 6px;\n}\n\n/* Blockquote */\n.cm-blockquote {\n margin: 0 0 16px 0;\n padding: 0 1em;\n color: #8b949e;\n border-left: 0.25em solid #30363d;\n}\n\n/* Divider */\n.cm-divider {\n height: 0.25em;\n padding: 0;\n margin: 24px 0;\n background-color: #30363d;\n border: 0;\n}\n\n/* Table */\n.cm-table {\n display: block;\n width: max-content;\n max-width: 100%;\n overflow: auto;\n border-spacing: 0;\n border-collapse: collapse;\n margin-bottom: 16px;\n}\n\n.cm-table th,\n.cm-table td {\n padding: 6px 13px;\n border: 1px solid #30363d;\n}\n\n.cm-table th {\n font-weight: 600;\n background-color: #161b22;\n}\n\n.cm-table tr:nth-child(2n) {\n background-color: #161b22;\n}\n\n/* Image */\n.cm-image {\n margin: 0 0 16px 0;\n}\n\n.cm-image img {\n max-width: 100%;\n height: auto;\n border-radius: 6px;\n}\n\n.cm-image figcaption {\n font-size: 0.875em;\n color: #8b949e;\n margin-top: 8px;\n text-align: center;\n}\n\n/* Callout */\n.cm-callout {\n padding: 16px;\n margin-bottom: 16px;\n border-radius: 6px;\n border-left: 4px solid;\n}\n\n.cm-callout-title {\n display: block;\n text-transform: capitalize;\n margin-bottom: 8px;\n}\n\n.cm-callout-info {\n border-left-color: #58a6ff;\n background-color: rgba(56, 139, 253, 0.15);\n}\n\n.cm-callout-warning {\n border-left-color: #d29922;\n background-color: rgba(187, 128, 9, 0.15);\n}\n\n.cm-callout-tip {\n border-left-color: #3fb950;\n background-color: rgba(46, 160, 67, 0.15);\n}\n\n.cm-callout-danger {\n border-left-color: #f85149;\n background-color: rgba(248, 81, 73, 0.15);\n}\n\n.cm-callout-note {\n border-left-color: #8b949e;\n background-color: rgba(110, 118, 129, 0.15);\n}\n\n/* Links */\n.cm-preview a {\n color: #58a6ff;\n text-decoration: none;\n}\n\n.cm-preview a:hover {\n text-decoration: underline;\n}\n\n/* Inline styles */\n.cm-preview mark {\n background-color: rgba(187, 128, 9, 0.4);\n padding: 0.1em 0.2em;\n border-radius: 3px;\n}\n\n.cm-preview del {\n color: #8b949e;\n}\n`;\nvar github = `/**\n * @create-markdown/preview - GitHub Theme\n * Light theme inspired by GitHub's markdown rendering\n */\n\n.cm-preview {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;\n font-size: 16px;\n line-height: 1.6;\n color: #1f2328;\n background-color: #ffffff;\n max-width: 100%;\n overflow-wrap: break-word;\n}\n\n/* Headings */\n.cm-heading {\n margin-top: 24px;\n margin-bottom: 16px;\n font-weight: 600;\n line-height: 1.25;\n}\n\n.cm-h1 {\n font-size: 2em;\n padding-bottom: 0.3em;\n border-bottom: 1px solid #d1d9e0;\n}\n\n.cm-h2 {\n font-size: 1.5em;\n padding-bottom: 0.3em;\n border-bottom: 1px solid #d1d9e0;\n}\n\n.cm-h3 { font-size: 1.25em; }\n.cm-h4 { font-size: 1em; }\n.cm-h5 { font-size: 0.875em; }\n.cm-h6 { font-size: 0.85em; color: #656d76; }\n\n/* Paragraphs */\n.cm-paragraph {\n margin-top: 0;\n margin-bottom: 16px;\n}\n\n/* Lists */\n.cm-bullet-list,\n.cm-numbered-list {\n margin-top: 0;\n margin-bottom: 16px;\n padding-left: 2em;\n}\n\n.cm-bullet-list li,\n.cm-numbered-list li {\n margin-bottom: 4px;\n}\n\n/* Checklist */\n.cm-checklist-item {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-bottom: 4px;\n}\n\n.cm-checklist-item input[type=\"checkbox\"] {\n margin-top: 0.25rem;\n}\n\n.cm-checked {\n text-decoration: line-through;\n color: #656d76;\n}\n\n/* Code */\n.cm-code-block {\n background-color: #f6f8fa;\n border-radius: 6px;\n padding: 16px;\n overflow-x: auto;\n margin-bottom: 16px;\n font-size: 0.875em;\n}\n\n.cm-code {\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;\n background: transparent;\n padding: 0;\n white-space: pre;\n}\n\ncode {\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;\n font-size: 0.875em;\n background-color: rgba(175, 184, 193, 0.2);\n padding: 0.2em 0.4em;\n border-radius: 6px;\n}\n\n/* Blockquote */\n.cm-blockquote {\n margin: 0 0 16px 0;\n padding: 0 1em;\n color: #656d76;\n border-left: 0.25em solid #d1d9e0;\n}\n\n/* Divider */\n.cm-divider {\n height: 0.25em;\n padding: 0;\n margin: 24px 0;\n background-color: #d1d9e0;\n border: 0;\n}\n\n/* Table */\n.cm-table {\n display: block;\n width: max-content;\n max-width: 100%;\n overflow: auto;\n border-spacing: 0;\n border-collapse: collapse;\n margin-bottom: 16px;\n}\n\n.cm-table th,\n.cm-table td {\n padding: 6px 13px;\n border: 1px solid #d1d9e0;\n}\n\n.cm-table th {\n font-weight: 600;\n background-color: #f6f8fa;\n}\n\n.cm-table tr:nth-child(2n) {\n background-color: #f6f8fa;\n}\n\n/* Image */\n.cm-image {\n margin: 0 0 16px 0;\n}\n\n.cm-image img {\n max-width: 100%;\n height: auto;\n border-radius: 6px;\n}\n\n.cm-image figcaption {\n font-size: 0.875em;\n color: #656d76;\n margin-top: 8px;\n text-align: center;\n}\n\n/* Callout */\n.cm-callout {\n padding: 16px;\n margin-bottom: 16px;\n border-radius: 6px;\n border-left: 4px solid;\n}\n\n.cm-callout-title {\n display: block;\n text-transform: capitalize;\n margin-bottom: 8px;\n}\n\n.cm-callout-info {\n border-left-color: #0969da;\n background-color: #ddf4ff;\n}\n\n.cm-callout-warning {\n border-left-color: #d4a72c;\n background-color: #fff8c5;\n}\n\n.cm-callout-tip {\n border-left-color: #1a7f37;\n background-color: #dafbe1;\n}\n\n.cm-callout-danger {\n border-left-color: #cf222e;\n background-color: #ffebe9;\n}\n\n.cm-callout-note {\n border-left-color: #656d76;\n background-color: #f6f8fa;\n}\n\n/* Links */\n.cm-preview a {\n color: #0969da;\n text-decoration: none;\n}\n\n.cm-preview a:hover {\n text-decoration: underline;\n}\n\n/* Inline styles */\n.cm-preview mark {\n background-color: #fff8c5;\n padding: 0.1em 0.2em;\n border-radius: 3px;\n}\n\n.cm-preview del {\n color: #656d76;\n}\n`;\nvar minimal = \"/**\\n * @create-markdown/preview - Minimal Theme\\n * A clean, minimal theme with subtle styling\\n */\\n\\n.cm-preview {\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\\n font-size: 16px;\\n line-height: 1.7;\\n color: #333;\\n max-width: 100%;\\n overflow-wrap: break-word;\\n}\\n\\n/* Headings */\\n.cm-heading {\\n margin-top: 1.5em;\\n margin-bottom: 0.5em;\\n font-weight: 600;\\n line-height: 1.3;\\n}\\n\\n.cm-h1 { font-size: 1.75em; }\\n.cm-h2 { font-size: 1.5em; }\\n.cm-h3 { font-size: 1.25em; }\\n.cm-h4 { font-size: 1.1em; }\\n.cm-h5 { font-size: 1em; }\\n.cm-h6 { font-size: 0.9em; color: #666; }\\n\\n/* Paragraphs */\\n.cm-paragraph {\\n margin-top: 0;\\n margin-bottom: 1em;\\n}\\n\\n/* Lists */\\n.cm-bullet-list,\\n.cm-numbered-list {\\n margin-top: 0;\\n margin-bottom: 1em;\\n padding-left: 1.5em;\\n}\\n\\n.cm-bullet-list li,\\n.cm-numbered-list li {\\n margin-bottom: 0.25em;\\n}\\n\\n/* Checklist */\\n.cm-checklist-item {\\n display: flex;\\n align-items: flex-start;\\n gap: 0.5rem;\\n margin-bottom: 0.25em;\\n}\\n\\n.cm-checked {\\n text-decoration: line-through;\\n opacity: 0.6;\\n}\\n\\n/* Code */\\n.cm-code-block {\\n background-color: #f5f5f5;\\n border-radius: 4px;\\n padding: 1em;\\n overflow-x: auto;\\n margin-bottom: 1em;\\n font-size: 0.9em;\\n}\\n\\n.cm-code {\\n font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', monospace;\\n background: transparent;\\n padding: 0;\\n white-space: pre;\\n}\\n\\ncode {\\n font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', monospace;\\n font-size: 0.9em;\\n background-color: #f0f0f0;\\n padding: 0.15em 0.3em;\\n border-radius: 3px;\\n}\\n\\n/* Blockquote */\\n.cm-blockquote {\\n margin: 0 0 1em 0;\\n padding: 0 1em;\\n color: #666;\\n border-left: 3px solid #ddd;\\n font-style: italic;\\n}\\n\\n/* Divider */\\n.cm-divider {\\n height: 1px;\\n padding: 0;\\n margin: 2em 0;\\n background-color: #eee;\\n border: 0;\\n}\\n\\n/* Table */\\n.cm-table {\\n display: block;\\n width: max-content;\\n max-width: 100%;\\n overflow: auto;\\n border-spacing: 0;\\n border-collapse: collapse;\\n margin-bottom: 1em;\\n}\\n\\n.cm-table th,\\n.cm-table td {\\n padding: 0.5em 1em;\\n border: 1px solid #ddd;\\n}\\n\\n.cm-table th {\\n font-weight: 600;\\n background-color: #f9f9f9;\\n}\\n\\n/* Image */\\n.cm-image {\\n margin: 0 0 1em 0;\\n}\\n\\n.cm-image img {\\n max-width: 100%;\\n height: auto;\\n}\\n\\n.cm-image figcaption {\\n font-size: 0.875em;\\n color: #666;\\n margin-top: 0.5em;\\n text-align: center;\\n}\\n\\n/* Callout */\\n.cm-callout {\\n padding: 1em;\\n margin-bottom: 1em;\\n border-radius: 4px;\\n border-left: 3px solid;\\n background-color: #f9f9f9;\\n}\\n\\n.cm-callout-title {\\n display: block;\\n text-transform: capitalize;\\n font-weight: 600;\\n margin-bottom: 0.5em;\\n}\\n\\n.cm-callout-info { border-left-color: #3b82f6; }\\n.cm-callout-warning { border-left-color: #f59e0b; }\\n.cm-callout-tip { border-left-color: #10b981; }\\n.cm-callout-danger { border-left-color: #ef4444; }\\n.cm-callout-note { border-left-color: #6b7280; }\\n\\n/* Links */\\n.cm-preview a {\\n color: #0066cc;\\n text-decoration: none;\\n}\\n\\n.cm-preview a:hover {\\n text-decoration: underline;\\n}\\n\\n/* Inline styles */\\n.cm-preview mark {\\n background-color: #fff3cd;\\n padding: 0.1em 0.2em;\\n border-radius: 2px;\\n}\\n\\n.cm-preview del {\\n opacity: 0.6;\\n}\\n\";\nvar system = `/**\n * @create-markdown/preview - System Theme\n * CSS custom property theme that integrates with any design system.\n * Override --cm-* variables, or fall back to common --text / --bg / --border tokens.\n */\n\n.cm-preview {\n font-family: var(--cm-font, inherit);\n font-size: var(--cm-font-size, 1rem);\n line-height: var(--cm-line-height, 1.6);\n color: var(--cm-text, var(--text, inherit));\n background: var(--cm-bg, var(--bg, transparent));\n max-width: 100%;\n overflow-wrap: break-word;\n}\n\n/* Headings */\n.cm-heading {\n margin-top: 1.5em;\n margin-bottom: 0.5em;\n font-weight: var(--cm-heading-weight, 600);\n line-height: 1.25;\n}\n\n.cm-h1 {\n font-size: 2em;\n padding-bottom: 0.3em;\n border-bottom: 1px solid var(--cm-border, var(--border, currentColor));\n}\n\n.cm-h2 {\n font-size: 1.5em;\n padding-bottom: 0.3em;\n border-bottom: 1px solid var(--cm-border, var(--border, currentColor));\n}\n\n.cm-h3 { font-size: 1.25em; }\n.cm-h4 { font-size: 1em; }\n.cm-h5 { font-size: 0.875em; }\n.cm-h6 { font-size: 0.85em; color: var(--cm-muted, var(--muted, #656d76)); }\n\n/* Paragraphs */\n.cm-paragraph {\n margin-top: 0;\n margin-bottom: 1em;\n}\n\n/* Lists */\n.cm-bullet-list,\n.cm-numbered-list {\n margin-top: 0;\n margin-bottom: 1em;\n padding-left: 2em;\n}\n\n.cm-bullet-list li,\n.cm-numbered-list li {\n margin-bottom: 0.25em;\n}\n\n/* Checklist */\n.cm-checklist-item {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-bottom: 0.25em;\n}\n\n.cm-checklist-item input[type=\"checkbox\"] {\n margin-top: 0.25rem;\n}\n\n.cm-checked {\n text-decoration: line-through;\n color: var(--cm-muted, var(--muted, #656d76));\n}\n\n/* Code */\n.cm-code-block {\n background: var(--cm-code-bg, var(--secondary, #f5f5f5));\n border: 1px solid var(--cm-border, var(--border, #ddd));\n border-radius: var(--cm-radius, 6px);\n padding: 1em;\n overflow-x: auto;\n margin-bottom: 1em;\n font-size: 0.875em;\n}\n\n.cm-code {\n font-family: var(--cm-mono, ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace);\n background: transparent;\n padding: 0;\n white-space: pre;\n}\n\ncode {\n font-family: var(--cm-mono, ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace);\n font-size: 0.875em;\n background-color: var(--cm-inline-code-bg, var(--secondary, rgba(175, 184, 193, 0.2)));\n padding: 0.2em 0.4em;\n border-radius: var(--cm-radius, 6px);\n}\n\n/* Blockquote */\n.cm-blockquote {\n margin: 0 0 1em 0;\n padding: 0 1em;\n color: var(--cm-muted, var(--muted, #656d76));\n border-left: 0.25em solid var(--cm-border, var(--border, #ddd));\n}\n\n/* Divider */\n.cm-divider {\n height: 0.25em;\n padding: 0;\n margin: 1.5em 0;\n background-color: var(--cm-border, var(--border, #ddd));\n border: 0;\n}\n\n/* Table */\n.cm-table {\n display: block;\n width: max-content;\n max-width: 100%;\n overflow: auto;\n border-spacing: 0;\n border-collapse: collapse;\n margin-bottom: 1em;\n}\n\n.cm-table th,\n.cm-table td {\n padding: 6px 13px;\n border: 1px solid var(--cm-border, var(--border, #ddd));\n}\n\n.cm-table th {\n font-weight: 600;\n background-color: var(--cm-table-header-bg, var(--secondary, #f6f8fa));\n}\n\n.cm-table tr:nth-child(2n) {\n background-color: var(--cm-table-stripe-bg, var(--secondary, #f6f8fa));\n}\n\n/* Image */\n.cm-image {\n margin: 0 0 1em 0;\n}\n\n.cm-image img {\n max-width: 100%;\n height: auto;\n border-radius: var(--cm-radius, 6px);\n}\n\n.cm-image figcaption {\n font-size: 0.875em;\n color: var(--cm-muted, var(--muted, #656d76));\n margin-top: 0.5em;\n text-align: center;\n}\n\n/* Callout */\n.cm-callout {\n padding: 1em;\n margin-bottom: 1em;\n border-radius: var(--cm-radius, 6px);\n border-left: 4px solid;\n background-color: var(--cm-callout-bg, var(--secondary, #f6f8fa));\n}\n\n.cm-callout-title {\n display: block;\n text-transform: capitalize;\n font-weight: 600;\n margin-bottom: 0.5em;\n}\n\n.cm-callout-info { border-left-color: var(--cm-info, #0969da); }\n.cm-callout-warning { border-left-color: var(--cm-warning, #d4a72c); }\n.cm-callout-tip { border-left-color: var(--cm-success, #1a7f37); }\n.cm-callout-danger { border-left-color: var(--cm-danger, #cf222e); }\n.cm-callout-note { border-left-color: var(--cm-muted, var(--muted, #656d76)); }\n\n/* Links */\n.cm-preview a {\n color: var(--cm-link, var(--link, #0969da));\n text-decoration: none;\n}\n\n.cm-preview a:hover {\n text-decoration: underline;\n}\n\n/* Inline styles */\n.cm-preview mark {\n background-color: var(--cm-highlight, #fff8c5);\n padding: 0.1em 0.2em;\n border-radius: 3px;\n}\n\n.cm-preview del {\n color: var(--cm-muted, var(--muted, #656d76));\n}\n`;\nvar themeCSS = {\n githubDark,\n github,\n minimal,\n system\n};\n\n// src/themes/index.ts\nvar themeNames = {\n github: \"github\",\n githubDark: \"github-dark\",\n minimal: \"minimal\",\n system: \"system\"\n};\nfunction getThemePath(theme) {\n return `@create-markdown/preview/themes/${themeNames[theme]}.css`;\n}\n\n// src/plugins/shiki.ts\nvar DEFAULT_OPTIONS2 = {\n theme: \"github-light\",\n darkTheme: \"github-dark\",\n langs: [],\n lineNumbers: false,\n classPrefix: \"cm-\"\n};\nvar highlighterPromise = null;\nvar highlighter = null;\nfunction shikiPlugin(options) {\n const opts = { ...DEFAULT_OPTIONS2, ...options };\n return {\n name: \"shiki\",\n async init() {\n if (highlighter) return;\n try {\n const shikiModule = await import(\"shiki\");\n const createHighlighter = shikiModule.createHighlighter;\n if (!createHighlighter) {\n console.warn(\"@create-markdown/preview: Shiki module loaded but createHighlighter not found\");\n return;\n }\n highlighterPromise = createHighlighter({\n themes: [opts.theme, opts.darkTheme].filter(Boolean),\n langs: [\n \"javascript\",\n \"typescript\",\n \"jsx\",\n \"tsx\",\n \"json\",\n \"html\",\n \"css\",\n \"markdown\",\n \"python\",\n \"rust\",\n \"go\",\n \"bash\",\n \"shell\",\n ...opts.langs\n ]\n });\n highlighter = await highlighterPromise;\n } catch (error) {\n console.warn(\"@create-markdown/preview: Shiki not available. Install with: pnpm add shiki\");\n }\n },\n renderBlock(block, _defaultRender) {\n if (block.type !== \"codeBlock\") {\n return null;\n }\n const codeBlock = block;\n const code = codeBlock.content.map((span) => span.text).join(\"\");\n const language = codeBlock.props.language || \"text\";\n if (!highlighter) {\n return null;\n }\n try {\n const shikiHighlighter = highlighter;\n const html = shikiHighlighter.codeToHtml(code, {\n lang: language,\n theme: opts.theme\n });\n const prefix = opts.classPrefix;\n return `<div class=\"${prefix}code-block ${prefix}shiki\" data-language=\"${language}\">${html}</div>`;\n } catch (error) {\n return null;\n }\n },\n getCSS() {\n const prefix = opts.classPrefix;\n return `\n.${prefix}shiki pre {\n padding: 16px;\n border-radius: 6px;\n overflow-x: auto;\n margin: 0;\n}\n\n.${prefix}shiki code {\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;\n font-size: 0.875em;\n background: transparent;\n padding: 0;\n}\n\n.${prefix}shiki .line {\n display: inline-block;\n width: 100%;\n}\n\n${opts.lineNumbers ? `\n.${prefix}shiki pre {\n counter-reset: line;\n}\n\n.${prefix}shiki .line::before {\n counter-increment: line;\n content: counter(line);\n display: inline-block;\n width: 2em;\n margin-right: 1em;\n text-align: right;\n color: #6e7781;\n user-select: none;\n}\n` : \"\"}\n`.trim();\n }\n };\n}\nvar createShikiPlugin = shikiPlugin;\n\n// src/plugins/mermaid.ts\nvar DEFAULT_OPTIONS3 = {\n theme: \"default\",\n config: {},\n classPrefix: \"cm-\",\n useUniqueIds: true\n};\nvar mermaidModule = null;\nvar mermaidInitialized = false;\nvar diagramCounter = 0;\nfunction mermaidPlugin(options) {\n const opts = { ...DEFAULT_OPTIONS3, ...options };\n return {\n name: \"mermaid\",\n async init() {\n if (mermaidInitialized) return;\n try {\n const mermaid = await import(\"mermaid\");\n mermaidModule = mermaid.default || mermaid;\n const mermaidApi = mermaidModule;\n mermaidApi.initialize({\n startOnLoad: false,\n theme: opts.theme,\n securityLevel: \"loose\",\n ...opts.config\n });\n mermaidInitialized = true;\n } catch (error) {\n console.warn(\"@create-markdown/preview: Mermaid not available. Install with: pnpm add mermaid\");\n }\n },\n renderBlock(block, _defaultRender) {\n if (block.type !== \"codeBlock\") {\n return null;\n }\n const codeBlock = block;\n const language = codeBlock.props.language?.toLowerCase();\n if (language !== \"mermaid\") {\n return null;\n }\n const code = codeBlock.content.map((span) => span.text).join(\"\");\n const prefix = opts.classPrefix;\n const diagramId = opts.useUniqueIds ? `mermaid-${Date.now()}-${++diagramCounter}` : `mermaid-${++diagramCounter}`;\n return `\n<div class=\"${prefix}mermaid-container\">\n <pre class=\"${prefix}mermaid\" id=\"${diagramId}\">${escapeHtml2(code)}</pre>\n</div>`.trim();\n },\n async postProcess(html) {\n if (!mermaidModule) {\n return html;\n }\n try {\n const mermaid = mermaidModule;\n const prefix = opts.classPrefix;\n const mermaidBlockRegex = new RegExp(\n `<pre class=\"${prefix}mermaid\" id=\"([^\"]+)\">([\\\\s\\\\S]*?)</pre>`,\n \"g\"\n );\n const matches = [...html.matchAll(mermaidBlockRegex)];\n for (const match of matches) {\n const [fullMatch, id, escapedCode] = match;\n const code = unescapeHtml(escapedCode);\n try {\n const { svg } = await mermaid.render(id, code);\n html = html.replace(\n fullMatch,\n `<div class=\"${prefix}mermaid-diagram\">${svg}</div>`\n );\n } catch (renderError) {\n console.warn(`Failed to render Mermaid diagram: ${renderError}`);\n }\n }\n } catch (error) {\n console.warn(\"Mermaid post-processing failed:\", error);\n }\n return html;\n },\n getCSS() {\n const prefix = opts.classPrefix;\n return `\n.${prefix}mermaid-container {\n margin-bottom: 16px;\n overflow-x: auto;\n}\n\n.${prefix}mermaid {\n background-color: transparent;\n text-align: center;\n}\n\n.${prefix}mermaid-diagram {\n display: flex;\n justify-content: center;\n padding: 16px;\n background-color: #f6f8fa;\n border-radius: 6px;\n}\n\n.${prefix}mermaid-diagram svg {\n max-width: 100%;\n height: auto;\n}\n\n/* Dark theme adjustments */\n@media (prefers-color-scheme: dark) {\n .${prefix}mermaid-diagram {\n background-color: #161b22;\n }\n}\n`.trim();\n }\n };\n}\nvar createMermaidPlugin = mermaidPlugin;\nfunction escapeHtml2(text) {\n return text.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&#039;\");\n}\nfunction unescapeHtml(text) {\n return text.replace(/&amp;/g, \"&\").replace(/&lt;/g, \"<\").replace(/&gt;/g, \">\").replace(/&quot;/g, '\"').replace(/&#039;/g, \"'\");\n}\n\n// src/web-component.ts\nasync function lazyParse2(markdown) {\n try {\n const core = await import(\"@create-markdown/core\");\n return core.parse(markdown);\n } catch {\n throw new Error(\n \"@create-markdown/core is required to parse markdown in <markdown-preview>. Install it, or provide pre-parsed blocks via the blocks attribute / setBlocks().\"\n );\n }\n}\nvar MarkdownPreviewElement = class extends HTMLElement {\n constructor() {\n super();\n __publicField(this, \"_shadow\", null);\n __publicField(this, \"plugins\", []);\n __publicField(this, \"defaultTheme\", \"github\");\n __publicField(this, \"styleElement\");\n __publicField(this, \"contentElement\");\n const mode = this.constructor._shadowMode;\n if (mode !== \"none\") {\n this._shadow = this.attachShadow({ mode });\n }\n this.styleElement = document.createElement(\"style\");\n this.renderRoot.appendChild(this.styleElement);\n this.contentElement = document.createElement(\"div\");\n this.contentElement.className = \"markdown-preview-content\";\n this.renderRoot.appendChild(this.contentElement);\n this.updateStyles();\n }\n static get observedAttributes() {\n return [\"theme\", \"link-target\", \"async\"];\n }\n get renderRoot() {\n return this._shadow ?? this;\n }\n connectedCallback() {\n this.render();\n }\n attributeChangedCallback(_name, _oldValue, _newValue) {\n this.render();\n }\n setPlugins(plugins) {\n this.plugins = plugins;\n this.render();\n }\n setDefaultTheme(theme) {\n this.defaultTheme = theme;\n this.render();\n }\n getMarkdown() {\n const blocksAttr = this.getAttribute(\"blocks\");\n if (blocksAttr) {\n try {\n const blocks = JSON.parse(blocksAttr);\n return blocks.map((b) => b.content.map((s) => s.text).join(\"\")).join(\"\\n\\n\");\n } catch {\n return \"\";\n }\n }\n return this.textContent || \"\";\n }\n setMarkdown(markdown) {\n this.textContent = markdown;\n this.render();\n }\n setBlocks(blocks) {\n this.setAttribute(\"blocks\", JSON.stringify(blocks));\n this.render();\n }\n getOptions() {\n const theme = this.getAttribute(\"theme\") || this.defaultTheme;\n const linkTarget = this.getAttribute(\"link-target\") || \"_blank\";\n return {\n theme,\n linkTarget,\n plugins: this.plugins\n };\n }\n async getBlocks() {\n const blocksAttr = this.getAttribute(\"blocks\");\n if (blocksAttr) {\n try {\n return JSON.parse(blocksAttr);\n } catch {\n console.warn(\"Invalid blocks JSON in markdown-preview element\");\n return [];\n }\n }\n const markdown = this.textContent || \"\";\n return lazyParse2(markdown);\n }\n async render() {\n const blocks = await this.getBlocks();\n const options = this.getOptions();\n const isAsync = this.hasAttribute(\"async\") || this.plugins.length > 0;\n try {\n let html;\n if (isAsync) {\n html = await renderAsync(blocks, options);\n } else {\n html = blocksToHTML(blocks, options);\n }\n this.contentElement.innerHTML = html;\n } catch (error) {\n console.error(\"Error rendering markdown preview:\", error);\n this.contentElement.innerHTML = `<div class=\"error\">Error rendering content</div>`;\n }\n }\n updateStyles() {\n const pluginCSS = this.plugins.filter((p) => p.getCSS).map((p) => p.getCSS()).join(\"\\n\\n\");\n const hostRule = this._shadow ? \":host { display: block; }\" : \"markdown-preview { display: block; }\";\n this.styleElement.textContent = `\n${hostRule}\n\n.markdown-preview-content {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;\n font-size: 16px;\n line-height: 1.6;\n}\n\n.error {\n color: #cf222e;\n padding: 1rem;\n background: #ffebe9;\n border-radius: 6px;\n}\n\n${pluginCSS}\n `.trim();\n }\n};\n/** @internal */\n__publicField(MarkdownPreviewElement, \"_shadowMode\", \"open\");\nvar globalPlugins = [];\nvar globalDefaultTheme = \"github\";\nfunction registerPreviewElement(options) {\n const tagName = options?.tagName || \"markdown-preview\";\n const plugins = options?.plugins || [];\n const defaultTheme = options?.defaultTheme || \"github\";\n const shadowMode = options?.shadowMode ?? \"open\";\n globalPlugins = plugins;\n globalDefaultTheme = defaultTheme;\n if (!customElements.get(tagName)) {\n class ConfiguredMarkdownPreview extends MarkdownPreviewElement {\n constructor() {\n super();\n this.setPlugins(globalPlugins);\n this.setDefaultTheme(globalDefaultTheme);\n }\n }\n __publicField(ConfiguredMarkdownPreview, \"_shadowMode\", shadowMode);\n customElements.define(tagName, ConfiguredMarkdownPreview);\n }\n}\nfunction autoRegister() {\n if (typeof window !== \"undefined\" && typeof customElements !== \"undefined\") {\n registerPreviewElement();\n }\n}\n\n// src/index.ts\nvar VERSION = \"2.0.0\";\nexport {\n MarkdownPreviewElement,\n VERSION,\n applyPreviewTheme,\n autoRegister,\n blocksToHTML,\n createMermaidPlugin,\n createShikiPlugin,\n getThemePath,\n markdownToHTML,\n mermaidPlugin,\n registerPreviewElement,\n renderAsync,\n shikiPlugin,\n themeNames,\n themeCSS as themes\n};\n//# sourceMappingURL=index.js.map","import { applyPreviewTheme } from \"@create-markdown/preview\";\nimport DOMPurify from \"dompurify\";\nimport { html, nothing } from \"lit\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { marked } from \"marked\";\nimport { formatRelativeTimestamp } from \"../format.ts\";\nimport { icons } from \"../icons.ts\";\nimport {\n formatCronPayload,\n formatCronSchedule,\n formatCronState,\n formatNextRun,\n} from \"../presenter.ts\";\nimport type {\n AgentsFilesListResult,\n ChannelAccountSnapshot,\n ChannelsStatusSnapshot,\n CronJob,\n CronStatus,\n} from \"../types.ts\";\nimport { type AgentContext } from \"./agents-utils.ts\";\nimport type { AgentsPanel } from \"./agents.ts\";\nimport { resolveChannelExtras as resolveChannelExtrasFromConfig } from \"./channel-config-extras.ts\";\n\nfunction renderAgentContextCard(\n context: AgentContext,\n subtitle: string,\n onSelectPanel: (panel: AgentsPanel) => void,\n) {\n return html`\n <section class=\"card\">\n <div class=\"card-title\">Agent Context</div>\n <div class=\"card-sub\">${subtitle}</div>\n <div class=\"agents-overview-grid\" style=\"margin-top: 16px;\">\n <div class=\"agent-kv\">\n <div class=\"label\">Workspace</div>\n <div>\n <button\n type=\"button\"\n class=\"workspace-link mono\"\n @click=${() => onSelectPanel(\"files\")}\n title=\"Open Files tab\"\n >\n ${context.workspace}\n </button>\n </div>\n </div>\n <div class=\"agent-kv\">\n <div class=\"label\">Primary Model</div>\n <div class=\"mono\">${context.model}</div>\n </div>\n <div class=\"agent-kv\">\n <div class=\"label\">Identity Name</div>\n <div>${context.identityName}</div>\n </div>\n <div class=\"agent-kv\">\n <div class=\"label\">Identity Avatar</div>\n <div>${context.identityAvatar}</div>\n </div>\n <div class=\"agent-kv\">\n <div class=\"label\">Skills Filter</div>\n <div>${context.skillsLabel}</div>\n </div>\n <div class=\"agent-kv\">\n <div class=\"label\">Default</div>\n <div>${context.isDefault ? \"yes\" : \"no\"}</div>\n </div>\n </div>\n </section>\n `;\n}\n\ntype ChannelSummaryEntry = {\n id: string;\n label: string;\n accounts: ChannelAccountSnapshot[];\n};\n\nfunction resolveChannelLabel(snapshot: ChannelsStatusSnapshot, id: string) {\n const meta = snapshot.channelMeta?.find((entry) => entry.id === id);\n if (meta?.label) {\n return meta.label;\n }\n return snapshot.channelLabels?.[id] ?? id;\n}\n\nfunction resolveChannelEntries(snapshot: ChannelsStatusSnapshot | null): ChannelSummaryEntry[] {\n if (!snapshot) {\n return [];\n }\n const ids = new Set<string>();\n for (const id of snapshot.channelOrder ?? []) {\n ids.add(id);\n }\n for (const entry of snapshot.channelMeta ?? []) {\n ids.add(entry.id);\n }\n for (const id of Object.keys(snapshot.channelAccounts ?? {})) {\n ids.add(id);\n }\n const ordered: string[] = [];\n const seed = snapshot.channelOrder?.length ? snapshot.channelOrder : Array.from(ids);\n for (const id of seed) {\n if (!ids.has(id)) {\n continue;\n }\n ordered.push(id);\n ids.delete(id);\n }\n for (const id of ids) {\n ordered.push(id);\n }\n return ordered.map((id) => ({\n id,\n label: resolveChannelLabel(snapshot, id),\n accounts: snapshot.channelAccounts?.[id] ?? [],\n }));\n}\n\nconst CHANNEL_EXTRA_FIELDS = [\"groupPolicy\", \"streamMode\", \"dmPolicy\"] as const;\n\nfunction summarizeChannelAccounts(accounts: ChannelAccountSnapshot[]) {\n let connected = 0;\n let configured = 0;\n let enabled = 0;\n for (const account of accounts) {\n const probeOk =\n account.probe && typeof account.probe === \"object\" && \"ok\" in account.probe\n ? Boolean((account.probe as { ok?: unknown }).ok)\n : false;\n const isConnected = account.connected === true || account.running === true || probeOk;\n if (isConnected) {\n connected += 1;\n }\n if (account.configured) {\n configured += 1;\n }\n if (account.enabled) {\n enabled += 1;\n }\n }\n return {\n total: accounts.length,\n connected,\n configured,\n enabled,\n };\n}\n\nexport function renderAgentChannels(params: {\n context: AgentContext;\n configForm: Record<string, unknown> | null;\n snapshot: ChannelsStatusSnapshot | null;\n loading: boolean;\n error: string | null;\n lastSuccess: number | null;\n onRefresh: () => void;\n onSelectPanel: (panel: AgentsPanel) => void;\n}) {\n const entries = resolveChannelEntries(params.snapshot);\n const lastSuccessLabel = params.lastSuccess\n ? formatRelativeTimestamp(params.lastSuccess)\n : \"never\";\n return html`\n <section class=\"grid grid-cols-2\">\n ${renderAgentContextCard(\n params.context,\n \"Workspace, identity, and model configuration.\",\n params.onSelectPanel,\n )}\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Channels</div>\n <div class=\"card-sub\">Gateway-wide channel status snapshot.</div>\n </div>\n <button class=\"btn btn--sm\" ?disabled=${params.loading} @click=${params.onRefresh}>\n ${params.loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n </div>\n <div class=\"muted\" style=\"margin-top: 8px;\">Last refresh: ${lastSuccessLabel}</div>\n ${params.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${params.error}</div>`\n : nothing}\n ${!params.snapshot\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n Load channels to see live status.\n </div>\n `\n : nothing}\n ${entries.length === 0\n ? html` <div class=\"muted\" style=\"margin-top: 16px\">No channels found.</div> `\n : html`\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${entries.map((entry) => {\n const summary = summarizeChannelAccounts(entry.accounts);\n const status = summary.total\n ? `${summary.connected}/${summary.total} connected`\n : \"no accounts\";\n const configLabel = summary.configured\n ? `${summary.configured} configured`\n : \"not configured\";\n const enabled = summary.total ? `${summary.enabled} enabled` : \"disabled\";\n const extras = resolveChannelExtrasFromConfig({\n configForm: params.configForm,\n channelId: entry.id,\n fields: CHANNEL_EXTRA_FIELDS,\n });\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.label}</div>\n <div class=\"list-sub mono\">${entry.id}</div>\n </div>\n <div class=\"list-meta\">\n <div>${status}</div>\n <div>${configLabel}</div>\n <div>${enabled}</div>\n ${summary.configured === 0\n ? html`\n <div>\n <a\n href=\"https://docs.kova.ai/channels\"\n target=\"_blank\"\n rel=\"noopener\"\n style=\"color: var(--accent); font-size: 12px\"\n >Setup guide</a\n >\n </div>\n `\n : nothing}\n ${extras.length > 0\n ? extras.map((extra) => html`<div>${extra.label}: ${extra.value}</div>`)\n : nothing}\n </div>\n </div>\n `;\n })}\n </div>\n `}\n </section>\n </section>\n `;\n}\n\nexport function renderAgentCron(params: {\n context: AgentContext;\n agentId: string;\n jobs: CronJob[];\n status: CronStatus | null;\n loading: boolean;\n error: string | null;\n onRefresh: () => void;\n onRunNow: (jobId: string) => void;\n onSelectPanel: (panel: AgentsPanel) => void;\n}) {\n const jobs = params.jobs.filter((job) => job.agentId === params.agentId);\n return html`\n <section class=\"grid grid-cols-2\">\n ${renderAgentContextCard(\n params.context,\n \"Workspace and scheduling targets.\",\n params.onSelectPanel,\n )}\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Scheduler</div>\n <div class=\"card-sub\">Gateway cron status.</div>\n </div>\n <button class=\"btn btn--sm\" ?disabled=${params.loading} @click=${params.onRefresh}>\n ${params.loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n </div>\n <div class=\"stat-grid\" style=\"margin-top: 16px;\">\n <div class=\"stat\">\n <div class=\"stat-label\">Enabled</div>\n <div class=\"stat-value\">\n ${params.status ? (params.status.enabled ? \"Yes\" : \"No\") : \"n/a\"}\n </div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Jobs</div>\n <div class=\"stat-value\">${params.status?.jobs ?? \"n/a\"}</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Next wake</div>\n <div class=\"stat-value\">${formatNextRun(params.status?.nextWakeAtMs ?? null)}</div>\n </div>\n </div>\n ${params.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${params.error}</div>`\n : nothing}\n </section>\n </section>\n <section class=\"card\">\n <div class=\"card-title\">Agent Cron Jobs</div>\n <div class=\"card-sub\">Scheduled jobs targeting this agent.</div>\n ${jobs.length === 0\n ? html` <div class=\"muted\" style=\"margin-top: 16px\">No jobs assigned.</div> `\n : html`\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${jobs.map(\n (job) => html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${job.name}</div>\n ${job.description\n ? html`<div class=\"list-sub\">${job.description}</div>`\n : nothing}\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${formatCronSchedule(job)}</span>\n <span class=\"chip ${job.enabled ? \"chip-ok\" : \"chip-warn\"}\">\n ${job.enabled ? \"enabled\" : \"disabled\"}\n </span>\n <span class=\"chip\">${job.sessionTarget}</span>\n </div>\n </div>\n <div class=\"list-meta\">\n <div class=\"mono\">${formatCronState(job)}</div>\n <div class=\"muted\">${formatCronPayload(job)}</div>\n <button\n class=\"btn btn--sm\"\n style=\"margin-top: 6px;\"\n ?disabled=${!job.enabled}\n @click=${() => params.onRunNow(job.id)}\n >\n Run Now\n </button>\n </div>\n </div>\n `,\n )}\n </div>\n `}\n </section>\n `;\n}\n\nexport function renderAgentFiles(params: {\n agentId: string;\n agentFilesList: AgentsFilesListResult | null;\n agentFilesLoading: boolean;\n agentFilesError: string | null;\n agentFileActive: string | null;\n agentFileContents: Record<string, string>;\n agentFileDrafts: Record<string, string>;\n agentFileSaving: boolean;\n onLoadFiles: (agentId: string) => void;\n onSelectFile: (name: string) => void;\n onFileDraftChange: (name: string, content: string) => void;\n onFileReset: (name: string) => void;\n onFileSave: (name: string) => void;\n}) {\n const list = params.agentFilesList?.agentId === params.agentId ? params.agentFilesList : null;\n const files = list?.files ?? [];\n const active = params.agentFileActive ?? null;\n const activeEntry = active ? (files.find((file) => file.name === active) ?? null) : null;\n const baseContent = active ? (params.agentFileContents[active] ?? \"\") : \"\";\n const draft = active ? (params.agentFileDrafts[active] ?? baseContent) : \"\";\n const isDirty = active ? draft !== baseContent : false;\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Core Files</div>\n <div class=\"card-sub\">Bootstrap persona, identity, and tool guidance.</div>\n </div>\n <button\n class=\"btn btn--sm\"\n ?disabled=${params.agentFilesLoading}\n @click=${() => params.onLoadFiles(params.agentId)}\n >\n ${params.agentFilesLoading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n ${list\n ? html`<div class=\"muted mono\" style=\"margin-top: 8px;\">\n Workspace: <span>${list.workspace}</span>\n </div>`\n : nothing}\n ${params.agentFilesError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${params.agentFilesError}\n </div>`\n : nothing}\n ${!list\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n Load the agent workspace files to edit core instructions.\n </div>\n `\n : files.length === 0\n ? html` <div class=\"muted\" style=\"margin-top: 16px\">No files found.</div> `\n : html`\n <div class=\"agent-tabs\" style=\"margin-top: 14px;\">\n ${files.map((file) => {\n const isActive = active === file.name;\n const label = file.name.replace(/\\.md$/i, \"\");\n return html`\n <button\n class=\"agent-tab ${isActive ? \"active\" : \"\"} ${file.missing\n ? \"agent-tab--missing\"\n : \"\"}\"\n @click=${() => params.onSelectFile(file.name)}\n >\n ${label}${file.missing\n ? html` <span class=\"agent-tab-badge\">missing</span> `\n : nothing}\n </button>\n `;\n })}\n </div>\n ${!activeEntry\n ? html` <div class=\"muted\" style=\"margin-top: 16px\">Select a file to edit.</div> `\n : html`\n <div class=\"agent-file-header\" style=\"margin-top: 14px;\">\n <div>\n <div class=\"agent-file-sub mono\">${activeEntry.path}</div>\n </div>\n <div class=\"agent-file-actions\">\n <button\n class=\"btn btn--sm\"\n title=\"Preview rendered markdown\"\n @click=${(e: Event) => {\n const btn = e.currentTarget as HTMLElement;\n const dialog = btn.closest(\".card\")?.querySelector(\"dialog\");\n if (dialog) {\n dialog.showModal();\n }\n }}\n >\n ${icons.eye} Preview\n </button>\n <button\n class=\"btn btn--sm\"\n ?disabled=${!isDirty}\n @click=${() => params.onFileReset(activeEntry.name)}\n >\n Reset\n </button>\n <button\n class=\"btn btn--sm primary\"\n ?disabled=${params.agentFileSaving || !isDirty}\n @click=${() => params.onFileSave(activeEntry.name)}\n >\n ${params.agentFileSaving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n </div>\n ${activeEntry.missing\n ? html`\n <div class=\"callout info\" style=\"margin-top: 10px\">\n This file is missing. Saving will create it in the agent workspace.\n </div>\n `\n : nothing}\n <label class=\"field agent-file-field\" style=\"margin-top: 12px;\">\n <span>Content</span>\n <textarea\n class=\"agent-file-textarea\"\n .value=${draft}\n @input=${(e: Event) =>\n params.onFileDraftChange(\n activeEntry.name,\n (e.target as HTMLTextAreaElement).value,\n )}\n ></textarea>\n </label>\n <dialog\n class=\"md-preview-dialog\"\n @click=${(e: Event) => {\n const dialog = e.currentTarget as HTMLDialogElement;\n if (e.target === dialog) {\n dialog.close();\n }\n }}\n @close=${(e: Event) => {\n const dialog = e.currentTarget as HTMLElement;\n dialog\n .querySelector(\".md-preview-dialog__panel\")\n ?.classList.remove(\"fullscreen\");\n }}\n >\n <div class=\"md-preview-dialog__panel\">\n <div class=\"md-preview-dialog__header\">\n <div class=\"md-preview-dialog__title mono\">${activeEntry.name}</div>\n <div class=\"md-preview-dialog__actions\">\n <button\n class=\"btn btn--sm md-preview-expand-btn\"\n title=\"Toggle fullscreen\"\n @click=${(e: Event) => {\n const btn = e.currentTarget as HTMLElement;\n const panel = btn.closest(\".md-preview-dialog__panel\");\n if (!panel) {\n return;\n }\n const isFullscreen = panel.classList.toggle(\"fullscreen\");\n btn.classList.toggle(\"is-fullscreen\", isFullscreen);\n }}\n >\n <span class=\"when-normal\">${icons.maximize} Expand</span\n ><span class=\"when-fullscreen\">${icons.minimize} Collapse</span>\n </button>\n <button\n class=\"btn btn--sm\"\n title=\"Edit file\"\n @click=${(e: Event) => {\n (e.currentTarget as HTMLElement).closest(\"dialog\")?.close();\n const textarea =\n document.querySelector<HTMLElement>(\".agent-file-textarea\");\n textarea?.focus();\n }}\n >\n ${icons.edit} Editor\n </button>\n <button\n class=\"btn btn--sm\"\n @click=${(e: Event) => {\n (e.currentTarget as HTMLElement).closest(\"dialog\")?.close();\n }}\n >\n ${icons.x} Close\n </button>\n </div>\n </div>\n <div class=\"md-preview-dialog__body\">\n ${unsafeHTML(\n applyPreviewTheme(\n marked.parse(draft, { gfm: true, breaks: true }) as string,\n { sanitize: (h: string) => DOMPurify.sanitize(h) },\n ),\n )}\n </div>\n </div>\n </dialog>\n `}\n `}\n </section>\n `;\n}\n","import { html, nothing } from \"lit\";\nimport { normalizeToolName } from \"../../../../src/agents/tool-policy-shared.js\";\nimport type {\n SkillStatusEntry,\n SkillStatusReport,\n ToolsCatalogResult,\n ToolsEffectiveResult,\n} from \"../types.ts\";\nimport {\n type AgentToolEntry,\n type AgentToolSection,\n isAllowedByPolicy,\n matchesList,\n resolveAgentConfig,\n resolveToolProfileOptions,\n resolveToolProfile,\n resolveToolSections,\n} from \"./agents-utils.ts\";\nimport type { SkillGroup } from \"./skills-grouping.ts\";\nimport { groupSkills } from \"./skills-grouping.ts\";\nimport {\n computeSkillMissing,\n computeSkillReasons,\n renderSkillStatusChips,\n} from \"./skills-shared.ts\";\n\nfunction renderToolBadges(section: AgentToolSection, tool: AgentToolEntry) {\n const source = tool.source ?? section.source;\n const pluginId = tool.pluginId ?? section.pluginId;\n const badges: string[] = [];\n if (source === \"plugin\" && pluginId) {\n badges.push(`plugin:${pluginId}`);\n } else if (source === \"core\") {\n badges.push(\"core\");\n }\n if (tool.optional) {\n badges.push(\"optional\");\n }\n if (badges.length === 0) {\n return nothing;\n }\n return html`\n <div style=\"display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px;\">\n ${badges.map((badge) => html`<span class=\"agent-pill\">${badge}</span>`)}\n </div>\n `;\n}\n\nfunction renderEffectiveToolBadge(tool: {\n source: \"core\" | \"plugin\" | \"channel\";\n pluginId?: string;\n channelId?: string;\n}) {\n if (tool.source === \"plugin\") {\n return tool.pluginId ? `Connected: ${tool.pluginId}` : \"Connected\";\n }\n if (tool.source === \"channel\") {\n return tool.channelId ? `Channel: ${tool.channelId}` : \"Channel\";\n }\n return \"Built-in\";\n}\n\nexport function renderAgentTools(params: {\n agentId: string;\n configForm: Record<string, unknown> | null;\n configLoading: boolean;\n configSaving: boolean;\n configDirty: boolean;\n toolsCatalogLoading: boolean;\n toolsCatalogError: string | null;\n toolsCatalogResult: ToolsCatalogResult | null;\n toolsEffectiveLoading: boolean;\n toolsEffectiveError: string | null;\n toolsEffectiveResult: ToolsEffectiveResult | null;\n runtimeSessionKey: string;\n runtimeSessionMatchesSelectedAgent: boolean;\n onProfileChange: (agentId: string, profile: string | null, clearAllow: boolean) => void;\n onOverridesChange: (agentId: string, alsoAllow: string[], deny: string[]) => void;\n onConfigReload: () => void;\n onConfigSave: () => void;\n}) {\n const config = resolveAgentConfig(params.configForm, params.agentId);\n const agentTools = config.entry?.tools ?? {};\n const globalTools = config.globalTools ?? {};\n const profile = agentTools.profile ?? globalTools.profile ?? \"full\";\n const profileOptions = resolveToolProfileOptions(params.toolsCatalogResult);\n const toolSections = resolveToolSections(params.toolsCatalogResult);\n const profileSource = agentTools.profile\n ? \"agent override\"\n : globalTools.profile\n ? \"global default\"\n : \"default\";\n const hasAgentAllow = Array.isArray(agentTools.allow) && agentTools.allow.length > 0;\n const hasGlobalAllow = Array.isArray(globalTools.allow) && globalTools.allow.length > 0;\n const editable =\n Boolean(params.configForm) &&\n !params.configLoading &&\n !params.configSaving &&\n !hasAgentAllow &&\n !(params.toolsCatalogLoading && !params.toolsCatalogResult && !params.toolsCatalogError);\n const alsoAllow = hasAgentAllow\n ? []\n : Array.isArray(agentTools.alsoAllow)\n ? agentTools.alsoAllow\n : [];\n const deny = hasAgentAllow ? [] : Array.isArray(agentTools.deny) ? agentTools.deny : [];\n const basePolicy = hasAgentAllow\n ? { allow: agentTools.allow ?? [], deny: agentTools.deny ?? [] }\n : (resolveToolProfile(profile) ?? undefined);\n const toolIds = toolSections.flatMap((section) => section.tools.map((tool) => tool.id));\n\n const resolveAllowed = (toolId: string) => {\n const baseAllowed = isAllowedByPolicy(toolId, basePolicy);\n const extraAllowed = matchesList(toolId, alsoAllow);\n const denied = matchesList(toolId, deny);\n const allowed = (baseAllowed || extraAllowed) && !denied;\n return {\n allowed,\n baseAllowed,\n denied,\n };\n };\n const enabledCount = toolIds.filter((toolId) => resolveAllowed(toolId).allowed).length;\n\n const updateTool = (toolId: string, nextEnabled: boolean) => {\n const nextAllow = new Set(\n alsoAllow.map((entry) => normalizeToolName(entry)).filter((entry) => entry.length > 0),\n );\n const nextDeny = new Set(\n deny.map((entry) => normalizeToolName(entry)).filter((entry) => entry.length > 0),\n );\n const baseAllowed = resolveAllowed(toolId).baseAllowed;\n const normalized = normalizeToolName(toolId);\n if (nextEnabled) {\n nextDeny.delete(normalized);\n if (!baseAllowed) {\n nextAllow.add(normalized);\n }\n } else {\n nextAllow.delete(normalized);\n nextDeny.add(normalized);\n }\n params.onOverridesChange(params.agentId, [...nextAllow], [...nextDeny]);\n };\n\n const updateAll = (nextEnabled: boolean) => {\n const nextAllow = new Set(\n alsoAllow.map((entry) => normalizeToolName(entry)).filter((entry) => entry.length > 0),\n );\n const nextDeny = new Set(\n deny.map((entry) => normalizeToolName(entry)).filter((entry) => entry.length > 0),\n );\n for (const toolId of toolIds) {\n const baseAllowed = resolveAllowed(toolId).baseAllowed;\n const normalized = normalizeToolName(toolId);\n if (nextEnabled) {\n nextDeny.delete(normalized);\n if (!baseAllowed) {\n nextAllow.add(normalized);\n }\n } else {\n nextAllow.delete(normalized);\n nextDeny.add(normalized);\n }\n }\n params.onOverridesChange(params.agentId, [...nextAllow], [...nextDeny]);\n };\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between; flex-wrap: wrap;\">\n <div style=\"min-width: 0;\">\n <div class=\"card-title\">Tool Access</div>\n <div class=\"card-sub\">\n Profile + per-tool overrides for this agent.\n <span class=\"mono\">${enabledCount}/${toolIds.length}</span> enabled.\n </div>\n </div>\n <div class=\"row\" style=\"gap: 8px; flex-wrap: wrap;\">\n <button class=\"btn btn--sm\" ?disabled=${!editable} @click=${() => updateAll(true)}>\n Enable All\n </button>\n <button class=\"btn btn--sm\" ?disabled=${!editable} @click=${() => updateAll(false)}>\n Disable All\n </button>\n <button\n class=\"btn btn--sm\"\n ?disabled=${params.configLoading}\n @click=${params.onConfigReload}\n >\n Reload Config\n </button>\n <button\n class=\"btn btn--sm primary\"\n ?disabled=${params.configSaving || !params.configDirty}\n @click=${params.onConfigSave}\n >\n ${params.configSaving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n </div>\n\n ${!params.configForm\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n Load the gateway config to adjust tool profiles.\n </div>\n `\n : nothing}\n ${hasAgentAllow\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n This agent is using an explicit allowlist in config. Tool overrides are managed in the\n Config tab.\n </div>\n `\n : nothing}\n ${hasGlobalAllow\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n Global tools.allow is set. Agent overrides cannot enable tools that are globally\n blocked.\n </div>\n `\n : nothing}\n ${params.toolsCatalogLoading && !params.toolsCatalogResult && !params.toolsCatalogError\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">Loading runtime tool catalog…</div>\n `\n : nothing}\n ${params.toolsCatalogError\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n Could not load runtime tool catalog. Showing built-in fallback list instead.\n </div>\n `\n : nothing}\n\n <div class=\"agent-tools-meta\" style=\"margin-top: 16px;\">\n <div class=\"agent-kv\">\n <div class=\"label\">Profile</div>\n <div class=\"mono\">${profile}</div>\n </div>\n <div class=\"agent-kv\">\n <div class=\"label\">Source</div>\n <div>${profileSource}</div>\n </div>\n ${params.configDirty\n ? html`\n <div class=\"agent-kv\">\n <div class=\"label\">Status</div>\n <div class=\"mono\">unsaved</div>\n </div>\n `\n : nothing}\n </div>\n\n <div style=\"margin-top: 18px;\">\n <div class=\"label\">Available Right Now</div>\n <div class=\"card-sub\">\n What this agent can use in the current chat session.\n <span class=\"mono\">${params.runtimeSessionKey || \"no session\"}</span>\n </div>\n ${!params.runtimeSessionMatchesSelectedAgent\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n Switch chat to this agent to view its live runtime tools.\n </div>\n `\n : params.toolsEffectiveLoading &&\n !params.toolsEffectiveResult &&\n !params.toolsEffectiveError\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">Loading available tools…</div>\n `\n : params.toolsEffectiveError\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n Could not load available tools for this session.\n </div>\n `\n : (params.toolsEffectiveResult?.groups?.length ?? 0) === 0\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n No tools are available for this session right now.\n </div>\n `\n : html`\n <div class=\"agent-tools-grid\" style=\"margin-top: 16px;\">\n ${params.toolsEffectiveResult?.groups.map(\n (group) => html`\n <div class=\"agent-tools-section\">\n <div class=\"agent-tools-header\">${group.label}</div>\n <div class=\"agent-tools-list\">\n ${group.tools.map((tool) => {\n return html`\n <div class=\"agent-tool-row\">\n <div>\n <div class=\"agent-tool-title\">${tool.label}</div>\n <div class=\"agent-tool-sub\">${tool.description}</div>\n <div\n style=\"display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px;\"\n >\n <span class=\"agent-pill\"\n >${renderEffectiveToolBadge(tool)}</span\n >\n </div>\n </div>\n </div>\n `;\n })}\n </div>\n </div>\n `,\n )}\n </div>\n `}\n </div>\n\n <div class=\"agent-tools-presets\" style=\"margin-top: 16px;\">\n <div class=\"label\">Quick Presets</div>\n <div class=\"agent-tools-buttons\">\n ${profileOptions.map(\n (option) => html`\n <button\n class=\"btn btn--sm ${profile === option.id ? \"active\" : \"\"}\"\n ?disabled=${!editable}\n @click=${() => params.onProfileChange(params.agentId, option.id, true)}\n >\n ${option.label}\n </button>\n `,\n )}\n <button\n class=\"btn btn--sm\"\n ?disabled=${!editable}\n @click=${() => params.onProfileChange(params.agentId, null, false)}\n >\n Inherit\n </button>\n </div>\n </div>\n\n <div class=\"agent-tools-grid\" style=\"margin-top: 20px;\">\n ${toolSections.map(\n (section) => html`\n <div class=\"agent-tools-section\">\n <div class=\"agent-tools-header\">\n ${section.label}\n ${section.source === \"plugin\" && section.pluginId\n ? html`<span class=\"agent-pill\" style=\"margin-left: 8px;\"\n >plugin:${section.pluginId}</span\n >`\n : nothing}\n </div>\n <div class=\"agent-tools-list\">\n ${section.tools.map((tool) => {\n const { allowed } = resolveAllowed(tool.id);\n return html`\n <div class=\"agent-tool-row\">\n <div>\n <div class=\"agent-tool-title mono\">${tool.label}</div>\n <div class=\"agent-tool-sub\">${tool.description}</div>\n ${renderToolBadges(section, tool)}\n </div>\n <label class=\"cfg-toggle\">\n <input\n type=\"checkbox\"\n .checked=${allowed}\n ?disabled=${!editable}\n @change=${(e: Event) =>\n updateTool(tool.id, (e.target as HTMLInputElement).checked)}\n />\n <span class=\"cfg-toggle__track\"></span>\n </label>\n </div>\n `;\n })}\n </div>\n </div>\n `,\n )}\n </div>\n </section>\n `;\n}\n\nexport function renderAgentSkills(params: {\n agentId: string;\n report: SkillStatusReport | null;\n loading: boolean;\n error: string | null;\n activeAgentId: string | null;\n configForm: Record<string, unknown> | null;\n configLoading: boolean;\n configSaving: boolean;\n configDirty: boolean;\n filter: string;\n onFilterChange: (next: string) => void;\n onRefresh: () => void;\n onToggle: (agentId: string, skillName: string, enabled: boolean) => void;\n onClear: (agentId: string) => void;\n onDisableAll: (agentId: string) => void;\n onConfigReload: () => void;\n onConfigSave: () => void;\n}) {\n const editable = Boolean(params.configForm) && !params.configLoading && !params.configSaving;\n const config = resolveAgentConfig(params.configForm, params.agentId);\n const allowlist = Array.isArray(config.entry?.skills) ? config.entry?.skills : undefined;\n const allowSet = new Set((allowlist ?? []).map((name) => name.trim()).filter(Boolean));\n const usingAllowlist = allowlist !== undefined;\n const reportReady = Boolean(params.report && params.activeAgentId === params.agentId);\n const rawSkills = reportReady ? (params.report?.skills ?? []) : [];\n const filter = params.filter.trim().toLowerCase();\n const filtered = filter\n ? rawSkills.filter((skill) =>\n [skill.name, skill.description, skill.source].join(\" \").toLowerCase().includes(filter),\n )\n : rawSkills;\n const groups = groupSkills(filtered);\n const enabledCount = usingAllowlist\n ? rawSkills.filter((skill) => allowSet.has(skill.name)).length\n : rawSkills.length;\n const totalCount = rawSkills.length;\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between; flex-wrap: wrap;\">\n <div style=\"min-width: 0;\">\n <div class=\"card-title\">Skills</div>\n <div class=\"card-sub\">\n Per-agent skill allowlist and workspace skills.\n ${totalCount > 0\n ? html`<span class=\"mono\">${enabledCount}/${totalCount}</span>`\n : nothing}\n </div>\n </div>\n <div class=\"row\" style=\"gap: 8px; flex-wrap: wrap;\">\n <div\n class=\"row\"\n style=\"gap: 4px; border: 1px solid var(--border); border-radius: var(--radius-md); padding: 2px;\"\n >\n <button\n class=\"btn btn--sm\"\n ?disabled=${!editable}\n @click=${() => params.onClear(params.agentId)}\n >\n Enable All\n </button>\n <button\n class=\"btn btn--sm\"\n ?disabled=${!editable}\n @click=${() => params.onDisableAll(params.agentId)}\n >\n Disable All\n </button>\n <button\n class=\"btn btn--sm\"\n ?disabled=${!editable || !usingAllowlist}\n @click=${() => params.onClear(params.agentId)}\n title=\"Remove per-agent allowlist and use all skills\"\n >\n Reset\n </button>\n </div>\n <button\n class=\"btn btn--sm\"\n ?disabled=${params.configLoading}\n @click=${params.onConfigReload}\n >\n Reload Config\n </button>\n <button class=\"btn btn--sm\" ?disabled=${params.loading} @click=${params.onRefresh}>\n ${params.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n <button\n class=\"btn btn--sm primary\"\n ?disabled=${params.configSaving || !params.configDirty}\n @click=${params.onConfigSave}\n >\n ${params.configSaving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n </div>\n\n ${!params.configForm\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n Load the gateway config to set per-agent skills.\n </div>\n `\n : nothing}\n ${usingAllowlist\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n This agent uses a custom skill allowlist.\n </div>\n `\n : html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n All skills are enabled. Disabling any skill will create a per-agent allowlist.\n </div>\n `}\n ${!reportReady && !params.loading\n ? html`\n <div class=\"callout info\" style=\"margin-top: 12px\">\n Load skills for this agent to view workspace-specific entries.\n </div>\n `\n : nothing}\n ${params.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${params.error}</div>`\n : nothing}\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\" style=\"flex: 1;\">\n <span>Filter</span>\n <input\n .value=${params.filter}\n @input=${(e: Event) => params.onFilterChange((e.target as HTMLInputElement).value)}\n placeholder=\"Search skills\"\n autocomplete=\"off\"\n name=\"agent-skills-filter\"\n />\n </label>\n <div class=\"muted\">${filtered.length} shown</div>\n </div>\n\n ${filtered.length === 0\n ? html` <div class=\"muted\" style=\"margin-top: 16px\">No skills found.</div> `\n : html`\n <div class=\"agent-skills-groups\" style=\"margin-top: 16px;\">\n ${groups.map((group) =>\n renderAgentSkillGroup(group, {\n agentId: params.agentId,\n allowSet,\n usingAllowlist,\n editable,\n onToggle: params.onToggle,\n }),\n )}\n </div>\n `}\n </section>\n `;\n}\n\nfunction renderAgentSkillGroup(\n group: SkillGroup,\n params: {\n agentId: string;\n allowSet: Set<string>;\n usingAllowlist: boolean;\n editable: boolean;\n onToggle: (agentId: string, skillName: string, enabled: boolean) => void;\n },\n) {\n const collapsedByDefault = group.id === \"workspace\" || group.id === \"built-in\";\n return html`\n <details class=\"agent-skills-group\" ?open=${!collapsedByDefault}>\n <summary class=\"agent-skills-header\">\n <span>${group.label}</span>\n <span class=\"muted\">${group.skills.length}</span>\n </summary>\n <div class=\"list skills-grid\">\n ${group.skills.map((skill) =>\n renderAgentSkillRow(skill, {\n agentId: params.agentId,\n allowSet: params.allowSet,\n usingAllowlist: params.usingAllowlist,\n editable: params.editable,\n onToggle: params.onToggle,\n }),\n )}\n </div>\n </details>\n `;\n}\n\nfunction renderAgentSkillRow(\n skill: SkillStatusEntry,\n params: {\n agentId: string;\n allowSet: Set<string>;\n usingAllowlist: boolean;\n editable: boolean;\n onToggle: (agentId: string, skillName: string, enabled: boolean) => void;\n },\n) {\n const enabled = params.usingAllowlist ? params.allowSet.has(skill.name) : true;\n const missing = computeSkillMissing(skill);\n const reasons = computeSkillReasons(skill);\n return html`\n <div class=\"list-item agent-skill-row\">\n <div class=\"list-main\">\n <div class=\"list-title\">${skill.emoji ? `${skill.emoji} ` : \"\"}${skill.name}</div>\n <div class=\"list-sub\">${skill.description}</div>\n ${renderSkillStatusChips({ skill })}\n ${missing.length > 0\n ? html`<div class=\"muted\" style=\"margin-top: 6px;\">Missing: ${missing.join(\", \")}</div>`\n : nothing}\n ${reasons.length > 0\n ? html`<div class=\"muted\" style=\"margin-top: 6px;\">Reason: ${reasons.join(\", \")}</div>`\n : nothing}\n </div>\n <div class=\"list-meta\">\n <label class=\"cfg-toggle\">\n <input\n type=\"checkbox\"\n .checked=${enabled}\n ?disabled=${!params.editable}\n @change=${(e: Event) =>\n params.onToggle(params.agentId, skill.name, (e.target as HTMLInputElement).checked)}\n />\n <span class=\"cfg-toggle__track\"></span>\n </label>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\nimport {\n KOVA_EMPLOYEES,\n type EmployeeAutonomy,\n} from \"../controllers/employees.ts\";\nimport type {\n AgentIdentityResult,\n AgentsFilesListResult,\n AgentsListResult,\n ChannelsStatusSnapshot,\n CronJob,\n CronStatus,\n ModelCatalogEntry,\n SkillStatusReport,\n ToolsCatalogResult,\n ToolsEffectiveResult,\n} from \"../types.ts\";\nimport { renderAgentOverview } from \"./agents-panels-overview.ts\";\nimport {\n renderAgentFiles,\n renderAgentChannels,\n renderAgentCron,\n} from \"./agents-panels-status-files.ts\";\nimport { renderAgentTools, renderAgentSkills } from \"./agents-panels-tools-skills.ts\";\nimport { agentBadgeText, buildAgentContext, normalizeAgentLabel } from \"./agents-utils.ts\";\n\nexport type AgentsPanel = \"overview\" | \"files\" | \"tools\" | \"skills\" | \"channels\" | \"cron\";\n\nexport type ConfigState = {\n form: Record<string, unknown> | null;\n loading: boolean;\n saving: boolean;\n dirty: boolean;\n};\n\nexport type ChannelsState = {\n snapshot: ChannelsStatusSnapshot | null;\n loading: boolean;\n error: string | null;\n lastSuccess: number | null;\n};\n\nexport type CronState = {\n status: CronStatus | null;\n jobs: CronJob[];\n loading: boolean;\n error: string | null;\n};\n\nexport type AgentFilesState = {\n list: AgentsFilesListResult | null;\n loading: boolean;\n error: string | null;\n active: string | null;\n contents: Record<string, string>;\n drafts: Record<string, string>;\n saving: boolean;\n};\n\nexport type AgentSkillsState = {\n report: SkillStatusReport | null;\n loading: boolean;\n error: string | null;\n agentId: string | null;\n filter: string;\n};\n\nexport type ToolsCatalogState = {\n loading: boolean;\n error: string | null;\n result: ToolsCatalogResult | null;\n};\n\nexport type ToolsEffectiveState = {\n loading: boolean;\n error: string | null;\n result: ToolsEffectiveResult | null;\n};\n\nexport type AgentsProps = {\n basePath: string;\n loading: boolean;\n error: string | null;\n agentsList: AgentsListResult | null;\n selectedAgentId: string | null;\n activePanel: AgentsPanel;\n config: ConfigState;\n channels: ChannelsState;\n cron: CronState;\n agentFiles: AgentFilesState;\n agentIdentityLoading: boolean;\n agentIdentityError: string | null;\n agentIdentityById: Record<string, AgentIdentityResult>;\n agentSoulContentById: Record<string, string | null>;\n agentSkills: AgentSkillsState;\n toolsCatalog: ToolsCatalogState;\n toolsEffective: ToolsEffectiveState;\n runtimeSessionKey: string;\n runtimeSessionMatchesSelectedAgent: boolean;\n modelCatalog: ModelCatalogEntry[];\n agentCreatorSuccess: string | null;\n onRefresh: () => void;\n onOpenAgentCreator: () => void;\n onSelectAgent: (agentId: string) => void;\n onSelectPanel: (panel: AgentsPanel) => void;\n onLoadFiles: (agentId: string) => void;\n onSelectFile: (name: string) => void;\n onFileDraftChange: (name: string, content: string) => void;\n onFileReset: (name: string) => void;\n onFileSave: (name: string) => void;\n onToolsProfileChange: (agentId: string, profile: string | null, clearAllow: boolean) => void;\n onToolsOverridesChange: (agentId: string, alsoAllow: string[], deny: string[]) => void;\n onConfigReload: () => void;\n onConfigSave: () => void;\n onModelChange: (agentId: string, modelId: string | null) => void;\n onModelFallbacksChange: (agentId: string, fallbacks: string[]) => void;\n onChannelsRefresh: () => void;\n onCronRefresh: () => void;\n onCronRunNow: (jobId: string) => void;\n onSkillsFilterChange: (next: string) => void;\n onSkillsRefresh: () => void;\n onAgentSkillToggle: (agentId: string, skillName: string, enabled: boolean) => void;\n onAgentSkillsClear: (agentId: string) => void;\n onAgentSkillsDisableAll: (agentId: string) => void;\n onSetDefault: (agentId: string) => void;\n onNavigateToChat: (agentId: string) => void;\n onNavigateToActivity: (agentId: string) => void;\n};\n\nexport function renderAgents(props: AgentsProps) {\n const agents = props.agentsList?.agents ?? [];\n const defaultId = props.agentsList?.defaultId ?? null;\n const selectedId = props.selectedAgentId ?? defaultId ?? agents[0]?.id ?? null;\n const selectedAgent = selectedId\n ? (agents.find((agent) => agent.id === selectedId) ?? null)\n : null;\n const kovaAgents = buildKovaAgents(agents, props.agentIdentityById, props.agentSoulContentById);\n const systemAgent = agents.find((agent) => agent.id === \"main\") ?? null;\n const otherAgents = agents.filter(\n (agent) => agent.id !== \"main\" && !isKovaAgent(agent.id, props.agentSoulContentById[agent.id]),\n );\n const selectedSkillCount =\n selectedId && props.agentSkills.agentId === selectedId\n ? (props.agentSkills.report?.skills?.length ?? null)\n : null;\n\n const channelEntryCount = props.channels.snapshot\n ? Object.keys(props.channels.snapshot.channelAccounts ?? {}).length\n : null;\n const cronJobCount = selectedId\n ? props.cron.jobs.filter((j) => j.agentId === selectedId).length\n : null;\n const tabCounts: Record<string, number | null> = {\n files: props.agentFiles.list?.files?.length ?? null,\n skills: selectedSkillCount,\n channels: channelEntryCount,\n cron: cronJobCount || null,\n };\n\n return html`\n <div class=\"agents-layout\">\n <section class=\"card agents-toolbar agents-toolbar--kova\">\n <div class=\"agents-toolbar-row\">\n <div>\n <div class=\"card-title\">Kova Employees</div>\n <div class=\"card-sub\">\n Choose a teammate, jump into chat, or inspect their agent workspace below.\n </div>\n </div>\n <div class=\"agents-toolbar-actions\">\n ${selectedAgent\n ? html`\n <button\n type=\"button\"\n class=\"btn btn--sm btn--ghost\"\n @click=${() => void navigator.clipboard.writeText(selectedAgent.id)}\n title=\"Copy agent ID to clipboard\"\n >\n Copy ID\n </button>\n <button\n type=\"button\"\n class=\"btn btn--sm btn--ghost\"\n ?disabled=${Boolean(defaultId && selectedAgent.id === defaultId)}\n @click=${() => props.onSetDefault(selectedAgent.id)}\n title=${defaultId && selectedAgent.id === defaultId\n ? \"Already the default agent\"\n : \"Set as the default agent\"}\n >\n ${defaultId && selectedAgent.id === defaultId ? \"Default\" : \"Set Default\"}\n </button>\n `\n : nothing}\n <button\n class=\"btn btn--sm agents-refresh-btn\"\n ?disabled=${props.loading}\n @click=${props.onRefresh}\n >\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n </div>\n ${props.error ? html`<div class=\"callout danger\">${props.error}</div>` : nothing}\n </section>\n\n <section class=\"agents-section\">\n <div\n class=\"agents-section__header\"\n style=\"display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap;\"\n >\n <div>\n <div class=\"card-title\">Kova Team</div>\n <div class=\"card-sub\">All Kova employees and custom teammates live here.</div>\n </div>\n <button type=\"button\" class=\"btn btn--sm primary\" @click=${props.onOpenAgentCreator}>\n + New Employee\n </button>\n </div>\n ${props.agentCreatorSuccess\n ? html`<div class=\"callout success\" style=\"margin-top: 12px;\">${props.agentCreatorSuccess}</div>`\n : nothing}\n ${kovaAgents.length === 0\n ? html`<div class=\"card\" style=\"margin-top: 12px;\">\n <div class=\"card-sub\">No Kova employees are available yet.</div>\n </div>`\n : html`<div class=\"agents-employee-grid\">\n ${kovaAgents.map((meta) =>\n renderEmployeeCard({\n meta,\n selectedId,\n defaultId,\n onSelectAgent: props.onSelectAgent,\n onNavigateToChat: props.onNavigateToChat,\n onNavigateToActivity: props.onNavigateToActivity,\n }),\n )}\n </div>`}\n </section>\n\n <section class=\"agents-section\">\n <div class=\"agents-section__header\">\n <div class=\"card-title\">System</div>\n <div class=\"card-sub\">The default Kova Core Agent lives here.</div>\n </div>\n ${systemAgent\n ? renderSystemCard({\n agent: systemAgent,\n selectedId,\n defaultId,\n onSelectAgent: props.onSelectAgent,\n })\n : html`\n <div class=\"card agents-system-card agents-system-card--empty\">\n <div class=\"card-sub\">The <code>main</code> agent is not available in the current list.</div>\n </div>\n `}\n </section>\n\n ${otherAgents.length > 0\n ? html`\n <section class=\"agents-section\">\n <div class=\"agents-section__header\">\n <div class=\"card-title\">Other Agents</div>\n <div class=\"card-sub\">Any additional configured agents stay available here.</div>\n </div>\n <div class=\"agents-other-grid\">\n ${otherAgents.map((agent) =>\n renderOtherAgentCard({\n agent,\n selectedId,\n defaultId,\n onSelectAgent: props.onSelectAgent,\n }),\n )}\n </div>\n </section>\n `\n : nothing}\n\n <section class=\"agents-main\">\n ${!selectedAgent\n ? html`\n <div class=\"card\">\n <div class=\"card-title\">Select an agent</div>\n <div class=\"card-sub\">Pick an agent above to inspect its workspace and tools.</div>\n </div>\n `\n : html`\n ${renderAgentTabs(\n props.activePanel,\n (panel) => props.onSelectPanel(panel),\n tabCounts,\n )}\n ${props.activePanel === \"overview\"\n ? renderAgentOverview({\n agent: selectedAgent,\n basePath: props.basePath,\n defaultId,\n configForm: props.config.form,\n agentFilesList: props.agentFiles.list,\n agentIdentity: props.agentIdentityById[selectedAgent.id] ?? null,\n agentIdentityError: props.agentIdentityError,\n agentIdentityLoading: props.agentIdentityLoading,\n configLoading: props.config.loading,\n configSaving: props.config.saving,\n configDirty: props.config.dirty,\n modelCatalog: props.modelCatalog,\n onConfigReload: props.onConfigReload,\n onConfigSave: props.onConfigSave,\n onModelChange: props.onModelChange,\n onModelFallbacksChange: props.onModelFallbacksChange,\n onSelectPanel: props.onSelectPanel,\n })\n : nothing}\n ${props.activePanel === \"files\"\n ? renderAgentFiles({\n agentId: selectedAgent.id,\n agentFilesList: props.agentFiles.list,\n agentFilesLoading: props.agentFiles.loading,\n agentFilesError: props.agentFiles.error,\n agentFileActive: props.agentFiles.active,\n agentFileContents: props.agentFiles.contents,\n agentFileDrafts: props.agentFiles.drafts,\n agentFileSaving: props.agentFiles.saving,\n onLoadFiles: props.onLoadFiles,\n onSelectFile: props.onSelectFile,\n onFileDraftChange: props.onFileDraftChange,\n onFileReset: props.onFileReset,\n onFileSave: props.onFileSave,\n })\n : nothing}\n ${props.activePanel === \"tools\"\n ? renderAgentTools({\n agentId: selectedAgent.id,\n configForm: props.config.form,\n configLoading: props.config.loading,\n configSaving: props.config.saving,\n configDirty: props.config.dirty,\n toolsCatalogLoading: props.toolsCatalog.loading,\n toolsCatalogError: props.toolsCatalog.error,\n toolsCatalogResult: props.toolsCatalog.result,\n toolsEffectiveLoading: props.toolsEffective.loading,\n toolsEffectiveError: props.toolsEffective.error,\n toolsEffectiveResult: props.toolsEffective.result,\n runtimeSessionKey: props.runtimeSessionKey,\n runtimeSessionMatchesSelectedAgent: props.runtimeSessionMatchesSelectedAgent,\n onProfileChange: props.onToolsProfileChange,\n onOverridesChange: props.onToolsOverridesChange,\n onConfigReload: props.onConfigReload,\n onConfigSave: props.onConfigSave,\n })\n : nothing}\n ${props.activePanel === \"skills\"\n ? renderAgentSkills({\n agentId: selectedAgent.id,\n report: props.agentSkills.report,\n loading: props.agentSkills.loading,\n error: props.agentSkills.error,\n activeAgentId: props.agentSkills.agentId,\n configForm: props.config.form,\n configLoading: props.config.loading,\n configSaving: props.config.saving,\n configDirty: props.config.dirty,\n filter: props.agentSkills.filter,\n onFilterChange: props.onSkillsFilterChange,\n onRefresh: props.onSkillsRefresh,\n onToggle: props.onAgentSkillToggle,\n onClear: props.onAgentSkillsClear,\n onDisableAll: props.onAgentSkillsDisableAll,\n onConfigReload: props.onConfigReload,\n onConfigSave: props.onConfigSave,\n })\n : nothing}\n ${props.activePanel === \"channels\"\n ? renderAgentChannels({\n context: buildAgentContext(\n selectedAgent,\n props.config.form,\n props.agentFiles.list,\n defaultId,\n props.agentIdentityById[selectedAgent.id] ?? null,\n ),\n configForm: props.config.form,\n snapshot: props.channels.snapshot,\n loading: props.channels.loading,\n error: props.channels.error,\n lastSuccess: props.channels.lastSuccess,\n onRefresh: props.onChannelsRefresh,\n onSelectPanel: props.onSelectPanel,\n })\n : nothing}\n ${props.activePanel === \"cron\"\n ? renderAgentCron({\n context: buildAgentContext(\n selectedAgent,\n props.config.form,\n props.agentFiles.list,\n defaultId,\n props.agentIdentityById[selectedAgent.id] ?? null,\n ),\n agentId: selectedAgent.id,\n jobs: props.cron.jobs,\n status: props.cron.status,\n loading: props.cron.loading,\n error: props.cron.error,\n onRefresh: props.onCronRefresh,\n onRunNow: props.onCronRunNow,\n onSelectPanel: props.onSelectPanel,\n })\n : nothing}\n `}\n </section>\n </div>\n `;\n}\n\nfunction renderEmployeeCard(args: {\n meta: {\n id: string;\n name: string;\n role: string;\n avatar: string;\n autonomy: EmployeeAutonomy;\n agent: AgentsListResult[\"agents\"][number];\n };\n selectedId: string | null;\n defaultId: string | null;\n onSelectAgent: (agentId: string) => void;\n onNavigateToChat: (agentId: string) => void;\n onNavigateToActivity: (agentId: string) => void;\n}) {\n const { meta, selectedId, defaultId } = args;\n const isSelected = selectedId === meta.agent.id;\n const isDefault = defaultId === meta.agent.id;\n const badge = autonomyBadgeClass(meta.autonomy);\n return html`\n <article\n class=\"card agents-employee-card ${isSelected ? \"is-selected\" : \"\"}\"\n @click=${() => args.onSelectAgent(meta.agent.id)}\n >\n <div class=\"agents-employee-card__header\">\n <div class=\"agents-employee-card__avatar\">${meta.avatar}</div>\n <div class=\"agents-employee-card__identity\">\n <div class=\"agents-employee-card__name-row\">\n <div class=\"agents-employee-card__name\">${meta.name}</div>\n ${isDefault ? html`<span class=\"agents-chip\">Default</span>` : nothing}\n ${isSelected ? html`<span class=\"agents-chip agents-chip--selected\">Selected</span>` : nothing}\n </div>\n <div class=\"agents-employee-card__role\">${meta.role}</div>\n </div>\n </div>\n <div class=\"agents-employee-card__meta-row\">\n <span class=\"agents-autonomy-badge ${badge}\">${meta.autonomy}</span>\n <span class=\"agents-employee-card__agent-id\">${meta.agent.id}</span>\n </div>\n <div class=\"agents-employee-card__actions\">\n <button\n type=\"button\"\n class=\"btn btn--sm\"\n @click=${(event: MouseEvent) => {\n event.stopPropagation();\n args.onNavigateToChat(meta.agent.id);\n }}\n >\n Chat\n </button>\n <button\n type=\"button\"\n class=\"btn btn--sm btn--ghost\"\n @click=${(event: MouseEvent) => {\n event.stopPropagation();\n args.onNavigateToActivity(meta.agent.id);\n }}\n >\n Activity\n </button>\n </div>\n </article>\n `;\n}\n\nfunction renderSystemCard(args: {\n agent: AgentsListResult[\"agents\"][number];\n selectedId: string | null;\n defaultId: string | null;\n onSelectAgent: (agentId: string) => void;\n}) {\n const { agent, selectedId, defaultId } = args;\n const selected = agent.id === selectedId;\n const badge = agentBadgeText(agent.id, defaultId);\n return html`\n <article\n class=\"card agents-system-card ${selected ? \"is-selected\" : \"\"}\"\n @click=${() => args.onSelectAgent(agent.id)}\n >\n <div class=\"agents-system-card__content\">\n <div class=\"agents-system-card__icon\">⚙️</div>\n <div>\n <div class=\"agents-system-card__title-row\">\n <div class=\"agents-system-card__title\">${normalizeAgentLabel(agent)}</div>\n ${badge ? html`<span class=\"agents-chip\">${badge}</span>` : nothing}\n </div>\n <div class=\"agents-system-card__sub\">Kova Core</div>\n </div>\n </div>\n <button type=\"button\" class=\"btn btn--sm btn--ghost\">Inspect</button>\n </article>\n `;\n}\n\nfunction renderOtherAgentCard(args: {\n agent: AgentsListResult[\"agents\"][number];\n selectedId: string | null;\n defaultId: string | null;\n onSelectAgent: (agentId: string) => void;\n}) {\n const { agent, selectedId, defaultId } = args;\n const selected = agent.id === selectedId;\n const badge = agentBadgeText(agent.id, defaultId);\n return html`\n <article class=\"card agents-other-card ${selected ? \"is-selected\" : \"\"}\">\n <div>\n <div class=\"agents-other-card__title-row\">\n <div class=\"agents-other-card__title\">${normalizeAgentLabel(agent)}</div>\n ${badge ? html`<span class=\"agents-chip\">${badge}</span>` : nothing}\n </div>\n <div class=\"agents-other-card__sub\">${agent.id}</div>\n </div>\n <button type=\"button\" class=\"btn btn--sm btn--ghost\" @click=${() => args.onSelectAgent(agent.id)}>\n Inspect\n </button>\n </article>\n `;\n}\n\nfunction autonomyBadgeClass(autonomy: EmployeeAutonomy) {\n switch (autonomy) {\n case \"Supervised\":\n return \"agents-autonomy-badge--supervised\";\n case \"Autonomous\":\n return \"agents-autonomy-badge--autonomous\";\n default:\n return \"agents-autonomy-badge--act-notify\";\n }\n}\n\ntype ParsedKovaSoul = {\n kova: boolean;\n name?: string;\n role?: string;\n emoji?: string;\n autonomy?: EmployeeAutonomy;\n};\n\nfunction buildKovaAgents(\n agents: AgentsListResult[\"agents\"],\n identityById: Record<string, AgentIdentityResult>,\n soulContentById: Record<string, string | null>,\n) {\n const builtInOrder = new Map(KOVA_EMPLOYEES.map((employee, index) => [employee.id, index] as const));\n return agents\n .filter((agent) => agent.id !== \"main\" && isKovaAgent(agent.id, soulContentById[agent.id]))\n .map((agent) => {\n const builtIn = KOVA_EMPLOYEES.find((employee) => employee.id === agent.id);\n const identity = identityById[agent.id];\n const soul = parseKovaSoul(soulContentById[agent.id]);\n return {\n id: agent.id,\n name: soul?.name ?? identity?.name ?? builtIn?.name ?? normalizeAgentLabel(agent),\n role: soul?.role ?? builtIn?.role ?? \"Kova Employee\",\n avatar: soul?.emoji ?? identity?.emoji ?? builtIn?.avatar ?? \"\\u{1F916}\",\n autonomy: soul?.autonomy ?? builtIn?.autonomy ?? \"Act + Notify\",\n agent,\n order: builtInOrder.get(agent.id) ?? KOVA_EMPLOYEES.length,\n };\n })\n .toSorted((left, right) =>\n left.order === right.order ? left.name.localeCompare(right.name) : left.order - right.order,\n );\n}\n\nfunction isKovaAgent(agentId: string, soulContent: string | null | undefined): boolean {\n return agentId.startsWith(\"kova-\") || parseKovaSoul(soulContent)?.kova === true;\n}\n\nfunction parseKovaSoul(content: string | null | undefined): ParsedKovaSoul | null {\n if (!content) {\n return null;\n }\n const frontmatterMatch = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/);\n const frontmatter = frontmatterMatch?.[1] ?? \"\";\n const body = frontmatterMatch ? content.slice(frontmatterMatch[0].length) : content;\n const result: ParsedKovaSoul = { kova: false };\n\n for (const line of frontmatter.split(/\\r?\\n/)) {\n const separator = line.indexOf(\":\");\n if (separator < 0) {\n continue;\n }\n const key = line.slice(0, separator).trim().toLowerCase();\n const rawValue = line.slice(separator + 1).trim();\n const value = unquoteFrontmatterValue(rawValue);\n switch (key) {\n case \"kova\":\n result.kova = /^(true|1|yes)$/i.test(value);\n break;\n case \"name\":\n result.name = value || undefined;\n break;\n case \"role\":\n result.role = value || undefined;\n break;\n case \"emoji\":\n result.emoji = value || undefined;\n break;\n case \"autonomy\":\n result.autonomy = parseAutonomyValue(value) ?? result.autonomy;\n break;\n default:\n break;\n }\n }\n\n const headingMatch = body.match(/^#\\s+(\\S+)\\s+(.+?)\\s+[—-]\\s+(.+)$/m);\n if (headingMatch) {\n result.emoji ??= headingMatch[1]?.trim() || undefined;\n result.name ??= headingMatch[2]?.trim() || undefined;\n result.role ??= headingMatch[3]?.trim() || undefined;\n }\n\n const autonomyMatch = body.match(/^Level:\\s*(.+)$/m);\n if (autonomyMatch) {\n result.autonomy ??= parseAutonomyValue(autonomyMatch[1]);\n }\n\n return result;\n}\n\nfunction unquoteFrontmatterValue(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n try {\n return JSON.parse(value);\n } catch {\n return value.slice(1, -1);\n }\n }\n return value;\n}\n\nfunction parseAutonomyValue(value: string | undefined): EmployeeAutonomy | undefined {\n const normalized = value?.trim().toLowerCase();\n switch (normalized) {\n case \"1\":\n case \"supervised\":\n return \"Supervised\";\n case \"2\":\n case \"act + notify\":\n case \"act+notify\":\n case \"act-notify\":\n return \"Act + Notify\";\n case \"3\":\n case \"autonomous\":\n return \"Autonomous\";\n default:\n return undefined;\n }\n}\n\nfunction renderAgentTabs(\n active: AgentsPanel,\n onSelect: (panel: AgentsPanel) => void,\n counts: Record<string, number | null>,\n) {\n const tabs: Array<{ id: AgentsPanel; label: string }> = [\n { id: \"overview\", label: \"Overview\" },\n { id: \"files\", label: \"Files\" },\n { id: \"tools\", label: \"Tools\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"channels\", label: \"Channels\" },\n { id: \"cron\", label: \"Cron Jobs\" },\n ];\n return html`\n <div class=\"agent-tabs\">\n ${tabs.map(\n (tab) => html`\n <button\n class=\"agent-tab ${active === tab.id ? \"active\" : \"\"}\"\n type=\"button\"\n @click=${() => onSelect(tab.id)}\n >\n ${tab.label}${counts[tab.id] != null\n ? html`<span class=\"agent-tab-count\">${counts[tab.id]}</span>`\n : nothing}\n </button>\n `,\n )}\n </div>\n `;\n}\n"],"file":"agents-CLtFQRXd.js"}