@hotmeshio/long-tail 0.14.3 → 0.16.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 (305) hide show
  1. package/README.md +23 -9
  2. package/build/api/escalations/create.js +18 -0
  3. package/build/api/escalations/index.d.ts +1 -0
  4. package/build/api/escalations/index.js +3 -1
  5. package/build/api/escalations/lookups.d.ts +20 -0
  6. package/build/api/escalations/lookups.js +90 -0
  7. package/build/api/escalations/metadata.d.ts +1 -1
  8. package/build/api/escalations/metadata.js +4 -4
  9. package/build/api/escalations/resolve.d.ts +1 -1
  10. package/build/api/escalations/resolve.js +6 -6
  11. package/build/api/knowledge.d.ts +9 -0
  12. package/build/api/knowledge.js +24 -0
  13. package/build/bin/ltc.js +10 -0
  14. package/build/index.d.ts +1 -1
  15. package/build/index.js +3 -2
  16. package/build/lib/cli/commands/escalations.d.ts +3 -0
  17. package/build/lib/cli/commands/escalations.js +25 -0
  18. package/build/lib/cli/commands/knowledge.d.ts +5 -0
  19. package/build/lib/cli/commands/knowledge.js +17 -2
  20. package/build/lib/cli/scanner.js +2 -0
  21. package/build/lib/db/schemas/033_knowledge_versions.sql +33 -0
  22. package/build/routes/escalations/single.js +10 -0
  23. package/build/routes/knowledge.js +35 -2
  24. package/build/sdk/index.d.ts +5 -0
  25. package/build/sdk/index.js +3 -0
  26. package/build/services/diagnostics/patterns.js +1 -1
  27. package/build/services/escalation/crud.d.ts +3 -3
  28. package/build/services/escalation/crud.js +9 -2
  29. package/build/services/escalation/resolver-validation.js +6 -0
  30. package/build/services/escalation/sql.d.ts +1 -1
  31. package/build/services/escalation/sql.js +1 -1
  32. package/build/services/knowledge/index.d.ts +18 -0
  33. package/build/services/knowledge/index.js +52 -0
  34. package/build/services/knowledge/lookup-cache.d.ts +29 -0
  35. package/build/services/knowledge/lookup-cache.js +94 -0
  36. package/build/services/knowledge/sql.d.ts +2 -0
  37. package/build/services/knowledge/sql.js +14 -0
  38. package/build/services/mcp/server-tools.js +30 -0
  39. package/build/services/orchestrator/condition.d.ts +33 -13
  40. package/build/services/orchestrator/condition.js +41 -14
  41. package/build/services/yaml-workflow/durable-compiler/parser.js +4 -1
  42. package/build/shared/form-validation/ctx-path.d.ts +12 -0
  43. package/build/shared/form-validation/ctx-path.js +56 -0
  44. package/build/shared/form-validation/field-validator.d.ts +4 -2
  45. package/build/shared/form-validation/field-validator.js +25 -19
  46. package/build/shared/form-validation/index.d.ts +3 -0
  47. package/build/shared/form-validation/index.js +3 -0
  48. package/build/shared/form-validation/validate-resolver-payload.d.ts +2 -0
  49. package/build/shared/form-validation/validate-resolver-payload.js +19 -0
  50. package/build/shared/form-validation/x-lt-help.d.ts +1 -1
  51. package/build/shared/form-validation/x-lt-help.js +2 -1
  52. package/build/shared/form-validation/x-lt-options.d.ts +7 -0
  53. package/build/shared/form-validation/x-lt-options.js +63 -0
  54. package/build/shared/form-validation/x-lt-require-sum.d.ts +30 -0
  55. package/build/shared/form-validation/x-lt-require-sum.js +59 -0
  56. package/build/system/activities/knowledge.d.ts +3 -0
  57. package/build/system/activities/knowledge.js +5 -2
  58. package/build/system/activities/sql.d.ts +6 -10
  59. package/build/system/activities/sql.js +105 -49
  60. package/build/system/mcp-servers/admin/schemas.d.ts +4 -4
  61. package/build/system/mcp-servers/knowledge.js +23 -2
  62. package/build/system/seed/tool-manifests-escalation.js +12 -0
  63. package/build/system/seed/tool-manifests-knowledge.d.ts +36 -0
  64. package/build/system/seed/tool-manifests-knowledge.js +15 -1
  65. package/build/tsconfig.tsbuildinfo +1 -1
  66. package/build/types/escalation.d.ts +37 -3
  67. package/build/types/escalation.js +42 -2
  68. package/dashboard/dist/assets/{AdminDashboard-BS3wd7Zg.js → AdminDashboard-BVgjY4zN.js} +2 -2
  69. package/dashboard/dist/assets/{AdminDashboard-BS3wd7Zg.js.map → AdminDashboard-BVgjY4zN.js.map} +1 -1
  70. package/dashboard/dist/assets/{AgentConfigPage-4C9aU0dj.js → AgentConfigPage-ChL59YL5.js} +6 -6
  71. package/dashboard/dist/assets/AgentConfigPage-ChL59YL5.js.map +1 -0
  72. package/dashboard/dist/assets/{AgentDetailPage-B6uvDnMF.js → AgentDetailPage-IJfgCOIF.js} +2 -2
  73. package/dashboard/dist/assets/AgentDetailPage-IJfgCOIF.js.map +1 -0
  74. package/dashboard/dist/assets/{AgentsPage-vtxdvdrQ.js → AgentsPage-C7PnPXz_.js} +2 -2
  75. package/dashboard/dist/assets/{AgentsPage-vtxdvdrQ.js.map → AgentsPage-C7PnPXz_.js.map} +1 -1
  76. package/dashboard/dist/assets/AvailableEscalationsPage-C5f2rqHa.js +2 -0
  77. package/dashboard/dist/assets/{AvailableEscalationsPage-C9VKPhD6.js.map → AvailableEscalationsPage-C5f2rqHa.js.map} +1 -1
  78. package/dashboard/dist/assets/{BotPicker-CkY9u7nD.js → BotPicker-CBf6bHLV.js} +2 -2
  79. package/dashboard/dist/assets/{BotPicker-CkY9u7nD.js.map → BotPicker-CBf6bHLV.js.map} +1 -1
  80. package/dashboard/dist/assets/{BulkAssignModal-OIbUDYlC.js → BulkAssignModal-CkxoPByA.js} +2 -2
  81. package/dashboard/dist/assets/{BulkAssignModal-OIbUDYlC.js.map → BulkAssignModal-CkxoPByA.js.map} +1 -1
  82. package/dashboard/dist/assets/CapabilitiesPage-D7USh3F0.js +2 -0
  83. package/dashboard/dist/assets/{CapabilitiesPage-Bkbq_GO6.js.map → CapabilitiesPage-D7USh3F0.js.map} +1 -1
  84. package/dashboard/dist/assets/{CollapsibleSection-Zuz9HkFL.js → CollapsibleSection-DfPpAIxa.js} +2 -2
  85. package/dashboard/dist/assets/{CollapsibleSection-Zuz9HkFL.js.map → CollapsibleSection-DfPpAIxa.js.map} +1 -1
  86. package/dashboard/dist/assets/CountdownTimer-DVL7WIcE.js +2 -0
  87. package/dashboard/dist/assets/CountdownTimer-DVL7WIcE.js.map +1 -0
  88. package/dashboard/dist/assets/{CredentialsPage-CAmDMnzV.js → CredentialsPage-BHZ5SKIu.js} +2 -2
  89. package/dashboard/dist/assets/{CredentialsPage-CAmDMnzV.js.map → CredentialsPage-BHZ5SKIu.js.map} +1 -1
  90. package/dashboard/dist/assets/{CronLabel-DX2woCPZ.js → CronLabel-wE8Hms6c.js} +2 -2
  91. package/dashboard/dist/assets/{CronLabel-DX2woCPZ.js.map → CronLabel-wE8Hms6c.js.map} +1 -1
  92. package/dashboard/dist/assets/{DropZone-7UoXQ4qL.js → DropZone-Pv-v5RAs.js} +2 -2
  93. package/dashboard/dist/assets/{DropZone-7UoXQ4qL.js.map → DropZone-Pv-v5RAs.js.map} +1 -1
  94. package/dashboard/dist/assets/{ElapsedCell-D2old1NF.js → ElapsedCell-B4VxKHpw.js} +2 -2
  95. package/dashboard/dist/assets/{ElapsedCell-D2old1NF.js.map → ElapsedCell-B4VxKHpw.js.map} +1 -1
  96. package/dashboard/dist/assets/{EntityTimelinePanel-m9baDiW0.js → EntityTimelinePanel-CFbQDHOj.js} +2 -2
  97. package/dashboard/dist/assets/{EntityTimelinePanel-m9baDiW0.js.map → EntityTimelinePanel-CFbQDHOj.js.map} +1 -1
  98. package/dashboard/dist/assets/{EscalationListSchemaPage-BPr7Ou8c.js → EscalationListSchemaPage-YTgexl4f.js} +2 -2
  99. package/dashboard/dist/assets/{EscalationListSchemaPage-BPr7Ou8c.js.map → EscalationListSchemaPage-YTgexl4f.js.map} +1 -1
  100. package/dashboard/dist/assets/{EscalationSchemaPage-83n5JyAh.js → EscalationSchemaPage-Sjk05eHP.js} +2 -2
  101. package/dashboard/dist/assets/{EscalationSchemaPage-83n5JyAh.js.map → EscalationSchemaPage-Sjk05eHP.js.map} +1 -1
  102. package/dashboard/dist/assets/{EscalationsOverview-CDJ5wRlq.js → EscalationsOverview-gHWPjUpZ.js} +2 -2
  103. package/dashboard/dist/assets/{EscalationsOverview-CDJ5wRlq.js.map → EscalationsOverview-gHWPjUpZ.js.map} +1 -1
  104. package/dashboard/dist/assets/{EventTable-DRUHkKtv.js → EventTable-C9lHQ57t.js} +2 -2
  105. package/dashboard/dist/assets/{EventTable-DRUHkKtv.js.map → EventTable-C9lHQ57t.js.map} +1 -1
  106. package/dashboard/dist/assets/{FilterBar-C06DK5Oa.js → FilterBar-BY--ANxv.js} +2 -2
  107. package/dashboard/dist/assets/{FilterBar-C06DK5Oa.js.map → FilterBar-BY--ANxv.js.map} +1 -1
  108. package/dashboard/dist/assets/{GraphInvokePage-DSlyTmyq.js → GraphInvokePage-B-Oo5s-W.js} +2 -2
  109. package/dashboard/dist/assets/{GraphInvokePage-DSlyTmyq.js.map → GraphInvokePage-B-Oo5s-W.js.map} +1 -1
  110. package/dashboard/dist/assets/{HomePage-DXzDBkQV.js → HomePage-BrcjKOaJ.js} +2 -2
  111. package/dashboard/dist/assets/{HomePage-DXzDBkQV.js.map → HomePage-BrcjKOaJ.js.map} +1 -1
  112. package/dashboard/dist/assets/ListToolbar-D5TQ4X_M.js +2 -0
  113. package/dashboard/dist/assets/{ListToolbar-BvpGFFYp.js.map → ListToolbar-D5TQ4X_M.js.map} +1 -1
  114. package/dashboard/dist/assets/{McpOverview-C2atR_B6.js → McpOverview-jlukVWQ7.js} +2 -2
  115. package/dashboard/dist/assets/{McpOverview-C2atR_B6.js.map → McpOverview-jlukVWQ7.js.map} +1 -1
  116. package/dashboard/dist/assets/{McpQueryDetailPage-BUxPspjB.js → McpQueryDetailPage-BWKbvJSd.js} +3 -3
  117. package/dashboard/dist/assets/{McpQueryDetailPage-BUxPspjB.js.map → McpQueryDetailPage-BWKbvJSd.js.map} +1 -1
  118. package/dashboard/dist/assets/McpQueryPage-BH2Pon4M.js +2 -0
  119. package/dashboard/dist/assets/{McpQueryPage-CM_Fgl9G.js.map → McpQueryPage-BH2Pon4M.js.map} +1 -1
  120. package/dashboard/dist/assets/{McpRunDetailPage-Bo9vXQBA.js → McpRunDetailPage-kUnq2QSO.js} +2 -2
  121. package/dashboard/dist/assets/{McpRunDetailPage-Bo9vXQBA.js.map → McpRunDetailPage-kUnq2QSO.js.map} +1 -1
  122. package/dashboard/dist/assets/{McpRunsPage-BwsgvGtg.js → McpRunsPage-BTucgt64.js} +2 -2
  123. package/dashboard/dist/assets/{McpRunsPage-BwsgvGtg.js.map → McpRunsPage-BTucgt64.js.map} +1 -1
  124. package/dashboard/dist/assets/{NamespacePill-CKp_9EaI.js → NamespacePill-DONj6eUU.js} +2 -2
  125. package/dashboard/dist/assets/{NamespacePill-CKp_9EaI.js.map → NamespacePill-DONj6eUU.js.map} +1 -1
  126. package/dashboard/dist/assets/{OperationsPage-BftWAJ9m.js → OperationsPage-Cp8WL-ld.js} +3 -3
  127. package/dashboard/dist/assets/{OperationsPage-BftWAJ9m.js.map → OperationsPage-Cp8WL-ld.js.map} +1 -1
  128. package/dashboard/dist/assets/{OperatorDashboard-CKjrYYFi.js → OperatorDashboard-wHyeLWzX.js} +2 -2
  129. package/dashboard/dist/assets/{OperatorDashboard-CKjrYYFi.js.map → OperatorDashboard-wHyeLWzX.js.map} +1 -1
  130. package/dashboard/dist/assets/{PageHeader-CDDpHpdv.js → PageHeader-CFVw67M6.js} +2 -2
  131. package/dashboard/dist/assets/{PageHeader-CDDpHpdv.js.map → PageHeader-CFVw67M6.js.map} +1 -1
  132. package/dashboard/dist/assets/{PageHeaderWithStats-DIWH6fRv.js → PageHeaderWithStats-D9tQxILm.js} +2 -2
  133. package/dashboard/dist/assets/{PageHeaderWithStats-DIWH6fRv.js.map → PageHeaderWithStats-D9tQxILm.js.map} +1 -1
  134. package/dashboard/dist/assets/{PersonaDetailPage-BsIPtBxZ.js → PersonaDetailPage-BXlTqLDK.js} +2 -2
  135. package/dashboard/dist/assets/{PersonaDetailPage-BsIPtBxZ.js.map → PersonaDetailPage-BXlTqLDK.js.map} +1 -1
  136. package/dashboard/dist/assets/{PersonasPage-62hANmNf.js → PersonasPage-DlmdJ3Dm.js} +2 -2
  137. package/dashboard/dist/assets/{PersonasPage-62hANmNf.js.map → PersonasPage-DlmdJ3Dm.js.map} +1 -1
  138. package/dashboard/dist/assets/{ProcessDetailPage-DS_t9DcR.js → ProcessDetailPage-D88ocvmT.js} +2 -2
  139. package/dashboard/dist/assets/{ProcessDetailPage-DS_t9DcR.js.map → ProcessDetailPage-D88ocvmT.js.map} +1 -1
  140. package/dashboard/dist/assets/{ProcessesListPage-Ch2tSICc.js → ProcessesListPage-DpXm-KtK.js} +2 -2
  141. package/dashboard/dist/assets/{ProcessesListPage-Ch2tSICc.js.map → ProcessesListPage-DpXm-KtK.js.map} +1 -1
  142. package/dashboard/dist/assets/{RoleDetailPage-DVbtnTvn.js → RoleDetailPage-DE2Rj2QE.js} +2 -2
  143. package/dashboard/dist/assets/{RoleDetailPage-DVbtnTvn.js.map → RoleDetailPage-DE2Rj2QE.js.map} +1 -1
  144. package/dashboard/dist/assets/{RolePill-C0hExOmI.js → RolePill-Di_5hfvw.js} +2 -2
  145. package/dashboard/dist/assets/{RolePill-C0hExOmI.js.map → RolePill-Di_5hfvw.js.map} +1 -1
  146. package/dashboard/dist/assets/{RolesPage-CK6FjD5P.js → RolesPage-CZSvJlsz.js} +2 -2
  147. package/dashboard/dist/assets/{RolesPage-CK6FjD5P.js.map → RolesPage-CZSvJlsz.js.map} +1 -1
  148. package/dashboard/dist/assets/{RunAsSelector-ImueSaJ4.js → RunAsSelector-BawZcqAk.js} +2 -2
  149. package/dashboard/dist/assets/{RunAsSelector-ImueSaJ4.js.map → RunAsSelector-BawZcqAk.js.map} +1 -1
  150. package/dashboard/dist/assets/{ScanCodesPage-CDqLJuCq.js → ScanCodesPage-DSlpA9kK.js} +2 -2
  151. package/dashboard/dist/assets/{ScanCodesPage-CDqLJuCq.js.map → ScanCodesPage-DSlpA9kK.js.map} +1 -1
  152. package/dashboard/dist/assets/{ScanSchemeDetailPage-DO6qtJdM.js → ScanSchemeDetailPage-BK4hisGD.js} +2 -2
  153. package/dashboard/dist/assets/{ScanSchemeDetailPage-DO6qtJdM.js.map → ScanSchemeDetailPage-BK4hisGD.js.map} +1 -1
  154. package/dashboard/dist/assets/{ScanStationPage-ID3xMhds.js → ScanStationPage-D3QjajFD.js} +2 -2
  155. package/dashboard/dist/assets/{ScanStationPage-ID3xMhds.js.map → ScanStationPage-D3QjajFD.js.map} +1 -1
  156. package/dashboard/dist/assets/{ScopeBadge-BBQvz4pj.js → ScopeBadge-CqIIeWjK.js} +2 -2
  157. package/dashboard/dist/assets/{ScopeBadge-BBQvz4pj.js.map → ScopeBadge-CqIIeWjK.js.map} +1 -1
  158. package/dashboard/dist/assets/{StickyPagination-XA1krmz5.js → StickyPagination-BfZwU2NR.js} +2 -2
  159. package/dashboard/dist/assets/{StickyPagination-XA1krmz5.js.map → StickyPagination-BfZwU2NR.js.map} +1 -1
  160. package/dashboard/dist/assets/{StreamMessageDetail-DziA1g1e.js → StreamMessageDetail-C7zIHX5D.js} +2 -2
  161. package/dashboard/dist/assets/{StreamMessageDetail-DziA1g1e.js.map → StreamMessageDetail-C7zIHX5D.js.map} +1 -1
  162. package/dashboard/dist/assets/{SwimlaneTimeline-DTNEnHiF.js → SwimlaneTimeline-DNSo8AT8.js} +2 -2
  163. package/dashboard/dist/assets/{SwimlaneTimeline-DTNEnHiF.js.map → SwimlaneTimeline-DNSo8AT8.js.map} +1 -1
  164. package/dashboard/dist/assets/{TagInput-BXxXs1JD.js → TagInput-BLwxTNsI.js} +2 -2
  165. package/dashboard/dist/assets/{TagInput-BXxXs1JD.js.map → TagInput-BLwxTNsI.js.map} +1 -1
  166. package/dashboard/dist/assets/{TaskDetailPage-U19sJHAI.js → TaskDetailPage-BOJ8pwh3.js} +2 -2
  167. package/dashboard/dist/assets/{TaskDetailPage-U19sJHAI.js.map → TaskDetailPage-BOJ8pwh3.js.map} +1 -1
  168. package/dashboard/dist/assets/{TaskQueuePill-BKGJBVZG.js → TaskQueuePill-DVgcqd-h.js} +2 -2
  169. package/dashboard/dist/assets/{TaskQueuePill-BKGJBVZG.js.map → TaskQueuePill-DVgcqd-h.js.map} +1 -1
  170. package/dashboard/dist/assets/{TasksListPage-jc4Xk7kI.js → TasksListPage-C4CYqZf8.js} +2 -2
  171. package/dashboard/dist/assets/{TasksListPage-jc4Xk7kI.js.map → TasksListPage-C4CYqZf8.js.map} +1 -1
  172. package/dashboard/dist/assets/{TimeAgo-GWgJ0LVq.js → TimeAgo-JRPi9IEd.js} +2 -2
  173. package/dashboard/dist/assets/{TimeAgo-GWgJ0LVq.js.map → TimeAgo-JRPi9IEd.js.map} +1 -1
  174. package/dashboard/dist/assets/{TimestampCell-Dk1TVsFV.js → TimestampCell-BVYyU-nl.js} +2 -2
  175. package/dashboard/dist/assets/{TimestampCell-Dk1TVsFV.js.map → TimestampCell-BVYyU-nl.js.map} +1 -1
  176. package/dashboard/dist/assets/{ToolPill-BY6zLSfA.js → ToolPill-C6hkOqPx.js} +2 -2
  177. package/dashboard/dist/assets/{ToolPill-BY6zLSfA.js.map → ToolPill-C6hkOqPx.js.map} +1 -1
  178. package/dashboard/dist/assets/{ToolTestPanel-BKcqnR68.js → ToolTestPanel-IGrd44Au.js} +2 -2
  179. package/dashboard/dist/assets/{ToolTestPanel-BKcqnR68.js.map → ToolTestPanel-IGrd44Au.js.map} +1 -1
  180. package/dashboard/dist/assets/{TopicDetailPage-D8GcDu_0.js → TopicDetailPage-DhianNey.js} +3 -3
  181. package/dashboard/dist/assets/{TopicDetailPage-D8GcDu_0.js.map → TopicDetailPage-DhianNey.js.map} +1 -1
  182. package/dashboard/dist/assets/{TopicsPage-BT9LV3yH.js → TopicsPage-Glhqz_Nv.js} +2 -2
  183. package/dashboard/dist/assets/{TopicsPage-BT9LV3yH.js.map → TopicsPage-Glhqz_Nv.js.map} +1 -1
  184. package/dashboard/dist/assets/{UserName-BrwZnLjU.js → UserName-CD9OqhNI.js} +2 -2
  185. package/dashboard/dist/assets/{UserName-BrwZnLjU.js.map → UserName-CD9OqhNI.js.map} +1 -1
  186. package/dashboard/dist/assets/{WorkflowExecutionPage-CldfHwky.js → WorkflowExecutionPage-8Q2438Ry.js} +2 -2
  187. package/dashboard/dist/assets/{WorkflowExecutionPage-CldfHwky.js.map → WorkflowExecutionPage-8Q2438Ry.js.map} +1 -1
  188. package/dashboard/dist/assets/{WorkflowPill-qp5UF3-y.js → WorkflowPill-CN-952iI.js} +2 -2
  189. package/dashboard/dist/assets/{WorkflowPill-qp5UF3-y.js.map → WorkflowPill-CN-952iI.js.map} +1 -1
  190. package/dashboard/dist/assets/{WorkflowsDashboard-DkyGkxW1.js → WorkflowsDashboard-CkAoYT86.js} +2 -2
  191. package/dashboard/dist/assets/{WorkflowsDashboard-DkyGkxW1.js.map → WorkflowsDashboard-CkAoYT86.js.map} +1 -1
  192. package/dashboard/dist/assets/{WorkflowsOverview-DACADuUE.js → WorkflowsOverview-Zh_EidMp.js} +2 -2
  193. package/dashboard/dist/assets/{WorkflowsOverview-DACADuUE.js.map → WorkflowsOverview-Zh_EidMp.js.map} +1 -1
  194. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DSAjzido.js → YamlWorkflowDetailPage-BKJbFT8C.js} +2 -2
  195. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DSAjzido.js.map → YamlWorkflowDetailPage-BKJbFT8C.js.map} +1 -1
  196. package/dashboard/dist/assets/{YamlWorkflowsPage-CqoSFz5B.js → YamlWorkflowsPage-DK1z6iFt.js} +2 -2
  197. package/dashboard/dist/assets/{YamlWorkflowsPage-CqoSFz5B.js.map → YamlWorkflowsPage-DK1z6iFt.js.map} +1 -1
  198. package/dashboard/dist/assets/{agents-Cg_e-aaf.js → agents-BEASyYpg.js} +2 -2
  199. package/dashboard/dist/assets/{agents-Cg_e-aaf.js.map → agents-BEASyYpg.js.map} +1 -1
  200. package/dashboard/dist/assets/{bots-B047yNJ0.js → bots-CaXqSHat.js} +2 -2
  201. package/dashboard/dist/assets/{bots-B047yNJ0.js.map → bots-CaXqSHat.js.map} +1 -1
  202. package/dashboard/dist/assets/{capabilities-CI1dbCDk.js → capabilities-Cijq-qev.js} +2 -2
  203. package/dashboard/dist/assets/{capabilities-CI1dbCDk.js.map → capabilities-Cijq-qev.js.map} +1 -1
  204. package/dashboard/dist/assets/{controlplane-Cy7snw7f.js → controlplane-HGuRC7AW.js} +2 -2
  205. package/dashboard/dist/assets/{controlplane-Cy7snw7f.js.map → controlplane-HGuRC7AW.js.map} +1 -1
  206. package/dashboard/dist/assets/{escalation-columns-BNrONMYj.js → escalation-columns-BLVz8XCP.js} +2 -2
  207. package/dashboard/dist/assets/{escalation-columns-BNrONMYj.js.map → escalation-columns-BLVz8XCP.js.map} +1 -1
  208. package/dashboard/dist/assets/index-BJDAXUzO.js +2 -0
  209. package/dashboard/dist/assets/index-BJDAXUzO.js.map +1 -0
  210. package/dashboard/dist/assets/{index-DVtIMrTb.js → index-CEIp6WWg.js} +2 -2
  211. package/dashboard/dist/assets/{index-DVtIMrTb.js.map → index-CEIp6WWg.js.map} +1 -1
  212. package/dashboard/dist/assets/index-CK_ohh6Q.js +3 -0
  213. package/dashboard/dist/assets/index-CK_ohh6Q.js.map +1 -0
  214. package/dashboard/dist/assets/{index-DAUV3eJ-.js → index-CLQ0HBHR.js} +2 -2
  215. package/dashboard/dist/assets/{index-DAUV3eJ-.js.map → index-CLQ0HBHR.js.map} +1 -1
  216. package/dashboard/dist/assets/{index-COKZW8Xx.js → index-Cg0vCZng.js} +2 -2
  217. package/dashboard/dist/assets/{index-COKZW8Xx.js.map → index-Cg0vCZng.js.map} +1 -1
  218. package/dashboard/dist/assets/{index-lGfBW1PB.js → index-CgXVDPW-.js} +31 -31
  219. package/dashboard/dist/assets/index-CgXVDPW-.js.map +1 -0
  220. package/dashboard/dist/assets/index-ClY0ihQ5.js +2 -0
  221. package/dashboard/dist/assets/{index-X3_AxcUk.js.map → index-ClY0ihQ5.js.map} +1 -1
  222. package/dashboard/dist/assets/{index-C_y0lQ_o.js → index-D2OU2MJb.js} +2 -2
  223. package/dashboard/dist/assets/{index-C_y0lQ_o.js.map → index-D2OU2MJb.js.map} +1 -1
  224. package/dashboard/dist/assets/{index-Bf3hVGXZ.js → index-IkgBE7e_.js} +2 -2
  225. package/dashboard/dist/assets/{index-Bf3hVGXZ.js.map → index-IkgBE7e_.js.map} +1 -1
  226. package/dashboard/dist/assets/{index-B6Grf1WQ.js → index-Xi3LO4Ye.js} +4 -4
  227. package/dashboard/dist/assets/{index-B6Grf1WQ.js.map → index-Xi3LO4Ye.js.map} +1 -1
  228. package/dashboard/dist/assets/{index-Bxd2sXqz.js → index-YMd3ZiPd.js} +2 -2
  229. package/dashboard/dist/assets/{index-Bxd2sXqz.js.map → index-YMd3ZiPd.js.map} +1 -1
  230. package/dashboard/dist/assets/{index-Uk6N1qiH.js → index-t1JXcmBG.js} +2 -2
  231. package/dashboard/dist/assets/{index-Uk6N1qiH.js.map → index-t1JXcmBG.js.map} +1 -1
  232. package/dashboard/dist/assets/{index-DyTb77Jb.js → index-tCDjx1kF.js} +2 -2
  233. package/dashboard/dist/assets/{index-DyTb77Jb.js.map → index-tCDjx1kF.js.map} +1 -1
  234. package/dashboard/dist/assets/knowledge-DpaUJtVW.js +2 -0
  235. package/dashboard/dist/assets/knowledge-DpaUJtVW.js.map +1 -0
  236. package/dashboard/dist/assets/{mcp-D889kZ-c.js → mcp-BkkLq6OE.js} +2 -2
  237. package/dashboard/dist/assets/{mcp-D889kZ-c.js.map → mcp-BkkLq6OE.js.map} +1 -1
  238. package/dashboard/dist/assets/{mcp-query-Cs9J2pVT.js → mcp-query-DeXu3La5.js} +2 -2
  239. package/dashboard/dist/assets/{mcp-query-Cs9J2pVT.js.map → mcp-query-DeXu3La5.js.map} +1 -1
  240. package/dashboard/dist/assets/{personas-xHB16O-Q.js → personas-BRbKVVko.js} +2 -2
  241. package/dashboard/dist/assets/{personas-xHB16O-Q.js.map → personas-BRbKVVko.js.map} +1 -1
  242. package/dashboard/dist/assets/{pipelines-DnTPjw1v.js → pipelines-B7xo92sK.js} +2 -2
  243. package/dashboard/dist/assets/{pipelines-DnTPjw1v.js.map → pipelines-B7xo92sK.js.map} +1 -1
  244. package/dashboard/dist/assets/{tasks-BcDvp6dL.js → tasks-BGyqM1Ho.js} +2 -2
  245. package/dashboard/dist/assets/{tasks-BcDvp6dL.js.map → tasks-BGyqM1Ho.js.map} +1 -1
  246. package/dashboard/dist/assets/{topics-DXw6BNy5.js → topics-I81rKc75.js} +2 -2
  247. package/dashboard/dist/assets/{topics-DXw6BNy5.js.map → topics-I81rKc75.js.map} +1 -1
  248. package/dashboard/dist/assets/{useEventHooks-C-bsD8zP.js → useEventHooks-CjV3uNxt.js} +2 -2
  249. package/dashboard/dist/assets/{useEventHooks-C-bsD8zP.js.map → useEventHooks-CjV3uNxt.js.map} +1 -1
  250. package/dashboard/dist/assets/{useNamespace-wZCsEF6O.js → useNamespace-B-HMdRka.js} +2 -2
  251. package/dashboard/dist/assets/{useNamespace-wZCsEF6O.js.map → useNamespace-B-HMdRka.js.map} +1 -1
  252. package/dashboard/dist/assets/{useYamlActivityEvents-Cu_o4-ow.js → useYamlActivityEvents-CNsAlsgz.js} +2 -2
  253. package/dashboard/dist/assets/{useYamlActivityEvents-Cu_o4-ow.js.map → useYamlActivityEvents-CNsAlsgz.js.map} +1 -1
  254. package/dashboard/dist/assets/{users-XpCq_umD.js → users-DiTqBepm.js} +2 -2
  255. package/dashboard/dist/assets/{users-XpCq_umD.js.map → users-DiTqBepm.js.map} +1 -1
  256. package/dashboard/dist/assets/{vendor-icons-BgsXTN4h.js → vendor-icons-h-jlRSb9.js} +141 -146
  257. package/dashboard/dist/assets/vendor-icons-h-jlRSb9.js.map +1 -0
  258. package/dashboard/dist/assets/{workflows-CMxHVqQ8.js → workflows-TA0p_3B8.js} +2 -2
  259. package/dashboard/dist/assets/{workflows-CMxHVqQ8.js.map → workflows-TA0p_3B8.js.map} +1 -1
  260. package/dashboard/dist/assets/{yaml-workflows-kxOF5yEC.js → yaml-workflows-DN9-DBnQ.js} +2 -2
  261. package/dashboard/dist/assets/{yaml-workflows-kxOF5yEC.js.map → yaml-workflows-DN9-DBnQ.js.map} +1 -1
  262. package/dashboard/dist/index.html +2 -2
  263. package/docs/api/http/escalations.md +31 -8
  264. package/docs/api/http/knowledge.md +24 -2
  265. package/docs/api/http/roles.md +1 -1
  266. package/docs/api/mcp/admin.md +1 -1
  267. package/docs/api/mcp/human-queue.md +14 -0
  268. package/docs/api/mcp/knowledge.md +17 -1
  269. package/docs/api/sdk/escalations.md +38 -15
  270. package/docs/api/sdk/knowledge.md +27 -0
  271. package/docs/api/sdk/roles.md +1 -1
  272. package/docs/compilation.md +1 -1
  273. package/docs/compiler.md +2 -2
  274. package/docs/dashboard.md +1 -1
  275. package/docs/data.md +3 -3
  276. package/docs/hitl/escalation.md +14 -12
  277. package/docs/hitl/form.md +1 -0
  278. package/docs/hitl/iframe.md +2 -2
  279. package/docs/hitl/lookups.md +134 -0
  280. package/docs/hitl/resolution.md +4 -4
  281. package/docs/hitl/roles.md +4 -4
  282. package/docs/hitl/x-lt-show-if.md +1 -1
  283. package/docs/hitl/x-lt-transition.md +2 -2
  284. package/docs/hitl/x-lt-validation.md +64 -2
  285. package/docs/hitl/x-lt-widget.md +2 -2
  286. package/docs/hitl-guide.md +8 -2
  287. package/docs/story.md +1 -1
  288. package/package.json +1 -1
  289. package/dashboard/dist/assets/AgentConfigPage-4C9aU0dj.js.map +0 -1
  290. package/dashboard/dist/assets/AgentDetailPage-B6uvDnMF.js.map +0 -1
  291. package/dashboard/dist/assets/AvailableEscalationsPage-C9VKPhD6.js +0 -2
  292. package/dashboard/dist/assets/CapabilitiesPage-Bkbq_GO6.js +0 -2
  293. package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js +0 -2
  294. package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js.map +0 -1
  295. package/dashboard/dist/assets/ListToolbar-BvpGFFYp.js +0 -2
  296. package/dashboard/dist/assets/McpQueryPage-CM_Fgl9G.js +0 -2
  297. package/dashboard/dist/assets/index-Ds5rGe-i.js +0 -3
  298. package/dashboard/dist/assets/index-Ds5rGe-i.js.map +0 -1
  299. package/dashboard/dist/assets/index-X3_AxcUk.js +0 -2
  300. package/dashboard/dist/assets/index-lGfBW1PB.js.map +0 -1
  301. package/dashboard/dist/assets/index-nUmEwQrg.js +0 -2
  302. package/dashboard/dist/assets/index-nUmEwQrg.js.map +0 -1
  303. package/dashboard/dist/assets/knowledge-DsIUzscY.js +0 -2
  304. package/dashboard/dist/assets/knowledge-DsIUzscY.js.map +0 -1
  305. package/dashboard/dist/assets/vendor-icons-BgsXTN4h.js.map +0 -1
