@rudderhq/server 0.1.0-canary.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
  2. package/dist/bootstrap/register-api-routes.js +2 -0
  3. package/dist/bootstrap/register-api-routes.js.map +1 -1
  4. package/dist/bundled-plugins/plugin-linear/README.md +22 -0
  5. package/dist/bundled-plugins/plugin-linear/dist/manifest.js +183 -0
  6. package/dist/bundled-plugins/plugin-linear/dist/manifest.js.map +7 -0
  7. package/dist/bundled-plugins/plugin-linear/dist/ui/index.js +1229 -0
  8. package/dist/bundled-plugins/plugin-linear/dist/ui/index.js.map +7 -0
  9. package/dist/bundled-plugins/plugin-linear/dist/worker.js +8251 -0
  10. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +7 -0
  11. package/dist/bundled-plugins/plugin-linear/package.json +42 -0
  12. package/dist/dev-server-status.d.ts +1 -7
  13. package/dist/dev-server-status.d.ts.map +1 -1
  14. package/dist/dev-server-status.js +1 -4
  15. package/dist/dev-server-status.js.map +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +77 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/langfuse-transcript.d.ts +1 -0
  21. package/dist/langfuse-transcript.d.ts.map +1 -1
  22. package/dist/langfuse-transcript.js +24 -0
  23. package/dist/langfuse-transcript.js.map +1 -1
  24. package/dist/onboarding-assets/ceo/MEMORY.md +13 -0
  25. package/dist/onboarding-assets/ceo/SOUL.md +28 -0
  26. package/dist/onboarding-assets/ceo/TOOLS.md +1 -1
  27. package/dist/onboarding-assets/default/MEMORY.md +13 -0
  28. package/dist/onboarding-assets/default/SOUL.md +29 -0
  29. package/dist/onboarding-assets/default/TOOLS.md +1 -1
  30. package/dist/routes/agents.d.ts.map +1 -1
  31. package/dist/routes/agents.js +4 -3
  32. package/dist/routes/agents.js.map +1 -1
  33. package/dist/routes/calendar.d.ts +3 -0
  34. package/dist/routes/calendar.d.ts.map +1 -0
  35. package/dist/routes/calendar.js +265 -0
  36. package/dist/routes/calendar.js.map +1 -0
  37. package/dist/routes/chats.d.ts.map +1 -1
  38. package/dist/routes/chats.js +149 -21
  39. package/dist/routes/chats.js.map +1 -1
  40. package/dist/routes/dashboard.d.ts.map +1 -1
  41. package/dist/routes/dashboard.js +24 -0
  42. package/dist/routes/dashboard.js.map +1 -1
  43. package/dist/routes/goals.d.ts.map +1 -1
  44. package/dist/routes/goals.js +10 -0
  45. package/dist/routes/goals.js.map +1 -1
  46. package/dist/routes/health.d.ts.map +1 -1
  47. package/dist/routes/health.js +3 -12
  48. package/dist/routes/health.js.map +1 -1
  49. package/dist/routes/index.d.ts +1 -0
  50. package/dist/routes/index.d.ts.map +1 -1
  51. package/dist/routes/index.js +1 -0
  52. package/dist/routes/index.js.map +1 -1
  53. package/dist/routes/instance-settings.d.ts.map +1 -1
  54. package/dist/routes/instance-settings.js +1 -26
  55. package/dist/routes/instance-settings.js.map +1 -1
  56. package/dist/routes/issues.d.ts.map +1 -1
  57. package/dist/routes/issues.js +74 -34
  58. package/dist/routes/issues.js.map +1 -1
  59. package/dist/routes/orgs.d.ts.map +1 -1
  60. package/dist/routes/orgs.js +161 -145
  61. package/dist/routes/orgs.js.map +1 -1
  62. package/dist/routes/plugins.d.ts.map +1 -1
  63. package/dist/routes/plugins.js +30 -7
  64. package/dist/routes/plugins.js.map +1 -1
  65. package/dist/services/agent-instructions.d.ts.map +1 -1
  66. package/dist/services/agent-instructions.js +23 -7
  67. package/dist/services/agent-instructions.js.map +1 -1
  68. package/dist/services/agent-run-context.d.ts +1 -1
  69. package/dist/services/agent-run-context.js +1 -1
  70. package/dist/services/agent-run-context.js.map +1 -1
  71. package/dist/services/agents.d.ts +13 -13
  72. package/dist/services/assets.d.ts +2 -2
  73. package/dist/services/calendar.d.ts +137 -0
  74. package/dist/services/calendar.d.ts.map +1 -0
  75. package/dist/services/calendar.js +1279 -0
  76. package/dist/services/calendar.js.map +1 -0
  77. package/dist/services/chat-assistant.d.ts.map +1 -1
  78. package/dist/services/chat-assistant.js +75 -15
  79. package/dist/services/chat-assistant.js.map +1 -1
  80. package/dist/services/chat-generation-locks.d.ts +2 -1
  81. package/dist/services/chat-generation-locks.d.ts.map +1 -1
  82. package/dist/services/chat-generation-locks.js +12 -3
  83. package/dist/services/chat-generation-locks.js.map +1 -1
  84. package/dist/services/chats.d.ts +4 -2
  85. package/dist/services/chats.d.ts.map +1 -1
  86. package/dist/services/chats.js +2 -15
  87. package/dist/services/chats.js.map +1 -1
  88. package/dist/services/costs.d.ts +2 -2
  89. package/dist/services/default-agent-instructions.d.ts +2 -2
  90. package/dist/services/default-agent-instructions.js +2 -2
  91. package/dist/services/documents.d.ts +23 -0
  92. package/dist/services/documents.d.ts.map +1 -1
  93. package/dist/services/documents.js +17 -1
  94. package/dist/services/documents.js.map +1 -1
  95. package/dist/services/export-jobs.d.ts +16 -0
  96. package/dist/services/export-jobs.d.ts.map +1 -0
  97. package/dist/services/export-jobs.js +147 -0
  98. package/dist/services/export-jobs.js.map +1 -0
  99. package/dist/services/finance.d.ts +6 -6
  100. package/dist/services/goals.d.ts +16 -10
  101. package/dist/services/goals.d.ts.map +1 -1
  102. package/dist/services/goals.js +201 -18
  103. package/dist/services/goals.js.map +1 -1
  104. package/dist/services/index.d.ts +3 -0
  105. package/dist/services/index.d.ts.map +1 -1
  106. package/dist/services/index.js +3 -0
  107. package/dist/services/index.js.map +1 -1
  108. package/dist/services/instance-settings.d.ts +1 -3
  109. package/dist/services/instance-settings.d.ts.map +1 -1
  110. package/dist/services/instance-settings.js +1 -38
  111. package/dist/services/instance-settings.js.map +1 -1
  112. package/dist/services/issue-approvals.d.ts +1 -1
  113. package/dist/services/issues.d.ts +12 -0
  114. package/dist/services/issues.d.ts.map +1 -1
  115. package/dist/services/issues.js +107 -1
  116. package/dist/services/issues.js.map +1 -1
  117. package/dist/services/knowledge-portability/organization-portability.d.ts +12 -2
  118. package/dist/services/knowledge-portability/organization-portability.d.ts.map +1 -1
  119. package/dist/services/knowledge-portability/organization-portability.js +77 -4
  120. package/dist/services/knowledge-portability/organization-portability.js.map +1 -1
  121. package/dist/services/messenger.d.ts +2 -2
  122. package/dist/services/messenger.d.ts.map +1 -1
  123. package/dist/services/messenger.js +67 -27
  124. package/dist/services/messenger.js.map +1 -1
  125. package/dist/services/organization-workspace-browser.d.ts.map +1 -1
  126. package/dist/services/organization-workspace-browser.js +3 -0
  127. package/dist/services/organization-workspace-browser.js.map +1 -1
  128. package/dist/services/plugin-registry.d.ts +8 -8
  129. package/dist/services/runtime-kernel/heartbeat.d.ts +6 -0
  130. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  131. package/dist/services/runtime-kernel/heartbeat.js +236 -99
  132. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  133. package/dist/services/runtime-kernel/model-fallback.d.ts +10 -0
  134. package/dist/services/runtime-kernel/model-fallback.d.ts.map +1 -0
  135. package/dist/services/runtime-kernel/model-fallback.js +147 -0
  136. package/dist/services/runtime-kernel/model-fallback.js.map +1 -0
  137. package/dist/services/secrets.d.ts +1 -3
  138. package/dist/services/secrets.d.ts.map +1 -1
  139. package/dist/services/secrets.js +55 -30
  140. package/dist/services/secrets.js.map +1 -1
  141. package/dist/services/workspace-backups.d.ts +34 -0
  142. package/dist/services/workspace-backups.d.ts.map +1 -0
  143. package/dist/services/workspace-backups.js +519 -0
  144. package/dist/services/workspace-backups.js.map +1 -0
  145. package/dist/services/workspace-runtime.d.ts +2 -2
  146. package/package.json +14 -14
  147. package/resources/bundled-skills/para-memory-files/SKILL.md +3 -1
  148. package/resources/bundled-skills/rudder-create-agent/SKILL.md +21 -4
  149. package/resources/bundled-skills/rudder-create-agent/references/api-reference.md +8 -3
  150. package/resources/bundled-skills/rudder-create-agent/references/cli-reference.md +8 -2
  151. package/skills/para-memory-files/SKILL.md +3 -1
  152. package/skills/rudder-create-agent/SKILL.md +21 -4
  153. package/skills/rudder-create-agent/references/api-reference.md +8 -3
  154. package/skills/rudder-create-agent/references/cli-reference.md +8 -2
  155. package/ui-dist/assets/{_basePickBy-C5FevVGb.js → _basePickBy-9EA6dBFj.js} +1 -1
  156. package/ui-dist/assets/{_baseUniq-Bp5Cq-Lt.js → _baseUniq-puJRDjRm.js} +1 -1
  157. package/ui-dist/assets/{arc-DxCinQZQ.js → arc-BuvB_2Wz.js} +1 -1
  158. package/ui-dist/assets/{architectureDiagram-2XIMDMQ5-Bt4OB6rg.js → architectureDiagram-2XIMDMQ5-DNH3NcPr.js} +1 -1
  159. package/ui-dist/assets/{blockDiagram-WCTKOSBZ-AfUyCHdW.js → blockDiagram-WCTKOSBZ-CCjA-egI.js} +1 -1
  160. package/ui-dist/assets/{c4Diagram-IC4MRINW-ZQmapm_f.js → c4Diagram-IC4MRINW-DaAxG30_.js} +1 -1
  161. package/ui-dist/assets/channel-BHmUwLHY.js +1 -0
  162. package/ui-dist/assets/{chunk-4BX2VUAB-b-nhg8XG.js → chunk-4BX2VUAB-CuuLnPLx.js} +1 -1
  163. package/ui-dist/assets/{chunk-55IACEB6-D_mWeaWL.js → chunk-55IACEB6-7KqKHU50.js} +1 -1
  164. package/ui-dist/assets/{chunk-FMBD7UC4-CvCBPkxY.js → chunk-FMBD7UC4-CquRnk_C.js} +1 -1
  165. package/ui-dist/assets/{chunk-JSJVCQXG-CyIzde6d.js → chunk-JSJVCQXG-Cub6UI-9.js} +1 -1
  166. package/ui-dist/assets/{chunk-KX2RTZJC-664uOAt1.js → chunk-KX2RTZJC-D-R4Pk61.js} +1 -1
  167. package/ui-dist/assets/{chunk-NQ4KR5QH-zC9eKlQL.js → chunk-NQ4KR5QH-YQLRgLCT.js} +1 -1
  168. package/ui-dist/assets/{chunk-QZHKN3VN-Bso6mrAm.js → chunk-QZHKN3VN-BgxQG6QM.js} +1 -1
  169. package/ui-dist/assets/{chunk-WL4C6EOR-CGgjDf4Q.js → chunk-WL4C6EOR-CVJNOFb-.js} +1 -1
  170. package/ui-dist/assets/classDiagram-VBA2DB6C-BykYYXhO.js +1 -0
  171. package/ui-dist/assets/classDiagram-v2-RAHNMMFH-BykYYXhO.js +1 -0
  172. package/ui-dist/assets/clone-BjbqkGJk.js +1 -0
  173. package/ui-dist/assets/{cose-bilkent-S5V4N54A-ChfhiHs0.js → cose-bilkent-S5V4N54A-BGYYdPRC.js} +1 -1
  174. package/ui-dist/assets/{dagre-KLK3FWXG-BtdGql15.js → dagre-KLK3FWXG-CDgRaJNK.js} +1 -1
  175. package/ui-dist/assets/{diagram-E7M64L7V-CcQq6lyW.js → diagram-E7M64L7V-CQEBiicN.js} +1 -1
  176. package/ui-dist/assets/{diagram-IFDJBPK2-C8MRQ8-O.js → diagram-IFDJBPK2-cGKTVrZq.js} +1 -1
  177. package/ui-dist/assets/{diagram-P4PSJMXO-wDtyafSS.js → diagram-P4PSJMXO-fGAfKBU_.js} +1 -1
  178. package/ui-dist/assets/{erDiagram-INFDFZHY-DSPOGKs9.js → erDiagram-INFDFZHY-DW5vJI98.js} +1 -1
  179. package/ui-dist/assets/{flowDiagram-PKNHOUZH-CMRO_o51.js → flowDiagram-PKNHOUZH-CikVuzCR.js} +1 -1
  180. package/ui-dist/assets/{ganttDiagram-A5KZAMGK-ByVpG5X7.js → ganttDiagram-A5KZAMGK-Ca4perbO.js} +1 -1
  181. package/ui-dist/assets/{gitGraphDiagram-K3NZZRJ6-C0hZhA2f.js → gitGraphDiagram-K3NZZRJ6-hkDkX0wB.js} +1 -1
  182. package/ui-dist/assets/{graph-8ZSpiLvu.js → graph-CKVwuNpm.js} +1 -1
  183. package/ui-dist/assets/{index-Jl3ZTphD.js → index-B24_1Y25.js} +1 -1
  184. package/ui-dist/assets/{index-Bnqrds93.js → index-BCSq0Y_A.js} +1 -1
  185. package/ui-dist/assets/{index-LxYtcd2q.js → index-BbX5RwLL.js} +1 -1
  186. package/ui-dist/assets/{index-BuxAGDe1.js → index-Bj5f8srw.js} +1 -1
  187. package/ui-dist/assets/{index-CrjKYwlq.js → index-Bm5RRuGQ.js} +1 -1
  188. package/ui-dist/assets/{index-Byt3a14a.js → index-BzHEDVXA.js} +1 -1
  189. package/ui-dist/assets/{index-C96r3ncF.js → index-C5IbLmrM.js} +1 -1
  190. package/ui-dist/assets/{index-DSa_Y_jA.js → index-CBuiHrHJ.js} +1 -1
  191. package/ui-dist/assets/{index-CsgWTWOx.js → index-CGtsmbZm.js} +1 -1
  192. package/ui-dist/assets/{index-Dolr9Kee.js → index-CIlRDiw5.js} +1 -1
  193. package/ui-dist/assets/{index-tGztn4Is.js → index-CT8eqX9W.js} +1 -1
  194. package/ui-dist/assets/{index-CeJdOYIF.js → index-CjD2xZdW.js} +1 -1
  195. package/ui-dist/assets/{index-C7DEZ3Ju.js → index-DFeHRm34.js} +1 -1
  196. package/ui-dist/assets/{index-ChJl_hqp.js → index-DI-FLO2Z.js} +1 -1
  197. package/ui-dist/assets/{index-D083o6by.js → index-DJ84yjUf.js} +1 -1
  198. package/ui-dist/assets/index-DTw34fFZ.js +1398 -0
  199. package/ui-dist/assets/{index--8IW0gQi.js → index-DZ6kUIBM.js} +1 -1
  200. package/ui-dist/assets/{index-D5fB3OrO.js → index-DdFp0EEO.js} +1 -1
  201. package/ui-dist/assets/{index-BYlbpnGO.js → index-Dm4kNTCW.js} +1 -1
  202. package/ui-dist/assets/{index-DIlroFT7.js → index-aK5eezHP.js} +1 -1
  203. package/ui-dist/assets/{index-DoCNo7J9.js → index-dd4k0fyq.js} +1 -1
  204. package/ui-dist/assets/index-jnv9Ql_2.css +1 -0
  205. package/ui-dist/assets/{index-Do2QEU2O.js → index-kGMjx6qb.js} +1 -1
  206. package/ui-dist/assets/{index-DGliz_Zl.js → index-qEEWalog.js} +1 -1
  207. package/ui-dist/assets/{infoDiagram-LFFYTUFH-CRObxa1Q.js → infoDiagram-LFFYTUFH-aDNdkSKW.js} +1 -1
  208. package/ui-dist/assets/{ishikawaDiagram-PHBUUO56-ksXzVP6h.js → ishikawaDiagram-PHBUUO56-CmclzHhC.js} +1 -1
  209. package/ui-dist/assets/{journeyDiagram-4ABVD52K-DhLhkeS3.js → journeyDiagram-4ABVD52K-BFnBxKuG.js} +1 -1
  210. package/ui-dist/assets/{kanban-definition-K7BYSVSG-CJPHwSur.js → kanban-definition-K7BYSVSG-eJfOZg7R.js} +1 -1
  211. package/ui-dist/assets/{layout-CbB6lAw2.js → layout-CLRiNHgA.js} +1 -1
  212. package/ui-dist/assets/{linear-HPte01nq.js → linear-B-J9sUer.js} +1 -1
  213. package/ui-dist/assets/{mermaid.core-CaHTquLw.js → mermaid.core-C1MjBOIN.js} +4 -4
  214. package/ui-dist/assets/{mindmap-definition-YRQLILUH-CeZ9z-BE.js → mindmap-definition-YRQLILUH-BdvCmP6e.js} +1 -1
  215. package/ui-dist/assets/{pieDiagram-SKSYHLDU-YB621clF.js → pieDiagram-SKSYHLDU-BAITPD_t.js} +1 -1
  216. package/ui-dist/assets/{quadrantDiagram-337W2JSQ-KPDGBXfE.js → quadrantDiagram-337W2JSQ-BFnjyhzq.js} +1 -1
  217. package/ui-dist/assets/{requirementDiagram-Z7DCOOCP-CnMP-_Rj.js → requirementDiagram-Z7DCOOCP-Bxg6tlLh.js} +1 -1
  218. package/ui-dist/assets/{sankeyDiagram-WA2Y5GQK-rWDbj38-.js → sankeyDiagram-WA2Y5GQK-LPpklLQK.js} +1 -1
  219. package/ui-dist/assets/{sequenceDiagram-2WXFIKYE-D5IlEfYm.js → sequenceDiagram-2WXFIKYE-D-W6lss0.js} +1 -1
  220. package/ui-dist/assets/{stateDiagram-RAJIS63D-CI6m7yMI.js → stateDiagram-RAJIS63D-Bzo5M8P7.js} +1 -1
  221. package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-DJ1MxF2S.js +1 -0
  222. package/ui-dist/assets/{timeline-definition-YZTLITO2-Bl1-YzON.js → timeline-definition-YZTLITO2-luuVqyTW.js} +1 -1
  223. package/ui-dist/assets/{treemap-KZPCXAKY-CcFSGzuM.js → treemap-KZPCXAKY-ChGqzx5u.js} +1 -1
  224. package/ui-dist/assets/{vennDiagram-LZ73GAT5-DpgfFxeZ.js → vennDiagram-LZ73GAT5-BCEjZinK.js} +1 -1
  225. package/ui-dist/assets/{xychartDiagram-JWTSCODW-Bas4tWGP.js → xychartDiagram-JWTSCODW-mAsE6hMg.js} +1 -1
  226. package/ui-dist/index.html +2 -2
  227. package/dist/onboarding-assets/ceo/AGENTS.md +0 -33
  228. package/dist/onboarding-assets/default/AGENTS.md +0 -9
  229. package/ui-dist/assets/channel-B-3UKZ6E.js +0 -1
  230. package/ui-dist/assets/classDiagram-VBA2DB6C-DJbF61vn.js +0 -1
  231. package/ui-dist/assets/classDiagram-v2-RAHNMMFH-DJbF61vn.js +0 -1
  232. package/ui-dist/assets/clone-B7Z_Fd8l.js +0 -1
  233. package/ui-dist/assets/index-B4jXCLTd.js +0 -1358
  234. package/ui-dist/assets/index-C187WwUh.css +0 -1
  235. package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-DMNsLapT.js +0 -1
