diff --git a/docs/features/agent.md b/docs/features/agent.md index cc3c90be2..d06e95b2a 100644 --- a/docs/features/agent.md +++ b/docs/features/agent.md @@ -96,7 +96,8 @@ src/admin/pages/site/agent/ ├── pageContext.ts — editor adapter: reads active page + store scalars, calls `buildSiteAgentSnapshot` ├── executor.ts — browser-side dispatcher: validates + runs write tools; auto-navigates canvas to node's owning document before each write ├── cssTools.ts — site_apply_css parser + exact-selector merge/replace/delete runners -├── documentTools.ts — list/read/open document helpers for pages, templates, and visual components +├── documentTools.ts — list/read/open document helpers for pages, templates, and visual components, plus active-document node lookup +├── htmlTools.ts — site_insert_html / site_replace_node_html runners and the stripped / head-only import notices (split from executor.ts) ├── tokenRunners.ts — site_set_color_tokens / site_set_font_tokens / site_set_type_scale / site_set_spacing_scale runners (split from executor.ts) ├── renderEvidence.ts — captureAgentRenderSnapshot (site_render_snapshot tool) ├── storeRef.ts — setAgentStoreApi / getAgentStoreApi (avoids store ↔ executor cycle) @@ -580,6 +581,7 @@ Drivers that support explicit prompt-cache controls (Anthropic) apply `cache_con - **Design system first.** Establish or reuse tokens before/while building (`site_set_color_tokens`, `site_set_type_scale`, `site_set_spacing_scale`, `site_set_font_tokens`), then reference them in CSS (`var(--)`, `var(--text-l)`, `var(--space-m)`, `var(--)`) instead of raw hex/px/font-family. The dynamic suffix's `Tokens —` line shows what already exists; `(none …)` means no design system yet. - Structure as HTML (`site_insert_html` / `site_replace_node_html`); style with CSS in the same payload — a `

hi

', + ) + expect(result.stripped.scripts).toBe(1) + expect(result.styleCss).toContain('.a') + expect(result.headOnly).toEqual(['meta']) + expect(result.rootIds).toHaveLength(1) + }) + + it('is empty for ordinary body markup', () => { + expect(importHtml('

Hi

').headOnly).toEqual([]) + }) +}) diff --git a/src/admin/modals/ImportHtml/ImportHtmlModal.tsx b/src/admin/modals/ImportHtml/ImportHtmlModal.tsx index d46178030..03ee6950a 100644 --- a/src/admin/modals/ImportHtml/ImportHtmlModal.tsx +++ b/src/admin/modals/ImportHtml/ImportHtmlModal.tsx @@ -267,11 +267,14 @@ export function ImportHtmlModal() { if (rules.length) { detailParts.push(`${rules.length} CSS selector${rules.length > 1 ? 's' : ''}`) } - const { stripped } = result + const { stripped, headOnly } = result if (stripped.scripts) detailParts.push(`stripped ${stripped.scripts}