@@ -156,6 +156,29 @@ GET /api/escalations/:id
156
156
  { "error": "Escalation not found" }
157
157
  ```
158
158
 
159
+ ## Get escalation lookups
160
+
161
+ ```
162
+ GET /api/escalations/:id/lookups
163
+ ```
164
+
165
+ Resolves the versioned knowledge lookups pinned on the row (`envelope.lookups`). The refs ARE the grant: any user who may read the escalation may fetch exactly the pinned editions it names — the general knowledge API stays a builder surface. See [lookups](../../hitl/lookups.md).
166
+
167
+ **Scope:** Enforces the same read scope as `GET /api/escalations/:id`.
168
+
169
+ **Response 200:**
170
+
171
+ ```json
172
+ {
173
+ "lookups": [
174
+ { "domain": "catalog", "key": "materials", "version": 2, "data": { "items": ["aluminum", "steel"] } },
175
+ { "domain": "catalog", "key": "geo", "version": 9, "data": null, "missing": true }
176
+ ]
177
+ }
178
+ ```
179
+
180
+ A ref whose snapshot does not exist answers with `missing: true` — the batch never fails.
181
+
159
182
  ## Claim an escalation
160
183
 
161
184
  ```
@@ -279,7 +302,7 @@ Returned when the escalation has already been resolved or is otherwise not pendi
279
302
 