@@ -1,13 +1,14 @@
1
1
  import path from "node:path";
2
2
  import { and, asc, desc, eq, gt, gte, inArray, lte, sql } from "drizzle-orm";
3
- import { agents, agentRuntimeState, agentTaskSessions, agentWakeupRequests, activityLog, heartbeatRunEvents, heartbeatRuns, issueComments, issues, projects, } from "@rudderhq/db";
3
+ import { AGENT_RUN_CONCURRENCY_DEFAULT, AGENT_RUN_CONCURRENCY_MAX, AGENT_RUN_CONCURRENCY_MIN, } from "@rudderhq/shared";
4
+ import { agents, agentRuntimeState, agentTaskSessions, agentWakeupRequests, activityLog, heartbeatRunEvents, heartbeatRuns, issueComments, issues, organizations, projects, } from "@rudderhq/db";
4
5
  import { conflict, notFound } from "../../errors.js";
5
6
  import { createExecutionScores, observeExecutionEvent, updateExecutionObservation, updateExecutionTraceIO, updateExecutionTraceName, updateExecutionTraceSession, withExecutionObservation, } from "../../langfuse.js";
6
7
  import { emitExecutionTranscriptTree } from "../../langfuse-transcript.js";
7
8
  import { logger } from "../../middleware/logger.js";
