@rudderhq/agent-runtime-hermes-gateway 0.7.2

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.
@@ -0,0 +1,128 @@
1
+ import { asString, parseObject } from "@rudderhq/agent-runtime-utils/server-utils";
2
+ import { asRecord, baseUrl, endpoint, hasBearerAuth, HERMES_SUPPORTED_VERSIONS, preflightBaseUrl, requestJson } from "./http.js";
3
+ function status(checks) {
4
+ if (checks.some((check) => check.level === "error"))
5
+ return "fail";
6
+ if (checks.some((check) => check.level === "warn"))
7
+ return "warn";
8
+ return "pass";
9
+ }
10
+ function versionOf(value) {
11
+ const match = String(value ?? "").trim().match(/\b(\d+\.\d+\.\d+)\b/);
12
+ return match?.[1] ?? null;
13
+ }
14
+ function endpointPath(capabilities, name) {
15
+ const endpointMap = asRecord(capabilities.endpoints);
16
+ const entry = asRecord(endpointMap?.[name]);
17
+ return typeof entry?.path === "string" ? entry.path : null;
18
+ }
19
+ const REQUIRED_ENDPOINTS = {
20
+ runs: "/v1/runs",
21
+ run_status: "/v1/runs/{run_id}",
22
+ run_events: "/v1/runs/{run_id}/events",
23
+ run_approval: "/v1/runs/{run_id}/approval",
24
+ run_stop: "/v1/runs/{run_id}/stop",
25
+ sessions: "/api/sessions",
26
+ session_create: "/api/sessions",
27
+ session: "/api/sessions/{session_id}",
28
+ session_messages: "/api/sessions/{session_id}/messages",
29
+ };
30
+ export async function testEnvironment(ctx) {
31
+ const checks = [];
32
+ const config = parseObject(ctx.config);
33
+ const configured = asString(config.url, "").trim();
34
+ const base = baseUrl(configured);
35
+ if (!configured) {
36
+ checks.push({ code: "hermes_gateway_url_missing", level: "error", message: "Hermes API Server URL is required." });
37
+ }
38
+ else if (!base) {
39
+ checks.push({ code: "hermes_gateway_url_invalid", level: "error", message: "Hermes URL must be an http(s) loopback endpoint without userinfo, query, or fragment." });
40
+ }
41
+ else {
42
+ checks.push({ code: "hermes_gateway_url_valid", level: "info", message: `Configured Hermes API Server: ${base.toString()}` });
43
+ const timeoutMs = 5_000;
44
+ const preflight = await preflightBaseUrl(base);
45
+ if (!preflight.ok) {
46
+ checks.push({ code: "hermes_gateway_endpoint_rejected", level: "error", message: preflight.reason });
47
+ return { agentRuntimeType: ctx.agentRuntimeType, status: status(checks), checks, testedAt: new Date().toISOString() };
48
+ }
49
+ if (!hasBearerAuth(config)) {
50
+ checks.push({ code: "hermes_gateway_bearer_missing", level: "error", message: "Hermes API Server requires an explicit Bearer API key." });
51
+ return { agentRuntimeType: ctx.agentRuntimeType, status: status(checks), checks, testedAt: new Date().toISOString() };
52
+ }
53
+ try {
54
+ const health = await requestJson(endpoint(base, "/health"), config, {}, timeoutMs);
55
+ if (!health.response.ok) {
56
+ checks.push({ code: "hermes_gateway_health_failed", level: "error", message: `Hermes health returned HTTP ${health.response.status}.` });
57
+ }
58
+ else {
59
+ const version = versionOf(health.body.version);
60
+ if (!version || !HERMES_SUPPORTED_VERSIONS.includes(version)) {
61
+ checks.push({ code: "hermes_gateway_version_unsupported", level: "error", message: `Hermes version ${version ?? "unknown"} is not in the supported compatibility matrix.` });
62
+ }
63
+ else {
64
+ checks.push({ code: "hermes_gateway_health_ok", level: "info", message: `Hermes API Server is healthy (version ${version}).` });
65
+ }
66
+ }
67
+ }
68
+ catch (error) {
69
+ checks.push({ code: "hermes_gateway_health_unreachable", level: "error", message: error instanceof Error ? error.message : "Hermes health probe failed." });
70
+ }
71
+ try {
72
+ const detailed = await requestJson(endpoint(base, "/health/detailed"), config, {}, timeoutMs);
73
+ if (!detailed.response.ok) {
74
+ checks.push({ code: "hermes_gateway_health_detailed_failed", level: "error", message: `Hermes detailed health returned HTTP ${detailed.response.status}.` });
75
+ }
76
+ else {
77
+ const runtime = asRecord(detailed.body.readiness) ?? asRecord(detailed.body.runtime);
78
+ if (runtime && typeof runtime.mode === "string" && runtime.mode !== "server_agent") {
79
+ checks.push({ code: "hermes_gateway_runtime_mode_unsupported", level: "error", message: `Hermes runtime mode ${runtime.mode} is not server_agent.` });
80
+ }
81
+ else {
82
+ checks.push({ code: "hermes_gateway_health_detailed_ok", level: "info", message: "Hermes detailed readiness probe succeeded." });
83
+ }
84
+ }
85
+ }
86
+ catch (error) {
87
+ checks.push({ code: "hermes_gateway_health_detailed_unreachable", level: "error", message: error instanceof Error ? error.message : "Hermes detailed health probe failed." });
88
+ }
89
+ try {
90
+ const capabilities = await requestJson(endpoint(base, "/v1/capabilities"), config, {}, timeoutMs);
91
+ if (!capabilities.response.ok) {
92
+ checks.push({ code: "hermes_gateway_capabilities_failed", level: "error", message: `Hermes capabilities returned HTTP ${capabilities.response.status}.` });
93
+ }
94
+ else {
95
+ const features = asRecord(capabilities.body.features) ?? {};
96
+ const required = ["run_submission", "run_status", "run_events_sse", "run_stop", "run_approval_response", "session_resources"];
97
+ const missing = required.filter((key) => features[key] !== true);
98
+ const runtime = asRecord(capabilities.body.runtime);
99
+ if (runtime?.tool_execution !== "server")
100
+ missing.push("tool_execution:server");
101
+ const missingEndpoints = Object.entries(REQUIRED_ENDPOINTS).filter(([key, path]) => endpointPath(capabilities.body, key) !== path).map(([key]) => key);
102
+ if (missing.length > 0 || missingEndpoints.length > 0) {
103
+ checks.push({ code: "hermes_gateway_capabilities_incomplete", level: "error", message: `Hermes API Server is missing required capabilities: ${[...missing, ...missingEndpoints.map((key) => `endpoint:${key}`)].join(", ")}.` });
104
+ }
105
+ else {
106
+ checks.push({ code: "hermes_gateway_capabilities_ok", level: "info", message: "Hermes Runs, events, approval, stop, and session capabilities are available." });
107
+ }
108
+ }
109
+ }
110
+ catch (error) {
111
+ checks.push({ code: "hermes_gateway_capabilities_unreachable", level: "error", message: error instanceof Error ? error.message : "Hermes capabilities probe failed." });
112
+ }
113
+ try {
114
+ const models = await requestJson(endpoint(base, "/v1/models"), config, {}, timeoutMs);
115
+ if (!models.response.ok) {
116
+ checks.push({ code: "hermes_gateway_models_failed", level: "warn", message: `Hermes models returned HTTP ${models.response.status}.` });
117
+ }
118
+ else {
119
+ checks.push({ code: "hermes_gateway_models_ok", level: "info", message: "Hermes model discovery succeeded." });
120
+ }
121
+ }
122
+ catch (error) {
123
+ checks.push({ code: "hermes_gateway_models_unreachable", level: "warn", message: error instanceof Error ? error.message : "Hermes models probe failed." });
124
+ }
125
+ }
126
+ return { agentRuntimeType: ctx.agentRuntimeType, status: status(checks), checks, testedAt: new Date().toISOString() };
127
+ }
128
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEjI,SAAS,MAAM,CAAC,MAAsC;IACpD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IACnE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAClE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,YAAqC,EAAE,IAAY;IACvE,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,OAAO,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,MAAM,kBAAkB,GAA2B;IACjD,IAAI,EAAE,UAAU;IAChB,UAAU,EAAE,mBAAmB;IAC/B,UAAU,EAAE,0BAA0B;IACtC,YAAY,EAAE,4BAA4B;IAC1C,QAAQ,EAAE,wBAAwB;IAClC,QAAQ,EAAE,eAAe;IACzB,cAAc,EAAE,eAAe;IAC/B,OAAO,EAAE,4BAA4B;IACrC,gBAAgB,EAAE,qCAAqC;CACxD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAuC;IAEvC,MAAM,MAAM,GAAmC,EAAE,CAAC;IAClD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;IACrH,CAAC;SAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,uFAAuF,EAAE,CAAC,CAAC;IACxK,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iCAAiC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9H,MAAM,SAAS,GAAG,KAAK,CAAC;QACxB,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YACrG,OAAO,EAAE,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACxH,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,+BAA+B,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,wDAAwD,EAAE,CAAC,CAAC;YAC1I,OAAO,EAAE,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACxH,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;YACnF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,+BAA+B,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;YAC3I,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/C,IAAI,CAAC,OAAO,IAAI,CAAE,yBAA+C,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oCAAoC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,OAAO,IAAI,SAAS,gDAAgD,EAAE,CAAC,CAAC;gBAC/K,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,yCAAyC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAClI,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,EAAE,CAAC,CAAC;QAC9J,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;YAC9F,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uCAAuC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,wCAAwC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;YAC/J,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrF,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBACnF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,yCAAyC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,OAAO,CAAC,IAAI,uBAAuB,EAAE,CAAC,CAAC;gBACxJ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC,CAAC;gBACnI,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,4CAA4C,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC,EAAE,CAAC,CAAC;QAChL,CAAC;QAED,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;YAClG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oCAAoC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,qCAAqC,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;YAC7J,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC5D,MAAM,QAAQ,GAAG,CAAC,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,uBAAuB,EAAE,mBAAmB,CAAC,CAAC;gBAC9H,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;gBACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpD,IAAI,OAAO,EAAE,cAAc,KAAK,QAAQ;oBAAE,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBAChF,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBACvJ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wCAAwC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,uDAAuD,CAAC,GAAG,OAAO,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACnO,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,8EAA8E,EAAE,CAAC,CAAC;gBAClK,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,yCAAyC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC,EAAE,CAAC,CAAC;QAC1K,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;YACtF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,+BAA+B,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;YAC1I,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;YACjH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,EAAE,CAAC,CAAC;QAC7J,CAAC;IACH,CAAC;IACD,OAAO,EAAE,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AACxH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { parseHermesGatewayStdoutLine } from "./parse-stdout.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { parseHermesGatewayStdoutLine } from "./parse-stdout.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TranscriptEntry } from "@rudderhq/agent-runtime-utils";
2
+ export declare function parseHermesGatewayStdoutLine(line: string, ts: string): TranscriptEntry[];
3
+ //# sourceMappingURL=parse-stdout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.d.ts","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAmCrE,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,EAAE,CAQxF"}
@@ -0,0 +1,44 @@
1
+ function asString(value) {
2
+ return typeof value === "string" ? value : "";
3
+ }
4
+ function parseEvent(value) {
5
+ try {
6
+ const parsed = JSON.parse(value);
7
+ return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
8
+ ? parsed
9
+ : null;
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ function parseEventLine(line, ts) {
16
+ const match = line.match(/^\[hermes-gateway:event\]\s+run=([^\s]+)\s+type=([^\s]+)\s+(?:data|summary)=(.*)$/s);
17
+ if (!match)
18
+ return [{ kind: "system", ts, text: line.replace(/^\[hermes-gateway:event\]\s*/, "") }];
19
+ const event = parseEvent(match[3].trim());
20
+ if (!event)
21
+ return [{ kind: "system", ts, text: line.replace(/^\[hermes-gateway:event\]\s*/, "") }];
22
+ const type = match[2].toLowerCase();
23
+ if (["run.failed", "run.cancelled", "error"].includes(type)) {
24
+ const error = asString(event.error) || asString(event.message) || asString(event.output);
25
+ if (error)
26
+ return [{ kind: "stderr", ts, text: error }];
27
+ }
28
+ const text = asString(event.delta) || asString(event.output) || asString(event.content) || asString(event.message);
29
+ if (!text)
30
+ return [];
31
+ return [{ kind: "assistant", ts, text, ...(type === "message.delta" ? { delta: true } : {}) }];
32
+ }
33
+ export function parseHermesGatewayStdoutLine(line, ts) {
34
+ const trimmed = line.trim();
35
+ if (!trimmed)
36
+ return [];
37
+ if (trimmed.startsWith("[hermes-gateway:event]"))
38
+ return parseEventLine(trimmed, ts);
39
+ if (trimmed.startsWith("[hermes-gateway]")) {
40
+ return [{ kind: "system", ts, text: trimmed.replace(/^\[hermes-gateway\]\s*/, "") }];
41
+ }
42
+ return [{ kind: "stdout", ts, text: line }];
43
+ }
44
+ //# sourceMappingURL=parse-stdout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.js","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-stdout.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.test.d.ts","sourceRoot":"","sources":["../../src/ui/parse-stdout.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parseHermesGatewayStdoutLine } from "./parse-stdout.js";
3
+ const ts = "2026-08-07T00:00:00.000Z";
4
+ describe("Hermes gateway transcript parser", () => {
5
+ it("parses streamed deltas and terminal output from persisted event lines", () => {
6
+ const lines = [
7
+ '[hermes-gateway:event] run=run-1 type=message.delta data={"delta":"hello "}',
8
+ '[hermes-gateway:event] run=run-1 type=message.delta data={"delta":"from Hermes"}',
9
+ '[hermes-gateway:event] run=run-1 type=run.completed data={"output":"hello from Hermes"}',
10
+ ];
11
+ expect(lines.flatMap((line) => parseHermesGatewayStdoutLine(line, ts))).toEqual([
12
+ { kind: "assistant", ts, text: "hello ", delta: true },
13
+ { kind: "assistant", ts, text: "from Hermes", delta: true },
14
+ { kind: "assistant", ts, text: "hello from Hermes" },
15
+ ]);
16
+ });
17
+ it("preserves provider failures as stderr evidence", () => {
18
+ expect(parseHermesGatewayStdoutLine('[hermes-gateway:event] run=run-1 type=run.failed data={"error":"provider unavailable"}', ts)).toEqual([{ kind: "stderr", ts, text: "provider unavailable" }]);
19
+ });
20
+ });
21
+ //# sourceMappingURL=parse-stdout.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.test.js","sourceRoot":"","sources":["../../src/ui/parse-stdout.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,EAAE,GAAG,0BAA0B,CAAC;AAEtC,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,KAAK,GAAG;YACZ,6EAA6E;YAC7E,kFAAkF;YAClF,yFAAyF;SAC1F,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,4BAA4B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9E,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;YACtD,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE;YAC3D,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;SACrD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,4BAA4B,CACjC,wFAAwF,EACxF,EAAE,CACH,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@rudderhq/agent-runtime-hermes-gateway",
3
+ "version": "0.7.2",
4
+ "license": "SEE LICENSE IN LICENSE",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./server": {
13
+ "types": "./dist/server/index.d.ts",
14
+ "import": "./dist/server/index.js",
15
+ "default": "./dist/server/index.js"
16
+ },
17
+ "./ui": {
18
+ "types": "./dist/ui/index.d.ts",
19
+ "import": "./dist/ui/index.js",
20
+ "default": "./dist/ui/index.js"
21
+ }
22
+ },
23
+ "publishConfig": {
24
+ "access": "public",
25
+ "main": "./dist/index.js",
26
+ "types": "./dist/index.d.ts",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.js"
31
+ },
32
+ "./server": {
33
+ "types": "./dist/server/index.d.ts",
34
+ "import": "./dist/server/index.js"
35
+ },
36
+ "./ui": {
37
+ "types": "./dist/ui/index.d.ts",
38
+ "import": "./dist/ui/index.js"
39
+ }
40
+ }
41
+ },
42
+ "files": [
43
+ "dist"
44
+ ],
45
+ "scripts": {
46
+ "build": "tsc",
47
+ "clean": "rm -rf dist",
48
+ "typecheck": "tsc --noEmit"
49
+ },
50
+ "dependencies": {
51
+ "@rudderhq/agent-runtime-utils": "0.7.2"
52
+ },
53
+ "devDependencies": {
54
+ "@types/node": "^24.12.0",
55
+ "typescript": "^5.9.3"
56
+ },
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "https://github.com/Undertone0809/rudder",
60
+ "directory": "packages/agent-runtimes/hermes-gateway"
61
+ },
62
+ "main": "./dist/index.js",
63
+ "types": "./dist/index.d.ts"
64
+ }