@hotmeshio/long-tail 0.3.1 → 0.3.3

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 (259) hide show
  1. package/build/api/agents.d.ts +1 -1
  2. package/build/api/agents.js +1 -1
  3. package/build/api/controlplane.d.ts +33 -0
  4. package/build/api/controlplane.js +46 -0
  5. package/build/bin/ltc.js +16 -0
  6. package/build/lib/cli/commands/streams.d.ts +20 -0
  7. package/build/lib/cli/commands/streams.js +134 -0
  8. package/build/lib/db/schemas/001_schema.sql +3 -3
  9. package/build/lib/db/schemas/003_agents.sql +1 -2
  10. package/build/lib/db/schemas/004_agent_subscriptions.sql +1 -1
  11. package/build/lib/db/schemas/006_agent_sub_unique.sql +1 -0
  12. package/build/routes/agents.js +3 -3
  13. package/build/routes/controlplane.js +28 -0
  14. package/build/sdk/index.d.ts +1 -0
  15. package/build/sdk/index.js +1 -0
  16. package/build/services/agent/index.d.ts +2 -3
  17. package/build/services/agent/index.js +5 -12
  18. package/build/services/agent/sql.d.ts +3 -4
  19. package/build/services/agent/sql.js +16 -20
  20. package/build/services/agent/subscription-sql.d.ts +1 -1
  21. package/build/services/agent/subscription-sql.js +1 -1
  22. package/build/services/agent/trigger-registry.js +1 -1
  23. package/build/services/controlplane/index.d.ts +9 -1
  24. package/build/services/controlplane/index.js +39 -0
  25. package/build/services/controlplane/stream-messages-sql.d.ts +21 -0
  26. package/build/services/controlplane/stream-messages-sql.js +109 -0
  27. package/build/services/controlplane/types.d.ts +44 -0
  28. package/build/services/cron/index.js +5 -5
  29. package/build/services/export/post-process.js +14 -6
  30. package/build/services/mcp-runs/execution-builder.js +9 -4
  31. package/build/services/topics/index.js +1 -4
  32. package/build/services/topics/sql.d.ts +2 -2
  33. package/build/services/topics/sql.js +9 -2
  34. package/build/services/topics/system-topics.js +2 -3
  35. package/build/start/workers.js +11 -14
  36. package/build/tsconfig.tsbuildinfo +1 -1
  37. package/build/types/agent.d.ts +1 -1
  38. package/dashboard/dist/assets/{AdminDashboard-CbeSejVX.js → AdminDashboard-BBWJAsjl.js} +2 -2
  39. package/dashboard/dist/assets/{AdminDashboard-CbeSejVX.js.map → AdminDashboard-BBWJAsjl.js.map} +1 -1
  40. package/dashboard/dist/assets/{AgentConfigPage-CFJNOrlg.js → AgentConfigPage-Br2O6NDa.js} +3 -3
  41. package/dashboard/dist/assets/AgentConfigPage-Br2O6NDa.js.map +1 -0
  42. package/dashboard/dist/assets/AgentDetailPage-DjgOR62z.js +4 -0
  43. package/dashboard/dist/assets/AgentDetailPage-DjgOR62z.js.map +1 -0
  44. package/dashboard/dist/assets/AgentsPage-CASVGEvY.js +2 -0
  45. package/dashboard/dist/assets/AgentsPage-CASVGEvY.js.map +1 -0
  46. package/dashboard/dist/assets/AvailableEscalationsPage-Dl9ZmjKA.js +2 -0
  47. package/dashboard/dist/assets/{AvailableEscalationsPage-DdrzePy4.js.map → AvailableEscalationsPage-Dl9ZmjKA.js.map} +1 -1
  48. package/dashboard/dist/assets/{BotPicker-kKBifD1w.js → BotPicker-wEoqL3HR.js} +2 -2
  49. package/dashboard/dist/assets/{BotPicker-kKBifD1w.js.map → BotPicker-wEoqL3HR.js.map} +1 -1
  50. package/dashboard/dist/assets/CapabilitiesPage-DYkx5aa4.js +2 -0
  51. package/dashboard/dist/assets/{CapabilitiesPage-Ch5qY0I7.js.map → CapabilitiesPage-DYkx5aa4.js.map} +1 -1
  52. package/dashboard/dist/assets/{CollapsibleSection-kYTBL7dT.js → CollapsibleSection-DN1aF5HO.js} +2 -2
  53. package/dashboard/dist/assets/{CollapsibleSection-kYTBL7dT.js.map → CollapsibleSection-DN1aF5HO.js.map} +1 -1
  54. package/dashboard/dist/assets/{ConfirmDeleteModal-CcaAapMl.js → ConfirmDeleteModal-v8ufrnX5.js} +2 -2
  55. package/dashboard/dist/assets/{ConfirmDeleteModal-CcaAapMl.js.map → ConfirmDeleteModal-v8ufrnX5.js.map} +1 -1
  56. package/dashboard/dist/assets/{CopyableId-B4CL12pv.js → CopyableId-D94R2n6C.js} +2 -2
  57. package/dashboard/dist/assets/{CopyableId-B4CL12pv.js.map → CopyableId-D94R2n6C.js.map} +1 -1
  58. package/dashboard/dist/assets/{CredentialsPage-D1VAlwid.js → CredentialsPage-CSSjAEx6.js} +2 -2
  59. package/dashboard/dist/assets/{CredentialsPage-D1VAlwid.js.map → CredentialsPage-CSSjAEx6.js.map} +1 -1
  60. package/dashboard/dist/assets/{CronLabel-DRmO5rH0.js → CronLabel-fYpkTnEd.js} +2 -2
  61. package/dashboard/dist/assets/{CronLabel-DRmO5rH0.js.map → CronLabel-fYpkTnEd.js.map} +1 -1
  62. package/dashboard/dist/assets/{CustomDurationPicker-C06QDDir.js → CustomDurationPicker-CSarfbO1.js} +2 -2
  63. package/dashboard/dist/assets/{CustomDurationPicker-C06QDDir.js.map → CustomDurationPicker-CSarfbO1.js.map} +1 -1
  64. package/dashboard/dist/assets/{DataTable-J5R6mepB.js → DataTable-VKt4pvC-.js} +2 -2
  65. package/dashboard/dist/assets/{DataTable-J5R6mepB.js.map → DataTable-VKt4pvC-.js.map} +1 -1
  66. package/dashboard/dist/assets/{DropZone-DwNj3GiG.js → DropZone-Bl4j-AID.js} +2 -2
  67. package/dashboard/dist/assets/{DropZone-DwNj3GiG.js.map → DropZone-Bl4j-AID.js.map} +1 -1
  68. package/dashboard/dist/assets/{ElapsedCell-ChyMzl9n.js → ElapsedCell-Y4UmrII0.js} +2 -2
  69. package/dashboard/dist/assets/{ElapsedCell-ChyMzl9n.js.map → ElapsedCell-Y4UmrII0.js.map} +1 -1
  70. package/dashboard/dist/assets/{EmptyState-BXGvOADa.js → EmptyState-Di6_NfbP.js} +2 -2
  71. package/dashboard/dist/assets/{EmptyState-BXGvOADa.js.map → EmptyState-Di6_NfbP.js.map} +1 -1
  72. package/dashboard/dist/assets/{EscalationsOverview-DM6zmE4g.js → EscalationsOverview-D0Ry84FE.js} +2 -2
  73. package/dashboard/dist/assets/{EscalationsOverview-DM6zmE4g.js.map → EscalationsOverview-D0Ry84FE.js.map} +1 -1
  74. package/dashboard/dist/assets/{EventTable-CvJ98E8s.js → EventTable-BzPleN3Y.js} +2 -2
  75. package/dashboard/dist/assets/{EventTable-CvJ98E8s.js.map → EventTable-BzPleN3Y.js.map} +1 -1
  76. package/dashboard/dist/assets/{EventTopicPill-CB_rIGlL.js → EventTopicPill-DCqcr7N7.js} +2 -2
  77. package/dashboard/dist/assets/{EventTopicPill-CB_rIGlL.js.map → EventTopicPill-DCqcr7N7.js.map} +1 -1
  78. package/dashboard/dist/assets/{FilterBar-Bdssa-Xn.js → FilterBar-BoRQss2J.js} +2 -2
  79. package/dashboard/dist/assets/{FilterBar-Bdssa-Xn.js.map → FilterBar-BoRQss2J.js.map} +1 -1
  80. package/dashboard/dist/assets/HomePage-CGH_dYSo.js +2 -0
  81. package/dashboard/dist/assets/HomePage-CGH_dYSo.js.map +1 -0
  82. package/dashboard/dist/assets/{ListToolbar-jy8NL6ll.js → ListToolbar-BMWttsi2.js} +2 -2
  83. package/dashboard/dist/assets/{ListToolbar-jy8NL6ll.js.map → ListToolbar-BMWttsi2.js.map} +1 -1
  84. package/dashboard/dist/assets/{McpOverview-xkaKuHbX.js → McpOverview-DpC-BbBV.js} +2 -2
  85. package/dashboard/dist/assets/{McpOverview-xkaKuHbX.js.map → McpOverview-DpC-BbBV.js.map} +1 -1
  86. package/dashboard/dist/assets/{McpQueryDetailPage-D5ICn6cR.js → McpQueryDetailPage-CZSzX-cI.js} +2 -2
  87. package/dashboard/dist/assets/{McpQueryDetailPage-D5ICn6cR.js.map → McpQueryDetailPage-CZSzX-cI.js.map} +1 -1
  88. package/dashboard/dist/assets/{McpQueryPage-C46fzfm5.js → McpQueryPage-B4KsvBGo.js} +2 -2
  89. package/dashboard/dist/assets/{McpQueryPage-C46fzfm5.js.map → McpQueryPage-B4KsvBGo.js.map} +1 -1
  90. package/dashboard/dist/assets/{McpRunDetailPage-Znsl4Yc-.js → McpRunDetailPage-_owlNUzp.js} +2 -2
  91. package/dashboard/dist/assets/{McpRunDetailPage-Znsl4Yc-.js.map → McpRunDetailPage-_owlNUzp.js.map} +1 -1
  92. package/dashboard/dist/assets/McpRunsPage-C3A1fU3h.js +2 -0
  93. package/dashboard/dist/assets/McpRunsPage-C3A1fU3h.js.map +1 -0
  94. package/dashboard/dist/assets/{Modal-C6k6_5KB.js → Modal-IsEbA4rW.js} +2 -2
  95. package/dashboard/dist/assets/{Modal-C6k6_5KB.js.map → Modal-IsEbA4rW.js.map} +1 -1
  96. package/dashboard/dist/assets/OperatorDashboard-B8MOtt_p.js +2 -0
  97. package/dashboard/dist/assets/{OperatorDashboard-e5N3_dVl.js.map → OperatorDashboard-B8MOtt_p.js.map} +1 -1
  98. package/dashboard/dist/assets/{PageHeader-COcgWWf-.js → PageHeader-C4DNgZKA.js} +2 -2
  99. package/dashboard/dist/assets/{PageHeader-COcgWWf-.js.map → PageHeader-C4DNgZKA.js.map} +1 -1
  100. package/dashboard/dist/assets/{PageHeaderWithStats-C0PCY3aJ.js → PageHeaderWithStats-Fy6tGBaa.js} +2 -2
  101. package/dashboard/dist/assets/{PageHeaderWithStats-C0PCY3aJ.js.map → PageHeaderWithStats-Fy6tGBaa.js.map} +1 -1
  102. package/dashboard/dist/assets/{PriorityBadge-BQCsYMpM.js → PriorityBadge-kSpsF-Zm.js} +2 -2
  103. package/dashboard/dist/assets/{PriorityBadge-BQCsYMpM.js.map → PriorityBadge-kSpsF-Zm.js.map} +1 -1
  104. package/dashboard/dist/assets/{ProcessDetailPage-C03LOgI0.js → ProcessDetailPage-CZjjs4jE.js} +2 -2
  105. package/dashboard/dist/assets/{ProcessDetailPage-C03LOgI0.js.map → ProcessDetailPage-CZjjs4jE.js.map} +1 -1
  106. package/dashboard/dist/assets/{ProcessesListPage-iyPsmlhm.js → ProcessesListPage-Ds7y71o8.js} +2 -2
  107. package/dashboard/dist/assets/{ProcessesListPage-iyPsmlhm.js.map → ProcessesListPage-Ds7y71o8.js.map} +1 -1
  108. package/dashboard/dist/assets/{RolePill-CHwys1f9.js → RolePill-DmdF9L9Q.js} +2 -2
  109. package/dashboard/dist/assets/{RolePill-CHwys1f9.js.map → RolePill-DmdF9L9Q.js.map} +1 -1
  110. package/dashboard/dist/assets/{RolesPage-Bmc3XaUk.js → RolesPage-CCmK38yn.js} +2 -2
  111. package/dashboard/dist/assets/{RolesPage-Bmc3XaUk.js.map → RolesPage-CCmK38yn.js.map} +1 -1
  112. package/dashboard/dist/assets/{RowActions-Bs4PF-Gd.js → RowActions-uGuPBEWb.js} +2 -2
  113. package/dashboard/dist/assets/{RowActions-Bs4PF-Gd.js.map → RowActions-uGuPBEWb.js.map} +1 -1
  114. package/dashboard/dist/assets/{RunAsSelector-DXzAr2WW.js → RunAsSelector-BsO-uSh9.js} +2 -2
  115. package/dashboard/dist/assets/{RunAsSelector-DXzAr2WW.js.map → RunAsSelector-BsO-uSh9.js.map} +1 -1
  116. package/dashboard/dist/assets/{ServerName-BIdLC1Ay.js → ServerName-BHl8nLOV.js} +2 -2
  117. package/dashboard/dist/assets/{ServerName-BIdLC1Ay.js.map → ServerName-BHl8nLOV.js.map} +1 -1
  118. package/dashboard/dist/assets/{StatCard-OKzRSSx4.js → StatCard-DI4ZQ-Zi.js} +2 -2
  119. package/dashboard/dist/assets/{StatCard-OKzRSSx4.js.map → StatCard-DI4ZQ-Zi.js.map} +1 -1
  120. package/dashboard/dist/assets/{StatusBadge-CQlF46RR.js → StatusBadge-TV20Ulgl.js} +2 -2
  121. package/dashboard/dist/assets/{StatusBadge-CQlF46RR.js.map → StatusBadge-TV20Ulgl.js.map} +1 -1
  122. package/dashboard/dist/assets/{StepIndicator-CP7eycjI.js → StepIndicator-ziIED3Pz.js} +2 -2
  123. package/dashboard/dist/assets/{StepIndicator-CP7eycjI.js.map → StepIndicator-ziIED3Pz.js.map} +1 -1
  124. package/dashboard/dist/assets/{StickyPagination-CGk8VAKt.js → StickyPagination-CXBDS1ka.js} +2 -2
  125. package/dashboard/dist/assets/{StickyPagination-CGk8VAKt.js.map → StickyPagination-CXBDS1ka.js.map} +1 -1
  126. package/dashboard/dist/assets/{SwimlaneTimeline-MEUPc3yJ.js → SwimlaneTimeline-Dc_a4-D5.js} +2 -2
  127. package/dashboard/dist/assets/{SwimlaneTimeline-MEUPc3yJ.js.map → SwimlaneTimeline-Dc_a4-D5.js.map} +1 -1
  128. package/dashboard/dist/assets/{TagInput-BGxXKiWD.js → TagInput-BYEjEPsa.js} +2 -2
  129. package/dashboard/dist/assets/{TagInput-BGxXKiWD.js.map → TagInput-BYEjEPsa.js.map} +1 -1
  130. package/dashboard/dist/assets/{TaskDetailPage-pN5BXzYA.js → TaskDetailPage-Cu0XLEA4.js} +2 -2
  131. package/dashboard/dist/assets/{TaskDetailPage-pN5BXzYA.js.map → TaskDetailPage-Cu0XLEA4.js.map} +1 -1
  132. package/dashboard/dist/assets/{TaskQueuePill-bw8ieKsf.js → TaskQueuePill-yBqQ-piu.js} +2 -2
  133. package/dashboard/dist/assets/{TaskQueuePill-bw8ieKsf.js.map → TaskQueuePill-yBqQ-piu.js.map} +1 -1
  134. package/dashboard/dist/assets/{TasksListPage-D1INzcrA.js → TasksListPage-Dl0quVgM.js} +2 -2
  135. package/dashboard/dist/assets/{TasksListPage-D1INzcrA.js.map → TasksListPage-Dl0quVgM.js.map} +1 -1
  136. package/dashboard/dist/assets/{TimeAgo-CywLVIBA.js → TimeAgo-BAs-HL55.js} +2 -2
  137. package/dashboard/dist/assets/{TimeAgo-CywLVIBA.js.map → TimeAgo-BAs-HL55.js.map} +1 -1
  138. package/dashboard/dist/assets/{TimestampCell-B4Pc6f3A.js → TimestampCell-zFm6ze1U.js} +2 -2
  139. package/dashboard/dist/assets/{TimestampCell-B4Pc6f3A.js.map → TimestampCell-zFm6ze1U.js.map} +1 -1
  140. package/dashboard/dist/assets/ToolPill-DiM3hgAB.js +2 -0
  141. package/dashboard/dist/assets/{ToolPill-DdLN3JOT.js.map → ToolPill-DiM3hgAB.js.map} +1 -1
  142. package/dashboard/dist/assets/{ToolTestPanel-DusbUka5.js → ToolTestPanel-C3vWUW2p.js} +2 -2
  143. package/dashboard/dist/assets/{ToolTestPanel-DusbUka5.js.map → ToolTestPanel-C3vWUW2p.js.map} +1 -1
  144. package/dashboard/dist/assets/TopicDetailPage-wjwRE5eI.js +9 -0
  145. package/dashboard/dist/assets/TopicDetailPage-wjwRE5eI.js.map +1 -0
  146. package/dashboard/dist/assets/{TopicsPage-DbtrnQON.js → TopicsPage-D3AONwHP.js} +2 -2
  147. package/dashboard/dist/assets/{TopicsPage-DbtrnQON.js.map → TopicsPage-D3AONwHP.js.map} +1 -1
  148. package/dashboard/dist/assets/{UserName-CLbusknU.js → UserName-0vrAWvND.js} +2 -2
  149. package/dashboard/dist/assets/{UserName-CLbusknU.js.map → UserName-0vrAWvND.js.map} +1 -1
  150. package/dashboard/dist/assets/{WorkflowExecutionPage-C61R-3Gg.js → WorkflowExecutionPage-CBbWToVN.js} +2 -2
  151. package/dashboard/dist/assets/{WorkflowExecutionPage-C61R-3Gg.js.map → WorkflowExecutionPage-CBbWToVN.js.map} +1 -1
  152. package/dashboard/dist/assets/{WorkflowPill-7vt2F6wR.js → WorkflowPill-C7jE0e1g.js} +2 -2
  153. package/dashboard/dist/assets/{WorkflowPill-7vt2F6wR.js.map → WorkflowPill-C7jE0e1g.js.map} +1 -1
  154. package/dashboard/dist/assets/WorkflowsDashboard-1GVHYLlw.js +2 -0
  155. package/dashboard/dist/assets/{WorkflowsDashboard-BWiUNvyl.js.map → WorkflowsDashboard-1GVHYLlw.js.map} +1 -1
  156. package/dashboard/dist/assets/{WorkflowsOverview-DA2ZOs7D.js → WorkflowsOverview-2POOJzat.js} +2 -2
  157. package/dashboard/dist/assets/{WorkflowsOverview-DA2ZOs7D.js.map → WorkflowsOverview-2POOJzat.js.map} +1 -1
  158. package/dashboard/dist/assets/YamlWorkflowsPage-BcRKxz3P.js +2 -0
  159. package/dashboard/dist/assets/{YamlWorkflowsPage-CLebf2eL.js.map → YamlWorkflowsPage-BcRKxz3P.js.map} +1 -1
  160. package/dashboard/dist/assets/{agents-Dga6NU7U.js → agents-Bd6SNUID.js} +2 -2
  161. package/dashboard/dist/assets/agents-Bd6SNUID.js.map +1 -0
  162. package/dashboard/dist/assets/{bots-CtU4i4OQ.js → bots-DEsg-T8t.js} +2 -2
  163. package/dashboard/dist/assets/{bots-CtU4i4OQ.js.map → bots-DEsg-T8t.js.map} +1 -1
  164. package/dashboard/dist/assets/{controlplane-BVoALhbL.js → controlplane-B3m1kIWb.js} +2 -2
  165. package/dashboard/dist/assets/{controlplane-BVoALhbL.js.map → controlplane-B3m1kIWb.js.map} +1 -1
  166. package/dashboard/dist/assets/{escalation-_N5GfuIi.js → escalation-CJQPC0gm.js} +2 -2
  167. package/dashboard/dist/assets/{escalation-_N5GfuIi.js.map → escalation-CJQPC0gm.js.map} +1 -1
  168. package/dashboard/dist/assets/{escalation-columns-CoTmTpHp.js → escalation-columns-DEE62U3_.js} +2 -2
  169. package/dashboard/dist/assets/{escalation-columns-CoTmTpHp.js.map → escalation-columns-DEE62U3_.js.map} +1 -1
  170. package/dashboard/dist/assets/{helpers-Dz2U3Ctb.js → helpers-BveI_035.js} +2 -2
  171. package/dashboard/dist/assets/{helpers-Dz2U3Ctb.js.map → helpers-BveI_035.js.map} +1 -1
  172. package/dashboard/dist/assets/index-B7zv_NKJ.js +2 -0
  173. package/dashboard/dist/assets/index-B7zv_NKJ.js.map +1 -0
  174. package/dashboard/dist/assets/index-BVVdr9s0.js +2 -0
  175. package/dashboard/dist/assets/{index-6Kd78p_v.js.map → index-BVVdr9s0.js.map} +1 -1
  176. package/dashboard/dist/assets/{index-D_H_Prht.js → index-BXIwxi_u.js} +2 -2
  177. package/dashboard/dist/assets/{index-D_H_Prht.js.map → index-BXIwxi_u.js.map} +1 -1
  178. package/dashboard/dist/assets/{index-B9ealjkt.js → index-CEPo8tn_.js} +2 -2
  179. package/dashboard/dist/assets/{index-B9ealjkt.js.map → index-CEPo8tn_.js.map} +1 -1
  180. package/dashboard/dist/assets/{index-BYwPVJv0.js → index-CTKfvoGj.js} +2 -2
  181. package/dashboard/dist/assets/{index-BYwPVJv0.js.map → index-CTKfvoGj.js.map} +1 -1
  182. package/dashboard/dist/assets/{index-Dpjguclc.js → index-CZVprWC6.js} +2 -2
  183. package/dashboard/dist/assets/{index-Dpjguclc.js.map → index-CZVprWC6.js.map} +1 -1
  184. package/dashboard/dist/assets/{index-CtbG3UN-.js → index-ChNwlMdo.js} +2 -2
  185. package/dashboard/dist/assets/{index-CtbG3UN-.js.map → index-ChNwlMdo.js.map} +1 -1
  186. package/dashboard/dist/assets/{index-QicYdUsl.js → index-Cpq83bZq.js} +2 -2
  187. package/dashboard/dist/assets/{index-QicYdUsl.js.map → index-Cpq83bZq.js.map} +1 -1
  188. package/dashboard/dist/assets/{index-CS61sh5q.js → index-Csts1D-x.js} +2 -2
  189. package/dashboard/dist/assets/{index-CS61sh5q.js.map → index-Csts1D-x.js.map} +1 -1
  190. package/dashboard/dist/assets/{index-dM-OgCY3.js → index-D4v-EUTe.js} +2 -2
  191. package/dashboard/dist/assets/{index-dM-OgCY3.js.map → index-D4v-EUTe.js.map} +1 -1
  192. package/dashboard/dist/assets/{index-DWUunWxh.js → index-DI36hw6W.js} +2 -2
  193. package/dashboard/dist/assets/{index-DWUunWxh.js.map → index-DI36hw6W.js.map} +1 -1
  194. package/dashboard/dist/assets/{index-CCOSf1PY.js → index-MnRuwfHN.js} +59 -59
  195. package/dashboard/dist/assets/index-MnRuwfHN.js.map +1 -0
  196. package/dashboard/dist/assets/index-dp_Q2Hha.css +1 -0
  197. package/dashboard/dist/assets/{index-BWHDW_CF.js → index-wQaJXZYX.js} +2 -2
  198. package/dashboard/dist/assets/{index-BWHDW_CF.js.map → index-wQaJXZYX.js.map} +1 -1
  199. package/dashboard/dist/assets/{knowledge-DJlebU82.js → knowledge-krdvn5bg.js} +2 -2
  200. package/dashboard/dist/assets/{knowledge-DJlebU82.js.map → knowledge-krdvn5bg.js.map} +1 -1
  201. package/dashboard/dist/assets/{mcp-CsLJ5SRm.js → mcp-BTZ2ex4x.js} +2 -2
  202. package/dashboard/dist/assets/{mcp-CsLJ5SRm.js.map → mcp-BTZ2ex4x.js.map} +1 -1
  203. package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js → mcp-query-BzqJu709.js} +2 -2
  204. package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js.map → mcp-query-BzqJu709.js.map} +1 -1
  205. package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js → mcp-runs-BBUaY28a.js} +2 -2
  206. package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js.map → mcp-runs-BBUaY28a.js.map} +1 -1
  207. package/dashboard/dist/assets/{namespaces-iRejH3_A.js → namespaces-DJVfgGst.js} +2 -2
  208. package/dashboard/dist/assets/{namespaces-iRejH3_A.js.map → namespaces-DJVfgGst.js.map} +1 -1
  209. package/dashboard/dist/assets/{roles-3Jm5KtKc.js → roles-DogkRzK2.js} +2 -2
  210. package/dashboard/dist/assets/{roles-3Jm5KtKc.js.map → roles-DogkRzK2.js.map} +1 -1
  211. package/dashboard/dist/assets/{settings-DmN2I-c6.js → settings-D2sLRpie.js} +2 -2
  212. package/dashboard/dist/assets/{settings-DmN2I-c6.js.map → settings-D2sLRpie.js.map} +1 -1
  213. package/dashboard/dist/assets/{tasks-Cc-QoITQ.js → tasks-CIuWkHLG.js} +2 -2
  214. package/dashboard/dist/assets/{tasks-Cc-QoITQ.js.map → tasks-CIuWkHLG.js.map} +1 -1
  215. package/dashboard/dist/assets/{topics-p8anbgi0.js → topics-DxMDwZFs.js} +2 -2
  216. package/dashboard/dist/assets/topics-DxMDwZFs.js.map +1 -0
  217. package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js → useEventHooks-xXspN8_9.js} +2 -2
  218. package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js.map → useEventHooks-xXspN8_9.js.map} +1 -1
  219. package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js → useYamlActivityEvents-2hdnnML7.js} +2 -2
  220. package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js.map → useYamlActivityEvents-2hdnnML7.js.map} +1 -1
  221. package/dashboard/dist/assets/{users-oXOlnold.js → users-DWQ-ojf9.js} +2 -2
  222. package/dashboard/dist/assets/{users-oXOlnold.js.map → users-DWQ-ojf9.js.map} +1 -1
  223. package/dashboard/dist/assets/{vendor-icons-CBOM6Es0.js → vendor-icons-YdqUbzg6.js} +110 -100
  224. package/dashboard/dist/assets/vendor-icons-YdqUbzg6.js.map +1 -0
  225. package/dashboard/dist/assets/{workflows-Yq7cK-vR.js → workflows-BvGU8_fj.js} +2 -2
  226. package/dashboard/dist/assets/{workflows-Yq7cK-vR.js.map → workflows-BvGU8_fj.js.map} +1 -1
  227. package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js → yaml-workflows-DNgb7krQ.js} +2 -2
  228. package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js.map → yaml-workflows-DNgb7krQ.js.map} +1 -1
  229. package/dashboard/dist/index.html +3 -3
  230. package/docs/agents.md +1 -1
  231. package/docs/api/http/agents.md +5 -7
  232. package/docs/api/http/controlplane.md +193 -0
  233. package/docs/api/sdk/agents.md +5 -5
  234. package/docs/api/sdk/controlplane.md +36 -0
  235. package/docs/dashboard.md +13 -0
  236. package/package.json +2 -2
  237. package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js.map +0 -1
  238. package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js +0 -4
  239. package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js.map +0 -1
  240. package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js +0 -2
  241. package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js.map +0 -1
  242. package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +0 -2
  243. package/dashboard/dist/assets/CapabilitiesPage-Ch5qY0I7.js +0 -2
  244. package/dashboard/dist/assets/HomePage-BuZkdXZt.js +0 -2
  245. package/dashboard/dist/assets/HomePage-BuZkdXZt.js.map +0 -1
  246. package/dashboard/dist/assets/McpRunsPage-DT-armx5.js +0 -2
  247. package/dashboard/dist/assets/McpRunsPage-DT-armx5.js.map +0 -1
  248. package/dashboard/dist/assets/OperatorDashboard-e5N3_dVl.js +0 -2
  249. package/dashboard/dist/assets/ToolPill-DdLN3JOT.js +0 -2
  250. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js +0 -9
  251. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js.map +0 -1
  252. package/dashboard/dist/assets/WorkflowsDashboard-BWiUNvyl.js +0 -2
  253. package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +0 -2
  254. package/dashboard/dist/assets/agents-Dga6NU7U.js.map +0 -1
  255. package/dashboard/dist/assets/index-6Kd78p_v.js +0 -2
  256. package/dashboard/dist/assets/index-BIUHY2Jz.css +0 -1
  257. package/dashboard/dist/assets/index-CCOSf1PY.js.map +0 -1
  258. package/dashboard/dist/assets/topics-p8anbgi0.js.map +0 -1
  259. package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +0 -1
