@hotmeshio/long-tail 0.14.4 → 0.16.1

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 (300) 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 +22 -17
  46. package/build/shared/form-validation/index.d.ts +1 -0
  47. package/build/shared/form-validation/index.js +1 -0
  48. package/build/shared/form-validation/x-lt-help.d.ts +1 -1
  49. package/build/shared/form-validation/x-lt-help.js +2 -1
  50. package/build/shared/form-validation/x-lt-options.d.ts +7 -17
  51. package/build/shared/form-validation/x-lt-options.js +61 -27
  52. package/build/system/activities/knowledge.d.ts +3 -0
  53. package/build/system/activities/knowledge.js +5 -2
  54. package/build/system/activities/sql.d.ts +6 -10
  55. package/build/system/activities/sql.js +105 -49
  56. package/build/system/mcp-servers/admin/schemas.d.ts +4 -4
  57. package/build/system/mcp-servers/knowledge.js +23 -2
  58. package/build/system/seed/tool-manifests-escalation.js +12 -0
  59. package/build/system/seed/tool-manifests-knowledge.d.ts +36 -0
  60. package/build/system/seed/tool-manifests-knowledge.js +15 -1
  61. package/build/tsconfig.tsbuildinfo +1 -1
  62. package/build/types/escalation.d.ts +37 -3
  63. package/build/types/escalation.js +42 -2
  64. package/dashboard/dist/assets/{AdminDashboard-CUqnrc7h.js → AdminDashboard-Dnj4asuh.js} +2 -2
  65. package/dashboard/dist/assets/{AdminDashboard-CUqnrc7h.js.map → AdminDashboard-Dnj4asuh.js.map} +1 -1
  66. package/dashboard/dist/assets/{AgentConfigPage-lmUOwyHO.js → AgentConfigPage-CS0CezLt.js} +6 -6
  67. package/dashboard/dist/assets/AgentConfigPage-CS0CezLt.js.map +1 -0
  68. package/dashboard/dist/assets/{AgentDetailPage-C_xAw6aF.js → AgentDetailPage-CG0HO-MG.js} +2 -2
  69. package/dashboard/dist/assets/AgentDetailPage-CG0HO-MG.js.map +1 -0
  70. package/dashboard/dist/assets/{AgentsPage-CHCGAkpN.js → AgentsPage-cLZPda64.js} +2 -2
  71. package/dashboard/dist/assets/{AgentsPage-CHCGAkpN.js.map → AgentsPage-cLZPda64.js.map} +1 -1
  72. package/dashboard/dist/assets/AvailableEscalationsPage-Dv5GE_NU.js +2 -0
  73. package/dashboard/dist/assets/{AvailableEscalationsPage-BvQdHMl2.js.map → AvailableEscalationsPage-Dv5GE_NU.js.map} +1 -1
  74. package/dashboard/dist/assets/{BotPicker-Dsr8Yyj_.js → BotPicker-BgXaJfUZ.js} +2 -2
  75. package/dashboard/dist/assets/{BotPicker-Dsr8Yyj_.js.map → BotPicker-BgXaJfUZ.js.map} +1 -1
  76. package/dashboard/dist/assets/{BulkAssignModal-CbUftMR2.js → BulkAssignModal-BUfV9aba.js} +2 -2
  77. package/dashboard/dist/assets/{BulkAssignModal-CbUftMR2.js.map → BulkAssignModal-BUfV9aba.js.map} +1 -1
  78. package/dashboard/dist/assets/CapabilitiesPage-CaiDhtmq.js +2 -0
  79. package/dashboard/dist/assets/{CapabilitiesPage-CPNUJPHs.js.map → CapabilitiesPage-CaiDhtmq.js.map} +1 -1
  80. package/dashboard/dist/assets/{CollapsibleSection-DffGX2tR.js → CollapsibleSection-C6R7Lhao.js} +2 -2
  81. package/dashboard/dist/assets/{CollapsibleSection-DffGX2tR.js.map → CollapsibleSection-C6R7Lhao.js.map} +1 -1
  82. package/dashboard/dist/assets/CountdownTimer-CFR2pPT9.js +2 -0
  83. package/dashboard/dist/assets/CountdownTimer-CFR2pPT9.js.map +1 -0
  84. package/dashboard/dist/assets/{CredentialsPage-UXnD_Rau.js → CredentialsPage-9d2xZhfU.js} +2 -2
  85. package/dashboard/dist/assets/{CredentialsPage-UXnD_Rau.js.map → CredentialsPage-9d2xZhfU.js.map} +1 -1
  86. package/dashboard/dist/assets/{CronLabel-CctUYUlI.js → CronLabel-BfIYBjTD.js} +2 -2
  87. package/dashboard/dist/assets/{CronLabel-CctUYUlI.js.map → CronLabel-BfIYBjTD.js.map} +1 -1
  88. package/dashboard/dist/assets/{DropZone-7UoXQ4qL.js → DropZone-Pv-v5RAs.js} +2 -2
  89. package/dashboard/dist/assets/{DropZone-7UoXQ4qL.js.map → DropZone-Pv-v5RAs.js.map} +1 -1
  90. package/dashboard/dist/assets/{ElapsedCell-C7_Y8xXn.js → ElapsedCell-DV-35FDF.js} +2 -2
  91. package/dashboard/dist/assets/{ElapsedCell-C7_Y8xXn.js.map → ElapsedCell-DV-35FDF.js.map} +1 -1
  92. package/dashboard/dist/assets/{EntityTimelinePanel-pRu91gZK.js → EntityTimelinePanel-mHaN_i7a.js} +2 -2
  93. package/dashboard/dist/assets/{EntityTimelinePanel-pRu91gZK.js.map → EntityTimelinePanel-mHaN_i7a.js.map} +1 -1
  94. package/dashboard/dist/assets/{EscalationListSchemaPage-B3f2mjqg.js → EscalationListSchemaPage-Km5jnrIW.js} +2 -2
  95. package/dashboard/dist/assets/{EscalationListSchemaPage-B3f2mjqg.js.map → EscalationListSchemaPage-Km5jnrIW.js.map} +1 -1
  96. package/dashboard/dist/assets/{EscalationSchemaPage-AJ85FRZy.js → EscalationSchemaPage-CAJGIBv2.js} +2 -2
  97. package/dashboard/dist/assets/{EscalationSchemaPage-AJ85FRZy.js.map → EscalationSchemaPage-CAJGIBv2.js.map} +1 -1
  98. package/dashboard/dist/assets/{EscalationsOverview-DMLLWzjS.js → EscalationsOverview-nk9FXKmv.js} +2 -2
  99. package/dashboard/dist/assets/{EscalationsOverview-DMLLWzjS.js.map → EscalationsOverview-nk9FXKmv.js.map} +1 -1
  100. package/dashboard/dist/assets/{EventTable-BlNuCTN6.js → EventTable-DNRaYzTn.js} +2 -2
  101. package/dashboard/dist/assets/{EventTable-BlNuCTN6.js.map → EventTable-DNRaYzTn.js.map} +1 -1
  102. package/dashboard/dist/assets/{FilterBar-B-rkcWkV.js → FilterBar-CmRA_E6x.js} +2 -2
  103. package/dashboard/dist/assets/{FilterBar-B-rkcWkV.js.map → FilterBar-CmRA_E6x.js.map} +1 -1
  104. package/dashboard/dist/assets/{GraphInvokePage-Bkt5tAFo.js → GraphInvokePage-HJfa82kv.js} +2 -2
  105. package/dashboard/dist/assets/{GraphInvokePage-Bkt5tAFo.js.map → GraphInvokePage-HJfa82kv.js.map} +1 -1
  106. package/dashboard/dist/assets/{HomePage-CIE9bCFQ.js → HomePage-B2JDwmmh.js} +2 -2
  107. package/dashboard/dist/assets/{HomePage-CIE9bCFQ.js.map → HomePage-B2JDwmmh.js.map} +1 -1
  108. package/dashboard/dist/assets/ListToolbar-CKuJ7HUH.js +2 -0
  109. package/dashboard/dist/assets/{ListToolbar-C_-Utxqm.js.map → ListToolbar-CKuJ7HUH.js.map} +1 -1
  110. package/dashboard/dist/assets/{McpOverview-c0p171OK.js → McpOverview-CZCzbiRs.js} +2 -2
  111. package/dashboard/dist/assets/{McpOverview-c0p171OK.js.map → McpOverview-CZCzbiRs.js.map} +1 -1
  112. package/dashboard/dist/assets/{McpQueryDetailPage-B61I9-dM.js → McpQueryDetailPage-C081BBcH.js} +3 -3
  113. package/dashboard/dist/assets/{McpQueryDetailPage-B61I9-dM.js.map → McpQueryDetailPage-C081BBcH.js.map} +1 -1
  114. package/dashboard/dist/assets/McpQueryPage-841V8CXb.js +2 -0
  115. package/dashboard/dist/assets/{McpQueryPage-Viqi13Fa.js.map → McpQueryPage-841V8CXb.js.map} +1 -1
  116. package/dashboard/dist/assets/{McpRunDetailPage-CiAx_xyV.js → McpRunDetailPage-DZjlgp5W.js} +2 -2
  117. package/dashboard/dist/assets/{McpRunDetailPage-CiAx_xyV.js.map → McpRunDetailPage-DZjlgp5W.js.map} +1 -1
  118. package/dashboard/dist/assets/{McpRunsPage-BpfvNRbE.js → McpRunsPage-DW0VVd46.js} +2 -2
  119. package/dashboard/dist/assets/{McpRunsPage-BpfvNRbE.js.map → McpRunsPage-DW0VVd46.js.map} +1 -1
  120. package/dashboard/dist/assets/{NamespacePill-CKp_9EaI.js → NamespacePill-DONj6eUU.js} +2 -2
  121. package/dashboard/dist/assets/{NamespacePill-CKp_9EaI.js.map → NamespacePill-DONj6eUU.js.map} +1 -1
  122. package/dashboard/dist/assets/{OperationsPage-DGKwUE6h.js → OperationsPage-DAw7z_Sh.js} +3 -3
  123. package/dashboard/dist/assets/{OperationsPage-DGKwUE6h.js.map → OperationsPage-DAw7z_Sh.js.map} +1 -1
  124. package/dashboard/dist/assets/{OperatorDashboard-ha-05tgB.js → OperatorDashboard-BAnQNuD6.js} +2 -2
  125. package/dashboard/dist/assets/{OperatorDashboard-ha-05tgB.js.map → OperatorDashboard-BAnQNuD6.js.map} +1 -1
  126. package/dashboard/dist/assets/{PageHeader-CDDpHpdv.js → PageHeader-CFVw67M6.js} +2 -2
  127. package/dashboard/dist/assets/{PageHeader-CDDpHpdv.js.map → PageHeader-CFVw67M6.js.map} +1 -1
  128. package/dashboard/dist/assets/{PageHeaderWithStats-DIWH6fRv.js → PageHeaderWithStats-D9tQxILm.js} +2 -2
  129. package/dashboard/dist/assets/{PageHeaderWithStats-DIWH6fRv.js.map → PageHeaderWithStats-D9tQxILm.js.map} +1 -1
  130. package/dashboard/dist/assets/{PersonaDetailPage-DMH-D1ns.js → PersonaDetailPage-XENbpbSr.js} +2 -2
  131. package/dashboard/dist/assets/{PersonaDetailPage-DMH-D1ns.js.map → PersonaDetailPage-XENbpbSr.js.map} +1 -1
  132. package/dashboard/dist/assets/{PersonasPage-YLjCcQcU.js → PersonasPage-CoWH5Fj8.js} +2 -2
  133. package/dashboard/dist/assets/{PersonasPage-YLjCcQcU.js.map → PersonasPage-CoWH5Fj8.js.map} +1 -1
  134. package/dashboard/dist/assets/{ProcessDetailPage-W5_2FJHn.js → ProcessDetailPage-BDxOt-9L.js} +2 -2
  135. package/dashboard/dist/assets/{ProcessDetailPage-W5_2FJHn.js.map → ProcessDetailPage-BDxOt-9L.js.map} +1 -1
  136. package/dashboard/dist/assets/{ProcessesListPage-5f_2S9ER.js → ProcessesListPage-BuNOmgig.js} +2 -2
  137. package/dashboard/dist/assets/{ProcessesListPage-5f_2S9ER.js.map → ProcessesListPage-BuNOmgig.js.map} +1 -1
  138. package/dashboard/dist/assets/{RoleDetailPage-CuDTO13n.js → RoleDetailPage-DAzkfZ4T.js} +2 -2
  139. package/dashboard/dist/assets/{RoleDetailPage-CuDTO13n.js.map → RoleDetailPage-DAzkfZ4T.js.map} +1 -1
  140. package/dashboard/dist/assets/{RolePill-C0hExOmI.js → RolePill-Di_5hfvw.js} +2 -2
  141. package/dashboard/dist/assets/{RolePill-C0hExOmI.js.map → RolePill-Di_5hfvw.js.map} +1 -1
  142. package/dashboard/dist/assets/{RolesPage-McMYumsZ.js → RolesPage-C9jZL4aM.js} +2 -2
  143. package/dashboard/dist/assets/{RolesPage-McMYumsZ.js.map → RolesPage-C9jZL4aM.js.map} +1 -1
  144. package/dashboard/dist/assets/{RunAsSelector-CC87e67k.js → RunAsSelector-DswUl2-8.js} +2 -2
  145. package/dashboard/dist/assets/{RunAsSelector-CC87e67k.js.map → RunAsSelector-DswUl2-8.js.map} +1 -1
  146. package/dashboard/dist/assets/{ScanCodesPage-Zk6Jorv_.js → ScanCodesPage-D_FDxJgT.js} +2 -2
  147. package/dashboard/dist/assets/{ScanCodesPage-Zk6Jorv_.js.map → ScanCodesPage-D_FDxJgT.js.map} +1 -1
  148. package/dashboard/dist/assets/{ScanSchemeDetailPage-B79pya8o.js → ScanSchemeDetailPage-Cbkpob5g.js} +2 -2
  149. package/dashboard/dist/assets/{ScanSchemeDetailPage-B79pya8o.js.map → ScanSchemeDetailPage-Cbkpob5g.js.map} +1 -1
  150. package/dashboard/dist/assets/{ScanStationPage-BLlHMmd_.js → ScanStationPage-BI_cDWVp.js} +2 -2
  151. package/dashboard/dist/assets/{ScanStationPage-BLlHMmd_.js.map → ScanStationPage-BI_cDWVp.js.map} +1 -1
  152. package/dashboard/dist/assets/{ScopeBadge-BBQvz4pj.js → ScopeBadge-CqIIeWjK.js} +2 -2
  153. package/dashboard/dist/assets/{ScopeBadge-BBQvz4pj.js.map → ScopeBadge-CqIIeWjK.js.map} +1 -1
  154. package/dashboard/dist/assets/{StickyPagination-CnJgQPU1.js → StickyPagination-CfTEnlh5.js} +2 -2
  155. package/dashboard/dist/assets/{StickyPagination-CnJgQPU1.js.map → StickyPagination-CfTEnlh5.js.map} +1 -1
  156. package/dashboard/dist/assets/{StreamMessageDetail-CU5wrqO_.js → StreamMessageDetail-oa7Bx0lB.js} +2 -2
  157. package/dashboard/dist/assets/{StreamMessageDetail-CU5wrqO_.js.map → StreamMessageDetail-oa7Bx0lB.js.map} +1 -1
  158. package/dashboard/dist/assets/{SwimlaneTimeline-D5m-_zgy.js → SwimlaneTimeline-CO96ep4N.js} +2 -2
  159. package/dashboard/dist/assets/{SwimlaneTimeline-D5m-_zgy.js.map → SwimlaneTimeline-CO96ep4N.js.map} +1 -1
  160. package/dashboard/dist/assets/{TagInput-BXxXs1JD.js → TagInput-BLwxTNsI.js} +2 -2
  161. package/dashboard/dist/assets/{TagInput-BXxXs1JD.js.map → TagInput-BLwxTNsI.js.map} +1 -1
  162. package/dashboard/dist/assets/{TaskDetailPage-SvVSH39Q.js → TaskDetailPage-BiO2eFQ0.js} +2 -2
  163. package/dashboard/dist/assets/{TaskDetailPage-SvVSH39Q.js.map → TaskDetailPage-BiO2eFQ0.js.map} +1 -1
  164. package/dashboard/dist/assets/{TaskQueuePill-BKGJBVZG.js → TaskQueuePill-DVgcqd-h.js} +2 -2
  165. package/dashboard/dist/assets/{TaskQueuePill-BKGJBVZG.js.map → TaskQueuePill-DVgcqd-h.js.map} +1 -1
  166. package/dashboard/dist/assets/{TasksListPage-BtpwvxkS.js → TasksListPage-DQ4WJfJo.js} +2 -2
  167. package/dashboard/dist/assets/{TasksListPage-BtpwvxkS.js.map → TasksListPage-DQ4WJfJo.js.map} +1 -1
  168. package/dashboard/dist/assets/{TimeAgo-BPODA7Dm.js → TimeAgo-ZwSSU_EG.js} +2 -2
  169. package/dashboard/dist/assets/{TimeAgo-BPODA7Dm.js.map → TimeAgo-ZwSSU_EG.js.map} +1 -1
  170. package/dashboard/dist/assets/{TimestampCell-DEQXlxbH.js → TimestampCell-BHmJ7das.js} +2 -2
  171. package/dashboard/dist/assets/{TimestampCell-DEQXlxbH.js.map → TimestampCell-BHmJ7das.js.map} +1 -1
  172. package/dashboard/dist/assets/{ToolPill-BY6zLSfA.js → ToolPill-C6hkOqPx.js} +2 -2
  173. package/dashboard/dist/assets/{ToolPill-BY6zLSfA.js.map → ToolPill-C6hkOqPx.js.map} +1 -1
  174. package/dashboard/dist/assets/{ToolTestPanel-Ztc0pRSh.js → ToolTestPanel-DARNx6e0.js} +2 -2
  175. package/dashboard/dist/assets/{ToolTestPanel-Ztc0pRSh.js.map → ToolTestPanel-DARNx6e0.js.map} +1 -1
  176. package/dashboard/dist/assets/{TopicDetailPage-BmpEqg-Q.js → TopicDetailPage-BYcF0lO8.js} +3 -3
  177. package/dashboard/dist/assets/{TopicDetailPage-BmpEqg-Q.js.map → TopicDetailPage-BYcF0lO8.js.map} +1 -1
  178. package/dashboard/dist/assets/{TopicsPage-BVW5y6vE.js → TopicsPage-CG-IZfpq.js} +2 -2
  179. package/dashboard/dist/assets/{TopicsPage-BVW5y6vE.js.map → TopicsPage-CG-IZfpq.js.map} +1 -1
  180. package/dashboard/dist/assets/{UserName-D915g7ba.js → UserName-BGn4sSx1.js} +2 -2
  181. package/dashboard/dist/assets/{UserName-D915g7ba.js.map → UserName-BGn4sSx1.js.map} +1 -1
  182. package/dashboard/dist/assets/{WorkflowExecutionPage-CIl9ESgk.js → WorkflowExecutionPage-Dt_lskas.js} +2 -2
  183. package/dashboard/dist/assets/{WorkflowExecutionPage-CIl9ESgk.js.map → WorkflowExecutionPage-Dt_lskas.js.map} +1 -1
  184. package/dashboard/dist/assets/{WorkflowPill-qp5UF3-y.js → WorkflowPill-CN-952iI.js} +2 -2
  185. package/dashboard/dist/assets/{WorkflowPill-qp5UF3-y.js.map → WorkflowPill-CN-952iI.js.map} +1 -1
  186. package/dashboard/dist/assets/{WorkflowsDashboard-DtkaGgdZ.js → WorkflowsDashboard-Dl3carpF.js} +2 -2
  187. package/dashboard/dist/assets/{WorkflowsDashboard-DtkaGgdZ.js.map → WorkflowsDashboard-Dl3carpF.js.map} +1 -1
  188. package/dashboard/dist/assets/{WorkflowsOverview-DANXhmXb.js → WorkflowsOverview-6CplKLvQ.js} +2 -2
  189. package/dashboard/dist/assets/{WorkflowsOverview-DANXhmXb.js.map → WorkflowsOverview-6CplKLvQ.js.map} +1 -1
  190. package/dashboard/dist/assets/{YamlWorkflowDetailPage-m6Ub7qtE.js → YamlWorkflowDetailPage-CZf6zZ4Q.js} +2 -2
  191. package/dashboard/dist/assets/{YamlWorkflowDetailPage-m6Ub7qtE.js.map → YamlWorkflowDetailPage-CZf6zZ4Q.js.map} +1 -1
  192. package/dashboard/dist/assets/{YamlWorkflowsPage-5MOsxbLW.js → YamlWorkflowsPage-DRQ_3CZG.js} +2 -2
  193. package/dashboard/dist/assets/{YamlWorkflowsPage-5MOsxbLW.js.map → YamlWorkflowsPage-DRQ_3CZG.js.map} +1 -1
  194. package/dashboard/dist/assets/{agents-DacpnIqz.js → agents-BvtecCN5.js} +2 -2
  195. package/dashboard/dist/assets/{agents-DacpnIqz.js.map → agents-BvtecCN5.js.map} +1 -1
  196. package/dashboard/dist/assets/{bots-El47Xy5a.js → bots-CSmIqXtL.js} +2 -2
  197. package/dashboard/dist/assets/{bots-El47Xy5a.js.map → bots-CSmIqXtL.js.map} +1 -1
  198. package/dashboard/dist/assets/{capabilities-DGC__Aob.js → capabilities-xMqvjbWI.js} +2 -2
  199. package/dashboard/dist/assets/{capabilities-DGC__Aob.js.map → capabilities-xMqvjbWI.js.map} +1 -1
  200. package/dashboard/dist/assets/{controlplane-Bzx-qd8m.js → controlplane-Bi-tz-Gr.js} +2 -2
  201. package/dashboard/dist/assets/{controlplane-Bzx-qd8m.js.map → controlplane-Bi-tz-Gr.js.map} +1 -1
  202. package/dashboard/dist/assets/{escalation-columns-BmY7BriY.js → escalation-columns-DSalfPHI.js} +2 -2
  203. package/dashboard/dist/assets/{escalation-columns-BmY7BriY.js.map → escalation-columns-DSalfPHI.js.map} +1 -1
  204. package/dashboard/dist/assets/{index-Bwlnpbpd.js → index-BIK4b7Ei.js} +2 -2
  205. package/dashboard/dist/assets/{index-Bwlnpbpd.js.map → index-BIK4b7Ei.js.map} +1 -1
  206. package/dashboard/dist/assets/{index-BPK2cB4Q.js → index-BWyPrDYG.js} +4 -4
  207. package/dashboard/dist/assets/{index-BPK2cB4Q.js.map → index-BWyPrDYG.js.map} +1 -1
  208. package/dashboard/dist/assets/{index-Ce6ghhpn.js → index-BYukuL1u.js} +2 -2
  209. package/dashboard/dist/assets/{index-Ce6ghhpn.js.map → index-BYukuL1u.js.map} +1 -1
  210. package/dashboard/dist/assets/index-Bf9cfGX_.js +3 -0
  211. package/dashboard/dist/assets/index-Bf9cfGX_.js.map +1 -0
  212. package/dashboard/dist/assets/{index-CHwg51qz.js → index-BjxQVsbg.js} +2 -2
  213. package/dashboard/dist/assets/{index-CHwg51qz.js.map → index-BjxQVsbg.js.map} +1 -1
  214. package/dashboard/dist/assets/{index-DpsVlk5z.js → index-C8pPqnJb.js} +2 -2
  215. package/dashboard/dist/assets/{index-DpsVlk5z.js.map → index-C8pPqnJb.js.map} +1 -1
  216. package/dashboard/dist/assets/{index-DYz57kr_.js → index-CEsGT3c9.js} +2 -2
  217. package/dashboard/dist/assets/{index-DYz57kr_.js.map → index-CEsGT3c9.js.map} +1 -1
  218. package/dashboard/dist/assets/{index-Cfw6FARc.js → index-DATqc8Gv.js} +2 -2
  219. package/dashboard/dist/assets/{index-Cfw6FARc.js.map → index-DATqc8Gv.js.map} +1 -1
  220. package/dashboard/dist/assets/{index-ZtpEajtq.js → index-cX2H_U7R.js} +2 -2
  221. package/dashboard/dist/assets/{index-ZtpEajtq.js.map → index-cX2H_U7R.js.map} +1 -1
  222. package/dashboard/dist/assets/{index-CoIh4ipz.js → index-gHDAcM64.js} +2 -2
  223. package/dashboard/dist/assets/{index-CoIh4ipz.js.map → index-gHDAcM64.js.map} +1 -1
  224. package/dashboard/dist/assets/{index-SU2xrnBD.js → index-sbfCx2CF.js} +31 -31
  225. package/dashboard/dist/assets/index-sbfCx2CF.js.map +1 -0
  226. package/dashboard/dist/assets/index-shnwALdy.js +2 -0
  227. package/dashboard/dist/assets/index-shnwALdy.js.map +1 -0
  228. package/dashboard/dist/assets/index-uqT6ovVQ.js +2 -0
  229. package/dashboard/dist/assets/{index-DH_xm9UQ.js.map → index-uqT6ovVQ.js.map} +1 -1
  230. package/dashboard/dist/assets/knowledge-DbDvUbq7.js +2 -0
  231. package/dashboard/dist/assets/knowledge-DbDvUbq7.js.map +1 -0
  232. package/dashboard/dist/assets/{mcp-BEqxxlW9.js → mcp-I2OmwD8P.js} +2 -2
  233. package/dashboard/dist/assets/{mcp-BEqxxlW9.js.map → mcp-I2OmwD8P.js.map} +1 -1
  234. package/dashboard/dist/assets/{mcp-query-qXTlQfc_.js → mcp-query-DwTp77HP.js} +2 -2
  235. package/dashboard/dist/assets/{mcp-query-qXTlQfc_.js.map → mcp-query-DwTp77HP.js.map} +1 -1
  236. package/dashboard/dist/assets/{personas-jJEDmBtg.js → personas-DDr8gQGC.js} +2 -2
  237. package/dashboard/dist/assets/{personas-jJEDmBtg.js.map → personas-DDr8gQGC.js.map} +1 -1
  238. package/dashboard/dist/assets/{pipelines-BNPJh69x.js → pipelines-uptnM5Qj.js} +2 -2
  239. package/dashboard/dist/assets/{pipelines-BNPJh69x.js.map → pipelines-uptnM5Qj.js.map} +1 -1
  240. package/dashboard/dist/assets/{tasks-DhD71qXJ.js → tasks-Em0f5Rsk.js} +2 -2
  241. package/dashboard/dist/assets/{tasks-DhD71qXJ.js.map → tasks-Em0f5Rsk.js.map} +1 -1
  242. package/dashboard/dist/assets/{topics-CrXwwuW-.js → topics-B81zAt9U.js} +2 -2
  243. package/dashboard/dist/assets/{topics-CrXwwuW-.js.map → topics-B81zAt9U.js.map} +1 -1
  244. package/dashboard/dist/assets/{useEventHooks-DL7R0ASv.js → useEventHooks-B_Bqqzlo.js} +2 -2
  245. package/dashboard/dist/assets/{useEventHooks-DL7R0ASv.js.map → useEventHooks-B_Bqqzlo.js.map} +1 -1
  246. package/dashboard/dist/assets/{useNamespace-ETqzJakA.js → useNamespace-CZfue_oE.js} +2 -2
  247. package/dashboard/dist/assets/{useNamespace-ETqzJakA.js.map → useNamespace-CZfue_oE.js.map} +1 -1
  248. package/dashboard/dist/assets/{useYamlActivityEvents-SqY67S-F.js → useYamlActivityEvents-DjQ7rsOC.js} +2 -2
  249. package/dashboard/dist/assets/{useYamlActivityEvents-SqY67S-F.js.map → useYamlActivityEvents-DjQ7rsOC.js.map} +1 -1
  250. package/dashboard/dist/assets/{users-DF8dTbOo.js → users-CwUL9YJT.js} +2 -2
  251. package/dashboard/dist/assets/{users-DF8dTbOo.js.map → users-CwUL9YJT.js.map} +1 -1
  252. package/dashboard/dist/assets/{vendor-icons-BgsXTN4h.js → vendor-icons-h-jlRSb9.js} +141 -146
  253. package/dashboard/dist/assets/vendor-icons-h-jlRSb9.js.map +1 -0
  254. package/dashboard/dist/assets/{workflows-Bdke7fzx.js → workflows-gSjgU0KB.js} +2 -2
  255. package/dashboard/dist/assets/{workflows-Bdke7fzx.js.map → workflows-gSjgU0KB.js.map} +1 -1
  256. package/dashboard/dist/assets/{yaml-workflows-UMxHYunb.js → yaml-workflows-a_7IO_a6.js} +2 -2
  257. package/dashboard/dist/assets/{yaml-workflows-UMxHYunb.js.map → yaml-workflows-a_7IO_a6.js.map} +1 -1
  258. package/dashboard/dist/index.html +2 -2
  259. package/docs/api/http/escalations.md +31 -8
  260. package/docs/api/http/knowledge.md +24 -2
  261. package/docs/api/http/roles.md +1 -1
  262. package/docs/api/mcp/admin.md +1 -1
  263. package/docs/api/mcp/human-queue.md +14 -0
  264. package/docs/api/mcp/knowledge.md +17 -1
  265. package/docs/api/sdk/escalations.md +38 -15
  266. package/docs/api/sdk/knowledge.md +27 -0
  267. package/docs/api/sdk/roles.md +1 -1
  268. package/docs/compilation.md +1 -1
  269. package/docs/compiler.md +2 -2
  270. package/docs/dashboard.md +1 -1
  271. package/docs/data.md +3 -3
  272. package/docs/hitl/escalation.md +14 -12
  273. package/docs/hitl/iframe.md +2 -2
  274. package/docs/hitl/lookups.md +145 -0
  275. package/docs/hitl/resolution.md +4 -4
  276. package/docs/hitl/roles.md +4 -4
  277. package/docs/hitl/x-lt-show-if.md +1 -1
  278. package/docs/hitl/x-lt-transition.md +2 -2
  279. package/docs/hitl/x-lt-validation.md +4 -2
  280. package/docs/hitl/x-lt-widget.md +2 -2
  281. package/docs/hitl-guide.md +6 -3
  282. package/docs/story.md +1 -1
  283. package/package.json +1 -1
  284. package/dashboard/dist/assets/AgentConfigPage-lmUOwyHO.js.map +0 -1
  285. package/dashboard/dist/assets/AgentDetailPage-C_xAw6aF.js.map +0 -1
  286. package/dashboard/dist/assets/AvailableEscalationsPage-BvQdHMl2.js +0 -2
  287. package/dashboard/dist/assets/CapabilitiesPage-CPNUJPHs.js +0 -2
  288. package/dashboard/dist/assets/CountdownTimer-Bb_VuJc8.js +0 -2
  289. package/dashboard/dist/assets/CountdownTimer-Bb_VuJc8.js.map +0 -1
  290. package/dashboard/dist/assets/ListToolbar-C_-Utxqm.js +0 -2
  291. package/dashboard/dist/assets/McpQueryPage-Viqi13Fa.js +0 -2
  292. package/dashboard/dist/assets/index-B4ZNPgcz.js +0 -2
  293. package/dashboard/dist/assets/index-B4ZNPgcz.js.map +0 -1
  294. package/dashboard/dist/assets/index-Cqc7Wu5Y.js +0 -3
  295. package/dashboard/dist/assets/index-Cqc7Wu5Y.js.map +0 -1
  296. package/dashboard/dist/assets/index-DH_xm9UQ.js +0 -2
  297. package/dashboard/dist/assets/index-SU2xrnBD.js.map +0 -1
  298. package/dashboard/dist/assets/knowledge-k-5jr2BN.js +0 -2
  299. package/dashboard/dist/assets/knowledge-k-5jr2BN.js.map +0 -1
  300. package/dashboard/dist/assets/vendor-icons-BgsXTN4h.js.map +0 -1