8
9
  import { publishLiveEvent } from "../live-events.js";
9
10
  import { getRunLogStore } from "../run-log-store.js";
10
- import { getServerAdapter, runningProcesses } from "../../agent-runtimes/index.js";
11
+ import { findServerAdapter, getServerAdapter, runningProcesses } from "../../agent-runtimes/index.js";
11
12
  import { createLocalAgentJwt } from "../../agent-auth-jwt.js";
12
13
  import { parseObject, asBoolean, asNumber, appendWithCap, MAX_EXCERPT_BYTES } from "../../agent-runtimes/utils.js";
13
14
  import { costService } from "../costs.js";
@@ -27,10 +28,12 @@ import { logActivity } from "../activity-log.js";
27
28
  import { redactCurrentUserText, redactCurrentUserValue } from "../../log-redaction.js";
28
29
  import { hasSessionCompactionThresholds, resolveSessionCompactionPolicy, } from "@rudderhq/agent-runtime-utils";
29
30
  import { buildCreateAgentBenchmarkTags, coerceCreateAgentBenchmarkMetadata, extractCreateAgentBenchmarkMetadata, } from "@rudderhq/run-intelligence-core";
31
+ import { executeAdapterWithModelFallbacks } from "./model-fallback.js";
30
32
  export { prioritizeProjectWorkspaceCandidatesForRun } from "../agent-run-context.js";
