@trustmodel/sdk
Advanced tools
| #!/usr/bin/env node | ||
| export {}; | ||
| //# sourceMappingURL=cli.d.ts.map |
| {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""} |
+115
| #!/usr/bin/env node | ||
| /** `trustmodel` CLI — the one-command way to evaluate an agent from any TS/JS codebase. | ||
| * | ||
| * npm i @trustmodel/sdk | ||
| * export TRUSTMODEL_API_KEY=tm-... | ||
| * npx trustmodel eval-agent # auto-finds the newest .codenow/runs recording | ||
| * npx trustmodel eval-agent --run run.jsonl # a Claude Agent SDK recorded run | ||
| * npx trustmodel eval-agent --trace t.json # an agentic trace ({ goal, steps }) | ||
| * npx trustmodel eval-agent --agent sophia-agent --framework claude-agent-sdk --dry-run | ||
| */ | ||
| import * as fs from "node:fs"; | ||
| import { TrustModelClient } from "./client.js"; | ||
| import { traceFromRunFile, findNewestRun } from "./traces/claudeAgent.js"; | ||
| function flag(name) { | ||
| const i = process.argv.indexOf(`--${name}`); | ||
| return i >= 0 ? process.argv[i + 1] : undefined; | ||
| } | ||
| const has = (name) => process.argv.includes(`--${name}`); | ||
| const HELP = `trustmodel — evaluate an AI agent's trace and get a TrustScore. | ||
| Usage: | ||
| trustmodel eval-agent [options] | ||
| Options: | ||
| --run <file.jsonl> A Claude Agent SDK recorded run to convert + evaluate. | ||
| --trace <file.json> An agentic trace ({ goal, name, agent_framework, steps[] }). | ||
| (neither) Auto-detect the newest .codenow/runs/*/*.jsonl recording. | ||
| --agent <slug> GovernedAgent slug to bind the score to (AGP fleet). | ||
| --framework <name> Agent framework (default: claude-agent-sdk). | ||
| --dry-run Print the trace that would be sent; no API call. | ||
| -h, --help Show this help. | ||
| Env: TRUSTMODEL_API_KEY (required unless --dry-run), TRUSTMODEL_GOVERNED_AGENT, | ||
| TRUSTMODEL_BASE_URL, TRUSTMODEL_ORGANIZATION_ID.`; | ||
| async function evalAgent() { | ||
| // Resolve the trace: explicit --trace, explicit --run, or auto-detect a recording. | ||
| let trace; | ||
| let source; | ||
| const traceFile = flag("trace"); | ||
| const runFile = flag("run") ?? (traceFile ? undefined : findNewestRun() ?? undefined); | ||
| if (traceFile) { | ||
| trace = JSON.parse(fs.readFileSync(traceFile, "utf-8")); | ||
| source = traceFile; | ||
| } | ||
| else if (runFile) { | ||
| trace = traceFromRunFile(runFile); | ||
| source = runFile; | ||
| } | ||
| else { | ||
| console.error("No trace found. Pass --trace <file.json> or --run <file.jsonl>, or run from a\n" + | ||
| "project with recorded runs under .codenow/runs/. See `trustmodel eval-agent --help`."); | ||
| return 1; | ||
| } | ||
| const framework = flag("framework") ?? trace.agent_framework ?? "claude-agent-sdk"; | ||
| const agent = flag("agent") ?? process.env.TRUSTMODEL_GOVERNED_AGENT; | ||
| const toolCalls = trace.steps.filter((s) => s.step_type === "tool_call").length; | ||
| console.log(`▶ trace: ${source}`); | ||
| console.log(`▶ steps: ${trace.steps.length} (${toolCalls} tool calls)`); | ||
| console.log(`▶ framework: ${framework}`); | ||
| console.log(`▶ governed agent: ${agent ?? "(none — score won't attach to an AGP fleet card)"}`); | ||
| if (has("dry-run")) { | ||
| console.log("\n--dry-run — trace that would be sent:\n" + JSON.stringify(trace, null, 2)); | ||
| return 0; | ||
| } | ||
| const apiKey = process.env.TRUSTMODEL_API_KEY; | ||
| if (!apiKey) { | ||
| console.error("\nTRUSTMODEL_API_KEY is required. Create one at app.trustmodel.ai/settings/api-keys."); | ||
| return 1; | ||
| } | ||
| const tm = new TrustModelClient({ apiKey }); | ||
| console.log("\n─── Submitting (one call, inline trace) ───"); | ||
| const run = await tm.agentic.evaluate({ trace, agentFramework: framework, governedAgent: agent }); | ||
| const id = run.evaluation_run_id; | ||
| console.log(` ✓ evaluation_run_id: ${id} (${run.status})`); | ||
| console.log("─── Scoring ───"); | ||
| const started = Date.now(); | ||
| for (;;) { | ||
| if (Date.now() - started > 15 * 60_000) { | ||
| console.error("\nTimed out waiting for the score."); | ||
| return 1; | ||
| } | ||
| await new Promise((r) => setTimeout(r, 5000)); | ||
| const res = (await tm.agentic.get(id)); | ||
| const status = res.status ?? res.latest_evaluation?.status; | ||
| if (status === "completed" || status === "COMPLETED") { | ||
| const score = res.overall_score ?? res.latest_evaluation?.overall_score; | ||
| console.log(`\n✅ Agent TrustScore: ${score}`); | ||
| if (agent) | ||
| console.log(` Attached to the AGP fleet for "${agent}".`); | ||
| return 0; | ||
| } | ||
| if (status === "failed" || status === "FAILED") { | ||
| console.error(`\nEvaluation failed (run ${id}).`); | ||
| return 1; | ||
| } | ||
| process.stdout.write("."); | ||
| } | ||
| } | ||
| async function main() { | ||
| const cmd = process.argv[2]; | ||
| if (!cmd || has("help") || has("h") || cmd === "-h" || cmd === "--help") { | ||
| console.log(HELP); | ||
| process.exit(cmd && cmd !== "-h" && cmd !== "--help" ? 1 : 0); | ||
| } | ||
| if (cmd === "eval-agent") { | ||
| process.exit(await evalAgent()); | ||
| } | ||
| console.error(`Unknown command: ${cmd}\n\n${HELP}`); | ||
| process.exit(1); | ||
| } | ||
| main().catch((e) => { | ||
| console.error("\n✗ " + (e?.message ?? String(e))); | ||
| process.exit(1); | ||
| }); | ||
| //# sourceMappingURL=cli.js.map |
| {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} |
| /** Convert a Claude Agent SDK run into a TrustModel agentic trace. | ||
| * | ||
| * The Claude Agent SDK's `query()` yields messages; agent recorders (e.g. CodeNow's | ||
| * `.codenow/runs/<slug>/*.jsonl`) persist each as `{ kind: "message", message }` lines. | ||
| * This turns that into the `{ goal, steps[] }` shape `tm.agentic.evaluate()` wants, so a | ||
| * one-command CLI eval works out of the box. */ | ||
| import type { AgenticTrace } from "../types.js"; | ||
| /** Convert recorded-run JSONL (one JSON object per line) into an agentic trace. */ | ||
| export declare function traceFromClaudeAgentRun(jsonl: string): AgenticTrace; | ||
| /** Read + convert a recorded-run file. */ | ||
| export declare function traceFromRunFile(file: string): AgenticTrace; | ||
| /** Newest recorded `.jsonl` run (across all slugs, or a specific `slug`), or null. */ | ||
| export declare function findNewestRun(opts?: { | ||
| slug?: string; | ||
| runsDir?: string; | ||
| cwd?: string; | ||
| }): string | null; | ||
| //# sourceMappingURL=claudeAgent.d.ts.map |
| {"version":3,"file":"claudeAgent.d.ts","sourceRoot":"","sources":["../../src/traces/claudeAgent.ts"],"names":[],"mappings":"AAAA;;;;;gDAKgD;AAIhD,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,aAAa,CAAC;AAE3D,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAkEnE;AAED,0CAA0C;AAC1C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAE3D;AAeD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,GAAG,IAAI,CAsBzG"} |
| /** Convert a Claude Agent SDK run into a TrustModel agentic trace. | ||
| * | ||
| * The Claude Agent SDK's `query()` yields messages; agent recorders (e.g. CodeNow's | ||
| * `.codenow/runs/<slug>/*.jsonl`) persist each as `{ kind: "message", message }` lines. | ||
| * This turns that into the `{ goal, steps[] }` shape `tm.agentic.evaluate()` wants, so a | ||
| * one-command CLI eval works out of the box. */ | ||
| import * as fs from "node:fs"; | ||
| import * as path from "node:path"; | ||
| /** Convert recorded-run JSONL (one JSON object per line) into an agentic trace. */ | ||
| export function traceFromClaudeAgentRun(jsonl) { | ||
| const steps = []; | ||
| let goal = ""; | ||
| const toolNameById = new Map(); | ||
| for (const line of jsonl.split("\n")) { | ||
| if (!line.trim()) | ||
| continue; | ||
| let rec; | ||
| try { | ||
| rec = JSON.parse(line); | ||
| } | ||
| catch { | ||
| continue; | ||
| } | ||
| if (rec.kind === "run.start" || (rec.input && !rec.message)) { | ||
| goal ||= String(rec.input ?? rec.opts?.input ?? ""); | ||
| continue; | ||
| } | ||
| if (rec.kind && rec.kind !== "message") | ||
| continue; | ||
| const m = rec.message ?? rec; | ||
| if (!m || typeof m !== "object") | ||
| continue; | ||
| if (m.type === "assistant") { | ||
| const content = m.message?.content ?? m.content ?? []; | ||
| for (const b of Array.isArray(content) ? content : []) { | ||
| if (b?.type === "text" && b.text) { | ||
| steps.push({ step_type: "thought", content: String(b.text) }); | ||
| } | ||
| else if (b?.type === "tool_use") { | ||
| if (b.id && b.name) | ||
| toolNameById.set(b.id, b.name); | ||
| steps.push({ | ||
| step_type: "tool_call", | ||
| content: `Call ${b.name}`, | ||
| tool_name: b.name, | ||
| tool_input: b.input, | ||
| }); | ||
| } | ||
| } | ||
| } | ||
| else if (m.type === "user") { | ||
| const content = m.message?.content ?? m.content ?? []; | ||
| for (const b of Array.isArray(content) ? content : []) { | ||
| if (b?.type === "tool_result") { | ||
| steps.push({ | ||
| step_type: "tool_result", | ||
| content: "tool result", | ||
| tool_name: toolNameById.get(b.tool_use_id), | ||
| tool_output: b.content, | ||
| }); | ||
| } | ||
| } | ||
| } | ||
| else if (m.type === "result") { | ||
| const text = m.result ?? m.message ?? ""; | ||
| if (text) | ||
| steps.push({ step_type: "final_answer", content: String(text) }); | ||
| } | ||
| } | ||
| if (!steps.some((s) => s.step_type === "final_answer")) { | ||
| const lastThought = [...steps].reverse().find((s) => s.step_type === "thought"); | ||
| if (lastThought) | ||
| steps.push({ step_type: "final_answer", content: lastThought.content }); | ||
| } | ||
| return { | ||
| goal: goal || "Agent conversation", | ||
| name: "Agent run", | ||
| agent_framework: "claude-agent-sdk", | ||
| steps, | ||
| }; | ||
| } | ||
| /** Read + convert a recorded-run file. */ | ||
| export function traceFromRunFile(file) { | ||
| return traceFromClaudeAgentRun(fs.readFileSync(file, "utf-8")); | ||
| } | ||
| /** Walk up from `startDir` to find a `.codenow/runs` directory. */ | ||
| function findRunsRoot(startDir) { | ||
| let cur = path.resolve(startDir); | ||
| for (let i = 0; i < 12; i++) { | ||
| const candidate = path.join(cur, ".codenow", "runs"); | ||
| if (fs.existsSync(candidate)) | ||
| return candidate; | ||
| const parent = path.dirname(cur); | ||
| if (parent === cur) | ||
| break; | ||
| cur = parent; | ||
| } | ||
| return null; | ||
| } | ||
| /** Newest recorded `.jsonl` run (across all slugs, or a specific `slug`), or null. */ | ||
| export function findNewestRun(opts = {}) { | ||
| const root = opts.runsDir ?? findRunsRoot(opts.cwd ?? process.cwd()); | ||
| if (!root || !fs.existsSync(root)) | ||
| return null; | ||
| const slugs = opts.slug | ||
| ? [opts.slug] | ||
| : fs.readdirSync(root, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name); | ||
| const files = []; | ||
| for (const slug of slugs) { | ||
| const dir = path.join(root, slug); | ||
| let entries = []; | ||
| try { | ||
| entries = fs.readdirSync(dir).filter((f) => f.endsWith(".jsonl")); | ||
| } | ||
| catch { | ||
| continue; | ||
| } | ||
| for (const f of entries) { | ||
| const full = path.join(dir, f); | ||
| files.push({ f: full, t: fs.statSync(full).mtimeMs }); | ||
| } | ||
| } | ||
| files.sort((a, b) => b.t - a.t); | ||
| return files[0]?.f ?? null; | ||
| } | ||
| //# sourceMappingURL=claudeAgent.js.map |
| {"version":3,"file":"claudeAgent.js","sourceRoot":"","sources":["../../src/traces/claudeAgent.ts"],"names":[],"mappings":"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"} |
+1
-0
@@ -11,2 +11,3 @@ /** @trustmodel/sdk — official TypeScript/Node SDK for TrustModel. */ | ||
| export { enableAutoInstrumentation, KNOWN_INSTRUMENTORS, type AutoInstrumentation, type ModuleLoader, } from "./telemetry/instrumentors.js"; | ||
| export { traceFromClaudeAgentRun, traceFromRunFile, findNewestRun, } from "./traces/claudeAgent.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,uBAAuB,EAC5B,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,OAAO,EACP,QAAQ,GACT,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,QAAQ,EACR,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,kBAAkB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,YAAY,GAClB,MAAM,8BAA8B,CAAC"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,uBAAuB,EAC5B,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,OAAO,EACP,QAAQ,GACT,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,QAAQ,EACR,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,kBAAkB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,YAAY,GAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,aAAa,GACd,MAAM,yBAAyB,CAAC"} |
+1
-0
@@ -9,2 +9,3 @@ /** @trustmodel/sdk — official TypeScript/Node SDK for TrustModel. */ | ||
| export { enableAutoInstrumentation, KNOWN_INSTRUMENTORS, } from "./telemetry/instrumentors.js"; | ||
| export { traceFromClaudeAgentRun, traceFromRunFile, findNewestRun, } from "./traces/claudeAgent.js"; | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,gBAAgB,GAKjB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAcrB,sFAAsF;AACtF,8CAA8C;AAC9C,OAAO,EACL,QAAQ,EACR,aAAa,GAId,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,mBAAmB,GAGpB,MAAM,8BAA8B,CAAC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,gBAAgB,GAKjB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAcrB,sFAAsF;AACtF,8CAA8C;AAC9C,OAAO,EACL,QAAQ,EACR,aAAa,GAId,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,mBAAmB,GAGpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,aAAa,GACd,MAAM,yBAAyB,CAAC"} |
+4
-1
| { | ||
| "name": "@trustmodel/sdk", | ||
| "version": "0.2.1", | ||
| "version": "0.3.0", | ||
| "description": "Official TypeScript/Node SDK for TrustModel \u2014 AI trust evaluation, OTel telemetry, and agent governance (AGP).", | ||
@@ -95,3 +95,6 @@ "type": "module", | ||
| "vitest": "^2.1.8" | ||
| }, | ||
| "bin": { | ||
| "trustmodel": "./dist/cli.js" | ||
| } | ||
| } |
+9
-0
@@ -22,2 +22,11 @@ # @trustmodel/sdk | ||
| ## One-command agent eval (CLI) | ||
| ```bash | ||
| npm i @trustmodel/sdk | ||
| export TRUSTMODEL_API_KEY=tm-... | ||
| npx trustmodel eval-agent # auto-detects .codenow/runs recordings → TrustScore | ||
| # npx trustmodel eval-agent --trace trace.json --agent my-agent | ||
| ``` | ||
| ## Quick start | ||
@@ -24,0 +33,0 @@ |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
96174
28.11%59
15.69%1179
27.87%119
8.18%9
80%