@hotmeshio/long-tail 0.10.11 → 0.10.14

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 (336) hide show
  1. package/README.md +2 -4
  2. package/build/api/escalations/list.d.ts +1 -0
  3. package/build/api/escalations/list.js +1 -0
  4. package/build/api/escalations/metadata.d.ts +11 -0
  5. package/build/api/escalations/metadata.js +28 -8
  6. package/build/api/escalations/resolve.js +4 -4
  7. package/build/api/scan-codes/config.d.ts +22 -0
  8. package/build/api/scan-codes/config.js +136 -0
  9. package/build/api/scan-codes/execute.d.ts +9 -0
  10. package/build/api/scan-codes/execute.js +372 -0
  11. package/build/api/scan-codes/index.d.ts +2 -0
  12. package/build/api/scan-codes/index.js +14 -0
  13. package/build/lib/db/schemas/026_scan_codes.sql +51 -0
  14. package/build/lib/db/schemas/027_scan_codes_reindex.sql +23 -0
  15. package/build/lib/events/system-events.js +4 -0
  16. package/build/modules/features.d.ts +8 -0
  17. package/build/modules/features.js +1 -0
  18. package/build/routes/escalations/list.js +1 -0
  19. package/build/routes/index.js +2 -0
  20. package/build/routes/scan-codes.d.ts +2 -0
  21. package/build/routes/scan-codes.js +138 -0
  22. package/build/sdk/index.d.ts +4 -0
  23. package/build/services/escalation/crud.d.ts +1 -1
  24. package/build/services/escalation/crud.js +4 -2
  25. package/build/services/escalation/queries.d.ts +1 -0
  26. package/build/services/escalation/queries.js +2 -0
  27. package/build/services/escalation/resolver-validation.d.ts +1 -1
  28. package/build/services/escalation/resolver-validation.js +12 -5
  29. package/build/services/escalation/sql.d.ts +11 -6
  30. package/build/services/escalation/sql.js +20 -20
  31. package/build/services/escalation/submit-guard.d.ts +29 -0
  32. package/build/services/escalation/submit-guard.js +57 -0
  33. package/build/services/scan-code/index.d.ts +4 -0
  34. package/build/services/scan-code/index.js +21 -0
  35. package/build/services/scan-code/parse.d.ts +35 -0
  36. package/build/services/scan-code/parse.js +108 -0
  37. package/build/services/scan-code/read.d.ts +5 -0
  38. package/build/services/scan-code/read.js +50 -0
  39. package/build/services/scan-code/sql.d.ts +10 -0
  40. package/build/services/scan-code/sql.js +57 -0
  41. package/build/services/scan-code/validate.d.ts +12 -0
  42. package/build/services/scan-code/validate.js +78 -0
  43. package/build/services/scan-code/write.d.ts +26 -0
  44. package/build/services/scan-code/write.js +71 -0
  45. package/build/shared/form-validation/index.d.ts +5 -0
  46. package/build/shared/form-validation/index.js +5 -0
  47. package/build/shared/form-validation/x-lt-labels.d.ts +28 -0
  48. package/build/shared/form-validation/x-lt-labels.js +42 -0
  49. package/build/shared/form-validation/x-lt-query.d.ts +56 -0
  50. package/build/shared/form-validation/x-lt-query.js +49 -0
  51. package/build/shared/form-validation/x-lt-submit-guard.d.ts +46 -0
  52. package/build/shared/form-validation/x-lt-submit-guard.js +25 -0
  53. package/build/shared/form-validation/x-lt-submit-on-claim.d.ts +22 -0
  54. package/build/shared/form-validation/x-lt-submit-on-claim.js +28 -0
  55. package/build/shared/form-validation/x-lt-transition.d.ts +47 -0
  56. package/build/shared/form-validation/x-lt-transition.js +65 -0
  57. package/build/system/mcp-servers/admin/index.d.ts +1 -0
  58. package/build/system/mcp-servers/admin/index.js +5 -2
  59. package/build/system/mcp-servers/admin/scan-codes.d.ts +10 -0
  60. package/build/system/mcp-servers/admin/scan-codes.js +111 -0
  61. package/build/system/mcp-servers/admin/schemas.d.ts +232 -14
  62. package/build/system/mcp-servers/admin/schemas.js +50 -0
  63. package/build/system/seed/tool-manifests-admin.d.ts +1380 -0
  64. package/build/system/seed/tool-manifests-admin.js +6 -0
  65. package/build/tsconfig.tsbuildinfo +1 -1
  66. package/build/types/events.d.ts +9 -0
  67. package/build/types/index.d.ts +2 -0
  68. package/build/types/index.js +10 -1
  69. package/build/types/scan-code.d.ts +183 -0
  70. package/build/types/scan-code.js +80 -0
  71. package/build/types/startup.d.ts +6 -0
  72. package/dashboard/dist/assets/{AdminDashboard-CkTbRfY9.js → AdminDashboard-Chg69wlx.js} +2 -2
  73. package/dashboard/dist/assets/{AdminDashboard-CkTbRfY9.js.map → AdminDashboard-Chg69wlx.js.map} +1 -1
  74. package/dashboard/dist/assets/{AgentConfigPage-Cm8FRpXi.js → AgentConfigPage-DRTFwbfC.js} +6 -6
  75. package/dashboard/dist/assets/{AgentConfigPage-Cm8FRpXi.js.map → AgentConfigPage-DRTFwbfC.js.map} +1 -1
  76. package/dashboard/dist/assets/{AgentDetailPage-sQ1-UT46.js → AgentDetailPage-JKByfFIi.js} +3 -3
  77. package/dashboard/dist/assets/{AgentDetailPage-sQ1-UT46.js.map → AgentDetailPage-JKByfFIi.js.map} +1 -1
  78. package/dashboard/dist/assets/AgentsPage-BlgEmKhA.js +2 -0
  79. package/dashboard/dist/assets/{AgentsPage-bSx_mdae.js.map → AgentsPage-BlgEmKhA.js.map} +1 -1
  80. package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js → AutoGrowTextarea-DgEQeRQw.js} +2 -2
  81. package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js.map → AutoGrowTextarea-DgEQeRQw.js.map} +1 -1
  82. package/dashboard/dist/assets/AvailableEscalationsPage-C_7y692Q.js +2 -0
  83. package/dashboard/dist/assets/{AvailableEscalationsPage-8pMC7Xv6.js.map → AvailableEscalationsPage-C_7y692Q.js.map} +1 -1
  84. package/dashboard/dist/assets/BotPicker-CCVcz4Cq.js +2 -0
  85. package/dashboard/dist/assets/{BotPicker-C4uGH2x9.js.map → BotPicker-CCVcz4Cq.js.map} +1 -1
  86. package/dashboard/dist/assets/{CapabilitiesPage-BRoOeKcc.js → CapabilitiesPage-Czi9jUwD.js} +2 -2
  87. package/dashboard/dist/assets/{CapabilitiesPage-BRoOeKcc.js.map → CapabilitiesPage-Czi9jUwD.js.map} +1 -1
  88. package/dashboard/dist/assets/{CollapsibleSection-CIj8Adc9.js → CollapsibleSection-8YE965QX.js} +2 -2
  89. package/dashboard/dist/assets/{CollapsibleSection-CIj8Adc9.js.map → CollapsibleSection-8YE965QX.js.map} +1 -1
  90. package/dashboard/dist/assets/{ConfirmDeleteModal-Ugi_9Ukq.js → ConfirmDeleteModal-CQsJUzEa.js} +2 -2
  91. package/dashboard/dist/assets/{ConfirmDeleteModal-Ugi_9Ukq.js.map → ConfirmDeleteModal-CQsJUzEa.js.map} +1 -1
  92. package/dashboard/dist/assets/{CopyableId-GUEdiiL5.js → CopyableId-4Lqlc5cU.js} +2 -2
  93. package/dashboard/dist/assets/{CopyableId-GUEdiiL5.js.map → CopyableId-4Lqlc5cU.js.map} +1 -1
  94. package/dashboard/dist/assets/CountdownTimer-Bxvq3D7j.js +2 -0
  95. package/dashboard/dist/assets/CountdownTimer-Bxvq3D7j.js.map +1 -0
  96. package/dashboard/dist/assets/{CredentialsPage-B73Si6K1.js → CredentialsPage-Bn7_SX6-.js} +2 -2
  97. package/dashboard/dist/assets/{CredentialsPage-B73Si6K1.js.map → CredentialsPage-Bn7_SX6-.js.map} +1 -1
  98. package/dashboard/dist/assets/{CronLabel-Ca1aHolt.js → CronLabel-Bn4mX_Yn.js} +2 -2
  99. package/dashboard/dist/assets/{CronLabel-Ca1aHolt.js.map → CronLabel-Bn4mX_Yn.js.map} +1 -1
  100. package/dashboard/dist/assets/{CustomDurationPicker-_9E9x1YN.js → CustomDurationPicker-pMcrFyW6.js} +2 -2
  101. package/dashboard/dist/assets/{CustomDurationPicker-_9E9x1YN.js.map → CustomDurationPicker-pMcrFyW6.js.map} +1 -1
  102. package/dashboard/dist/assets/{DataTable-BTu2AaEl.js → DataTable-Bir0Xs1p.js} +2 -2
  103. package/dashboard/dist/assets/{DataTable-BTu2AaEl.js.map → DataTable-Bir0Xs1p.js.map} +1 -1
  104. package/dashboard/dist/assets/{DropZone-NYn6TWHz.js → DropZone-zCEGjjk-.js} +2 -2
  105. package/dashboard/dist/assets/{DropZone-NYn6TWHz.js.map → DropZone-zCEGjjk-.js.map} +1 -1
  106. package/dashboard/dist/assets/{ElapsedCell-karxia93.js → ElapsedCell-BGO7IXEg.js} +2 -2
  107. package/dashboard/dist/assets/{ElapsedCell-karxia93.js.map → ElapsedCell-BGO7IXEg.js.map} +1 -1
  108. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js → EmptyState-lpUFYfun.js} +2 -2
  109. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-lpUFYfun.js.map} +1 -1
  110. package/dashboard/dist/assets/{EscalationListSchemaPage-CDaNmbUA.js → EscalationListSchemaPage-CFDxbd50.js} +3 -3
  111. package/dashboard/dist/assets/{EscalationListSchemaPage-CDaNmbUA.js.map → EscalationListSchemaPage-CFDxbd50.js.map} +1 -1
  112. package/dashboard/dist/assets/{EscalationSchemaPage-k-2hFT2t.js → EscalationSchemaPage-DnXPnDkz.js} +3 -3
  113. package/dashboard/dist/assets/{EscalationSchemaPage-k-2hFT2t.js.map → EscalationSchemaPage-DnXPnDkz.js.map} +1 -1
  114. package/dashboard/dist/assets/{EscalationsOverview-C1e7IPn_.js → EscalationsOverview-BZMVXrkK.js} +2 -2
  115. package/dashboard/dist/assets/{EscalationsOverview-C1e7IPn_.js.map → EscalationsOverview-BZMVXrkK.js.map} +1 -1
  116. package/dashboard/dist/assets/EventTable-Bfi-f8as.js +2 -0
  117. package/dashboard/dist/assets/EventTable-Bfi-f8as.js.map +1 -0
  118. package/dashboard/dist/assets/FilterBar-Do7yR4xM.js +2 -0
  119. package/dashboard/dist/assets/FilterBar-Do7yR4xM.js.map +1 -0
  120. package/dashboard/dist/assets/{GraphInvokePage-LMpWw8z1.js → GraphInvokePage-d1ie4T7f.js} +2 -2
  121. package/dashboard/dist/assets/{GraphInvokePage-LMpWw8z1.js.map → GraphInvokePage-d1ie4T7f.js.map} +1 -1
  122. package/dashboard/dist/assets/{HomePage-Kl2DBG6l.js → HomePage-BEeodImU.js} +2 -2
  123. package/dashboard/dist/assets/{HomePage-Kl2DBG6l.js.map → HomePage-BEeodImU.js.map} +1 -1
  124. package/dashboard/dist/assets/ListToolbar-CLtw-1QN.js +2 -0
  125. package/dashboard/dist/assets/{ListToolbar-B2fub0DY.js.map → ListToolbar-CLtw-1QN.js.map} +1 -1
  126. package/dashboard/dist/assets/{McpOverview-odYnCZCC.js → McpOverview-DIsy9TB3.js} +2 -2
  127. package/dashboard/dist/assets/{McpOverview-odYnCZCC.js.map → McpOverview-DIsy9TB3.js.map} +1 -1
  128. package/dashboard/dist/assets/{McpQueryDetailPage-BtqwHUAg.js → McpQueryDetailPage-6PomdsyD.js} +3 -3
  129. package/dashboard/dist/assets/{McpQueryDetailPage-BtqwHUAg.js.map → McpQueryDetailPage-6PomdsyD.js.map} +1 -1
  130. package/dashboard/dist/assets/McpQueryPage-YMdQCXm9.js +2 -0
  131. package/dashboard/dist/assets/{McpQueryPage-CPkVwNIK.js.map → McpQueryPage-YMdQCXm9.js.map} +1 -1
  132. package/dashboard/dist/assets/McpRunDetailPage-DsD1Gm2o.js +2 -0
  133. package/dashboard/dist/assets/McpRunDetailPage-DsD1Gm2o.js.map +1 -0
  134. package/dashboard/dist/assets/{McpRunsPage-rdpZ2yMh.js → McpRunsPage--a5Jgb33.js} +2 -2
  135. package/dashboard/dist/assets/{McpRunsPage-rdpZ2yMh.js.map → McpRunsPage--a5Jgb33.js.map} +1 -1
  136. package/dashboard/dist/assets/{Modal-Dr1Xy0j0.js → Modal-BU7No9NH.js} +2 -2
  137. package/dashboard/dist/assets/{Modal-Dr1Xy0j0.js.map → Modal-BU7No9NH.js.map} +1 -1
  138. package/dashboard/dist/assets/{NamespacePill-GwO-WfhX.js → NamespacePill-wV6L4VW1.js} +2 -2
  139. package/dashboard/dist/assets/{NamespacePill-GwO-WfhX.js.map → NamespacePill-wV6L4VW1.js.map} +1 -1
  140. package/dashboard/dist/assets/OperationsPage-B2v9k3DT.js +2 -0
  141. package/dashboard/dist/assets/{OperationsPage-DlyGLPAs.js.map → OperationsPage-B2v9k3DT.js.map} +1 -1
  142. package/dashboard/dist/assets/{OperatorDashboard-Csei5vj-.js → OperatorDashboard-CkLfbxEh.js} +2 -2
  143. package/dashboard/dist/assets/{OperatorDashboard-Csei5vj-.js.map → OperatorDashboard-CkLfbxEh.js.map} +1 -1
  144. package/dashboard/dist/assets/{PageHeader-Bo9BU9pK.js → PageHeader-BtIr6r-8.js} +2 -2
  145. package/dashboard/dist/assets/{PageHeader-Bo9BU9pK.js.map → PageHeader-BtIr6r-8.js.map} +1 -1
  146. package/dashboard/dist/assets/{PageHeaderWithStats-8_5cOSKL.js → PageHeaderWithStats-C2sGqFQG.js} +2 -2
  147. package/dashboard/dist/assets/{PageHeaderWithStats-8_5cOSKL.js.map → PageHeaderWithStats-C2sGqFQG.js.map} +1 -1
  148. package/dashboard/dist/assets/{PersonaDetailPage--ZL6Or6v.js → PersonaDetailPage-CCmOgKQb.js} +2 -2
  149. package/dashboard/dist/assets/{PersonaDetailPage--ZL6Or6v.js.map → PersonaDetailPage-CCmOgKQb.js.map} +1 -1
  150. package/dashboard/dist/assets/{PersonasPage-Bdcoay3P.js → PersonasPage-BJkSuDTN.js} +2 -2
  151. package/dashboard/dist/assets/{PersonasPage-Bdcoay3P.js.map → PersonasPage-BJkSuDTN.js.map} +1 -1
  152. package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js → PriorityBadge-BETdj4M-.js} +2 -2
  153. package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js.map → PriorityBadge-BETdj4M-.js.map} +1 -1
  154. package/dashboard/dist/assets/{ProcessDetailPage-HrmVQq7S.js → ProcessDetailPage-DT9BlJXK.js} +2 -2
  155. package/dashboard/dist/assets/{ProcessDetailPage-HrmVQq7S.js.map → ProcessDetailPage-DT9BlJXK.js.map} +1 -1
  156. package/dashboard/dist/assets/{ProcessesListPage-_xmj6Bo-.js → ProcessesListPage-DgSGzTDT.js} +2 -2
  157. package/dashboard/dist/assets/{ProcessesListPage-_xmj6Bo-.js.map → ProcessesListPage-DgSGzTDT.js.map} +1 -1
  158. package/dashboard/dist/assets/{RoleDetailPage-C0ju2-4K.js → RoleDetailPage-DMphTvro.js} +3 -3
  159. package/dashboard/dist/assets/{RoleDetailPage-C0ju2-4K.js.map → RoleDetailPage-DMphTvro.js.map} +1 -1
  160. package/dashboard/dist/assets/{RolePill-CQlnEWkK.js → RolePill-BBYjhAPj.js} +2 -2
  161. package/dashboard/dist/assets/{RolePill-CQlnEWkK.js.map → RolePill-BBYjhAPj.js.map} +1 -1
  162. package/dashboard/dist/assets/{RolesPage-CKluVSpB.js → RolesPage-gi_kaot1.js} +2 -2
  163. package/dashboard/dist/assets/{RolesPage-CKluVSpB.js.map → RolesPage-gi_kaot1.js.map} +1 -1
  164. package/dashboard/dist/assets/{RowActions-BA9L9djf.js → RowActions-eYrzgQSj.js} +2 -2
  165. package/dashboard/dist/assets/{RowActions-BA9L9djf.js.map → RowActions-eYrzgQSj.js.map} +1 -1
  166. package/dashboard/dist/assets/RunAsSelector-CateuvcC.js +2 -0
  167. package/dashboard/dist/assets/{RunAsSelector-DdfecQ1U.js.map → RunAsSelector-CateuvcC.js.map} +1 -1
  168. package/dashboard/dist/assets/ScanCodesPage-CQ8RxMug.js +2 -0
  169. package/dashboard/dist/assets/ScanCodesPage-CQ8RxMug.js.map +1 -0
  170. package/dashboard/dist/assets/ScanSchemeDetailPage-puSbuxcV.js +2 -0
  171. package/dashboard/dist/assets/ScanSchemeDetailPage-puSbuxcV.js.map +1 -0
  172. package/dashboard/dist/assets/{ScopeBadge-BBYkevuR.js → ScopeBadge-xs2Nhjy4.js} +2 -2
  173. package/dashboard/dist/assets/{ScopeBadge-BBYkevuR.js.map → ScopeBadge-xs2Nhjy4.js.map} +1 -1
  174. package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js +2 -0
  175. package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js.map +1 -0
  176. package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js → StatCard-BXQ8dD9Y.js} +2 -2
  177. package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js.map → StatCard-BXQ8dD9Y.js.map} +1 -1
  178. package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js → StatusBadge-DkgllZHv.js} +2 -2
  179. package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js.map → StatusBadge-DkgllZHv.js.map} +1 -1
  180. package/dashboard/dist/assets/StickyPagination-Cg-QdYWL.js +2 -0
  181. package/dashboard/dist/assets/StickyPagination-Cg-QdYWL.js.map +1 -0
  182. package/dashboard/dist/assets/{StreamMessageDetail-CZXWDawC.js → StreamMessageDetail-DEeuh4_-.js} +2 -2
  183. package/dashboard/dist/assets/{StreamMessageDetail-CZXWDawC.js.map → StreamMessageDetail-DEeuh4_-.js.map} +1 -1
  184. package/dashboard/dist/assets/{SwimlaneTimeline-fWY0gaf3.js → SwimlaneTimeline-DMY0jL2F.js} +2 -2
  185. package/dashboard/dist/assets/{SwimlaneTimeline-fWY0gaf3.js.map → SwimlaneTimeline-DMY0jL2F.js.map} +1 -1
  186. package/dashboard/dist/assets/{TagInput-CDKbslLx.js → TagInput-BMmiV-MD.js} +2 -2
  187. package/dashboard/dist/assets/{TagInput-CDKbslLx.js.map → TagInput-BMmiV-MD.js.map} +1 -1
  188. package/dashboard/dist/assets/{TaskDetailPage-BjE4G2yn.js → TaskDetailPage-CPbkIvfF.js} +2 -2
  189. package/dashboard/dist/assets/{TaskDetailPage-BjE4G2yn.js.map → TaskDetailPage-CPbkIvfF.js.map} +1 -1
  190. package/dashboard/dist/assets/{TaskQueuePill-G3RuYRNZ.js → TaskQueuePill-DLgYaw1x.js} +2 -2
  191. package/dashboard/dist/assets/{TaskQueuePill-G3RuYRNZ.js.map → TaskQueuePill-DLgYaw1x.js.map} +1 -1
  192. package/dashboard/dist/assets/{TasksListPage-KAhmCWB2.js → TasksListPage-CtHudKhQ.js} +2 -2
  193. package/dashboard/dist/assets/{TasksListPage-KAhmCWB2.js.map → TasksListPage-CtHudKhQ.js.map} +1 -1
  194. package/dashboard/dist/assets/TimeAgo-BdHOizWg.js +2 -0
  195. package/dashboard/dist/assets/{TimeAgo-C_H2TyZw.js.map → TimeAgo-BdHOizWg.js.map} +1 -1
  196. package/dashboard/dist/assets/{TimestampCell-COG_4Flg.js → TimestampCell-FVukzKRe.js} +2 -2
  197. package/dashboard/dist/assets/{TimestampCell-COG_4Flg.js.map → TimestampCell-FVukzKRe.js.map} +1 -1
  198. package/dashboard/dist/assets/{ToolPill-ChSyRJZC.js → ToolPill-BvS53hxP.js} +2 -2
  199. package/dashboard/dist/assets/{ToolPill-ChSyRJZC.js.map → ToolPill-BvS53hxP.js.map} +1 -1
  200. package/dashboard/dist/assets/{ToolTestPanel-BPdJECW0.js → ToolTestPanel-HN0OCYTL.js} +2 -2
  201. package/dashboard/dist/assets/{ToolTestPanel-BPdJECW0.js.map → ToolTestPanel-HN0OCYTL.js.map} +1 -1
  202. package/dashboard/dist/assets/{TopicDetailPage-DAqx5JqA.js → TopicDetailPage-DHdSpN61.js} +4 -4
  203. package/dashboard/dist/assets/{TopicDetailPage-DAqx5JqA.js.map → TopicDetailPage-DHdSpN61.js.map} +1 -1
  204. package/dashboard/dist/assets/TopicsPage-Clr6Tl5P.js +2 -0
  205. package/dashboard/dist/assets/{TopicsPage-DoGqAdPm.js.map → TopicsPage-Clr6Tl5P.js.map} +1 -1
  206. package/dashboard/dist/assets/UserName-BUVYyIAS.js +2 -0
  207. package/dashboard/dist/assets/{UserName-CKO_rk1R.js.map → UserName-BUVYyIAS.js.map} +1 -1
  208. package/dashboard/dist/assets/WorkflowExecutionPage-kncWFfe5.js +2 -0
  209. package/dashboard/dist/assets/WorkflowExecutionPage-kncWFfe5.js.map +1 -0
  210. package/dashboard/dist/assets/{WorkflowPill-CNbwug5p.js → WorkflowPill-BPC_Dc_I.js} +2 -2
  211. package/dashboard/dist/assets/{WorkflowPill-CNbwug5p.js.map → WorkflowPill-BPC_Dc_I.js.map} +1 -1
  212. package/dashboard/dist/assets/WorkflowsDashboard-4ypPDGKx.js +2 -0
  213. package/dashboard/dist/assets/{WorkflowsDashboard-DdJ86We6.js.map → WorkflowsDashboard-4ypPDGKx.js.map} +1 -1
  214. package/dashboard/dist/assets/{WorkflowsOverview-ZfFBzePp.js → WorkflowsOverview-CeQlZkkd.js} +2 -2
  215. package/dashboard/dist/assets/{WorkflowsOverview-ZfFBzePp.js.map → WorkflowsOverview-CeQlZkkd.js.map} +1 -1
  216. package/dashboard/dist/assets/{YamlWorkflowDetailPage-4bd5yXdA.js → YamlWorkflowDetailPage-DLAlEzwT.js} +13 -13
  217. package/dashboard/dist/assets/{YamlWorkflowDetailPage-4bd5yXdA.js.map → YamlWorkflowDetailPage-DLAlEzwT.js.map} +1 -1
  218. package/dashboard/dist/assets/{YamlWorkflowsPage-iHPNXjQj.js → YamlWorkflowsPage-DQhenKFT.js} +2 -2
  219. package/dashboard/dist/assets/{YamlWorkflowsPage-iHPNXjQj.js.map → YamlWorkflowsPage-DQhenKFT.js.map} +1 -1
  220. package/dashboard/dist/assets/{agents-DjD5U3Wb.js → agents-s3feet3W.js} +2 -2
  221. package/dashboard/dist/assets/{agents-DjD5U3Wb.js.map → agents-s3feet3W.js.map} +1 -1
  222. package/dashboard/dist/assets/{bots-DiljVapH.js → bots-CkSd2rn9.js} +2 -2
  223. package/dashboard/dist/assets/{bots-DiljVapH.js.map → bots-CkSd2rn9.js.map} +1 -1
  224. package/dashboard/dist/assets/capabilities-DA_r09tM.js +2 -0
  225. package/dashboard/dist/assets/{capabilities-DV_5ghHT.js.map → capabilities-DA_r09tM.js.map} +1 -1
  226. package/dashboard/dist/assets/{controlplane-BKMvfWCB.js → controlplane-C9c25q21.js} +2 -2
  227. package/dashboard/dist/assets/{controlplane-BKMvfWCB.js.map → controlplane-C9c25q21.js.map} +1 -1
  228. package/dashboard/dist/assets/{escalation-columns-BQpCaJId.js → escalation-columns-Cp3UrT48.js} +2 -2
  229. package/dashboard/dist/assets/{escalation-columns-BQpCaJId.js.map → escalation-columns-Cp3UrT48.js.map} +1 -1
  230. package/dashboard/dist/assets/{index-BO-7S9Xw.js → index--7Vdkzwd.js} +2 -2
  231. package/dashboard/dist/assets/{index-BO-7S9Xw.js.map → index--7Vdkzwd.js.map} +1 -1
  232. package/dashboard/dist/assets/index--DG-qQBT.js +65 -0
  233. package/dashboard/dist/assets/index--DG-qQBT.js.map +1 -0
  234. package/dashboard/dist/assets/{index-BaV3l0UE.js → index-BIcYbDVf.js} +2 -2
  235. package/dashboard/dist/assets/{index-BaV3l0UE.js.map → index-BIcYbDVf.js.map} +1 -1
  236. package/dashboard/dist/assets/index-BU5FFAJo.js +2 -0
  237. package/dashboard/dist/assets/{index-CItsikDw.js.map → index-BU5FFAJo.js.map} +1 -1
  238. package/dashboard/dist/assets/{index-BsOxMMmb.js → index-Bo5TtX9l.js} +2 -2
  239. package/dashboard/dist/assets/{index-BsOxMMmb.js.map → index-Bo5TtX9l.js.map} +1 -1
  240. package/dashboard/dist/assets/{index-Tx_ETzcH.js → index-C-MmR-jf.js} +2 -2
  241. package/dashboard/dist/assets/{index-Tx_ETzcH.js.map → index-C-MmR-jf.js.map} +1 -1
  242. package/dashboard/dist/assets/index-C7ABSOU2.js +6 -0
  243. package/dashboard/dist/assets/index-C7ABSOU2.js.map +1 -0
  244. package/dashboard/dist/assets/index-Cmxzk4ay.js +5 -0
  245. package/dashboard/dist/assets/{index-nIrYejxe.js.map → index-Cmxzk4ay.js.map} +1 -1
  246. package/dashboard/dist/assets/{index-CI8rrKjx.js → index-Cw9poaez.js} +2 -2
  247. package/dashboard/dist/assets/{index-CI8rrKjx.js.map → index-Cw9poaez.js.map} +1 -1
  248. package/dashboard/dist/assets/index-DEbY57_c.js +3 -0
  249. package/dashboard/dist/assets/index-DEbY57_c.js.map +1 -0
  250. package/dashboard/dist/assets/index-DnV6LSeY.css +1 -0
  251. package/dashboard/dist/assets/{index-xZqQxqu2.js → index-DvoMXQqO.js} +2 -2
  252. package/dashboard/dist/assets/{index-xZqQxqu2.js.map → index-DvoMXQqO.js.map} +1 -1
  253. package/dashboard/dist/assets/{index-DhATO1cS.js → index-S13oPvuS.js} +2 -2
  254. package/dashboard/dist/assets/{index-DhATO1cS.js.map → index-S13oPvuS.js.map} +1 -1
  255. package/dashboard/dist/assets/index-WxE3ONia.js +2 -0
  256. package/dashboard/dist/assets/{index-CStR4uIU.js.map → index-WxE3ONia.js.map} +1 -1
  257. package/dashboard/dist/assets/{knowledge-BocTnSiA.js → knowledge-Bpln0zy_.js} +2 -2
  258. package/dashboard/dist/assets/{knowledge-BocTnSiA.js.map → knowledge-Bpln0zy_.js.map} +1 -1
  259. package/dashboard/dist/assets/{mcp-C1KBjKQ_.js → mcp-BqDq3RZH.js} +2 -2
  260. package/dashboard/dist/assets/{mcp-C1KBjKQ_.js.map → mcp-BqDq3RZH.js.map} +1 -1
  261. package/dashboard/dist/assets/{mcp-query-B3cjukkA.js → mcp-query-DGue75R6.js} +2 -2
  262. package/dashboard/dist/assets/{mcp-query-B3cjukkA.js.map → mcp-query-DGue75R6.js.map} +1 -1
  263. package/dashboard/dist/assets/{personas-DiA2bJaX.js → personas-B8z_sTiJ.js} +2 -2
  264. package/dashboard/dist/assets/{personas-DiA2bJaX.js.map → personas-B8z_sTiJ.js.map} +1 -1
  265. package/dashboard/dist/assets/{pipelines-Dt2d2EFR.js → pipelines-DYgNd9nB.js} +2 -2
  266. package/dashboard/dist/assets/{pipelines-Dt2d2EFR.js.map → pipelines-DYgNd9nB.js.map} +1 -1
  267. package/dashboard/dist/assets/{tasks-cDh2hNml.js → tasks-CJdjjhgO.js} +2 -2
  268. package/dashboard/dist/assets/{tasks-cDh2hNml.js.map → tasks-CJdjjhgO.js.map} +1 -1
  269. package/dashboard/dist/assets/{topics-yFlGF-u1.js → topics-DPrL8Dtq.js} +2 -2
  270. package/dashboard/dist/assets/{topics-yFlGF-u1.js.map → topics-DPrL8Dtq.js.map} +1 -1
  271. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js → useDebouncedValue-C4P2jQuh.js} +2 -2
  272. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js.map → useDebouncedValue-C4P2jQuh.js.map} +1 -1
  273. package/dashboard/dist/assets/{useEventHooks-D2R_ckS8.js → useEventHooks-DXCgDgiu.js} +2 -2
  274. package/dashboard/dist/assets/{useEventHooks-D2R_ckS8.js.map → useEventHooks-DXCgDgiu.js.map} +1 -1
  275. package/dashboard/dist/assets/{useFilterParams-B7suPsIK.js → useFilterParams-crmlBw_l.js} +2 -2
  276. package/dashboard/dist/assets/{useFilterParams-B7suPsIK.js.map → useFilterParams-crmlBw_l.js.map} +1 -1
  277. package/dashboard/dist/assets/{useNamespace-u-V1GVUD.js → useNamespace-DnFZfy7N.js} +2 -2
  278. package/dashboard/dist/assets/{useNamespace-u-V1GVUD.js.map → useNamespace-DnFZfy7N.js.map} +1 -1
  279. package/dashboard/dist/assets/{useYamlActivityEvents-BhOZeqgE.js → useYamlActivityEvents-kx5CLENv.js} +2 -2
  280. package/dashboard/dist/assets/{useYamlActivityEvents-BhOZeqgE.js.map → useYamlActivityEvents-kx5CLENv.js.map} +1 -1
  281. package/dashboard/dist/assets/{users-BoXPwdee.js → users-DKng7vAG.js} +2 -2
  282. package/dashboard/dist/assets/{users-BoXPwdee.js.map → users-DKng7vAG.js.map} +1 -1
  283. package/dashboard/dist/assets/{vendor-icons-D71XjkNy.js → vendor-icons-CN-bAo9U.js} +144 -134
  284. package/dashboard/dist/assets/vendor-icons-CN-bAo9U.js.map +1 -0
  285. package/dashboard/dist/assets/{vendor-query-B2UbickB.js → vendor-query-RUZdMvN6.js} +2 -2
  286. package/dashboard/dist/assets/{vendor-query-B2UbickB.js.map → vendor-query-RUZdMvN6.js.map} +1 -1
  287. package/dashboard/dist/assets/{vendor-react-C1YOyCSV.js → vendor-react-CdqEC2zv.js} +2 -2
  288. package/dashboard/dist/assets/{vendor-react-C1YOyCSV.js.map → vendor-react-CdqEC2zv.js.map} +1 -1
  289. package/dashboard/dist/assets/{workflows-mCoyKuLZ.js → workflows-C4V0rMkM.js} +2 -2
  290. package/dashboard/dist/assets/{workflows-mCoyKuLZ.js.map → workflows-C4V0rMkM.js.map} +1 -1
  291. package/dashboard/dist/assets/{yaml-workflows-CWxXGDpn.js → yaml-workflows-D3PAiJ9d.js} +2 -2
  292. package/dashboard/dist/assets/{yaml-workflows-CWxXGDpn.js.map → yaml-workflows-D3PAiJ9d.js.map} +1 -1
  293. package/dashboard/dist/index.html +5 -5
  294. package/docs/design-principles.md +9 -7
  295. package/docs/hitl/x-lt-embed.md +8 -4
  296. package/docs/hitl/x-lt-footer.md +68 -0
  297. package/docs/hitl/x-lt-list-schema.md +10 -3
  298. package/docs/hitl/x-lt-transition.md +105 -0
  299. package/docs/hitl-guide.md +9 -0
  300. package/docs/scan-codes.md +243 -0
  301. package/package.json +2 -2
  302. package/dashboard/dist/assets/AgentsPage-bSx_mdae.js +0 -2
  303. package/dashboard/dist/assets/AvailableEscalationsPage-8pMC7Xv6.js +0 -2
  304. package/dashboard/dist/assets/BotPicker-C4uGH2x9.js +0 -2
  305. package/dashboard/dist/assets/CountdownTimer-D3t0XMhE.js +0 -2
  306. package/dashboard/dist/assets/CountdownTimer-D3t0XMhE.js.map +0 -1
  307. package/dashboard/dist/assets/EventTable-CIrrtL7_.js +0 -2
  308. package/dashboard/dist/assets/EventTable-CIrrtL7_.js.map +0 -1
  309. package/dashboard/dist/assets/FilterBar-CzjtH74v.js +0 -2
  310. package/dashboard/dist/assets/FilterBar-CzjtH74v.js.map +0 -1
  311. package/dashboard/dist/assets/ListToolbar-B2fub0DY.js +0 -2
  312. package/dashboard/dist/assets/McpQueryPage-CPkVwNIK.js +0 -2
  313. package/dashboard/dist/assets/McpRunDetailPage-D-Rz9MRw.js +0 -2
  314. package/dashboard/dist/assets/McpRunDetailPage-D-Rz9MRw.js.map +0 -1
  315. package/dashboard/dist/assets/OperationsPage-DlyGLPAs.js +0 -2
  316. package/dashboard/dist/assets/RunAsSelector-DdfecQ1U.js +0 -2
  317. package/dashboard/dist/assets/StickyPagination-cLddIdtT.js +0 -2
  318. package/dashboard/dist/assets/StickyPagination-cLddIdtT.js.map +0 -1
  319. package/dashboard/dist/assets/TimeAgo-C_H2TyZw.js +0 -2
  320. package/dashboard/dist/assets/TopicsPage-DoGqAdPm.js +0 -2
  321. package/dashboard/dist/assets/UserName-CKO_rk1R.js +0 -2
  322. package/dashboard/dist/assets/WorkflowExecutionPage-D3VQ9iQV.js +0 -2
  323. package/dashboard/dist/assets/WorkflowExecutionPage-D3VQ9iQV.js.map +0 -1
  324. package/dashboard/dist/assets/WorkflowsDashboard-DdJ86We6.js +0 -2
  325. package/dashboard/dist/assets/capabilities-DV_5ghHT.js +0 -2
  326. package/dashboard/dist/assets/index-B-WkiNRN.js +0 -6
  327. package/dashboard/dist/assets/index-B-WkiNRN.js.map +0 -1
  328. package/dashboard/dist/assets/index-CItsikDw.js +0 -2
  329. package/dashboard/dist/assets/index-CStR4uIU.js +0 -2
  330. package/dashboard/dist/assets/index-DbTD-dio.js +0 -63
  331. package/dashboard/dist/assets/index-DbTD-dio.js.map +0 -1
  332. package/dashboard/dist/assets/index-DnlsDaAw.css +0 -1
  333. package/dashboard/dist/assets/index-kzIIeVbx.js +0 -5
  334. package/dashboard/dist/assets/index-kzIIeVbx.js.map +0 -1
  335. package/dashboard/dist/assets/index-nIrYejxe.js +0 -5
  336. package/dashboard/dist/assets/vendor-icons-D71XjkNy.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ import { type ScanScheme, type ScanStep } from '../../types';
