@hotmeshio/long-tail 0.10.2 → 0.10.4

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 (397) hide show
  1. package/README.md +1 -0
  2. package/build/api/bot-accounts.d.ts +4 -0
  3. package/build/api/bot-accounts.js +3 -1
  4. package/build/api/escalations/metadata.js +21 -1
  5. package/build/api/escalations/resolve.d.ts +8 -0
  6. package/build/api/escalations/resolve.js +82 -3
  7. package/build/api/roles.d.ts +2 -0
  8. package/build/api/roles.js +4 -0
  9. package/build/bin/ltc.js +10 -1
  10. package/build/index.js +7 -1
  11. package/build/lib/cli/client.d.ts +4 -1
  12. package/build/lib/cli/client.js +4 -2
  13. package/build/lib/db/schemas/023_role_enforce_schema.sql +18 -0
  14. package/build/lib/typed-resolution.d.ts +35 -0
  15. package/build/lib/typed-resolution.js +37 -0
  16. package/build/modules/branding.d.ts +21 -2
  17. package/build/modules/branding.js +22 -1
  18. package/build/modules/config.d.ts +1 -0
  19. package/build/modules/config.js +5 -0
  20. package/build/routes/bot-accounts.js +3 -1
  21. package/build/routes/settings.js +21 -0
  22. package/build/sdk/index.d.ts +4 -0
  23. package/build/sdk/index.js +14 -0
  24. package/build/services/escalation/crud.d.ts +18 -6
  25. package/build/services/escalation/crud.js +18 -2
  26. package/build/services/escalation/index.d.ts +1 -0
  27. package/build/services/escalation/index.js +1 -0
  28. package/build/services/escalation/resolver-validation.d.ts +28 -0
  29. package/build/services/escalation/resolver-validation.js +95 -0
  30. package/build/services/escalation/sql.d.ts +12 -2
  31. package/build/services/escalation/sql.js +22 -2
  32. package/build/services/iam/bots.d.ts +4 -1
  33. package/build/services/iam/bots.js +5 -3
  34. package/build/services/iam/sql.d.ts +2 -2
  35. package/build/services/iam/sql.js +15 -1
  36. package/build/services/role/enforcement-cache.d.ts +21 -0
  37. package/build/services/role/enforcement-cache.js +0 -0
  38. package/build/services/role/index.js +5 -0
  39. package/build/services/role/sql.d.ts +12 -2
  40. package/build/services/role/sql.js +15 -2
  41. package/build/services/role/types.d.ts +9 -0
  42. package/build/shared/form-validation/derive-field-label.d.ts +14 -0
  43. package/build/shared/form-validation/derive-field-label.js +31 -0
  44. package/build/shared/form-validation/field-validator.d.ts +45 -0
  45. package/build/shared/form-validation/field-validator.js +214 -0
  46. package/build/shared/form-validation/index.d.ts +12 -0
  47. package/build/shared/form-validation/index.js +28 -0
  48. package/build/shared/form-validation/validate-resolver-payload.d.ts +41 -0
  49. package/build/shared/form-validation/validate-resolver-payload.js +62 -0
  50. package/build/shared/form-validation/x-lt-bind.d.ts +41 -0
  51. package/build/shared/form-validation/x-lt-bind.js +110 -0
  52. package/build/shared/form-validation/x-lt-help.d.ts +21 -0
  53. package/build/shared/form-validation/x-lt-help.js +91 -0
  54. package/build/shared/form-validation/x-lt-show-if.d.ts +7 -0
  55. package/build/shared/form-validation/x-lt-show-if.js +84 -0
  56. package/build/system/mcp-servers/admin/schemas.d.ts +3 -0
  57. package/build/system/mcp-servers/admin/schemas.js +1 -0
  58. package/build/system/mcp-servers/admin/users.js +3 -1
  59. package/build/system/mcp-servers/human-queue-schemas.d.ts +4 -4
  60. package/build/system/mcp-servers/human-queue-schemas.js +4 -1
  61. package/build/system/mcp-servers/human-queue.js +41 -2
  62. package/build/tsconfig.tsbuildinfo +1 -1
  63. package/build/types/sdk.d.ts +6 -1
  64. package/build/types/startup.d.ts +26 -0
  65. package/build/types/validation.d.ts +43 -0
  66. package/build/types/validation.js +28 -0
  67. package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.js → AdminDashboard-Cma2NGsF.js} +2 -2
  68. package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.js.map → AdminDashboard-Cma2NGsF.js.map} +1 -1
  69. package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js +16 -0
  70. package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js.map +1 -0
  71. package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js +4 -0
  72. package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js.map +1 -0
  73. package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js +2 -0
  74. package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js.map +1 -0
  75. package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js +2 -0
  76. package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js.map +1 -0
  77. package/dashboard/dist/assets/{BotPicker-2QEIpc-K.js → BotPicker-CidlGr6f.js} +2 -2
  78. package/dashboard/dist/assets/{BotPicker-2QEIpc-K.js.map → BotPicker-CidlGr6f.js.map} +1 -1
  79. package/dashboard/dist/assets/CapabilitiesPage-BMNNTa0D.js +2 -0
  80. package/dashboard/dist/assets/{CapabilitiesPage-lQJGZ_-t.js.map → CapabilitiesPage-BMNNTa0D.js.map} +1 -1
  81. package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.js → CollapsibleSection-W9F9lziT.js} +2 -2
  82. package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.js.map → CollapsibleSection-W9F9lziT.js.map} +1 -1
  83. package/dashboard/dist/assets/ConfirmDeleteModal-BUh-Dzba.js +2 -0
  84. package/dashboard/dist/assets/{ConfirmDeleteModal-C0x0HcHX.js.map → ConfirmDeleteModal-BUh-Dzba.js.map} +1 -1
  85. package/dashboard/dist/assets/{CopyableId-uot2mE_g.js → CopyableId-B1mxKfVb.js} +2 -2
  86. package/dashboard/dist/assets/{CopyableId-uot2mE_g.js.map → CopyableId-B1mxKfVb.js.map} +1 -1
  87. package/dashboard/dist/assets/CountdownTimer-lkv_7msa.js +2 -0
  88. package/dashboard/dist/assets/{CountdownTimer-TXsRlTU4.js.map → CountdownTimer-lkv_7msa.js.map} +1 -1
  89. package/dashboard/dist/assets/{CredentialsPage-BKxS-1sA.js → CredentialsPage-DyOgfnPB.js} +2 -2
  90. package/dashboard/dist/assets/CredentialsPage-DyOgfnPB.js.map +1 -0
  91. package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.js → CronLabel-geum95dj.js} +2 -2
  92. package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.js.map → CronLabel-geum95dj.js.map} +1 -1
  93. package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js +2 -0
  94. package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js.map +1 -0
  95. package/dashboard/dist/assets/DataTable-BTu2AaEl.js +2 -0
  96. package/dashboard/dist/assets/DataTable-BTu2AaEl.js.map +1 -0
  97. package/dashboard/dist/assets/{DropZone-DNDEgMpJ.js → DropZone-C3hOjJtC.js} +2 -2
  98. package/dashboard/dist/assets/{DropZone-DNDEgMpJ.js.map → DropZone-C3hOjJtC.js.map} +1 -1
  99. package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.js → ElapsedCell-DFOW9T4b.js} +2 -2
  100. package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.js.map → ElapsedCell-DFOW9T4b.js.map} +1 -1
  101. package/dashboard/dist/assets/EscalationListSchemaPage-_IhqXIQu.js +20 -0
  102. package/dashboard/dist/assets/EscalationListSchemaPage-_IhqXIQu.js.map +1 -0
  103. package/dashboard/dist/assets/EscalationSchemaPage-BCC7iscN.js +9 -0
  104. package/dashboard/dist/assets/EscalationSchemaPage-BCC7iscN.js.map +1 -0
  105. package/dashboard/dist/assets/EscalationsOverview-CvIdOtoP.js +2 -0
  106. package/dashboard/dist/assets/EscalationsOverview-CvIdOtoP.js.map +1 -0
  107. package/dashboard/dist/assets/EventTable-DJWJ7J0m.js +2 -0
  108. package/dashboard/dist/assets/EventTable-DJWJ7J0m.js.map +1 -0
  109. package/dashboard/dist/assets/FilterBar-BR3ztZ8y.js +2 -0
  110. package/dashboard/dist/assets/FilterBar-BR3ztZ8y.js.map +1 -0
  111. package/dashboard/dist/assets/GraphInvokePage-Cwn-8Glr.js +2 -0
  112. package/dashboard/dist/assets/GraphInvokePage-Cwn-8Glr.js.map +1 -0
  113. package/dashboard/dist/assets/HomePage-D8RVntg0.js +2 -0
  114. package/dashboard/dist/assets/HomePage-D8RVntg0.js.map +1 -0
  115. package/dashboard/dist/assets/ListToolbar-DuoEdVtK.js +2 -0
  116. package/dashboard/dist/assets/ListToolbar-DuoEdVtK.js.map +1 -0
  117. package/dashboard/dist/assets/McpOverview-NXKsGiWU.js +2 -0
  118. package/dashboard/dist/assets/McpOverview-NXKsGiWU.js.map +1 -0
  119. package/dashboard/dist/assets/McpQueryDetailPage-BC-iXfIx.js +5 -0
  120. package/dashboard/dist/assets/McpQueryDetailPage-BC-iXfIx.js.map +1 -0
  121. package/dashboard/dist/assets/{McpQueryPage-CsKNXUhb.js → McpQueryPage-BPJmFYOY.js} +2 -2
  122. package/dashboard/dist/assets/{McpQueryPage-CsKNXUhb.js.map → McpQueryPage-BPJmFYOY.js.map} +1 -1
  123. package/dashboard/dist/assets/McpRunDetailPage-B49nUXEl.js +2 -0
  124. package/dashboard/dist/assets/McpRunDetailPage-B49nUXEl.js.map +1 -0
  125. package/dashboard/dist/assets/McpRunsPage-Ce_XIYpP.js +2 -0
  126. package/dashboard/dist/assets/McpRunsPage-Ce_XIYpP.js.map +1 -0
  127. package/dashboard/dist/assets/NamespacePill-LWvZXt_g.js +2 -0
  128. package/dashboard/dist/assets/NamespacePill-LWvZXt_g.js.map +1 -0
  129. package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js +2 -0
  130. package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js.map +1 -0
  131. package/dashboard/dist/assets/OperatorDashboard-DpXjhs-3.js +2 -0
  132. package/dashboard/dist/assets/{OperatorDashboard-_axS17fp.js.map → OperatorDashboard-DpXjhs-3.js.map} +1 -1
  133. package/dashboard/dist/assets/PageHeader-DvEmMMP6.js +2 -0
  134. package/dashboard/dist/assets/PageHeader-DvEmMMP6.js.map +1 -0
  135. package/dashboard/dist/assets/PageHeaderWithStats-X0eAmu-x.js +2 -0
  136. package/dashboard/dist/assets/PageHeaderWithStats-X0eAmu-x.js.map +1 -0
  137. package/dashboard/dist/assets/{PriorityBadge-B4ykBH7f.js → PriorityBadge-CCERr9vQ.js} +2 -2
  138. package/dashboard/dist/assets/PriorityBadge-CCERr9vQ.js.map +1 -0
  139. package/dashboard/dist/assets/ProcessDetailPage-DpYSMRj1.js +2 -0
  140. package/dashboard/dist/assets/ProcessDetailPage-DpYSMRj1.js.map +1 -0
  141. package/dashboard/dist/assets/{ProcessesListPage-CoQEi_Su.js → ProcessesListPage-CQ9tSw7U.js} +2 -2
  142. package/dashboard/dist/assets/{ProcessesListPage-CoQEi_Su.js.map → ProcessesListPage-CQ9tSw7U.js.map} +1 -1
  143. package/dashboard/dist/assets/RoleDetailPage-DKeQKDkW.js +8 -0
  144. package/dashboard/dist/assets/RoleDetailPage-DKeQKDkW.js.map +1 -0
  145. package/dashboard/dist/assets/RolePill-CWhoLwef.js +2 -0
  146. package/dashboard/dist/assets/RolePill-CWhoLwef.js.map +1 -0
  147. package/dashboard/dist/assets/RolesPage-D-6kIact.js +2 -0
  148. package/dashboard/dist/assets/RolesPage-D-6kIact.js.map +1 -0
  149. package/dashboard/dist/assets/RunAsSelector-DzYcpQTm.js +2 -0
  150. package/dashboard/dist/assets/RunAsSelector-DzYcpQTm.js.map +1 -0
  151. package/dashboard/dist/assets/StatCard-DBANWIss.js +2 -0
  152. package/dashboard/dist/assets/StatCard-DBANWIss.js.map +1 -0
  153. package/dashboard/dist/assets/StatusBadge-BbqghFMi.js +2 -0
  154. package/dashboard/dist/assets/StatusBadge-BbqghFMi.js.map +1 -0
  155. package/dashboard/dist/assets/{StickyPagination-Cd83AHd_.js → StickyPagination-BTGfmGV3.js} +2 -2
  156. package/dashboard/dist/assets/{StickyPagination-Cd83AHd_.js.map → StickyPagination-BTGfmGV3.js.map} +1 -1
  157. package/dashboard/dist/assets/StreamMessageDetail-DqRpzA_6.js +2 -0
  158. package/dashboard/dist/assets/StreamMessageDetail-DqRpzA_6.js.map +1 -0
  159. package/dashboard/dist/assets/SwimlaneTimeline-CA106TYo.js +2 -0
  160. package/dashboard/dist/assets/SwimlaneTimeline-CA106TYo.js.map +1 -0
  161. package/dashboard/dist/assets/TagInput-CoR4MzsW.js +2 -0
  162. package/dashboard/dist/assets/TagInput-CoR4MzsW.js.map +1 -0
  163. package/dashboard/dist/assets/{TaskDetailPage-DnjhW7qv.js → TaskDetailPage-BRg-w2Ev.js} +2 -2
  164. package/dashboard/dist/assets/{TaskDetailPage-DnjhW7qv.js.map → TaskDetailPage-BRg-w2Ev.js.map} +1 -1
  165. package/dashboard/dist/assets/TaskQueuePill-Dw3YN8M-.js +2 -0
  166. package/dashboard/dist/assets/TaskQueuePill-Dw3YN8M-.js.map +1 -0
  167. package/dashboard/dist/assets/{TasksListPage-DySfZFgs.js → TasksListPage-kB_j9G8o.js} +2 -2
  168. package/dashboard/dist/assets/{TasksListPage-DySfZFgs.js.map → TasksListPage-kB_j9G8o.js.map} +1 -1
  169. package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.js → TimeAgo-D7dSIY7-.js} +2 -2
  170. package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.js.map → TimeAgo-D7dSIY7-.js.map} +1 -1
  171. package/dashboard/dist/assets/TimestampCell-BZe6bx18.js +2 -0
  172. package/dashboard/dist/assets/TimestampCell-BZe6bx18.js.map +1 -0
  173. package/dashboard/dist/assets/ToolPill-xX-buQtY.js +2 -0
  174. package/dashboard/dist/assets/ToolPill-xX-buQtY.js.map +1 -0
  175. package/dashboard/dist/assets/ToolTestPanel-U3NaF_T_.js +2 -0
  176. package/dashboard/dist/assets/ToolTestPanel-U3NaF_T_.js.map +1 -0
  177. package/dashboard/dist/assets/TopicDetailPage-BpALvXP1.js +9 -0
  178. package/dashboard/dist/assets/TopicDetailPage-BpALvXP1.js.map +1 -0
  179. package/dashboard/dist/assets/TopicsPage-Cy3chaca.js +2 -0
  180. package/dashboard/dist/assets/{TopicsPage-5yW63ELl.js.map → TopicsPage-Cy3chaca.js.map} +1 -1
  181. package/dashboard/dist/assets/{UserName-DcXhOSVm.js → UserName-VXM1oHMC.js} +2 -2
  182. package/dashboard/dist/assets/{UserName-DcXhOSVm.js.map → UserName-VXM1oHMC.js.map} +1 -1
  183. package/dashboard/dist/assets/WorkflowExecutionPage-BCq2cR1V.js +2 -0
  184. package/dashboard/dist/assets/WorkflowExecutionPage-BCq2cR1V.js.map +1 -0
  185. package/dashboard/dist/assets/WorkflowPill-CQ1AmhlC.js +2 -0
  186. package/dashboard/dist/assets/WorkflowPill-CQ1AmhlC.js.map +1 -0
  187. package/dashboard/dist/assets/{WorkflowsDashboard-C0Bbrd5M.js → WorkflowsDashboard-BbM69MnB.js} +2 -2
  188. package/dashboard/dist/assets/{WorkflowsDashboard-C0Bbrd5M.js.map → WorkflowsDashboard-BbM69MnB.js.map} +1 -1
  189. package/dashboard/dist/assets/WorkflowsOverview-D5HthpAW.js +2 -0
  190. package/dashboard/dist/assets/WorkflowsOverview-D5HthpAW.js.map +1 -0
  191. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BcbrYhDI.js → YamlWorkflowDetailPage-CDDVMYWi.js} +10 -10
  192. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BcbrYhDI.js.map → YamlWorkflowDetailPage-CDDVMYWi.js.map} +1 -1
  193. package/dashboard/dist/assets/YamlWorkflowsPage-FFjWwydj.js +2 -0
  194. package/dashboard/dist/assets/YamlWorkflowsPage-FFjWwydj.js.map +1 -0
  195. package/dashboard/dist/assets/{agents-CopQ3t5o.js → agents-BwiSNu73.js} +2 -2
  196. package/dashboard/dist/assets/{agents-CopQ3t5o.js.map → agents-BwiSNu73.js.map} +1 -1
  197. package/dashboard/dist/assets/bots-ClgSrxel.js +2 -0
  198. package/dashboard/dist/assets/bots-ClgSrxel.js.map +1 -0
  199. package/dashboard/dist/assets/{capabilities-5JRieYUy.js → capabilities-JUaKsby4.js} +2 -2
  200. package/dashboard/dist/assets/{capabilities-5JRieYUy.js.map → capabilities-JUaKsby4.js.map} +1 -1
  201. package/dashboard/dist/assets/{controlplane-B4rT6tIw.js → controlplane-CuTQ7eUE.js} +2 -2
  202. package/dashboard/dist/assets/{controlplane-B4rT6tIw.js.map → controlplane-CuTQ7eUE.js.map} +1 -1
  203. package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js +2 -0
  204. package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js.map +1 -0
  205. package/dashboard/dist/assets/index-BBA4AxmL.js +2 -0
  206. package/dashboard/dist/assets/index-BBA4AxmL.js.map +1 -0
  207. package/dashboard/dist/assets/index-C-8xXyvr.js +63 -0
  208. package/dashboard/dist/assets/index-C-8xXyvr.js.map +1 -0
  209. package/dashboard/dist/assets/index-C1t0YIXC.js +5 -0
  210. package/dashboard/dist/assets/index-C1t0YIXC.js.map +1 -0
  211. package/dashboard/dist/assets/index-C9o2UNhC.js +2 -0
  212. package/dashboard/dist/assets/index-C9o2UNhC.js.map +1 -0
  213. package/dashboard/dist/assets/index-CBj-vstO.js +2 -0
  214. package/dashboard/dist/assets/{index-Dd1RxGNw.js.map → index-CBj-vstO.js.map} +1 -1
  215. package/dashboard/dist/assets/index-CUguKMXZ.js +2 -0
  216. package/dashboard/dist/assets/index-CUguKMXZ.js.map +1 -0
  217. package/dashboard/dist/assets/index-Cavwd8UU.js +6 -0
  218. package/dashboard/dist/assets/index-Cavwd8UU.js.map +1 -0
  219. package/dashboard/dist/assets/index-CnsPBTXL.js +2 -0
  220. package/dashboard/dist/assets/index-CnsPBTXL.js.map +1 -0
  221. package/dashboard/dist/assets/index-CoPWHo_H.js +2 -0
  222. package/dashboard/dist/assets/index-CoPWHo_H.js.map +1 -0
  223. package/dashboard/dist/assets/index-CwQVaa7x.js +2 -0
  224. package/dashboard/dist/assets/index-CwQVaa7x.js.map +1 -0
  225. package/dashboard/dist/assets/index-DSa-6Ux8.js +2 -0
  226. package/dashboard/dist/assets/index-DSa-6Ux8.js.map +1 -0
  227. package/dashboard/dist/assets/index-DeMs_aBT.css +1 -0
  228. package/dashboard/dist/assets/index-Ikj_NTuy.js +5 -0
  229. package/dashboard/dist/assets/index-Ikj_NTuy.js.map +1 -0
  230. package/dashboard/dist/assets/index-Xd1jcHe7.js +2 -0
  231. package/dashboard/dist/assets/index-Xd1jcHe7.js.map +1 -0
  232. package/dashboard/dist/assets/{knowledge-B9bmoXOe.js → knowledge-BHBt-6kW.js} +2 -2
  233. package/dashboard/dist/assets/{knowledge-B9bmoXOe.js.map → knowledge-BHBt-6kW.js.map} +1 -1
  234. package/dashboard/dist/assets/{mcp-DYMFBOFz.js → mcp-CBcz4BCS.js} +2 -2
  235. package/dashboard/dist/assets/{mcp-DYMFBOFz.js.map → mcp-CBcz4BCS.js.map} +1 -1
  236. package/dashboard/dist/assets/{mcp-query-wloSpyPM.js → mcp-query-C4fKTOYo.js} +2 -2
  237. package/dashboard/dist/assets/{mcp-query-wloSpyPM.js.map → mcp-query-C4fKTOYo.js.map} +1 -1
  238. package/dashboard/dist/assets/{pipelines-DBXX6TEi.js → pipelines-CmAAH3B6.js} +2 -2
  239. package/dashboard/dist/assets/{pipelines-DBXX6TEi.js.map → pipelines-CmAAH3B6.js.map} +1 -1
  240. package/dashboard/dist/assets/role-display-Dvo2lDpU.js +2 -0
  241. package/dashboard/dist/assets/role-display-Dvo2lDpU.js.map +1 -0
  242. package/dashboard/dist/assets/task-queues-7-sHKPsN.js +2 -0
  243. package/dashboard/dist/assets/task-queues-7-sHKPsN.js.map +1 -0
  244. package/dashboard/dist/assets/{tasks-CD3-C7tP.js → tasks-BAEsqcz2.js} +2 -2
  245. package/dashboard/dist/assets/{tasks-CD3-C7tP.js.map → tasks-BAEsqcz2.js.map} +1 -1
  246. package/dashboard/dist/assets/{topics-D8pKi6zA.js → topics-CY0pJ6_o.js} +2 -2
  247. package/dashboard/dist/assets/{topics-D8pKi6zA.js.map → topics-CY0pJ6_o.js.map} +1 -1
  248. package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js → useEventHooks-BlpwRvHO.js} +2 -2
  249. package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js.map → useEventHooks-BlpwRvHO.js.map} +1 -1
  250. package/dashboard/dist/assets/{useNamespace-DykYhZY9.js → useNamespace-CoNUlZ6Z.js} +2 -2
  251. package/dashboard/dist/assets/{useNamespace-DykYhZY9.js.map → useNamespace-CoNUlZ6Z.js.map} +1 -1
  252. package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js → useYamlActivityEvents-8GUn5Wie.js} +2 -2
  253. package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js.map → useYamlActivityEvents-8GUn5Wie.js.map} +1 -1
  254. package/dashboard/dist/assets/{users-mI9goDjj.js → users-uGtDRGxR.js} +2 -2
  255. package/dashboard/dist/assets/{users-mI9goDjj.js.map → users-uGtDRGxR.js.map} +1 -1
  256. package/dashboard/dist/assets/{vendor-icons-ihWGa7_d.js → vendor-icons-DKCAtTJ9.js} +135 -130
  257. package/dashboard/dist/assets/vendor-icons-DKCAtTJ9.js.map +1 -0
  258. package/dashboard/dist/assets/{workflows-DCUilz68.js → workflows-DoX-AtHN.js} +2 -2
  259. package/dashboard/dist/assets/{workflows-DCUilz68.js.map → workflows-DoX-AtHN.js.map} +1 -1
  260. package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js → yaml-workflows-DM3jVem2.js} +2 -2
  261. package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js.map → yaml-workflows-DM3jVem2.js.map} +1 -1
  262. package/dashboard/dist/index.html +3 -3
  263. package/docs/api/http/escalations.md +15 -1
  264. package/docs/api/http/roles.md +2 -0
  265. package/docs/design-principles.md +234 -0
  266. package/docs/hitl/design.md +228 -0
  267. package/docs/hitl/form.md +21 -1
  268. package/docs/hitl/iframe.md +1 -1
  269. package/docs/hitl/x-lt-display.md +56 -0
  270. package/docs/hitl/x-lt-layout.md +20 -1
  271. package/docs/hitl/x-lt-list-schema.md +8 -1
  272. package/docs/hitl/x-lt-widget.md +23 -0
  273. package/docs/hitl-guide.md +4 -2
  274. package/docs/schema-enforcement.md +149 -0
  275. package/package.json +1 -1
  276. package/dashboard/dist/assets/AgentConfigPage-CqmtYBbC.js +0 -16
  277. package/dashboard/dist/assets/AgentConfigPage-CqmtYBbC.js.map +0 -1
  278. package/dashboard/dist/assets/AgentDetailPage-oYLBrN74.js +0 -4
  279. package/dashboard/dist/assets/AgentDetailPage-oYLBrN74.js.map +0 -1
  280. package/dashboard/dist/assets/AgentsPage-CHczRx5N.js +0 -2
  281. package/dashboard/dist/assets/AgentsPage-CHczRx5N.js.map +0 -1
  282. package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js +0 -2
  283. package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js.map +0 -1
  284. package/dashboard/dist/assets/CapabilitiesPage-lQJGZ_-t.js +0 -2
  285. package/dashboard/dist/assets/ConfirmDeleteModal-C0x0HcHX.js +0 -2
  286. package/dashboard/dist/assets/CountdownTimer-TXsRlTU4.js +0 -2
  287. package/dashboard/dist/assets/CredentialsPage-BKxS-1sA.js.map +0 -1
  288. package/dashboard/dist/assets/CustomDurationPicker-j4bBrDJ6.js +0 -2
  289. package/dashboard/dist/assets/CustomDurationPicker-j4bBrDJ6.js.map +0 -1
  290. package/dashboard/dist/assets/DataTable-Byn3oyT9.js +0 -2
  291. package/dashboard/dist/assets/DataTable-Byn3oyT9.js.map +0 -1
  292. package/dashboard/dist/assets/EscalationListSchemaPage-CIJ-OgVC.js +0 -20
  293. package/dashboard/dist/assets/EscalationListSchemaPage-CIJ-OgVC.js.map +0 -1
  294. package/dashboard/dist/assets/EscalationSchemaPage-C7dHgG8e.js +0 -9
  295. package/dashboard/dist/assets/EscalationSchemaPage-C7dHgG8e.js.map +0 -1
  296. package/dashboard/dist/assets/EscalationsOverview-D8NrATg2.js +0 -2
  297. package/dashboard/dist/assets/EscalationsOverview-D8NrATg2.js.map +0 -1
  298. package/dashboard/dist/assets/EventTable-DBV1P2ME.js +0 -2
  299. package/dashboard/dist/assets/EventTable-DBV1P2ME.js.map +0 -1
  300. package/dashboard/dist/assets/FilterBar-B5Vk5tBF.js +0 -2
  301. package/dashboard/dist/assets/FilterBar-B5Vk5tBF.js.map +0 -1
  302. package/dashboard/dist/assets/GraphInvokePage-DbHvggQ_.js +0 -2
  303. package/dashboard/dist/assets/GraphInvokePage-DbHvggQ_.js.map +0 -1
  304. package/dashboard/dist/assets/HomePage-BpexnDO_.js +0 -2
  305. package/dashboard/dist/assets/HomePage-BpexnDO_.js.map +0 -1
  306. package/dashboard/dist/assets/ListToolbar-KC6LGtKP.js +0 -2
  307. package/dashboard/dist/assets/ListToolbar-KC6LGtKP.js.map +0 -1
  308. package/dashboard/dist/assets/McpOverview-BDZC9Hvl.js +0 -2
  309. package/dashboard/dist/assets/McpOverview-BDZC9Hvl.js.map +0 -1
  310. package/dashboard/dist/assets/McpQueryDetailPage-CXhgX1pS.js +0 -5
  311. package/dashboard/dist/assets/McpQueryDetailPage-CXhgX1pS.js.map +0 -1
  312. package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js +0 -2
  313. package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js.map +0 -1
  314. package/dashboard/dist/assets/McpRunsPage-f5hDbpLo.js +0 -2
  315. package/dashboard/dist/assets/McpRunsPage-f5hDbpLo.js.map +0 -1
  316. package/dashboard/dist/assets/NamespacePill-C4u6Go1W.js +0 -2
  317. package/dashboard/dist/assets/NamespacePill-C4u6Go1W.js.map +0 -1
  318. package/dashboard/dist/assets/OperationsPage-D37cZ8Qh.js +0 -2
  319. package/dashboard/dist/assets/OperationsPage-D37cZ8Qh.js.map +0 -1
  320. package/dashboard/dist/assets/OperatorDashboard-_axS17fp.js +0 -2
  321. package/dashboard/dist/assets/PageHeader-Bxa1XFz0.js +0 -2
  322. package/dashboard/dist/assets/PageHeader-Bxa1XFz0.js.map +0 -1
  323. package/dashboard/dist/assets/PageHeaderWithStats-D_sO0MqJ.js +0 -2
  324. package/dashboard/dist/assets/PageHeaderWithStats-D_sO0MqJ.js.map +0 -1
  325. package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js.map +0 -1
  326. package/dashboard/dist/assets/ProcessDetailPage-D8pAWUXx.js +0 -2
  327. package/dashboard/dist/assets/ProcessDetailPage-D8pAWUXx.js.map +0 -1
  328. package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js +0 -8
  329. package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js.map +0 -1
  330. package/dashboard/dist/assets/RolePill-DLwmVMam.js +0 -2
  331. package/dashboard/dist/assets/RolePill-DLwmVMam.js.map +0 -1
  332. package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js +0 -2
  333. package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js.map +0 -1
  334. package/dashboard/dist/assets/RunAsSelector-BebF8Lib.js +0 -2
  335. package/dashboard/dist/assets/RunAsSelector-BebF8Lib.js.map +0 -1
  336. package/dashboard/dist/assets/SlidePanel-BDVDuwIf.js +0 -2
  337. package/dashboard/dist/assets/SlidePanel-BDVDuwIf.js.map +0 -1
  338. package/dashboard/dist/assets/StatCard-DrdlUeQz.js +0 -2
  339. package/dashboard/dist/assets/StatCard-DrdlUeQz.js.map +0 -1
  340. package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js +0 -2
  341. package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js.map +0 -1
  342. package/dashboard/dist/assets/StreamMessageDetail-BIXbrZM0.js +0 -2
  343. package/dashboard/dist/assets/StreamMessageDetail-BIXbrZM0.js.map +0 -1
  344. package/dashboard/dist/assets/SwimlaneTimeline-CC5qZjYo.js +0 -2
  345. package/dashboard/dist/assets/SwimlaneTimeline-CC5qZjYo.js.map +0 -1
  346. package/dashboard/dist/assets/TagInput-C2gi47M8.js +0 -2
  347. package/dashboard/dist/assets/TagInput-C2gi47M8.js.map +0 -1
  348. package/dashboard/dist/assets/TaskQueuePill-BPP0Almh.js +0 -2
  349. package/dashboard/dist/assets/TaskQueuePill-BPP0Almh.js.map +0 -1
  350. package/dashboard/dist/assets/TimestampCell-DGOsba-A.js +0 -2
  351. package/dashboard/dist/assets/TimestampCell-DGOsba-A.js.map +0 -1
  352. package/dashboard/dist/assets/ToolPill-D74TkYB-.js +0 -2
  353. package/dashboard/dist/assets/ToolPill-D74TkYB-.js.map +0 -1
  354. package/dashboard/dist/assets/ToolTestPanel-Bez6OyRL.js +0 -2
  355. package/dashboard/dist/assets/ToolTestPanel-Bez6OyRL.js.map +0 -1
  356. package/dashboard/dist/assets/TopicDetailPage-BHccgkU_.js +0 -9
  357. package/dashboard/dist/assets/TopicDetailPage-BHccgkU_.js.map +0 -1
  358. package/dashboard/dist/assets/TopicsPage-5yW63ELl.js +0 -2
  359. package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js +0 -2
  360. package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js.map +0 -1
  361. package/dashboard/dist/assets/WorkflowPill-Fjc2q9U9.js +0 -2
  362. package/dashboard/dist/assets/WorkflowPill-Fjc2q9U9.js.map +0 -1
  363. package/dashboard/dist/assets/WorkflowsOverview-D8MkSMex.js +0 -2
  364. package/dashboard/dist/assets/WorkflowsOverview-D8MkSMex.js.map +0 -1
  365. package/dashboard/dist/assets/YamlWorkflowsPage-9Ki54d-9.js +0 -2
  366. package/dashboard/dist/assets/YamlWorkflowsPage-9Ki54d-9.js.map +0 -1
  367. package/dashboard/dist/assets/bots-CAYJYL9E.js +0 -2
  368. package/dashboard/dist/assets/bots-CAYJYL9E.js.map +0 -1
  369. package/dashboard/dist/assets/escalation-columns-BbS5X61l.js +0 -2
  370. package/dashboard/dist/assets/escalation-columns-BbS5X61l.js.map +0 -1
  371. package/dashboard/dist/assets/index-B68A3v-S.js +0 -2
  372. package/dashboard/dist/assets/index-B68A3v-S.js.map +0 -1
  373. package/dashboard/dist/assets/index-BAi89Xpm.js +0 -2
  374. package/dashboard/dist/assets/index-BAi89Xpm.js.map +0 -1
  375. package/dashboard/dist/assets/index-BJ0jjFsI.js +0 -5
  376. package/dashboard/dist/assets/index-BJ0jjFsI.js.map +0 -1
  377. package/dashboard/dist/assets/index-BOJMUk4F.js +0 -2
  378. package/dashboard/dist/assets/index-BOJMUk4F.js.map +0 -1
  379. package/dashboard/dist/assets/index-BrgYykPV.js +0 -2
  380. package/dashboard/dist/assets/index-BrgYykPV.js.map +0 -1
  381. package/dashboard/dist/assets/index-BxgtIqvl.js +0 -2
  382. package/dashboard/dist/assets/index-BxgtIqvl.js.map +0 -1
  383. package/dashboard/dist/assets/index-C0cHXaX-.css +0 -1
  384. package/dashboard/dist/assets/index-CDHDoHYz.js +0 -6
  385. package/dashboard/dist/assets/index-CDHDoHYz.js.map +0 -1
  386. package/dashboard/dist/assets/index-CUZJHXew.js +0 -2
  387. package/dashboard/dist/assets/index-CUZJHXew.js.map +0 -1
  388. package/dashboard/dist/assets/index-D5n_e59T.js +0 -2
  389. package/dashboard/dist/assets/index-D5n_e59T.js.map +0 -1
  390. package/dashboard/dist/assets/index-DIgiIoou.js +0 -63
  391. package/dashboard/dist/assets/index-DIgiIoou.js.map +0 -1
  392. package/dashboard/dist/assets/index-Dd1RxGNw.js +0 -2
  393. package/dashboard/dist/assets/index-iOb3sGsC.js +0 -5
  394. package/dashboard/dist/assets/index-iOb3sGsC.js.map +0 -1
  395. package/dashboard/dist/assets/index-mcAkQblr.js +0 -2
  396. package/dashboard/dist/assets/index-mcAkQblr.js.map +0 -1
  397. package/dashboard/dist/assets/vendor-icons-ihWGa7_d.js.map +0 -1
