markform 0.1.24 → 0.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -31
- package/dist/ai-sdk.d.mts +1 -1
- package/dist/ai-sdk.mjs +2 -2
- package/dist/bin.mjs +1 -1
- package/dist/{cli-B1DhFYBS.mjs → cli-B1T8kMFt.mjs} +85 -40
- package/dist/cli-B1T8kMFt.mjs.map +1 -0
- package/dist/cli.mjs +1 -1
- package/dist/{coreTypes-GxzWNXap.d.mts → coreTypes-CxpqKpBA.d.mts} +45 -2
- package/dist/{coreTypes-CctFK6uE.mjs → coreTypes-DIv9Aabl.mjs} +19 -5
- package/dist/coreTypes-DIv9Aabl.mjs.map +1 -0
- package/dist/{fillRecord-DeqI2pQ5.d.mts → fillRecord-V3vlyobd.d.mts} +5 -1
- package/dist/{fillRecordRenderer-VBQ2vwPV.mjs → fillRecordRenderer-BqRPHPmE.mjs} +47 -15
- package/dist/fillRecordRenderer-BqRPHPmE.mjs.map +1 -0
- package/dist/index.d.mts +32 -4
- package/dist/index.mjs +4 -4
- package/dist/{prompts-BCnYaH4_.mjs → prompts-DaPKumGY.mjs} +114 -11
- package/dist/prompts-DaPKumGY.mjs.map +1 -0
- package/dist/render.d.mts +2 -2
- package/dist/render.mjs +1 -1
- package/dist/{session-BLjN3BkJ.mjs → session-BW9jtYNV.mjs} +2 -2
- package/dist/{session-BLjN3BkJ.mjs.map → session-BW9jtYNV.mjs.map} +1 -1
- package/dist/{session-D7C7IlEv.mjs → session-DHyTMP67.mjs} +1 -1
- package/dist/{shared-DtorFV21.mjs → shared-BLh342F5.mjs} +1 -1
- package/dist/{shared-CuSRYcIB.mjs → shared-BszoSkAO.mjs} +8 -8
- package/dist/{shared-CuSRYcIB.mjs.map → shared-BszoSkAO.mjs.map} +1 -1
- package/dist/{src-C5OWf1dL.mjs → src-DrXmaOWl.mjs} +155 -27
- package/dist/src-DrXmaOWl.mjs.map +1 -0
- package/docs/markform-apis.md +19 -7
- package/docs/markform-reference.md +247 -178
- package/docs/markform-spec.md +81 -33
- package/docs/skill/SKILL.md +62 -20
- package/examples/markform-demo-playbook.md +342 -0
- package/examples/parallel/parallel-research.form.md +2 -6
- package/examples/simple/simple-mock-filled.report.md +2 -2
- package/examples/simple/simple-skipped-filled.report.md +2 -2
- package/examples/twitter-thread/twitter-thread.form.md +5 -5
- package/package.json +1 -1
- package/dist/cli-B1DhFYBS.mjs.map +0 -1
- package/dist/coreTypes-CctFK6uE.mjs.map +0 -1
- package/dist/fillRecordRenderer-VBQ2vwPV.mjs.map +0 -1
- package/dist/prompts-BCnYaH4_.mjs.map +0 -1
- package/dist/src-C5OWf1dL.mjs.map +0 -1
- package/examples/startup-research/startup-research-mock-filled.form.md +0 -297
- package/examples/startup-research/startup-research.form.md +0 -181
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"coreTypes-CctFK6uE.mjs","names":[],"sources":["../src/engine/coreTypes.ts"],"sourcesContent":["/**\n * Core types and Zod schemas for Markform.\n *\n * This module defines all TypeScript types and their corresponding Zod schemas\n * for forms, fields, values, validation, patches, and session transcripts.\n */\n\nimport { z } from 'zod';\n\n// =============================================================================\n// Basic Types\n// =============================================================================\n\n/** Form/group/field ID - globally unique within a document */\nexport type Id = string;\n\n/** Option ID - unique within its containing field */\nexport type OptionId = string;\n\n/** Qualified option reference - used in doc blocks and external references */\nexport type QualifiedOptionRef = `${Id}.${OptionId}`;\n\n/** Qualified column reference - used in table field references (e.g., \"team.name\") */\nexport type QualifiedColumnRef = `${Id}.${Id}`;\n\n/** Validator reference - simple ID or parameterized object */\nexport type ValidatorRef = string | { id: string; [key: string]: unknown };\n\n// =============================================================================\n// Answer State Types (markform-255)\n// =============================================================================\n\n/**\n * Answer state for a field.\n * What action was taken: no answer yet, answered, skipped, or aborted.\n */\nexport type AnswerState = 'unanswered' | 'answered' | 'skipped' | 'aborted';\n\n/**\n * Field response: combines answer state with optional value.\n * Used in responsesByFieldId for all fields.\n */\nexport interface FieldResponse {\n state: AnswerState;\n value?: FieldValue; // present only when state === 'answered'\n reason?: string; // present when state === 'skipped' or 'aborted'\n}\n\n// =============================================================================\n// Note Types (markform-205)\n// =============================================================================\n\n/** Unique note ID (implementation uses n1, n2, n3...) */\nexport type NoteId = string;\n\n/** Note attached to a field, group, or form */\nexport interface Note {\n id: NoteId;\n ref: Id; // target ID (field, group, or form)\n role: string; // who created (agent, user, ...)\n text: string; // markdown content\n}\n\n// =============================================================================\n// Checkbox Types\n// =============================================================================\n\n/** Multi-checkbox states (checkboxMode=\"multi\", default) - 5 states */\nexport type MultiCheckboxState = 'todo' | 'done' | 'incomplete' | 'active' | 'na';\n\n/** Simple checkbox states (checkboxMode=\"simple\") - 2 states, GFM-compatible */\nexport type SimpleCheckboxState = 'todo' | 'done';\n\n/** Explicit checkbox values (checkboxMode=\"explicit\") - requires yes/no answer */\nexport type ExplicitCheckboxValue = 'unfilled' | 'yes' | 'no';\n\n/** Union type for all checkbox values */\nexport type CheckboxValue = MultiCheckboxState | ExplicitCheckboxValue;\n\n/** Checkbox mode determines which states are valid */\nexport type CheckboxMode = 'multi' | 'simple' | 'explicit';\n\n/**\n * Controls how fill handles existing values for target role fields.\n * - 'continue': Skip fields that already have values (default)\n * - 'overwrite': Clear and re-fill all fields for the target role\n */\nexport type FillMode = 'continue' | 'overwrite';\n\n/**\n * Agent mode for fill operations.\n * - 'mock': Use mock agent (for testing, requires mock source file)\n * - 'live': Use live LLM agent (default, requires model)\n */\nexport type MockMode = 'mock' | 'live';\n\n/**\n * Controls whether a checkbox field acts as a blocking checkpoint.\n * - 'none': No blocking behavior (default)\n * - 'blocking': Fields after this cannot be filled until checkbox is complete\n */\nexport type ApprovalMode = 'none' | 'blocking';\n\n// =============================================================================\n// Field Kinds\n// =============================================================================\n\n/** Field kind discriminant */\nexport type FieldKind =\n | 'string'\n | 'number'\n | 'string_list'\n | 'checkboxes'\n | 'single_select'\n | 'multi_select'\n | 'url'\n | 'url_list'\n | 'date'\n | 'year'\n | 'table';\n\n// =============================================================================\n// Table Field Definitions\n// =============================================================================\n\n/** Base column type for table cells - simple types only */\nexport type ColumnTypeName = 'string' | 'number' | 'url' | 'date' | 'year';\n\n/**\n * Column type specification in attributes.\n * Can be a simple string or an object with required flag.\n */\nexport type ColumnTypeSpec = ColumnTypeName | { type: ColumnTypeName; required: boolean };\n\n/**\n * Column definition - derived from columnIds, columnLabels, columnTypes attributes.\n * After parsing, columns always have explicit required flag (default: false).\n */\nexport interface TableColumn {\n id: Id; // from columnIds array\n label: string; // from columnLabels array (defaults to id)\n type: ColumnTypeName; // from columnTypes array (defaults to 'string')\n required: boolean; // from columnTypes object or default false\n}\n\n/** Field priority level for issue scoring */\nexport type FieldPriorityLevel = 'high' | 'medium' | 'low';\n\n/** Base interface for all field kinds */\nexport interface FieldBase {\n id: Id;\n label: string;\n required: boolean; // explicit: parser defaults to false if not specified\n priority: FieldPriorityLevel; // explicit: parser defaults to 'medium' if not specified\n role: string; // explicit: parser defaults to AGENT_ROLE if not specified\n validate?: ValidatorRef[];\n /** Whether to include this field in report output. Default: true */\n report?: boolean;\n /** Hint text for empty field (text-entry fields only) */\n placeholder?: string;\n /** Example values (text-entry fields only) */\n examples?: string[];\n /** True for auto-generated implicit fields (e.g., 'checkboxes' for plan documents) */\n implicit?: boolean;\n /** Parallel batch identifier. Top-level fields only. */\n parallel?: string;\n /** Fill order. Lower values filled first. Default: 0. */\n order?: number;\n}\n\n// =============================================================================\n// Field Kind Categories\n// =============================================================================\n\n/** Field kinds that accept text entry (support placeholder/examples) */\nexport const TEXT_ENTRY_FIELD_KINDS = [\n 'string',\n 'number',\n 'string_list',\n 'url',\n 'url_list',\n] as const;\n\n/** Field kinds that are choosers (do NOT support placeholder/examples) */\nexport const CHOOSER_FIELD_KINDS = ['single_select', 'multi_select', 'checkboxes'] as const;\n\n/**\n * Check if a field kind accepts text entry (supports placeholder/examples).\n */\nexport function isTextEntryFieldKind(kind: FieldKind): boolean {\n return (TEXT_ENTRY_FIELD_KINDS as readonly string[]).includes(kind);\n}\n\n/** String field - single or multiline text */\nexport interface StringField extends FieldBase {\n kind: 'string';\n multiline?: boolean;\n pattern?: string;\n minLength?: number;\n maxLength?: number;\n}\n\n/** Number field - numeric value with optional constraints */\nexport interface NumberField extends FieldBase {\n kind: 'number';\n min?: number;\n max?: number;\n integer?: boolean;\n}\n\n/** String list field - array of user-provided strings */\nexport interface StringListField extends FieldBase {\n kind: 'string_list';\n minItems?: number;\n maxItems?: number;\n itemMinLength?: number;\n itemMaxLength?: number;\n uniqueItems?: boolean;\n}\n\n/** Option in select/checkbox fields */\nexport interface Option {\n id: Id;\n label: string;\n}\n\n/** Checkboxes field - stateful checklist with configurable modes */\nexport interface CheckboxesField extends FieldBase {\n kind: 'checkboxes';\n checkboxMode: CheckboxMode; // explicit: parser defaults to 'multi' if not specified\n minDone?: number;\n options: Option[];\n approvalMode: ApprovalMode; // explicit: parser defaults to 'none' if not specified\n}\n\n/** Single-select field - exactly one option can be selected */\nexport interface SingleSelectField extends FieldBase {\n kind: 'single_select';\n options: Option[];\n}\n\n/** Multi-select field - multiple options can be selected */\nexport interface MultiSelectField extends FieldBase {\n kind: 'multi_select';\n options: Option[];\n minSelections?: number;\n maxSelections?: number;\n}\n\n/** URL field - single URL value with built-in format validation */\nexport interface UrlField extends FieldBase {\n kind: 'url';\n // No additional constraints - URL format validation is built-in\n}\n\n/** URL list field - multiple URLs (for citations, sources, references) */\nexport interface UrlListField extends FieldBase {\n kind: 'url_list';\n minItems?: number;\n maxItems?: number;\n uniqueItems?: boolean;\n}\n\n/** Date field - ISO 8601 date (YYYY-MM-DD) with optional min/max constraints */\nexport interface DateField extends FieldBase {\n kind: 'date';\n min?: string; // ISO 8601 date string (YYYY-MM-DD)\n max?: string; // ISO 8601 date string (YYYY-MM-DD)\n}\n\n/** Year field - integer year with optional min/max constraints */\nexport interface YearField extends FieldBase {\n kind: 'year';\n min?: number; // minimum year (inclusive)\n max?: number; // maximum year (inclusive)\n}\n\n/**\n * Table field - structured tabular data with typed columns.\n * Inherits all FieldBase properties including `report?: boolean`.\n */\nexport interface TableField extends FieldBase {\n kind: 'table';\n columns: TableColumn[]; // column definitions in order\n minRows?: number;\n maxRows?: number;\n}\n\n/** Union of all field kinds */\nexport type Field =\n | StringField\n | NumberField\n | StringListField\n | CheckboxesField\n | SingleSelectField\n | MultiSelectField\n | UrlField\n | UrlListField\n | DateField\n | YearField\n | TableField;\n\n// =============================================================================\n// Form Structure Types\n// =============================================================================\n\n/**\n * Field group: container for fields (nested groups deferred to future).\n */\nexport interface FieldGroup {\n id: Id;\n title?: string;\n validate?: ValidatorRef[];\n children: Field[];\n /** Whether to include this group in report output. Default: true */\n report?: boolean;\n /**\n * True if this group was implicitly created for fields placed directly\n * under the form (not wrapped in an explicit group).\n * Implicit groups are serialized without group wrapper tags.\n */\n implicit?: boolean;\n /** Parallel batch identifier. */\n parallel?: string;\n /** Fill order. Lower values filled first. Default: 0. */\n order?: number;\n}\n\n// =============================================================================\n// Execution Plan Types\n// =============================================================================\n\n/** An item in an execution plan (a top-level field or group). */\nexport interface ExecutionPlanItem {\n itemId: Id;\n itemType: 'field' | 'group';\n order: number;\n}\n\n/** A parallel batch: items that can execute concurrently. */\nexport interface ParallelBatch {\n batchId: string;\n items: ExecutionPlanItem[];\n}\n\n/** Execution plan: partitions form into loose-serial pool + parallel batches. */\nexport interface ExecutionPlan {\n looseSerial: ExecutionPlanItem[];\n parallelBatches: ParallelBatch[];\n /** Distinct order levels found in the form, sorted ascending. */\n orderLevels: number[];\n}\n\n/** Form schema - root container with groups */\nexport interface FormSchema {\n id: Id;\n title?: string;\n description?: string;\n groups: FieldGroup[];\n}\n\n// =============================================================================\n// Field Value Types\n// =============================================================================\n\n/** String field value */\nexport interface StringValue {\n kind: 'string';\n value: string | null;\n}\n\n/** Number field value */\nexport interface NumberValue {\n kind: 'number';\n value: number | null;\n}\n\n/** String list field value */\nexport interface StringListValue {\n kind: 'string_list';\n items: string[];\n}\n\n/** Checkboxes field value */\nexport interface CheckboxesValue {\n kind: 'checkboxes';\n values: Record<OptionId, CheckboxValue>;\n}\n\n/** Single-select field value */\nexport interface SingleSelectValue {\n kind: 'single_select';\n selected: OptionId | null;\n}\n\n/** Multi-select field value */\nexport interface MultiSelectValue {\n kind: 'multi_select';\n selected: OptionId[];\n}\n\n/** URL field value */\nexport interface UrlValue {\n kind: 'url';\n value: string | null; // null if empty, validated URL string otherwise\n}\n\n/** URL list field value */\nexport interface UrlListValue {\n kind: 'url_list';\n items: string[]; // Array of URL strings\n}\n\n/** Date field value */\nexport interface DateValue {\n kind: 'date';\n value: string | null; // ISO 8601 date string (YYYY-MM-DD) or null\n}\n\n/** Year field value */\nexport interface YearValue {\n kind: 'year';\n value: number | null; // integer year or null\n}\n\n/**\n * Cell value - scalar value only (never null).\n * Empty/skipped cells use %SKIP% sentinel, not null.\n */\nexport type CellValue = string | number;\n\n/**\n * Cell response - matches FieldResponse pattern.\n * Used in internal representation (ParsedForm).\n */\nexport interface CellResponse {\n state: 'answered' | 'skipped' | 'aborted'; // cells cannot be 'unanswered'\n value?: CellValue; // present when state === 'answered'\n reason?: string; // present when state === 'skipped' or 'aborted'\n}\n\n/** Table row response - each cell has a response (internal representation) */\nexport type TableRowResponse = Record<Id, CellResponse>;\n\n/** Table field value (internal representation) */\nexport interface TableValue {\n kind: 'table';\n rows: TableRowResponse[];\n}\n\n/** Union of all field value types */\nexport type FieldValue =\n | StringValue\n | NumberValue\n | StringListValue\n | CheckboxesValue\n | SingleSelectValue\n | MultiSelectValue\n | UrlValue\n | UrlListValue\n | DateValue\n | YearValue\n | TableValue;\n\n// =============================================================================\n// Documentation Block\n// =============================================================================\n\n/** Documentation tag type - determines the semantic purpose of the block */\nexport type DocumentationTag = 'description' | 'instructions' | 'documentation';\n\n/** Documentation block attached to form elements */\nexport interface DocumentationBlock {\n /** The semantic tag type: description, instructions, or documentation */\n tag: DocumentationTag;\n /** Reference to form/group/field ID or qualified option ref (fieldId.optionId) */\n ref: string;\n bodyMarkdown: string;\n /**\n * Whether to include this block in report output.\n * Default: false for 'instructions' tag, true for others.\n */\n report?: boolean;\n}\n\n// =============================================================================\n// Form Metadata (from frontmatter)\n// =============================================================================\n\n/**\n * Optional harness configuration from frontmatter.\n * Forms can specify default harness settings for fill operations.\n */\nexport interface FrontmatterHarnessConfig {\n maxTurns?: number;\n maxPatchesPerTurn?: number;\n maxIssuesPerTurn?: number;\n maxParallelAgents?: number;\n}\n\n/**\n * Run mode for the form - determines how 'markform run' executes.\n * - interactive: Launch interactive fill for user-role fields\n * - fill: Prompt for model, run agent fill\n * - research: Prompt for web-search model, run research fill\n */\nexport type RunMode = 'interactive' | 'fill' | 'research';\n\n/** Form-level metadata from YAML frontmatter, including role configuration */\nexport interface FormMetadata {\n markformVersion: string;\n /** Optional title from frontmatter (may differ from form tag title) */\n title?: string;\n /** Optional description from frontmatter */\n description?: string;\n roles: string[];\n roleInstructions: Record<string, string>;\n /** Optional harness configuration from frontmatter */\n harnessConfig?: FrontmatterHarnessConfig;\n /** How this form should be executed by 'markform run' */\n runMode?: RunMode;\n}\n\n// =============================================================================\n// Parsed Form\n// =============================================================================\n\n/** Node type for ID index entries - identifies what structural element an ID refers to */\nexport type NodeType = 'form' | 'group' | 'field' | 'option';\n\n/** ID index entry for fast lookup and validation */\nexport interface IdIndexEntry {\n nodeType: NodeType; // what this ID refers to\n parentId?: Id;\n fieldId?: Id;\n}\n\n/**\n * The syntax style used in a Markform document.\n * - 'comments': HTML comment syntax with f: namespace (`<!-- f:tag -->`) - primary/default\n * - 'tags': Traditional Markdoc Jinja-style syntax (`{% tag %}`)\n */\nexport type SyntaxStyle = 'comments' | 'tags';\n\n/**\n * Tag types that can appear in Markform documents for position tracking.\n * - 'form': The root form tag\n * - 'group': Field group tags\n * - 'field': Individual field tags (may include value fence)\n * - 'note': Inline note tags (`{% note %}`)\n * - 'documentation': Documentation block tags (instructions, description, etc.)\n */\nexport type TagType = 'form' | 'group' | 'field' | 'note' | 'documentation';\n\n/**\n * Position of a Markform tag region in the source document.\n * Used for splice-based serialization to preserve content outside tags.\n */\nexport interface TagRegion {\n /** ID of the element (form, group, field ID, or note ID) */\n tagId: Id;\n /** Type of Markform tag */\n tagType: TagType;\n /** Start position in rawSource (inclusive, byte offset) */\n startOffset: number;\n /** End position in rawSource (exclusive, byte offset) */\n endOffset: number;\n /**\n * For field tags: whether region includes value fence.\n * True if field has a value block between open/close tags.\n */\n includesValue?: boolean;\n}\n\n/** Canonical internal representation returned by parseForm() */\nexport interface ParsedForm {\n schema: FormSchema;\n responsesByFieldId: Record<Id, FieldResponse>; // replaces valuesByFieldId + skipsByFieldId\n notes: Note[]; // agent/user notes\n docs: DocumentationBlock[];\n orderIndex: Id[];\n idIndex: Map<Id, IdIndexEntry>;\n metadata?: FormMetadata; // optional for backward compat with forms without frontmatter\n /** The syntax style detected in the original document (for round-trip serialization) */\n syntaxStyle?: SyntaxStyle;\n\n // Raw source preservation for content-preserving serialization\n /**\n * Original markdown source (post-frontmatter, post-preprocessing for comment syntax).\n * Used for splice-based serialization to preserve content outside Markform tags.\n */\n rawSource?: string;\n /**\n * Positions of all Markform tags in rawSource.\n * Sorted by startOffset in document order.\n */\n tagRegions?: TagRegion[];\n}\n\n// =============================================================================\n// Validation Types\n// =============================================================================\n\n/** Validation issue severity */\nexport type Severity = 'error' | 'warning' | 'info';\n\n/** Source position for error locations */\nexport interface SourcePosition {\n line: number;\n col: number;\n}\n\n/** Source range for error locations */\nexport interface SourceRange {\n start: SourcePosition;\n end: SourcePosition;\n}\n\n/** Validation issue from the validation pipeline */\nexport interface ValidationIssue {\n severity: Severity;\n message: string;\n code?: string;\n ref?: Id;\n path?: string;\n range?: SourceRange;\n validatorId?: string;\n source: 'builtin' | 'code' | 'llm';\n}\n\n// =============================================================================\n// Error Types (markform-210)\n// =============================================================================\n\n/** Location information for error reporting */\nexport interface ErrorLocation {\n line?: number;\n column?: number;\n fieldId?: Id;\n noteId?: NoteId;\n}\n\n/** Markdown/Markdoc syntax error */\nexport interface ParseError {\n type: 'parse';\n message: string;\n location?: ErrorLocation;\n}\n\n/** Markform model consistency error */\nexport interface MarkformValidationError {\n type: 'validation';\n message: string;\n location?: ErrorLocation;\n}\n\n/** Union of all Markform error types */\nexport type MarkformError = ParseError | MarkformValidationError;\n\n// =============================================================================\n// Inspect Types\n// =============================================================================\n\n/** Standard reason codes for inspect issues */\nexport type IssueReason =\n | 'validation_error'\n | 'required_missing'\n | 'checkbox_incomplete'\n | 'min_items_not_met'\n | 'optional_unanswered';\n\n/** Issue scope - the level at which the issue applies */\nexport type IssueScope = 'form' | 'group' | 'field' | 'option' | 'column' | 'cell';\n\n/** Inspect issue - unified type for agent/UI consumption */\nexport interface InspectIssue {\n ref: string;\n scope: IssueScope;\n reason: IssueReason;\n message: string;\n severity: 'required' | 'recommended';\n priority: number;\n blockedBy?: Id; // if field is blocked by an incomplete blocking checkpoint\n}\n\n// =============================================================================\n// Summary Types\n// =============================================================================\n\n/** Structure summary - describes static form schema */\nexport interface StructureSummary {\n groupCount: number;\n fieldCount: number;\n optionCount: number;\n /** Count of table columns across all table fields */\n columnCount: number;\n fieldCountByKind: Record<FieldKind, number>;\n groupsById: Record<Id, 'field_group'>;\n fieldsById: Record<Id, FieldKind>;\n optionsById: Record<QualifiedOptionRef, { parentFieldId: Id; parentFieldKind: FieldKind }>;\n /** Map of qualified column refs to column metadata */\n columnsById: Record<QualifiedColumnRef, { parentFieldId: Id; columnType: ColumnTypeName }>;\n}\n\n/** Progress state for a field or form */\nexport type ProgressState = 'empty' | 'incomplete' | 'invalid' | 'complete';\n\n/** Checkbox progress counts */\nexport interface CheckboxProgressCounts {\n total: number;\n // Multi mode\n todo: number;\n done: number;\n incomplete: number;\n active: number;\n na: number;\n // Explicit mode\n unfilled: number;\n yes: number;\n no: number;\n}\n\n/**\n * Field progress tracking.\n * Uses orthogonal booleans instead of ProgressState enum.\n */\nexport interface FieldProgress {\n kind: FieldKind;\n required: boolean;\n answerState: AnswerState;\n hasNotes: boolean;\n noteCount: number;\n /** Whether the field has a value (answered, or has checkbox selections) */\n empty: boolean;\n /** Whether the field passes validation (no issues) */\n valid: boolean;\n issueCount: number;\n checkboxProgress?: CheckboxProgressCounts;\n}\n\n/**\n * Progress counts rollup with three orthogonal dimensions.\n */\nexport interface ProgressCounts {\n totalFields: number;\n requiredFields: number;\n\n // Dimension 1: AnswerState (mutually exclusive, sum to totalFields)\n unansweredFields: number;\n answeredFields: number;\n skippedFields: number;\n abortedFields: number;\n\n // Dimension 2: Validity (mutually exclusive, sum to totalFields)\n validFields: number;\n invalidFields: number;\n\n // Dimension 3: Value presence (mutually exclusive, sum to totalFields)\n emptyFields: number;\n filledFields: number;\n\n // Derived counts\n emptyRequiredFields: number;\n totalNotes: number;\n}\n\n/** Progress summary - tracks filling progress */\nexport interface ProgressSummary {\n counts: ProgressCounts;\n fields: Record<Id, FieldProgress>;\n}\n\n// =============================================================================\n// Inspect/Apply Result Types\n// =============================================================================\n\n/** Result from inspect operation */\nexport interface InspectResult {\n structureSummary: StructureSummary;\n progressSummary: ProgressSummary;\n issues: InspectIssue[];\n isComplete: boolean;\n formState: ProgressState;\n}\n\n/** Details about a rejected patch */\nexport interface PatchRejection {\n patchIndex: number;\n message: string;\n /** Field ID if available (for type mismatch errors) */\n fieldId?: string;\n /** Field kind if available (for type mismatch errors) */\n fieldKind?: string;\n /** Column IDs if available (for table fields) */\n columnIds?: string[];\n}\n\n/** Coercion type for patch warnings */\nexport type PatchCoercionType =\n | 'string_to_list'\n | 'url_to_list'\n | 'option_to_array'\n | 'boolean_to_checkbox'\n | 'array_to_checkboxes';\n\n/** Warning for coerced patches */\nexport interface PatchWarning {\n patchIndex: number;\n fieldId: string;\n message: string;\n coercion: PatchCoercionType;\n}\n\n/** Status of patch application */\nexport type ApplyStatus = 'applied' | 'partial' | 'rejected';\n\n/** Result from apply operation */\nexport interface ApplyResult {\n applyStatus: ApplyStatus;\n structureSummary: StructureSummary;\n progressSummary: ProgressSummary;\n issues: InspectIssue[];\n isComplete: boolean;\n formState: ProgressState;\n /** Patches that were successfully applied (normalized/coerced) */\n appliedPatches: Patch[];\n /** Empty on success, contains rejection details on failure */\n rejectedPatches: PatchRejection[];\n /** Warnings for patches that were coerced */\n warnings: PatchWarning[];\n}\n\n// =============================================================================\n// Patch Types\n// =============================================================================\n\n/** Set string field value */\nexport interface SetStringPatch {\n op: 'set_string';\n fieldId: Id;\n value: string | null;\n}\n\n/** Set number field value */\nexport interface SetNumberPatch {\n op: 'set_number';\n fieldId: Id;\n value: number | null;\n}\n\n/** Set string list field value */\nexport interface SetStringListPatch {\n op: 'set_string_list';\n fieldId: Id;\n value: string[];\n}\n\n/** Set checkboxes field value (merges with existing) */\nexport interface SetCheckboxesPatch {\n op: 'set_checkboxes';\n fieldId: Id;\n value: Record<OptionId, CheckboxValue>;\n}\n\n/** Set single-select field value */\nexport interface SetSingleSelectPatch {\n op: 'set_single_select';\n fieldId: Id;\n value: OptionId | null;\n}\n\n/** Set multi-select field value */\nexport interface SetMultiSelectPatch {\n op: 'set_multi_select';\n fieldId: Id;\n value: OptionId[];\n}\n\n/** Set URL field value */\nexport interface SetUrlPatch {\n op: 'set_url';\n fieldId: Id;\n value: string | null;\n}\n\n/** Set URL list field value */\nexport interface SetUrlListPatch {\n op: 'set_url_list';\n fieldId: Id;\n value: string[];\n}\n\n/** Set date field value */\nexport interface SetDatePatch {\n op: 'set_date';\n fieldId: Id;\n value: string | null; // ISO 8601 date string (YYYY-MM-DD) or null\n}\n\n/** Set year field value */\nexport interface SetYearPatch {\n op: 'set_year';\n fieldId: Id;\n value: number | null; // integer year or null\n}\n\n/**\n * Table row for patches - simplified format.\n * Values can be:\n * - Actual value (string/number)\n * - null to indicate %SKIP% (serialized as %SKIP% in markdown)\n * - \"%SKIP%\" or \"%ABORT%\" sentinel strings with optional reason\n */\nexport type TableRowPatch = Record<Id, CellValue | null | string>;\n\n/**\n * Set table field patch.\n * Uses simplified format where null values become %SKIP% on serialize.\n */\nexport interface SetTablePatch {\n op: 'set_table';\n fieldId: Id;\n value: TableRowPatch[];\n}\n\n/** Append rows to a table field */\nexport interface AppendTablePatch {\n op: 'append_table';\n fieldId: Id;\n value: TableRowPatch[];\n}\n\n/** Delete a row from a table field by index */\nexport interface DeleteTablePatch {\n op: 'delete_table';\n fieldId: Id;\n value: number; // 0-based row index\n}\n\n/** Append items to a string_list field */\nexport interface AppendStringListPatch {\n op: 'append_string_list';\n fieldId: Id;\n value: string[];\n}\n\n/** Delete an item from a string_list field by index */\nexport interface DeleteStringListPatch {\n op: 'delete_string_list';\n fieldId: Id;\n value: number; // 0-based item index\n}\n\n/** Append items to a url_list field */\nexport interface AppendUrlListPatch {\n op: 'append_url_list';\n fieldId: Id;\n value: string[];\n}\n\n/** Delete an item from a url_list field by index */\nexport interface DeleteUrlListPatch {\n op: 'delete_url_list';\n fieldId: Id;\n value: number; // 0-based item index\n}\n\n/** Clear field value */\nexport interface ClearFieldPatch {\n op: 'clear_field';\n fieldId: Id;\n}\n\n/** Skip field - explicitly skip an optional field without providing a value */\nexport interface SkipFieldPatch {\n op: 'skip_field';\n fieldId: Id;\n role: string; // required: who is skipping\n reason?: string; // optional reason for skipping\n}\n\n/** Abort field - mark a field as unable to be completed */\nexport interface AbortFieldPatch {\n op: 'abort_field';\n fieldId: Id;\n role: string;\n reason?: string;\n}\n\n/** Add note - attach a note to a form element */\nexport interface AddNotePatch {\n op: 'add_note';\n ref: Id;\n role: string;\n text: string;\n}\n\n/** Remove note - remove a specific note by ID */\nexport interface RemoveNotePatch {\n op: 'remove_note';\n noteId: NoteId;\n}\n\n/** Union of all patch types */\nexport type Patch =\n | SetStringPatch\n | SetNumberPatch\n | SetStringListPatch\n | SetCheckboxesPatch\n | SetSingleSelectPatch\n | SetMultiSelectPatch\n | SetUrlPatch\n | SetUrlListPatch\n | SetDatePatch\n | SetYearPatch\n | SetTablePatch\n | AppendTablePatch\n | DeleteTablePatch\n | AppendStringListPatch\n | DeleteStringListPatch\n | AppendUrlListPatch\n | DeleteUrlListPatch\n | ClearFieldPatch\n | SkipFieldPatch\n | AbortFieldPatch\n | AddNotePatch\n | RemoveNotePatch;\n\n// =============================================================================\n// Harness Types\n// =============================================================================\n\n/** Result from harness step */\nexport interface StepResult {\n structureSummary: StructureSummary;\n progressSummary: ProgressSummary;\n issues: InspectIssue[];\n stepBudget: number;\n isComplete: boolean;\n turnNumber: number;\n /** Number of patches actually applied (set by harness.apply, undefined for step-only results) */\n patchesApplied?: number;\n /** Rejection details if patches failed (set by harness.apply, undefined for step-only results) */\n rejectedPatches?: PatchRejection[];\n /** Coercion warnings from patch normalization (set by harness.apply, undefined for step-only results) */\n coercionWarnings?: PatchWarning[];\n}\n\n// =============================================================================\n// Session Transcript Types\n// =============================================================================\n\n/** Harness configuration */\nexport interface HarnessConfig {\n maxIssuesPerTurn: number;\n maxPatchesPerTurn: number;\n maxTurns: number;\n /** Maximum unique fields to include issues for per turn (undefined = unlimited) */\n maxFieldsPerTurn?: number;\n /** Maximum unique groups to include issues for per turn (undefined = unlimited) */\n maxGroupsPerTurn?: number;\n /** Target roles to fill (default: [AGENT_ROLE], '*' for all) */\n targetRoles?: string[];\n /** Fill mode: 'continue' (skip filled) or 'overwrite' (re-fill) */\n fillMode?: FillMode;\n /** Max concurrent agents for parallel batches (default: 4) */\n maxParallelAgents?: number;\n}\n\n/** LLM stats for a turn (from live agent) */\nexport interface SessionTurnStats {\n /** Input tokens for this turn */\n inputTokens?: number;\n /** Output tokens for this turn */\n outputTokens?: number;\n /** Tool calls made during this turn */\n toolCalls?: { name: string; count: number }[];\n}\n\n/** Context prompts sent to LLM (for session logging and debugging) */\nexport interface SessionTurnContext {\n /** System prompt with instructions */\n systemPrompt: string;\n /** Context prompt with issues and field schema */\n contextPrompt: string;\n}\n\n// =============================================================================\n// Wire Format Types (for comprehensive session logging)\n// =============================================================================\n\n/**\n * Tool call captured from LLM response step.\n * Omits toolCallId for stability (changes each run).\n */\nexport interface WireToolCall {\n /** Name of the tool that was called */\n toolName: string;\n /** Input passed to the tool */\n input: unknown;\n}\n\n/**\n * Tool result captured from LLM response step.\n * Omits toolCallId for stability (changes each run).\n */\nexport interface WireToolResult {\n /** Name of the tool that returned this result */\n toolName: string;\n /** Result returned by tool.execute() */\n result: unknown;\n}\n\n/**\n * A single step in the LLM response.\n * Corresponds to one iteration of the tool-calling loop.\n */\nexport interface WireResponseStep {\n /** Tool calls made in this step */\n toolCalls: WireToolCall[];\n /** Results returned by tools in this step */\n toolResults: WireToolResult[];\n /** Text output from the model in this step (null if none) */\n text: string | null;\n}\n\n/**\n * The request sent to the LLM via Vercel AI SDK generateText().\n */\nexport interface WireRequestFormat {\n /** System prompt with agent instructions */\n system: string;\n /** Context prompt with form state and issues */\n prompt: string;\n /** Tool definitions with descriptions and schemas */\n tools: Record<\n string,\n {\n /** Tool description shown to LLM */\n description: string;\n /** JSON Schema for tool input */\n inputSchema: unknown;\n }\n >;\n}\n\n/**\n * The response received from the LLM via Vercel AI SDK generateText().\n */\nexport interface WireResponseFormat {\n /** Steps in the tool-calling loop */\n steps: WireResponseStep[];\n /** Token usage for this call */\n usage: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\n/**\n * Complete wire format capturing the LLM request and response.\n *\n * This captures the exact data sent to and received from the LLM,\n * enabling comprehensive regression testing and prompt engineering visibility.\n *\n * Used in session logging to provide a \"transparent view\" of LLM interactions\n * that can be diffed to catch changes in prompts, schemas, or error messages.\n */\nexport interface WireFormat {\n /** The request sent to the LLM */\n request: WireRequestFormat;\n /** The response received from the LLM */\n response: WireResponseFormat;\n}\n\n/** Session turn - one iteration of the harness loop */\nexport interface SessionTurn {\n turn: number;\n inspect: {\n issues: InspectIssue[];\n };\n /** Context sent to LLM (prompts with field schema info) */\n context?: SessionTurnContext;\n apply: {\n patches: Patch[];\n /** Patches that were rejected (type mismatch, invalid field, etc.) */\n rejectedPatches?: PatchRejection[];\n /** Warnings for patches that were coerced (e.g., string → array) */\n warnings?: PatchWarning[];\n };\n after: {\n requiredIssueCount: number;\n markdownSha256: string;\n answeredFieldCount: number;\n skippedFieldCount: number;\n };\n /** LLM stats (only present for live agent sessions) */\n llm?: SessionTurnStats;\n /**\n * Complete wire format for comprehensive session logging.\n * Captures exact LLM request/response for regression testing.\n * Optional - only populated when wire format capture is enabled.\n */\n wire?: WireFormat;\n}\n\n/** Final session expectations */\nexport interface SessionFinal {\n expectComplete: boolean;\n expectedCompletedForm: string;\n}\n\n/** Session transcript for golden testing */\nexport interface SessionTranscript {\n sessionVersion: string;\n mode: MockMode;\n form: {\n path: string;\n };\n validators?: {\n code?: string;\n };\n mock?: {\n completedMock: string;\n };\n live?: {\n modelId: string;\n };\n harness: HarnessConfig;\n turns: SessionTurn[];\n final: SessionFinal;\n}\n\n// =============================================================================\n// Frontmatter Types\n// =============================================================================\n\n/** Markform frontmatter structure */\nexport interface MarkformFrontmatter {\n markformVersion: string;\n formSummary: StructureSummary;\n formProgress: ProgressSummary;\n formState: ProgressState;\n}\n\n// =============================================================================\n// Validator Types\n// =============================================================================\n\n/** Context passed to validator functions */\nexport interface ValidatorContext {\n schema: FormSchema;\n values: Record<Id, FieldValue>;\n targetId: Id;\n targetSchema: Field | FieldGroup | FormSchema;\n params: Record<string, unknown>;\n}\n\n/** Validator function signature */\nexport type ValidatorFn = (ctx: ValidatorContext) => ValidationIssue[];\n\n/** Validator registry from sidecar files */\nexport type ValidatorRegistry = Record<string, ValidatorFn>;\n\n// =============================================================================\n// Zod Schemas\n// =============================================================================\n\n// Basic schemas\nexport const IdSchema = z.string().min(1);\nexport const OptionIdSchema = z.string().min(1);\nexport const NoteIdSchema = z.string().min(1);\n\nexport const ValidatorRefSchema = z.union([z.string(), z.looseObject({ id: z.string() })]);\n\n// Answer state schema (markform-255)\nexport const AnswerStateSchema = z.enum(['unanswered', 'answered', 'skipped', 'aborted']);\n\n// Checkbox state schemas\nexport const MultiCheckboxStateSchema = z.enum(['todo', 'done', 'incomplete', 'active', 'na']);\n\nexport const SimpleCheckboxStateSchema = z.enum(['todo', 'done']);\n\nexport const ExplicitCheckboxValueSchema = z.enum(['unfilled', 'yes', 'no']);\n\nexport const CheckboxValueSchema = z.union([MultiCheckboxStateSchema, ExplicitCheckboxValueSchema]);\n\nexport const CheckboxModeSchema = z.enum(['multi', 'simple', 'explicit']);\n\nexport const FillModeSchema = z.enum(['continue', 'overwrite']);\n\nexport const MockModeSchema = z.enum(['mock', 'live']);\n\nexport const ApprovalModeSchema = z.enum(['none', 'blocking']);\n\n// Field kind schema\nexport const FieldKindSchema = z.enum([\n 'string',\n 'number',\n 'string_list',\n 'checkboxes',\n 'single_select',\n 'multi_select',\n 'url',\n 'url_list',\n 'date',\n 'year',\n 'table',\n]);\n\n// =============================================================================\n// Table Type Zod Schemas\n// =============================================================================\n\n/** Base column type name schema */\nexport const ColumnTypeNameSchema = z.enum(['string', 'number', 'url', 'date', 'year']);\n\n/**\n * Column type specification schema (for parsing attributes).\n * Either a simple type name or an object with type and required.\n */\nexport const ColumnTypeSpecSchema = z.union([\n ColumnTypeNameSchema,\n z.object({\n type: ColumnTypeNameSchema,\n required: z.boolean(),\n }),\n]);\n\n/**\n * Table column schema (normalized form after parsing).\n * Always has explicit required flag.\n */\nexport const TableColumnSchema = z.object({\n id: IdSchema,\n label: z.string(),\n type: ColumnTypeNameSchema,\n required: z.boolean(),\n});\n\n/** Cell value schema (never null - use sentinels for skipped) */\nexport const CellValueSchema = z.union([z.string(), z.number()]);\n\n/** Cell response schema */\nexport const CellResponseSchema = z.object({\n state: z.enum(['answered', 'skipped', 'aborted']),\n value: CellValueSchema.optional(),\n reason: z.string().optional(),\n});\n\n/** Table row response schema */\nexport const TableRowResponseSchema = z.record(IdSchema, CellResponseSchema);\n\n/** Table value schema */\nexport const TableValueSchema = z.object({\n kind: z.literal('table'),\n rows: z.array(TableRowResponseSchema),\n});\n\n/** Table row patch schema (simplified for patches) */\nexport const TableRowPatchSchema = z.record(\n IdSchema,\n z.union([CellValueSchema, z.null(), z.string()]), // null or sentinel string\n);\n\nexport const FieldPriorityLevelSchema = z.enum(['high', 'medium', 'low']);\n\n// Option schema\nexport const OptionSchema = z.object({\n id: IdSchema,\n label: z.string(),\n});\n\n// Field base schema (partial, used for extension)\n// NOTE: required, priority, and role are explicit (not optional) - parser assigns defaults\nconst FieldBaseSchemaPartial = {\n id: IdSchema,\n label: z.string(),\n required: z.boolean(),\n priority: FieldPriorityLevelSchema,\n role: z.string(),\n validate: z.array(ValidatorRefSchema).optional(),\n report: z.boolean().optional(),\n placeholder: z.string().optional(),\n examples: z.array(z.string()).optional(),\n parallel: z.string().optional(),\n order: z.number().optional(),\n};\n\n// Field schemas\nexport const StringFieldSchema = z.object({\n ...FieldBaseSchemaPartial,\n kind: z.literal('string'),\n multiline: z.boolean().optional(),\n pattern: z.string().optional(),\n minLength: z.number().int().nonnegative().optional(),\n maxLength: z.number().int().nonnegative().optional(),\n});\n\nexport const NumberFieldSchema = z.object({\n ...FieldBaseSchemaPartial,\n kind: z.literal('number'),\n min: z.number().optional(),\n max: z.number().optional(),\n integer: z.boolean().optional(),\n});\n\nexport const StringListFieldSchema = z.object({\n ...FieldBaseSchemaPartial,\n kind: z.literal('string_list'),\n minItems: z.number().int().nonnegative().optional(),\n maxItems: z.number().int().nonnegative().optional(),\n itemMinLength: z.number().int().nonnegative().optional(),\n itemMaxLength: z.number().int().nonnegative().optional(),\n uniqueItems: z.boolean().optional(),\n});\n\nexport const CheckboxesFieldSchema = z.object({\n ...FieldBaseSchemaPartial,\n kind: z.literal('checkboxes'),\n checkboxMode: CheckboxModeSchema, // explicit: parser defaults to 'multi'\n minDone: z.number().int().optional(),\n options: z.array(OptionSchema),\n approvalMode: ApprovalModeSchema, // explicit: parser defaults to 'none'\n});\n\nexport const SingleSelectFieldSchema = z.object({\n ...FieldBaseSchemaPartial,\n kind: z.literal('single_select'),\n options: z.array(OptionSchema),\n});\n\nexport const MultiSelectFieldSchema = z.object({\n ...FieldBaseSchemaPartial,\n kind: z.literal('multi_select'),\n options: z.array(OptionSchema),\n minSelections: z.number().int().nonnegative().optional(),\n maxSelections: z.number().int().nonnegative().optional(),\n});\n\nexport const UrlFieldSchema = z.object({\n ...FieldBaseSchemaPartial,\n kind: z.literal('url'),\n});\n\nexport const UrlListFieldSchema = z.object({\n ...FieldBaseSchemaPartial,\n kind: z.literal('url_list'),\n minItems: z.number().int().nonnegative().optional(),\n maxItems: z.number().int().nonnegative().optional(),\n uniqueItems: z.boolean().optional(),\n});\n\nexport const DateFieldSchema = z.object({\n ...FieldBaseSchemaPartial,\n kind: z.literal('date'),\n min: z.string().optional(), // ISO 8601 date string (YYYY-MM-DD)\n max: z.string().optional(), // ISO 8601 date string (YYYY-MM-DD)\n});\n\nexport const YearFieldSchema = z.object({\n ...FieldBaseSchemaPartial,\n kind: z.literal('year'),\n min: z.number().int().optional(), // minimum year\n max: z.number().int().optional(), // maximum year\n});\n\n/** Table field schema (extends FieldBase pattern) */\nexport const TableFieldSchema = z.object({\n ...FieldBaseSchemaPartial,\n kind: z.literal('table'),\n columns: z.array(TableColumnSchema),\n minRows: z.number().int().nonnegative().optional(),\n maxRows: z.number().int().positive().optional(),\n});\n\nexport const FieldSchema = z.discriminatedUnion('kind', [\n StringFieldSchema,\n NumberFieldSchema,\n StringListFieldSchema,\n CheckboxesFieldSchema,\n SingleSelectFieldSchema,\n MultiSelectFieldSchema,\n UrlFieldSchema,\n UrlListFieldSchema,\n DateFieldSchema,\n YearFieldSchema,\n TableFieldSchema,\n]);\n\n// Field group schema (no 'kind' property - reserved for Field/FieldValue types)\nexport const FieldGroupSchema = z.object({\n id: IdSchema,\n title: z.string().optional(),\n validate: z.array(ValidatorRefSchema).optional(),\n children: z.array(FieldSchema),\n parallel: z.string().optional(),\n order: z.number().optional(),\n});\n\n// Form schema\nexport const FormSchemaSchema = z.object({\n id: IdSchema,\n title: z.string().optional(),\n groups: z.array(FieldGroupSchema),\n});\n\n// Field value schemas\nexport const StringValueSchema = z.object({\n kind: z.literal('string'),\n value: z.string().nullable(),\n});\n\nexport const NumberValueSchema = z.object({\n kind: z.literal('number'),\n value: z.number().nullable(),\n});\n\nexport const StringListValueSchema = z.object({\n kind: z.literal('string_list'),\n items: z.array(z.string()),\n});\n\nexport const CheckboxesValueSchema = z.object({\n kind: z.literal('checkboxes'),\n values: z.record(OptionIdSchema, CheckboxValueSchema),\n});\n\nexport const SingleSelectValueSchema = z.object({\n kind: z.literal('single_select'),\n selected: OptionIdSchema.nullable(),\n});\n\nexport const MultiSelectValueSchema = z.object({\n kind: z.literal('multi_select'),\n selected: z.array(OptionIdSchema),\n});\n\nexport const UrlValueSchema = z.object({\n kind: z.literal('url'),\n value: z.string().nullable(),\n});\n\nexport const UrlListValueSchema = z.object({\n kind: z.literal('url_list'),\n items: z.array(z.string()),\n});\n\nexport const DateValueSchema = z.object({\n kind: z.literal('date'),\n value: z.string().nullable(), // ISO 8601 date string (YYYY-MM-DD) or null\n});\n\nexport const YearValueSchema = z.object({\n kind: z.literal('year'),\n value: z.number().int().nullable(), // integer year or null\n});\n\nexport const FieldValueSchema = z.discriminatedUnion('kind', [\n StringValueSchema,\n NumberValueSchema,\n StringListValueSchema,\n CheckboxesValueSchema,\n SingleSelectValueSchema,\n MultiSelectValueSchema,\n UrlValueSchema,\n UrlListValueSchema,\n DateValueSchema,\n YearValueSchema,\n TableValueSchema,\n]);\n\n// FieldResponse schema (markform-255)\nexport const FieldResponseSchema = z.object({\n state: AnswerStateSchema,\n value: FieldValueSchema.optional(),\n reason: z.string().optional(),\n});\n\n// Note schema (markform-205)\nexport const NoteSchema = z.object({\n id: NoteIdSchema,\n ref: IdSchema,\n role: z.string(),\n text: z.string(),\n});\n\n// Documentation block schema\nexport const DocumentationTagSchema = z.enum(['description', 'instructions', 'documentation']);\n\nexport const DocumentationBlockSchema = z.object({\n tag: DocumentationTagSchema,\n ref: z.string(),\n bodyMarkdown: z.string(),\n});\n\n// Frontmatter harness config schema (camelCase, used internally)\nexport const FrontmatterHarnessConfigSchema = z.object({\n maxTurns: z.number().int().positive().optional(),\n maxPatchesPerTurn: z.number().int().positive().optional(),\n maxIssuesPerTurn: z.number().int().positive().optional(),\n maxParallelAgents: z.number().int().positive().optional(),\n});\n\n// Run mode schema\nexport const RunModeSchema = z.enum(['interactive', 'fill', 'research']);\n\n/**\n * Schema for the raw YAML markform section input (snake_case keys).\n * Used to validate frontmatter before transforming to internal representation.\n */\nexport const MarkformSectionInputSchema = z.object({\n spec: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n run_mode: RunModeSchema.optional(),\n roles: z.array(z.string()).min(1).optional(),\n role_instructions: z.record(z.string(), z.string()).optional(),\n harness: z\n .object({\n max_turns: z.number().int().positive().optional(),\n max_patches_per_turn: z.number().int().positive().optional(),\n max_issues_per_turn: z.number().int().positive().optional(),\n max_parallel_agents: z.number().int().positive().optional(),\n })\n .strict() // Fail on unknown keys\n .optional(),\n});\n\n// Form metadata schema (camelCase, internal representation)\nexport const FormMetadataSchema = z.object({\n markformVersion: z.string(),\n title: z.string().optional(),\n description: z.string().optional(),\n roles: z.array(z.string()).min(1),\n roleInstructions: z.record(z.string(), z.string()),\n harnessConfig: FrontmatterHarnessConfigSchema.optional(),\n runMode: RunModeSchema.optional(),\n});\n\n// Validation schemas\nexport const SeveritySchema = z.enum(['error', 'warning', 'info']);\n\nexport const SourcePositionSchema = z.object({\n line: z.number().int().positive(),\n col: z.number().int().positive(),\n});\n\nexport const SourceRangeSchema = z.object({\n start: SourcePositionSchema,\n end: SourcePositionSchema,\n});\n\nexport const ValidationIssueSchema = z.object({\n severity: SeveritySchema,\n message: z.string(),\n code: z.string().optional(),\n ref: IdSchema.optional(),\n path: z.string().optional(),\n range: SourceRangeSchema.optional(),\n validatorId: z.string().optional(),\n source: z.enum(['builtin', 'code', 'llm']),\n});\n\n// Error location schema (markform-210)\nexport const ErrorLocationSchema = z.object({\n line: z.number().int().positive().optional(),\n column: z.number().int().positive().optional(),\n fieldId: IdSchema.optional(),\n noteId: NoteIdSchema.optional(),\n});\n\n// Error type schemas (markform-210)\nexport const ParseErrorSchema = z.object({\n type: z.literal('parse'),\n message: z.string(),\n location: ErrorLocationSchema.optional(),\n});\n\nexport const MarkformValidationErrorSchema = z.object({\n type: z.literal('validation'),\n message: z.string(),\n location: ErrorLocationSchema.optional(),\n});\n\nexport const MarkformErrorSchema = z.discriminatedUnion('type', [\n ParseErrorSchema,\n MarkformValidationErrorSchema,\n]);\n\n// Inspect issue schema\nexport const IssueReasonSchema = z.enum([\n 'validation_error',\n 'required_missing',\n 'checkbox_incomplete',\n 'min_items_not_met',\n 'optional_unanswered',\n]);\n\nexport const IssueScopeSchema = z.enum(['form', 'group', 'field', 'option', 'column', 'cell']);\n\nexport const InspectIssueSchema = z.object({\n ref: z.union([IdSchema, z.string()]), // Id or QualifiedOptionRef\n scope: IssueScopeSchema,\n reason: IssueReasonSchema,\n message: z.string(),\n severity: z.enum(['required', 'recommended']),\n priority: z.number().int().positive(),\n blockedBy: IdSchema.optional(),\n});\n\n// Summary schemas\nexport const ProgressStateSchema = z.enum(['empty', 'incomplete', 'invalid', 'complete']);\n\nexport const CheckboxProgressCountsSchema = z.object({\n total: z.number().int().nonnegative(),\n // Multi mode\n todo: z.number().int().nonnegative(),\n done: z.number().int().nonnegative(),\n incomplete: z.number().int().nonnegative(),\n active: z.number().int().nonnegative(),\n na: z.number().int().nonnegative(),\n // Explicit mode\n unfilled: z.number().int().nonnegative(),\n yes: z.number().int().nonnegative(),\n no: z.number().int().nonnegative(),\n});\n\nexport const FieldProgressSchema = z.object({\n kind: FieldKindSchema,\n required: z.boolean(),\n answerState: AnswerStateSchema,\n hasNotes: z.boolean(),\n noteCount: z.number().int().nonnegative(),\n empty: z.boolean(),\n valid: z.boolean(),\n issueCount: z.number().int().nonnegative(),\n checkboxProgress: CheckboxProgressCountsSchema.optional(),\n});\n\nexport const ProgressCountsSchema = z.object({\n totalFields: z.number().int().nonnegative(),\n requiredFields: z.number().int().nonnegative(),\n // Dimension 1: AnswerState (mutually exclusive, sum to totalFields)\n unansweredFields: z.number().int().nonnegative(),\n answeredFields: z.number().int().nonnegative(),\n skippedFields: z.number().int().nonnegative(),\n abortedFields: z.number().int().nonnegative(),\n // Dimension 2: Validity (mutually exclusive, sum to totalFields)\n validFields: z.number().int().nonnegative(),\n invalidFields: z.number().int().nonnegative(),\n // Dimension 3: Value presence (mutually exclusive, sum to totalFields)\n emptyFields: z.number().int().nonnegative(),\n filledFields: z.number().int().nonnegative(),\n // Derived counts\n emptyRequiredFields: z.number().int().nonnegative(),\n totalNotes: z.number().int().nonnegative(),\n});\n\nexport const ProgressSummarySchema = z.object({\n counts: ProgressCountsSchema,\n fields: z.record(IdSchema, FieldProgressSchema),\n});\n\nexport const StructureSummarySchema = z.object({\n groupCount: z.number().int().nonnegative(),\n fieldCount: z.number().int().nonnegative(),\n optionCount: z.number().int().nonnegative(),\n fieldCountByKind: z.record(FieldKindSchema, z.number().int().nonnegative()),\n groupsById: z.record(IdSchema, z.literal('field_group')),\n fieldsById: z.record(IdSchema, FieldKindSchema),\n optionsById: z.record(\n z.string(),\n z.object({\n parentFieldId: IdSchema,\n parentFieldKind: FieldKindSchema,\n }),\n ),\n});\n\n// Result schemas\nexport const InspectResultSchema = z.object({\n structureSummary: StructureSummarySchema,\n progressSummary: ProgressSummarySchema,\n issues: z.array(InspectIssueSchema),\n isComplete: z.boolean(),\n formState: ProgressStateSchema,\n});\n\n// Patch rejection schema\nexport const PatchRejectionSchema = z.object({\n patchIndex: z.number().int().nonnegative(),\n message: z.string(),\n fieldId: z.string().optional(),\n fieldKind: z.string().optional(),\n columnIds: z.array(z.string()).optional(),\n});\n\n// Patch warning schemas\nexport const PatchCoercionTypeSchema = z.enum([\n 'string_to_list',\n 'url_to_list',\n 'option_to_array',\n 'boolean_to_checkbox',\n 'array_to_checkboxes',\n]);\n\nexport const PatchWarningSchema = z.object({\n patchIndex: z.number().int().nonnegative(),\n fieldId: z.string(),\n message: z.string(),\n coercion: PatchCoercionTypeSchema,\n});\n\nexport const ApplyStatusSchema = z.enum(['applied', 'partial', 'rejected']);\n\nexport const ApplyResultSchema = z.object({\n applyStatus: ApplyStatusSchema,\n structureSummary: StructureSummarySchema,\n progressSummary: ProgressSummarySchema,\n issues: z.array(InspectIssueSchema),\n isComplete: z.boolean(),\n formState: ProgressStateSchema,\n appliedPatches: z.array(z.lazy(() => PatchSchema)),\n rejectedPatches: z.array(PatchRejectionSchema),\n warnings: z.array(PatchWarningSchema),\n});\n\n// Patch schemas\nexport const SetStringPatchSchema = z.object({\n op: z.literal('set_string'),\n fieldId: IdSchema,\n value: z.string().nullable(),\n});\n\nexport const SetNumberPatchSchema = z.object({\n op: z.literal('set_number'),\n fieldId: IdSchema,\n value: z.number().nullable(),\n});\n\nexport const SetStringListPatchSchema = z.object({\n op: z.literal('set_string_list'),\n fieldId: IdSchema,\n value: z.array(z.string()),\n});\n\nexport const SetCheckboxesPatchSchema = z.object({\n op: z.literal('set_checkboxes'),\n fieldId: IdSchema,\n value: z.record(OptionIdSchema, CheckboxValueSchema),\n});\n\nexport const SetSingleSelectPatchSchema = z.object({\n op: z.literal('set_single_select'),\n fieldId: IdSchema,\n value: OptionIdSchema.nullable(),\n});\n\nexport const SetMultiSelectPatchSchema = z.object({\n op: z.literal('set_multi_select'),\n fieldId: IdSchema,\n value: z.array(OptionIdSchema),\n});\n\nexport const SetUrlPatchSchema = z.object({\n op: z.literal('set_url'),\n fieldId: IdSchema,\n value: z.string().nullable(),\n});\n\nexport const SetUrlListPatchSchema = z.object({\n op: z.literal('set_url_list'),\n fieldId: IdSchema,\n value: z.array(z.string()),\n});\n\nexport const SetDatePatchSchema = z.object({\n op: z.literal('set_date'),\n fieldId: IdSchema,\n value: z.string().nullable(), // ISO 8601 date string (YYYY-MM-DD) or null\n});\n\nexport const SetYearPatchSchema = z.object({\n op: z.literal('set_year'),\n fieldId: IdSchema,\n value: z.number().int().nullable(), // integer year or null\n});\n\n/** Set table patch schema */\nexport const SetTablePatchSchema = z.object({\n op: z.literal('set_table'),\n fieldId: IdSchema,\n value: z.array(TableRowPatchSchema),\n});\n\nexport const AppendTablePatchSchema = z.object({\n op: z.literal('append_table'),\n fieldId: IdSchema,\n value: z.array(TableRowPatchSchema),\n});\n\nexport const DeleteTablePatchSchema = z.object({\n op: z.literal('delete_table'),\n fieldId: IdSchema,\n value: z.number().int().min(0),\n});\n\nexport const AppendStringListPatchSchema = z.object({\n op: z.literal('append_string_list'),\n fieldId: IdSchema,\n value: z.array(z.string()),\n});\n\nexport const DeleteStringListPatchSchema = z.object({\n op: z.literal('delete_string_list'),\n fieldId: IdSchema,\n value: z.number().int().min(0),\n});\n\nexport const AppendUrlListPatchSchema = z.object({\n op: z.literal('append_url_list'),\n fieldId: IdSchema,\n value: z.array(z.string()),\n});\n\nexport const DeleteUrlListPatchSchema = z.object({\n op: z.literal('delete_url_list'),\n fieldId: IdSchema,\n value: z.number().int().min(0),\n});\n\nexport const ClearFieldPatchSchema = z.object({\n op: z.literal('clear_field'),\n fieldId: IdSchema,\n});\n\nexport const SkipFieldPatchSchema = z.object({\n op: z.literal('skip_field'),\n fieldId: IdSchema,\n role: z.string(),\n reason: z.string().optional(),\n});\n\nexport const AbortFieldPatchSchema = z.object({\n op: z.literal('abort_field'),\n fieldId: IdSchema,\n role: z.string(),\n reason: z.string().optional(),\n});\n\nexport const AddNotePatchSchema = z.object({\n op: z.literal('add_note'),\n ref: IdSchema,\n role: z.string(),\n text: z.string(),\n});\n\nexport const RemoveNotePatchSchema = z.object({\n op: z.literal('remove_note'),\n noteId: NoteIdSchema,\n});\n\nexport const PatchSchema = z.discriminatedUnion('op', [\n SetStringPatchSchema,\n SetNumberPatchSchema,\n SetStringListPatchSchema,\n SetCheckboxesPatchSchema,\n SetSingleSelectPatchSchema,\n SetMultiSelectPatchSchema,\n SetUrlPatchSchema,\n SetUrlListPatchSchema,\n SetDatePatchSchema,\n SetYearPatchSchema,\n SetTablePatchSchema,\n AppendTablePatchSchema,\n DeleteTablePatchSchema,\n AppendStringListPatchSchema,\n DeleteStringListPatchSchema,\n AppendUrlListPatchSchema,\n DeleteUrlListPatchSchema,\n ClearFieldPatchSchema,\n SkipFieldPatchSchema,\n AbortFieldPatchSchema,\n AddNotePatchSchema,\n RemoveNotePatchSchema,\n]);\n\n// Harness schemas\nexport const StepResultSchema = z.object({\n structureSummary: StructureSummarySchema,\n progressSummary: ProgressSummarySchema,\n issues: z.array(InspectIssueSchema),\n stepBudget: z.number().int().nonnegative(),\n isComplete: z.boolean(),\n turnNumber: z.number().int().positive(),\n});\n\n// Session transcript schemas\nexport const HarnessConfigSchema = z.object({\n maxIssuesPerTurn: z.number().int().positive(),\n maxPatchesPerTurn: z.number().int().positive(),\n maxTurns: z.number().int().positive(),\n maxFieldsPerTurn: z.number().int().positive().optional(),\n maxGroupsPerTurn: z.number().int().positive().optional(),\n targetRoles: z.array(z.string()).optional(),\n fillMode: FillModeSchema.optional(),\n maxParallelAgents: z.number().int().positive().optional(),\n});\n\nexport const SessionTurnStatsSchema = z.object({\n inputTokens: z.number().int().nonnegative().optional(),\n outputTokens: z.number().int().nonnegative().optional(),\n toolCalls: z\n .array(\n z.object({\n name: z.string(),\n count: z.number().int().positive(),\n }),\n )\n .optional(),\n});\n\nexport const SessionTurnContextSchema = z.object({\n systemPrompt: z.string(),\n contextPrompt: z.string(),\n});\n\n// Wire format Zod schemas for session logging\nexport const WireToolCallSchema = z.object({\n toolName: z.string(),\n input: z.unknown(),\n});\n\nexport const WireToolResultSchema = z.object({\n toolName: z.string(),\n result: z.unknown(),\n});\n\nexport const WireResponseStepSchema = z.object({\n toolCalls: z.array(WireToolCallSchema),\n toolResults: z.array(WireToolResultSchema),\n text: z.string().nullable(),\n});\n\nexport const WireRequestFormatSchema = z.object({\n system: z.string(),\n prompt: z.string(),\n tools: z.record(\n z.string(),\n z.object({\n description: z.string(),\n inputSchema: z.unknown(),\n }),\n ),\n});\n\nexport const WireResponseFormatSchema = z.object({\n steps: z.array(WireResponseStepSchema),\n usage: z.object({\n inputTokens: z.number().int().nonnegative(),\n outputTokens: z.number().int().nonnegative(),\n }),\n});\n\nexport const WireFormatSchema = z.object({\n request: WireRequestFormatSchema,\n response: WireResponseFormatSchema,\n});\n\nexport const SessionTurnSchema = z.object({\n turn: z.number().int().positive(),\n inspect: z.object({\n issues: z.array(InspectIssueSchema),\n }),\n context: SessionTurnContextSchema.optional(),\n apply: z.object({\n patches: z.array(PatchSchema),\n rejectedPatches: z.array(PatchRejectionSchema).optional(),\n warnings: z.array(PatchWarningSchema).optional(),\n }),\n after: z.object({\n requiredIssueCount: z.number().int().nonnegative(),\n markdownSha256: z.string(),\n answeredFieldCount: z.number().int().nonnegative(),\n skippedFieldCount: z.number().int().nonnegative(),\n }),\n llm: SessionTurnStatsSchema.optional(),\n wire: WireFormatSchema.optional(),\n});\n\nexport const SessionFinalSchema = z.object({\n expectComplete: z.boolean(),\n expectedCompletedForm: z.string(),\n});\n\nexport const SessionTranscriptSchema = z.object({\n sessionVersion: z.string(),\n mode: MockModeSchema,\n form: z.object({\n path: z.string(),\n }),\n validators: z\n .object({\n code: z.string().optional(),\n })\n .optional(),\n mock: z\n .object({\n completedMock: z.string(),\n })\n .optional(),\n live: z\n .object({\n modelId: z.string(),\n })\n .optional(),\n harness: HarnessConfigSchema,\n turns: z.array(SessionTurnSchema),\n final: SessionFinalSchema,\n});\n\n// Frontmatter schema\nexport const MarkformFrontmatterSchema = z.object({\n markformVersion: z.string(),\n formSummary: StructureSummarySchema,\n formProgress: ProgressSummarySchema,\n formState: ProgressStateSchema,\n});\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fillRecordRenderer-VBQ2vwPV.mjs","names":[],"sources":["../src/render/renderUtils.ts","../src/render/contentRenderers.ts","../src/render/fillRecordRenderer.ts"],"sourcesContent":["/**\n * Rendering utility functions for HTML generation.\n *\n * Pure utility functions used across all renderers. No CLI or server dependencies.\n */\n\n/**\n * Escape HTML special characters.\n */\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Format milliseconds as human-readable duration.\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Format token count with K suffix for large numbers.\n */\nexport function formatTokens(count: number): string {\n if (count >= 10000) return `${(count / 1000).toFixed(1)}k`;\n if (count >= 1000) return `${(count / 1000).toFixed(1)}k`;\n return count.toLocaleString();\n}\n","/**\n * Content-only HTML renderers for form views and syntax-highlighted content.\n *\n * These produce HTML fragments (no page shell) suitable for embedding.\n * No CLI or server dependencies.\n */\n\nimport type { Field, FieldValue, ParsedForm } from '../engine/coreTypes.js';\nimport { friendlyUrlAbbrev, formatBareUrlsAsHtmlLinks } from '../utils/urlFormat.js';\nimport { escapeHtml } from './renderUtils.js';\n\n// =============================================================================\n// View Content Renderer\n// =============================================================================\n\n/**\n * Format a checkbox state for display.\n */\nfunction formatCheckboxState(state: string): string {\n switch (state) {\n case 'done':\n return '<span class=\"checkbox checked\">☑</span>';\n case 'todo':\n return '<span class=\"checkbox unchecked\">☐</span>';\n case 'active':\n return '<span class=\"state-badge state-active\">●</span>';\n case 'incomplete':\n return '<span class=\"state-badge state-incomplete\">○</span>';\n case 'na':\n return '<span class=\"state-badge state-na\">—</span>';\n case 'yes':\n return '<span class=\"checkbox checked\">☑</span>';\n case 'no':\n return '<span class=\"checkbox unchecked\">☐</span>';\n case 'unfilled':\n return '<span class=\"state-badge state-unfilled\">?</span>';\n default:\n return `<span class=\"state-badge\">${escapeHtml(state)}</span>`;\n }\n}\n\n/**\n * Render a field value for the View tab.\n */\nfunction renderViewFieldValue(\n field: Field,\n value: FieldValue | undefined,\n isSkipped: boolean,\n skipReason?: string,\n): string {\n if (isSkipped) {\n const reasonText = skipReason ? `(skipped: ${escapeHtml(skipReason)})` : '(skipped)';\n return `<div class=\"view-field-empty\">${reasonText}</div>`;\n }\n\n if (value === undefined) {\n return '<div class=\"view-field-empty\">(not filled)</div>';\n }\n\n switch (field.kind) {\n case 'string': {\n const v = value.kind === 'string' ? value.value : null;\n if (v === null || v === '') {\n return '<div class=\"view-field-empty\">(not filled)</div>';\n }\n // Auto-link bare URLs in string content for consistency with URL fields\n const formatted = formatBareUrlsAsHtmlLinks(v, escapeHtml);\n return `<div class=\"view-field-value\">${formatted}</div>`;\n }\n case 'number': {\n const v = value.kind === 'number' ? value.value : null;\n if (v === null) {\n return '<div class=\"view-field-empty\">(not filled)</div>';\n }\n return `<div class=\"view-field-value\">${v}</div>`;\n }\n case 'string_list': {\n const items = value.kind === 'string_list' ? value.items : [];\n if (items.length === 0) {\n return '<div class=\"view-field-empty\">(not filled)</div>';\n }\n // Auto-link bare URLs in string list items\n return `<div class=\"view-field-value\"><ul>${items.map((i) => `<li>${formatBareUrlsAsHtmlLinks(i, escapeHtml)}</li>`).join('')}</ul></div>`;\n }\n case 'single_select': {\n const selected = value.kind === 'single_select' ? value.selected : null;\n if (selected === null) {\n return '<div class=\"view-field-empty\">(not filled)</div>';\n }\n const opt = field.options.find((o) => o.id === selected);\n return `<div class=\"view-field-value\">${escapeHtml(opt?.label ?? selected)}</div>`;\n }\n case 'multi_select': {\n const selected = value.kind === 'multi_select' ? value.selected : [];\n // Show all options with selection state\n const items = field.options.map((opt) => {\n const isSelected = selected.includes(opt.id);\n const checkbox = isSelected\n ? '<span class=\"checkbox checked\">☑</span>'\n : '<span class=\"checkbox unchecked\">☐</span>';\n return `<li class=\"checkbox-item\">${checkbox} ${escapeHtml(opt.label)}</li>`;\n });\n return `<div class=\"view-field-value\"><ul class=\"checkbox-list\">${items.join('')}</ul></div>`;\n }\n case 'checkboxes': {\n const values = value.kind === 'checkboxes' ? value.values : {};\n const mode = field.checkboxMode ?? 'multi';\n // Show all options with their state\n const items = field.options.map((opt) => {\n const state = values[opt.id] ?? (mode === 'explicit' ? 'unfilled' : 'todo');\n // For simple mode, use checkbox symbols\n if (mode === 'simple') {\n const checkbox =\n state === 'done'\n ? '<span class=\"checkbox checked\">☑</span>'\n : '<span class=\"checkbox unchecked\">☐</span>';\n return `<li class=\"checkbox-item\">${checkbox} ${escapeHtml(opt.label)}</li>`;\n }\n // For multi/explicit modes, show state text since there are multiple states\n const stateDisplay = formatCheckboxState(state);\n return `<li class=\"checkbox-item\">${stateDisplay} ${escapeHtml(opt.label)}</li>`;\n });\n return `<div class=\"view-field-value\"><ul class=\"checkbox-list\">${items.join('')}</ul></div>`;\n }\n case 'url': {\n const v = value.kind === 'url' ? value.value : null;\n if (v === null || v === '') {\n return '<div class=\"view-field-empty\">(not filled)</div>';\n }\n const domain = friendlyUrlAbbrev(v);\n return `<div class=\"view-field-value\"><a href=\"${escapeHtml(v)}\" target=\"_blank\" class=\"url-link\" data-url=\"${escapeHtml(v)}\">${escapeHtml(domain)}</a></div>`;\n }\n case 'url_list': {\n const items = value.kind === 'url_list' ? value.items : [];\n if (items.length === 0) {\n return '<div class=\"view-field-empty\">(not filled)</div>';\n }\n return `<div class=\"view-field-value\"><ul>${items\n .map((u) => {\n const domain = friendlyUrlAbbrev(u);\n return `<li><a href=\"${escapeHtml(u)}\" target=\"_blank\" class=\"url-link\" data-url=\"${escapeHtml(u)}\">${escapeHtml(domain)}</a></li>`;\n })\n .join('')}</ul></div>`;\n }\n case 'date': {\n const v = value.kind === 'date' ? value.value : null;\n if (v === null || v === '') {\n return '<div class=\"view-field-empty\">(not filled)</div>';\n }\n return `<div class=\"view-field-value\">${escapeHtml(v)}</div>`;\n }\n case 'year': {\n const v = value.kind === 'year' ? value.value : null;\n if (v === null) {\n return '<div class=\"view-field-empty\">(not filled)</div>';\n }\n return `<div class=\"view-field-value\">${v}</div>`;\n }\n case 'table': {\n const rows = value.kind === 'table' ? value.rows : [];\n if (rows.length === 0) {\n return '<div class=\"view-field-empty\">(no data)</div>';\n }\n let tableHtml = '<div class=\"table-container\"><table class=\"data-table\">';\n tableHtml += '<thead><tr>';\n for (const col of field.columns) {\n tableHtml += `<th>${escapeHtml(col.label)}</th>`;\n }\n tableHtml += '</tr></thead><tbody>';\n for (const row of rows) {\n tableHtml += '<tr>';\n for (const col of field.columns) {\n const cell = row[col.id];\n let cellValue = '';\n let cellHtml = '';\n if (cell?.state === 'answered' && cell.value !== undefined && cell.value !== null) {\n cellValue = String(cell.value);\n // Format URL columns as domain links\n if (col.type === 'url' && cellValue) {\n const domain = friendlyUrlAbbrev(cellValue);\n cellHtml = `<a href=\"${escapeHtml(cellValue)}\" target=\"_blank\" class=\"url-link\" data-url=\"${escapeHtml(cellValue)}\">${escapeHtml(domain)}</a>`;\n } else {\n // Auto-link bare URLs in non-URL columns for consistency\n cellHtml = formatBareUrlsAsHtmlLinks(cellValue, escapeHtml);\n }\n }\n tableHtml += `<td>${cellHtml}</td>`;\n }\n tableHtml += '</tr>';\n }\n tableHtml += '</tbody></table></div>';\n return tableHtml;\n }\n default: {\n const _exhaustive: never = field;\n throw new Error(`Unhandled field kind: ${(_exhaustive as { kind: string }).kind}`);\n }\n }\n}\n\n/**\n * Render form view content (read-only display of form fields).\n * Used for View tab content.\n */\nexport function renderViewContent(form: ParsedForm): string {\n const { schema, responsesByFieldId } = form;\n let html = '<div class=\"view-content\">';\n\n for (const group of schema.groups) {\n const groupTitle = group.title ?? group.id;\n html += `<div class=\"view-group\"><h2>${escapeHtml(groupTitle)}</h2>`;\n\n for (const field of group.children) {\n const response = responsesByFieldId[field.id];\n const value = response?.state === 'answered' ? response.value : undefined;\n const isSkipped = response?.state === 'skipped';\n const skipReason = isSkipped ? response?.reason : undefined;\n\n html += '<div class=\"view-field\">';\n html += `<div class=\"view-field-label\">${escapeHtml(field.label)}`;\n html += ` <span class=\"type-badge\">${field.kind}</span>`;\n if (field.required) {\n html += ' <span class=\"required\">*</span>';\n }\n if (isSkipped) {\n html += ` <span class=\"skipped-badge\">Skipped</span>`;\n }\n html += '</div>';\n\n // Render value based on field type\n html += renderViewFieldValue(field, value, isSkipped, skipReason);\n html += '</div>';\n }\n\n html += '</div>';\n }\n\n html += '</div>';\n return html;\n}\n\n// =============================================================================\n// Source Content Renderer\n// =============================================================================\n\n/**\n * Highlight a single line of source code (Markdown + Jinja).\n */\nfunction highlightSourceLine(line: string): string {\n // First escape HTML\n let result = escapeHtml(line);\n\n // Highlight Jinja tags: {% tag %}, {% /tag %}, {# comment #}\n // Match {% ... %} patterns\n result = result.replace(\n /(\\{%\\s*)([a-zA-Z_/]+)(\\s+[^%]*)?(%\\})/g,\n (_: string, open: string, keyword: string, attrs: string | undefined, close: string) => {\n let attrHtml = '';\n if (attrs) {\n // Highlight attributes within the tag\n attrHtml = attrs.replace(\n /([a-zA-Z_]+)(=)(\"[^\"]*\"|'[^&#]*'|[^\\s%]+)?/g,\n (_m: string, attrName: string, eq: string, attrValue: string) => {\n const valueHtml = attrValue ? `<span class=\"syn-jinja-value\">${attrValue}</span>` : '';\n return `<span class=\"syn-jinja-attr\">${attrName}</span>${eq}${valueHtml}`;\n },\n );\n }\n return `<span class=\"syn-jinja-tag\">${open}</span><span class=\"syn-jinja-keyword\">${keyword}</span>${attrHtml}<span class=\"syn-jinja-tag\">${close}</span>`;\n },\n );\n\n // Highlight Jinja comments: {# ... #}\n result = result.replace(/(\\{#)(.*?)(#\\})/g, `<span class=\"syn-comment\">$1$2$3</span>`);\n\n // Highlight Markdown headers\n result = result.replace(/^(#{1,6}\\s.*)$/gm, '<span class=\"syn-md-header\">$1</span>');\n\n // Highlight YAML frontmatter markers\n if (result === '---') {\n result = '<span class=\"syn-comment\">---</span>';\n }\n\n return result;\n}\n\n/**\n * Render source content with Markdown and Jinja syntax highlighting.\n * Used for Source tab content.\n */\nexport function renderSourceContent(content: string): string {\n const lines = content.split('\\n');\n const highlighted = lines.map((line) => highlightSourceLine(line)).join('\\n');\n return `<pre>${highlighted}</pre>`;\n}\n\n// =============================================================================\n// Markdown Content Renderer\n// =============================================================================\n\n/**\n * Format inline markdown (bold, italic, code, links, checkboxes).\n * Also auto-links bare URLs for consistency.\n */\nfunction formatInlineMarkdown(text: string): string {\n let result = escapeHtml(text);\n // Checkboxes - render before other formatting to avoid conflicts\n // Checked checkbox [x] or [X]\n result = result.replace(/\\[x\\]/gi, '<span class=\"checkbox checked\">☑</span>');\n // Unchecked checkbox [ ]\n result = result.replace(/\\[ \\]/g, '<span class=\"checkbox unchecked\">☐</span>');\n // Inline code\n result = result.replace(/`([^`]+)`/g, '<code>$1</code>');\n // Bold\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n // Italic\n result = result.replace(/\\*([^*]+)\\*/g, '<em>$1</em>');\n // Links - need to unescape the URL first\n // Add url-link class and data-url for copy tooltip support\n result = result.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n (_: string, linkText: string, url: string) => {\n const cleanUrl = url.replace(/&/g, '&');\n return `<a href=\"${cleanUrl}\" target=\"_blank\" class=\"url-link\" data-url=\"${cleanUrl}\">${linkText}</a>`;\n },\n );\n // Auto-link bare URLs (not already in <a> tags or markdown links)\n // Uses negative lookbehind to skip URLs that are:\n // - Inside href=\"\" or data-url=\"\" attributes\n // - Inside anchor tag content (preceded by \">)\n // - Part of markdown link syntax ](\n result = result.replace(\n /(?<!href=\"|data-url=\"|\">|\\]\\()(?:https?:\\/\\/|www\\.)[^\\s<>\"]+(?<![.,;:!?'\")])/g,\n (url: string) => {\n // Unescape & back to & for the URL\n const cleanUrl = url.replace(/&/g, '&');\n const fullUrl = cleanUrl.startsWith('www.') ? `https://${cleanUrl}` : cleanUrl;\n const display = friendlyUrlAbbrev(fullUrl);\n return `<a href=\"${escapeHtml(fullUrl)}\" target=\"_blank\" class=\"url-link\" data-url=\"${escapeHtml(fullUrl)}\">${escapeHtml(display)}</a>`;\n },\n );\n return result;\n}\n\n/**\n * Render markdown content (content only, no page wrapper).\n * Used for tab content.\n */\nexport function renderMarkdownContent(content: string): string {\n const lines = content.split('\\n');\n let html = '<div class=\"markdown-content\">';\n let inParagraph = false;\n let inCodeBlock = false;\n let codeBlockContent = '';\n let inUnorderedList = false;\n let inOrderedList = false;\n let inTable = false;\n let tableHeaderDone = false;\n\n // Helper to close any open list\n const closeList = () => {\n if (inUnorderedList) {\n html += '</ul>';\n inUnorderedList = false;\n }\n if (inOrderedList) {\n html += '</ol>';\n inOrderedList = false;\n }\n };\n\n // Helper to close table\n const closeTable = () => {\n if (inTable) {\n html += '</tbody></table></div>';\n inTable = false;\n tableHeaderDone = false;\n }\n };\n\n // Helper to detect if a line is a table row\n const isTableRow = (line: string): boolean => {\n const trimmed = line.trim();\n return trimmed.startsWith('|') && trimmed.endsWith('|') && trimmed.includes('|');\n };\n\n // Helper to detect table separator line (| --- | --- |)\n const isTableSeparator = (line: string): boolean => {\n const trimmed = line.trim();\n return /^\\|[\\s-:|]+\\|$/.test(trimmed);\n };\n\n // Helper to parse table cells\n const parseTableCells = (line: string): string[] => {\n const trimmed = line.trim();\n // Remove leading and trailing pipes, then split by pipes\n const cellContent = trimmed.slice(1, -1);\n return cellContent.split('|').map((cell) => cell.trim());\n };\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Handle fenced code blocks\n if (trimmed.startsWith('```')) {\n if (inCodeBlock) {\n // End code block\n html += `<pre><code>${escapeHtml(codeBlockContent.trim())}</code></pre>`;\n codeBlockContent = '';\n inCodeBlock = false;\n } else {\n // Start code block\n if (inParagraph) {\n html += '</p>';\n inParagraph = false;\n }\n closeList();\n closeTable();\n inCodeBlock = true;\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeBlockContent += line + '\\n';\n continue;\n }\n\n // Handle table rows\n if (isTableRow(trimmed)) {\n if (inParagraph) {\n html += '</p>';\n inParagraph = false;\n }\n closeList();\n\n // Skip separator line but mark header as done\n if (isTableSeparator(trimmed)) {\n tableHeaderDone = true;\n continue;\n }\n\n const cells = parseTableCells(trimmed);\n\n if (!inTable) {\n // Start new table with header\n html += '<div class=\"table-container\"><table class=\"data-table\"><thead><tr>';\n for (const cell of cells) {\n html += `<th>${formatInlineMarkdown(cell)}</th>`;\n }\n html += '</tr></thead><tbody>';\n inTable = true;\n } else if (tableHeaderDone) {\n // Regular table row\n html += '<tr>';\n for (const cell of cells) {\n html += `<td>${formatInlineMarkdown(cell)}</td>`;\n }\n html += '</tr>';\n }\n continue;\n }\n\n // Close table if we hit a non-table line\n if (inTable && !isTableRow(trimmed)) {\n closeTable();\n }\n\n // Handle headers\n if (trimmed.startsWith('# ')) {\n if (inParagraph) {\n html += '</p>';\n inParagraph = false;\n }\n closeList();\n html += `<h2>${formatInlineMarkdown(trimmed.slice(2))}</h2>`;\n } else if (trimmed.startsWith('## ')) {\n if (inParagraph) {\n html += '</p>';\n inParagraph = false;\n }\n closeList();\n html += `<h3>${formatInlineMarkdown(trimmed.slice(3))}</h3>`;\n } else if (trimmed.startsWith('### ')) {\n if (inParagraph) {\n html += '</p>';\n inParagraph = false;\n }\n closeList();\n html += `<h4>${formatInlineMarkdown(trimmed.slice(4))}</h4>`;\n } else if (trimmed.startsWith('#### ')) {\n if (inParagraph) {\n html += '</p>';\n inParagraph = false;\n }\n closeList();\n html += `<h5>${formatInlineMarkdown(trimmed.slice(5))}</h5>`;\n } else if (trimmed.startsWith('- ') || trimmed.startsWith('* ')) {\n // Unordered list item\n if (inParagraph) {\n html += '</p>';\n inParagraph = false;\n }\n if (inOrderedList) {\n html += '</ol>';\n inOrderedList = false;\n }\n if (!inUnorderedList) {\n html += '<ul>';\n inUnorderedList = true;\n }\n const itemContent = trimmed.slice(2);\n // If item starts with checkbox, use no-bullet class\n const hasCheckbox = /^\\[[ xX]\\]/.test(itemContent);\n const liClass = hasCheckbox ? ' class=\"checkbox-item\"' : '';\n html += `<li${liClass}>${formatInlineMarkdown(itemContent)}</li>`;\n } else if (/^\\d+\\.\\s/.test(trimmed)) {\n // Ordered list item\n if (inParagraph) {\n html += '</p>';\n inParagraph = false;\n }\n if (inUnorderedList) {\n html += '</ul>';\n inUnorderedList = false;\n }\n if (!inOrderedList) {\n html += '<ol>';\n inOrderedList = true;\n }\n const text = trimmed.replace(/^\\d+\\.\\s/, '');\n html += `<li>${formatInlineMarkdown(text)}</li>`;\n } else if (trimmed === '') {\n if (inParagraph) {\n html += '</p>';\n inParagraph = false;\n }\n closeList();\n } else {\n closeList();\n if (!inParagraph) {\n html += '<p>';\n inParagraph = true;\n } else {\n html += '<br>';\n }\n html += formatInlineMarkdown(trimmed);\n }\n }\n\n if (inParagraph) {\n html += '</p>';\n }\n closeList();\n closeTable();\n\n html += '</div>';\n return html;\n}\n\n// =============================================================================\n// Syntax-Highlighted Content Renderers\n// =============================================================================\n\n/**\n * Highlight a YAML value with appropriate syntax class.\n */\nexport function highlightYamlValue(value: string): string {\n const trimmed = value.trim();\n // Booleans\n if (trimmed === 'true' || trimmed === 'false') {\n return `<span class=\"syn-bool\">${escapeHtml(value)}</span>`;\n }\n // Null\n if (trimmed === 'null' || trimmed === '~') {\n return `<span class=\"syn-null\">${escapeHtml(value)}</span>`;\n }\n // Numbers\n if (/^-?\\d+\\.?\\d*$/.test(trimmed)) {\n return `<span class=\"syn-number\">${escapeHtml(value)}</span>`;\n }\n // Quoted strings\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return `<span class=\"syn-string\">${escapeHtml(value)}</span>`;\n }\n // Unquoted strings (treat as string)\n return `<span class=\"syn-string\">${escapeHtml(value)}</span>`;\n}\n\n/**\n * Render YAML content with syntax highlighting (content only, no page wrapper).\n * Used for tab content.\n */\nexport function renderYamlContent(content: string): string {\n const highlighted = content\n .split('\\n')\n .map((line) => {\n if (line.trim().startsWith('#')) {\n return `<span class=\"syn-comment\">${escapeHtml(line)}</span>`;\n }\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0 && !line.trim().startsWith('-')) {\n const key = escapeHtml(line.slice(0, colonIndex));\n const afterColon = line.slice(colonIndex + 1).trim();\n const colonAndSpace = escapeHtml(line.slice(colonIndex, colonIndex + 1));\n if (afterColon === '') {\n return `<span class=\"syn-key\">${key}</span>${colonAndSpace}`;\n }\n const valueStart = line.indexOf(afterColon, colonIndex);\n const beforeValue = escapeHtml(line.slice(colonIndex, valueStart));\n const value = highlightYamlValue(afterColon);\n return `<span class=\"syn-key\">${key}</span>${beforeValue}${value}`;\n }\n if (line.trim().startsWith('-')) {\n const dashIndex = line.indexOf('-');\n const beforeDash = escapeHtml(line.slice(0, dashIndex));\n const afterDash = line.slice(dashIndex + 1).trim();\n if (afterDash === '') {\n return `${beforeDash}-`;\n }\n return `${beforeDash}- ${highlightYamlValue(afterDash)}`;\n }\n return escapeHtml(line);\n })\n .join('\\n');\n\n return `<pre>${highlighted}</pre>`;\n}\n\n/**\n * Render JSON content with syntax highlighting (content only, no page wrapper).\n * Used for tab content.\n */\nexport function renderJsonContent(content: string): string {\n let formatted: string;\n try {\n const parsed = JSON.parse(content) as unknown;\n formatted = JSON.stringify(parsed, null, 2);\n } catch {\n formatted = content;\n }\n\n const highlighted = formatted\n .replace(/\"([^\"]+)\":/g, '<span class=\"syn-key\">\"$1\"</span>:')\n .replace(/: \"([^\"]*)\"/g, ': <span class=\"syn-string\">\"$1\"</span>')\n .replace(/: (-?\\d+\\.?\\d*)/g, ': <span class=\"syn-number\">$1</span>')\n .replace(/: (true|false)/g, ': <span class=\"syn-bool\">$1</span>')\n .replace(/: (null)/g, ': <span class=\"syn-null\">$1</span>');\n\n return `<pre>${highlighted}</pre>`;\n}\n","/**\n * Fill record HTML renderer and associated styles/scripts.\n *\n * Renders FillRecord data as an interactive dashboard with Gantt timeline,\n * progress bars, tool summaries, and turn details. No CLI or server dependencies.\n */\n\nimport YAML from 'yaml';\n\nimport type { FillRecord } from '../harness/fillRecord.js';\nimport { escapeHtml, formatDuration, formatTokens } from './renderUtils.js';\nimport { renderYamlContent } from './contentRenderers.js';\n\n// =============================================================================\n// Fill Record Interactive Scripts\n// =============================================================================\n\n/**\n * JavaScript for fill record interactive features.\n * Consumers should include this in a <script> tag on their page.\n * Provides: frShowTip(el), frHideTip(), frCopyYaml(btn)\n */\nexport const FILL_RECORD_SCRIPTS = `\n// Copy YAML content handler for Fill Record tab (must be global for dynamically loaded content)\nfunction frCopyYaml(btn) {\n const pre = btn.parentElement.querySelector('pre');\n navigator.clipboard.writeText(pre.textContent).then(() => {\n const orig = btn.textContent;\n btn.textContent = 'Copied!';\n setTimeout(() => btn.textContent = orig, 1500);\n });\n}\n\n// Tooltip handlers for Fill Record visualizations (must be global for dynamically loaded content)\nfunction frShowTip(el) {\n var tip = document.getElementById('fr-tooltip');\n if (tip && el.dataset.tooltip) {\n tip.textContent = el.dataset.tooltip;\n // Position tooltip centered above the element\n var rect = el.getBoundingClientRect();\n tip.style.left = (rect.left + rect.width / 2) + 'px';\n tip.style.top = (rect.top - 8) + 'px';\n tip.style.transform = 'translate(-50%, -100%)';\n tip.classList.add('visible');\n }\n}\nfunction frHideTip() {\n var tip = document.getElementById('fr-tooltip');\n if (tip) tip.classList.remove('visible');\n}\n`;\n\n// =============================================================================\n// Private Helpers\n// =============================================================================\n\n/**\n * Format a patch value for display.\n * Shows full content - the container has max-height with scroll for long values.\n */\nfunction formatPatchValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '<em class=\"fr-turn__patch-value--clear\">(cleared)</em>';\n }\n if (typeof value === 'string') {\n return escapeHtml(value);\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n // Arrays and objects - show full JSON\n return escapeHtml(JSON.stringify(value, null, 2));\n}\n\n/**\n * Render patches from a fill_form tool call input.\n * Returns HTML for the patch details section.\n */\nfunction renderPatchDetails(input: Record<string, unknown>): string {\n const patches = input.patches;\n if (!Array.isArray(patches) || patches.length === 0) {\n return '';\n }\n\n const patchHtml = patches\n .map((patch: unknown) => {\n if (!patch || typeof patch !== 'object') return '';\n const p = patch as Record<string, unknown>;\n const op = typeof p.op === 'string' ? p.op : 'unknown';\n const fieldId =\n typeof p.fieldId === 'string' ? p.fieldId : typeof p.noteId === 'string' ? p.noteId : '';\n\n // Determine the display based on operation type\n const opLabel = op.replace(/_/g, ' ');\n let valueHtml = '';\n\n if (op === 'skip_field') {\n valueHtml = '<em class=\"fr-turn__patch-value--skip\">(skipped)</em>';\n } else if (op === 'abort_field') {\n valueHtml = '<em class=\"fr-turn__patch-value--skip\">(aborted)</em>';\n } else if (op === 'clear_field') {\n valueHtml = '<em class=\"fr-turn__patch-value--clear\">(cleared)</em>';\n } else if ('value' in p) {\n valueHtml = formatPatchValue(p.value);\n } else if ('values' in p) {\n valueHtml = formatPatchValue(p.values);\n } else if ('rows' in p) {\n valueHtml = formatPatchValue(p.rows);\n }\n\n return `\n <div class=\"fr-turn__patch\">\n <span class=\"fr-turn__patch-field\">${escapeHtml(fieldId)}</span>\n <span class=\"fr-turn__patch-op\">${escapeHtml(opLabel)}</span>\n <span class=\"fr-turn__patch-value\">${valueHtml}</span>\n </div>\n `;\n })\n .filter(Boolean)\n .join('');\n\n return `<div class=\"fr-turn__patches\">${patchHtml}</div>`;\n}\n\n/**\n * Render a single tool call with enhanced details.\n * Shows query for web_search, patch details for fill_form.\n */\nfunction renderToolCall(tc: {\n tool: string;\n success: boolean;\n durationMs: number;\n input: Record<string, unknown>;\n result?: { error?: string; resultCount?: number };\n}): string {\n const hasError = !!tc.result?.error;\n const icon = tc.success ? '✓' : '✕';\n const errorClass = hasError ? ' fr-turn__tool--error' : '';\n\n // Build result summary\n let resultSummary = '';\n if (hasError) {\n resultSummary = `Error: ${escapeHtml(tc.result?.error ?? '')}`;\n } else if (tc.result?.resultCount !== undefined) {\n resultSummary = `${tc.result.resultCount} results`;\n } else {\n resultSummary = 'OK';\n }\n\n // Build tool-specific details\n let detailHtml = '';\n if (tc.tool === 'web_search' && typeof tc.input.query === 'string') {\n const query = escapeHtml(tc.input.query);\n detailHtml = ` <span class=\"fr-turn__query\">\"${query}\"</span>`;\n }\n\n // Base tool call line\n const toolLine = `<li class=\"fr-turn__tool${errorClass}\">${icon} <strong>${escapeHtml(tc.tool)}</strong>${detailHtml}: ${resultSummary} (${formatDuration(tc.durationMs)})</li>`;\n\n // For fill_form, add patch details\n if (tc.tool === 'fill_form' && tc.input.patches) {\n const patchDetails = renderPatchDetails(tc.input);\n if (patchDetails) {\n return toolLine + patchDetails;\n }\n }\n\n return toolLine;\n}\n\n/**\n * CSS styles for fill record visualization.\n * Uses CSS custom properties for theming (supports dark mode via prefers-color-scheme).\n * Designed to be lightweight, reusable, and embeddable.\n */\nexport const FILL_RECORD_STYLES = `\n<style>\n .fr-dashboard {\n --fr-bg: #ffffff;\n --fr-bg-muted: #f9fafb;\n --fr-bg-subtle: #f3f4f6;\n --fr-border: #e5e7eb;\n --fr-text: #111827;\n --fr-text-muted: #6b7280;\n --fr-primary: #3b82f6;\n --fr-success: #22c55e;\n --fr-warning: #f59e0b;\n --fr-error: #ef4444;\n --fr-info: #6b7280;\n\n /* Typography - consolidated to fewer sizes */\n --fr-font-sm: 13px;\n --fr-font-base: 14px;\n --fr-font-lg: 20px;\n\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n padding: 20px;\n max-width: 900px;\n margin: 0 auto;\n color: var(--fr-text);\n line-height: 1.5;\n }\n\n @media (prefers-color-scheme: dark) {\n .fr-dashboard {\n --fr-bg: #1f2937;\n --fr-bg-muted: #374151;\n --fr-bg-subtle: #4b5563;\n --fr-border: #4b5563;\n --fr-text: #f9fafb;\n --fr-text-muted: #9ca3af;\n }\n }\n\n .fr-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n padding-bottom: 12px;\n border-bottom: 1px solid var(--fr-border);\n }\n .fr-header__model {\n font-weight: 600;\n font-size: var(--fr-font-base);\n color: var(--fr-text);\n }\n .fr-header__time {\n font-weight: 600;\n font-size: var(--fr-font-base);\n color: var(--fr-text);\n }\n\n .fr-banner {\n border-radius: 8px;\n padding: 12px 16px;\n margin-bottom: 20px;\n font-size: var(--fr-font-base);\n }\n .fr-banner--error {\n background: color-mix(in srgb, var(--fr-error) 10%, var(--fr-bg));\n border: 1px solid var(--fr-error);\n }\n .fr-banner--warning {\n background: color-mix(in srgb, var(--fr-warning) 10%, var(--fr-bg));\n border: 1px solid var(--fr-warning);\n }\n\n .fr-cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 16px;\n margin-bottom: 24px;\n }\n\n .fr-card {\n padding: 16px;\n background: var(--fr-bg-muted);\n border-radius: 8px;\n text-align: center;\n }\n .fr-card__label {\n font-size: var(--fr-font-sm);\n color: var(--fr-text-muted);\n margin-bottom: 4px;\n }\n .fr-card__value {\n font-size: var(--fr-font-lg);\n font-weight: 600;\n }\n .fr-card__sub {\n font-size: var(--fr-font-sm);\n color: var(--fr-text-muted);\n margin-top: 2px;\n }\n\n .fr-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 4px;\n font-weight: 600;\n font-size: var(--fr-font-sm);\n }\n .fr-badge--completed { background: color-mix(in srgb, var(--fr-success) 15%, transparent); color: var(--fr-success); }\n .fr-badge--partial { background: color-mix(in srgb, var(--fr-warning) 15%, transparent); color: var(--fr-warning); }\n .fr-badge--cancelled { background: color-mix(in srgb, var(--fr-info) 15%, transparent); color: var(--fr-info); }\n .fr-badge--failed { background: color-mix(in srgb, var(--fr-error) 15%, transparent); color: var(--fr-error); }\n\n .fr-section {\n margin-bottom: 24px;\n }\n .fr-section__title {\n font-size: var(--fr-font-base);\n font-weight: 500;\n color: var(--fr-text);\n margin-bottom: 8px;\n }\n\n .fr-progress {\n background: var(--fr-border);\n border-radius: 4px;\n height: 20px;\n overflow: hidden;\n }\n .fr-progress__bar {\n background: var(--fr-primary);\n height: 100%;\n transition: width 0.3s ease;\n }\n .fr-progress__text {\n font-size: var(--fr-font-sm);\n color: var(--fr-text-muted);\n margin-top: 4px;\n }\n\n .fr-progress__segments {\n display: flex;\n height: 100%;\n width: 100%;\n }\n .fr-progress-segment {\n height: 100%;\n min-width: 2px;\n border-right: 2px solid var(--fr-bg);\n cursor: pointer;\n }\n .fr-progress-segment:last-child {\n border-right: none;\n }\n .fr-progress-segment--filled {\n background: var(--fr-primary);\n }\n .fr-progress-segment--filled:hover {\n background: color-mix(in srgb, var(--fr-primary) 70%, white);\n }\n .fr-progress-segment--prefilled {\n background: #8b5cf6;\n }\n .fr-progress-segment--prefilled:hover {\n background: color-mix(in srgb, #8b5cf6 70%, white);\n }\n .fr-progress-segment--skipped {\n background: var(--fr-warning);\n }\n .fr-progress-segment--skipped:hover {\n background: color-mix(in srgb, var(--fr-warning) 70%, white);\n }\n .fr-progress-segment--empty {\n background: var(--fr-border);\n }\n\n /* Gantt chart - each call on its own row */\n .fr-gantt {\n margin-bottom: 8px;\n }\n .fr-gantt__row {\n display: flex;\n align-items: center;\n height: 20px;\n margin-bottom: 3px;\n }\n .fr-gantt__label {\n width: 90px;\n flex-shrink: 0;\n font-size: 11px;\n color: var(--fr-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-right: 8px;\n text-align: right;\n }\n .fr-gantt__track {\n flex: 1;\n background: var(--fr-bg-subtle);\n border-radius: 3px;\n height: 14px;\n position: relative;\n }\n .fr-gantt__bar {\n position: absolute;\n top: 2px;\n height: calc(100% - 4px);\n min-width: 6px;\n border-radius: 2px;\n cursor: pointer;\n }\n .fr-gantt__bar:hover {\n filter: brightness(1.15);\n }\n .fr-gantt__bar--llm {\n background: var(--fr-primary);\n }\n .fr-gantt__bar--tool {\n background: var(--fr-success);\n }\n .fr-gantt__legend {\n display: flex;\n gap: 16px;\n font-size: var(--fr-font-sm);\n color: var(--fr-text-muted);\n margin-top: 12px;\n padding-top: 8px;\n border-top: 1px solid var(--fr-border);\n }\n .fr-gantt__legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .fr-gantt__legend-dot {\n width: 10px;\n height: 10px;\n border-radius: 2px;\n }\n .fr-gantt__legend-dot--llm { background: var(--fr-primary); }\n .fr-gantt__legend-dot--tool { background: var(--fr-success); }\n\n /* Tooltip container */\n .fr-tooltip {\n position: fixed;\n background: #1f2937;\n color: #f9fafb;\n padding: 8px 12px;\n border-radius: 4px;\n font-size: var(--fr-font-sm);\n white-space: pre-line;\n pointer-events: none;\n z-index: 1000;\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.05s ease-out, visibility 0.05s ease-out;\n }\n .fr-tooltip.visible {\n opacity: 1;\n visibility: visible;\n transition: opacity 0.2s ease-in, visibility 0.2s ease-in;\n }\n\n .fr-table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--fr-font-sm);\n }\n .fr-table th {\n padding: 8px 12px;\n text-align: left;\n font-weight: 600;\n background: var(--fr-bg-subtle);\n }\n .fr-table th:not(:first-child) { text-align: center; }\n .fr-table td {\n padding: 8px 12px;\n border-bottom: 1px solid var(--fr-border);\n }\n .fr-table td:not(:first-child) { text-align: center; }\n\n .fr-details {\n border: none;\n background: none;\n }\n .fr-details > summary {\n cursor: pointer;\n font-size: var(--fr-font-base);\n font-weight: 500;\n color: var(--fr-text);\n padding: 8px 0;\n list-style: none;\n }\n .fr-details > summary::-webkit-details-marker { display: none; }\n .fr-details > summary::before {\n content: '▶';\n display: inline-block;\n margin-right: 8px;\n transition: transform 0.2s;\n font-size: 11px;\n }\n .fr-details[open] > summary::before {\n transform: rotate(90deg);\n }\n .fr-details__content {\n background: var(--fr-bg-muted);\n border-radius: 8px;\n padding: 16px;\n margin-top: 8px;\n }\n\n .fr-turn {\n margin-bottom: 8px;\n background: var(--fr-bg-muted);\n border-radius: 4px;\n }\n .fr-turn summary {\n cursor: pointer;\n padding: 12px;\n font-size: var(--fr-font-sm);\n list-style: none;\n }\n .fr-turn summary::-webkit-details-marker { display: none; }\n .fr-turn summary::before {\n content: '▶';\n display: inline-block;\n margin-right: 8px;\n transition: transform 0.2s;\n font-size: 11px;\n }\n .fr-turn[open] summary::before {\n transform: rotate(90deg);\n }\n .fr-turn__content {\n padding: 0 12px 12px;\n }\n .fr-turn__tools {\n margin: 0;\n padding-left: 20px;\n list-style: none;\n }\n .fr-turn__tool {\n margin: 4px 0;\n font-size: var(--fr-font-sm);\n color: var(--fr-text-muted);\n }\n .fr-turn__tool--error { color: var(--fr-error); }\n\n .fr-turn__query {\n color: var(--fr-primary);\n font-style: italic;\n }\n\n .fr-turn__patches {\n margin: 4px 0 8px 20px;\n padding: 8px 12px;\n background: var(--fr-bg-subtle);\n border-radius: 4px;\n font-size: var(--fr-font-sm);\n }\n .fr-turn__patch {\n margin: 4px 0;\n padding: 4px 0;\n border-bottom: 1px solid var(--fr-border);\n }\n .fr-turn__patch:last-child {\n border-bottom: none;\n margin-bottom: 0;\n padding-bottom: 0;\n }\n .fr-turn__patch-field {\n font-weight: 600;\n color: var(--fr-text);\n }\n .fr-turn__patch-op {\n font-size: 11px;\n padding: 1px 4px;\n border-radius: 2px;\n background: var(--fr-bg-muted);\n color: var(--fr-text-muted);\n margin-left: 6px;\n }\n .fr-turn__patch-value {\n display: block;\n margin-top: 2px;\n color: var(--fr-text-muted);\n font-family: ui-monospace, 'SF Mono', Menlo, monospace;\n word-break: break-word;\n white-space: pre-wrap;\n max-height: 200px;\n overflow: auto;\n }\n .fr-turn__patch-value--skip {\n color: var(--fr-warning);\n font-style: italic;\n }\n .fr-turn__patch-value--clear {\n color: var(--fr-info);\n font-style: italic;\n }\n\n .fr-raw {\n position: relative;\n }\n .fr-copy-btn {\n position: absolute;\n top: 8px;\n right: 8px;\n padding: 4px 8px;\n font-size: var(--fr-font-sm);\n background: var(--fr-bg-subtle);\n border: 1px solid var(--fr-border);\n border-radius: 4px;\n cursor: pointer;\n color: var(--fr-text-muted);\n transition: all 0.15s;\n }\n .fr-copy-btn:hover {\n background: var(--fr-border);\n color: var(--fr-text);\n }\n .fr-copy-btn:active {\n transform: scale(0.95);\n }\n\n /* Scoped pre styles to override parent .tab-content pre */\n .fr-dashboard pre {\n background: var(--fr-bg-muted);\n color: var(--fr-text);\n padding: 1rem;\n border-radius: 6px;\n border: 1px solid var(--fr-border);\n overflow-x: auto;\n font-family: ui-monospace, 'SF Mono', Menlo, monospace;\n font-size: 0.85rem;\n line-height: 1.5;\n margin: 0;\n }\n\n /* Override syntax highlighting colors for dark mode compatibility */\n .fr-dashboard .syn-key { color: var(--fr-primary); }\n .fr-dashboard .syn-string { color: var(--fr-success); }\n .fr-dashboard .syn-number { color: var(--fr-primary); }\n .fr-dashboard .syn-bool { color: var(--fr-warning); }\n .fr-dashboard .syn-null { color: var(--fr-error); }\n\n @media (max-width: 600px) {\n .fr-dashboard { padding: 12px; }\n .fr-cards { grid-template-columns: repeat(2, 1fr); gap: 12px; }\n .fr-card { padding: 12px; }\n .fr-card__value { font-size: 18px; }\n .fr-table { font-size: var(--fr-font-sm); }\n .fr-table th, .fr-table td { padding: 6px 8px; }\n }\n</style>\n`;\n\n/**\n * Render fill record content (dashboard-style visualization).\n * Uses CSS custom properties for theming with automatic dark mode support.\n * Mobile responsive with grid-based layout.\n *\n * @public Exported for testing and reuse.\n */\nexport function renderFillRecordContent(record: FillRecord): string {\n const { status, statusDetail, startedAt, durationMs, llm, formProgress, toolSummary, timeline } =\n record;\n\n // Format start time for display\n const startDate = new Date(startedAt);\n const formattedDate = startDate.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n const formattedTime = startDate.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n\n // Header with model and timestamp\n const headerInfo = `\n <div class=\"fr-header\">\n <div class=\"fr-header__model\">${escapeHtml(llm.model)}</div>\n <div class=\"fr-header__time\">${formattedDate} at ${formattedTime}</div>\n </div>\n `;\n\n // Status banner for non-completed fills\n let statusBanner = '';\n if (status !== 'completed') {\n const bannerClass = status === 'failed' ? 'fr-banner--error' : 'fr-banner--warning';\n const icon = status === 'failed' ? '✕' : '⚠';\n const title = status === 'failed' ? 'FAILED' : status === 'cancelled' ? 'CANCELLED' : 'PARTIAL';\n const msg = statusDetail ?? (status === 'partial' ? 'Did not complete all fields' : '');\n statusBanner = `<div class=\"fr-banner ${bannerClass}\"><strong>${icon} ${title}${msg ? ':' : ''}</strong>${msg ? ` ${escapeHtml(msg)}` : ''}</div>`;\n }\n\n // Summary cards\n const totalTokens = llm.inputTokens + llm.outputTokens;\n const badgeClass = `fr-badge fr-badge--${status}`;\n const badgeIcon = { completed: '✓', partial: '⚠', cancelled: '⊘', failed: '✕' }[status] ?? '?';\n const badgeLabel = status.charAt(0).toUpperCase() + status.slice(1);\n\n const summaryCards = `\n <div class=\"fr-cards\">\n <div class=\"fr-card\">\n <div class=\"fr-card__label\">Status</div>\n <div><span class=\"${badgeClass}\">${badgeIcon} ${badgeLabel}</span></div>\n </div>\n <div class=\"fr-card\">\n <div class=\"fr-card__label\">Duration</div>\n <div class=\"fr-card__value\">${formatDuration(durationMs)}</div>\n </div>\n <div class=\"fr-card\">\n <div class=\"fr-card__label\">Turns</div>\n <div class=\"fr-card__value\">${timeline.length}</div>\n </div>\n <div class=\"fr-card\">\n <div class=\"fr-card__label\">Tokens</div>\n <div class=\"fr-card__value\">${formatTokens(totalTokens)}</div>\n <div class=\"fr-card__sub\">${formatTokens(llm.inputTokens)} in / ${formatTokens(llm.outputTokens)} out</div>\n </div>\n </div>\n `;\n\n // Progress bar\n // Extract filled fields from timeline to show individual segments\n // Use Map to deduplicate by fieldId, keeping only the last (final) state for each field\n const fieldsMap = new Map<string, { fieldId: string; op: string; turnNumber: number }>();\n for (const turn of timeline) {\n for (const tc of turn.toolCalls) {\n if (tc.tool === 'fill_form' && tc.input.patches) {\n const patches = tc.input.patches as { op?: string; fieldId?: string }[];\n for (const patch of patches) {\n if (patch.fieldId && patch.op) {\n fieldsMap.set(patch.fieldId, {\n fieldId: patch.fieldId,\n op: patch.op,\n turnNumber: turn.turnNumber,\n });\n }\n }\n }\n }\n }\n const fieldsFilled = Array.from(fieldsMap.values());\n\n const totalFields = formProgress.totalFields;\n const filledFields = formProgress.filledFields;\n const skippedFields = formProgress.skippedFields;\n const abortedFields = formProgress.abortedFields ?? 0;\n const progressPercent = totalFields > 0 ? Math.round((filledFields / totalFields) * 100) : 0;\n\n // Build progress segments\n const segmentWidth = totalFields > 0 ? 100 / totalFields : 0;\n\n // AI-filled fields (from timeline patches, excluding skip/abort)\n const aiFilledFields = fieldsFilled.filter(\n (f) => f.op !== 'skip_field' && f.op !== 'abort_field',\n );\n const aiFilledSegmentsHtml = aiFilledFields\n .map((f) => {\n const opLabel = f.op.replace(/_/g, ' ');\n const tooltip = `${f.fieldId}\\n${opLabel}\\nTurn ${f.turnNumber}`;\n return `<div class=\"fr-progress-segment fr-progress-segment--filled\" style=\"width: ${segmentWidth}%\" data-tooltip=\"${escapeHtml(tooltip)}\" onmouseenter=\"frShowTip(this)\" onmouseleave=\"frHideTip()\"></div>`;\n })\n .join('');\n\n // Pre-filled fields (filled before AI started, not in timeline)\n const prefilledCount = Math.max(0, filledFields - aiFilledFields.length);\n const prefilledSegmentsHtml =\n prefilledCount > 0\n ? `<div class=\"fr-progress-segment fr-progress-segment--prefilled\" style=\"width: ${segmentWidth * prefilledCount}%\" data-tooltip=\"Pre-filled (${prefilledCount} field${prefilledCount !== 1 ? 's' : ''})\" onmouseenter=\"frShowTip(this)\" onmouseleave=\"frHideTip()\"></div>`\n : '';\n\n // Skipped/aborted fields\n const skippedSegmentsHtml = fieldsFilled\n .filter((f) => f.op === 'skip_field' || f.op === 'abort_field')\n .map((f) => {\n const opLabel = f.op === 'skip_field' ? 'skipped' : 'aborted';\n const tooltip = `${f.fieldId}\\n${opLabel}\\nTurn ${f.turnNumber}`;\n return `<div class=\"fr-progress-segment fr-progress-segment--skipped\" style=\"width: ${segmentWidth}%\" data-tooltip=\"${escapeHtml(tooltip)}\" onmouseenter=\"frShowTip(this)\" onmouseleave=\"frHideTip()\"></div>`;\n })\n .join('');\n\n // Empty segments for unfilled fields\n const unfilledCount = totalFields - filledFields - skippedFields - abortedFields;\n const unfilledSegmentsHtml =\n unfilledCount > 0\n ? `<div class=\"fr-progress-segment fr-progress-segment--empty\" style=\"width: ${segmentWidth * unfilledCount}%\"></div>`\n : '';\n\n // Build progress text with details\n const progressDetails: string[] = [];\n if (prefilledCount > 0) progressDetails.push(`${prefilledCount} pre-filled`);\n if (skippedFields > 0) progressDetails.push(`${skippedFields} skipped`);\n const progressDetailsText = progressDetails.length > 0 ? ` • ${progressDetails.join(' • ')}` : '';\n\n const progressBar = `\n <div class=\"fr-section\">\n <div class=\"fr-section__title\">Progress</div>\n <div class=\"fr-progress\">\n <div class=\"fr-progress__segments\">\n ${prefilledSegmentsHtml}${aiFilledSegmentsHtml}${skippedSegmentsHtml}${unfilledSegmentsHtml}\n </div>\n </div>\n <div class=\"fr-progress__text\">\n ${filledFields}/${totalFields} fields filled (${progressPercent}%)${progressDetailsText}\n </div>\n </div>\n `;\n\n // Gantt-style timeline visualization\n // Calculate actual start/end times for each call\n const totalMs = durationMs;\n const llmCallCount = llm.totalCalls;\n const toolCallCount = toolSummary.totalCalls;\n\n // Build timeline events with actual positions\n // For each turn: LLM call happens first, then tool calls sequentially\n interface TimelineEvent {\n type: 'llm' | 'tool';\n startMs: number;\n durationMs: number;\n turnNumber: number;\n label: string;\n tokens?: { input: number; output: number; total: number };\n }\n\n const timelineEvents: TimelineEvent[] = [];\n\n for (const turn of timeline) {\n const toolTimeInTurn = turn.toolCalls.reduce((sum, tc) => sum + tc.durationMs, 0);\n const llmTimeInTurn = Math.max(0, turn.durationMs - toolTimeInTurn);\n\n // LLM call for this turn - starts at turn.startMs\n if (llmTimeInTurn > 0) {\n timelineEvents.push({\n type: 'llm',\n startMs: turn.startMs,\n durationMs: llmTimeInTurn,\n turnNumber: turn.turnNumber,\n label: `Turn ${turn.turnNumber}`,\n tokens: {\n input: turn.tokens.input,\n output: turn.tokens.output,\n total: turn.tokens.input + turn.tokens.output,\n },\n });\n }\n\n // Tool calls for this turn - use pre-computed startMs\n for (const tc of turn.toolCalls) {\n timelineEvents.push({\n type: 'tool',\n startMs: tc.startMs,\n durationMs: tc.durationMs,\n turnNumber: turn.turnNumber,\n label: tc.tool,\n });\n }\n }\n\n // Render Gantt chart rows - each event gets its own row\n const ganttRowsHtml = timelineEvents\n .map((e) => {\n const leftPct = totalMs > 0 ? (e.startMs / totalMs) * 100 : 0;\n const widthPct = totalMs > 0 ? (e.durationMs / totalMs) * 100 : 0;\n const barClass = e.type === 'llm' ? 'fr-gantt__bar--llm' : 'fr-gantt__bar--tool';\n const startTime = `Start: ${formatDuration(e.startMs)}`;\n const tooltip =\n e.type === 'llm'\n ? `${e.label} ${startTime} Duration: ${formatDuration(e.durationMs)} ${formatTokens(e.tokens?.total ?? 0)} tokens (${formatTokens(e.tokens?.input ?? 0)} in / ${formatTokens(e.tokens?.output ?? 0)} out)`\n : `${e.label} ${startTime} Duration: ${formatDuration(e.durationMs)} Turn ${e.turnNumber}`;\n\n return `\n <div class=\"fr-gantt__row\">\n <div class=\"fr-gantt__label\">${escapeHtml(e.label)}</div>\n <div class=\"fr-gantt__track\">\n <div class=\"fr-gantt__bar ${barClass}\" style=\"left: ${leftPct}%; width: ${widthPct}%\" data-tooltip=\"${tooltip}\" onmouseenter=\"frShowTip(this)\" onmouseleave=\"frHideTip()\"></div>\n </div>\n </div>`;\n })\n .join('');\n\n const llmTotalMs = timelineEvents\n .filter((e) => e.type === 'llm')\n .reduce((sum, e) => sum + e.durationMs, 0);\n const toolTotalMs = timelineEvents\n .filter((e) => e.type === 'tool')\n .reduce((sum, e) => sum + e.durationMs, 0);\n\n const timingSection = `\n <details class=\"fr-details fr-section\" open>\n <summary>Timeline (${formatDuration(totalMs)} total)</summary>\n <div class=\"fr-details__content\">\n <div class=\"fr-gantt\">\n ${ganttRowsHtml}\n <div class=\"fr-gantt__legend\">\n <div class=\"fr-gantt__legend-item\">\n <div class=\"fr-gantt__legend-dot fr-gantt__legend-dot--llm\"></div>\n <span>LLM (${llmCallCount} call${llmCallCount !== 1 ? 's' : ''}, ${formatDuration(llmTotalMs)})</span>\n </div>\n <div class=\"fr-gantt__legend-item\">\n <div class=\"fr-gantt__legend-dot fr-gantt__legend-dot--tool\"></div>\n <span>Tools (${toolCallCount} call${toolCallCount !== 1 ? 's' : ''}, ${formatDuration(toolTotalMs)})</span>\n </div>\n </div>\n </div>\n </div>\n </details>\n `;\n\n // Tool summary table\n let toolSection = '';\n if (toolSummary.byTool.length > 0) {\n const toolRows = toolSummary.byTool\n .map(\n (t) => `\n <tr>\n <td>${escapeHtml(t.toolName)}</td>\n <td>${t.callCount}</td>\n <td>${t.successCount === t.callCount ? '100%' : `${Math.round((t.successCount / t.callCount) * 100)}%`}</td>\n <td>${formatDuration(t.timing.avgMs)}</td>\n <td>${formatDuration(t.timing.p95Ms)}</td>\n </tr>\n `,\n )\n .join('');\n\n toolSection = `\n <details class=\"fr-details fr-section\" open>\n <summary>Tool Summary</summary>\n <div style=\"overflow-x: auto; margin-top: 8px;\">\n <table class=\"fr-table\">\n <thead><tr><th>Tool</th><th>Calls</th><th>Success</th><th>Avg</th><th>p95</th></tr></thead>\n <tbody>${toolRows}</tbody>\n </table>\n </div>\n </details>\n `;\n }\n\n // Turn Details accordion\n let timelineSection = '';\n if (timeline.length > 0) {\n const timelineItems = timeline\n .map((turn) => {\n const turnTokens = turn.tokens.input + turn.tokens.output;\n const toolCallsList = turn.toolCalls.map((tc) => renderToolCall(tc)).join('');\n\n const patchInfo = turn.patchesApplied > 0 ? ` • ${turn.patchesApplied} patches` : '';\n const rejectedInfo =\n turn.patchesRejected > 0\n ? ` <span style=\"color: var(--fr-error)\">(${turn.patchesRejected} rejected)</span>`\n : '';\n\n return `\n <details class=\"fr-turn\">\n <summary><strong>Turn ${turn.turnNumber}</strong> • Order ${turn.order} • ${formatDuration(turn.durationMs)} • ${formatTokens(turnTokens)} tokens${patchInfo}${rejectedInfo}</summary>\n <div class=\"fr-turn__content\">\n ${turn.toolCalls.length > 0 ? `<ul class=\"fr-turn__tools\">${toolCallsList}</ul>` : '<span class=\"fr-turn__tool\">No tool calls</span>'}\n </div>\n </details>\n `;\n })\n .join('');\n\n timelineSection = `\n <details class=\"fr-details fr-section\">\n <summary>Turn Details (${timeline.length} turns)</summary>\n <div style=\"margin-top: 8px;\">${timelineItems}</div>\n </details>\n `;\n }\n\n // Raw YAML section with copy functionality (handler defined in main page script)\n const yamlContent = YAML.stringify(record, { lineWidth: 0 });\n\n const rawSection = `\n <details class=\"fr-details fr-section\">\n <summary>Raw YAML</summary>\n <div class=\"fr-raw\" style=\"margin-top: 8px;\">\n <button class=\"fr-copy-btn\" onclick=\"frCopyYaml(this)\">Copy</button>\n ${renderYamlContent(yamlContent)}\n </div>\n </details>\n `;\n\n // Tooltip element - functions are defined in main page script\n const tooltipHtml = `<div id=\"fr-tooltip\" class=\"fr-tooltip\"></div>`;\n\n return `\n ${FILL_RECORD_STYLES}\n ${tooltipHtml}\n <div class=\"fr-dashboard\">\n ${headerInfo}\n ${statusBanner}\n ${summaryCards}\n ${progressBar}\n ${timingSection}\n ${toolSection}\n ${timelineSection}\n ${rawSection}\n </div>\n `;\n}\n"],"mappings":"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"}
|