@@ -0,0 +1,145 @@
1
+ # Versioned Knowledge Lookups
2
+
3
+ An escalation can pin **versioned knowledge lookups** — enumerated lists (select options, checklist items, cascade maps) that live once in the knowledge store and are referenced by thousands of rows. The refs ride the escalation; the content does not. Forms address the resolved content through the `lookup.*` context domain, so the full x-lt vocabulary works against it: `x-lt-options`, `x-lt-source`, `x-lt-showIf`, `x-lt-help`.
4
+
5
+ ---
6
+
7
+ ## The Ref
8
+
9
+ ```json
10
+ { "domain": "catalog", "key": "materials", "version": 2, "as": "materials" }
11
+ ```
12
+
13
+ | Field | Required | Meaning |
14
+ |-------|----------|---------|
15
+ | `domain` | yes | Knowledge domain |
16
+ | `key` | yes | Entry key within the domain |
17
+ | `version` | yes | The immutable edition this escalation reads |
18
+ | `as` | no | The ref's form-context address, when the key alone is ambiguous |
19
+
20
+ `version` is required by design. A ref names an **immutable edition**, never a moving target: every escalation created against edition 2 renders edition 2 forever, however the entry evolves afterward. Refs live under the reserved `envelope.lookups` key — the unindexed, render-only bag beside `formDefaults`. They ride the engine's atomic write but never touch the GIN-indexed metadata surface: refs are form plumbing, not facets.
21
+
22
+ ## Creating an Escalation with Lookups
23
+
24
+ Pass `lookups` to `conditional` — the same compile-time-literal discipline as `schemaVersion`:
25
+
26
+ ```typescript
27
+ const decision = await conditional<CascadeResolverV1>(signalId, {
28
+ role: 'catalog-picker',
29
+ description: 'Pick a material for this order',
30
+ lookups: [
31
+ { domain: 'catalog', key: 'materials', version: 2 },
32
+ { domain: 'catalog', key: 'geo', version: 1 },
33
+ ],
34
+ schemaVersion: 1,
35
+ });
36
+ ```
37
+
38
+ The refs fold into `envelope.lookups` as a pure transform — a pinned wait costs exactly what an unpinned one does. A malformed ref (missing field, non-integer version) throws before the row is written; over the HTTP create surface the same validation answers with a 400.
39
+
40
+ ## Versioning
41
+
42
+ Every knowledge entry carries a `current_version`, and every write that changes its data mints an immutable snapshot automatically — no publish step:
43
+
44
+ 1. **Add items** — write the entry (`storeEntry`, `set_knowledge_field`, the dashboard editor). The data change bumps `current_version` and snapshots the new edition. Writes that leave the data unchanged mint nothing.
45
+ 2. **Repin** — update the workflow's `lookups` literal to the new version, evolving the resolver payload type alongside when the new items change what the form can answer.
46
+ 3. **Rows in flight keep their edition** — an escalation pinned to v1 renders v1's list even after v5 exists.
47
+
48
+ Inspect the lineage with `GET /api/knowledge/entry/versions?domain=catalog&key=materials`, `ltc kb versions catalog materials`, or the `list_knowledge_versions` MCP tool. Fetch a specific edition with `?version=N` on the entry endpoint.
49
+
50
+ ## The Grant
51
+
52
+ The refs on the row ARE the grant. Any user who may read the escalation may fetch exactly the pinned editions it names:
53
+
54
+ ```
55
+ GET /api/escalations/:id/lookups
56
+ → { "lookups": [{ "domain": "catalog", "key": "materials", "version": 2, "data": { "items": [...] } }] }
57
+ ```
58
+
59
+ The general knowledge API (`/api/knowledge/*`) is a builder surface — superadmin or engineer. A member never queries the knowledge store directly; the escalation-scoped endpoint serves them precisely the editions their work item carries, and nothing else. A ref whose snapshot does not exist answers with `missing: true` for that ref — the batch never fails.
60
+
61
+ ## Form Addressing
62
+
63
+ The resolved refs form the `lookup` context domain, keyed by each ref's `as` (or its `key`):
64
+
65
+ ```json
66
+ {
67
+ "properties": {
68
+ "material": {
69
+ "type": "string",
70
+ "x-lt-options": "lookup.materials.items"
71
+ },
72
+ "checks": {
73
+ "type": "object",
74
+ "x-lt-widget": "checklist",
75
+ "x-lt-source": "lookup.checks.items",
76
+ "x-lt-require-all": true
77
+ }
78
+ }
79
+ }
80
+ ```
81
+
82
+ The entry's `data` is addressed directly — a flat option list lives at `data.items`, so the token reads `lookup.<name>.items`. Everything the context domains offer works here: `x-lt-showIf` conditions, `{{lookup.materials.items}}` in `x-lt-help`, dynamic bounds.
83
+
84
+ Option entries are scalars or `{ value, label }` objects (`{ id, label }` accepted as an alias). An object entry separates what the submitter sees from what the payload stores — a DB-backed pick list shows its text and stores its foreign key:
85
+
86
+ ```json
87
+ { "items": [
88
+ { "value": "3f6a…", "label": "Delamination" },
89
+ { "id": "9c2b…", "label": "Warping" }
90
+ ] }
91
+ ```
92
+
93
+ The select renders the labels, the submitted answer is the value, and mixed arrays resolve each entry independently (a scalar is both).
94
+
95
+ Membership is enforced on both sides of the wire: the dashboard constrains the choices, and an `enforce_schema` role's server gate re-resolves the same pinned editions and rejects an out-of-edition value with the canonical 422.
96
+
97
+ ## Cascading Selects
98
+
99
+ An option path may embed `{{domain.path}}` interpolation segments — the same grammar as `x-lt-help` tokens — so one answer drives the next field's legal set:
100
+
101
+ ```json
102
+ {
103
+ "properties": {
104
+ "country": { "type": "string", "x-lt-options": "lookup.geo.countries" },
105
+ "region": { "type": "string", "x-lt-options": "lookup.geo.regions.{{resolver.country}}" }
106
+ }
107
+ }
108
+ ```
109
+
110
+ With a `catalog/geo` entry shaped as:
111
+
112
+ ```json
113
+ {
114
+ "countries": ["US", "EU"],
115
+ "regions": {
116
+ "US": ["CA", "NY", "TX"],
117
+ "EU": ["DE", "FR", "ES"]
118
+ }
119
+ }
120
+ ```
121
+
122
+ - **Region renders disabled** (an empty select on the explicit **Choose…** placeholder) until Country carries an answer.
123
+ - **Choosing a country enables and populates Region** with exactly that country's list — the path re-resolves against the live form on every edit.
124
+ - **Changing the country resets the presentation**: a previously chosen region that is no longer legal shows the placeholder again, and the stale value fails the membership pass on submit — client-side in the error panel, server-side as the 422 for enforcing roles.
125
+ - Chains extend naturally: C can interpolate B the same way B interpolates A, walking one nested map or several refs.
126
+
127
+ Interpolation works in `x-lt-source` the same way, so checklist item sets can follow an answer too.
128
+
129
+ ## Efficiency
130
+
131
+ - **Refs, not content, ride the rows.** Thousands of escalations sharing one list each store a three-field ref; the list lives once per edition.
132
+ - **One fetch per page.** The resolve UI batch-fetches all refs in a single `GET /:id/lookups` call at load. Pinned editions are immutable, so the response caches for the whole session.
133
+ - **Zero network during execution.** Cascade levels resolve locally from the already-fetched entry data — every keystroke re-resolves in memory.
134
+ - **Server-side, snapshots cache indefinitely.** Enforcement reads come from an in-process LRU keyed by `(domain, key, version)`; the first row referencing an edition pays the read, every later row hits memory.
135
+
136
+ ## Reference Example
137
+
138
+ `examples/workflows/lookup-cascade/` is the canonical reference:
139
+
140
+ - `material` — select from the pinned `catalog/materials` edition; the seed mints v1 (three items) then v2 (five), and seeds one escalation pinned to each, so both editions render side by side from ONE role form
141
+ - `country` → `region` — the cascade pair over `catalog/geo`
142
+ - `checks` — checklist sourced from `catalog/checks` with `x-lt-require-all`
143
+ - the `catalog-picker` role sets `enforce_schema: true`, so out-of-edition submissions reject server-side
144
+
145
+ Invoke `lookupCascade` with `{ "data": { "materials_version": 1 } }` (or `2`) to pin either edition per run.
@@ -120,8 +120,8 @@ Cancellation is terminal — a cancelled escalation cannot be re-opened.
120
120
 
