@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.
- package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
- package/dist/bootstrap/register-api-routes.js +2 -0
- package/dist/bootstrap/register-api-routes.js.map +1 -1
- package/dist/bundled-plugins/plugin-linear/README.md +22 -0
- package/dist/bundled-plugins/plugin-linear/dist/manifest.js +183 -0
- package/dist/bundled-plugins/plugin-linear/dist/manifest.js.map +7 -0
- package/dist/bundled-plugins/plugin-linear/dist/ui/index.js +1229 -0
- package/dist/bundled-plugins/plugin-linear/dist/ui/index.js.map +7 -0
- package/dist/bundled-plugins/plugin-linear/dist/worker.js +8251 -0
- package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +7 -0
- package/dist/bundled-plugins/plugin-linear/package.json +42 -0
- package/dist/dev-server-status.d.ts +1 -7
- package/dist/dev-server-status.d.ts.map +1 -1
- package/dist/dev-server-status.js +1 -4
- package/dist/dev-server-status.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +77 -1
- package/dist/index.js.map +1 -1
- package/dist/langfuse-transcript.d.ts +1 -0
- package/dist/langfuse-transcript.d.ts.map +1 -1
- package/dist/langfuse-transcript.js +24 -0
- package/dist/langfuse-transcript.js.map +1 -1
- package/dist/onboarding-assets/ceo/MEMORY.md +13 -0
- package/dist/onboarding-assets/ceo/SOUL.md +28 -0
- package/dist/onboarding-assets/ceo/TOOLS.md +1 -1
- package/dist/onboarding-assets/default/MEMORY.md +13 -0
- package/dist/onboarding-assets/default/SOUL.md +29 -0
- package/dist/onboarding-assets/default/TOOLS.md +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +4 -3
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/calendar.d.ts +3 -0
- package/dist/routes/calendar.d.ts.map +1 -0
- package/dist/routes/calendar.js +265 -0
- package/dist/routes/calendar.js.map +1 -0
- package/dist/routes/chats.d.ts.map +1 -1
- package/dist/routes/chats.js +149 -21
- package/dist/routes/chats.js.map +1 -1
- package/dist/routes/dashboard.d.ts.map +1 -1
- package/dist/routes/dashboard.js +24 -0
- package/dist/routes/dashboard.js.map +1 -1
- package/dist/routes/goals.d.ts.map +1 -1
- package/dist/routes/goals.js +10 -0
- package/dist/routes/goals.js.map +1 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +3 -12
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +1 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/instance-settings.d.ts.map +1 -1
- package/dist/routes/instance-settings.js +1 -26
- package/dist/routes/instance-settings.js.map +1 -1
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +74 -34
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/orgs.d.ts.map +1 -1
- package/dist/routes/orgs.js +161 -145
- package/dist/routes/orgs.js.map +1 -1
- package/dist/routes/plugins.d.ts.map +1 -1
- package/dist/routes/plugins.js +30 -7
- package/dist/routes/plugins.js.map +1 -1
- package/dist/services/agent-instructions.d.ts.map +1 -1
- package/dist/services/agent-instructions.js +23 -7
- package/dist/services/agent-instructions.js.map +1 -1
- package/dist/services/agent-run-context.d.ts +1 -1
- package/dist/services/agent-run-context.js +1 -1
- package/dist/services/agent-run-context.js.map +1 -1
- package/dist/services/agents.d.ts +13 -13
- package/dist/services/assets.d.ts +2 -2
- package/dist/services/calendar.d.ts +137 -0
- package/dist/services/calendar.d.ts.map +1 -0
- package/dist/services/calendar.js +1279 -0
- package/dist/services/calendar.js.map +1 -0
- package/dist/services/chat-assistant.d.ts.map +1 -1
- package/dist/services/chat-assistant.js +75 -15
- package/dist/services/chat-assistant.js.map +1 -1
- package/dist/services/chat-generation-locks.d.ts +2 -1
- package/dist/services/chat-generation-locks.d.ts.map +1 -1
- package/dist/services/chat-generation-locks.js +12 -3
- package/dist/services/chat-generation-locks.js.map +1 -1
- package/dist/services/chats.d.ts +4 -2
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.js +2 -15
- package/dist/services/chats.js.map +1 -1
- package/dist/services/costs.d.ts +2 -2
- package/dist/services/default-agent-instructions.d.ts +2 -2
- package/dist/services/default-agent-instructions.js +2 -2
- package/dist/services/documents.d.ts +23 -0
- package/dist/services/documents.d.ts.map +1 -1
- package/dist/services/documents.js +17 -1
- package/dist/services/documents.js.map +1 -1
- package/dist/services/export-jobs.d.ts +16 -0
- package/dist/services/export-jobs.d.ts.map +1 -0
- package/dist/services/export-jobs.js +147 -0
- package/dist/services/export-jobs.js.map +1 -0
- package/dist/services/finance.d.ts +6 -6
- package/dist/services/goals.d.ts +16 -10
- package/dist/services/goals.d.ts.map +1 -1
- package/dist/services/goals.js +201 -18
- package/dist/services/goals.js.map +1 -1
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-settings.d.ts +1 -3
- package/dist/services/instance-settings.d.ts.map +1 -1
- package/dist/services/instance-settings.js +1 -38
- package/dist/services/instance-settings.js.map +1 -1
- package/dist/services/issue-approvals.d.ts +1 -1
- package/dist/services/issues.d.ts +12 -0
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.js +107 -1
- package/dist/services/issues.js.map +1 -1
- package/dist/services/knowledge-portability/organization-portability.d.ts +12 -2
- package/dist/services/knowledge-portability/organization-portability.d.ts.map +1 -1
- package/dist/services/knowledge-portability/organization-portability.js +77 -4
- package/dist/services/knowledge-portability/organization-portability.js.map +1 -1
- package/dist/services/messenger.d.ts +2 -2
- package/dist/services/messenger.d.ts.map +1 -1
- package/dist/services/messenger.js +67 -27
- package/dist/services/messenger.js.map +1 -1
- package/dist/services/organization-workspace-browser.d.ts.map +1 -1
- package/dist/services/organization-workspace-browser.js +3 -0
- package/dist/services/organization-workspace-browser.js.map +1 -1
- package/dist/services/plugin-registry.d.ts +8 -8
- package/dist/services/runtime-kernel/heartbeat.d.ts +6 -0
- package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.js +236 -99
- package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
- package/dist/services/runtime-kernel/model-fallback.d.ts +10 -0
- package/dist/services/runtime-kernel/model-fallback.d.ts.map +1 -0
- package/dist/services/runtime-kernel/model-fallback.js +147 -0
- package/dist/services/runtime-kernel/model-fallback.js.map +1 -0
- package/dist/services/secrets.d.ts +1 -3
- package/dist/services/secrets.d.ts.map +1 -1
- package/dist/services/secrets.js +55 -30
- package/dist/services/secrets.js.map +1 -1
- package/dist/services/workspace-backups.d.ts +34 -0
- package/dist/services/workspace-backups.d.ts.map +1 -0
- package/dist/services/workspace-backups.js +519 -0
- package/dist/services/workspace-backups.js.map +1 -0
- package/dist/services/workspace-runtime.d.ts +2 -2
- package/package.json +14 -14
- package/resources/bundled-skills/para-memory-files/SKILL.md +3 -1
- package/resources/bundled-skills/rudder-create-agent/SKILL.md +21 -4
- package/resources/bundled-skills/rudder-create-agent/references/api-reference.md +8 -3
- package/resources/bundled-skills/rudder-create-agent/references/cli-reference.md +8 -2
- package/skills/para-memory-files/SKILL.md +3 -1
- package/skills/rudder-create-agent/SKILL.md +21 -4
- package/skills/rudder-create-agent/references/api-reference.md +8 -3
- package/skills/rudder-create-agent/references/cli-reference.md +8 -2
- package/ui-dist/assets/{_basePickBy-C5FevVGb.js → _basePickBy-9EA6dBFj.js} +1 -1
- package/ui-dist/assets/{_baseUniq-Bp5Cq-Lt.js → _baseUniq-puJRDjRm.js} +1 -1
- package/ui-dist/assets/{arc-DxCinQZQ.js → arc-BuvB_2Wz.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-2XIMDMQ5-Bt4OB6rg.js → architectureDiagram-2XIMDMQ5-DNH3NcPr.js} +1 -1
- package/ui-dist/assets/{blockDiagram-WCTKOSBZ-AfUyCHdW.js → blockDiagram-WCTKOSBZ-CCjA-egI.js} +1 -1
- package/ui-dist/assets/{c4Diagram-IC4MRINW-ZQmapm_f.js → c4Diagram-IC4MRINW-DaAxG30_.js} +1 -1
- package/ui-dist/assets/channel-BHmUwLHY.js +1 -0
- package/ui-dist/assets/{chunk-4BX2VUAB-b-nhg8XG.js → chunk-4BX2VUAB-CuuLnPLx.js} +1 -1
- package/ui-dist/assets/{chunk-55IACEB6-D_mWeaWL.js → chunk-55IACEB6-7KqKHU50.js} +1 -1
- package/ui-dist/assets/{chunk-FMBD7UC4-CvCBPkxY.js → chunk-FMBD7UC4-CquRnk_C.js} +1 -1
- package/ui-dist/assets/{chunk-JSJVCQXG-CyIzde6d.js → chunk-JSJVCQXG-Cub6UI-9.js} +1 -1
- package/ui-dist/assets/{chunk-KX2RTZJC-664uOAt1.js → chunk-KX2RTZJC-D-R4Pk61.js} +1 -1
- package/ui-dist/assets/{chunk-NQ4KR5QH-zC9eKlQL.js → chunk-NQ4KR5QH-YQLRgLCT.js} +1 -1
- package/ui-dist/assets/{chunk-QZHKN3VN-Bso6mrAm.js → chunk-QZHKN3VN-BgxQG6QM.js} +1 -1
- package/ui-dist/assets/{chunk-WL4C6EOR-CGgjDf4Q.js → chunk-WL4C6EOR-CVJNOFb-.js} +1 -1
- package/ui-dist/assets/classDiagram-VBA2DB6C-BykYYXhO.js +1 -0
- package/ui-dist/assets/classDiagram-v2-RAHNMMFH-BykYYXhO.js +1 -0
- package/ui-dist/assets/clone-BjbqkGJk.js +1 -0
- package/ui-dist/assets/{cose-bilkent-S5V4N54A-ChfhiHs0.js → cose-bilkent-S5V4N54A-BGYYdPRC.js} +1 -1
- package/ui-dist/assets/{dagre-KLK3FWXG-BtdGql15.js → dagre-KLK3FWXG-CDgRaJNK.js} +1 -1
- package/ui-dist/assets/{diagram-E7M64L7V-CcQq6lyW.js → diagram-E7M64L7V-CQEBiicN.js} +1 -1
- package/ui-dist/assets/{diagram-IFDJBPK2-C8MRQ8-O.js → diagram-IFDJBPK2-cGKTVrZq.js} +1 -1
- package/ui-dist/assets/{diagram-P4PSJMXO-wDtyafSS.js → diagram-P4PSJMXO-fGAfKBU_.js} +1 -1
- package/ui-dist/assets/{erDiagram-INFDFZHY-DSPOGKs9.js → erDiagram-INFDFZHY-DW5vJI98.js} +1 -1
- package/ui-dist/assets/{flowDiagram-PKNHOUZH-CMRO_o51.js → flowDiagram-PKNHOUZH-CikVuzCR.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-A5KZAMGK-ByVpG5X7.js → ganttDiagram-A5KZAMGK-Ca4perbO.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-K3NZZRJ6-C0hZhA2f.js → gitGraphDiagram-K3NZZRJ6-hkDkX0wB.js} +1 -1
- package/ui-dist/assets/{graph-8ZSpiLvu.js → graph-CKVwuNpm.js} +1 -1
- package/ui-dist/assets/{index-Jl3ZTphD.js → index-B24_1Y25.js} +1 -1
- package/ui-dist/assets/{index-Bnqrds93.js → index-BCSq0Y_A.js} +1 -1
- package/ui-dist/assets/{index-LxYtcd2q.js → index-BbX5RwLL.js} +1 -1
- package/ui-dist/assets/{index-BuxAGDe1.js → index-Bj5f8srw.js} +1 -1
- package/ui-dist/assets/{index-CrjKYwlq.js → index-Bm5RRuGQ.js} +1 -1
- package/ui-dist/assets/{index-Byt3a14a.js → index-BzHEDVXA.js} +1 -1
- package/ui-dist/assets/{index-C96r3ncF.js → index-C5IbLmrM.js} +1 -1
- package/ui-dist/assets/{index-DSa_Y_jA.js → index-CBuiHrHJ.js} +1 -1
- package/ui-dist/assets/{index-CsgWTWOx.js → index-CGtsmbZm.js} +1 -1
- package/ui-dist/assets/{index-Dolr9Kee.js → index-CIlRDiw5.js} +1 -1
- package/ui-dist/assets/{index-tGztn4Is.js → index-CT8eqX9W.js} +1 -1
- package/ui-dist/assets/{index-CeJdOYIF.js → index-CjD2xZdW.js} +1 -1
- package/ui-dist/assets/{index-C7DEZ3Ju.js → index-DFeHRm34.js} +1 -1
- package/ui-dist/assets/{index-ChJl_hqp.js → index-DI-FLO2Z.js} +1 -1
- package/ui-dist/assets/{index-D083o6by.js → index-DJ84yjUf.js} +1 -1
- package/ui-dist/assets/index-DTw34fFZ.js +1398 -0
- package/ui-dist/assets/{index--8IW0gQi.js → index-DZ6kUIBM.js} +1 -1
- package/ui-dist/assets/{index-D5fB3OrO.js → index-DdFp0EEO.js} +1 -1
- package/ui-dist/assets/{index-BYlbpnGO.js → index-Dm4kNTCW.js} +1 -1
- package/ui-dist/assets/{index-DIlroFT7.js → index-aK5eezHP.js} +1 -1
- package/ui-dist/assets/{index-DoCNo7J9.js → index-dd4k0fyq.js} +1 -1
- package/ui-dist/assets/index-jnv9Ql_2.css +1 -0
- package/ui-dist/assets/{index-Do2QEU2O.js → index-kGMjx6qb.js} +1 -1
- package/ui-dist/assets/{index-DGliz_Zl.js → index-qEEWalog.js} +1 -1
- package/ui-dist/assets/{infoDiagram-LFFYTUFH-CRObxa1Q.js → infoDiagram-LFFYTUFH-aDNdkSKW.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-PHBUUO56-ksXzVP6h.js → ishikawaDiagram-PHBUUO56-CmclzHhC.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-4ABVD52K-DhLhkeS3.js → journeyDiagram-4ABVD52K-BFnBxKuG.js} +1 -1
- package/ui-dist/assets/{kanban-definition-K7BYSVSG-CJPHwSur.js → kanban-definition-K7BYSVSG-eJfOZg7R.js} +1 -1
- package/ui-dist/assets/{layout-CbB6lAw2.js → layout-CLRiNHgA.js} +1 -1
- package/ui-dist/assets/{linear-HPte01nq.js → linear-B-J9sUer.js} +1 -1
- package/ui-dist/assets/{mermaid.core-CaHTquLw.js → mermaid.core-C1MjBOIN.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-YRQLILUH-CeZ9z-BE.js → mindmap-definition-YRQLILUH-BdvCmP6e.js} +1 -1
- package/ui-dist/assets/{pieDiagram-SKSYHLDU-YB621clF.js → pieDiagram-SKSYHLDU-BAITPD_t.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-337W2JSQ-KPDGBXfE.js → quadrantDiagram-337W2JSQ-BFnjyhzq.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-Z7DCOOCP-CnMP-_Rj.js → requirementDiagram-Z7DCOOCP-Bxg6tlLh.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-WA2Y5GQK-rWDbj38-.js → sankeyDiagram-WA2Y5GQK-LPpklLQK.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-2WXFIKYE-D5IlEfYm.js → sequenceDiagram-2WXFIKYE-D-W6lss0.js} +1 -1
- package/ui-dist/assets/{stateDiagram-RAJIS63D-CI6m7yMI.js → stateDiagram-RAJIS63D-Bzo5M8P7.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-DJ1MxF2S.js +1 -0
- package/ui-dist/assets/{timeline-definition-YZTLITO2-Bl1-YzON.js → timeline-definition-YZTLITO2-luuVqyTW.js} +1 -1
- package/ui-dist/assets/{treemap-KZPCXAKY-CcFSGzuM.js → treemap-KZPCXAKY-ChGqzx5u.js} +1 -1
- package/ui-dist/assets/{vennDiagram-LZ73GAT5-DpgfFxeZ.js → vennDiagram-LZ73GAT5-BCEjZinK.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-JWTSCODW-Bas4tWGP.js → xychartDiagram-JWTSCODW-mAsE6hMg.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/dist/onboarding-assets/ceo/AGENTS.md +0 -33
- package/dist/onboarding-assets/default/AGENTS.md +0 -9
- package/ui-dist/assets/channel-B-3UKZ6E.js +0 -1
- package/ui-dist/assets/classDiagram-VBA2DB6C-DJbF61vn.js +0 -1
- package/ui-dist/assets/classDiagram-v2-RAHNMMFH-DJbF61vn.js +0 -1
- package/ui-dist/assets/clone-B7Z_Fd8l.js +0 -1
- package/ui-dist/assets/index-B4jXCLTd.js +0 -1358
- package/ui-dist/assets/index-C187WwUh.css +0 -1
- 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 {
|
|
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 =
|
|
33
|
-
const
|
|
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(
|
|
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
|
|
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
|
-
|
|
4115
|
-
|
|
4116
|
-
|
|
4117
|
-
|
|
4118
|
-
|
|
4119
|
-
|
|
4120
|
-
|
|
4121
|
-
|
|
4122
|
-
|
|
4123
|
-
|
|
4124
|
-
|
|
4125
|
-
|
|
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) => {
|