@hotmeshio/long-tail 0.11.0 → 0.12.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 (280) hide show
  1. package/build/api/domain.d.ts +14 -0
  2. package/build/api/domain.js +76 -0
  3. package/build/api/escalations/cancel.js +16 -1
  4. package/build/api/escalations/helpers.js +5 -0
  5. package/build/lib/db/schemas/030_domain_dictionary.sql +18 -0
  6. package/build/lib/events/escalation-wire.d.ts +9 -0
  7. package/build/lib/events/escalation-wire.js +69 -0
  8. package/build/lib/events/system-events.js +13 -5
  9. package/build/lib/json-path/pick.d.ts +14 -0
  10. package/build/lib/json-path/pick.js +51 -0
  11. package/build/routes/domain.d.ts +2 -0
  12. package/build/routes/domain.js +62 -0
  13. package/build/routes/index.js +2 -0
  14. package/build/routes/mcp-endpoint.js +4 -1
  15. package/build/services/domain/index.d.ts +4 -0
  16. package/build/services/domain/index.js +14 -0
  17. package/build/services/domain/read.d.ts +21 -0
  18. package/build/services/domain/read.js +78 -0
  19. package/build/services/domain/seed.d.ts +11 -0
  20. package/build/services/domain/seed.js +65 -0
  21. package/build/services/domain/sql.d.ts +10 -0
  22. package/build/services/domain/sql.js +29 -0
  23. package/build/services/domain/validate.d.ts +29 -0
  24. package/build/services/domain/validate.js +50 -0
  25. package/build/services/domain/write.d.ts +23 -0
  26. package/build/services/domain/write.js +43 -0
  27. package/build/services/escalation/aggregate-validate.js +6 -0
  28. package/build/services/escalation/crud.js +16 -12
  29. package/build/services/escalation/facet-sql.js +10 -0
  30. package/build/services/mcp/db-server/schemas.d.ts +1 -1
  31. package/build/services/mcp/external-server.js +65 -27
  32. package/build/services/role/index.d.ts +2 -0
  33. package/build/services/role/index.js +7 -0
  34. package/build/services/role/sql.d.ts +1 -0
  35. package/build/services/role/sql.js +3 -1
  36. package/build/services/role/types.d.ts +17 -1
  37. package/build/services/role/types.js +16 -0
  38. package/build/start/workers.js +6 -0
  39. package/build/system/index.js +17 -0
  40. package/build/system/mcp-servers/admin/domain-context.d.ts +14 -0
  41. package/build/system/mcp-servers/admin/domain-context.js +220 -0
  42. package/build/system/mcp-servers/admin/exports.js +7 -4
  43. package/build/system/mcp-servers/admin/index.js +5 -5
  44. package/build/system/mcp-servers/admin/pipelines.js +9 -3
  45. package/build/system/mcp-servers/admin/schemas.d.ts +61 -32
  46. package/build/system/mcp-servers/admin/schemas.js +23 -5
  47. package/build/system/mcp-servers/admin/workflows.js +26 -0
  48. package/build/system/mcp-servers/db-query/schemas.d.ts +1 -1
  49. package/build/system/mcp-servers/human-queue-schemas.d.ts +1 -1
  50. package/build/system/seed/tool-manifests-admin.d.ts +115 -969
  51. package/build/system/seed/tool-manifests-admin.js +8 -10
  52. package/build/tsconfig.tsbuildinfo +1 -1
  53. package/build/types/domain-manifest.d.ts +77 -0
  54. package/build/types/domain-manifest.js +16 -0
  55. package/build/types/facets.d.ts +8 -0
  56. package/build/types/index.d.ts +2 -1
  57. package/build/types/index.js +2 -1
  58. package/build/types/startup.d.ts +10 -0
  59. package/dashboard/dist/assets/{AdminDashboard-DJ3LJQ09.js → AdminDashboard-CahUELrr.js} +2 -2
  60. package/dashboard/dist/assets/{AdminDashboard-DJ3LJQ09.js.map → AdminDashboard-CahUELrr.js.map} +1 -1
  61. package/dashboard/dist/assets/{AgentConfigPage-BMMvaD0z.js → AgentConfigPage-CkMv-cTV.js} +2 -2
  62. package/dashboard/dist/assets/{AgentConfigPage-BMMvaD0z.js.map → AgentConfigPage-CkMv-cTV.js.map} +1 -1
  63. package/dashboard/dist/assets/{AgentDetailPage-C6wfsnRe.js → AgentDetailPage-ZGea3Z4A.js} +2 -2
  64. package/dashboard/dist/assets/{AgentDetailPage-C6wfsnRe.js.map → AgentDetailPage-ZGea3Z4A.js.map} +1 -1
  65. package/dashboard/dist/assets/{AgentsPage-Cwqka7nE.js → AgentsPage-BMWSUJGi.js} +2 -2
  66. package/dashboard/dist/assets/{AgentsPage-Cwqka7nE.js.map → AgentsPage-BMWSUJGi.js.map} +1 -1
  67. package/dashboard/dist/assets/AvailableEscalationsPage-BjsbfsWW.js +2 -0
  68. package/dashboard/dist/assets/AvailableEscalationsPage-BjsbfsWW.js.map +1 -0
  69. package/dashboard/dist/assets/{BotPicker-BBkJBXZB.js → BotPicker-DN8tq7pz.js} +2 -2
  70. package/dashboard/dist/assets/{BotPicker-BBkJBXZB.js.map → BotPicker-DN8tq7pz.js.map} +1 -1
  71. package/dashboard/dist/assets/CapabilitiesPage-EAO3Ae0S.js +2 -0
  72. package/dashboard/dist/assets/CapabilitiesPage-EAO3Ae0S.js.map +1 -0
  73. package/dashboard/dist/assets/{CollapsibleSection-B3FsrHwH.js → CollapsibleSection-J-RejbjG.js} +2 -2
  74. package/dashboard/dist/assets/{CollapsibleSection-B3FsrHwH.js.map → CollapsibleSection-J-RejbjG.js.map} +1 -1
  75. package/dashboard/dist/assets/{CountdownTimer-B3nCqJdC.js → CountdownTimer-Dw8N9tmQ.js} +2 -2
  76. package/dashboard/dist/assets/{CountdownTimer-B3nCqJdC.js.map → CountdownTimer-Dw8N9tmQ.js.map} +1 -1
  77. package/dashboard/dist/assets/{CredentialsPage-Bv875IHe.js → CredentialsPage-CTurxwRn.js} +2 -2
  78. package/dashboard/dist/assets/{CredentialsPage-Bv875IHe.js.map → CredentialsPage-CTurxwRn.js.map} +1 -1
  79. package/dashboard/dist/assets/{CronLabel-CSzjWuwj.js → CronLabel-DZ5TmIQG.js} +2 -2
  80. package/dashboard/dist/assets/{CronLabel-CSzjWuwj.js.map → CronLabel-DZ5TmIQG.js.map} +1 -1
  81. package/dashboard/dist/assets/{CustomDurationPicker-CCpqf3e4.js → CustomDurationPicker-BES_FTrm.js} +2 -2
  82. package/dashboard/dist/assets/{CustomDurationPicker-CCpqf3e4.js.map → CustomDurationPicker-BES_FTrm.js.map} +1 -1
  83. package/dashboard/dist/assets/{DropZone-CJkk-U3o.js → DropZone-BWD9aGOz.js} +2 -2
  84. package/dashboard/dist/assets/{DropZone-CJkk-U3o.js.map → DropZone-BWD9aGOz.js.map} +1 -1
  85. package/dashboard/dist/assets/{ElapsedCell-WV6pUaKo.js → ElapsedCell-CIGRporU.js} +2 -2
  86. package/dashboard/dist/assets/{ElapsedCell-WV6pUaKo.js.map → ElapsedCell-CIGRporU.js.map} +1 -1
  87. package/dashboard/dist/assets/EntityTimelinePanel-CKIFsDOB.js +2 -0
  88. package/dashboard/dist/assets/EntityTimelinePanel-CKIFsDOB.js.map +1 -0
  89. package/dashboard/dist/assets/{EscalationListSchemaPage-CTQCALw4.js → EscalationListSchemaPage-DOrv-quD.js} +2 -2
  90. package/dashboard/dist/assets/{EscalationListSchemaPage-CTQCALw4.js.map → EscalationListSchemaPage-DOrv-quD.js.map} +1 -1
  91. package/dashboard/dist/assets/{EscalationSchemaPage-D_UgP0pv.js → EscalationSchemaPage-DAOVAxAM.js} +2 -2
  92. package/dashboard/dist/assets/{EscalationSchemaPage-D_UgP0pv.js.map → EscalationSchemaPage-DAOVAxAM.js.map} +1 -1
  93. package/dashboard/dist/assets/{EscalationsOverview-DuIUyxr0.js → EscalationsOverview-B27sDn5O.js} +2 -2
  94. package/dashboard/dist/assets/{EscalationsOverview-DuIUyxr0.js.map → EscalationsOverview-B27sDn5O.js.map} +1 -1
  95. package/dashboard/dist/assets/{EventTable-BV6unphX.js → EventTable-Co1d40Qq.js} +2 -2
  96. package/dashboard/dist/assets/{EventTable-BV6unphX.js.map → EventTable-Co1d40Qq.js.map} +1 -1
  97. package/dashboard/dist/assets/{FilterBar-DYFgzXNB.js → FilterBar-2ZfU21EA.js} +2 -2
  98. package/dashboard/dist/assets/{FilterBar-DYFgzXNB.js.map → FilterBar-2ZfU21EA.js.map} +1 -1
  99. package/dashboard/dist/assets/{GraphInvokePage-BGHVUipJ.js → GraphInvokePage-pdvc9VSv.js} +2 -2
  100. package/dashboard/dist/assets/{GraphInvokePage-BGHVUipJ.js.map → GraphInvokePage-pdvc9VSv.js.map} +1 -1
  101. package/dashboard/dist/assets/{HomePage-B-S2cK3E.js → HomePage-CLlDsBnw.js} +2 -2
  102. package/dashboard/dist/assets/{HomePage-B-S2cK3E.js.map → HomePage-CLlDsBnw.js.map} +1 -1
  103. package/dashboard/dist/assets/{ListToolbar-Bl7F3A28.js → ListToolbar-DMremj2e.js} +2 -2
  104. package/dashboard/dist/assets/{ListToolbar-Bl7F3A28.js.map → ListToolbar-DMremj2e.js.map} +1 -1
  105. package/dashboard/dist/assets/{McpOverview-_T9IsCD_.js → McpOverview-BhztmhoL.js} +2 -2
  106. package/dashboard/dist/assets/{McpOverview-_T9IsCD_.js.map → McpOverview-BhztmhoL.js.map} +1 -1
  107. package/dashboard/dist/assets/{McpQueryDetailPage-DtsVqKPw.js → McpQueryDetailPage-BseZfrhc.js} +2 -2
  108. package/dashboard/dist/assets/{McpQueryDetailPage-DtsVqKPw.js.map → McpQueryDetailPage-BseZfrhc.js.map} +1 -1
  109. package/dashboard/dist/assets/{McpQueryPage-DX5u-1bx.js → McpQueryPage-DMzkble7.js} +2 -2
  110. package/dashboard/dist/assets/{McpQueryPage-DX5u-1bx.js.map → McpQueryPage-DMzkble7.js.map} +1 -1
  111. package/dashboard/dist/assets/{McpRunDetailPage-BhcqqtYS.js → McpRunDetailPage-DqaBQAnn.js} +2 -2
  112. package/dashboard/dist/assets/{McpRunDetailPage-BhcqqtYS.js.map → McpRunDetailPage-DqaBQAnn.js.map} +1 -1
  113. package/dashboard/dist/assets/{McpRunsPage-L-1y8wnX.js → McpRunsPage-Du8GnHFv.js} +2 -2
  114. package/dashboard/dist/assets/{McpRunsPage-L-1y8wnX.js.map → McpRunsPage-Du8GnHFv.js.map} +1 -1
  115. package/dashboard/dist/assets/{NamespacePill-in1SLd0W.js → NamespacePill-C09QuOEz.js} +2 -2
  116. package/dashboard/dist/assets/{NamespacePill-in1SLd0W.js.map → NamespacePill-C09QuOEz.js.map} +1 -1
  117. package/dashboard/dist/assets/OperationsPage-CL2feqwS.js +3 -0
  118. package/dashboard/dist/assets/OperationsPage-CL2feqwS.js.map +1 -0
  119. package/dashboard/dist/assets/{OperatorDashboard-CIbDzOlh.js → OperatorDashboard-BHiGQZN_.js} +2 -2
  120. package/dashboard/dist/assets/{OperatorDashboard-CIbDzOlh.js.map → OperatorDashboard-BHiGQZN_.js.map} +1 -1
  121. package/dashboard/dist/assets/{PageHeader-BJgWMZtw.js → PageHeader-B7YJxa4o.js} +2 -2
  122. package/dashboard/dist/assets/{PageHeader-BJgWMZtw.js.map → PageHeader-B7YJxa4o.js.map} +1 -1
  123. package/dashboard/dist/assets/{PageHeaderWithStats-Ccio4vyG.js → PageHeaderWithStats-gT-5ovJh.js} +2 -2
  124. package/dashboard/dist/assets/{PageHeaderWithStats-Ccio4vyG.js.map → PageHeaderWithStats-gT-5ovJh.js.map} +1 -1
  125. package/dashboard/dist/assets/{PersonaDetailPage-BOaf0TW1.js → PersonaDetailPage-D6GGZgUS.js} +2 -2
  126. package/dashboard/dist/assets/{PersonaDetailPage-BOaf0TW1.js.map → PersonaDetailPage-D6GGZgUS.js.map} +1 -1
  127. package/dashboard/dist/assets/PersonasPage-BQYCdmAs.js +2 -0
  128. package/dashboard/dist/assets/PersonasPage-BQYCdmAs.js.map +1 -0
  129. package/dashboard/dist/assets/{ProcessDetailPage-DN9NqfeP.js → ProcessDetailPage-P45jOLim.js} +2 -2
  130. package/dashboard/dist/assets/{ProcessDetailPage-DN9NqfeP.js.map → ProcessDetailPage-P45jOLim.js.map} +1 -1
  131. package/dashboard/dist/assets/{ProcessesListPage-CfQEWaD4.js → ProcessesListPage-CgdzgCY6.js} +2 -2
  132. package/dashboard/dist/assets/{ProcessesListPage-CfQEWaD4.js.map → ProcessesListPage-CgdzgCY6.js.map} +1 -1
  133. package/dashboard/dist/assets/{RoleDetailPage-BC5HL7ls.js → RoleDetailPage-Dme2pa9z.js} +2 -2
  134. package/dashboard/dist/assets/{RoleDetailPage-BC5HL7ls.js.map → RoleDetailPage-Dme2pa9z.js.map} +1 -1
  135. package/dashboard/dist/assets/{RolePill-BNAP-uK6.js → RolePill-CtYI1_k1.js} +2 -2
  136. package/dashboard/dist/assets/{RolePill-BNAP-uK6.js.map → RolePill-CtYI1_k1.js.map} +1 -1
  137. package/dashboard/dist/assets/RolesPage-Ci7_PbPt.js +2 -0
  138. package/dashboard/dist/assets/RolesPage-Ci7_PbPt.js.map +1 -0
  139. package/dashboard/dist/assets/{RunAsSelector-twbuX7fB.js → RunAsSelector-CB0pV097.js} +2 -2
  140. package/dashboard/dist/assets/{RunAsSelector-twbuX7fB.js.map → RunAsSelector-CB0pV097.js.map} +1 -1
  141. package/dashboard/dist/assets/{ScanCodesPage-CPNg6K--.js → ScanCodesPage-DpbPhAj1.js} +2 -2
  142. package/dashboard/dist/assets/{ScanCodesPage-CPNg6K--.js.map → ScanCodesPage-DpbPhAj1.js.map} +1 -1
  143. package/dashboard/dist/assets/ScanSchemeDetailPage-CGnMGlt0.js +2 -0
  144. package/dashboard/dist/assets/ScanSchemeDetailPage-CGnMGlt0.js.map +1 -0
  145. package/dashboard/dist/assets/ScanStationPage-BTeV7TGy.js +2 -0
  146. package/dashboard/dist/assets/ScanStationPage-BTeV7TGy.js.map +1 -0
  147. package/dashboard/dist/assets/{ScopeBadge-BG7KkZ8Q.js → ScopeBadge-B76rOtA0.js} +2 -2
  148. package/dashboard/dist/assets/{ScopeBadge-BG7KkZ8Q.js.map → ScopeBadge-B76rOtA0.js.map} +1 -1
  149. package/dashboard/dist/assets/{StickyPagination-DIeYMPPd.js → StickyPagination-DH-0JEyx.js} +2 -2
  150. package/dashboard/dist/assets/{StickyPagination-DIeYMPPd.js.map → StickyPagination-DH-0JEyx.js.map} +1 -1
  151. package/dashboard/dist/assets/{StreamMessageDetail-gU4CUeQI.js → StreamMessageDetail-u-pDrHfS.js} +2 -2
  152. package/dashboard/dist/assets/{StreamMessageDetail-gU4CUeQI.js.map → StreamMessageDetail-u-pDrHfS.js.map} +1 -1
  153. package/dashboard/dist/assets/{SwimlaneTimeline-Br-nBA4l.js → SwimlaneTimeline-vN1N8BGy.js} +2 -2
  154. package/dashboard/dist/assets/{SwimlaneTimeline-Br-nBA4l.js.map → SwimlaneTimeline-vN1N8BGy.js.map} +1 -1
  155. package/dashboard/dist/assets/{TagInput-CvM5n6ww.js → TagInput-BQAPOp17.js} +2 -2
  156. package/dashboard/dist/assets/{TagInput-CvM5n6ww.js.map → TagInput-BQAPOp17.js.map} +1 -1
  157. package/dashboard/dist/assets/{TaskDetailPage-_9cr_R0u.js → TaskDetailPage-CAQm6avs.js} +2 -2
  158. package/dashboard/dist/assets/{TaskDetailPage-_9cr_R0u.js.map → TaskDetailPage-CAQm6avs.js.map} +1 -1
  159. package/dashboard/dist/assets/{TaskQueuePill-D4JPHXOq.js → TaskQueuePill-C2NImrwl.js} +2 -2
  160. package/dashboard/dist/assets/{TaskQueuePill-D4JPHXOq.js.map → TaskQueuePill-C2NImrwl.js.map} +1 -1
  161. package/dashboard/dist/assets/{TasksListPage-DVENC9Jp.js → TasksListPage-C1bT3DT9.js} +2 -2
  162. package/dashboard/dist/assets/{TasksListPage-DVENC9Jp.js.map → TasksListPage-C1bT3DT9.js.map} +1 -1
  163. package/dashboard/dist/assets/{TimeAgo-C9yYnOui.js → TimeAgo-qZxkJ8Am.js} +2 -2
  164. package/dashboard/dist/assets/{TimeAgo-C9yYnOui.js.map → TimeAgo-qZxkJ8Am.js.map} +1 -1
  165. package/dashboard/dist/assets/{TimestampCell-DoB8cYgw.js → TimestampCell-CC3dz6FG.js} +2 -2
  166. package/dashboard/dist/assets/{TimestampCell-DoB8cYgw.js.map → TimestampCell-CC3dz6FG.js.map} +1 -1
  167. package/dashboard/dist/assets/{ToolPill-BUjbC-Tj.js → ToolPill-FOZm67TS.js} +2 -2
  168. package/dashboard/dist/assets/{ToolPill-BUjbC-Tj.js.map → ToolPill-FOZm67TS.js.map} +1 -1
  169. package/dashboard/dist/assets/{ToolTestPanel-CBtsIP8K.js → ToolTestPanel-C3sSQUvw.js} +2 -2
  170. package/dashboard/dist/assets/{ToolTestPanel-CBtsIP8K.js.map → ToolTestPanel-C3sSQUvw.js.map} +1 -1
  171. package/dashboard/dist/assets/{TopicDetailPage-mR4Jaz83.js → TopicDetailPage-ClI0I8Mu.js} +2 -2
  172. package/dashboard/dist/assets/{TopicDetailPage-mR4Jaz83.js.map → TopicDetailPage-ClI0I8Mu.js.map} +1 -1
  173. package/dashboard/dist/assets/{TopicsPage-CP7HFxIC.js → TopicsPage-CNf2VZud.js} +2 -2
  174. package/dashboard/dist/assets/{TopicsPage-CP7HFxIC.js.map → TopicsPage-CNf2VZud.js.map} +1 -1
  175. package/dashboard/dist/assets/{UserName-BnLF6yhz.js → UserName-BdMHmyL3.js} +2 -2
  176. package/dashboard/dist/assets/{UserName-BnLF6yhz.js.map → UserName-BdMHmyL3.js.map} +1 -1
  177. package/dashboard/dist/assets/{WorkflowExecutionPage-xL956RZi.js → WorkflowExecutionPage-Ba4mYFoW.js} +2 -2
  178. package/dashboard/dist/assets/{WorkflowExecutionPage-xL956RZi.js.map → WorkflowExecutionPage-Ba4mYFoW.js.map} +1 -1
  179. package/dashboard/dist/assets/{WorkflowPill-tXU0-eXu.js → WorkflowPill-C5TEWlfO.js} +2 -2
  180. package/dashboard/dist/assets/{WorkflowPill-tXU0-eXu.js.map → WorkflowPill-C5TEWlfO.js.map} +1 -1
  181. package/dashboard/dist/assets/{WorkflowsDashboard-B-u7zFKM.js → WorkflowsDashboard-ImEm16tX.js} +2 -2
  182. package/dashboard/dist/assets/{WorkflowsDashboard-B-u7zFKM.js.map → WorkflowsDashboard-ImEm16tX.js.map} +1 -1
  183. package/dashboard/dist/assets/{WorkflowsOverview-CqZVarK-.js → WorkflowsOverview-BpWyV_tj.js} +2 -2
  184. package/dashboard/dist/assets/{WorkflowsOverview-CqZVarK-.js.map → WorkflowsOverview-BpWyV_tj.js.map} +1 -1
  185. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DiFLavW0.js → YamlWorkflowDetailPage-BFBlw1YY.js} +2 -2
  186. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DiFLavW0.js.map → YamlWorkflowDetailPage-BFBlw1YY.js.map} +1 -1
  187. package/dashboard/dist/assets/{YamlWorkflowsPage-BuQM6uZA.js → YamlWorkflowsPage-C9gxapRg.js} +2 -2
  188. package/dashboard/dist/assets/{YamlWorkflowsPage-BuQM6uZA.js.map → YamlWorkflowsPage-C9gxapRg.js.map} +1 -1
  189. package/dashboard/dist/assets/{agents-DU9GPovp.js → agents-BJQtJTiz.js} +2 -2
  190. package/dashboard/dist/assets/{agents-DU9GPovp.js.map → agents-BJQtJTiz.js.map} +1 -1
  191. package/dashboard/dist/assets/{bots-Cy-Hmg7w.js → bots-DDlU1gMy.js} +2 -2
  192. package/dashboard/dist/assets/{bots-Cy-Hmg7w.js.map → bots-DDlU1gMy.js.map} +1 -1
  193. package/dashboard/dist/assets/{capabilities-sSJJqrp-.js → capabilities-qYrUpdid.js} +2 -2
  194. package/dashboard/dist/assets/{capabilities-sSJJqrp-.js.map → capabilities-qYrUpdid.js.map} +1 -1
  195. package/dashboard/dist/assets/{controlplane-TVCjDHQ-.js → controlplane-DnJ1VDTs.js} +2 -2
  196. package/dashboard/dist/assets/{controlplane-TVCjDHQ-.js.map → controlplane-DnJ1VDTs.js.map} +1 -1
  197. package/dashboard/dist/assets/{escalation-columns-BpkjKYGd.js → escalation-columns-BCnVWr_n.js} +2 -2
  198. package/dashboard/dist/assets/{escalation-columns-BpkjKYGd.js.map → escalation-columns-BCnVWr_n.js.map} +1 -1
  199. package/dashboard/dist/assets/{index-Dy-MMYti.js → index-04QQsxMp.js} +2 -2
  200. package/dashboard/dist/assets/{index-Dy-MMYti.js.map → index-04QQsxMp.js.map} +1 -1
  201. package/dashboard/dist/assets/{index-fgBDhnI6.js → index-B5q8ksfv.js} +2 -2
  202. package/dashboard/dist/assets/{index-fgBDhnI6.js.map → index-B5q8ksfv.js.map} +1 -1
  203. package/dashboard/dist/assets/{index-CtwbQ_-m.js → index-BAqQSgxn.js} +2 -2
  204. package/dashboard/dist/assets/{index-CtwbQ_-m.js.map → index-BAqQSgxn.js.map} +1 -1
  205. package/dashboard/dist/assets/{index-DOai950R.js → index-BHbO4F8Z.js} +2 -2
  206. package/dashboard/dist/assets/{index-DOai950R.js.map → index-BHbO4F8Z.js.map} +1 -1
  207. package/dashboard/dist/assets/{index-DTtHNC-D.js → index-BUpB9ezn.js} +2 -2
  208. package/dashboard/dist/assets/{index-DTtHNC-D.js.map → index-BUpB9ezn.js.map} +1 -1
  209. package/dashboard/dist/assets/{index-errgQT5x.js → index-C991QfUN.js} +23 -23
  210. package/dashboard/dist/assets/index-C991QfUN.js.map +1 -0
  211. package/dashboard/dist/assets/{index-7BP6FaCZ.js → index-CFlmubaP.js} +2 -2
  212. package/dashboard/dist/assets/{index-7BP6FaCZ.js.map → index-CFlmubaP.js.map} +1 -1
  213. package/dashboard/dist/assets/{index-BYNN9N1T.js → index-CroJTX8g.js} +2 -2
  214. package/dashboard/dist/assets/{index-BYNN9N1T.js.map → index-CroJTX8g.js.map} +1 -1
  215. package/dashboard/dist/assets/{index-BE0phFw0.js → index-CtAPxA03.js} +2 -2
  216. package/dashboard/dist/assets/{index-BE0phFw0.js.map → index-CtAPxA03.js.map} +1 -1
  217. package/dashboard/dist/assets/{index-CLPVqbVY.js → index-D-5F3Bw-.js} +2 -2
  218. package/dashboard/dist/assets/{index-CLPVqbVY.js.map → index-D-5F3Bw-.js.map} +1 -1
  219. package/dashboard/dist/assets/index-DhRdWzz0.js +6 -0
  220. package/dashboard/dist/assets/index-DhRdWzz0.js.map +1 -0
  221. package/dashboard/dist/assets/{index-DsWnVyVN.js → index-KotwPxGB.js} +2 -2
  222. package/dashboard/dist/assets/{index-DsWnVyVN.js.map → index-KotwPxGB.js.map} +1 -1
  223. package/dashboard/dist/assets/{index-Cfv86_L9.js → index-LiLVAQzB.js} +2 -2
  224. package/dashboard/dist/assets/{index-Cfv86_L9.js.map → index-LiLVAQzB.js.map} +1 -1
  225. package/dashboard/dist/assets/index-cFHoANSG.css +1 -0
  226. package/dashboard/dist/assets/{knowledge-arh4NfmL.js → knowledge-CnMeg8Rw.js} +2 -2
  227. package/dashboard/dist/assets/{knowledge-arh4NfmL.js.map → knowledge-CnMeg8Rw.js.map} +1 -1
  228. package/dashboard/dist/assets/{mcp-QGf5jHCo.js → mcp-CHPSFv7m.js} +2 -2
  229. package/dashboard/dist/assets/{mcp-QGf5jHCo.js.map → mcp-CHPSFv7m.js.map} +1 -1
  230. package/dashboard/dist/assets/{mcp-query-BEJN1nMZ.js → mcp-query-C19EGwdN.js} +2 -2
  231. package/dashboard/dist/assets/{mcp-query-BEJN1nMZ.js.map → mcp-query-C19EGwdN.js.map} +1 -1
  232. package/dashboard/dist/assets/{personas-DYtw1COf.js → personas-Br1Vo2S3.js} +2 -2
  233. package/dashboard/dist/assets/{personas-DYtw1COf.js.map → personas-Br1Vo2S3.js.map} +1 -1
  234. package/dashboard/dist/assets/{pipelines-Byi6PnbE.js → pipelines-QMrFoJZX.js} +2 -2
  235. package/dashboard/dist/assets/{pipelines-Byi6PnbE.js.map → pipelines-QMrFoJZX.js.map} +1 -1
  236. package/dashboard/dist/assets/{tasks-D0SQdENz.js → tasks-Doy_7cGX.js} +2 -2
  237. package/dashboard/dist/assets/{tasks-D0SQdENz.js.map → tasks-Doy_7cGX.js.map} +1 -1
  238. package/dashboard/dist/assets/{topics-DgDv5ZXP.js → topics-BcJS4G09.js} +2 -2
  239. package/dashboard/dist/assets/{topics-DgDv5ZXP.js.map → topics-BcJS4G09.js.map} +1 -1
  240. package/dashboard/dist/assets/{useEventHooks-DZaYzE7s.js → useEventHooks-ldE5o0ok.js} +2 -2
  241. package/dashboard/dist/assets/{useEventHooks-DZaYzE7s.js.map → useEventHooks-ldE5o0ok.js.map} +1 -1
  242. package/dashboard/dist/assets/{useNamespace-C1OqiNXN.js → useNamespace-CCu8fZc6.js} +2 -2
  243. package/dashboard/dist/assets/{useNamespace-C1OqiNXN.js.map → useNamespace-CCu8fZc6.js.map} +1 -1
  244. package/dashboard/dist/assets/{useYamlActivityEvents-CkmXDm-Z.js → useYamlActivityEvents-DDrXwFXX.js} +2 -2
  245. package/dashboard/dist/assets/{useYamlActivityEvents-CkmXDm-Z.js.map → useYamlActivityEvents-DDrXwFXX.js.map} +1 -1
  246. package/dashboard/dist/assets/{users-D4DCFPH1.js → users-BvKhSq1i.js} +2 -2
  247. package/dashboard/dist/assets/{users-D4DCFPH1.js.map → users-BvKhSq1i.js.map} +1 -1
  248. package/dashboard/dist/assets/{vendor-icons-BxuyFxH2.js → vendor-icons-Aw7bzBxa.js} +142 -137
  249. package/dashboard/dist/assets/vendor-icons-Aw7bzBxa.js.map +1 -0
  250. package/dashboard/dist/assets/{workflows-qyc0ku_5.js → workflows-D09ysQF1.js} +2 -2
  251. package/dashboard/dist/assets/{workflows-qyc0ku_5.js.map → workflows-D09ysQF1.js.map} +1 -1
  252. package/dashboard/dist/assets/{yaml-workflows-DWFww9Xn.js → yaml-workflows-BFHrxEl4.js} +2 -2
  253. package/dashboard/dist/assets/{yaml-workflows-DWFww9Xn.js.map → yaml-workflows-BFHrxEl4.js.map} +1 -1
  254. package/dashboard/dist/index.html +3 -3
  255. package/docs/domain-dictionary.md +115 -0
  256. package/docs/events.md +8 -0
  257. package/package.json +1 -1
  258. package/build/system/mcp-servers/admin/ortho.d.ts +0 -10
  259. package/build/system/mcp-servers/admin/ortho.js +0 -242
  260. package/dashboard/dist/assets/AvailableEscalationsPage-CVlG_AVC.js +0 -2
  261. package/dashboard/dist/assets/AvailableEscalationsPage-CVlG_AVC.js.map +0 -1
  262. package/dashboard/dist/assets/CapabilitiesPage-wxmE4917.js +0 -2
  263. package/dashboard/dist/assets/CapabilitiesPage-wxmE4917.js.map +0 -1
  264. package/dashboard/dist/assets/EntityTimelinePanel-DrL86Yrf.js +0 -2
  265. package/dashboard/dist/assets/EntityTimelinePanel-DrL86Yrf.js.map +0 -1
  266. package/dashboard/dist/assets/OperationsPage-i8KcDpKo.js +0 -3
  267. package/dashboard/dist/assets/OperationsPage-i8KcDpKo.js.map +0 -1
  268. package/dashboard/dist/assets/PersonasPage-DSdRb90f.js +0 -2
  269. package/dashboard/dist/assets/PersonasPage-DSdRb90f.js.map +0 -1
  270. package/dashboard/dist/assets/RolesPage-DCnW0VmD.js +0 -2
  271. package/dashboard/dist/assets/RolesPage-DCnW0VmD.js.map +0 -1
  272. package/dashboard/dist/assets/ScanSchemeDetailPage-DyLmCamO.js +0 -2
  273. package/dashboard/dist/assets/ScanSchemeDetailPage-DyLmCamO.js.map +0 -1
  274. package/dashboard/dist/assets/ScanStationPage-DoZccU5B.js +0 -2
  275. package/dashboard/dist/assets/ScanStationPage-DoZccU5B.js.map +0 -1
  276. package/dashboard/dist/assets/index-5TblaCXQ.css +0 -1
  277. package/dashboard/dist/assets/index-B7IaBPBg.js +0 -6
  278. package/dashboard/dist/assets/index-B7IaBPBg.js.map +0 -1
  279. package/dashboard/dist/assets/index-errgQT5x.js.map +0 -1
  280. package/dashboard/dist/assets/vendor-icons-BxuyFxH2.js.map +0 -1
