@hotmeshio/long-tail 0.19.1 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/README.md +4 -4
  2. package/build/api/escalations/accumulate.d.ts +96 -0
  3. package/build/api/escalations/accumulate.js +516 -0
  4. package/build/api/escalations/index.d.ts +1 -0
  5. package/build/api/escalations/index.js +10 -1
  6. package/build/api/roles.d.ts +4 -5
  7. package/build/api/roles.js +53 -4
  8. package/build/api/scan-codes/execute.js +2 -0
  9. package/build/api/scan-codes/verbs.d.ts +15 -0
  10. package/build/api/scan-codes/verbs.js +65 -0
  11. package/build/api/workflows/config.d.ts +3 -0
  12. package/build/api/workflows/config.js +15 -0
  13. package/build/api/workflows/index.d.ts +1 -0
  14. package/build/api/workflows/index.js +3 -1
  15. package/build/api/workflows/input-lookups.d.ts +16 -0
  16. package/build/api/workflows/input-lookups.js +69 -0
  17. package/build/api/workflows/input-validation.d.ts +4 -3
  18. package/build/api/workflows/input-validation.js +7 -4
  19. package/build/api/workflows/invocable.js +1 -0
  20. package/build/api/workflows/invocation.js +1 -1
  21. package/build/index.js +60 -0
  22. package/build/lib/db/schemas/035_workflow_input_lookups.sql +9 -0
  23. package/build/lib/db/schemas/036_role_portals.sql +12 -0
  24. package/build/routes/escalations/accumulate.d.ts +7 -0
  25. package/build/routes/escalations/accumulate.js +150 -0
  26. package/build/routes/escalations/index.js +5 -0
  27. package/build/routes/workflows/config.js +10 -0
  28. package/build/sdk/index.d.ts +25 -0
  29. package/build/sdk/index.js +8 -0
  30. package/build/services/config/cache.js +1 -0
  31. package/build/services/config/read.js +2 -0
  32. package/build/services/config/sql.d.ts +2 -2
  33. package/build/services/config/sql.js +6 -5
  34. package/build/services/config/write.js +10 -1
  35. package/build/services/escalation/accumulate.d.ts +81 -0
  36. package/build/services/escalation/accumulate.js +154 -0
  37. package/build/services/escalation/index.d.ts +1 -0
  38. package/build/services/escalation/index.js +1 -0
  39. package/build/services/knowledge/index.d.ts +1 -0
  40. package/build/services/knowledge/index.js +1 -0
  41. package/build/services/knowledge/lookup-refs.d.ts +7 -0
  42. package/build/services/knowledge/lookup-refs.js +26 -0
  43. package/build/services/mcp/db-server/schemas.d.ts +2 -2
  44. package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
  45. package/build/services/orchestrator/condition.d.ts +40 -3
  46. package/build/services/orchestrator/condition.js +42 -2
  47. package/build/services/role/index.js +1 -0
  48. package/build/services/role/seed.js +6 -1
  49. package/build/services/role/sql.d.ts +6 -3
  50. package/build/services/role/sql.js +7 -2
  51. package/build/services/role/types.d.ts +38 -10
  52. package/build/services/role/types.js +10 -1
  53. package/build/services/scan-code/validate.js +16 -0
  54. package/build/shared/form-validation/display-only-widgets.d.ts +16 -0
  55. package/build/shared/form-validation/display-only-widgets.js +25 -0
  56. package/build/shared/form-validation/field-validator.d.ts +1 -0
  57. package/build/shared/form-validation/field-validator.js +94 -6
  58. package/build/shared/form-validation/index.d.ts +2 -0
  59. package/build/shared/form-validation/index.js +2 -0
  60. package/build/shared/form-validation/invoke-context.d.ts +4 -3
  61. package/build/shared/form-validation/invoke-context.js +5 -4
  62. package/build/shared/form-validation/x-lt-bind.d.ts +2 -14
  63. package/build/shared/form-validation/x-lt-bind.js +12 -8
  64. package/build/shared/form-validation/x-lt-invoke.d.ts +38 -0
  65. package/build/shared/form-validation/x-lt-invoke.js +103 -0
  66. package/build/shared/form-validation/x-lt-options.d.ts +3 -3
  67. package/build/shared/form-validation/x-lt-options.js +19 -5
  68. package/build/shared/form-validation/x-lt-show-if.d.ts +5 -0
  69. package/build/shared/form-validation/x-lt-show-if.js +10 -0
  70. package/build/start/workers.js +10 -0
  71. package/build/system/mcp-servers/admin/escalations.js +39 -0
  72. package/build/system/mcp-servers/admin/schemas.d.ts +256 -33
  73. package/build/system/mcp-servers/admin/schemas.js +55 -3
  74. package/build/system/mcp-servers/admin/users.js +1 -0
  75. package/build/system/mcp-servers/admin/workflow-config.js +54 -9
  76. package/build/system/mcp-servers/admin/workflows.js +9 -7
  77. package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
  78. package/build/system/mcp-servers/docs.js +4 -0
  79. package/build/system/mcp-servers/human-queue-schemas.d.ts +85 -0
  80. package/build/system/mcp-servers/human-queue-schemas.js +19 -1
  81. package/build/system/mcp-servers/human-queue.d.ts +2 -0
  82. package/build/system/mcp-servers/human-queue.js +77 -0
  83. package/build/system/seed/tool-manifests-admin.d.ts +1509 -227
  84. package/build/system/seed/tool-manifests-admin.js +8 -4
  85. package/build/system/seed/tool-manifests-escalation.d.ts +174 -0
  86. package/build/system/seed/tool-manifests-escalation.js +56 -0
  87. package/build/tsconfig.tsbuildinfo +1 -1
  88. package/build/types/config.d.ts +4 -0
  89. package/build/types/escalation.d.ts +52 -0
  90. package/build/types/escalation.js +29 -1
  91. package/build/types/index.d.ts +2 -2
  92. package/build/types/index.js +3 -1
  93. package/build/types/scan-code.d.ts +24 -0
  94. package/build/types/scan-code.js +9 -0
  95. package/build/types/startup.d.ts +26 -0
  96. package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js → AdminDashboard-uarpHB88.js} +2 -2
  97. package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js.map → AdminDashboard-uarpHB88.js.map} +1 -1
  98. package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js → AgentConfigPage-BcUaDD5E.js} +6 -6
  99. package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js.map → AgentConfigPage-BcUaDD5E.js.map} +1 -1
  100. package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js → AgentDetailPage-BaZBhK6i.js} +3 -3
  101. package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js.map → AgentDetailPage-BaZBhK6i.js.map} +1 -1
  102. package/dashboard/dist/assets/AgentsPage-CuVFSDc4.js +2 -0
  103. package/dashboard/dist/assets/{AgentsPage-D77JeViQ.js.map → AgentsPage-CuVFSDc4.js.map} +1 -1
  104. package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js +2 -0
  105. package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js.map +1 -0
  106. package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js → BotPicker-CClMby6B.js} +2 -2
  107. package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js.map → BotPicker-CClMby6B.js.map} +1 -1
  108. package/dashboard/dist/assets/BulkAssignModal-BL8FRgkN.js +2 -0
  109. package/dashboard/dist/assets/{BulkAssignModal-BXiJnlqt.js.map → BulkAssignModal-BL8FRgkN.js.map} +1 -1
  110. package/dashboard/dist/assets/CapabilitiesPage-D53ogPor.js +2 -0
  111. package/dashboard/dist/assets/{CapabilitiesPage-D9TC2iKy.js.map → CapabilitiesPage-D53ogPor.js.map} +1 -1
  112. package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js → CollapsibleSection-ow8jpbtD.js} +2 -2
  113. package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js.map → CollapsibleSection-ow8jpbtD.js.map} +1 -1
  114. package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js → ConfirmDeleteModal-CeEDt9iJ.js} +2 -2
  115. package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js.map → ConfirmDeleteModal-CeEDt9iJ.js.map} +1 -1
  116. package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js → CountdownTimer-CSqyZMCG.js} +2 -2
  117. package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js.map → CountdownTimer-CSqyZMCG.js.map} +1 -1
  118. package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js → CredentialsPage-Dx7SxA23.js} +2 -2
  119. package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js.map → CredentialsPage-Dx7SxA23.js.map} +1 -1
  120. package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js → CronLabel-LYPxpvNN.js} +2 -2
  121. package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js.map → CronLabel-LYPxpvNN.js.map} +1 -1
  122. package/dashboard/dist/assets/DataTable-spX1dFyb.js +2 -0
  123. package/dashboard/dist/assets/DataTable-spX1dFyb.js.map +1 -0
  124. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js → DropZone-f1o-GLM8.js} +2 -2
  125. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js.map → DropZone-f1o-GLM8.js.map} +1 -1
  126. package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js → ElapsedCell-BZJTSm9N.js} +2 -2
  127. package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js.map → ElapsedCell-BZJTSm9N.js.map} +1 -1
  128. package/dashboard/dist/assets/EntityTimelinePanel-0wIIW2en.js +2 -0
  129. package/dashboard/dist/assets/{EntityTimelinePanel-1lT3jkCM.js.map → EntityTimelinePanel-0wIIW2en.js.map} +1 -1
  130. package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js → EscalationListSchemaPage-CoYvtMzj.js} +3 -3
  131. package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js.map → EscalationListSchemaPage-CoYvtMzj.js.map} +1 -1
  132. package/dashboard/dist/assets/EscalationListView-DWFHPufv.js +2 -0
  133. package/dashboard/dist/assets/EscalationListView-DWFHPufv.js.map +1 -0
  134. package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js → EscalationSchemaPage-C9Xu_A25.js} +3 -3
  135. package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js.map → EscalationSchemaPage-C9Xu_A25.js.map} +1 -1
  136. package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js +2 -0
  137. package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js.map +1 -0
  138. package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js +2 -0
  139. package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js.map +1 -0
  140. package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js → EscalationsOverview-CW57FaP9.js} +2 -2
  141. package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js.map → EscalationsOverview-CW57FaP9.js.map} +1 -1
  142. package/dashboard/dist/assets/{EventTable-KEC3YWBf.js → EventTable-D1ctWhKf.js} +2 -2
  143. package/dashboard/dist/assets/{EventTable-KEC3YWBf.js.map → EventTable-D1ctWhKf.js.map} +1 -1
  144. package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js → FilterBar-C-iur-Nj.js} +2 -2
  145. package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js.map → FilterBar-C-iur-Nj.js.map} +1 -1
  146. package/dashboard/dist/assets/GraphInvokePage-CcA_44M4.js +2 -0
  147. package/dashboard/dist/assets/{GraphInvokePage-DV7Y0fe2.js.map → GraphInvokePage-CcA_44M4.js.map} +1 -1
  148. package/dashboard/dist/assets/HomePage-Dc085ghJ.js +2 -0
  149. package/dashboard/dist/assets/{HomePage-G785SWcW.js.map → HomePage-Dc085ghJ.js.map} +1 -1
  150. package/dashboard/dist/assets/ListToolbar-h_ziBt4O.js +2 -0
  151. package/dashboard/dist/assets/{ListToolbar-zPVYPg3W.js.map → ListToolbar-h_ziBt4O.js.map} +1 -1
  152. package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js → McpOverview-qXXhbNWV.js} +2 -2
  153. package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js.map → McpOverview-qXXhbNWV.js.map} +1 -1
  154. package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js → McpQueryDetailPage-SEzSbZrd.js} +2 -2
  155. package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js.map → McpQueryDetailPage-SEzSbZrd.js.map} +1 -1
  156. package/dashboard/dist/assets/McpQueryPage-Cy0V0kv9.js +2 -0
  157. package/dashboard/dist/assets/{McpQueryPage-CNSNMagY.js.map → McpQueryPage-Cy0V0kv9.js.map} +1 -1
  158. package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js → McpRunDetailPage-DjJO5vSb.js} +2 -2
  159. package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js.map → McpRunDetailPage-DjJO5vSb.js.map} +1 -1
  160. package/dashboard/dist/assets/McpRunsPage-BfjiJ8mM.js +2 -0
  161. package/dashboard/dist/assets/{McpRunsPage-B6rb5QBf.js.map → McpRunsPage-BfjiJ8mM.js.map} +1 -1
  162. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js → NamespacePill-DADRJOUl.js} +2 -2
  163. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js.map → NamespacePill-DADRJOUl.js.map} +1 -1
  164. package/dashboard/dist/assets/OperationsPage-dJcER0T_.js +3 -0
  165. package/dashboard/dist/assets/OperationsPage-dJcER0T_.js.map +1 -0
  166. package/dashboard/dist/assets/OperatorDashboard-zCkW4eqk.js +2 -0
  167. package/dashboard/dist/assets/{OperatorDashboard-DBOscDnf.js.map → OperatorDashboard-zCkW4eqk.js.map} +1 -1
  168. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js → PageHeader-Csq434-v.js} +2 -2
  169. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js.map → PageHeader-Csq434-v.js.map} +1 -1
  170. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js → PageHeaderWithStats-CSnk1p5A.js} +2 -2
  171. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js.map → PageHeaderWithStats-CSnk1p5A.js.map} +1 -1
  172. package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js → PersonaDetailPage-Cx6L3Jvu.js} +2 -2
  173. package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js.map → PersonaDetailPage-Cx6L3Jvu.js.map} +1 -1
  174. package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js → PersonasPage-DOgGUlJl.js} +2 -2
  175. package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js.map → PersonasPage-DOgGUlJl.js.map} +1 -1
  176. package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js +2 -0
  177. package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js.map +1 -0
  178. package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js → ProcessDetailPage-BFcFSDUv.js} +2 -2
  179. package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js.map → ProcessDetailPage-BFcFSDUv.js.map} +1 -1
  180. package/dashboard/dist/assets/ProcessesListPage-BaHV2cXp.js +2 -0
  181. package/dashboard/dist/assets/{ProcessesListPage-5NnysKFC.js.map → ProcessesListPage-BaHV2cXp.js.map} +1 -1
  182. package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js +7 -0
  183. package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js.map +1 -0
  184. package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js +8 -0
  185. package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js.map +1 -0
  186. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js → RolePill-BafrASDX.js} +2 -2
  187. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js.map → RolePill-BafrASDX.js.map} +1 -1
  188. package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js → RolesPage-DSqqKPbv.js} +2 -2
  189. package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js.map → RolesPage-DSqqKPbv.js.map} +1 -1
  190. package/dashboard/dist/assets/RunAsSelector-B29iWwel.js +2 -0
  191. package/dashboard/dist/assets/{RunAsSelector-BwZTJ4Yj.js.map → RunAsSelector-B29iWwel.js.map} +1 -1
  192. package/dashboard/dist/assets/ScanCodesPage-S8aAJfnC.js +2 -0
  193. package/dashboard/dist/assets/{ScanCodesPage-FiYIYB-m.js.map → ScanCodesPage-S8aAJfnC.js.map} +1 -1
  194. package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js → ScanSchemeDetailPage-CUBRAtmJ.js} +2 -2
  195. package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js.map → ScanSchemeDetailPage-CUBRAtmJ.js.map} +1 -1
  196. package/dashboard/dist/assets/ScanStationPage-R9t1-CeQ.js +2 -0
  197. package/dashboard/dist/assets/{ScanStationPage-8CdOtbCD.js.map → ScanStationPage-R9t1-CeQ.js.map} +1 -1
  198. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js → ScopeBadge-b6MIBiYD.js} +2 -2
  199. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js.map → ScopeBadge-b6MIBiYD.js.map} +1 -1
  200. package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js → StickyPagination-CkW_A507.js} +2 -2
  201. package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js.map → StickyPagination-CkW_A507.js.map} +1 -1
  202. package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js → StreamMessageDetail-yzWX0wac.js} +2 -2
  203. package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js.map → StreamMessageDetail-yzWX0wac.js.map} +1 -1
  204. package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js → SwimlaneTimeline-Cf4DXFxj.js} +2 -2
  205. package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js.map → SwimlaneTimeline-Cf4DXFxj.js.map} +1 -1
  206. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js → TagInput-ZrIIrEUP.js} +2 -2
  207. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js.map → TagInput-ZrIIrEUP.js.map} +1 -1
  208. package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js → TaskDetailPage-DCDcEps9.js} +2 -2
  209. package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js.map → TaskDetailPage-DCDcEps9.js.map} +1 -1
  210. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js → TaskQueuePill-DkQ1uc6y.js} +2 -2
  211. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js.map → TaskQueuePill-DkQ1uc6y.js.map} +1 -1
  212. package/dashboard/dist/assets/TasksListPage-BBATgpf7.js +2 -0
  213. package/dashboard/dist/assets/{TasksListPage-BQNaSzCn.js.map → TasksListPage-BBATgpf7.js.map} +1 -1
  214. package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js → TimeAgo-CSNVEjch.js} +2 -2
  215. package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js.map → TimeAgo-CSNVEjch.js.map} +1 -1
  216. package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js → TimestampCell-Du1nBrPn.js} +2 -2
  217. package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js.map → TimestampCell-Du1nBrPn.js.map} +1 -1
  218. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js → ToolPill-Baxm02L6.js} +2 -2
  219. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js.map → ToolPill-Baxm02L6.js.map} +1 -1
  220. package/dashboard/dist/assets/ToolTestPanel-CF-h_5Rg.js +2 -0
  221. package/dashboard/dist/assets/{ToolTestPanel-DvuLFWqQ.js.map → ToolTestPanel-CF-h_5Rg.js.map} +1 -1
  222. package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js → TopicDetailPage-Dr1UmWcp.js} +3 -3
  223. package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js.map → TopicDetailPage-Dr1UmWcp.js.map} +1 -1
  224. package/dashboard/dist/assets/TopicsPage-CUUo-Ylf.js +2 -0
  225. package/dashboard/dist/assets/{TopicsPage-h-oyTeEJ.js.map → TopicsPage-CUUo-Ylf.js.map} +1 -1
  226. package/dashboard/dist/assets/{UserName-BceRCeDF.js → UserName-kBh1dc39.js} +2 -2
  227. package/dashboard/dist/assets/{UserName-BceRCeDF.js.map → UserName-kBh1dc39.js.map} +1 -1
  228. package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js → WorkflowExecutionPage-CCRSbnDx.js} +2 -2
  229. package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js.map → WorkflowExecutionPage-CCRSbnDx.js.map} +1 -1
  230. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js → WorkflowPill-ZepbO_ny.js} +2 -2
  231. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js.map → WorkflowPill-ZepbO_ny.js.map} +1 -1
  232. package/dashboard/dist/assets/WorkflowsDashboard-BNQVvyek.js +2 -0
  233. package/dashboard/dist/assets/{WorkflowsDashboard-B0r2lQXk.js.map → WorkflowsDashboard-BNQVvyek.js.map} +1 -1
  234. package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js → WorkflowsOverview-DswubNJN.js} +2 -2
  235. package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js.map → WorkflowsOverview-DswubNJN.js.map} +1 -1
  236. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js → YamlWorkflowDetailPage-Cw9Dlmup.js} +11 -11
  237. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js.map → YamlWorkflowDetailPage-Cw9Dlmup.js.map} +1 -1
  238. package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js → YamlWorkflowsPage-DB8xnIXy.js} +2 -2
  239. package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js.map → YamlWorkflowsPage-DB8xnIXy.js.map} +1 -1
  240. package/dashboard/dist/assets/{agents-BvmLCk4h.js → agents-BwEnf6N9.js} +2 -2
  241. package/dashboard/dist/assets/{agents-BvmLCk4h.js.map → agents-BwEnf6N9.js.map} +1 -1
  242. package/dashboard/dist/assets/{bots-f_tyhl4I.js → bots-CCmJTT2u.js} +2 -2
  243. package/dashboard/dist/assets/{bots-f_tyhl4I.js.map → bots-CCmJTT2u.js.map} +1 -1
  244. package/dashboard/dist/assets/{capabilities-DNo5bqLx.js → capabilities-BZHgp_nh.js} +2 -2
  245. package/dashboard/dist/assets/{capabilities-DNo5bqLx.js.map → capabilities-BZHgp_nh.js.map} +1 -1
  246. package/dashboard/dist/assets/{constants-BHkpVaqx.js → constants-CeBBTzf5.js} +2 -2
  247. package/dashboard/dist/assets/{constants-BHkpVaqx.js.map → constants-CeBBTzf5.js.map} +1 -1
  248. package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js → controlplane-CyfwUlFA.js} +2 -2
  249. package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js.map → controlplane-CyfwUlFA.js.map} +1 -1
  250. package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js +2 -0
  251. package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js.map +1 -0
  252. package/dashboard/dist/assets/index-3gbd5neL.js +67 -0
  253. package/dashboard/dist/assets/index-3gbd5neL.js.map +1 -0
  254. package/dashboard/dist/assets/index-BAAVTyZ-.js +2 -0
  255. package/dashboard/dist/assets/{index-DL83W7Gu.js.map → index-BAAVTyZ-.js.map} +1 -1
  256. package/dashboard/dist/assets/{index-CsKiRyhy.js → index-BC6Jenlo.js} +2 -2
  257. package/dashboard/dist/assets/{index-CsKiRyhy.js.map → index-BC6Jenlo.js.map} +1 -1
  258. package/dashboard/dist/assets/index-C7KHqOTQ.js +2 -0
  259. package/dashboard/dist/assets/{index-D7ESqn22.js.map → index-C7KHqOTQ.js.map} +1 -1
  260. package/dashboard/dist/assets/index-CDrqqbSR.js +3 -0
  261. package/dashboard/dist/assets/index-CDrqqbSR.js.map +1 -0
  262. package/dashboard/dist/assets/index-CVwzCZ43.js +2 -0
  263. package/dashboard/dist/assets/{index-DvxxrFBo.js.map → index-CVwzCZ43.js.map} +1 -1
  264. package/dashboard/dist/assets/index-CaGF6TCC.js +2 -0
  265. package/dashboard/dist/assets/index-CaGF6TCC.js.map +1 -0
  266. package/dashboard/dist/assets/index-ClVbfe4z.js +13 -0
  267. package/dashboard/dist/assets/index-ClVbfe4z.js.map +1 -0
  268. package/dashboard/dist/assets/{index-DWse7ERF.js → index-CuVkSmj5.js} +2 -2
  269. package/dashboard/dist/assets/{index-DWse7ERF.js.map → index-CuVkSmj5.js.map} +1 -1
  270. package/dashboard/dist/assets/{index-PcyGjmBm.js → index-DAuX_PlL.js} +2 -2
  271. package/dashboard/dist/assets/{index-PcyGjmBm.js.map → index-DAuX_PlL.js.map} +1 -1
  272. package/dashboard/dist/assets/{index-e2X-s0EQ.js → index-DBWS5QL8.js} +2 -2
  273. package/dashboard/dist/assets/{index-e2X-s0EQ.js.map → index-DBWS5QL8.js.map} +1 -1
  274. package/dashboard/dist/assets/index-DIWCI6HC.js +2 -0
  275. package/dashboard/dist/assets/{index-BNZknxFY.js.map → index-DIWCI6HC.js.map} +1 -1
  276. package/dashboard/dist/assets/{index-C-Xr2V3F.js → index-DZ8X_Gp4.js} +2 -2
  277. package/dashboard/dist/assets/{index-C-Xr2V3F.js.map → index-DZ8X_Gp4.js.map} +1 -1
  278. package/dashboard/dist/assets/index-Dh8MJl3L.css +1 -0
  279. package/dashboard/dist/assets/{knowledge-Coo6CKzo.js → knowledge-CqyLhUMg.js} +2 -2
  280. package/dashboard/dist/assets/{knowledge-Coo6CKzo.js.map → knowledge-CqyLhUMg.js.map} +1 -1
  281. package/dashboard/dist/assets/{mcp-Cz5eFnP_.js → mcp-Cvu6bFYH.js} +2 -2
  282. package/dashboard/dist/assets/{mcp-Cz5eFnP_.js.map → mcp-Cvu6bFYH.js.map} +1 -1
  283. package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js → mcp-query-qC6A3e9l.js} +2 -2
  284. package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js.map → mcp-query-qC6A3e9l.js.map} +1 -1
  285. package/dashboard/dist/assets/metadata-display-COo3mMCr.js +2 -0
  286. package/dashboard/dist/assets/metadata-display-COo3mMCr.js.map +1 -0
  287. package/dashboard/dist/assets/{personas-C2-LgpHQ.js → personas-BKN_lJuV.js} +2 -2
  288. package/dashboard/dist/assets/{personas-C2-LgpHQ.js.map → personas-BKN_lJuV.js.map} +1 -1
  289. package/dashboard/dist/assets/{pipelines-TuXQvUA-.js → pipelines-BldIfv85.js} +2 -2
  290. package/dashboard/dist/assets/{pipelines-TuXQvUA-.js.map → pipelines-BldIfv85.js.map} +1 -1
  291. package/dashboard/dist/assets/{tasks-OUzpu__z.js → tasks-B-Uay8uL.js} +2 -2
  292. package/dashboard/dist/assets/{tasks-OUzpu__z.js.map → tasks-B-Uay8uL.js.map} +1 -1
  293. package/dashboard/dist/assets/{topics-B8bdrBaW.js → topics-438EQogt.js} +2 -2
  294. package/dashboard/dist/assets/{topics-B8bdrBaW.js.map → topics-438EQogt.js.map} +1 -1
  295. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js +2 -0
  296. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js.map +1 -0
  297. package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js → useDebouncedValue-Cw8hYZ8y.js} +2 -2
  298. package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js.map → useDebouncedValue-Cw8hYZ8y.js.map} +1 -1
  299. package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js → useNamespace-D1218GQ8.js} +2 -2
  300. package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js.map → useNamespace-D1218GQ8.js.map} +1 -1
  301. package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js → useYamlActivityEvents-BAQf_y_U.js} +2 -2
  302. package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js.map → useYamlActivityEvents-BAQf_y_U.js.map} +1 -1
  303. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js → vendor-icons-B7OcUM6b.js} +2 -2
  304. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js.map → vendor-icons-B7OcUM6b.js.map} +1 -1
  305. package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js → yaml-workflows-CN01gEB0.js} +2 -2
  306. package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js.map → yaml-workflows-CN01gEB0.js.map} +1 -1
  307. package/dashboard/dist/index.html +3 -3
  308. package/docs/accumulator.md +113 -0
  309. package/docs/api/http/escalations.md +89 -0
  310. package/docs/api/http/roles.md +1 -0
  311. package/docs/api/http/workflows.md +28 -1
  312. package/docs/api/mcp/admin.md +40 -4
  313. package/docs/api/sdk/escalations.md +91 -0
  314. package/docs/api/sdk/roles.md +2 -0
  315. package/docs/architecture.md +1 -1
  316. package/docs/code-owned-configuration.md +3 -2
  317. package/docs/dashboard.md +11 -5
  318. package/docs/hitl/design.md +1 -1
  319. package/docs/hitl/escalation.md +37 -1
  320. package/docs/hitl/form.md +12 -7
  321. package/docs/hitl/invoke-form.md +10 -3
  322. package/docs/hitl/lookups.md +21 -0
  323. package/docs/hitl/pinned-views.md +4 -0
  324. package/docs/hitl/portal.md +97 -0
  325. package/docs/hitl/resolution.md +41 -0
  326. package/docs/hitl/x-lt-embed.md +1 -1
  327. package/docs/hitl/x-lt-invoke.md +95 -0
  328. package/docs/hitl/x-lt-list-schema.md +3 -1
  329. package/docs/hitl/x-lt-validation.md +50 -3
  330. package/docs/hitl/x-lt-widget.md +22 -0
  331. package/docs/hitl-guide.md +12 -2
  332. package/docs/scan-codes.md +15 -2
  333. package/docs/sdk.md +1 -1
  334. package/docs/workflows.md +2 -2
  335. package/package.json +4 -2
  336. package/dashboard/dist/assets/AgentsPage-D77JeViQ.js +0 -2
  337. package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js +0 -2
  338. package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js.map +0 -1
  339. package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js +0 -2
  340. package/dashboard/dist/assets/CapabilitiesPage-D9TC2iKy.js +0 -2
  341. package/dashboard/dist/assets/DataTable-7C7riavf.js +0 -2
  342. package/dashboard/dist/assets/DataTable-7C7riavf.js.map +0 -1
  343. package/dashboard/dist/assets/EntityTimelinePanel-1lT3jkCM.js +0 -2
  344. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js +0 -2
  345. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js.map +0 -1
  346. package/dashboard/dist/assets/GraphInvokePage-DV7Y0fe2.js +0 -2
  347. package/dashboard/dist/assets/HomePage-G785SWcW.js +0 -2
  348. package/dashboard/dist/assets/ListToolbar-zPVYPg3W.js +0 -2
  349. package/dashboard/dist/assets/McpQueryPage-CNSNMagY.js +0 -2
  350. package/dashboard/dist/assets/McpRunsPage-B6rb5QBf.js +0 -2
  351. package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js +0 -3
  352. package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js.map +0 -1
  353. package/dashboard/dist/assets/OperatorDashboard-DBOscDnf.js +0 -2
  354. package/dashboard/dist/assets/ProcessesListPage-5NnysKFC.js +0 -2
  355. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js +0 -2
  356. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js.map +0 -1
  357. package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js +0 -8
  358. package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js.map +0 -1
  359. package/dashboard/dist/assets/RunAsSelector-BwZTJ4Yj.js +0 -2
  360. package/dashboard/dist/assets/ScanCodesPage-FiYIYB-m.js +0 -2
  361. package/dashboard/dist/assets/ScanStationPage-8CdOtbCD.js +0 -2
  362. package/dashboard/dist/assets/TasksListPage-BQNaSzCn.js +0 -2
  363. package/dashboard/dist/assets/ToolTestPanel-DvuLFWqQ.js +0 -2
  364. package/dashboard/dist/assets/TopicsPage-h-oyTeEJ.js +0 -2
  365. package/dashboard/dist/assets/WorkflowsDashboard-B0r2lQXk.js +0 -2
  366. package/dashboard/dist/assets/escalation-columns-DIigeTOK.js +0 -2
  367. package/dashboard/dist/assets/escalation-columns-DIigeTOK.js.map +0 -1
  368. package/dashboard/dist/assets/index-BMlQYOE1.js +0 -67
  369. package/dashboard/dist/assets/index-BMlQYOE1.js.map +0 -1
  370. package/dashboard/dist/assets/index-BNZknxFY.js +0 -2
  371. package/dashboard/dist/assets/index-Bpvfr4OW.css +0 -1
  372. package/dashboard/dist/assets/index-CegPUKpc.js +0 -3
  373. package/dashboard/dist/assets/index-CegPUKpc.js.map +0 -1
  374. package/dashboard/dist/assets/index-D7ESqn22.js +0 -2
  375. package/dashboard/dist/assets/index-DL83W7Gu.js +0 -2
  376. package/dashboard/dist/assets/index-DPLssnMW.js +0 -6
  377. package/dashboard/dist/assets/index-DPLssnMW.js.map +0 -1
  378. package/dashboard/dist/assets/index-DoETPlJP.js +0 -11
  379. package/dashboard/dist/assets/index-DoETPlJP.js.map +0 -1
  380. package/dashboard/dist/assets/index-DvxxrFBo.js +0 -2
  381. package/dashboard/dist/assets/metadata-display--TzK0REC.js +0 -2
  382. package/dashboard/dist/assets/metadata-display--TzK0REC.js.map +0 -1
  383. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js +0 -2
  384. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js.map +0 -1
  385. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js +0 -2
  386. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js.map +0 -1
  387. package/docs/compilation.md +0 -152
  388. package/docs/compiler.md +0 -311
  389. package/docs/contributing.md +0 -56
  390. package/docs/design-principles.md +0 -244
  391. package/docs/schema-exchange.md +0 -173
  392. package/docs/self-test.md +0 -106
  393. package/docs/story.md +0 -184
