@hotmeshio/long-tail 0.1.14 → 0.1.16

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 (360) hide show
  1. package/README.md +15 -0
  2. package/build/api/escalations/bulk.d.ts +78 -0
  3. package/build/api/escalations/bulk.js +279 -0
  4. package/build/api/escalations/claim.d.ts +30 -0
  5. package/build/api/escalations/claim.js +121 -0
  6. package/build/api/escalations/create.d.ts +29 -0
  7. package/build/api/escalations/create.js +101 -0
  8. package/build/api/escalations/helpers.d.ts +10 -0
  9. package/build/api/escalations/helpers.js +80 -0
  10. package/build/api/escalations/index.d.ts +6 -0
  11. package/build/api/escalations/index.js +26 -0
  12. package/build/api/escalations/list.d.ts +75 -0
  13. package/build/api/escalations/list.js +170 -0
  14. package/build/api/escalations/resolve.d.ts +18 -0
  15. package/build/api/escalations/resolve.js +243 -0
  16. package/build/api/escalations/single.d.ts +37 -0
  17. package/build/api/escalations/single.js +123 -0
  18. package/build/api/files.d.ts +3 -0
  19. package/build/api/files.js +18 -1
  20. package/build/api/knowledge.d.ts +36 -0
  21. package/build/api/knowledge.js +112 -0
  22. package/build/api/mcp/index.d.ts +2 -0
  23. package/build/api/mcp/index.js +16 -0
  24. package/build/api/{mcp.d.ts → mcp/servers.d.ts} +1 -33
  25. package/build/api/{mcp.js → mcp/servers.js} +4 -65
  26. package/build/api/mcp/tools.d.ts +33 -0
  27. package/build/api/mcp/tools.js +64 -0
  28. package/build/api/settings.js +6 -1
  29. package/build/api/workflows/config.d.ts +64 -0
  30. package/build/api/workflows/config.js +142 -0
  31. package/build/api/workflows/discovery.d.ts +29 -0
  32. package/build/api/workflows/discovery.js +153 -0
  33. package/build/api/workflows/index.d.ts +3 -0
  34. package/build/api/workflows/index.js +18 -0
  35. package/build/api/workflows/invocation.d.ts +67 -0
  36. package/build/api/workflows/invocation.js +188 -0
  37. package/build/api/yaml-workflows/cron.d.ts +39 -0
  38. package/build/api/yaml-workflows/cron.js +127 -0
  39. package/build/api/{yaml-workflows.d.ts → yaml-workflows/crud.d.ts} +22 -146
  40. package/build/api/{yaml-workflows.js → yaml-workflows/crud.js} +99 -380
  41. package/build/api/yaml-workflows/deploy.d.ts +71 -0
  42. package/build/api/yaml-workflows/deploy.js +223 -0
  43. package/build/api/yaml-workflows/helpers.d.ts +2 -0
  44. package/build/api/yaml-workflows/helpers.js +8 -0
  45. package/build/api/yaml-workflows/index.d.ts +4 -0
  46. package/build/api/yaml-workflows/index.js +27 -0
  47. package/build/api/yaml-workflows/versions.d.ts +43 -0
  48. package/build/api/yaml-workflows/versions.js +124 -0
  49. package/build/bin/ltc.d.ts +2 -0
  50. package/build/bin/ltc.js +220 -0
  51. package/build/examples/seed-data.d.ts +55 -0
  52. package/build/examples/seed-data.js +161 -0
  53. package/build/examples/seed.js +7 -164
  54. package/build/index.d.ts +1 -1
  55. package/build/lib/cli/auth.d.ts +23 -0
  56. package/build/lib/cli/auth.js +167 -0
  57. package/build/lib/cli/client.d.ts +6 -0
  58. package/build/lib/cli/client.js +31 -0
  59. package/build/lib/cli/commands/escalations.d.ts +19 -0
  60. package/build/lib/cli/commands/escalations.js +69 -0
  61. package/build/lib/cli/commands/knowledge.d.ts +18 -0
  62. package/build/lib/cli/commands/knowledge.js +87 -0
  63. package/build/lib/cli/commands/mcp.d.ts +8 -0
  64. package/build/lib/cli/commands/mcp.js +33 -0
  65. package/build/lib/cli/commands/pipelines.d.ts +16 -0
  66. package/build/lib/cli/commands/pipelines.js +67 -0
  67. package/build/lib/cli/commands/status.d.ts +1 -0
  68. package/build/lib/cli/commands/status.js +28 -0
  69. package/build/lib/cli/commands/users.d.ts +7 -0
  70. package/build/lib/cli/commands/users.js +25 -0
  71. package/build/lib/cli/commands/workflows.d.ts +16 -0
  72. package/build/lib/cli/commands/workflows.js +104 -0
  73. package/build/lib/cli/compile.d.ts +2 -0
  74. package/build/lib/cli/compile.js +165 -0
  75. package/build/lib/cli/format.d.ts +23 -0
  76. package/build/lib/cli/format.js +94 -0
  77. package/build/lib/cli/init.d.ts +1 -0
  78. package/build/lib/cli/init.js +61 -0
  79. package/build/lib/cli/output.d.ts +27 -0
  80. package/build/lib/cli/output.js +126 -0
  81. package/build/lib/cli/scanner.d.ts +10 -0
  82. package/build/lib/cli/scanner.js +164 -0
  83. package/build/lib/cli/types.d.ts +16 -0
  84. package/build/lib/cli/types.js +2 -0
  85. package/build/lib/db/schemas/schemas/001_schema.sql +485 -0
  86. package/build/lib/db/schemas/schemas/002_seed.sql +92 -0
  87. package/build/lib/events/socketio.d.ts +12 -0
  88. package/build/lib/events/socketio.js +24 -1
  89. package/build/lib/logger/index.d.ts +0 -9
  90. package/build/lib/logger/index.js +9 -4
  91. package/build/lib/storage/index.js +2 -2
  92. package/build/routes/file-browser.js +14 -0
  93. package/build/routes/index.js +4 -0
  94. package/build/routes/knowledge.d.ts +2 -0
  95. package/build/routes/knowledge.js +141 -0
  96. package/build/routes/nats-credentials.d.ts +2 -0
  97. package/build/routes/nats-credentials.js +22 -0
  98. package/build/routes/yaml-workflows/crud.js +9 -0
  99. package/build/sdk/index.d.ts +17 -0
  100. package/build/sdk/index.js +19 -0
  101. package/build/services/mcp/client/connection-dispatch.d.ts +18 -0
  102. package/build/services/mcp/client/connection-dispatch.js +78 -0
  103. package/build/services/mcp/client/connection-lifecycle.d.ts +48 -0
  104. package/build/services/mcp/client/connection-lifecycle.js +296 -0
  105. package/build/services/mcp/client/connection-test.d.ts +10 -0
  106. package/build/services/mcp/client/connection-test.js +49 -0
  107. package/build/services/mcp/client/connection.d.ts +3 -68
  108. package/build/services/mcp/client/connection.js +15 -393
  109. package/build/services/mcp/server-lifecycle.d.ts +27 -0
  110. package/build/services/mcp/server-lifecycle.js +49 -0
  111. package/build/services/mcp/server-tools.d.ts +13 -0
  112. package/build/services/mcp/server-tools.js +287 -0
  113. package/build/services/mcp/server.d.ts +2 -26
  114. package/build/services/mcp/server.js +7 -315
  115. package/build/services/yaml-workflow/builder-regenerate.d.ts +25 -0
  116. package/build/services/yaml-workflow/builder-regenerate.js +111 -0
  117. package/build/services/yaml-workflow/db-versions.d.ts +17 -0
  118. package/build/services/yaml-workflow/db-versions.js +76 -0
  119. package/build/services/yaml-workflow/db.d.ts +3 -13
  120. package/build/services/yaml-workflow/db.js +15 -71
  121. package/build/services/yaml-workflow/deployer-helpers.js +48 -17
  122. package/build/services/yaml-workflow/durable-compiler/index.d.ts +22 -0
  123. package/build/services/yaml-workflow/durable-compiler/index.js +168 -0
  124. package/build/services/yaml-workflow/durable-compiler/parser.d.ts +12 -0
  125. package/build/services/yaml-workflow/durable-compiler/parser.js +110 -0
  126. package/build/services/yaml-workflow/durable-compiler/prompts.d.ts +18 -0
  127. package/build/services/yaml-workflow/durable-compiler/prompts.js +570 -0
  128. package/build/services/yaml-workflow/durable-compiler/types.d.ts +51 -0
  129. package/build/services/yaml-workflow/durable-compiler/types.js +5 -0
  130. package/build/services/yaml-workflow/pipeline/build/dag-assembly.d.ts +17 -0
  131. package/build/services/yaml-workflow/pipeline/build/dag-assembly.js +192 -0
  132. package/build/services/yaml-workflow/pipeline/build/dag.d.ts +4 -13
  133. package/build/services/yaml-workflow/pipeline/build/dag.js +9 -185
  134. package/build/services/yaml-workflow/pipeline/prompt-templates.d.ts +10 -0
  135. package/build/services/yaml-workflow/pipeline/prompt-templates.js +270 -0
  136. package/build/services/yaml-workflow/pipeline/prompts.d.ts +3 -6
  137. package/build/services/yaml-workflow/pipeline/prompts.js +8 -263
  138. package/build/services/yaml-workflow/workers/register.js +4 -2
  139. package/build/start/adapters.js +4 -1
  140. package/build/start/socket-auth.d.ts +13 -0
  141. package/build/start/socket-auth.js +32 -0
  142. package/build/start/workers.js +6 -5
  143. package/build/system/activities/file-storage.d.ts +4 -0
  144. package/build/system/activities/file-storage.js +7 -1
  145. package/build/system/activities/knowledge.d.ts +23 -0
  146. package/build/system/activities/knowledge.js +50 -10
  147. package/build/system/activities/sql.d.ts +3 -0
  148. package/build/system/activities/sql.js +25 -1
  149. package/build/system/mcp-servers/file-storage.js +3 -1
  150. package/build/system/mcp-servers/human-queue-schemas.d.ts +91 -0
  151. package/build/system/mcp-servers/human-queue-schemas.js +42 -0
  152. package/build/system/mcp-servers/human-queue.d.ts +2 -6
  153. package/build/system/mcp-servers/human-queue.js +9 -51
  154. package/build/system/mcp-servers/knowledge.js +43 -9
  155. package/build/system/mcp-servers/workflow-compiler.js +54 -0
  156. package/build/system/workflows/mcp-triage/activities-proxy.d.ts +21 -0
  157. package/build/system/workflows/mcp-triage/activities-proxy.js +70 -0
  158. package/build/system/workflows/mcp-triage/index.js +17 -75
  159. package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +1 -0
  160. package/build/system/workflows/mcp-workflow-planner/activities/persist.js +1 -0
  161. package/build/system/workflows/mcp-workflow-planner/index.js +2 -0
  162. package/build/tsconfig.tsbuildinfo +1 -1
  163. package/dashboard/dist/assets/{AdminDashboard-Cngijp4Q.js → AdminDashboard-Bprul9Eb.js} +2 -2
  164. package/dashboard/dist/assets/{AdminDashboard-Cngijp4Q.js.map → AdminDashboard-Bprul9Eb.js.map} +1 -1
  165. package/dashboard/dist/assets/AvailableEscalationsPage-H_z5mC10.js +2 -0
  166. package/dashboard/dist/assets/AvailableEscalationsPage-H_z5mC10.js.map +1 -0
  167. package/dashboard/dist/assets/{BotPicker-B8Uvw9Si.js → BotPicker-DcvILNUf.js} +2 -2
  168. package/dashboard/dist/assets/{BotPicker-B8Uvw9Si.js.map → BotPicker-DcvILNUf.js.map} +1 -1
  169. package/dashboard/dist/assets/{CollapsibleSection-DiFPuWOY.js → CollapsibleSection-BWPbzgEe.js} +2 -2
  170. package/dashboard/dist/assets/{CollapsibleSection-DiFPuWOY.js.map → CollapsibleSection-BWPbzgEe.js.map} +1 -1
  171. package/dashboard/dist/assets/{ConfirmDeleteModal-CpXG9uyu.js → ConfirmDeleteModal-Cy6KVLfC.js} +2 -2
  172. package/dashboard/dist/assets/{ConfirmDeleteModal-CpXG9uyu.js.map → ConfirmDeleteModal-Cy6KVLfC.js.map} +1 -1
  173. package/dashboard/dist/assets/{CopyableId-DKsTR9lK.js → CopyableId-CRED8hvk.js} +2 -2
  174. package/dashboard/dist/assets/{CopyableId-DKsTR9lK.js.map → CopyableId-CRED8hvk.js.map} +1 -1
  175. package/dashboard/dist/assets/{CredentialsPage-DlS7Kf40.js → CredentialsPage-BUdvxiE3.js} +2 -2
  176. package/dashboard/dist/assets/{CredentialsPage-DlS7Kf40.js.map → CredentialsPage-BUdvxiE3.js.map} +1 -1
  177. package/dashboard/dist/assets/{CustomDurationPicker-B-9eW3pm.js → CustomDurationPicker-eOk2EqQ5.js} +2 -2
  178. package/dashboard/dist/assets/{CustomDurationPicker-B-9eW3pm.js.map → CustomDurationPicker-eOk2EqQ5.js.map} +1 -1
  179. package/dashboard/dist/assets/{DataTable-DkOokbtL.js → DataTable-bd2PTBJd.js} +2 -2
  180. package/dashboard/dist/assets/{DataTable-DkOokbtL.js.map → DataTable-bd2PTBJd.js.map} +1 -1
  181. package/dashboard/dist/assets/{ElapsedCell-DVtHqM-5.js → ElapsedCell-BGo8vyus.js} +2 -2
  182. package/dashboard/dist/assets/{ElapsedCell-DVtHqM-5.js.map → ElapsedCell-BGo8vyus.js.map} +1 -1
  183. package/dashboard/dist/assets/{EmptyState-C7KIMIbE.js → EmptyState-BygtU-Rh.js} +2 -2
  184. package/dashboard/dist/assets/{EmptyState-C7KIMIbE.js.map → EmptyState-BygtU-Rh.js.map} +1 -1
  185. package/dashboard/dist/assets/{EscalationsOverview-BMKBlkPx.js → EscalationsOverview-DUEcN5MP.js} +2 -2
  186. package/dashboard/dist/assets/{EscalationsOverview-BMKBlkPx.js.map → EscalationsOverview-DUEcN5MP.js.map} +1 -1
  187. package/dashboard/dist/assets/{EventTable-BYZ5OVdQ.js → EventTable-CmFhswLW.js} +2 -2
  188. package/dashboard/dist/assets/{EventTable-BYZ5OVdQ.js.map → EventTable-CmFhswLW.js.map} +1 -1
  189. package/dashboard/dist/assets/{FilterBar-C5r3n6YO.js → FilterBar-BQNzsd3A.js} +2 -2
  190. package/dashboard/dist/assets/{FilterBar-C5r3n6YO.js.map → FilterBar-BQNzsd3A.js.map} +1 -1
  191. package/dashboard/dist/assets/{ListToolbar-BGUajIsW.js → ListToolbar-OWOn-HiC.js} +2 -2
  192. package/dashboard/dist/assets/{ListToolbar-BGUajIsW.js.map → ListToolbar-OWOn-HiC.js.map} +1 -1
  193. package/dashboard/dist/assets/{McpOverview-B_kJYHea.js → McpOverview-OkEzvClD.js} +2 -2
  194. package/dashboard/dist/assets/{McpOverview-B_kJYHea.js.map → McpOverview-OkEzvClD.js.map} +1 -1
  195. package/dashboard/dist/assets/McpQueryDetailPage-C6Ih5sC_.js +5 -0
  196. package/dashboard/dist/assets/McpQueryDetailPage-C6Ih5sC_.js.map +1 -0
  197. package/dashboard/dist/assets/{McpQueryPage-BgAq_bQg.js → McpQueryPage-BAuOf5TL.js} +2 -2
  198. package/dashboard/dist/assets/{McpQueryPage-BgAq_bQg.js.map → McpQueryPage-BAuOf5TL.js.map} +1 -1
  199. package/dashboard/dist/assets/{McpRunDetailPage-B8c0OszR.js → McpRunDetailPage-DMeiG4i_.js} +2 -2
  200. package/dashboard/dist/assets/{McpRunDetailPage-B8c0OszR.js.map → McpRunDetailPage-DMeiG4i_.js.map} +1 -1
  201. package/dashboard/dist/assets/{McpRunsPage-BY8C6k78.js → McpRunsPage-CG3cNJh8.js} +2 -2
  202. package/dashboard/dist/assets/{McpRunsPage-BY8C6k78.js.map → McpRunsPage-CG3cNJh8.js.map} +1 -1
  203. package/dashboard/dist/assets/{Modal-E1yRnCeW.js → Modal-Dir9Rlnx.js} +2 -2
  204. package/dashboard/dist/assets/{Modal-E1yRnCeW.js.map → Modal-Dir9Rlnx.js.map} +1 -1
  205. package/dashboard/dist/assets/{OperatorDashboard-C8MSTzey.js → OperatorDashboard-OqWC6Azy.js} +2 -2
  206. package/dashboard/dist/assets/{OperatorDashboard-C8MSTzey.js.map → OperatorDashboard-OqWC6Azy.js.map} +1 -1
  207. package/dashboard/dist/assets/{PageHeader-Cm5HBQF_.js → PageHeader-FJIemmrC.js} +2 -2
  208. package/dashboard/dist/assets/{PageHeader-Cm5HBQF_.js.map → PageHeader-FJIemmrC.js.map} +1 -1
  209. package/dashboard/dist/assets/{PageHeaderWithStats-CNmWJFSN.js → PageHeaderWithStats-Br5y9qNO.js} +2 -2
  210. package/dashboard/dist/assets/{PageHeaderWithStats-CNmWJFSN.js.map → PageHeaderWithStats-Br5y9qNO.js.map} +1 -1
  211. package/dashboard/dist/assets/{PriorityBadge-HSI4RVhs.js → PriorityBadge-C7D5d_HY.js} +2 -2
  212. package/dashboard/dist/assets/{PriorityBadge-HSI4RVhs.js.map → PriorityBadge-C7D5d_HY.js.map} +1 -1
  213. package/dashboard/dist/assets/{ProcessDetailPage-Dln8622H.js → ProcessDetailPage-DZIP6grw.js} +2 -2
  214. package/dashboard/dist/assets/{ProcessDetailPage-Dln8622H.js.map → ProcessDetailPage-DZIP6grw.js.map} +1 -1
  215. package/dashboard/dist/assets/{ProcessesListPage-bIsd9N_h.js → ProcessesListPage-BQoPYkeB.js} +2 -2
  216. package/dashboard/dist/assets/{ProcessesListPage-bIsd9N_h.js.map → ProcessesListPage-BQoPYkeB.js.map} +1 -1
  217. package/dashboard/dist/assets/{RolePill-BVUp2bF0.js → RolePill-D6nMxMvp.js} +2 -2
  218. package/dashboard/dist/assets/{RolePill-BVUp2bF0.js.map → RolePill-D6nMxMvp.js.map} +1 -1
  219. package/dashboard/dist/assets/RolesPage-CwLnJFhy.js +2 -0
  220. package/dashboard/dist/assets/{RolesPage-kH-Njt25.js.map → RolesPage-CwLnJFhy.js.map} +1 -1
  221. package/dashboard/dist/assets/{RowActions-DbUJPfaW.js → RowActions-JqgAB0p3.js} +2 -2
  222. package/dashboard/dist/assets/{RowActions-DbUJPfaW.js.map → RowActions-JqgAB0p3.js.map} +1 -1
  223. package/dashboard/dist/assets/RunAsSelector-KAlKtitB.js +2 -0
  224. package/dashboard/dist/assets/RunAsSelector-KAlKtitB.js.map +1 -0
  225. package/dashboard/dist/assets/{StatCard-Bs3JbyAz.js → StatCard-B-WLhOaH.js} +2 -2
  226. package/dashboard/dist/assets/{StatCard-Bs3JbyAz.js.map → StatCard-B-WLhOaH.js.map} +1 -1
  227. package/dashboard/dist/assets/{StatusBadge-CakDdsCw.js → StatusBadge-DVCf2ncM.js} +2 -2
  228. package/dashboard/dist/assets/{StatusBadge-CakDdsCw.js.map → StatusBadge-DVCf2ncM.js.map} +1 -1
  229. package/dashboard/dist/assets/{StepIndicator-Cd_SG_yA.js → StepIndicator-D9Xvdf18.js} +2 -2
  230. package/dashboard/dist/assets/{StepIndicator-Cd_SG_yA.js.map → StepIndicator-D9Xvdf18.js.map} +1 -1
  231. package/dashboard/dist/assets/{StickyPagination-Bz0C18nC.js → StickyPagination-CJHMzYJj.js} +2 -2
  232. package/dashboard/dist/assets/{StickyPagination-Bz0C18nC.js.map → StickyPagination-CJHMzYJj.js.map} +1 -1
  233. package/dashboard/dist/assets/SwimlaneTimeline-YiXPDyEL.js +2 -0
  234. package/dashboard/dist/assets/SwimlaneTimeline-YiXPDyEL.js.map +1 -0
  235. package/dashboard/dist/assets/{TagInput-ClFhXG-U.js → TagInput-DcPnUnSJ.js} +2 -2
  236. package/dashboard/dist/assets/{TagInput-ClFhXG-U.js.map → TagInput-DcPnUnSJ.js.map} +1 -1
  237. package/dashboard/dist/assets/{TaskDetailPage-SuMBdARt.js → TaskDetailPage-DftmYWD7.js} +2 -2
  238. package/dashboard/dist/assets/{TaskDetailPage-SuMBdARt.js.map → TaskDetailPage-DftmYWD7.js.map} +1 -1
  239. package/dashboard/dist/assets/{TaskQueuePill-lJR1JW_W.js → TaskQueuePill-BzduBqwy.js} +2 -2
  240. package/dashboard/dist/assets/{TaskQueuePill-lJR1JW_W.js.map → TaskQueuePill-BzduBqwy.js.map} +1 -1
  241. package/dashboard/dist/assets/{TasksListPage-Dkq1Vtbt.js → TasksListPage-DeewV4Gp.js} +2 -2
  242. package/dashboard/dist/assets/{TasksListPage-Dkq1Vtbt.js.map → TasksListPage-DeewV4Gp.js.map} +1 -1
  243. package/dashboard/dist/assets/{TimeAgo-DgfDZ1pl.js → TimeAgo-DJZq-e4R.js} +2 -2
  244. package/dashboard/dist/assets/{TimeAgo-DgfDZ1pl.js.map → TimeAgo-DJZq-e4R.js.map} +1 -1
  245. package/dashboard/dist/assets/{TimestampCell-MpHZ1hMD.js → TimestampCell-Dx5uwGfS.js} +2 -2
  246. package/dashboard/dist/assets/{TimestampCell-MpHZ1hMD.js.map → TimestampCell-Dx5uwGfS.js.map} +1 -1
  247. package/dashboard/dist/assets/{UserName-DqsosA4B.js → UserName-CnGk7MgL.js} +2 -2
  248. package/dashboard/dist/assets/{UserName-DqsosA4B.js.map → UserName-CnGk7MgL.js.map} +1 -1
  249. package/dashboard/dist/assets/{WorkflowExecutionPage-CVlg38C3.js → WorkflowExecutionPage-CPQ0fIwf.js} +2 -2
  250. package/dashboard/dist/assets/{WorkflowExecutionPage-CVlg38C3.js.map → WorkflowExecutionPage-CPQ0fIwf.js.map} +1 -1
  251. package/dashboard/dist/assets/{WorkflowPill-CRpZhjGR.js → WorkflowPill-BrD5d1AG.js} +2 -2
  252. package/dashboard/dist/assets/{WorkflowPill-CRpZhjGR.js.map → WorkflowPill-BrD5d1AG.js.map} +1 -1
  253. package/dashboard/dist/assets/{WorkflowsDashboard-Ugzbs8mV.js → WorkflowsDashboard-BzjhABZP.js} +2 -2
  254. package/dashboard/dist/assets/{WorkflowsDashboard-Ugzbs8mV.js.map → WorkflowsDashboard-BzjhABZP.js.map} +1 -1
  255. package/dashboard/dist/assets/{WorkflowsOverview-CIp_lTNl.js → WorkflowsOverview-lBp2E6rN.js} +2 -2
  256. package/dashboard/dist/assets/{WorkflowsOverview-CIp_lTNl.js.map → WorkflowsOverview-lBp2E6rN.js.map} +1 -1
  257. package/dashboard/dist/assets/YamlWorkflowsPage-C_MkAp2i.js +2 -0
  258. package/dashboard/dist/assets/YamlWorkflowsPage-C_MkAp2i.js.map +1 -0
  259. package/dashboard/dist/assets/{bots-DPfUpVqI.js → bots-fc_O_YIq.js} +2 -2
  260. package/dashboard/dist/assets/{bots-DPfUpVqI.js.map → bots-fc_O_YIq.js.map} +1 -1
  261. package/dashboard/dist/assets/{escalation-RrCDbMC3.js → escalation-BYhLYHBz.js} +2 -2
  262. package/dashboard/dist/assets/{escalation-RrCDbMC3.js.map → escalation-BYhLYHBz.js.map} +1 -1
  263. package/dashboard/dist/assets/{escalation-columns-CDGa9wsD.js → escalation-columns-DjJyuC1g.js} +2 -2
  264. package/dashboard/dist/assets/{escalation-columns-CDGa9wsD.js.map → escalation-columns-DjJyuC1g.js.map} +1 -1
  265. package/dashboard/dist/assets/{helpers-ZSKqdkdS.js → helpers-CQG3Rh2y.js} +2 -2
  266. package/dashboard/dist/assets/{helpers-ZSKqdkdS.js.map → helpers-CQG3Rh2y.js.map} +1 -1
  267. package/dashboard/dist/assets/{index-DX6zxr6t.js → index-2nBhR7Dg.js} +2 -2
  268. package/dashboard/dist/assets/{index-DX6zxr6t.js.map → index-2nBhR7Dg.js.map} +1 -1
  269. package/dashboard/dist/assets/index-4IUoh_hd.js +2 -0
  270. package/dashboard/dist/assets/{index-K40Qw1tk.js.map → index-4IUoh_hd.js.map} +1 -1
  271. package/dashboard/dist/assets/index-B2CqPzLK.js +2 -0
  272. package/dashboard/dist/assets/index-B2CqPzLK.js.map +1 -0
  273. package/dashboard/dist/assets/index-B78xalb4.js +2 -0
  274. package/dashboard/dist/assets/index-B78xalb4.js.map +1 -0
  275. package/dashboard/dist/assets/index-BI8r69O_.js +2 -0
  276. package/dashboard/dist/assets/{index-C90ZPzXk.js.map → index-BI8r69O_.js.map} +1 -1
  277. package/dashboard/dist/assets/index-C5TUqJu0.css +1 -0
  278. package/dashboard/dist/assets/{index-BmVCyB6C.js → index-CUqCBBZG.js} +2 -2
  279. package/dashboard/dist/assets/{index-BmVCyB6C.js.map → index-CUqCBBZG.js.map} +1 -1
  280. package/dashboard/dist/assets/index-D51PaQZY.js +2 -0
  281. package/dashboard/dist/assets/index-D51PaQZY.js.map +1 -0
  282. package/dashboard/dist/assets/{index-BbI2dzhJ.js → index-DNtXXy1o.js} +2 -2
  283. package/dashboard/dist/assets/{index-BbI2dzhJ.js.map → index-DNtXXy1o.js.map} +1 -1
  284. package/dashboard/dist/assets/{index-DNytWfSZ.js → index-DR4qQvlW.js} +2 -2
  285. package/dashboard/dist/assets/{index-DNytWfSZ.js.map → index-DR4qQvlW.js.map} +1 -1
  286. package/dashboard/dist/assets/index-Dh0PCbR-.js +15 -0
  287. package/dashboard/dist/assets/index-Dh0PCbR-.js.map +1 -0
  288. package/dashboard/dist/assets/index-KYpLvJKB.js +5 -0
  289. package/dashboard/dist/assets/index-KYpLvJKB.js.map +1 -0
  290. package/dashboard/dist/assets/{index-Cmgrk7PQ.js → index-sNrqYt0Q.js} +73 -73
  291. package/dashboard/dist/assets/index-sNrqYt0Q.js.map +1 -0
  292. package/dashboard/dist/assets/{mcp-CNE44TSp.js → mcp-D2XfRh8v.js} +2 -2
  293. package/dashboard/dist/assets/{mcp-CNE44TSp.js.map → mcp-D2XfRh8v.js.map} +1 -1
  294. package/dashboard/dist/assets/{mcp-query-RQX0uN-5.js → mcp-query-CIx_mIC7.js} +2 -2
  295. package/dashboard/dist/assets/{mcp-query-RQX0uN-5.js.map → mcp-query-CIx_mIC7.js.map} +1 -1
  296. package/dashboard/dist/assets/{mcp-runs-0w40bdz-.js → mcp-runs-C9_J4LIH.js} +2 -2
  297. package/dashboard/dist/assets/{mcp-runs-0w40bdz-.js.map → mcp-runs-C9_J4LIH.js.map} +1 -1
  298. package/dashboard/dist/assets/{namespaces-BbmdXuPp.js → namespaces-BwMljx6f.js} +2 -2
  299. package/dashboard/dist/assets/{namespaces-BbmdXuPp.js.map → namespaces-BwMljx6f.js.map} +1 -1
  300. package/dashboard/dist/assets/{roles-DoHYlhWH.js → roles-Bd_sTV6I.js} +2 -2
  301. package/dashboard/dist/assets/{roles-DoHYlhWH.js.map → roles-Bd_sTV6I.js.map} +1 -1
  302. package/dashboard/dist/assets/{settings-BAiJiCHS.js → settings-BCb8eFyA.js} +2 -2
  303. package/dashboard/dist/assets/{settings-BAiJiCHS.js.map → settings-BCb8eFyA.js.map} +1 -1
  304. package/dashboard/dist/assets/{tasks-CvroqHtm.js → tasks-Bq54qGGq.js} +2 -2
  305. package/dashboard/dist/assets/{tasks-CvroqHtm.js.map → tasks-Bq54qGGq.js.map} +1 -1
  306. package/dashboard/dist/assets/useEventHooks-BTbGf536.js +2 -0
  307. package/dashboard/dist/assets/{useEventHooks-BHMbzR_y.js.map → useEventHooks-BTbGf536.js.map} +1 -1
  308. package/dashboard/dist/assets/useYamlActivityEvents-CsYP09W5.js +2 -0
  309. package/dashboard/dist/assets/{useYamlActivityEvents-D56KV14X.js.map → useYamlActivityEvents-CsYP09W5.js.map} +1 -1
  310. package/dashboard/dist/assets/{users-CxIMy_xw.js → users-BTBhafGc.js} +2 -2
  311. package/dashboard/dist/assets/{users-CxIMy_xw.js.map → users-BTBhafGc.js.map} +1 -1
  312. package/dashboard/dist/assets/{vendor-icons-AFGxSeQS.js → vendor-icons-CWl44VA6.js} +77 -77
  313. package/dashboard/dist/assets/vendor-icons-CWl44VA6.js.map +1 -0
  314. package/dashboard/dist/assets/{workflows-yR9yais7.js → workflows-BkzA4ahe.js} +2 -2
  315. package/dashboard/dist/assets/{workflows-yR9yais7.js.map → workflows-BkzA4ahe.js.map} +1 -1
  316. package/dashboard/dist/assets/{yaml-workflows-QVF2MZ0l.js → yaml-workflows-Cs0EYp0F.js} +2 -2
  317. package/dashboard/dist/assets/{yaml-workflows-QVF2MZ0l.js.map → yaml-workflows-Cs0EYp0F.js.map} +1 -1
  318. package/dashboard/dist/index.html +3 -3
  319. package/docs/api/http/file-browser.md +101 -0
  320. package/docs/api/http/knowledge.md +203 -0
  321. package/docs/api/http/settings.md +6 -4
  322. package/docs/api/sdk/files.md +68 -0
  323. package/docs/api/sdk/knowledge.md +126 -0
  324. package/docs/api/sdk/settings.md +3 -2
  325. package/docs/cli.md +171 -0
  326. package/docs/compilation.md +16 -0
  327. package/docs/compiler.md +311 -0
  328. package/docs/events.md +19 -0
  329. package/docs/workflows.md +19 -0
  330. package/package.json +13 -2
  331. package/build/api/escalations.d.ts +0 -271
  332. package/build/api/escalations.js +0 -932
  333. package/build/api/workflows.d.ts +0 -158
  334. package/build/api/workflows.js +0 -414
  335. package/dashboard/dist/assets/AvailableEscalationsPage-CpBfGV1h.js +0 -2
  336. package/dashboard/dist/assets/AvailableEscalationsPage-CpBfGV1h.js.map +0 -1
  337. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js +0 -5
  338. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js.map +0 -1
  339. package/dashboard/dist/assets/RolesPage-kH-Njt25.js +0 -2
  340. package/dashboard/dist/assets/SwimlaneTimeline-Cfe-xQRX.js +0 -2
  341. package/dashboard/dist/assets/SwimlaneTimeline-Cfe-xQRX.js.map +0 -1
  342. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js +0 -2
  343. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js.map +0 -1
  344. package/dashboard/dist/assets/helpers-rMEcLwKs.js +0 -2
  345. package/dashboard/dist/assets/helpers-rMEcLwKs.js.map +0 -1
  346. package/dashboard/dist/assets/index-ABcJHHlN.js +0 -5
  347. package/dashboard/dist/assets/index-ABcJHHlN.js.map +0 -1
  348. package/dashboard/dist/assets/index-B91h_jZ0.js +0 -15
  349. package/dashboard/dist/assets/index-B91h_jZ0.js.map +0 -1
  350. package/dashboard/dist/assets/index-C1E5GTs9.js +0 -2
  351. package/dashboard/dist/assets/index-C1E5GTs9.js.map +0 -1
  352. package/dashboard/dist/assets/index-C90ZPzXk.js +0 -2
  353. package/dashboard/dist/assets/index-Cmgrk7PQ.js.map +0 -1
  354. package/dashboard/dist/assets/index-DeX-ezqf.css +0 -1
  355. package/dashboard/dist/assets/index-K40Qw1tk.js +0 -2
  356. package/dashboard/dist/assets/index-lCyNr5Xk.js +0 -2
  357. package/dashboard/dist/assets/index-lCyNr5Xk.js.map +0 -1
  358. package/dashboard/dist/assets/useEventHooks-BHMbzR_y.js +0 -2
  359. package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js +0 -2
  360. package/dashboard/dist/assets/vendor-icons-AFGxSeQS.js.map +0 -1