@@ -0,0 +1,14 @@
1
+ import type { DomainDictionary } from '../types';
2
+ import type { LTApiResult } from '../types/sdk';
3
+ /**
4
+ * The domain dictionary — read for everyone authenticated, replaced by admins.
5
+ * GET returns `{ doc, version, updated_at }` or `{ doc: null }` when no
6
+ * dictionary is registered. PUT validates references against the live
7
+ * registries: unknown roles/workflows → 422 with the offending names; facet
8
+ * warnings ride a successful response.
9
+ */
10
+ export declare function getDomain(): Promise<LTApiResult>;
11
+ export declare function putDomain(input: {
12
+ doc: DomainDictionary;
13
+ expected_version?: number;
14
+ }): Promise<LTApiResult>;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getDomain = getDomain;
37
+ exports.putDomain = putDomain;
38
+ const domainService = __importStar(require("../services/domain"));
39
+ /**
40
+ * The domain dictionary — read for everyone authenticated, replaced by admins.
41
+ * GET returns `{ doc, version, updated_at }` or `{ doc: null }` when no
42
+ * dictionary is registered. PUT validates references against the live
43
+ * registries: unknown roles/workflows → 422 with the offending names; facet
44
+ * warnings ride a successful response.
45
+ */
46
+ async function getDomain() {
47
+ try {
48
+ const record = await domainService.getDomainDictionary();
49
+ return { status: 200, data: record ?? { doc: null } };
50
+ }
51
+ catch (err) {
52
+ return { status: 500, error: err.message };
53
+ }
54
+ }
55
+ async function putDomain(input) {
56
+ try {
57
+ if (!input?.doc || typeof input.doc !== 'object') {
58
+ return { status: 400, error: 'body must be { doc, expected_version? }' };
59
+ }
60
+ const result = await domainService.putDomainDictionary(input.doc, input.expected_version);
61
+ if (!result.ok) {
62
+ if (result.reason === 'version_conflict') {
63
+ return { status: 409, error: 'version conflict — reload and retry' };
64
+ }
65
+ return {
66
+ status: 422,
67
+ error: 'dictionary references unknown roles/workflows',
68
+ data: { errors: result.errors, warnings: result.warnings },
69
+ };
70
+ }
71
+ return { status: 200, data: { version: result.version, warnings: result.warnings } };
72
+ }
73
+ catch (err) {
74
+ return { status: 500, error: err.message };
75
+ }
76
+ }
@@ -36,6 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.cancelSingleEscalation = cancelSingleEscalation;
37
37
  exports.bulkCancel = bulkCancel;