2
+ /**
3
+ * Reject incoherent scheme config at write time. Throws with the exact
4
+ * problem — a bad scheme silently misparsing every scan is far worse
5
+ * than a loud upsert failure.
6
+ */
7
+ export declare function assertValidScheme(scheme: Partial<ScanScheme>): void;
8
+ /**
9
+ * Reject incoherent rule steps at write time: a rule that can never
10
+ * execute its verb must fail the upsert, not the factory-floor scan.
11
+ */
12
+ export declare function assertValidSteps(steps: ScanStep[]): void;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertValidScheme = assertValidScheme;
4
+ exports.assertValidSteps = assertValidSteps;
5
+ const types_1 = require("../../types");
6
+ const VALID_VERBS = new Set(Object.values(types_1.SCAN_VERBS));
7
+ /**
8
+ * Reject incoherent scheme config at write time. Throws with the exact
9
+ * problem — a bad scheme silently misparsing every scan is far worse
10
+ * than a loud upsert failure.
11
+ */
12
+ function assertValidScheme(scheme) {
13
+ if (!Number.isInteger(scheme.version) || scheme.version < 10 || scheme.version > 99) {
14
+ throw new Error('scheme version must be a two-digit integer between 10 and 99');
15
+ }
16
+ if (!scheme.name)
17
+ throw new Error('scheme name is required');
18
+ if (!scheme.target_facet)
19
+ throw new Error('scheme target_facet is required');
20
+ const encoding = scheme.encoding ?? types_1.SCAN_ENCODINGS.FIXED;
21
+ if (encoding === types_1.SCAN_ENCODINGS.FIXED) {
22
+ if (!Number.isInteger(scheme.target_length) || scheme.target_length < 1) {
23
+ throw new Error('fixed encoding requires a positive integer target_length');
24
+ }
25
+ }
26
+ if (encoding === types_1.SCAN_ENCODINGS.DELIMITED) {
27
+ const delimiter = scheme.delimiter ?? ':';
28
+ if (delimiter.length !== 1) {
29
+ throw new Error('delimited encoding requires a single-character delimiter');
30
+ }
31
+ if (/[0-9]/.test(delimiter)) {
32
+ throw new Error('delimiter must not be a digit');
33
+ }
34
+ }
35
+ }
36
+ /**
37
+ * Reject incoherent rule steps at write time: a rule that can never
38
+ * execute its verb must fail the upsert, not the factory-floor scan.
39
+ */
40
+ function assertValidSteps(steps) {
41
+ if (!Array.isArray(steps))
42
+ throw new Error('steps must be an array');
43
+ steps.forEach((step, i) => {
44
+ const at = `step ${i + 1}`;
45
+ if (!step || typeof step !== 'object')
46
+ throw new Error(`${at} must be an object`);
47
+ if (!VALID_VERBS.has(step.verb)) {
48
+ throw new Error(`${at}: unknown verb "${step.verb}"`);
49
+ }
50
+ if (step.confirm && !types_1.SCAN_MUTATING_VERBS.includes(step.verb)) {
51
+ throw new Error(`${at}: confirm applies only to mutating verbs`);
52
+ }
53
+ if (step.confirm && !step.confirm.prompt) {
54
+ throw new Error(`${at}: confirm requires a prompt`);
55
+ }
56
+ if (step.verb === types_1.SCAN_VERBS.ESCALATE && !step.params?.targetRole) {
57
+ throw new Error(`${at}: escalate requires params.targetRole`);
58
+ }
59
+ if (step.verb === types_1.SCAN_VERBS.RESOLVE && !step.params?.resolverPayload) {
60
+ throw new Error(`${at}: resolve requires params.resolverPayload`);
61
+ }
62
+ if (step.query && step.query.roles && !Array.isArray(step.query.roles)) {
63
+ throw new Error(`${at}: query.roles must be an array`);
64
+ }
65
+ // Claim and cancel lock via claim-by-metadata, whose SQL filter is the
66
+ // target facet + roles only — extra facet guards would be silently
67
+ // ignored there, so reject them at write time. (Locate, resolve, and
68
+ // escalate steps carry facet guards inside their own atomic filters.)
69
+ const claimLocked = step.verb === types_1.SCAN_VERBS.CLAIM
70
+ || step.verb === types_1.SCAN_VERBS.CLAIM_SHOW_DETAIL
71
+ || step.verb === types_1.SCAN_VERBS.CANCEL
72
+ || (step.verb === types_1.SCAN_VERBS.ESCALATE && step.params?.closeCurrent === 'cancel');
73
+ if (claimLocked && !step.confirm
74
+ && step.query?.facets && Object.keys(step.query.facets).length) {
75
+ throw new Error(`${at}: facet guards are not supported on claim-locked steps (${step.verb})`);
76
+ }
77
+ });
78
+ }
@@ -0,0 +1,26 @@
1
+ import { type ScanScheme, type ScanRule, type ScanStep, type ScanRuleFallback } from '../../types';
2
+ export interface ScanSchemeInput {
3
+ version: number;
4
+ name: string;
5
+ description?: string | null;
6
+ target_facet: string;
7
+ encoding?: ScanScheme['encoding'];
8
+ delimiter?: string;
9
+ target_length?: number | null;
10
+ enabled?: boolean;
11
+ }
12
+ export interface ScanRuleInput {
13
+ scheme_version: number;
14
+ category: string;
15
+ name: string;
16
+ steps: ScanStep[];
17
+ fallback?: ScanRuleFallback;
18
+ enabled?: boolean;
19
+ }
20
+ export declare function upsertScanScheme(input: ScanSchemeInput): Promise<ScanScheme>;
21
+ export declare function deleteScanScheme(version: number): Promise<boolean>;
22
+ export declare function upsertScanRule(input: ScanRuleInput): Promise<ScanRule>;
23
+ export declare function deleteScanRule(schemeVersion: number, category: string): Promise<boolean>;
24
+ /** Insert-if-absent seeding — DB is the source of truth, never overwrite. */
25
+ export declare function seedScanScheme(input: ScanSchemeInput): Promise<boolean>;
26
+ export declare function seedScanRule(input: ScanRuleInput): Promise<boolean>;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.upsertScanScheme = upsertScanScheme;
4
+ exports.deleteScanScheme = deleteScanScheme;
5
+ exports.upsertScanRule = upsertScanRule;
6
+ exports.deleteScanRule = deleteScanRule;
7
+ exports.seedScanScheme = seedScanScheme;
8
+ exports.seedScanRule = seedScanRule;
9
+ const db_1 = require("../../lib/db");
10
+ const types_1 = require("../../types");
11
+ const sql_1 = require("./sql");
12
+ const validate_1 = require("./validate");
13
+ function schemeParams(input) {
14
+ return [
15
+ input.version,
16
+ input.name,
17
+ input.description ?? null,
18
+ input.target_facet,
19
+ input.encoding ?? types_1.SCAN_ENCODINGS.FIXED,
20
+ input.delimiter ?? ':',
21
+ input.target_length ?? null,
22
+ input.enabled ?? true,
23
+ ];
24
+ }
25
+ function ruleParams(input) {
26
+ return [
27
+ input.scheme_version,
28
+ input.category,
29
+ input.name,
30
+ JSON.stringify(input.steps),
31
+ JSON.stringify(input.fallback ?? {}),
32
+ input.enabled ?? true,
33
+ ];
34
+ }
35
+ async function upsertScanScheme(input) {
36
+ (0, validate_1.assertValidScheme)(input);
37
+ const { rows } = await (0, db_1.getPool)().query(sql_1.UPSERT_SCHEME, schemeParams(input));
38
+ return rows[0];
39
+ }
40
+ async function deleteScanScheme(version) {
41
+ const { rowCount } = await (0, db_1.getPool)().query(sql_1.DELETE_SCHEME, [version]);
42
+ return (rowCount ?? 0) > 0;
43
+ }
44
+ async function upsertScanRule(input) {
45
+ if (!/^[0-9]$/.test(input.category)) {
46
+ throw new Error('category must be a single digit (0-9)');
47
+ }
48
+ if (!input.name)
49
+ throw new Error('rule name is required');
50
+ (0, validate_1.assertValidSteps)(input.steps);
51
+ if (input.steps.length === 0 && !input.fallback?.markdown && !input.fallback?.route) {
52
+ throw new Error('a rule needs at least one step or a fallback');
53
+ }
54
+ const { rows } = await (0, db_1.getPool)().query(sql_1.UPSERT_ACTION, ruleParams(input));
55
+ return rows[0];
56
+ }
57
+ async function deleteScanRule(schemeVersion, category) {
58
+ const { rowCount } = await (0, db_1.getPool)().query(sql_1.DELETE_ACTION, [schemeVersion, category]);
59
+ return (rowCount ?? 0) > 0;
60
+ }
61
+ /** Insert-if-absent seeding — DB is the source of truth, never overwrite. */
62
+ async function seedScanScheme(input) {
63
+ (0, validate_1.assertValidScheme)(input);
64
+ const { rowCount } = await (0, db_1.getPool)().query(sql_1.SEED_SCHEME, schemeParams(input));
65
+ return (rowCount ?? 0) > 0;
66
+ }
67
+ async function seedScanRule(input) {
68
+ (0, validate_1.assertValidSteps)(input.steps);
69
+ const { rowCount } = await (0, db_1.getPool)().query(sql_1.SEED_ACTION, ruleParams(input));
70
+ return (rowCount ?? 0) > 0;
71
+ }
@@ -7,6 +7,11 @@
7
7
  export * from './derive-field-label';