@@ -9,7 +9,7 @@ export declare function getAgent(input: {
9
9
  id: string;
10
10
  }): Promise<LTApiResult>;
11
11
  export declare function createAgent(input: {
12
- name: string;
12
+ id: string;
13
13
  [key: string]: any;
14
14
  }, _auth?: LTApiAuth): Promise<LTApiResult>;
15
15
  export declare function updateAgent(input: {
@@ -68,7 +68,7 @@ async function createAgent(input, _auth) {
68
68
  }
69
69
  catch (err) {
70
70
  if (err.code === '23505') {
71
- return { status: 409, error: `Agent "${input.name}" already exists` };
71
+ return { status: 409, error: `Agent "${input.id}" already exists` };
72
72
  }
73
73
  return { status: 500, error: err.message };
74
74
  }
@@ -1,4 +1,5 @@
1
1
  import type { LTApiResult } from '../types/sdk';
2
+ import type { StreamMessageStatus } from '../services/controlplane/types';
2
3
  /**
3
4
  * List all registered application namespaces.
4
5
  *
@@ -66,3 +67,35 @@ export declare function getStreamStats(input: {
66
67
  export declare function subscribeMesh(input: {
67
68
  appId?: string;
68
69
  }): Promise<LTApiResult>;
70
+ /**
71
+ * Browse stream messages across engine and worker streams.
72
+ *
73
+ * Returns paginated, filterable, sortable results from the Postgres
74
+ * engine_streams and worker_streams tables. Messages are schema-isolated
75
+ * by namespace.
76
+ *
77
+ * @param input.namespace — Postgres schema (required, e.g. "durable")
78
+ * @param input.limit — page size (1–100, default 25)
79
+ * @param input.offset — pagination offset (default 0)
80
+ * @param input.sort_by — sort column: created_at, stream_name, priority, id
81
+ * @param input.order — sort direction: asc | desc (default desc)
82
+ * @param input.source — filter by source: engine | worker (default all)
83
+ * @param input.status — filter by status: pending | claimed | processed | dead_lettered
84
+ * @param input.stream_name — partial match on stream name (ILIKE)
85
+ * @param input.msg_type — filter by message type (worker streams only)
86
+ */
87
+ export declare function listStreamMessages(input: {
88
+ namespace: string;
89
+ source: string;
90
+ limit?: number;
91
+ offset?: number;
92
+ sort_by?: string;
93
+ order?: 'asc' | 'desc';
94
+ status?: StreamMessageStatus | null;
95
+ stream_name?: string | null;
96
+ msg_type?: string | null;
97
+ topic?: string | null;
98
+ workflow_name?: string | null;
99
+ jid?: string | null;
100
+ aid?: string | null;
101
+ }): Promise<LTApiResult>;
@@ -38,6 +38,7 @@ exports.rollCall = rollCall;
38
38
  exports.applyThrottle = applyThrottle;
39
39
  exports.getStreamStats = getStreamStats;
40
40
  exports.subscribeMesh = subscribeMesh;
41
+ exports.listStreamMessages = listStreamMessages;
41
42
  const controlplane = __importStar(require("../services/controlplane"));
42
43
  const events_1 = require("../lib/events");
43
44
  /**
@@ -156,3 +157,48 @@ async function subscribeMesh(input) {
156
157
  return { status: 500, error: err.message };
157
158
  }
158
159
  }
160
+ /**
161
+ * Browse stream messages across engine and worker streams.
162
+ *
163
+ * Returns paginated, filterable, sortable results from the Postgres
164
+ * engine_streams and worker_streams tables. Messages are schema-isolated
165
+ * by namespace.
166
+ *
167
+ * @param input.namespace — Postgres schema (required, e.g. "durable")
168
+ * @param input.limit — page size (1–100, default 25)
169
+ * @param input.offset — pagination offset (default 0)
170
+ * @param input.sort_by — sort column: created_at, stream_name, priority, id
171
+ * @param input.order — sort direction: asc | desc (default desc)
172
+ * @param input.source — filter by source: engine | worker (default all)
173
+ * @param input.status — filter by status: pending | claimed | processed | dead_lettered
174
+ * @param input.stream_name — partial match on stream name (ILIKE)
175
+ * @param input.msg_type — filter by message type (worker streams only)
176
+ */
177
+ async function listStreamMessages(input) {
178
+ try {
179
+ if (!input.namespace) {
180
+ return { status: 400, error: 'namespace is required' };
181
+ }
182
+ if (input.source !== 'engine' && input.source !== 'worker') {
183
+ return { status: 400, error: 'source is required (engine or worker)' };
184
+ }
185
+ const result = await controlplane.getStreamMessages(input.namespace, {
186
+ source: input.source,
187
+ limit: input.limit,
188
+ offset: input.offset,
189
+ sort_by: input.sort_by,
190
+ order: input.order,
191
+ status: input.status,
192
+ stream_name: input.stream_name,
193
+ msg_type: input.msg_type,
194
+ topic: input.topic,
195
+ workflow_name: input.workflow_name,
196
+ jid: input.jid,
197
+ aid: input.aid,
198
+ });
199
+ return { status: 200, data: result };
200
+ }
201
+ catch (err) {
202
+ return { status: 500, error: err.message };
203
+ }
204
+ }
package/build/bin/ltc.js CHANGED
@@ -54,6 +54,7 @@ const pip = __importStar(require("../lib/cli/commands/pipelines"));
54
54
  const kb = __importStar(require("../lib/cli/commands/knowledge"));
55
55
  const mcp = __importStar(require("../lib/cli/commands/mcp"));
56
56
  const usr = __importStar(require("../lib/cli/commands/users"));
57
+ const streams = __importStar(require("../lib/cli/commands/streams"));
57
58
  const pkg = require('../package.json');
58
59
  const envPath = path.resolve(process.cwd(), '.env');
59
60
  const envLoaded = fs.existsSync(envPath);
@@ -216,5 +217,20 @@ usrCmd.command('list')
216
217
  usrCmd.command('get <id>')
217
218
  .option('--json', 'JSON output')
218
219
  .action(wrap(usr.getUser));
220
+ // ── Streams ─────────────────────────────────────────────────────────────
221
+ const streamsCmd = commander_1.program.command('streams').description('Browse stream messages (admin)');
222
+ streamsCmd.command('list')
223
+ .requiredOption('-n, --namespace <ns>', 'Schema namespace (e.g. durable)')
224
+ .requiredOption('-s, --source <source>', 'Stream type (engine or worker)')
225
+ .option('--status <status>', 'Filter by status (pending, claimed, processed, dead_lettered)')
226
+ .option('--stream <name>', 'Filter by stream name (partial match)')
227
+ .option('--type <type>', 'Filter by message type (worker only)')
228
+ .option('--limit <n>', 'Max results (default 25)')
229
+ .option('--offset <n>', 'Pagination offset')
230
+ .option('--sort <col>', 'Sort column (created_at, stream_name, priority, id)')
231
+ .option('--order <dir>', 'Sort direction (asc, desc)')
232
+ .option('--json', 'JSON output')
233
+ .option('-q, --quiet', 'IDs only')
234
+ .action(wrap(streams.listMessages));
219
235
  // ── Parse ────────────────────────────────────────────────────────────────
220
236
  commander_1.program.parse();
@@ -0,0 +1,20 @@
1
+ interface ListOptions {
2
+ namespace: string;
3
+ source: string;
4
+ status?: string;
5
+ stream?: string;
6
+ type?: string;
7
+ limit?: string;
8
+ offset?: string;
9
+ sort?: string;
10
+ order?: string;
11
+ json?: boolean;
12
+ quiet?: boolean;
13
+ }
14
+ export declare function listMessages(opts: ListOptions): Promise<void>;
15
+ interface GetOptions {
16
+ namespace: string;
17
+ json?: boolean;
18
+ }
19
+ export declare function getMessage(id: string, opts: GetOptions): Promise<void>;
20
+ export {};
@@ -0,0 +1,134 @@
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.listMessages = listMessages;
7
+ exports.getMessage = getMessage;
8
+ const picocolors_1 = __importDefault(require("picocolors"));
9
+ const client_1 = require("../client");
10
+ const format_1 = require("../format");
11
+ function formatStreamStatus(status) {
12
+ switch (status) {
13
+ case 'pending': return picocolors_1.default.dim(status);
14
+ case 'claimed': return picocolors_1.default.yellow(status);
15
+ case 'processed': return picocolors_1.default.green(status);
16
+ case 'dead_lettered': return picocolors_1.default.red('dead-letter');
17
+ default: return status;
18
+ }
19
+ }
20
+ const COLUMNS = [
21
+ { key: 'id', label: 'ID', width: 8, align: 'right' },
22
+ { key: 'source', label: 'Source', width: 8 },
23
+ { key: 'status', label: 'Status', width: 12, format: formatStreamStatus },
24
+ { key: 'stream_name', label: 'Stream', width: 30, format: (v) => v?.length > 30 ? v.slice(0, 29) + '…' : v },
25
+ { key: 'msg_type', label: 'Type', width: 10, format: (v) => v || '—' },
26
+ { key: 'priority', label: 'Pri', width: 4, align: 'right' },
27
+ { key: 'retry_attempt', label: 'Retry', width: 6, format: (v, row) => row ? `${v}/${row.max_retry_attempts}` : String(v) },
28
+ { key: 'created_at', label: 'Created', width: 12, format: format_1.formatTime },
29
+ ];
30
+ async function listMessages(opts) {
31
+ if (!opts.namespace) {
32
+ console.error(`\n ${picocolors_1.default.red('✗')} --namespace is required\n`);
33
+ process.exit(1);
34
+ }
35
+ if (opts.source !== 'engine' && opts.source !== 'worker') {
36
+ console.error(`\n ${picocolors_1.default.red('✗')} --source is required (engine or worker)\n`);
37
+ process.exit(1);
38
+ }
39
+ const params = new URLSearchParams();
40
+ params.set('namespace', opts.namespace);
41
+ params.set('source', opts.source);
42
+ if (opts.status)
43
+ params.set('status', opts.status);
44
+ if (opts.stream)
45
+ params.set('stream_name', opts.stream);
46
+ if (opts.type)
47
+ params.set('msg_type', opts.type);
48
+ if (opts.limit)
49
+ params.set('limit', opts.limit);
50
+ if (opts.offset)
51
+ params.set('offset', opts.offset);
52
+ if (opts.sort)
53
+ params.set('sort_by', opts.sort);
54
+ if (opts.order)
55
+ params.set('order', opts.order);
56
+ const data = await (0, client_1.apiFetch)(`/controlplane/stream-messages?${params}`);
57
+ if (opts.json) {
58
+ console.log(JSON.stringify(data, null, 2));
59
+ return;
60
+ }
61
+ if (opts.quiet) {
62
+ for (const msg of data.messages || []) {
63
+ console.log(`${msg.source}:${msg.id}`);
64
+ }
65
+ return;
66
+ }
67
+ const messages = data.messages || [];
68
+ const total = data.total ?? messages.length;
69
+ // Build retry column with access to the full row
70
+ const columns = COLUMNS.map((col) => {
71
+ if (col.key === 'retry_attempt') {
72
+ return {
73
+ ...col,
74
+ format: (v) => v, // raw value — formatted in printTable
75
+ };
76
+ }
77
+ return col;
78
+ });
79
+ (0, format_1.output)(data, messages, columns, opts);
80
+ if (!opts.json && !opts.quiet && total > messages.length) {
81
+ const showing = messages.length;
82
+ console.log(` ${picocolors_1.default.dim(`Showing ${showing} of ${total} messages`)}\n`);
83
+ }
84
+ }
85
+ async function getMessage(id, opts) {
86
+ if (!opts.namespace) {
87
+ console.error(`\n ${picocolors_1.default.red('✗')} --namespace is required\n`);
88
+ process.exit(1);
89
+ }
90
+ // Fetch the message by ID — use list with a narrow filter
91
+ const params = new URLSearchParams();
92
+ params.set('namespace', opts.namespace);
93
+ params.set('limit', '1');
94
+ const data = await (0, client_1.apiFetch)(`/controlplane/stream-messages?${params}`);
95
+ const messages = data.messages || [];
96
+ // Find by ID in the results (ID search not directly supported, show the detail)
97
+ if (opts.json) {
98
+ console.log(JSON.stringify(data, null, 2));
99
+ return;
100
+ }
101
+ if (messages.length === 0) {
102
+ console.log(`\n ${picocolors_1.default.dim('No messages found.')}\n`);
103
+ return;
104
+ }
105
+ const msg = messages[0];
106
+ console.log(`\n ${picocolors_1.default.bold('Stream Message')} ${picocolors_1.default.dim(`${msg.source}:${msg.id}`)}`);
107
+ console.log(` Status: ${formatStreamStatus(msg.status)} Source: ${msg.source} Priority: ${msg.priority}`);
108
+ console.log(` Stream: ${msg.stream_name}`);
109
+ if (msg.msg_type)
110
+ console.log(` Type: ${msg.msg_type}`);
111
+ if (msg.workflow_name)
112
+ console.log(` Workflow: ${msg.workflow_name}`);
113
+ if (msg.jid)
114
+ console.log(` Job ID: ${msg.jid}`);
115
+ if (msg.aid)
116
+ console.log(` Activity: ${msg.aid}`);
117
+ console.log(` Created: ${(0, format_1.formatTime)(msg.created_at)}`);
118
+ if (msg.reserved_at)
119
+ console.log(` Reserved: ${(0, format_1.formatTime)(msg.reserved_at)} by ${msg.reserved_by || '—'}`);
120
+ if (msg.expired_at)
121
+ console.log(` Expired: ${(0, format_1.formatTime)(msg.expired_at)}`);
122
+ if (msg.dead_lettered_at)
123
+ console.log(` Dead-lettered: ${(0, format_1.formatTime)(msg.dead_lettered_at)}`);
124
+ console.log(` Retries: ${msg.retry_attempt}/${msg.max_retry_attempts}`);
125
+ try {
126
+ const parsed = JSON.parse(msg.message);
127
+ console.log(`\n ${picocolors_1.default.bold('Payload:')}`);
128
+ console.log(JSON.stringify(parsed, null, 2).split('\n').map((l) => ` ${l}`).join('\n'));
129
+ }
130
+ catch {
131
+ console.log(`\n ${picocolors_1.default.bold('Payload:')} ${msg.message}`);
132
+ }
133
+ console.log();
134
+ }
@@ -92,7 +92,7 @@ CREATE INDEX IF NOT EXISTS idx_lt_users_oauth
92
92
  ON lt_users (oauth_provider, oauth_provider_id)
93
93
  WHERE oauth_provider IS NOT NULL;
94
94
 
95
- CREATE TRIGGER lt_users_updated_at
95
+ CREATE OR REPLACE TRIGGER lt_users_updated_at
96
96
  BEFORE UPDATE ON lt_users
97
97
  FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
98
98
 
@@ -182,7 +182,7 @@ CREATE TABLE IF NOT EXISTS lt_config_workflows (
182
182
  updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
183
183
  );
184
184
 
185
- CREATE TRIGGER lt_config_workflows_updated_at
185
+ CREATE OR REPLACE TRIGGER lt_config_workflows_updated_at
186
186
  BEFORE UPDATE ON lt_config_workflows
187
187
  FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
188
188
 
@@ -463,7 +463,7 @@ CREATE INDEX IF NOT EXISTS idx_lt_knowledge_domain ON lt_knowledge (domain);
463
463
  CREATE INDEX IF NOT EXISTS idx_lt_knowledge_tags ON lt_knowledge USING GIN (tags);
464
464
  CREATE INDEX IF NOT EXISTS idx_lt_knowledge_data ON lt_knowledge USING GIN (data);
465
465
 
466
- CREATE TRIGGER lt_knowledge_updated_at
466
+ CREATE OR REPLACE TRIGGER lt_knowledge_updated_at
467
467
  BEFORE UPDATE ON lt_knowledge
468
468
  FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
469
469
 
@@ -3,8 +3,7 @@
3
3
  -- behaviors, and goals atop existing primitives.
4
4
 
5
5
  CREATE TABLE IF NOT EXISTS lt_agents (
6
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
7
- name TEXT UNIQUE NOT NULL,
6
+ id TEXT PRIMARY KEY,
8
7
  description TEXT,
9
8
  status TEXT NOT NULL DEFAULT 'inactive'
10
9
  CHECK (status IN ('inactive', 'active', 'paused', 'error')),
@@ -3,7 +3,7 @@
3
3
 
4
4
  CREATE TABLE IF NOT EXISTS lt_agent_subscriptions (
5
5
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
6
- agent_id UUID NOT NULL REFERENCES lt_agents(id) ON DELETE CASCADE,
6
+ agent_id TEXT NOT NULL REFERENCES lt_agents(id) ON DELETE CASCADE,
7
7
 
8
8
  -- What to listen for
9
9
  topic TEXT NOT NULL,
@@ -6,4 +6,5 @@ DO $$ BEGIN
6
6
  ADD CONSTRAINT uq_agent_sub_topic UNIQUE (agent_id, topic);
7
7
  EXCEPTION
8
8
  WHEN duplicate_object THEN NULL;
9
+ WHEN duplicate_table THEN NULL;
9
10
  END $$;
@@ -64,9 +64,9 @@ router.get('/:id', async (req, res) => {
64
64
  * Create a new agent.
65
65
  */
66
66
  router.post('/', async (req, res) => {
67
- const { name } = req.body;
68
- if (!name) {
69
- res.status(400).json({ error: 'name is required' });
67
+ const { id } = req.body;
68
+ if (!id) {
69
+ res.status(400).json({ error: 'id is required (kebab-case agent name, e.g. "content-triage")' });
70
70
  return;
71
71
  }
72
72
  const auth = { userId: req.userId, roles: req.roles };
@@ -87,6 +87,34 @@ router.get('/streams', auth_1.requireAdmin, async (req, res) => {
87
87
  });
88
88
  res.status(result.status).json(result.data ?? { error: result.error });
89
89
  });
90
+ /**
91
+ * GET /api/controlplane/stream-messages?namespace=durable&source=worker
92
+ * &limit=25&offset=0&sort_by=created_at&order=desc
93
+ * &status=pending&stream_name=hmsh:durable:w:&msg_type=WORKER
94
+ *
95
+ * Browse stream messages with pagination, filtering, and sorting.
96
+ * Both namespace and source are required — engine and worker streams
97
+ * are separate tables with different schemas.
98
+ * Admin-only.
99
+ */
100
+ router.get('/stream-messages', auth_1.requireAdmin, async (req, res) => {
101
+ const result = await api.listStreamMessages({
102
+ namespace: req.query.namespace,
103
+ source: req.query.source,
104
+ limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
105
+ offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
106
+ sort_by: req.query.sort_by || undefined,
107
+ order: req.query.order || undefined,
108
+ status: req.query.status || undefined,
109
+ stream_name: req.query.stream_name || undefined,
110
+ msg_type: req.query.msg_type || undefined,
111
+ topic: req.query.topic || undefined,
112
+ workflow_name: req.query.workflow_name || undefined,
113
+ jid: req.query.jid || undefined,
114
+ aid: req.query.aid || undefined,
115
+ });
116
+ res.status(result.status).json(result.data ?? { error: result.error });
117
+ });
90
118
  /**
91
119
  * POST /api/controlplane/subscribe
92
120
  * Start the quorum→NATS bridge for an appId.
@@ -287,6 +287,7 @@ export declare function createClient(options?: LTClientOptions): {
287
287
  rollCall: typeof controlplaneApi.rollCall;
288
288
  throttle: typeof controlplaneApi.applyThrottle;
289
289
  getStreamStats: typeof controlplaneApi.getStreamStats;
290
+ listStreamMessages: typeof controlplaneApi.listStreamMessages;
290
291
  subscribe: typeof controlplaneApi.subscribeMesh;
291
292
  };
292
293
  botAccounts: {
@@ -239,6 +239,7 @@ function createClient(options = {}) {
239
239
  rollCall: controlplaneApi.rollCall,
240
240
  throttle: controlplaneApi.applyThrottle,
241
241
  getStreamStats: controlplaneApi.getStreamStats,
242
+ listStreamMessages: controlplaneApi.listStreamMessages,
242
243
  subscribe: controlplaneApi.subscribeMesh,
243
244
  },
244
245
  // ── Bot Accounts ───────────────────────────────────────────────────────
@@ -10,9 +10,8 @@ export declare function listAgents(filters?: ListAgentsFilters): Promise<{
10
10
  total: number;
11
11
  }>;
12
12
  export declare function getAgent(id: string): Promise<LTAgent | null>;
13
- export declare function getAgentByName(name: string): Promise<LTAgent | null>;
14
13
  export declare function createAgent(data: Partial<LTAgent> & {
15
- name: string;
14
+ id: string;
16
15
  }): Promise<LTAgent>;
17
16
  export declare function updateAgent(id: string, data: Partial<LTAgent>): Promise<LTAgent | null>;
18
17
  export declare function deleteAgent(id: string): Promise<boolean>;
@@ -22,7 +21,7 @@ export declare function deleteAgent(id: string): Promise<boolean>;
22
21
  * but do not overwrite.
23
22
  */
24
23
  export declare function seedAgent(data: Partial<LTAgent> & {
25
- name: string;
24
+ id: string;
26
25
  }): Promise<boolean>;
27
26
  /**
28
27
  * Aggregate stats for an agent: knowledge entry count, pending escalation count,
@@ -35,7 +35,6 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.listAgents = listAgents;
37
37
  exports.getAgent = getAgent;
38
- exports.getAgentByName = getAgentByName;
39
38
  exports.createAgent = createAgent;
40
39
  exports.updateAgent = updateAgent;
41
40
  exports.deleteAgent = deleteAgent;
@@ -65,15 +64,10 @@ async function getAgent(id) {
65
64
  const { rows } = await pool.query(sql_1.GET_AGENT, [id]);
66
65
  return rows[0] ?? null;
67
66
  }
68
- async function getAgentByName(name) {
69
- const pool = (0, db_1.getPool)();
70
- const { rows } = await pool.query(sql_1.GET_AGENT_BY_NAME, [name]);
71
- return rows[0] ?? null;
72
- }
73
67
  async function createAgent(data) {
74
68
  const pool = (0, db_1.getPool)();
75
69
  const { rows } = await pool.query(sql_1.INSERT_AGENT, [
76
- data.name,
70
+ data.id,
77
71
  data.description ?? null,
78
72
  data.status ?? 'inactive',
79
73
  data.user_id ?? null,
@@ -94,7 +88,6 @@ async function updateAgent(id, data) {
94
88
  const oldAgent = data.status ? await getAgent(id) : null;
95
89
  const { rows } = await pool.query(sql_1.UPDATE_AGENT, [
96
90
  id,
97
- data.name ?? null,
98
91
  data.description ?? null,
99
92
  data.status ?? null,
100
93
  data.user_id ?? null,
@@ -113,7 +106,7 @@ async function updateAgent(id, data) {
113
106
  (0, publish_1.publishAgentEvent)({
114
107
  type: 'agent.status_changed',
115
108
  agentId: updated.id,
116
- agentName: updated.name,
109
+ agentName: updated.id,
117
110
  status: updated.status,
118
111
  data: { previous: oldAgent.status },
119
112
  });
@@ -141,7 +134,7 @@ async function deleteAgent(id) {
141
134
  async function seedAgent(data) {
142
135
  const pool = (0, db_1.getPool)();
143
136
  const { rowCount } = await pool.query(sql_1.SEED_AGENT, [
144
- data.name,
137
+ data.id,
145
138
  data.description ?? null,
146
139
  data.status ?? 'inactive',
147
140
  data.user_id ?? null,
@@ -156,7 +149,7 @@ async function seedAgent(data) {
156
149
  ]);
157
150
  const inserted = (rowCount ?? 0) > 0;
158
151
  if (!inserted) {
159
- const existing = await getAgentByName(data.name);
152
+ const existing = await getAgent(data.id);
160
153
  if (existing) {
161
154
  const drifts = [];
162
155
  if (data.description && existing.description !== data.description)
@@ -166,7 +159,7 @@ async function seedAgent(data) {
166
159
  if (data.knowledge_domain && existing.knowledge_domain !== data.knowledge_domain)
167
160
  drifts.push('knowledge_domain');
168
161
  if (drifts.length) {
169
- logger_1.loggerRegistry.warn(`[long-tail] agent drift: ${data.name} — ${drifts.join(', ')} differ between code and DB`);
162
+ logger_1.loggerRegistry.warn(`[long-tail] agent drift: ${data.id} — ${drifts.join(', ')} differ between code and DB`);
170
163
  }
171
164
  }
172
165
  }
@@ -1,10 +1,9 @@
1
1
  export declare const LIST_AGENTS = "\n SELECT a.*,\n COALESCE(s.sub_count, 0)::int AS subscription_count,\n s.sub_topics\n FROM lt_agents a\n LEFT JOIN LATERAL (\n SELECT COUNT(*)::int AS sub_count,\n array_agg(topic ORDER BY created_at) AS sub_topics\n FROM lt_agent_subscriptions\n WHERE agent_id = a.id AND enabled = true\n ) s ON true\n WHERE ($1::text IS NULL OR a.status = $1)\n AND ($2::text IS NULL OR a.knowledge_domain = $2)\n ORDER BY a.updated_at DESC\n LIMIT $3 OFFSET $4\n";
2
2
  export declare const COUNT_AGENTS = "\n SELECT COUNT(*)::int AS total FROM lt_agents\n WHERE ($1::text IS NULL OR status = $1)\n AND ($2::text IS NULL OR knowledge_domain = $2)\n";
3
3
  export declare const GET_AGENT = "\n SELECT * FROM lt_agents WHERE id = $1\n";
4
- export declare const GET_AGENT_BY_NAME = "\n SELECT * FROM lt_agents WHERE name = $1\n";
5
- export declare const INSERT_AGENT = "\n INSERT INTO lt_agents (name, description, status, user_id, knowledge_domain,\n capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\n RETURNING *\n";
6
- export declare const UPDATE_AGENT = "\n UPDATE lt_agents SET\n name = COALESCE($2, name),\n description = COALESCE($3, description),\n status = COALESCE($4, status),\n user_id = COALESCE($5, user_id),\n knowledge_domain = COALESCE($6, knowledge_domain),\n capabilities = COALESCE($7, capabilities),\n behaviors = COALESCE($8, behaviors),\n goals = COALESCE($9, goals),\n rules = COALESCE($10, rules),\n workflow_type = COALESCE($11, workflow_type),\n pipeline_id = COALESCE($12, pipeline_id),\n metadata = COALESCE($13, metadata),\n last_run_at = COALESCE($14, last_run_at)\n WHERE id = $1\n RETURNING *\n";
4
+ export declare const INSERT_AGENT = "\n INSERT INTO lt_agents (id, description, status, user_id, knowledge_domain,\n capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\n RETURNING *\n";
5
+ export declare const UPDATE_AGENT = "\n UPDATE lt_agents SET\n description = COALESCE($2, description),\n status = COALESCE($3, status),\n user_id = COALESCE($4, user_id),\n knowledge_domain = COALESCE($5, knowledge_domain),\n capabilities = COALESCE($6, capabilities),\n behaviors = COALESCE($7, behaviors),\n goals = COALESCE($8, goals),\n rules = COALESCE($9, rules),\n workflow_type = COALESCE($10, workflow_type),\n pipeline_id = COALESCE($11, pipeline_id),\n metadata = COALESCE($12, metadata),\n last_run_at = COALESCE($13, last_run_at)\n WHERE id = $1\n RETURNING *\n";
7
6
  export declare const DELETE_AGENT = "\n DELETE FROM lt_agents WHERE id = $1\n";
8
- export declare const SEED_AGENT = "\n INSERT INTO lt_agents (name, description, status, user_id, knowledge_domain,\n capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\n ON CONFLICT (name) DO NOTHING\n";
7
+ export declare const SEED_AGENT = "\n INSERT INTO lt_agents (id, description, status, user_id, knowledge_domain,\n capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\n ON CONFLICT (id) DO NOTHING\n";
9
8
  export declare const KNOWLEDGE_COUNT = "\n SELECT COUNT(*)::int AS count FROM lt_knowledge WHERE domain = $1\n";
10
9
  export declare const ESCALATION_COUNT = "\n SELECT COUNT(*)::int AS count FROM lt_escalations\n WHERE status = 'pending' AND created_by = $1\n";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ESCALATION_COUNT = exports.KNOWLEDGE_COUNT = exports.SEED_AGENT = exports.DELETE_AGENT = exports.UPDATE_AGENT = exports.INSERT_AGENT = exports.GET_AGENT_BY_NAME = exports.GET_AGENT = exports.COUNT_AGENTS = exports.LIST_AGENTS = void 0;
3
+ exports.ESCALATION_COUNT = exports.KNOWLEDGE_COUNT = exports.SEED_AGENT = exports.DELETE_AGENT = exports.UPDATE_AGENT = exports.INSERT_AGENT = exports.GET_AGENT = exports.COUNT_AGENTS = exports.LIST_AGENTS = void 0;
4
4
  exports.LIST_AGENTS = `
5
5
  SELECT a.*,
6
6
  COALESCE(s.sub_count, 0)::int AS subscription_count,
@@ -25,30 +25,26 @@ exports.COUNT_AGENTS = `
25
25
  exports.GET_AGENT = `
26
26
  SELECT * FROM lt_agents WHERE id = $1
27
27
  `;
28
- exports.GET_AGENT_BY_NAME = `
29
- SELECT * FROM lt_agents WHERE name = $1
30
- `;
31
28
  exports.INSERT_AGENT = `
32
- INSERT INTO lt_agents (name, description, status, user_id, knowledge_domain,
29
+ INSERT INTO lt_agents (id, description, status, user_id, knowledge_domain,
33
30
  capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)
34
31
  VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
35
32
  RETURNING *
36
33
  `;
37
34
  exports.UPDATE_AGENT = `
38
35
  UPDATE lt_agents SET
39
- name = COALESCE($2, name),
40
- description = COALESCE($3, description),
41
- status = COALESCE($4, status),
42
- user_id = COALESCE($5, user_id),
43
- knowledge_domain = COALESCE($6, knowledge_domain),
44
- capabilities = COALESCE($7, capabilities),
45
- behaviors = COALESCE($8, behaviors),
46
- goals = COALESCE($9, goals),
47
- rules = COALESCE($10, rules),
48
- workflow_type = COALESCE($11, workflow_type),
49
- pipeline_id = COALESCE($12, pipeline_id),
50
- metadata = COALESCE($13, metadata),
51
- last_run_at = COALESCE($14, last_run_at)
36
+ description = COALESCE($2, description),
37
+ status = COALESCE($3, status),
38
+ user_id = COALESCE($4, user_id),
39
+ knowledge_domain = COALESCE($5, knowledge_domain),
40
+ capabilities = COALESCE($6, capabilities),
41
+ behaviors = COALESCE($7, behaviors),
42
+ goals = COALESCE($8, goals),
43
+ rules = COALESCE($9, rules),
44
+ workflow_type = COALESCE($10, workflow_type),
45
+ pipeline_id = COALESCE($11, pipeline_id),
46
+ metadata = COALESCE($12, metadata),
47
+ last_run_at = COALESCE($13, last_run_at)
52
48
  WHERE id = $1
53
49
  RETURNING *
54
50
  `;
@@ -56,10 +52,10 @@ exports.DELETE_AGENT = `
56
52
  DELETE FROM lt_agents WHERE id = $1
57
53
  `;
58
54
  exports.SEED_AGENT = `
59
- INSERT INTO lt_agents (name, description, status, user_id, knowledge_domain,
55
+ INSERT INTO lt_agents (id, description, status, user_id, knowledge_domain,
60
56
  capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)
61
57
  VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
62
- ON CONFLICT (name) DO NOTHING
58
+ ON CONFLICT (id) DO NOTHING
63
59
  `;
64
60
  exports.KNOWLEDGE_COUNT = `
65
61
  SELECT COUNT(*)::int AS count FROM lt_knowledge WHERE domain = $1
@@ -4,4 +4,4 @@ export declare const INSERT_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptio
4
4
  export declare const UPDATE_SUBSCRIPTION = "\n UPDATE lt_agent_subscriptions SET\n topic = COALESCE($2, topic),\n filter = COALESCE($3, filter),\n reaction_type = COALESCE($4, reaction_type),\n workflow_type = COALESCE($5, workflow_type),\n pipeline_id = COALESCE($6, pipeline_id),\n mcp_prompt = COALESCE($7, mcp_prompt),\n input_mapping = COALESCE($8, input_mapping),\n execute_as = COALESCE($9, execute_as),\n enabled = COALESCE($10, enabled)\n WHERE id = $1\n RETURNING *\n";
5
5
  export declare const DELETE_SUBSCRIPTION = "\n DELETE FROM lt_agent_subscriptions WHERE id = $1\n";
6
6
  export declare const SEED_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptions\n (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,\n input_mapping, execute_as, enabled)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true)\n ON CONFLICT (agent_id, topic) DO NOTHING\n";
7
- export declare const LIST_ACTIVE_SUBSCRIPTIONS = "\n SELECT s.*, a.name AS agent_name, a.user_id AS agent_user_id\n FROM lt_agent_subscriptions s\n JOIN lt_agents a ON s.agent_id = a.id\n WHERE s.enabled = true AND a.status = 'active'\n ORDER BY s.created_at\n";
7
+ export declare const LIST_ACTIVE_SUBSCRIPTIONS = "\n SELECT s.*, a.id AS agent_name, a.user_id AS agent_user_id\n FROM lt_agent_subscriptions s\n JOIN lt_agents a ON s.agent_id = a.id\n WHERE s.enabled = true AND a.status = 'active'\n ORDER BY s.created_at\n";
@@ -41,7 +41,7 @@ exports.SEED_SUBSCRIPTION = `
41
41
  ON CONFLICT (agent_id, topic) DO NOTHING
42
42
  `;
43
43
  exports.LIST_ACTIVE_SUBSCRIPTIONS = `
44
- SELECT s.*, a.name AS agent_name, a.user_id AS agent_user_id
44
+ SELECT s.*, a.id AS agent_name, a.user_id AS agent_user_id
45
45
  FROM lt_agent_subscriptions s
46
46
  JOIN lt_agents a ON s.agent_id = a.id
47
47
  WHERE s.enabled = true AND a.status = 'active'
@@ -188,7 +188,7 @@ class AgentTriggerRegistry {
188
188
  .update(`${event.timestamp}:${event.type}:${JSON.stringify(event.data ?? {})}`)
189
189
  .digest('hex')
190
190
  .slice(0, 12);
191
- return `agent-${sub.agent_id.slice(0, 8)}-${sub.id.slice(0, 8)}-${uniquePart}`;
191
+ return `agent-${sub.agent_id}-${sub.id.slice(0, 8)}-${uniquePart}`;
192
192
  }
193
193
  async executeReaction(sub, mapped, deterministicId) {
194
194
  switch (sub.reaction_type) {