package/README.md CHANGED
@@ -70,6 +70,19 @@ export async function analyzeContent(content: string) {
70
70
  }
71
71
  ```
72
72
 
73
+ ## Compile Workflows
74
+
75
+ Write durable workflows in TypeScript. Compile to YAML DAGs that run without replay overhead. `ltc` is the compiler — like `tsc` for workflows.
76
+
77
+ ```bash
78
+ export ANTHROPIC_API_KEY=sk-ant-...
79
+
80
+ npx ltc compile workflows/ # scan and compile all workflow files
81
+ npx ltc compile --dry-run # discover without compiling
82
+ ```
83
+
84
+ The source is the spec. The compiled YAML is the optimized execution. Both live in the repo. See the [Compiler Guide](docs/compiler.md).
85
+
73
86
  ## Certify a Workflow
74
87
 
75
88
  Any durable workflow can be promoted to **certified** through the dashboard or API. A certified workflow gains interceptor guarantees: failures escalate instead of throwing, escalation chains route through roles, and every error is either handled or surfaced. It cannot silently fail.
@@ -243,6 +256,8 @@ All modes share PostgreSQL and scale independently. See [Cloud Deployment](docs/
243
256
  | [Dashboard](docs/dashboard.md) | Navigation, key pages, event feed |
244
257
  | [MCP](docs/mcp.md) | Server registration, tool calls, human queue |
245
258
  | [Compilation](docs/compilation.md) | Dynamic → deterministic pipeline wizard |
259
+ | [Compiler](docs/compiler.md) | `ltc compile` — durable TypeScript to YAML DAGs |
260
+ | [CLI](docs/cli.md) | `ltc` — terminal access to workflows, escalations, knowledge, MCP |
246
261
  | [Escalation Strategies](docs/escalation-strategies.md) | Default, MCP triage, custom handlers |
247
262
  | [SDK](docs/sdk.md) | Embedded usage, `createClient`, event subscriptions |
248
263
  | [Architecture](docs/architecture.md) | Project structure, conventions, discovery |
@@ -0,0 +1,78 @@
1
+ import type { LTApiResult, LTApiAuth } from '../../types/sdk';
2
+ /**
3
+ * Release all escalation claims past their `assigned_until` deadline.
4
+ *
5
+ * Typically called on a maintenance schedule. Returns the count of
6
+ * released claims.
7
+ *
8
+ * @returns `{ status: 200, data: { released: number } }`
9
+ */
10
+ export declare function releaseExpiredClaims(): Promise<LTApiResult>;
11
+ /**
12
+ * Update priority for one or more escalations.
13
+ *
14
+ * @param input.ids — array of escalation UUIDs
15
+ * @param input.priority — new priority (1=critical, 2=high, 3=medium, 4=low)
16
+ * @param auth — authenticated user context (admin or role-holder required)
17
+ * @returns `{ status: 200, data: { updated: number } }`
18
+ */
19
+ export declare function updatePriority(input: {
20
+ ids: string[];
21
+ priority: number;
22
+ }, auth: LTApiAuth): Promise<LTApiResult>;
23
+ /**
24
+ * Claim multiple escalations at once for the authenticated user.
25
+ *
26
+ * @param input.ids — array of escalation UUIDs
27
+ * @param input.durationMinutes — claim duration (default: 30)
28
+ * @param auth — authenticated user context
29
+ * @returns `{ status: 200, data: { claimed, skipped } }`
30
+ */
31
+ export declare function bulkClaim(input: {
32
+ ids: string[];
33
+ durationMinutes?: number;
34
+ }, auth: LTApiAuth): Promise<LTApiResult>;
35
+ /**
36
+ * Assign multiple escalations to a specific user.
37
+ *
38
+ * Non-superadmin callers must verify the target user holds each
39
+ * escalation's role. Publishes claim events for assigned items.
40
+ *
41
+ * @param input.ids — array of escalation UUIDs
42
+ * @param input.targetUserId — user to assign to
43
+ * @param input.durationMinutes — assignment duration (default: 30)
44
+ * @param auth — authenticated user context
45
+ * @returns `{ status: 200, data: { assigned, skipped } }`
46
+ */
47
+ export declare function bulkAssign(input: {
48
+ ids: string[];
49
+ targetUserId: string;
50
+ durationMinutes?: number;
51
+ }, auth: LTApiAuth): Promise<LTApiResult>;
52
+ /**
53
+ * Route multiple escalations to a different role.
54
+ *
55
+ * @param input.ids — array of escalation UUIDs
56
+ * @param input.targetRole — destination role
57
+ * @param auth — authenticated user context
58
+ * @returns `{ status: 200, data: { updated: number } }`
59
+ */
60
+ export declare function bulkEscalate(input: {
61
+ ids: string[];
62
+ targetRole: string;
63
+ }, auth: LTApiAuth): Promise<LTApiResult>;
64
+ /**
65
+ * Trigger AI triage for multiple escalations.
66
+ *
67
+ * Resolves each escalation and starts a triage workflow that uses MCP
68
+ * tools to analyze and potentially auto-resolve the issue.
69
+ *
70
+ * @param input.ids — array of escalation UUIDs
71
+ * @param input.hint — optional natural-language guidance for the triage AI
72
+ * @param auth — authenticated user context
73
+ * @returns `{ status: 200, data: { triaged, workflows } }`
74
+ */
75
+ export declare function bulkTriage(input: {
76
+ ids: string[];
77
+ hint?: string;
78
+ }, auth: LTApiAuth): Promise<LTApiResult>;
@@ -0,0 +1,279 @@
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.releaseExpiredClaims = releaseExpiredClaims;
37
+ exports.updatePriority = updatePriority;
38
+ exports.bulkClaim = bulkClaim;
39
+ exports.bulkAssign = bulkAssign;
40
+ exports.bulkEscalate = bulkEscalate;
41
+ exports.bulkTriage = bulkTriage;
42
+ const escalationService = __importStar(require("../../services/escalation"));
43
+ const userService = __importStar(require("../../services/user"));
44
+ const taskService = __importStar(require("../../services/task"));
45
+ const workers_1 = require("../../workers");
46
+ const defaults_1 = require("../../modules/defaults");
47
+ const helpers_1 = require("./helpers");
48
+ // ── Bulk routes ────────────────────────────────────────────────────────────
49
+ /**
50
+ * Release all escalation claims past their `assigned_until` deadline.
51
+ *
52
+ * Typically called on a maintenance schedule. Returns the count of
53
+ * released claims.
54
+ *
55
+ * @returns `{ status: 200, data: { released: number } }`
56
+ */
57
+ async function releaseExpiredClaims() {
58
+ try {
59
+ const released = await escalationService.releaseExpiredClaims();
60
+ return { status: 200, data: { released } };
61
+ }
62
+ catch (err) {
63
+ return { status: 500, error: err.message };
64
+ }
65
+ }
66
+ /**
67
+ * Update priority for one or more escalations.
68
+ *
69
+ * @param input.ids — array of escalation UUIDs
70
+ * @param input.priority — new priority (1=critical, 2=high, 3=medium, 4=low)
71
+ * @param auth — authenticated user context (admin or role-holder required)
72
+ * @returns `{ status: 200, data: { updated: number } }`
73
+ */
74
+ async function updatePriority(input, auth) {
75
+ try {
76
+ const { ids, priority } = input;
77
+ if (!(0, helpers_1.validateIds)(ids)) {
78
+ return { status: 400, error: 'ids must be a non-empty array' };
79
+ }
80
+ if (![1, 2, 3, 4].includes(priority)) {
81
+ return { status: 400, error: 'priority must be 1, 2, 3, or 4' };
82
+ }
83
+ const perm = await (0, helpers_1.checkBulkPermission)(auth.userId, ids);
84
+ if (!perm.allowed)
85
+ return perm;
86
+ const updated = await escalationService.updateEscalationsPriority(ids, priority);
87
+ return { status: 200, data: { updated } };
88
+ }
89
+ catch (err) {
90
+ return { status: 500, error: err.message };
91
+ }
92
+ }
93
+ /**
94
+ * Claim multiple escalations at once for the authenticated user.
95
+ *
96
+ * @param input.ids — array of escalation UUIDs
97
+ * @param input.durationMinutes — claim duration (default: 30)
98
+ * @param auth — authenticated user context
99
+ * @returns `{ status: 200, data: { claimed, skipped } }`
100
+ */
101
+ async function bulkClaim(input, auth) {
102
+ try {
103
+ const { ids, durationMinutes } = input;
104
+ if (!(0, helpers_1.validateIds)(ids)) {
105
+ return { status: 400, error: 'ids must be a non-empty array' };
106
+ }
107
+ const perm = await (0, helpers_1.checkBulkPermission)(auth.userId, ids);
108
+ if (!perm.allowed)
109
+ return perm;
110
+ const result = await escalationService.bulkClaimEscalations(ids, auth.userId, durationMinutes ?? 30);
111
+ if (result.claimed > 0)
112
+ (0, helpers_1.publishBulkClaimEvents)(ids, auth.userId);
113
+ return { status: 200, data: result };
114
+ }
115
+ catch (err) {
116
+ return { status: 500, error: err.message };
117
+ }
118
+ }
119
+ /**
120
+ * Assign multiple escalations to a specific user.
121
+ *
122
+ * Non-superadmin callers must verify the target user holds each
123
+ * escalation's role. Publishes claim events for assigned items.
124
+ *
125
+ * @param input.ids — array of escalation UUIDs
126
+ * @param input.targetUserId — user to assign to
127
+ * @param input.durationMinutes — assignment duration (default: 30)
128
+ * @param auth — authenticated user context
129
+ * @returns `{ status: 200, data: { assigned, skipped } }`
130
+ */
131
+ async function bulkAssign(input, auth) {
132
+ try {
133
+ const { ids, targetUserId, durationMinutes } = input;
134
+ if (!(0, helpers_1.validateIds)(ids)) {
135
+ return { status: 400, error: 'ids must be a non-empty array' };
136
+ }
137
+ if (!targetUserId || typeof targetUserId !== 'string') {
138
+ return { status: 400, error: 'targetUserId is required' };
139
+ }
140
+ const perm = await (0, helpers_1.checkBulkPermission)(auth.userId, ids);
141
+ if (!perm.allowed)
142
+ return perm;
143
+ // Non-superadmin: target user must hold each escalation's role
144
+ const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
145
+ if (!isSuperAdminUser) {
146
+ const roles = await escalationService.getEscalationRoles(ids);
147
+ for (const role of roles) {
148
+ const targetHasRole = await userService.hasRole(targetUserId, role);
149
+ if (!targetHasRole) {
150
+ return { status: 400, error: `Target user does not hold the "${role}" role` };
151
+ }
152
+ }
153
+ }
154
+ const result = await escalationService.bulkAssignEscalations(ids, targetUserId, durationMinutes ?? 30);
155
+ if (result.assigned > 0)
156
+ (0, helpers_1.publishBulkClaimEvents)(ids, targetUserId);
157
+ return { status: 200, data: result };
158
+ }
159
+ catch (err) {
160
+ return { status: 500, error: err.message };
161
+ }
162
+ }
163
+ /**
164
+ * Route multiple escalations to a different role.
165
+ *
166
+ * @param input.ids — array of escalation UUIDs
167
+ * @param input.targetRole — destination role
168
+ * @param auth — authenticated user context
169
+ * @returns `{ status: 200, data: { updated: number } }`
170
+ */
171
+ async function bulkEscalate(input, auth) {
172
+ try {
173
+ const { ids, targetRole } = input;
174
+ if (!(0, helpers_1.validateIds)(ids)) {
175
+ return { status: 400, error: 'ids must be a non-empty array' };
176
+ }
177
+ if (!targetRole || typeof targetRole !== 'string') {
178
+ return { status: 400, error: 'targetRole is required' };
179
+ }
180
+ const perm = await (0, helpers_1.checkBulkPermission)(auth.userId, ids);
181
+ if (!perm.allowed)
182
+ return perm;
183
+ const updated = await escalationService.bulkEscalateToRole(ids, targetRole);
184
+ return { status: 200, data: { updated } };
185
+ }
186
+ catch (err) {
187
+ return { status: 500, error: err.message };
188
+ }
189
+ }
190
+ /**
191
+ * Trigger AI triage for multiple escalations.
192
+ *
193
+ * Resolves each escalation and starts a triage workflow that uses MCP
194
+ * tools to analyze and potentially auto-resolve the issue.
195
+ *
196
+ * @param input.ids — array of escalation UUIDs
197
+ * @param input.hint — optional natural-language guidance for the triage AI
198
+ * @param auth — authenticated user context
199
+ * @returns `{ status: 200, data: { triaged, workflows } }`
200
+ */
201
+ async function bulkTriage(input, auth) {
202
+ try {
203
+ const { ids, hint } = input;
204
+ if (!(0, helpers_1.validateIds)(ids)) {
205
+ return { status: 400, error: 'ids must be a non-empty array' };
206
+ }
207
+ const perm = await (0, helpers_1.checkBulkPermission)(auth.userId, ids);
208
+ if (!perm.allowed)
209
+ return perm;
210
+ const resolved = await escalationService.bulkResolveForTriage(ids, hint);
211
+ const client = (0, workers_1.createClient)();
212
+ const workflowIds = [];
213
+ for (const escalation of resolved) {
214
+ const triageWorkflowId = await startTriageWorkflow(escalation, hint, auth.userId, client);
215
+ workflowIds.push(triageWorkflowId);
216
+ }
217
+ return { status: 200, data: { triaged: resolved.length, workflows: workflowIds } };
218
+ }
219
+ catch (err) {
220
+ return { status: 500, error: err.message };
221
+ }
222
+ }
223
+ // ── Triage workflow launcher (shared by bulkTriage) ────────────────────────
224
+ async function startTriageWorkflow(escalation, hint, userId, client) {
225
+ let escalationPayload = {};
226
+ if (escalation.escalation_payload) {
227
+ try {
228
+ escalationPayload = JSON.parse(escalation.escalation_payload);
229
+ }
230
+ catch { }
231
+ }
232
+ let envelope = {};
233
+ if (escalation.envelope) {
234
+ try {
235
+ envelope = JSON.parse(escalation.envelope);
236
+ }
237
+ catch { }
238
+ }
239
+ const triageWorkflowId = `triage-${escalation.id}-${Date.now()}`;
240
+ const triageEnvelope = {
241
+ data: {
242
+ escalationId: escalation.id,
243
+ originId: escalation.origin_id ?? undefined,
244
+ originalWorkflowType: escalation.workflow_type,
245
+ originalTaskQueue: escalation.task_queue,
246
+ originalTaskId: escalation.task_id,
247
+ escalationPayload,
248
+ resolverPayload: {
249
+ _lt: { needsTriage: true, ...(hint ? { hint } : {}) },
250
+ },
251
+ },
252
+ metadata: envelope.metadata || {},
253
+ lt: { ...(envelope.lt || {}), userId },
254
+ };
255
+ const routing = escalation.task_id
256
+ ? (await taskService.getTask(escalation.task_id))?.metadata
257
+ : null;
258
+ await taskService.createTask({
259
+ workflow_id: triageWorkflowId,
260
+ workflow_type: 'mcpTriage',
261
+ lt_type: 'mcpTriage',
262
+ task_queue: 'long-tail-system',
263
+ signal_id: `lt-triage-${triageWorkflowId}`,
264
+ parent_workflow_id: routing?.parentWorkflowId || triageWorkflowId,
265
+ origin_id: escalation.origin_id || triageWorkflowId,
266
+ parent_id: escalation.parent_id ?? undefined,
267
+ envelope: JSON.stringify(triageEnvelope),
268
+ metadata: routing || undefined,
269
+ });
270
+ await client.workflow.start({
271
+ workflowName: 'mcpTriage',
272
+ args: [triageEnvelope],
273
+ taskQueue: 'long-tail-system',
274
+ workflowId: triageWorkflowId,
275
+ expire: defaults_1.JOB_EXPIRE_SECS,
276
+ entity: 'mcpTriage',
277
+ });
278
+ return triageWorkflowId;
279
+ }
@@ -0,0 +1,30 @@
1
+ import type { LTApiResult, LTApiAuth } from '../../types/sdk';
2
+ /**
3
+ * Claim a pending escalation for the authenticated user.
4
+ *
5
+ * Sets `assigned_to` and `assigned_until` on the escalation (soft lock).
6
+ * Non-superadmin users must hold the escalation's role. Publishes a
7
+ * `escalation.claimed` event.
8
+ *
9
+ * @param input.id — escalation UUID
10
+ * @param input.durationMinutes — claim duration (default: 30)
11
+ * @param auth — authenticated user context
12
+ * @returns `{ status: 200, data: { escalation, isExtension } }` or 403/404/409
13
+ */
14
+ export declare function claimEscalation(input: {
15
+ id: string;
16
+ durationMinutes?: number;
17
+ }, auth: LTApiAuth): Promise<LTApiResult>;
18
+ /**
19
+ * Release a claimed escalation back to the pool.
20
+ *
21
+ * Only the user who holds the claim can release it. Publishes a
22
+ * `escalation.released` event.
23
+ *
24
+ * @param input.id — escalation UUID
25
+ * @param auth — authenticated user context
26
+ * @returns `{ status: 200, data: { escalation } }` or 409
27
+ */
28
+ export declare function releaseEscalation(input: {
29
+ id: string;
30
+ }, auth: LTApiAuth): Promise<LTApiResult>;
@@ -0,0 +1,121 @@
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.claimEscalation = claimEscalation;
37
+ exports.releaseEscalation = releaseEscalation;
38
+ const escalationService = __importStar(require("../../services/escalation"));
39
+ const userService = __importStar(require("../../services/user"));
40
+ const publish_1 = require("../../lib/events/publish");
41
+ /**
42
+ * Claim a pending escalation for the authenticated user.
43
+ *
44
+ * Sets `assigned_to` and `assigned_until` on the escalation (soft lock).
45
+ * Non-superadmin users must hold the escalation's role. Publishes a
46
+ * `escalation.claimed` event.
47
+ *
48
+ * @param input.id — escalation UUID
49
+ * @param input.durationMinutes — claim duration (default: 30)
50
+ * @param auth — authenticated user context
51
+ * @returns `{ status: 200, data: { escalation, isExtension } }` or 403/404/409
52
+ */
53
+ async function claimEscalation(input, auth) {
54
+ try {
55
+ const { id, durationMinutes } = input;
56
+ const escalation = await escalationService.getEscalation(id);
57
+ if (!escalation) {
58
+ return { status: 404, error: 'Escalation not found' };
59
+ }
60
+ const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
61
+ if (!isSuperAdminUser) {
62
+ const userHasRole = await userService.hasRole(auth.userId, escalation.role);
63
+ if (!userHasRole) {
64
+ return {
65
+ status: 403,
66
+ error: `You must have the "${escalation.role}" role to claim this escalation`,
67
+ };
68
+ }
69
+ }
70
+ const result = await escalationService.claimEscalation(id, auth.userId, durationMinutes);
71
+ if (!result) {
72
+ return { status: 409, error: 'Escalation not available for claim' };
73
+ }
74
+ (0, publish_1.publishEscalationEvent)({
75
+ type: 'escalation.claimed',
76
+ source: 'api',
77
+ workflowId: escalation.workflow_id || '',
78
+ workflowName: escalation.workflow_type || '',
79
+ taskQueue: escalation.task_queue || '',
80
+ escalationId: id,
81
+ status: 'claimed',
82
+ data: { assigned_to: auth.userId },
83
+ });
84
+ return { status: 200, data: result };
85
+ }
86
+ catch (err) {
87
+ return { status: 500, error: err.message };
88
+ }
89
+ }
90
+ /**
91
+ * Release a claimed escalation back to the pool.
92
+ *
93
+ * Only the user who holds the claim can release it. Publishes a
94
+ * `escalation.released` event.
95
+ *
96
+ * @param input.id — escalation UUID
97
+ * @param auth — authenticated user context
98
+ * @returns `{ status: 200, data: { escalation } }` or 409
99
+ */
100
+ async function releaseEscalation(input, auth) {
101
+ try {
102
+ const result = await escalationService.releaseEscalation(input.id, auth.userId);
103
+ if (!result) {
104
+ return { status: 409, error: 'Escalation not found or not claimed by you' };
105
+ }
106
+ (0, publish_1.publishEscalationEvent)({
107
+ type: 'escalation.released',
108
+ source: 'api',
109
+ workflowId: result.workflow_id || '',
110
+ workflowName: result.workflow_type || '',
111
+ taskQueue: result.task_queue || '',
112
+ escalationId: input.id,
113
+ status: 'released',
114
+ data: { released_by: auth.userId },
115
+ });
116
+ return { status: 200, data: { escalation: result } };
117
+ }
118
+ catch (err) {
119
+ return { status: 500, error: err.message };
120
+ }
121
+ }
@@ -0,0 +1,29 @@
1
+ import type { LTApiResult, LTApiAuth } from '../../types/sdk';
2
+ /**
3
+ * Create a standalone escalation (not tied to a workflow).
4
+ *
5
+ * Useful for manual work items, support tickets, or approval requests
6
+ * that originate outside the durable workflow engine. The caller must
7
+ * hold the target role or be a superadmin.
8
+ *
9
+ * @param input.type — escalation category (e.g. `"support"`, `"approval"`)
10
+ * @param input.subtype — subcategory for finer routing
11
+ * @param input.role — role responsible for resolving this escalation
12
+ * @param input.description — human-readable summary
13
+ * @param input.priority — 1 (critical) through 4 (low), default 2
14
+ * @param input.envelope — serialized context for the resolver
15
+ * @param input.metadata — arbitrary key-value data (e.g. signal_routing)
16
+ * @param input.escalation_payload — serialized payload for the resolver UI
17
+ * @param auth — authenticated user context (must hold target role or be superadmin)
18
+ * @returns `{ status: 201, data: <escalation record> }`
19
+ */
20
+ export declare function createEscalation(input: {
21
+ type: string;
22
+ subtype?: string;
23
+ role: string;
24
+ description?: string;
25
+ priority?: number;
26
+ envelope?: string;
27
+ metadata?: Record<string, any>;
28
+ escalation_payload?: string;
29
+ }, auth: LTApiAuth): Promise<LTApiResult>;
@@ -0,0 +1,101 @@
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.createEscalation = createEscalation;
37
+ const escalationService = __importStar(require("../../services/escalation"));
38
+ const userService = __importStar(require("../../services/user"));
39
+ const publish_1 = require("../../lib/events/publish");
40
+ // ── Create ────────────────────────────────────────────────────────────────
41
+ /**
42
+ * Create a standalone escalation (not tied to a workflow).
43
+ *
44
+ * Useful for manual work items, support tickets, or approval requests
45
+ * that originate outside the durable workflow engine. The caller must
46
+ * hold the target role or be a superadmin.
47
+ *
48
+ * @param input.type — escalation category (e.g. `"support"`, `"approval"`)
49
+ * @param input.subtype — subcategory for finer routing
50
+ * @param input.role — role responsible for resolving this escalation
51
+ * @param input.description — human-readable summary
52
+ * @param input.priority — 1 (critical) through 4 (low), default 2
53
+ * @param input.envelope — serialized context for the resolver
54
+ * @param input.metadata — arbitrary key-value data (e.g. signal_routing)
55
+ * @param input.escalation_payload — serialized payload for the resolver UI
56
+ * @param auth — authenticated user context (must hold target role or be superadmin)
57
+ * @returns `{ status: 201, data: <escalation record> }`
58
+ */
59
+ async function createEscalation(input, auth) {
60
+ try {
61
+ const { type, role } = input;
62
+ if (!type || typeof type !== 'string') {
63
+ return { status: 400, error: 'type is required' };
64
+ }
65
+ if (!role || typeof role !== 'string') {
66
+ return { status: 400, error: 'role is required' };
67
+ }
68
+ // RBAC: caller must hold the target role or be superadmin
69
+ const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
70
+ if (!isSuperAdminUser) {
71
+ const userHasRole = await userService.hasRole(auth.userId, role);
72
+ if (!userHasRole) {
73
+ return { status: 403, error: `You must hold the "${role}" role or be a superadmin to create escalations for it` };
74
+ }
75
+ }
76
+ const escalation = await escalationService.createEscalation({
77
+ type,
78
+ subtype: input.subtype ?? type,
79
+ description: input.description,
80
+ priority: input.priority,
81
+ role,
82
+ envelope: input.envelope ?? '{}',
83
+ metadata: input.metadata,
84
+ escalation_payload: input.escalation_payload,
85
+ });
86
+ (0, publish_1.publishEscalationEvent)({
87
+ type: 'escalation.created',
88
+ source: 'api',
89
+ workflowId: '',
90
+ workflowName: '',
91
+ taskQueue: '',
92
+ escalationId: escalation.id,
93
+ status: 'pending',
94
+ data: { type: input.type, role },
95
+ });
96
+ return { status: 201, data: escalation };
97
+ }
98
+ catch (err) {
99
+ return { status: 500, error: err.message };
100
+ }
101
+ }
@@ -0,0 +1,10 @@
1
+ export declare function getVisibleRoles(userId: string): Promise<string[] | undefined>;
2
+ export declare function validateIds(ids: unknown): ids is string[];
3
+ export declare function checkBulkPermission(userId: string, ids: string[]): Promise<{
4
+ allowed: true;
5
+ } | {
6
+ allowed: false;
7
+ status: 403;
8
+ error: string;
9
+ }>;
10
+ export declare function publishBulkClaimEvents(ids: string[], assignedTo: string): void;