121
121
  ### When cancellation happens
122
122
 
123
- - **Workflow termination** — `POST /api/workflows/:workflowId/terminate` automatically cancels any pending escalations tied to it. The waiting `conditionLT` call returns `null`.
124
- - **Explicit cancel** — cancel a single escalation via the API or from the dashboard. Any workflow waiting on that escalation via `conditionLT` receives `null`.
123
+ - **Workflow termination** — `POST /api/workflows/:workflowId/terminate` automatically cancels any pending escalations tied to it. The waiting `conditional` call returns `null`.
124
+ - **Explicit cancel** — cancel a single escalation via the API or from the dashboard. Any workflow waiting on that escalation via `conditional` receives `null`.
125
125
 
126
126
  ### API
127
127
 
@@ -139,10 +139,10 @@ Returns 409 if the escalation is already resolved or cancelled.
139
139
 
140
140
  ### Handling cancellation in workflows
141
141
 
142
- `conditionLT` returns `T | false | null`. Always guard before accessing the payload:
142
+ `conditional` returns `T | false | null`. Always guard before accessing the payload:
143
143
 
144
144
  ```typescript
145
- const decision = await conditionLT<{ approved: boolean }>(signalId, escalationConfig);
145
+ const decision = await conditional<{ approved: boolean }>(signalId, escalationConfig);
146
146
 
147
147
  if (decision === null) {
148
148
  // Escalation was cancelled
@@ -2,10 +2,10 @@
2
2
 
3
3
  ## Role-Based Routing
4
4
 
5
- Escalations are routed by role, and any member of the role can handle them — a person working the queue in the dashboard, or a service account claiming and resolving through the API or MCP tools. Members only see escalations for roles they hold. Set `role` on every `conditionLT` config to name the target queue:
5
+ Escalations are routed by role, and any member of the role can handle them — a person working the queue in the dashboard, or a service account claiming and resolving through the API or MCP tools. Members only see escalations for roles they hold. Set `role` on every `conditional` config to name the target queue:
6
6
 
7
7
  ```typescript
