fix: expose trace pagination in cli and otel (#1687)

This commit is contained in:
Lyon
2026-06-20 11:32:13 +08:00
committed by GitHub
parent c410a711db
commit ecbb13cdf4
2 changed files with 38 additions and 3 deletions
+14 -1
View File
@@ -3242,7 +3242,20 @@ export async function handleCodeAgentTraceHttp(request, response, url, options)
const statusCode = context.found ? 200 : 404;
void emitCodeAgentOtelSpan("trace_events_read", traceId, requestOptions.env ?? process.env, {
startTimeMs: startedAt,
attributes: { "http.method": "GET", "http.route": "/v1/agent/traces/:traceId", "http.status_code": statusCode, returnedEvents: Array.isArray(body?.events) ? body.events.length : 0, found: Boolean(context.found) }
attributes: {
"http.method": "GET",
"http.route": "/v1/agent/traces/:traceId",
"http.status_code": statusCode,
found: Boolean(context.found),
returnedEvents: Array.isArray(body?.events) ? body.events.length : 0,
sinceSeq: pageOptions.sinceSeq,
limit: pageOptions.limit,
fromSeq: body?.range?.fromSeq ?? null,
toSeq: body?.range?.toSeq ?? null,
totalEvents: body?.range?.total ?? body?.eventCount ?? null,
hasMore: Boolean(body?.hasMore),
fullTraceLoaded: Boolean(body?.fullTraceLoaded)
}
});
sendJson(response, statusCode, codeAgentCompatProjectionPayload(body, context));
}
+24 -2
View File
@@ -1007,7 +1007,7 @@ async function agentCommand(context: any) {
}
if (subcommand === "trace") {
const traceId = requiredTraceId(context.rest[1] ?? context.parsed.traceId);
const pathName = `/v1/agent/traces/${encodeURIComponent(traceId)}`;
const pathName = `/v1/agent/traces/${encodeURIComponent(traceId)}${agentTraceQueryString(context.parsed)}`;
const turnPath = `/v1/agent/turns/${encodeURIComponent(traceId)}`;
const turnResponse = await requestJson({ ...context, method: "GET", path: turnPath });
const response = await requestJson({ ...context, method: "GET", path: pathName });
@@ -1376,7 +1376,7 @@ function agentHelp() {
"composer submit --message TEXT|--message-file PATH [--profile NAME] [default: auto turn/steer]",
"send --message TEXT --wait [--timeout-ms N] [--poll-interval-ms N]",
"result TRACE_ID [--full]",
"trace TRACE_ID [--render web] [--limit N] [--full]",
"trace TRACE_ID [--render web] [--after-seq N|--since-seq N] [--limit N|--tail N] [--full]",
"inspect --trace-id TRACE_ID|--session-id ID|--thread-id ID",
"steer TRACE_ID --message TEXT|--message-file PATH [--session-id ID] [--thread-id ID]",
"cancel TRACE_ID"
@@ -1384,6 +1384,28 @@ function agentHelp() {
});
}
function agentTraceQueryString(parsed: any) {
const query = new URLSearchParams();
const sinceSeq = nonNegativeOption(parsed.sinceSeq ?? parsed.afterSeq ?? parsed.after);
if (sinceSeq !== undefined) query.set("sinceSeq", String(sinceSeq));
const limit = positiveOption(parsed.limit ?? parsed.tail);
if (limit !== undefined) query.set("limit", String(limit));
const text = query.toString();
return text ? `?${text}` : "";
}
function nonNegativeOption(value: unknown) {
const parsed = numberOption(value);
if (parsed === undefined || parsed < 0) return undefined;
return Math.trunc(parsed);
}
function positiveOption(value: unknown) {
const parsed = numberOption(value);
if (parsed === undefined || parsed <= 0) return undefined;
return Math.trunc(parsed);
}
async function sessionCommand(context: any) {
const subcommand = context.rest[0] || "list";
if (wantsHelp(context)) return sessionHelp();