@@ -20,3 +20,5 @@ export * from './ctx-path';
20
20
  export * from './field-validator';
21
21
  export * from './validate-resolver-payload';
22
22
  export * from './invoke-context';
23
+ export * from './display-only-widgets';
24
+ export * from './x-lt-invoke';
@@ -36,3 +36,5 @@ __exportStar(require("./ctx-path"), exports);
36
36
  __exportStar(require("./field-validator"), exports);
37
37
  __exportStar(require("./validate-resolver-payload"), exports);
38
38
  __exportStar(require("./invoke-context"), exports);
39
+ __exportStar(require("./display-only-widgets"), exports);
40
+ __exportStar(require("./x-lt-invoke"), exports);
@@ -1,7 +1,8 @@
1
1
  import type { ResolverValidationContext } from './validate-resolver-payload';
2
2
  /**
3
3
  * The context an invoke form validates and renders against. The pass itself
4
- * supplies the live values under `input` and `resolver`; the envelope
5
- * metadata is the only other domain an invoke form can reference.
4
+ * supplies the live values under `input` and `resolver`; `metadata` is the
5
+ * envelope metadata and `lookup` holds resolved versioned knowledge editions
6
+ * keyed by `as ?? key`. The lookup domain is present only when supplied.
6
7
  */
7
- export declare function buildInvokeFormContext(metadata: Record<string, unknown> | null | undefined): ResolverValidationContext;
8
+ export declare function buildInvokeFormContext(metadata: Record<string, unknown> | null | undefined, lookup?: Record<string, unknown> | null): ResolverValidationContext;
@@ -3,9 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.buildInvokeFormContext = buildInvokeFormContext;
4
4
  /**
5
5
  * The context an invoke form validates and renders against. The pass itself
6
- * supplies the live values under `input` and `resolver`; the envelope
7
- * metadata is the only other domain an invoke form can reference.
6
+ * supplies the live values under `input` and `resolver`; `metadata` is the
7
+ * envelope metadata and `lookup` holds resolved versioned knowledge editions
8
+ * keyed by `as ?? key`. The lookup domain is present only when supplied.
8
9
  */
