ai-trust 0.6.0 → 0.7.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.
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Rich-block adapter — combines the registry-fetched narrative,
3
+ * registry trust data, and runtime args into a `CheckRichBlockInput`
4
+ * suitable for `renderCheckRichBlock` from `@opena2a/cli-ui`.
5
+ *
6
+ * Brief: opena2a-org/briefs/check-rich-context-skills-mcp-v1.md (§3, §5, §7).
7
+ *
8
+ * Pure function — no I/O. Validates inner JSON shapes (the registry
9
+ * handler ships them as opaque JSON.RawMessage) and returns null when
10
+ * the narrative is missing required structure for the artifact type.
11
+ *
12
+ * The adapter never invents data. Missing fields fall through to
13
+ * sensible empty defaults so the cli-ui renderer can still produce a
14
+ * legible block — the alternative is a hard failure that the caller
15
+ * would have to translate to "fall back to legacy block" anyway.
16
+ */
17
+ import type { CheckRichBlockInput } from "@opena2a/cli-ui";
18
+ import type { FetchedPackageNarrative } from "./narrative-fetch.js";
19
+ /**
20
+ * Trust-data fields the adapter needs from the registry. Defined here
21
+ * (not imported from cli.ts) to keep this module decoupled — the
22
+ * caller maps `RegistryTrustData` to this shape.
23
+ */
24
+ export interface RichBlockTrustInput {
25
+ trustVerdict: "VERIFIED" | "LISTED" | "LISTED_UNSCANNED" | "BLOCKED";
26
+ trustScore?: number;
27
+ scanStatus?: string;
28
+ lastScanAge?: string;
29
+ latestVersionLabel?: string;
30
+ publisher?: {
31
+ name: string;
32
+ verified: boolean;
33
+ kind?: string;
34
+ };
35
+ license?: string;
36
+ maintainerCount?: number;
37
+ downloads?: {
38
+ perWeek: number;
39
+ trend?: "rising" | "steady" | "declining";
40
+ };
41
+ communityScans?: number;
42
+ }
43
+ export interface BuildRichBlockInputArgs {
44
+ /** Package name as the user typed it (without prefix). */
45
+ name: string;
46
+ artifactType: "skill" | "mcp";
47
+ narrative: FetchedPackageNarrative;
48
+ trust: RichBlockTrustInput;
49
+ /** Tool name for the secrets-block report command. */
50
+ reportTool: string;
51
+ /** Local-scan findings, when available. Shape mirrors HMA's SecurityFinding. */
52
+ localFindings?: Array<{
53
+ severity: "critical" | "high" | "medium" | "low";
54
+ checkId: string;
55
+ name?: string;
56
+ file?: string;
57
+ line?: number;
58
+ message?: string;
59
+ fix?: string;
60
+ }>;
61
+ }
62
+ /**
63
+ * Build the CheckRichBlockInput. Returns null when the narrative does
64
+ * not satisfy the minimum shape for its artifactType (e.g. skill
65
+ * narrative present but inner skillNarrative field missing).
66
+ */
67
+ export declare function buildRichBlockInput(args: BuildRichBlockInputArgs): CheckRichBlockInput | null;
68
+ //# sourceMappingURL=rich-block-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-block-adapter.d.ts","sourceRoot":"","sources":["../../src/check/rich-block-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAWpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,UAAU,GAAG,QAAQ,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAA;KAAE,CAAC;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,GAAG,KAAK,CAAC;IAC9B,SAAS,EAAE,uBAAuB,CAAC;IACnC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,aAAa,CAAC,EAAE,KAAK,CAAC;QACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QACjD,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,uBAAuB,GAC5B,mBAAmB,GAAG,IAAI,CAuD5B"}
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Rich-block adapter — combines the registry-fetched narrative,
3
+ * registry trust data, and runtime args into a `CheckRichBlockInput`
4
+ * suitable for `renderCheckRichBlock` from `@opena2a/cli-ui`.
5
+ *
6
+ * Brief: opena2a-org/briefs/check-rich-context-skills-mcp-v1.md (§3, §5, §7).
7
+ *
8
+ * Pure function — no I/O. Validates inner JSON shapes (the registry
9
+ * handler ships them as opaque JSON.RawMessage) and returns null when
10
+ * the narrative is missing required structure for the artifact type.
11
+ *
12
+ * The adapter never invents data. Missing fields fall through to
13
+ * sensible empty defaults so the cli-ui renderer can still produce a
14
+ * legible block — the alternative is a hard failure that the caller
15
+ * would have to translate to "fall back to legacy block" anyway.
16
+ */
17
+ /**
18
+ * Build the CheckRichBlockInput. Returns null when the narrative does
19
+ * not satisfy the minimum shape for its artifactType (e.g. skill
20
+ * narrative present but inner skillNarrative field missing).
21
+ */
22
+ export function buildRichBlockInput(args) {
23
+ const { narrative, trust, artifactType } = args;
24
+ // Inner-narrative artifact-type check — if a skill: target was
25
+ // requested but the registry stored an mcpNarrative (or vice versa)
26
+ // we treat that as missing data. Caller falls back to legacy block.
27
+ if (artifactType === "skill" && narrative.artifactType !== "skill") {
28
+ return null;
29
+ }
30
+ if (artifactType === "mcp" && narrative.artifactType !== "mcp")
31
+ return null;
32
+ const hardcodedSecrets = parseHardcodedSecrets(narrative.hardcodedSecrets);
33
+ const verdictReasoning = parseVerdictReasoning(narrative.verdictReasoning);
34
+ const nextSteps = parseNextSteps(narrative.nextSteps);
35
+ const findings = mapLocalFindings(args.localFindings ?? []);
36
+ let skill;
37
+ let mcp;
38
+ if (artifactType === "skill") {
39
+ const parsed = parseSkillNarrative(narrative.skillNarrative);
40
+ if (!parsed)
41
+ return null;
42
+ skill = parsed;
43
+ }
44
+ else {
45
+ const parsed = parseMcpNarrative(narrative.mcpNarrative);
46
+ if (!parsed)
47
+ return null;
48
+ mcp = parsed;
49
+ }
50
+ const header = {
51
+ trustVerdict: trust.trustVerdict,
52
+ trustScore: trust.trustScore,
53
+ lastScanAge: trust.lastScanAge,
54
+ latestVersionLabel: trust.latestVersionLabel,
55
+ publisher: trust.publisher,
56
+ license: trust.license,
57
+ maintainerCount: trust.maintainerCount,
58
+ downloads: trust.downloads,
59
+ communityScans: trust.communityScans,
60
+ findingsCount: findings.length,
61
+ };
62
+ return {
63
+ name: args.name,
64
+ artifactType,
65
+ header,
66
+ hardcodedSecrets,
67
+ latestVersion: narrative.packageVersion,
68
+ skill,
69
+ mcp,
70
+ findings,
71
+ verdictReasoning,
72
+ nextSteps,
73
+ reportTool: args.reportTool,
74
+ };
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Inner-JSON shape validators
78
+ // ---------------------------------------------------------------------------
79
+ function parseHardcodedSecrets(raw) {
80
+ if (!isPlainObject(raw)) {
81
+ return { detected: [], scanCovered: false };
82
+ }
83
+ const scanCovered = typeof raw.scanCovered === "boolean"
84
+ ? raw.scanCovered
85
+ : false;
86
+ const detected = [];
87
+ if (Array.isArray(raw.detected)) {
88
+ for (const entry of raw.detected) {
89
+ const parsed = parseSecret(entry);
90
+ if (parsed)
91
+ detected.push(parsed);
92
+ }
93
+ }
94
+ return { detected, scanCovered };
95
+ }
96
+ function parseSecret(raw) {
97
+ if (!isPlainObject(raw))
98
+ return null;
99
+ const severity = raw.severity;
100
+ if (severity !== "critical" &&
101
+ severity !== "high" &&
102
+ severity !== "medium" &&
103
+ severity !== "low") {
104
+ return null;
105
+ }
106
+ if (typeof raw.type !== "string" || typeof raw.typeLabel !== "string") {
107
+ return null;
108
+ }
109
+ if (typeof raw.file !== "string")
110
+ return null;
111
+ if (typeof raw.maskedValue !== "string")
112
+ return null;
113
+ if (typeof raw.shownChars !== "number")
114
+ return null;
115
+ if (typeof raw.totalChars !== "number")
116
+ return null;
117
+ if (typeof raw.shipsInArtifact !== "boolean")
118
+ return null;
119
+ return {
120
+ type: raw.type,
121
+ typeLabel: raw.typeLabel,
122
+ file: raw.file,
123
+ line: typeof raw.line === "number" ? raw.line : undefined,
124
+ maskedValue: raw.maskedValue,
125
+ shownChars: raw.shownChars,
126
+ totalChars: raw.totalChars,
127
+ shipsInArtifact: raw.shipsInArtifact,
128
+ severity,
129
+ rotationUrl: typeof raw.rotationUrl === "string" ? raw.rotationUrl : undefined,
130
+ rotationCommand: typeof raw.rotationCommand === "string" ? raw.rotationCommand : undefined,
131
+ };
132
+ }
133
+ function parseSkillNarrative(raw) {
134
+ if (!isPlainObject(raw))
135
+ return null;
136
+ if (typeof raw.skillName !== "string")
137
+ return null;
138
+ const activationPhrases = stringArray(raw.activationPhrases);
139
+ const externalServices = stringArray(raw.externalServices);
140
+ const permissions = parsePermissions(raw.permissions);
141
+ const toolCallsObserved = parseToolCalls(raw.toolCallsObserved);
142
+ return {
143
+ skillName: raw.skillName,
144
+ activationPhrases,
145
+ behaviorDescription: typeof raw.behaviorDescription === "string"
146
+ ? raw.behaviorDescription
147
+ : "",
148
+ permissions,
149
+ externalServices,
150
+ persistence: typeof raw.persistence === "string" ? raw.persistence : "",
151
+ toolCallsObserved,
152
+ misuseNarrative: typeof raw.misuseNarrative === "string" ? raw.misuseNarrative : "",
153
+ };
154
+ }
155
+ function parseMcpNarrative(raw) {
156
+ if (!isPlainObject(raw))
157
+ return null;
158
+ if (typeof raw.mcpName !== "string")
159
+ return null;
160
+ const tools = parseMcpTools(raw.tools);
161
+ const sideEffects = stringArray(raw.sideEffects);
162
+ return {
163
+ mcpName: raw.mcpName,
164
+ tools,
165
+ pathScope: typeof raw.pathScope === "string" ? raw.pathScope : "",
166
+ network: typeof raw.network === "string" ? raw.network : "",
167
+ persistence: typeof raw.persistence === "string" ? raw.persistence : "",
168
+ auth: typeof raw.auth === "string" ? raw.auth : "",
169
+ sideEffects,
170
+ };
171
+ }
172
+ function parsePermissions(raw) {
173
+ if (!Array.isArray(raw))
174
+ return [];
175
+ const out = [];
176
+ for (const entry of raw) {
177
+ if (!isPlainObject(entry))
178
+ continue;
179
+ if (typeof entry.name !== "string")
180
+ continue;
181
+ const status = entry.status;
182
+ if (status !== "used" && status !== "unused" && status !== "undeclared") {
183
+ continue;
184
+ }
185
+ out.push({
186
+ name: entry.name,
187
+ declared: !!entry.declared,
188
+ used: !!entry.used,
189
+ status,
190
+ note: typeof entry.note === "string" ? entry.note : undefined,
191
+ });
192
+ }
193
+ return out;
194
+ }
195
+ function parseToolCalls(raw) {
196
+ if (!Array.isArray(raw))
197
+ return [];
198
+ const out = [];
199
+ for (const entry of raw) {
200
+ if (!isPlainObject(entry))
201
+ continue;
202
+ if (typeof entry.tool !== "string")
203
+ continue;
204
+ if (typeof entry.count !== "number")
205
+ continue;
206
+ out.push({ tool: entry.tool, count: entry.count });
207
+ }
208
+ return out;
209
+ }
210
+ function parseMcpTools(raw) {
211
+ if (!Array.isArray(raw))
212
+ return [];
213
+ const out = [];
214
+ for (const entry of raw) {
215
+ if (!isPlainObject(entry))
216
+ continue;
217
+ if (typeof entry.name !== "string")
218
+ continue;
219
+ out.push({
220
+ name: entry.name,
221
+ signature: typeof entry.signature === "string" ? entry.signature : "",
222
+ description: typeof entry.description === "string" ? entry.description : "",
223
+ destructive: !!entry.destructive,
224
+ });
225
+ }
226
+ return out;
227
+ }
228
+ function parseVerdictReasoning(raw) {
229
+ if (!Array.isArray(raw))
230
+ return [];
231
+ const out = [];
232
+ for (const entry of raw) {
233
+ if (!isPlainObject(entry))
234
+ continue;
235
+ const kind = entry.kind;
236
+ if (kind !== "positive" && kind !== "gap" && kind !== "critical")
237
+ continue;
238
+ if (typeof entry.text !== "string")
239
+ continue;
240
+ out.push({ kind, text: entry.text });
241
+ }
242
+ return out;
243
+ }
244
+ function parseNextSteps(raw) {
245
+ if (!Array.isArray(raw))
246
+ return [];
247
+ const out = [];
248
+ for (const entry of raw) {
249
+ if (!isPlainObject(entry))
250
+ continue;
251
+ const weight = entry.weight;
252
+ if (weight !== "primary" && weight !== "secondary")
253
+ continue;
254
+ if (typeof entry.label !== "string")
255
+ continue;
256
+ out.push({
257
+ weight,
258
+ label: entry.label,
259
+ command: typeof entry.command === "string" ? entry.command : undefined,
260
+ url: typeof entry.url === "string" ? entry.url : undefined,
261
+ });
262
+ }
263
+ return out;
264
+ }
265
+ function mapLocalFindings(findings = []) {
266
+ const out = [];
267
+ for (const f of findings) {
268
+ const locator = f.file
269
+ ? f.line !== undefined
270
+ ? `${f.file}:${f.line}`
271
+ : f.file
272
+ : "";
273
+ out.push({
274
+ severity: f.severity,
275
+ ruleId: f.checkId,
276
+ locator,
277
+ description: f.message ?? f.name ?? f.checkId,
278
+ fix: f.fix,
279
+ });
280
+ }
281
+ return out;
282
+ }
283
+ function isPlainObject(v) {
284
+ return typeof v === "object" && v !== null && !Array.isArray(v);
285
+ }
286
+ function stringArray(raw) {
287
+ if (!Array.isArray(raw))
288
+ return [];
289
+ const out = [];
290
+ for (const entry of raw) {
291
+ if (typeof entry === "string")
292
+ out.push(entry);
293
+ }
294
+ return out;
295
+ }
296
+ //# sourceMappingURL=rich-block-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-block-adapter.js","sourceRoot":"","sources":["../../src/check/rich-block-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * `ai-trust check skill:<name>` / `check mcp:<name>` orchestrator.
3
+ *
4
+ * Brief: opena2a-org/briefs/check-rich-context-skills-mcp-v1.md (§3, §8).
5
+ *
6
+ * Mirrors hackmyagent/src/check/skill-mcp-check.ts to keep the two
7
+ * CLIs byte-identical on the rich-block render (parity F12 / F13).
8
+ * Adapted to use ai-trust's `@opena2a/registry-client` for the trust
9
+ * lookup; the rest of the helpers (parseRichTarget, fetchNarrative,
10
+ * buildRichBlockInput, render-rich-block) are shared verbatim.
11
+ */
12
+ import type { RegistryClient } from "@opena2a/registry-client";
13
+ import { type CheckRichBlockInput } from "@opena2a/cli-ui";
14
+ import { type RichBlockPalette } from "./render-rich-block.js";
15
+ export interface ParsedRichTarget {
16
+ artifactType: "skill" | "mcp";
17
+ name: string;
18
+ }
19
+ /**
20
+ * Parse `skill:<name>` / `mcp:<name>` prefixes. Returns null when the
21
+ * input has no recognised prefix — the caller routes through the
22
+ * existing AI-classifier dispatch.
23
+ */
24
+ export declare function parseRichTarget(target: string): ParsedRichTarget | null;
25
+ /**
26
+ * Map a registry verdict + scanStatus to the rich-block trustVerdict
27
+ * tier. Same logic as HMA's deriveTrustVerdict (parity F12 / F13).
28
+ */
29
+ export declare function deriveTrustVerdict(verdict: string | undefined, trustLevel: number | undefined, scanStatus: string | undefined): "VERIFIED" | "LISTED" | "LISTED_UNSCANNED" | "BLOCKED";
30
+ export interface CheckSkillOrMcpOptions {
31
+ parsed: ParsedRichTarget;
32
+ registryUrl: string;
33
+ client: RegistryClient;
34
+ userAgent: string;
35
+ /** Tool name for the secrets-block report command (e.g. "ai-trust"). */
36
+ reportTool: string;
37
+ /** Pre-built palette to paint the output. */
38
+ palette: RichBlockPalette;
39
+ /** Optional explicit version pin; defaults to registry's "latest". */
40
+ version?: string;
41
+ /**
42
+ * Suppress the human-readable rich-block render. Used by `--json`
43
+ * callers and the opena2a-parity harness so output is parseable.
44
+ * The orchestrator still builds and returns `result.input`.
45
+ */
46
+ silent?: boolean;
47
+ }
48
+ export interface CheckSkillOrMcpResult {
49
+ /** True when the rich block was printed. False → caller falls back. */
50
+ rendered: boolean;
51
+ /** Raw input passed to renderCheckRichBlock — useful for tests / --json. */
52
+ input?: CheckRichBlockInput;
53
+ }
54
+ /**
55
+ * Run the rich-block path. Returns `{rendered: false}` when the
56
+ * narrative is unavailable; caller falls back to the existing
57
+ * classifier path.
58
+ */
59
+ export declare function checkSkillOrMcp(options: CheckSkillOrMcpOptions): Promise<CheckSkillOrMcpResult>;
60
+ //# sourceMappingURL=skill-mcp-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-mcp-check.d.ts","sourceRoot":"","sources":["../../src/check/skill-mcp-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAwB,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGjF,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAK/E,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,OAAO,GAAG,KAAK,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAYvE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,UAAU,GAAG,QAAQ,GAAG,kBAAkB,GAAG,SAAS,CAMxD;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,OAAO,EAAE,gBAAgB,CAAC;IAC1B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,uEAAuE;IACvE,QAAQ,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CAuEhC"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * `ai-trust check skill:<name>` / `check mcp:<name>` orchestrator.
3
+ *
4
+ * Brief: opena2a-org/briefs/check-rich-context-skills-mcp-v1.md (§3, §8).
5
+ *
6
+ * Mirrors hackmyagent/src/check/skill-mcp-check.ts to keep the two
7
+ * CLIs byte-identical on the rich-block render (parity F12 / F13).
8
+ * Adapted to use ai-trust's `@opena2a/registry-client` for the trust
9
+ * lookup; the rest of the helpers (parseRichTarget, fetchNarrative,
10
+ * buildRichBlockInput, render-rich-block) are shared verbatim.
11
+ */
12
+ import { renderCheckRichBlock } from "@opena2a/cli-ui";
13
+ import { fetchNarrative } from "./narrative-fetch.js";
14
+ import { buildRichBlockInput } from "./rich-block-adapter.js";
15
+ import { printRichBlock } from "./render-rich-block.js";
16
+ const SKILL_PREFIX = "skill:";
17
+ const MCP_PREFIX = "mcp:";
18
+ /**
19
+ * Parse `skill:<name>` / `mcp:<name>` prefixes. Returns null when the
20
+ * input has no recognised prefix — the caller routes through the
21
+ * existing AI-classifier dispatch.
22
+ */
23
+ export function parseRichTarget(target) {
24
+ if (target.startsWith(SKILL_PREFIX)) {
25
+ const name = target.slice(SKILL_PREFIX.length);
26
+ if (name.length === 0)
27
+ return null;
28
+ return { artifactType: "skill", name };
29
+ }
30
+ if (target.startsWith(MCP_PREFIX)) {
31
+ const name = target.slice(MCP_PREFIX.length);
32
+ if (name.length === 0)
33
+ return null;
34
+ return { artifactType: "mcp", name };
35
+ }
36
+ return null;
37
+ }
38
+ /**
39
+ * Map a registry verdict + scanStatus to the rich-block trustVerdict
40
+ * tier. Same logic as HMA's deriveTrustVerdict (parity F12 / F13).
41
+ */
42
+ export function deriveTrustVerdict(verdict, trustLevel, scanStatus) {
43
+ const v = (verdict ?? "").toLowerCase();
44
+ if (v === "blocked" || trustLevel === 0)
45
+ return "BLOCKED";
46
+ if (trustLevel === 4 || v === "verified")
47
+ return "VERIFIED";
48
+ if (scanStatus !== "completed")
49
+ return "LISTED_UNSCANNED";
50
+ return "LISTED";
51
+ }
52
+ /**
53
+ * Run the rich-block path. Returns `{rendered: false}` when the
54
+ * narrative is unavailable; caller falls back to the existing
55
+ * classifier path.
56
+ */
57
+ export async function checkSkillOrMcp(options) {
58
+ const { parsed, client } = options;
59
+ const version = options.version && options.version.length > 0
60
+ ? options.version
61
+ : "latest";
62
+ const narrative = await fetchNarrative({
63
+ registryUrl: options.registryUrl,
64
+ artifactType: parsed.artifactType,
65
+ name: parsed.name,
66
+ version,
67
+ userAgent: options.userAgent,
68
+ });
69
+ if (!narrative) {
70
+ return { rendered: false };
71
+ }
72
+ // Trust lookup is best-effort — a freshly-seeded narrative may not
73
+ // yet have a trust record. Sparse / missing trust degrades the
74
+ // header to LISTED_UNSCANNED but the narrative carries the bulk
75
+ // of the rich block.
76
+ let trust = null;
77
+ try {
78
+ trust = await client.checkTrust(parsed.name);
79
+ }
80
+ catch {
81
+ trust = null;
82
+ }
83
+ const trustInput = trust && trust.found
84
+ ? {
85
+ trustVerdict: deriveTrustVerdict(trust.verdict, trust.trustLevel, trust.scanStatus),
86
+ trustScore: trust.scanStatus === "completed"
87
+ ? Math.round(trust.trustScore * 100)
88
+ : undefined,
89
+ scanStatus: trust.scanStatus,
90
+ lastScanAge: formatScanAge(trust.lastScannedAt),
91
+ latestVersionLabel: narrative.packageVersion,
92
+ communityScans: trust.communityScans,
93
+ }
94
+ : {
95
+ trustVerdict: "LISTED_UNSCANNED",
96
+ latestVersionLabel: narrative.packageVersion,
97
+ };
98
+ const input = buildRichBlockInput({
99
+ name: parsed.name,
100
+ artifactType: parsed.artifactType,
101
+ narrative,
102
+ trust: trustInput,
103
+ reportTool: options.reportTool,
104
+ });
105
+ if (!input) {
106
+ return { rendered: false };
107
+ }
108
+ if (options.silent) {
109
+ return { rendered: true, input };
110
+ }
111
+ const rendered = renderCheckRichBlock(input);
112
+ printRichBlock(rendered, { palette: options.palette });
113
+ return { rendered: true, input };
114
+ }
115
+ function formatScanAge(lastScannedAt) {
116
+ if (!lastScannedAt)
117
+ return undefined;
118
+ const scanned = new Date(lastScannedAt);
119
+ if (Number.isNaN(scanned.getTime()))
120
+ return undefined;
121
+ const days = Math.floor((Date.now() - scanned.getTime()) / (1000 * 60 * 60 * 24));
122
+ if (days < 1)
123
+ return "today";
124
+ if (days === 1)
125
+ return "1d ago";
126
+ if (days < 30)
127
+ return `${days}d ago`;
128
+ const months = Math.floor(days / 30);
129
+ if (months === 1)
130
+ return "1mo ago";
131
+ if (months < 12)
132
+ return `${months}mo ago`;
133
+ const years = Math.floor(days / 365);
134
+ return years === 1 ? "1y ago" : `${years}y ago`;
135
+ }
136
+ //# sourceMappingURL=skill-mcp-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-mcp-check.js","sourceRoot":"","sources":["../../src/check/skill-mcp-check.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2CzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgJ3D"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoO3D"}