@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
package/docs/compiler.md
DELETED
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
# The Workflow Compiler
|
|
2
|
-
|
|
3
|
-
You wrote a durable workflow. It works. `proxyActivities`, `sleep`, `condition` — the durable API is productive and familiar. But under the hood, the durable engine replays the entire workflow function on every wake-up. Sleep three times in a ten-step workflow? Steps 1–3 replay on wake one. Steps 1–6 replay on wake two. Steps 1–9 replay on wake three. The replay is deterministic — it skips completed activities — but the function still executes from the top every time.
|
|
4
|
-
|
|
5
|
-
The compiled YAML DAG does the same work without replay. Each step fires exactly once. State flows explicitly between activities through input mappings. No function re-execution, no replay loop, no wasted cycles.
|
|
6
|
-
|
|
7
|
-
`ltc` is the compiler. It reads your TypeScript source and produces an equivalent YAML DAG. Write procedural because it's productive. Run the DAG because it's fast.
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## The Analogy
|
|
12
|
-
|
|
13
|
-
`tsc` compiles TypeScript to JavaScript. You write in the language that's expressive. You run the artifact that's efficient. The source is authoritative — you edit it, test it, review it. The compiled output is what actually executes.
|
|
14
|
-
|
|
15
|
-
`ltc` does the same for workflows:
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
TypeScript source ltc compile YAML DAG
|
|
19
|
-
(developer-friendly) ──────────────────→ (execution-optimized)
|
|
20
|
-
|
|
21
|
-
assembly-line.ts → assembly-line.compiled.yaml
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
The `.ts` file is the spec. The `.compiled.yaml` is the optimized execution. Both live in the repo. A reviewer reads both side-by-side and traces every line of orchestration logic to its DAG equivalent.
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## Quick Start
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
npm install -g @hotmeshio/long-tail
|
|
32
|
-
export ANTHROPIC_API_KEY=sk-ant-...
|
|
33
|
-
|
|
34
|
-
ltc compile workflows/basic-echo/index.ts
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Output:
|
|
38
|
-
|
|
39
|
-
```
|
|
40
|
-
✓ index.ts → workflows/basic-echo/index.compiled.yaml
|
|
41
|
-
1 activities · 2 inputs (message, sleepSeconds) · topic: basic.echo
|
|
42
|
-
|
|
43
|
-
Compiled 1 workflow in 18.1s
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
The compiled YAML appears adjacent to the source file.
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Before and After
|
|
51
|
-
|
|
52
|
-
### The source (procedural)
|
|
53
|
-
|
|
54
|
-
```typescript
|
|
55
|
-
import { Durable } from '@hotmeshio/hotmesh';
|
|
56
|
-
import * as activities from './activities';
|
|
57
|
-
|
|
58
|
-
const { echo } = Durable.workflow.proxyActivities<typeof activities>({
|
|
59
|
-
activities,
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
export async function basicEcho(envelope: LTEnvelope): Promise<any> {
|
|
63
|
-
const { message = 'Hello, Long Tail!', sleepSeconds = 1 } = envelope.data;
|
|
64
|
-
|
|
65
|
-
// 1. Durable sleep — the engine replays to this point on wake-up
|
|
66
|
-
await Durable.workflow.sleep(`${sleepSeconds} seconds`);
|
|
67
|
-
|
|
68
|
-
// 2. Activity call — replayed as a no-op if already completed
|
|
69
|
-
const echoResult = await echo({ message });
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
type: 'return' as const,
|
|
73
|
-
data: { ...echoResult, sleepSeconds, userId: envelope.lt?.userId },
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
This function executes three times: once on initial invocation, once when the sleep timer fires, and once when the echo activity completes. Each time, the engine replays from the top, skipping completed steps. For a two-step workflow this is fine. For a twenty-step workflow with multiple sleeps, the replay cost compounds.
|
|
79
|
-
|
|
80
|
-
### The compiled output (DAG)
|
|
81
|
-
|
|
82
|
-
```yaml
|
|
83
|
-
app:
|
|
84
|
-
id: longtail
|
|
85
|
-
version: '1'
|
|
86
|
-
graphs:
|
|
87
|
-
- subscribes: basic.echo
|
|
88
|
-
expire: 300
|
|
89
|
-
input:
|
|
90
|
-
schema:
|
|
91
|
-
type: object
|
|
92
|
-
properties:
|
|
93
|
-
message:
|
|
94
|
-
type: string
|
|
95
|
-
default: 'Hello, Long Tail!'
|
|
96
|
-
sleepSeconds:
|
|
97
|
-
type: number
|
|
98
|
-
default: 1
|
|
99
|
-
activities:
|
|
100
|
-
trigger_m7qz:
|
|
101
|
-
type: trigger
|
|
102
|
-
output:
|
|
103
|
-
schema:
|
|
104
|
-
type: object
|
|
105
|
-
properties:
|
|
106
|
-
message: { type: string }
|
|
107
|
-
sleepSeconds: { type: number }
|
|
108
|
-
|
|
109
|
-
delay_m7qz:
|
|
110
|
-
type: hook
|
|
111
|
-
sleep: '{trigger_m7qz.output.data.sleepSeconds}'
|
|
112
|
-
|
|
113
|
-
echo_m7qz:
|
|
114
|
-
type: worker
|
|
115
|
-
topic: basic.echo
|
|
116
|
-
input:
|
|
117
|
-
maps:
|
|
118
|
-
message: '{trigger_m7qz.output.data.message}'
|
|
119
|
-
workflowName: echo
|
|
120
|
-
|
|
121
|
-
transitions:
|
|
122
|
-
trigger_m7qz:
|
|
123
|
-
- to: delay_m7qz
|
|
124
|
-
delay_m7qz:
|
|
125
|
-
- to: echo_m7qz
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### The mapping
|
|
129
|
-
|
|
130
|
-
| TypeScript | YAML | What happens |
|
|
131
|
-
|---|---|---|
|
|
132
|
-
| `envelope.data` destructuring | `trigger` activity with input schema | Inputs declared as typed schema with defaults |
|
|
133
|
-
| `Durable.workflow.sleep(N)` | `hook` activity with `sleep` field | Engine sets a timer; no replay on wake |
|
|
134
|
-
| `await echo({ message })` | `worker` activity with input `maps` | Worker fires once; result stored in job hash |
|
|
135
|
-
| `return { data: ... }` | `job.maps` on the final activity | Output fields plucked from activity results |
|
|
136
|
-
|
|
137
|
-
Each step executes exactly once. The `sleep` hook pauses the DAG. When the timer fires, execution resumes at `echo_m7qz` — not from the top of the function.
|
|
138
|
-
|
|
139
|
-
---
|
|
140
|
-
|
|
141
|
-
## Discovery
|
|
142
|
-
|
|
143
|
-
Point `ltc` at a directory and it finds workflow files automatically:
|
|
144
|
-
|
|
145
|
-
```bash
|
|
146
|
-
ltc compile examples/workflows/ --dry-run
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
```
|
|
150
|
-
Found 10 workflows:
|
|
151
|
-
|
|
152
|
-
● assembly-line/index.ts
|
|
153
|
-
Function: assemblyLine · HotMesh Durable
|
|
154
|
-
Control flow: startChild, condition
|
|
155
|
-
|
|
156
|
-
● basic-echo/index.ts
|
|
157
|
-
Function: basicEcho · HotMesh Durable
|
|
158
|
-
Activities: echo
|
|
159
|
-
Control flow: sleep
|
|
160
|
-
|
|
161
|
-
● basic-signal/index.ts
|
|
162
|
-
Function: basicSignal · HotMesh Durable
|
|
163
|
-
Activities: ltCreateEscalation, processApproval
|
|
164
|
-
Control flow: conditional
|
|
165
|
-
|
|
166
|
-
● kitchen-sink/index.ts
|
|
167
|
-
Function: kitchenSink · HotMesh Durable
|
|
168
|
-
Activities: greet, fetchData, transformData, notifyComplete
|
|
169
|
-
Control flow: sleep, executeLT
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### What the scanner looks for
|
|
173
|
-
|
|
174
|
-
| Pattern | Classification |
|
|
175
|
-
|---|---|
|
|
176
|
-
| `proxyActivities` / `Durable.workflow.proxyActivities` | HotMesh Durable workflow |
|
|
177
|
-
| `@temporalio/workflow` import | Temporal workflow |
|
|
178
|
-
| `sleep`, `condition`, `signal` | Control flow primitives |
|
|
179
|
-
| `startChild`, `executeChild`, `executeLT` | Composition (parent workflow) |
|
|
180
|
-
| Exported async function | Workflow entry point |
|
|
181
|
-
|
|
182
|
-
Files in `node_modules/`, `build/`, `dist/`, and test files (`*.test.ts`, `*.spec.ts`) are excluded.
|
|
183
|
-
|
|
184
|
-
---
|
|
185
|
-
|
|
186
|
-
## How Compilation Works
|
|
187
|
-
|
|
188
|
-
The compiler is not an AST parser. It uses the LLM to translate orchestration logic, grounded by structural metadata extracted from the source.
|
|
189
|
-
|
|
190
|
-
1. **Read source** — file or inline string
|
|
191
|
-
2. **Extract metadata** — lightweight regex extraction: activity names, durable primitives, envelope fields, import paths, control flow markers (loops, Promise.all, conditionals, escalation)
|
|
192
|
-
3. **Resolve activities** — if the source imports activity modules, the compiler reads them too and includes them in the LLM context
|
|
193
|
-
4. **LLM translation** — the source code, extracted metadata, and the full HotMesh YAML specification are sent to the LLM. Temperature 0. Up to 3 retry attempts on parse failure.
|
|
194
|
-
5. **Fix patterns** — known LLM anti-patterns in YAML pipe expressions are corrected deterministically
|
|
195
|
-
|
|
196
|
-
The metadata extraction is intentionally lightweight — regex, not a TypeScript AST. It gives the LLM structural hints (which functions are activities, which primitives are used) without requiring `ts-morph` or the TypeScript compiler API as a dependency.
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## Composition
|
|
201
|
-
|
|
202
|
-
When a workflow uses `startChild` or `executeChild`, the compiler resolves the child workflow source through imports and compiles children first (leaf-first ordering). The parent's compiled YAML references each child by topic using the `await` activity type — the same mechanism used by the Pipeline Designer's Plan Build mode.
|
|
203
|
-
|
|
204
|
-
```
|
|
205
|
-
parent.ts ──→ parent.compiled.yaml
|
|
206
|
-
└─ startChild(worker)
|
|
207
|
-
└─ worker.ts ──→ worker.compiled.yaml
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
All compiled workflows in the same composition share the same `app.id` namespace, enabling cross-graph invocation.
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
## Three Surfaces
|
|
215
|
-
|
|
216
|
-
The compiler is the same function regardless of how you invoke it.
|
|
217
|
-
|
|
218
|
-
### CLI
|
|
219
|
-
|
|
220
|
-
```bash
|
|
221
|
-
ltc compile workflows/assembly-line.ts
|
|
222
|
-
ltc compile src/workflows/ --dry-run
|
|
223
|
-
ltc compile --model claude-sonnet-4-6
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
### HTTP API
|
|
227
|
-
|
|
228
|
-
```bash
|
|
229
|
-
curl -X POST http://localhost:3000/api/yaml-workflows/from-durable \
|
|
230
|
-
-H "Authorization: Bearer $TOKEN" \
|
|
231
|
-
-H "Content-Type: application/json" \
|
|
232
|
-
-d '{
|
|
233
|
-
"source": "export async function basicEcho(envelope) { ... }",
|
|
234
|
-
"workflow_name": "basicEcho",
|
|
235
|
-
"name": "basic_echo"
|
|
236
|
-
}'
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
### SDK
|
|
240
|
-
|
|
241
|
-
```typescript
|
|
242
|
-
import { createClient } from '@hotmeshio/long-tail/sdk';
|
|
243
|
-
|
|
244
|
-
const lt = createClient({ auth: { userId: 'system' } });
|
|
245
|
-
|
|
246
|
-
const result = await lt.yamlWorkflows.compileDurable({
|
|
247
|
-
source: fs.readFileSync('workflows/assembly-line.ts', 'utf-8'),
|
|
248
|
-
workflow_name: 'assemblyLine',
|
|
249
|
-
name: 'assembly_line',
|
|
250
|
-
});
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
The CLI writes `.compiled.yaml` files to disk. The HTTP and SDK surfaces store the compiled workflow in the database and return the record. All three use the same underlying `compileDurableToYaml()` function.
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
## Configuration
|
|
258
|
-
|
|
259
|
-
| Variable | Default | Description |
|
|
260
|
-
|---|---|---|
|
|
261
|
-
| `ANTHROPIC_API_KEY` | — | Required for Claude models |
|
|
262
|
-
| `OPENAI_API_KEY` | — | Required for OpenAI models |
|
|
263
|
-
| `LT_LLM_MODEL_PRIMARY` | `claude-sonnet-4-6` | Model used for compilation |
|
|
264
|
-
| `LT_LLM_BASE_URL` | — | Custom endpoint for OpenAI-compatible models |
|
|
265
|
-
|
|
266
|
-
The CLI loads `.env` automatically if present in the current directory.
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## CLI Reference
|
|
271
|
-
|
|
272
|
-
```
|
|
273
|
-
Usage: ltc compile [options] [target]
|
|
274
|
-
|
|
275
|
-
Compile durable TypeScript workflows to YAML DAGs
|
|
276
|
-
|
|
277
|
-
Arguments:
|
|
278
|
-
target File or directory to compile (default: current directory)
|
|
279
|
-
|
|
280
|
-
Options:
|
|
281
|
-
--dry-run Show discovered workflows without compiling
|
|
282
|
-
-o, --output <dir> Output directory (default: adjacent to source file)
|
|
283
|
-
--model <model> LLM model to use (default: claude-sonnet-4-6)
|
|
284
|
-
--function <name> Workflow function name (auto-detected if omitted)
|
|
285
|
-
-h, --help Display help
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
### Examples
|
|
289
|
-
|
|
290
|
-
```bash
|
|
291
|
-
# Compile a single file
|
|
292
|
-
ltc compile workflows/basic-echo/index.ts
|
|
293
|
-
|
|
294
|
-
# Scan and compile all workflows in a directory
|
|
295
|
-
ltc compile src/workflows/
|
|
296
|
-
|
|
297
|
-
# Compile everything in the current directory
|
|
298
|
-
ltc compile
|
|
299
|
-
|
|
300
|
-
# Preview what would be compiled
|
|
301
|
-
ltc compile examples/workflows/ --dry-run
|
|
302
|
-
|
|
303
|
-
# Use a specific model
|
|
304
|
-
ltc compile workflows/complex.ts --model claude-opus-4-6
|
|
305
|
-
|
|
306
|
-
# Write output to a separate directory
|
|
307
|
-
ltc compile workflows/ -o compiled/
|
|
308
|
-
|
|
309
|
-
# Compile a specific function from a multi-export file
|
|
310
|
-
ltc compile workflows/multi.ts --function assemblyLine
|
|
311
|
-
```
|
package/docs/contributing.md
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
# Contributing
|
|
2
|
-
|
|
3
|
-
## Running the Demo
|
|
4
|
-
|
|
5
|
-
The repository includes a working server with example workflows (`reviewContent`, `kitchenSink`, `basicEcho`, and more), Postgres, NATS, and a React dashboard.
|
|
6
|
-
|
|
7
|
-
### Prerequisites
|
|
8
|
-
|
|
9
|
-
- [Docker](https://docs.docker.com/get-docker/)
|
|
10
|
-
|
|
11
|
-
### Run
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
git clone https://github.com/hotmeshio/long-tail.git
|
|
15
|
-
cd long-tail
|
|
16
|
-
docker compose up
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
Postgres, NATS, the API server, and the dashboard start together. The dashboard is built during the Docker image build and served as static assets. Migrations run automatically.
|
|
20
|
-
|
|
21
|
-
Default ports are `3000` (API), `5432` (Postgres), `4222`/`8222` (NATS). Override any of them:
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
LT_PORT=3001 LT_PG_PORT=5433 LT_NATS_PORT=4223 docker compose up
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Testing
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
# Start Postgres and NATS
|
|
31
|
-
docker compose up -d postgres nats
|
|
32
|
-
|
|
33
|
-
# Run all tests
|
|
34
|
-
npm test
|
|
35
|
-
|
|
36
|
-
# Run workflow tests
|
|
37
|
-
npm run test:workflows
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Development Setup
|
|
41
|
-
|
|
42
|
-
1. Fork the repository and clone your fork
|
|
43
|
-
2. Install dependencies: `npm install`
|
|
44
|
-
3. Start infrastructure: `docker compose up -d postgres nats`
|
|
45
|
-
4. Run tests to verify your setup: `npm test`
|
|
46
|
-
|
|
47
|
-
## Pull Requests
|
|
48
|
-
|
|
49
|
-
- Create a feature branch from `main`
|
|
50
|
-
- Keep changes focused — one concern per PR
|
|
51
|
-
- Add or update tests for any new behavior
|
|
52
|
-
- Run `npm test` before submitting
|
|
53
|
-
|
|
54
|
-
## Issues
|
|
55
|
-
|
|
56
|
-
Report bugs and request features at [github.com/hotmeshio/long-tail/issues](https://github.com/hotmeshio/long-tail/issues).
|
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
# Design Principles
|
|
2
|
-
|
|
3
|
-
The design system behind the dashboard and every generated x-lt-* form. One
|
|
4
|
-
token vocabulary, one value discipline, one form doctrine — the built-in pages
|
|
5
|
-
and the forms customers author render from the same rules.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. Tokens are the system
|
|
10
|
-
|
|
11
|
-
Every color, size, radius, and spacing knob flows through a `--lt-*` CSS
|
|
12
|
-
variable declared in `dashboard/src/styles/globals.css`. Nothing paints a raw
|
|
13
|
-
hex. A registered stylesheet (`branding.customCss` / `branding.themes` in
|
|
14
|
-
`start()`) can therefore restyle the entire product — including full dark
|
|
15
|
-
themes — with zero source changes. Midnight is the standing proof: if a color
|
|
16
|
-
escapes the token system, it glows in the dark.
|
|
17
|
-
|
|
18
|
-
Deliberate exceptions, each carrying a stated constraint in code: the
|
|
19
|
-
signature pad (the exported PNG is a document — ink on white), customer
|
|
20
|
-
iframes (their HTML assumes a white canvas), OAuth brand marks, theme-picker
|
|
21
|
-
swatches, and overlay scrims.
|
|
22
|
-
|
|
23
|
-
## 2. Color — the value discipline
|
|
24
|
-
|
|
25
|
-
Chroma is spent, not spread.
|
|
26
|
-
|
|
27
|
-
- **Surfaces are near-neutral; lines carry the hue.** Hover fills and section
|
|
28
|
-
bands stay a whisper off-neutral, but the thin structure — borders,
|
|
29
|
-
dividers, outlines, field rules — carries a clear, light tint of the accent
|
|
30
|
-
so the frame reads as thematic. Chroma never lands on a large rectangle — a
|
|
31
|
-
colored slab makes every real accent invisible — but a hairline may glow.
|
|
32
|
-
- **One elevation logic, both polarities.** The page carries the base wash
|
|
33
|
-
(a light theme tint by day, the deep shade at night); sections and sheets
|
|
34
|
-
are distinct surfaces on it (white paper by day, the deeper well at
|
|
35
|
-
night); fields are wells that step AWAY from their surface (darker than
|
|
36
|
-
white by day, lighter than the shade at night). Light is Midnight
|
|
37
|
-
inverted — never a flat white page with white sections.
|
|
38
|
-
- **The accent appears in small doses**: links, buttons, checks, pills,
|
|
39
|
-
section labels, focus states. Because it is scarce, it reads as "act here."
|
|
40
|
-
Icon links follow the same rule in every theme: clickable glyphs (toolbar
|
|
41
|
-
icons, view toggles) render through the `.icon-link` recipe — muted accent
|
|
42
|
-
at rest, full accent on hover — never a neutral text tone, which reads as
|
|
43
|
-
a static mark.
|
|
44
|
-
- **Dark themes are the same principle, inverted** — near-black neutral
|
|
45
|
-
surfaces, the identical accent discipline. Midnight is not a different
|
|
46
|
-
design; it is the same design at night.
|
|
47
|
-
- **Status is information, not decoration.** Text-safe status tokens
|
|
48
|
-
(≥4.5:1) for words; brighter `-graphic` variants for dots, bars, and
|
|
49
|
-
charts (≥3:1).
|
|
50
|
-
- **The focus fill is the one ambient accent moment** — entering a field
|
|
51
|
-
earns the tint.
|
|
52
|
-
|
|
53
|
-
## 3. Text — black speaks, color acts
|
|
54
|
-
|
|
55
|
-
- One neutral near-black ramp shared by every light theme: `#171717` body,
|
|
56
|
-
`#373737` labels, `#646464` helper, `#8C8C8C` low-emphasis meta. Labels are
|
|
57
|
-
never theme-colored — a tinted label is indistinguishable from a link.
|
|
58
|
-
If it's colored, it must be clickable.
|
|
59
|
-
- **11px floor.** No informative text below `text-2xs`. Quaternary tone is
|
|
60
|
-
reserved for large or decorative text (≥3:1).
|
|
61
|
-
- **Headings**: near-black (`#333333`), small caps, weight 300, generous
|
|
62
|
-
sizes — `heading-1` (2.125rem) / `heading-2` (1.5rem) / `heading-3`
|
|
63
|
-
(1.25rem). The size carries hierarchy; the light weight keeps it elegant.
|
|
64
|
-
Mono identifiers (role keys, workflow types, topics) stay code-styled,
|
|
65
|
-
never small-caps.
|
|
66
|
-
|
|
67
|
-
## 4. Fields and controls
|
|
68
|
-
|
|
69
|
-
- **One recipe** (`.field/.input/.select/.textarea`): white body, a light
|
|
70
|
-
accent-tinted border, soft radius (`--lt-radius-field`), border deepens to
|
|
71
|
-
accent and fill takes the theme tint on focus. Every field-like control uses
|
|
72
|
-
the recipe or the tokens — no bespoke field styling.
|
|
73
|
-
- **Width follows content, capped by the measure:**
|
|
74
|
-
- Generated forms hold a readable measure (`max-w-form`, 56rem). A wide
|
|
75
|
-
monitor gets margin, never a 2000px input.
|
|
76
|
-
- Selects size to their content, floored at 16rem for presence — a
|
|
77
|
-
one-word choice never stretches across the page. The floor yields to
|
|
78
|
-
the cell (`min(16rem, 100%)`): CSS lets min-width beat max-width, so
|
|
79
|
-
a bare floor would overflow a narrow column.
|
|
80
|
-
- Number and date inputs hold a hand-sized width (12rem; datetimes
|
|
81
|
-
16rem) — fixed-length values never stretch to the measure.
|
|
82
|
-
- Text, textarea, email, and url fill their cell — prose-length content
|
|
83
|
-
deserves the measure.
|
|
84
|
-
- Widgets follow the same split. Prose surfaces (code editor, markdown,
|
|
85
|
-
rich text, uploads) fill the cell. The signature pad holds its natural
|
|
86
|
-
document proportion (25rem, the 400×150 export) — the PNG is the
|
|
87
|
-
artifact, and stretching the pad stretches the document.
|
|
88
|
-
- **Decisions are never checkboxes.** A decision is an enum opening on an
|
|
89
|
-
explicit disabled **Choose…** placeholder. The user picks; nothing is an
|
|
90
|
-
implicit first option, and there is no way back to unchosen.
|
|
91
|
-
- Checkboxes exist only inside checklists — confirmations of work, not
|
|
92
|
-
choices.
|
|
93
|
-
- **Item length and selection mode determine list geometry.**
|
|
94
|
-
Sentence-length require-all *rituals* read top-down, one per row — the
|
|
95
|
-
vertical stack is deliberate. Short pick-any *tags* (reasons, categories)
|
|
96
|
-
flow horizontally as selectable chips: thumb-sized pills that wrap,
|
|
97
|
-
selection in solid accent. Never stack six two-word items into six
|
|
98
|
-
full-width rows — endless y with an empty x is a dead layout.
|
|
99
|
-
- **Required is marked, everywhere.** Every required input — text, select,
|
|
100
|
-
number, upload, checkbox, or checkbox group — carries the red asterisk at
|
|
101
|
-
its label. A require-all checklist is required by definition and marked
|
|
102
|
-
like the rest. Required or optional is never a guess.
|
|
103
|
-
|
|
104
|
-
## 5. Layout — the canonical shell
|
|
105
|
-
|
|
106
|
-
```
|
|
107
|
-
┌──────────────── Header (full width) ────────────────┐
|
|
108
|
-
│ left nav │ main viewport │ right panel │
|
|
109
|
-
└──────────────── EventFeed (full width) ─────────────┘
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
- Header and event-stream footer span the full width. The left nav and the
|
|
113
|
-
global right SlidePanel are flex siblings of the main viewport — content
|
|
114
|
-
narrows when either opens; nothing overlays it. Pages fill the right panel
|
|
115
|
-
via `useShellPanel()`. The DocsDrawer is the full-screen overlay for
|
|
116
|
-
markdown.
|
|
117
|
-
- iPad (768–1366) is the floor target: page padding clamps down, the sidebar
|
|
118
|
-
auto-collapses below 1024, nothing depends on hover alone.
|
|
119
|
-
- Structure comes from typography, whitespace, and divider lines — never
|
|
120
|
-
rounded-bordered cards, never gradient fades. Sections sit on a barely
|
|
121
|
-
sunken band with an accent left rule.
|
|
122
|
-
|
|
123
|
-
## 6. The form doctrine
|
|
124
|
-
|
|
125
|
-
The reference implementation is `examples/workflows/acme-stations` — mimic it.
|
|
126
|
-
|
|
127
|
-
1. **Facts first, as a dictionary.** Read-only work-item facts render as a dense
|
|
128
|
-
label/value spec sheet (`x-lt-display: "dictionary"`), not form rows.
|
|
129
|
-
2. **One explicit decision** gates the form. Until it is made the page shows
|
|
130
|
-
facts, the decision, nothing else — even sign-off waits.
|
|
131
|
-
3. **Linear reveals.** Each outcome fades in exactly the section it needs
|
|
132
|
-
(`x-lt-showIf` value matches). The enter animation makes the
|
|
133
|
-
cause-and-effect visible in time: click Reject, watch the report arrive.
|
|
134
|
-
4. **The left/right law.** Left and Right always render side by side, Left
|
|
135
|
-
first — as dictionary pairs (two-column dictionaries fill row by row, so
|
|
136
|
-
consecutive items share a row) and as inputs (`x-lt-column-group` pairs
|
|
137
|
-
them in one cell, the 2×2).
|
|
138
|
-
5. **Checklists**: standard confirmations may arrive pre-checked
|
|
139
|
-
(formDefaults) — the standard is the default and the resolver unchecks
|
|
140
|
-
what isn't true. The work item's own custom work arrives unchecked; those
|
|
141
|
-
clicks are the record. `x-lt-require-all` guards completion.
|
|
142
|
-
6. **Every input carries a `title` and one instructional `description`
|
|
143
|
-
line — no input goes without.** The anatomy is fixed and identical for
|
|
144
|
-
every input kind: label, instruction, control, in that order. The
|
|
145
|
-
anatomy is a declared column, never an accident of width — the label is
|
|
146
|
-
a block, so a narrow control (a number, a short select) can never ride
|
|
147
|
-
sideways beside it when the instruction line is absent. Inputs that
|
|
148
|
-
share a row carry instructions of similar length so their controls align
|
|
149
|
-
across the row; a bare input beside an instructed one is a consistency
|
|
150
|
-
defect, in both content and alignment. The WHY — reference tables,
|
|
151
|
-
consequences, vocabulary — lives in `x-lt-help` beside the form.
|
|
152
|
-
7. **Sign-off last.** A short audit note with a live counter.
|
|
153
|
-
8. Hidden conditional fields still submit their defaults; resolver contracts
|
|
154
|
-
treat empty as absent.
|
|
155
|
-
|
|
156
|
-
## 7. Copy — the economist tone
|
|
157
|
-
|
|
158
|
-
The escalation `description` is the detail page's title: a short noun
|
|
159
|
-
phrase naming the artifact — "Final QA — ACME-1042 · wgt-8127" —
|
|
160
|
-
never a sentence, never an instruction, never a status report.
|
|
161
|
-
|
|
162
|
-
Say what to do. Speak to the actor, in the imperative, always: "Pick Reject
|
|
163
|
-
to file a report" — never "Reject files a report." The system is never the
|
|
164
|
-
subject of an instruction, and passive voice never appears. One line per
|
|
165
|
-
instruction; consequences ride the same sentence ("Resolve — the widget moves
|
|
166
|
-
on to assembly"). Reference tables over paragraphs. Never preachy, never
|
|
167
|
-
motivational, never "you're the first human — do well." State what a thing is
|
|
168
|
-
and does, never what it lacks.
|
|
169
|
-
|
|
170
|
-
## 8. Motion
|
|
171
|
-
|
|
172
|
-
Motion explains causality; it never decorates. Reveals fade in tied to the
|
|
173
|
-
choice that caused them (200–300ms enter). Errors shake once and settle.
|
|
174
|
-
Panels slide as flex siblings so content reflows rather than being covered.
|
|
175
|
-
Nothing loops, nothing floats.
|
|
176
|
-
|
|
177
|
-
## 9. Accessibility floors
|
|
178
|
-
|
|
179
|
-
- Body and label text ≥4.5:1; large/meta text and graphics ≥3:1.
|
|
180
|
-
- Every input is label-associated; errors and helpers ride
|
|
181
|
-
`aria-describedby`; the errors panel click-focuses the field
|
|
182
|
-
(`data-field-key` is a contract).
|
|
183
|
-
- Disabled forms use `inert` — out of the tab order, not just grayed.
|
|
184
|
-
- `color-scheme` follows the theme so native controls match the surface.
|
|
185
|
-
|
|
186
|
-
## 10. Responsive — geometry follows the container
|
|
187
|
-
|
|
188
|
-
1. **Geometry follows the container, not the viewport.** Side panels, the
|
|
189
|
-
facet drawer, and the nav rail narrow containers below any viewport
|
|
190
|
-
breakpoint — a `md:`/`lg:` variant on a content grid is a defect.
|
|
191
|
-
Viewport variants are lawful only in the shell frame (header, nav rail),
|
|
192
|
-
where the viewport is the container.
|
|
193
|
-
2. **Thresholds are named container tokens** (tailwind `containers`):
|
|
194
|
-
`@dict-inline` 22rem · `@grp-cols` 26rem · `@form-cols` 34rem ·
|
|
195
|
-
`@filters` 72rem · `@dict-pairs` 38rem · `@table` 48rem. Components use
|
|
196
|
-
the names, never raw rem values. A fold threshold is sized for the
|
|
197
|
-
HEAVIEST content its component carries — escaping to the condensed
|
|
198
|
-
format early beats ever letting a bar wrap.
|
|
199
|
-
3. **The dictionary reflow ladder** — the poster child. The same
|
|
200
|
-
label/value pairs render as: two pairs per row at `@dict-pairs`; one
|
|
201
|
-
label|value pair per row at `@dict-inline`; label stacked over value
|
|
202
|
-
below. Pairing order never changes across geometries.
|
|
203
|
-
4. **A table row IS a dictionary.** Below `@table`, tables fold into dense
|
|
204
|
-
console-style cards — identity columns become the title line, the rest
|
|
205
|
-
fold into label/value pairs on the dictionary ladder. **Tables never
|
|
206
|
-
scroll horizontally** — master lists use `layout="fixed"` so a table
|
|
207
|
-
physically cannot outgrow its container. Fixed columns cut both ways:
|
|
208
|
-
**cell content never bleeds into a neighbor** — every cell clips
|
|
209
|
-
(`overflow-hidden` on the `td`) and every text-bearing pill or label
|
|
210
|
-
truncates with an ellipsis (`max-w-full` + `truncate`), carrying the
|
|
211
|
-
full value in `title` for hover reveal.
|
|
212
|
-
5. **The column budget, disclosed both ways.** The floor set — identity,
|
|
213
|
-
owner, urgency, age — always renders. Enrichment columns (workflow,
|
|
214
|
-
metadata facets) return only when the table's container has room
|
|
215
|
-
(`showFrom: '@split' | '@wall'`); below that they fold into card pairs.
|
|
216
|
-
The list is a jumping-off spot: the ELK-style drill the whole product
|
|
217
|
-
surfaces.
|
|
218
|
-
6. **Refining is a ROW gesture, never a cell tax.** Cells spend their full
|
|
219
|
-
width on data. One always-visible magnifier per row (or board card)
|
|
220
|
-
opens the refine dialog: the row's metadata-bound facts as full-width
|
|
221
|
-
touch rows, multi-select ANDing facets, with filter-in-role /
|
|
222
|
-
search-everywhere / add-to-filters actions. Per-cell icon pairs are a
|
|
223
|
-
defect — twelve columns × two icons starves every value into an
|
|
224
|
-
ellipsis. Hover-only affordances do not exist on the floor.
|
|
225
|
-
7. **Disclosure order**: drop priority-3 columns, fold priority-2 into
|
|
226
|
-
pairs, keep priority-1 always.
|
|
227
|
-
8. **Touch parity**: every hover-only affordance has a tap equivalent —
|
|
228
|
-
the iPad floor has no hover.
|
|
229
|
-
9. **The header diet ladder** (below lg): mark-only logo, icon+count links,
|
|
230
|
-
secondary actions fold into the user menu, the nav rail becomes a
|
|
231
|
-
drawer behind a menu button.
|
|
232
|
-
10. **Sticky elements are never containers** — `container-type` breaks
|
|
233
|
-
`position: sticky` on the same element; wrap the geometry element
|
|
234
|
-
instead.
|
|
235
|
-
|
|
236
|
-
## 11. Never
|
|
237
|
-
|
|
238
|
-
Raw hex in components. Chroma on large surfaces. Theme-colored labels.
|
|
239
|
-
Text below 11px. Decisions as checkboxes. Implicit select defaults.
|
|
240
|
-
Full-width one-word inputs. Tag lists stacked as rows. Unmarked required
|
|
241
|
-
fields. Inputs without instruction lines. Passive voice or system-voice
|
|
242
|
-
copy. Horizontal scroll. Viewport breakpoints on content grids. Cards and
|
|
243
|
-
gradient fades. "Back to X" links. Polling. Preachy copy. Customer names —
|
|
244
|
-
the showcase brand is always Acme.
|