280
303
  ### Signal-based resolution (metadata.signal_id)
281
304
 
282
- When an escalation has `metadata.signal_id`, the resolve endpoint signals the running workflow instead of starting a new one. The workflow is still alive — it called `conditionLT(signalId)` and is paused.
305
+ When an escalation has `metadata.signal_id`, the resolve endpoint signals the running workflow instead of starting a new one. The workflow is still alive — it called `conditional(signalId)` and is paused.
283
306
 
284
307
  The resolver payload is augmented with `$escalation_id` before signaling:
285
308
 
@@ -287,13 +310,13 @@ The resolver payload is augmented with `$escalation_id` before signaling:
287
310
  { "approved": true, "notes": "Looks good", "$escalation_id": "esc-a1b2c3d4-..." }
288
311
  ```
289
312
 
290
- The workflow is responsible for resolving the escalation. The `conditionLT()` helper handles this automatically — it strips `$escalation_id`, calls `ltResolveEscalation` as a durable activity, and returns the clean payload.
313
+ The workflow is responsible for resolving the escalation. The `conditional()` helper handles this automatically — it strips `$escalation_id`, calls `ltResolveEscalation` as a durable activity, and returns the clean payload.
291
314
 
292
315
  If you use raw `Durable.workflow.condition()` instead, you must resolve the escalation yourself using the `$escalation_id` from the signal data.
293
316
 
294
317
  ### Signal-key resolution (efficient/atomic — `signal_key`)
295
318
 
296
- When an escalation was written atomically by `conditionLT(signalId, config)` (or `Durable.workflow.condition(signalId, config)`), the row carries a `signal_key` and no `signal_id`/`signal_routing` metadata. The resolve endpoint detects `signal_key` and resolves it through the SDK: the resolve marks the row resolved **and** delivers the signal to the waiting `condition()` in one transaction, so the original job resumes in place — no re-run, no separate resolve activity. `system.escalation.{role}.{id}.resolved` fires.
319
+ When an escalation was written atomically by `conditional(signalId, config)` (or `Durable.workflow.condition(signalId, config)`), the row carries a `signal_key` and no `signal_id`/`signal_routing` metadata. The resolve endpoint detects `signal_key` and resolves it through the SDK: the resolve marks the row resolved **and** delivers the signal to the waiting `condition()` in one transaction, so the original job resumes in place — no re-run, no separate resolve activity. `system.escalation.{role}.{id}.resolved` fires.
297
320
 
298
321
  ```
