@hotmeshio/long-tail 0.19.1 → 0.21.0
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 +4 -4
- package/build/api/escalations/accumulate.d.ts +96 -0
- package/build/api/escalations/accumulate.js +516 -0
- package/build/api/escalations/index.d.ts +1 -0
- package/build/api/escalations/index.js +10 -1
- package/build/api/roles.d.ts +4 -5
- package/build/api/roles.js +53 -4
- package/build/api/scan-codes/execute.js +2 -0
- package/build/api/scan-codes/verbs.d.ts +15 -0
- package/build/api/scan-codes/verbs.js +65 -0
- package/build/api/workflows/config.d.ts +3 -0
- package/build/api/workflows/config.js +15 -0
- package/build/api/workflows/index.d.ts +1 -0
- package/build/api/workflows/index.js +3 -1
- package/build/api/workflows/input-lookups.d.ts +16 -0
- package/build/api/workflows/input-lookups.js +69 -0
- package/build/api/workflows/input-validation.d.ts +4 -3
- package/build/api/workflows/input-validation.js +7 -4
- package/build/api/workflows/invocable.js +1 -0
- package/build/api/workflows/invocation.js +1 -1
- package/build/index.js +60 -0
- package/build/lib/db/schemas/035_workflow_input_lookups.sql +9 -0
- package/build/lib/db/schemas/036_role_portals.sql +12 -0
- package/build/routes/escalations/accumulate.d.ts +7 -0
- package/build/routes/escalations/accumulate.js +150 -0
- package/build/routes/escalations/index.js +5 -0
- package/build/routes/workflows/config.js +10 -0
- package/build/sdk/index.d.ts +25 -0
- package/build/sdk/index.js +8 -0
- package/build/services/config/cache.js +1 -0
- package/build/services/config/read.js +2 -0
- package/build/services/config/sql.d.ts +2 -2
- package/build/services/config/sql.js +6 -5
- package/build/services/config/write.js +10 -1
- package/build/services/escalation/accumulate.d.ts +81 -0
- package/build/services/escalation/accumulate.js +154 -0
- package/build/services/escalation/index.d.ts +1 -0
- package/build/services/escalation/index.js +1 -0
- package/build/services/knowledge/index.d.ts +1 -0
- package/build/services/knowledge/index.js +1 -0
- package/build/services/knowledge/lookup-refs.d.ts +7 -0
- package/build/services/knowledge/lookup-refs.js +26 -0
- package/build/services/mcp/db-server/schemas.d.ts +2 -2
- package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
- package/build/services/orchestrator/condition.d.ts +40 -3
- package/build/services/orchestrator/condition.js +42 -2
- package/build/services/role/index.js +1 -0
- package/build/services/role/seed.js +6 -1
- package/build/services/role/sql.d.ts +6 -3
- package/build/services/role/sql.js +7 -2
- package/build/services/role/types.d.ts +38 -10
- package/build/services/role/types.js +10 -1
- package/build/services/scan-code/validate.js +16 -0
- package/build/shared/form-validation/display-only-widgets.d.ts +16 -0
- package/build/shared/form-validation/display-only-widgets.js +25 -0
- package/build/shared/form-validation/field-validator.d.ts +1 -0
- package/build/shared/form-validation/field-validator.js +94 -6
- package/build/shared/form-validation/index.d.ts +2 -0
- package/build/shared/form-validation/index.js +2 -0
- package/build/shared/form-validation/invoke-context.d.ts +4 -3
- package/build/shared/form-validation/invoke-context.js +5 -4
- package/build/shared/form-validation/x-lt-bind.d.ts +2 -14
- package/build/shared/form-validation/x-lt-bind.js +12 -8
- package/build/shared/form-validation/x-lt-invoke.d.ts +38 -0
- package/build/shared/form-validation/x-lt-invoke.js +103 -0
- package/build/shared/form-validation/x-lt-options.d.ts +3 -3
- package/build/shared/form-validation/x-lt-options.js +19 -5
- package/build/shared/form-validation/x-lt-show-if.d.ts +5 -0
- package/build/shared/form-validation/x-lt-show-if.js +10 -0
- package/build/start/workers.js +10 -0
- package/build/system/mcp-servers/admin/escalations.js +39 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +256 -33
- package/build/system/mcp-servers/admin/schemas.js +55 -3
- package/build/system/mcp-servers/admin/users.js +1 -0
- package/build/system/mcp-servers/admin/workflow-config.js +54 -9
- package/build/system/mcp-servers/admin/workflows.js +9 -7
- package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
- package/build/system/mcp-servers/docs.js +4 -0
- package/build/system/mcp-servers/human-queue-schemas.d.ts +85 -0
- package/build/system/mcp-servers/human-queue-schemas.js +19 -1
- package/build/system/mcp-servers/human-queue.d.ts +2 -0
- package/build/system/mcp-servers/human-queue.js +77 -0
- package/build/system/seed/tool-manifests-admin.d.ts +1509 -227
- package/build/system/seed/tool-manifests-admin.js +8 -4
- package/build/system/seed/tool-manifests-escalation.d.ts +174 -0
- package/build/system/seed/tool-manifests-escalation.js +56 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/config.d.ts +4 -0
- package/build/types/escalation.d.ts +52 -0
- package/build/types/escalation.js +29 -1
- package/build/types/index.d.ts +2 -2
- package/build/types/index.js +3 -1
- package/build/types/scan-code.d.ts +24 -0
- package/build/types/scan-code.js +9 -0
- package/build/types/startup.d.ts +26 -0
- package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js → AdminDashboard-uarpHB88.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js.map → AdminDashboard-uarpHB88.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js → AgentConfigPage-BcUaDD5E.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js.map → AgentConfigPage-BcUaDD5E.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js → AgentDetailPage-BaZBhK6i.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js.map → AgentDetailPage-BaZBhK6i.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-CuVFSDc4.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-D77JeViQ.js.map → AgentsPage-CuVFSDc4.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js → BotPicker-CClMby6B.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js.map → BotPicker-CClMby6B.js.map} +1 -1
- package/dashboard/dist/assets/BulkAssignModal-BL8FRgkN.js +2 -0
- package/dashboard/dist/assets/{BulkAssignModal-BXiJnlqt.js.map → BulkAssignModal-BL8FRgkN.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-D53ogPor.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-D9TC2iKy.js.map → CapabilitiesPage-D53ogPor.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js → CollapsibleSection-ow8jpbtD.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js.map → CollapsibleSection-ow8jpbtD.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js → ConfirmDeleteModal-CeEDt9iJ.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js.map → ConfirmDeleteModal-CeEDt9iJ.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js → CountdownTimer-CSqyZMCG.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js.map → CountdownTimer-CSqyZMCG.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js → CredentialsPage-Dx7SxA23.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js.map → CredentialsPage-Dx7SxA23.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js → CronLabel-LYPxpvNN.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js.map → CronLabel-LYPxpvNN.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-spX1dFyb.js +2 -0
- package/dashboard/dist/assets/DataTable-spX1dFyb.js.map +1 -0
- package/dashboard/dist/assets/{DropZone-XlcY8hEH.js → DropZone-f1o-GLM8.js} +2 -2
- package/dashboard/dist/assets/{DropZone-XlcY8hEH.js.map → DropZone-f1o-GLM8.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js → ElapsedCell-BZJTSm9N.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js.map → ElapsedCell-BZJTSm9N.js.map} +1 -1
- package/dashboard/dist/assets/EntityTimelinePanel-0wIIW2en.js +2 -0
- package/dashboard/dist/assets/{EntityTimelinePanel-1lT3jkCM.js.map → EntityTimelinePanel-0wIIW2en.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js → EscalationListSchemaPage-CoYvtMzj.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js.map → EscalationListSchemaPage-CoYvtMzj.js.map} +1 -1
- package/dashboard/dist/assets/EscalationListView-DWFHPufv.js +2 -0
- package/dashboard/dist/assets/EscalationListView-DWFHPufv.js.map +1 -0
- package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js → EscalationSchemaPage-C9Xu_A25.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js.map → EscalationSchemaPage-C9Xu_A25.js.map} +1 -1
- package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js +2 -0
- package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js.map +1 -0
- package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js +2 -0
- package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js.map +1 -0
- package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js → EscalationsOverview-CW57FaP9.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js.map → EscalationsOverview-CW57FaP9.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-KEC3YWBf.js → EventTable-D1ctWhKf.js} +2 -2
- package/dashboard/dist/assets/{EventTable-KEC3YWBf.js.map → EventTable-D1ctWhKf.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js → FilterBar-C-iur-Nj.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js.map → FilterBar-C-iur-Nj.js.map} +1 -1
- package/dashboard/dist/assets/GraphInvokePage-CcA_44M4.js +2 -0
- package/dashboard/dist/assets/{GraphInvokePage-DV7Y0fe2.js.map → GraphInvokePage-CcA_44M4.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-Dc085ghJ.js +2 -0
- package/dashboard/dist/assets/{HomePage-G785SWcW.js.map → HomePage-Dc085ghJ.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-h_ziBt4O.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-zPVYPg3W.js.map → ListToolbar-h_ziBt4O.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js → McpOverview-qXXhbNWV.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js.map → McpOverview-qXXhbNWV.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js → McpQueryDetailPage-SEzSbZrd.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js.map → McpQueryDetailPage-SEzSbZrd.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-Cy0V0kv9.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-CNSNMagY.js.map → McpQueryPage-Cy0V0kv9.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js → McpRunDetailPage-DjJO5vSb.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js.map → McpRunDetailPage-DjJO5vSb.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-BfjiJ8mM.js +2 -0
- package/dashboard/dist/assets/{McpRunsPage-B6rb5QBf.js.map → McpRunsPage-BfjiJ8mM.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js → NamespacePill-DADRJOUl.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js.map → NamespacePill-DADRJOUl.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-dJcER0T_.js +3 -0
- package/dashboard/dist/assets/OperationsPage-dJcER0T_.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-zCkW4eqk.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-DBOscDnf.js.map → OperatorDashboard-zCkW4eqk.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js → PageHeader-Csq434-v.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js.map → PageHeader-Csq434-v.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js → PageHeaderWithStats-CSnk1p5A.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js.map → PageHeaderWithStats-CSnk1p5A.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js → PersonaDetailPage-Cx6L3Jvu.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js.map → PersonaDetailPage-Cx6L3Jvu.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js → PersonasPage-DOgGUlJl.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js.map → PersonasPage-DOgGUlJl.js.map} +1 -1
- package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js +2 -0
- package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js.map +1 -0
- package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js → ProcessDetailPage-BFcFSDUv.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js.map → ProcessDetailPage-BFcFSDUv.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-BaHV2cXp.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-5NnysKFC.js.map → ProcessesListPage-BaHV2cXp.js.map} +1 -1
- package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js +7 -0
- package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js.map +1 -0
- package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-DhnVPK4q.js → RolePill-BafrASDX.js} +2 -2
- package/dashboard/dist/assets/{RolePill-DhnVPK4q.js.map → RolePill-BafrASDX.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js → RolesPage-DSqqKPbv.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js.map → RolesPage-DSqqKPbv.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-B29iWwel.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-BwZTJ4Yj.js.map → RunAsSelector-B29iWwel.js.map} +1 -1
- package/dashboard/dist/assets/ScanCodesPage-S8aAJfnC.js +2 -0
- package/dashboard/dist/assets/{ScanCodesPage-FiYIYB-m.js.map → ScanCodesPage-S8aAJfnC.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js → ScanSchemeDetailPage-CUBRAtmJ.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js.map → ScanSchemeDetailPage-CUBRAtmJ.js.map} +1 -1
- package/dashboard/dist/assets/ScanStationPage-R9t1-CeQ.js +2 -0
- package/dashboard/dist/assets/{ScanStationPage-8CdOtbCD.js.map → ScanStationPage-R9t1-CeQ.js.map} +1 -1
- package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js → ScopeBadge-b6MIBiYD.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js.map → ScopeBadge-b6MIBiYD.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js → StickyPagination-CkW_A507.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js.map → StickyPagination-CkW_A507.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js → StreamMessageDetail-yzWX0wac.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js.map → StreamMessageDetail-yzWX0wac.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js → SwimlaneTimeline-Cf4DXFxj.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js.map → SwimlaneTimeline-Cf4DXFxj.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js → TagInput-ZrIIrEUP.js} +2 -2
- package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js.map → TagInput-ZrIIrEUP.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js → TaskDetailPage-DCDcEps9.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js.map → TaskDetailPage-DCDcEps9.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js → TaskQueuePill-DkQ1uc6y.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js.map → TaskQueuePill-DkQ1uc6y.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-BBATgpf7.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-BQNaSzCn.js.map → TasksListPage-BBATgpf7.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js → TimeAgo-CSNVEjch.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js.map → TimeAgo-CSNVEjch.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js → TimestampCell-Du1nBrPn.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js.map → TimestampCell-Du1nBrPn.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js → ToolPill-Baxm02L6.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js.map → ToolPill-Baxm02L6.js.map} +1 -1
- package/dashboard/dist/assets/ToolTestPanel-CF-h_5Rg.js +2 -0
- package/dashboard/dist/assets/{ToolTestPanel-DvuLFWqQ.js.map → ToolTestPanel-CF-h_5Rg.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js → TopicDetailPage-Dr1UmWcp.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js.map → TopicDetailPage-Dr1UmWcp.js.map} +1 -1
- package/dashboard/dist/assets/TopicsPage-CUUo-Ylf.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-h-oyTeEJ.js.map → TopicsPage-CUUo-Ylf.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BceRCeDF.js → UserName-kBh1dc39.js} +2 -2
- package/dashboard/dist/assets/{UserName-BceRCeDF.js.map → UserName-kBh1dc39.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js → WorkflowExecutionPage-CCRSbnDx.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js.map → WorkflowExecutionPage-CCRSbnDx.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js → WorkflowPill-ZepbO_ny.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js.map → WorkflowPill-ZepbO_ny.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-BNQVvyek.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-B0r2lQXk.js.map → WorkflowsDashboard-BNQVvyek.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js → WorkflowsOverview-DswubNJN.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js.map → WorkflowsOverview-DswubNJN.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js → YamlWorkflowDetailPage-Cw9Dlmup.js} +11 -11
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js.map → YamlWorkflowDetailPage-Cw9Dlmup.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js → YamlWorkflowsPage-DB8xnIXy.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js.map → YamlWorkflowsPage-DB8xnIXy.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BvmLCk4h.js → agents-BwEnf6N9.js} +2 -2
- package/dashboard/dist/assets/{agents-BvmLCk4h.js.map → agents-BwEnf6N9.js.map} +1 -1
- package/dashboard/dist/assets/{bots-f_tyhl4I.js → bots-CCmJTT2u.js} +2 -2
- package/dashboard/dist/assets/{bots-f_tyhl4I.js.map → bots-CCmJTT2u.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DNo5bqLx.js → capabilities-BZHgp_nh.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DNo5bqLx.js.map → capabilities-BZHgp_nh.js.map} +1 -1
- package/dashboard/dist/assets/{constants-BHkpVaqx.js → constants-CeBBTzf5.js} +2 -2
- package/dashboard/dist/assets/{constants-BHkpVaqx.js.map → constants-CeBBTzf5.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js → controlplane-CyfwUlFA.js} +2 -2
- package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js.map → controlplane-CyfwUlFA.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js +2 -0
- package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js.map +1 -0
- package/dashboard/dist/assets/index-3gbd5neL.js +67 -0
- package/dashboard/dist/assets/index-3gbd5neL.js.map +1 -0
- package/dashboard/dist/assets/index-BAAVTyZ-.js +2 -0
- package/dashboard/dist/assets/{index-DL83W7Gu.js.map → index-BAAVTyZ-.js.map} +1 -1
- package/dashboard/dist/assets/{index-CsKiRyhy.js → index-BC6Jenlo.js} +2 -2
- package/dashboard/dist/assets/{index-CsKiRyhy.js.map → index-BC6Jenlo.js.map} +1 -1
- package/dashboard/dist/assets/index-C7KHqOTQ.js +2 -0
- package/dashboard/dist/assets/{index-D7ESqn22.js.map → index-C7KHqOTQ.js.map} +1 -1
- package/dashboard/dist/assets/index-CDrqqbSR.js +3 -0
- package/dashboard/dist/assets/index-CDrqqbSR.js.map +1 -0
- package/dashboard/dist/assets/index-CVwzCZ43.js +2 -0
- package/dashboard/dist/assets/{index-DvxxrFBo.js.map → index-CVwzCZ43.js.map} +1 -1
- package/dashboard/dist/assets/index-CaGF6TCC.js +2 -0
- package/dashboard/dist/assets/index-CaGF6TCC.js.map +1 -0
- package/dashboard/dist/assets/index-ClVbfe4z.js +13 -0
- package/dashboard/dist/assets/index-ClVbfe4z.js.map +1 -0
- package/dashboard/dist/assets/{index-DWse7ERF.js → index-CuVkSmj5.js} +2 -2
- package/dashboard/dist/assets/{index-DWse7ERF.js.map → index-CuVkSmj5.js.map} +1 -1
- package/dashboard/dist/assets/{index-PcyGjmBm.js → index-DAuX_PlL.js} +2 -2
- package/dashboard/dist/assets/{index-PcyGjmBm.js.map → index-DAuX_PlL.js.map} +1 -1
- package/dashboard/dist/assets/{index-e2X-s0EQ.js → index-DBWS5QL8.js} +2 -2
- package/dashboard/dist/assets/{index-e2X-s0EQ.js.map → index-DBWS5QL8.js.map} +1 -1
- package/dashboard/dist/assets/index-DIWCI6HC.js +2 -0
- package/dashboard/dist/assets/{index-BNZknxFY.js.map → index-DIWCI6HC.js.map} +1 -1
- package/dashboard/dist/assets/{index-C-Xr2V3F.js → index-DZ8X_Gp4.js} +2 -2
- package/dashboard/dist/assets/{index-C-Xr2V3F.js.map → index-DZ8X_Gp4.js.map} +1 -1
- package/dashboard/dist/assets/index-Dh8MJl3L.css +1 -0
- package/dashboard/dist/assets/{knowledge-Coo6CKzo.js → knowledge-CqyLhUMg.js} +2 -2
- package/dashboard/dist/assets/{knowledge-Coo6CKzo.js.map → knowledge-CqyLhUMg.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-Cz5eFnP_.js → mcp-Cvu6bFYH.js} +2 -2
- package/dashboard/dist/assets/{mcp-Cz5eFnP_.js.map → mcp-Cvu6bFYH.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js → mcp-query-qC6A3e9l.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js.map → mcp-query-qC6A3e9l.js.map} +1 -1
- package/dashboard/dist/assets/metadata-display-COo3mMCr.js +2 -0
- package/dashboard/dist/assets/metadata-display-COo3mMCr.js.map +1 -0
- package/dashboard/dist/assets/{personas-C2-LgpHQ.js → personas-BKN_lJuV.js} +2 -2
- package/dashboard/dist/assets/{personas-C2-LgpHQ.js.map → personas-BKN_lJuV.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-TuXQvUA-.js → pipelines-BldIfv85.js} +2 -2
- package/dashboard/dist/assets/{pipelines-TuXQvUA-.js.map → pipelines-BldIfv85.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-OUzpu__z.js → tasks-B-Uay8uL.js} +2 -2
- package/dashboard/dist/assets/{tasks-OUzpu__z.js.map → tasks-B-Uay8uL.js.map} +1 -1
- package/dashboard/dist/assets/{topics-B8bdrBaW.js → topics-438EQogt.js} +2 -2
- package/dashboard/dist/assets/{topics-B8bdrBaW.js.map → topics-438EQogt.js.map} +1 -1
- package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js +2 -0
- package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js.map +1 -0
- package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js → useDebouncedValue-Cw8hYZ8y.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js.map → useDebouncedValue-Cw8hYZ8y.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js → useNamespace-D1218GQ8.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js.map → useNamespace-D1218GQ8.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js → useYamlActivityEvents-BAQf_y_U.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js.map → useYamlActivityEvents-BAQf_y_U.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js → vendor-icons-B7OcUM6b.js} +2 -2
- package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js.map → vendor-icons-B7OcUM6b.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js → yaml-workflows-CN01gEB0.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js.map → yaml-workflows-CN01gEB0.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/accumulator.md +113 -0
- package/docs/api/http/escalations.md +89 -0
- package/docs/api/http/roles.md +1 -0
- package/docs/api/http/workflows.md +28 -1
- package/docs/api/mcp/admin.md +40 -4
- package/docs/api/sdk/escalations.md +91 -0
- package/docs/api/sdk/roles.md +2 -0
- package/docs/architecture.md +1 -1
- package/docs/code-owned-configuration.md +3 -2
- package/docs/dashboard.md +11 -5
- package/docs/hitl/design.md +1 -1
- package/docs/hitl/escalation.md +37 -1
- package/docs/hitl/form.md +12 -7
- package/docs/hitl/invoke-form.md +10 -3
- package/docs/hitl/lookups.md +21 -0
- package/docs/hitl/pinned-views.md +4 -0
- package/docs/hitl/portal.md +97 -0
- package/docs/hitl/resolution.md +41 -0
- package/docs/hitl/x-lt-embed.md +1 -1
- package/docs/hitl/x-lt-invoke.md +95 -0
- package/docs/hitl/x-lt-list-schema.md +3 -1
- package/docs/hitl/x-lt-validation.md +50 -3
- package/docs/hitl/x-lt-widget.md +22 -0
- package/docs/hitl-guide.md +12 -2
- package/docs/scan-codes.md +15 -2
- package/docs/sdk.md +1 -1
- package/docs/workflows.md +2 -2
- package/package.json +4 -2
- package/dashboard/dist/assets/AgentsPage-D77JeViQ.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js.map +0 -1
- package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-D9TC2iKy.js +0 -2
- package/dashboard/dist/assets/DataTable-7C7riavf.js +0 -2
- package/dashboard/dist/assets/DataTable-7C7riavf.js.map +0 -1
- package/dashboard/dist/assets/EntityTimelinePanel-1lT3jkCM.js +0 -2
- package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js +0 -2
- package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js.map +0 -1
- package/dashboard/dist/assets/GraphInvokePage-DV7Y0fe2.js +0 -2
- package/dashboard/dist/assets/HomePage-G785SWcW.js +0 -2
- package/dashboard/dist/assets/ListToolbar-zPVYPg3W.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-CNSNMagY.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-B6rb5QBf.js +0 -2
- package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js +0 -3
- package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-DBOscDnf.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-5NnysKFC.js +0 -2
- package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js +0 -2
- package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-BwZTJ4Yj.js +0 -2
- package/dashboard/dist/assets/ScanCodesPage-FiYIYB-m.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-8CdOtbCD.js +0 -2
- package/dashboard/dist/assets/TasksListPage-BQNaSzCn.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-DvuLFWqQ.js +0 -2
- package/dashboard/dist/assets/TopicsPage-h-oyTeEJ.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-B0r2lQXk.js +0 -2
- package/dashboard/dist/assets/escalation-columns-DIigeTOK.js +0 -2
- package/dashboard/dist/assets/escalation-columns-DIigeTOK.js.map +0 -1
- package/dashboard/dist/assets/index-BMlQYOE1.js +0 -67
- package/dashboard/dist/assets/index-BMlQYOE1.js.map +0 -1
- package/dashboard/dist/assets/index-BNZknxFY.js +0 -2
- package/dashboard/dist/assets/index-Bpvfr4OW.css +0 -1
- package/dashboard/dist/assets/index-CegPUKpc.js +0 -3
- package/dashboard/dist/assets/index-CegPUKpc.js.map +0 -1
- package/dashboard/dist/assets/index-D7ESqn22.js +0 -2
- package/dashboard/dist/assets/index-DL83W7Gu.js +0 -2
- package/dashboard/dist/assets/index-DPLssnMW.js +0 -6
- package/dashboard/dist/assets/index-DPLssnMW.js.map +0 -1
- package/dashboard/dist/assets/index-DoETPlJP.js +0 -11
- package/dashboard/dist/assets/index-DoETPlJP.js.map +0 -1
- package/dashboard/dist/assets/index-DvxxrFBo.js +0 -2
- package/dashboard/dist/assets/metadata-display--TzK0REC.js +0 -2
- package/dashboard/dist/assets/metadata-display--TzK0REC.js.map +0 -1
- package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js +0 -2
- package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js.map +0 -1
- package/dashboard/dist/assets/seed-form-json-DvPsISxD.js +0 -2
- package/dashboard/dist/assets/seed-form-json-DvPsISxD.js.map +0 -1
- package/docs/compilation.md +0 -152
- package/docs/compiler.md +0 -311
- package/docs/contributing.md +0 -56
- package/docs/design-principles.md +0 -244
- package/docs/schema-exchange.md +0 -173
- package/docs/self-test.md +0 -106
- package/docs/story.md +0 -184
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResolverForm-Bgc0Zrya.js","sources":["../../../types/validation.ts","../../src/lib/seed-form-json.ts","../../../shared/form-validation/derive-field-label.ts","../../src/components/escalation/ErrorsPanel.tsx","../../../shared/form-validation/ctx-path.ts","../../../shared/form-validation/x-lt-options.ts","../../../shared/form-validation/field-validator.ts","../../../shared/form-validation/x-lt-show-if.ts","../../../shared/form-validation/x-lt-require-any.ts","../../../shared/form-validation/x-lt-require-sum.ts","../../../shared/form-validation/validate-resolver-payload.ts","../../src/lib/resolver-payload.ts","../../src/components/escalation/resolver-form/LockedFormFrame.tsx","../../src/components/escalation/resolver-form/FieldChrome.tsx","../../src/components/escalation/widgets/FileUploadWidget.tsx","../../src/components/escalation/widgets/CodeEditorWidget.tsx","../../src/components/escalation/widgets/SignatureWidget.tsx","../../src/components/escalation/widgets/RichTextWidget.tsx","../../src/components/escalation/widgets/MarkdownWidget.tsx","../../src/components/escalation/widgets/ChecklistWidget.tsx","../../src/components/escalation/widgets/AttachmentWidget.tsx","../../src/components/escalation/widgets/LinkWidget.tsx","../../src/components/escalation/widgets/OpenDetailButton.tsx","../../src/components/escalation/widgets/EscalationWidget.tsx","../../../shared/form-validation/x-lt-query.ts","../../src/components/escalation/widgets/EscalationListWidget.tsx","../../../shared/form-validation/invoke-context.ts","../../../shared/form-validation/x-lt-invoke.ts","../../../types/workflow-icons.ts","../../src/lib/workflow-icons.ts","../../src/components/common/display/WorkflowIcon.tsx","../../src/pages/workflows/start/StartedRunNotice.tsx","../../src/pages/workflows/start/use-invoke-submit.ts","../../src/pages/workflows/start/InvokeFooter.tsx","../../src/pages/workflows/start/InvokeSidePanel.tsx","../../src/pages/workflows/start/RichInvokeForm.tsx","../../src/pages/workflows/start/helpers.ts","../../src/pages/workflows/start/EnvelopeEditor.tsx","../../src/pages/workflows/start/LegacyInvokeForm.tsx","../../src/components/invoke/RunReceipt.tsx","../../src/components/invoke/InvokeModal.tsx","../../src/components/escalation/widgets/InvokeWidget.tsx","../../src/components/escalation/widgets/index.ts","../../src/components/escalation/resolver-form/form-cells.ts","../../src/components/escalation/resolver-form/SelectField.tsx","../../src/components/escalation/resolver-form/MultiSelectField.tsx","../../src/components/escalation/resolver-form/JsonField.tsx","../../src/components/escalation/resolver-form/FieldRow.tsx","../../src/components/escalation/resolver-form/DictionaryList.tsx","../../src/components/escalation/resolver-form/SectionGroup.tsx","../../src/components/escalation/resolver-form/ResolverForm.tsx"],"sourcesContent":["/**\n * Canonical validation-error shapes — one vocabulary across every surface.\n *\n * When server-side resolver schema enforcement rejects a payload, the API\n * layer returns status 422 with `LTValidationErrorBody` as the response body.\n * The same body shape flows to every consumer:\n * - HTTP routes serialize it as the JSON response body\n * - SDK callers receive it as `result.data` (with `result.code` set)\n * - MCP resolve tools return it as the tool's JSON error content\n * - the CLI prints the violation list beneath the error line\n * - the dashboard maps `violations` into the same errors panel the\n * pre-submission pass feeds\n */\n\n/** Machine-readable error codes carried on error envelopes and bodies. */\nexport const LT_ERROR_CODES = {\n /** The resolver payload failed the role's enforced form schema. */\n SCHEMA_VALIDATION: 'schema_validation',\n} as const;\n\nexport type LTErrorCode = (typeof LT_ERROR_CODES)[keyof typeof LT_ERROR_CODES];\n\n/**\n * One field-level violation — the same `{ field, message }` pair the dashboard\n * validation panel renders. Bulk surfaces add `escalationId` so a violation is\n * attributable to the row that produced it.\n */\nexport interface LTFieldViolation {\n field: string;\n message: string;\n escalationId?: string;\n}\n\n/** The 422 response body for a schema-validation rejection. */\nexport interface LTValidationErrorBody {\n /** Human-readable summary, e.g. \"resolverPayload failed schema validation (2 violations)\". */\n error: string;\n code: typeof LT_ERROR_CODES.SCHEMA_VALIDATION;\n /** Every field-level violation, in schema property order. */\n violations: LTFieldViolation[];\n /** The role whose enforced schema rejected the payload; null for a workflow input schema. */\n role: string | null;\n /** The schema version validated against; null when the role's live (unversioned) schema applied. */\n schemaVersion: number | null;\n /** The workflow whose input_schema rejected the data (invoke surface only). */\n workflowType?: string;\n}\n\n/** Narrow an unknown response body to the canonical validation-error shape. */\nexport function isValidationErrorBody(body: unknown): body is LTValidationErrorBody {\n return (\n typeof body === 'object' && body !== null\n && (body as Record<string, unknown>).code === LT_ERROR_CODES.SCHEMA_VALIDATION\n && Array.isArray((body as Record<string, unknown>).violations)\n );\n}\n","import { mapPayloadToForm } from './x-lt-bind';\n\n/**\n * The initial JSON an x-lt-* form edits: the schema rides along as the\n * `_form_schema` sidecar and every property starts at its prefill, its\n * declared default, or the zero value for its type. Object fields start as\n * {} so a checklist round-trips as an object from the first interaction.\n */\nexport function seedFormJson(\n formSchema: Record<string, any>,\n prefillPayload: Record<string, unknown> = {},\n): string {\n const prefill = mapPayloadToForm(prefillPayload, formSchema);\n const initial: Record<string, unknown> = { _form_schema: formSchema };\n for (const [key, def] of Object.entries((formSchema.properties ?? {}) as Record<string, Record<string, any>>)) {\n const zero = def.type === 'object' ? {} : '';\n initial[key] = prefill[key] ?? def.default ?? zero;\n }\n return JSON.stringify(initial, null, 2);\n}\n","/**\n * Human-readable label for a schema field.\n *\n * Resolution order:\n * 1. The JSON Schema `title` keyword — the author's explicit label, always wins.\n * 2. Snake/kebab keys become Title Case: `left_quantity` → `Left Quantity`.\n * 3. Single-token keys pass through unchanged: `PO`, `SKU`, `LEFTQUANTITY` —\n * a run of capitals carries no word boundaries to recover, and lowercasing\n * would mangle acronyms. Authors who want prose labels declare `title`.\n *\n * Used everywhere a field name faces a human: form labels, dictionary lists,\n * the errors panel, and metadata displays.\n */\nexport function deriveFieldLabel(\n key: string,\n fieldSchema?: Record<string, unknown> | null,\n): string {\n const title = fieldSchema?.title;\n if (typeof title === 'string' && title.trim().length > 0) return title.trim();\n\n const words = key.split(/[_-]+/).filter(Boolean);\n if (words.length <= 1) return key;\n\n return words\n .map((w) => (isCapsToken(w) ? w : w.charAt(0).toUpperCase() + w.slice(1)))\n .join(' ');\n}\n\n/** All-caps tokens (PO, SKU, ID) keep their casing inside multi-word keys. */\nfunction isCapsToken(word: string): boolean {\n return word.length > 1 && word === word.toUpperCase() && /[A-Z]/.test(word);\n}\n","import { AlertCircle } from 'lucide-react';\nimport { deriveFieldLabel } from '../../lib/derive-field-label';\nimport type { FieldError } from '../../lib/field-validator';\n\n/**\n * The form's issue list. Each row names the field through its schema title\n * and, on click, scrolls to and focuses the input carrying that\n * data-field-key. Shared by the escalation side panel and the invoke panel.\n */\nexport function ErrorsPanel({ errors, schema }: { errors: FieldError[]; schema?: Record<string, unknown> | null }) {\n const focusField = (field: string) => {\n const el = document.querySelector<HTMLElement>(`[data-field-key=\"${field}\"]`);\n if (!el) return;\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n el.focus({ preventScroll: true });\n };\n\n if (errors.length === 0) {\n return <p className=\"text-xs text-text-tertiary italic\">No errors to display.</p>;\n }\n\n return (\n <div className=\"space-y-1\" role=\"alert\" aria-live=\"polite\">\n <p className=\"text-2xs font-semibold uppercase tracking-wider text-status-error mb-4\">\n {errors.length} {errors.length === 1 ? 'issue' : 'issues'} to resolve\n </p>\n <div className=\"space-y-1.5\">\n {errors.map(({ field, message }) => (\n <button\n key={field}\n onClick={() => focusField(field)}\n className=\"w-full text-left flex items-start gap-3 px-3 py-2.5 rounded hover:bg-status-error/5 transition-colors group\"\n >\n <AlertCircle className=\"w-3.5 h-3.5 mt-0.5 shrink-0 text-status-error/60 group-hover:text-status-error transition-colors\" />\n <div>\n <p className=\"text-2xs font-semibold text-text-primary leading-snug\">\n {deriveFieldLabel(field, (schema?.properties as Record<string, Record<string, unknown>> | undefined)?.[field])}\n </p>\n <p className=\"text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors leading-snug mt-0.5\">\n {message}\n </p>\n </div>\n </button>\n ))}\n </div>\n <p className=\"text-2xs text-text-quaternary mt-4 px-3\">\n Click an issue to scroll to and focus the field.\n </p>\n </div>\n );\n}\n","/**\n * Context-path resolution shared by every token that names a `\"domain.path\"`.\n *\n * A path may embed `{{domain.path}}` interpolation segments — the same\n * grammar as x-lt-help tokens — resolved against the live context before the\n * walk. This is what makes cascading selects work: a field can declare\n *\n * x-lt-options: \"lookup.geo.regions.{{resolver.country}}\"\n *\n * and its option list follows the submitter's country answer, re-resolved\n * locally on every edit. An unresolved segment means \"no concrete path yet\",\n * never a literal placeholder.\n */\nimport { getDeep } from './x-lt-bind';\n\nexport const INTERPOLATION_PATTERN = /\\{\\{\\s*([^{}]+?)\\s*\\}\\}/g;\n\n/** Whether a token embeds `{{domain.path}}` interpolation segments. */\nexport function hasInterpolation(token: unknown): token is string {\n return typeof token === 'string' && /\\{\\{[^{}]+\\}\\}/.test(token);\n}\n\n/** Resolve a concrete `\"domain.path\"` (x-lt-bind syntax, `a.b[0].c`) against the context. */\nexport function resolveCtxPath(\n path: string,\n ctx: Record<string, unknown> | undefined,\n): unknown {\n if (!ctx) return undefined;\n const dot = path.indexOf('.');\n const root = ctx[dot === -1 ? path : path.slice(0, dot)];\n if (dot === -1) return root;\n if (root === null || typeof root !== 'object') return undefined;\n return getDeep(root, path.slice(dot + 1));\n}\n\n/**\n * Interpolate every `{{domain.path}}` segment against the context. Returns\n * the concrete path, or null when any segment resolves to nothing (missing,\n * null, empty string) or to a non-scalar — an unanswered cascade parent\n * yields no path, so the dependent field offers nothing.\n */\nexport function interpolatePath(\n template: string,\n ctx: Record<string, unknown> | undefined,\n): string | null {\n let unresolved = false;\n const concrete = template.replace(INTERPOLATION_PATTERN, (_match, rawPath: string) => {\n const value = resolveCtxPath(rawPath, ctx);\n if (typeof value === 'string' && value.trim().length > 0) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n unresolved = true;\n return '';\n });\n return unresolved ? null : concrete;\n}\n","/**\n * x-lt-options — a select's option list resolved from the escalation context.\n * The field-level token names a `\"domain.path\"`; the value at that path is an\n * array whose entries are scalars (strings or numbers) or `{ value, label }`\n * objects (`{ id, label }` accepted as an alias), so one static role form can\n * offer a different legal set per escalation (e.g. `[1..N]` where N rides the\n * envelope, or a versioned knowledge lookup under the `lookup` domain).\n *\n * x-lt-options \"domain.path\", an ORDERED array of paths, or an inline\n * literal list (an array with no string entries: `{ value,\n * label }` objects, numbers, or booleans) — e.g.\n * \"envelope.left_quantity_options\" or\n * [\"lookup.reasons.items\", \"envelope.reject_reason_items\"].\n * With an array, the first entry that resolves to options\n * wins, so lookup-backed and envelope-embedded rows render\n * the same shared schema interchangeably (a parked row\n * falls through to the envelope it already carries).\n * Paths may embed {{domain.path}} interpolation segments —\n * e.g. \"lookup.geo.regions.{{resolver.country}}\" — making\n * the option list follow another answer (cascading selects);\n * an entry whose interpolation cannot resolve falls through\n * to the next entry.\n *\n * Object entries separate what the submitter SEES from what the payload\n * STORES: the select renders the label and emits the value (a DB-backed pick\n * list showing text while storing its foreign key). A scalar entry is both.\n *\n * A static `enum` takes precedence when both are present — the same\n * static-over-dynamic rule as x-lt-minimum/x-lt-maximum. Resolution is a\n * tri-state:\n *\n * undefined — no dynamic contract: a plain path that resolves to nothing\n * (the field renders as its plain input; membership unenforced)\n * [] — a dynamic (interpolated) contract offering nothing YET: the\n * select renders disabled and a present value fails membership\n * options — the option list\n *\n * Malformed entries in a resolved array are dropped.\n */\nimport { hasInterpolation, interpolatePath, resolveCtxPath } from './ctx-path';\n\nexport const X_LT_OPTIONS = 'x-lt-options';\n\nexport type OptionValue = string | number | boolean;\n\n/** One resolved option: the payload value and the rendered label. */\nexport interface ResolvedOption {\n value: OptionValue;\n label: string;\n}\n\nfunction isScalar(v: unknown): v is OptionValue {\n return typeof v === 'string' || typeof v === 'boolean' || (typeof v === 'number' && Number.isFinite(v));\n}\n\n/**\n * An array token with no string entries is the option list itself, written\n * inline. A bare string is always a context path, so a literal string value\n * is written as `{ value, label }`.\n */\nfunction isLiteralList(token: unknown): token is unknown[] {\n return Array.isArray(token) && token.length > 0 && !token.some((e) => typeof e === 'string');\n}\n\n/** Normalize one array entry, mixed arrays resolving each entry independently. */\nfunction toOption(entry: unknown): ResolvedOption | null {\n if (isScalar(entry)) return { value: entry, label: String(entry) };\n if (entry && typeof entry === 'object' && !Array.isArray(entry)) {\n const o = entry as Record<string, unknown>;\n const value = o.value !== undefined ? o.value : o.id;\n if (isScalar(value) && typeof o.label === 'string' && o.label.length > 0) {\n return { value, label: o.label };\n }\n }\n return null;\n}\n\n/**\n * The field's effective option list: the static `enum` when present, else an\n * inline literal list, else the entries at the token's `\"domain.path\"`.\n */\nexport function resolveFieldOptions(\n fieldSchema: Record<string, unknown> | null | undefined,\n ctx: Record<string, unknown> | undefined,\n): ResolvedOption[] | undefined {\n if (!fieldSchema) return undefined;\n\n // Enum entries pass through verbatim as values (whatever their type), each\n // labeled by its string form.\n const staticEnum = fieldSchema.enum;\n if (Array.isArray(staticEnum) && staticEnum.length > 0) {\n return staticEnum.map((v) => ({ value: v as OptionValue, label: String(v) }));\n }\n\n const token = fieldSchema[X_LT_OPTIONS];\n if (isLiteralList(token)) {\n const options = token.map(toOption).filter((o): o is ResolvedOption => o !== null);\n return options.length > 0 ? options : undefined;\n }\n const paths = (typeof token === 'string' ? [token] : Array.isArray(token) ? token : [])\n .filter((p): p is string => typeof p === 'string' && p.length > 0);\n if (paths.length === 0) return undefined;\n\n // Interpolated entries are a standing contract: when nothing resolves, the\n // field stays a (disabled) select and fails closed — a cascade child never\n // becomes free text. All-plain-path tokens keep the legacy undefined-on-miss\n // reading (the field falls back to its typed plain input).\n const miss = paths.some(hasInterpolation) ? ([] as ResolvedOption[]) : undefined;\n\n for (const sourcePath of paths) {\n let concrete = sourcePath;\n if (hasInterpolation(sourcePath)) {\n const resolved = interpolatePath(sourcePath, ctx);\n if (resolved === null) continue;\n concrete = resolved;\n }\n const cur = resolveCtxPath(concrete, ctx);\n if (!Array.isArray(cur)) continue;\n const options = cur.map(toOption).filter((o): o is ResolvedOption => o !== null);\n if (options.length > 0) return options;\n }\n return miss;\n}\n","import { resolveFieldOptions, X_LT_OPTIONS } from './x-lt-options';\nimport { hasInterpolation, interpolatePath, resolveCtxPath } from './ctx-path';\n\nexport interface FieldError { field: string; message: string }\n\ninterface ChecklistItem { id: string; label: string; required?: boolean }\n\n/**\n * Resolve a checklist widget's item definitions from its `x-lt-source` —\n * a \"domain.path\" or an ORDERED array of paths — against the escalation\n * context. With an array, the first entry that resolves to a non-empty item\n * list wins, so lookup-backed and envelope-embedded rows render the same\n * shared schema interchangeably. Paths may embed `{{domain.path}}`\n * interpolation segments (cascading sources); an entry that cannot resolve\n * falls through to the next. Nothing resolvable yields an empty list.\n */\nexport function resolveChecklistItems(\n source: unknown,\n ctx: Record<string, unknown> | undefined,\n): ChecklistItem[] {\n const paths = (typeof source === 'string' ? [source] : Array.isArray(source) ? source : [])\n .filter((p): p is string => typeof p === 'string' && p.length > 0);\n if (paths.length === 0 || !ctx) return [];\n for (const sourcePath of paths) {\n let concrete = sourcePath;\n if (hasInterpolation(sourcePath)) {\n const resolved = interpolatePath(sourcePath, ctx);\n if (resolved === null) continue;\n concrete = resolved;\n }\n const cur = resolveCtxPath(concrete, ctx);\n if (Array.isArray(cur) && cur.length > 0) return cur as ChecklistItem[];\n }\n return [];\n}\n\nexport const X_LT_DEFAULT_CHECKED = 'x-lt-default-checked';\n\n/**\n * The checklist's first-load default (`x-lt-default-checked`): every resolved\n * item starts checked, for affirm-then-exception flows where the submitter\n * unchecks what failed. Returns the all-checked answer map ONLY when the\n * field carries no answer yet — a saved or drafted map (any key, even\n * all-false) is never clobbered — and null otherwise: absent flag, existing\n * answer, or a source that resolves to no items. Declared on the widget\n * because the item set is runtime-sourced (envelope or lookup): a pure\n * escalation-minting step cannot enumerate the ids to seed formDefaults.\n */\nexport function resolveChecklistDefault(\n fieldSchema: Record<string, unknown> | null | undefined,\n currentValue: unknown,\n ctx?: Record<string, unknown>,\n): Record<string, boolean> | null {\n if (fieldSchema?.['x-lt-widget'] !== 'checklist') return null;\n if (fieldSchema[X_LT_DEFAULT_CHECKED] !== true) return null;\n if (\n currentValue && typeof currentValue === 'object' && !Array.isArray(currentValue)\n && Object.keys(currentValue).length > 0\n ) {\n return null;\n }\n const items = resolveChecklistItems(fieldSchema['x-lt-source'], ctx);\n if (items.length === 0) return null;\n return Object.fromEntries(items.map((i) => [i.id, true]));\n}\n\n/**\n * The checklist completion guard (`x-lt-require-all`): every rendered item must\n * be checked, except items whose definition carries `required: false` (the\n * explicit opt-out). Vacuous when the source resolves to no items — never\n * blocks on zero. Returns the panel message, or undefined when satisfied.\n * Stricter than (and composes with) the field-level required-array entry,\n * which remains the at-least-one check.\n */\nexport function validateRequireAll(\n value: unknown,\n fieldSchema: Record<string, unknown> | undefined,\n ctx?: Record<string, unknown>,\n): string | undefined {\n if (fieldSchema?.['x-lt-widget'] !== 'checklist') return undefined;\n if (fieldSchema['x-lt-require-all'] !== true) return undefined;\n\n const items = resolveChecklistItems(fieldSchema['x-lt-source'], ctx);\n const mandatory = items.filter((i) => i.required !== false);\n if (mandatory.length === 0) return undefined;\n\n const state = (typeof value === 'object' && value !== null && !Array.isArray(value))\n ? (value as Record<string, unknown>)\n : {};\n const incomplete = mandatory.filter((i) => !state[i.id]).length;\n if (incomplete === 0) return undefined;\n return `${incomplete} of ${mandatory.length} checks incomplete`;\n}\n\nexport const INVALID_JSON = 'Invalid JSON';\n\n/** The json editor holds unparseable text as a string at the field's key. */\nfunction isJsonWidget(fieldSchema: Record<string, unknown> | undefined): boolean {\n return fieldSchema?.['x-lt-widget'] === 'json';\n}\n\n/** A list is edited through the json editor or a multi-select; any other list value is display only. */\nfunction isEditableList(fieldSchema: Record<string, unknown> | undefined): boolean {\n return isJsonWidget(fieldSchema) || fieldSchema?.[X_LT_OPTIONS] !== undefined;\n}\n\nfunction plural(n: number, noun: string): string {\n return `${n} ${noun}${n === 1 ? '' : 's'}`;\n}\n\n/**\n * Runtime type check against the field's declared JSON Schema `type`. Guards\n * the payload contract for API-first callers (a form widget already produces\n * the right primitive; a script or agent submitting `\"1\"` for a number field\n * does not). Absent/empty values pass — presence is the required check's job.\n */\nexport function validateFieldType(\n value: unknown,\n fieldSchema: Record<string, unknown> | undefined,\n): string | undefined {\n const declared = fieldSchema?.type;\n if (typeof declared !== 'string') return undefined;\n if (value === undefined || value === null || value === '') return undefined;\n switch (declared) {\n case 'string':\n return typeof value === 'string' ? undefined : 'Expected text';\n case 'number':\n return typeof value === 'number' && Number.isFinite(value) ? undefined : 'Expected a number';\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value) ? undefined : 'Expected a whole number';\n case 'boolean':\n return typeof value === 'boolean' ? undefined : 'Expected true or false';\n case 'array':\n if (Array.isArray(value)) return undefined;\n return isJsonWidget(fieldSchema) && typeof value === 'string' ? INVALID_JSON : 'Expected a list';\n case 'object':\n if (typeof value === 'object' && !Array.isArray(value)) return undefined;\n return isJsonWidget(fieldSchema) && typeof value === 'string' ? INVALID_JSON : 'Expected an object';\n default:\n return undefined;\n }\n}\n\n/**\n * Per-field JSON Schema validation — subset used by the resolver form.\n *\n * Returns a human-readable error string when the value fails a constraint,\n * or undefined when the value is valid. Callers are responsible for the\n * required check (empty-when-required) before calling this for constraint checks.\n *\n * `ctx` is optional context (ShowIfContext-shaped) used to resolve dynamic\n * constraint paths like `x-lt-minimum: \"envelope.min_score\"`.\n */\nexport function validateFieldConstraints(\n value: unknown,\n fieldSchema: Record<string, unknown> | undefined,\n ctx?: Record<string, unknown>,\n): string | undefined {\n if (!fieldSchema) return undefined;\n\n // Option membership — the form's select widget constrains choices; API-first\n // callers are unconstrained, so the effective option list is the contract:\n // the static enum, or the x-lt-options list resolved from context. The\n // submitted answer is the option VALUE (labels are presentation). An\n // interpolated list that currently offers nothing fails closed — a stale\n // cascade child value never submits.\n const allowed = resolveFieldOptions(fieldSchema, ctx);\n if (allowed !== undefined && value !== undefined && value !== null && value !== '' && !Array.isArray(value)) {\n if (allowed.length === 0) {\n return 'No valid options for this selection';\n }\n if (!allowed.some((o) => o.value === value)) {\n return `Must be one of: ${allowed.map((o) => String(o.value)).join(', ')}`;\n }\n }\n\n if (Array.isArray(value)) {\n return isEditableList(fieldSchema) ? validateListConstraints(value, fieldSchema, allowed, ctx) : undefined;\n }\n\n if (value !== null && typeof value === 'object') {\n return validateMapConstraints(value as Record<string, unknown>, fieldSchema, ctx);\n }\n\n if (typeof value === 'string') {\n const s = value.trim();\n if (s === '') return undefined; // empty string: required check is the caller's job\n\n const minLength = resolveNumericConstraint(fieldSchema.minLength, fieldSchema['x-lt-min-length'], ctx);\n if (minLength !== undefined && s.length < minLength) {\n return `Minimum ${minLength} character${minLength === 1 ? '' : 's'}`;\n }\n\n const maxLength = resolveNumericConstraint(fieldSchema.maxLength, fieldSchema['x-lt-max-length'], ctx);\n if (maxLength !== undefined && s.length > maxLength) {\n return `Maximum ${maxLength} characters (${s.length} entered)`;\n }\n\n const pattern = fieldSchema.pattern as string | undefined;\n if (pattern) {\n try {\n if (!new RegExp(pattern).test(s)) {\n const patternError = fieldSchema['x-lt-pattern-error'] as string | undefined;\n return patternError ?? 'Invalid format';\n }\n } catch {\n // Malformed pattern in schema — silently skip\n }\n }\n\n const fmt = fieldSchema.format as string | undefined;\n if (fmt === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(s)) {\n return 'Enter a valid email address';\n }\n if (fmt === 'uri' && !/^https?:\\/\\/.+/.test(s)) {\n return 'Enter a valid URL';\n }\n }\n\n if (typeof value === 'number') {\n const minimum = resolveNumericConstraint(fieldSchema.minimum, fieldSchema['x-lt-minimum'], ctx);\n const exclusiveMinimum = resolveNumericConstraint(fieldSchema.exclusiveMinimum, undefined, ctx);\n const maximum = resolveNumericConstraint(fieldSchema.maximum, fieldSchema['x-lt-maximum'], ctx);\n const exclusiveMaximum = resolveNumericConstraint(fieldSchema.exclusiveMaximum, undefined, ctx);\n\n if (minimum !== undefined && value < minimum) {\n return `Minimum value is ${minimum}`;\n }\n if (exclusiveMinimum !== undefined && value <= exclusiveMinimum) {\n return `Must be greater than ${exclusiveMinimum}`;\n }\n if (maximum !== undefined && value > maximum) {\n return `Maximum value is ${maximum}`;\n }\n if (exclusiveMaximum !== undefined && value >= exclusiveMaximum) {\n return `Must be less than ${exclusiveMaximum}`;\n }\n }\n\n return undefined;\n}\n\n/**\n * An edited list: every item must belong to the field's `x-lt-options` when\n * declared, the length must sit within `minItems`/`maxItems`, and each item\n * must satisfy `items`. An empty list passes; presence is the required\n * check's job.\n */\nfunction validateListConstraints(\n value: unknown[],\n fieldSchema: Record<string, unknown>,\n allowed: ReturnType<typeof resolveFieldOptions>,\n ctx: Record<string, unknown> | undefined,\n): string | undefined {\n if (value.length === 0) return undefined;\n if (allowed !== undefined) {\n if (allowed.length === 0) return 'No valid options for this selection';\n if (value.some((v) => !allowed.some((o) => o.value === v))) {\n return `Must be one of: ${allowed.map((o) => String(o.value)).join(', ')}`;\n }\n }\n const minItems = resolveNumericConstraint(fieldSchema.minItems, undefined, ctx);\n if (minItems !== undefined && value.length < minItems) return `At least ${plural(minItems, 'item')}`;\n const maxItems = resolveNumericConstraint(fieldSchema.maxItems, undefined, ctx);\n if (maxItems !== undefined && value.length > maxItems) return `At most ${plural(maxItems, 'item')}`;\n const items = fieldSchema.items;\n if (items && typeof items === 'object' && !Array.isArray(items)) {\n const itemSchema = items as Record<string, unknown>;\n for (let i = 0; i < value.length; i++) {\n const err = validateFieldType(value[i], itemSchema) ?? validateFieldConstraints(value[i], itemSchema, ctx);\n if (err) return `Item ${i + 1}: ${err}`;\n }\n }\n return undefined;\n}\n\n/**\n * A map value: keys must belong to `propertyNames.enum` when declared, and\n * every value must satisfy an object-shaped `additionalProperties`.\n */\nfunction validateMapConstraints(\n value: Record<string, unknown>,\n fieldSchema: Record<string, unknown>,\n ctx: Record<string, unknown> | undefined,\n): string | undefined {\n const entries = Object.entries(value);\n if (entries.length === 0) return undefined;\n const propertyNames = fieldSchema.propertyNames as Record<string, unknown> | undefined;\n const allowedKeys = Array.isArray(propertyNames?.enum) ? propertyNames.enum.map(String) : undefined;\n if (allowedKeys) {\n const unknown = entries.find(([k]) => !allowedKeys.includes(k));\n if (unknown) return `Unknown key \"${unknown[0]}\". Allowed: ${allowedKeys.join(', ')}`;\n }\n const ap = fieldSchema.additionalProperties;\n if (ap && typeof ap === 'object' && !Array.isArray(ap)) {\n const valueSchema = ap as Record<string, unknown>;\n for (const [k, v] of entries) {\n const err = validateFieldType(v, valueSchema) ?? validateFieldConstraints(v, valueSchema, ctx);\n if (err) return `\"${k}\": ${err}`;\n }\n }\n return undefined;\n}\n\nfunction resolveNumericConstraint(\n staticVal: unknown,\n dynamicPath: unknown,\n ctx: Record<string, unknown> | undefined,\n): number | undefined {\n if (typeof staticVal === 'number') return staticVal;\n if (typeof dynamicPath === 'string' && ctx) {\n const dot = dynamicPath.indexOf('.');\n if (dot !== -1) {\n const domain = dynamicPath.slice(0, dot);\n const path = dynamicPath.slice(dot + 1);\n const domainObj = ctx[domain];\n if (domainObj && typeof domainObj === 'object') {\n const parts = path.split('.');\n let cur: unknown = domainObj;\n for (const p of parts) {\n cur = (cur as Record<string, unknown>)[p];\n if (cur === undefined) break;\n }\n if (typeof cur === 'number') return cur;\n if (typeof cur === 'string') {\n const n = Number(cur);\n if (!Number.isNaN(n)) return n;\n }\n }\n }\n }\n return undefined;\n}\n\n/** Full field error including required check then constraints. */\nexport function validateField(\n value: unknown,\n fieldSchema: Record<string, unknown> | undefined,\n isRequired: boolean,\n isTouched: boolean,\n ctx?: Record<string, unknown>,\n): string | undefined {\n if (!isTouched) return undefined;\n\n if (isRequired) {\n if (value === undefined || value === null) return 'Required';\n // A checkbox must be checked; a boolean with an option list is answered by either value.\n if (typeof value === 'boolean' && !value && resolveFieldOptions(fieldSchema, ctx) === undefined) return 'Required';\n if (typeof value === 'string' && value.trim() === '') return 'Required';\n // A picked or edited list needs one item; a plain list value is not checked.\n if (Array.isArray(value) && value.length === 0 && isEditableList(fieldSchema)) return 'Required';\n if (typeof value === 'object' && !Array.isArray(value) && value !== null) {\n const vals = Object.values(value as Record<string, unknown>);\n if (vals.length === 0) return 'Required';\n // A json map is answered by any key; every other object needs one truthy value.\n if (!isJsonWidget(fieldSchema) && vals.every((v) => !v)) return 'Required';\n }\n }\n\n // Declared-type check runs before constraints: a mis-typed value would make\n // the numeric/string constraint branches silently inapplicable.\n const typeError = validateFieldType(value, fieldSchema);\n if (typeError) return typeError;\n\n // Checklist completion — the stricter guard runs regardless of the\n // required-array entry (which stays at-least-one when present).\n const requireAll = validateRequireAll(value, fieldSchema, ctx);\n if (requireAll) return requireAll;\n\n return validateFieldConstraints(value, fieldSchema, ctx);\n}\n","/**\n * x-lt-showIf — conditional field visibility. A form_schema property may\n * declare `x-lt-showIf: \"domain.path\"` to show the field only when the value\n * at that path is present and truthy. Prefix `!` to invert: show when absent\n * or falsy.\n *\n * Equality forms compare the resolved value's string form:\n * \"domain.path=VALUE\" — show when String(value) equals VALUE\n * \"domain.path!=VALUE\" — show when it does not\n * An absent value compares as the empty string, so `=X` is false and `!=X` is\n * true when the path is missing. VALUE is the raw remainder after the operator\n * (trimmed; no quoting). The truthy/! forms are unchanged.\n *\n * Domains follow the same `domain.path` convention as x-lt-help tokens:\n * metadata — the escalation row's metadata dict\n * payload — the escalation context payload (escalation_payload)\n * envelope — the workflow-sent input envelope\n * escalation — top-level escalation row fields\n * resolver — the submitted resolver payload\n *\n * A missing or non-string condition always shows the field (opt-in, safe default).\n */\nimport { getDeep } from './x-lt-bind';\nimport { HELP_DOMAINS, type HelpTokenContext } from './x-lt-help';\n\nexport type ShowIfContext = HelpTokenContext;\n\nfunction isTruthy(value: unknown): boolean {\n return value !== null && value !== undefined && value !== '' && value !== false && value !== 0;\n}\n\n/** The value's comparable string form; absent compares as the empty string. */\nfunction asComparable(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nfunction resolvePath(expr: string, ctx: ShowIfContext): { known: boolean; value: unknown } {\n const dot = expr.indexOf('.');\n const domain = (dot === -1 ? expr : expr.slice(0, dot)) as (typeof HELP_DOMAINS)[number];\n if (!(HELP_DOMAINS as readonly string[]).includes(domain)) return { known: false, value: undefined };\n const root = ctx[domain];\n if (dot === -1) return { known: true, value: root };\n try {\n return { known: true, value: getDeep(root, expr.slice(dot + 1)) };\n } catch {\n return { known: true, value: undefined };\n }\n}\n\n/**\n * Evaluates an x-lt-showIf condition. Returns true when the field should be\n * shown. Returns true when condition is absent, non-string, or context is null.\n * An array of conditions shows the field only when every one holds.\n */\nexport function evaluateShowIf(condition: unknown, ctx: ShowIfContext | null | undefined): boolean {\n if (Array.isArray(condition)) return condition.every((c) => evaluateShowIf(c, ctx));\n if (typeof condition !== 'string' || condition.length === 0) return true;\n if (!ctx) return true;\n const negate = condition.startsWith('!');\n const expr = negate ? condition.slice(1) : condition;\n\n // Equality forms — `!=` first so it never parses as `=` with a `!` in the path.\n const neqAt = expr.indexOf('!=');\n const eqAt = expr.indexOf('=');\n if (neqAt !== -1 || (eqAt !== -1 && eqAt !== neqAt + 1)) {\n const isNeq = neqAt !== -1 && (eqAt === -1 || neqAt < eqAt);\n const opAt = isNeq ? neqAt : eqAt;\n const path = expr.slice(0, opAt).trim();\n const expected = expr.slice(opAt + (isNeq ? 2 : 1)).trim();\n const { known, value } = resolvePath(path, ctx);\n if (!known) return true; // unknown domain — safe default, same as truthy form\n const matches = asComparable(value) === expected;\n const result = isNeq ? !matches : matches;\n return negate ? !result : result;\n }\n\n const { known, value } = resolvePath(expr, ctx);\n if (!known) return true;\n return negate ? !isTruthy(value) : isTruthy(value);\n}\n\n/**\n * `x-lt-hide-if-empty`: the field is suppressed while its value is empty\n * (null, undefined, '', false, or 0). Render and validation share this test.\n */\nexport function isHiddenIfEmpty(fieldSchema: Record<string, unknown> | undefined, value: unknown): boolean {\n if (fieldSchema?.['x-lt-hide-if-empty'] !== true) return false;\n return value === null || value === undefined || value === '' || value === false || value === 0;\n}\n","/**\n * x-lt-require-any — \"at least one of this set\" as a root-schema token. A\n * form_schema declares groups of field names; a submission passes when every\n * group has a value in at least one member. The canonical case: a Left\n * quantity and a Right quantity where either satisfies, but blank-both fails.\n *\n * x-lt-require-any string[][] — e.g. [[\"left_quantity\", \"right_quantity\"]]\n *\n * Visibility rules compose: a member hidden by its `x-lt-showIf` (or naming\n * no schema property) can neither satisfy the group nor be demanded of the\n * submitter, and a group whose members are ALL hidden is waived. `false` and\n * `0` are answers; `''`, null, and undefined are not.\n */\n\nexport const X_LT_REQUIRE_ANY = 'x-lt-require-any';\n\n/**\n * The schema's require-any groups. Malformed declarations (non-array token,\n * non-array groups, non-string members) read as no groups — a bad token never\n * bricks submission.\n */\nexport function readRequireAnyGroups(\n schema: Record<string, unknown> | null | undefined,\n): string[][] {\n const raw = schema?.[X_LT_REQUIRE_ANY];\n if (!Array.isArray(raw)) return [];\n return raw\n .filter((group): group is unknown[] => Array.isArray(group))\n .map((group) => group.filter((m): m is string => typeof m === 'string' && m.length > 0))\n .filter((group) => group.length > 0);\n}\n\n/** Present = an actual answer: `false` and `0` count; `''`/null/undefined do not. */\nexport function hasRequireAnyValue(value: unknown): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n return true;\n}\n","/**\n * x-lt-require-sum — \"these quantities must total at least N\" as a\n * root-schema token. Where x-lt-require-any asks that one member carry any\n * answer (so a count defaulting to `0` vacuously satisfies it), require-sum\n * reads the members as numbers and demands their sum reach a minimum. The\n * canonical case: a Left quantity and a Right quantity that both default to\n * `0`, where at least one side must be positive.\n *\n * x-lt-require-sum { fields: string[], minimum?: number }[]\n * — e.g. [{ \"fields\": [\"left_quantity\", \"right_quantity\"] }]\n *\n * `minimum` defaults to 1. Numbers contribute their value and numeric strings\n * coerce (the same reading as dynamic bounds); everything else contributes 0.\n * Visibility rules compose the same way as require-any: a member hidden by\n * its `x-lt-showIf` (or naming no schema property) contributes nothing and is\n * not demanded, and a group whose members are ALL hidden is waived.\n */\n\nexport const X_LT_REQUIRE_SUM = 'x-lt-require-sum';\n\nexport interface RequireSumGroup {\n fields: string[];\n minimum: number;\n}\n\n/**\n * The schema's require-sum groups. Malformed declarations (non-array token,\n * groups without a fields array, non-string members, non-numeric minimum)\n * read as no groups — a bad token never bricks submission.\n */\nexport function readRequireSumGroups(\n schema: Record<string, unknown> | null | undefined,\n): RequireSumGroup[] {\n const raw = schema?.[X_LT_REQUIRE_SUM];\n if (!Array.isArray(raw)) return [];\n const groups: RequireSumGroup[] = [];\n for (const entry of raw) {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) continue;\n const { fields, minimum } = entry as Record<string, unknown>;\n if (!Array.isArray(fields)) continue;\n const members = fields.filter((m): m is string => typeof m === 'string' && m.length > 0);\n if (members.length === 0) continue;\n if (minimum !== undefined && typeof minimum !== 'number') continue;\n groups.push({ fields: members, minimum: typeof minimum === 'number' ? minimum : 1 });\n }\n return groups;\n}\n\n/** A member's numeric contribution: numbers as-is, numeric strings coerced, all else 0. */\nexport function requireSumContribution(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n if (!Number.isNaN(n)) return n;\n }\n return 0;\n}\n","/**\n * The full pre-submission validation pass over a resolver form schema — the\n * same pass on both sides of the wire. The dashboard runs it on the flat form\n * values before submitting; the API layer runs it on the submitted (bound,\n * nested) payload by inverting x-lt-bind first. Because both entry points\n * funnel into one loop, a payload that passes the client panel passes the\n * server gate, and a 422's violation list is exactly what the panel shows.\n *\n * Semantics per field:\n * - x-lt-showIf-hidden fields are skipped entirely (a field the submitter\n * cannot see never blocks submission)\n * - required (schema.required membership), with checklist/empty-object rules\n * - declared-type check (string/number/integer/boolean/array/object)\n * - enum membership\n * - x-lt-require-all against the checklist items resolved from context\n * - static + dynamic bounds (minimum/x-lt-minimum, lengths, patterns)\n *\n * Root-level x-lt-require-any groups run after the per-field pass: each group\n * needs a value in at least one visible member (all-hidden groups are waived).\n * x-lt-require-sum groups follow the same visibility rules but read members\n * as numbers: the group's visible members must sum to at least its minimum.\n *\n * The showIf/`resolver.*` domain is always the FLAT form representation, so a\n * condition like `resolver.approved` reads the same on both sides.\n */\nimport { type FieldError, validateField } from './field-validator';\nimport { evaluateShowIf, type ShowIfContext } from './x-lt-show-if';\nimport { mapPayloadToForm } from './x-lt-bind';\nimport { readRequireAnyGroups, hasRequireAnyValue } from './x-lt-require-any';\nimport { readRequireSumGroups, requireSumContribution } from './x-lt-require-sum';\n\nexport type { FieldError } from './field-validator';\n\n/**\n * The escalation-surface context the pass evaluates showIf conditions and\n * dynamic constraints against. `resolver` is supplied by the pass itself\n * (the flat form values under validation) — callers provide the rest.\n */\nexport type ResolverValidationContext = Omit<ShowIfContext, 'resolver' | 'input'>;\n\n/**\n * Validate FLAT form values against the form schema. This is the dashboard's\n * entry point (the values the user edits, keyed by field name).\n */\nexport function validateResolverForm(\n schema: Record<string, unknown> | null | undefined,\n formValues: Record<string, unknown>,\n ctx?: ResolverValidationContext | null,\n): FieldError[] {\n if (!schema) return [];\n const properties = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const required = new Set((schema.required as string[] | undefined) ?? []);\n const liveCtx: ShowIfContext = {\n ...(ctx ?? {}),\n resolver: formValues as Record<string, unknown>,\n input: formValues as Record<string, unknown>,\n };\n\n const errors: FieldError[] = [];\n for (const [field, fieldSchema] of Object.entries(properties)) {\n if (!evaluateShowIf(fieldSchema['x-lt-showIf'], liveCtx)) continue;\n const err = validateField(\n formValues[field],\n fieldSchema,\n required.has(field),\n true,\n liveCtx as Record<string, unknown>,\n );\n if (err) errors.push({ field, message: err });\n }\n\n // Require-any groups: at least one VISIBLE member per group carries a value.\n // A member hidden by showIf (or naming no property) can neither satisfy nor\n // be demanded; an all-hidden group is waived.\n for (const group of readRequireAnyGroups(schema)) {\n const visible = group.filter(\n (k) => properties[k] && evaluateShowIf(properties[k]['x-lt-showIf'], liveCtx),\n );\n if (visible.length === 0) continue;\n if (visible.some((k) => hasRequireAnyValue(formValues[k]))) continue;\n const titles = visible.map((k) => (properties[k].title as string | undefined) ?? k);\n errors.push({\n field: visible[0],\n message: `Enter a value for at least one of: ${titles.join(', ')}`,\n });\n }\n\n // Require-sum groups: the numeric values of VISIBLE members must total at\n // least the group's minimum. A `0` is a real number here — unlike\n // require-any, defaulted-zero quantities do not satisfy the group.\n for (const group of readRequireSumGroups(schema)) {\n const visible = group.fields.filter(\n (k) => properties[k] && evaluateShowIf(properties[k]['x-lt-showIf'], liveCtx),\n );\n if (visible.length === 0) continue;\n const total = visible.reduce((sum, k) => sum + requireSumContribution(formValues[k]), 0);\n if (total >= group.minimum) continue;\n const titles = visible.map((k) => (properties[k].title as string | undefined) ?? k);\n errors.push({\n field: visible[0],\n message: `Combined value of ${titles.join(', ')} must be at least ${group.minimum}`,\n });\n }\n return errors;\n}\n\n/**\n * Validate a SUBMITTED resolver payload (the bound, nested shape the workflow\n * consumes) against the form schema. This is the API layer's entry point: the\n * payload is inverted through each field's x-lt-bind path back to the flat\n * form representation, then run through the same pass the client uses.\n */\nexport function validateResolverPayload(\n schema: Record<string, unknown> | null | undefined,\n payload: Record<string, unknown>,\n ctx?: ResolverValidationContext | null,\n): FieldError[] {\n if (!schema) return [];\n const formValues = mapPayloadToForm(payload, schema as Record<string, any>);\n return validateResolverForm(schema, formValues, ctx);\n}\n","import { mapFormToPayload } from './x-lt-bind';\nimport { validateResolverForm, type FieldError } from './field-validator';\nimport type { ShowIfContext } from './x-lt-show-if';\n\nexport interface ResolverPayloadResult {\n /** The resolver payload ready to submit — null when the JSON is unparseable or validation failed. */\n payload: Record<string, unknown> | null;\n /** Field errors against the embedded _form_schema (empty when the form is valid). */\n errors: FieldError[];\n /** Set when the edited JSON string itself is malformed. */\n parseError: string | null;\n}\n\n/**\n * Build the resolver payload from the form's edited JSON string.\n *\n * 1. Parse the JSON — a malformed string yields `parseError`.\n * 2. Validate every visible field against the embedded `_form_schema` — hidden\n * fields (x-lt-showIf falsy against the live context) are skipped, matching\n * the server's enforcement pass. Any failures yield `errors`.\n * 3. Strip the UI-only schema and map flat form fields into their nested shape\n * via x-lt-bind — the payload IS the payload.\n *\n * The single path shared by the footer's Submit button and the submit-on-claim\n * shortcut, so both produce identical payloads and identical error lists.\n */\nexport function buildResolverPayload(\n json: string,\n context?: ShowIfContext,\n): ResolverPayloadResult {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(json) as Record<string, unknown>;\n } catch {\n return { payload: null, errors: [], parseError: 'Invalid JSON' };\n }\n\n const schema = parsed._form_schema as Record<string, unknown> | undefined;\n if (schema) {\n const errors = validateResolverForm(schema, parsed, context);\n if (errors.length > 0) return { payload: null, errors, parseError: null };\n }\n\n const { _form_schema, ...formValues } = parsed;\n return {\n payload: mapFormToPayload(formValues, schema as Record<string, any> | undefined),\n errors: [],\n parseError: null,\n };\n}\n","import { useEffect, useState, type ReactNode } from 'react';\nimport { Lock } from 'lucide-react';\n\n/** Animation length; a fallback timer clears state where animationend never fires. */\nconst HINT_MS = 2600;\n\n/**\n * The locked form's interaction frame. A click reports the gesture (the page\n * nudges Claim) and answers right at the click point: a small toast pops in\n * above the cursor naming the state — \"Claim this escalation to edit the\n * form\", \"Claimed by …\", \"resolved\" — holds a beat, and drifts out. Children\n * arrive as a prop, so hint state re-renders only this frame, never the form\n * beneath it.\n */\nexport function LockedFormFrame({\n hint,\n onLockedClick,\n children,\n}: {\n hint?: ReactNode;\n onLockedClick?: () => void;\n children: ReactNode;\n}) {\n const [hintAt, setHintAt] = useState<{ x: number; y: number; n: number } | null>(null);\n\n useEffect(() => {\n if (!hintAt) return;\n const timer = setTimeout(() => setHintAt(null), HINT_MS);\n return () => clearTimeout(timer);\n }, [hintAt]);\n\n const handleClick = (e: React.MouseEvent) => {\n onLockedClick?.();\n if (hint) {\n // Keep the bubble on screen when the click hugs a viewport edge.\n const x = Math.min(Math.max(e.clientX, 96), window.innerWidth - 96);\n setHintAt((prev) => ({ x, y: e.clientY, n: (prev?.n ?? 0) + 1 }));\n }\n };\n\n return (\n <div className=\"pb-8 max-w-form\" onClick={handleClick} data-testid=\"locked-form-frame\">\n {children}\n {hint && hintAt && (\n <div\n // Keyed per click so a repeat click replays the pop at the new spot.\n key={hintAt.n}\n role=\"status\"\n className=\"fixed z-[60] pointer-events-none flex items-center gap-2 px-3 py-1.5 rounded-md bg-surface-raised border border-surface-border shadow-lg text-xs font-medium text-text-primary whitespace-nowrap animate-[click-hint_2.6s_ease-in-out_both]\"\n style={{ left: hintAt.x, top: hintAt.y - 12 }}\n onAnimationEnd={() => setHintAt(null)}\n data-testid=\"locked-form-hint\"\n >\n <Lock className=\"w-3.5 h-3.5 text-accent shrink-0\" strokeWidth={1.5} />\n {hint}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Shared field chrome for the resolver form: label, helper, error, and the\n * input class recipes. One place styles every generated field.\n */\n\nexport function FieldLabel({ children, isRequired, htmlFor }: {\n children: React.ReactNode;\n isRequired?: boolean;\n htmlFor?: string;\n}) {\n // `block` is load-bearing: a <label> is inline by default, and the\n // label→instruction→control anatomy would then hold only by accident —\n // a full-width control wraps below, but a narrow control (number,\n // max-w-48) with no instruction line sits flush BESIDE the label. The\n // anatomy is a column; the label declares it.\n return (\n <label htmlFor={htmlFor} className=\"block text-2xs font-semibold uppercase tracking-wider text-text-secondary\">\n {children}\n {isRequired && <span className=\"text-status-error ml-0.5\">*</span>}\n </label>\n );\n}\n\nexport function FieldHelper({ id, children }: { id?: string; children: React.ReactNode }) {\n return (\n <p id={id} className=\"text-2xs text-text-tertiary mt-0.5 leading-snug\">\n {children}\n </p>\n );\n}\n\nexport function FieldError({ error, id }: { error?: string; id?: string }) {\n if (!error) return null;\n return (\n <p id={id} role=\"alert\" className=\"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]\">\n {error}\n </p>\n );\n}\n\nexport function inputClass(hasError?: boolean): string {\n return hasError\n ? 'input text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]'\n : 'input text-sm w-full mt-1';\n}\n\n// Select shares the field recipe but adds the unified chevron (via .select).\n// Width follows the content, floored for presence and capped by the cell —\n// a one-word choice never stretches across the measure. The floor is\n// min(16rem, 100%): CSS lets min-width beat max-width, so a bare min-w-64\n// would overflow a cell narrower than 16rem — the cell always wins.\nexport function selectClass(hasError?: boolean): string {\n return hasError\n ? 'select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]'\n : 'select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full';\n}\n","import { useCallback, useRef } from 'react';\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel } from '../resolver-form/FieldChrome';\n\ninterface FileUploadWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n isRequired?: boolean;\n}\n\n/**\n * File upload widget that reads a file via FileReader and stores\n * its base64 data URL in the form value.\n */\nexport function FileUploadWidget({ fieldKey, value, onChange, schema, isRequired }: FileUploadWidgetProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const accept = (schema?.accept as string) ?? undefined;\n const label = deriveFieldLabel(fieldKey, schema);\n const helperText = schema?.description as string | undefined;\n\n const handleFile = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n onChange(reader.result);\n }\n };\n reader.readAsDataURL(file);\n }, [onChange]);\n\n const hasFile = value.startsWith('data:');\n\n return (\n <div>\n <FieldLabel isRequired={isRequired}>\n {label}\n </FieldLabel>\n {helperText && <p className=\"text-2xs text-text-tertiary mt-0.5\">{helperText}</p>}\n <div className=\"mt-1\">\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n onChange={handleFile}\n className=\"hidden\"\n />\n <button\n type=\"button\"\n onClick={() => inputRef.current?.click()}\n className=\"btn-secondary text-xs px-3 py-1.5\"\n >\n {hasFile ? 'Replace file' : 'Choose file'}\n </button>\n {hasFile && (\n <span className=\"ml-2 text-xs text-status-success\">File attached</span>\n )}\n </div>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel } from '../resolver-form/FieldChrome';\n\ninterface CodeEditorWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n isRequired?: boolean;\n}\n\n/**\n * Monospace textarea with tab-key support for code input.\n */\nexport function CodeEditorWidget({ fieldKey, value, onChange, schema, isRequired }: CodeEditorWidgetProps) {\n const label = deriveFieldLabel(fieldKey, schema);\n const helperText = schema?.description as string | undefined;\n const language = (schema?.['x-lt-language'] as string) ?? '';\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n const target = e.currentTarget;\n const start = target.selectionStart;\n const end = target.selectionEnd;\n const updated = value.substring(0, start) + ' ' + value.substring(end);\n onChange(updated);\n requestAnimationFrame(() => {\n target.selectionStart = target.selectionEnd = start + 2;\n });\n }\n }, [value, onChange]);\n\n return (\n <div>\n <FieldLabel isRequired={isRequired}>\n {label}\n {language && (\n <span className=\"ml-2 text-text-tertiary/60 normal-case font-normal\">{language}</span>\n )}\n </FieldLabel>\n {helperText && <p className=\"text-2xs text-text-tertiary mt-0.5\">{helperText}</p>}\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n className=\"input w-full mt-1 font-mono text-xs leading-relaxed\"\n rows={10}\n spellCheck={false}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel } from '../resolver-form/FieldChrome';\n\ninterface SignatureWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n isRequired?: boolean;\n}\n\n/**\n * HTML5 Canvas signature pad. Outputs a PNG data URL.\n */\nexport function SignatureWidget({ fieldKey, value, onChange, schema, isRequired }: SignatureWidgetProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isDrawing, setIsDrawing] = useState(false);\n const label = deriveFieldLabel(fieldKey, schema);\n const helperText = schema?.description as string | undefined;\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.lineWidth = 2;\n ctx.lineCap = 'round';\n // Deliberately unthemed: the signature is a captured document artifact —\n // the exported PNG must read like ink on paper regardless of theme.\n ctx.strokeStyle = '#1E1535';\n\n if (value && value.startsWith('data:')) {\n const img = new Image();\n img.onload = () => ctx.drawImage(img, 0, 0);\n img.src = value;\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const getPos = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n // The backing store is a fixed 400×150 document; the element may display\n // at any width. Scale pointer coordinates into store space so the ink\n // lands under the cursor at every display size.\n const scaleX = rect.width > 0 ? canvas.width / rect.width : 1;\n const scaleY = rect.height > 0 ? canvas.height / rect.height : 1;\n if ('touches' in e) {\n return {\n x: (e.touches[0].clientX - rect.left) * scaleX,\n y: (e.touches[0].clientY - rect.top) * scaleY,\n };\n }\n return { x: (e.clientX - rect.left) * scaleX, y: (e.clientY - rect.top) * scaleY };\n }, []);\n\n const startDraw = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n setIsDrawing(true);\n const ctx = canvasRef.current?.getContext('2d');\n if (!ctx) return;\n const pos = getPos(e);\n ctx.beginPath();\n ctx.moveTo(pos.x, pos.y);\n }, [getPos]);\n\n const draw = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n if (!isDrawing) return;\n const ctx = canvasRef.current?.getContext('2d');\n if (!ctx) return;\n const pos = getPos(e);\n ctx.lineTo(pos.x, pos.y);\n ctx.stroke();\n }, [isDrawing, getPos]);\n\n const endDraw = useCallback(() => {\n setIsDrawing(false);\n const canvas = canvasRef.current;\n if (canvas) {\n onChange(canvas.toDataURL('image/png'));\n }\n }, [onChange]);\n\n const clear = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n onChange('');\n }, [onChange]);\n\n return (\n <div>\n <FieldLabel isRequired={isRequired}>\n {label}\n </FieldLabel>\n {helperText && <p className=\"text-2xs text-text-tertiary mt-0.5\">{helperText}</p>}\n {/* The pad holds its natural document proportion (25rem = the 400px\n backing store), never stretched to the measure — the exported PNG\n is the artifact. Narrower cells shrink it; the scaling in getPos\n keeps the ink under the cursor either way. */}\n <div className=\"mt-1 max-w-[25rem] border border-surface-border rounded-md overflow-hidden bg-white\">\n <canvas\n ref={canvasRef}\n width={400}\n height={150}\n className=\"w-full cursor-crosshair touch-none\"\n onMouseDown={startDraw}\n onMouseMove={draw}\n onMouseUp={endDraw}\n onMouseLeave={endDraw}\n onTouchStart={startDraw}\n onTouchMove={draw}\n onTouchEnd={endDraw}\n />\n </div>\n <button\n type=\"button\"\n onClick={clear}\n className=\"mt-1 text-2xs text-text-tertiary hover:text-accent transition-colors\"\n >\n Clear\n </button>\n </div>\n );\n}\n","import { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel } from '../resolver-form/FieldChrome';\n\ninterface RichTextWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n isRequired?: boolean;\n}\n\n/**\n * Rich text input — a tall textarea with formatting hints.\n * A full WYSIWYG editor can replace this in a future iteration.\n */\nexport function RichTextWidget({ fieldKey, value, onChange, schema, isRequired }: RichTextWidgetProps) {\n const label = deriveFieldLabel(fieldKey, schema);\n const helperText = schema?.description as string | undefined;\n\n return (\n <div>\n <FieldLabel isRequired={isRequired}>\n {label}\n </FieldLabel>\n {helperText && <p className=\"text-2xs text-text-tertiary mt-0.5\">{helperText}</p>}\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"input w-full mt-1 text-sm leading-relaxed\"\n rows={8}\n placeholder=\"Supports plain text. Markdown formatting is preserved.\"\n />\n </div>\n );\n}\n","import { useState } from 'react';\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel } from '../resolver-form/FieldChrome';\nimport { MarkdownRenderer } from '../../common/display/MarkdownRenderer';\n\ninterface MarkdownWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n isRequired?: boolean;\n}\n\n/**\n * Markdown field — the same renderer the docs drawer uses, so a versioned\n * form schema can carry page source. Two shapes:\n *\n * - `readOnly: true` → a content block. The field's markdown (typically the\n * schema `default`) renders as HTML with no input chrome — instructions,\n * SOPs, and context live in the form as authored, versioned pages.\n * - editable → a Write/Preview source editor. The submitted value is the\n * markdown source.\n */\nexport function MarkdownWidget({ fieldKey, value, onChange, schema, isRequired }: MarkdownWidgetProps) {\n const [tab, setTab] = useState<'write' | 'preview'>('write');\n const label = deriveFieldLabel(fieldKey, schema);\n const helperText = schema?.description as string | undefined;\n const isReadOnly = schema?.readOnly === true;\n\n if (isReadOnly) {\n // Pure content block — the markdown carries its own headings and structure.\n return <MarkdownRenderer content={value} className=\"my-1\" />;\n }\n\n return (\n <div>\n <div className=\"flex items-center justify-between\">\n <FieldLabel isRequired={isRequired}>\n {label}\n </FieldLabel>\n <div className=\"flex items-center gap-0.5\">\n {(['write', 'preview'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => setTab(t)}\n className={`px-2 py-0.5 text-2xs rounded transition-colors ${\n tab === t\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {t === 'write' ? 'Write' : 'Preview'}\n </button>\n ))}\n </div>\n </div>\n {helperText && <p className=\"text-2xs text-text-tertiary mt-0.5\">{helperText}</p>}\n {tab === 'write' ? (\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"input w-full mt-1 text-sm font-mono leading-relaxed\"\n rows={10}\n placeholder=\"Write markdown — headings, lists, tables, code blocks, and links all render.\"\n />\n ) : (\n <div className=\"mt-1 px-3 py-2 border border-surface-border rounded min-h-[120px]\">\n {value.trim() ? (\n <MarkdownRenderer content={value} />\n ) : (\n <p className=\"text-xs text-text-quaternary italic\">Nothing to preview.</p>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { Check } from 'lucide-react';\n\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { resolveChecklistItems, resolveChecklistDefault } from '../../../lib/field-validator';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\nimport { FieldLabel, FieldHelper } from '../resolver-form/FieldChrome';\nimport type { WidgetProps } from './index';\n\ninterface ChecklistItem { id: string; label: string; required?: boolean }\n\n/** Labels at or under this length read as tags; longer ones read as sentences. */\nconst CHIP_LABEL_MAX = 28;\n\n/**\n * Checklist widget — a dynamic list of labeled checkboxes driven by runtime\n * data in the escalation context.\n *\n * Schema usage:\n * \"x-lt-widget\": \"checklist\"\n * \"x-lt-source\": \"envelope.checklist_items\" (any domain.path, or an\n * ordered array of paths — first source that resolves wins)\n * \"x-lt-variant\": \"chips\" | \"rows\" (optional; see geometry below)\n *\n * Item definitions: Array<{ id: string; label: string; required?: boolean }>\n *\n * GEOMETRY — item length and selection mode decide it:\n * - rows — one item per line. The shape for rituals: sentence-length\n * confirmations read top-down and are ticked deliberately.\n * `x-lt-require-all` always renders rows.\n * - chips — a wrapping cloud of selectable pills. The shape for tags:\n * short pick-any items (reject reasons, categories) flow horizontally,\n * thumb-sized, selection visible at a glance.\n * Explicit `x-lt-variant` wins; otherwise require-all → rows, else chips\n * when every label is ≤28 characters.\n *\n * \"x-lt-require-all\": true — completion guard: every item must be checked\n * before submission, except items whose definition carries required: false.\n *\n * \"x-lt-default-checked\": true — first-load default: an unanswered field\n * initializes to every item checked (affirm-then-exception: the submitter\n * unchecks what failed). A saved answer map is never clobbered.\n *\n * Value stored: Record<string, boolean> keyed by item id.\n */\nexport function ChecklistWidget({\n fieldKey,\n value,\n onChange,\n schema,\n escalationContext,\n isRequired,\n submitAttempted,\n error,\n}: WidgetProps & { escalationContext?: ShowIfContext }) {\n const requireAll = schema?.['x-lt-require-all'] === true;\n // The shared resolver serves render and enforcement alike — including\n // {{domain.path}} interpolation in the source path.\n const items: ChecklistItem[] = resolveChecklistItems(\n schema?.['x-lt-source'],\n escalationContext as Record<string, unknown> | undefined,\n );\n\n let state: Record<string, boolean> = {};\n try { if (value) state = JSON.parse(value) as Record<string, boolean>; } catch { /* start empty */ }\n\n // First-load default (x-lt-default-checked): the moment the source resolves\n // (a lookup arrives async), an unanswered field initializes to every item\n // checked. Keyed on the serialized default so it fires once per material\n // change and never against a saved answer map.\n const defaultJson = (() => {\n const d = resolveChecklistDefault(schema, state, escalationContext as Record<string, unknown> | undefined);\n return d ? JSON.stringify(d) : null;\n })();\n useEffect(() => {\n if (defaultJson) onChange(defaultJson);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [defaultJson]);\n\n const toggle = (id: string) => onChange(JSON.stringify({ ...state, [id]: !state[id] }));\n\n const title = deriveFieldLabel(fieldKey, schema);\n const helperText = schema?.description as string | undefined;\n\n if (items.length === 0) {\n return (\n <>\n <p className=\"text-xs text-text-tertiary italic mt-1\">\n No checklist items. None of the field's x-lt-source paths resolved on this escalation.\n </p>\n {error && (\n <p className=\"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]\">\n {error}\n </p>\n )}\n </>\n );\n }\n\n const explicitVariant = schema?.['x-lt-variant'] as string | undefined;\n const variant = explicitVariant === 'chips' || explicitVariant === 'rows'\n ? explicitVariant\n : requireAll || items.some((i) => i.label.length > CHIP_LABEL_MAX)\n ? 'rows'\n : 'chips';\n\n const checkedCount = items.filter((item) => state[item.id]).length;\n // The click-to-focus anchor: the first unchecked mandatory item, so the\n // error panel lands the user on the next box to tick (first item when done).\n const focusId = (items.find((i) => !state[i.id] && i.required !== false) ?? items[0]).id;\n\n return (\n <div role=\"group\" aria-label={title} aria-required={isRequired || undefined} aria-invalid={error ? true : undefined}>\n <FieldLabel isRequired={isRequired}>{title}</FieldLabel>\n {helperText && <FieldHelper>{helperText}</FieldHelper>}\n {variant === 'chips' ? (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {items.map((item) => {\n const checked = state[item.id] ?? false;\n const showItemError = !checked && !!submitAttempted && checkedCount === 0 && (item.required || isRequired);\n return (\n // The pill IS the checkbox: the real input stays in the label\n // (sr-only) so native semantics and the focus anchor survive.\n // Selection is an act — it earns the solid accent.\n <label\n key={item.id}\n className={`inline-flex items-center gap-1.5 cursor-pointer select-none px-3.5 py-2 text-sm border transition-colors rounded-[var(--lt-radius-field)] ${\n checked\n ? 'bg-accent border-accent text-text-inverse'\n : showItemError\n ? 'bg-surface-field border-status-error/60 text-status-error'\n : 'bg-surface-field border-surface-field-border text-text-secondary hover:border-accent hover:text-text-primary'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => toggle(item.id)}\n className=\"sr-only\"\n data-testid={`checklist-item-${item.id}`}\n {...(item.id === focusId ? { 'data-field-key': fieldKey } : {})}\n />\n {checked && <Check className=\"w-3.5 h-3.5 shrink-0\" strokeWidth={2.5} />}\n {item.label}\n </label>\n );\n })}\n </div>\n ) : (\n <div className=\"space-y-2.5 mt-2\">\n {items.map((item) => {\n const checked = state[item.id] ?? false;\n // require-all: every unchecked mandatory item (required !== false) is an\n // error after a submit attempt, clearing live as each is checked.\n // At-least-one mode: highlight only while ZERO are checked — once any\n // item is confirmed the group requirement is met and highlights clear.\n const showItemError = !checked && !!submitAttempted && (\n requireAll\n ? item.required !== false\n : checkedCount === 0 && (item.required || isRequired)\n );\n return (\n <label\n key={item.id}\n className={`flex items-start gap-3 cursor-pointer group select-none rounded px-2 py-1 -mx-2 transition-colors ${\n showItemError ? 'bg-status-error/5' : 'hover:bg-surface-hover'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => toggle(item.id)}\n className={`mt-0.5 w-3.5 h-3.5 shrink-0 rounded ${showItemError ? 'accent-status-error' : 'accent-accent'}`}\n data-testid={`checklist-item-${item.id}`}\n {...(item.id === focusId ? { 'data-field-key': fieldKey } : {})}\n />\n <span className={`text-sm leading-snug transition-colors ${\n showItemError\n ? 'text-status-error'\n : 'text-text-secondary group-hover:text-text-primary'\n }`}>\n {item.label}\n {item.required && (\n <span className={`ml-0.5 text-2xs ${showItemError ? 'text-status-error' : 'text-text-quaternary'}`}>*</span>\n )}\n </span>\n </label>\n );\n })}\n </div>\n )}\n <p className=\"text-2xs text-text-quaternary mt-3 tabular-nums\">\n {variant === 'chips' ? (\n <>\n {checkedCount} selected\n {isRequired && checkedCount === 0 && !!submitAttempted && (\n <span className=\"ml-1 text-text-quaternary/60\">(check at least one)</span>\n )}\n </>\n ) : (\n <>\n {checkedCount} / {items.length} confirmed\n {requireAll ? (\n <span className=\"ml-1 text-text-quaternary/60\">\n (all required{items.some((i) => i.required === false) ? ' except optional' : ''})\n </span>\n ) : isRequired && checkedCount === 0 && !!submitAttempted && (\n <span className=\"ml-1 text-text-quaternary/60\">(at least one required)</span>\n )}\n </>\n )}\n </p>\n {error && (\n <p role=\"alert\" className=\"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { Paperclip, Download, ExternalLink } from 'lucide-react';\nimport type { WidgetProps } from './index';\n\n/**\n * Attachment widget — readOnly display of a binary value captured earlier\n * (typically by the file-upload widget): a data URL or a fetchable URL.\n * Declared as `x-lt-widget: \"attachment\"` (`\"image\"` is an accepted alias).\n *\n * Type dispatch keeps rendering safe:\n * image/* — inline constrained preview, click for full size (the <img>\n * context is script-inert, so data URLs are safe here)\n * everything else — a labeled open/download affordance, NEVER embedded as a\n * document (inlining arbitrary data: content is an XSS vector)\n */\n\ntype Kind =\n | { kind: 'none' }\n | { kind: 'image'; src: string }\n | { kind: 'file'; href: string; label: string; isData: boolean };\n\nconst IMAGE_EXT = /\\.(png|jpe?g|gif|webp|avif|bmp|svg)(\\?.*)?$/i;\n\nfunction classify(value: string): Kind {\n const v = value.trim();\n if (!v) return { kind: 'none' };\n\n const dataMime = /^data:([^;,]+)[;,]/.exec(v)?.[1]?.toLowerCase();\n if (dataMime) {\n if (dataMime.startsWith('image/')) return { kind: 'image', src: v };\n const label = dataMime === 'application/pdf' ? 'PDF' : dataMime;\n return { kind: 'file', href: v, label, isData: true };\n }\n\n if (/^https?:\\/\\//i.test(v)) {\n if (IMAGE_EXT.test(v)) return { kind: 'image', src: v };\n const ext = /\\.([a-z0-9]{2,5})(\\?.*)?$/i.exec(v)?.[1]?.toUpperCase();\n return { kind: 'file', href: v, label: ext ?? 'attachment', isData: false };\n }\n\n return { kind: 'none' };\n}\n\nexport function AttachmentWidget({ fieldKey, value, schema }: WidgetProps) {\n const [expanded, setExpanded] = useState(false);\n const att = classify(value ?? '');\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n\n const head = (\n <>\n <label className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </label>\n {helperText && <p className=\"text-2xs text-text-tertiary mt-0.5\">{helperText}</p>}\n </>\n );\n\n if (att.kind === 'none') {\n return (\n <div>\n {head}\n <p className=\"text-xs text-text-quaternary italic mt-1\">No attachment</p>\n </div>\n );\n }\n\n if (att.kind === 'image') {\n return (\n <div>\n {head}\n <div className=\"mt-1\">\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n className=\"block rounded-[0.125em] border border-surface-border overflow-hidden hover:border-accent transition-colors\"\n title=\"View full size\"\n >\n <img\n src={att.src}\n alt={fieldKey.replace(/[_-]/g, ' ')}\n className=\"max-h-48 max-w-full object-contain\"\n data-testid={`attachment-image-${fieldKey}`}\n />\n </button>\n {expanded && (\n <div\n className=\"fixed inset-0 z-[100] bg-text-primary/60 backdrop-blur-sm flex items-center justify-center p-8 cursor-zoom-out\"\n onClick={() => setExpanded(false)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`${label} — full size`}\n >\n <img src={att.src} alt={label} className=\"max-h-[90vh] max-w-[90vw] object-contain\" />\n </div>\n )}\n </div>\n </div>\n );\n }\n\n // Non-image: safe open/download only — the content is never embedded.\n return (\n <div>\n {head}\n <div className=\"mt-1\">\n <a\n href={att.href}\n {...(att.isData\n ? { download: `${fieldKey}.${att.label === 'PDF' ? 'pdf' : 'bin'}` }\n : { target: '_blank', rel: 'noopener noreferrer' })}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:text-accent-hover transition-colors\"\n data-testid={`attachment-link-${fieldKey}`}\n >\n <Paperclip className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n {att.isData ? `Download ${att.label}` : `Open ${att.label}`}\n {att.isData\n ? <Download className=\"w-3 h-3\" strokeWidth={1.5} />\n : <ExternalLink className=\"w-3 h-3\" strokeWidth={1.5} />}\n </a>\n </div>\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport { ExternalLink } from 'lucide-react';\nimport { interpolateHelp } from '../../../lib/x-lt-help';\nimport { FieldLabel, FieldHelper } from '../resolver-form/FieldChrome';\nimport type { WidgetProps } from './index';\n\n/**\n * Link widget — a named navigation link whose URL is a `{{domain.path}}`\n * template resolved at render time from the escalation context.\n *\n * Schema usage:\n * \"x-lt-widget\": \"link\"\n * \"x-lt-href\": \"/escalations/available?role=foo&facets={\\\"orderId\\\":\\\"{{metadata.orderId}}\\\"}\"\n * \"title\": \"Human-readable label\"\n * \"description\": \"One-line instruction text\"\n *\n * URL behaviour:\n * Paths starting with \"/\" navigate inside the dashboard (React Router <Link>).\n * Anything else opens in a new tab with rel=\"noreferrer\".\n *\n * This widget is display-only — it produces no resolver payload value and must\n * never appear in the schema's `required` array.\n */\nexport function LinkWidget({ fieldKey, schema, escalationContext }: WidgetProps) {\n const hrefTemplate = (schema?.['x-lt-href'] as string | undefined) ?? '';\n const href = hrefTemplate && escalationContext\n ? interpolateHelp(hrefTemplate, escalationContext)\n : hrefTemplate;\n\n const label = (schema?.title as string | undefined) ?? (schema?.description as string | undefined) ?? 'Open';\n const helperText = schema?.description as string | undefined;\n const isInternal = href.startsWith('/');\n const isEmpty = !href.trim();\n\n return (\n <div data-field-key={fieldKey}>\n <FieldLabel>{label}</FieldLabel>\n {helperText && <FieldHelper>{helperText}</FieldHelper>}\n <div className=\"mt-1\">\n {isEmpty ? (\n <span className=\"text-xs text-text-quaternary italic\">No link configured</span>\n ) : isInternal ? (\n <Link\n to={href}\n className=\"inline-flex items-center gap-1 text-xs text-accent hover:text-accent-hover transition-colors\"\n data-testid={`link-widget-${fieldKey}`}\n >\n {label}\n <ExternalLink className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n </Link>\n ) : (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 text-xs text-accent hover:text-accent-hover transition-colors\"\n data-testid={`link-widget-${fieldKey}`}\n >\n {label}\n <ExternalLink className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n </a>\n )}\n </div>\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport { ArrowUpRight } from 'lucide-react';\n\n/**\n * The one affordance for opening an embedded row's detail page — a clear\n * icon-in-a-button, not a bare glyph, so the gesture reads as \"open this\". The\n * tooltip stays generic (\"View details\") rather than naming the record kind, so\n * the same control fits any embed. Non-focusable: the row/card click and the\n * canned actions carry the keyboard path; this is a pointer shortcut.\n */\nexport function OpenDetailButton({ to, className = '' }: { to: string; className?: string }) {\n return (\n <Link\n to={to}\n title=\"View details\"\n tabIndex={-1}\n className={`inline-flex items-center justify-center w-6 h-6 shrink-0 rounded border border-surface-border text-accent/70 hover:text-accent hover:border-accent/60 hover:bg-accent/5 transition-colors ${className}`}\n >\n <ArrowUpRight className=\"w-3.5 h-3.5\" strokeWidth={2} />\n <span className=\"sr-only\">View details</span>\n </Link>\n );\n}\n","import { OpenDetailButton } from './OpenDetailButton';\n\nimport { interpolateHelp } from '../../../lib/x-lt-help';\nimport { getDeep } from '../../../lib/x-lt-bind';\nimport { formatAgoCompact } from '../../../lib/format';\nimport { useEscalation } from '../../../api/escalations';\nimport { rowContext } from '../EscalationListView';\nimport { FieldLabel, FieldHelper } from '../resolver-form/FieldChrome';\nimport { StatusBadge } from '../../common/display/StatusBadge';\nimport type { WidgetProps } from './index';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\n\ninterface FieldDef { label: string; value: string; format?: string }\n\nconst EM_DASH = '—';\n\nfunction resolveSourceId(\n sourcePath: string | undefined,\n escalationContext: ShowIfContext | undefined,\n): string {\n if (!sourcePath || !escalationContext) return '';\n const dot = sourcePath.indexOf('.');\n if (dot === -1) return '';\n const domain = sourcePath.slice(0, dot) as keyof ShowIfContext;\n const path = sourcePath.slice(dot + 1);\n try {\n const v = getDeep(escalationContext[domain] as unknown, path);\n return typeof v === 'string' ? v : '';\n } catch {\n return '';\n }\n}\n\nfunction renderFieldValue(raw: string, format?: string): string {\n if (!raw || raw === EM_DASH) return EM_DASH;\n if (format === 'age') {\n const d = new Date(raw);\n return Number.isNaN(d.getTime()) ? raw : formatAgoCompact(raw);\n }\n return raw;\n}\n\n/**\n * Escalation widget — embeds a single escalation record inline in the form as\n * a compact card. The escalation ID is resolved from a `domain.path` declared\n * in `x-lt-source`; the card's detail rows are configured via `x-lt-fields`.\n *\n * Schema usage:\n * \"x-lt-widget\": \"escalation\"\n * \"x-lt-source\": \"metadata.parent_escalation_id\" (any domain.path → ID)\n * \"x-lt-fields\": [ (optional, any of escalation's data)\n * { \"label\": \"Order\", \"value\": \"{{metadata.orderId}}\" },\n * { \"label\": \"Decision\", \"value\": \"{{resolver.decision}}\" },\n * { \"label\": \"Age\", \"value\": \"{{escalation.created_at}}\", \"format\": \"age\" }\n * ]\n * \"title\": \"Card heading label\"\n * \"description\": \"One-line instruction text\"\n *\n * `x-lt-fields` token values resolve against the *embedded* escalation's own\n * context (its escalation row, metadata, envelope, payload, resolver) — not the\n * parent form's context. Same domain/path convention as x-lt-active.fields.\n *\n * Display-only — produces no resolver payload and must not appear in `required`.\n */\nexport function EscalationWidget({ fieldKey, schema, escalationContext }: WidgetProps) {\n const sourcePath = schema?.['x-lt-source'] as string | undefined;\n const fields = (schema?.['x-lt-fields'] as FieldDef[] | undefined) ?? [];\n const label = (schema?.title as string | undefined) ?? 'Linked escalation';\n const helperText = schema?.description as string | undefined;\n\n const id = resolveSourceId(sourcePath, escalationContext);\n const { data: esc, isLoading, isError } = useEscalation(id);\n\n return (\n <div data-field-key={fieldKey}>\n <FieldLabel>{label}</FieldLabel>\n {helperText && <FieldHelper>{helperText}</FieldHelper>}\n <div className=\"mt-1\">\n {!id || isError ? (\n <p className=\"text-xs text-text-quaternary italic\" data-testid={`escalation-widget-empty-${fieldKey}`}>\n No linked record\n </p>\n ) : isLoading ? (\n <EscalationCardSkeleton />\n ) : esc ? (\n <EscalationCard esc={esc} fields={fields} fieldKey={fieldKey} />\n ) : (\n <p className=\"text-xs text-text-quaternary italic\">No linked record</p>\n )}\n </div>\n </div>\n );\n}\n\nfunction EscalationCard({\n esc,\n fields,\n fieldKey,\n}: {\n esc: ReturnType<typeof useEscalation>['data'];\n fields: FieldDef[];\n fieldKey: string;\n}) {\n if (!esc) return null;\n const ctx = rowContext(esc);\n\n return (\n <div\n className=\"border-l-2 border-accent-faint pl-3 py-2 space-y-2\"\n data-testid={`escalation-widget-card-${fieldKey}`}\n >\n {/* Header: type + status */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-2xs font-semibold uppercase tracking-wider text-text-secondary\">\n {esc.type}{esc.subtype && esc.subtype !== esc.type ? ` · ${esc.subtype}` : ''}\n </span>\n <StatusBadge status={esc.status} />\n </div>\n\n {/* Description */}\n {esc.description && (\n <p className=\"text-xs text-text-primary leading-snug\">{esc.description}</p>\n )}\n\n {/* x-lt-fields facts — same dictionary visual as DictionaryList */}\n {fields.length > 0 && (\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-0.5\">\n {fields.map((f) => {\n const raw = interpolateHelp(f.value, ctx);\n const display = renderFieldValue(raw, f.format);\n return (\n <div key={f.label} className=\"contents\">\n <dt className=\"text-2xs text-text-tertiary whitespace-nowrap\">{f.label}</dt>\n <dd className=\"text-2xs text-text-primary\">{display}</dd>\n </div>\n );\n })}\n </dl>\n )}\n\n {/* Footer: role, age, detail link */}\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-2xs text-text-quaternary\">\n {esc.role} · {formatAgoCompact(esc.created_at)}\n </span>\n <OpenDetailButton to={`/escalations/detail/${esc.id}`} />\n </div>\n </div>\n );\n}\n\nfunction EscalationCardSkeleton() {\n return (\n <div className=\"border-l-2 border-accent-faint pl-3 py-2 space-y-2 animate-pulse\">\n <div className=\"h-3 w-32 bg-surface-sunken rounded\" />\n <div className=\"h-3 w-48 bg-surface-sunken rounded\" />\n <div className=\"h-3 w-24 bg-surface-sunken rounded\" />\n </div>\n );\n}\n","import { interpolateHelp } from './x-lt-help';\nimport type { ShowIfContext } from './x-lt-show-if';\n\n/**\n * The embedded escalation query shape shared by `x-lt-query` (escalation-list\n * widget) and `x-lt-submit-guard.query` (form-level submit gate). String\n * values inside `facets` support `{{domain.path}}` token interpolation against\n * the host escalation's context. Isomorphic: the dashboard renders embeds from\n * it, and the API layer enforces the submit gate from the identical mapping.\n *\n * `assigned` is the ownership scope. Ownership is not a separate list — it is\n * one more dimension of the same faceted query language the escalation API\n * composes server-side (\"claimed\" is the implied status: pending, held, claim\n * window live):\n * - `\"me\"` — rows claimed by the viewing user (the walk case: I walk what I own)\n * - `\"any\"` — all matching rows regardless of claim state\n * - omitted — available rows only (unclaimed, or claim window lapsed)\n */\nexport interface EmbedQuery {\n role?: string;\n status?: string;\n facets?: Record<string, string>;\n limit?: number;\n assigned?: 'me' | 'any';\n /** Superseded by `assigned`; honored only when `assigned` is omitted. */\n available?: boolean;\n}\n\n/** Interpolate `{{domain.path}}` tokens in every string value of the facets map. */\nexport function resolveQueryFacets(\n facets: Record<string, string> | undefined,\n ctx: ShowIfContext,\n): Record<string, unknown> {\n if (!facets) return {};\n const resolved: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(facets)) {\n resolved[k] = typeof v === 'string' ? interpolateHelp(v, ctx) : v;\n }\n return resolved;\n}\n\n/** The escalation-query params an EmbedQuery resolves to — the exact input\n * shape of `useEscalations`, so every embed surface queries identically. */\nexport interface ScopedQueryParams {\n role?: string;\n status: string;\n facets: Record<string, unknown>;\n assigned_to?: string;\n available?: boolean;\n limit?: number;\n enabled: boolean;\n}\n\n/**\n * Resolve an EmbedQuery into concrete escalation-query params — the ONE\n * mapping every embed surface (escalation-list, x-lt-actions, x-lt-submit-guard)\n * consumes, so the visible rows and any count derived from the same query can\n * never disagree.\n *\n * Ownership scope translates into the faceted query language:\n * - `assigned: \"me\"` → `assigned_to = viewer AND available = false` — the\n * implied \"claimed\" status (pending + live claim window held by the viewer)\n * - `assigned: \"any\"` → no ownership constraint\n * - omitted → `available = true` (the unclaimed pool; a declared\n * legacy `available` value is honored)\n *\n * When `assigned: \"me\"` and no viewer id is supplied (a surface with no\n * resolving user, e.g. an MCP resolve), the scope cannot be evaluated —\n * `enabled` is false rather than silently widening to another scope.\n */\nexport function resolveScopedQuery(\n query: EmbedQuery,\n ctx: ShowIfContext,\n viewerId: string | undefined,\n): ScopedQueryParams {\n const facets = resolveQueryFacets(query.facets, ctx);\n const base: ScopedQueryParams = {\n role: query.role,\n status: query.status ?? 'pending',\n facets,\n limit: query.limit,\n enabled: !!(query.role || Object.keys(facets).length),\n };\n if (query.assigned === 'me') {\n return { ...base, assigned_to: viewerId, available: false, enabled: base.enabled && !!viewerId };\n }\n if (query.assigned === 'any') {\n return base;\n }\n return { ...base, available: query.available ?? true };\n}\n","import { useState } from 'react';\nimport { OpenDetailButton } from './OpenDetailButton';\nimport { interpolateHelp } from '../../../lib/x-lt-help';\nimport { formatAgoCompact } from '../../../lib/format';\nimport { rowContext } from '../EscalationListView';\nimport { useEscalations, useResolveEscalation } from '../../../api/escalations';\nimport { useAuth } from '../../../hooks/useAuth';\nimport { FieldLabel, FieldHelper } from '../resolver-form/FieldChrome';\nimport { resolveScopedQuery, type EmbedQuery } from '../../../lib/x-lt-query';\nimport { schemaNeedsEnvelope } from '../../../lib/schema-needs-envelope';\nimport type { WidgetProps } from './index';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\nimport type { LTEscalationRecord } from '../../../api/types';\n\ninterface ColumnDef { label: string; value: string; format?: string }\n\n/**\n * An inline row action: fires a canned resolve against the row through the\n * standard resolve endpoint — RBAC and enforce_schema validation apply\n * server-side exactly as a full-form resolve. String leaves inside\n * `resolverPayload` (and `confirm`) interpolate `{{domain.path}}` tokens\n * against the row's own context; booleans and numbers pass through typed.\n */\ninterface ActionDef {\n label: string;\n resolverPayload: Record<string, unknown>;\n /** Optional confirm prompt shown before firing; tokens interpolate per row. */\n confirm?: string;\n}\n\nconst DEFAULT_COLUMNS: ColumnDef[] = [\n { label: 'Description', value: '{{escalation.description}}' },\n { label: 'Role', value: '{{escalation.role}}' },\n { label: 'Age', value: '{{escalation.created_at}}', format: 'age' },\n];\n\nconst EM_DASH = '—';\n\nfunction renderValue(raw: string, format?: string): string {\n if (!raw || raw === EM_DASH) return EM_DASH;\n if (format === 'age') {\n const d = new Date(raw);\n return Number.isNaN(d.getTime()) ? raw : formatAgoCompact(raw);\n }\n return raw;\n}\n\n/** Deep-walk a payload template: string leaves interpolate `{{domain.path}}`\n * tokens against the row context; every other type passes through typed. */\nfunction interpolatePayload(value: unknown, ctx: ShowIfContext): unknown {\n if (typeof value === 'string') return interpolateHelp(value, ctx);\n if (Array.isArray(value)) return value.map((v) => interpolatePayload(v, ctx));\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([k, v]) => [k, interpolatePayload(v, ctx)]),\n );\n }\n return value;\n}\n\n/**\n * Escalation list widget — embeds a compact list of escalations inline in the\n * form, driven by a facet query declared in `x-lt-query`. String values inside\n * `x-lt-query.facets` support `{{domain.path}}` token interpolation.\n *\n * Schema usage:\n * \"x-lt-widget\": \"escalation-list\"\n * \"x-lt-query\": {\n * \"role\": \"rel-originator\",\n * \"facets\": { \"customerId\": \"{{metadata.customerId}}\" },\n * \"status\": \"pending\",\n * \"limit\": 5\n * }\n * \"x-lt-columns\": [ (optional)\n * { \"label\": \"Order\", \"value\": \"{{metadata.orderId}}\" },\n * { \"label\": \"Age\", \"value\": \"{{escalation.created_at}}\", \"format\": \"age\" }\n * ]\n * \"title\": \"List heading\"\n * \"description\": \"One-line instruction text\"\n * \"x-lt-actions\": [ (optional)\n * { \"label\": \"Bagged ✓\",\n * \"resolverPayload\": { \"approved\": true, \"checks\": { \"bagged\": true } },\n * \"confirm\": \"Bag {{metadata.orderId}}?\" }\n * ]\n *\n * Column `value` strings use the same `{{domain.path}}` token convention as\n * `x-lt-active.fields` and `x-lt-columns` in list schemas — tokens resolve\n * against each displayed escalation's own row context.\n *\n * When `x-lt-columns` is absent, falls back to three default columns:\n * description, role, age.\n *\n * Produces no resolver payload for the PARENT form and must not appear in\n * `required`. `x-lt-actions` buttons resolve the ROW through the standard\n * resolve endpoint — server-side RBAC and enforce_schema apply; a rejected\n * canned resolve surfaces its message inline and the row's detail link\n * remains the full-form path.\n */\nexport function EscalationListWidget({ fieldKey, schema, escalationContext }: WidgetProps) {\n const rawQuery = (schema?.['x-lt-query'] as EmbedQuery | undefined) ?? {};\n const columns = (schema?.['x-lt-columns'] as ColumnDef[] | undefined) ?? DEFAULT_COLUMNS;\n const actions = (schema?.['x-lt-actions'] as ActionDef[] | undefined) ?? [];\n const label = (schema?.title as string | undefined) ?? 'Related items';\n const helperText = schema?.description as string | undefined;\n\n const ctx = escalationContext ?? {};\n const { user } = useAuth();\n\n // ONE shared mapping (resolveScopedQuery) turns x-lt-query into concrete\n // escalation params — the same call x-lt-submit-guard makes, so the visible\n // rows and the guard's count evaluate the identical scope.\n const scoped = resolveScopedQuery(rawQuery, ctx, user?.userId);\n\n const { data, isLoading } = useEscalations({\n role: scoped.role,\n status: scoped.status,\n facets: scoped.facets,\n assigned_to: scoped.assigned_to,\n available: scoped.available,\n limit: scoped.limit ?? 5,\n enabled: scoped.enabled,\n include: schemaNeedsEnvelope({ columns, actions }) ? 'envelope' : undefined,\n });\n\n const escalations = data?.escalations ?? [];\n\n const resolve = useResolveEscalation();\n const [rowErrors, setRowErrors] = useState<Record<string, string>>({});\n const [pendingRow, setPendingRow] = useState<string | null>(null);\n\n const fireAction = async (esc: LTEscalationRecord, action: ActionDef) => {\n const rowCtx = rowContext(esc);\n if (action.confirm && !window.confirm(interpolateHelp(action.confirm, rowCtx))) return;\n setPendingRow(esc.id);\n setRowErrors((prev) => ({ ...prev, [esc.id]: '' }));\n try {\n await resolve.mutateAsync({\n id: esc.id,\n resolverPayload: interpolatePayload(action.resolverPayload, rowCtx) as Record<string, unknown>,\n });\n } catch (err) {\n setRowErrors((prev) => ({ ...prev, [esc.id]: (err as Error).message }));\n } finally {\n setPendingRow(null);\n }\n };\n\n return (\n <div data-field-key={fieldKey}>\n <FieldLabel>{label}</FieldLabel>\n {helperText && <FieldHelper>{helperText}</FieldHelper>}\n <div className=\"mt-1\" data-testid={`escalation-list-widget-${fieldKey}`}>\n {isLoading ? (\n <ListSkeleton columns={columns.length} />\n ) : (\n <EmbedTable\n escalations={escalations}\n columns={columns}\n fieldKey={fieldKey}\n actions={actions}\n onAction={fireAction}\n pendingRow={pendingRow}\n rowErrors={rowErrors}\n />\n )}\n </div>\n </div>\n );\n}\n\nfunction EmbedTable({\n escalations,\n columns,\n fieldKey,\n actions,\n onAction,\n pendingRow,\n rowErrors,\n}: {\n escalations: LTEscalationRecord[];\n columns: ColumnDef[];\n fieldKey: string;\n actions: ActionDef[];\n onAction: (esc: LTEscalationRecord, action: ActionDef) => void;\n pendingRow: string | null;\n rowErrors: Record<string, string>;\n}) {\n if (escalations.length === 0) {\n return (\n <p className=\"text-xs text-text-quaternary italic py-1\" data-testid={`escalation-list-empty-${fieldKey}`}>\n No items found\n </p>\n );\n }\n\n return (\n <table className=\"w-full text-xs border-collapse\" data-testid={`escalation-list-table-${fieldKey}`}>\n <thead>\n <tr className=\"border-b border-surface-border\">\n {columns.map((col) => (\n <th\n key={col.label}\n className=\"text-left text-2xs font-semibold uppercase tracking-wider text-text-tertiary pb-1 pr-3 last:pr-0\"\n >\n {col.label}\n </th>\n ))}\n {actions.length > 0 && <th className=\"w-px\" />}\n <th className=\"w-8\" />\n </tr>\n </thead>\n <tbody>\n {escalations.map((esc) => {\n const ctx = rowContext(esc);\n const error = rowErrors[esc.id];\n return (\n <tr\n key={esc.id}\n className=\"border-b border-surface-border/50 last:border-0 hover:bg-surface-sunken/50 transition-colors\"\n >\n {columns.map((col) => {\n const raw = interpolateHelp(col.value, ctx);\n const display = renderValue(raw, col.format);\n return (\n <td key={col.label} className=\"py-1 pr-3 last:pr-0 text-text-primary align-top\">\n {display}\n </td>\n );\n })}\n {actions.length > 0 && (\n <td className=\"py-1 pr-2 align-top whitespace-nowrap\">\n {actions.map((action) => (\n <button\n key={action.label}\n type=\"button\"\n onClick={() => onAction(esc, action)}\n disabled={pendingRow === esc.id}\n className=\"px-2 py-0.5 text-2xs font-medium text-accent border border-accent/40 rounded hover:bg-accent/10 disabled:opacity-40 disabled:cursor-default transition-colors ml-1 first:ml-0\"\n data-testid={`escalation-list-action-${esc.id}`}\n >\n {action.label}\n </button>\n ))}\n {error && (\n <p className=\"text-2xs text-status-error mt-0.5 whitespace-normal max-w-[16rem]\" data-testid={`escalation-list-action-error-${esc.id}`}>\n {error}\n </p>\n )}\n </td>\n )}\n <td className=\"py-1 pl-2 align-top\">\n <OpenDetailButton to={`/escalations/detail/${esc.id}`} />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction ListSkeleton({ columns }: { columns: number }) {\n return (\n <div className=\"space-y-1.5 animate-pulse\">\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"flex gap-4\">\n {Array.from({ length: columns }, (_, j) => (\n <div key={j} className=\"h-3 bg-surface-sunken rounded flex-1\" />\n ))}\n </div>\n ))}\n </div>\n );\n}\n","import type { ResolverValidationContext } from './validate-resolver-payload';\n\n/**\n * The context an invoke form validates and renders against. The pass itself\n * supplies the live values under `input` and `resolver`; `metadata` is the\n * envelope metadata and `lookup` holds resolved versioned knowledge editions\n * keyed by `as ?? key`. The lookup domain is present only when supplied.\n */\nexport function buildInvokeFormContext(\n metadata: Record<string, unknown> | null | undefined,\n lookup?: Record<string, unknown> | null,\n): ResolverValidationContext {\n return { metadata: metadata ?? {}, ...(lookup ? { lookup } : {}) };\n}\n","/**\n * x-lt-invoke: start a workflow from inside a form. A display-only field\n * declares the target workflow and how the form's context maps into the\n * invoke payload:\n *\n * \"x-lt-widget\": \"invoke\",\n * \"x-lt-invoke\": {\n * \"workflow\": \"printPamphlet\",\n * \"data\": { \"order\": { \"id\": \"{{metadata.orderId}}\" }, \"copies\": 1 },\n * \"metadata\": { \"escalationId\": \"{{escalation.id}}\" },\n * \"modal\": true,\n * \"confirm\": \"Print a pamphlet for {{metadata.orderId}}?\",\n * \"variant\": \"link\",\n * \"icon\": true\n * }\n *\n * `data` is the nested payload the invoke API receives. In direct mode it is\n * posted as resolved; in modal mode it prefills the workflow's own input form\n * through the x-lt-bind inversion. One declaration serves both.\n *\n * Interpolation keeps types: a leaf that is exactly one `{{domain.path}}`\n * token becomes the raw context value (a number stays a number); a leaf that\n * mixes text and tokens becomes a string; a token with no value drops its key\n * so the target's own defaults apply. Objects and arrays recurse; every other\n * leaf passes through unchanged.\n */\nimport { DISPLAY_ONLY_WIDGET_NAMES } from './display-only-widgets';\nimport { hasInterpolation, interpolatePath, resolveCtxPath } from './ctx-path';\n\nexport const X_LT_INVOKE = 'x-lt-invoke';\nexport const INVOKE_WIDGET = DISPLAY_ONLY_WIDGET_NAMES.INVOKE;\n\nexport const INVOKE_VARIANTS = {\n LINK: 'link',\n BUTTON: 'button',\n} as const;\nexport type InvokeVariant = (typeof INVOKE_VARIANTS)[keyof typeof INVOKE_VARIANTS];\n\nexport interface InvokeConfig {\n /** The workflow_type to start. */\n workflow: string;\n /** Nested invoke `data` template; leaves interpolate against the context. */\n data: Record<string, unknown>;\n /** Extra run metadata template, merged over the workflow's declared metadata. */\n metadata: Record<string, unknown>;\n /** Open the workflow's input form prefilled instead of posting directly. */\n modal: boolean;\n /** Direct mode only: a prompt to confirm before posting; tokens interpolate. */\n confirm: string | null;\n variant: InvokeVariant;\n /** Lead the label with the workflow's registered icon. */\n icon: boolean;\n}\n\nexport interface InvokePayload {\n data: Record<string, unknown>;\n metadata: Record<string, unknown>;\n}\n\ntype Ctx = Record<string, unknown> | null | undefined;\n\nconst WHOLE_TOKEN_PATTERN = /^\\{\\{\\s*([^{}]+?)\\s*\\}\\}$/;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isVariant(value: unknown): value is InvokeVariant {\n return value === INVOKE_VARIANTS.LINK || value === INVOKE_VARIANTS.BUTTON;\n}\n\n/** The field's invoke declaration, or null when it names no workflow. */\nexport function readInvokeConfig(\n fieldSchema: Record<string, unknown> | null | undefined,\n): InvokeConfig | null {\n const raw = fieldSchema?.[X_LT_INVOKE];\n if (!isPlainObject(raw)) return null;\n const workflow = raw.workflow;\n if (typeof workflow !== 'string' || workflow.trim().length === 0) return null;\n const confirm = raw.confirm;\n return {\n workflow: workflow.trim(),\n data: isPlainObject(raw.data) ? raw.data : {},\n metadata: isPlainObject(raw.metadata) ? raw.metadata : {},\n modal: raw.modal === true,\n confirm: typeof confirm === 'string' && confirm.trim().length > 0 ? confirm : null,\n variant: isVariant(raw.variant) ? raw.variant : INVOKE_VARIANTS.LINK,\n icon: raw.icon !== false,\n };\n}\n\n/**\n * Resolve one template value against the context, keeping the type of a\n * whole-token leaf. Returns undefined for a token with no value so the\n * caller omits the key.\n */\nexport function interpolateInvokeValue(value: unknown, ctx: Ctx): unknown {\n if (typeof value === 'string') {\n const whole = WHOLE_TOKEN_PATTERN.exec(value);\n if (whole) {\n const resolved = resolveCtxPath(whole[1], ctx ?? undefined);\n return resolved === null ? undefined : resolved;\n }\n if (hasInterpolation(value)) return interpolatePath(value, ctx ?? undefined) ?? undefined;\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v) => interpolateInvokeValue(v, ctx)).filter((v) => v !== undefined);\n }\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n for (const [key, v] of Object.entries(value)) {\n const resolved = interpolateInvokeValue(v, ctx);\n if (resolved !== undefined) out[key] = resolved;\n }\n return out;\n }\n return value;\n}\n\n/** The invoke payload for one context: `data` and `metadata` fully resolved. */\nexport function resolveInvokePayload(config: InvokeConfig, ctx: Ctx): InvokePayload {\n return {\n data: interpolateInvokeValue(config.data, ctx) as Record<string, unknown>,\n metadata: interpolateInvokeValue(config.metadata, ctx) as Record<string, unknown>,\n };\n}\n","/**\n * The curated icon set a workflow may declare. Names are lucide icon names;\n * the dashboard maps each to its glyph and falls back to the tier glyph for\n * anything else. Declare in code as `icon: WORKFLOW_ICONS.PRINTER`.\n */\nexport const WORKFLOW_ICONS = {\n ACTIVITY: 'Activity',\n ALERT: 'AlertTriangle',\n ARCHIVE: 'Archive',\n AWARD: 'Award',\n BARCODE: 'Barcode',\n BELL: 'Bell',\n BOT: 'Bot',\n BOX: 'Box',\n BOXES: 'Boxes',\n BUILDING: 'Building2',\n CALENDAR: 'Calendar',\n CAMERA: 'Camera',\n CHECKLIST: 'ListChecks',\n CLIPBOARD: 'ClipboardList',\n CLIPBOARD_CHECK: 'ClipboardCheck',\n CLOCK: 'Clock',\n COG: 'Cog',\n CPU: 'Cpu',\n DATABASE: 'Database',\n DOWNLOAD: 'Download',\n DROPLETS: 'Droplets',\n FACTORY: 'Factory',\n FAN: 'Fan',\n FILE: 'FileText',\n FLAG: 'Flag',\n FLAME: 'Flame',\n GAUGE: 'Gauge',\n HAMMER: 'Hammer',\n HEART: 'Heart',\n IMAGE: 'Image',\n KEY: 'Key',\n LAYERS: 'Layers',\n LEAF: 'Leaf',\n LIFEBUOY: 'LifeBuoy',\n LOCK: 'Lock',\n MAIL: 'Mail',\n MAP: 'Map',\n MEGAPHONE: 'Megaphone',\n MESSAGE: 'MessageSquare',\n PACKAGE: 'Package',\n PALETTE: 'Palette',\n PEN: 'PenTool',\n PILL: 'Pill',\n POWER: 'Power',\n PRINTER: 'Printer',\n RECEIPT: 'Receipt',\n RECYCLE: 'Recycle',\n REFRESH: 'RefreshCw',\n ROCKET: 'Rocket',\n ROUTE: 'Route',\n RULER: 'Ruler',\n SCALE: 'Scale',\n SCAN: 'ScanBarcode',\n SCISSORS: 'Scissors',\n SEARCH: 'Search',\n SEND: 'Send',\n SERVER: 'Server',\n SHIELD: 'ShieldCheck',\n SHOPPING_CART: 'ShoppingCart',\n SNOWFLAKE: 'Snowflake',\n SPARKLES: 'Sparkles',\n STAR: 'Star',\n STORE: 'Store',\n SUN: 'Sun',\n TAG: 'Tag',\n TEST_TUBE: 'TestTube',\n THERMOMETER: 'Thermometer',\n TRASH: 'Trash2',\n TRUCK: 'Truck',\n UPLOAD: 'Upload',\n USER: 'User',\n USERS: 'Users',\n WAND: 'Wand2',\n WAREHOUSE: 'Warehouse',\n WIFI: 'Wifi',\n WRENCH: 'Wrench',\n ZAP: 'Zap',\n} as const;\n\nexport type WorkflowIconName = (typeof WORKFLOW_ICONS)[keyof typeof WORKFLOW_ICONS];\n\nconst NAMES = new Set<string>(Object.values(WORKFLOW_ICONS));\n\nexport function isWorkflowIcon(value: unknown): value is WorkflowIconName {\n return typeof value === 'string' && NAMES.has(value);\n}\n","import {\n Activity,\n AlertTriangle,\n Archive,\n Award,\n Barcode,\n Bell,\n Bot,\n Box,\n Boxes,\n Building2,\n Calendar,\n Camera,\n ClipboardCheck,\n ClipboardList,\n Clock,\n Cog,\n Cpu,\n Database,\n Download,\n Droplets,\n Factory,\n Fan,\n FileText,\n Flag,\n Flame,\n Gauge,\n Hammer,\n Heart,\n Image,\n Key,\n Layers,\n Leaf,\n LifeBuoy,\n ListChecks,\n Lock,\n Mail,\n Map,\n Megaphone,\n MessageSquare,\n Package,\n Palette,\n PenTool,\n Pill,\n Power,\n Printer,\n Receipt,\n Recycle,\n RefreshCw,\n Rocket,\n Route,\n Ruler,\n Scale,\n ScanBarcode,\n Scissors,\n Search,\n Send,\n Server,\n ShieldCheck,\n ShoppingCart,\n Snowflake,\n Sparkles,\n Star,\n Store,\n Sun,\n Tag,\n TestTube,\n Thermometer,\n Trash2,\n Truck,\n Upload,\n User,\n Users,\n Wand2,\n Warehouse,\n Wifi,\n Wrench,\n Zap,\n type LucideIcon,\n} from 'lucide-react';\nimport { WORKFLOW_ICONS, isWorkflowIcon, type WorkflowIconName } from '../../../types/workflow-icons';\n\nexport { WORKFLOW_ICONS, isWorkflowIcon };\nexport type { WorkflowIconName };\n\n// Static named imports keep the bundle to these glyphs alone; a namespace\n// lookup would ship the whole library.\nconst GLYPHS: Record<WorkflowIconName, LucideIcon> = {\n Activity,\n AlertTriangle,\n Archive,\n Award,\n Barcode,\n Bell,\n Bot,\n Box,\n Boxes,\n Building2,\n Calendar,\n Camera,\n ClipboardCheck,\n ClipboardList,\n Clock,\n Cog,\n Cpu,\n Database,\n Download,\n Droplets,\n Factory,\n Fan,\n FileText,\n Flag,\n Flame,\n Gauge,\n Hammer,\n Heart,\n Image,\n Key,\n Layers,\n Leaf,\n LifeBuoy,\n ListChecks,\n Lock,\n Mail,\n Map,\n Megaphone,\n MessageSquare,\n Package,\n Palette,\n PenTool,\n Pill,\n Power,\n Printer,\n Receipt,\n Recycle,\n RefreshCw,\n Rocket,\n Route,\n Ruler,\n Scale,\n ScanBarcode,\n Scissors,\n Search,\n Send,\n Server,\n ShieldCheck,\n ShoppingCart,\n Snowflake,\n Sparkles,\n Star,\n Store,\n Sun,\n Tag,\n TestTube,\n Thermometer,\n Trash2,\n Truck,\n Upload,\n User,\n Users,\n Wand2,\n Warehouse,\n Wifi,\n Wrench,\n Zap,\n};\n\n/** Every curated icon, in the order the picker shows them. */\nexport const WORKFLOW_ICON_NAMES: readonly WorkflowIconName[] = Object.values(WORKFLOW_ICONS);\n\n/** The constant key for a name (`Wrench` → `WRENCH`), for filtering by either. */\nexport const WORKFLOW_ICON_KEYS: Readonly<Record<WorkflowIconName, string>> = Object.fromEntries(\n Object.entries(WORKFLOW_ICONS).map(([key, name]) => [name, key]),\n) as Record<WorkflowIconName, string>;\n\n/** The glyph for a declared icon name; null for anything outside the curated set. */\nexport function workflowIconGlyph(name: string | null | undefined): LucideIcon | null {\n return isWorkflowIcon(name) ? GLYPHS[name] : null;\n}\n\n/** Names whose lucide name or constant key contains the query, case-insensitive. */\nexport function filterWorkflowIcons(query: string): WorkflowIconName[] {\n const q = query.trim().toLowerCase().replace(/[\\s_-]+/g, '');\n if (!q) return [...WORKFLOW_ICON_NAMES];\n return WORKFLOW_ICON_NAMES.filter((name) =>\n name.toLowerCase().includes(q) || WORKFLOW_ICON_KEYS[name].toLowerCase().replace(/_/g, '').includes(q));\n}\n","import { Workflow } from 'lucide-react';\nimport { VARIANT_ICON } from './WorkflowPill';\nimport { workflowIconGlyph } from '../../../lib/workflow-icons';\nimport type { WorkflowTier } from '../../../api/types';\n\n/**\n * A workflow's face: its declared icon when it has one, otherwise the glyph\n * of its tier. The same mark heads the form and leads each list row.\n */\nexport function WorkflowIcon({ icon, tier, className, strokeWidth = 1.5 }: {\n icon: string | null | undefined;\n tier: WorkflowTier;\n className?: string;\n strokeWidth?: number;\n}) {\n // Server-provided tier strings may outrun this bundle; degrade to the durable glyph.\n const Glyph = workflowIconGlyph(icon) ?? VARIANT_ICON[tier] ?? Workflow;\n return <Glyph className={className} strokeWidth={strokeWidth} aria-hidden />;\n}\n","import { useEffect, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { useEventSubscriptions } from '../../../hooks/useEventContext';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { TreeNode } from '../../../components/common/data/json-viewer-nodes';\nimport type { NatsLTEvent } from '../../../lib/nats/types';\n\nexport const RUN_OUTCOMES = {\n RUNNING: 'running',\n COMPLETED: 'completed',\n FAILED: 'failed',\n} as const;\nexport type RunOutcome = (typeof RUN_OUTCOMES)[keyof typeof RUN_OUTCOMES];\n\n/** The dashboard subject for one run's lifecycle events. */\nexport function workflowEventPattern(workflowId: string, action: 'completed' | 'failed'): string {\n return `lt.events.system.workflow.${workflowId}.${action}`;\n}\n\n/**\n * Follows one run: subscribes to its completed and failed subjects the moment\n * it starts and holds the outcome and the returned payload. With no id there\n * is nothing to follow, so nothing is subscribed; a subject with an empty\n * token is a protocol error on NATS.\n */\nexport function useRunOutcome(workflowId: string): { outcome: RunOutcome; payload: Record<string, unknown> | undefined } {\n const [outcome, setOutcome] = useState<RunOutcome>(RUN_OUTCOMES.RUNNING);\n const [payload, setPayload] = useState<Record<string, unknown> | undefined>(undefined);\n\n useEffect(() => {\n setOutcome(RUN_OUTCOMES.RUNNING);\n setPayload(undefined);\n }, [workflowId]);\n\n useEventSubscriptions(\n workflowId ? [workflowEventPattern(workflowId, 'completed'), workflowEventPattern(workflowId, 'failed')] : [],\n (event: NatsLTEvent) => {\n if (event.workflowId !== workflowId) return;\n setOutcome(event.type.endsWith('.failed') ? RUN_OUTCOMES.FAILED : RUN_OUTCOMES.COMPLETED);\n setPayload(event.data);\n },\n );\n\n return { outcome, payload };\n}\n\nconst OUTCOME_LABELS: Record<RunOutcome, string> = {\n [RUN_OUTCOMES.RUNNING]: 'Working…',\n [RUN_OUTCOMES.COMPLETED]: 'Completed',\n [RUN_OUTCOMES.FAILED]: 'Failed',\n};\n\n/** The outcome as one word in its tone, pulsing while the run is still working. Carries no run id. */\nexport function RunOutcomeLabel({ outcome, className = '' }: { outcome: RunOutcome; className?: string }) {\n const tone = outcome === RUN_OUTCOMES.FAILED ? 'text-status-error'\n : outcome === RUN_OUTCOMES.COMPLETED ? 'text-status-success' : 'text-text-secondary';\n return (\n <p className={`flex items-center gap-1.5 text-xs ${tone} ${className}`} role=\"status\" data-testid=\"run-outcome\">\n {OUTCOME_LABELS[outcome]}\n {outcome === RUN_OUTCOMES.RUNNING && <span className=\"w-1.5 h-1.5 rounded-full bg-accent animate-pulse\" aria-hidden />}\n </p>\n );\n}\n\n/** The returned payload as an outline: labeled values, nested groups, nothing to operate. */\nexport function RunOutline({ payload }: { payload: Record<string, unknown> | undefined }) {\n if (!payload || Object.keys(payload).length === 0) return null;\n return (\n <div className=\"max-h-72 overflow-y-auto px-3 py-2 bg-surface-sunken\" data-testid=\"run-outline\">\n <TreeNode data={payload} />\n </div>\n );\n}\n\n/** The one-line status: outcome, id, and the execution link for callers who may open it. */\nexport function RunStatusLine({ workflowId, outcome, executionPath }: { workflowId: string; outcome: RunOutcome; executionPath: string | null }) {\n const tone = outcome === RUN_OUTCOMES.FAILED ? 'text-status-error' : 'text-status-success';\n const label = outcome === RUN_OUTCOMES.RUNNING ? 'Started'\n : outcome === RUN_OUTCOMES.COMPLETED ? 'Completed' : 'Failed';\n return (\n <p className=\"flex items-center gap-1.5 text-xs min-w-0\" role=\"status\" data-testid=\"started-run\">\n <span className={tone}>{label}</span>\n {outcome === RUN_OUTCOMES.RUNNING && <span className=\"w-1.5 h-1.5 rounded-full bg-accent animate-pulse\" aria-hidden />}\n <span className=\"text-text-quaternary\">·</span>\n <span className=\"font-mono text-text-secondary truncate\">{workflowId}</span>\n {executionPath && (\n <>\n <span className=\"text-text-quaternary\">·</span>\n <Link to={executionPath} className=\"text-accent hover:underline shrink-0\">View workflow →</Link>\n </>\n )}\n </p>\n );\n}\n\n/** The returned payload, full width in a fixed-height zone that scrolls on its own. */\nexport function RunResult({ payload }: { payload: Record<string, unknown> | undefined }) {\n if (!payload || Object.keys(payload).length === 0) return null;\n return (\n <div\n className=\"mt-3 h-48 overflow-y-auto rounded-md border border-surface-border bg-surface-raised px-3 py-2\"\n data-testid=\"started-run-result\"\n >\n <JsonViewer data={payload} label=\"Result\" />\n </div>\n );\n}\n","import { useCallback, useState } from 'react';\nimport { useInvokeWorkflow } from '../../../api/workflows';\nimport { ApiError } from '../../../api/client';\nimport { isValidationErrorBody } from '../../../lib/validation';\nimport { useAccess } from '../../../hooks/useAccess';\nimport type { FieldError } from '../../../lib/field-validator';\nimport type { LTWorkflowConfig } from '../../../api/types';\n\nexport const EXECUTIONS_PATH = '/workflows/executions';\n\n/** Where an invoke form is hosted: the Invoke Tool page, or a dialog opened from another surface. */\nexport const INVOKE_HOSTS = {\n PAGE: 'page',\n MODAL: 'modal',\n} as const;\nexport type InvokeHost = (typeof INVOKE_HOSTS)[keyof typeof INVOKE_HOSTS];\n\n/** What a form needs from the submission: the call, its state, and the outcome. */\nexport interface InvokeSubmission {\n submit: (data: Record<string, unknown>, metadata: Record<string, unknown>) => Promise<void>;\n reset: () => void;\n pending: boolean;\n error: string | null;\n /** Field violations from a 422; the form surfaces them as issues. */\n violations: FieldError[];\n startedId: string | null;\n /** The started run's page, for callers who may open executions. */\n executionPath: string | null;\n}\n\n/**\n * One submit path for both invoke forms. Merges the per-run certified flag\n * and identity override, posts the same envelope the API has always taken,\n * and maps a 422 into field violations. Everyone stays on the page and sees\n * the started id; builders also get the link to its execution, a page only\n * they may open.\n */\nexport function useInvokeSubmit(\n selected: Pick<LTWorkflowConfig, 'workflow_type'>,\n run: { certified: boolean; overrideBot: string },\n): InvokeSubmission {\n const { realIsBuilder } = useAccess();\n const mutation = useInvokeWorkflow();\n const [error, setError] = useState<string | null>(null);\n const [violations, setViolations] = useState<FieldError[]>([]);\n const [startedId, setStartedId] = useState<string | null>(null);\n\n const reset = useCallback(() => {\n setError(null);\n setViolations([]);\n setStartedId(null);\n mutation.reset();\n }, [mutation]);\n\n const submit = useCallback(async (data: Record<string, unknown>, metadata: Record<string, unknown>) => {\n setError(null);\n setViolations([]);\n setStartedId(null);\n const resolvedMetadata: Record<string, unknown> = { ...metadata };\n if (run.certified) resolvedMetadata.certified = true;\n try {\n const result = await mutation.mutateAsync({\n workflowType: selected.workflow_type,\n data,\n metadata: resolvedMetadata,\n ...(run.overrideBot ? { execute_as: run.overrideBot } : {}),\n });\n setStartedId(result.workflowId);\n } catch (err) {\n if (err instanceof ApiError && isValidationErrorBody(err.body)) {\n setViolations(err.body.violations);\n setError(err.body.error);\n } else {\n setError(err instanceof Error ? err.message : 'Invocation failed');\n }\n }\n }, [mutation, run.certified, run.overrideBot, selected.workflow_type]);\n\n return {\n submit,\n reset,\n pending: mutation.isPending,\n error,\n violations,\n startedId,\n executionPath: startedId && realIsBuilder ? `${EXECUTIONS_PATH}/${encodeURIComponent(startedId)}` : null,\n };\n}\n","import { AlertCircle, RadioTower } from 'lucide-react';\nimport { useEventStatus } from '../../../hooks/useEventContext';\nimport { RunResult, RunStatusLine, RUN_OUTCOMES, useRunOutcome } from './StartedRunNotice';\nimport { INVOKE_HOSTS, type InvokeHost } from './use-invoke-submit';\n\n/** The live-events warning, shown while the result could not arrive. Renders nothing while connected. */\nexport function EventsOffNotice() {\n const { connected } = useEventStatus();\n if (connected) return null;\n return (\n <p className=\"flex items-center gap-1.5 text-2xs text-status-warning\" data-testid=\"events-warning\">\n <RadioTower className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n Live events are off, so the result will not appear here.\n <button type=\"button\" onClick={() => window.location.reload()} className=\"text-accent hover:underline\">\n Reconnect events\n </button>\n </p>\n );\n}\n\nconst FOOTER_CLASS: Record<InvokeHost, string> = {\n // Stuck to the bottom of the shell scroll; the pulled-down padding covers the page gutter beneath it.\n [INVOKE_HOSTS.PAGE]: 'sticky bottom-0 z-10 bg-surface border-t border-surface-border/40 pt-3 pb-16 -mb-16',\n [INVOKE_HOSTS.MODAL]: 'border-t border-surface-border/40 pt-3',\n};\n\n/**\n * The submit row every invoke form shares. One line: status on the left,\n * Submit on the right. Once a run starts the button gives way to \"Submit\n * again\" until the person chooses it, and the returned result fills the\n * width beneath in a zone that scrolls on its own. On the page the row\n * sticks to the bottom of the shell scroll and follows the run; in a dialog\n * it closes the form and leaves the run to the dialog's receipt.\n */\nexport function InvokeFooter({\n onSubmit,\n onSubmitAgain,\n pending,\n error,\n issueCount = 0,\n onShowIssues,\n startedId,\n executionPath,\n host = INVOKE_HOSTS.PAGE,\n}: {\n onSubmit: () => void;\n /** Clears the last run so the button arms again. */\n onSubmitAgain: () => void;\n pending: boolean;\n error: string | null;\n issueCount?: number;\n onShowIssues?: () => void;\n startedId: string | null;\n executionPath: string | null;\n host?: InvokeHost;\n}) {\n const follows = host === INVOKE_HOSTS.PAGE;\n const run = useRunOutcome(follows ? startedId ?? '' : '');\n const submitted = follows && startedId !== null;\n\n return (\n <div className={FOOTER_CLASS[host]}>\n <div className=\"flex items-center justify-between gap-6 min-h-9\">\n <div className=\"flex-1 min-w-0 flex flex-col gap-1\">\n <EventsOffNotice />\n {issueCount > 0 && onShowIssues ? (\n <button\n type=\"button\"\n onClick={onShowIssues}\n className=\"flex items-center gap-1.5 text-xs text-status-error hover:underline\"\n data-testid=\"invoke-issues\"\n >\n <AlertCircle className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n {issueCount} {issueCount === 1 ? 'issue' : 'issues'} to resolve\n </button>\n ) : error ? (\n <p className=\"text-xs text-status-error\" role=\"alert\">{error}</p>\n ) : null}\n {submitted && <RunStatusLine workflowId={startedId!} outcome={run.outcome} executionPath={executionPath} />}\n </div>\n\n <div className=\"shrink-0\">\n {submitted ? (\n <button\n type=\"button\"\n onClick={onSubmitAgain}\n className=\"text-xs text-accent hover:underline\"\n data-testid=\"invoke-again\"\n >\n Submit again\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={onSubmit}\n disabled={pending}\n className=\"btn-primary px-8 py-2\"\n data-testid=\"invoke-start\"\n >\n {pending ? 'Submitting…' : 'Submit'}\n </button>\n )}\n </div>\n </div>\n\n {submitted && run.outcome !== RUN_OUTCOMES.RUNNING && <RunResult payload={run.payload} />}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { AlertCircle, HelpCircle } from 'lucide-react';\nimport { SlidePanelViews, type SlidePanelView } from '../../../components/common/layout/SlidePanel';\nimport { MarkdownRenderer } from '../../../components/common/display/MarkdownRenderer';\nimport { ErrorsPanel } from '../../../components/escalation/ErrorsPanel';\nimport { useShellPanelOptional } from '../../../hooks/useShellPanel';\nimport { buildHelpMarkdown } from '../../../lib/x-lt-help';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\nimport type { FieldError } from '../../../lib/field-validator';\n\nexport const INVOKE_PANEL_KEY = 'invoke-help';\nconst PANEL_WIDTH = 380;\n\nexport const INVOKE_PANEL_VIEWS = {\n INSTRUCTIONS: 'instructions',\n ISSUES: 'issues',\n} as const;\ntype InvokePanelView = (typeof INVOKE_PANEL_VIEWS)[keyof typeof INVOKE_PANEL_VIEWS];\n\nfunction InvokePanelContent({\n view,\n onViewChange,\n onClose,\n helpMarkdown,\n errors,\n schema,\n}: {\n view: InvokePanelView;\n onViewChange: (v: InvokePanelView) => void;\n onClose: () => void;\n helpMarkdown: string | null;\n errors: FieldError[];\n schema: Record<string, unknown>;\n}) {\n const views: SlidePanelView[] = [];\n if (helpMarkdown) {\n views.push({\n id: INVOKE_PANEL_VIEWS.INSTRUCTIONS,\n icon: HelpCircle,\n label: 'Instructions',\n content: <MarkdownRenderer content={helpMarkdown} />,\n });\n }\n views.push({\n id: INVOKE_PANEL_VIEWS.ISSUES,\n icon: AlertCircle,\n label: 'Issues',\n content: <ErrorsPanel errors={errors} schema={schema} />,\n });\n const activeId = views.some((v) => v.id === view) ? view : views[0].id;\n return (\n <SlidePanelViews\n views={views}\n activeId={activeId}\n onViewChange={(id) => onViewChange(id as InvokePanelView)}\n onClose={onClose}\n stickyClassName=\"h-full min-h-0\"\n labelInline\n />\n );\n}\n\n/**\n * The invoke form's side panel in the shell's right slot: Instructions\n * (x-lt-help, re-interpolated against the live values) and Issues (the\n * current violations, click-to-focus). Content follows the form while the\n * panel is open; the slot is released on unmount. A host that cannot use the\n * slot (a dialog over the shell) passes `enabled: false` and renders the same\n * content inline; the hook then never claims the slot.\n */\nexport function useInvokeSidePanel({\n schema,\n context,\n errors,\n enabled = true,\n}: {\n schema: Record<string, unknown>;\n context: ShowIfContext;\n errors: FieldError[];\n enabled?: boolean;\n}) {\n const shell = useShellPanelOptional();\n // The provider's callbacks are stable; the context object is not.\n const setPanel = enabled ? shell?.setPanel : undefined;\n const closePanel = enabled ? shell?.closePanel : undefined;\n const ownerKey = shell?.ownerKey ?? null;\n const slotOpen = shell?.open ?? false;\n const [view, setView] = useState<InvokePanelView | null>(null);\n\n const helpMarkdown = useMemo(() => buildHelpMarkdown(schema, context), [schema, context]);\n\n const close = useCallback(() => {\n setView(null);\n closePanel?.(INVOKE_PANEL_KEY);\n }, [closePanel]);\n\n useEffect(() => {\n if (!setPanel || !view) return;\n setPanel(\n <InvokePanelContent\n view={view}\n onViewChange={setView}\n onClose={close}\n helpMarkdown={helpMarkdown}\n errors={errors}\n schema={schema}\n />,\n { key: INVOKE_PANEL_KEY, width: PANEL_WIDTH },\n );\n }, [setPanel, view, helpMarkdown, errors, schema, close]);\n\n // Another claimant taking the slot ends our view.\n useEffect(() => {\n if (view && slotOpen && ownerKey && ownerKey !== INVOKE_PANEL_KEY) setView(null);\n }, [view, slotOpen, ownerKey]);\n\n const closeRef = useRef(closePanel);\n closeRef.current = closePanel;\n useEffect(() => () => { closeRef.current?.(INVOKE_PANEL_KEY); }, []);\n\n return {\n helpMarkdown,\n hasInstructions: !!helpMarkdown,\n open: view !== null,\n showInstructions: () => setView(INVOKE_PANEL_VIEWS.INSTRUCTIONS),\n showIssues: () => setView(INVOKE_PANEL_VIEWS.ISSUES),\n close,\n };\n}\n","import { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport { ResolverForm } from '../../../components/escalation/ResolverForm';\nimport { ErrorsPanel } from '../../../components/escalation/ErrorsPanel';\nimport { MarkdownRenderer } from '../../../components/common/display/MarkdownRenderer';\nimport { buildResolverPayload } from '../../../lib/resolver-payload';\nimport { buildInvokeFormContext } from '../../../lib/invoke-context';\nimport { seedFormJson } from '../../../lib/seed-form-json';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\nimport type { FieldError } from '../../../lib/field-validator';\nimport type { LTWorkflowConfig } from '../../../api/types';\nimport { InvokeFooter } from './InvokeFooter';\nimport { INVOKE_PANEL_VIEWS, useInvokeSidePanel } from './InvokeSidePanel';\nimport { INVOKE_HOSTS, type InvokeHost, type InvokeSubmission } from './use-invoke-submit';\n\ntype InlineView = (typeof INVOKE_PANEL_VIEWS)[keyof typeof INVOKE_PANEL_VIEWS];\n\n/**\n * The x-lt-* invoke form. The declared input_schema renders through the same\n * ResolverForm the escalation surface uses; live values drive x-lt-showIf\n * under `input` and `resolver`, pinned lookups under `lookup`; submit runs\n * the shared validation pass, maps x-lt-bind into the nested `data`, and\n * posts the envelope the API has always taken. A server 422 lands in the\n * same Issues view. On the page, Instructions and Issues use the shell's side\n * slot; in a dialog they render inline beneath the fields.\n */\nexport function RichInvokeForm({\n selected,\n schema,\n metadata,\n lookup,\n submission,\n lead,\n prefill,\n host = INVOKE_HOSTS.PAGE,\n}: {\n selected: LTWorkflowConfig;\n schema: Record<string, unknown>;\n metadata: Record<string, unknown>;\n /** Resolved knowledge editions keyed as the form reads them: lookup.<as ?? key>. */\n lookup?: Record<string, unknown>;\n submission: InvokeSubmission;\n /** Content that scrolls with the form ahead of its fields: description, identity, options. */\n lead?: ReactNode;\n /** The nested `data` payload the fields start from, inverted through x-lt-bind. */\n prefill?: Record<string, unknown>;\n host?: InvokeHost;\n}) {\n const inline = host === INVOKE_HOSTS.MODAL;\n const [json, setJson] = useState(() => seedFormJson(schema, prefill));\n const [submitAttempted, setSubmitAttempted] = useState(false);\n const [clientErrors, setClientErrors] = useState<FieldError[]>([]);\n const [parseError, setParseError] = useState<string | null>(null);\n const [inlineView, setInlineView] = useState<InlineView | null>(null);\n\n useEffect(() => {\n setJson(seedFormJson(schema, prefill));\n setSubmitAttempted(false);\n setClientErrors([]);\n setParseError(null);\n setInlineView(null);\n submission.reset();\n }, [selected.workflow_type]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const context = useMemo<ShowIfContext>(\n () => ({ ...buildInvokeFormContext(metadata, lookup), resolver: null }),\n [metadata, lookup],\n );\n const liveContext = useMemo<ShowIfContext>(() => {\n try {\n const values = JSON.parse(json) as Record<string, unknown>;\n return { ...context, resolver: values, input: values };\n } catch {\n return context;\n }\n }, [json, context]);\n\n // Once a submit was tried, the issue list tracks every edit.\n useEffect(() => {\n if (!submitAttempted) return;\n setClientErrors(buildResolverPayload(json, context).errors);\n }, [json, submitAttempted, context]);\n\n const errors = clientErrors.length > 0 ? clientErrors : submission.violations;\n const panel = useInvokeSidePanel({ schema, context: liveContext, errors, enabled: !inline });\n const showIssues = inline ? () => setInlineView(INVOKE_PANEL_VIEWS.ISSUES) : panel.showIssues;\n const showInstructions = inline\n ? () => setInlineView((v) => (v === INVOKE_PANEL_VIEWS.INSTRUCTIONS ? null : INVOKE_PANEL_VIEWS.INSTRUCTIONS))\n : panel.showInstructions;\n\n useEffect(() => {\n if (submission.violations.length > 0) showIssues();\n }, [submission.violations]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleSubmit = () => {\n setSubmitAttempted(true);\n const result = buildResolverPayload(json, context);\n if (result.parseError) {\n setParseError(result.parseError);\n return;\n }\n setParseError(null);\n if (result.errors.length > 0) {\n setClientErrors(result.errors);\n showIssues();\n return;\n }\n setClientErrors([]);\n void submission.submit(result.payload!, metadata);\n };\n\n const inlineIssues = inline && inlineView === INVOKE_PANEL_VIEWS.ISSUES && errors.length > 0;\n const inlineHelp = inline && inlineView === INVOKE_PANEL_VIEWS.INSTRUCTIONS && panel.helpMarkdown;\n\n return (\n <div data-testid=\"rich-invoke-form\">\n <div className=\"space-y-6 pb-6\">\n {lead}\n {inlineHelp && (\n <div className=\"px-4 py-3 bg-surface-hover\" data-testid=\"invoke-inline-help\">\n <MarkdownRenderer content={panel.helpMarkdown!} />\n </div>\n )}\n <ResolverForm\n value={json}\n onChange={setJson}\n submitAttempted={submitAttempted}\n escalationContext={context}\n onOpenHelp={panel.hasInstructions ? showInstructions : undefined}\n />\n {inlineIssues && (\n <div data-testid=\"invoke-inline-issues\">\n <ErrorsPanel errors={errors} schema={schema} />\n </div>\n )}\n </div>\n <InvokeFooter\n onSubmitAgain={submission.reset}\n onSubmit={handleSubmit}\n pending={submission.pending}\n error={parseError ?? submission.error}\n issueCount={errors.length}\n onShowIssues={showIssues}\n startedId={submission.startedId}\n executionPath={submission.executionPath}\n host={host}\n />\n </div>\n );\n}\n","export const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n\n/** Infer a simple field type from a value. */\nexport function inferTypeFromValue(value: unknown): string {\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'number') return 'number';\n if (Array.isArray(value)) return 'array';\n if (value !== null && typeof value === 'object') return 'object';\n return 'string';\n}\n\n/** Extract the data keys from an envelope_schema and their inferred types. */\nexport function extractDataFields(\n schema: Record<string, unknown> | null,\n): { key: string; type: string; defaultValue: unknown }[] {\n if (!schema) return [];\n const data = schema.data;\n if (!data || typeof data !== 'object') return [];\n return Object.entries(data as Record<string, unknown>).map(([key, value]) => ({\n key,\n type: inferTypeFromValue(value),\n defaultValue: value,\n }));\n}\n\n/** Build form field values from data object. */\nexport function dataToFields(data: Record<string, unknown>): Record<string, unknown> {\n return { ...data };\n}\n\n/** Build full envelope JSON string from form fields + metadata. */\nexport function fieldsToJson(\n fields: Record<string, unknown>,\n metadata: Record<string, unknown>,\n): string {\n return JSON.stringify({ data: fields, metadata }, null, 2);\n}\n","import { Link } from 'react-router-dom';\nimport type { LTWorkflowConfig } from '../../../api/types';\n\ninterface DataField {\n key: string;\n type: string;\n defaultValue: unknown;\n}\n\nexport function EnvelopeEditor({\n selectedConfig,\n isJsonMode,\n hasFormView,\n jsonInput,\n formFields,\n dataFields,\n onJsonChange,\n onToggleMode,\n onUpdateFormField,\n onSetFormFields,\n}: {\n selectedConfig: LTWorkflowConfig;\n isJsonMode: boolean;\n hasFormView: boolean;\n jsonInput: string;\n formFields: Record<string, unknown>;\n dataFields: DataField[];\n onJsonChange: (value: string) => void;\n onToggleMode: () => void;\n onUpdateFormField: (key: string, value: unknown, type: string) => void;\n onSetFormFields: (fields: Record<string, unknown>) => void;\n}) {\n return (\n <div>\n <div className=\"flex items-baseline justify-between mb-2\">\n <label className=\"block text-xs text-text-secondary\">\n Envelope\n </label>\n <div className=\"flex items-center gap-3\">\n {hasFormView && (\n <button\n type=\"button\"\n onClick={onToggleMode}\n className=\"text-2xs text-accent hover:underline\"\n >\n {isJsonMode ? 'Form view' : 'JSON view'}\n </button>\n )}\n {selectedConfig.envelope_schema ? (\n <span className=\"text-2xs text-accent\">\n Pre-filled from workflow config\n </span>\n ) : (\n <span className=\"text-2xs text-status-warning\">\n No template\n </span>\n )}\n </div>\n </div>\n\n {!selectedConfig.envelope_schema && (\n <div className=\"bg-surface-sunken border border-surface-border rounded px-4 py-3 mb-3\">\n <p className=\"text-xs text-text-secondary leading-relaxed\">\n This workflow has no input template. Edit the JSON directly below, or <Link to=\"/workflows/registry/new\" className=\"text-status-success hover:underline\">register it</Link> in the Workflow Registry with an envelope schema for pre-filled fields and form-based input.\n </p>\n </div>\n )}\n\n {isJsonMode || !hasFormView ? (\n /* JSON view */\n <textarea\n value={jsonInput}\n onChange={(e) => onJsonChange(e.target.value)}\n className=\"input-json\"\n rows={12}\n spellCheck={false}\n />\n ) : (\n /* Form view */\n <div className=\"space-y-3\">\n {dataFields.map(({ key, type }) => {\n const value = formFields[key];\n const jsonValue =\n typeof value === 'string'\n ? value\n : JSON.stringify(\n value ?? (type === 'array' ? [] : {}),\n null,\n 2,\n );\n const textareaRows = Math.min(\n 20,\n Math.max(4, (jsonValue?.split?.('\\n')?.length ?? 4)),\n );\n return (\n <div key={key}>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {key}\n <span className=\"ml-2 font-normal normal-case\">\n {type}\n </span>\n </label>\n {type === 'boolean' ? (\n <select\n value={String(value ?? false)}\n onChange={(e) =>\n onUpdateFormField(key, e.target.value, type)\n }\n className=\"select text-xs w-full\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : type === 'object' || type === 'array' ? (\n <textarea\n value={jsonValue}\n onChange={(e) => {\n try {\n onUpdateFormField(\n key,\n JSON.parse(e.target.value),\n type,\n );\n } catch {\n // Keep raw text without syncing to JSON\n onSetFormFields({\n ...formFields,\n [key]: e.target.value,\n });\n }\n }}\n className=\"input-json w-full\"\n rows={textareaRows}\n spellCheck={false}\n />\n ) : (\n <input\n type={type === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) =>\n onUpdateFormField(key, e.target.value, type)\n }\n className=\"input text-xs w-full\"\n />\n )}\n </div>\n );\n })}\n </div>\n )}\n <p className=\"text-2xs text-text-tertiary mt-1.5\">\n The envelope wraps your workflow input. <code className=\"text-accent/80\">data</code> holds workflow-specific fields; <code className=\"text-accent/80\">metadata</code> is optional context.\n </p>\n </div>\n );\n}\n","import { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport type { LTWorkflowConfig } from '../../../api/types';\nimport { DEFAULT_ENVELOPE, extractDataFields, dataToFields, fieldsToJson } from './helpers';\nimport { EnvelopeEditor } from './EnvelopeEditor';\nimport { InvokeFooter } from './InvokeFooter';\nimport { INVOKE_HOSTS, type InvokeHost, type InvokeSubmission } from './use-invoke-submit';\n\nconst PREFILL_KEY = 'lt:invoke:prefill';\n\n/**\n * The template-driven envelope form: fields inferred from envelope_schema\n * values, with a JSON view for anything the template cannot express. The\n * surface every workflow gets until it declares an input_schema. A prefill\n * merges over the template's `data`, so a caller can hand the form values it\n * already knows.\n */\nexport function LegacyInvokeForm({\n selected,\n metadata,\n submission,\n lead,\n prefill,\n host = INVOKE_HOSTS.PAGE,\n}: {\n selected: LTWorkflowConfig;\n metadata: Record<string, unknown>;\n submission: InvokeSubmission;\n /** Content that scrolls with the form ahead of its fields: description, identity, options. */\n lead?: ReactNode;\n /** `data` values merged over the envelope template. */\n prefill?: Record<string, unknown>;\n host?: InvokeHost;\n}) {\n const [jsonInput, setJsonInput] = useState(DEFAULT_ENVELOPE);\n const [parseError, setParseError] = useState('');\n const [formFields, setFormFields] = useState<Record<string, unknown>>({});\n const [isJsonMode, setIsJsonMode] = useState(false);\n\n // The template with the prefill folded into its data: the shape the fields and the JSON view both start from.\n const envelope = useMemo<Record<string, unknown> | null>(() => {\n const template = selected.envelope_schema ?? null;\n if (!prefill || Object.keys(prefill).length === 0) return template;\n const templateData = template?.data;\n const data = { ...(templateData && typeof templateData === 'object' ? (templateData as Record<string, unknown>) : {}), ...prefill };\n return { ...(template ?? {}), data };\n }, [selected.envelope_schema, prefill]);\n\n const dataFields = useMemo(() => extractDataFields(envelope), [envelope]);\n const hasFormView = dataFields.length > 0;\n\n useEffect(() => {\n setParseError('');\n submission.reset();\n\n // A registry hand-off arrives through sessionStorage and opens in JSON view.\n const handoff = host === INVOKE_HOSTS.PAGE ? sessionStorage.getItem(PREFILL_KEY) : null;\n if (handoff) {\n sessionStorage.removeItem(PREFILL_KEY);\n setJsonInput(handoff);\n try {\n const parsed = JSON.parse(handoff);\n const data = parsed?.data ?? parsed;\n if (data && typeof data === 'object') setFormFields(dataToFields(data));\n } catch { /* use as-is */ }\n setIsJsonMode(true);\n return;\n }\n\n setJsonInput(envelope ? JSON.stringify(envelope, null, 2) : DEFAULT_ENVELOPE);\n const data = envelope?.data;\n setFormFields(data && typeof data === 'object' ? dataToFields(data as Record<string, unknown>) : {});\n setIsJsonMode(!extractDataFields(envelope).length);\n }, [selected.workflow_type]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleToggleMode = () => {\n if (isJsonMode) {\n try {\n const parsed = JSON.parse(jsonInput);\n if (parsed.data && typeof parsed.data === 'object') setFormFields(dataToFields(parsed.data));\n } catch { /* keep existing */ }\n } else {\n setJsonInput(fieldsToJson(formFields, metadata));\n }\n setIsJsonMode(!isJsonMode);\n };\n\n const updateFormField = (key: string, value: unknown, type: string) => {\n let parsed = value;\n if (type === 'number') parsed = value === '' ? 0 : Number(value);\n else if (type === 'boolean') parsed = value === 'true' || value === true;\n const updated = { ...formFields, [key]: parsed };\n setFormFields(updated);\n setJsonInput(fieldsToJson(updated, metadata));\n };\n\n const handleInvoke = () => {\n setParseError('');\n let envelope: Record<string, unknown>;\n try {\n envelope = JSON.parse(jsonInput);\n } catch {\n setParseError('Invalid JSON');\n return;\n }\n const { data, metadata: envelopeMetadata } = envelope;\n if (!data || typeof data !== 'object') {\n setParseError('Envelope must include a \"data\" object');\n return;\n }\n void submission.submit(\n data as Record<string, unknown>,\n (envelopeMetadata as Record<string, unknown> | undefined) ?? {},\n );\n };\n\n return (\n <div>\n <div className=\"space-y-6 pb-6\">\n {lead}\n <EnvelopeEditor\n selectedConfig={selected}\n isJsonMode={isJsonMode}\n hasFormView={hasFormView}\n jsonInput={jsonInput}\n formFields={formFields}\n dataFields={dataFields}\n onJsonChange={(v) => { setJsonInput(v); setParseError(''); }}\n onToggleMode={handleToggleMode}\n onUpdateFormField={updateFormField}\n onSetFormFields={setFormFields}\n />\n </div>\n <InvokeFooter\n onSubmitAgain={submission.reset}\n onSubmit={handleInvoke}\n pending={submission.pending}\n error={parseError || submission.error}\n startedId={submission.startedId}\n executionPath={submission.executionPath}\n host={host}\n />\n </div>\n );\n}\n","import type { InvocableWorkflow } from '../../api/types';\nimport { WorkflowIcon } from '../common/display/WorkflowIcon';\nimport { EventsOffNotice } from '../../pages/workflows/start/InvokeFooter';\nimport { RunOutcomeLabel, RunOutline, RUN_OUTCOMES, useRunOutcome } from '../../pages/workflows/start/StartedRunNotice';\n\n/**\n * What a dialog shows once its form is submitted: one state at a time. While\n * the run works, its icon and a pulse; once it completes, the returned data\n * as an outline with Done; if it fails, the reason with a way back to the\n * form holding what was typed. Closing while the run works leaves it running.\n */\nexport function RunReceipt({\n workflow,\n workflowId,\n onDone,\n onRetry,\n}: {\n workflow: InvocableWorkflow;\n workflowId: string;\n onDone: () => void;\n onRetry: () => void;\n}) {\n const run = useRunOutcome(workflowId);\n const failed = run.outcome === RUN_OUTCOMES.FAILED;\n const running = run.outcome === RUN_OUTCOMES.RUNNING;\n const failure = failed && typeof run.payload?.error === 'string' ? run.payload.error : null;\n\n return (\n <div className=\"flex flex-col gap-4\" data-testid=\"run-receipt\" data-outcome={run.outcome}>\n <div className=\"flex items-center gap-3\">\n <WorkflowIcon icon={workflow.icon} tier={workflow.tier} className=\"w-6 h-6 shrink-0 text-accent\" />\n <RunOutcomeLabel outcome={run.outcome} className=\"text-sm\" />\n </div>\n {running && <EventsOffNotice />}\n {failure && <p className=\"text-xs text-status-error\" role=\"alert\">{failure}</p>}\n {!running && <RunOutline payload={failure ? undefined : run.payload} />}\n <div className=\"flex justify-end gap-2 pt-2 border-t border-surface-border/40\">\n {failed && (\n <button type=\"button\" onClick={onRetry} className=\"btn-secondary text-xs\" data-testid=\"run-retry\">\n Try again\n </button>\n )}\n <button type=\"button\" onClick={onDone} className=\"btn-primary text-xs px-6\" data-testid=\"run-done\">\n {running || failed ? 'Close' : 'Done'}\n </button>\n </div>\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport { AlertTriangle } from 'lucide-react';\nimport { Modal } from '../common/modal/Modal';\nimport { WorkflowIcon } from '../common/display/WorkflowIcon';\nimport { MarkdownRenderer } from '../common/display/MarkdownRenderer';\nimport { foldWorkflowLookups, useWorkflowLookups } from '../../api/workflows';\nimport type { InvocableWorkflow } from '../../api/types';\nimport { identifierToTitle } from '../../lib/identifier-label';\nimport type { InvokePayload } from '../../lib/x-lt-invoke';\nimport { RichInvokeForm } from '../../pages/workflows/start/RichInvokeForm';\nimport { LegacyInvokeForm } from '../../pages/workflows/start/LegacyInvokeForm';\nimport { INVOKE_HOSTS, useInvokeSubmit } from '../../pages/workflows/start/use-invoke-submit';\nimport { RunReceipt } from './RunReceipt';\n\n/** The run metadata: the workflow's declared metadata with the caller's mapping over it. */\nexport function invokeRunMetadata(workflow: InvocableWorkflow, mapped: Record<string, unknown>): Record<string, unknown> {\n const declared = workflow.envelope_schema?.metadata;\n return { ...(declared && typeof declared === 'object' ? (declared as Record<string, unknown>) : {}), ...mapped };\n}\n\nfunction InvokeModalBody({ workflow, prefill, onClose }: { workflow: InvocableWorkflow; prefill: InvokePayload; onClose: () => void }) {\n const metadata = useMemo(() => invokeRunMetadata(workflow, prefill.metadata), [workflow, prefill.metadata]);\n const hasLookups = Array.isArray(workflow.input_lookups) && workflow.input_lookups.length > 0;\n const { data: lookupData } = useWorkflowLookups(workflow.workflow_type, hasLookups);\n const lookup = useMemo(() => (lookupData ? foldWorkflowLookups(lookupData.lookups) : undefined), [lookupData]);\n const missingLookups = lookupData?.lookups.filter((l) => l.missing) ?? [];\n const submission = useInvokeSubmit(workflow, { certified: workflow.certified, overrideBot: '' });\n\n const lead = workflow.description ? (\n <MarkdownRenderer content={workflow.description} className=\"text-xs text-text-secondary leading-relaxed\" />\n ) : undefined;\n\n // The form stays mounted but hidden behind the receipt, so Try again returns to what was typed.\n const started = submission.startedId !== null;\n\n return (\n <div data-testid=\"invoke-modal\">\n {started && (\n <RunReceipt workflow={workflow} workflowId={submission.startedId!} onDone={onClose} onRetry={submission.reset} />\n )}\n <div hidden={started}>\n {missingLookups.length > 0 && (\n <p className=\"flex items-center gap-1.5 text-2xs text-status-warning mb-4\" data-testid=\"lookup-missing\">\n <AlertTriangle className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n {missingLookups.map((l) => `${l.domain}/${l.key} v${l.version}`).join(', ')} {missingLookups.length === 1 ? 'is' : 'are'} not available; the fields that read {missingLookups.length === 1 ? 'it' : 'them'} fall back to plain inputs.\n </p>\n )}\n {workflow.input_schema ? (\n <RichInvokeForm\n selected={workflow}\n schema={workflow.input_schema}\n metadata={metadata}\n lookup={lookup}\n submission={submission}\n lead={lead}\n prefill={prefill.data}\n host={INVOKE_HOSTS.MODAL}\n />\n ) : (\n <LegacyInvokeForm\n selected={workflow}\n metadata={metadata}\n submission={submission}\n lead={lead}\n prefill={prefill.data}\n host={INVOKE_HOSTS.MODAL}\n />\n )}\n </div>\n </div>\n );\n}\n\n/**\n * A workflow's invoke form in a dialog, opened from another surface with the\n * values that surface already knows. Submitting turns the dialog into a\n * receipt with one action. The body mounts only while open, so each opening\n * starts clean and pinned lookups load on demand. The backdrop does not\n * dismiss a form holding typed input; Escape and the close button do.\n */\nexport function InvokeModal({\n open,\n onClose,\n workflow,\n prefill,\n}: {\n open: boolean;\n onClose: () => void;\n workflow: InvocableWorkflow;\n prefill: InvokePayload;\n}) {\n const title = (\n <span className=\"flex items-center gap-2 min-w-0\">\n <WorkflowIcon icon={workflow.icon} tier={workflow.tier} className=\"w-4 h-4 shrink-0 text-accent\" />\n <span className=\"truncate\" title={workflow.workflow_type}>{identifierToTitle(workflow.workflow_type)}</span>\n </span>\n );\n return (\n <Modal open={open} onClose={onClose} title={title} maxWidth=\"max-w-2xl\" closeOnBackdrop={false}>\n <InvokeModalBody workflow={workflow} prefill={prefill} onClose={onClose} />\n </Modal>\n );\n}\n","import { useMemo, useState } from 'react';\nimport { AlertCircle } from 'lucide-react';\nimport { useInvocableWorkflows } from '../../../api/workflows';\nimport type { InvocableWorkflow } from '../../../api/types';\nimport { ESCALATION_STATUS } from '../../../lib/constants';\nimport { identifierToTitle } from '../../../lib/identifier-label';\nimport { buildInvokeFormContext } from '../../../lib/invoke-context';\nimport { interpolateHelp } from '../../../lib/x-lt-help';\nimport { INVOKE_VARIANTS, readInvokeConfig, resolveInvokePayload, type InvokeConfig, type InvokePayload } from '../../../lib/x-lt-invoke';\nimport { validateResolverPayload, type FieldError } from '../../../lib/field-validator';\nimport { Modal } from '../../common/modal/Modal';\nimport { WorkflowIcon } from '../../common/display/WorkflowIcon';\nimport { InvokeModal, invokeRunMetadata } from '../../invoke/InvokeModal';\nimport { EventsOffNotice } from '../../../pages/workflows/start/InvokeFooter';\nimport { RunOutcomeLabel, RunOutline, RUN_OUTCOMES, useRunOutcome } from '../../../pages/workflows/start/StartedRunNotice';\nimport { useInvokeSubmit } from '../../../pages/workflows/start/use-invoke-submit';\nimport { FieldLabel, FieldHelper } from '../resolver-form/FieldChrome';\nimport type { WidgetProps } from './index';\n\nconst CONTROL_CLASS: Record<InvokeConfig['variant'], string> = {\n [INVOKE_VARIANTS.LINK]: 'inline-flex items-center gap-1.5 text-xs text-accent hover:text-accent-hover transition-colors',\n [INVOKE_VARIANTS.BUTTON]: 'btn-secondary inline-flex items-center gap-1.5 text-xs px-3 py-1.5',\n};\n\n/**\n * Invoke widget: starts a workflow from inside the form. The declaration in\n * `x-lt-invoke` names the workflow and maps the escalation context into its\n * payload. The control appears only for workflows the caller may invoke, as\n * the Invoke Tool page lists them, and only while the escalation is pending.\n *\n * Direct mode posts the mapped payload and follows the run here: the control\n * gives way to the outcome, the returned data reads as an outline, and the\n * control returns beneath it once the run has settled. A payload the target's\n * input schema refuses, on either side of the wire, lists its issues beneath\n * the control with a way to finish in the workflow's own form. Modal mode\n * opens that form at once, prefilled from the same mapping.\n *\n * Display-only: the field carries no answer and is dropped from the payload.\n */\nexport function InvokeWidget({ fieldKey, schema, escalationContext }: WidgetProps) {\n const config = useMemo(() => readInvokeConfig(schema), [schema]);\n const { data: workflows, isPending } = useInvocableWorkflows();\n const workflow = workflows?.find((w) => w.workflow_type === config?.workflow);\n const status = (escalationContext?.escalation as { status?: string } | null | undefined)?.status;\n const terminal = status !== undefined && status !== ESCALATION_STATUS.PENDING;\n\n if (!config || terminal) return null;\n if (isPending) {\n return <div className=\"h-4 w-32 rounded bg-surface-hover animate-pulse\" data-testid={`invoke-widget-${fieldKey}-loading`} />;\n }\n if (!workflow) return null;\n return <InvokeControl fieldKey={fieldKey} schema={schema} config={config} workflow={workflow} escalationContext={escalationContext} />;\n}\n\nfunction InvokeControl({\n fieldKey,\n schema,\n config,\n workflow,\n escalationContext,\n}: {\n fieldKey: string;\n schema: WidgetProps['schema'];\n config: InvokeConfig;\n workflow: InvocableWorkflow;\n escalationContext: WidgetProps['escalationContext'];\n}) {\n const ctx = escalationContext as Record<string, unknown> | undefined;\n const payload = useMemo<InvokePayload>(() => resolveInvokePayload(config, ctx), [config, ctx]);\n const metadata = useMemo(() => invokeRunMetadata(workflow, payload.metadata), [workflow, payload.metadata]);\n const submission = useInvokeSubmit(workflow, { certified: workflow.certified, overrideBot: '' });\n const run = useRunOutcome(submission.startedId ?? '');\n const [issues, setIssues] = useState<FieldError[]>([]);\n const [confirming, setConfirming] = useState(false);\n const [modalOpen, setModalOpen] = useState(false);\n\n const label = (schema?.title as string | undefined) ?? identifierToTitle(workflow.workflow_type);\n const helperText = schema?.description as string | undefined;\n const Icon = config.icon ? <WorkflowIcon icon={workflow.icon} tier={workflow.tier} className=\"w-3.5 h-3.5 shrink-0\" /> : null;\n\n const fire = () => {\n setConfirming(false);\n void submission.submit(payload.data, metadata);\n };\n\n const activate = () => {\n if (config.modal) {\n setModalOpen(true);\n return;\n }\n setIssues([]);\n if (workflow.input_schema) {\n const violations = validateResolverPayload(workflow.input_schema, payload.data, buildInvokeFormContext(metadata));\n if (violations.length > 0) {\n setIssues(violations);\n return;\n }\n }\n if (config.confirm) setConfirming(true);\n else fire();\n };\n\n const openForm = () => {\n setIssues([]);\n submission.reset();\n setModalOpen(true);\n };\n\n const shownIssues = issues.length > 0 ? issues : submission.violations;\n const started = submission.startedId !== null;\n const running = started && run.outcome === RUN_OUTCOMES.RUNNING;\n const failure = started && run.outcome === RUN_OUTCOMES.FAILED && typeof run.payload?.error === 'string' ? run.payload.error : null;\n\n return (\n <div data-field-key={fieldKey} data-testid={`invoke-widget-${fieldKey}`}>\n <FieldLabel>{label}</FieldLabel>\n {helperText && <FieldHelper>{helperText}</FieldHelper>}\n <div className=\"mt-1 flex flex-col gap-1.5\">\n {started && (\n <>\n <RunOutcomeLabel outcome={run.outcome} />\n {running && <EventsOffNotice />}\n {failure && <p className=\"text-2xs text-status-error\" role=\"alert\">{failure}</p>}\n {!running && <RunOutline payload={failure ? undefined : run.payload} />}\n </>\n )}\n {!running && (\n <button\n type=\"button\"\n onClick={activate}\n disabled={submission.pending}\n className={`self-start ${CONTROL_CLASS[config.variant]}`}\n data-testid={`invoke-control-${fieldKey}`}\n >\n {Icon}\n {submission.pending ? 'Starting…' : label}\n </button>\n )}\n\n {shownIssues.length > 0 && (\n <div className=\"text-2xs\" role=\"alert\" data-testid={`invoke-issues-${fieldKey}`}>\n <ul className=\"space-y-0.5 text-status-error\">\n {shownIssues.map((v) => (\n <li key={v.field} className=\"flex items-start gap-1.5\">\n <AlertCircle className=\"w-3 h-3 mt-px shrink-0\" strokeWidth={1.5} />\n <span><span className=\"font-semibold\">{v.field}</span> · {v.message}</span>\n </li>\n ))}\n </ul>\n <button type=\"button\" onClick={openForm} className=\"mt-1 text-accent hover:underline\" data-testid={`invoke-open-form-${fieldKey}`}>\n Open form\n </button>\n </div>\n )}\n {shownIssues.length === 0 && submission.error && (\n <p className=\"text-2xs text-status-error\" role=\"alert\">{submission.error}</p>\n )}\n </div>\n\n {config.confirm && (\n <Modal open={confirming} onClose={() => setConfirming(false)} title={label}>\n <p className=\"text-sm text-text-secondary mb-5\">{interpolateHelp(config.confirm, escalationContext ?? {})}</p>\n <div className=\"flex justify-end gap-2\">\n <button type=\"button\" onClick={() => setConfirming(false)} className=\"btn-secondary text-xs\">Cancel</button>\n <button type=\"button\" onClick={fire} className=\"btn-primary text-xs\" data-testid={`invoke-confirm-${fieldKey}`}>{label}</button>\n </div>\n </Modal>\n )}\n\n <InvokeModal open={modalOpen} onClose={() => setModalOpen(false)} workflow={workflow} prefill={payload} />\n </div>\n );\n}\n","import type { ComponentType } from 'react';\nimport { FileUploadWidget } from './FileUploadWidget';\nimport { CodeEditorWidget } from './CodeEditorWidget';\nimport { SignatureWidget } from './SignatureWidget';\nimport { RichTextWidget } from './RichTextWidget';\nimport { MarkdownWidget } from './MarkdownWidget';\nimport { ChecklistWidget } from './ChecklistWidget';\nimport { AttachmentWidget } from './AttachmentWidget';\nimport { LinkWidget } from './LinkWidget';\nimport { EscalationWidget } from './EscalationWidget';\nimport { EscalationListWidget } from './EscalationListWidget';\nimport { InvokeWidget } from './InvokeWidget';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\n\nexport interface WidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n /** Escalation context — used by widgets that read from envelope/metadata/payload at render time. */\n escalationContext?: ShowIfContext;\n /** Whether this field is listed in the schema's required array. */\n isRequired?: boolean;\n /** Whether the user has attempted to submit — triggers required/validation display in widgets. */\n submitAttempted?: boolean;\n /** Validation error to display inside the widget. */\n error?: string;\n}\n\n/**\n * Registry of custom widgets referenced via `x-lt-widget` in JSON Schema.\n * String-typed fields receive value directly; object-typed fields are\n * JSON-serialized into the widget and parsed back on change (see FieldRow).\n */\nexport const WIDGET_MAP: Record<string, ComponentType<WidgetProps>> = {\n 'file-upload': FileUploadWidget,\n 'code-editor': CodeEditorWidget,\n 'signature': SignatureWidget,\n 'rich-text': RichTextWidget,\n 'markdown': MarkdownWidget,\n 'checklist': ChecklistWidget,\n // Attachment renders a captured binary (data URL / fetchable URL): images\n // inline, everything else as a safe open/download link. \"image\" is an alias\n // so schemas can name the constrained intent.\n 'attachment': AttachmentWidget,\n 'image': AttachmentWidget,\n // Embed, navigation, and invoke — display-only; dropped from the resolver payload.\n 'link': LinkWidget,\n 'escalation': EscalationWidget,\n 'escalation-list': EscalationListWidget,\n 'invoke': InvokeWidget,\n};\n","/**\n * Layout cell partitioning for the schema-driven resolver form.\n *\n * A section's fields render as a sequence of cells:\n * - `dictionary` — consecutive read-only facts merged into one dense\n * definition list (`x-lt-display: \"dictionary\"` at field, section, or\n * schema level)\n * - `column-group` — consecutive fields sharing an `x-lt-column-group` name,\n * rendered as an inner two-column grid inside one cell of a two-column\n * layout (the 2×2 nesting level)\n * - `field` — everything else, one input per cell\n */\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport type FormEntry = [string, JsonValue];\n\nexport type FieldKind = 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object' | 'null';\nconst FIELD_KINDS = new Set<FieldKind>(['string', 'number', 'integer', 'boolean', 'array', 'object']);\n\n/** The control follows the declared `type`; the runtime value decides only when the schema declares none. */\nexport function declaredKind(fieldSchema: Record<string, unknown> | undefined, value: unknown): FieldKind {\n const declared = fieldSchema?.type;\n if (typeof declared === 'string' && FIELD_KINDS.has(declared as FieldKind)) return declared as FieldKind;\n if (value === null || value === undefined) return 'null';\n if (Array.isArray(value)) return 'array';\n const t = typeof value;\n if (t === 'number' || t === 'boolean' || t === 'string') return t;\n return 'object';\n}\n\nexport interface SectionOptions {\n display?: string;\n columns?: number;\n}\n\nexport type FormCell =\n | { kind: 'field'; entry: FormEntry }\n | { kind: 'dictionary'; entries: FormEntry[] }\n | { kind: 'column-group'; name: string; entries: FormEntry[] };\n\nconst DICTIONARY = 'dictionary';\n\n/** Widgets that render content blocks even when readOnly — never dictionary rows. */\nconst CONTENT_WIDGETS = new Set(['markdown', 'attachment', 'image']);\n\nexport function sectionOptionsFor(\n formSchema: Record<string, any> | null | undefined,\n sectionName: string | null,\n): SectionOptions | undefined {\n if (!sectionName) return undefined;\n const all = formSchema?.['x-lt-section-options'] as Record<string, SectionOptions> | undefined;\n const opts = all?.[sectionName];\n return opts && typeof opts === 'object' ? opts : undefined;\n}\n\n/**\n * A field renders as a dictionary row when it is read-only, is not a content\n * widget, and dictionary display is requested at the nearest level:\n * field `x-lt-display` > section options > schema-root `x-lt-display`.\n */\nexport function isDictionaryField(\n formSchema: Record<string, any> | null | undefined,\n sectionName: string | null,\n key: string,\n): boolean {\n const fieldSchema = formSchema?.properties?.[key] as Record<string, unknown> | undefined;\n if (fieldSchema?.readOnly !== true) return false;\n const widget = fieldSchema?.['x-lt-widget'];\n if (typeof widget === 'string' && CONTENT_WIDGETS.has(widget)) return false;\n\n const fieldDisplay = fieldSchema?.['x-lt-display'];\n if (typeof fieldDisplay === 'string') return fieldDisplay === DICTIONARY;\n const sectionDisplay = sectionOptionsFor(formSchema, sectionName)?.display;\n if (typeof sectionDisplay === 'string') return sectionDisplay === DICTIONARY;\n return formSchema?.['x-lt-display'] === DICTIONARY;\n}\n\nexport function partitionCells(\n entries: FormEntry[],\n formSchema: Record<string, any> | null | undefined,\n sectionName: string | null,\n layout: string | undefined,\n): FormCell[] {\n const cells: FormCell[] = [];\n for (const entry of entries) {\n const [key] = entry;\n const last = cells[cells.length - 1];\n\n if (isDictionaryField(formSchema, sectionName, key)) {\n if (last?.kind === 'dictionary') {\n last.entries.push(entry);\n } else {\n cells.push({ kind: 'dictionary', entries: [entry] });\n }\n continue;\n }\n\n const fieldSchema = formSchema?.properties?.[key] as Record<string, unknown> | undefined;\n const groupName = fieldSchema?.['x-lt-column-group'];\n if (layout === 'two-column' && typeof groupName === 'string' && groupName.trim()) {\n if (last?.kind === 'column-group' && last.name === groupName) {\n last.entries.push(entry);\n } else {\n cells.push({ kind: 'column-group', name: groupName, entries: [entry] });\n }\n continue;\n }\n\n cells.push({ kind: 'field', entry });\n }\n return cells;\n}\n","import type { ResolvedOption } from '../../../lib/x-lt-options';\nimport { FieldLabel, FieldHelper, FieldError, selectClass } from './FieldChrome';\nimport type { FieldControlProps } from './field-control-props';\nimport type { JsonValue } from './form-cells';\n\n/**\n * One choice from an option list. The submitted answer is the option VALUE\n * with its own type (a numeric or boolean option stays so). A value outside\n * the list shows the disabled Choose placeholder, and once a value is picked\n * there is no way back. With `x-lt-nullable` the placeholder stays enabled\n * and picking it submits null. An empty list (a cascade child whose parent\n * is unanswered) renders disabled until options arrive.\n */\nexport function SelectField({ value, options, nullable, fieldKey, label, helperText, isRequired, error, onBlur, ids, ariaProps, onChange }: FieldControlProps & {\n value: JsonValue;\n options: ResolvedOption[];\n nullable?: boolean;\n}) {\n const current = value === null || value === undefined || value === '' ? '' : String(value);\n const hasCurrent = options.some((opt) => String(opt.value) === current);\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={ids.field}>{label}</FieldLabel>\n {helperText && <FieldHelper id={ids.help}>{helperText}</FieldHelper>}\n <select\n value={hasCurrent ? current : ''}\n disabled={options.length === 0}\n onChange={(e) => {\n const picked = options.find((opt) => String(opt.value) === e.target.value);\n onChange(picked ? picked.value : null);\n onBlur?.();\n }}\n onBlur={onBlur}\n data-field-key={fieldKey}\n className={selectClass(!!error)}\n {...ariaProps}\n >\n {(!hasCurrent || nullable) && <option value=\"\" disabled={!nullable}>Choose…</option>}\n {options.map((opt) => (\n <option key={String(opt.value)} value={String(opt.value)}>{opt.label}</option>\n ))}\n </select>\n <FieldError error={error} id={ids.error} />\n </div>\n );\n}\n","import { Check } from 'lucide-react';\nimport type { OptionValue, ResolvedOption } from '../../../lib/x-lt-options';\nimport { FieldLabel, FieldHelper, FieldError } from './FieldChrome';\nimport type { FieldControlProps } from './field-control-props';\nimport type { JsonValue } from './form-cells';\n\n/**\n * Pick any from an option list: chips, each a real checkbox. The submitted\n * value is the picked option values in list order. An empty list renders\n * disabled until options arrive.\n */\nexport function MultiSelectField({ value, options, fieldKey, label, helperText, isRequired, error, onBlur, ids, ariaProps, onChange }: FieldControlProps & {\n value: JsonValue;\n options: ResolvedOption[];\n}) {\n const picked = new Set<OptionValue>(Array.isArray(value) ? (value as OptionValue[]) : []);\n const toggle = (v: OptionValue) => {\n const next = new Set(picked);\n if (next.has(v)) next.delete(v); else next.add(v);\n onChange(options.filter((o) => next.has(o.value)).map((o) => o.value) as JsonValue);\n onBlur?.();\n };\n return (\n <div role=\"group\" aria-label={label} aria-required={isRequired || undefined} aria-invalid={error ? true : undefined} aria-describedby={ariaProps['aria-describedby']}>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n {helperText && <FieldHelper id={ids.help}>{helperText}</FieldHelper>}\n {options.length === 0 ? (\n <p className=\"text-xs text-text-tertiary italic mt-1\">No options yet</p>\n ) : (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {options.map((opt, i) => {\n const checked = picked.has(opt.value);\n return (\n <label\n key={String(opt.value)}\n className={`inline-flex items-center gap-1.5 cursor-pointer select-none px-3.5 py-2 text-sm border transition-colors rounded-[var(--lt-radius-field)] ${\n checked\n ? 'bg-accent border-accent text-text-inverse'\n : error\n ? 'bg-surface-field border-status-error/60 text-status-error'\n : 'bg-surface-field border-surface-field-border text-text-secondary hover:border-accent hover:text-text-primary'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => toggle(opt.value)}\n className=\"sr-only\"\n data-testid={`multi-select-${fieldKey}-${String(opt.value)}`}\n {...(i === 0 ? { 'data-field-key': fieldKey, id: ids.field } : {})}\n />\n {checked && <Check className=\"w-3.5 h-3.5 shrink-0\" strokeWidth={2.5} />}\n {opt.label}\n </label>\n );\n })}\n </div>\n )}\n <FieldError error={error} id={ids.error} />\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { FieldLabel, FieldHelper, FieldError, inputClass } from './FieldChrome';\nimport type { FieldControlProps } from './field-control-props';\nimport type { JsonValue } from './form-cells';\n\nfunction pretty(value: JsonValue): string {\n if (typeof value === 'string') return value;\n if (value === null || value === undefined) return '';\n return JSON.stringify(value, null, 2);\n}\n\nfunction parse(text: string): { ok: true; value: JsonValue } | { ok: false } {\n try {\n return { ok: true, value: JSON.parse(text) as JsonValue };\n } catch {\n return { ok: false };\n }\n}\n\n/**\n * Raw JSON for a list or map field. The text lives here while it is edited;\n * a valid parse emits the parsed value, empty text emits null, and text that\n * does not parse is emitted as-is so the shared pass reports Invalid JSON.\n * Typing never reformats; an outside change to the value resyncs the text.\n */\nexport function JsonField({ value, fieldKey, label, helperText, isRequired, error, onBlur, ids, ariaProps, onChange }: FieldControlProps & {\n value: JsonValue;\n}) {\n const [text, setText] = useState(() => pretty(value));\n\n useEffect(() => {\n if (typeof value === 'string') {\n if (value !== text) setText(value);\n return;\n }\n const parsed = parse(text);\n const same = parsed.ok && JSON.stringify(parsed.value) === JSON.stringify(value ?? null);\n if (!same && !(text.trim() === '' && value === null)) setText(pretty(value));\n // Resync only follows the value; the text is the source while typing.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const lines = text.split('\\n').length;\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={ids.field}>{label}</FieldLabel>\n {helperText && <FieldHelper id={ids.help}>{helperText}</FieldHelper>}\n <textarea\n value={text}\n onChange={(e) => {\n const next = e.target.value;\n setText(next);\n if (next.trim() === '') { onChange(null); return; }\n const parsed = parse(next);\n onChange(parsed.ok ? parsed.value : next);\n }}\n onBlur={onBlur}\n spellCheck={false}\n data-field-key={fieldKey}\n rows={Math.min(14, Math.max(4, lines))}\n className={`${inputClass(!!error)} font-mono text-xs leading-relaxed`}\n {...ariaProps}\n />\n <FieldError error={error} id={ids.error} />\n </div>\n );\n}\n","import { WIDGET_MAP } from '../widgets';\nimport { type ShowIfContext } from '../../../lib/x-lt-show-if';\nimport { resolveFieldOptions } from '../../../lib/x-lt-options';\nimport { resolveCtxPath } from '../../../lib/ctx-path';\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel, FieldHelper, FieldError, inputClass } from './FieldChrome';\nimport { declaredKind, type JsonValue } from './form-cells';\nimport type { FieldControlProps } from './field-control-props';\nimport { SelectField } from './SelectField';\nimport { MultiSelectField } from './MultiSelectField';\nimport { JsonField } from './JsonField';\n\nconst FORMAT_INPUT_TYPES: Record<string, string> = {\n date: 'date',\n 'date-time': 'datetime-local',\n email: 'email',\n uri: 'url',\n};\nconst FORMAT_WIDTH: Record<string, string> = {\n date: 'max-w-48',\n 'date-time': 'max-w-64',\n};\n\n/**\n * Field row: the control follows the field's declared `type` and its tokens;\n * the stored value only fills it. The `data-field-key` attribute and\n * `lt-field-*` ids are load-bearing: the errors panel scroll-and-focus and\n * the test suite target them.\n */\nexport function FieldRow({ fieldKey, value, onChange, onBlur, schema, isRequired, isReadOnly, error, escalationContext, submitAttempted }: {\n fieldKey: string;\n value: JsonValue;\n onChange: (v: JsonValue) => void;\n onBlur?: () => void;\n schema?: Record<string, any> | null;\n isRequired?: boolean;\n isReadOnly?: boolean;\n error?: string;\n escalationContext?: ShowIfContext;\n submitAttempted?: boolean;\n}) {\n const fieldSchema = schema?.properties?.[fieldKey] as Record<string, any> | undefined;\n const label = deriveFieldLabel(fieldKey, fieldSchema);\n const widgetName = fieldSchema?.['x-lt-widget'] as string | undefined;\n const kind = declaredKind(fieldSchema, value);\n\n const fieldId = `lt-field-${fieldKey}`;\n const ids = { field: fieldId, help: `${fieldId}-help`, error: `${fieldId}-error` };\n const helperText = typeof fieldSchema?.description === 'string' && fieldSchema.description.length > 0\n ? fieldSchema.description\n : undefined;\n const ariaProps = {\n id: fieldId,\n 'aria-required': isRequired || undefined,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': error ? ids.error : helperText ? ids.help : undefined,\n } as const;\n const control: FieldControlProps = { fieldKey, label, helperText, isRequired, error, onBlur, ids, ariaProps, onChange };\n\n // Content and embed widgets render even when readOnly; everything else reads as static text.\n const isMarkdown = widgetName === 'markdown' && typeof value === 'string';\n const isAttachment = (widgetName === 'attachment' || widgetName === 'image') && typeof value === 'string';\n const hasRegisteredWidget = !!(widgetName && widgetName in WIDGET_MAP);\n\n if (isReadOnly && !isMarkdown && !isAttachment && !hasRegisteredWidget) {\n const displayValue = value === null ? 'null'\n : typeof value === 'object' ? JSON.stringify(value, null, 2)\n : String(value);\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <p className=\"text-sm text-text-secondary mt-0.5 whitespace-pre-wrap\">{displayValue}</p>\n </div>\n );\n }\n\n if (widgetName === 'json' && (kind === 'array' || kind === 'object')) {\n return <JsonField {...control} value={value} />;\n }\n\n // The widget interface deals in strings; FieldRow owns the object/string\n // boundary by DECLARED type, so a stray string value heals on the next edit.\n if (widgetName && widgetName in WIDGET_MAP) {\n const Widget = WIDGET_MAP[widgetName];\n const widgetRequired = isRequired || fieldSchema?.['x-lt-require-all'] === true;\n const widgetProps = { fieldKey, schema: fieldSchema, escalationContext, isRequired: widgetRequired, submitAttempted, error };\n if (fieldSchema?.type === 'object') {\n const raw = typeof value === 'string'\n ? value\n : typeof value === 'object' && value !== null && !Array.isArray(value)\n ? JSON.stringify(value)\n : '';\n return (\n <Widget\n {...widgetProps}\n value={raw}\n onChange={(next) => { try { onChange(JSON.parse(next) as JsonValue); } catch { onChange(next); } }}\n />\n );\n }\n if (typeof value === 'string') {\n return <Widget {...widgetProps} value={value} onChange={(v) => onChange(v)} />;\n }\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return (\n <Widget\n {...widgetProps}\n value={JSON.stringify(value)}\n onChange={(raw) => { try { onChange(JSON.parse(raw) as JsonValue); } catch { onChange(raw); } }}\n />\n );\n }\n }\n\n // Option lists: the static enum, an inline literal list, or a context path.\n // A list field becomes a multi-select only through its own x-lt-options. An\n // interpolated list that resolves to nothing yet renders disabled and\n // populates when the parent answer lands.\n const options = resolveFieldOptions(fieldSchema, escalationContext as Record<string, unknown> | undefined);\n if (kind === 'array') {\n if (options !== undefined && fieldSchema?.['x-lt-options'] !== undefined) {\n return <MultiSelectField {...control} value={value} options={options} />;\n }\n } else if (options !== undefined && kind !== 'object') {\n return <SelectField {...control} value={value} options={options} nullable={fieldSchema?.['x-lt-nullable'] === true} />;\n }\n\n switch (kind) {\n case 'boolean':\n return (\n <div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={value === true}\n onChange={(e) => { onChange(e.target.checked); onBlur?.(); }}\n className=\"w-3.5 h-3.5 rounded accent-accent\"\n data-field-key={fieldKey}\n {...ariaProps}\n />\n <span className=\"text-2xs font-semibold uppercase tracking-wider text-text-secondary\">\n {label}\n {isRequired && <span className=\"text-status-error ml-0.5\">*</span>}\n </span>\n </label>\n {helperText && <FieldHelper id={ids.help}>{helperText}</FieldHelper>}\n <FieldError error={error} id={ids.error} />\n </div>\n );\n\n case 'number':\n case 'integer':\n // Numbers are short; the input holds a hand-sized width.\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <FieldHelper id={ids.help}>{helperText}</FieldHelper>}\n <input\n type=\"number\"\n value={typeof value === 'number' || typeof value === 'string' ? value : ''}\n onChange={(e) => onChange(parseFloat(e.target.value) || 0)}\n onBlur={onBlur}\n step=\"any\"\n data-field-key={fieldKey}\n className={`${inputClass(!!error)} max-w-48`}\n {...ariaProps}\n />\n <FieldError error={error} id={ids.error} />\n </div>\n );\n\n case 'string':\n return renderText(typeof value === 'string' ? value : value === null || value === undefined ? '' : String(value));\n\n case 'array':\n // Without an option list or the json widget a list is display only.\n if (!Array.isArray(value)) return renderText(value === null || value === undefined ? '' : String(value));\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {value.map((item, i) => (\n <span key={i} className=\"px-2 py-0.5 text-2xs font-mono bg-surface-sunken rounded text-text-secondary\">\n {String(item)}\n </span>\n ))}\n </div>\n </div>\n );\n\n case 'object': {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return renderText(value === null || value === undefined ? '' : String(value));\n }\n const entries = Object.entries(value);\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <div className=\"ml-4 mt-2 pl-4 border-l border-accent-faint space-y-3\">\n {entries.map(([k, v]) => (\n <FieldRow\n key={k}\n fieldKey={k}\n value={v}\n onChange={(updated) => onChange({ ...value, [k]: updated })}\n />\n ))}\n </div>\n </div>\n );\n }\n\n default:\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <p className=\"text-xs text-text-tertiary italic mt-1\">null</p>\n </div>\n );\n }\n\n function renderText(text: string) {\n const format = fieldSchema?.format as string | undefined;\n\n if (format === 'password') {\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <FieldHelper id={ids.help}>{helperText}</FieldHelper>}\n <input\n type=\"password\"\n value={text}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n data-field-key={fieldKey}\n className={inputClass(!!error)}\n autoComplete=\"off\"\n {...ariaProps}\n />\n <FieldError error={error} id={ids.error} />\n </div>\n );\n }\n\n // Emails and urls fill the cell; dates hold a hand-sized width, like numbers.\n if (format && format in FORMAT_INPUT_TYPES) {\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <FieldHelper id={ids.help}>{helperText}</FieldHelper>}\n <input\n type={FORMAT_INPUT_TYPES[format]}\n value={text}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n data-field-key={fieldKey}\n className={`${inputClass(!!error)} ${FORMAT_WIDTH[format] ?? ''}`}\n {...ariaProps}\n />\n <FieldError error={error} id={ids.error} />\n </div>\n );\n }\n\n // Explicit textarea format or long content.\n if (format === 'textarea' || text.length > 80) {\n const staticMax = fieldSchema?.maxLength as number | undefined;\n const dynamicMax = fieldSchema?.['x-lt-max-length'] as string | undefined;\n const dynamicValue = dynamicMax ? Number(resolveCtxPath(dynamicMax, escalationContext as Record<string, unknown> | undefined)) : NaN;\n const resolvedMax = staticMax ?? (Number.isFinite(dynamicValue) ? dynamicValue : undefined);\n const isOverMax = resolvedMax !== undefined && text.length > resolvedMax;\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <FieldHelper id={ids.help}>{helperText}</FieldHelper>}\n <textarea\n value={text}\n onChange={(e) => { onChange(e.target.value); onBlur?.(); }}\n onBlur={onBlur}\n data-field-key={fieldKey}\n className={`${inputClass(!!error)} leading-relaxed`}\n rows={Math.min(6, Math.max(3, Math.ceil(text.length / 60)))}\n {...ariaProps}\n />\n {resolvedMax !== undefined && (\n <p className={`text-2xs mt-0.5 text-right tabular-nums ${isOverMax ? 'text-status-error font-medium' : 'text-text-quaternary'}`}>\n {text.length} / {resolvedMax}\n </p>\n )}\n <FieldError error={error} id={ids.error} />\n </div>\n );\n }\n\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <FieldHelper id={ids.help}>{helperText}</FieldHelper>}\n <input\n type=\"text\"\n value={text}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n data-field-key={fieldKey}\n className={inputClass(!!error)}\n {...ariaProps}\n />\n <FieldError error={error} id={ids.error} />\n </div>\n );\n }\n}\n","import { Fragment } from 'react';\nimport { type JsonValue } from './form-cells';\n\nexport interface DictionaryItem {\n key: string;\n label: string;\n value: JsonValue;\n}\n\n/**\n * Dense definition-list display for read-only label/value facts — the compact\n * alternative to full-height field rows. Labels sit beside values in a\n * max-content column so a run of short facts reads like a spec sheet, not a\n * form.\n *\n * The poster child of the responsive doctrine: geometry follows the\n * CONTAINER. The same pairs render as two pairs per row (≥ @dict-pairs),\n * one label|value pair per row (≥ @dict-inline), or label stacked over\n * value below that — however narrow a side panel squeezes the form.\n * Two-column mode fills ROW BY ROW, so the author's ordering controls\n * pairing (Left Qty beside Right Qty, Left first) in every geometry.\n */\nexport function DictionaryList({ items, columns = 1 }: {\n items: DictionaryItem[];\n columns?: number;\n}) {\n if (items.length === 0) return null;\n\n const gridCols = columns >= 2 && items.length > 1\n ? 'grid-cols-1 @dict-inline:grid-cols-[max-content_1fr] @dict-pairs:grid-cols-[max-content_1fr_max-content_1fr]'\n : 'grid-cols-1 @dict-inline:grid-cols-[max-content_1fr]';\n\n return (\n <div className=\"@container\">\n <dl className={`grid ${gridCols} items-baseline gap-x-6 @dict-pairs:gap-x-8 gap-y-1.5`}>\n {items.map(({ key, label, value }) => (\n <Fragment key={key}>\n {/* Stacked geometry clusters each label with its value. */}\n <dt className=\"text-2xs font-semibold uppercase tracking-wide text-text-secondary mt-2 first:mt-0 @dict-inline:mt-0\">\n {label}\n </dt>\n <dd className=\"text-sm text-text-primary break-words min-w-0\" data-field-key={key}>\n {formatDictionaryValue(value)}\n </dd>\n </Fragment>\n ))}\n </dl>\n </div>\n );\n}\n\nfunction formatDictionaryValue(value: JsonValue): string {\n if (value === null || value === undefined || value === '') return '—';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n","import { type ReactNode } from 'react';\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { DictionaryList } from './DictionaryList';\nimport {\n partitionCells,\n sectionOptionsFor,\n type FormEntry,\n type JsonValue,\n} from './form-cells';\n\n/**\n * One visual section of the resolver form: optional named chrome (accent rule,\n * sunken band, section header), then the section's fields laid out as cells —\n * dictionary runs, 2×2 column groups, and single fields.\n */\nexport function SectionGroup({ name, entries, formSchema, layout, renderField }: {\n name: string | null;\n entries: FormEntry[];\n formSchema: Record<string, any> | null;\n layout: string | undefined;\n renderField: (entry: FormEntry) => ReactNode;\n}) {\n const cells = partitionCells(entries, formSchema, name, layout);\n const options = sectionOptionsFor(formSchema, name);\n const dictionaryColumns = options?.columns ?? (layout === 'two-column' ? 2 : 1);\n\n const dictionaryItems = (dictEntries: FormEntry[]) =>\n dictEntries.map(([key, value]: [string, JsonValue]) => ({\n key,\n label: deriveFieldLabel(key, formSchema?.properties?.[key] as Record<string, unknown> | undefined),\n value,\n }));\n\n const renderCells = () =>\n cells.map((cell, i) => {\n if (cell.kind === 'dictionary') {\n return (\n <div key={`dict-${i}`} className={layout === 'two-column' ? 'col-span-full' : ''}>\n <DictionaryList items={dictionaryItems(cell.entries)} columns={dictionaryColumns} />\n </div>\n );\n }\n if (cell.kind === 'column-group') {\n // One cell of the outer two-column grid holding its own two columns —\n // the single extra nesting level (2×2). The cell is its own container:\n // it measures the half-width it actually gets, not the section.\n return (\n <div key={`group-${cell.name}-${i}`} className=\"@container\">\n <div className=\"grid grid-cols-1 @grp-cols:grid-cols-2 gap-x-4 gap-y-5\">\n {cell.entries.map((entry) => renderField(entry))}\n </div>\n </div>\n );\n }\n return renderField(cell.entry);\n });\n\n return (\n <div\n className={name\n // Sections are distinct surfaces on the page wash — white paper in\n // light themes, the deeper well at night — with field wells stepping\n // away from them. Theme-driven, never a hardcoded hex.\n ? 'border border-surface-border bg-surface-sunken rounded-[var(--lt-radius-section)] p-4 animate-[section-enter_0.25s_ease-out]'\n : ''}\n >\n {name && (\n <p className=\"mb-4 text-[1.40625rem] font-semibold tracking-wider text-heading [font-variant-caps:small-caps]\">\n {name}\n </p>\n )}\n {layout === 'two-column' ? (\n // Geometry follows the container: the grid splits when the SECTION\n // is wide enough, whatever the viewport says.\n <div className=\"@container\">\n <div className=\"grid grid-cols-1 @form-cols:grid-cols-2 gap-x-col-gap gap-y-5\">\n {renderCells()}\n </div>\n </div>\n ) : (\n <div className=\"space-y-5\">\n {renderCells()}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useCallback, type ReactNode } from 'react';\nimport { LockedFormFrame } from './LockedFormFrame';\nimport { HelpCircle } from 'lucide-react';\nimport { evaluateShowIf, isHiddenIfEmpty, type ShowIfContext } from '../../../lib/x-lt-show-if';\nimport { validateField } from '../../../lib/field-validator';\nimport { FieldRow } from './FieldRow';\nimport { SectionGroup } from './SectionGroup';\nimport { type FormEntry, type JsonValue } from './form-cells';\n\n/**\n * Renders a JSON object as an editable form with typed inputs.\n *\n * - Strings → text input (textarea if > 80 chars)\n * - Booleans → toggle switch\n * - Numbers → number input\n * - Null → disabled placeholder\n * - Objects → nested section\n * - Arrays of strings → tag display\n * - Keys starting with `_` → hidden (preserved in output)\n *\n * Calls `onChange` with the full JSON string on every edit.\n */\nexport function ResolverForm({ value, onChange, disabled, submitAttempted, escalationContext, onOpenHelp, onDisabledClick, disabledHint }: {\n value: string;\n onChange: (json: string) => void;\n disabled?: boolean;\n submitAttempted?: boolean;\n escalationContext?: ShowIfContext;\n /** Opens the Instructions panel view; renders a help icon when the schema carries authored help. */\n onOpenHelp?: () => void;\n /** Fires when the user clicks the locked form — the page points them at Claim. */\n onDisabledClick?: () => void;\n /** Cursor-following hint over the locked form naming the state or gesture. */\n disabledHint?: ReactNode;\n}) {\n const [data, setData] = useState<Record<string, JsonValue>>({});\n const [hidden, setHidden] = useState<Record<string, JsonValue>>({});\n const [formSchema, setFormSchema] = useState<Record<string, any> | null>(null);\n const [parseError, setParseError] = useState(false);\n const [touched, setTouched] = useState<Set<string>>(new Set());\n\n // Parse incoming JSON\n useEffect(() => {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n const visible: Record<string, JsonValue> = {};\n const internal: Record<string, JsonValue> = {};\n for (const [k, v] of Object.entries(parsed)) {\n if (k.startsWith('_') || k.startsWith('$')) {\n internal[k] = v as JsonValue;\n } else {\n visible[k] = v as JsonValue;\n }\n }\n setData(visible);\n setHidden(internal);\n setFormSchema(\n internal._form_schema && typeof internal._form_schema === 'object'\n ? internal._form_schema as Record<string, any>\n : null,\n );\n setParseError(false);\n }\n } catch {\n setParseError(true);\n }\n }, [value]);\n\n const emitChange = useCallback((updated: Record<string, JsonValue>) => {\n setData(updated);\n onChange(JSON.stringify({ ...updated, ...hidden }, null, 2));\n }, [hidden, onChange]);\n\n const updateField = useCallback((key: string, val: JsonValue) => {\n emitChange({ ...data, [key]: val });\n }, [data, emitChange]);\n\n const markTouched = useCallback((key: string) => {\n setTouched((prev) => {\n if (prev.has(key)) return prev;\n const next = new Set(prev);\n next.add(key);\n return next;\n });\n }, []);\n\n if (parseError) {\n return (\n <p className=\"text-xs text-status-error\">\n Unable to parse resolver data as form. Use the JSON editor below.\n </p>\n );\n }\n\n const allEntries = Object.entries(data);\n if (allEntries.length === 0) {\n return (\n <p className=\"text-xs text-text-tertiary italic\">\n No resolver fields defined.\n </p>\n );\n }\n\n // Field ordering via x-lt-order\n const fieldOrder = formSchema?.['x-lt-order'] as string[] | undefined;\n const ordered = fieldOrder\n ? [...allEntries].sort((a, b) => {\n const ai = fieldOrder.indexOf(a[0]);\n const bi = fieldOrder.indexOf(b[0]);\n return (ai === -1 ? Infinity : ai) - (bi === -1 ? Infinity : bi);\n })\n : allEntries;\n\n // Merge current form data into the resolver domain so x-lt-showIf: 'resolver.field'\n // reacts to live edits — the parent context only carries the saved row state.\n const liveCtx: ShowIfContext = { ...(escalationContext ?? {}), resolver: data as Record<string, unknown>, input: data as Record<string, unknown> };\n\n // Conditional visibility via x-lt-showIf and x-lt-hide-if-empty\n const entries = ordered.filter(([key, val]) => {\n const fieldSchema = formSchema?.properties?.[key] as Record<string, unknown> | undefined;\n if (!evaluateShowIf(fieldSchema?.['x-lt-showIf'], liveCtx)) return false;\n return !isHiddenIfEmpty(fieldSchema, val);\n });\n\n const requiredFields = new Set(formSchema?.required as string[] ?? []);\n const layout = formSchema?.['x-lt-layout'] as string | undefined;\n const schemaTitle = formSchema?.title as string | undefined;\n const schemaDescription = formSchema?.description as string | undefined;\n const hasAuthoredHelp =\n typeof formSchema?.['x-lt-help'] === 'string' || typeof formSchema?.['x-lt-context'] === 'string';\n\n // Group entries by x-lt-section for labeled visual grouping.\n // Fields without x-lt-section or with an empty value form an unnamed group.\n type Section = { name: string | null; entries: FormEntry[] };\n const sectionGroups: Section[] = [];\n for (const entry of entries) {\n const [key] = entry;\n const fieldSchema = formSchema?.properties?.[key] as Record<string, unknown> | undefined;\n const sectionName = (fieldSchema?.['x-lt-section'] as string | undefined)?.trim() || null;\n const last = sectionGroups[sectionGroups.length - 1];\n if (!last || last.name !== sectionName) {\n sectionGroups.push({ name: sectionName, entries: [entry] });\n } else {\n last.entries.push(entry);\n }\n }\n\n const renderField = ([key, val]: FormEntry) => {\n const fieldSchema = formSchema?.properties?.[key] as Record<string, unknown> | undefined;\n const isReadOnly = fieldSchema?.readOnly === true;\n const span = (fieldSchema?.['x-lt-span'] as number) ?? 1;\n const isReq = requiredFields.has(key);\n const isTouched = touched.has(key) || !!submitAttempted;\n\n const error = validateField(val, fieldSchema, isReq, isTouched, liveCtx as Record<string, unknown>);\n\n return (\n <div\n key={key}\n className={`animate-[field-enter_0.2s_ease-out] ${layout === 'two-column' && span >= 2 ? 'col-span-full' : ''}`}\n >\n <FieldRow\n fieldKey={key}\n value={val}\n onChange={(v) => updateField(key, v)}\n onBlur={() => markTouched(key)}\n schema={formSchema}\n isRequired={isReq}\n isReadOnly={isReadOnly}\n error={error}\n escalationContext={liveCtx}\n submitAttempted={!!submitAttempted}\n />\n </div>\n );\n };\n\n // A locked form stays fully readable — no fade. `inert` (not just\n // pointer-events) locks the body for keyboard and assistive-tech users —\n // fields leave the tab order entirely — and makes it transparent to hit\n // testing, so a click anywhere on the locked form lands on the frame,\n // which reports the interaction and carries the cursor hint.\n // max-w-form: the form holds a readable measure on any monitor.\n const body = (\n <div\n className={disabled ? 'pointer-events-none' : undefined}\n inert={disabled || undefined}\n aria-disabled={disabled || undefined}\n >\n {schemaTitle && (\n <div className=\"mb-1 flex items-center gap-1.5\">\n <h3 className=\"heading-3\">{schemaTitle}</h3>\n {hasAuthoredHelp && onOpenHelp && (\n <button\n type=\"button\"\n onClick={onOpenHelp}\n title=\"Open instructions\"\n aria-label=\"Open instructions\"\n className=\"p-1 rounded-md text-text-tertiary hover:text-accent hover:bg-surface-hover transition-colors\"\n >\n <HelpCircle className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n )}\n {schemaDescription && (\n <p className=\"text-sm text-text-secondary leading-relaxed mb-6\">{schemaDescription}</p>\n )}\n\n <div className=\"space-y-8\">\n {sectionGroups.map((group, i) => (\n <SectionGroup\n key={group.name ?? `__s${i}`}\n name={group.name}\n entries={group.entries}\n formSchema={formSchema}\n layout={layout}\n renderField={renderField}\n />\n ))}\n </div>\n </div>\n );\n\n if (disabled) {\n return (\n <LockedFormFrame hint={disabledHint} onLockedClick={onDisabledClick}>\n {body}\n </LockedFormFrame>\n );\n }\n return <div className=\"pb-8 max-w-form\">{body}</div>;\n}\n"],"names":["LT_ERROR_CODES","isValidationErrorBody","body","seedFormJson","formSchema","prefillPayload","prefill","mapPayloadToForm","initial","key","def","zero","deriveFieldLabel","fieldSchema","title","words","w","isCapsToken","word","ErrorsPanel","errors","schema","focusField","field","el","jsx","jsxs","message","AlertCircle","_a","INTERPOLATION_PATTERN","hasInterpolation","token","resolveCtxPath","path","ctx","dot","root","getDeep","interpolatePath","template","unresolved","concrete","_match","rawPath","value","X_LT_OPTIONS","isScalar","v","isLiteralList","toOption","entry","o","resolveFieldOptions","staticEnum","options","paths","p","miss","sourcePath","resolved","cur","resolveChecklistItems","source","X_LT_DEFAULT_CHECKED","resolveChecklistDefault","currentValue","items","validateRequireAll","mandatory","i","state","incomplete","INVALID_JSON","isJsonWidget","isEditableList","plural","n","noun","validateFieldType","declared","validateFieldConstraints","allowed","validateListConstraints","validateMapConstraints","s","minLength","resolveNumericConstraint","maxLength","pattern","fmt","minimum","exclusiveMinimum","maximum","exclusiveMaximum","minItems","maxItems","itemSchema","err","entries","propertyNames","allowedKeys","unknown","k","ap","valueSchema","staticVal","dynamicPath","domain","domainObj","parts","validateField","isRequired","isTouched","vals","typeError","requireAll","isTruthy","asComparable","resolvePath","expr","HELP_DOMAINS","evaluateShowIf","condition","c","negate","neqAt","eqAt","isNeq","opAt","expected","known","matches","result","isHiddenIfEmpty","X_LT_REQUIRE_ANY","readRequireAnyGroups","raw","group","m","hasRequireAnyValue","X_LT_REQUIRE_SUM","readRequireSumGroups","groups","fields","members","requireSumContribution","validateResolverForm","formValues","properties","required","liveCtx","visible","titles","sum","validateResolverPayload","payload","buildResolverPayload","json","context","parsed","_form_schema","mapFormToPayload","HINT_MS","LockedFormFrame","hint","onLockedClick","children","hintAt","setHintAt","useState","useEffect","timer","handleClick","e","x","prev","Lock","FieldLabel","htmlFor","FieldHelper","id","FieldError","error","inputClass","hasError","selectClass","FileUploadWidget","fieldKey","onChange","inputRef","useRef","accept","label","helperText","handleFile","useCallback","file","reader","hasFile","CodeEditorWidget","language","handleKeyDown","target","start","end","updated","SignatureWidget","canvasRef","isDrawing","setIsDrawing","canvas","img","getPos","rect","scaleX","scaleY","startDraw","pos","draw","endDraw","clear","RichTextWidget","MarkdownWidget","tab","setTab","MarkdownRenderer","t","CHIP_LABEL_MAX","ChecklistWidget","escalationContext","submitAttempted","defaultJson","d","toggle","Fragment","explicitVariant","variant","checkedCount","item","focusId","checked","showItemError","Check","IMAGE_EXT","classify","dataMime","_b","ext","_d","_c","AttachmentWidget","expanded","setExpanded","att","head","Paperclip","Download","ExternalLink","LinkWidget","hrefTemplate","href","interpolateHelp","isInternal","isEmpty","Link","OpenDetailButton","to","className","ArrowUpRight","EM_DASH","resolveSourceId","renderFieldValue","format","formatAgoCompact","EscalationWidget","esc","isLoading","isError","useEscalation","EscalationCardSkeleton","EscalationCard","rowContext","StatusBadge","f","display","resolveQueryFacets","facets","resolveScopedQuery","query","viewerId","base","DEFAULT_COLUMNS","renderValue","interpolatePayload","EscalationListWidget","rawQuery","columns","actions","user","useAuth","scoped","data","useEscalations","schemaNeedsEnvelope","escalations","resolve","useResolveEscalation","rowErrors","setRowErrors","pendingRow","setPendingRow","fireAction","action","rowCtx","ListSkeleton","EmbedTable","onAction","col","_","j","buildInvokeFormContext","metadata","lookup","X_LT_INVOKE","INVOKE_VARIANTS","WHOLE_TOKEN_PATTERN","isPlainObject","isVariant","readInvokeConfig","workflow","confirm","interpolateInvokeValue","whole","out","resolveInvokePayload","config","WORKFLOW_ICONS","NAMES","isWorkflowIcon","GLYPHS","Activity","AlertTriangle","Archive","Award","Barcode","Bell","Bot","Box","Boxes","Building2","Calendar","Camera","ClipboardCheck","ClipboardList","Clock","Cog","Cpu","Database","Droplets","Factory","Fan","FileText","Flag","Flame","Gauge","Hammer","Heart","Image","Key","Layers","Leaf","LifeBuoy","ListChecks","Mail","Map","Megaphone","MessageSquare","Package","Palette","PenTool","Pill","Power","Printer","Receipt","Recycle","RefreshCw","Rocket","Route","Ruler","Scale","ScanBarcode","Scissors","Search","Send","Server","ShieldCheck","ShoppingCart","Snowflake","Sparkles","Star","Store","Sun","Tag","TestTube","Thermometer","Trash2","Truck","Upload","User","Users","Wand2","Warehouse","Wifi","Wrench","Zap","WORKFLOW_ICON_NAMES","WORKFLOW_ICON_KEYS","name","workflowIconGlyph","filterWorkflowIcons","q","WorkflowIcon","icon","tier","strokeWidth","Glyph","VARIANT_ICON","Workflow","RUN_OUTCOMES","workflowEventPattern","workflowId","useRunOutcome","outcome","setOutcome","setPayload","useEventSubscriptions","event","OUTCOME_LABELS","RunOutcomeLabel","tone","RunOutline","TreeNode","RunStatusLine","executionPath","RunResult","JsonViewer","EXECUTIONS_PATH","INVOKE_HOSTS","useInvokeSubmit","selected","run","realIsBuilder","useAccess","mutation","useInvokeWorkflow","setError","violations","setViolations","startedId","setStartedId","reset","resolvedMetadata","ApiError","EventsOffNotice","connected","useEventStatus","RadioTower","FOOTER_CLASS","InvokeFooter","onSubmit","onSubmitAgain","pending","issueCount","onShowIssues","host","follows","submitted","INVOKE_PANEL_KEY","PANEL_WIDTH","INVOKE_PANEL_VIEWS","InvokePanelContent","view","onViewChange","onClose","helpMarkdown","views","HelpCircle","activeId","SlidePanelViews","useInvokeSidePanel","enabled","shell","useShellPanelOptional","setPanel","closePanel","ownerKey","slotOpen","setView","useMemo","buildHelpMarkdown","close","closeRef","RichInvokeForm","submission","lead","inline","setJson","setSubmitAttempted","clientErrors","setClientErrors","parseError","setParseError","inlineView","setInlineView","liveContext","values","panel","showIssues","showInstructions","handleSubmit","inlineIssues","inlineHelp","ResolverForm","DEFAULT_ENVELOPE","inferTypeFromValue","extractDataFields","dataToFields","fieldsToJson","EnvelopeEditor","selectedConfig","isJsonMode","hasFormView","jsonInput","formFields","dataFields","onJsonChange","onToggleMode","onUpdateFormField","onSetFormFields","type","jsonValue","textareaRows","PREFILL_KEY","LegacyInvokeForm","setJsonInput","setFormFields","setIsJsonMode","envelope","templateData","handoff","handleToggleMode","updateFormField","handleInvoke","envelopeMetadata","RunReceipt","onDone","onRetry","failed","running","failure","invokeRunMetadata","mapped","InvokeModalBody","hasLookups","lookupData","useWorkflowLookups","foldWorkflowLookups","missingLookups","l","started","InvokeModal","open","identifierToTitle","Modal","CONTROL_CLASS","InvokeWidget","workflows","isPending","useInvocableWorkflows","status","terminal","ESCALATION_STATUS","InvokeControl","issues","setIssues","confirming","setConfirming","modalOpen","setModalOpen","Icon","fire","activate","openForm","shownIssues","WIDGET_MAP","FIELD_KINDS","declaredKind","DICTIONARY","CONTENT_WIDGETS","sectionOptionsFor","sectionName","all","opts","isDictionaryField","widget","fieldDisplay","sectionDisplay","partitionCells","layout","cells","last","groupName","SelectField","nullable","onBlur","ids","ariaProps","current","hasCurrent","opt","picked","MultiSelectField","next","pretty","parse","text","JsonField","setText","lines","FORMAT_INPUT_TYPES","FORMAT_WIDTH","FieldRow","isReadOnly","widgetName","kind","fieldId","control","isMarkdown","isAttachment","hasRegisteredWidget","displayValue","Widget","widgetRequired","widgetProps","renderText","staticMax","dynamicMax","dynamicValue","resolvedMax","isOverMax","DictionaryList","gridCols","formatDictionaryValue","SectionGroup","renderField","dictionaryColumns","dictionaryItems","dictEntries","renderCells","cell","disabled","onOpenHelp","onDisabledClick","disabledHint","setData","hidden","setHidden","setFormSchema","touched","setTouched","internal","emitChange","updateField","val","markTouched","allEntries","fieldOrder","ordered","a","b","ai","bi","requiredFields","schemaTitle","schemaDescription","hasAuthoredHelp","sectionGroups","span","isReq"],"mappings":"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"}
|