@agentmark-ai/cli 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/README.md +1 -0
- package/dist/.next/BUILD_ID +1 -0
- package/dist/.next/app-build-manifest.json +66 -0
- package/dist/.next/app-path-routes-manifest.json +7 -0
- package/dist/.next/build-manifest.json +33 -0
- package/dist/.next/cache/.previewinfo +1 -0
- package/dist/.next/cache/.rscinfo +1 -0
- package/dist/.next/cache/.tsbuildinfo +1 -0
- package/dist/.next/cache/config.json +7 -0
- package/dist/.next/cache/webpack/client-production/0.pack +0 -0
- package/dist/.next/cache/webpack/client-production/index.pack +0 -0
- package/dist/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/dist/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/dist/.next/cache/webpack/server-production/0.pack +0 -0
- package/dist/.next/cache/webpack/server-production/index.pack +0 -0
- package/dist/.next/diagnostics/build-diagnostics.json +6 -0
- package/dist/.next/diagnostics/framework.json +1 -0
- package/dist/.next/export-marker.json +6 -0
- package/dist/.next/images-manifest.json +57 -0
- package/dist/.next/next-minimal-server.js.nft.json +1 -0
- package/dist/.next/next-server.js.nft.json +1 -0
- package/dist/.next/package.json +1 -0
- package/dist/.next/prerender-manifest.json +133 -0
- package/dist/.next/react-loadable-manifest.json +1 -0
- package/dist/.next/required-server-files.json +325 -0
- package/dist/.next/routes-manifest.json +77 -0
- package/dist/.next/server/app/_not-found/page.js +2 -0
- package/dist/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/dist/.next/server/app/_not-found.html +1 -0
- package/dist/.next/server/app/_not-found.meta +8 -0
- package/dist/.next/server/app/_not-found.rsc +19 -0
- package/dist/.next/server/app/index.html +1 -0
- package/dist/.next/server/app/index.meta +7 -0
- package/dist/.next/server/app/index.rsc +20 -0
- package/dist/.next/server/app/page.js +2 -0
- package/dist/.next/server/app/page.js.nft.json +1 -0
- package/dist/.next/server/app/page_client-reference-manifest.js +1 -0
- package/dist/.next/server/app/requests/page.js +2 -0
- package/dist/.next/server/app/requests/page.js.nft.json +1 -0
- package/dist/.next/server/app/requests/page_client-reference-manifest.js +1 -0
- package/dist/.next/server/app/requests.html +1 -0
- package/dist/.next/server/app/requests.meta +7 -0
- package/dist/.next/server/app/requests.rsc +25 -0
- package/dist/.next/server/app/sessions/page.js +2 -0
- package/dist/.next/server/app/sessions/page.js.nft.json +1 -0
- package/dist/.next/server/app/sessions/page_client-reference-manifest.js +1 -0
- package/dist/.next/server/app/sessions.html +1 -0
- package/dist/.next/server/app/sessions.meta +7 -0
- package/dist/.next/server/app/sessions.rsc +25 -0
- package/dist/.next/server/app/traces/page.js +2 -0
- package/dist/.next/server/app/traces/page.js.nft.json +1 -0
- package/dist/.next/server/app/traces/page_client-reference-manifest.js +1 -0
- package/dist/.next/server/app/traces.html +1 -0
- package/dist/.next/server/app/traces.meta +7 -0
- package/dist/.next/server/app/traces.rsc +25 -0
- package/dist/.next/server/app-paths-manifest.json +7 -0
- package/dist/.next/server/chunks/18.js +198 -0
- package/dist/.next/server/chunks/383.js +6 -0
- package/dist/.next/server/chunks/478.js +22 -0
- package/dist/.next/server/chunks/547.js +1 -0
- package/dist/.next/server/chunks/84.js +138 -0
- package/dist/.next/server/functions-config-manifest.json +4 -0
- package/dist/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/dist/.next/server/middleware-build-manifest.js +1 -0
- package/dist/.next/server/middleware-manifest.json +6 -0
- package/dist/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/dist/.next/server/next-font-manifest.js +1 -0
- package/dist/.next/server/next-font-manifest.json +1 -0
- package/dist/.next/server/pages/404.html +1 -0
- package/dist/.next/server/pages/500.html +1 -0
- package/dist/.next/server/pages/_app.js +1 -0
- package/dist/.next/server/pages/_app.js.nft.json +1 -0
- package/dist/.next/server/pages/_document.js +1 -0
- package/dist/.next/server/pages/_document.js.nft.json +1 -0
- package/dist/.next/server/pages/_error.js +19 -0
- package/dist/.next/server/pages/_error.js.nft.json +1 -0
- package/dist/.next/server/pages-manifest.json +6 -0
- package/dist/.next/server/server-reference-manifest.js +1 -0
- package/dist/.next/server/server-reference-manifest.json +1 -0
- package/dist/.next/server/webpack-runtime.js +1 -0
- package/dist/.next/static/WXGM4V1PBw_hLKICZoZaB/_buildManifest.js +1 -0
- package/dist/.next/static/WXGM4V1PBw_hLKICZoZaB/_ssgManifest.js +1 -0
- package/dist/.next/static/chunks/18-57c2d8d3aff89bcb.js +1 -0
- package/dist/.next/static/chunks/248-9028c24b6529c0c7.js +77 -0
- package/dist/.next/static/chunks/41-1291c1f5f295280d.js +1 -0
- package/dist/.next/static/chunks/602-7e76e1ee986e97d5.js +28 -0
- package/dist/.next/static/chunks/6b3bb038-67c653ff0a93a5bd.js +1 -0
- package/dist/.next/static/chunks/87c73c54-09e1ba5c70e60a51.js +1 -0
- package/dist/.next/static/chunks/902-50df3a419e9a9cef.js +1 -0
- package/dist/.next/static/chunks/app/_not-found/page-6711055aaf38bfb8.js +1 -0
- package/dist/.next/static/chunks/app/layout-eaddb6da201ab019.js +1 -0
- package/dist/.next/static/chunks/app/page-93d2401dc395548b.js +1 -0
- package/dist/.next/static/chunks/app/requests/page-20818b6519923653.js +1 -0
- package/dist/.next/static/chunks/app/sessions/page-cff6cd4b8819d0e5.js +1 -0
- package/dist/.next/static/chunks/app/traces/page-e556a466332fc75b.js +1 -0
- package/dist/.next/static/chunks/baeaa4ff-0a317ff4d32584cd.js +1 -0
- package/dist/.next/static/chunks/framework-3c3dfe0642f415ba.js +1 -0
- package/dist/.next/static/chunks/main-314a36b6249f35e5.js +1 -0
- package/dist/.next/static/chunks/main-app-0b5725cb98f081b4.js +1 -0
- package/dist/.next/static/chunks/pages/_app-d6f6b3bbc3d81ee1.js +1 -0
- package/dist/.next/static/chunks/pages/_error-75a96cf1997cc3b9.js +1 -0
- package/dist/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/.next/static/chunks/webpack-f10b0ea54196b48e.js +1 -0
- package/dist/.next/static/css/a00826fc162bd22d.css +31 -0
- package/dist/.next/trace +51 -0
- package/dist/.next/types/app/layout.ts +84 -0
- package/dist/.next/types/app/page.ts +84 -0
- package/dist/.next/types/app/requests/page.ts +84 -0
- package/dist/.next/types/app/sessions/page.ts +84 -0
- package/dist/.next/types/app/traces/page.ts +84 -0
- package/dist/.next/types/cache-life.d.ts +141 -0
- package/dist/.next/types/package.json +1 -0
- package/dist/.next/types/routes.d.ts +60 -0
- package/dist/.next/types/validator.ts +88 -0
- package/dist/api-server.d.ts +1 -0
- package/dist/api-server.js +545 -0
- package/dist/api-server.js.map +1 -0
- package/dist/commands/build.d.ts +9 -0
- package/dist/commands/build.js +206 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.d.ts +7 -0
- package/dist/commands/dev.js +406 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/generate-types.d.ts +7 -0
- package/dist/commands/generate-types.js +31 -0
- package/dist/commands/generate-types.js.map +1 -0
- package/dist/commands/pull-models.d.ts +2 -0
- package/dist/commands/pull-models.js +105 -0
- package/dist/commands/pull-models.js.map +1 -0
- package/dist/commands/run-experiment.d.ts +7 -0
- package/dist/commands/run-experiment.js +579 -0
- package/dist/commands/run-experiment.js.map +1 -0
- package/dist/commands/run-prompt.d.ts +8 -0
- package/dist/commands/run-prompt.js +397 -0
- package/dist/commands/run-prompt.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.js +170 -0
- package/dist/config.js.map +1 -0
- package/dist/cost-mapping/cost-mapping.d.ts +7 -0
- package/dist/cost-mapping/cost-mapping.js +36 -0
- package/dist/cost-mapping/cost-mapping.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +127 -0
- package/dist/index.js.map +1 -0
- package/dist/runner-server/core.d.ts +15 -0
- package/dist/runner-server/core.js +180 -0
- package/dist/runner-server/core.js.map +1 -0
- package/dist/runner-server/middleware/signature-verification.d.ts +37 -0
- package/dist/runner-server/middleware/signature-verification.js +55 -0
- package/dist/runner-server/middleware/signature-verification.js.map +1 -0
- package/dist/runner-server/types.d.ts +67 -0
- package/dist/runner-server/types.js +7 -0
- package/dist/runner-server/types.js.map +1 -0
- package/dist/runner-server.d.ts +32 -0
- package/dist/runner-server.js +376 -0
- package/dist/runner-server.js.map +1 -0
- package/dist/server/database/index.d.ts +3 -0
- package/dist/server/database/index.js +97 -0
- package/dist/server/database/index.js.map +1 -0
- package/dist/server/routes/scores/index.d.ts +14 -0
- package/dist/server/routes/scores/index.js +60 -0
- package/dist/server/routes/scores/index.js.map +1 -0
- package/dist/server/routes/traces/index.d.ts +50 -0
- package/dist/server/routes/traces/index.js +614 -0
- package/dist/server/routes/traces/index.js.map +1 -0
- package/dist/tunnel.d.ts +19 -0
- package/dist/tunnel.js +134 -0
- package/dist/tunnel.js.map +1 -0
- package/dist/utils/prompt-detection.d.ts +8 -0
- package/dist/utils/prompt-detection.js +24 -0
- package/dist/utils/prompt-detection.js.map +1 -0
- package/dist/utils/providers.d.ts +38 -0
- package/dist/utils/providers.js +82 -0
- package/dist/utils/providers.js.map +1 -0
- package/next.config.ts +18 -0
- package/package.json +90 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +1 -0
- package/public/logo.svg +1 -0
|
@@ -0,0 +1,614 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.getTracesByRunId = exports.getTracesBySessionId = exports.getSessions = exports.getTraceGraph = exports.getTraceById = exports.getSpans = exports.getTraces = exports.getRequests = exports.exportTraces = void 0;
|
|
16
|
+
const cost_mapping_1 = require("../../../cost-mapping/cost-mapping");
|
|
17
|
+
const database_1 = __importDefault(require("../../database"));
|
|
18
|
+
/**
|
|
19
|
+
* Convert NormalizedSpan to SQLite row format
|
|
20
|
+
*/
|
|
21
|
+
function normalizedSpanToSqliteRow(span, modelsCostMapping) {
|
|
22
|
+
// Convert startTime from milliseconds to nanoseconds (as string for Timestamp)
|
|
23
|
+
const timestampNs = Math.floor(span.startTime * 1000000).toString();
|
|
24
|
+
// Duration is stored in milliseconds (no conversion needed)
|
|
25
|
+
const durationMs = Math.floor(span.duration);
|
|
26
|
+
// Calculate cost if model and tokens are available
|
|
27
|
+
let cost = span.cost || 0;
|
|
28
|
+
const isSuccess = span.statusCode !== "2";
|
|
29
|
+
const spanAttributes = Object.assign({}, span.spanAttributes);
|
|
30
|
+
if (span.model &&
|
|
31
|
+
span.inputTokens !== undefined &&
|
|
32
|
+
span.outputTokens !== undefined) {
|
|
33
|
+
const priceMap = isSuccess ? modelsCostMapping[span.model] : null;
|
|
34
|
+
if (priceMap) {
|
|
35
|
+
const getCost = (0, cost_mapping_1.getCostFormula)(Number(priceMap.promptPrice || 0), Number(priceMap.completionPrice || 0), 1000);
|
|
36
|
+
cost = getCost(span.inputTokens || 0, span.outputTokens || 0);
|
|
37
|
+
}
|
|
38
|
+
spanAttributes["gen_ai.usage.cost"] = cost;
|
|
39
|
+
}
|
|
40
|
+
// Convert events to consolidated JSON array
|
|
41
|
+
const events = span.events.map((e) => ({
|
|
42
|
+
timestamp: Math.floor(e.timestamp * 1000000),
|
|
43
|
+
name: e.name,
|
|
44
|
+
attributes: e.attributes || {},
|
|
45
|
+
}));
|
|
46
|
+
// Convert links to consolidated JSON array
|
|
47
|
+
const links = span.links.map((l) => ({
|
|
48
|
+
traceId: l.traceId,
|
|
49
|
+
spanId: l.spanId,
|
|
50
|
+
traceState: l.traceState || null,
|
|
51
|
+
attributes: l.attributes || {},
|
|
52
|
+
}));
|
|
53
|
+
return {
|
|
54
|
+
Timestamp: timestampNs,
|
|
55
|
+
TraceId: span.traceId,
|
|
56
|
+
SpanId: span.spanId,
|
|
57
|
+
ParentSpanId: span.parentSpanId || null,
|
|
58
|
+
TraceState: span.traceState || null,
|
|
59
|
+
SpanName: span.name,
|
|
60
|
+
SpanKind: span.kind,
|
|
61
|
+
ServiceName: span.serviceName || null,
|
|
62
|
+
ResourceAttributes: JSON.stringify(span.resourceAttributes || {}),
|
|
63
|
+
SpanAttributes: JSON.stringify(spanAttributes),
|
|
64
|
+
Duration: durationMs,
|
|
65
|
+
EndTime: span.endTime || null,
|
|
66
|
+
StatusCode: span.statusCode,
|
|
67
|
+
StatusMessage: span.statusMessage || null,
|
|
68
|
+
Events: JSON.stringify(events),
|
|
69
|
+
Links: JSON.stringify(links),
|
|
70
|
+
// Normalized columns
|
|
71
|
+
Type: span.type,
|
|
72
|
+
Model: span.model || "",
|
|
73
|
+
InputTokens: span.inputTokens || 0,
|
|
74
|
+
OutputTokens: span.outputTokens || 0,
|
|
75
|
+
TotalTokens: span.totalTokens || 0,
|
|
76
|
+
ReasoningTokens: span.reasoningTokens || 0,
|
|
77
|
+
Cost: cost,
|
|
78
|
+
Input: span.input ? JSON.stringify(span.input) : null,
|
|
79
|
+
Output: span.output || null,
|
|
80
|
+
OutputObject: span.outputObject ? JSON.stringify(span.outputObject) : null,
|
|
81
|
+
ToolCalls: span.toolCalls ? JSON.stringify(span.toolCalls) : null,
|
|
82
|
+
FinishReason: span.finishReason || null,
|
|
83
|
+
Settings: span.settings ? JSON.stringify(span.settings) : null,
|
|
84
|
+
SessionId: span.sessionId || "",
|
|
85
|
+
SessionName: span.sessionName || "",
|
|
86
|
+
UserId: span.userId || "",
|
|
87
|
+
TraceName: span.traceName || "",
|
|
88
|
+
DatasetRunId: span.datasetRunId || "",
|
|
89
|
+
DatasetRunName: span.datasetRunName || "",
|
|
90
|
+
DatasetPath: span.datasetPath || "",
|
|
91
|
+
DatasetItemName: span.datasetItemName || "",
|
|
92
|
+
DatasetExpectedOutput: span.datasetExpectedOutput || "",
|
|
93
|
+
PromptName: span.promptName || "",
|
|
94
|
+
Props: span.props || null,
|
|
95
|
+
Metadata: span.metadata ? JSON.stringify(span.metadata) : null,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const exportTraces = (normalizedSpans) => __awaiter(void 0, void 0, void 0, function* () {
|
|
99
|
+
// Insert array of normalized spans into sqlite3 using transaction and prepared statement
|
|
100
|
+
const insert = database_1.default.prepare(`
|
|
101
|
+
INSERT INTO traces (
|
|
102
|
+
Timestamp, TraceId, SpanId, ParentSpanId, TraceState, SpanName, SpanKind, ServiceName,
|
|
103
|
+
ResourceAttributes, SpanAttributes, Duration, EndTime, StatusCode, StatusMessage,
|
|
104
|
+
Events, Links,
|
|
105
|
+
Type, Model, InputTokens, OutputTokens, TotalTokens, ReasoningTokens, Cost,
|
|
106
|
+
Input, Output, OutputObject, ToolCalls, FinishReason, Settings,
|
|
107
|
+
SessionId, SessionName, UserId, TraceName,
|
|
108
|
+
DatasetRunId, DatasetRunName, DatasetPath, DatasetItemName, DatasetExpectedOutput,
|
|
109
|
+
PromptName, Props, Metadata
|
|
110
|
+
)
|
|
111
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
112
|
+
`);
|
|
113
|
+
// Get model cost mappings once before the transaction
|
|
114
|
+
const modelsCostMapping = yield (0, cost_mapping_1.getModelCostMappings)();
|
|
115
|
+
const insertMany = database_1.default.transaction((spans) => {
|
|
116
|
+
for (const span of spans) {
|
|
117
|
+
const row = normalizedSpanToSqliteRow(span, modelsCostMapping);
|
|
118
|
+
insert.run(row.Timestamp, row.TraceId, row.SpanId, row.ParentSpanId, row.TraceState, row.SpanName, row.SpanKind, row.ServiceName, row.ResourceAttributes, row.SpanAttributes, row.Duration, row.EndTime, row.StatusCode, row.StatusMessage, row.Events, row.Links, row.Type, row.Model, row.InputTokens, row.OutputTokens, row.TotalTokens, row.ReasoningTokens, row.Cost, row.Input, row.Output, row.OutputObject, row.ToolCalls, row.FinishReason, row.Settings, row.SessionId, row.SessionName, row.UserId, row.TraceName, row.DatasetRunId, row.DatasetRunName, row.DatasetPath, row.DatasetItemName, row.DatasetExpectedOutput, row.PromptName, row.Props, row.Metadata);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
insertMany(normalizedSpans);
|
|
122
|
+
});
|
|
123
|
+
exports.exportTraces = exportTraces;
|
|
124
|
+
const getRequests = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
125
|
+
const sql = `
|
|
126
|
+
SELECT
|
|
127
|
+
SpanId AS id,
|
|
128
|
+
TraceId AS trace_id,
|
|
129
|
+
SpanKind AS span_kind,
|
|
130
|
+
Duration AS latency_ms,
|
|
131
|
+
SpanName AS span_name,
|
|
132
|
+
cast(Timestamp as Real) / 1000000 AS ts,
|
|
133
|
+
PromptName AS prompt_name,
|
|
134
|
+
UserId AS user_id,
|
|
135
|
+
Props AS props,
|
|
136
|
+
CASE
|
|
137
|
+
WHEN Output IS NOT NULL AND Output != '' THEN Output
|
|
138
|
+
WHEN OutputObject IS NOT NULL AND OutputObject != '' THEN OutputObject
|
|
139
|
+
ELSE ToolCalls
|
|
140
|
+
END AS output,
|
|
141
|
+
Input AS input,
|
|
142
|
+
DatasetRunId AS dataset_run_id,
|
|
143
|
+
DatasetItemName AS dataset_item_name,
|
|
144
|
+
DatasetExpectedOutput AS dataset_expected_output,
|
|
145
|
+
Model AS model_used,
|
|
146
|
+
StatusCode AS status,
|
|
147
|
+
StatusMessage AS status_message,
|
|
148
|
+
-- total_tokens = prompt_tokens + completion_tokens
|
|
149
|
+
(COALESCE(InputTokens, 0) + COALESCE(OutputTokens, 0)) AS total_tokens,
|
|
150
|
+
COALESCE(InputTokens, 0) AS prompt_tokens,
|
|
151
|
+
COALESCE(OutputTokens, 0) AS completion_tokens,
|
|
152
|
+
COALESCE(Cost, 0.0) AS cost
|
|
153
|
+
FROM traces
|
|
154
|
+
WHERE Type = 'GENERATION'
|
|
155
|
+
ORDER BY ts DESC
|
|
156
|
+
`;
|
|
157
|
+
const rows = database_1.default.prepare(sql).all();
|
|
158
|
+
return rows;
|
|
159
|
+
});
|
|
160
|
+
exports.getRequests = getRequests;
|
|
161
|
+
const getTraces = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
162
|
+
const sql = `
|
|
163
|
+
WITH
|
|
164
|
+
trace_costs_and_tokens AS (
|
|
165
|
+
SELECT
|
|
166
|
+
TraceId AS id,
|
|
167
|
+
SUM(COALESCE(InputTokens, 0) + COALESCE(OutputTokens, 0)) AS tokens,
|
|
168
|
+
SUM(COALESCE(Cost, 0.0)) AS cost
|
|
169
|
+
FROM traces
|
|
170
|
+
WHERE Type = 'GENERATION'
|
|
171
|
+
GROUP BY TraceId
|
|
172
|
+
),
|
|
173
|
+
|
|
174
|
+
traces_cte AS (
|
|
175
|
+
SELECT
|
|
176
|
+
TraceId AS id,
|
|
177
|
+
cast(MIN(Timestamp) as Real) / 1000000 AS start,
|
|
178
|
+
cast(MAX(Timestamp) as Real) / 1000000 AS end,
|
|
179
|
+
MAX(CASE
|
|
180
|
+
WHEN StatusCode = '2.0' THEN '2'
|
|
181
|
+
WHEN StatusCode = '2' THEN '2'
|
|
182
|
+
WHEN StatusCode = '1.0' THEN '1'
|
|
183
|
+
WHEN StatusCode = '1' THEN '1'
|
|
184
|
+
ELSE '0'
|
|
185
|
+
END) AS status,
|
|
186
|
+
MIN(DatasetRunId) AS dataset_run_id,
|
|
187
|
+
MIN(DatasetPath) AS dataset_path
|
|
188
|
+
FROM traces
|
|
189
|
+
GROUP BY TraceId
|
|
190
|
+
),
|
|
191
|
+
|
|
192
|
+
trace_metadata AS (
|
|
193
|
+
SELECT
|
|
194
|
+
t.TraceId AS id,
|
|
195
|
+
COALESCE(
|
|
196
|
+
MAX(NULLIF(t.TraceName, '')),
|
|
197
|
+
MAX(t.SpanName)
|
|
198
|
+
) AS name,
|
|
199
|
+
MAX(t.StatusMessage) AS status_message,
|
|
200
|
+
MAX(t.Duration) AS latency
|
|
201
|
+
FROM traces t
|
|
202
|
+
LEFT JOIN traces c
|
|
203
|
+
ON c.SpanId = t.ParentSpanId
|
|
204
|
+
WHERE c.SpanId IS NULL
|
|
205
|
+
GROUP BY t.TraceId
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
SELECT
|
|
209
|
+
t.id,
|
|
210
|
+
t.dataset_run_id,
|
|
211
|
+
t.dataset_path,
|
|
212
|
+
t.start,
|
|
213
|
+
t.end,
|
|
214
|
+
t.status,
|
|
215
|
+
c.cost,
|
|
216
|
+
c.tokens,
|
|
217
|
+
m.name,
|
|
218
|
+
m.latency,
|
|
219
|
+
m.status_message
|
|
220
|
+
FROM traces_cte t
|
|
221
|
+
LEFT JOIN trace_costs_and_tokens c ON t.id = c.id
|
|
222
|
+
LEFT JOIN trace_metadata m ON t.id = m.id
|
|
223
|
+
ORDER BY t.start DESC;
|
|
224
|
+
`;
|
|
225
|
+
const rows = database_1.default.prepare(sql).all();
|
|
226
|
+
return rows;
|
|
227
|
+
});
|
|
228
|
+
exports.getTraces = getTraces;
|
|
229
|
+
const getSpans = (traceId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
230
|
+
const sql = `
|
|
231
|
+
SELECT
|
|
232
|
+
SpanId AS id,
|
|
233
|
+
SpanName AS name,
|
|
234
|
+
Duration AS duration,
|
|
235
|
+
ParentSpanId AS parent_id,
|
|
236
|
+
CAST(Timestamp AS REAL) AS timestamp,
|
|
237
|
+
TraceId AS trace_id,
|
|
238
|
+
CASE
|
|
239
|
+
WHEN StatusCode = '2.0' THEN '2'
|
|
240
|
+
WHEN StatusCode = '2' THEN '2'
|
|
241
|
+
WHEN StatusCode = '1.0' THEN '1'
|
|
242
|
+
WHEN StatusCode = '1' THEN '1'
|
|
243
|
+
ELSE '0'
|
|
244
|
+
END AS status_code,
|
|
245
|
+
StatusMessage AS status_message,
|
|
246
|
+
SpanAttributes AS attributes,
|
|
247
|
+
Type AS type,
|
|
248
|
+
Model AS model,
|
|
249
|
+
InputTokens AS inputTokens,
|
|
250
|
+
OutputTokens AS outputTokens,
|
|
251
|
+
TotalTokens AS totalTokens,
|
|
252
|
+
ReasoningTokens AS reasoningTokens,
|
|
253
|
+
Cost AS cost,
|
|
254
|
+
Input AS input,
|
|
255
|
+
Output AS output,
|
|
256
|
+
OutputObject AS outputObject,
|
|
257
|
+
ToolCalls AS toolCalls,
|
|
258
|
+
FinishReason AS finishReason,
|
|
259
|
+
Settings AS settings,
|
|
260
|
+
SessionId AS sessionId,
|
|
261
|
+
SessionName AS sessionName,
|
|
262
|
+
UserId AS userId,
|
|
263
|
+
TraceName AS traceName,
|
|
264
|
+
PromptName AS promptName,
|
|
265
|
+
Props AS props,
|
|
266
|
+
SpanKind AS spanKind,
|
|
267
|
+
ServiceName AS serviceName,
|
|
268
|
+
Metadata AS metadata
|
|
269
|
+
FROM traces
|
|
270
|
+
WHERE TraceId = ?
|
|
271
|
+
ORDER BY CAST(Timestamp AS REAL) ASC
|
|
272
|
+
`;
|
|
273
|
+
const rows = database_1.default.prepare(sql).all(traceId);
|
|
274
|
+
return rows.map((row) => {
|
|
275
|
+
var _a, _b, _c, _d, _e;
|
|
276
|
+
// Parse SpanAttributes JSON
|
|
277
|
+
let spanAttributes = {};
|
|
278
|
+
try {
|
|
279
|
+
if (row.attributes) {
|
|
280
|
+
spanAttributes =
|
|
281
|
+
typeof row.attributes === "string"
|
|
282
|
+
? JSON.parse(row.attributes)
|
|
283
|
+
: row.attributes;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch (_f) {
|
|
287
|
+
// If parsing fails, keep empty object
|
|
288
|
+
}
|
|
289
|
+
// Map all flat fields to data object matching SpanData type
|
|
290
|
+
const data = {
|
|
291
|
+
type: row.type || undefined,
|
|
292
|
+
model: row.model || undefined,
|
|
293
|
+
inputTokens: (_a = row.inputTokens) !== null && _a !== void 0 ? _a : undefined,
|
|
294
|
+
outputTokens: (_b = row.outputTokens) !== null && _b !== void 0 ? _b : undefined,
|
|
295
|
+
totalTokens: (_c = row.totalTokens) !== null && _c !== void 0 ? _c : undefined,
|
|
296
|
+
reasoningTokens: (_d = row.reasoningTokens) !== null && _d !== void 0 ? _d : undefined,
|
|
297
|
+
cost: (_e = row.cost) !== null && _e !== void 0 ? _e : undefined,
|
|
298
|
+
input: row.input || undefined,
|
|
299
|
+
output: row.output || undefined,
|
|
300
|
+
outputObject: row.outputObject || undefined,
|
|
301
|
+
toolCalls: row.toolCalls || undefined,
|
|
302
|
+
finishReason: row.finishReason || undefined,
|
|
303
|
+
settings: row.settings || undefined,
|
|
304
|
+
sessionId: row.sessionId || undefined,
|
|
305
|
+
sessionName: row.sessionName || undefined,
|
|
306
|
+
userId: row.userId || undefined,
|
|
307
|
+
traceName: row.traceName || undefined,
|
|
308
|
+
promptName: row.promptName || undefined,
|
|
309
|
+
props: row.props || undefined,
|
|
310
|
+
attributes: JSON.stringify(spanAttributes), // Include all attributes
|
|
311
|
+
statusMessage: row.status_message || undefined,
|
|
312
|
+
status: row.status_code,
|
|
313
|
+
spanKind: row.spanKind || undefined,
|
|
314
|
+
serviceName: row.serviceName || undefined,
|
|
315
|
+
duration: row.duration || 0,
|
|
316
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
317
|
+
};
|
|
318
|
+
// Convert timestamp from microseconds to milliseconds (JavaScript standard)
|
|
319
|
+
const timestampMs = row.timestamp ? Math.floor(row.timestamp / 1000) : 0;
|
|
320
|
+
return {
|
|
321
|
+
id: row.id,
|
|
322
|
+
name: row.name,
|
|
323
|
+
duration: row.duration || 0,
|
|
324
|
+
parentId: row.parent_id || undefined,
|
|
325
|
+
timestamp: timestampMs,
|
|
326
|
+
traceId: row.trace_id,
|
|
327
|
+
status: row.status_code,
|
|
328
|
+
data,
|
|
329
|
+
};
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
exports.getSpans = getSpans;
|
|
333
|
+
const getTraceById = (traceId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
334
|
+
const traceSql = `
|
|
335
|
+
WITH
|
|
336
|
+
trace_costs_and_tokens AS (
|
|
337
|
+
SELECT
|
|
338
|
+
TraceId AS id,
|
|
339
|
+
SUM(COALESCE(InputTokens, 0) + COALESCE(OutputTokens, 0)) AS tokens,
|
|
340
|
+
SUM(COALESCE(Cost, 0.0)) AS cost
|
|
341
|
+
FROM traces
|
|
342
|
+
WHERE Type = 'GENERATION'
|
|
343
|
+
GROUP BY TraceId
|
|
344
|
+
),
|
|
345
|
+
|
|
346
|
+
traces_cte AS (
|
|
347
|
+
SELECT
|
|
348
|
+
TraceId AS id,
|
|
349
|
+
cast(MIN(Timestamp) as Real) / 1000000 AS start,
|
|
350
|
+
cast(MAX(Timestamp) as Real) / 1000000 AS end,
|
|
351
|
+
MAX(CASE
|
|
352
|
+
WHEN StatusCode = '2.0' THEN '2'
|
|
353
|
+
WHEN StatusCode = '2' THEN '2'
|
|
354
|
+
WHEN StatusCode = '1.0' THEN '1'
|
|
355
|
+
WHEN StatusCode = '1' THEN '1'
|
|
356
|
+
ELSE '0'
|
|
357
|
+
END) AS status,
|
|
358
|
+
MIN(DatasetRunId) AS dataset_run_id,
|
|
359
|
+
MIN(DatasetPath) AS dataset_path
|
|
360
|
+
FROM traces
|
|
361
|
+
GROUP BY TraceId
|
|
362
|
+
),
|
|
363
|
+
|
|
364
|
+
trace_metadata AS (
|
|
365
|
+
SELECT
|
|
366
|
+
t.TraceId AS id,
|
|
367
|
+
COALESCE(
|
|
368
|
+
MAX(NULLIF(t.TraceName, '')),
|
|
369
|
+
MAX(t.SpanName)
|
|
370
|
+
) AS name,
|
|
371
|
+
MAX(t.StatusMessage) AS status_message,
|
|
372
|
+
MAX(t.Duration) AS latency
|
|
373
|
+
FROM traces t
|
|
374
|
+
LEFT JOIN traces c
|
|
375
|
+
ON c.SpanId = t.ParentSpanId
|
|
376
|
+
WHERE c.SpanId IS NULL
|
|
377
|
+
GROUP BY t.TraceId
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
SELECT
|
|
381
|
+
t.id AS trace_id,
|
|
382
|
+
t.start,
|
|
383
|
+
t.end,
|
|
384
|
+
t.status,
|
|
385
|
+
t.dataset_run_id,
|
|
386
|
+
t.dataset_path,
|
|
387
|
+
c.tokens AS trace_tokens,
|
|
388
|
+
c.cost AS trace_cost,
|
|
389
|
+
m.name AS trace_name,
|
|
390
|
+
m.latency AS trace_latency,
|
|
391
|
+
m.status_message AS trace_status_message
|
|
392
|
+
FROM traces_cte t
|
|
393
|
+
LEFT JOIN trace_costs_and_tokens c ON t.id = c.id
|
|
394
|
+
LEFT JOIN trace_metadata m ON t.id = m.id
|
|
395
|
+
WHERE t.id = :traceId
|
|
396
|
+
ORDER BY t.start DESC;
|
|
397
|
+
`;
|
|
398
|
+
const traceRow = database_1.default.prepare(traceSql).get({ traceId });
|
|
399
|
+
if (!traceRow)
|
|
400
|
+
return null;
|
|
401
|
+
// Fetch spans separately
|
|
402
|
+
const spans = yield (0, exports.getSpans)(traceId);
|
|
403
|
+
return {
|
|
404
|
+
id: traceRow.trace_id,
|
|
405
|
+
name: traceRow.trace_name,
|
|
406
|
+
spans,
|
|
407
|
+
data: {
|
|
408
|
+
id: traceRow.trace_id,
|
|
409
|
+
name: traceRow.trace_name,
|
|
410
|
+
status: traceRow.status,
|
|
411
|
+
latency: traceRow.trace_latency,
|
|
412
|
+
cost: traceRow.trace_cost,
|
|
413
|
+
tokens: traceRow.trace_tokens,
|
|
414
|
+
start: traceRow.start,
|
|
415
|
+
end: traceRow.end,
|
|
416
|
+
status_message: traceRow.trace_status_message,
|
|
417
|
+
},
|
|
418
|
+
};
|
|
419
|
+
});
|
|
420
|
+
exports.getTraceById = getTraceById;
|
|
421
|
+
const getTraceGraph = (traceId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
422
|
+
const sql = `
|
|
423
|
+
SELECT
|
|
424
|
+
SpanId AS span_id,
|
|
425
|
+
SpanName AS span_name,
|
|
426
|
+
Metadata AS metadata
|
|
427
|
+
FROM traces
|
|
428
|
+
WHERE TraceId = ?
|
|
429
|
+
AND json_extract(json(Metadata), '$."graph.node.id"') != ''
|
|
430
|
+
AND json_extract(json(Metadata), '$."graph.node.id"') IS NOT NULL
|
|
431
|
+
ORDER BY CAST(Timestamp AS REAL) ASC
|
|
432
|
+
`;
|
|
433
|
+
const rows = database_1.default.prepare(sql).all(traceId);
|
|
434
|
+
const graphData = [];
|
|
435
|
+
for (const row of rows) {
|
|
436
|
+
// Parse Metadata JSON
|
|
437
|
+
let metadata = {};
|
|
438
|
+
try {
|
|
439
|
+
if (row.metadata) {
|
|
440
|
+
metadata =
|
|
441
|
+
typeof row.metadata === "string"
|
|
442
|
+
? JSON.parse(row.metadata)
|
|
443
|
+
: row.metadata;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch (_a) {
|
|
447
|
+
// If parsing fails, skip this row
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
450
|
+
const nodeId = metadata["graph.node.id"] || "";
|
|
451
|
+
if (!nodeId)
|
|
452
|
+
continue;
|
|
453
|
+
// Handle parent_id - can be single value or array
|
|
454
|
+
let parentNodeId;
|
|
455
|
+
const parentIds = JSON.parse(metadata["graph.node.parent_ids"] || "[]");
|
|
456
|
+
const parentId = metadata["graph.node.parent_id"];
|
|
457
|
+
if (Array.isArray(parentIds) && parentIds.length > 0) {
|
|
458
|
+
parentNodeId = parentIds;
|
|
459
|
+
}
|
|
460
|
+
else if (parentId && parentId !== "") {
|
|
461
|
+
parentNodeId = parentId;
|
|
462
|
+
}
|
|
463
|
+
const displayName = metadata["graph.node.display_name"] || "";
|
|
464
|
+
const nodeType = metadata["graph.node.type"] || "";
|
|
465
|
+
if (Array.isArray(parentNodeId)) {
|
|
466
|
+
parentNodeId.forEach((id) => {
|
|
467
|
+
graphData.push({
|
|
468
|
+
parentNodeId: id,
|
|
469
|
+
nodeId,
|
|
470
|
+
spanId: row.span_id,
|
|
471
|
+
nodeType,
|
|
472
|
+
displayName,
|
|
473
|
+
spanName: row.span_name,
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
graphData.push({
|
|
479
|
+
parentNodeId,
|
|
480
|
+
nodeId,
|
|
481
|
+
spanId: row.span_id,
|
|
482
|
+
nodeType,
|
|
483
|
+
displayName,
|
|
484
|
+
spanName: row.span_name,
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
return graphData;
|
|
489
|
+
});
|
|
490
|
+
exports.getTraceGraph = getTraceGraph;
|
|
491
|
+
const getSessions = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
492
|
+
const sql = `
|
|
493
|
+
WITH session_spans AS (
|
|
494
|
+
SELECT
|
|
495
|
+
TRIM(SessionId) AS id,
|
|
496
|
+
CAST(Timestamp AS REAL) / 1000000 AS timestamp,
|
|
497
|
+
SessionName AS session_name
|
|
498
|
+
FROM traces
|
|
499
|
+
WHERE SessionId IS NOT NULL
|
|
500
|
+
AND SessionId != ''
|
|
501
|
+
AND SessionId != 'null'
|
|
502
|
+
)
|
|
503
|
+
SELECT
|
|
504
|
+
id,
|
|
505
|
+
MIN(timestamp) AS start,
|
|
506
|
+
MAX(timestamp) AS end,
|
|
507
|
+
MIN(CASE
|
|
508
|
+
WHEN session_name IS NOT NULL AND session_name != ''
|
|
509
|
+
THEN session_name
|
|
510
|
+
ELSE NULL
|
|
511
|
+
END) AS name
|
|
512
|
+
FROM session_spans
|
|
513
|
+
WHERE id IS NOT NULL AND id != ''
|
|
514
|
+
GROUP BY id
|
|
515
|
+
ORDER BY start DESC
|
|
516
|
+
`;
|
|
517
|
+
const rows = database_1.default.prepare(sql).all();
|
|
518
|
+
return rows;
|
|
519
|
+
});
|
|
520
|
+
exports.getSessions = getSessions;
|
|
521
|
+
const getTracesBySessionId = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
522
|
+
// First, get all unique trace IDs for this session
|
|
523
|
+
const traceIdsSql = `
|
|
524
|
+
SELECT DISTINCT TraceId
|
|
525
|
+
FROM traces
|
|
526
|
+
WHERE SessionId = ?
|
|
527
|
+
`;
|
|
528
|
+
const traceIdRows = database_1.default.prepare(traceIdsSql).all(sessionId);
|
|
529
|
+
const traceIds = traceIdRows.map((row) => row.TraceId);
|
|
530
|
+
if (traceIds.length === 0) {
|
|
531
|
+
return [];
|
|
532
|
+
}
|
|
533
|
+
// Get all traces for these trace IDs
|
|
534
|
+
const traces = [];
|
|
535
|
+
for (const traceId of traceIds) {
|
|
536
|
+
const trace = yield (0, exports.getTraceById)(traceId);
|
|
537
|
+
if (trace) {
|
|
538
|
+
traces.push(trace);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
return traces;
|
|
542
|
+
});
|
|
543
|
+
exports.getTracesBySessionId = getTracesBySessionId;
|
|
544
|
+
const getTracesByRunId = (runId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
545
|
+
// Return traces in the same aggregated format as getTraces(), filtered by runId
|
|
546
|
+
const sql = `
|
|
547
|
+
WITH
|
|
548
|
+
trace_costs_and_tokens AS (
|
|
549
|
+
SELECT
|
|
550
|
+
TraceId AS id,
|
|
551
|
+
SUM(COALESCE(InputTokens, 0) + COALESCE(OutputTokens, 0)) AS tokens,
|
|
552
|
+
SUM(COALESCE(Cost, 0.0)) AS cost
|
|
553
|
+
FROM traces
|
|
554
|
+
WHERE Type = 'GENERATION'
|
|
555
|
+
GROUP BY TraceId
|
|
556
|
+
),
|
|
557
|
+
|
|
558
|
+
traces_cte AS (
|
|
559
|
+
SELECT
|
|
560
|
+
TraceId AS id,
|
|
561
|
+
cast(MIN(Timestamp) as Real) / 1000000 AS start,
|
|
562
|
+
cast(MAX(Timestamp) as Real) / 1000000 AS end,
|
|
563
|
+
MAX(CASE
|
|
564
|
+
WHEN StatusCode = '2.0' THEN '2'
|
|
565
|
+
WHEN StatusCode = '2' THEN '2'
|
|
566
|
+
WHEN StatusCode = '1.0' THEN '1'
|
|
567
|
+
WHEN StatusCode = '1' THEN '1'
|
|
568
|
+
ELSE '0'
|
|
569
|
+
END) AS status,
|
|
570
|
+
MIN(DatasetRunId) AS dataset_run_id,
|
|
571
|
+
MIN(DatasetPath) AS dataset_path
|
|
572
|
+
FROM traces
|
|
573
|
+
GROUP BY TraceId
|
|
574
|
+
),
|
|
575
|
+
|
|
576
|
+
trace_metadata AS (
|
|
577
|
+
SELECT
|
|
578
|
+
t.TraceId AS id,
|
|
579
|
+
COALESCE(
|
|
580
|
+
MAX(NULLIF(t.TraceName, '')),
|
|
581
|
+
MAX(t.SpanName)
|
|
582
|
+
) AS name,
|
|
583
|
+
MAX(t.StatusMessage) AS status_message,
|
|
584
|
+
MAX(t.Duration) AS latency
|
|
585
|
+
FROM traces t
|
|
586
|
+
LEFT JOIN traces c
|
|
587
|
+
ON c.SpanId = t.ParentSpanId
|
|
588
|
+
WHERE c.SpanId IS NULL
|
|
589
|
+
GROUP BY t.TraceId
|
|
590
|
+
)
|
|
591
|
+
|
|
592
|
+
SELECT
|
|
593
|
+
t.id,
|
|
594
|
+
t.dataset_run_id,
|
|
595
|
+
t.dataset_path,
|
|
596
|
+
t.start,
|
|
597
|
+
t.end,
|
|
598
|
+
t.status,
|
|
599
|
+
c.cost,
|
|
600
|
+
c.tokens,
|
|
601
|
+
m.name,
|
|
602
|
+
m.latency,
|
|
603
|
+
m.status_message
|
|
604
|
+
FROM traces_cte t
|
|
605
|
+
LEFT JOIN trace_costs_and_tokens c ON t.id = c.id
|
|
606
|
+
LEFT JOIN trace_metadata m ON t.id = m.id
|
|
607
|
+
WHERE t.dataset_run_id = ?
|
|
608
|
+
ORDER BY t.start DESC;
|
|
609
|
+
`;
|
|
610
|
+
const rows = database_1.default.prepare(sql).all(runId);
|
|
611
|
+
return rows;
|
|
612
|
+
});
|
|
613
|
+
exports.getTracesByRunId = getTracesByRunId;
|
|
614
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../cli-src/server/routes/traces/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tunnel.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tunnel management for exposing local development servers publicly.
|
|
3
|
+
* Uses localtunnel for free, no-auth public access.
|
|
4
|
+
*/
|
|
5
|
+
export interface TunnelInfo {
|
|
6
|
+
url: string;
|
|
7
|
+
provider: 'localtunnel';
|
|
8
|
+
disconnect: () => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Creates a public tunnel to a local port using localtunnel.
|
|
12
|
+
* Includes retry logic for transient errors.
|
|
13
|
+
*
|
|
14
|
+
* @param port - Local port to expose
|
|
15
|
+
* @param subdomain - Optional subdomain to request (not guaranteed)
|
|
16
|
+
* @param maxRetries - Maximum number of retry attempts (default: 3)
|
|
17
|
+
* @returns Tunnel information with URL and disconnect function
|
|
18
|
+
*/
|
|
19
|
+
export declare function createTunnel(port: number, subdomain?: string, maxRetries?: number): Promise<TunnelInfo>;
|