299
322
  POST /api/escalations/resolve-by-signal-key
@@ -303,7 +326,7 @@ For callers that know the deterministic signal id (webhooks — e.g. `signal-sca
303
326
 
304
327
  | Field | Type | Required | Description |
305
328
  |-------|------|----------|-------------|
306
- | `signalKey` | `string` | yes | The signal id passed to `conditionLT(signalId, config)` |
329
+ | `signalKey` | `string` | yes | The signal id passed to `conditional(signalId, config)` |
307
330
  | `resolverPayload` | `object` | yes | The decision payload delivered to the waiting workflow |
308
331
  | `metadata` | `object` | no | Outcome facets merged into the row's GIN-indexed metadata (see [Resolve an escalation](#resolve-an-escalation)) |
309
332
 
@@ -325,7 +348,7 @@ When a reviewer claims an escalation, the dashboard renders a typed form instead
325
348
 
326
349
  ### Option 1: Role `form_schema` (versioned)
327
350
 
328
- The escalation form is owned by the target **role** as a versioned `form_schema`, declared on the role (e.g. via `PATCH /api/roles/:role`). Every escalation targeting that role resolves against it. A workflow pins a specific version through `conditionLT`'s `schemaVersion`, which stamps `metadata.schema_version` on the escalation; unpinned escalations resolve against the role's latest `form_schema`. Fields may carry `x-lt-bind` to map a form value to a path in the resolver payload.
351
+ The escalation form is owned by the target **role** as a versioned `form_schema`, declared on the role (e.g. via `PATCH /api/roles/:role`). Every escalation targeting that role resolves against it. A workflow pins a specific version through `conditional`'s `schemaVersion`, which stamps `metadata.schema_version` on the escalation; unpinned escalations resolve against the role's latest `form_schema`. Fields may carry `x-lt-bind` to map a form value to a path in the resolver payload.
329
352
 
330
353
  The deprecated workflow-config `resolver_schema` remains only as a legacy fallback when no role `form_schema` is available.
331
354
 
@@ -830,7 +853,7 @@ Returns all escalations linked to a specific workflow ID.
830
853
  POST /api/escalations/:id/cancel
831
854
  ```
832
855
 
833
- Permanently cancels a pending or claimed escalation. The workflow waiting on this escalation (via `conditionLT`) receives `null` as the condition result, allowing it to handle the cancellation gracefully.
856
+ Permanently cancels a pending or claimed escalation. The workflow waiting on this escalation (via `conditional`) receives `null` as the condition result, allowing it to handle the cancellation gracefully.
834
857
 
835
858
  Terminal escalations (`resolved` or already `cancelled`) return 409.
836
859
 
@@ -1060,7 +1083,7 @@ POST /api/escalations/resolve-by-metadata
1060
1083
 
1061
1084
  Single atomic query finds the pending escalation by metadata, auto-claims if unclaimed, and resolves it. RBAC is enforced in the SQL WHERE clause. Write scope is honored here: a `member` with `write_scope=self` may resolve their own assigned item atomically, which is how a one-time user completes the form routed to them.
1062
1085
 
1063
- **Signal guard:** If the escalation has `metadata.signal_id` (created by `conditionLT`), the SQL does NOT resolve it directly. Instead, the endpoint signals the running workflow — `conditionLT` receives the signal and resolves the escalation durably inside the workflow. This preserves the same transactional integrity as the standard resolve-by-ID path.
1086
+ **Signal guard:** If the escalation has `metadata.signal_id` (created by `conditional`), the SQL does NOT resolve it directly. Instead, the endpoint signals the running workflow — `conditional` receives the signal and resolves the escalation durably inside the workflow. This preserves the same transactional integrity as the standard resolve-by-ID path.
1064
1087
 
1065
1088
  **Body:**
1066
1089
 
@@ -1089,7 +1112,7 @@ Single atomic query finds the pending escalation by metadata, auto-claims if unc
1089
1112
  }