8
8
  export * from './x-lt-bind';
9
9
  export * from './x-lt-help';
10
+ export * from './x-lt-transition';
11
+ export * from './x-lt-submit-on-claim';
12
+ export * from './x-lt-labels';
13
+ export * from './x-lt-query';
14
+ export * from './x-lt-submit-guard';
10
15
  export * from './x-lt-show-if';
11
16
  export * from './field-validator';
12
17
  export * from './validate-resolver-payload';
@@ -23,6 +23,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
23
23
  __exportStar(require("./derive-field-label"), exports);
24
24
  __exportStar(require("./x-lt-bind"), exports);
25
25
  __exportStar(require("./x-lt-help"), exports);
26
+ __exportStar(require("./x-lt-transition"), exports);
27
+ __exportStar(require("./x-lt-submit-on-claim"), exports);
28
+ __exportStar(require("./x-lt-labels"), exports);
29
+ __exportStar(require("./x-lt-query"), exports);
30
+ __exportStar(require("./x-lt-submit-guard"), exports);
26
31
  __exportStar(require("./x-lt-show-if"), exports);
27
32
  __exportStar(require("./field-validator"), exports);
28
33
  __exportStar(require("./validate-resolver-payload"), exports);
@@ -0,0 +1,28 @@
1
+ /**
2
+ * x-lt-labels — configurable copy for the standard escalation footer. A
3
+ * form_schema may declare, at its schema root, an object that renames the
4
+ * footer's action controls. Each key is a standard target; its value is the
5
+ * label to render in place of the default.
6
+ *
7
+ * x-lt-labels object — { claim, cancel, submit, escalate, release }
8
+ *
9
+ * ```jsonc
10
+ * { "x-lt-labels": { "claim": "Claim and Submit", "submit": "Approve" } }
11
+ * ```
12
+ *
13
+ * Only the five known targets are read; unknown keys and non-string values are
14
+ * ignored. Any target the schema omits keeps its default label, so a schema
15
+ * overrides just the controls it cares about.
16
+ */
17
+ export declare const X_LT_LABELS = "x-lt-labels";
18
+ /** The footer controls a schema may rename. */
19
+ export declare const FOOTER_LABEL_TARGETS: readonly ["claim", "cancel", "submit", "escalate", "release"];
20
+ export type FooterLabelTarget = (typeof FOOTER_LABEL_TARGETS)[number];
21
+ /** A partial map of target → override label. Absent targets keep their default. */
22
+ export type FooterLabels = Partial<Record<FooterLabelTarget, string>>;
23
+ /**
24
+ * The schema's footer label overrides, or an empty map when none are declared.
25
+ * Reads only the known targets; a non-object `x-lt-labels`, unknown keys, and
26
+ * blank or non-string values are dropped.
27
+ */
28
+ export declare function readFooterLabels(schema: Record<string, unknown> | null | undefined): FooterLabels;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * x-lt-labels — configurable copy for the standard escalation footer. A
4
+ * form_schema may declare, at its schema root, an object that renames the
5
+ * footer's action controls. Each key is a standard target; its value is the
6
+ * label to render in place of the default.
7
+ *
8
+ * x-lt-labels object — { claim, cancel, submit, escalate, release }
9
+ *
10
+ * ```jsonc
11
+ * { "x-lt-labels": { "claim": "Claim and Submit", "submit": "Approve" } }
12
+ * ```
13
+ *
14
+ * Only the five known targets are read; unknown keys and non-string values are
15
+ * ignored. Any target the schema omits keeps its default label, so a schema
16
+ * overrides just the controls it cares about.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.FOOTER_LABEL_TARGETS = exports.X_LT_LABELS = void 0;
20
+ exports.readFooterLabels = readFooterLabels;
21
+ exports.X_LT_LABELS = 'x-lt-labels';
22
+ /** The footer controls a schema may rename. */
23
+ exports.FOOTER_LABEL_TARGETS = ['claim', 'cancel', 'submit', 'escalate', 'release'];
24
+ /**
25
+ * The schema's footer label overrides, or an empty map when none are declared.
26
+ * Reads only the known targets; a non-object `x-lt-labels`, unknown keys, and
27
+ * blank or non-string values are dropped.
28
+ */
29
+ function readFooterLabels(schema) {
30
+ const raw = schema?.[exports.X_LT_LABELS];
31
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
32
+ return {};
33
+ const source = raw;
34
+ const labels = {};
35
+ for (const target of exports.FOOTER_LABEL_TARGETS) {
36
+ const value = source[target];
37
+ if (typeof value === 'string' && value.trim().length > 0) {
38
+ labels[target] = value.trim();
39
+ }
40
+ }
41
+ return labels;
42
+ }
@@ -0,0 +1,56 @@
1
+ import type { ShowIfContext } from './x-lt-show-if';
2
+ /**
3
+ * The embedded escalation query shape shared by `x-lt-query` (escalation-list
4
+ * widget) and `x-lt-submit-guard.query` (form-level submit gate). String
5
+ * values inside `facets` support `{{domain.path}}` token interpolation against
6
+ * the host escalation's context. Isomorphic: the dashboard renders embeds from
7
+ * it, and the API layer enforces the submit gate from the identical mapping.
8
+ *
9
+ * `assigned` is the ownership scope. Ownership is not a separate list — it is
10
+ * one more dimension of the same faceted query language the escalation API
11
+ * composes server-side ("claimed" is the implied status: pending, held, claim
12
+ * window live):
13
+ * - `"me"` — rows claimed by the viewing user (the walk case: I walk what I own)
14
+ * - `"any"` — all matching rows regardless of claim state
15
+ * - omitted — available rows only (unclaimed, or claim window lapsed)
16
+ */
17
+ export interface EmbedQuery {
18
+ role?: string;
19
+ status?: string;
20
+ facets?: Record<string, string>;
21
+ limit?: number;
22
+ assigned?: 'me' | 'any';
23
+ /** Superseded by `assigned`; honored only when `assigned` is omitted. */
24
+ available?: boolean;
25
+ }
26
+ /** Interpolate `{{domain.path}}` tokens in every string value of the facets map. */
27
+ export declare function resolveQueryFacets(facets: Record<string, string> | undefined, ctx: ShowIfContext): Record<string, unknown>;
28
+ /** The escalation-query params an EmbedQuery resolves to — the exact input
29
+ * shape of `useEscalations`, so every embed surface queries identically. */
30
+ export interface ScopedQueryParams {
31
+ role?: string;
32
+ status: string;
33
+ facets: Record<string, unknown>;
34
+ assigned_to?: string;
35
+ available?: boolean;
36
+ limit?: number;
37
+ enabled: boolean;
38
+ }
39
+ /**
40
+ * Resolve an EmbedQuery into concrete escalation-query params — the ONE
41
+ * mapping every embed surface (escalation-list, x-lt-actions, x-lt-submit-guard)
42
+ * consumes, so the visible rows and any count derived from the same query can
43
+ * never disagree.
44
+ *
45
+ * Ownership scope translates into the faceted query language:
46
+ * - `assigned: "me"` → `assigned_to = viewer AND available = false` — the
47
+ * implied "claimed" status (pending + live claim window held by the viewer)
48
+ * - `assigned: "any"` → no ownership constraint
49
+ * - omitted → `available = true` (the unclaimed pool; a declared
50
+ * legacy `available` value is honored)
51
+ *
52
+ * When `assigned: "me"` and no viewer id is supplied (a surface with no
53
+ * resolving user, e.g. an MCP resolve), the scope cannot be evaluated —
54
+ * `enabled` is false rather than silently widening to another scope.
55
+ */
56
+ export declare function resolveScopedQuery(query: EmbedQuery, ctx: ShowIfContext, viewerId: string | undefined): ScopedQueryParams;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveQueryFacets = resolveQueryFacets;
4
+ exports.resolveScopedQuery = resolveScopedQuery;
5
+ const x_lt_help_1 = require("./x-lt-help");
6
+ /** Interpolate `{{domain.path}}` tokens in every string value of the facets map. */
7
+ function resolveQueryFacets(facets, ctx) {
8
+ if (!facets)
9
+ return {};
10
+ const resolved = {};
11
+ for (const [k, v] of Object.entries(facets)) {
12
+ resolved[k] = typeof v === 'string' ? (0, x_lt_help_1.interpolateHelp)(v, ctx) : v;
13
+ }
14
+ return resolved;
15
+ }
16
+ /**
17
+ * Resolve an EmbedQuery into concrete escalation-query params — the ONE
18
+ * mapping every embed surface (escalation-list, x-lt-actions, x-lt-submit-guard)
19
+ * consumes, so the visible rows and any count derived from the same query can
20
+ * never disagree.
21
+ *
22
+ * Ownership scope translates into the faceted query language:
23
+ * - `assigned: "me"` → `assigned_to = viewer AND available = false` — the
24
+ * implied "claimed" status (pending + live claim window held by the viewer)
25
+ * - `assigned: "any"` → no ownership constraint
26
+ * - omitted → `available = true` (the unclaimed pool; a declared
27
+ * legacy `available` value is honored)
28
+ *
29
+ * When `assigned: "me"` and no viewer id is supplied (a surface with no
30
+ * resolving user, e.g. an MCP resolve), the scope cannot be evaluated —
31
+ * `enabled` is false rather than silently widening to another scope.
32
+ */
33
+ function resolveScopedQuery(query, ctx, viewerId) {
34
+ const facets = resolveQueryFacets(query.facets, ctx);
35
+ const base = {
36
+ role: query.role,
37
+ status: query.status ?? 'pending',
38
+ facets,
39
+ limit: query.limit,
40
+ enabled: !!(query.role || Object.keys(facets).length),
41
+ };
42
+ if (query.assigned === 'me') {
43
+ return { ...base, assigned_to: viewerId, available: false, enabled: base.enabled && !!viewerId };
44
+ }
45
+ if (query.assigned === 'any') {
46
+ return base;
47
+ }
48
+ return { ...base, available: query.available ?? true };
49
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * x-lt-submit-guard — a query precondition on the resolve. A form_schema may
3
+ * declare, at its root, that the escalation cannot be resolved while an embedded
4
+ * escalation query still returns rows: the parent references a set of children
5
+ * (commonly claimed by the same person) that must all be completed first, a
6
+ * to-do list that empties as children resolve.
7
+ *
8
+ * "x-lt-submit-guard": {
9
+ * "query": { "role": "print-harvest", "status": "pending",
10
+ * "assigned": "me",
11
+ * "facets": { "walkId": "{{metadata.walkId}}" } },
12
+ * "mustBeEmpty": true, // the only mode today; defaults true
13
+ * "message": "{{count}} plates still pending — bag them before closing.",
14
+ * "autoResolveWhenEmpty": true // auto-submit the parent once empty
15
+ * }
16
+ *
17
+ * The gate is isomorphic. The dashboard disables the submit while the query
18
+ * returns rows (UI honesty), and the API layer enforces the same precondition
19
+ * for `enforce_schema` roles so a raw-API resolve is rejected too. Only a
20
+ * confirmed empty result (a successful read with zero rows) clears the gate — a
21
+ * 403 or any error never does.
22
+ *
23
+ * `autoResolveWhenEmpty` closes the loop: the moment the query is confirmed
24
+ * empty, the claimed parent auto-submits — checked on page-load and after each
25
+ * inline child-resolve — so a set of escalations completes with no extra click.
26
+ */
27
+ import type { EmbedQuery } from './x-lt-query';
28
+ export declare const X_LT_SUBMIT_GUARD = "x-lt-submit-guard";
29
+ export interface SubmitGuardDef {
30
+ query: EmbedQuery;
31
+ /** The gate condition; defaults to true (the only supported mode today). */
32
+ mustBeEmpty?: boolean;
33
+ /** Shown beside the disabled submit. `{{count}}` and `{{domain.path}}` tokens interpolate. */
34
+ message?: string;
35
+ /** When true, auto-submit the claimed parent the moment the query is confirmed empty. */
36
+ autoResolveWhenEmpty?: boolean;
37
+ }
38
+ export declare const SUBMIT_GUARD_DEFAULT_MESSAGE = "{{count}} related items are still pending";
39
+ /** The schema's submit-guard, or undefined when it declares none. */
40
+ export declare function readSubmitGuard(schema: Record<string, unknown> | null | undefined): SubmitGuardDef | undefined;
41
+ /**
42
+ * Whether a guard blocks the resolve given the query's row count. `mustBeEmpty`
43
+ * defaults to true, so any matching row blocks. A pure decision — the caller
44
+ * supplies the count from a confirmed read (never an error/loading state).
45
+ */
46
+ export declare function guardBlocks(count: number, guard: SubmitGuardDef | undefined): boolean;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SUBMIT_GUARD_DEFAULT_MESSAGE = exports.X_LT_SUBMIT_GUARD = void 0;
4
+ exports.readSubmitGuard = readSubmitGuard;
5
+ exports.guardBlocks = guardBlocks;
6
+ exports.X_LT_SUBMIT_GUARD = 'x-lt-submit-guard';
7
+ exports.SUBMIT_GUARD_DEFAULT_MESSAGE = '{{count}} related items are still pending';
8
+ /** The schema's submit-guard, or undefined when it declares none. */
9
+ function readSubmitGuard(schema) {
10
+ const raw = schema?.[exports.X_LT_SUBMIT_GUARD];
11
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
12
+ return undefined;
13
+ const guard = raw;
14
+ if (!guard.query || typeof guard.query !== 'object')
15
+ return undefined;
16
+ return guard;
17
+ }
18
+ /**
19
+ * Whether a guard blocks the resolve given the query's row count. `mustBeEmpty`
20
+ * defaults to true, so any matching row blocks. A pure decision — the caller
21
+ * supplies the count from a confirmed read (never an error/loading state).
22
+ */
23
+ function guardBlocks(count, guard) {
24
+ return !!guard && guard.mustBeEmpty !== false && count > 0;
25
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * x-lt-submit-on-claim — a one-gesture claim. A form_schema may declare, at its
3
+ * schema root, that claiming one of its escalations should also resolve it in
4
+ * the same gesture, submitting whatever the form currently holds (its seeded
5
+ * defaults). The person clicks Claim once and the work item advances — no
6
+ * second Submit step.
7
+ *
8
+ * x-lt-submit-on-claim boolean — opt in to claim-and-submit
9
+ *
10
+ * It is opt-in and defaults off. Pair it with `x-lt-labels` to rename the Claim
11
+ * button ("Claim and Submit") so the single gesture reads honestly. When the
12
+ * seeded defaults fail validation the claim still lands; the page drops into the
13
+ * normal claimed state with the field errors surfaced, so the person finishes
14
+ * the form by hand.
15
+ */
16
+ export declare const X_LT_SUBMIT_ON_CLAIM = "x-lt-submit-on-claim";
17
+ /**
18
+ * Whether the schema opts into claim-and-submit. Truthy `x-lt-submit-on-claim`
19
+ * turns it on; anything else (absent, false) leaves the standard two-step claim
20
+ * then submit.
21
+ */
22
+ export declare function readSubmitOnClaim(schema: Record<string, unknown> | null | undefined): boolean;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * x-lt-submit-on-claim — a one-gesture claim. A form_schema may declare, at its
4
+ * schema root, that claiming one of its escalations should also resolve it in
5
+ * the same gesture, submitting whatever the form currently holds (its seeded
6
+ * defaults). The person clicks Claim once and the work item advances — no
7
+ * second Submit step.
8
+ *
9
+ * x-lt-submit-on-claim boolean — opt in to claim-and-submit
10
+ *
11
+ * It is opt-in and defaults off. Pair it with `x-lt-labels` to rename the Claim
12
+ * button ("Claim and Submit") so the single gesture reads honestly. When the
13
+ * seeded defaults fail validation the claim still lands; the page drops into the
14
+ * normal claimed state with the field errors surfaced, so the person finishes
15
+ * the form by hand.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.X_LT_SUBMIT_ON_CLAIM = void 0;
19
+ exports.readSubmitOnClaim = readSubmitOnClaim;
20
+ exports.X_LT_SUBMIT_ON_CLAIM = 'x-lt-submit-on-claim';
21
+ /**
22
+ * Whether the schema opts into claim-and-submit. Truthy `x-lt-submit-on-claim`
23
+ * turns it on; anything else (absent, false) leaves the standard two-step claim
24
+ * then submit.
25
+ */
26
+ function readSubmitOnClaim(schema) {
27
+ return !!schema?.[exports.X_LT_SUBMIT_ON_CLAIM];
28
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * x-lt-transition — post-submit hand-off UX. A form_schema may declare, at its
3
+ * schema root, that submitting one of its escalations should pause on a wait
4
+ * screen instead of returning to the previous page — because a follow-on
5
+ * escalation is about to be born assigned to the submitter (a chained hand-off).
6
+ *
7
+ * x-lt-transition boolean — opt in to the wait screen
8
+ * x-lt-transition-message markdown — shown on the wait screen
9
+ * x-lt-transition-max-wait-seconds number — how long to wait for the
10
+ * follow-on before running the fallback
11
+ * query (clamped to a sane range)
12
+ *
13
+ * These tokens control ONLY the UX. Navigation to the follow-on is driven by the
14
+ * engine's born-assigned `claimed` event (assigned_to + parent_id +
15
+ * assigned_at_creation); the schema carries no navigation target and no metadata
16
+ * is used.
17
+ */
18
+ export declare const X_LT_TRANSITION = "x-lt-transition";
19
+ export declare const X_LT_TRANSITION_MESSAGE = "x-lt-transition-message";
20
+ export declare const X_LT_TRANSITION_MAX_WAIT_SECONDS = "x-lt-transition-max-wait-seconds";
21
+ export declare const X_LT_TRANSITION_DONE = "x-lt-transition-done";
22
+ export interface TransitionConfig {
23
+ /** Markdown shown on the wait screen. */
24
+ message: string;
25
+ /** Seconds to wait for the follow-on before the fallback query runs. */
26
+ maxWaitSeconds: number;
27
+ }
28
+ /**
29
+ * The schema's transition config, or null when the schema does not opt in.
30
+ * `x-lt-transition` must be truthy; message and max-wait fall back to defaults.
31
+ */
32
+ export declare function readTransitionConfig(schema: Record<string, unknown> | null | undefined): TransitionConfig | null;
33
+ /**
34
+ * Where to go when this step ends without a further hand-off — the terminal
35
+ * step of a chain (submitting it), or a transition step whose follow-on never
36
+ * arrives (the wait times out). Independent of `x-lt-transition`, so a terminal
37
+ * form can declare it without opting into the wait screen.
38
+ *
39
+ * The value is an href template using the same `{{domain.path}}` syntax and
40
+ * routing conventions as `x-lt-href` (see LinkWidget): an internal path
41
+ * (`/escalations/available?role=…`) navigates in-app; anything else opens
42
+ * externally. A page reached via a forward transition can't rely on
43
+ * `history.back()`, so this states the destination explicitly. Returns the raw
44
+ * template (interpolate it against the escalation context before navigating),
45
+ * or null when absent.
46
+ */
47
+ export declare function readTransitionDone(schema: Record<string, unknown> | null | undefined): string | null;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * x-lt-transition — post-submit hand-off UX. A form_schema may declare, at its
4
+ * schema root, that submitting one of its escalations should pause on a wait
5
+ * screen instead of returning to the previous page — because a follow-on
6
+ * escalation is about to be born assigned to the submitter (a chained hand-off).
7
+ *
8
+ * x-lt-transition boolean — opt in to the wait screen
9
+ * x-lt-transition-message markdown — shown on the wait screen
10
+ * x-lt-transition-max-wait-seconds number — how long to wait for the
11
+ * follow-on before running the fallback
12
+ * query (clamped to a sane range)
13
+ *
14
+ * These tokens control ONLY the UX. Navigation to the follow-on is driven by the
15
+ * engine's born-assigned `claimed` event (assigned_to + parent_id +
16
+ * assigned_at_creation); the schema carries no navigation target and no metadata
17
+ * is used.
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.X_LT_TRANSITION_DONE = exports.X_LT_TRANSITION_MAX_WAIT_SECONDS = exports.X_LT_TRANSITION_MESSAGE = exports.X_LT_TRANSITION = void 0;
21
+ exports.readTransitionConfig = readTransitionConfig;
22
+ exports.readTransitionDone = readTransitionDone;
23
+ exports.X_LT_TRANSITION = 'x-lt-transition';
24
+ exports.X_LT_TRANSITION_MESSAGE = 'x-lt-transition-message';
25
+ exports.X_LT_TRANSITION_MAX_WAIT_SECONDS = 'x-lt-transition-max-wait-seconds';
26
+ exports.X_LT_TRANSITION_DONE = 'x-lt-transition-done';
27
+ const DEFAULT_MESSAGE = 'Submitted. Preparing your next step…';
28
+ const DEFAULT_MAX_WAIT_SECONDS = 30;
29
+ const MIN_MAX_WAIT_SECONDS = 5;
30
+ const MAX_MAX_WAIT_SECONDS = 300;
31
+ function clampWaitSeconds(value) {
32
+ const n = typeof value === 'number' ? value : Number(value);
33
+ if (!Number.isFinite(n) || n <= 0)
34
+ return DEFAULT_MAX_WAIT_SECONDS;
35
+ return Math.min(MAX_MAX_WAIT_SECONDS, Math.max(MIN_MAX_WAIT_SECONDS, Math.round(n)));
36
+ }
37
+ /**
38
+ * The schema's transition config, or null when the schema does not opt in.
39
+ * `x-lt-transition` must be truthy; message and max-wait fall back to defaults.
40
+ */
41
+ function readTransitionConfig(schema) {
42
+ if (!schema || !schema[exports.X_LT_TRANSITION])
43
+ return null;
44
+ const rawMessage = schema[exports.X_LT_TRANSITION_MESSAGE];
45
+ const message = typeof rawMessage === 'string' && rawMessage.trim().length > 0 ? rawMessage : DEFAULT_MESSAGE;
46
+ return { message, maxWaitSeconds: clampWaitSeconds(schema[exports.X_LT_TRANSITION_MAX_WAIT_SECONDS]) };
47
+ }
48
+ /**
49
+ * Where to go when this step ends without a further hand-off — the terminal
50
+ * step of a chain (submitting it), or a transition step whose follow-on never
51
+ * arrives (the wait times out). Independent of `x-lt-transition`, so a terminal
52
+ * form can declare it without opting into the wait screen.
53
+ *
54
+ * The value is an href template using the same `{{domain.path}}` syntax and
55
+ * routing conventions as `x-lt-href` (see LinkWidget): an internal path
56
+ * (`/escalations/available?role=…`) navigates in-app; anything else opens
57
+ * externally. A page reached via a forward transition can't rely on
58
+ * `history.back()`, so this states the destination explicitly. Returns the raw
59
+ * template (interpolate it against the escalation context before navigating),
60
+ * or null when absent.
61
+ */
62
+ function readTransitionDone(schema) {
63
+ const raw = schema?.[exports.X_LT_TRANSITION_DONE];
64
+ return typeof raw === 'string' && raw.trim().length > 0 ? raw : null;
65
+ }
@@ -21,6 +21,7 @@
21
21
  * topics.ts — routes/topics.ts
22
22
  * settings.ts — routes/settings.ts
23
23
  * exports.ts — routes/exports.ts
24
+ * scan-codes.ts — routes/scan-codes.ts
24
25
  *
25
26
  * This server replaces three previously separate servers:
26
27
  * - long-tail-db-query (read-only task/escalation/health queries)