38
38
  const escalationService = __importStar(require("../../services/escalation"));
39
+ const role_1 = require("../../services/role");
40
+ const types_1 = require("../../services/role/types");
39
41
  const helpers_1 = require("./helpers");
40
42
  /**
41
43
  * Cancel a single escalation. The caller must hold global escalation access
@@ -60,7 +62,20 @@ async function cancelSingleEscalation(input, auth) {
60
62
  if (!cancelled) {
61
63
  return { status: 409, error: 'Escalation is not cancellable (already terminal)' };
62
64
  }
63
- return { status: 200, data: { cancelled: true, escalationId: id } };
65
+ // Cancel semantics invert by role surface the role's own on_cancel
66
+ // statement (lt_roles.properties, ROLE_PROPERTY_KEYS) so the caller reads
67
+ // the true effect. The bag is open: only a plain string qualifies.
68
+ const properties = await (0, role_1.getRoleProperties)(cancelled.role);
69
+ const onCancel = properties?.[types_1.ROLE_PROPERTY_KEYS.ON_CANCEL];
70
+ return {
71
+ status: 200,
72
+ data: {
73
+ cancelled: true,
74
+ escalationId: id,
75
+ role: cancelled.role,
76
+ ...(typeof onCancel === 'string' && onCancel ? { note: onCancel } : {}),
77
+ },
78
+ };
64
79
  }
65
80
  catch (err) {
66
81
  return { status: 500, error: err.message };
@@ -273,6 +273,9 @@ function publishBulkReassignEvents(beforeRows, targetRole) {
273
273
  escalationId: row.id,
274
274
  role,
275
275
  status: 'pending',
276
+ // Bulk exception to the one-shape convention (see lib/events/escalation-wire.ts):
277
+ // these rows aren't held in full, so we publish the delta + `bulk: true`
278
+ // rather than fetch each row to project. Subscribers fetch by id for detail.
276
279
  data: { from_role: row.role, to_role: targetRole, bulk: true },
277
280
  });
278
281
  }
@@ -303,6 +306,8 @@ function publishBulkClaimEvents(ids, assignedTo, knownRole) {
303
306
  escalationId: id,
304
307
  role: roleById.get(id) ?? '',
305
308
  status: 'claimed',
309
+ // Bulk exception to the one-shape convention (see lib/events/escalation-wire.ts):
310
+ // delta + `bulk: true`, no per-row fetch. Subscribers fetch by id for detail.
306
311
  data: { assigned_to: assignedTo, bulk: true },
307
312
  });
308
313
  }
@@ -0,0 +1,18 @@
1
+ -- Migration 030: The domain dictionary
2
+ --
3
+ -- One row per deployment: the ontology that maps the operation's jargon
4
+ -- ("printer", "reset", "kill the order") onto platform primitives (roles,
5
+ -- queues, workflows, escalations, metadata facets). The doc holds only the
6
+ -- SEMANTIC overlay the live registries can't express — terms, guidance,
7
+ -- runbooks; structural facts (an entity's id facet, a role's title) are
8
+ -- derived from lt_roles / lt_config_workflows at read time.
9
+ --
10
+ -- Seeded insert-if-absent from startConfig.mcp.domainDictionaryPath; edited
11
+ -- live via PUT /api/domain. `version` backs optimistic concurrency on writes.
12
+
13
+ CREATE TABLE IF NOT EXISTS lt_domain (
14
+ id INT PRIMARY KEY DEFAULT 1 CHECK (id = 1),
15
+ doc JSONB NOT NULL,
16
+ version INT NOT NULL DEFAULT 1,
17
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
18
+ );
@@ -0,0 +1,9 @@
1
+ /** Scalar row columns that may ride the wire. Allowlist, not denylist. */
2
+ export declare const WIRE_SAFE_COLUMNS: readonly ["id", "type", "subtype", "description", "status", "priority", "role", "assigned_to", "assigned_until", "workflow_id", "workflow_type", "task_queue", "origin_id", "task_id", "parent_id", "signal_key", "resolved_at", "claimed_at"];
3
+ /** Project a committed escalation row to the wire-safe lifecycle shape. */
4
+ export declare function projectEscalationRow(row: Record<string, any>): Record<string, any>;
5
+ /**
6
+ * Build a lifecycle event's `data`: the row projection plus any verb provenance
7
+ * the row can't express. The single constructor every single-row publisher uses.
8
+ */
9
+ export declare function escalationEventData(row: Record<string, any>, context?: Record<string, any>): Record<string, any>;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WIRE_SAFE_COLUMNS = void 0;
4
+ exports.projectEscalationRow = projectEscalationRow;
5
+ exports.escalationEventData = escalationEventData;
6
+ const types_1 = require("../../types");
7
+ // ---------------------------------------------------------------------------
8
+ // Escalation lifecycle event `data` — the ONE wire shape.
9
+ //
10
+ // CONVENTION (both publisher families converge here):
11
+ // A lifecycle event's `data` is the wire-safe PROJECTION of the escalation
12
+ // row — routing/classification scalars plus the metadata FACETS — and NEVER
13
+ // the heavy/sensitive JSON columns. A subscriber needing the full row fetches
14
+ // it by id through the authenticated read API; the pub channel is a
15
+ // notification surface, not a transport.
16
+ //
17
+ // Dropped from the wire:
18
+ // • envelope / escalation_payload / resolver_payload — workflow envelope,
19
+ // initial payload, resolution content (e.g. mandate detail).
20
+ // • metadata.form_schema — a full JSON Schema some rows embed (tens of KB).
21
+ //
22
+ // Kept: the scalar columns (an allowlist, so a column added later never
23
+ // leaks by default) and every other metadata facet (orderId, serialNumber,
24
+ // entity keys, schema_version, …) — the small categorical surface agent
25
+ // triggers filter/map on and the entity/faceted views route by.
26
+ //
27
+ // Verb provenance the row can't express (cancel reason, released_by,
28
+ // resolved_by, reassignment from/to) rides as named fields ALONGSIDE the
29
+ // projection via `escalationEventData(row, context)`.
30
+ //
31
+ // EXCEPTION — bulk paths. `publishBulk*` operate on many rows they do not hold
32
+ // in full; projecting would cost one fetch per row. They publish the minimal
33
+ // delta plus `bulk: true` and let subscribers fetch by id. This is the only
34
+ // sanctioned divergence, and it is marked.
35
+ //
36
+ // Both the engine-mediated path (lib/events/system-events.ts) and the
37
+ // service-mediated path (services/escalation/crud.ts) build `data` through the
38
+ // helpers below — one definition, no drift.
39
+ // ---------------------------------------------------------------------------
40
+ /** Scalar row columns that may ride the wire. Allowlist, not denylist. */
41
+ exports.WIRE_SAFE_COLUMNS = [
42
+ 'id', 'type', 'subtype', 'description', 'status', 'priority',
43
+ 'role', 'assigned_to', 'assigned_until',
44
+ 'workflow_id', 'workflow_type', 'task_queue',
45
+ 'origin_id', 'task_id', 'parent_id', 'signal_key',
46
+ 'resolved_at', 'claimed_at',
47
+ ];
48
+ /** Project a committed escalation row to the wire-safe lifecycle shape. */
49
+ function projectEscalationRow(row) {
50
+ const out = {};
51
+ for (const key of exports.WIRE_SAFE_COLUMNS) {
52
+ if (row[key] !== undefined)
53
+ out[key] = row[key];
54
+ }
55
+ const metadata = row.metadata;
56
+ if (metadata && typeof metadata === 'object' && !Array.isArray(metadata)) {
57
+ // Keep the routing facets; drop only the heavy embedded resolver form def.
58
+ const { [types_1.ESCALATION_METADATA_KEYS.FORM_SCHEMA]: _omitFormSchema, ...facets } = metadata;
59
+ out.metadata = facets;
60
+ }
61
+ return out;
62
+ }
63
+ /**
64
+ * Build a lifecycle event's `data`: the row projection plus any verb provenance
65
+ * the row can't express. The single constructor every single-row publisher uses.
66
+ */
67
+ function escalationEventData(row, context) {
68
+ return { ...projectEscalationRow(row), ...(context ?? {}) };
69
+ }
@@ -5,6 +5,9 @@ exports.mapSystemEvent = mapSystemEvent;
5
5
  exports.onSystemEvent = onSystemEvent;