1090
1113
  ```
1091
1114
 
1092
- **Response 200 (signal-backed):** Workflow signaled; `conditionLT` resolves the escalation durably.
1115
+ **Response 200 (signal-backed):** Workflow signaled; `conditional` resolves the escalation durably.
1093
1116
 
1094
1117
  ```json
1095
1118
  {
@@ -2,7 +2,7 @@
2
2
 
3
3
  CRUD operations for the knowledge store — a domain-scoped key-value store backed by PostgreSQL JSONB. Each entry has a domain, key, arbitrary JSON data, and optional tags.
4
4
 
5
- All endpoints require authentication.
5
+ All endpoints require authentication and builder access (superadmin or a user holding the `engineer` role). Members reach knowledge content only through escalation lookup refs — see [lookups](../../hitl/lookups.md) and `GET /api/escalations/:id/lookups`.
6
6
 
7
7
  ## List domains
8
8
 
@@ -64,12 +64,13 @@ Returns entries within a domain, ordered by last updated.
64
64
  GET /api/knowledge/entry?domain=screenshot&key=google
65
65
  ```
66
66
 
67
- Returns a single knowledge entry by domain and key. Returns `{ found: false }` if not found.
67
+ Returns a single knowledge entry by domain and key. Returns `{ found: false }` if not found. With `version`, returns that immutable edition from the version history instead of the live entry.
68
68
 
69
69
  | Parameter | Type | Required | Description |
70
70
  |-----------|------|----------|-------------|
71
71
  | `domain` | `string` | Yes | Domain |
72
72
  | `key` | `string` | Yes | Entry key |
73
+ | `version` | `integer` | No | Fetch this immutable edition instead of the live entry |
73
74
 
74
75
  **Response 200:**
75
76
 
@@ -85,6 +86,27 @@ Returns a single knowledge entry by domain and key. Returns `{ found: false }` i
85
86
  }
86
87
  ```
87
88
 
89
+ ## List entry versions
90
+
91
+ ```
92
+ GET /api/knowledge/entry/versions?domain=catalog&key=materials
93
+ ```
94
+
95
+ Every data-changing write mints an immutable edition. Lists them newest first, with the current one marked.
96
+
97
+ **Response 200:**
98
+
99
+ ```json
100
+ {
101
+ "domain": "catalog",
102
+ "key": "materials",
103
+ "versions": [
104
+ { "version": 2, "change_summary": null, "created_at": "...", "is_current": true },
105
+ { "version": 1, "change_summary": null, "created_at": "...", "is_current": false }
106
+ ]
107
+ }
108
+ ```
109
+
88
110
  ## Store entry
89
111
 
90
112
  ```
@@ -412,7 +412,7 @@ GET /api/roles/:role/schema
412
412
  GET /api/roles/:role/schema?version=3
413
413
  ```
414
414
 
415
- Fetch the role's `form_schema` + `metadata_schema` pair. Without `version`, returns the live (latest) schema along with the role's current version number. With `version`, returns that immutable snapshot from the version history — the snapshot an escalation pinned via `metadata.schema_version` (`conditionLT`'s `schemaVersion` field).
415
+ Fetch the role's `form_schema` + `metadata_schema` pair. Without `version`, returns the live (latest) schema along with the role's current version number. With `version`, returns that immutable snapshot from the version history — the snapshot an escalation pinned via `metadata.schema_version` (`conditional`'s `schemaVersion` field).
416
416
 
417
417
  **Response 200:**
418
418
 
@@ -1547,7 +1547,7 @@ Return the numeric status semaphore for a workflow.
1547
1547
 
1548
1548
  ## Ortho Pipeline
1549
1549
 
1550
- AI-operable tools for driving the orthotic manufacturing pipeline. Each order passes through eight sequential stages (design → review → print → grind → glue → finish → qa → ship). The pipeline is a HotMesh durable workflow; each stage suspends at a `conditionLT` checkpoint until an escalation is resolved.
1550
+ AI-operable tools for driving the orthotic manufacturing pipeline. Each order passes through eight sequential stages (design → review → print → grind → glue → finish → qa → ship). The pipeline is a HotMesh durable workflow; each stage suspends at a `conditional` checkpoint until an escalation is resolved.
1551
1551
 
1552
1552
  A Claude agent loop calls `ortho_submit` to start an order, polls `ortho_pending` to see what's waiting, drives each stage forward with `ortho_complete_stage`, and monitors progress with `ortho_status`.
1553
1553
 
@@ -49,6 +49,20 @@ Check the status of an escalation. Returns status and resolver payload if resolv
49
49
  |-------|------|----------|-------------|
50
50
  | escalation_id | string | Yes | The escalation ID to check |
51
51
 
52
+ ### get_escalation_lookups
53
+
54
+ Resolve the versioned knowledge lookups pinned on an escalation (`envelope.lookups`). Each ref answers with its immutable edition; a ref whose snapshot does not exist answers with `missing: true`. Like the other tools on this server, the call carries no per-user identity — the MCP surface reads at service scope.
55
+
56
+ | | |
57
+ |---|---|
58
+ | Read-safe | Yes |
59
+
60
+ **Parameters:**
61
+
62
+ | Field | Type | Required | Description |
63
+ |-------|------|----------|-------------|
64
+ | escalation_id | string | Yes | The escalation whose pinned knowledge lookups to resolve |
65
+
52
66
  ### get_available_work
53
67
 
54
68
  List available escalations for a role. Returns pending, unassigned escalations.
@@ -35,7 +35,23 @@ Store a value in a 3-level additive hierarchy: domain > key > field. Upserts by
35
35
 
36
36
  ### get_knowledge
37
37
 
38
- Retrieve a single knowledge entry by domain and key.
38
+ Retrieve a single knowledge entry by domain and key. Pass `version` to fetch a pinned immutable edition.
39
+
40
+ | | |
41
+ |---|---|
42
+ | Read-safe | Yes |
43
+
44
+ **Parameters:**
45
+
46
+ | Field | Type | Required | Description |
47
+ |-------|------|----------|-------------|
48
+ | domain | string | Yes | Knowledge domain |
49
+ | key | string | Yes | Document key |
50
+ | version | number | No | Fetch this immutable edition instead of the live entry |
51
+
52
+ ### list_knowledge_versions
53
+
54
+ List every immutable edition of a knowledge entry, newest first, with the current one marked. Every data-changing write mints a new version.
39
55
 
40
56
  | | |
41
57
  |---|---|
@@ -197,6 +197,27 @@ const result = await lt.escalations.get({ id: 'esc_123' });
197
197
 
198
198
  ---
199
199
 
200
+ ## getLookups
201
+
202
+ Resolve the versioned knowledge lookups pinned on an escalation (`envelope.lookups`). Enforces the same read scope as `get`; the refs on the row grant exactly the pinned editions they name. See [lookups](../../hitl/lookups.md).
203
+
204
+ ```typescript
205
+ const result = await lt.escalations.getLookups({ id: 'esc_123' });
206
+ // result.data.lookups → [{ domain, key, version, as?, data, missing? }]
207
+ ```
208
+
209
+ **Parameters:**
210
+
211
+ | Field | Type | Required | Description |
212
+ |-------|------|----------|-------------|
213
+ | `id` | `string` | Yes | Escalation UUID |
214
+
215
+ **Returns:** `LTApiResult<{ lookups }>` -- each entry is `{ domain, key, version, as?, data, missing? }`.
216
+
217
+ **Auth:** Required
218
+
219
+ ---
220
+
200
221
  ## getByWorkflowId
201
222
 
202
223
  List all escalations for a given workflow ID.
@@ -342,29 +363,31 @@ The in-process library takes the same patch as a third argument:
342
363
 
343
364
  ---
344
365
 
345
- ## conditionLT (workflow helper)
366
+ ## conditional (workflow helper)
346
367
 
347
- Wait for a signal and automatically resolve the associated escalation. This is the counterpart to `executeLT` — where `executeLT` wraps `startChild` + `condition`, `conditionLT` wraps `condition` + escalation resolution.
368
+ Wait for a signal and automatically resolve the associated escalation. This is the counterpart to `executeLT` — where `executeLT` wraps `startChild` + `condition`, `conditional` wraps `condition` + escalation resolution.
348
369
 
349
370
  ```typescript
350
- conditionLT<T>(signalId: string, escalation?: ConditionQueueConfig): Promise<T | false | null>
371
+ conditional<T>(signalId: string, escalation?: ConditionQueueConfig): Promise<T | false | null>
351
372
  ```
352
373
 
374
+ > `conditionLT` is a deprecated alias of `conditional`. Existing code continues to work.
375
+
353
376
  ### Two ways to pause on an escalation
354
377
 
355
378
  There are two ways to make a workflow pause as a claimable escalation, and they are not equivalent in cost:
356
379
 
357
380
  - **Native `condition(signalId, escalationConfig)` — the efficient primitive.** HotMesh's `condition` takes an optional escalation config as its second argument. The row is written inside the workflow's Leg1 checkpoint, with `signal_key = signalId`. Resolving it (`resolve` / `resolveBySignalKey`) marks the row resolved **and** delivers the signal in one guarded transaction, resuming the job in place. No create activity, no enrich step, and **no proxy-activity round-trip on the resume** — the resolve is the whole transaction. This is the path to prefer.
358
381
 
359
- - **`conditionLT(signalId, config?)` — long-tail sugar.** With a config it delegates to the native efficient `condition` above (same atomic behavior — use it freely). Without a config it also supports the older **two-step** pattern: an escalation created separately, where the resume injects `$escalation_id` and `conditionLT` resolves it through a durable `proxyActivity` (`ltResolveEscalation`). That extra activity round-trip is the cost of the two-step form; the efficient form (and native `condition`) avoid it.
382
+ - **`conditional(signalId, config?)` — long-tail sugar.** With a config it delegates to the native efficient `condition` above (same atomic behavior — use it freely). Without a config it also supports the older **two-step** pattern: an escalation created separately, where the resume injects `$escalation_id` and `conditional` resolves it through a durable `proxyActivity` (`ltResolveEscalation`). That extra activity round-trip is the cost of the two-step form; the efficient form (and native `condition`) avoid it.
360
383
 
361
- Reach for native `condition(signalId, config)` when you want the leanest path; reach for `conditionLT` for the ergonomic wrapper or to support the legacy two-step flow. Both resume the same row, and both accept the resolve-time `metadata` patch (the efficient path merges it in the single guarded UPDATE; the two-step path forwards it through `ltResolveEscalation` into that same atomic resolve).
384
+ Reach for native `condition(signalId, config)` when you want the leanest path; reach for `conditional` for the ergonomic wrapper or to support the legacy two-step flow. Both resume the same row, and both accept the resolve-time `metadata` patch (the efficient path merges it in the single guarded UPDATE; the two-step path forwards it through `ltResolveEscalation` into that same atomic resolve).
362
385
 
363
386
  ### Atomic form (recommended)
364
387
 
365
388
  Pass an escalation config as the second argument. The escalation row is written inside the workflow's Leg1 checkpoint — one commit, crash-safe: no separate `ltCreateEscalation` activity, no enrich step. `signal_key` is set to `signalId`, so the dashboard resolve endpoint (resolve-by-id → Path 0) and `POST /escalations/resolve-by-signal-key` resume *this* job in place, and `system.escalation.{role}.{id}.created` fires automatically.
366
389
 
367
- `conditionLT` returns `T | false | null`:
390
+ `conditional` returns `T | false | null`:
368
391
  - `T` — the resolver's payload (normal resolution)
369
392
  - `false` — the SLA timer fired first (`config.timeout`); the row is now `status='expired'`
370
393
  - `null` — the escalation was cancelled (workflow terminated or explicit `POST /api/escalations/:id/cancel`)
@@ -372,13 +395,13 @@ Pass an escalation config as the second argument. The escalation row is written
372
395
  Always guard for `null` and `false` before accessing the payload:
373
396
 
374
397
  ```typescript
375
- import { conditionLT } from '@hotmeshio/long-tail';
398
+ import { conditional } from '@hotmeshio/long-tail';
376
399
 
377
400
  export async function stationWorker(envelope: LTEnvelope) {
378
401
  const ctx = Durable.workflow.workflowInfo();
379
402
  const signalId = `station-done-${ctx.workflowId}`;
380
403
 
381
- const decision = await conditionLT<{ approved: boolean }>(signalId, {
404
+ const decision = await conditional<{ approved: boolean }>(signalId, {
382
405
  role: 'qc-inspector',
383
406
  type: 'orderPipeline',
384
407
  subtype: 'qc',
@@ -418,7 +441,7 @@ UPDATE, so operators can never resolve into a workflow that already moved on.
418
441
  Create the escalation first (e.g. to enrich routing metadata), then wait:
419
442
 
420
443
  ```typescript
421
- import { conditionLT } from '@hotmeshio/long-tail';
444
+ import { conditional } from '@hotmeshio/long-tail';
422
445
 
423
446
  export async function myWorkflow(envelope: LTEnvelope) {
424
447
  const signalId = `approval-${Durable.workflow.workflowId}`;
@@ -443,7 +466,7 @@ export async function myWorkflow(envelope: LTEnvelope) {
443
466
  });
444
467
 
445
468
  // Pause — dashboard signals on resolve
446
- const decision = await conditionLT<{ approved: boolean; notes: string }>(signalId);
469
+ const decision = await conditional<{ approved: boolean; notes: string }>(signalId);
447
470
 
448
471
  if (!decision) {
449
472
  // null = cancelled, false = timeout
@@ -457,10 +480,10 @@ export async function myWorkflow(envelope: LTEnvelope) {
457
480
  **How it works:**
458
481
 
459
482
  1. The workflow creates an escalation with `metadata.signal_id` pointing to its own signal key
460
- 2. The workflow calls `conditionLT(signalId)` and pauses
483
+ 2. The workflow calls `conditional(signalId)` and pauses
461
484
  3. A reviewer claims and resolves the escalation in the dashboard
462
485
  4. The resolve API injects `$escalation_id` into the payload and signals the workflow
463
- 5. `conditionLT` receives the signal, strips `$escalation_id`, calls `ltResolveEscalation` as a durable activity, and returns the clean payload
486
+ 5. `conditional` receives the signal, strips `$escalation_id`, calls `ltResolveEscalation` as a durable activity, and returns the clean payload
464
487
 
465
488
  The escalation resolution happens inside the workflow as a durable activity — crash-safe and transactional within the workflow's execution context.
466
489
 
@@ -472,7 +495,7 @@ If you use raw `Durable.workflow.condition()` instead, the `$escalation_id` fiel
472
495
 
473
496
  When a reviewer claims an escalation in the dashboard, a typed form is rendered instead of a raw JSON editor — if a schema is available. There are two ways to provide one:
474
497
 
475
- **Option 1 — Role `form_schema` (versioned):** The escalation form is owned by the target role as a versioned `form_schema`. A workflow pins a version through `conditionLT`'s `schemaVersion`; unpinned escalations resolve against the role's latest. Fields may carry `x-lt-bind` to map a form value to a path in the resolver payload. The deprecated workflow-config `resolver_schema` remains only as a legacy fallback.
498
+ **Option 1 — Role `form_schema` (versioned):** The escalation form is owned by the target role as a versioned `form_schema`. A workflow pins a version through `conditional`'s `schemaVersion`; unpinned escalations resolve against the role's latest. Fields may carry `x-lt-bind` to map a form value to a path in the resolver payload. The deprecated workflow-config `resolver_schema` remains only as a legacy fallback.
476
499
 
477
500
  **Option 2 — Escalation metadata (dynamic):** Pass `form_schema` inside `metadata` when creating an escalation. This overrides any role-level schema.
478
501
 
@@ -659,7 +682,7 @@ const result = await lt.escalations.bulkTriage({
659
682
 
660
683
  ## cancel
661
684
 
662
- Permanently cancel a pending or claimed escalation. The workflow waiting on `conditionLT` receives `null`.
685
+ Permanently cancel a pending or claimed escalation. The workflow waiting on `conditional` receives `null`.
663
686
 
664
687
  ```typescript
665
688
  const result = await lt.escalations.cancel({ id: 'esc_123' });
@@ -769,7 +792,7 @@ const result = await lt.escalations.claimByMetadata({
769
792
 
770
793
  Find and resolve an escalation by metadata key-value pair. Single atomic query with signal guard.
771
794
 
772
- If the escalation has `metadata.signal_id` (created by `conditionLT`), the endpoint signals the running workflow instead of resolving directly in the DB. `conditionLT` receives the signal and resolves the escalation durably inside the workflow. This preserves the same transactional integrity as the standard resolve-by-ID path.
795
+ If the escalation has `metadata.signal_id` (created by `conditional`), the endpoint signals the running workflow instead of resolving directly in the DB. `conditional` receives the signal and resolves the escalation durably inside the workflow. This preserves the same transactional integrity as the standard resolve-by-ID path.
773
796
 
774
797
  ```typescript
775
798
  // Non-signal escalation → resolved atomically
@@ -51,6 +51,33 @@ const result = await lt.knowledge.getEntry({
51
51
 
52
52
  **Returns:** `LTApiResult<KnowledgeEntry>` or `{ found: false }` if not found.
53
53
 
54
+ ## getEntryVersion
55
+
56
+ Get an immutable edition from an entry's version history.
57
+
58
+ ```typescript
59
+ const result = await lt.knowledge.getEntryVersion({
60
+ domain: 'catalog',
61
+ key: 'materials',
62
+ version: 2,
63
+ });
64
+ ```
65
+
66
+ **Returns:** `LTApiResult<{ domain, key, version, data, tags, created_at }>` — 404 when the edition does not exist.
67
+
68
+ ## listEntryVersions
69
+
70
+ List every edition of an entry, newest first, with the current one marked.
71
+
72
+ ```typescript
73
+ const result = await lt.knowledge.listEntryVersions({
74
+ domain: 'catalog',
75
+ key: 'materials',
76
+ });
77
+ ```
78
+
79
+ **Returns:** `LTApiResult<{ domain, key, versions: [{ version, change_summary, created_at, is_current }] }>`
80
+
54
81
  ## storeEntry
55
82
 
56
83
  Create or update a knowledge entry. Data is merged by default; set `replace: true` to fully overwrite.
@@ -291,7 +291,7 @@ When the update changes `form_schema` or `metadata_schema`, the new pair is snap
291
291
 
292
292
  ## getSchema
293
293
 
294
- Fetch a role's `form_schema` + `metadata_schema` pair. With `version`, reads that immutable snapshot from the version history (the one an escalation pins via `conditionLT`'s `schemaVersion`); without it, reads the live (latest) schema and its current version number. A missing version is a 404 — it never falls back to a different version.
294
+ Fetch a role's `form_schema` + `metadata_schema` pair. With `version`, reads that immutable snapshot from the version history (the one an escalation pins via `conditional`'s `schemaVersion`); without it, reads the live (latest) schema and its current version number. A missing version is a 404 — it never falls back to a different version.
295
295
 
296
296
  ```typescript
297
297
  const latest = await lt.roles.getSchema({ role: 'reviewer' });
@@ -141,7 +141,7 @@ The dynamic path remains for genuinely new problems. But the long tail gets shor
141
141
 
142
142
  The Pipeline Designer compiles from execution traces — the dynamic path. But there's a second entry point: compiling directly from source code.
143
143
 
144
- If you've written a durable workflow using the Temporal-like API (`proxyActivities`, `sleep`, `condition`, `startChild`), you can compile it to a YAML DAG without executing it first. The `ltc` CLI reads your TypeScript source, extracts the orchestration structure, and produces an equivalent DAG that runs without replay overhead.
144
+ If you've written a durable workflow using the durable workflow API (`proxyActivities`, `sleep`, `condition`, `startChild`), you can compile it to a YAML DAG without executing it first. The `ltc` CLI reads your TypeScript source, extracts the orchestration structure, and produces an equivalent DAG that runs without replay overhead.
145
145
 
146
146
  ```bash
147
147
  ltc compile workflows/assembly-line.ts
package/docs/compiler.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # The Workflow Compiler
2
2
 
3
- You wrote a durable workflow. It works. `proxyActivities`, `sleep`, `condition` — the Temporal-like 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.
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
4
 
5
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
6
 
@@ -161,7 +161,7 @@ ltc compile examples/workflows/ --dry-run
161
161
  ● basic-signal/index.ts
162
162
  Function: basicSignal · HotMesh Durable
163
163
  Activities: ltCreateEscalation, processApproval
164
- Control flow: conditionLT
164
+ Control flow: conditional
165
165
 
166
166
  ● kitchen-sink/index.ts
167
167
  Function: kitchenSink · HotMesh Durable
package/docs/dashboard.md CHANGED
@@ -267,7 +267,7 @@ Accessible at `/admin/roles/:role/schema`. The versioned form behind a role's es
267
267
 
268
268
  - **Editor** — form fields as JSON Schema in a full-width editor, with an optional change summary recorded on the version the save creates. **Save Version** writes only the schema: every save that changes it appends an immutable snapshot and advances the current version.
269
269
  - **Version rail** — the full history with the current version marked. Expand any version to view its snapshot or load it into the editor as the base for the next save.
270
- - **Pinning** — workflows pin a version via `schemaVersion` in the `conditionLT` config, so their resolver form keeps that exact shape for the life of the run. Escalations without a pin render the latest version.
270
+ - **Pinning** — workflows pin a version via `schemaVersion` in the `conditional` config, so their resolver form keeps that exact shape for the life of the run. Escalations without a pin render the latest version.
271
271
 
272
272
  **API:** `GET /api/roles/:role/schema` fetches the latest or a pinned version. `GET /api/roles/:role/schema/versions` lists the history. `PATCH /api/roles/:role` with `form_schema` (+ optional `change_summary`) saves a new version.
273
273
 
package/docs/data.md CHANGED
@@ -40,7 +40,7 @@ The graph edges that don't fit the line. `lt_roles.parent_role` places a role in
40
40
 
41
41
  ### lt_role_schemas
42
42
 
43
- Immutable version history of each role's schema pair. Every change to a role's `form_schema` or `metadata_schema` (via `PATCH /api/roles/:role`, the SDK, or the `update_role` MCP tool) appends the next `(role, version)` snapshot in the same atomic statement that updates `lt_roles`. Escalations pin a version via `metadata.schema_version` (`conditionLT`'s `schemaVersion` field) so the resolver form they render stays exactly what their author specified; unpinned escalations use the live columns on `lt_roles`.
43
+ Immutable version history of each role's schema pair. Every change to a role's `form_schema` or `metadata_schema` (via `PATCH /api/roles/:role`, the SDK, or the `update_role` MCP tool) appends the next `(role, version)` snapshot in the same atomic statement that updates `lt_roles`. Escalations pin a version via `metadata.schema_version` (`conditional`'s `schemaVersion` field) so the resolver form they render stays exactly what their author specified; unpinned escalations use the live columns on `lt_roles`.
44
44
 
45
45
  | Column | Type | Default | Description |
46
46
  |--------|------|---------|-------------|
@@ -101,7 +101,7 @@ Tracks every workflow execution. Created by the LT interceptor when a workflow s
101
101
 
102
102
  Records human intervention requests. Created when a workflow returns
103
103
  `type: 'escalation'`, when `ltCreateEscalation` runs, or atomically when a
104
- workflow calls `condition(signalId, config)` / `conditionLT(signalId, config)`.
104
+ workflow calls `condition(signalId, config)` / `conditional(signalId, config)`.
105
105
  Updated when claimed or resolved.
106
106
 
107
107
  The storage is the **shared HotMesh table `public.hmsh_escalations`**
@@ -112,7 +112,7 @@ Indexes are managed by the SDK on `hmsh_escalations` (see below).
112
112
 
113
113
  Role read/write scope does **not** add columns here. An escalation carries a `role`
114
114
  and an optional `assigned_to`; work-surface scope lives on the membership table
115
- (`lt_user_roles`) and is applied at read time. `condition()` / `conditionLT()` and
115
+ (`lt_user_roles`) and is applied at read time. `condition()` / `conditional()` and
116
116
  the escalation engine are unaffected.
117
117
 
118
118
  The columns below are the `hmsh_escalations` table. The public API record
@@ -1,17 +1,19 @@
1
1
  # Creating Escalations
2
2
 
3
- ## `conditionLT` — Atomic Pattern
3
+ ## `conditional` — Atomic Pattern
4
4
 
5
- Pass an escalation config to `conditionLT`. The escalation row, its metadata, and the resume timer all commit inside the workflow's Leg1 checkpoint — one write, crash-safe. The `signal_key` on the row is the resume key: the dashboard resolve endpoint and `POST /api/escalations/resolve-by-signal-key` both resume this job in place, and the `system.escalation.{role}.{id}.created` event fires automatically.
5
+ Pass an escalation config to `conditional`. The escalation row, its metadata, and the resume timer all commit inside the workflow's Leg1 checkpoint — one write, crash-safe. The `signal_key` on the row is the resume key: the dashboard resolve endpoint and `POST /api/escalations/resolve-by-signal-key` both resume this job in place, and the `system.escalation.{role}.{id}.created` event fires automatically.
6
+
7
+ > `conditionLT` is a deprecated alias of `conditional`. Existing code continues to work.
6
8
 
7
9
  ```typescript
8
- import { conditionLT } from '@hotmeshio/long-tail';
10
+ import { conditional } from '@hotmeshio/long-tail';
9
11
 
10
12
  export async function approvalWorkflow(envelope: LTEnvelope) {
11
13
  const ctx = Durable.workflow.workflowInfo();
12
14
  const signalId = `approval-${ctx.workflowId}`;
13
15
 
14
- const decision = await conditionLT<{ approved: boolean; notes?: string }>(signalId, {
16
+ const decision = await conditional<{ approved: boolean; notes?: string }>(signalId, {
15
17
  role: 'finance-reviewer',
16
18
  type: 'approval',
17
19
  subtype: 'budget-request',
@@ -48,7 +50,7 @@ export async function approvalWorkflow(envelope: LTEnvelope) {
48
50
  }
49
51
  ```
50
52
 
51
- `conditionLT` returns `T | false | null`:
53
+ `conditional` returns `T | false | null`:
52
54
  - `T` — the human's resolver payload
53
55
  - `false` — SLA timeout (omit `timeout` for an open-ended wait)
54
56
  - `null` — cancellation (workflow terminated or explicit cancel)
@@ -60,7 +62,7 @@ Interactive and webhook resolves deliver the resolver's identity alongside the p
60
62
  ```typescript
61
63
  import type { EscalationResolution } from '@hotmeshio/long-tail';
62
64
 
63
- const decision = await conditionLT<{
65
+ const decision = await conditional<{
64
66
  approved: boolean;
65
67
  $resolution?: EscalationResolution;
66
68
  }>(signalId, { role: 'order-reviewer', metadata: { orderId } });
@@ -80,7 +82,7 @@ Every field of the config — including all `metadata` facets — commits inside
80
82
 
81
83
  ### Early-signal buffering
82
84
 
83
- A resolve that races ahead of the `conditionLT` registration (a fast webhook, or a payload deposited before the workflow starts) is held as a pending signal and delivered when the wait registers — 10 minutes by default; pass `expire` to `signal()` when signaling early on purpose. Fan-out (`Promise.all` over many waits) scales the same way.
85
+ A resolve that races ahead of the `conditional` registration (a fast webhook, or a payload deposited before the workflow starts) is held as a pending signal and delivered when the wait registers — 10 minutes by default; pass `expire` to `signal()` when signaling early on purpose. Fan-out (`Promise.all` over many waits) scales the same way.
84
86
 
85
87
  ---
86
88
 
@@ -89,7 +91,7 @@ A resolve that races ahead of the `conditionLT` registration (a fast webhook, or
89
91
  Every role carries a versioned `form_schema`. Every save that changes it appends an immutable snapshot to `lt_role_schemas` and advances the role's current version. Escalations pin one with `schemaVersion`:
90
92
 
91
93
  ```typescript
92
- const decision = await conditionLT<{ approved: boolean; lotNumber: string }>(signalId, {
94
+ const decision = await conditional<{ approved: boolean; lotNumber: string }>(signalId, {
93
95
  role: 'reviewer',
94
96
  description: instructions,
95
97
  schemaVersion: 3, // renders role schema v3, always, regardless of later edits
@@ -130,12 +132,12 @@ The reference examples ship as fully runnable seeds:
130
132
  ### Simple approval
131
133
 
132
134
  ```typescript
133
- import { conditionLT } from '@hotmeshio/long-tail';
135
+ import { conditional } from '@hotmeshio/long-tail';
134
136
 
135
137
  export async function approveSpendWorkflow(envelope: LTEnvelope) {
136
138
  const ctx = Durable.workflow.workflowInfo();
137
139
 
138
- const decision = await conditionLT<{ approved: boolean; notes?: string }>(
140
+ const decision = await conditional<{ approved: boolean; notes?: string }>(
139
141
  `spend-approval-${ctx.workflowId}`,
140
142
  {
141
143
  role: 'finance-reviewer',
@@ -173,7 +175,7 @@ export async function approveSpendWorkflow(envelope: LTEnvelope) {
173
175
  Dynamic checklist where item labels come from the workflow's envelope, not the static schema. Item count and wording vary per escalation without touching the form schema.
174
176
 
175
177
  ```typescript
176
- import { conditionLT } from '@hotmeshio/long-tail';
178
+ import { conditional } from '@hotmeshio/long-tail';
177
179
 
178
180
  export async function stationCheckWorkflow(envelope: LTEnvelope) {
179
181
  const ctx = Durable.workflow.workflowInfo();
@@ -184,7 +186,7 @@ export async function stationCheckWorkflow(envelope: LTEnvelope) {
184
186
  { id: 'step_2', label: 'Sign the dispensing log' },
185
187
  ];
186
188
 
187
- const result = await conditionLT<{ checks: Record<string, boolean> }>(
189
+ const result = await conditional<{ checks: Record<string, boolean> }>(
188
190
  `station-check-${ctx.workflowId}`,
189
191
  {
190
192
  role: 'station-operator',
package/docs/hitl/form.md CHANGED
@@ -32,6 +32,7 @@ Declare `title` on every field whose key isn't already a readable label — it i
32
32
  | `number` | Number input |
33
33
  | `string` | Text input (default) |
34
34
  | `string` + `enum` | Dropdown select |
35
+ | `string`/`number` + `x-lt-options` | Dropdown select — options resolved from the escalation context (see [x-lt-validation.md](x-lt-validation.md#dynamic-select-options-x-lt-options)) |
35
36
  | `null` | Read-only "null" display |
36
37
  | `array` | Tag display (read-only) |
37
38
  | `object` | Nested section with recursive fields, or a widget (see [x-lt-widget.md](x-lt-widget.md)) |
@@ -51,8 +51,8 @@ const WORKBENCH_FORM_SCHEMA = {
51
51
  },
52
52
  };
53
53
 
54
- // Workflow side — the wait is a normal conditionLT; the iframe submits the payload
55
- const design = await conditionLT<{ stl_url: string }>(signalId, {
54
+ // Workflow side — the wait is a normal conditional; the iframe submits the payload
55
+ const design = await conditional<{ stl_url: string }>(signalId, {
56
56
  role: 'cad-designer',
57
57
  description: 'Design the widget for this order.',
58
58
  escalation_payload: JSON.stringify({ workbenchId, companyId }),