markform 0.1.17 → 0.1.19
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 +27 -2
- package/dist/ai-sdk.d.mts +1 -2
- package/dist/ai-sdk.mjs +2 -2
- package/dist/ai-sdk.mjs.map +1 -1
- package/dist/{apply-DgDJBscb.mjs → apply-Dalpt-D6.mjs} +422 -31
- package/dist/apply-Dalpt-D6.mjs.map +1 -0
- package/dist/bin.mjs +20 -2
- package/dist/bin.mjs.map +1 -1
- package/dist/{cli-DAl8LQzI.mjs → cli-tpvFNqFY.mjs} +325 -73
- package/dist/cli-tpvFNqFY.mjs.map +1 -0
- package/dist/cli.mjs +1 -1
- package/dist/{coreTypes-DiCddBKu.mjs → coreTypes-CPKXf2dc.mjs} +9 -4
- package/dist/coreTypes-CPKXf2dc.mjs.map +1 -0
- package/dist/{coreTypes-CnEea7Kh.d.mts → coreTypes-CkxML8g2.d.mts} +128 -10
- package/dist/index.d.mts +642 -22
- package/dist/index.mjs +5 -5
- package/dist/{session-XDrocA3j.mjs → session-CK0x28RO.mjs} +2 -2
- package/dist/session-CK0x28RO.mjs.map +1 -0
- package/dist/{session-B7aR6hno.mjs → session-ZHBi3LVQ.mjs} +1 -1
- package/dist/{shared-fUKfJ1UA.mjs → shared-BTR35aMz.mjs} +1 -1
- package/dist/{shared-CCq4haEV.mjs → shared-DwdyWmvE.mjs} +1 -3
- package/dist/shared-DwdyWmvE.mjs.map +1 -0
- package/dist/{src-CHVJLGKt.mjs → src-BTyz-wS6.mjs} +2009 -584
- package/dist/src-BTyz-wS6.mjs.map +1 -0
- package/docs/markform-apis.md +112 -0
- package/docs/markform-reference.md +27 -0
- package/docs/markform-spec.md +115 -0
- package/examples/movie-research/movie-deep-research-mock-filled.form.md +1 -1
- package/examples/movie-research/movie-deep-research.form.md +1 -1
- package/examples/parallel/parallel-research.form.md +57 -0
- package/examples/startup-deep-research/startup-deep-research.form.md +1 -1
- package/package.json +16 -14
- package/dist/apply-DgDJBscb.mjs.map +0 -1
- package/dist/cli-DAl8LQzI.mjs.map +0 -1
- package/dist/coreTypes-DiCddBKu.mjs.map +0 -1
- package/dist/session-XDrocA3j.mjs.map +0 -1
- package/dist/shared-CCq4haEV.mjs.map +0 -1
- package/dist/src-CHVJLGKt.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"coreTypes-DiCddBKu.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}\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}\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}\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 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/** 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 | 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}\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}\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};\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});\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\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});\n\n// Run mode schema\nexport const RunModeSchema = z.enum(['interactive', 'fill', 'research']);\n\n// Form metadata schema\nexport const FormMetadataSchema = z.object({\n markformVersion: z.string(),\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 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 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});\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":"session-XDrocA3j.mjs","names":["raw: unknown","result: Record<string, unknown>"],"sources":["../src/engine/session.ts"],"sourcesContent":["/**\n * Session module - parsing and serializing session transcripts.\n *\n * Session transcripts are used for golden testing and session replay.\n * They capture the full interaction between the harness and agent.\n */\nimport YAML from 'yaml';\nimport type { SessionTranscript } from './coreTypes';\nimport { SessionTranscriptSchema } from './coreTypes';\n\n/**\n * Parse a session transcript from YAML string.\n *\n * Converts snake_case keys to camelCase for TypeScript consumption.\n *\n * @param yaml - YAML string containing session transcript\n * @returns Parsed and validated SessionTranscript\n * @throws Error if YAML is invalid or doesn't match schema\n */\nexport function parseSession(yaml: string): SessionTranscript {\n // Parse YAML\n let raw: unknown;\n try {\n raw = YAML.parse(yaml);\n } catch (err) {\n throw new Error(\n `Failed to parse session YAML: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Convert snake_case to camelCase\n const converted = toCamelCaseDeep(raw);\n\n // Validate against schema\n const result = SessionTranscriptSchema.safeParse(converted);\n if (!result.success) {\n const errors = result.error.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join('; ');\n throw new Error(`Invalid session transcript: ${errors}`);\n }\n\n return result.data;\n}\n\n/**\n * Serialize a session transcript to YAML string.\n *\n * Converts camelCase keys to snake_case for YAML output.\n *\n * @param session - Session transcript to serialize\n * @returns YAML string\n */\nexport function serializeSession(session: SessionTranscript): string {\n // Convert camelCase to snake_case\n const snakeCased = toSnakeCaseDeep(session);\n\n // Serialize to YAML\n return YAML.stringify(snakeCased, {\n indent: 2,\n lineWidth: 0, // Don't wrap lines\n });\n}\n\n// =============================================================================\n// Key Case Conversion Helpers\n// =============================================================================\n\n/**\n * Convert a string from snake_case to camelCase.\n */\nfunction snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_match, letter: string) => letter.toUpperCase());\n}\n\n/**\n * Convert a string from camelCase to snake_case.\n */\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Recursively convert all object keys from snake_case to camelCase.\n *\n * Preserves keys that are user-defined identifiers (like option IDs in\n * checkboxes `values` objects).\n *\n * @param obj - Object to convert\n * @param preserveKeys - If true, don't convert keys in this object (but still recurse into values)\n */\nfunction toCamelCaseDeep(obj: unknown, preserveKeys = false): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n // Pass preserveKeys through to array items\n return obj.map((item) => toCamelCaseDeep(item, preserveKeys));\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n const record = obj as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(record)) {\n // Determine the key to use\n const resultKey = preserveKeys ? key : snakeToCamel(key);\n\n // Check if this is a \"value\" key in a set_checkboxes patch\n // The \"value\" object contains option IDs as keys which should be preserved\n const isCheckboxValues = key === 'value' && record.op === 'set_checkboxes';\n\n // Check if this is a \"value\" key in a set_table patch\n // The \"value\" array contains objects with column IDs as keys which should be preserved\n const isTableRows = key === 'value' && record.op === 'set_table';\n\n // Check if this is a \"tools\" key in a wire format request\n // Tool names are identifiers that should be preserved\n const isWireTools = key === 'tools';\n\n result[resultKey] = toCamelCaseDeep(value, isCheckboxValues || isTableRows || isWireTools);\n }\n return result;\n }\n\n return obj;\n}\n\n/**\n * Recursively convert all object keys from camelCase to snake_case.\n *\n * Preserves keys that are user-defined identifiers (like option IDs in\n * checkboxes `values` objects).\n *\n * @param obj - Object to convert\n * @param preserveKeys - If true, don't convert keys in this object (but still recurse into values)\n */\nfunction toSnakeCaseDeep(obj: unknown, preserveKeys = false): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n // Pass preserveKeys through to array items\n return obj.map((item) => toSnakeCaseDeep(item, preserveKeys));\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n const record = obj as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(record)) {\n // Determine the key to use\n const resultKey = preserveKeys ? key : camelToSnake(key);\n\n // Check if this is a \"value\" key in a set_checkboxes patch\n // The \"value\" object contains option IDs as keys which should be preserved\n const isCheckboxValues = key === 'value' && record.op === 'set_checkboxes';\n\n // Check if this is a \"value\" key in a set_table patch\n // The \"value\" array contains objects with column IDs as keys which should be preserved\n const isTableRows = key === 'value' && record.op === 'set_table';\n\n // Check if this is a \"tools\" key in a wire format request\n // Tool names are identifiers that should be preserved\n const isWireTools = key === 'tools';\n\n result[resultKey] = toSnakeCaseDeep(value, isCheckboxValues || isTableRows || isWireTools);\n }\n return result;\n }\n\n return obj;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,aAAa,MAAiC;CAE5D,IAAIA;AACJ,KAAI;AACF,QAAM,KAAK,MAAM,KAAK;UACf,KAAK;AACZ,QAAM,IAAI,MACR,iCAAiC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAClF;;CAIH,MAAM,YAAY,gBAAgB,IAAI;CAGtC,MAAM,SAAS,wBAAwB,UAAU,UAAU;AAC3D,KAAI,CAAC,OAAO,SAAS;EACnB,MAAM,SAAS,OAAO,MAAM,OAAO,KAAK,MAAM,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,KAAK;AAC7F,QAAM,IAAI,MAAM,+BAA+B,SAAS;;AAG1D,QAAO,OAAO;;;;;;;;;;AAWhB,SAAgB,iBAAiB,SAAoC;CAEnE,MAAM,aAAa,gBAAgB,QAAQ;AAG3C,QAAO,KAAK,UAAU,YAAY;EAChC,QAAQ;EACR,WAAW;EACZ,CAAC;;;;;AAUJ,SAAS,aAAa,KAAqB;AACzC,QAAO,IAAI,QAAQ,cAAc,QAAQ,WAAmB,OAAO,aAAa,CAAC;;;;;AAMnF,SAAS,aAAa,KAAqB;AACzC,QAAO,IAAI,QAAQ,WAAW,WAAW,IAAI,OAAO,aAAa,GAAG;;;;;;;;;;;AAYtE,SAAS,gBAAgB,KAAc,eAAe,OAAgB;AACpE,KAAI,QAAQ,QAAQ,QAAQ,OAC1B,QAAO;AAGT,KAAI,MAAM,QAAQ,IAAI,CAEpB,QAAO,IAAI,KAAK,SAAS,gBAAgB,MAAM,aAAa,CAAC;AAG/D,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAMC,SAAkC,EAAE;EAC1C,MAAM,SAAS;AAEf,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,EAAE;GAEjD,MAAM,YAAY,eAAe,MAAM,aAAa,IAAI;GAIxD,MAAM,mBAAmB,QAAQ,WAAW,OAAO,OAAO;GAI1D,MAAM,cAAc,QAAQ,WAAW,OAAO,OAAO;AAMrD,UAAO,aAAa,gBAAgB,OAAO,oBAAoB,eAF3C,QAAQ,QAE8D;;AAE5F,SAAO;;AAGT,QAAO;;;;;;;;;;;AAYT,SAAS,gBAAgB,KAAc,eAAe,OAAgB;AACpE,KAAI,QAAQ,QAAQ,QAAQ,OAC1B,QAAO;AAGT,KAAI,MAAM,QAAQ,IAAI,CAEpB,QAAO,IAAI,KAAK,SAAS,gBAAgB,MAAM,aAAa,CAAC;AAG/D,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAMA,SAAkC,EAAE;EAC1C,MAAM,SAAS;AAEf,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,EAAE;GAEjD,MAAM,YAAY,eAAe,MAAM,aAAa,IAAI;GAIxD,MAAM,mBAAmB,QAAQ,WAAW,OAAO,OAAO;GAI1D,MAAM,cAAc,QAAQ,WAAW,OAAO,OAAO;AAMrD,UAAO,aAAa,gBAAgB,OAAO,oBAAoB,eAF3C,QAAQ,QAE8D;;AAE5F,SAAO;;AAGT,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shared-CCq4haEV.mjs","names":["result: Record<string, unknown>","intervalId: ReturnType<typeof setInterval> | null","OUTPUT_FORMATS: OutputFormat[]","readFile"],"sources":["../src/cli/lib/naming.ts","../src/cli/lib/shared.ts"],"sourcesContent":["/**\n * Naming convention utilities for JSON/YAML output.\n *\n * Converts between camelCase (TypeScript internal) and snake_case (JSON/YAML output).\n */\n\n/**\n * Convert a camelCase string to snake_case.\n *\n * @example\n * toSnakeCase(\"fieldCount\") // \"field_count\"\n * toSnakeCase(\"parentFieldId\") // \"parent_field_id\"\n * toSnakeCase(\"already_snake\") // \"already_snake\"\n */\nexport function toSnakeCase(str: string): string {\n return str.replace(/([A-Z])/g, '_$1').toLowerCase();\n}\n\n/**\n * Convert a snake_case string to camelCase.\n *\n * @example\n * toCamelCase(\"field_count\") // \"fieldCount\"\n * toCamelCase(\"parent_field_id\") // \"parentFieldId\"\n * toCamelCase(\"alreadyCamel\") // \"alreadyCamel\"\n */\nexport function toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/**\n * Recursively convert all object keys from camelCase to snake_case.\n *\n * Handles nested objects and arrays. Primitives are returned unchanged.\n */\nexport function convertKeysToSnakeCase(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(convertKeysToSnakeCase);\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const snakeKey = toSnakeCase(key);\n result[snakeKey] = convertKeysToSnakeCase(value);\n }\n return result;\n }\n\n return obj;\n}\n\n/**\n * Recursively convert all object keys from snake_case to camelCase.\n *\n * Handles nested objects and arrays. Primitives are returned unchanged.\n */\nexport function convertKeysToCamelCase(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(convertKeysToCamelCase);\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const camelKey = toCamelCase(key);\n result[camelKey] = convertKeysToCamelCase(value);\n }\n return result;\n }\n\n return obj;\n}\n","/**\n * Shared CLI utilities for command context, debug, and dry-run helpers.\n */\n\nimport type { Command } from 'commander';\n\nimport { mkdir } from 'node:fs/promises';\nimport { relative } from 'node:path';\n\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport YAML from 'yaml';\n\nimport { convertKeysToSnakeCase } from './naming.js';\nimport type { CommandContext, OutputFormat } from './cliTypes.js';\n\n// =============================================================================\n// Spinner Utility Types\n// =============================================================================\n\n/**\n * Context type for spinner operations.\n * - 'api': For LLM/API calls (shows provider, model, turn info)\n * - 'compute': For local calculations\n */\nexport type SpinnerContextType = 'api' | 'compute';\n\n/**\n * API context for spinner - used when making LLM calls.\n */\nexport interface ApiSpinnerContext {\n type: 'api';\n provider: string;\n model: string;\n turnNumber?: number;\n}\n\n/**\n * Compute context for spinner - used for local calculations.\n */\nexport interface ComputeSpinnerContext {\n type: 'compute';\n operation: string;\n}\n\n/**\n * Union of spinner context types.\n */\nexport type SpinnerContext = ApiSpinnerContext | ComputeSpinnerContext;\n\n/**\n * Handle for controlling an active spinner.\n */\nexport interface SpinnerHandle {\n /** Update the spinner message. */\n message(msg: string): void;\n /** Update the spinner context (re-renders with elapsed time). */\n update(context: SpinnerContext): void;\n /** Stop the spinner with a success message. */\n stop(msg?: string): void;\n /** Stop the spinner with an error message. */\n error(msg: string): void;\n /** Get elapsed time in milliseconds since spinner started. */\n getElapsedMs(): number;\n}\n\n// Re-export types for backwards compatibility\nexport type { CommandContext, OutputFormat } from './cliTypes.js';\n\n// =============================================================================\n// Spinner Utility Functions\n// =============================================================================\n\n/**\n * Format elapsed time for display.\n */\nfunction formatElapsedTime(ms: number): string {\n const seconds = ms / 1000;\n if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n }\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds.toFixed(0)}s`;\n}\n\n/**\n * Format spinner message based on context type.\n */\nfunction formatSpinnerMessage(context: SpinnerContext, elapsedMs: number): string {\n const elapsed = formatElapsedTime(elapsedMs);\n\n if (context.type === 'api') {\n const turnInfo = context.turnNumber !== undefined ? ` turn ${context.turnNumber}` : '';\n return `${context.provider}/${context.model}${turnInfo} ${pc.dim(`(${elapsed})`)}`;\n }\n\n return `${context.operation} ${pc.dim(`(${elapsed})`)}`;\n}\n\n/**\n * Create a context-aware spinner with elapsed time tracking.\n *\n * The spinner automatically updates its message with elapsed time.\n *\n * @example\n * ```ts\n * const spinner = createSpinner({\n * type: 'api',\n * provider: 'anthropic',\n * model: 'claude-sonnet-4',\n * turnNumber: 1,\n * });\n *\n * // Do async work...\n * const result = await agent.fillFormTool(...);\n *\n * spinner.stop('Done');\n * ```\n */\nexport function createSpinner(context: SpinnerContext): SpinnerHandle {\n const startTime = Date.now();\n const spinner = p.spinner();\n let currentContext = context;\n let intervalId: ReturnType<typeof setInterval> | null = null;\n\n // Start the spinner with initial message\n const initialMessage = formatSpinnerMessage(currentContext, 0);\n spinner.start(initialMessage);\n\n // Update elapsed time every second\n intervalId = setInterval(() => {\n const elapsed = Date.now() - startTime;\n spinner.message(formatSpinnerMessage(currentContext, elapsed));\n }, 1000);\n\n const cleanup = (): void => {\n if (intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n };\n\n return {\n message(msg: string): void {\n spinner.message(msg);\n },\n\n update(newContext: SpinnerContext): void {\n currentContext = newContext;\n const elapsed = Date.now() - startTime;\n spinner.message(formatSpinnerMessage(currentContext, elapsed));\n },\n\n stop(msg?: string): void {\n cleanup();\n const elapsed = Date.now() - startTime;\n const defaultMsg = formatSpinnerMessage(currentContext, elapsed);\n spinner.stop(msg ?? `✓ ${defaultMsg}`);\n },\n\n error(msg: string): void {\n cleanup();\n spinner.stop(pc.red(`✗ ${msg}`));\n },\n\n getElapsedMs(): number {\n return Date.now() - startTime;\n },\n };\n}\n\n/**\n * Create a no-op spinner handle for quiet mode or non-TTY environments.\n */\nexport function createNoOpSpinner(): SpinnerHandle {\n const startTime = Date.now();\n // Use explicit undefined returns to avoid empty-function lint errors\n const noop = (): void => undefined;\n return {\n message: noop,\n update: noop,\n stop: noop,\n error: noop,\n getElapsedMs: () => Date.now() - startTime,\n };\n}\n\n/**\n * Create a spinner if appropriate for the context.\n * Returns a no-op spinner in quiet mode or when stdout is not a TTY.\n */\nexport function createSpinnerIfTty(context: SpinnerContext, ctx: CommandContext): SpinnerHandle {\n if (ctx.quiet || !process.stdout.isTTY) {\n return createNoOpSpinner();\n }\n return createSpinner(context);\n}\n\n// =============================================================================\n// Output Format Utilities\n// =============================================================================\n\n/**\n * Valid format options for Commander choice validation.\n */\nexport const OUTPUT_FORMATS: OutputFormat[] = [\n 'console',\n 'plaintext',\n 'yaml',\n 'json',\n 'markform',\n 'markdown',\n];\n\n/**\n * Extract command context from Commander options.\n */\nexport function getCommandContext(command: Command): CommandContext {\n const opts = command.optsWithGlobals<{\n dryRun?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n format?: OutputFormat;\n formsDir?: string;\n overwrite?: boolean;\n }>();\n return {\n dryRun: opts.dryRun ?? false,\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n format: opts.format ?? 'console',\n formsDir: opts.formsDir,\n overwrite: opts.overwrite ?? false,\n };\n}\n\n/**\n * Check if output should use colors.\n * Returns true for console format when stdout is a TTY.\n */\nexport function shouldUseColors(ctx: CommandContext): boolean {\n if (ctx.format === 'plaintext' || ctx.format === 'yaml' || ctx.format === 'json') {\n return false;\n }\n // console format: use colors if stdout is a TTY and NO_COLOR is not set\n return process.stdout.isTTY && !process.env.NO_COLOR;\n}\n\n/**\n * Format structured data according to output format.\n *\n * JSON and YAML outputs are converted to snake_case keys for consistency.\n */\nexport function formatOutput(\n ctx: CommandContext,\n data: unknown,\n consoleFormatter?: (data: unknown, useColors: boolean) => string,\n): string {\n switch (ctx.format) {\n case 'json':\n return JSON.stringify(convertKeysToSnakeCase(data), null, 2);\n case 'yaml':\n return YAML.stringify(convertKeysToSnakeCase(data));\n case 'plaintext':\n case 'console':\n default:\n if (consoleFormatter) {\n return consoleFormatter(data, shouldUseColors(ctx));\n }\n // Default: use YAML for readable console output\n return YAML.stringify(convertKeysToSnakeCase(data));\n }\n}\n\n/**\n * Log a dry-run message.\n */\nexport function logDryRun(message: string, details?: unknown): void {\n console.log(pc.yellow(`[DRY RUN] ${message}`));\n if (details) {\n console.log(pc.dim(JSON.stringify(details, null, 2)));\n }\n}\n\n/**\n * Log a verbose message (only shown if --verbose is set).\n */\nexport function logVerbose(ctx: CommandContext, message: string): void {\n if (ctx.verbose) {\n console.log(pc.dim(message));\n }\n}\n\n/**\n * Log an info message (hidden if --quiet is set).\n */\nexport function logInfo(ctx: CommandContext, message: string): void {\n if (!ctx.quiet) {\n console.log(message);\n }\n}\n\n/**\n * Log an error message (always shown).\n */\nexport function logError(message: string): void {\n console.error(pc.red(`Error: ${message}`));\n}\n\n/**\n * Log a success message (hidden if --quiet is set).\n */\nexport function logSuccess(ctx: CommandContext, message: string): void {\n if (!ctx.quiet) {\n console.log(pc.green(message));\n }\n}\n\n/**\n * Log a timing message (hidden if --quiet is set).\n */\nexport function logTiming(ctx: CommandContext, label: string, durationMs: number): void {\n if (!ctx.quiet) {\n const seconds = (durationMs / 1000).toFixed(1);\n console.log(pc.cyan(`⏰ ${label}: ${seconds}s`));\n }\n}\n\n/**\n * Log a warning message (hidden if --quiet is set).\n */\nexport function logWarn(ctx: CommandContext, message: string): void {\n if (!ctx.quiet) {\n console.log(pc.yellow(`⚠️ ${message}`));\n }\n}\n\n/**\n * Strip HTML comments from markdown content.\n * Removes <!-- ... --> blocks (including multiline) and trims leading whitespace.\n */\nexport function stripHtmlComments(content: string): string {\n // Remove HTML comments (multiline-safe)\n const stripped = content.replace(/<!--[\\s\\S]*?-->/g, '');\n // Trim leading whitespace that may remain after comment removal\n return stripped.replace(/^\\s+/, '');\n}\n\n/**\n * Format a file path for display: relative to cwd, colored green.\n * If the path is within the cwd, shows as relative (e.g., \"./simple-filled1.form.md\")\n * If outside cwd, shows the absolute path.\n */\nexport function formatPath(absolutePath: string, cwd: string = process.cwd()): string {\n const relativePath = relative(cwd, absolutePath);\n // If the relative path doesn't start with \"..\", it's within cwd\n const displayPath = relativePath.startsWith('..') ? absolutePath : `./${relativePath}`;\n return pc.green(displayPath);\n}\n\n/**\n * Read a file and return its contents.\n */\nexport async function readFile(filePath: string): Promise<string> {\n const { readFile: fsReadFile } = await import('node:fs/promises');\n return fsReadFile(filePath, 'utf-8');\n}\n\n/**\n * Write contents to a file atomically.\n *\n * Uses the atomically library to prevent partial or corrupted files\n * if the process crashes mid-write.\n */\nexport async function writeFile(filePath: string, contents: string): Promise<void> {\n const { writeFile: atomicWriteFile } = await import('atomically');\n await atomicWriteFile(filePath, contents);\n}\n\n/**\n * Ensure the forms directory exists, creating it if necessary.\n * Uses recursive mkdir so parent directories are created as needed.\n *\n * @param formsDir Absolute path to the forms directory\n */\nexport async function ensureFormsDir(formsDir: string): Promise<void> {\n await mkdir(formsDir, { recursive: true });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAcA,SAAgB,YAAY,KAAqB;AAC/C,QAAO,IAAI,QAAQ,YAAY,MAAM,CAAC,aAAa;;;;;;;AAoBrD,SAAgB,uBAAuB,KAAuB;AAC5D,KAAI,QAAQ,QAAQ,QAAQ,OAC1B,QAAO;AAGT,KAAI,MAAM,QAAQ,IAAI,CACpB,QAAO,IAAI,IAAI,uBAAuB;AAGxC,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAMA,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,EAAE;GAC9C,MAAM,WAAW,YAAY,IAAI;AACjC,UAAO,YAAY,uBAAuB,MAAM;;AAElD,SAAO;;AAGT,QAAO;;;;;;;;ACuBT,SAAS,kBAAkB,IAAoB;CAC7C,MAAM,UAAU,KAAK;AACrB,KAAI,UAAU,GACZ,QAAO,GAAG,QAAQ,QAAQ,EAAE,CAAC;AAI/B,QAAO,GAFS,KAAK,MAAM,UAAU,GAAG,CAEtB,KADO,UAAU,IACI,QAAQ,EAAE,CAAC;;;;;AAMpD,SAAS,qBAAqB,SAAyB,WAA2B;CAChF,MAAM,UAAU,kBAAkB,UAAU;AAE5C,KAAI,QAAQ,SAAS,OAAO;EAC1B,MAAM,WAAW,QAAQ,eAAe,SAAY,SAAS,QAAQ,eAAe;AACpF,SAAO,GAAG,QAAQ,SAAS,GAAG,QAAQ,QAAQ,SAAS,GAAG,GAAG,IAAI,IAAI,QAAQ,GAAG;;AAGlF,QAAO,GAAG,QAAQ,UAAU,GAAG,GAAG,IAAI,IAAI,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;AAuBvD,SAAgB,cAAc,SAAwC;CACpE,MAAM,YAAY,KAAK,KAAK;CAC5B,MAAM,UAAU,EAAE,SAAS;CAC3B,IAAI,iBAAiB;CACrB,IAAIC,aAAoD;CAGxD,MAAM,iBAAiB,qBAAqB,gBAAgB,EAAE;AAC9D,SAAQ,MAAM,eAAe;AAG7B,cAAa,kBAAkB;EAC7B,MAAM,UAAU,KAAK,KAAK,GAAG;AAC7B,UAAQ,QAAQ,qBAAqB,gBAAgB,QAAQ,CAAC;IAC7D,IAAK;CAER,MAAM,gBAAsB;AAC1B,MAAI,YAAY;AACd,iBAAc,WAAW;AACzB,gBAAa;;;AAIjB,QAAO;EACL,QAAQ,KAAmB;AACzB,WAAQ,QAAQ,IAAI;;EAGtB,OAAO,YAAkC;AACvC,oBAAiB;GACjB,MAAM,UAAU,KAAK,KAAK,GAAG;AAC7B,WAAQ,QAAQ,qBAAqB,gBAAgB,QAAQ,CAAC;;EAGhE,KAAK,KAAoB;AACvB,YAAS;GACT,MAAM,UAAU,KAAK,KAAK,GAAG;GAC7B,MAAM,aAAa,qBAAqB,gBAAgB,QAAQ;AAChE,WAAQ,KAAK,OAAO,KAAK,aAAa;;EAGxC,MAAM,KAAmB;AACvB,YAAS;AACT,WAAQ,KAAK,GAAG,IAAI,KAAK,MAAM,CAAC;;EAGlC,eAAuB;AACrB,UAAO,KAAK,KAAK,GAAG;;EAEvB;;;;;AAqCH,MAAaC,iBAAiC;CAC5C;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,SAAgB,kBAAkB,SAAkC;CAClE,MAAM,OAAO,QAAQ,iBAOjB;AACJ,QAAO;EACL,QAAQ,KAAK,UAAU;EACvB,SAAS,KAAK,WAAW;EACzB,OAAO,KAAK,SAAS;EACrB,QAAQ,KAAK,UAAU;EACvB,UAAU,KAAK;EACf,WAAW,KAAK,aAAa;EAC9B;;;;;;AAOH,SAAgB,gBAAgB,KAA8B;AAC5D,KAAI,IAAI,WAAW,eAAe,IAAI,WAAW,UAAU,IAAI,WAAW,OACxE,QAAO;AAGT,QAAO,QAAQ,OAAO,SAAS,CAAC,QAAQ,IAAI;;;;;;;AAQ9C,SAAgB,aACd,KACA,MACA,kBACQ;AACR,SAAQ,IAAI,QAAZ;EACE,KAAK,OACH,QAAO,KAAK,UAAU,uBAAuB,KAAK,EAAE,MAAM,EAAE;EAC9D,KAAK,OACH,QAAO,KAAK,UAAU,uBAAuB,KAAK,CAAC;EACrD,KAAK;EACL,KAAK;EACL;AACE,OAAI,iBACF,QAAO,iBAAiB,MAAM,gBAAgB,IAAI,CAAC;AAGrD,UAAO,KAAK,UAAU,uBAAuB,KAAK,CAAC;;;;;;AAOzD,SAAgB,UAAU,SAAiB,SAAyB;AAClE,SAAQ,IAAI,GAAG,OAAO,aAAa,UAAU,CAAC;AAC9C,KAAI,QACF,SAAQ,IAAI,GAAG,IAAI,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC,CAAC;;;;;AAOzD,SAAgB,WAAW,KAAqB,SAAuB;AACrE,KAAI,IAAI,QACN,SAAQ,IAAI,GAAG,IAAI,QAAQ,CAAC;;;;;AAOhC,SAAgB,QAAQ,KAAqB,SAAuB;AAClE,KAAI,CAAC,IAAI,MACP,SAAQ,IAAI,QAAQ;;;;;AAOxB,SAAgB,SAAS,SAAuB;AAC9C,SAAQ,MAAM,GAAG,IAAI,UAAU,UAAU,CAAC;;;;;AAM5C,SAAgB,WAAW,KAAqB,SAAuB;AACrE,KAAI,CAAC,IAAI,MACP,SAAQ,IAAI,GAAG,MAAM,QAAQ,CAAC;;;;;AAOlC,SAAgB,UAAU,KAAqB,OAAe,YAA0B;AACtF,KAAI,CAAC,IAAI,OAAO;EACd,MAAM,WAAW,aAAa,KAAM,QAAQ,EAAE;AAC9C,UAAQ,IAAI,GAAG,KAAK,KAAK,MAAM,IAAI,QAAQ,GAAG,CAAC;;;;;;AAOnD,SAAgB,QAAQ,KAAqB,SAAuB;AAClE,KAAI,CAAC,IAAI,MACP,SAAQ,IAAI,GAAG,OAAO,OAAO,UAAU,CAAC;;;;;;AAQ5C,SAAgB,kBAAkB,SAAyB;AAIzD,QAFiB,QAAQ,QAAQ,oBAAoB,GAAG,CAExC,QAAQ,QAAQ,GAAG;;;;;;;AAQrC,SAAgB,WAAW,cAAsB,MAAc,QAAQ,KAAK,EAAU;CACpF,MAAM,eAAe,SAAS,KAAK,aAAa;CAEhD,MAAM,cAAc,aAAa,WAAW,KAAK,GAAG,eAAe,KAAK;AACxE,QAAO,GAAG,MAAM,YAAY;;;;;AAM9B,eAAsBC,WAAS,UAAmC;CAChE,MAAM,EAAE,UAAU,eAAe,MAAM,OAAO;AAC9C,QAAO,WAAW,UAAU,QAAQ;;;;;;;;AAStC,eAAsB,UAAU,UAAkB,UAAiC;CACjF,MAAM,EAAE,WAAW,oBAAoB,MAAM,OAAO;AACpD,OAAM,gBAAgB,UAAU,SAAS;;;;;;;;AAS3C,eAAsB,eAAe,UAAiC;AACpE,OAAM,MAAM,UAAU,EAAE,WAAW,MAAM,CAAC"}
|