@shield-agent/kya 0.22.0 → 0.23.1
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/.mcp.json +1 -1
- package/README.md +72 -30
- package/amp/settings.example.json +1 -1
- package/claude/claude_desktop_config.example.json +1 -1
- package/cline/cline_mcp_settings.example.json +1 -1
- package/copilot/mcp-config.example.json +1 -1
- package/dist/certify/attest.js +5 -5
- package/dist/certify/catalog.d.ts +1 -1
- package/dist/certify/catalog.js +3 -3
- package/dist/certify/context.js +1 -1
- package/dist/certify/evaluate.d.ts +2 -2
- package/dist/certify/evaluate.js +12 -12
- package/dist/certify/live.js +2 -2
- package/dist/certify/render.d.ts +1 -1
- package/dist/certify/render.js +10 -10
- package/dist/cli.d.ts +2 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +49 -16
- package/dist/cli.js.map +1 -1
- package/dist/commands/certify.d.ts +1 -1
- package/dist/commands/certify.js +3 -3
- package/dist/commands/connect.d.ts +2 -2
- package/dist/commands/connect.js +22 -22
- package/dist/commands/dash.js +4 -4
- package/dist/commands/gate-serve.js +3 -3
- package/dist/commands/gate.d.ts +1 -1
- package/dist/commands/gate.js +16 -16
- package/dist/commands/hook.d.ts +1 -1
- package/dist/commands/hook.d.ts.map +1 -1
- package/dist/commands/hook.js +55 -18
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/import-traces.d.ts +16 -0
- package/dist/commands/import-traces.d.ts.map +1 -0
- package/dist/commands/import-traces.js +18 -0
- package/dist/commands/import-traces.js.map +1 -0
- package/dist/commands/init.js +1 -1
- package/dist/commands/investigate.d.ts +13 -0
- package/dist/commands/investigate.d.ts.map +1 -0
- package/dist/commands/investigate.js +22 -0
- package/dist/commands/investigate.js.map +1 -0
- package/dist/commands/notify-flush.d.ts +2 -0
- package/dist/commands/notify-flush.d.ts.map +1 -0
- package/dist/commands/notify-flush.js +47 -0
- package/dist/commands/notify-flush.js.map +1 -0
- package/dist/commands/orr.d.ts +3 -3
- package/dist/commands/orr.js +5 -5
- package/dist/commands/receipt-serve.d.ts +1 -1
- package/dist/commands/receipt-serve.js +1 -1
- package/dist/commands/serve-mcp.js +1 -1
- package/dist/commands/start.d.ts +2 -2
- package/dist/commands/start.js +20 -20
- package/dist/commands/stop.d.ts +1 -1
- package/dist/commands/stop.js +6 -6
- package/dist/commands/update.d.ts +19 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +96 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/wire-hooks.d.ts +1 -1
- package/dist/commands/wire-hooks.js +14 -14
- package/dist/commands/wrap.d.ts.map +1 -1
- package/dist/commands/wrap.js +12 -7
- package/dist/commands/wrap.js.map +1 -1
- package/dist/config.d.ts +4 -4
- package/dist/config.js +5 -5
- package/dist/dash/dash.d.ts +1 -1
- package/dist/dash/dash.js +3 -3
- package/dist/dash/entitlement.d.ts +1 -1
- package/dist/dash/entitlement.js +1 -1
- package/dist/dash/render.js +2 -2
- package/dist/dash/screens/enterprise.js +9 -9
- package/dist/dash/screens/free.js +5 -5
- package/dist/diff-preview.d.ts +1 -1
- package/dist/diff-preview.js +2 -2
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/fs-atomic.d.ts +1 -1
- package/dist/fs-atomic.js +2 -2
- package/dist/gate/binary.js +4 -4
- package/dist/gate/config-gen.d.ts +1 -1
- package/dist/gate/config-gen.js +7 -7
- package/dist/gate/config.d.ts +2 -2
- package/dist/gate/config.js +6 -6
- package/dist/gate/daemon.js +1 -1
- package/dist/gate/discover.d.ts +2 -2
- package/dist/gate/discover.js +7 -7
- package/dist/gate/hosted-sync.js +1 -1
- package/dist/gate/otlp-decode.d.ts +2 -2
- package/dist/gate/otlp-decode.js +2 -2
- package/dist/gate/otlp-receiver.d.ts +1 -1
- package/dist/gate/otlp-receiver.js +3 -3
- package/dist/host-reload.js +11 -11
- package/dist/host-tools.d.ts +1 -1
- package/dist/host-tools.js +1 -1
- package/dist/importers/formats.d.ts +26 -0
- package/dist/importers/formats.d.ts.map +1 -0
- package/dist/importers/formats.js +281 -0
- package/dist/importers/formats.js.map +1 -0
- package/dist/importers/index.d.ts +26 -0
- package/dist/importers/index.d.ts.map +1 -0
- package/dist/importers/index.js +122 -0
- package/dist/importers/index.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/investigate/detectors.d.ts +35 -0
- package/dist/investigate/detectors.d.ts.map +1 -0
- package/dist/investigate/detectors.js +277 -0
- package/dist/investigate/detectors.js.map +1 -0
- package/dist/investigate/fix-brief.d.ts +3 -0
- package/dist/investigate/fix-brief.d.ts.map +1 -0
- package/dist/investigate/fix-brief.js +88 -0
- package/dist/investigate/fix-brief.js.map +1 -0
- package/dist/investigate/incidents.d.ts +19 -0
- package/dist/investigate/incidents.d.ts.map +1 -0
- package/dist/investigate/incidents.js +84 -0
- package/dist/investigate/incidents.js.map +1 -0
- package/dist/investigate/index.d.ts +25 -0
- package/dist/investigate/index.d.ts.map +1 -0
- package/dist/investigate/index.js +46 -0
- package/dist/investigate/index.js.map +1 -0
- package/dist/mcp/protocol.d.ts +2 -2
- package/dist/mcp/protocol.d.ts.map +1 -1
- package/dist/mcp/protocol.js +39 -8
- package/dist/mcp/protocol.js.map +1 -1
- package/dist/mcp/stdio.d.ts +1 -1
- package/dist/mcp/stdio.js +2 -2
- package/dist/mcp-servers.d.ts +2 -2
- package/dist/mcp-servers.js +2 -2
- package/dist/node-upgrade.d.ts +2 -2
- package/dist/node-upgrade.js +9 -9
- package/dist/notify/dispatch.d.ts +20 -0
- package/dist/notify/dispatch.d.ts.map +1 -0
- package/dist/notify/dispatch.js +52 -0
- package/dist/notify/dispatch.js.map +1 -0
- package/dist/notify/index.d.ts +39 -0
- package/dist/notify/index.d.ts.map +1 -0
- package/dist/notify/index.js +119 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/sender.d.ts +56 -0
- package/dist/notify/sender.d.ts.map +1 -0
- package/dist/notify/sender.js +139 -0
- package/dist/notify/sender.js.map +1 -0
- package/dist/notify/templates.d.ts +33 -0
- package/dist/notify/templates.d.ts.map +1 -0
- package/dist/notify/templates.js +119 -0
- package/dist/notify/templates.js.map +1 -0
- package/dist/offline-evaluate.d.ts +2 -2
- package/dist/offline-evaluate.js +3 -3
- package/dist/orr/agentshield.d.ts +2 -2
- package/dist/orr/agentshield.js +4 -4
- package/dist/orr/scorecard.d.ts +1 -1
- package/dist/orr/scorecard.js +3 -3
- package/dist/otel/exporter.d.ts +64 -0
- package/dist/otel/exporter.d.ts.map +1 -0
- package/dist/otel/exporter.js +247 -0
- package/dist/otel/exporter.js.map +1 -0
- package/dist/parse-args.d.ts +1 -1
- package/dist/parse-args.js +1 -1
- package/dist/receipt/auto-open.d.ts +1 -1
- package/dist/receipt/auto-open.js +1 -1
- package/dist/receipt/daemon.d.ts +6 -6
- package/dist/receipt/daemon.js +15 -15
- package/dist/receipt/dashboard.d.ts +1 -1
- package/dist/receipt/dashboard.js +2 -2
- package/dist/receipt/embeddings.d.ts +15 -4
- package/dist/receipt/embeddings.d.ts.map +1 -1
- package/dist/receipt/embeddings.js +116 -35
- package/dist/receipt/embeddings.js.map +1 -1
- package/dist/receipt/enrich.d.ts +2 -2
- package/dist/receipt/enrich.js +5 -5
- package/dist/receipt/gate-card.d.ts +2 -2
- package/dist/receipt/gate-card.d.ts.map +1 -1
- package/dist/receipt/gate-card.js +3 -3
- package/dist/receipt/live-server.d.ts.map +1 -1
- package/dist/receipt/live-server.js +22 -8
- package/dist/receipt/live-server.js.map +1 -1
- package/dist/receipt/receipt-css.d.ts +1 -1
- package/dist/receipt/receipt-css.d.ts.map +1 -1
- package/dist/receipt/receipt-css.js +72 -11
- package/dist/receipt/receipt-css.js.map +1 -1
- package/dist/receipt/render-receipt.d.ts +1 -1
- package/dist/receipt/render-receipt.d.ts.map +1 -1
- package/dist/receipt/render-receipt.js +138 -87
- package/dist/receipt/render-receipt.js.map +1 -1
- package/dist/receipt/search.d.ts +11 -0
- package/dist/receipt/search.d.ts.map +1 -1
- package/dist/receipt/search.js +70 -3
- package/dist/receipt/search.js.map +1 -1
- package/dist/receipt/share.d.ts +2 -2
- package/dist/receipt/share.js +5 -5
- package/dist/sample-tools.d.ts +1 -1
- package/dist/sample-tools.js +1 -1
- package/dist/sandbox/mock-driver.d.ts +1 -1
- package/dist/sandbox/mock-driver.js +1 -1
- package/dist/sdk/a2a.d.ts +2 -2
- package/dist/sdk/a2a.js +1 -1
- package/dist/sdk/adapters/claude-agent.d.ts +1 -1
- package/dist/sdk/adapters/claude-agent.js +1 -1
- package/dist/sdk/adapters/langgraph.d.ts +1 -1
- package/dist/sdk/adapters/langgraph.js +1 -1
- package/dist/sdk/adapters/mastra.d.ts +1 -1
- package/dist/sdk/adapters/mastra.js +1 -1
- package/dist/sdk/adapters/openai-agents.d.ts +1 -1
- package/dist/sdk/adapters/openai-agents.js +1 -1
- package/dist/sdk/adapters/vercel-ai.d.ts +2 -2
- package/dist/sdk/adapters/vercel-ai.js +1 -1
- package/dist/sdk/govern.d.ts +2 -2
- package/dist/sdk/govern.js +3 -3
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/index.js +1 -1
- package/dist/showback/trail-usage.d.ts +30 -0
- package/dist/showback/trail-usage.d.ts.map +1 -0
- package/dist/showback/trail-usage.js +50 -0
- package/dist/showback/trail-usage.js.map +1 -0
- package/dist/sign/evidence-bundle.d.ts +6 -6
- package/dist/sign/evidence-bundle.js +5 -5
- package/dist/star-cta.d.ts +1 -1
- package/dist/star-cta.d.ts.map +1 -1
- package/dist/star-cta.js +3 -3
- package/dist/trail-summary.d.ts +1 -1
- package/dist/trail-summary.js +3 -3
- package/dist/trail.d.ts +8 -2
- package/dist/trail.d.ts.map +1 -1
- package/dist/trail.js +18 -5
- package/dist/trail.js.map +1 -1
- package/dist/update-check.d.ts +17 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +134 -0
- package/dist/update-check.js.map +1 -0
- package/droid/README.md +1 -1
- package/droid/mcp.example.json +1 -1
- package/gemini/settings.example.json +1 -1
- package/grok/README.md +1 -1
- package/kilo/kilo.example.json +1 -1
- package/kimi/mcp.example.json +1 -1
- package/kiro/mcp.example.json +1 -1
- package/manifest.json +1 -1
- package/mastracode/mcp.example.json +1 -1
- package/mcp.json +1 -1
- package/openai/codex.config.example.toml +1 -1
- package/opencode/opencode.example.json +1 -1
- package/package.json +5 -3
- package/qwen/settings.example.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Foreign trace format mappers for the trace importer.
|
|
3
|
+
* Sources: LangSmith runs, Langfuse observations, Phoenix spans, OTLP/JSON spans.
|
|
4
|
+
* Each mapper converts one foreign record into a TrailEvent (mode "observe",
|
|
5
|
+
* host "import", no packId) or returns a per-record error - it never throws.
|
|
6
|
+
* Raw input/output values are never copied into the event; summaries render
|
|
7
|
+
* input key names only, redacted via redactTrailText.
|
|
8
|
+
*/
|
|
9
|
+
import type { TrailEvent } from "../trail.js";
|
|
10
|
+
export type ImportSource = "langsmith" | "langfuse" | "phoenix" | "otel";
|
|
11
|
+
export type MapResult = {
|
|
12
|
+
readonly ok: true;
|
|
13
|
+
readonly event: TrailEvent;
|
|
14
|
+
} | {
|
|
15
|
+
readonly ok: false;
|
|
16
|
+
readonly error: string;
|
|
17
|
+
};
|
|
18
|
+
/** Map one foreign record to a TrailEvent; returns an error string on bad records. */
|
|
19
|
+
export declare function mapRecord(source: ImportSource, rec: unknown, fallbackSession: string): MapResult;
|
|
20
|
+
/**
|
|
21
|
+
* Extract the record list from a whole-file JSON document, per source.
|
|
22
|
+
* Bare arrays are accepted for every source; otherwise the known container
|
|
23
|
+
* keys are tried. Returns [] when the shape is not recognized.
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractRecords(source: ImportSource, json: unknown): unknown[];
|
|
26
|
+
//# sourceMappingURL=formats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formats.d.ts","sourceRoot":"","sources":["../../src/importers/formats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAQzE,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAoOnD,sFAAsF;AACtF,wBAAgB,SAAS,CACvB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,OAAO,EACZ,eAAe,EAAE,MAAM,GACtB,SAAS,CAeX;AAwBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAa7E"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { redactTrailText } from "../trail-summary.js";
|
|
2
|
+
/** Caps match the lengths the trail uses elsewhere (trail-summary MAX_LEN = 80). */
|
|
3
|
+
const MAX_SUMMARY_LEN = 80;
|
|
4
|
+
const MAX_TOOL_ID_LEN = 160;
|
|
5
|
+
const MAX_SESSION_ID_LEN = 160;
|
|
6
|
+
const MAX_SUMMARY_KEYS = 8;
|
|
7
|
+
function isObj(v) {
|
|
8
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
9
|
+
}
|
|
10
|
+
function str(v) {
|
|
11
|
+
return typeof v === "string" && v.trim() ? v.trim() : undefined;
|
|
12
|
+
}
|
|
13
|
+
/** Finite non-negative number, rounded; OTLP intValue may arrive as a string. */
|
|
14
|
+
function num(v) {
|
|
15
|
+
const n = typeof v === "number" ? v : typeof v === "string" ? Number(v) : NaN;
|
|
16
|
+
return Number.isFinite(n) && n >= 0 ? Math.round(n) : undefined;
|
|
17
|
+
}
|
|
18
|
+
/** Parse an ISO-ish timestamp; undefined when missing or unparseable. */
|
|
19
|
+
function isoFrom(v) {
|
|
20
|
+
const s = str(v);
|
|
21
|
+
if (!s)
|
|
22
|
+
return undefined;
|
|
23
|
+
const t = Date.parse(s);
|
|
24
|
+
return Number.isNaN(t) ? undefined : new Date(t).toISOString();
|
|
25
|
+
}
|
|
26
|
+
/** Whole-millisecond latency between an ISO start and a raw end value. */
|
|
27
|
+
function msBetween(startIso, endRaw) {
|
|
28
|
+
const s = str(endRaw);
|
|
29
|
+
if (!s)
|
|
30
|
+
return undefined;
|
|
31
|
+
const b = Date.parse(s);
|
|
32
|
+
const a = Date.parse(startIso);
|
|
33
|
+
if (Number.isNaN(a) || Number.isNaN(b) || b < a)
|
|
34
|
+
return undefined;
|
|
35
|
+
return Math.round(b - a);
|
|
36
|
+
}
|
|
37
|
+
/** OTLP timeUnixNano is a decimal string; BigInt keeps full precision. */
|
|
38
|
+
function nanoToMs(v) {
|
|
39
|
+
const s = str(v) ?? (typeof v === "number" && Number.isFinite(v) ? String(Math.trunc(v)) : undefined);
|
|
40
|
+
if (!s)
|
|
41
|
+
return undefined;
|
|
42
|
+
try {
|
|
43
|
+
return Number(BigInt(s) / 1000000n);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function capText(v, max) {
|
|
50
|
+
const s = v.replace(/\s+/g, " ").trim();
|
|
51
|
+
return s.length <= max ? s : s.slice(0, max);
|
|
52
|
+
}
|
|
53
|
+
/** Redacted "inputs: key1, key2" rendering - key names only, never values. */
|
|
54
|
+
function keysSummary(label, input) {
|
|
55
|
+
if (!isObj(input))
|
|
56
|
+
return undefined;
|
|
57
|
+
const keys = Object.keys(input).slice(0, MAX_SUMMARY_KEYS);
|
|
58
|
+
if (keys.length === 0)
|
|
59
|
+
return undefined;
|
|
60
|
+
const redacted = redactTrailText(`${label}: ${keys.join(", ")}`)
|
|
61
|
+
.replace(/\r?\n/g, " ")
|
|
62
|
+
.trim();
|
|
63
|
+
if (!redacted)
|
|
64
|
+
return undefined;
|
|
65
|
+
return redacted.length <= MAX_SUMMARY_LEN
|
|
66
|
+
? redacted
|
|
67
|
+
: `${redacted.slice(0, MAX_SUMMARY_LEN - 1)}…`;
|
|
68
|
+
}
|
|
69
|
+
function buildEvent(seed, fallbackSession) {
|
|
70
|
+
return {
|
|
71
|
+
ts: seed.ts ?? new Date().toISOString(),
|
|
72
|
+
sessionId: capText(seed.sessionId ?? fallbackSession, MAX_SESSION_ID_LEN),
|
|
73
|
+
host: "import",
|
|
74
|
+
toolId: capText(seed.toolId, MAX_TOOL_ID_LEN),
|
|
75
|
+
verdict: seed.deny ? "DENY" : "ALLOW",
|
|
76
|
+
reasonCode: seed.deny ? "IMPORTED_ERROR" : "IMPORTED",
|
|
77
|
+
mode: "observe",
|
|
78
|
+
...(seed.latencyMs !== undefined ? { latencyMs: seed.latencyMs } : {}),
|
|
79
|
+
...(seed.tokensIn !== undefined ? { tokensIn: seed.tokensIn } : {}),
|
|
80
|
+
...(seed.tokensOut !== undefined ? { tokensOut: seed.tokensOut } : {}),
|
|
81
|
+
...(seed.summary !== undefined ? { summary: seed.summary } : {}),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function err(message) {
|
|
85
|
+
return { ok: false, error: message };
|
|
86
|
+
}
|
|
87
|
+
/** LangSmith run: {name, run_type, inputs, outputs, start_time, end_time, session_name, error, prompt_tokens, completion_tokens}. */
|
|
88
|
+
function mapLangSmith(rec, fallbackSession) {
|
|
89
|
+
if (!isObj(rec))
|
|
90
|
+
return err("not an object");
|
|
91
|
+
const name = str(rec.name);
|
|
92
|
+
if (!name)
|
|
93
|
+
return err("missing name");
|
|
94
|
+
const ts = isoFrom(rec.start_time);
|
|
95
|
+
return {
|
|
96
|
+
ok: true,
|
|
97
|
+
event: buildEvent({
|
|
98
|
+
toolId: name,
|
|
99
|
+
ts,
|
|
100
|
+
sessionId: str(rec.session_name) ?? str(rec.session_id),
|
|
101
|
+
deny: str(rec.error) !== undefined,
|
|
102
|
+
latencyMs: ts ? msBetween(ts, rec.end_time) : undefined,
|
|
103
|
+
tokensIn: num(rec.prompt_tokens),
|
|
104
|
+
tokensOut: num(rec.completion_tokens),
|
|
105
|
+
summary: keysSummary("inputs", rec.inputs),
|
|
106
|
+
}, fallbackSession),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Langfuse observation/trace: {type, name, startTime, endTime, usage, level, statusMessage}. */
|
|
110
|
+
function mapLangfuse(rec, fallbackSession) {
|
|
111
|
+
if (!isObj(rec))
|
|
112
|
+
return err("not an object");
|
|
113
|
+
const name = str(rec.name);
|
|
114
|
+
if (!name)
|
|
115
|
+
return err("missing name");
|
|
116
|
+
const ts = isoFrom(rec.startTime);
|
|
117
|
+
const usage = isObj(rec.usage) ? rec.usage : undefined;
|
|
118
|
+
return {
|
|
119
|
+
ok: true,
|
|
120
|
+
event: buildEvent({
|
|
121
|
+
toolId: name,
|
|
122
|
+
ts,
|
|
123
|
+
sessionId: str(rec.sessionId) ?? str(rec.session_id) ?? str(rec.traceId) ?? str(rec.trace_id),
|
|
124
|
+
deny: str(rec.level)?.toUpperCase() === "ERROR",
|
|
125
|
+
latencyMs: ts ? msBetween(ts, rec.endTime) : undefined,
|
|
126
|
+
tokensIn: usage ? (num(usage.input) ?? num(usage.promptTokens)) : undefined,
|
|
127
|
+
tokensOut: usage ? (num(usage.output) ?? num(usage.completionTokens)) : undefined,
|
|
128
|
+
summary: keysSummary("input", rec.input),
|
|
129
|
+
}, fallbackSession),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** Phoenix span: {name, startTime, endTime, statusCode, attributes, context:{trace_id}}. */
|
|
133
|
+
function mapPhoenix(rec, fallbackSession) {
|
|
134
|
+
if (!isObj(rec))
|
|
135
|
+
return err("not an object");
|
|
136
|
+
const attrs = isObj(rec.attributes) ? rec.attributes : {};
|
|
137
|
+
const name = str(attrs["tool.name"]) ?? str(rec.name);
|
|
138
|
+
if (!name)
|
|
139
|
+
return err("missing name");
|
|
140
|
+
const ts = isoFrom(rec.startTime);
|
|
141
|
+
const ctx = isObj(rec.context) ? rec.context : undefined;
|
|
142
|
+
return {
|
|
143
|
+
ok: true,
|
|
144
|
+
event: buildEvent({
|
|
145
|
+
toolId: name,
|
|
146
|
+
ts,
|
|
147
|
+
sessionId: (ctx ? (str(ctx.trace_id) ?? str(ctx.traceId)) : undefined) ??
|
|
148
|
+
str(rec.traceId) ??
|
|
149
|
+
str(rec.trace_id),
|
|
150
|
+
deny: str(rec.statusCode)?.toUpperCase() === "ERROR",
|
|
151
|
+
latencyMs: ts ? msBetween(ts, rec.endTime) : undefined,
|
|
152
|
+
tokensIn: num(attrs["llm.token_count.prompt"]),
|
|
153
|
+
tokensOut: num(attrs["llm.token_count.completion"]),
|
|
154
|
+
}, fallbackSession),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/** Flatten OTLP KeyValue[] attributes to a plain object (string/int/double/bool only). */
|
|
158
|
+
function otelAttributes(v) {
|
|
159
|
+
const out = {};
|
|
160
|
+
if (!Array.isArray(v))
|
|
161
|
+
return out;
|
|
162
|
+
for (const item of v) {
|
|
163
|
+
if (!isObj(item))
|
|
164
|
+
continue;
|
|
165
|
+
const key = str(item.key);
|
|
166
|
+
const value = item.value;
|
|
167
|
+
if (!key || !isObj(value))
|
|
168
|
+
continue;
|
|
169
|
+
if (typeof value.stringValue === "string")
|
|
170
|
+
out[key] = value.stringValue;
|
|
171
|
+
else if (value.intValue !== undefined)
|
|
172
|
+
out[key] = num(value.intValue);
|
|
173
|
+
else if (typeof value.doubleValue === "number")
|
|
174
|
+
out[key] = value.doubleValue;
|
|
175
|
+
else if (typeof value.boolValue === "boolean")
|
|
176
|
+
out[key] = value.boolValue;
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
/** OTLP Status.code: 0 UNSET, 1 OK, 2 ERROR (string enum also accepted). */
|
|
181
|
+
function otelStatusIsError(status) {
|
|
182
|
+
if (!isObj(status))
|
|
183
|
+
return false;
|
|
184
|
+
const code = status.code;
|
|
185
|
+
if (typeof code === "number")
|
|
186
|
+
return code === 2;
|
|
187
|
+
if (typeof code === "string")
|
|
188
|
+
return code === "STATUS_CODE_ERROR";
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
/** OTLP/JSON span: {traceId, name, startTimeUnixNano, endTimeUnixNano, status, attributes}. */
|
|
192
|
+
function mapOtel(rec, fallbackSession) {
|
|
193
|
+
if (!isObj(rec))
|
|
194
|
+
return err("not an object");
|
|
195
|
+
const attrs = otelAttributes(rec.attributes);
|
|
196
|
+
const name = str(rec.name) ?? str(attrs["tool.name"]);
|
|
197
|
+
if (!name)
|
|
198
|
+
return err("missing name");
|
|
199
|
+
const startMs = nanoToMs(rec.startTimeUnixNano);
|
|
200
|
+
const endMs = nanoToMs(rec.endTimeUnixNano);
|
|
201
|
+
const latencyMs = startMs !== undefined && endMs !== undefined && endMs >= startMs
|
|
202
|
+
? Math.round(endMs - startMs)
|
|
203
|
+
: undefined;
|
|
204
|
+
return {
|
|
205
|
+
ok: true,
|
|
206
|
+
event: buildEvent({
|
|
207
|
+
toolId: name,
|
|
208
|
+
ts: startMs !== undefined ? new Date(startMs).toISOString() : undefined,
|
|
209
|
+
sessionId: str(rec.traceId),
|
|
210
|
+
deny: otelStatusIsError(rec.status),
|
|
211
|
+
latencyMs,
|
|
212
|
+
tokensIn: num(attrs["llm.token_count.prompt"]),
|
|
213
|
+
tokensOut: num(attrs["llm.token_count.completion"]),
|
|
214
|
+
}, fallbackSession),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/** Map one foreign record to a TrailEvent; returns an error string on bad records. */
|
|
218
|
+
export function mapRecord(source, rec, fallbackSession) {
|
|
219
|
+
try {
|
|
220
|
+
switch (source) {
|
|
221
|
+
case "langsmith":
|
|
222
|
+
return mapLangSmith(rec, fallbackSession);
|
|
223
|
+
case "langfuse":
|
|
224
|
+
return mapLangfuse(rec, fallbackSession);
|
|
225
|
+
case "phoenix":
|
|
226
|
+
return mapPhoenix(rec, fallbackSession);
|
|
227
|
+
case "otel":
|
|
228
|
+
return mapOtel(rec, fallbackSession);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (e) {
|
|
232
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function arr(v) {
|
|
236
|
+
return Array.isArray(v) ? v : undefined;
|
|
237
|
+
}
|
|
238
|
+
/** Flatten an OTLP/JSON payload (resourceSpans/scopeSpans/spans) to a span list. */
|
|
239
|
+
function otlpSpans(json) {
|
|
240
|
+
const resourceSpans = json.resourceSpans;
|
|
241
|
+
if (!Array.isArray(resourceSpans))
|
|
242
|
+
return undefined;
|
|
243
|
+
const out = [];
|
|
244
|
+
for (const rs of resourceSpans) {
|
|
245
|
+
if (!isObj(rs))
|
|
246
|
+
continue;
|
|
247
|
+
const scopeSpans = rs.scopeSpans ?? rs.instrumentationLibrarySpans;
|
|
248
|
+
if (!Array.isArray(scopeSpans))
|
|
249
|
+
continue;
|
|
250
|
+
for (const ss of scopeSpans) {
|
|
251
|
+
if (!isObj(ss))
|
|
252
|
+
continue;
|
|
253
|
+
const spans = ss.spans;
|
|
254
|
+
if (Array.isArray(spans))
|
|
255
|
+
out.push(...spans);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return out;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Extract the record list from a whole-file JSON document, per source.
|
|
262
|
+
* Bare arrays are accepted for every source; otherwise the known container
|
|
263
|
+
* keys are tried. Returns [] when the shape is not recognized.
|
|
264
|
+
*/
|
|
265
|
+
export function extractRecords(source, json) {
|
|
266
|
+
if (Array.isArray(json))
|
|
267
|
+
return json;
|
|
268
|
+
if (!isObj(json))
|
|
269
|
+
return [];
|
|
270
|
+
switch (source) {
|
|
271
|
+
case "langsmith":
|
|
272
|
+
return arr(json.runs) ?? arr(json.data) ?? [];
|
|
273
|
+
case "langfuse":
|
|
274
|
+
return arr(json.observations) ?? arr(json.traces) ?? arr(json.data) ?? [];
|
|
275
|
+
case "phoenix":
|
|
276
|
+
return arr(json.spans) ?? arr(json.data) ?? [];
|
|
277
|
+
case "otel":
|
|
278
|
+
return otlpSpans(json) ?? arr(json.spans) ?? arr(json.data) ?? [];
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=formats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formats.js","sourceRoot":"","sources":["../../src/importers/formats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ImportSource } from "./formats.js";
|
|
2
|
+
export type { ImportSource } from "./formats.js";
|
|
3
|
+
export interface ImportOptions {
|
|
4
|
+
readonly from: ImportSource;
|
|
5
|
+
readonly file: string;
|
|
6
|
+
readonly cwd: string;
|
|
7
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
8
|
+
}
|
|
9
|
+
export interface ImportResult {
|
|
10
|
+
readonly imported: number;
|
|
11
|
+
readonly skipped: number;
|
|
12
|
+
readonly errors: string[];
|
|
13
|
+
}
|
|
14
|
+
/** Import files larger than 50MB are refused before reading. */
|
|
15
|
+
export declare const MAX_IMPORT_BYTES: number;
|
|
16
|
+
/** Size guard, exported for tests: returns an error message when over the cap. */
|
|
17
|
+
export declare function checkImportSize(sizeBytes: number): string | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Import one export file into the trail. Returns counts plus per-record
|
|
20
|
+
* errors; resolves even when the file is missing, oversized, or every
|
|
21
|
+
* record is bad.
|
|
22
|
+
*/
|
|
23
|
+
export declare function importTraces(opts: ImportOptions): Promise<ImportResult>;
|
|
24
|
+
/** Two or three plain-text lines for the CLI to print after an import. */
|
|
25
|
+
export declare function renderImportSummary(result: ImportResult): string;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/importers/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,QAAmB,CAAC;AAEjD,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGrE;AA2BD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA2D7E;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAWhE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace importer: reads a foreign trace export (LangSmith, Langfuse, Phoenix,
|
|
3
|
+
* OTLP/JSON) and appends each span/run to the local KYA trail via appendTrail.
|
|
4
|
+
*
|
|
5
|
+
* JSON vs JSONL is detected by content: a whole-file JSON.parse that succeeds
|
|
6
|
+
* wins; otherwise the file is processed line by line. The file is capped at
|
|
7
|
+
* MAX_IMPORT_BYTES (50MB) - an oversized file returns an error entry instead
|
|
8
|
+
* of reading. Bad records never throw: they are skipped and collected in
|
|
9
|
+
* `errors`, and the import continues.
|
|
10
|
+
*/
|
|
11
|
+
import { readFileSync, statSync } from "node:fs";
|
|
12
|
+
import { appendTrail } from "../trail.js";
|
|
13
|
+
import { extractRecords, mapRecord, } from "./formats.js";
|
|
14
|
+
/** Import files larger than 50MB are refused before reading. */
|
|
15
|
+
export const MAX_IMPORT_BYTES = 50 * 1024 * 1024;
|
|
16
|
+
/** Size guard, exported for tests: returns an error message when over the cap. */
|
|
17
|
+
export function checkImportSize(sizeBytes) {
|
|
18
|
+
if (sizeBytes <= MAX_IMPORT_BYTES)
|
|
19
|
+
return undefined;
|
|
20
|
+
return `file is ${sizeBytes} bytes, over the ${MAX_IMPORT_BYTES} byte (50MB) import cap`;
|
|
21
|
+
}
|
|
22
|
+
function errMsg(e) {
|
|
23
|
+
return e instanceof Error ? e.message : String(e);
|
|
24
|
+
}
|
|
25
|
+
/** Split a JSONL body into records; bad lines become errors + skips. */
|
|
26
|
+
function jsonlRecords(text, errors) {
|
|
27
|
+
const records = [];
|
|
28
|
+
let skipped = 0;
|
|
29
|
+
const lines = text.split("\n");
|
|
30
|
+
for (let i = 0; i < lines.length; i++) {
|
|
31
|
+
const line = lines[i].trim();
|
|
32
|
+
if (!line)
|
|
33
|
+
continue;
|
|
34
|
+
try {
|
|
35
|
+
records.push(JSON.parse(line));
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
skipped++;
|
|
39
|
+
errors.push(`line ${i + 1}: invalid JSON - ${errMsg(e)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { records, skipped };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Import one export file into the trail. Returns counts plus per-record
|
|
46
|
+
* errors; resolves even when the file is missing, oversized, or every
|
|
47
|
+
* record is bad.
|
|
48
|
+
*/
|
|
49
|
+
export async function importTraces(opts) {
|
|
50
|
+
const { from, file, cwd } = opts;
|
|
51
|
+
const env = opts.env ?? process.env;
|
|
52
|
+
const errors = [];
|
|
53
|
+
let imported = 0;
|
|
54
|
+
let skipped = 0;
|
|
55
|
+
let size;
|
|
56
|
+
try {
|
|
57
|
+
size = statSync(file).size;
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
return { imported, skipped, errors: [`cannot read ${file} - ${errMsg(e)}`] };
|
|
61
|
+
}
|
|
62
|
+
const sizeError = checkImportSize(size);
|
|
63
|
+
if (sizeError)
|
|
64
|
+
return { imported, skipped, errors: [sizeError] };
|
|
65
|
+
let text;
|
|
66
|
+
try {
|
|
67
|
+
text = readFileSync(file, "utf8");
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
return { imported, skipped, errors: [`cannot read ${file} - ${errMsg(e)}`] };
|
|
71
|
+
}
|
|
72
|
+
let records;
|
|
73
|
+
const trimmed = text.trim();
|
|
74
|
+
if (trimmed.startsWith("[") || trimmed.startsWith("{")) {
|
|
75
|
+
try {
|
|
76
|
+
records = extractRecords(from, JSON.parse(trimmed));
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Not one JSON document - fall back to JSONL line by line.
|
|
80
|
+
const parsed = jsonlRecords(text, errors);
|
|
81
|
+
records = parsed.records;
|
|
82
|
+
skipped += parsed.skipped;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const parsed = jsonlRecords(text, errors);
|
|
87
|
+
records = parsed.records;
|
|
88
|
+
skipped += parsed.skipped;
|
|
89
|
+
}
|
|
90
|
+
const fallbackSession = `import-${from}-${new Date().toISOString().slice(0, 10)}`;
|
|
91
|
+
for (let i = 0; i < records.length; i++) {
|
|
92
|
+
const mapped = mapRecord(from, records[i], fallbackSession);
|
|
93
|
+
if (!mapped.ok) {
|
|
94
|
+
skipped++;
|
|
95
|
+
errors.push(`record ${i + 1}: ${mapped.error}`);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
appendTrail(cwd, mapped.event, env);
|
|
100
|
+
imported++;
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
skipped++;
|
|
104
|
+
errors.push(`record ${i + 1}: trail append failed - ${errMsg(e)}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { imported, skipped, errors };
|
|
108
|
+
}
|
|
109
|
+
/** Two or three plain-text lines for the CLI to print after an import. */
|
|
110
|
+
export function renderImportSummary(result) {
|
|
111
|
+
const lines = [
|
|
112
|
+
`imported ${result.imported} trace record(s) into the KYA trail`,
|
|
113
|
+
`skipped ${result.skipped} record(s)`,
|
|
114
|
+
];
|
|
115
|
+
if (result.errors.length > 0) {
|
|
116
|
+
const first = result.errors[0];
|
|
117
|
+
const clipped = first.length > 120 ? `${first.slice(0, 119)}…` : first;
|
|
118
|
+
lines.push(`errors: ${result.errors.length} (first: ${clipped})`);
|
|
119
|
+
}
|
|
120
|
+
return lines.join("\n");
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/importers/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic trail detectors. Pure local analysis over TrailEvent rows -
|
|
3
|
+
* no LLM calls, no IO. Each detector emits zero or more findings carrying the
|
|
4
|
+
* indices of the offending events in the input array.
|
|
5
|
+
*/
|
|
6
|
+
import type { TrailEvent } from "../trail.js";
|
|
7
|
+
export type Severity = "low" | "medium" | "high" | "critical";
|
|
8
|
+
export type DetectorId = "pii-in-summary" | "deny-spike" | "approval-loop" | "never-repeat" | "unknown-tool-hold" | "slow-calls";
|
|
9
|
+
export interface Finding {
|
|
10
|
+
readonly detectorId: DetectorId;
|
|
11
|
+
readonly severity: Severity;
|
|
12
|
+
/** Indices into the events array passed to the detector. */
|
|
13
|
+
readonly eventIdx: number[];
|
|
14
|
+
readonly summary: string;
|
|
15
|
+
/** Structured detail for grouping and brief rendering. Never raw secrets. */
|
|
16
|
+
readonly evidence: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface Detector {
|
|
19
|
+
readonly id: DetectorId;
|
|
20
|
+
run(events: readonly TrailEvent[]): Finding[];
|
|
21
|
+
}
|
|
22
|
+
/** deny-spike: more than this many DENY events inside the window. */
|
|
23
|
+
export declare const DENY_SPIKE_THRESHOLD = 3;
|
|
24
|
+
export declare const DENY_SPIKE_WINDOW_MS: number;
|
|
25
|
+
/** approval-loop: consecutive REQUIRE_APPROVE on one session+tool. */
|
|
26
|
+
export declare const APPROVAL_LOOP_MIN = 3;
|
|
27
|
+
/** slow-calls: p95 above this with at least MIN_SAMPLES per tool. */
|
|
28
|
+
export declare const SLOW_CALL_P95_MS = 5000;
|
|
29
|
+
export declare const SLOW_CALL_MIN_SAMPLES = 5;
|
|
30
|
+
/** Standard Luhn checksum for card-shaped digit strings. */
|
|
31
|
+
export declare function luhnValid(digits: string): boolean;
|
|
32
|
+
export declare const DETECTORS: readonly Detector[];
|
|
33
|
+
/** Run every detector over the same events array; findings keep input indices. */
|
|
34
|
+
export declare function runDetectors(events: readonly TrailEvent[]): Finding[];
|
|
35
|
+
//# sourceMappingURL=detectors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../src/investigate/detectors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE9D,MAAM,MAAM,UAAU,GAClB,gBAAgB,GAChB,YAAY,GACZ,eAAe,GACf,cAAc,GACd,mBAAmB,GACnB,YAAY,CAAC;AAEjB,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IACxB,GAAG,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC;CAC/C;AAED,qEAAqE;AACrE,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,oBAAoB,QAAc,CAAC;AAChD,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAcvC,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAcjD;AA6OD,eAAO,MAAM,SAAS,EAAE,SAAS,QAAQ,EAOxC,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,EAAE,CAErE"}
|