9
- function buildInvokeFormContext(metadata) {
10
- return { metadata: metadata ?? {} };
10
+ function buildInvokeFormContext(metadata, lookup) {
11
+ return { metadata: metadata ?? {}, ...(lookup ? { lookup } : {}) };
11
12
  }
@@ -1,16 +1,3 @@
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
1
  type PathSeg = {
15
2
  key: string;
16
3
  } | {
@@ -27,7 +14,8 @@ export declare function bindPathFor(propName: string, propDef: Record<string, an
27
14
  /**
28
15
  * Assemble the payload from the form's flat values. A field absent from
29
16
  * `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
17
+ * payload). Unknown keys not declared in the schema are dropped, and so are
18
+ * display-only widget fields, which carry no answer. With no schema
31
19
  * properties, values pass through unchanged.
32
20
  */
33
21
  export declare function mapFormToPayload(formValues: Record<string, any>, formSchema: Record<string, any> | null | undefined): Record<string, any>;
@@ -1,4 +1,11 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parsePath = parsePath;
4
+ exports.setDeep = setDeep;
5
+ exports.getDeep = getDeep;
6
+ exports.bindPathFor = bindPathFor;
7
+ exports.mapFormToPayload = mapFormToPayload;
8
+ exports.mapPayloadToForm = mapPayloadToForm;
2
9
  /**
3
10
  * x-lt-bind — maps the escalation FORM (flat field values the user edits) to and
4
11
  * from the PAYLOAD (the nested JSON the workflow consumes). A form_schema property
@@ -12,13 +19,7 @@
12
19
  * (server-side: to validate a submitted payload)
13
20
  * mapFormToPayload — flat form values → payload, the shape submitted/stored
14
21
  */
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 display_only_widgets_1 = require("./display-only-widgets");
22
23
  const BLOCKED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
23
24
  /** Parse a bind path — dot keys with optional `[n]` indices. Rejects pollution keys. */
24
25
  function parsePath(path) {
@@ -75,7 +76,8 @@ function bindPathFor(propName, propDef) {
75
76
  /**
76
77
  * Assemble the payload from the form's flat values. A field absent from
77
78
  * `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
+ * payload). Unknown keys not declared in the schema are dropped, and so are
80
+ * display-only widget fields, which carry no answer. With no schema
79
81
  * properties, values pass through unchanged.
80
82
  */
81
83
  function mapFormToPayload(formValues, formSchema) {
@@ -86,6 +88,8 @@ function mapFormToPayload(formValues, formSchema) {
86
88
  for (const [name, def] of Object.entries(props)) {
87
89
  if (!(name in formValues))
88
90
  continue;
91
+ if ((0, display_only_widgets_1.isDisplayOnlyField)(def))
92
+ continue;
89
93
  setDeep(payload, bindPathFor(name, def), formValues[name]);
90
94
  }
91
95
  return payload;
@@ -0,0 +1,38 @@
1
+ export declare const X_LT_INVOKE = "x-lt-invoke";
2
+ export declare const INVOKE_WIDGET: "invoke";
3
+ export declare const INVOKE_VARIANTS: {
4
+ readonly LINK: "link";
5
+ readonly BUTTON: "button";
6
+ };
7
+ export type InvokeVariant = (typeof INVOKE_VARIANTS)[keyof typeof INVOKE_VARIANTS];
8
+ export interface InvokeConfig {
9
+ /** The workflow_type to start. */
10
+ workflow: string;
11
+ /** Nested invoke `data` template; leaves interpolate against the context. */
12
+ data: Record<string, unknown>;
13
+ /** Extra run metadata template, merged over the workflow's declared metadata. */
14
+ metadata: Record<string, unknown>;
15
+ /** Open the workflow's input form prefilled instead of posting directly. */
16
+ modal: boolean;
17
+ /** Direct mode only: a prompt to confirm before posting; tokens interpolate. */
18
+ confirm: string | null;
19
+ variant: InvokeVariant;
20
+ /** Lead the label with the workflow's registered icon. */
21
+ icon: boolean;
22
+ }
23
+ export interface InvokePayload {
24
+ data: Record<string, unknown>;
25
+ metadata: Record<string, unknown>;
26
+ }
27
+ type Ctx = Record<string, unknown> | null | undefined;
28
+ /** The field's invoke declaration, or null when it names no workflow. */
29
+ export declare function readInvokeConfig(fieldSchema: Record<string, unknown> | null | undefined): InvokeConfig | null;
30
+ /**
31
+ * Resolve one template value against the context, keeping the type of a
32
+ * whole-token leaf. Returns undefined for a token with no value so the
33
+ * caller omits the key.
34
+ */
35
+ export declare function interpolateInvokeValue(value: unknown, ctx: Ctx): unknown;
36
+ /** The invoke payload for one context: `data` and `metadata` fully resolved. */
37
+ export declare function resolveInvokePayload(config: InvokeConfig, ctx: Ctx): InvokePayload;
38
+ export {};
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.INVOKE_VARIANTS = exports.INVOKE_WIDGET = exports.X_LT_INVOKE = void 0;
4
+ exports.readInvokeConfig = readInvokeConfig;
5
+ exports.interpolateInvokeValue = interpolateInvokeValue;
6
+ exports.resolveInvokePayload = resolveInvokePayload;
7
+ /**
8
+ * x-lt-invoke: start a workflow from inside a form. A display-only field
9
+ * declares the target workflow and how the form's context maps into the
10
+ * invoke payload:
11
+ *
12
+ * "x-lt-widget": "invoke",
13
+ * "x-lt-invoke": {
14
+ * "workflow": "printPamphlet",
15
+ * "data": { "order": { "id": "{{metadata.orderId}}" }, "copies": 1 },
16
+ * "metadata": { "escalationId": "{{escalation.id}}" },
17
+ * "modal": true,
18
+ * "confirm": "Print a pamphlet for {{metadata.orderId}}?",
19
+ * "variant": "link",
20
+ * "icon": true
21
+ * }
22
+ *
23
+ * `data` is the nested payload the invoke API receives. In direct mode it is
24
+ * posted as resolved; in modal mode it prefills the workflow's own input form
25
+ * through the x-lt-bind inversion. One declaration serves both.
26
+ *
27
+ * Interpolation keeps types: a leaf that is exactly one `{{domain.path}}`
28
+ * token becomes the raw context value (a number stays a number); a leaf that
29
+ * mixes text and tokens becomes a string; a token with no value drops its key
30
+ * so the target's own defaults apply. Objects and arrays recurse; every other
31
+ * leaf passes through unchanged.
32
+ */
33
+ const display_only_widgets_1 = require("./display-only-widgets");
34
+ const ctx_path_1 = require("./ctx-path");
35
+ exports.X_LT_INVOKE = 'x-lt-invoke';
36
+ exports.INVOKE_WIDGET = display_only_widgets_1.DISPLAY_ONLY_WIDGET_NAMES.INVOKE;
37
+ exports.INVOKE_VARIANTS = {
38
+ LINK: 'link',
39
+ BUTTON: 'button',
40
+ };
41
+ const WHOLE_TOKEN_PATTERN = /^\{\{\s*([^{}]+?)\s*\}\}$/;
42
+ function isPlainObject(value) {
43
+ return !!value && typeof value === 'object' && !Array.isArray(value);
44
+ }
45
+ function isVariant(value) {
46
+ return value === exports.INVOKE_VARIANTS.LINK || value === exports.INVOKE_VARIANTS.BUTTON;
47
+ }
48
+ /** The field's invoke declaration, or null when it names no workflow. */
49
+ function readInvokeConfig(fieldSchema) {
50
+ const raw = fieldSchema?.[exports.X_LT_INVOKE];
51
+ if (!isPlainObject(raw))
52
+ return null;
53
+ const workflow = raw.workflow;
54
+ if (typeof workflow !== 'string' || workflow.trim().length === 0)
55
+ return null;
56
+ const confirm = raw.confirm;
57
+ return {
58
+ workflow: workflow.trim(),
59
+ data: isPlainObject(raw.data) ? raw.data : {},
60
+ metadata: isPlainObject(raw.metadata) ? raw.metadata : {},
61
+ modal: raw.modal === true,
62
+ confirm: typeof confirm === 'string' && confirm.trim().length > 0 ? confirm : null,
63
+ variant: isVariant(raw.variant) ? raw.variant : exports.INVOKE_VARIANTS.LINK,
64
+ icon: raw.icon !== false,
65
+ };
66
+ }
67
+ /**
68
+ * Resolve one template value against the context, keeping the type of a
69
+ * whole-token leaf. Returns undefined for a token with no value so the
70
+ * caller omits the key.
71
+ */
72
+ function interpolateInvokeValue(value, ctx) {
73
+ if (typeof value === 'string') {
74
+ const whole = WHOLE_TOKEN_PATTERN.exec(value);
75
+ if (whole) {
76
+ const resolved = (0, ctx_path_1.resolveCtxPath)(whole[1], ctx ?? undefined);
77
+ return resolved === null ? undefined : resolved;
78
+ }
79
+ if ((0, ctx_path_1.hasInterpolation)(value))
80
+ return (0, ctx_path_1.interpolatePath)(value, ctx ?? undefined) ?? undefined;
81
+ return value;
82
+ }
83
+ if (Array.isArray(value)) {
84
+ return value.map((v) => interpolateInvokeValue(v, ctx)).filter((v) => v !== undefined);
85
+ }
86
+ if (isPlainObject(value)) {
87
+ const out = {};
88
+ for (const [key, v] of Object.entries(value)) {
89
+ const resolved = interpolateInvokeValue(v, ctx);
90
+ if (resolved !== undefined)
91
+ out[key] = resolved;
92
+ }
93
+ return out;
94
+ }
95
+ return value;
96
+ }
97
+ /** The invoke payload for one context: `data` and `metadata` fully resolved. */
98
+ function resolveInvokePayload(config, ctx) {
99
+ return {
100
+ data: interpolateInvokeValue(config.data, ctx),
101
+ metadata: interpolateInvokeValue(config.metadata, ctx),
102
+ };
103
+ }
@@ -1,12 +1,12 @@
1
1
  export declare const X_LT_OPTIONS = "x-lt-options";
2
- export type OptionValue = string | number;
2
+ export type OptionValue = string | number | boolean;
3
3
  /** One resolved option: the payload value and the rendered label. */
4
4
  export interface ResolvedOption {
5
5
  value: OptionValue;
6
6
  label: string;
7
7
  }
8
8
  /**
9
- * The field's effective option list: the static `enum` when present, else the
10
- * entries at the token's `"domain.path"`.
9
+ * The field's effective option list: the static `enum` when present, else an
10
+ * inline literal list, else the entries at the token's `"domain.path"`.
11
11
  */
12
12
  export declare function resolveFieldOptions(fieldSchema: Record<string, unknown> | null | undefined, ctx: Record<string, unknown> | undefined): ResolvedOption[] | undefined;
@@ -10,7 +10,9 @@ exports.resolveFieldOptions = resolveFieldOptions;
10
10
  * offer a different legal set per escalation (e.g. `[1..N]` where N rides the
11
11
  * envelope, or a versioned knowledge lookup under the `lookup` domain).
12
12
  *
13
- * x-lt-options "domain.path" or an ORDERED array of paths e.g.
13
+ * x-lt-options "domain.path", an ORDERED array of paths, or an inline
14
+ * literal list (an array with no string entries: `{ value,
15
+ * label }` objects, numbers, or booleans) — e.g.
14
16
  * "envelope.left_quantity_options" or
15
17
  * ["lookup.reasons.items", "envelope.reject_reason_items"].
16
18
  * With an array, the first entry that resolves to options
@@ -42,7 +44,15 @@ exports.resolveFieldOptions = resolveFieldOptions;
42
44
  const ctx_path_1 = require("./ctx-path");
43
45
  exports.X_LT_OPTIONS = 'x-lt-options';
44
46
  function isScalar(v) {
45
- return typeof v === 'string' || (typeof v === 'number' && Number.isFinite(v));
47
+ return typeof v === 'string' || typeof v === 'boolean' || (typeof v === 'number' && Number.isFinite(v));
48
+ }
49
+ /**
50
+ * An array token with no string entries is the option list itself, written
51
+ * inline. A bare string is always a context path, so a literal string value
52
+ * is written as `{ value, label }`.
53
+ */
54
+ function isLiteralList(token) {
55
+ return Array.isArray(token) && token.length > 0 && !token.some((e) => typeof e === 'string');
46
56
  }
47
57
  /** Normalize one array entry, mixed arrays resolving each entry independently. */
48
58
  function toOption(entry) {
@@ -58,19 +68,23 @@ function toOption(entry) {
58
68
  return null;
59
69
  }
60
70
  /**
61
- * The field's effective option list: the static `enum` when present, else the
62
- * entries at the token's `"domain.path"`.
71
+ * The field's effective option list: the static `enum` when present, else an
72
+ * inline literal list, else the entries at the token's `"domain.path"`.
63
73
  */
64
74
  function resolveFieldOptions(fieldSchema, ctx) {
65
75
  if (!fieldSchema)
66
76
  return undefined;
67
77
  // Enum entries pass through verbatim as values (whatever their type), each
68
- // labeled by its string form — the legacy membership contract is unchanged.
78
+ // labeled by its string form.
69
79
  const staticEnum = fieldSchema.enum;
70
80
  if (Array.isArray(staticEnum) && staticEnum.length > 0) {
71
81
  return staticEnum.map((v) => ({ value: v, label: String(v) }));
72
82
  }
73
83
  const token = fieldSchema[exports.X_LT_OPTIONS];
84
+ if (isLiteralList(token)) {
85
+ const options = token.map(toOption).filter((o) => o !== null);
86
+ return options.length > 0 ? options : undefined;
87
+ }
74
88
  const paths = (typeof token === 'string' ? [token] : Array.isArray(token) ? token : [])
75
89
  .filter((p) => typeof p === 'string' && p.length > 0);
76
90
  if (paths.length === 0)
@@ -6,3 +6,8 @@ export type ShowIfContext = HelpTokenContext;
6
6
  * An array of conditions shows the field only when every one holds.
7
7
  */
8
8
  export declare function evaluateShowIf(condition: unknown, ctx: ShowIfContext | null | undefined): boolean;
9
+ /**
10
+ * `x-lt-hide-if-empty`: the field is suppressed while its value is empty
11
+ * (null, undefined, '', false, or 0). Render and validation share this test.
12
+ */
13
+ export declare function isHiddenIfEmpty(fieldSchema: Record<string, unknown> | undefined, value: unknown): boolean;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.evaluateShowIf = evaluateShowIf;
4
+ exports.isHiddenIfEmpty = isHiddenIfEmpty;
4
5
  /**
5
6
  * x-lt-showIf — conditional field visibility. A form_schema property may
6
7
  * declare `x-lt-showIf: "domain.path"` to show the field only when the value
@@ -85,3 +86,12 @@ function evaluateShowIf(condition, ctx) {
85
86
  return true;
86
87
  return negate ? !isTruthy(value) : isTruthy(value);
87
88
  }
89
+ /**
90
+ * `x-lt-hide-if-empty`: the field is suppressed while its value is empty
91
+ * (null, undefined, '', false, or 0). Render and validation share this test.
92
+ */
93
+ function isHiddenIfEmpty(fieldSchema, value) {
94
+ if (fieldSchema?.['x-lt-hide-if-empty'] !== true)
95
+ return false;
96
+ return value === null || value === undefined || value === '' || value === false || value === 0;
97
+ }
@@ -51,6 +51,8 @@ const mcp_1 = require("../services/mcp");
51
51
  const yamlWorkflowWorkers = __importStar(require("../services/yaml-workflow/workers"));
52
52
  const migrate_1 = require("../lib/db/migrate");
53
53
  const apply_report_1 = require("./apply-report");
54
+ const escalation_2 = require("../types/escalation");
55
+ const lookup_refs_1 = require("../services/knowledge/lookup-refs");
54
56
  /**
55
57
  * Create a named no-op workflow function for readonly/observer workers.
56
58
  * The function name is used by `registerWorker` for discovery.
@@ -221,6 +223,13 @@ async function startWorkers(startConfig, workers, builtinMcpServerFactories) {
221
223
  for (const w of workersWithConfig) {
222
224
  const workflowType = w.workflow.name;
223
225
  const c = w.config;
226
+ if (c.inputLookups !== undefined) {
227
+ (0, escalation_2.assertLookupRefs)(c.inputLookups);
228
+ // Editions may be seeded after registration; a missing pin warns here and surfaces on the Invoke Tool page.
229
+ for (const problem of await (0, lookup_refs_1.describeMissingLookupRefs)(c.inputLookups)) {
230
+ logger_1.loggerRegistry.warn(`[long-tail] ${workflowType}: ${problem}`);
231
+ }
232
+ }
224
233
  const declaration = {
225
234
  workflow_type: workflowType,
226
235
  task_queue: w.taskQueue,
@@ -235,6 +244,7 @@ async function startWorkers(startConfig, workers, builtinMcpServerFactories) {
235
244
  envelope_schema: c.envelopeSchema ?? null,
236
245
  input_schema: c.inputSchema ?? null,
237
246
  icon: c.icon ?? null,
247
+ input_lookups: c.inputLookups ?? null,
238
248
  resolver_schema: c.resolverSchema ?? null,
239
249
  cron_schedule: c.cronSchedule ?? null,
240
250
  execute_as: c.executeAs ?? null,
@@ -218,6 +218,45 @@ function registerEscalationTools(server) {
218
218
  }
219
219
  return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
220
220
  });
221
+ // mirrors POST /api/escalations/:id/accumulate
222
+ server.registerTool('accumulate_item', {
223
+ title: 'Accumulate Item',
224
+ description: 'Add ONE item to an open accumulator escalation. Interim adds answer outcome "accepted" with the ' +
225
+ 'count held and remaining slots; the add that reaches max completes the row and wakes the waiting ' +
226
+ 'workflow with the ordered collection. A reciprocal row is written in the same statement, both or neither.',
227
+ inputSchema: schemas_1.accumulateItemSchema,
228
+ }, async (args) => {
229
+ const result = await escalationApi.accumulateItem({ id: args.id, itemKey: args.itemKey, payload: args.payload, metadata: args.metadata, reciprocal: args.reciprocal }, await systemAuth());
230
+ if (result.error) {
231
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error, ...(result.data ?? {}) }) }], isError: true };
232
+ }
233
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
234
+ });
235
+ // mirrors POST /api/escalations/:id/remove-item
236
+ server.registerTool('remove_item', {
237
+ title: 'Remove Item',
238
+ description: 'Remove ONE held item from a pending open accumulator escalation. The row stays pending and the ' +
239
+ 'waiting workflow is never woken.',
240
+ inputSchema: schemas_1.removeItemSchema,
241
+ }, async (args) => {
242
+ const result = await escalationApi.removeItem({ id: args.id, itemKey: args.itemKey, reciprocal: args.reciprocal }, await systemAuth());
243
+ if (result.error) {
244
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error, ...(result.data ?? {}) }) }], isError: true };
245
+ }
246
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
247
+ });
248
+ // mirrors GET /api/escalations/:id/items
249
+ server.registerTool('get_escalation_items', {
250
+ title: 'Get Escalation Items',
251
+ description: 'The held items of an accumulator or batch escalation in arrival order, with the count and max.',
252
+ inputSchema: schemas_1.getEscalationItemsSchema,
253
+ }, async (args) => {
254
+ const result = await escalationApi.getEscalationItems({ id: args.id }, await systemAuth());
255
+ if (result.error) {
256
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
257
+ }
258
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
259
+ });
221
260
  // mirrors POST /api/escalations/resolve-by-signal-key
222
261
  server.registerTool('resolve_by_signal_key', {
223
262
  title: 'Resolve by Signal Key',