@tangle-network/agent-app 0.60.201 → 0.60.202
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/chat-routes/index.js +4 -4
- package/dist/{chunk-6P4CK7DI.js → chunk-CMK2F3QH.js} +2 -2
- package/dist/{chunk-BKPJFES3.js → chunk-I4FFHWCS.js} +2 -2
- package/dist/chunk-I4FFHWCS.js.map +1 -0
- package/dist/{chunk-T4BLISYH.js → chunk-PRER37K5.js} +2 -2
- package/dist/{chunk-2OWT3TNV.js → chunk-QQJJ2XYW.js} +2 -2
- package/dist/public-consultation/index.js +2 -2
- package/dist/runtime/index.js +3 -3
- package/dist/runtime/router-turn.js +2 -2
- package/dist/turn-trace/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-BKPJFES3.js.map +0 -1
- /package/dist/{chunk-6P4CK7DI.js.map → chunk-CMK2F3QH.js.map} +0 -0
- /package/dist/{chunk-T4BLISYH.js.map → chunk-PRER37K5.js.map} +0 -0
- /package/dist/{chunk-2OWT3TNV.js.map → chunk-QQJJ2XYW.js.map} +0 -0
|
@@ -62,10 +62,10 @@ import "../chunk-UGWQLQDS.js";
|
|
|
62
62
|
import "../chunk-E65YV7VV.js";
|
|
63
63
|
import {
|
|
64
64
|
runProtectedRouterTurn
|
|
65
|
-
} from "../chunk-
|
|
65
|
+
} from "../chunk-QQJJ2XYW.js";
|
|
66
66
|
import {
|
|
67
67
|
runRouterTurn
|
|
68
|
-
} from "../chunk-
|
|
68
|
+
} from "../chunk-PRER37K5.js";
|
|
69
69
|
import "../chunk-7XQIY2LU.js";
|
|
70
70
|
import "../chunk-D6UJEOZQ.js";
|
|
71
71
|
import "../chunk-AMUXRAUO.js";
|
|
@@ -80,7 +80,7 @@ import {
|
|
|
80
80
|
rowIdOf,
|
|
81
81
|
storeSupportsDraftPersistence,
|
|
82
82
|
streamChatRouteAsSandboxEvents
|
|
83
|
-
} from "../chunk-
|
|
83
|
+
} from "../chunk-CMK2F3QH.js";
|
|
84
84
|
import "../chunk-Q7WEEN7P.js";
|
|
85
85
|
import "../chunk-UTAIRVOK.js";
|
|
86
86
|
import "../chunk-RN4WPTBH.js";
|
|
@@ -163,7 +163,7 @@ import {
|
|
|
163
163
|
planToPersistedPart
|
|
164
164
|
} from "../chunk-LQYIBL3G.js";
|
|
165
165
|
import "../chunk-XELWWXJJ.js";
|
|
166
|
-
import "../chunk-
|
|
166
|
+
import "../chunk-I4FFHWCS.js";
|
|
167
167
|
|
|
168
168
|
// src/chat-routes/model-failover-stream.ts
|
|
169
169
|
var TERMINAL_FAILURE_TYPES = /* @__PURE__ */ new Set(["error", "session.run.failed"]);
|
|
@@ -36,7 +36,7 @@ import {
|
|
|
36
36
|
} from "./chunk-XELWWXJJ.js";
|
|
37
37
|
import {
|
|
38
38
|
createTurnTrace
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-I4FFHWCS.js";
|
|
40
40
|
|
|
41
41
|
// src/chat-routes/draft-persistence.ts
|
|
42
42
|
var CONTENT_EVENT_TYPES = /* @__PURE__ */ new Set([
|
|
@@ -1344,4 +1344,4 @@ export {
|
|
|
1344
1344
|
createChatTurnRoutes,
|
|
1345
1345
|
streamChatRouteAsSandboxEvents
|
|
1346
1346
|
};
|
|
1347
|
-
//# sourceMappingURL=chunk-
|
|
1347
|
+
//# sourceMappingURL=chunk-CMK2F3QH.js.map
|
|
@@ -7,7 +7,7 @@ function isTraceId(value) {
|
|
|
7
7
|
return TRACE_ID_PATTERN.test(value);
|
|
8
8
|
}
|
|
9
9
|
function turnTraceId(executionId) {
|
|
10
|
-
if (
|
|
10
|
+
if (/^[\w-]{1,200}$/.test(executionId)) return executionId;
|
|
11
11
|
const id = executionId.replace(/[^\w-]/g, "_").slice(0, 200);
|
|
12
12
|
return id.length >= 8 ? id : id.padEnd(8, "_");
|
|
13
13
|
}
|
|
@@ -226,4 +226,4 @@ export {
|
|
|
226
226
|
summarizeTurnSpans,
|
|
227
227
|
createTurnTrace
|
|
228
228
|
};
|
|
229
|
-
//# sourceMappingURL=chunk-
|
|
229
|
+
//# sourceMappingURL=chunk-I4FFHWCS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/turn-trace/recorder.ts"],"sourcesContent":["/**\n * One trace per agent turn: a root span for the turn's wall time and named\n * child spans for where that time went (admission, each model call, each tool\n * call, the box claim and prompt, persistence).\n *\n * This module only records. It has no imports, so the Router engine, the\n * sandbox helpers and the chat route share it from any runtime, a Worker\n * included. `./otel` turns a finished trace into OTLP spans for Tangle\n * Intelligence.\n *\n * The turn's trace id is its execution id in the charset every hop accepts\n * ({@link turnTraceId}), sent as `x-tangle-trace-id` on every Router and\n * Sandbox call, so a Router dispatch row and a sandbox record join the turn's\n * spans by one id.\n */\n\n/** What a span's time is spent on. Each instant of the turn is credited to the deepest open span's kind. */\nexport type TurnSpanKind =\n | 'admission'\n | 'router'\n | 'model'\n | 'network'\n | 'tool'\n | 'sandbox'\n | 'persist'\n | 'other'\n\nexport const TURN_SPAN_KINDS: readonly TurnSpanKind[] = ['admission', 'router', 'model', 'network', 'tool', 'sandbox', 'persist', 'other']\n\n/** Bounded primitive metadata. Never prompts, answers, tool arguments or credentials. */\nexport type TurnSpanAttrs = Record<string, string | number | boolean>\n\nexport interface TurnSpanRecord {\n spanId: string\n /** The root span's id for a top-level child. */\n parentSpanId: string\n name: string\n kind: TurnSpanKind\n startMs: number\n endMs: number\n attrs: TurnSpanAttrs\n /** Set when the span ended in failure; a short code or message, never content. */\n error?: string\n /** True when the turn finished while the span was still open. */\n unfinished?: boolean\n}\n\nexport interface TurnSpan {\n readonly id: string\n /** Merge attributes. A later value replaces an earlier one. */\n set(attrs: TurnSpanAttrs): TurnSpan\n /** End now. A second call changes nothing. `error` marks the span failed. */\n end(attrs?: TurnSpanAttrs, error?: unknown): void\n /** A child that starts now. */\n child(name: string, kind: TurnSpanKind, attrs?: TurnSpanAttrs): TurnSpan\n /** A child whose times are already known. */\n record(name: string, kind: TurnSpanKind, startMs: number, endMs: number, attrs?: TurnSpanAttrs): TurnSpan\n}\n\n/** How much of the turn's wall time is inside named spans, and what the time was spent on. */\nexport interface TurnTraceSummary {\n traceId: string\n wallMs: number\n /** Wall time inside at least one child span. */\n coveredMs: number\n /** `coveredMs / wallMs` as a percentage, one decimal. */\n coveragePct: number\n uncoveredMs: number\n /** The longest stretch with no span open: where an unnamed wait hides. */\n largestGapMs: number\n /** Wall time credited to the deepest open span's kind. Sums to `coveredMs`. */\n byKind: Record<TurnSpanKind, number>\n spans: number\n modelCalls: number\n toolCalls: number\n /** Spans refused after the per-turn cap. */\n dropped: number\n}\n\nexport interface TurnTraceSnapshot {\n traceId: string\n /** The id the root span is exported under. */\n rootSpanId: string\n executionId: string\n startedAt: number\n endedAt: number\n spans: TurnSpanRecord[]\n summary: TurnTraceSummary\n /** `ok`, or the failure the turn ended with. */\n status: 'ok' | 'error'\n error?: string\n}\n\n/** Where a finished turn's trace goes. `labels` are the host's metadata for the root span (session, user, workspace). */\nexport type TurnTraceSink = (snapshot: TurnTraceSnapshot, labels: TurnSpanAttrs) => void | Promise<void>\n\nexport interface TurnTrace {\n /** The turn's execution id in the charset the Router and Sandbox accept. Send it as `x-tangle-trace-id`. */\n readonly traceId: string\n readonly executionId: string\n readonly startedAt: number\n /** The span a top-level child hangs from. */\n readonly root: TurnSpan\n /** Name the turn's execution id once it is known. Spans recorded earlier keep their times. */\n bind(executionId: string): void\n start(name: string, kind: TurnSpanKind, attrs?: TurnSpanAttrs, parent?: TurnSpan): TurnSpan\n record(name: string, kind: TurnSpanKind, startMs: number, endMs: number, attrs?: TurnSpanAttrs, parent?: TurnSpan): TurnSpan\n /** Run `work` inside a span; the span ends when it settles, failed if it throws. */\n measure<T>(name: string, kind: TurnSpanKind, work: (span: TurnSpan) => Promise<T> | T, attrs?: TurnSpanAttrs, parent?: TurnSpan): Promise<T>\n /** Read the current numbers without ending the trace. */\n summary(now?: number): TurnTraceSummary\n /** End the trace: open spans close at `endedAt`, and later spans are refused. A second call returns the first result. */\n finish(outcome?: { error?: unknown; endedAt?: number }): TurnTraceSnapshot\n}\n\nexport interface CreateTurnTraceOptions {\n /** Epoch ms the turn began (default now). A route passes its request time so admission is inside the trace. */\n startedAt?: number\n executionId?: string\n now?: () => number\n /** Most spans one turn keeps (default 1000); the rest are counted as dropped. */\n maxSpans?: number\n}\n\nconst TRACE_ID_PATTERN = /^[\\w-]{8,200}$/\nconst MAX_ATTRS = 48\nconst MAX_ATTR_STRING = 200\n\n/** True when the Router and the Sandbox API keep this id as a `x-tangle-trace-id`. */\nexport function isTraceId(value: string): boolean {\n return TRACE_ID_PATTERN.test(value)\n}\n\n/**\n * The turn's execution id as a trace id. Execution ids carry `:` (`app:session:turn`),\n * which the Router drops from `x-tangle-trace-id`, so every character outside\n * `[A-Za-z0-9_-]` becomes `_`. An id already in the charset is returned as it is.\n */\nexport function turnTraceId(executionId: string): string {\n // An id in the charset is the caller's own, whatever its length (the Router drops one under 8 characters; it is not rewritten here).\n if (/^[\\w-]{1,200}$/.test(executionId)) return executionId\n const id = executionId.replace(/[^\\w-]/g, '_').slice(0, 200)\n return id.length >= 8 ? id : id.padEnd(8, '_')\n}\n\nfunction randomHex(bytes: number): string {\n const out = new Uint8Array(bytes)\n if (typeof globalThis.crypto?.getRandomValues === 'function') globalThis.crypto.getRandomValues(out)\n else for (let i = 0; i < bytes; i++) out[i] = Math.floor(Math.random() * 256)\n return Array.from(out, (b) => b.toString(16).padStart(2, '0')).join('')\n}\n\nfunction boundedAttrs(attrs: TurnSpanAttrs): TurnSpanAttrs {\n const out: TurnSpanAttrs = {}\n let count = 0\n for (const [key, value] of Object.entries(attrs)) {\n if (count >= MAX_ATTRS) break\n if (typeof value === 'number' && !Number.isFinite(value)) continue\n out[key.slice(0, 80)] = typeof value === 'string' ? value.slice(0, MAX_ATTR_STRING) : value\n count++\n }\n return out\n}\n\nfunction errorText(error: unknown): string {\n if (error instanceof Error) return (error.name === 'Error' ? error.message : `${error.name}: ${error.message}`).slice(0, MAX_ATTR_STRING)\n return String(error).slice(0, MAX_ATTR_STRING)\n}\n\nconst zeroKinds = (): Record<TurnSpanKind, number> => ({\n admission: 0, router: 0, model: 0, network: 0, tool: 0, sandbox: 0, persist: 0, other: 0,\n})\n\nconst round1 = (value: number) => Math.round(value * 10) / 10\n\n/**\n * Coverage and the per-kind split for a set of spans over `[startMs, endMs]`.\n * Exported for a reader that holds the spans of a finished trace.\n */\nexport function summarizeTurnSpans(\n spans: readonly Pick<TurnSpanRecord, 'spanId' | 'parentSpanId' | 'kind' | 'name' | 'startMs' | 'endMs'>[],\n rootSpanId: string,\n startMs: number,\n endMs: number,\n traceId: string,\n dropped = 0,\n): TurnTraceSummary {\n const wallMs = Math.max(0, endMs - startMs)\n const parent = new Map(spans.map((span) => [span.spanId, span.parentSpanId]))\n const depthOf = (id: string): number => {\n let depth = 0\n for (let at = parent.get(id); at !== undefined && at !== rootSpanId; at = parent.get(at)) {\n depth++\n if (depth > 64) break\n }\n return depth\n }\n const clipped = spans\n .map((span) => ({ span, start: Math.max(startMs, span.startMs), end: Math.min(endMs, span.endMs), depth: depthOf(span.spanId) }))\n .filter((entry) => entry.end > entry.start)\n const points = [...new Set([startMs, endMs, ...clipped.flatMap((entry) => [entry.start, entry.end])])].sort((a, b) => a - b)\n const byKind = zeroKinds()\n let coveredMs = 0\n let largestGapMs = 0\n let gap = 0\n for (let i = 0; i + 1 < points.length; i++) {\n const from = points[i]!\n const to = points[i + 1]!\n let deepest: (typeof clipped)[number] | undefined\n for (const entry of clipped) {\n if (entry.start <= from && entry.end >= to && (!deepest || entry.depth > deepest.depth || (entry.depth === deepest.depth && entry.start > deepest.start))) deepest = entry\n }\n if (deepest) {\n byKind[deepest.span.kind] += to - from\n coveredMs += to - from\n gap = 0\n } else {\n gap += to - from\n largestGapMs = Math.max(largestGapMs, gap)\n }\n }\n for (const kind of TURN_SPAN_KINDS) byKind[kind] = round1(byKind[kind])\n return {\n traceId,\n wallMs: round1(wallMs),\n coveredMs: round1(coveredMs),\n coveragePct: wallMs > 0 ? round1((coveredMs / wallMs) * 100) : 0,\n uncoveredMs: round1(wallMs - coveredMs),\n largestGapMs: round1(largestGapMs),\n byKind,\n spans: spans.length,\n modelCalls: spans.filter((span) => span.name === 'model.call').length,\n toolCalls: spans.filter((span) => span.name === 'tool.call').length,\n dropped,\n }\n}\n\nexport function createTurnTrace(options: CreateTurnTraceOptions = {}): TurnTrace {\n const now = options.now ?? Date.now\n const startedAt = options.startedAt ?? now()\n const maxSpans = options.maxSpans ?? 1000\n const rootId = randomHex(8)\n let executionId = options.executionId ?? `pending_${randomHex(6)}`\n let traceId = turnTraceId(executionId)\n const records = new Map<string, TurnSpanRecord>()\n const open = new Set<string>()\n let dropped = 0\n let finished: TurnTraceSnapshot | undefined\n\n // A refused or late span still returns a handle, so instrumentation never branches on the trace's state.\n const inert = (id: string): TurnSpan => {\n const handle: TurnSpan = {\n id,\n set: () => handle,\n end: () => {},\n child: () => inert(rootId),\n record: () => inert(rootId),\n }\n return handle\n }\n\n const handleFor = (id: string): TurnSpan => {\n const handle: TurnSpan = {\n id,\n set(attrs) {\n const record = records.get(id)\n if (record && !finished) record.attrs = boundedAttrs({ ...record.attrs, ...attrs })\n return handle\n },\n end(attrs, error) {\n const record = records.get(id)\n if (!record || !open.has(id) || finished) return\n open.delete(id)\n record.endMs = Math.max(record.startMs, now())\n if (attrs) record.attrs = boundedAttrs({ ...record.attrs, ...attrs })\n if (error !== undefined) record.error = errorText(error)\n },\n child: (name, kind, attrs) => trace.start(name, kind, attrs, handle),\n record: (name, kind, start, end, attrs) => trace.record(name, kind, start, end, attrs, handle),\n }\n return handle\n }\n\n const add = (name: string, kind: TurnSpanKind, startMs: number, endMs: number | undefined, attrs: TurnSpanAttrs | undefined, parent: TurnSpan | undefined): TurnSpan => {\n if (finished) return inert(rootId)\n if (records.size >= maxSpans) {\n dropped++\n return inert(rootId)\n }\n const spanId = randomHex(8)\n records.set(spanId, {\n spanId,\n parentSpanId: parent && parent.id !== spanId ? parent.id : rootId,\n name: name.slice(0, 80),\n kind,\n startMs,\n endMs: endMs ?? startMs,\n attrs: attrs ? boundedAttrs(attrs) : {},\n })\n if (endMs === undefined) open.add(spanId)\n return handleFor(spanId)\n }\n\n const rootHandle: TurnSpan = {\n id: rootId,\n set: () => rootHandle,\n end: () => {},\n child: (name, kind, attrs) => trace.start(name, kind, attrs),\n record: (name, kind, start, end, attrs) => trace.record(name, kind, start, end, attrs),\n }\n\n const trace: TurnTrace = {\n get traceId() { return traceId },\n get executionId() { return executionId },\n startedAt,\n root: rootHandle,\n bind(id) {\n executionId = id\n traceId = turnTraceId(id)\n },\n start: (name, kind, attrs, parent) => add(name, kind, now(), undefined, attrs, parent),\n record: (name, kind, startMs, endMs, attrs, parent) => add(name, kind, startMs, Math.max(startMs, endMs), attrs, parent),\n async measure(name, kind, work, attrs, parent) {\n const span = trace.start(name, kind, attrs, parent)\n try {\n const result = await work(span)\n span.end()\n return result\n } catch (error) {\n span.end(undefined, error)\n throw error\n }\n },\n summary(at) {\n const end = at ?? finished?.endedAt ?? now()\n const spans = [...records.values()].map((record) => open.has(record.spanId) ? { ...record, endMs: end } : record)\n return summarizeTurnSpans(spans, rootId, startedAt, end, traceId, dropped)\n },\n finish(outcome) {\n if (finished) return finished\n const endedAt = Math.max(startedAt, outcome?.endedAt ?? now())\n for (const id of open) {\n const record = records.get(id)!\n record.endMs = Math.max(record.startMs, endedAt)\n record.unfinished = true\n }\n open.clear()\n const spans = [...records.values()].sort((a, b) => a.startMs - b.startMs)\n finished = {\n traceId,\n rootSpanId: rootId,\n executionId,\n startedAt,\n endedAt,\n spans,\n summary: summarizeTurnSpans(spans, rootId, startedAt, endedAt, traceId, dropped),\n status: outcome?.error === undefined ? 'ok' : 'error',\n ...(outcome?.error === undefined ? {} : { error: errorText(outcome.error) }),\n }\n return finished\n },\n }\n return trace\n}\n"],"mappings":";AA2BO,IAAM,kBAA2C,CAAC,aAAa,UAAU,SAAS,WAAW,QAAQ,WAAW,WAAW,OAAO;AAiGzI,IAAM,mBAAmB;AACzB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AAGjB,SAAS,UAAU,OAAwB;AAChD,SAAO,iBAAiB,KAAK,KAAK;AACpC;AAOO,SAAS,YAAY,aAA6B;AAEvD,MAAI,iBAAiB,KAAK,WAAW,EAAG,QAAO;AAC/C,QAAM,KAAK,YAAY,QAAQ,WAAW,GAAG,EAAE,MAAM,GAAG,GAAG;AAC3D,SAAO,GAAG,UAAU,IAAI,KAAK,GAAG,OAAO,GAAG,GAAG;AAC/C;AAEA,SAAS,UAAU,OAAuB;AACxC,QAAM,MAAM,IAAI,WAAW,KAAK;AAChC,MAAI,OAAO,WAAW,QAAQ,oBAAoB,WAAY,YAAW,OAAO,gBAAgB,GAAG;AAAA,MAC9F,UAAS,IAAI,GAAG,IAAI,OAAO,IAAK,KAAI,CAAC,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG;AAC5E,SAAO,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACxE;AAEA,SAAS,aAAa,OAAqC;AACzD,QAAM,MAAqB,CAAC;AAC5B,MAAI,QAAQ;AACZ,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,SAAS,UAAW;AACxB,QAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,EAAG;AAC1D,QAAI,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,OAAO,UAAU,WAAW,MAAM,MAAM,GAAG,eAAe,IAAI;AACtF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAwB;AACzC,MAAI,iBAAiB,MAAO,SAAQ,MAAM,SAAS,UAAU,MAAM,UAAU,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO,IAAI,MAAM,GAAG,eAAe;AACxI,SAAO,OAAO,KAAK,EAAE,MAAM,GAAG,eAAe;AAC/C;AAEA,IAAM,YAAY,OAAqC;AAAA,EACrD,WAAW;AAAA,EAAG,QAAQ;AAAA,EAAG,OAAO;AAAA,EAAG,SAAS;AAAA,EAAG,MAAM;AAAA,EAAG,SAAS;AAAA,EAAG,SAAS;AAAA,EAAG,OAAO;AACzF;AAEA,IAAM,SAAS,CAAC,UAAkB,KAAK,MAAM,QAAQ,EAAE,IAAI;AAMpD,SAAS,mBACd,OACA,YACA,SACA,OACA,SACA,UAAU,GACQ;AAClB,QAAM,SAAS,KAAK,IAAI,GAAG,QAAQ,OAAO;AAC1C,QAAM,SAAS,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,KAAK,YAAY,CAAC,CAAC;AAC5E,QAAM,UAAU,CAAC,OAAuB;AACtC,QAAI,QAAQ;AACZ,aAAS,KAAK,OAAO,IAAI,EAAE,GAAG,OAAO,UAAa,OAAO,YAAY,KAAK,OAAO,IAAI,EAAE,GAAG;AACxF;AACA,UAAI,QAAQ,GAAI;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MACb,IAAI,CAAC,UAAU,EAAE,MAAM,OAAO,KAAK,IAAI,SAAS,KAAK,OAAO,GAAG,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,GAAG,OAAO,QAAQ,KAAK,MAAM,EAAE,EAAE,EAC/H,OAAO,CAAC,UAAU,MAAM,MAAM,MAAM,KAAK;AAC5C,QAAM,SAAS,CAAC,GAAG,oBAAI,IAAI,CAAC,SAAS,OAAO,GAAG,QAAQ,QAAQ,CAAC,UAAU,CAAC,MAAM,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC3H,QAAM,SAAS,UAAU;AACzB,MAAI,YAAY;AAChB,MAAI,eAAe;AACnB,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,OAAO,QAAQ,KAAK;AAC1C,UAAM,OAAO,OAAO,CAAC;AACrB,UAAM,KAAK,OAAO,IAAI,CAAC;AACvB,QAAI;AACJ,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,SAAS,QAAQ,MAAM,OAAO,OAAO,CAAC,WAAW,MAAM,QAAQ,QAAQ,SAAU,MAAM,UAAU,QAAQ,SAAS,MAAM,QAAQ,QAAQ,OAAS,WAAU;AAAA,IACvK;AACA,QAAI,SAAS;AACX,aAAO,QAAQ,KAAK,IAAI,KAAK,KAAK;AAClC,mBAAa,KAAK;AAClB,YAAM;AAAA,IACR,OAAO;AACL,aAAO,KAAK;AACZ,qBAAe,KAAK,IAAI,cAAc,GAAG;AAAA,IAC3C;AAAA,EACF;AACA,aAAW,QAAQ,gBAAiB,QAAO,IAAI,IAAI,OAAO,OAAO,IAAI,CAAC;AACtE,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,OAAO,MAAM;AAAA,IACrB,WAAW,OAAO,SAAS;AAAA,IAC3B,aAAa,SAAS,IAAI,OAAQ,YAAY,SAAU,GAAG,IAAI;AAAA,IAC/D,aAAa,OAAO,SAAS,SAAS;AAAA,IACtC,cAAc,OAAO,YAAY;AAAA,IACjC;AAAA,IACA,OAAO,MAAM;AAAA,IACb,YAAY,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,YAAY,EAAE;AAAA,IAC/D,WAAW,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,WAAW,EAAE;AAAA,IAC7D;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,UAAkC,CAAC,GAAc;AAC/E,QAAM,MAAM,QAAQ,OAAO,KAAK;AAChC,QAAM,YAAY,QAAQ,aAAa,IAAI;AAC3C,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,SAAS,UAAU,CAAC;AAC1B,MAAI,cAAc,QAAQ,eAAe,WAAW,UAAU,CAAC,CAAC;AAChE,MAAI,UAAU,YAAY,WAAW;AACrC,QAAM,UAAU,oBAAI,IAA4B;AAChD,QAAM,OAAO,oBAAI,IAAY;AAC7B,MAAI,UAAU;AACd,MAAI;AAGJ,QAAM,QAAQ,CAAC,OAAyB;AACtC,UAAM,SAAmB;AAAA,MACvB;AAAA,MACA,KAAK,MAAM;AAAA,MACX,KAAK,MAAM;AAAA,MAAC;AAAA,MACZ,OAAO,MAAM,MAAM,MAAM;AAAA,MACzB,QAAQ,MAAM,MAAM,MAAM;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,OAAyB;AAC1C,UAAM,SAAmB;AAAA,MACvB;AAAA,MACA,IAAI,OAAO;AACT,cAAM,SAAS,QAAQ,IAAI,EAAE;AAC7B,YAAI,UAAU,CAAC,SAAU,QAAO,QAAQ,aAAa,EAAE,GAAG,OAAO,OAAO,GAAG,MAAM,CAAC;AAClF,eAAO;AAAA,MACT;AAAA,MACA,IAAI,OAAO,OAAO;AAChB,cAAM,SAAS,QAAQ,IAAI,EAAE;AAC7B,YAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,KAAK,SAAU;AAC1C,aAAK,OAAO,EAAE;AACd,eAAO,QAAQ,KAAK,IAAI,OAAO,SAAS,IAAI,CAAC;AAC7C,YAAI,MAAO,QAAO,QAAQ,aAAa,EAAE,GAAG,OAAO,OAAO,GAAG,MAAM,CAAC;AACpE,YAAI,UAAU,OAAW,QAAO,QAAQ,UAAU,KAAK;AAAA,MACzD;AAAA,MACA,OAAO,CAAC,MAAM,MAAM,UAAU,MAAM,MAAM,MAAM,MAAM,OAAO,MAAM;AAAA,MACnE,QAAQ,CAAC,MAAM,MAAM,OAAO,KAAK,UAAU,MAAM,OAAO,MAAM,MAAM,OAAO,KAAK,OAAO,MAAM;AAAA,IAC/F;AACA,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,CAAC,MAAc,MAAoB,SAAiB,OAA2B,OAAkC,WAA2C;AACtK,QAAI,SAAU,QAAO,MAAM,MAAM;AACjC,QAAI,QAAQ,QAAQ,UAAU;AAC5B;AACA,aAAO,MAAM,MAAM;AAAA,IACrB;AACA,UAAM,SAAS,UAAU,CAAC;AAC1B,YAAQ,IAAI,QAAQ;AAAA,MAClB;AAAA,MACA,cAAc,UAAU,OAAO,OAAO,SAAS,OAAO,KAAK;AAAA,MAC3D,MAAM,KAAK,MAAM,GAAG,EAAE;AAAA,MACtB;AAAA,MACA;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,OAAO,QAAQ,aAAa,KAAK,IAAI,CAAC;AAAA,IACxC,CAAC;AACD,QAAI,UAAU,OAAW,MAAK,IAAI,MAAM;AACxC,WAAO,UAAU,MAAM;AAAA,EACzB;AAEA,QAAM,aAAuB;AAAA,IAC3B,IAAI;AAAA,IACJ,KAAK,MAAM;AAAA,IACX,KAAK,MAAM;AAAA,IAAC;AAAA,IACZ,OAAO,CAAC,MAAM,MAAM,UAAU,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3D,QAAQ,CAAC,MAAM,MAAM,OAAO,KAAK,UAAU,MAAM,OAAO,MAAM,MAAM,OAAO,KAAK,KAAK;AAAA,EACvF;AAEA,QAAM,QAAmB;AAAA,IACvB,IAAI,UAAU;AAAE,aAAO;AAAA,IAAQ;AAAA,IAC/B,IAAI,cAAc;AAAE,aAAO;AAAA,IAAY;AAAA,IACvC;AAAA,IACA,MAAM;AAAA,IACN,KAAK,IAAI;AACP,oBAAc;AACd,gBAAU,YAAY,EAAE;AAAA,IAC1B;AAAA,IACA,OAAO,CAAC,MAAM,MAAM,OAAO,WAAW,IAAI,MAAM,MAAM,IAAI,GAAG,QAAW,OAAO,MAAM;AAAA,IACrF,QAAQ,CAAC,MAAM,MAAM,SAAS,OAAO,OAAO,WAAW,IAAI,MAAM,MAAM,SAAS,KAAK,IAAI,SAAS,KAAK,GAAG,OAAO,MAAM;AAAA,IACvH,MAAM,QAAQ,MAAM,MAAM,MAAM,OAAO,QAAQ;AAC7C,YAAM,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,MAAM;AAClD,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,IAAI;AAC9B,aAAK,IAAI;AACT,eAAO;AAAA,MACT,SAAS,OAAO;AACd,aAAK,IAAI,QAAW,KAAK;AACzB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ,IAAI;AACV,YAAM,MAAM,MAAM,UAAU,WAAW,IAAI;AAC3C,YAAM,QAAQ,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,KAAK,IAAI,OAAO,MAAM,IAAI,EAAE,GAAG,QAAQ,OAAO,IAAI,IAAI,MAAM;AAChH,aAAO,mBAAmB,OAAO,QAAQ,WAAW,KAAK,SAAS,OAAO;AAAA,IAC3E;AAAA,IACA,OAAO,SAAS;AACd,UAAI,SAAU,QAAO;AACrB,YAAM,UAAU,KAAK,IAAI,WAAW,SAAS,WAAW,IAAI,CAAC;AAC7D,iBAAW,MAAM,MAAM;AACrB,cAAM,SAAS,QAAQ,IAAI,EAAE;AAC7B,eAAO,QAAQ,KAAK,IAAI,OAAO,SAAS,OAAO;AAC/C,eAAO,aAAa;AAAA,MACtB;AACA,WAAK,MAAM;AACX,YAAM,QAAQ,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AACxE,iBAAW;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,mBAAmB,OAAO,QAAQ,WAAW,SAAS,SAAS,OAAO;AAAA,QAC/E,QAAQ,SAAS,UAAU,SAAY,OAAO;AAAA,QAC9C,GAAI,SAAS,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,UAAU,QAAQ,KAAK,EAAE;AAAA,MAC5E;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "./chunk-AMUXRAUO.js";
|
|
11
11
|
import {
|
|
12
12
|
turnTraceId
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-I4FFHWCS.js";
|
|
14
14
|
|
|
15
15
|
// src/runtime/loop.ts
|
|
16
16
|
import {
|
|
@@ -892,4 +892,4 @@ export {
|
|
|
892
892
|
composeRouterTurnPrompt,
|
|
893
893
|
runRouterTurn
|
|
894
894
|
};
|
|
895
|
-
//# sourceMappingURL=chunk-
|
|
895
|
+
//# sourceMappingURL=chunk-PRER37K5.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runRouterTurn
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-PRER37K5.js";
|
|
4
4
|
|
|
5
5
|
// src/runtime/protected-model.ts
|
|
6
6
|
import {
|
|
@@ -219,4 +219,4 @@ export {
|
|
|
219
219
|
createRouterProtectedModelPort,
|
|
220
220
|
runProtectedRouterTurn
|
|
221
221
|
};
|
|
222
|
-
//# sourceMappingURL=chunk-
|
|
222
|
+
//# sourceMappingURL=chunk-QQJJ2XYW.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createChatTurnRoutes,
|
|
3
3
|
streamChatRouteAsSandboxEvents
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-CMK2F3QH.js";
|
|
5
5
|
import "../chunk-Q7WEEN7P.js";
|
|
6
6
|
import "../chunk-UTAIRVOK.js";
|
|
7
7
|
import "../chunk-RN4WPTBH.js";
|
|
@@ -17,7 +17,7 @@ import "../chunk-ZGUXI5SI.js";
|
|
|
17
17
|
import "../chunk-6VQCFJWP.js";
|
|
18
18
|
import "../chunk-LQYIBL3G.js";
|
|
19
19
|
import "../chunk-XELWWXJJ.js";
|
|
20
|
-
import "../chunk-
|
|
20
|
+
import "../chunk-I4FFHWCS.js";
|
|
21
21
|
|
|
22
22
|
// src/public-consultation/index.ts
|
|
23
23
|
import { searchKnowledge } from "@tangle-network/agent-knowledge";
|
package/dist/runtime/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
ProtectedModelSettlementError,
|
|
3
3
|
createRouterProtectedModelPort,
|
|
4
4
|
runProtectedRouterTurn
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-QQJJ2XYW.js";
|
|
6
6
|
import {
|
|
7
7
|
DURABLE_HOP_BUDGET_MS,
|
|
8
8
|
asksForLanguage,
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
turnKnowledgeInstructions,
|
|
25
25
|
workspaceKnowledgeForTurn,
|
|
26
26
|
workspaceTurnCheckpoints
|
|
27
|
-
} from "../chunk-
|
|
27
|
+
} from "../chunk-PRER37K5.js";
|
|
28
28
|
import "../chunk-7XQIY2LU.js";
|
|
29
29
|
import {
|
|
30
30
|
DEFAULT_TANGLE_BILLING_ENFORCEMENT_ENV_VAR,
|
|
@@ -52,7 +52,7 @@ import {
|
|
|
52
52
|
resolveCatalogModelId,
|
|
53
53
|
sortModelsByFreshness
|
|
54
54
|
} from "../chunk-AMUXRAUO.js";
|
|
55
|
-
import "../chunk-
|
|
55
|
+
import "../chunk-I4FFHWCS.js";
|
|
56
56
|
|
|
57
57
|
// src/runtime/certified-delivery.ts
|
|
58
58
|
import {
|
|
@@ -11,11 +11,11 @@ import {
|
|
|
11
11
|
turnKnowledgeInstructions,
|
|
12
12
|
workspaceKnowledgeForTurn,
|
|
13
13
|
workspaceTurnCheckpoints
|
|
14
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-PRER37K5.js";
|
|
15
15
|
import "../chunk-7XQIY2LU.js";
|
|
16
16
|
import "../chunk-D6UJEOZQ.js";
|
|
17
17
|
import "../chunk-AMUXRAUO.js";
|
|
18
|
-
import "../chunk-
|
|
18
|
+
import "../chunk-I4FFHWCS.js";
|
|
19
19
|
export {
|
|
20
20
|
DURABLE_HOP_BUDGET_MS,
|
|
21
21
|
asksForLanguage,
|
package/dist/turn-trace/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/turn-trace/recorder.ts"],"sourcesContent":["/**\n * One trace per agent turn: a root span for the turn's wall time and named\n * child spans for where that time went (admission, each model call, each tool\n * call, the box claim and prompt, persistence).\n *\n * This module only records. It has no imports, so the Router engine, the\n * sandbox helpers and the chat route share it from any runtime, a Worker\n * included. `./otel` turns a finished trace into OTLP spans for Tangle\n * Intelligence.\n *\n * The turn's trace id is its execution id in the charset every hop accepts\n * ({@link turnTraceId}), sent as `x-tangle-trace-id` on every Router and\n * Sandbox call, so a Router dispatch row and a sandbox record join the turn's\n * spans by one id.\n */\n\n/** What a span's time is spent on. Each instant of the turn is credited to the deepest open span's kind. */\nexport type TurnSpanKind =\n | 'admission'\n | 'router'\n | 'model'\n | 'network'\n | 'tool'\n | 'sandbox'\n | 'persist'\n | 'other'\n\nexport const TURN_SPAN_KINDS: readonly TurnSpanKind[] = ['admission', 'router', 'model', 'network', 'tool', 'sandbox', 'persist', 'other']\n\n/** Bounded primitive metadata. Never prompts, answers, tool arguments or credentials. */\nexport type TurnSpanAttrs = Record<string, string | number | boolean>\n\nexport interface TurnSpanRecord {\n spanId: string\n /** The root span's id for a top-level child. */\n parentSpanId: string\n name: string\n kind: TurnSpanKind\n startMs: number\n endMs: number\n attrs: TurnSpanAttrs\n /** Set when the span ended in failure; a short code or message, never content. */\n error?: string\n /** True when the turn finished while the span was still open. */\n unfinished?: boolean\n}\n\nexport interface TurnSpan {\n readonly id: string\n /** Merge attributes. A later value replaces an earlier one. */\n set(attrs: TurnSpanAttrs): TurnSpan\n /** End now. A second call changes nothing. `error` marks the span failed. */\n end(attrs?: TurnSpanAttrs, error?: unknown): void\n /** A child that starts now. */\n child(name: string, kind: TurnSpanKind, attrs?: TurnSpanAttrs): TurnSpan\n /** A child whose times are already known. */\n record(name: string, kind: TurnSpanKind, startMs: number, endMs: number, attrs?: TurnSpanAttrs): TurnSpan\n}\n\n/** How much of the turn's wall time is inside named spans, and what the time was spent on. */\nexport interface TurnTraceSummary {\n traceId: string\n wallMs: number\n /** Wall time inside at least one child span. */\n coveredMs: number\n /** `coveredMs / wallMs` as a percentage, one decimal. */\n coveragePct: number\n uncoveredMs: number\n /** The longest stretch with no span open: where an unnamed wait hides. */\n largestGapMs: number\n /** Wall time credited to the deepest open span's kind. Sums to `coveredMs`. */\n byKind: Record<TurnSpanKind, number>\n spans: number\n modelCalls: number\n toolCalls: number\n /** Spans refused after the per-turn cap. */\n dropped: number\n}\n\nexport interface TurnTraceSnapshot {\n traceId: string\n /** The id the root span is exported under. */\n rootSpanId: string\n executionId: string\n startedAt: number\n endedAt: number\n spans: TurnSpanRecord[]\n summary: TurnTraceSummary\n /** `ok`, or the failure the turn ended with. */\n status: 'ok' | 'error'\n error?: string\n}\n\n/** Where a finished turn's trace goes. `labels` are the host's metadata for the root span (session, user, workspace). */\nexport type TurnTraceSink = (snapshot: TurnTraceSnapshot, labels: TurnSpanAttrs) => void | Promise<void>\n\nexport interface TurnTrace {\n /** The turn's execution id in the charset the Router and Sandbox accept. Send it as `x-tangle-trace-id`. */\n readonly traceId: string\n readonly executionId: string\n readonly startedAt: number\n /** The span a top-level child hangs from. */\n readonly root: TurnSpan\n /** Name the turn's execution id once it is known. Spans recorded earlier keep their times. */\n bind(executionId: string): void\n start(name: string, kind: TurnSpanKind, attrs?: TurnSpanAttrs, parent?: TurnSpan): TurnSpan\n record(name: string, kind: TurnSpanKind, startMs: number, endMs: number, attrs?: TurnSpanAttrs, parent?: TurnSpan): TurnSpan\n /** Run `work` inside a span; the span ends when it settles, failed if it throws. */\n measure<T>(name: string, kind: TurnSpanKind, work: (span: TurnSpan) => Promise<T> | T, attrs?: TurnSpanAttrs, parent?: TurnSpan): Promise<T>\n /** Read the current numbers without ending the trace. */\n summary(now?: number): TurnTraceSummary\n /** End the trace: open spans close at `endedAt`, and later spans are refused. A second call returns the first result. */\n finish(outcome?: { error?: unknown; endedAt?: number }): TurnTraceSnapshot\n}\n\nexport interface CreateTurnTraceOptions {\n /** Epoch ms the turn began (default now). A route passes its request time so admission is inside the trace. */\n startedAt?: number\n executionId?: string\n now?: () => number\n /** Most spans one turn keeps (default 1000); the rest are counted as dropped. */\n maxSpans?: number\n}\n\nconst TRACE_ID_PATTERN = /^[\\w-]{8,200}$/\nconst MAX_ATTRS = 48\nconst MAX_ATTR_STRING = 200\n\n/** True when the Router and the Sandbox API keep this id as a `x-tangle-trace-id`. */\nexport function isTraceId(value: string): boolean {\n return TRACE_ID_PATTERN.test(value)\n}\n\n/**\n * The turn's execution id as a trace id. Execution ids carry `:` (`app:session:turn`),\n * which the Router drops from `x-tangle-trace-id`, so every character outside\n * `[A-Za-z0-9_-]` becomes `_`. An id already in the charset is returned as it is.\n */\nexport function turnTraceId(executionId: string): string {\n if (TRACE_ID_PATTERN.test(executionId)) return executionId\n const id = executionId.replace(/[^\\w-]/g, '_').slice(0, 200)\n return id.length >= 8 ? id : id.padEnd(8, '_')\n}\n\nfunction randomHex(bytes: number): string {\n const out = new Uint8Array(bytes)\n if (typeof globalThis.crypto?.getRandomValues === 'function') globalThis.crypto.getRandomValues(out)\n else for (let i = 0; i < bytes; i++) out[i] = Math.floor(Math.random() * 256)\n return Array.from(out, (b) => b.toString(16).padStart(2, '0')).join('')\n}\n\nfunction boundedAttrs(attrs: TurnSpanAttrs): TurnSpanAttrs {\n const out: TurnSpanAttrs = {}\n let count = 0\n for (const [key, value] of Object.entries(attrs)) {\n if (count >= MAX_ATTRS) break\n if (typeof value === 'number' && !Number.isFinite(value)) continue\n out[key.slice(0, 80)] = typeof value === 'string' ? value.slice(0, MAX_ATTR_STRING) : value\n count++\n }\n return out\n}\n\nfunction errorText(error: unknown): string {\n if (error instanceof Error) return (error.name === 'Error' ? error.message : `${error.name}: ${error.message}`).slice(0, MAX_ATTR_STRING)\n return String(error).slice(0, MAX_ATTR_STRING)\n}\n\nconst zeroKinds = (): Record<TurnSpanKind, number> => ({\n admission: 0, router: 0, model: 0, network: 0, tool: 0, sandbox: 0, persist: 0, other: 0,\n})\n\nconst round1 = (value: number) => Math.round(value * 10) / 10\n\n/**\n * Coverage and the per-kind split for a set of spans over `[startMs, endMs]`.\n * Exported for a reader that holds the spans of a finished trace.\n */\nexport function summarizeTurnSpans(\n spans: readonly Pick<TurnSpanRecord, 'spanId' | 'parentSpanId' | 'kind' | 'name' | 'startMs' | 'endMs'>[],\n rootSpanId: string,\n startMs: number,\n endMs: number,\n traceId: string,\n dropped = 0,\n): TurnTraceSummary {\n const wallMs = Math.max(0, endMs - startMs)\n const parent = new Map(spans.map((span) => [span.spanId, span.parentSpanId]))\n const depthOf = (id: string): number => {\n let depth = 0\n for (let at = parent.get(id); at !== undefined && at !== rootSpanId; at = parent.get(at)) {\n depth++\n if (depth > 64) break\n }\n return depth\n }\n const clipped = spans\n .map((span) => ({ span, start: Math.max(startMs, span.startMs), end: Math.min(endMs, span.endMs), depth: depthOf(span.spanId) }))\n .filter((entry) => entry.end > entry.start)\n const points = [...new Set([startMs, endMs, ...clipped.flatMap((entry) => [entry.start, entry.end])])].sort((a, b) => a - b)\n const byKind = zeroKinds()\n let coveredMs = 0\n let largestGapMs = 0\n let gap = 0\n for (let i = 0; i + 1 < points.length; i++) {\n const from = points[i]!\n const to = points[i + 1]!\n let deepest: (typeof clipped)[number] | undefined\n for (const entry of clipped) {\n if (entry.start <= from && entry.end >= to && (!deepest || entry.depth > deepest.depth || (entry.depth === deepest.depth && entry.start > deepest.start))) deepest = entry\n }\n if (deepest) {\n byKind[deepest.span.kind] += to - from\n coveredMs += to - from\n gap = 0\n } else {\n gap += to - from\n largestGapMs = Math.max(largestGapMs, gap)\n }\n }\n for (const kind of TURN_SPAN_KINDS) byKind[kind] = round1(byKind[kind])\n return {\n traceId,\n wallMs: round1(wallMs),\n coveredMs: round1(coveredMs),\n coveragePct: wallMs > 0 ? round1((coveredMs / wallMs) * 100) : 0,\n uncoveredMs: round1(wallMs - coveredMs),\n largestGapMs: round1(largestGapMs),\n byKind,\n spans: spans.length,\n modelCalls: spans.filter((span) => span.name === 'model.call').length,\n toolCalls: spans.filter((span) => span.name === 'tool.call').length,\n dropped,\n }\n}\n\nexport function createTurnTrace(options: CreateTurnTraceOptions = {}): TurnTrace {\n const now = options.now ?? Date.now\n const startedAt = options.startedAt ?? now()\n const maxSpans = options.maxSpans ?? 1000\n const rootId = randomHex(8)\n let executionId = options.executionId ?? `pending_${randomHex(6)}`\n let traceId = turnTraceId(executionId)\n const records = new Map<string, TurnSpanRecord>()\n const open = new Set<string>()\n let dropped = 0\n let finished: TurnTraceSnapshot | undefined\n\n // A refused or late span still returns a handle, so instrumentation never branches on the trace's state.\n const inert = (id: string): TurnSpan => {\n const handle: TurnSpan = {\n id,\n set: () => handle,\n end: () => {},\n child: () => inert(rootId),\n record: () => inert(rootId),\n }\n return handle\n }\n\n const handleFor = (id: string): TurnSpan => {\n const handle: TurnSpan = {\n id,\n set(attrs) {\n const record = records.get(id)\n if (record && !finished) record.attrs = boundedAttrs({ ...record.attrs, ...attrs })\n return handle\n },\n end(attrs, error) {\n const record = records.get(id)\n if (!record || !open.has(id) || finished) return\n open.delete(id)\n record.endMs = Math.max(record.startMs, now())\n if (attrs) record.attrs = boundedAttrs({ ...record.attrs, ...attrs })\n if (error !== undefined) record.error = errorText(error)\n },\n child: (name, kind, attrs) => trace.start(name, kind, attrs, handle),\n record: (name, kind, start, end, attrs) => trace.record(name, kind, start, end, attrs, handle),\n }\n return handle\n }\n\n const add = (name: string, kind: TurnSpanKind, startMs: number, endMs: number | undefined, attrs: TurnSpanAttrs | undefined, parent: TurnSpan | undefined): TurnSpan => {\n if (finished) return inert(rootId)\n if (records.size >= maxSpans) {\n dropped++\n return inert(rootId)\n }\n const spanId = randomHex(8)\n records.set(spanId, {\n spanId,\n parentSpanId: parent && parent.id !== spanId ? parent.id : rootId,\n name: name.slice(0, 80),\n kind,\n startMs,\n endMs: endMs ?? startMs,\n attrs: attrs ? boundedAttrs(attrs) : {},\n })\n if (endMs === undefined) open.add(spanId)\n return handleFor(spanId)\n }\n\n const rootHandle: TurnSpan = {\n id: rootId,\n set: () => rootHandle,\n end: () => {},\n child: (name, kind, attrs) => trace.start(name, kind, attrs),\n record: (name, kind, start, end, attrs) => trace.record(name, kind, start, end, attrs),\n }\n\n const trace: TurnTrace = {\n get traceId() { return traceId },\n get executionId() { return executionId },\n startedAt,\n root: rootHandle,\n bind(id) {\n executionId = id\n traceId = turnTraceId(id)\n },\n start: (name, kind, attrs, parent) => add(name, kind, now(), undefined, attrs, parent),\n record: (name, kind, startMs, endMs, attrs, parent) => add(name, kind, startMs, Math.max(startMs, endMs), attrs, parent),\n async measure(name, kind, work, attrs, parent) {\n const span = trace.start(name, kind, attrs, parent)\n try {\n const result = await work(span)\n span.end()\n return result\n } catch (error) {\n span.end(undefined, error)\n throw error\n }\n },\n summary(at) {\n const end = at ?? finished?.endedAt ?? now()\n const spans = [...records.values()].map((record) => open.has(record.spanId) ? { ...record, endMs: end } : record)\n return summarizeTurnSpans(spans, rootId, startedAt, end, traceId, dropped)\n },\n finish(outcome) {\n if (finished) return finished\n const endedAt = Math.max(startedAt, outcome?.endedAt ?? now())\n for (const id of open) {\n const record = records.get(id)!\n record.endMs = Math.max(record.startMs, endedAt)\n record.unfinished = true\n }\n open.clear()\n const spans = [...records.values()].sort((a, b) => a.startMs - b.startMs)\n finished = {\n traceId,\n rootSpanId: rootId,\n executionId,\n startedAt,\n endedAt,\n spans,\n summary: summarizeTurnSpans(spans, rootId, startedAt, endedAt, traceId, dropped),\n status: outcome?.error === undefined ? 'ok' : 'error',\n ...(outcome?.error === undefined ? {} : { error: errorText(outcome.error) }),\n }\n return finished\n },\n }\n return trace\n}\n"],"mappings":"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","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|