8
- const decision = await conditionLT<{ approved: boolean }>(signalId, {
8
+ const decision = await conditional<{ approved: boolean }>(signalId, {
9
9
  role: 'finance-reviewer', // only users with this role see it
10
10
  description: `Approve spend of $${amount}`,
11
11
  // ...
@@ -25,7 +25,7 @@ A `member` of a role carries a work-surface scope that narrows what they see and
25
25
 
26
26
  `self` means escalations assigned to that member (`assigned_to = user`); `all` means the whole role queue. `admin` and `superadmin` always work the whole queue.
27
27
 
28
- Scope is a property of the **membership** (`lt_user_roles`), not of the escalation row. The escalation engine is unchanged — `conditionLT` and `ltCreateEscalation` write rows exactly as before. Scope is resolved at read time when a user lists or acts on the queue.
28
+ Scope is a property of the **membership** (`lt_user_roles`), not of the escalation row. The escalation engine is unchanged — `conditional` and `ltCreateEscalation` write rows exactly as before. Scope is resolved at read time when a user lists or acts on the queue.
29
29
 
30
30
  See the [Roles API](../api/http/roles.md#work-surface-scope) for the five member profiles and the assignment contract.
31
31
 
@@ -36,7 +36,7 @@ See the [Roles API](../api/http/roles.md#work-surface-scope) for the five member
36
36
  To route a single item to a named person, assign the escalation to them and provision them with `read_scope=self` + `write_scope=self`. The workflow sets `assigned_to` to the person's user ID when it creates the escalation, then provisions or updates that user as a `member` with self/self scope on the target role. They land directly on that one item — a just-in-time form scoped by RBAC — with no access to the rest of the queue.
37
37
 
38
38
  ```typescript
39
- const decision = await conditionLT<{ confirmed: boolean; address: string }>(signalId, {
39
+ const decision = await conditional<{ confirmed: boolean; address: string }>(signalId, {
40
40
  role: 'customer-triage',
41
41
  assigned_to: userId, // pre-claim
42
42
  description: 'Confirm your shipping address',
@@ -94,7 +94,7 @@ A queue that receives both regular items and a special signal type. The payload
94
94
  In the workflow, guard the payload fields before accessing them:
95
95
 
96
96
  ```typescript
97
- const decision = await conditionLT<{
97
+ const decision = await conditional<{
98
98
  approved: boolean;
99
99
  rejection_reason?: string;
100
100
  notes?: string;
@@ -35,13 +35,13 @@ commit, using the HotMesh `condition({ assignee, durationMinutes, parentId })`
35
35
  primitive:
36
36
 
37
37
  ```ts
38
- const step1 = await conditionLT<Step1 & { $resolution?: EscalationResolution }>(sig1, {
38
+ const step1 = await conditional<Step1 & { $resolution?: EscalationResolution }>(sig1, {
39
39
  role: STEP1_ROLE, /* … */ schemaVersion: 1,
40
40
  });
41
41
  const owner = step1.$resolution?.resolvedBy; // who resolved step 1
42
42
  const parent = step1.$resolution?.escalationId; // step 1's id — the correlation key
43
43
 
44
- await conditionLT<Step2>(sig2, {
44
+ await conditional<Step2>(sig2, {
45
45
  role: STEP2_ROLE,
46
46
  assignee: owner, // born assigned — no create-then-claim race
47
47
  durationMinutes: 30, // a hard claim, so it stays with the owner
@@ -115,11 +115,13 @@ A select's option list can ride the escalation instead of the schema. The field-
115
115
 
116
116
  When the envelope carries `left_quantity_options: [0, 1, 2, 3]`, the field renders as a dropdown offering exactly those values — an out-of-range answer is structurally impossible. The workflow mints only the small per-row array; the form itself stays on the role.
117
117
 
118
+ - Entries are scalars or `{ value, label }` objects (`{ id, label }` accepted as an alias): the select shows the label and the submitted answer is the value — a pick list can display text while storing its foreign key. A scalar is both. Mixed arrays resolve each entry independently; malformed entries are dropped.
118
119
  - A static `enum` takes precedence when both are present — the same static-over-dynamic rule as the bounds tokens.
119
120
  - The declared `type` governs the value: a number-typed field emits the picked option as a number, a string-typed field as a string.
120
121
  - While the current value is outside the option list (an empty init, options that shrank per-row), the select opens on an explicit disabled **Choose…** placeholder — never an implicit first option.
121
122
  - A path that resolves to nothing (missing, empty array, no scalar entries) yields no options: the field renders as the plain input for its type and membership is not enforced for that submission.
122
- - Membership is enforced on both sides of the wire: the dashboard constrains the choices, and an enforced role's server gate rejects a payload whose value is outside the row's resolved list with the canonical 422 (`Must be one of: 0, 1, 2, 3`).
123
+ - Membership is enforced on both sides of the wire — always on the option VALUE, never the label: the dashboard constrains the choices, and an enforced role's server gate rejects a payload whose value is outside the row's resolved list with the canonical 422 (`Must be one of: 0, 1, 2, 3`).
124
+ - Option lists can also come from version-pinned knowledge entries (the `lookup` domain), and paths may embed `{{domain.path}}` interpolation segments for cascading selects — a dependent select whose parent is unanswered renders disabled and fails closed. See [lookups.md](lookups.md).
123
125
 
124
126
  ---
125
127
 
@@ -230,7 +232,7 @@ The path is dot-separated, with optional `[n]` array indices. A missing or non-n
230
232
  **Workflow side — passing the bound in the envelope:**
231
233
 
232
234
  ```typescript
233
- const decision = await conditionLT<{ score: number; notes: string }>(signalId, {
235
+ const decision = await conditional<{ score: number; notes: string }>(signalId, {
234
236
  role: 'quality-reviewer',
235
237
  envelope: {
236
238
  min_score: 60,
@@ -144,7 +144,7 @@ The field type must be `"object"`. The submitted value is `Record<string, boolea
144
144
 
145
145
  `x-lt-source` uses the `"domain.path"` convention (same as `x-lt-showIf` and `x-lt-help` tokens). The renderer expects an array of `{ id: string; label: string; required?: boolean }` objects at that path.
146
146
 
147
- - `"envelope"` — for item definitions that are render data only (no query cost). The workflow puts them in `conditionLT`'s `envelope` parameter.
147
+ - `"envelope"` — for item definitions that are render data only (no query cost). The workflow puts them in `conditional`'s `envelope` parameter.
148
148
  - `"metadata"` — only when items need to be GIN-indexed and searchable as facets. Adds index cost.
149
149
 
150
150
  ### Geometry (`x-lt-variant`)
@@ -191,7 +191,7 @@ const checklistItems = [
191
191
  { id: 'photos', label: 'Before/after photos are present', required: false },
192
192
  ];
193
193
 
194
- const decision = await conditionLT<{ checks: Record<string, boolean> }>(signalId, {
194
+ const decision = await conditional<{ checks: Record<string, boolean> }>(signalId, {
195
195
  role: 'checklist-operator',
196
196
  envelope: {
197
197
  checklist_items: checklistItems,
@@ -16,6 +16,7 @@ This works because the form is data: a JSON Schema stored on the role, versioned
16
16
  |----------|-----|-----|
17
17
  | Typed fields, formats, required | Plain JSON Schema | [form.md](hitl/form.md) |
18
18
  | Input guards (bounds, patterns, dynamic limits) | Validation keywords | [x-lt-validation.md](hitl/x-lt-validation.md) |
19
+ | Option lists shared by thousands of rows, cascading selects | Versioned lookups | [lookups.md](hitl/lookups.md) |
19
20
  | Fields that appear based on another answer | `x-lt-showIf` | [x-lt-show-if.md](hitl/x-lt-show-if.md) |
20
21
  | Sections, columns, ordering, side-panel help | Layout keywords | [x-lt-layout.md](hitl/x-lt-layout.md) |
21
22
  | Runtime-driven items, files, signatures, SOP blocks | Widgets | [x-lt-widget.md](hitl/x-lt-widget.md) |
@@ -65,6 +66,7 @@ When you author a HITL-backed workflow, the platform handles:
65
66
  - **AI triage** — optional auto-resolution for common patterns
66
67
  - **Credential security** — password fields use ephemeral tokens, never stored in plain text
67
68
  - **Schema enforcement** — roles with `enforce_schema` validate every resolver payload server-side (dashboard, API, MCP, CLI alike) with the same pass the form runs, rejecting violations as a structured 422 (see [schema-enforcement.md](schema-enforcement.md))
69
+ - **Versioned lookups** — escalations pin immutable knowledge editions for their option lists; the refs grant readers exactly those editions, and cascading selects resolve locally from one batch fetch (see [lookups.md](hitl/lookups.md))
68
70
  - **Telemetry** — trace IDs link escalations to OpenTelemetry traces
69
71
  - **Bulk operations** — bulk claim, assign, triage, and cancel for queue management
70
72
  - **Cancellation** — cancel pending escalations from the API or dashboard
@@ -79,7 +81,8 @@ Ordered as a learning path — each file adds one capability to the same form:
79
81
 
80
82
  | Topic | File |
81
83
  |-------|------|
82
- | Creating escalations with `conditionLT`, schema versioning | [escalation.md](hitl/escalation.md) |
84
+ | Creating escalations with `conditional`, schema versioning | [escalation.md](hitl/escalation.md) |
85
+ | Versioned knowledge lookups, the `lookup.*` domain, cascading selects | [lookups.md](hitl/lookups.md) |
83
86
  | Field types, formats, required, read-only | [form.md](hitl/form.md) |
84
87
  | Pre-submission validation guards (min, max, pattern, dynamic bounds) | [x-lt-validation.md](hitl/x-lt-validation.md) |
85
88
  | Conditional visibility (`x-lt-showIf`, `x-lt-hide-if-empty`) | [x-lt-show-if.md](hitl/x-lt-show-if.md) |
@@ -101,7 +104,7 @@ Ordered as a learning path — each file adds one capability to the same form:
101
104
  | Keyword | Level | Purpose |
102
105
  |---------|-------|---------|
103
106
  | `x-lt-widget` | field | Rich control: `file-upload`, `code-editor`, `signature`, `rich-text`, `markdown`, `checklist`, `attachment` (alias `image`) |
104
- | `x-lt-source` | field | Data path for context-driven widgets: `"domain.path"` |
107
+ | `x-lt-source` | field | Data path for context-driven widgets: `"domain.path"`; may embed `{{domain.path}}` interpolation segments |
105
108
  | `x-lt-require-all` | field | Checklist completion guard — every item must be checked, except items declared `required: false` |
106
109
  | `x-lt-require-any` | schema | At-least-one guard — each `string[]` group needs a value in one visible member; `0`/`false` count as answers |
107
110
  | `x-lt-require-sum` | schema | Quantity-group guard — the numeric values of `{ fields, minimum? }` must total at least `minimum` (default 1) |
@@ -112,7 +115,7 @@ Ordered as a learning path — each file adds one capability to the same form:
112
115
  | `x-lt-showIf` | field | Show field when a value is truthy at `domain.path`; prefix `!` to invert; `=VALUE` / `!=VALUE` compare the string form |
113
116
  | `x-lt-hide-if-empty` | field | `true` — suppress the field when its value is null, `""`, `false`, or `0` |
114
117
  | `x-lt-section` | field | Section group label |
115
- | `x-lt-options` | field | Dynamic select options — resolves a `"domain.path"` to the field's option list; static `enum` wins |
118
+ | `x-lt-options` | field | Dynamic select options — resolves a `"domain.path"` to the field's option list (scalars or `{ value, label }`); static `enum` wins; `{{domain.path}}` segments make cascading selects |
116
119
  | `x-lt-minimum` | field | Dynamic lower bound — resolves a `"domain.path"` from the escalation context |
117
120
  | `x-lt-maximum` | field | Dynamic upper bound — resolves a `"domain.path"` from the escalation context |
118
121
  | `x-lt-min-length` | field | Dynamic minimum string length — resolves a `"domain.path"` |
package/docs/story.md CHANGED
@@ -120,7 +120,7 @@ Each capability shows who uses it: which agents, which pipelines, which workflow
120
120
 
121
121
  The orchestration backstage — the same durable workflow, offered two ways:
122
122
 
123
- - **Procedural** — readable, Temporal-like TypeScript. Configure it, invoke it, watch its executions. Emulated atop the graph: cheap to maintain, heavier to run.
123
+ - **Procedural** — readable, durable TypeScript. Configure it, invoke it, watch its executions. Emulated atop the graph: cheap to maintain, heavier to run.
124
124
  - **Graph** — that same workflow as a compiled, deterministic DAG. Same guarantees, roughly 3x faster, less to read. Run or schedule it; the router discovers it and pulls the work when it's healthy to.
125
125
 
126
126
  Every procedural pattern has a graph equivalent and the reverse, so the choice is readability or speed — never durability, escalation, or transactional safety. Engineers move freely between them: execution traces, durable cycle replay, swimlane timelines. Nothing is hidden. The technical depth is the product.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotmeshio/long-tail",
3
- "version": "0.14.4",
3
+ "version": "0.16.1",
4
4
  "description": "Long Tail Workflows — Durable AI workflows with human-in-the-loop escalation. Powered by PostgreSQL.",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",