31
33
  const MAX_LIVE_LOG_CHUNK_BYTES = 8 * 1024;
32
- const HEARTBEAT_MAX_CONCURRENT_RUNS_DEFAULT = 1;
33
- const HEARTBEAT_MAX_CONCURRENT_RUNS_MAX = 10;
34
+ const HEARTBEAT_MAX_CONCURRENT_RUNS_DEFAULT = AGENT_RUN_CONCURRENCY_DEFAULT;
35
+ const HEARTBEAT_MAX_CONCURRENT_RUNS_MIN = AGENT_RUN_CONCURRENCY_MIN;
36
+ const HEARTBEAT_MAX_CONCURRENT_RUNS_MAX = AGENT_RUN_CONCURRENCY_MAX;
34
37
  const DEFERRED_WAKE_CONTEXT_KEY = "_paperclipWakeContext";
35
38
  const DETACHED_PROCESS_ERROR_CODE = "process_detached";
36
39
  const ORPHANED_PROCESS_TERMINATION_GRACE_MS = 2_000;
@@ -118,7 +121,7 @@ function normalizeMaxConcurrentRuns(value) {
118
121
  const parsed = Math.floor(asNumber(value, HEARTBEAT_MAX_CONCURRENT_RUNS_DEFAULT));
119
122
  if (!Number.isFinite(parsed))
120
123
  return HEARTBEAT_MAX_CONCURRENT_RUNS_DEFAULT;
121
- return Math.max(HEARTBEAT_MAX_CONCURRENT_RUNS_DEFAULT, Math.min(HEARTBEAT_MAX_CONCURRENT_RUNS_MAX, parsed));
124
+ return Math.max(HEARTBEAT_MAX_CONCURRENT_RUNS_MIN, Math.min(HEARTBEAT_MAX_CONCURRENT_RUNS_MAX, parsed));
122
125
  }