6
6
  const index_1 = require("./index");
7
7
  const matching_1 = require("./matching");
8
+ // The ONE wire shape — see escalation-wire.ts for the convention. The engine
9
+ // path emits the projection with no extra verb context.
10
+ const escalation_wire_1 = require("./escalation-wire");
8
11
  /** Verb → long-tail event status, matching the manual publishEscalationEvent convention. */
9
12
  const ESCALATION_STATUS_BY_VERB = {
10
13
  created: 'pending',
@@ -29,10 +32,11 @@ function mapSystemEvent(event) {
29
32
  const row = (event.data ?? {});
30
33
  const verb = segments[3] ?? '';
31
34
  // The SDK forms `system.escalation.{id}.{verb}`; long-tail's canonical
32
- // subject carries the role as the organizing token. The committed row
33
- // rides in `data`, so the role is lifted from it and the subject is
34
- // rewritten to `system.escalation.{role}.{id}.{verb}` — the same shape
35
- // publishEscalationEvent produces for the service-mediated path.
35
+ // subject carries the role as the organizing token. The SDK hands the
36
+ // committed row in `data`; routing fields are lifted from it and the subject
37
+ // is rewritten to `system.escalation.{role}.{id}.{verb}` — the same shape
38
+ // publishEscalationEvent produces for the service-mediated path. The row
39
+ // itself is projected (below) before it rides the wire.
36
40
  const role = row.role || undefined;
37
41
  return {
38
42
  type: `system.escalation.${(0, matching_1.sanitizeSubjectToken)(role)}.${segments[2]}.${verb}`,
@@ -48,7 +52,11 @@ function mapSystemEvent(event) {
48
52
  // not a column). Forward it so a consumer can tell a born-assigned,
49
53
  // system-directed hand-off (`claimed` with true) from an interactive claim.
50
54
  assignedAtCreation: event.assigned_at_creation,
51
- data: row,
55
+ // Routing + facets only — never the heavy/sensitive JSON columns. This
56
+ // converges the engine-mediated path toward the thin shape the service
57
+ // path already publishes; a consumer needing the full row fetches it by
58
+ // id through the authenticated read API.
59
+ data: (0, escalation_wire_1.projectEscalationRow)(row),
52
60
  timestamp: event.ts,
53
61
  };
54
62
  }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Dot-path projection over a JSON value — the token-efficiency primitive for
3
+ * large tool results (workflow exports, execution histories). `pickPaths`
4
+ * returns a new object holding only the requested paths, preserving their
5
+ * nesting; a path that does not resolve is silently omitted. Numeric segments
6
+ * index arrays ("timeline.0.activity").
7
+ */
8
+ /** Resolve one dotted path against a value; undefined when any segment is missing. */
9
+ export declare function resolveJsonPath(value: unknown, path: string): unknown;
10
+ /**
11
+ * Project a value down to the given dot paths. Empty/absent `paths` returns
12
+ * the value unchanged (no projection requested).
13
+ */
14
+ export declare function pickPaths<T>(value: T, paths?: string[]): T | Record<string, any>;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * Dot-path projection over a JSON value — the token-efficiency primitive for
4
+ * large tool results (workflow exports, execution histories). `pickPaths`
5
+ * returns a new object holding only the requested paths, preserving their
6
+ * nesting; a path that does not resolve is silently omitted. Numeric segments
7
+ * index arrays ("timeline.0.activity").
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.resolveJsonPath = resolveJsonPath;
11
+ exports.pickPaths = pickPaths;
12
+ /** Resolve one dotted path against a value; undefined when any segment is missing. */
13
+ function resolveJsonPath(value, path) {
14
+ const segments = path.trim().split('.').filter((s) => s.length > 0);
15
+ let current = value;
16
+ for (const segment of segments) {
17
+ if (current == null || typeof current !== 'object')
18
+ return undefined;
19
+ current = current[segment];
20
+ }
21
+ return current;
22
+ }
23
+ /** Set one dotted path on a target, creating intermediate objects/arrays. */
24
+ function setJsonPath(target, path, value) {
25
+ const segments = path.trim().split('.').filter((s) => s.length > 0);
26
+ let current = target;
27
+ for (let i = 0; i < segments.length - 1; i += 1) {
28
+ const segment = segments[i];
29
+ if (current[segment] == null || typeof current[segment] !== 'object') {
30
+ // A numeric NEXT segment means this level is an array.
31
+ current[segment] = /^\d+$/.test(segments[i + 1]) ? [] : {};
32
+ }
33
+ current = current[segment];
34
+ }
35
+ current[segments[segments.length - 1]] = value;
36
+ }
37
+ /**
38
+ * Project a value down to the given dot paths. Empty/absent `paths` returns
39
+ * the value unchanged (no projection requested).
40
+ */
41
+ function pickPaths(value, paths) {
42
+ if (!paths || paths.length === 0)
43
+ return value;
44
+ const out = {};
45
+ for (const path of paths) {
46
+ const resolved = resolveJsonPath(value, path);
47
+ if (resolved !== undefined)
48
+ setJsonPath(out, path, resolved);
49
+ }
50
+ return out;
51
+ }
@@ -0,0 +1,2 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const express_1 = require("express");
37
+ const auth_1 = require("../modules/auth");
38
+ const api = __importStar(require("../api/domain"));
39
+ const router = (0, express_1.Router)();
40
+ /**
41
+ * GET /api/domain
42
+ * The deployment's domain dictionary: `{ doc, version, updated_at }`, or
43
+ * `{ doc: null }` when none is registered.
44
+ */
45
+ router.get('/', async (_req, res) => {
46
+ const result = await api.getDomain();
47
+ res.status(result.status).json(result.data ?? { error: result.error });
48
+ });
49
+ /**
50
+ * PUT /api/domain
51
+ * Replace the dictionary. Requires admin.
52
+ * Body: { doc: DomainDictionary, expected_version?: number }
53
+ * 422 carries { error, errors[], warnings[] }; 409 on version conflict.
54
+ */
55
+ router.put('/', auth_1.requireAdmin, async (req, res) => {
56
+ const result = await api.putDomain(req.body ?? {});
57
+ const body = result.status < 300
58
+ ? result.data
59
+ : { error: result.error, ...(result.data ?? {}) };
60
+ res.status(result.status).json(body);
61
+ });
62
+ exports.default = router;
@@ -37,6 +37,7 @@ const capabilities_1 = __importDefault(require("./capabilities"));
37
37
  const topics_1 = __importDefault(require("./topics"));
38
38
  const nats_credentials_1 = __importDefault(require("./nats-credentials"));
39
39
  const scan_codes_1 = __importDefault(require("./scan-codes"));
40
+ const domain_1 = __importDefault(require("./domain"));
40
41
  const router = (0, express_1.Router)();
41
42
  // Public routes (no auth required — they handle their own auth)
42
43
  router.use('/auth', auth_2.default);
@@ -74,6 +75,7 @@ router.use('/agents', agents_1.default);
74
75
  router.use('/capabilities', capabilities_1.default);
75
76
  router.use('/topics', topics_1.default);
76
77
  router.use('/scan-codes', scan_codes_1.default);
78
+ router.use('/domain', domain_1.default);
77
79
  const overview_1 = __importDefault(require("./overview"));
78
80
  router.use('/overview', overview_1.default);
79
81
  const diagnostics_1 = __importDefault(require("./diagnostics"));
@@ -39,7 +39,10 @@ router.post('/', auth_1.requireAuth, async (req, res) => {
39
39
  await transport.handleRequest(req, res, req.body);
40
40
  }
41
41
  catch (err) {
42
- logger_1.loggerRegistry.error(`[lt-mcp:endpoint] error: ${err.message}`);
42
+ // Log the full stack, not just the message — otherwise a 500 here is
43
+ // undiagnosable from the deployment logs (the caller only sees a generic
44
+ // "Internal server error").
45
+ logger_1.loggerRegistry.error(`[lt-mcp:endpoint] error: ${err?.stack || err?.message || err}`);
43
46
  if (!res.headersSent) {
44
47
  res.status(500).json({
45
48
  jsonrpc: '2.0',
@@ -0,0 +1,4 @@
1
+ export { getDomainDictionary, getDomainIndex, domainCache, type DomainRecord } from './read';
2
+ export { putDomainDictionary, snapshotRegistries, type PutDictionaryResult } from './write';
3
+ export { seedDomainDictionary } from './seed';
4
+ export { validateDictionary, type RegistrySnapshot, type DictionaryValidation } from './validate';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateDictionary = exports.seedDomainDictionary = exports.snapshotRegistries = exports.putDomainDictionary = exports.domainCache = exports.getDomainIndex = exports.getDomainDictionary = void 0;
4
+ var read_1 = require("./read");
5
+ Object.defineProperty(exports, "getDomainDictionary", { enumerable: true, get: function () { return read_1.getDomainDictionary; } });
6
+ Object.defineProperty(exports, "getDomainIndex", { enumerable: true, get: function () { return read_1.getDomainIndex; } });
7
+ Object.defineProperty(exports, "domainCache", { enumerable: true, get: function () { return read_1.domainCache; } });
8
+ var write_1 = require("./write");
9
+ Object.defineProperty(exports, "putDomainDictionary", { enumerable: true, get: function () { return write_1.putDomainDictionary; } });
10
+ Object.defineProperty(exports, "snapshotRegistries", { enumerable: true, get: function () { return write_1.snapshotRegistries; } });
11
+ var seed_1 = require("./seed");
12
+ Object.defineProperty(exports, "seedDomainDictionary", { enumerable: true, get: function () { return seed_1.seedDomainDictionary; } });
13
+ var validate_1 = require("./validate");
14
+ Object.defineProperty(exports, "validateDictionary", { enumerable: true, get: function () { return validate_1.validateDictionary; } });
@@ -0,0 +1,21 @@
1
+ import type { DomainDictionary, DomainIndex } from '../../types';
2
+ export interface DomainRecord {
3
+ doc: DomainDictionary;
4
+ version: number;
5
+ updated_at: string;
6
+ }
7
+ declare class DomainCache {
8
+ private record;
9
+ private loadedAt;
10
+ private loadPromise;
11
+ get(): Promise<DomainRecord | null>;
12
+ private load;
13
+ /** Force reload on next access. Call after writes. */
14
+ invalidate(): void;
15
+ }
16
+ export declare const domainCache: DomainCache;
17
+ /** The dictionary, or null when none is registered (or the read failed). */
18
+ export declare function getDomainDictionary(): Promise<DomainRecord | null>;
19
+ /** Compact names-only index for the MCP `instructions` string. */
20
+ export declare function getDomainIndex(): Promise<DomainIndex | null>;
21
+ export {};
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.domainCache = void 0;
4
+ exports.getDomainDictionary = getDomainDictionary;
5
+ exports.getDomainIndex = getDomainIndex;
6
+ const db_1 = require("../../lib/db");
7
+ const logger_1 = require("../../lib/logger");
8
+ const defaults_1 = require("../../modules/defaults");
9
+ const sql_1 = require("./sql");
10
+ // ---------------------------------------------------------------------------
11
+ // Read-through TTL cache (same shape as modules/ltconfig.ts): the dictionary
12
+ // rides the MCP `instructions` of every /mcp request, so reads must be
13
+ // in-memory between refreshes and MUST fail soft — a dead DB yields null
14
+ // (no instructions, "no dictionary registered" tool response), never a
15
+ // rejected request. Writes call invalidate(); other containers converge
16
+ // within one TTL window.
17
+ // ---------------------------------------------------------------------------
18
+ class DomainCache {
19
+ constructor() {
20
+ this.record = null;
21
+ this.loadedAt = 0;
22
+ this.loadPromise = null;
23
+ }
24
+ async get() {
25
+ if (this.loadedAt && Date.now() - this.loadedAt < defaults_1.CONFIG_CACHE_TTL_MS) {
26
+ return this.record;
27
+ }
28
+ if (!this.loadPromise) {
29
+ this.loadPromise = this.load().finally(() => {
30
+ this.loadPromise = null;
31
+ });
32
+ }
33
+ return this.loadPromise;
34
+ }
35
+ async load() {
36
+ try {
37
+ const { rows } = await (0, db_1.getPool)().query(sql_1.GET_DOMAIN);
38
+ this.record = rows[0]
39
+ ? { doc: rows[0].doc, version: rows[0].version, updated_at: rows[0].updated_at }
40
+ : null;
41
+ }
42
+ catch (err) {
43
+ logger_1.loggerRegistry.warn(`[lt-domain] dictionary read failed: ${err.message}`);
44
+ this.record = null;
45
+ }
46
+ this.loadedAt = Date.now();
47
+ return this.record;
48
+ }
49
+ /** Force reload on next access. Call after writes. */
50
+ invalidate() {
51
+ this.record = null;
52
+ this.loadedAt = 0;
53
+ this.loadPromise = null;
54
+ }
55
+ }
56
+ exports.domainCache = new DomainCache();
57
+ /** The dictionary, or null when none is registered (or the read failed). */
58
+ async function getDomainDictionary() {
59
+ return exports.domainCache.get();
60
+ }
61
+ /** Compact names-only index for the MCP `instructions` string. */
62
+ async function getDomainIndex() {
63
+ const record = await exports.domainCache.get();
64
+ if (!record)
65
+ return null;
66
+ const { doc } = record;
67
+ const terms = {};
68
+ for (const t of doc.terms ?? []) {
69
+ (terms[t.kind] ??= []).push(t.term);
70
+ }
71
+ return {
72
+ name: doc.name,
73
+ version: doc.version,
74
+ overview: doc.overview,
75
+ terms,
76
+ runbooks: (doc.runbooks ?? []).map((r) => r.name),
77
+ };
78
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Seed the domain dictionary from a host-declared JSON file — the same
3
+ * insert-if-absent + drift-log contract as seedWorkflowConfig/seedMcpServer.
4
+ * The DB row is runtime truth: an existing row is never overwritten; a
5
+ * name/version mismatch against the file logs one drift warning.
6
+ *
7
+ * WARN-ONLY validation: hosts commonly seed roles after long-tail boots, so
8
+ * unknown references log warnings here (the PUT path enforces them hard).
9
+ * Never throws — a missing or malformed file must not brick boot.
10
+ */
11
+ export declare function seedDomainDictionary(dictionaryPath: string): Promise<void>;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.seedDomainDictionary = seedDomainDictionary;
7
+ const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
9
+ const db_1 = require("../../lib/db");
10
+ const logger_1 = require("../../lib/logger");
11
+ const validate_1 = require("./validate");
12
+ const write_1 = require("./write");
13
+ const read_1 = require("./read");
14
+ const sql_1 = require("./sql");
15
+ /**
16
+ * Seed the domain dictionary from a host-declared JSON file — the same
17
+ * insert-if-absent + drift-log contract as seedWorkflowConfig/seedMcpServer.
18
+ * The DB row is runtime truth: an existing row is never overwritten; a
19
+ * name/version mismatch against the file logs one drift warning.
20
+ *
21
+ * WARN-ONLY validation: hosts commonly seed roles after long-tail boots, so
22
+ * unknown references log warnings here (the PUT path enforces them hard).
23
+ * Never throws — a missing or malformed file must not brick boot.
24
+ */
25
+ async function seedDomainDictionary(dictionaryPath) {
26
+ const resolved = path_1.default.isAbsolute(dictionaryPath)
27
+ ? dictionaryPath
28
+ : path_1.default.join(process.cwd(), dictionaryPath);
29
+ let dictionary;
30
+ try {
31
+ if (!(0, fs_1.existsSync)(resolved)) {
32
+ logger_1.loggerRegistry.warn(`[lt-domain] domainDictionaryPath not found: ${resolved}`);
33
+ return;
34
+ }
35
+ dictionary = JSON.parse((0, fs_1.readFileSync)(resolved, 'utf-8'));
36
+ }
37
+ catch (err) {
38
+ logger_1.loggerRegistry.warn(`[lt-domain] dictionary file unreadable (${resolved}): ${err.message}`);
39
+ return;
40
+ }
41
+ try {
42
+ const registry = await (0, write_1.snapshotRegistries)();
43
+ const { errors, warnings, dictionary: derived } = (0, validate_1.validateDictionary)(dictionary, registry);
44
+ for (const note of [...errors, ...warnings]) {
45
+ logger_1.loggerRegistry.warn(`[lt-domain] dictionary seed: ${note}`);
46
+ }
47
+ const { rows } = await (0, db_1.getPool)().query(sql_1.SEED_DOMAIN, [JSON.stringify(derived)]);
48
+ if (rows.length > 0) {
49
+ read_1.domainCache.invalidate();
50
+ logger_1.loggerRegistry.info(`[lt-domain] dictionary seeded: ${derived.name} v${derived.version} ` +
51
+ `(${derived.terms?.length ?? 0} terms, ${derived.runbooks?.length ?? 0} runbooks)`);
52
+ return;
53
+ }
54
+ // Row already existed — drift check on name/version only (no deep diff).
55
+ const existing = await (0, db_1.getPool)().query(sql_1.GET_DOMAIN);
56
+ const doc = existing.rows[0]?.doc;
57
+ if (doc && (doc.name !== dictionary.name || doc.version !== dictionary.version)) {
58
+ logger_1.loggerRegistry.warn(`[lt-domain] dictionary drift: DB holds "${doc.name}" v${doc.version}, ` +
59
+ `file declares "${dictionary.name}" v${dictionary.version} — DB is runtime truth`);
60
+ }
61
+ }
62
+ catch (err) {
63
+ logger_1.loggerRegistry.warn(`[lt-domain] dictionary seed failed: ${err.message}`);
64
+ }
65
+ }