@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.
Files changed (393) hide show
  1. package/README.md +4 -4
  2. package/build/api/escalations/accumulate.d.ts +96 -0
  3. package/build/api/escalations/accumulate.js +516 -0
  4. package/build/api/escalations/index.d.ts +1 -0
  5. package/build/api/escalations/index.js +10 -1
  6. package/build/api/roles.d.ts +4 -5
  7. package/build/api/roles.js +53 -4
  8. package/build/api/scan-codes/execute.js +2 -0
  9. package/build/api/scan-codes/verbs.d.ts +15 -0
  10. package/build/api/scan-codes/verbs.js +65 -0
  11. package/build/api/workflows/config.d.ts +3 -0
  12. package/build/api/workflows/config.js +15 -0
  13. package/build/api/workflows/index.d.ts +1 -0
  14. package/build/api/workflows/index.js +3 -1
  15. package/build/api/workflows/input-lookups.d.ts +16 -0
  16. package/build/api/workflows/input-lookups.js +69 -0
  17. package/build/api/workflows/input-validation.d.ts +4 -3
  18. package/build/api/workflows/input-validation.js +7 -4
  19. package/build/api/workflows/invocable.js +1 -0
  20. package/build/api/workflows/invocation.js +1 -1
  21. package/build/index.js +60 -0
  22. package/build/lib/db/schemas/035_workflow_input_lookups.sql +9 -0
  23. package/build/lib/db/schemas/036_role_portals.sql +12 -0
  24. package/build/routes/escalations/accumulate.d.ts +7 -0
  25. package/build/routes/escalations/accumulate.js +150 -0
  26. package/build/routes/escalations/index.js +5 -0
  27. package/build/routes/workflows/config.js +10 -0
  28. package/build/sdk/index.d.ts +25 -0
  29. package/build/sdk/index.js +8 -0
  30. package/build/services/config/cache.js +1 -0
  31. package/build/services/config/read.js +2 -0
  32. package/build/services/config/sql.d.ts +2 -2
  33. package/build/services/config/sql.js +6 -5
  34. package/build/services/config/write.js +10 -1
  35. package/build/services/escalation/accumulate.d.ts +81 -0
  36. package/build/services/escalation/accumulate.js +154 -0
  37. package/build/services/escalation/index.d.ts +1 -0
  38. package/build/services/escalation/index.js +1 -0
  39. package/build/services/knowledge/index.d.ts +1 -0
  40. package/build/services/knowledge/index.js +1 -0
  41. package/build/services/knowledge/lookup-refs.d.ts +7 -0
  42. package/build/services/knowledge/lookup-refs.js +26 -0
  43. package/build/services/mcp/db-server/schemas.d.ts +2 -2
  44. package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
  45. package/build/services/orchestrator/condition.d.ts +40 -3
  46. package/build/services/orchestrator/condition.js +42 -2
  47. package/build/services/role/index.js +1 -0
  48. package/build/services/role/seed.js +6 -1
  49. package/build/services/role/sql.d.ts +6 -3
  50. package/build/services/role/sql.js +7 -2
  51. package/build/services/role/types.d.ts +38 -10
  52. package/build/services/role/types.js +10 -1
  53. package/build/services/scan-code/validate.js +16 -0
  54. package/build/shared/form-validation/display-only-widgets.d.ts +16 -0
  55. package/build/shared/form-validation/display-only-widgets.js +25 -0
  56. package/build/shared/form-validation/field-validator.d.ts +1 -0
  57. package/build/shared/form-validation/field-validator.js +94 -6
  58. package/build/shared/form-validation/index.d.ts +2 -0
  59. package/build/shared/form-validation/index.js +2 -0
  60. package/build/shared/form-validation/invoke-context.d.ts +4 -3
  61. package/build/shared/form-validation/invoke-context.js +5 -4
  62. package/build/shared/form-validation/x-lt-bind.d.ts +2 -14
  63. package/build/shared/form-validation/x-lt-bind.js +12 -8
  64. package/build/shared/form-validation/x-lt-invoke.d.ts +38 -0
  65. package/build/shared/form-validation/x-lt-invoke.js +103 -0
  66. package/build/shared/form-validation/x-lt-options.d.ts +3 -3
  67. package/build/shared/form-validation/x-lt-options.js +19 -5
  68. package/build/shared/form-validation/x-lt-show-if.d.ts +5 -0
  69. package/build/shared/form-validation/x-lt-show-if.js +10 -0
  70. package/build/start/workers.js +10 -0
  71. package/build/system/mcp-servers/admin/escalations.js +39 -0
  72. package/build/system/mcp-servers/admin/schemas.d.ts +256 -33
  73. package/build/system/mcp-servers/admin/schemas.js +55 -3
  74. package/build/system/mcp-servers/admin/users.js +1 -0
  75. package/build/system/mcp-servers/admin/workflow-config.js +54 -9
  76. package/build/system/mcp-servers/admin/workflows.js +9 -7
  77. package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
  78. package/build/system/mcp-servers/docs.js +4 -0
  79. package/build/system/mcp-servers/human-queue-schemas.d.ts +85 -0
  80. package/build/system/mcp-servers/human-queue-schemas.js +19 -1
  81. package/build/system/mcp-servers/human-queue.d.ts +2 -0
  82. package/build/system/mcp-servers/human-queue.js +77 -0
  83. package/build/system/seed/tool-manifests-admin.d.ts +1509 -227
  84. package/build/system/seed/tool-manifests-admin.js +8 -4
  85. package/build/system/seed/tool-manifests-escalation.d.ts +174 -0
  86. package/build/system/seed/tool-manifests-escalation.js +56 -0
  87. package/build/tsconfig.tsbuildinfo +1 -1
  88. package/build/types/config.d.ts +4 -0
  89. package/build/types/escalation.d.ts +52 -0
  90. package/build/types/escalation.js +29 -1
  91. package/build/types/index.d.ts +2 -2
  92. package/build/types/index.js +3 -1
  93. package/build/types/scan-code.d.ts +24 -0
  94. package/build/types/scan-code.js +9 -0
  95. package/build/types/startup.d.ts +26 -0
  96. package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js → AdminDashboard-uarpHB88.js} +2 -2
  97. package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js.map → AdminDashboard-uarpHB88.js.map} +1 -1
  98. package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js → AgentConfigPage-BcUaDD5E.js} +6 -6
  99. package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js.map → AgentConfigPage-BcUaDD5E.js.map} +1 -1
  100. package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js → AgentDetailPage-BaZBhK6i.js} +3 -3
  101. package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js.map → AgentDetailPage-BaZBhK6i.js.map} +1 -1
  102. package/dashboard/dist/assets/AgentsPage-CuVFSDc4.js +2 -0
  103. package/dashboard/dist/assets/{AgentsPage-D77JeViQ.js.map → AgentsPage-CuVFSDc4.js.map} +1 -1
  104. package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js +2 -0
  105. package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js.map +1 -0
  106. package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js → BotPicker-CClMby6B.js} +2 -2
  107. package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js.map → BotPicker-CClMby6B.js.map} +1 -1
  108. package/dashboard/dist/assets/BulkAssignModal-BL8FRgkN.js +2 -0
  109. package/dashboard/dist/assets/{BulkAssignModal-BXiJnlqt.js.map → BulkAssignModal-BL8FRgkN.js.map} +1 -1
  110. package/dashboard/dist/assets/CapabilitiesPage-D53ogPor.js +2 -0
  111. package/dashboard/dist/assets/{CapabilitiesPage-D9TC2iKy.js.map → CapabilitiesPage-D53ogPor.js.map} +1 -1
  112. package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js → CollapsibleSection-ow8jpbtD.js} +2 -2
  113. package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js.map → CollapsibleSection-ow8jpbtD.js.map} +1 -1
  114. package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js → ConfirmDeleteModal-CeEDt9iJ.js} +2 -2
  115. package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js.map → ConfirmDeleteModal-CeEDt9iJ.js.map} +1 -1
  116. package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js → CountdownTimer-CSqyZMCG.js} +2 -2
  117. package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js.map → CountdownTimer-CSqyZMCG.js.map} +1 -1
  118. package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js → CredentialsPage-Dx7SxA23.js} +2 -2
  119. package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js.map → CredentialsPage-Dx7SxA23.js.map} +1 -1
  120. package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js → CronLabel-LYPxpvNN.js} +2 -2
  121. package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js.map → CronLabel-LYPxpvNN.js.map} +1 -1
  122. package/dashboard/dist/assets/DataTable-spX1dFyb.js +2 -0
  123. package/dashboard/dist/assets/DataTable-spX1dFyb.js.map +1 -0
  124. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js → DropZone-f1o-GLM8.js} +2 -2
  125. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js.map → DropZone-f1o-GLM8.js.map} +1 -1
  126. package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js → ElapsedCell-BZJTSm9N.js} +2 -2
  127. package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js.map → ElapsedCell-BZJTSm9N.js.map} +1 -1
  128. package/dashboard/dist/assets/EntityTimelinePanel-0wIIW2en.js +2 -0
  129. package/dashboard/dist/assets/{EntityTimelinePanel-1lT3jkCM.js.map → EntityTimelinePanel-0wIIW2en.js.map} +1 -1
  130. package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js → EscalationListSchemaPage-CoYvtMzj.js} +3 -3
  131. package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js.map → EscalationListSchemaPage-CoYvtMzj.js.map} +1 -1
  132. package/dashboard/dist/assets/EscalationListView-DWFHPufv.js +2 -0
  133. package/dashboard/dist/assets/EscalationListView-DWFHPufv.js.map +1 -0
  134. package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js → EscalationSchemaPage-C9Xu_A25.js} +3 -3
  135. package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js.map → EscalationSchemaPage-C9Xu_A25.js.map} +1 -1
  136. package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js +2 -0
  137. package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js.map +1 -0
  138. package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js +2 -0
  139. package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js.map +1 -0
  140. package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js → EscalationsOverview-CW57FaP9.js} +2 -2
  141. package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js.map → EscalationsOverview-CW57FaP9.js.map} +1 -1
  142. package/dashboard/dist/assets/{EventTable-KEC3YWBf.js → EventTable-D1ctWhKf.js} +2 -2
  143. package/dashboard/dist/assets/{EventTable-KEC3YWBf.js.map → EventTable-D1ctWhKf.js.map} +1 -1
  144. package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js → FilterBar-C-iur-Nj.js} +2 -2
  145. package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js.map → FilterBar-C-iur-Nj.js.map} +1 -1
  146. package/dashboard/dist/assets/GraphInvokePage-CcA_44M4.js +2 -0
  147. package/dashboard/dist/assets/{GraphInvokePage-DV7Y0fe2.js.map → GraphInvokePage-CcA_44M4.js.map} +1 -1
  148. package/dashboard/dist/assets/HomePage-Dc085ghJ.js +2 -0
  149. package/dashboard/dist/assets/{HomePage-G785SWcW.js.map → HomePage-Dc085ghJ.js.map} +1 -1
  150. package/dashboard/dist/assets/ListToolbar-h_ziBt4O.js +2 -0
  151. package/dashboard/dist/assets/{ListToolbar-zPVYPg3W.js.map → ListToolbar-h_ziBt4O.js.map} +1 -1
  152. package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js → McpOverview-qXXhbNWV.js} +2 -2
  153. package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js.map → McpOverview-qXXhbNWV.js.map} +1 -1
  154. package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js → McpQueryDetailPage-SEzSbZrd.js} +2 -2
  155. package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js.map → McpQueryDetailPage-SEzSbZrd.js.map} +1 -1
  156. package/dashboard/dist/assets/McpQueryPage-Cy0V0kv9.js +2 -0
  157. package/dashboard/dist/assets/{McpQueryPage-CNSNMagY.js.map → McpQueryPage-Cy0V0kv9.js.map} +1 -1
  158. package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js → McpRunDetailPage-DjJO5vSb.js} +2 -2
  159. package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js.map → McpRunDetailPage-DjJO5vSb.js.map} +1 -1
  160. package/dashboard/dist/assets/McpRunsPage-BfjiJ8mM.js +2 -0
  161. package/dashboard/dist/assets/{McpRunsPage-B6rb5QBf.js.map → McpRunsPage-BfjiJ8mM.js.map} +1 -1
  162. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js → NamespacePill-DADRJOUl.js} +2 -2
  163. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js.map → NamespacePill-DADRJOUl.js.map} +1 -1
  164. package/dashboard/dist/assets/OperationsPage-dJcER0T_.js +3 -0
  165. package/dashboard/dist/assets/OperationsPage-dJcER0T_.js.map +1 -0
  166. package/dashboard/dist/assets/OperatorDashboard-zCkW4eqk.js +2 -0
  167. package/dashboard/dist/assets/{OperatorDashboard-DBOscDnf.js.map → OperatorDashboard-zCkW4eqk.js.map} +1 -1
  168. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js → PageHeader-Csq434-v.js} +2 -2
  169. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js.map → PageHeader-Csq434-v.js.map} +1 -1
  170. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js → PageHeaderWithStats-CSnk1p5A.js} +2 -2
  171. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js.map → PageHeaderWithStats-CSnk1p5A.js.map} +1 -1
  172. package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js → PersonaDetailPage-Cx6L3Jvu.js} +2 -2
  173. package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js.map → PersonaDetailPage-Cx6L3Jvu.js.map} +1 -1
  174. package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js → PersonasPage-DOgGUlJl.js} +2 -2
  175. package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js.map → PersonasPage-DOgGUlJl.js.map} +1 -1
  176. package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js +2 -0
  177. package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js.map +1 -0
  178. package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js → ProcessDetailPage-BFcFSDUv.js} +2 -2
  179. package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js.map → ProcessDetailPage-BFcFSDUv.js.map} +1 -1
  180. package/dashboard/dist/assets/ProcessesListPage-BaHV2cXp.js +2 -0
  181. package/dashboard/dist/assets/{ProcessesListPage-5NnysKFC.js.map → ProcessesListPage-BaHV2cXp.js.map} +1 -1
  182. package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js +7 -0
  183. package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js.map +1 -0
  184. package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js +8 -0
  185. package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js.map +1 -0
  186. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js → RolePill-BafrASDX.js} +2 -2
  187. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js.map → RolePill-BafrASDX.js.map} +1 -1
  188. package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js → RolesPage-DSqqKPbv.js} +2 -2
  189. package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js.map → RolesPage-DSqqKPbv.js.map} +1 -1
  190. package/dashboard/dist/assets/RunAsSelector-B29iWwel.js +2 -0
  191. package/dashboard/dist/assets/{RunAsSelector-BwZTJ4Yj.js.map → RunAsSelector-B29iWwel.js.map} +1 -1
  192. package/dashboard/dist/assets/ScanCodesPage-S8aAJfnC.js +2 -0
  193. package/dashboard/dist/assets/{ScanCodesPage-FiYIYB-m.js.map → ScanCodesPage-S8aAJfnC.js.map} +1 -1
  194. package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js → ScanSchemeDetailPage-CUBRAtmJ.js} +2 -2
  195. package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js.map → ScanSchemeDetailPage-CUBRAtmJ.js.map} +1 -1
  196. package/dashboard/dist/assets/ScanStationPage-R9t1-CeQ.js +2 -0
  197. package/dashboard/dist/assets/{ScanStationPage-8CdOtbCD.js.map → ScanStationPage-R9t1-CeQ.js.map} +1 -1
  198. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js → ScopeBadge-b6MIBiYD.js} +2 -2
  199. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js.map → ScopeBadge-b6MIBiYD.js.map} +1 -1
  200. package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js → StickyPagination-CkW_A507.js} +2 -2
  201. package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js.map → StickyPagination-CkW_A507.js.map} +1 -1
  202. package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js → StreamMessageDetail-yzWX0wac.js} +2 -2
  203. package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js.map → StreamMessageDetail-yzWX0wac.js.map} +1 -1
  204. package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js → SwimlaneTimeline-Cf4DXFxj.js} +2 -2
  205. package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js.map → SwimlaneTimeline-Cf4DXFxj.js.map} +1 -1
  206. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js → TagInput-ZrIIrEUP.js} +2 -2
  207. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js.map → TagInput-ZrIIrEUP.js.map} +1 -1
  208. package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js → TaskDetailPage-DCDcEps9.js} +2 -2
  209. package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js.map → TaskDetailPage-DCDcEps9.js.map} +1 -1
  210. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js → TaskQueuePill-DkQ1uc6y.js} +2 -2
  211. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js.map → TaskQueuePill-DkQ1uc6y.js.map} +1 -1
  212. package/dashboard/dist/assets/TasksListPage-BBATgpf7.js +2 -0
  213. package/dashboard/dist/assets/{TasksListPage-BQNaSzCn.js.map → TasksListPage-BBATgpf7.js.map} +1 -1
  214. package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js → TimeAgo-CSNVEjch.js} +2 -2
  215. package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js.map → TimeAgo-CSNVEjch.js.map} +1 -1
  216. package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js → TimestampCell-Du1nBrPn.js} +2 -2
  217. package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js.map → TimestampCell-Du1nBrPn.js.map} +1 -1
  218. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js → ToolPill-Baxm02L6.js} +2 -2
  219. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js.map → ToolPill-Baxm02L6.js.map} +1 -1
  220. package/dashboard/dist/assets/ToolTestPanel-CF-h_5Rg.js +2 -0
  221. package/dashboard/dist/assets/{ToolTestPanel-DvuLFWqQ.js.map → ToolTestPanel-CF-h_5Rg.js.map} +1 -1
  222. package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js → TopicDetailPage-Dr1UmWcp.js} +3 -3
  223. package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js.map → TopicDetailPage-Dr1UmWcp.js.map} +1 -1
  224. package/dashboard/dist/assets/TopicsPage-CUUo-Ylf.js +2 -0
  225. package/dashboard/dist/assets/{TopicsPage-h-oyTeEJ.js.map → TopicsPage-CUUo-Ylf.js.map} +1 -1
  226. package/dashboard/dist/assets/{UserName-BceRCeDF.js → UserName-kBh1dc39.js} +2 -2
  227. package/dashboard/dist/assets/{UserName-BceRCeDF.js.map → UserName-kBh1dc39.js.map} +1 -1
  228. package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js → WorkflowExecutionPage-CCRSbnDx.js} +2 -2
  229. package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js.map → WorkflowExecutionPage-CCRSbnDx.js.map} +1 -1
  230. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js → WorkflowPill-ZepbO_ny.js} +2 -2
  231. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js.map → WorkflowPill-ZepbO_ny.js.map} +1 -1
  232. package/dashboard/dist/assets/WorkflowsDashboard-BNQVvyek.js +2 -0
  233. package/dashboard/dist/assets/{WorkflowsDashboard-B0r2lQXk.js.map → WorkflowsDashboard-BNQVvyek.js.map} +1 -1
  234. package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js → WorkflowsOverview-DswubNJN.js} +2 -2
  235. package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js.map → WorkflowsOverview-DswubNJN.js.map} +1 -1
  236. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js → YamlWorkflowDetailPage-Cw9Dlmup.js} +11 -11
  237. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js.map → YamlWorkflowDetailPage-Cw9Dlmup.js.map} +1 -1
  238. package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js → YamlWorkflowsPage-DB8xnIXy.js} +2 -2
  239. package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js.map → YamlWorkflowsPage-DB8xnIXy.js.map} +1 -1
  240. package/dashboard/dist/assets/{agents-BvmLCk4h.js → agents-BwEnf6N9.js} +2 -2
  241. package/dashboard/dist/assets/{agents-BvmLCk4h.js.map → agents-BwEnf6N9.js.map} +1 -1
  242. package/dashboard/dist/assets/{bots-f_tyhl4I.js → bots-CCmJTT2u.js} +2 -2
  243. package/dashboard/dist/assets/{bots-f_tyhl4I.js.map → bots-CCmJTT2u.js.map} +1 -1
  244. package/dashboard/dist/assets/{capabilities-DNo5bqLx.js → capabilities-BZHgp_nh.js} +2 -2
  245. package/dashboard/dist/assets/{capabilities-DNo5bqLx.js.map → capabilities-BZHgp_nh.js.map} +1 -1
  246. package/dashboard/dist/assets/{constants-BHkpVaqx.js → constants-CeBBTzf5.js} +2 -2
  247. package/dashboard/dist/assets/{constants-BHkpVaqx.js.map → constants-CeBBTzf5.js.map} +1 -1
  248. package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js → controlplane-CyfwUlFA.js} +2 -2
  249. package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js.map → controlplane-CyfwUlFA.js.map} +1 -1
  250. package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js +2 -0
  251. package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js.map +1 -0
  252. package/dashboard/dist/assets/index-3gbd5neL.js +67 -0
  253. package/dashboard/dist/assets/index-3gbd5neL.js.map +1 -0
  254. package/dashboard/dist/assets/index-BAAVTyZ-.js +2 -0
  255. package/dashboard/dist/assets/{index-DL83W7Gu.js.map → index-BAAVTyZ-.js.map} +1 -1
  256. package/dashboard/dist/assets/{index-CsKiRyhy.js → index-BC6Jenlo.js} +2 -2
  257. package/dashboard/dist/assets/{index-CsKiRyhy.js.map → index-BC6Jenlo.js.map} +1 -1
  258. package/dashboard/dist/assets/index-C7KHqOTQ.js +2 -0
  259. package/dashboard/dist/assets/{index-D7ESqn22.js.map → index-C7KHqOTQ.js.map} +1 -1
  260. package/dashboard/dist/assets/index-CDrqqbSR.js +3 -0
  261. package/dashboard/dist/assets/index-CDrqqbSR.js.map +1 -0
  262. package/dashboard/dist/assets/index-CVwzCZ43.js +2 -0
  263. package/dashboard/dist/assets/{index-DvxxrFBo.js.map → index-CVwzCZ43.js.map} +1 -1
  264. package/dashboard/dist/assets/index-CaGF6TCC.js +2 -0
  265. package/dashboard/dist/assets/index-CaGF6TCC.js.map +1 -0
  266. package/dashboard/dist/assets/index-ClVbfe4z.js +13 -0
  267. package/dashboard/dist/assets/index-ClVbfe4z.js.map +1 -0
  268. package/dashboard/dist/assets/{index-DWse7ERF.js → index-CuVkSmj5.js} +2 -2
  269. package/dashboard/dist/assets/{index-DWse7ERF.js.map → index-CuVkSmj5.js.map} +1 -1
  270. package/dashboard/dist/assets/{index-PcyGjmBm.js → index-DAuX_PlL.js} +2 -2
  271. package/dashboard/dist/assets/{index-PcyGjmBm.js.map → index-DAuX_PlL.js.map} +1 -1
  272. package/dashboard/dist/assets/{index-e2X-s0EQ.js → index-DBWS5QL8.js} +2 -2
  273. package/dashboard/dist/assets/{index-e2X-s0EQ.js.map → index-DBWS5QL8.js.map} +1 -1
  274. package/dashboard/dist/assets/index-DIWCI6HC.js +2 -0
  275. package/dashboard/dist/assets/{index-BNZknxFY.js.map → index-DIWCI6HC.js.map} +1 -1
  276. package/dashboard/dist/assets/{index-C-Xr2V3F.js → index-DZ8X_Gp4.js} +2 -2
  277. package/dashboard/dist/assets/{index-C-Xr2V3F.js.map → index-DZ8X_Gp4.js.map} +1 -1
  278. package/dashboard/dist/assets/index-Dh8MJl3L.css +1 -0
  279. package/dashboard/dist/assets/{knowledge-Coo6CKzo.js → knowledge-CqyLhUMg.js} +2 -2
  280. package/dashboard/dist/assets/{knowledge-Coo6CKzo.js.map → knowledge-CqyLhUMg.js.map} +1 -1
  281. package/dashboard/dist/assets/{mcp-Cz5eFnP_.js → mcp-Cvu6bFYH.js} +2 -2
  282. package/dashboard/dist/assets/{mcp-Cz5eFnP_.js.map → mcp-Cvu6bFYH.js.map} +1 -1
  283. package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js → mcp-query-qC6A3e9l.js} +2 -2
  284. package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js.map → mcp-query-qC6A3e9l.js.map} +1 -1
  285. package/dashboard/dist/assets/metadata-display-COo3mMCr.js +2 -0
  286. package/dashboard/dist/assets/metadata-display-COo3mMCr.js.map +1 -0
  287. package/dashboard/dist/assets/{personas-C2-LgpHQ.js → personas-BKN_lJuV.js} +2 -2
  288. package/dashboard/dist/assets/{personas-C2-LgpHQ.js.map → personas-BKN_lJuV.js.map} +1 -1
  289. package/dashboard/dist/assets/{pipelines-TuXQvUA-.js → pipelines-BldIfv85.js} +2 -2
  290. package/dashboard/dist/assets/{pipelines-TuXQvUA-.js.map → pipelines-BldIfv85.js.map} +1 -1
  291. package/dashboard/dist/assets/{tasks-OUzpu__z.js → tasks-B-Uay8uL.js} +2 -2
  292. package/dashboard/dist/assets/{tasks-OUzpu__z.js.map → tasks-B-Uay8uL.js.map} +1 -1
  293. package/dashboard/dist/assets/{topics-B8bdrBaW.js → topics-438EQogt.js} +2 -2
  294. package/dashboard/dist/assets/{topics-B8bdrBaW.js.map → topics-438EQogt.js.map} +1 -1
  295. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js +2 -0
  296. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js.map +1 -0
  297. package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js → useDebouncedValue-Cw8hYZ8y.js} +2 -2
  298. package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js.map → useDebouncedValue-Cw8hYZ8y.js.map} +1 -1
  299. package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js → useNamespace-D1218GQ8.js} +2 -2
  300. package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js.map → useNamespace-D1218GQ8.js.map} +1 -1
  301. package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js → useYamlActivityEvents-BAQf_y_U.js} +2 -2
  302. package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js.map → useYamlActivityEvents-BAQf_y_U.js.map} +1 -1
  303. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js → vendor-icons-B7OcUM6b.js} +2 -2
  304. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js.map → vendor-icons-B7OcUM6b.js.map} +1 -1
  305. package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js → yaml-workflows-CN01gEB0.js} +2 -2
  306. package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js.map → yaml-workflows-CN01gEB0.js.map} +1 -1
  307. package/dashboard/dist/index.html +3 -3
  308. package/docs/accumulator.md +113 -0
  309. package/docs/api/http/escalations.md +89 -0
  310. package/docs/api/http/roles.md +1 -0
  311. package/docs/api/http/workflows.md +28 -1
  312. package/docs/api/mcp/admin.md +40 -4
  313. package/docs/api/sdk/escalations.md +91 -0
  314. package/docs/api/sdk/roles.md +2 -0
  315. package/docs/architecture.md +1 -1
  316. package/docs/code-owned-configuration.md +3 -2
  317. package/docs/dashboard.md +11 -5
  318. package/docs/hitl/design.md +1 -1
  319. package/docs/hitl/escalation.md +37 -1
  320. package/docs/hitl/form.md +12 -7
  321. package/docs/hitl/invoke-form.md +10 -3
  322. package/docs/hitl/lookups.md +21 -0
  323. package/docs/hitl/pinned-views.md +4 -0
  324. package/docs/hitl/portal.md +97 -0
  325. package/docs/hitl/resolution.md +41 -0
  326. package/docs/hitl/x-lt-embed.md +1 -1
  327. package/docs/hitl/x-lt-invoke.md +95 -0
  328. package/docs/hitl/x-lt-list-schema.md +3 -1
  329. package/docs/hitl/x-lt-validation.md +50 -3
  330. package/docs/hitl/x-lt-widget.md +22 -0
  331. package/docs/hitl-guide.md +12 -2
  332. package/docs/scan-codes.md +15 -2
  333. package/docs/sdk.md +1 -1
  334. package/docs/workflows.md +2 -2
  335. package/package.json +4 -2
  336. package/dashboard/dist/assets/AgentsPage-D77JeViQ.js +0 -2
  337. package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js +0 -2
  338. package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js.map +0 -1
  339. package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js +0 -2
  340. package/dashboard/dist/assets/CapabilitiesPage-D9TC2iKy.js +0 -2
  341. package/dashboard/dist/assets/DataTable-7C7riavf.js +0 -2
  342. package/dashboard/dist/assets/DataTable-7C7riavf.js.map +0 -1
  343. package/dashboard/dist/assets/EntityTimelinePanel-1lT3jkCM.js +0 -2
  344. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js +0 -2
  345. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js.map +0 -1
  346. package/dashboard/dist/assets/GraphInvokePage-DV7Y0fe2.js +0 -2
  347. package/dashboard/dist/assets/HomePage-G785SWcW.js +0 -2
  348. package/dashboard/dist/assets/ListToolbar-zPVYPg3W.js +0 -2
  349. package/dashboard/dist/assets/McpQueryPage-CNSNMagY.js +0 -2
  350. package/dashboard/dist/assets/McpRunsPage-B6rb5QBf.js +0 -2
  351. package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js +0 -3
  352. package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js.map +0 -1
  353. package/dashboard/dist/assets/OperatorDashboard-DBOscDnf.js +0 -2
  354. package/dashboard/dist/assets/ProcessesListPage-5NnysKFC.js +0 -2
  355. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js +0 -2
  356. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js.map +0 -1
  357. package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js +0 -8
  358. package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js.map +0 -1
  359. package/dashboard/dist/assets/RunAsSelector-BwZTJ4Yj.js +0 -2
  360. package/dashboard/dist/assets/ScanCodesPage-FiYIYB-m.js +0 -2
  361. package/dashboard/dist/assets/ScanStationPage-8CdOtbCD.js +0 -2
  362. package/dashboard/dist/assets/TasksListPage-BQNaSzCn.js +0 -2
  363. package/dashboard/dist/assets/ToolTestPanel-DvuLFWqQ.js +0 -2
  364. package/dashboard/dist/assets/TopicsPage-h-oyTeEJ.js +0 -2
  365. package/dashboard/dist/assets/WorkflowsDashboard-B0r2lQXk.js +0 -2
  366. package/dashboard/dist/assets/escalation-columns-DIigeTOK.js +0 -2
  367. package/dashboard/dist/assets/escalation-columns-DIigeTOK.js.map +0 -1
  368. package/dashboard/dist/assets/index-BMlQYOE1.js +0 -67
  369. package/dashboard/dist/assets/index-BMlQYOE1.js.map +0 -1
  370. package/dashboard/dist/assets/index-BNZknxFY.js +0 -2
  371. package/dashboard/dist/assets/index-Bpvfr4OW.css +0 -1
  372. package/dashboard/dist/assets/index-CegPUKpc.js +0 -3
  373. package/dashboard/dist/assets/index-CegPUKpc.js.map +0 -1
  374. package/dashboard/dist/assets/index-D7ESqn22.js +0 -2
  375. package/dashboard/dist/assets/index-DL83W7Gu.js +0 -2
  376. package/dashboard/dist/assets/index-DPLssnMW.js +0 -6
  377. package/dashboard/dist/assets/index-DPLssnMW.js.map +0 -1
  378. package/dashboard/dist/assets/index-DoETPlJP.js +0 -11
  379. package/dashboard/dist/assets/index-DoETPlJP.js.map +0 -1
  380. package/dashboard/dist/assets/index-DvxxrFBo.js +0 -2
  381. package/dashboard/dist/assets/metadata-display--TzK0REC.js +0 -2
  382. package/dashboard/dist/assets/metadata-display--TzK0REC.js.map +0 -1
  383. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js +0 -2
  384. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js.map +0 -1
  385. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js +0 -2
  386. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js.map +0 -1
  387. package/docs/compilation.md +0 -152
  388. package/docs/compiler.md +0 -311
  389. package/docs/contributing.md +0 -56
  390. package/docs/design-principles.md +0 -244
  391. package/docs/schema-exchange.md +0 -173
  392. package/docs/self-test.md +0 -106
  393. 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
- ```
@@ -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.