@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
@@ -2,247 +2,18 @@
2
2
  /**
3
3
  * Externalized LLM prompt constants for the yaml-workflow pipeline.
4
4
  *
5
- * Consolidates all system/user prompt strings used by compile, validate,
6
- * and extract stages so they can be reviewed and tuned in one place.
5
+ * Template strings live in prompt-templates.ts. This file re-exports them
6
+ * and provides builder functions that compose prompts at runtime.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.EXTRACT_DEFAULT_USER_TEMPLATE = exports.EXTRACT_DEFAULT_SYSTEM_PROMPT = exports.VALIDATION_PROMPT = exports.COMPILATION_PROMPT = void 0;
10
10
  exports.buildRecompilationHint = buildRecompilationHint;
11
- // ── Compile stage ─────────────────────────────────────────────────────────────
12
- exports.COMPILATION_PROMPT = `You are a workflow compiler. You analyze MCP tool execution traces and produce a COMPILATION PLAN — a complete specification for building a deterministic YAML DAG workflow.
13
-
14
- Given:
15
- 1. The user's ORIGINAL PROMPT the single most important signal for understanding intent
16
- 2. EXECUTION STEPS tool calls with arguments, result structure samples, and server IDs
17
- 3. PATTERN ANNOTATIONS — pre-detected iteration candidates from static analysis
18
- 4. NAIVE INPUT CLASSIFICATION — initial argument classification
19
-
20
- Your job: produce a plan that makes the workflow truly reusable and deterministic.
21
-
22
- ## Critical: Understand Intent
23
-
24
- The original prompt describes what the user wanted. The execution trace shows HOW an LLM accomplished it, but may include exploratory detours. Your compilation captures INTENT, not a blind replay.
25
-
26
- For example, if the prompt says "login to site X and take screenshots of all pages":
27
- - INTENT: login → discover pages → iterate and screenshot each one
28
- - Execution may have included probing steps — exclude those
29
- - Deterministic version: accept credentials → login → extract links → iterate taking screenshots
30
-
31
- ## Critical: Preserve Discovery Steps
32
-
33
- Many workflows follow a "discover then act" pattern: one step DISCOVERS data (e.g., extract navigation links, query a database, list files) and a later step ACTS on that data (e.g., screenshot each page, process each record, transform each file).
34
-
35
- **NEVER collapse discovery + action into a single step with the discovered data as a user input.** If the execution trace shows:
36
- 1. Step A: extract_content → produces \`links: [{text, href}, ...]\`
37
- 2. Step B: capture_pages(pages=[...array built from step A's links...])
38
-
39
- The compiled workflow MUST keep BOTH steps: A produces the array, B consumes it. Do NOT make the array a trigger input — it was runtime-discovered, not user-provided.
40
-
41
- **How to detect**: If a step's argument contains a large array of items that closely mirrors a prior step's output array (same URLs, same items, possibly reshaped), that array was DERIVED from the prior step. Keep both steps and wire them with a data_flow edge (with a transform if formats differ).
42
-
43
- ## Rules
44
-
45
- ### Step Dispositions
46
- - **core**: Directly serves the workflow intent. Produces data consumed by later steps. **Discovery steps that produce arrays consumed by later action steps are ALWAYS core.**
47
- - **exploratory**: Probing/debugging/discovery steps that don't produce data needed by the workflow. Exclude these:
48
- - Checking if compiled workflows exist (list_workflows, list_yaml_workflows)
49
- - Listing files to see what exists (list_files, read_file)
50
- - Initial tool calls that failed and were retried with different parameters
51
- - Any step whose result is not consumed by a subsequent core step
52
- - **NEVER mark a discovery step as exploratory if its output was used to build arguments for a later step**
53
-
54
- ### Signal Steps (Human-in-the-Loop)
55
- Steps with kind "signal" represent a durable pause where the workflow waits for human input (e.g., credentials, approval). These are ALWAYS core — they are essential to the workflow's data flow. The signal step receives data from a human and makes it available to subsequent steps. Do NOT mark signal steps as exploratory. The escalation tool call (escalate_and_wait) that precedes a signal step is also always core.
56
-
57
- **Signal data flow**: The signal step result contains the human response fields (e.g., password). These MUST be wired via data_flow edges to every downstream step that needs them. Add a data_flow edge from the signal step index to the consuming step with the matching field name.
58
-
59
- **Credentials from signals**: When the signal provides a credential (format: password in the schema), downstream tools that need it should receive it as a separate named input argument. The runtime exchanges ephemeral credential tokens automatically. For tools with complex stored arguments (like run_script steps arrays), wire the credential as a top-level argument name — the runtime merges it with stored defaults.
60
-
61
- ### Iteration Specifications
62
- When the execution shows repeated tool calls with varying arguments (the pattern detector may have already collapsed these):
63
- - Identify the SOURCE: which prior step's result contains the array being iterated. This is the step that PRODUCED the list of items — look for a step whose result contains an array field with items matching the iteration's varying values. For example, if the iteration visits multiple URLs, find the step that returned those URLs (e.g., extract_content with links).
64
- - The source is NEVER a step that doesn't have the array in its output. Double-check: does the source step's resultKeys include the source_field?
65
- - Specify the source_field: the dot-path to the array (e.g., "links", "results.pages")
66
- - List varying_keys (change per item) vs constant_args (shared)
67
- - **KEY MAPPINGS are critical**: array items often use different key names than the tool expects.
68
- E.g., extract_content returns \`links: [{text, href}, ...]\` but the screenshot tool wants \`url\`.
69
- Map: \`{ "url": "href" }\` — tool arg name → array item key name.
70
- Use null for keys that are COMPUTED at runtime, not sourced from the array.
71
- For example, screenshot_path is often derived from the link text or URL — it's not a field in the source array directly:
72
- \`{ "screenshot_path": null }\` — the value must be computed or provided by the trigger.
73
-
74
- ### Tool Simplification for Iterations (CRITICAL)
75
- The iteration pattern works by extracting individual values from array items and passing them as simple key=value arguments to the iterated tool. This means:
76
-
77
- **The iterated tool MUST accept simple, flat arguments** (url, path, page_id — not complex nested structures like a \`steps\` array).
78
-
79
- If the execution used a complex multi-step scripting tool (e.g., \`run_script\` with a \`steps: [{action, url}, {action, path}]\` array) for each iteration, you MUST replace it with a simpler tool from the same server that accepts flat arguments. Check the server's tool inventory for a simpler alternative.
80
-
81
- For example:
82
- - \`run_script(steps=[navigate, wait, screenshot])\` per page → replace with \`capture_page(url, path, full_page, wait_ms)\` (1 call, flat args)
83
- - \`run_script(steps=[navigate, fill, click])\` per item → replace with \`submit_form(url, fields)\` (1 call, flat args)
84
-
85
- When replacing: use the same server_id but the simpler tool_name. The varying_keys and key_mappings should map directly to the simple tool's argument names.
86
-
87
- **If no simpler tool alternative exists**, use a data_flow edge with a transform to feed the array into a batch/composite tool that accepts the full array (like \`capture_authenticated_pages\` which takes a \`pages\` array).
88
-
89
- ### Data Flow Graph
90
- Specify directed edges showing how data flows between steps:
91
- - from_step: "trigger" (user input) or step index number
92
- - from_field: the output field name (or trigger input key)
93
- - to_step: the consuming step index
94
- - to_field: the argument key name
95
- - is_session_wire: true for session handles (page_id, _handle, session_id)
96
-
97
- Session handles are critical — they maintain authenticated browser sessions, database connections, etc. They must be threaded from their producer through ALL subsequent steps that need them.
98
-
99
- ### Chain Analysis to Downstream Steps
100
- When a step produces a meaningful result (analysis, extraction, description, computed value) and a later step consumes related data (saving, storing, forwarding, reporting), there MUST be a data_flow edge connecting them. Match by semantic intent, not just field name:
101
- - Step produces \`description\` → downstream step takes \`value\` → edge with from_field: "description", to_field: "value"
102
- - Step produces \`analysis.summary\` → downstream step takes \`content\` → edge with appropriate field mapping
103
-
104
- If the original execution trace shows that a step's output was used (even indirectly) as input to a later step, the compiled version must preserve that data chain. A broken chain means the downstream step receives no data — the worst possible compilation error.
105
-
106
- ### Data Flow Transforms (CRITICAL for array reshaping)
107
- When a source step produces an array of objects in one format but the consuming step expects a DIFFERENT format, add a \`transform\` to the data_flow edge. Compare the source step's result structure with the consuming step's actual arguments from the trace.
108
-
109
- **Choosing the correct source field**: When a step produces multiple output fields, check the result sample to determine which field actually contains an ARRAY OF OBJECTS suitable for iteration/reshaping. Prefer structured array fields over raw/unstructured fields. Check the Tool-Specific Compilation Hints section (if present) for guidance on which fields to use for specific tools.
110
-
111
- For example: extract_content returns \`links: [{text, href}]\` but capture tool expects \`pages: [{url, screenshot_path, wait_ms, full_page}]\`.
112
- Add a transform with:
113
- - \`field_map\`: maps target keys → source keys (e.g., \`{"url": "href"}\`). Use null for keys not in the source.
114
- - \`defaults\`: static values to inject (e.g., \`{"wait_ms": 3000, "full_page": true}\`)
115
- - \`derivations\`: for computed keys (null in field_map), how to derive them from source data
116
- - strategy: "slugify" (lowercase, replace spaces/special with hyphens), "prefix", "template", "concat"
117
- - source_key: which source field to derive from
118
- - prefix/suffix/template: string manipulation params
119
-
120
- Available derivation strategies:
121
- - **slugify**: Lowercase, replace spaces/special chars with hyphens. Optionally add prefix/suffix.
122
- - **prefix**: Prepend a static string.
123
- - **template**: Format string with \`{value}\` (source field) and \`{date}\` (today's date as YYYY-MM-DD via @date.yyyymmdd).
124
- - **concat**: Join multiple parts. Each part can use \`{value}\` and \`{date}\` placeholders.
125
- Example: \`{ "strategy": "concat", "parts": ["{value}", "-", "{date}"] }\` produces \`my-slug-2026-04-17\`.
126
- - **passthrough**: No transformation.
127
-
128
- Use these when the workflow needs runtime-computed values (date-stamped filenames, slugified URLs, templated paths).
129
-
130
- Example edge with transform:
131
- \`\`\`
132
- {
133
- "from_step": 1, "from_field": "links", "to_step": 2, "to_field": "pages",
134
- "is_session_wire": false,
135
- "transform": {
136
- "field_map": { "url": "href", "screenshot_path": null },
137
- "defaults": { "wait_ms": 3000, "full_page": true },
138
- "derivations": {
139
- "screenshot_path": {
140
- "source_key": "href",
141
- "strategy": "slugify",
142
- "prefix": "screenshots/",
143
- "suffix": ".png"
144
- }
145
- }
146
- }
147
- }
148
- \`\`\`
149
-
150
- IMPORTANT: Check EVERY array-typed data_flow edge. Compare the source step's result item keys with the consuming step's argument item keys. If they differ, add a transform. Look at the actual tool_arguments in the execution trace to determine the correct field_map, defaults, and derivations.
151
-
152
- ### Scalar Derivations on Data Flow Edges
153
- When a scalar value needs runtime transformation before reaching its consumer, add a \`derivation\` to the data_flow edge (NOT a \`transform\` — transforms are for array reshaping). Derivations generate runtime expressions for string manipulation.
154
-
155
- Common use case: the user's prompt mentions a pattern like "save with key slug-{date}" or "name it {something}-{today's date}". The trigger provides the base value, and the derivation appends or formats it at runtime.
156
-
157
- Add a \`derivation\` field to the data_flow edge:
158
- \`\`\`
159
- {
160
- "from_step": "trigger", "from_field": "key", "to_step": 3, "to_field": "key",
161
- "is_session_wire": false,
162
- "derivation": { "strategy": "concat", "parts": ["{value}", "-", "{date}"] }
163
- }
164
- \`\`\`
165
-
166
- This produces a runtime-computed key like \`my-slug-2026-04-17\`. The \`{value}\` placeholder is the source field value; \`{date}\` is today's ISO date (YYYY-MM-DD).
167
-
168
- Use derivations when:
169
- - The user wants date-stamped keys, filenames, or identifiers
170
- - A value needs a prefix/suffix added at runtime
171
- - Two values need to be concatenated
172
-
173
- ### Input Classification
174
- - **dynamic**: Simple values callers MUST provide: URLs, credentials, file paths, queries, search terms. These are always scalar strings, numbers, or booleans — NEVER complex objects or arrays.
175
- - **fixed**: Implementation details with sensible defaults: selectors, timeouts, boolean flags, AND complex structured arguments like \`steps\` arrays, \`login\` objects, or \`pages\` arrays. These are baked into stored tool_arguments.
176
-
177
- **Complex tool arguments (arrays of objects, nested structures) are ALWAYS fixed.** They represent the implementation recipe, not user input. For example:
178
- - A \`steps\` array describing browser actions (navigate, fill, click, screenshot) → **fixed**
179
- - A \`login\` object with selectors and credentials → flatten the credentials (username, password) as dynamic, but the selectors as fixed
180
- - A \`pages\` array of URLs to capture → **fixed** if hardcoded from the trace, or a data_flow edge if discovered at runtime
181
-
182
- Flatten nested objects containing dynamic values. E.g., \`login: {url, username, password}\` → separate \`login_url\`, \`username\`, \`password\` fields. But NEVER expose the full nested object or array as a trigger input.
183
-
184
- **Arrays that were DISCOVERED at runtime (by a prior step) are NOT inputs.** They flow between steps via data_flow edges. Only make an array a trigger input if the user explicitly provided it in their prompt. If the array was produced by a discovery step (extract_content, query, list), keep the discovery step as core and wire its output to the consuming step.
185
-
186
- ### Prompt-Mentioned Values Are Dynamic
187
- If a scalar value (URL, domain name, file path, key name, slug, query string) appears verbatim or closely paraphrased in the user's original prompt, classify it as **dynamic**. The user explicitly chose that value for this execution and will want to change it next time. Only classify a prompt-mentioned value as fixed if it is unambiguously an implementation constant (a CSS selector, a timeout, a boolean flag).
188
-
189
- This is the most common compilation error: treating the user's specific request values as universal defaults. When in doubt, make it dynamic.
190
-
191
- ### Data Flow Wiring Precision
192
- - **Only wire inputs that semantically match.** A directory name (e.g., \`screenshot_dir = "screenshots"\`) must NOT be wired to a file path argument (e.g., \`screenshot_path\` which expects \`"screenshots/home.png"\`). If a tool argument needs a specific file path but the trigger only provides a directory, leave that argument unwired — the stored tool_arguments default will provide the correct value.
193
- - **Trigger inputs should map to the EXACT tool argument they represent.** Don't reuse a trigger input for a different-purpose argument just because the names are vaguely related.
194
- - **When in doubt, don't wire.** An unwired argument falls back to the stored tool_arguments default from the original execution — this is always correct. An incorrectly wired argument overrides the correct default with a wrong value.
195
-
196
- ### Session Fields and Threading Rules
197
- List all fields that represent session tokens/handles that must flow through the DAG (e.g., page_id, _handle, session_id).
198
-
199
- **Critical**: When a login/setup step produces a page_id or _handle, ALL subsequent browser/page steps must receive that session wire — including steps inside iterations. The data_flow graph must include session wire edges from the producing step to EVERY downstream step that operates on the same session, not just the immediately next one. For iterations: wire the session from the setup step directly to the iteration body step.
200
-
201
- **COMPLETENESS REQUIREMENT**: For EACH step that uses a session field (check the step's argumentKeys — if it includes page_id, _handle, or session_id), you MUST emit a data_flow edge wiring that field from its producer. If step 0 produces _handle and steps 1, 2, and 3 all use it, you need THREE edges: 0→1, 0→2, 0→3. Do NOT assume downstream steps will "inherit" session fields — each consumer needs an explicit edge.
202
-
203
- ### Data Flow Completeness Check
204
- Before finalizing the plan, verify:
205
- 1. Every step that has a session field in its argumentKeys has a corresponding is_session_wire edge
206
- 2. Every step that consumes data from a prior step has a data_flow edge for that field
207
- 3. Every dynamic trigger input is wired to at least one step via a data_flow edge from "trigger"
208
- 4. Transform edges include the source field AND the consuming step can access all fields it needs
209
-
210
- ## Output Format
211
-
212
- Return a JSON object (no markdown fences):
213
- {
214
- "intent": "Brief generic description of what this workflow does",
215
- "description": "Suggested workflow description for discovery",
216
- "steps": [
217
- { "index": 0, "purpose": "Navigate to the target site", "disposition": "core" },
218
- { "index": 1, "purpose": "Extract navigation links from the page", "disposition": "core" },
219
- { "index": 2, "purpose": "List files to check directory structure", "disposition": "exploratory" }
220
- ],
221
- "core_step_indices": [0, 1, 3],
222
- "inputs": [
223
- { "key": "base_url", "type": "string", "classification": "dynamic", "description": "The base URL of the site" },
224
- { "key": "username", "type": "string", "classification": "dynamic", "description": "Login username" },
225
- { "key": "timeout", "type": "number", "classification": "fixed", "description": "Page load timeout", "default": 30000 }
226
- ],
227
- "iterations": [
228
- {
229
- "body_step_index": 3,
230
- "tool_name": "screenshot",
231
- "server_id": "playwright",
232
- "source_step_index": 1,
233
- "source_field": "links",
234
- "varying_keys": ["url", "screenshot_path"],
235
- "constant_args": { "full_page": true },
236
- "key_mappings": { "url": "href", "screenshot_path": null }
237
- }
238
- ],
239
- "data_flow": [
240
- { "from_step": "trigger", "from_field": "base_url", "to_step": 0, "to_field": "url", "is_session_wire": false },
241
- { "from_step": 0, "from_field": "page_id", "to_step": 1, "to_field": "page_id", "is_session_wire": true },
242
- { "from_step": 0, "from_field": "_handle", "to_step": 1, "to_field": "_handle", "is_session_wire": true }
243
- ],
244
- "session_fields": ["page_id", "_handle"]
245
- }`;
11
+ // Re-export all prompt template constants
12
+ var prompt_templates_1 = require("./prompt-templates");
13
+ Object.defineProperty(exports, "COMPILATION_PROMPT", { enumerable: true, get: function () { return prompt_templates_1.COMPILATION_PROMPT; } });
14
+ Object.defineProperty(exports, "VALIDATION_PROMPT", { enumerable: true, get: function () { return prompt_templates_1.VALIDATION_PROMPT; } });
15
+ Object.defineProperty(exports, "EXTRACT_DEFAULT_SYSTEM_PROMPT", { enumerable: true, get: function () { return prompt_templates_1.EXTRACT_DEFAULT_SYSTEM_PROMPT; } });
16
+ Object.defineProperty(exports, "EXTRACT_DEFAULT_USER_TEMPLATE", { enumerable: true, get: function () { return prompt_templates_1.EXTRACT_DEFAULT_USER_TEMPLATE; } });
246
17
  // ── Recompilation hint (compile stage retry) ──────────────────────────────────
247
18
  /**
248
19
  * Build the retry hint injected into the compile stage when
@@ -269,29 +40,3 @@ function buildRecompilationHint(feedback, priorYaml) {
269
40
  ] : []),
270
41
  ].join('\n');
271
42
  }
272
- // ── Validate stage ────────────────────────────────────────────────────────────
273
- exports.VALIDATION_PROMPT = `You are a YAML workflow validator. Given a workflow intent, activity manifest, and generated YAML DAG, identify data flow issues.
274
-
275
- Check for:
276
- 1. Missing input wiring: a step needs data but no prior step provides it and it's not in the trigger
277
- 2. Broken iteration sources: a cycle references an array field that doesn't exist in the source step's output
278
- 3. Lost session handles: a session field (page_id, _handle) is produced by an early step (e.g., login) but not threaded to later browser/page steps that need it — including steps inside iteration loops
279
- 4. Unparameterized hardcoded values: URLs, credentials, or paths that should be dynamic inputs but are baked in
280
- 5. Iteration array source: verify the referenced items field in a cycle hook actually exists in the source activity's output fields
281
- 6. Trigger completeness: every dynamic input in the trigger schema should be referenced by at least one activity's input maps
282
-
283
- IGNORE these internal fields — they are injected by the build system and are always correct:
284
- - "workflowName" in input maps: internal dispatch routing field, always a literal string — NOT a hardcoded value bug
285
- - "_scope" in input maps: internal IAM context field, always wired from trigger — NOT a missing trigger input
286
-
287
- Return a JSON object:
288
- {
289
- "issues": ["description of issue 1", "description of issue 2"],
290
- "valid": true
291
- }
292
-
293
- If no issues, return { "issues": [], "valid": true }.
294
- Be concise. Only report real problems, not style suggestions.`;
295
- // ── Extract stage ─────────────────────────────────────────────────────────────
296
- exports.EXTRACT_DEFAULT_SYSTEM_PROMPT = 'You are a data analysis assistant. Interpret the provided data and return a structured JSON response with: title, summary, sections (array of {heading, content}), and metrics (array of {label, value}).';
297
- exports.EXTRACT_DEFAULT_USER_TEMPLATE = '{dataRef}\n\nData:\n{input_data}\n\nProvide a concise analysis.';
@@ -138,7 +138,8 @@ async function registerWorkersForWorkflow(workflow) {
138
138
  else if (toolSource === 'db') {
139
139
  if (!activity.mcp_tool_name)
140
140
  continue;
141
- const toolName = activity.mcp_tool_name;
141
+ const rawToolName = activity.mcp_tool_name;
142
+ const toolName = rawToolName.includes('__') ? rawToolName.slice(rawToolName.indexOf('__') + 2) : rawToolName;
142
143
  const dbServerId = activity.mcp_server_id || 'long-tail-db';
143
144
  const toolArgs = activity.tool_arguments;
144
145
  workerConfigs.push({
@@ -163,7 +164,8 @@ async function registerWorkersForWorkflow(workflow) {
163
164
  else {
164
165
  if (!activity.mcp_tool_name)
165
166
  continue;
166
- const toolName = activity.mcp_tool_name;
167
+ const rawToolName = activity.mcp_tool_name;
168
+ const toolName = rawToolName.includes('__') ? rawToolName.slice(rawToolName.indexOf('__') + 2) : rawToolName;
167
169
  const serverId = activity.mcp_server_id;
168
170
  if (!serverId)
169
171
  continue;
@@ -16,6 +16,7 @@ const adapter_1 = require("../services/mcp/adapter");
16
16
  const escalation_strategy_1 = require("../services/escalation-strategy");
17
17
  const default_1 = require("../services/escalation-strategy/default");
18
18
  const mcp_2 = require("../services/escalation-strategy/mcp");
19
+ const socket_auth_1 = require("./socket-auth");
19
20
  /**
20
21
  * Register all adapters (logging, telemetry, events, maintenance,
21
22
  * escalation strategy, MCP) based on the startup config.
@@ -46,7 +47,9 @@ function registerAdapters(startConfig) {
46
47
  if (startConfig.events?.nats) {
47
48
  events_1.eventRegistry.register(new nats_1.NatsEventAdapter(startConfig.events.nats));
48
49
  }
49
- events_1.eventRegistry.register(new socketio_1.SocketIOEventAdapter());
50
+ events_1.eventRegistry.register(new socketio_1.SocketIOEventAdapter({
51
+ authenticate: (0, socket_auth_1.createSocketIOAuthenticator)(startConfig),
52
+ }));
50
53
  }
51
54
  // Always register the callback adapter for SDK event subscriptions.
52
55
  // Zero-cost when no listeners are registered.
@@ -0,0 +1,13 @@
1
+ import type { SocketIOAuthenticator } from '../lib/events/socketio';
2
+ import type { LTStartConfig } from '../types/startup';
3
+ /**
4
+ * Build a Socket.IO handshake authenticator from the startup config.
5
+ *
6
+ * Uses the same JWT secret as `requireAuth` — either the explicit
7
+ * secret from startConfig.auth.secret or the JWT_SECRET env var.
8
+ *
9
+ * Returns `undefined` when no secret is configured (e.g. tests or
10
+ * deployments that intentionally skip auth), which leaves Socket.IO
11
+ * open as before.
12
+ */
13
+ export declare function createSocketIOAuthenticator(startConfig: LTStartConfig): SocketIOAuthenticator | undefined;
@@ -0,0 +1,32 @@
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.createSocketIOAuthenticator = createSocketIOAuthenticator;
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
+ const config_1 = require("../modules/config");
9
+ /**
10
+ * Build a Socket.IO handshake authenticator from the startup config.
11
+ *
12
+ * Uses the same JWT secret as `requireAuth` — either the explicit
13
+ * secret from startConfig.auth.secret or the JWT_SECRET env var.
14
+ *
15
+ * Returns `undefined` when no secret is configured (e.g. tests or
16
+ * deployments that intentionally skip auth), which leaves Socket.IO
17
+ * open as before.
18
+ */
19
+ function createSocketIOAuthenticator(startConfig) {
20
+ const secret = startConfig.auth?.secret ?? config_1.config.JWT_SECRET;
21
+ if (!secret)
22
+ return undefined;
23
+ return (token) => {
24
+ try {
25
+ const payload = jsonwebtoken_1.default.verify(token, secret);
26
+ return !!(payload && typeof payload === 'object' && payload.userId);
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ };
32
+ }
@@ -132,11 +132,6 @@ async function startWorkers(startConfig, workers, builtinMcpServerFactories) {
132
132
  (0, registry_1.registerWorker)(w.workflow.name, w.taskQueue);
133
133
  }
134
134
  logger_1.loggerRegistry.info(`[long-tail] workers started on queues: ${workers.map((w) => w.taskQueue).join(', ')}`);
135
- // Connect event adapters
136
- if (events_1.eventRegistry.hasAdapters) {
137
- await events_1.eventRegistry.connect();
138
- logger_1.loggerRegistry.info('[long-tail] event adapters connected');
139
- }
140
135
  // Start maintenance cron
141
136
  if (maintenance_1.maintenanceRegistry.hasConfig) {
142
137
  await maintenance_1.maintenanceRegistry.connect();
@@ -162,6 +157,12 @@ async function startWorkers(startConfig, workers, builtinMcpServerFactories) {
162
157
  // Register workers for active YAML (deterministic) workflows
163
158
  await yamlWorkflowWorkers.registerAllActiveWorkers();
164
159
  }
160
+ // Connect event adapters (outside workers guard so API-only containers
161
+ // still connect to NATS and can publish/receive events)
162
+ if (events_1.eventRegistry.hasAdapters) {
163
+ await events_1.eventRegistry.connect();
164
+ logger_1.loggerRegistry.info('[long-tail] event adapters connected');
165
+ }
165
166
  // Seed system MCP servers (always)
166
167
  const { seedSystemMcpServers } = await Promise.resolve().then(() => __importStar(require('../system/seed')));
167
168
  await seedSystemMcpServers();
@@ -17,12 +17,16 @@ export declare function readFile(args: {
17
17
  export declare function listFiles(args: {
18
18
  directory?: string;
19
19
  pattern?: string;
20
+ page_size?: number;
21
+ continuation_token?: string;
20
22
  }): Promise<{
21
23
  files: Array<{
22
24
  path: string;
23
25
  size: number;
24
26
  modified_at: string;
25
27
  }>;
28
+ directories?: string[];
29
+ nextToken?: string;
26
30
  }>;
27
31
  export declare function deleteFile(args: {
28
32
  path: string;
@@ -64,7 +64,13 @@ async function readFile(args) {
64
64
  };
65
65
  }
66
66
  async function listFiles(args) {
67
- return (0, storage_1.getStorageBackend)().list(args.directory, args.pattern);
67
+ const result = await (0, storage_1.getStorageBackend)().listWithPrefixes(args.directory, args.page_size || 100, args.continuation_token);
68
+ // Apply glob pattern client-side if provided (S3/GCS don't support server-side glob)
69
+ if (args.pattern) {
70
+ const regex = new RegExp(args.pattern.replace(/\./g, '\\.').replace(/\*/g, '.*'));
71
+ result.files = result.files.filter((f) => regex.test(f.path));
72
+ }
73
+ return result;
68
74
  }
69
75
  async function deleteFile(args) {
70
76
  return (0, storage_1.getStorageBackend)().delete(args.path);
@@ -3,6 +3,7 @@ export declare function storeKnowledge(args: {
3
3
  key: string;
4
4
  data: Record<string, any>;
5
5
  tags?: string[];
6
+ replace?: boolean;
6
7
  }): Promise<{
7
8
  id: string;
8
9
  domain: string;
@@ -19,6 +20,7 @@ export declare function searchKnowledge(args: {
19
20
  query: Record<string, any>;
20
21
  tags?: string[];
21
22
  limit?: number;
23
+ offset?: number;
22
24
  }): Promise<{
23
25
  entries: Record<string, any>[];
24
26
  total: number;
@@ -26,6 +28,7 @@ export declare function searchKnowledge(args: {
26
28
  export declare function listKnowledge(args: {
27
29
  domain: string;
28
30
  tags?: string[];
31
+ search?: string;
29
32
  limit?: number;
30
33
  offset?: number;
31
34
  }): Promise<{
@@ -38,6 +41,26 @@ export declare function deleteKnowledge(args: {
38
41
  }): Promise<{
39
42
  deleted: boolean;
40
43
  }>;
44
+ export declare function setKnowledgeField(args: {
45
+ domain: string;
46
+ key: string;
47
+ path: string;
48
+ value: any;
49
+ tags?: string[];
50
+ }): Promise<{
51
+ id: string;
52
+ domain: string;
53
+ key: string;
54
+ created: boolean;
55
+ updated_at: string;
56
+ }>;
57
+ export declare function removeKnowledgeField(args: {
58
+ domain: string;
59
+ key: string;
60
+ path: string;
61
+ }): Promise<{
62
+ removed: boolean;
63
+ }>;
41
64
  export declare function listDomains(): Promise<{
42
65
  domains: Array<{
43
66
  domain: string;
@@ -5,6 +5,8 @@ exports.getKnowledge = getKnowledge;
5
5
  exports.searchKnowledge = searchKnowledge;
6
6
  exports.listKnowledge = listKnowledge;
7
7
  exports.deleteKnowledge = deleteKnowledge;
8
+ exports.setKnowledgeField = setKnowledgeField;
9
+ exports.removeKnowledgeField = removeKnowledgeField;
8
10
  exports.listDomains = listDomains;
9
11
  exports.appendKnowledge = appendKnowledge;
10
12
  const db_1 = require("../../lib/db");
@@ -22,7 +24,8 @@ async function withClient(fn) {
22
24
  }
23
25
  async function storeKnowledge(args) {
24
26
  return withClient(async (client) => {
25
- const { rows } = await client.query(sql_1.UPSERT_KNOWLEDGE, [args.domain, args.key, JSON.stringify(args.data), args.tags || []]);
27
+ const sql = args.replace ? sql_1.REPLACE_KNOWLEDGE : sql_1.UPSERT_KNOWLEDGE;
28
+ const { rows } = await client.query(sql, [args.domain, args.key, JSON.stringify(args.data), args.tags || []]);
26
29
  return { ...rows[0], updated_at: rows[0].updated_at.toISOString() };
27
30
  });
28
31
  }
@@ -46,19 +49,24 @@ async function getKnowledge(args) {
46
49
  async function searchKnowledge(args) {
47
50
  return withClient(async (client) => {
48
51
  const limit = Math.min(args.limit || 50, 200);
49
- const params = [args.domain, JSON.stringify(args.query), limit];
52
+ const offset = args.offset || 0;
53
+ const params = [args.domain, JSON.stringify(args.query)];
50
54
  let tagClause = '';
51
55
  if (args.tags?.length) {
52
- tagClause = ' AND tags && $4';
53
56
  params.push(args.tags);
57
+ tagClause = ` AND tags && $${params.length}`;
54
58
  }
59
+ const countParams = [...params];
55
60
  const countResult = await client.query(`SELECT COUNT(*)::int AS total FROM lt_knowledge
56
- WHERE domain = $1 AND data @> $2::jsonb${tagClause}`, tagClause ? [args.domain, JSON.stringify(args.query), ...(args.tags ? [args.tags] : [])]
57
- : [args.domain, JSON.stringify(args.query)]);
61
+ WHERE domain = $1 AND data @> $2::jsonb${tagClause}`, countParams);
62
+ params.push(limit);
63
+ const limitIdx = params.length;
64
+ params.push(offset);
65
+ const offsetIdx = params.length;
58
66
  const { rows } = await client.query(`SELECT id, domain, key, data, tags, created_at, updated_at
59
67
  FROM lt_knowledge
60
68
  WHERE domain = $1 AND data @> $2::jsonb${tagClause}
61
- ORDER BY updated_at DESC LIMIT $3`, params);
69
+ ORDER BY updated_at DESC LIMIT $${limitIdx} OFFSET $${offsetIdx}`, params);
62
70
  return {
63
71
  entries: rows.map((r) => ({
64
72
  id: r.id, domain: r.domain, key: r.key, data: r.data, tags: r.tags,
@@ -73,17 +81,23 @@ async function listKnowledge(args) {
73
81
  const limit = Math.min(args.limit || 50, 200);
74
82
  const offset = args.offset || 0;
75
83
  const params = [args.domain];
76
- let tagClause = '';
84
+ let extraClauses = '';
77
85
  if (args.tags?.length) {
78
- tagClause = ' AND tags && $2';
79
86
  params.push(args.tags);
87
+ extraClauses += ` AND tags && $${params.length}`;
80
88
  }
81
- const countResult = await client.query(`SELECT COUNT(*)::int AS total FROM lt_knowledge WHERE domain = $1${tagClause}`, params);
89
+ if (args.search) {
90
+ params.push(`%${args.search}%`);
91
+ const searchIdx = params.length;
92
+ // Match key by ILIKE or any tag element by ILIKE
93
+ extraClauses += ` AND (key ILIKE $${searchIdx} OR EXISTS (SELECT 1 FROM unnest(tags) t WHERE t ILIKE $${searchIdx}))`;
94
+ }
95
+ const countResult = await client.query(`SELECT COUNT(*)::int AS total FROM lt_knowledge WHERE domain = $1${extraClauses}`, params);
82
96
  const queryParams = [...params, limit, offset];
83
97
  const limitIdx = params.length + 1;
84
98
  const offsetIdx = params.length + 2;
85
99
  const { rows } = await client.query(`SELECT id, domain, key, data, tags, created_at, updated_at
86
- FROM lt_knowledge WHERE domain = $1${tagClause}
100
+ FROM lt_knowledge WHERE domain = $1${extraClauses}
87
101
  ORDER BY updated_at DESC LIMIT $${limitIdx} OFFSET $${offsetIdx}`, queryParams);
88
102
  return {
89
103
  entries: rows.map((r) => ({
@@ -100,6 +114,32 @@ async function deleteKnowledge(args) {
100
114
  return { deleted: (rowCount ?? 0) > 0 };
101
115
  });
102
116
  }
117
+ async function setKnowledgeField(args) {
118
+ return withClient(async (client) => {
119
+ const pathParts = args.path.split('.');
120
+ // Build initial data for INSERT (nested structure from path)
121
+ let initData = { [pathParts[pathParts.length - 1]]: args.value };
122
+ for (let i = pathParts.length - 2; i >= 0; i--) {
123
+ initData = { [pathParts[i]]: initData };
124
+ }
125
+ const { rows } = await client.query(sql_1.SET_KNOWLEDGE_FIELD, [
126
+ args.domain,
127
+ args.key,
128
+ JSON.stringify(initData),
129
+ args.tags || [],
130
+ pathParts,
131
+ JSON.stringify(args.value),
132
+ ]);
133
+ return { ...rows[0], updated_at: rows[0].updated_at.toISOString() };
134
+ });
135
+ }
136
+ async function removeKnowledgeField(args) {
137
+ return withClient(async (client) => {
138
+ const pathParts = args.path.split('.');
139
+ const { rowCount } = await client.query(sql_1.REMOVE_KNOWLEDGE_FIELD, [args.domain, args.key, pathParts]);
140
+ return { removed: (rowCount ?? 0) > 0 };
141
+ });
142
+ }
103
143
  async function listDomains() {
104
144
  return withClient(async (client) => {
105
145
  const { rows } = await client.query(sql_1.LIST_DOMAINS);
@@ -1,4 +1,5 @@
1
1
  export declare const UPSERT_KNOWLEDGE = "\n INSERT INTO lt_knowledge (domain, key, data, tags)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (domain, key) DO UPDATE SET\n data = CASE\n WHEN jsonb_typeof(lt_knowledge.data) = 'object'\n THEN lt_knowledge.data || EXCLUDED.data\n ELSE EXCLUDED.data\n END,\n tags = ARRAY(SELECT DISTINCT unnest(lt_knowledge.tags || EXCLUDED.tags))\n RETURNING id, domain, key, (xmax = 0) AS created, updated_at";
2
+ export declare const REPLACE_KNOWLEDGE = "\n INSERT INTO lt_knowledge (domain, key, data, tags)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (domain, key) DO UPDATE SET\n data = EXCLUDED.data,\n tags = EXCLUDED.tags\n RETURNING id, domain, key, (xmax = 0) AS created, updated_at";
2
3
  export declare const GET_KNOWLEDGE = "\n SELECT id, domain, key, data, tags, created_at, updated_at\n FROM lt_knowledge WHERE domain = $1 AND key = $2";
3
4
  export declare const SEARCH_KNOWLEDGE = "\n SELECT id, domain, key, data, tags, created_at, updated_at\n FROM lt_knowledge\n WHERE domain = $1 AND data @> $2::jsonb";
4
5
  export declare const COUNT_KNOWLEDGE_SEARCH = "\n SELECT COUNT(*)::int AS total FROM lt_knowledge\n WHERE domain = $1 AND data @> $2::jsonb";
@@ -6,4 +7,6 @@ export declare const LIST_KNOWLEDGE = "\n SELECT id, domain, key, data, tags, c
6
7
  export declare const COUNT_KNOWLEDGE_LIST = "\n SELECT COUNT(*)::int AS total FROM lt_knowledge WHERE domain = $1";
7
8
  export declare const DELETE_KNOWLEDGE = "\n DELETE FROM lt_knowledge WHERE domain = $1 AND key = $2";
8
9
  export declare const LIST_DOMAINS = "\n SELECT domain, COUNT(*)::int AS count, MAX(updated_at) AS latest\n FROM lt_knowledge GROUP BY domain ORDER BY latest DESC";
10
+ export declare const SET_KNOWLEDGE_FIELD = "\n INSERT INTO lt_knowledge (domain, key, data, tags)\n VALUES ($1, $2, $3::jsonb, $4)\n ON CONFLICT (domain, key) DO UPDATE SET\n data = jsonb_set(lt_knowledge.data, $5::text[], $6::jsonb, true),\n tags = ARRAY(SELECT DISTINCT unnest(lt_knowledge.tags || EXCLUDED.tags))\n RETURNING id, domain, key, (xmax = 0) AS created, updated_at";
11
+ export declare const REMOVE_KNOWLEDGE_FIELD = "\n UPDATE lt_knowledge\n SET data = data #- $3::text[]\n WHERE domain = $1 AND key = $2\n RETURNING id, domain, key, updated_at";
9
12
  export declare const APPEND_KNOWLEDGE = "\n INSERT INTO lt_knowledge (domain, key, data)\n VALUES ($1, $2, $3::jsonb)\n ON CONFLICT (domain, key) DO UPDATE SET\n data = CASE\n WHEN lt_knowledge.data #> $4::text[] IS NULL\n THEN jsonb_set(lt_knowledge.data, $4::text[], jsonb_build_array($5::jsonb))\n ELSE jsonb_set(lt_knowledge.data, $4::text[], (lt_knowledge.data #> $4::text[]) || jsonb_build_array($5::jsonb))\n END\n RETURNING id, domain, key, updated_at";