@@ -0,0 +1,45 @@
1
+ export interface FieldError {
2
+ field: string;
3
+ message: string;
4
+ }
5
+ interface ChecklistItem {
6
+ id: string;
7
+ label: string;
8
+ required?: boolean;
9
+ }
10
+ /**
11
+ * Resolve a checklist widget's item definitions from its `x-lt-source`
12
+ * "domain.path" against the escalation context. Missing domain/path or a
13
+ * non-array value yields an empty list.
14
+ */
15
+ export declare function resolveChecklistItems(sourcePath: unknown, ctx: Record<string, unknown> | undefined): ChecklistItem[];
16
+ /**
17
+ * The checklist completion guard (`x-lt-require-all`): every rendered item must
18
+ * be checked, except items whose definition carries `required: false` (the
19
+ * explicit opt-out). Vacuous when the source resolves to no items — never
20
+ * blocks on zero. Returns the panel message, or undefined when satisfied.
21
+ * Stricter than (and composes with) the field-level required-array entry,
22
+ * which remains the at-least-one check.
23
+ */
24
+ export declare function validateRequireAll(value: unknown, fieldSchema: Record<string, unknown> | undefined, ctx?: Record<string, unknown>): string | undefined;
25
+ /**
26
+ * Runtime type check against the field's declared JSON Schema `type`. Guards
27
+ * the payload contract for API-first callers (a form widget already produces
28
+ * the right primitive; a script or agent submitting `"1"` for a number field
29
+ * does not). Absent/empty values pass — presence is the required check's job.
30
+ */
31
+ export declare function validateFieldType(value: unknown, fieldSchema: Record<string, unknown> | undefined): string | undefined;
32
+ /**
33
+ * Per-field JSON Schema validation — subset used by the resolver form.
34
+ *
35
+ * Returns a human-readable error string when the value fails a constraint,
36
+ * or undefined when the value is valid. Callers are responsible for the
37
+ * required check (empty-when-required) before calling this for constraint checks.
38
+ *
39
+ * `ctx` is optional context (ShowIfContext-shaped) used to resolve dynamic
40
+ * constraint paths like `x-lt-minimum: "envelope.min_score"`.
41
+ */
42
+ export declare function validateFieldConstraints(value: unknown, fieldSchema: Record<string, unknown> | undefined, ctx?: Record<string, unknown>): string | undefined;
43
+ /** Full field error including required check then constraints. */
44
+ export declare function validateField(value: unknown, fieldSchema: Record<string, unknown> | undefined, isRequired: boolean, isTouched: boolean, ctx?: Record<string, unknown>): string | undefined;
45
+ export {};
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveChecklistItems = resolveChecklistItems;
4
+ exports.validateRequireAll = validateRequireAll;
5
+ exports.validateFieldType = validateFieldType;
6
+ exports.validateFieldConstraints = validateFieldConstraints;
7
+ exports.validateField = validateField;
8
+ /**
9
+ * Resolve a checklist widget's item definitions from its `x-lt-source`
10
+ * "domain.path" against the escalation context. Missing domain/path or a
11
+ * non-array value yields an empty list.
12
+ */
13
+ function resolveChecklistItems(sourcePath, ctx) {
14
+ if (typeof sourcePath !== 'string' || !ctx)
15
+ return [];
16
+ const dot = sourcePath.indexOf('.');
17
+ if (dot === -1)
18
+ return [];
19
+ const domainObj = ctx[sourcePath.slice(0, dot)];
20
+ if (!domainObj || typeof domainObj !== 'object')
21
+ return [];
22
+ let cur = domainObj;
23
+ for (const p of sourcePath.slice(dot + 1).split('.')) {
24
+ cur = cur[p];
25
+ if (cur === undefined)
26
+ return [];
27
+ }
28
+ return Array.isArray(cur) ? cur : [];
29
+ }
30
+ /**
31
+ * The checklist completion guard (`x-lt-require-all`): every rendered item must
32
+ * be checked, except items whose definition carries `required: false` (the
33
+ * explicit opt-out). Vacuous when the source resolves to no items — never
34
+ * blocks on zero. Returns the panel message, or undefined when satisfied.
35
+ * Stricter than (and composes with) the field-level required-array entry,
36
+ * which remains the at-least-one check.
37
+ */
38
+ function validateRequireAll(value, fieldSchema, ctx) {
39
+ if (fieldSchema?.['x-lt-widget'] !== 'checklist')
40
+ return undefined;
41
+ if (fieldSchema['x-lt-require-all'] !== true)
42
+ return undefined;
43
+ const items = resolveChecklistItems(fieldSchema['x-lt-source'], ctx);
44
+ const mandatory = items.filter((i) => i.required !== false);
45
+ if (mandatory.length === 0)
46
+ return undefined;
47
+ const state = (typeof value === 'object' && value !== null && !Array.isArray(value))
48
+ ? value
49
+ : {};
50
+ const incomplete = mandatory.filter((i) => !state[i.id]).length;
51
+ if (incomplete === 0)
52
+ return undefined;
53
+ return `${incomplete} of ${mandatory.length} checks incomplete`;
54
+ }
55
+ /**
56
+ * Runtime type check against the field's declared JSON Schema `type`. Guards
57
+ * the payload contract for API-first callers (a form widget already produces
58
+ * the right primitive; a script or agent submitting `"1"` for a number field
59
+ * does not). Absent/empty values pass — presence is the required check's job.
60
+ */
61
+ function validateFieldType(value, fieldSchema) {
62
+ const declared = fieldSchema?.type;
63
+ if (typeof declared !== 'string')
64
+ return undefined;
65
+ if (value === undefined || value === null || value === '')
66
+ return undefined;
67
+ switch (declared) {
68
+ case 'string':
69
+ return typeof value === 'string' ? undefined : 'Expected text';
70
+ case 'number':
71
+ return typeof value === 'number' && Number.isFinite(value) ? undefined : 'Expected a number';
72
+ case 'integer':
73
+ return typeof value === 'number' && Number.isInteger(value) ? undefined : 'Expected a whole number';
74
+ case 'boolean':
75
+ return typeof value === 'boolean' ? undefined : 'Expected true or false';
76
+ case 'array':
77
+ return Array.isArray(value) ? undefined : 'Expected a list';
78
+ case 'object':
79
+ return typeof value === 'object' && !Array.isArray(value) ? undefined : 'Expected an object';
80
+ default:
81
+ return undefined;
82
+ }
83
+ }
84
+ /**
85
+ * Per-field JSON Schema validation — subset used by the resolver form.
86
+ *
87
+ * Returns a human-readable error string when the value fails a constraint,
88
+ * or undefined when the value is valid. Callers are responsible for the
89
+ * required check (empty-when-required) before calling this for constraint checks.
90
+ *
91
+ * `ctx` is optional context (ShowIfContext-shaped) used to resolve dynamic
92
+ * constraint paths like `x-lt-minimum: "envelope.min_score"`.
93
+ */
94
+ function validateFieldConstraints(value, fieldSchema, ctx) {
95
+ if (!fieldSchema)
96
+ return undefined;
97
+ // Enum membership — the form's select widget constrains choices; API-first
98
+ // callers are unconstrained, so the schema's enum is the contract.
99
+ const allowed = fieldSchema.enum;
100
+ if (Array.isArray(allowed) && allowed.length > 0
101
+ && value !== undefined && value !== null && value !== ''
102
+ && !allowed.includes(value)) {
103
+ return `Must be one of: ${allowed.map((v) => String(v)).join(', ')}`;
104
+ }
105
+ if (typeof value === 'string') {
106
+ const s = value.trim();
107
+ if (s === '')
108
+ return undefined; // empty string: required check is the caller's job
109
+ const minLength = resolveNumericConstraint(fieldSchema.minLength, fieldSchema['x-lt-min-length'], ctx);
110
+ if (minLength !== undefined && s.length < minLength) {
111
+ return `Minimum ${minLength} character${minLength === 1 ? '' : 's'}`;
112
+ }
113
+ const maxLength = resolveNumericConstraint(fieldSchema.maxLength, fieldSchema['x-lt-max-length'], ctx);
114
+ if (maxLength !== undefined && s.length > maxLength) {
115
+ return `Maximum ${maxLength} characters (${s.length} entered)`;
116
+ }
117
+ const pattern = fieldSchema.pattern;
118
+ if (pattern) {
119
+ try {
120
+ if (!new RegExp(pattern).test(s)) {
121
+ const patternError = fieldSchema['x-lt-pattern-error'];
122
+ return patternError ?? 'Invalid format';
123
+ }
124
+ }
125
+ catch {
126
+ // Malformed pattern in schema — silently skip
127
+ }
128
+ }
129
+ const fmt = fieldSchema.format;
130
+ if (fmt === 'email' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(s)) {
131
+ return 'Enter a valid email address';
132
+ }
133
+ if (fmt === 'uri' && !/^https?:\/\/.+/.test(s)) {
134
+ return 'Enter a valid URL';
135
+ }
136
+ }
137
+ if (typeof value === 'number') {
138
+ const minimum = resolveNumericConstraint(fieldSchema.minimum, fieldSchema['x-lt-minimum'], ctx);
139
+ const exclusiveMinimum = resolveNumericConstraint(fieldSchema.exclusiveMinimum, undefined, ctx);
140
+ const maximum = resolveNumericConstraint(fieldSchema.maximum, fieldSchema['x-lt-maximum'], ctx);
141
+ const exclusiveMaximum = resolveNumericConstraint(fieldSchema.exclusiveMaximum, undefined, ctx);
142
+ if (minimum !== undefined && value < minimum) {
143
+ return `Minimum value is ${minimum}`;
144
+ }
145
+ if (exclusiveMinimum !== undefined && value <= exclusiveMinimum) {
146
+ return `Must be greater than ${exclusiveMinimum}`;
147
+ }
148
+ if (maximum !== undefined && value > maximum) {
149
+ return `Maximum value is ${maximum}`;
150
+ }
151
+ if (exclusiveMaximum !== undefined && value >= exclusiveMaximum) {
152
+ return `Must be less than ${exclusiveMaximum}`;
153
+ }
154
+ }
155
+ return undefined;
156
+ }
157
+ function resolveNumericConstraint(staticVal, dynamicPath, ctx) {
158
+ if (typeof staticVal === 'number')
159
+ return staticVal;
160
+ if (typeof dynamicPath === 'string' && ctx) {
161
+ const dot = dynamicPath.indexOf('.');
162
+ if (dot !== -1) {
163
+ const domain = dynamicPath.slice(0, dot);
164
+ const path = dynamicPath.slice(dot + 1);
165
+ const domainObj = ctx[domain];
166
+ if (domainObj && typeof domainObj === 'object') {
167
+ const parts = path.split('.');
168
+ let cur = domainObj;
169
+ for (const p of parts) {
170
+ cur = cur[p];
171
+ if (cur === undefined)
172
+ break;
173
+ }
174
+ if (typeof cur === 'number')
175
+ return cur;
176
+ if (typeof cur === 'string') {
177
+ const n = Number(cur);
178
+ if (!Number.isNaN(n))
179
+ return n;
180
+ }
181
+ }
182
+ }
183
+ }
184
+ return undefined;
185
+ }
186
+ /** Full field error including required check then constraints. */
187
+ function validateField(value, fieldSchema, isRequired, isTouched, ctx) {
188
+ if (!isTouched)
189
+ return undefined;
190
+ if (isRequired) {
191
+ if (value === undefined || value === null)
192
+ return 'Required';
193
+ if (typeof value === 'boolean' && !value)
194
+ return 'Required';
195
+ if (typeof value === 'string' && value.trim() === '')
196
+ return 'Required';
197
+ if (typeof value === 'object' && !Array.isArray(value) && value !== null) {
198
+ const vals = Object.values(value);
199
+ if (vals.length === 0 || vals.every((v) => !v))
200
+ return 'Required';
201
+ }
202
+ }
203
+ // Declared-type check runs before constraints: a mis-typed value would make
204
+ // the numeric/string constraint branches silently inapplicable.
205
+ const typeError = validateFieldType(value, fieldSchema);
206
+ if (typeError)
207
+ return typeError;
208
+ // Checklist completion — the stricter guard runs regardless of the
209
+ // required-array entry (which stays at-least-one when present).
210
+ const requireAll = validateRequireAll(value, fieldSchema, ctx);
211
+ if (requireAll)
212
+ return requireAll;
213
+ return validateFieldConstraints(value, fieldSchema, ctx);
214
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Isomorphic form-validation library for the x-lt-* enriched form_schema
3
+ * vocabulary. The dashboard renders and pre-validates resolver forms with it;
4
+ * the API layer enforces the same contract on every resolve surface. Pure
5
+ * functions only — no React, no DOM, no database.
6
+ */
7
+ export * from './derive-field-label';
8
+ export * from './x-lt-bind';
9
+ export * from './x-lt-help';
10
+ export * from './x-lt-show-if';
11
+ export * from './field-validator';
12
+ export * from './validate-resolver-payload';
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ /**
18
+ * Isomorphic form-validation library for the x-lt-* enriched form_schema
19
+ * vocabulary. The dashboard renders and pre-validates resolver forms with it;
20
+ * the API layer enforces the same contract on every resolve surface. Pure
21
+ * functions only — no React, no DOM, no database.
22
+ */
23
+ __exportStar(require("./derive-field-label"), exports);
24
+ __exportStar(require("./x-lt-bind"), exports);
25
+ __exportStar(require("./x-lt-help"), exports);
26
+ __exportStar(require("./x-lt-show-if"), exports);
27
+ __exportStar(require("./field-validator"), exports);
28
+ __exportStar(require("./validate-resolver-payload"), exports);
@@ -0,0 +1,41 @@
1
+ /**
2
+ * The full pre-submission validation pass over a resolver form schema — the
3
+ * same pass on both sides of the wire. The dashboard runs it on the flat form
4
+ * values before submitting; the API layer runs it on the submitted (bound,
5
+ * nested) payload by inverting x-lt-bind first. Because both entry points
6
+ * funnel into one loop, a payload that passes the client panel passes the
7
+ * server gate, and a 422's violation list is exactly what the panel shows.
8
+ *
9
+ * Semantics per field:
10
+ * - x-lt-showIf-hidden fields are skipped entirely (a field the submitter
11
+ * cannot see never blocks submission)
12
+ * - required (schema.required membership), with checklist/empty-object rules
13
+ * - declared-type check (string/number/integer/boolean/array/object)
14
+ * - enum membership
15
+ * - x-lt-require-all against the checklist items resolved from context
16
+ * - static + dynamic bounds (minimum/x-lt-minimum, lengths, patterns)
17
+ *
18
+ * The showIf/`resolver.*` domain is always the FLAT form representation, so a
19
+ * condition like `resolver.approved` reads the same on both sides.
20
+ */
21
+ import { type FieldError } from './field-validator';
22
+ import { type ShowIfContext } from './x-lt-show-if';
23
+ export type { FieldError } from './field-validator';
24
+ /**
25
+ * The escalation-surface context the pass evaluates showIf conditions and
26
+ * dynamic constraints against. `resolver` is supplied by the pass itself
27
+ * (the flat form values under validation) — callers provide the rest.
28
+ */
29
+ export type ResolverValidationContext = Omit<ShowIfContext, 'resolver'>;
30
+ /**
31
+ * Validate FLAT form values against the form schema. This is the dashboard's
32
+ * entry point (the values the user edits, keyed by field name).
33
+ */
34
+ export declare function validateResolverForm(schema: Record<string, unknown> | null | undefined, formValues: Record<string, unknown>, ctx?: ResolverValidationContext | null): FieldError[];
35
+ /**
36
+ * Validate a SUBMITTED resolver payload (the bound, nested shape the workflow
37
+ * consumes) against the form schema. This is the API layer's entry point: the
38
+ * payload is inverted through each field's x-lt-bind path back to the flat
39
+ * form representation, then run through the same pass the client uses.
40
+ */
41
+ export declare function validateResolverPayload(schema: Record<string, unknown> | null | undefined, payload: Record<string, unknown>, ctx?: ResolverValidationContext | null): FieldError[];
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateResolverForm = validateResolverForm;
4
+ exports.validateResolverPayload = validateResolverPayload;
5
+ /**
6
+ * The full pre-submission validation pass over a resolver form schema — the
7
+ * same pass on both sides of the wire. The dashboard runs it on the flat form
8
+ * values before submitting; the API layer runs it on the submitted (bound,
9
+ * nested) payload by inverting x-lt-bind first. Because both entry points
10
+ * funnel into one loop, a payload that passes the client panel passes the
11
+ * server gate, and a 422's violation list is exactly what the panel shows.
12
+ *
13
+ * Semantics per field:
14
+ * - x-lt-showIf-hidden fields are skipped entirely (a field the submitter
15
+ * cannot see never blocks submission)
16
+ * - required (schema.required membership), with checklist/empty-object rules
17
+ * - declared-type check (string/number/integer/boolean/array/object)
18
+ * - enum membership
19
+ * - x-lt-require-all against the checklist items resolved from context
20
+ * - static + dynamic bounds (minimum/x-lt-minimum, lengths, patterns)
21
+ *
22
+ * The showIf/`resolver.*` domain is always the FLAT form representation, so a
23
+ * condition like `resolver.approved` reads the same on both sides.
24
+ */
25
+ const field_validator_1 = require("./field-validator");
26
+ const x_lt_show_if_1 = require("./x-lt-show-if");
27
+ const x_lt_bind_1 = require("./x-lt-bind");
28
+ /**
29
+ * Validate FLAT form values against the form schema. This is the dashboard's
30
+ * entry point (the values the user edits, keyed by field name).
31
+ */
32
+ function validateResolverForm(schema, formValues, ctx) {
33
+ if (!schema)
34
+ return [];
35
+ const properties = (schema.properties ?? {});
36
+ const required = new Set(schema.required ?? []);
37
+ const liveCtx = {
38
+ ...(ctx ?? {}),
39
+ resolver: formValues,
40
+ };
41
+ const errors = [];
42
+ for (const [field, fieldSchema] of Object.entries(properties)) {
43
+ if (!(0, x_lt_show_if_1.evaluateShowIf)(fieldSchema['x-lt-showIf'], liveCtx))
44
+ continue;
45
+ const err = (0, field_validator_1.validateField)(formValues[field], fieldSchema, required.has(field), true, liveCtx);
46
+ if (err)
47
+ errors.push({ field, message: err });
48
+ }
49
+ return errors;
50
+ }
51
+ /**
52
+ * Validate a SUBMITTED resolver payload (the bound, nested shape the workflow
53
+ * consumes) against the form schema. This is the API layer's entry point: the
54
+ * payload is inverted through each field's x-lt-bind path back to the flat
55
+ * form representation, then run through the same pass the client uses.
56
+ */
57
+ function validateResolverPayload(schema, payload, ctx) {
58
+ if (!schema)
59
+ return [];
60
+ const formValues = (0, x_lt_bind_1.mapPayloadToForm)(payload, schema);
61
+ return validateResolverForm(schema, formValues, ctx);
62
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * x-lt-bind — maps the escalation FORM (flat field values the user edits) to and
3
+ * from the PAYLOAD (the nested JSON the workflow consumes). A form_schema property
4
+ * may declare `x-lt-bind: "a.b[0].c"`, the path its value occupies in the payload;
5
+ * a property with no bind sits at its own name at the root (1:1). This module is
6
+ * isomorphic — the dashboard renders forms with it, and the API layer inverts a
7
+ * submitted payload through it to validate against the form contract. One
8
+ * implementation, both sides.
9
+ *
10
+ * mapPayloadToForm — payload → flat form values, to PREFILL/display the form
11
+ * (server-side: to validate a submitted payload)
12
+ * mapFormToPayload — flat form values → payload, the shape submitted/stored
13
+ */
14
+ type PathSeg = {
15
+ key: string;
16
+ } | {
17
+ index: number;
18
+ };
19
+ /** Parse a bind path — dot keys with optional `[n]` indices. Rejects pollution keys. */
20
+ export declare function parsePath(path: string): PathSeg[];
21
+ /** Set `value` at `path` inside `root`, creating intermediate objects/arrays. */
22
+ export declare function setDeep(root: Record<string, any>, path: string, value: unknown): void;
23
+ /** Read the value at `path` inside `root` (undefined if any segment is missing). */
24
+ export declare function getDeep(root: unknown, path: string): unknown;
25
+ /** The bind path for a form property (its `x-lt-bind`, or the property name). */
26
+ export declare function bindPathFor(propName: string, propDef: Record<string, any> | undefined): string;
27
+ /**
28
+ * Assemble the payload from the form's flat values. A field absent from
29
+ * `formValues` is omitted (so clearing/deleting a field drops it from the
30
+ * payload). Unknown keys not declared in the schema are dropped. With no schema
31
+ * properties, values pass through unchanged.
32
+ */
33
+ export declare function mapFormToPayload(formValues: Record<string, any>, formSchema: Record<string, any> | null | undefined): Record<string, any>;
34
+ /**
35
+ * Reverse of {@link mapFormToPayload}: pull each form field's value out of the
36
+ * payload via its bind path, to prefill/display the form. A field whose bound
37
+ * path is missing from the payload is omitted (the caller falls back to the
38
+ * schema default).
39
+ */
40
+ export declare function mapPayloadToForm(payload: Record<string, any> | null | undefined, formSchema: Record<string, any> | null | undefined): Record<string, any>;
41
+ export {};
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ /**
3
+ * x-lt-bind — maps the escalation FORM (flat field values the user edits) to and
4
+ * from the PAYLOAD (the nested JSON the workflow consumes). A form_schema property
5
+ * may declare `x-lt-bind: "a.b[0].c"`, the path its value occupies in the payload;
6
+ * a property with no bind sits at its own name at the root (1:1). This module is
7
+ * isomorphic — the dashboard renders forms with it, and the API layer inverts a
8
+ * submitted payload through it to validate against the form contract. One
9
+ * implementation, both sides.
10
+ *
11
+ * mapPayloadToForm — payload → flat form values, to PREFILL/display the form
12
+ * (server-side: to validate a submitted payload)
13
+ * mapFormToPayload — flat form values → payload, the shape submitted/stored
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.parsePath = parsePath;
17
+ exports.setDeep = setDeep;
18
+ exports.getDeep = getDeep;
19
+ exports.bindPathFor = bindPathFor;
20
+ exports.mapFormToPayload = mapFormToPayload;
21
+ exports.mapPayloadToForm = mapPayloadToForm;
22
+ const BLOCKED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
23
+ /** Parse a bind path — dot keys with optional `[n]` indices. Rejects pollution keys. */
24
+ function parsePath(path) {
25
+ const segs = [];
26
+ for (const raw of path.split('.')) {
27
+ const m = raw.match(/^([^[\]]*)((?:\[\d+\])*)$/);
28
+ if (!m)
29
+ throw new Error(`invalid x-lt-bind path segment: "${raw}"`);
30
+ const [, name, brackets] = m;
31
+ if (name) {
32
+ if (BLOCKED_KEYS.has(name))
33
+ throw new Error(`x-lt-bind path may not target "${name}"`);
34
+ segs.push({ key: name });
35
+ }
36
+ for (const b of brackets.match(/\d+/g) ?? [])
37
+ segs.push({ index: Number(b) });
38
+ }
39
+ if (segs.length === 0)
40
+ throw new Error(`empty x-lt-bind path: "${path}"`);
41
+ return segs;
42
+ }
43
+ /** Set `value` at `path` inside `root`, creating intermediate objects/arrays. */
44
+ function setDeep(root, path, value) {
45
+ const segs = parsePath(path);
46
+ let node = root;
47
+ for (let i = 0; i < segs.length - 1; i++) {
48
+ const seg = segs[i];
49
+ const next = segs[i + 1];
50
+ const childKey = 'key' in seg ? seg.key : seg.index;
51
+ const wantArray = 'index' in next;
52
+ if (node[childKey] == null || typeof node[childKey] !== 'object') {
53
+ node[childKey] = wantArray ? [] : {};
54
+ }
55
+ node = node[childKey];
56
+ }
57
+ const last = segs[segs.length - 1];
58
+ node['key' in last ? last.key : last.index] = value;
59
+ }
60
+ /** Read the value at `path` inside `root` (undefined if any segment is missing). */
61
+ function getDeep(root, path) {
62
+ let node = root;
63
+ for (const seg of parsePath(path)) {
64
+ if (node == null || typeof node !== 'object')
65
+ return undefined;
66
+ node = node['key' in seg ? seg.key : seg.index];
67
+ }
68
+ return node;
69
+ }
70
+ /** The bind path for a form property (its `x-lt-bind`, or the property name). */
71
+ function bindPathFor(propName, propDef) {
72
+ const bind = propDef?.['x-lt-bind'];
73
+ return typeof bind === 'string' && bind.length > 0 ? bind : propName;
74
+ }
75
+ /**
76
+ * Assemble the payload from the form's flat values. A field absent from
77
+ * `formValues` is omitted (so clearing/deleting a field drops it from the
78
+ * payload). Unknown keys not declared in the schema are dropped. With no schema
79
+ * properties, values pass through unchanged.
80
+ */
81
+ function mapFormToPayload(formValues, formSchema) {
82
+ const props = formSchema?.properties;
83
+ if (!props)
84
+ return { ...formValues };
85
+ const payload = {};
86
+ for (const [name, def] of Object.entries(props)) {
87
+ if (!(name in formValues))
88
+ continue;
89
+ setDeep(payload, bindPathFor(name, def), formValues[name]);
90
+ }
91
+ return payload;
92
+ }
93
+ /**
94
+ * Reverse of {@link mapFormToPayload}: pull each form field's value out of the
95
+ * payload via its bind path, to prefill/display the form. A field whose bound
96
+ * path is missing from the payload is omitted (the caller falls back to the
97
+ * schema default).
98
+ */
99
+ function mapPayloadToForm(payload, formSchema) {
100
+ const props = formSchema?.properties;
101
+ if (!props)
102
+ return payload ? { ...payload } : {};
103
+ const form = {};
104
+ for (const [name, def] of Object.entries(props)) {
105
+ const v = getDeep(payload, bindPathFor(name, def));
106
+ if (v !== undefined)
107
+ form[name] = v;
108
+ }
109
+ return form;
110
+ }
@@ -0,0 +1,21 @@
1
+ /** The token domains a help template may reference. */
2
+ export declare const HELP_DOMAINS: readonly ["escalation", "metadata", "envelope", "payload", "resolver"];
3
+ export type HelpDomain = (typeof HELP_DOMAINS)[number];
4
+ export type HelpTokenContext = Partial<Record<HelpDomain, Record<string, unknown> | null>>;
5
+ /** Replace every `{{domain.path}}` token with its value from the context. */
6
+ export declare function interpolateHelp(template: string, ctx: HelpTokenContext): string;
7
+ /** The schema's help source: `x-lt-help` first, `x-lt-context` as fallback. */
8
+ export declare function resolveHelpSource(schema: Record<string, unknown> | null | undefined): string | null;
9
+ /** The schema's help content, interpolated. Null when the schema declares none. */
10
+ export declare function buildHelpMarkdown(schema: Record<string, unknown> | null | undefined, ctx: HelpTokenContext): string | null;
11
+ export interface HelpStateHint {
12
+ isTerminal: boolean;
13
+ status?: string;
14
+ claimed: boolean;
15
+ claimedByMe: boolean;
16
+ }
17
+ /**
18
+ * State-aware guidance shown when the schema carries no help content — the
19
+ * panel always tells the user what this page expects of them right now.
20
+ */
21
+ export declare function defaultHelpMarkdown({ isTerminal, status, claimed, claimedByMe }: HelpStateHint): string;