agent-inspect 6.31.21 → 6.31.22
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/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/packages/cli/dist/{chunk-N5JN26MW.mjs → chunk-EMWA5EKU.mjs} +300 -31
- package/packages/cli/dist/chunk-EMWA5EKU.mjs.map +1 -0
- package/packages/cli/dist/index.cjs +379 -56
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +75 -31
- package/packages/cli/dist/index.mjs.map +1 -1
- package/packages/cli/dist/{src-VMGRSTG7.mjs → src-VZHGOLTO.mjs} +3 -3
- package/packages/cli/dist/{src-VMGRSTG7.mjs.map → src-VZHGOLTO.mjs.map} +1 -1
- package/packages/core/dist/advanced.cjs +247 -5
- package/packages/core/dist/advanced.cjs.map +1 -1
- package/packages/core/dist/advanced.mjs +6 -5
- package/packages/core/dist/advanced.mjs.map +1 -1
- package/packages/core/dist/checks.cjs +160 -27
- package/packages/core/dist/checks.cjs.map +1 -1
- package/packages/core/dist/checks.mjs +2 -1
- package/packages/core/dist/chunk-GCZUWY47.mjs +182 -0
- package/packages/core/dist/chunk-GCZUWY47.mjs.map +1 -0
- package/packages/core/dist/{chunk-JE3TUFAQ.mjs → chunk-RBXD7BNX.mjs} +3 -3
- package/packages/core/dist/{chunk-JE3TUFAQ.mjs.map → chunk-RBXD7BNX.mjs.map} +1 -1
- package/packages/core/dist/{chunk-YU6XT5A2.mjs → chunk-S4NU55LU.mjs} +45 -3
- package/packages/core/dist/chunk-S4NU55LU.mjs.map +1 -0
- package/packages/core/dist/{chunk-EIP5CNEL.mjs → chunk-UPGBMRL4.mjs} +49 -3
- package/packages/core/dist/chunk-UPGBMRL4.mjs.map +1 -0
- package/packages/core/dist/{chunk-4CDX5GDS.mjs → chunk-ZOF6ON65.mjs} +104 -99
- package/packages/core/dist/chunk-ZOF6ON65.mjs.map +1 -0
- package/packages/core/dist/exporters.cjs +82 -27
- package/packages/core/dist/exporters.cjs.map +1 -1
- package/packages/core/dist/exporters.mjs +72 -27
- package/packages/core/dist/exporters.mjs.map +1 -1
- package/packages/core/dist/logs.cjs +197 -1
- package/packages/core/dist/logs.cjs.map +1 -1
- package/packages/core/dist/logs.mjs +3 -2
- package/packages/core/dist/logs.mjs.map +1 -1
- package/packages/core/dist/persisted.cjs +197 -1
- package/packages/core/dist/persisted.cjs.map +1 -1
- package/packages/core/dist/persisted.mjs +4 -3
- package/packages/core/dist/persisted.mjs.map +1 -1
- package/packages/core/dist/readers.cjs +243 -1
- package/packages/core/dist/readers.cjs.map +1 -1
- package/packages/core/dist/readers.mjs +4 -3
- package/packages/cli/dist/chunk-N5JN26MW.mjs.map +0 -1
- package/packages/core/dist/chunk-4CDX5GDS.mjs.map +0 -1
- package/packages/core/dist/chunk-EIP5CNEL.mjs.map +0 -1
- package/packages/core/dist/chunk-YU6XT5A2.mjs.map +0 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { normalizeTokenUsage } from './chunk-
|
|
2
|
-
export { persistedInspectEventToInspectEvent, persistedInspectEventsToInspectEvents, persistedInspectEventsToRunTrees, traceEventToPersistedInspectEvent, traceEventsToPersistedInspectEvents, traceEventsToPersistedRunTrees } from './chunk-
|
|
1
|
+
import { normalizeTokenUsage } from './chunk-RBXD7BNX.mjs';
|
|
2
|
+
export { persistedInspectEventToInspectEvent, persistedInspectEventsToInspectEvents, persistedInspectEventsToRunTrees, traceEventToPersistedInspectEvent, traceEventsToPersistedInspectEvents, traceEventsToPersistedRunTrees } from './chunk-RBXD7BNX.mjs';
|
|
3
3
|
import './chunk-AHUZNHFI.mjs';
|
|
4
4
|
import './chunk-S4YWKV4G.mjs';
|
|
5
5
|
import './chunk-S6LQBLX5.mjs';
|
|
6
|
-
import './chunk-
|
|
6
|
+
import './chunk-S4NU55LU.mjs';
|
|
7
|
+
import './chunk-GCZUWY47.mjs';
|
|
7
8
|
export { isPersistedInspectEvent, isPersistedInspectEventV02, isPersistedInspectEventV10, persistedInspectEventToTraceEvents, persistedInspectEventsToTraceEvents } from './chunk-EE5Z2GQ3.mjs';
|
|
8
9
|
|
|
9
10
|
// packages/core/src/persisted/from-inspect-event.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/persisted/from-inspect-event.ts"],"names":[],"mappings":";;;;;;;;;AA4BA,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA;AAC7C;AAEA,SAAS,qBAAA,CAAsB,OAAqB,UAAA,EAA4B;AAC9E,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,KAAK,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA;AACtC,EAAA,OAAO,WAAW,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,UAAU,CAAA,CAAA;AACvD;AAEA,SAAS,eACP,EAAA,EAC4C;AAC5C,EAAA,IAAI,OAAO,EAAA,KAAO,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AAClD,IAAA,OAAO,EAAE,sBAAK,IAAI,IAAA,CAAK,CAAC,CAAA,EAAE,WAAA,EAAY,EAAG,gBAAA,EAAkB,IAAA,EAAK;AAAA,EAClE;AACA,EAAA,OAAO,EAAE,KAAK,IAAI,IAAA,CAAK,EAAE,CAAA,CAAE,WAAA,EAAY,EAAG,gBAAA,EAAkB,KAAA,EAAM;AACpE;AAEA,SAAS,kBACP,OAAA,EACqC;AACrC,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,GAAS,IAAI,GAAA,GAAM,MAAA;AAC7C;AAEA,SAAS,2BAAA,CACP,QACA,OAAA,EAIA;AACA,EAAA,MAAM,OAAO,OAAA,EAAS,UAAA;AACtB,EAAA,MAAM,UAAU,OAAA,EAAS,aAAA;AAEzB,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB;AAAA,UACf,IAAA,EAAM,UAAA;AAAA,UACN,MAAM,IAAA,IAAQ,MAAA;AAAA,UACd;AAAA,SACF;AAAA,QACA,kBAAA,EAAoB;AAAA,OACtB;AAAA,IACF,KAAK,SAAA;AACH,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB;AAAA,UACf,IAAA,EAAM,UAAA;AAAA,UACN,MAAM,IAAA,IAAQ,SAAA;AAAA,UACd;AAAA,SACF;AAAA,QACA,kBAAA,EAAoB;AAAA,OACtB;AAAA,IACF,KAAK,QAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB;AAAA,UACf,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,IAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF;AACE,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB;AAAA,UACf,IAAA,EAAM,UAAA;AAAA,UACN,IAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA;AAEN;AAEA,SAAS,4BACP,UAAA,EACiC;AACjC,EAAA,OAAO,mBAAA,CAAoB,YAAY,MAAM,CAAA;AAC/C;AAEA,SAAS,uBACP,KAAA,EACmC;AACnC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,OAAA,IAAW,CAAC,MAAM,UAAA,EAAY;AACjD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,YAAA;AACjC,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,WAAW,CAAA,EAAG;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAA6B,EAAE,OAAA,EAAQ;AAC7C,EAAA,IAAI,OAAO,KAAA,CAAM,UAAA,CAAW,SAAA,KAAc,QAAA,EAAU;AAClD,IAAA,GAAA,CAAI,IAAA,GAAO,MAAM,UAAA,CAAW,SAAA;AAAA,EAC9B;AACA,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,mCAAA,CACd,OACA,OAAA,EACuB;AACvB,EAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,CAAA;AAC1C,EAAA,MAAM,OAAA,GACJ,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,GACxD,KAAA,CAAM,OAAA,GACN,qBAAA,CAAsB,OAAO,UAAU,CAAA;AAE7C,EAAA,MAAM,EAAA,GAAK,cAAA,CAAe,KAAA,CAAM,SAAS,CAAA;AACzC,EAAA,MAAM,EAAE,eAAA,EAAiB,kBAAA,EAAmB,GAAI,2BAAA;AAAA,IAC9C,KAAA,CAAM,MAAA;AAAA,IACN;AAAA,GACF;AAEA,EAAA,MAAM,SAAA,GACJ,MAAM,UAAA,KAAe,MAAA,GAAY,EAAE,GAAG,KAAA,CAAM,UAAA,EAAW,GAAI,EAAC;AAE9D,EAAA,MAAM,aAAa,iBAAA,CAAkB;AAAA,IACnC,GAAG,SAAA;AAAA,IACH,UAAA,EAAY,MAAM,MAAA,CAAO,IAAA;AAAA,IACzB,UAAA,EAAY,MAAM,MAAA,CAAO,IAAA;AAAA,IACzB,kBAAA;AAAA,IACA,gBAAA,EAAkB,EAAA,CAAG,gBAAA,GAAmB,IAAA,GAAO;AAAA,GAChD,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,2BAAA,CAA4B,KAAA,CAAM,UAAU,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,uBAAuB,KAAK,CAAA;AAE1C,EAAA,MAAM,YAAA,GAAe,MAAM,UAAA,EAAY,YAAA;AACvC,EAAA,MAAM,aAAA,GAAgB,MAAM,UAAA,EAAY,aAAA;AAExC,EAAA,MAAM,GAAA,GAA6B;AAAA,IACjC,aAAA,EAAe,KAAA;AAAA,IACf,OAAA;AAAA,IACA,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,WAAW,EAAA,CAAG,GAAA;AAAA,IACd,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,MAAA,EAAQ,eAAA;AAAA,IACR;AAAA,GACF;AAEA,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,GAAA,CAAI,WAAW,KAAA,CAAM,QAAA;AAAA,EACvB;AACA,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,IAAA,GAAA,CAAI,SAAS,KAAA,CAAM,MAAA;AAAA,EACrB;AACA,EAAA,IACE,KAAA,CAAM,UAAA,KAAe,MAAA,IACrB,MAAA,CAAO,QAAA,CAAS,MAAM,UAAU,CAAA,IAChC,KAAA,CAAM,UAAA,IAAc,CAAA,EACpB;AACA,IAAA,GAAA,CAAI,aAAa,KAAA,CAAM,UAAA;AAAA,EACzB;AACA,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,GAAA,CAAI,UAAA,GAAa,UAAA;AAAA,EACnB;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AAAA,EACd;AACA,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,GAAA,CAAI,YAAA,GAAe,YAAA;AAAA,EACrB;AACA,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,GAAA,CAAI,aAAA,GAAgB,aAAA;AAAA,EACtB;AAEA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,qCAAA,CACd,QACA,OAAA,EACyB;AACzB,EAAA,OAAO,MAAA,CAAO,GAAA;AAAA,IAAI,CAAC,KAAA,EAAO,KAAA,KACxB,mCAAA,CAAoC,KAAA,EAAO,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,KAAA,EAAO;AAAA,GAC9E;AACF","file":"persisted.mjs","sourcesContent":["import type { EventSource, InspectEvent } from \"../types/inspect-event.js\";\nimport type {\n PersistedEventSource,\n PersistedEventSourceType,\n PersistedInspectError,\n PersistedInspectEvent,\n PersistedTokenUsage,\n} from \"../types/persisted-inspect-event.js\";\nimport { normalizeTokenUsage } from \"./token-usage.js\";\n\nexport interface InspectEventToPersistedOptions {\n /**\n * Optional source name override.\n * If omitted, derived from event.source.type.\n */\n sourceName?: string;\n\n /**\n * Optional source version override.\n */\n sourceVersion?: string;\n\n /**\n * Stable index for deterministic fallback IDs if needed.\n */\n eventIndex?: number;\n}\n\nfunction sanitizeIdPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n\nfunction createFallbackEventId(event: InspectEvent, eventIndex: number): string {\n const runId = sanitizeIdPart(event.runId);\n const kind = sanitizeIdPart(event.kind);\n const name = sanitizeIdPart(event.name);\n return `inspect:${runId}:${kind}:${name}:${eventIndex}`;\n}\n\nfunction toIsoTimestamp(\n ms: number,\n): { iso: string; invalidTimestamp: boolean } {\n if (typeof ms !== \"number\" || !Number.isFinite(ms)) {\n return { iso: new Date(0).toISOString(), invalidTimestamp: true };\n }\n return { iso: new Date(ms).toISOString(), invalidTimestamp: false };\n}\n\nfunction compactAttributes(\n entries: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(entries)) {\n if (value !== undefined) {\n out[key] = value;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction mapInspectSourceToPersisted(\n source: EventSource,\n options?: InspectEventToPersistedOptions,\n): {\n persistedSource: PersistedEventSource;\n originalSourceType?: EventSource[\"type\"];\n} {\n const name = options?.sourceName;\n const version = options?.sourceVersion;\n\n switch (source.type) {\n case \"pino\":\n return {\n persistedSource: {\n type: \"json-log\",\n name: name ?? \"pino\",\n version,\n },\n originalSourceType: \"pino\",\n };\n case \"winston\":\n return {\n persistedSource: {\n type: \"json-log\",\n name: name ?? \"winston\",\n version,\n },\n originalSourceType: \"winston\",\n };\n case \"manual\":\n case \"json-log\":\n case \"log4js\":\n case \"adapter\":\n return {\n persistedSource: {\n type: source.type as PersistedEventSourceType,\n name,\n version,\n },\n };\n default:\n return {\n persistedSource: {\n type: \"json-log\",\n name,\n version,\n },\n };\n }\n}\n\nfunction mapTokenUsageFromAttributes(\n attributes: Record<string, unknown> | undefined,\n): PersistedTokenUsage | undefined {\n return normalizeTokenUsage(attributes?.tokens);\n}\n\nfunction mapErrorFromAttributes(\n event: InspectEvent,\n): PersistedInspectError | undefined {\n if (event.status !== \"error\" || !event.attributes) {\n return undefined;\n }\n const message = event.attributes.errorMessage;\n if (typeof message !== \"string\" || message.length === 0) {\n return undefined;\n }\n const err: PersistedInspectError = { message };\n if (typeof event.attributes.errorName === \"string\") {\n err.name = event.attributes.errorName;\n }\n return err;\n}\n\n/**\n * Maps one in-memory {@link InspectEvent} to a v0.2 {@link PersistedInspectEvent}.\n * Does not mutate `event`.\n */\nexport function inspectEventToPersistedInspectEvent(\n event: InspectEvent,\n options?: InspectEventToPersistedOptions,\n): PersistedInspectEvent {\n const eventIndex = options?.eventIndex ?? 0;\n const eventId =\n typeof event.eventId === \"string\" && event.eventId.length > 0\n ? event.eventId\n : createFallbackEventId(event, eventIndex);\n\n const ts = toIsoTimestamp(event.timestamp);\n const { persistedSource, originalSourceType } = mapInspectSourceToPersisted(\n event.source,\n options,\n );\n\n const attrsBase =\n event.attributes !== undefined ? { ...event.attributes } : {};\n\n const attributes = compactAttributes({\n ...attrsBase,\n sourceFile: event.source.file,\n sourceLine: event.source.line,\n originalSourceType,\n invalidTimestamp: ts.invalidTimestamp ? true : undefined,\n });\n\n const tokenUsage = mapTokenUsageFromAttributes(event.attributes);\n const error = mapErrorFromAttributes(event);\n\n const inputPreview = event.attributes?.inputPreview;\n const outputPreview = event.attributes?.outputPreview;\n\n const out: PersistedInspectEvent = {\n schemaVersion: \"0.2\",\n eventId,\n runId: event.runId,\n kind: event.kind,\n name: event.name,\n timestamp: ts.iso,\n confidence: event.confidence,\n source: persistedSource,\n attributes,\n };\n\n if (event.parentId !== undefined) {\n out.parentId = event.parentId;\n }\n if (event.status !== undefined) {\n out.status = event.status;\n }\n if (\n event.durationMs !== undefined &&\n Number.isFinite(event.durationMs) &&\n event.durationMs >= 0\n ) {\n out.durationMs = event.durationMs;\n }\n if (tokenUsage !== undefined) {\n out.tokenUsage = tokenUsage;\n }\n if (error !== undefined) {\n out.error = error;\n }\n if (inputPreview !== undefined) {\n out.inputSummary = inputPreview;\n }\n if (outputPreview !== undefined) {\n out.outputSummary = outputPreview;\n }\n\n return out;\n}\n\n/**\n * Maps in-memory {@link InspectEvent} rows to persisted v0.2 events.\n */\nexport function inspectEventsToPersistedInspectEvents(\n events: readonly InspectEvent[],\n options?: Omit<InspectEventToPersistedOptions, \"eventIndex\">,\n): PersistedInspectEvent[] {\n return events.map((event, index) =>\n inspectEventToPersistedInspectEvent(event, { ...options, eventIndex: index }),\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/persisted/from-inspect-event.ts"],"names":[],"mappings":"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","file":"persisted.mjs","sourcesContent":["import type { EventSource, InspectEvent } from \"../types/inspect-event.js\";\nimport type {\n PersistedEventSource,\n PersistedEventSourceType,\n PersistedInspectError,\n PersistedInspectEvent,\n PersistedTokenUsage,\n} from \"../types/persisted-inspect-event.js\";\nimport { normalizeTokenUsage } from \"./token-usage.js\";\n\nexport interface InspectEventToPersistedOptions {\n /**\n * Optional source name override.\n * If omitted, derived from event.source.type.\n */\n sourceName?: string;\n\n /**\n * Optional source version override.\n */\n sourceVersion?: string;\n\n /**\n * Stable index for deterministic fallback IDs if needed.\n */\n eventIndex?: number;\n}\n\nfunction sanitizeIdPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n\nfunction createFallbackEventId(event: InspectEvent, eventIndex: number): string {\n const runId = sanitizeIdPart(event.runId);\n const kind = sanitizeIdPart(event.kind);\n const name = sanitizeIdPart(event.name);\n return `inspect:${runId}:${kind}:${name}:${eventIndex}`;\n}\n\nfunction toIsoTimestamp(\n ms: number,\n): { iso: string; invalidTimestamp: boolean } {\n if (typeof ms !== \"number\" || !Number.isFinite(ms)) {\n return { iso: new Date(0).toISOString(), invalidTimestamp: true };\n }\n return { iso: new Date(ms).toISOString(), invalidTimestamp: false };\n}\n\nfunction compactAttributes(\n entries: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(entries)) {\n if (value !== undefined) {\n out[key] = value;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction mapInspectSourceToPersisted(\n source: EventSource,\n options?: InspectEventToPersistedOptions,\n): {\n persistedSource: PersistedEventSource;\n originalSourceType?: EventSource[\"type\"];\n} {\n const name = options?.sourceName;\n const version = options?.sourceVersion;\n\n switch (source.type) {\n case \"pino\":\n return {\n persistedSource: {\n type: \"json-log\",\n name: name ?? \"pino\",\n version,\n },\n originalSourceType: \"pino\",\n };\n case \"winston\":\n return {\n persistedSource: {\n type: \"json-log\",\n name: name ?? \"winston\",\n version,\n },\n originalSourceType: \"winston\",\n };\n case \"manual\":\n case \"json-log\":\n case \"log4js\":\n case \"adapter\":\n return {\n persistedSource: {\n type: source.type as PersistedEventSourceType,\n name,\n version,\n },\n };\n default:\n return {\n persistedSource: {\n type: \"json-log\",\n name,\n version,\n },\n };\n }\n}\n\nfunction mapTokenUsageFromAttributes(\n attributes: Record<string, unknown> | undefined,\n): PersistedTokenUsage | undefined {\n return normalizeTokenUsage(attributes?.tokens);\n}\n\nfunction mapErrorFromAttributes(\n event: InspectEvent,\n): PersistedInspectError | undefined {\n if (event.status !== \"error\" || !event.attributes) {\n return undefined;\n }\n const message = event.attributes.errorMessage;\n if (typeof message !== \"string\" || message.length === 0) {\n return undefined;\n }\n const err: PersistedInspectError = { message };\n if (typeof event.attributes.errorName === \"string\") {\n err.name = event.attributes.errorName;\n }\n return err;\n}\n\n/**\n * Maps one in-memory {@link InspectEvent} to a v0.2 {@link PersistedInspectEvent}.\n * Does not mutate `event`.\n */\nexport function inspectEventToPersistedInspectEvent(\n event: InspectEvent,\n options?: InspectEventToPersistedOptions,\n): PersistedInspectEvent {\n const eventIndex = options?.eventIndex ?? 0;\n const eventId =\n typeof event.eventId === \"string\" && event.eventId.length > 0\n ? event.eventId\n : createFallbackEventId(event, eventIndex);\n\n const ts = toIsoTimestamp(event.timestamp);\n const { persistedSource, originalSourceType } = mapInspectSourceToPersisted(\n event.source,\n options,\n );\n\n const attrsBase =\n event.attributes !== undefined ? { ...event.attributes } : {};\n\n const attributes = compactAttributes({\n ...attrsBase,\n sourceFile: event.source.file,\n sourceLine: event.source.line,\n originalSourceType,\n invalidTimestamp: ts.invalidTimestamp ? true : undefined,\n });\n\n const tokenUsage = mapTokenUsageFromAttributes(event.attributes);\n const error = mapErrorFromAttributes(event);\n\n const inputPreview = event.attributes?.inputPreview;\n const outputPreview = event.attributes?.outputPreview;\n\n const out: PersistedInspectEvent = {\n schemaVersion: \"0.2\",\n eventId,\n runId: event.runId,\n kind: event.kind,\n name: event.name,\n timestamp: ts.iso,\n confidence: event.confidence,\n source: persistedSource,\n attributes,\n };\n\n if (event.parentId !== undefined) {\n out.parentId = event.parentId;\n }\n if (event.status !== undefined) {\n out.status = event.status;\n }\n if (\n event.durationMs !== undefined &&\n Number.isFinite(event.durationMs) &&\n event.durationMs >= 0\n ) {\n out.durationMs = event.durationMs;\n }\n if (tokenUsage !== undefined) {\n out.tokenUsage = tokenUsage;\n }\n if (error !== undefined) {\n out.error = error;\n }\n if (inputPreview !== undefined) {\n out.inputSummary = inputPreview;\n }\n if (outputPreview !== undefined) {\n out.outputSummary = outputPreview;\n }\n\n return out;\n}\n\n/**\n * Maps in-memory {@link InspectEvent} rows to persisted v0.2 events.\n */\nexport function inspectEventsToPersistedInspectEvents(\n events: readonly InspectEvent[],\n options?: Omit<InspectEventToPersistedOptions, \"eventIndex\">,\n): PersistedInspectEvent[] {\n return events.map((event, index) =>\n inspectEventToPersistedInspectEvent(event, { ...options, eventIndex: index }),\n );\n}\n"]}
|
|
@@ -1217,6 +1217,162 @@ function projectLogicalEvents(events) {
|
|
|
1217
1217
|
};
|
|
1218
1218
|
}
|
|
1219
1219
|
|
|
1220
|
+
// packages/core/src/checks/canonical-equality.ts
|
|
1221
|
+
var DEFAULT_MAX_DEPTH = 8;
|
|
1222
|
+
var DEFAULT_MAX_BYTES = 16384;
|
|
1223
|
+
function sortKeysDeep(input, depth, maxDepth) {
|
|
1224
|
+
if (depth > maxDepth) {
|
|
1225
|
+
throw new Error("AI_CHECK_CANONICAL_DEPTH_EXCEEDED");
|
|
1226
|
+
}
|
|
1227
|
+
if (input === null || typeof input !== "object") return input;
|
|
1228
|
+
if (Array.isArray(input)) {
|
|
1229
|
+
return input.map((item) => sortKeysDeep(item, depth + 1, maxDepth));
|
|
1230
|
+
}
|
|
1231
|
+
const record = input;
|
|
1232
|
+
const out = {};
|
|
1233
|
+
for (const key of Object.keys(record).sort()) {
|
|
1234
|
+
out[key] = sortKeysDeep(record[key], depth + 1, maxDepth);
|
|
1235
|
+
}
|
|
1236
|
+
return out;
|
|
1237
|
+
}
|
|
1238
|
+
function encodeCanonicalStructured(value, limits) {
|
|
1239
|
+
const maxDepth = DEFAULT_MAX_DEPTH;
|
|
1240
|
+
const maxBytes = DEFAULT_MAX_BYTES;
|
|
1241
|
+
try {
|
|
1242
|
+
const sorted = sortKeysDeep(value, 0, maxDepth);
|
|
1243
|
+
const encoded = JSON.stringify(sorted);
|
|
1244
|
+
if (encoded === void 0) {
|
|
1245
|
+
return {
|
|
1246
|
+
ok: false,
|
|
1247
|
+
reason: "Value is not JSON-serializable for canonical comparison.",
|
|
1248
|
+
code: "AI_CHECK_CANONICAL_UNSERIALIZABLE"
|
|
1249
|
+
};
|
|
1250
|
+
}
|
|
1251
|
+
if (Buffer.byteLength(encoded, "utf8") > maxBytes) {
|
|
1252
|
+
return {
|
|
1253
|
+
ok: false,
|
|
1254
|
+
reason: "Canonical structured value exceeds bounded size limit.",
|
|
1255
|
+
code: "AI_CHECK_CANONICAL_SIZE_EXCEEDED"
|
|
1256
|
+
};
|
|
1257
|
+
}
|
|
1258
|
+
return { ok: true, value: encoded };
|
|
1259
|
+
} catch (error) {
|
|
1260
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1261
|
+
if (message === "AI_CHECK_CANONICAL_DEPTH_EXCEEDED") {
|
|
1262
|
+
return {
|
|
1263
|
+
ok: false,
|
|
1264
|
+
reason: "Canonical structured value exceeds bounded depth limit.",
|
|
1265
|
+
code: "AI_CHECK_CANONICAL_DEPTH_EXCEEDED"
|
|
1266
|
+
};
|
|
1267
|
+
}
|
|
1268
|
+
return {
|
|
1269
|
+
ok: false,
|
|
1270
|
+
reason: "Canonical structured encoding failed.",
|
|
1271
|
+
code: "AI_CHECK_CANONICAL_UNSERIALIZABLE"
|
|
1272
|
+
};
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
// packages/core/src/persisted/delivery-identity.ts
|
|
1277
|
+
var DELIVERY_CONFLICT_ATTR = "agent_inspect.delivery_conflict";
|
|
1278
|
+
var SYNTHETIC_DELIVERY_ID = /^(?:manual|inspect):[A-Za-z0-9_-]+:[A-Za-z0-9_-]+:[A-Za-z0-9_-]+:\d+$/;
|
|
1279
|
+
function stripReaderDeliveryDiscriminator(eventId) {
|
|
1280
|
+
if (!SYNTHETIC_DELIVERY_ID.test(eventId)) return eventId;
|
|
1281
|
+
return eventId.replace(/:\d+$/, "");
|
|
1282
|
+
}
|
|
1283
|
+
function canonicalDigest(value) {
|
|
1284
|
+
if (value === void 0) return null;
|
|
1285
|
+
const encoded = encodeCanonicalStructured(value);
|
|
1286
|
+
return encoded.ok ? encoded.value : `unencodable:${encoded.code}`;
|
|
1287
|
+
}
|
|
1288
|
+
function capturedContentDigest(attributes) {
|
|
1289
|
+
if (!attributes || typeof attributes !== "object") {
|
|
1290
|
+
return { args: null, result: null };
|
|
1291
|
+
}
|
|
1292
|
+
const nested = attributes.metadata && typeof attributes.metadata === "object" ? attributes.metadata : void 0;
|
|
1293
|
+
const args = attributes.arguments ?? attributes.args ?? attributes.input ?? nested?.arguments ?? nested?.args ?? nested?.input;
|
|
1294
|
+
const result = attributes.result ?? attributes.output ?? attributes.response ?? nested?.result ?? nested?.output ?? nested?.response;
|
|
1295
|
+
return {
|
|
1296
|
+
args: args === void 0 ? null : canonicalDigest(args),
|
|
1297
|
+
result: result === void 0 ? null : canonicalDigest(result)
|
|
1298
|
+
};
|
|
1299
|
+
}
|
|
1300
|
+
function timeKey(fields) {
|
|
1301
|
+
if (typeof fields.startedAt === "string" && fields.startedAt.trim() !== "") {
|
|
1302
|
+
return fields.startedAt;
|
|
1303
|
+
}
|
|
1304
|
+
if (typeof fields.timestamp === "string" && fields.timestamp.trim() !== "") {
|
|
1305
|
+
return fields.timestamp;
|
|
1306
|
+
}
|
|
1307
|
+
if (typeof fields.timestamp === "number" && Number.isFinite(fields.timestamp)) {
|
|
1308
|
+
return String(fields.timestamp);
|
|
1309
|
+
}
|
|
1310
|
+
return null;
|
|
1311
|
+
}
|
|
1312
|
+
function deliverySemanticFingerprint(fields) {
|
|
1313
|
+
const content = capturedContentDigest(fields.attributes);
|
|
1314
|
+
return JSON.stringify({
|
|
1315
|
+
stableEventId: stripReaderDeliveryDiscriminator(fields.eventId),
|
|
1316
|
+
runId: fields.runId,
|
|
1317
|
+
kind: fields.kind,
|
|
1318
|
+
name: fields.name,
|
|
1319
|
+
status: fields.status ?? null,
|
|
1320
|
+
parentId: fields.parentId ?? null,
|
|
1321
|
+
sourceType: fields.sourceType ?? null,
|
|
1322
|
+
time: timeKey(fields),
|
|
1323
|
+
operationId: fields.operationId ?? null,
|
|
1324
|
+
attemptId: fields.attemptId ?? null,
|
|
1325
|
+
attemptNumber: fields.attemptNumber ?? null,
|
|
1326
|
+
retryOf: fields.retryOf ?? null,
|
|
1327
|
+
argsDigest: content.args,
|
|
1328
|
+
resultDigest: content.result
|
|
1329
|
+
});
|
|
1330
|
+
}
|
|
1331
|
+
function identityFieldsFromAttributes(attributes) {
|
|
1332
|
+
if (!attributes || typeof attributes !== "object") {
|
|
1333
|
+
return {
|
|
1334
|
+
operationId: null,
|
|
1335
|
+
attemptId: null,
|
|
1336
|
+
attemptNumber: null,
|
|
1337
|
+
retryOf: null
|
|
1338
|
+
};
|
|
1339
|
+
}
|
|
1340
|
+
const nested = attributes.metadata && typeof attributes.metadata === "object" && !Array.isArray(attributes.metadata) ? attributes.metadata : void 0;
|
|
1341
|
+
const pickString = (key) => {
|
|
1342
|
+
const direct = attributes[key];
|
|
1343
|
+
if (typeof direct === "string" && direct.trim() !== "") return direct.trim();
|
|
1344
|
+
const nestedValue = nested?.[key];
|
|
1345
|
+
if (typeof nestedValue === "string" && nestedValue.trim() !== "") {
|
|
1346
|
+
return nestedValue.trim();
|
|
1347
|
+
}
|
|
1348
|
+
return null;
|
|
1349
|
+
};
|
|
1350
|
+
const pickNumber = () => {
|
|
1351
|
+
const direct = attributes.attemptNumber ?? attributes.attempt;
|
|
1352
|
+
if (typeof direct === "number" && Number.isFinite(direct)) return direct;
|
|
1353
|
+
const nestedValue = nested?.attemptNumber ?? nested?.attempt;
|
|
1354
|
+
if (typeof nestedValue === "number" && Number.isFinite(nestedValue)) {
|
|
1355
|
+
return nestedValue;
|
|
1356
|
+
}
|
|
1357
|
+
return null;
|
|
1358
|
+
};
|
|
1359
|
+
return {
|
|
1360
|
+
operationId: pickString("operationId"),
|
|
1361
|
+
attemptId: pickString("attemptId"),
|
|
1362
|
+
retryOf: pickString("retryOf"),
|
|
1363
|
+
attemptNumber: pickNumber()
|
|
1364
|
+
};
|
|
1365
|
+
}
|
|
1366
|
+
function stampDeliveryConflict(event) {
|
|
1367
|
+
return {
|
|
1368
|
+
...event,
|
|
1369
|
+
attributes: {
|
|
1370
|
+
...event.attributes ?? {},
|
|
1371
|
+
[DELIVERY_CONFLICT_ATTR]: true
|
|
1372
|
+
}
|
|
1373
|
+
};
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1220
1376
|
// packages/core/src/logs/tree-builder.ts
|
|
1221
1377
|
function inc(map, key) {
|
|
1222
1378
|
map[key] = (map[key] ?? 0) + 1;
|
|
@@ -1348,7 +1504,47 @@ var TreeBuilder = class {
|
|
|
1348
1504
|
const sorted = [...runEvents].sort((a, b) => a.timestamp - b.timestamp);
|
|
1349
1505
|
const nodes = /* @__PURE__ */ new Map();
|
|
1350
1506
|
for (const e of sorted) {
|
|
1351
|
-
nodes.
|
|
1507
|
+
const existing = nodes.get(e.eventId);
|
|
1508
|
+
if (!existing) {
|
|
1509
|
+
nodes.set(e.eventId, { event: e, children: [], depth: 0 });
|
|
1510
|
+
continue;
|
|
1511
|
+
}
|
|
1512
|
+
const existingAttrs = existing.event.attributes && typeof existing.event.attributes === "object" ? existing.event.attributes : void 0;
|
|
1513
|
+
const nextAttrs = e.attributes && typeof e.attributes === "object" ? e.attributes : void 0;
|
|
1514
|
+
const existingIdentity = identityFieldsFromAttributes(existingAttrs);
|
|
1515
|
+
const nextIdentity = identityFieldsFromAttributes(nextAttrs);
|
|
1516
|
+
const existingFp = deliverySemanticFingerprint({
|
|
1517
|
+
eventId: existing.event.eventId,
|
|
1518
|
+
runId: existing.event.runId,
|
|
1519
|
+
kind: existing.event.kind,
|
|
1520
|
+
name: existing.event.name,
|
|
1521
|
+
status: existing.event.status,
|
|
1522
|
+
parentId: existing.event.parentId,
|
|
1523
|
+
timestamp: existing.event.timestamp,
|
|
1524
|
+
sourceType: existing.event.source?.type,
|
|
1525
|
+
attributes: existingAttrs,
|
|
1526
|
+
...existingIdentity
|
|
1527
|
+
});
|
|
1528
|
+
const nextFp = deliverySemanticFingerprint({
|
|
1529
|
+
eventId: e.eventId,
|
|
1530
|
+
runId: e.runId,
|
|
1531
|
+
kind: e.kind,
|
|
1532
|
+
name: e.name,
|
|
1533
|
+
status: e.status,
|
|
1534
|
+
parentId: e.parentId,
|
|
1535
|
+
timestamp: e.timestamp,
|
|
1536
|
+
sourceType: e.source?.type,
|
|
1537
|
+
attributes: nextAttrs,
|
|
1538
|
+
...nextIdentity
|
|
1539
|
+
});
|
|
1540
|
+
if (existingFp === nextFp) {
|
|
1541
|
+
continue;
|
|
1542
|
+
}
|
|
1543
|
+
nodes.set(e.eventId, {
|
|
1544
|
+
event: stampDeliveryConflict(e),
|
|
1545
|
+
children: [],
|
|
1546
|
+
depth: 0
|
|
1547
|
+
});
|
|
1352
1548
|
}
|
|
1353
1549
|
const { roots, summary } = linkNodesVisibilityFirst(nodes);
|
|
1354
1550
|
const confidenceBreakdown = {
|
|
@@ -2914,6 +3110,12 @@ function promoteAgentInspectWorkflowIdentity(attributes, pathPrefix) {
|
|
|
2914
3110
|
["agent_inspect.retry_of", "retryOf", "string"],
|
|
2915
3111
|
["agent_inspect.attempt_number", "attemptNumber", "int"]
|
|
2916
3112
|
];
|
|
3113
|
+
const conflictMapping = [
|
|
3114
|
+
["agent_inspect.identity_conflict.operation_id", "operationId", "string"],
|
|
3115
|
+
["agent_inspect.identity_conflict.attempt_id", "attemptId", "string"],
|
|
3116
|
+
["agent_inspect.identity_conflict.retry_of", "retryOf", "string"],
|
|
3117
|
+
["agent_inspect.identity_conflict.attempt_number", "attemptNumber", "int"]
|
|
3118
|
+
];
|
|
2917
3119
|
const metadata = attributes.metadata && typeof attributes.metadata === "object" && !Array.isArray(attributes.metadata) ? { ...attributes.metadata } : {};
|
|
2918
3120
|
for (const [dotted, camel, kind] of mapping) {
|
|
2919
3121
|
const raw = attributes[dotted];
|
|
@@ -2965,6 +3167,46 @@ function promoteAgentInspectWorkflowIdentity(attributes, pathPrefix) {
|
|
|
2965
3167
|
if (direct === void 0) attributes[camel] = promoted;
|
|
2966
3168
|
if (nested === void 0) metadata[camel] = promoted;
|
|
2967
3169
|
}
|
|
3170
|
+
for (const [dotted, camel, kind] of conflictMapping) {
|
|
3171
|
+
const raw = attributes[dotted];
|
|
3172
|
+
if (raw === void 0 || raw === null) continue;
|
|
3173
|
+
let alternate;
|
|
3174
|
+
if (kind === "int") {
|
|
3175
|
+
const n = typeof raw === "number" ? raw : typeof raw === "string" ? Number(raw) : NaN;
|
|
3176
|
+
if (!Number.isFinite(n) || n < 1) {
|
|
3177
|
+
warnings.push({
|
|
3178
|
+
code: "otlp_identity_invalid",
|
|
3179
|
+
message: `Ignoring invalid ${dotted} identity conflict value.`,
|
|
3180
|
+
severity: "warning",
|
|
3181
|
+
field: `${pathPrefix}.${dotted}`
|
|
3182
|
+
});
|
|
3183
|
+
continue;
|
|
3184
|
+
}
|
|
3185
|
+
alternate = Math.trunc(n);
|
|
3186
|
+
} else if (typeof raw === "string" && raw.trim() !== "") {
|
|
3187
|
+
alternate = raw.trim();
|
|
3188
|
+
} else {
|
|
3189
|
+
warnings.push({
|
|
3190
|
+
code: "otlp_identity_invalid",
|
|
3191
|
+
message: `Ignoring non-string ${dotted} identity conflict value.`,
|
|
3192
|
+
severity: "warning",
|
|
3193
|
+
field: `${pathPrefix}.${dotted}`
|
|
3194
|
+
});
|
|
3195
|
+
continue;
|
|
3196
|
+
}
|
|
3197
|
+
const preferred = attributes[camel];
|
|
3198
|
+
if (preferred !== void 0 && preferred !== alternate) {
|
|
3199
|
+
metadata[camel] = alternate;
|
|
3200
|
+
warnings.push({
|
|
3201
|
+
code: "otlp_identity_conflict",
|
|
3202
|
+
message: `Conflicting ${camel}: attributes.${camel} vs nested alternate from ${dotted}; retaining both.`,
|
|
3203
|
+
severity: "warning",
|
|
3204
|
+
field: `${pathPrefix}.${dotted}`
|
|
3205
|
+
});
|
|
3206
|
+
} else if (preferred === void 0) {
|
|
3207
|
+
metadata[camel] = alternate;
|
|
3208
|
+
}
|
|
3209
|
+
}
|
|
2968
3210
|
if (Object.keys(metadata).length > 0) {
|
|
2969
3211
|
attributes.metadata = metadata;
|
|
2970
3212
|
}
|