123
126
  async function withAgentStartLock(agentId, fn) {
124
127
  const previous = startLocksByAgent.get(agentId) ?? Promise.resolve();
@@ -173,9 +176,20 @@ export function buildHeartbeatRuntimeTraceMetadata(input) {
173
176
  };
174
177
  }
175
178
  export function buildHeartbeatAdapterInvokePayload(input) {
179
+ const explicitUsedSkills = Array.isArray(input.meta.usedSkills)
180
+ ? input.meta.usedSkills
181
+ .map((entry) => normalizeLoadedSkill(entry))
182
+ .filter((entry) => Boolean(entry))
183
+ : [];
184
+ const usedSkills = explicitUsedSkills.length > 0
185
+ ? explicitUsedSkills
186
+ : inferUsedSkillsFromPrompt(input.meta.prompt, input.runtimeSkills);
176
187
  return {
177
188
  ...input.meta,
178
189
  ...summarizeRuntimeSkillsForTrace(input.runtimeSkills),
190
+ usedSkillCount: usedSkills.length,
191
+ usedSkillKeys: usedSkills.map((entry) => entry.key),
192
+ usedSkills,
179
193
  };
180
194
  }
181
195
  function buildRecentDateKeys(windowDays, now) {
@@ -221,6 +235,92 @@ function normalizeLoadedSkill(value) {
221
235
  const label = rawRuntimeName ?? rawName ?? fallbackSkillLabel(key);
222
236
  return { key, label };
223
237
  }
238
+ function normalizeSkillCandidate(value) {
239
+ return value
240
+ ?.trim()
241
+ .replace(/^\$/u, "")
242
+ .replace(/[?#].*$/u, "")
243
+ .replace(/\/+$/u, "")
244
+ .toLowerCase() || "";
245
+ }
246
+ function addSkillCandidate(candidates, value) {
247
+ const normalized = normalizeSkillCandidate(value);
248
+ if (!normalized)
249
+ return;
250
+ candidates.add(normalized);
251
+ const lastSegment = normalized.split(/[/:]/u).filter(Boolean).at(-1);
252
+ if (lastSegment)
253
+ candidates.add(lastSegment);
254
+ }
255
+ function readSkillReferenceSlug(href) {
256
+ const normalized = href.trim().replace(/[?#].*$/u, "").replace(/\/+$/u, "");
257
+ if (!normalized)
258
+ return null;
259
+ if (normalized.endsWith("/SKILL.md")) {
260
+ return normalized.slice(0, -"/SKILL.md".length).split("/").filter(Boolean).at(-1) ?? null;
261
+ }
262
+ if (normalized.toLowerCase().endsWith(".md")) {
263
+ const fileName = normalized.split("/").filter(Boolean).at(-1) ?? "";
264
+ return fileName.replace(/\.md$/iu, "") || null;
265
+ }
266
+ return null;
267
+ }
268
+ function collectSkillReferences(prompt) {
269
+ const references = [];
270
+ const pattern = /\[([^\]\n]+)\]\(([^)\n]+(?:\/SKILL\.md|\.md)(?:[?#][^)\n]*)?)\)/giu;
271
+ for (const match of prompt.matchAll(pattern)) {
272
+ const rawLabel = match[1]?.trim() ?? "";
273
+ const href = match[2]?.trim() ?? "";
274
+ if (!rawLabel || !href)
275
+ continue;
276
+ const labelWithoutPrefix = rawLabel.replace(/^\$/u, "").trim();
277
+ const slug = readSkillReferenceSlug(href);
278
+ const isExplicitSkillToken = rawLabel.startsWith("$") || href.replace(/[?#].*$/u, "").endsWith("/SKILL.md");
279
+ if (!isExplicitSkillToken)
280
+ continue;
281
+ const key = labelWithoutPrefix || slug;
282
+ if (!key)
283
+ continue;
284
+ const label = slug ?? fallbackSkillLabel(key);
285
+ const candidates = new Set();
286
+ addSkillCandidate(candidates, labelWithoutPrefix);
287
+ addSkillCandidate(candidates, slug);
288
+ addSkillCandidate(candidates, href);
289
+ references.push({ key, label, candidates });
290
+ }
291
+ return references;
292
+ }
293
+ function inferUsedSkillsFromPrompt(prompt, loadedSkills) {
294
+ const promptText = readNonEmptyString(prompt);
295
+ if (!promptText)
296
+ return [];
297
+ const references = collectSkillReferences(promptText);
298
+ if (references.length === 0)
299
+ return [];
300
+ const loaded = loadedSkills
301
+ .map((entry) => normalizeLoadedSkill(entry))
302
+ .filter((entry) => Boolean(entry))
303
+ .map((entry) => {
304
+ const candidates = new Set();
305
+ addSkillCandidate(candidates, entry.key);
306
+ addSkillCandidate(candidates, entry.label);
307
+ return { ...entry, candidates };
308
+ });
309
+ const used = new Map();
310
+ for (const reference of references) {
311
+ const matched = loaded.find((entry) => {
312
+ for (const candidate of reference.candidates) {
313
+ if (entry.candidates.has(candidate))
314
+ return true;
315
+ }
316
+ return false;
317
+ });
318
+ const normalized = matched ?? { key: reference.key, label: reference.label };
319
+ if (!used.has(normalized.key))
320
+ used.set(normalized.key, normalized);
321
+ }
322
+ return Array.from(used.values());
323
+ }
224
324
  function normalizeLedgerBillingType(value) {
225
325
  const raw = readNonEmptyString(value);
226
326
  switch (raw) {
@@ -1201,6 +1301,7 @@ export function heartbeatService(db) {
1201
1301
  const existing = await getRuntimeState(agent.id);
1202
1302
  if (existing)
1203
1303
  return existing;
1304
+ const now = new Date();
1204
1305
  return db
1205
1306
  .insert(agentRuntimeState)
1206
1307
  .values({
@@ -1208,6 +1309,16 @@ export function heartbeatService(db) {
1208
1309
  orgId: agent.orgId,
1209
1310
  agentRuntimeType: agent.agentRuntimeType,
1210
1311
  stateJson: {},
1312
+ createdAt: now,
1313
+ updatedAt: now,
1314
+ })
1315
+ .onConflictDoUpdate({
1316
+ target: agentRuntimeState.agentId,
1317
+ set: {
1318
+ orgId: agent.orgId,
1319
+ agentRuntimeType: agent.agentRuntimeType,
1320
+ updatedAt: now,
1321
+ },
1211
1322
  })
1212
1323
  .returning()
1213
1324
  .then((rows) => rows[0]);
@@ -2183,6 +2294,7 @@ export function heartbeatService(db) {
2183
2294
  let stderrTranscriptBuffer = "";
2184
2295
  let stdoutTranscriptParser = null;
2185
2296
  let transcriptFallbackResult = null;
2297
+ let modelTurnInput;
2186
2298
  let finalObservationOutput = null;
2187
2299
  let finalObservationStatus = run.status;
2188
2300
  let finalObservationSessionId = heartbeatObservationContext.sessionKey ?? null;
@@ -2701,6 +2813,7 @@ export function heartbeatService(db) {
2701
2813
  meta.env[key] = "***REDACTED***";
2702
2814
  }
2703
2815
  }
2816
+ modelTurnInput = meta.prompt;
2704
2817
  heartbeatObservationContext.metadata = {
2705
2818
  ...(heartbeatObservationContext.metadata ?? {}),
2706
2819
  ...buildHeartbeatRuntimeTraceMetadata({
@@ -2734,7 +2847,7 @@ export function heartbeatService(db) {
2734
2847
  agentRuntimeType: agent.agentRuntimeType,
2735
2848
  }, "local agent jwt secret missing or invalid; running without injected RUDDER_API_KEY");
2736
2849
  }
2737
- const adapterResult = await adapter.execute({
2850
+ const adapterResult = await executeAdapterWithModelFallbacks(adapter, {
2738
2851
  runId: run.id,
2739
2852
  agent,
2740
2853
  runtime: runtimeForAdapter,
@@ -2746,6 +2859,12 @@ export function heartbeatService(db) {
2746
2859
  await persistRunProcessMetadata(run.id, meta);
2747
2860
  },
2748
2861
  authToken: authToken ?? undefined,
2862
+ }, {
2863
+ resolveAdapter: findServerAdapter,
2864
+ createAuthToken: (agentRuntimeType) => createLocalAgentJwt(agent.id, agent.orgId, agentRuntimeType, run.id) ?? undefined,
2865
+ onAttemptStart: (_attempt, attemptAdapter) => {
2866
+ stdoutTranscriptParser = attemptAdapter.parseStdoutLine ?? null;
2867
+ },
2749
2868
  });
2750
2869
  const adapterManagedRuntimeServices = adapterResult.runtimeServices
2751
2870
  ? await persistAdapterManagedRuntimeServices({
@@ -3028,6 +3147,7 @@ export function heartbeatService(db) {
3028
3147
  context: heartbeatObservationContext,
3029
3148
  parentObservation: observation,
3030
3149
  transcript: executionTranscript,
3150
+ initialTurnInput: modelTurnInput,
3031
3151
  fallbackResult: transcriptFallbackResult,
3032
3152
  });
3033
3153
  finalObservationOutput = transcriptStats.finalOutput ?? transcriptFallbackResult?.output ?? null;
@@ -4092,6 +4212,104 @@ export function heartbeatService(db) {
4092
4212
  now: opts?.now ?? new Date(),
4093
4213
  });
4094
4214
  }
4215
+ async function buildSkillAnalytics(scope, opts) {
4216
+ const now = opts?.now ?? new Date();
4217
+ const customDateKeys = opts?.startDate && opts?.endDate
4218
+ ? buildDateKeysBetween(opts.startDate, opts.endDate).slice(0, 120)
4219
+ : [];
4220
+ const windowDays = customDateKeys.length > 0
4221
+ ? customDateKeys.length
4222
+ : Math.max(1, Math.min(opts?.windowDays ?? 30, 90));
4223
+ const dateKeys = customDateKeys.length > 0
4224
+ ? customDateKeys
4225
+ : buildRecentDateKeys(windowDays, now);
4226
+ const startDate = dateKeys[0];
4227
+ const endDate = dateKeys.at(-1);
4228
+ const windowStart = new Date(`${startDate}T00:00:00.000Z`);
4229
+ const windowEnd = new Date(`${endDate}T23:59:59.999Z`);
4230
+ const rows = await db
4231
+ .select({
4232
+ createdAt: heartbeatRunEvents.createdAt,
4233
+ payload: heartbeatRunEvents.payload,
4234
+ })
4235
+ .from(heartbeatRunEvents)
4236
+ .where(and(eq(heartbeatRunEvents.orgId, scope.orgId), ...(scope.agentId ? [eq(heartbeatRunEvents.agentId, scope.agentId)] : []), eq(heartbeatRunEvents.eventType, "adapter.invoke"), gte(heartbeatRunEvents.createdAt, windowStart), lte(heartbeatRunEvents.createdAt, windowEnd)))
4237
+ .orderBy(asc(heartbeatRunEvents.createdAt), asc(heartbeatRunEvents.id));
4238
+ const days = new Map();
4239
+ for (const date of dateKeys) {
4240
+ days.set(date, { totalCount: 0, runCount: 0, skills: new Map() });
4241
+ }
4242
+ const overallSkills = new Map();
4243
+ let totalCount = 0;
4244
+ let totalRunsWithSkills = 0;
4245
+ for (const row of rows) {
4246
+ const date = new Date(row.createdAt).toISOString().slice(0, 10);
4247
+ const bucket = days.get(date);
4248
+ if (!bucket)
4249
+ continue;
4250
+ const payload = parseObject(row.payload);
4251
+ const loadedSkills = Array.isArray(payload.loadedSkills) ? payload.loadedSkills : [];
4252
+ const usedSkills = Array.isArray(payload.usedSkills)
4253
+ ? payload.usedSkills
4254
+ : inferUsedSkillsFromPrompt(payload.prompt, loadedSkills);
4255
+ if (usedSkills.length === 0)
4256
+ continue;
4257
+ const eventSkills = new Map();
4258
+ for (const entry of usedSkills) {
4259
+ const normalized = normalizeLoadedSkill(entry);
4260
+ if (!normalized)
4261
+ continue;
4262
+ if (!eventSkills.has(normalized.key)) {
4263
+ eventSkills.set(normalized.key, normalized.label);
4264
+ }
4265
+ }
4266
+ if (eventSkills.size === 0)
4267
+ continue;
4268
+ bucket.runCount += 1;
4269
+ totalRunsWithSkills += 1;
4270
+ for (const [key, label] of eventSkills) {
4271
+ bucket.totalCount += 1;
4272
+ totalCount += 1;
4273
+ const existingDaySkill = bucket.skills.get(key);
4274
+ if (existingDaySkill) {
4275
+ existingDaySkill.count += 1;
4276
+ }
4277
+ else {
4278
+ bucket.skills.set(key, { key, label, count: 1 });
4279
+ }
4280
+ const existingOverallSkill = overallSkills.get(key);
4281
+ if (existingOverallSkill) {
4282
+ existingOverallSkill.count += 1;
4283
+ }
4284
+ else {
4285
+ overallSkills.set(key, { key, label, count: 1 });
4286
+ }
4287
+ }
4288
+ }
4289
+ return {
4290
+ agentId: scope.agentId ?? "__all__",
4291
+ orgId: scope.orgId,
4292
+ windowDays,
4293
+ startDate,
4294
+ endDate,
4295
+ totalCount,
4296
+ totalRunsWithSkills,
4297
+ skills: Array.from(overallSkills.values()).sort((left, right) => (right.count - left.count
4298
+ || left.label.localeCompare(right.label)
4299
+ || left.key.localeCompare(right.key))),
4300
+ days: dateKeys.map((date) => {
4301
+ const bucket = days.get(date);
4302
+ return {
4303
+ date,
4304
+ totalCount: bucket.totalCount,
4305
+ runCount: bucket.runCount,
4306
+ skills: Array.from(bucket.skills.values()).sort((left, right) => (right.count - left.count
4307
+ || left.label.localeCompare(right.label)
4308
+ || left.key.localeCompare(right.key))),
4309
+ };
4310
+ }),
4311
+ };
4312
+ }
4095
4313
  return {
4096
4314
  list: async (orgId, agentId, limit) => {
4097
4315
  const query = db
@@ -4111,99 +4329,18 @@ export function heartbeatService(db) {
4111
4329
  const agent = await getAgent(agentId);
4112
4330
  if (!agent)
4113
4331
  throw notFound("Agent not found");
4114
- const now = opts?.now ?? new Date();
4115
- const customDateKeys = opts?.startDate && opts?.endDate
4116
- ? buildDateKeysBetween(opts.startDate, opts.endDate).slice(0, 120)
4117
- : [];
4118
- const windowDays = customDateKeys.length > 0
4119
- ? customDateKeys.length
4120
- : Math.max(1, Math.min(opts?.windowDays ?? 30, 90));
4121
- const dateKeys = customDateKeys.length > 0
4122
- ? customDateKeys
4123
- : buildRecentDateKeys(windowDays, now);
4124
- const startDate = dateKeys[0];
4125
- const endDate = dateKeys.at(-1);
4126
- const windowStart = new Date(`${startDate}T00:00:00.000Z`);
4127
- const windowEnd = new Date(`${endDate}T23:59:59.999Z`);
4128
- const rows = await db
4129
- .select({
4130
- createdAt: heartbeatRunEvents.createdAt,
4131
- payload: heartbeatRunEvents.payload,
4132
- })
4133
- .from(heartbeatRunEvents)
4134
- .where(and(eq(heartbeatRunEvents.orgId, agent.orgId), eq(heartbeatRunEvents.agentId, agent.id), eq(heartbeatRunEvents.eventType, "adapter.invoke"), gte(heartbeatRunEvents.createdAt, windowStart), lte(heartbeatRunEvents.createdAt, windowEnd)))
4135
- .orderBy(asc(heartbeatRunEvents.createdAt), asc(heartbeatRunEvents.id));
4136
- const days = new Map();
4137
- for (const date of dateKeys) {
4138
- days.set(date, { totalCount: 0, runCount: 0, skills: new Map() });
4139
- }
4140
- const overallSkills = new Map();
4141
- let totalCount = 0;
4142
- let totalRunsWithSkills = 0;
4143
- for (const row of rows) {
4144
- const date = new Date(row.createdAt).toISOString().slice(0, 10);
4145
- const bucket = days.get(date);
4146
- if (!bucket)
4147
- continue;
4148
- const payload = parseObject(row.payload);
4149
- const loadedSkills = Array.isArray(payload.loadedSkills) ? payload.loadedSkills : [];
4150
- if (loadedSkills.length === 0)
4151
- continue;
4152
- const eventSkills = new Map();
4153
- for (const entry of loadedSkills) {
4154
- const normalized = normalizeLoadedSkill(entry);
4155
- if (!normalized)
4156
- continue;
4157
- if (!eventSkills.has(normalized.key)) {
4158
- eventSkills.set(normalized.key, normalized.label);
4159
- }
4160
- }
4161
- if (eventSkills.size === 0)
4162
- continue;
4163
- bucket.runCount += 1;
4164
- totalRunsWithSkills += 1;
4165
- for (const [key, label] of eventSkills) {
4166
- bucket.totalCount += 1;
4167
- totalCount += 1;
4168
- const existingDaySkill = bucket.skills.get(key);
4169
- if (existingDaySkill) {
4170
- existingDaySkill.count += 1;
4171
- }
4172
- else {
4173
- bucket.skills.set(key, { key, label, count: 1 });
4174
- }
4175
- const existingOverallSkill = overallSkills.get(key);
4176
- if (existingOverallSkill) {
4177
- existingOverallSkill.count += 1;
4178
- }
4179
- else {
4180
- overallSkills.set(key, { key, label, count: 1 });
4181
- }
4182
- }
4183
- }
4184
- return {
4185
- agentId: agent.id,
4186
- orgId: agent.orgId,
4187
- windowDays,
4188
- startDate,
4189
- endDate,
4190
- totalCount,
4191
- totalRunsWithSkills,
4192
- skills: Array.from(overallSkills.values()).sort((left, right) => (right.count - left.count
4193
- || left.label.localeCompare(right.label)
4194
- || left.key.localeCompare(right.key))),
4195
- days: dateKeys.map((date) => {
4196
- const bucket = days.get(date);
4197
- return {
4198
- date,
4199
- totalCount: bucket.totalCount,
4200
- runCount: bucket.runCount,
4201
- skills: Array.from(bucket.skills.values()).sort((left, right) => (right.count - left.count
4202
- || left.label.localeCompare(right.label)
4203
- || left.key.localeCompare(right.key))),
4204
- };
4205
- }),
4206
- };
4332
+ return buildSkillAnalytics({ orgId: agent.orgId, agentId: agent.id }, opts);
4333
+ },
4334
+ getOrganizationSkillAnalytics: async (orgId, opts) => {
4335
+ const org = await db
4336
+ .select({ id: organizations.id })
4337
+ .from(organizations)
4338
+ .where(eq(organizations.id, orgId))
4339
+ .limit(1)
4340
+ .then((rows) => rows[0] ?? null);
4341
+ if (!org)
4342
+ throw notFound("Organization not found");
4343
+ return buildSkillAnalytics({ orgId }, opts);
4207
4344
  },
4208
4345
  getRun,
4209
4346
  getRuntimeState: async (agentId) => {