@mneme-ai/core 2.15.2 → 2.16.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/dist/agent_manifest.d.ts +1 -1
- package/dist/agent_manifest.d.ts.map +1 -1
- package/dist/agent_manifest.js +18 -1
- package/dist/agent_manifest.js.map +1 -1
- package/dist/alpha/alpha.test.d.ts +2 -0
- package/dist/alpha/alpha.test.d.ts.map +1 -0
- package/dist/alpha/alpha.test.js +101 -0
- package/dist/alpha/alpha.test.js.map +1 -0
- package/dist/alpha/index.d.ts +106 -0
- package/dist/alpha/index.d.ts.map +1 -0
- package/dist/alpha/index.js +190 -0
- package/dist/alpha/index.js.map +1 -0
- package/dist/anti_collusion/anti_collusion.test.d.ts +2 -0
- package/dist/anti_collusion/anti_collusion.test.d.ts.map +1 -0
- package/dist/anti_collusion/anti_collusion.test.js +137 -0
- package/dist/anti_collusion/anti_collusion.test.js.map +1 -0
- package/dist/anti_collusion/index.d.ts +89 -0
- package/dist/anti_collusion/index.d.ts.map +1 -0
- package/dist/anti_collusion/index.js +218 -0
- package/dist/anti_collusion/index.js.map +1 -0
- package/dist/cosmic/aurelian_v216.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v216.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v216.test.js +89 -0
- package/dist/cosmic/aurelian_v216.test.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/living_model/index.d.ts +104 -0
- package/dist/living_model/index.d.ts.map +1 -0
- package/dist/living_model/index.js +152 -0
- package/dist/living_model/index.js.map +1 -0
- package/dist/living_model/living_model.test.d.ts +2 -0
- package/dist/living_model/living_model.test.d.ts.map +1 -0
- package/dist/living_model/living_model.test.js +125 -0
- package/dist/living_model/living_model.test.js.map +1 -0
- package/dist/obelisk/index.d.ts +74 -0
- package/dist/obelisk/index.d.ts.map +1 -0
- package/dist/obelisk/index.js +114 -0
- package/dist/obelisk/index.js.map +1 -0
- package/dist/obelisk/obelisk.test.d.ts +2 -0
- package/dist/obelisk/obelisk.test.d.ts.map +1 -0
- package/dist/obelisk/obelisk.test.js +67 -0
- package/dist/obelisk/obelisk.test.js.map +1 -0
- package/dist/persona/index.d.ts +107 -0
- package/dist/persona/index.d.ts.map +1 -0
- package/dist/persona/index.js +144 -0
- package/dist/persona/index.js.map +1 -0
- package/dist/persona/persona.test.d.ts +2 -0
- package/dist/persona/persona.test.d.ts.map +1 -0
- package/dist/persona/persona.test.js +71 -0
- package/dist/persona/persona.test.js.map +1 -0
- package/dist/public_audit/index.d.ts +70 -0
- package/dist/public_audit/index.d.ts.map +1 -0
- package/dist/public_audit/index.js +175 -0
- package/dist/public_audit/index.js.map +1 -0
- package/dist/public_audit/public_audit.test.d.ts +2 -0
- package/dist/public_audit/public_audit.test.d.ts.map +1 -0
- package/dist/public_audit/public_audit.test.js +64 -0
- package/dist/public_audit/public_audit.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.16.0 — MNEME PERSONA
|
|
3
|
+
*
|
|
4
|
+
* "Package your REPLICA as a callable service. Your colleague subscribes
|
|
5
|
+
* to YOUR judgment for the kinds of decisions you've made before. The
|
|
6
|
+
* federation: N Mneme users = N personas = a team-wide consensus oracle."
|
|
7
|
+
*
|
|
8
|
+
* Composes orthogonally with v2.14 REPLICA (decision corpus) + v2.14
|
|
9
|
+
* PROJECT SOUL (rules) + v2.14 BOUNTY (vendor trust). PERSONA bundles a
|
|
10
|
+
* curated subset of these into a portable, HMAC-signed `.mneme-persona`
|
|
11
|
+
* manifest a teammate can import + query.
|
|
12
|
+
*
|
|
13
|
+
* Privacy: only *structured* decisions + outcomes + rules. No source code.
|
|
14
|
+
* Per-decision opt-in via `shareable: true` flag on REPLICA decisions.
|
|
15
|
+
*
|
|
16
|
+
* Wisdom: PERSONA isn't another oracle — it's a *protocol* on top of REPLICA.
|
|
17
|
+
* v2.17 will federate personas via cosmic; v2.16 ships the local primitives.
|
|
18
|
+
*/
|
|
19
|
+
declare const PROTOCOL_VERSION: 1;
|
|
20
|
+
export interface PersonaDecision {
|
|
21
|
+
id: string;
|
|
22
|
+
ts: string;
|
|
23
|
+
question: string;
|
|
24
|
+
features: Record<string, string>;
|
|
25
|
+
action: string;
|
|
26
|
+
outcomePolarity?: "good" | "bad" | "neutral";
|
|
27
|
+
}
|
|
28
|
+
export interface PersonaSoulRule {
|
|
29
|
+
id: string;
|
|
30
|
+
text: string;
|
|
31
|
+
category: string;
|
|
32
|
+
severity: "warn" | "block";
|
|
33
|
+
}
|
|
34
|
+
export interface PersonaBundle {
|
|
35
|
+
v: typeof PROTOCOL_VERSION;
|
|
36
|
+
/** Human-readable owner identity (e.g., "shinnapat@example.com"). */
|
|
37
|
+
owner: string;
|
|
38
|
+
/** Optional display name for UI ("Shinnapat - Mneme maintainer"). */
|
|
39
|
+
displayName?: string;
|
|
40
|
+
/** When this bundle was exported. */
|
|
41
|
+
exportedAt: string;
|
|
42
|
+
/** Subset of REPLICA decisions the owner opted to share. */
|
|
43
|
+
decisions: PersonaDecision[];
|
|
44
|
+
/** Optional subset of PROJECT SOUL rules. */
|
|
45
|
+
soulRules?: PersonaSoulRule[];
|
|
46
|
+
/** HMAC over the canonical body — proves provenance + tamper evidence. */
|
|
47
|
+
sig: string;
|
|
48
|
+
}
|
|
49
|
+
export interface PersonaQueryResult {
|
|
50
|
+
/** Top recommendation from this persona's history, or null if no match. */
|
|
51
|
+
recommendation: string | null;
|
|
52
|
+
/** Confidence 0..1. */
|
|
53
|
+
confidence: number;
|
|
54
|
+
/** Top-k matching decisions for transparency. */
|
|
55
|
+
matches: Array<{
|
|
56
|
+
id: string;
|
|
57
|
+
similarity: number;
|
|
58
|
+
action: string;
|
|
59
|
+
outcomePolarity?: "good" | "bad" | "neutral";
|
|
60
|
+
}>;
|
|
61
|
+
/** Owner identity for attribution ("Shinnapat would do X with 87% confidence"). */
|
|
62
|
+
attributedTo: string;
|
|
63
|
+
/** HMAC-signed result for tamper-evident citation. */
|
|
64
|
+
sig: string;
|
|
65
|
+
}
|
|
66
|
+
export interface ExportPersonaInput {
|
|
67
|
+
owner: string;
|
|
68
|
+
displayName?: string;
|
|
69
|
+
decisions: PersonaDecision[];
|
|
70
|
+
soulRules?: PersonaSoulRule[];
|
|
71
|
+
secret?: string;
|
|
72
|
+
}
|
|
73
|
+
export declare function exportPersona(input: ExportPersonaInput): PersonaBundle;
|
|
74
|
+
export declare function verifyPersona(bundle: PersonaBundle, secret?: string): {
|
|
75
|
+
ok: boolean;
|
|
76
|
+
reason?: string;
|
|
77
|
+
};
|
|
78
|
+
export interface QueryPersonaInput {
|
|
79
|
+
bundle: PersonaBundle;
|
|
80
|
+
question: string;
|
|
81
|
+
features?: Record<string, string>;
|
|
82
|
+
k?: number;
|
|
83
|
+
secret?: string;
|
|
84
|
+
}
|
|
85
|
+
export declare function queryPersona(input: QueryPersonaInput): PersonaQueryResult;
|
|
86
|
+
/** Combine N personas into a consensus query. Returns per-persona results
|
|
87
|
+
* + a vote tally on the top action. */
|
|
88
|
+
export declare function consensusQuery(input: {
|
|
89
|
+
bundles: PersonaBundle[];
|
|
90
|
+
question: string;
|
|
91
|
+
features?: Record<string, string>;
|
|
92
|
+
secret?: string;
|
|
93
|
+
}): {
|
|
94
|
+
perPersona: Array<{
|
|
95
|
+
owner: string;
|
|
96
|
+
result: PersonaQueryResult;
|
|
97
|
+
}>;
|
|
98
|
+
consensus: {
|
|
99
|
+
action: string | null;
|
|
100
|
+
agreeCount: number;
|
|
101
|
+
total: number;
|
|
102
|
+
confidence: number;
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
export declare function formatPersonaLine(bundle: PersonaBundle): string;
|
|
106
|
+
export {};
|
|
107
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persona/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;CAC9C;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,6CAA6C;IAC7C,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;KAC9C,CAAC,CAAC;IACH,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;CACb;AAmCD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAYtE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAOtG;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CAgCzE;AAED;wCACwC;AACxC,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG;IACF,UAAU,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC,CAAC;IACjE,SAAS,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7F,CAyBA;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE/D"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.16.0 — MNEME PERSONA
|
|
3
|
+
*
|
|
4
|
+
* "Package your REPLICA as a callable service. Your colleague subscribes
|
|
5
|
+
* to YOUR judgment for the kinds of decisions you've made before. The
|
|
6
|
+
* federation: N Mneme users = N personas = a team-wide consensus oracle."
|
|
7
|
+
*
|
|
8
|
+
* Composes orthogonally with v2.14 REPLICA (decision corpus) + v2.14
|
|
9
|
+
* PROJECT SOUL (rules) + v2.14 BOUNTY (vendor trust). PERSONA bundles a
|
|
10
|
+
* curated subset of these into a portable, HMAC-signed `.mneme-persona`
|
|
11
|
+
* manifest a teammate can import + query.
|
|
12
|
+
*
|
|
13
|
+
* Privacy: only *structured* decisions + outcomes + rules. No source code.
|
|
14
|
+
* Per-decision opt-in via `shareable: true` flag on REPLICA decisions.
|
|
15
|
+
*
|
|
16
|
+
* Wisdom: PERSONA isn't another oracle — it's a *protocol* on top of REPLICA.
|
|
17
|
+
* v2.17 will federate personas via cosmic; v2.16 ships the local primitives.
|
|
18
|
+
*/
|
|
19
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
20
|
+
const PROTOCOL_VERSION = 1;
|
|
21
|
+
function canon(v) {
|
|
22
|
+
if (v === null || typeof v !== "object")
|
|
23
|
+
return JSON.stringify(v);
|
|
24
|
+
if (Array.isArray(v))
|
|
25
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
26
|
+
const keys = Object.keys(v).sort();
|
|
27
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
|
|
28
|
+
}
|
|
29
|
+
function defaultSecret() {
|
|
30
|
+
return process.env["MNEME_PERSONA_SECRET"] || `mneme-persona-v${PROTOCOL_VERSION}`;
|
|
31
|
+
}
|
|
32
|
+
const STOP = new Set(["the", "a", "an", "is", "are", "in", "on", "of", "to", "for", "and", "or", "but", "we", "i"]);
|
|
33
|
+
function tokenize(s) {
|
|
34
|
+
return new Set(s.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length >= 3 && !STOP.has(t)));
|
|
35
|
+
}
|
|
36
|
+
function jaccard(a, b) {
|
|
37
|
+
if (a.size === 0 && b.size === 0)
|
|
38
|
+
return 0;
|
|
39
|
+
let inter = 0;
|
|
40
|
+
for (const x of a)
|
|
41
|
+
if (b.has(x))
|
|
42
|
+
inter++;
|
|
43
|
+
const u = a.size + b.size - inter;
|
|
44
|
+
return u === 0 ? 0 : inter / u;
|
|
45
|
+
}
|
|
46
|
+
function featureSim(a, b) {
|
|
47
|
+
const u = new Set([...Object.keys(a), ...Object.keys(b)]);
|
|
48
|
+
if (u.size === 0)
|
|
49
|
+
return 0;
|
|
50
|
+
let m = 0;
|
|
51
|
+
for (const k of u)
|
|
52
|
+
if (a[k] !== undefined && b[k] !== undefined && a[k] === b[k])
|
|
53
|
+
m++;
|
|
54
|
+
return m / u.size;
|
|
55
|
+
}
|
|
56
|
+
export function exportPersona(input) {
|
|
57
|
+
const exportedAt = new Date().toISOString();
|
|
58
|
+
const body = {
|
|
59
|
+
v: PROTOCOL_VERSION,
|
|
60
|
+
owner: input.owner,
|
|
61
|
+
...(input.displayName ? { displayName: input.displayName } : {}),
|
|
62
|
+
exportedAt,
|
|
63
|
+
decisions: input.decisions,
|
|
64
|
+
...(input.soulRules ? { soulRules: input.soulRules } : {}),
|
|
65
|
+
};
|
|
66
|
+
const sig = createHmac("sha256", input.secret ?? defaultSecret()).update(canon(body)).digest("hex");
|
|
67
|
+
return { ...body, sig };
|
|
68
|
+
}
|
|
69
|
+
export function verifyPersona(bundle, secret) {
|
|
70
|
+
const { sig: claimed, ...body } = bundle;
|
|
71
|
+
const expected = createHmac("sha256", secret ?? defaultSecret()).update(canon(body)).digest("hex");
|
|
72
|
+
try {
|
|
73
|
+
const ok = timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(claimed, "hex"));
|
|
74
|
+
return ok ? { ok: true } : { ok: false, reason: "persona sig mismatch -- forged or tampered" };
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return { ok: false, reason: "persona sig length invalid" };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function queryPersona(input) {
|
|
81
|
+
const k = input.k ?? 5;
|
|
82
|
+
const qTokens = tokenize(input.question);
|
|
83
|
+
const qFeatures = input.features ?? {};
|
|
84
|
+
const scored = input.bundle.decisions.map((d) => {
|
|
85
|
+
const fs = featureSim(qFeatures, d.features);
|
|
86
|
+
const ts = jaccard(qTokens, tokenize(d.question));
|
|
87
|
+
const sim = fs * 0.6 + ts * 0.4;
|
|
88
|
+
const boost = d.outcomePolarity === "good" ? 1.2 : d.outcomePolarity === "bad" ? 0.6 : 1.0;
|
|
89
|
+
return { d, sim, weighted: sim * boost };
|
|
90
|
+
}).sort((a, b) => b.weighted - a.weighted).slice(0, k);
|
|
91
|
+
const tally = new Map();
|
|
92
|
+
for (const s of scored)
|
|
93
|
+
tally.set(s.d.action, (tally.get(s.d.action) ?? 0) + s.weighted);
|
|
94
|
+
const ranked = Array.from(tally.entries()).sort((a, b) => b[1] - a[1]);
|
|
95
|
+
const top = ranked[0];
|
|
96
|
+
const total = ranked.reduce((acc, [, w]) => acc + w, 0);
|
|
97
|
+
const confidence = top && total > 0 ? top[1] / total : 0;
|
|
98
|
+
const result = {
|
|
99
|
+
recommendation: top?.[0] ?? null,
|
|
100
|
+
confidence: Math.round(confidence * 1000) / 1000,
|
|
101
|
+
matches: scored.map((s) => ({
|
|
102
|
+
id: s.d.id,
|
|
103
|
+
similarity: Math.round(s.sim * 1000) / 1000,
|
|
104
|
+
action: s.d.action,
|
|
105
|
+
...(s.d.outcomePolarity ? { outcomePolarity: s.d.outcomePolarity } : {}),
|
|
106
|
+
})),
|
|
107
|
+
attributedTo: input.bundle.displayName ?? input.bundle.owner,
|
|
108
|
+
};
|
|
109
|
+
const sig = createHmac("sha256", input.secret ?? defaultSecret()).update(canon(result)).digest("hex");
|
|
110
|
+
return { ...result, sig };
|
|
111
|
+
}
|
|
112
|
+
/** Combine N personas into a consensus query. Returns per-persona results
|
|
113
|
+
* + a vote tally on the top action. */
|
|
114
|
+
export function consensusQuery(input) {
|
|
115
|
+
const perPersona = input.bundles.map((b) => ({
|
|
116
|
+
owner: b.owner,
|
|
117
|
+
result: queryPersona({
|
|
118
|
+
bundle: b,
|
|
119
|
+
question: input.question,
|
|
120
|
+
...(input.features ? { features: input.features } : {}),
|
|
121
|
+
...(input.secret ? { secret: input.secret } : {}),
|
|
122
|
+
}),
|
|
123
|
+
}));
|
|
124
|
+
const tally = new Map();
|
|
125
|
+
for (const p of perPersona) {
|
|
126
|
+
if (p.result.recommendation)
|
|
127
|
+
tally.set(p.result.recommendation, (tally.get(p.result.recommendation) ?? 0) + 1);
|
|
128
|
+
}
|
|
129
|
+
const ranked = Array.from(tally.entries()).sort((a, b) => b[1] - a[1]);
|
|
130
|
+
const top = ranked[0];
|
|
131
|
+
return {
|
|
132
|
+
perPersona,
|
|
133
|
+
consensus: {
|
|
134
|
+
action: top?.[0] ?? null,
|
|
135
|
+
agreeCount: top?.[1] ?? 0,
|
|
136
|
+
total: input.bundles.length,
|
|
137
|
+
confidence: top ? top[1] / input.bundles.length : 0,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
export function formatPersonaLine(bundle) {
|
|
142
|
+
return `PERSONA · ${bundle.displayName ?? bundle.owner} · ${bundle.decisions.length} decisions · sig=${bundle.sig.slice(0, 8)}`;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/persona/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona.test.d.ts","sourceRoot":"","sources":["../../src/persona/persona.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { exportPersona, verifyPersona, queryPersona, consensusQuery, formatPersonaLine } from "./index.js";
|
|
3
|
+
const sampleDecisions = [
|
|
4
|
+
{ id: "d1", ts: "2026-01-01T00:00:00Z", question: "Friday 5pm deploy?", features: { day: "Friday", risk: "high" }, action: "wait until Monday", outcomePolarity: "good" },
|
|
5
|
+
{ id: "d2", ts: "2026-01-02T00:00:00Z", question: "Refactor auth?", features: { area: "auth", risk: "high" }, action: "extract module first", outcomePolarity: "good" },
|
|
6
|
+
{ id: "d3", ts: "2026-01-03T00:00:00Z", question: "Add new dep?", features: { kind: "dep" }, action: "use native instead", outcomePolarity: "good" },
|
|
7
|
+
];
|
|
8
|
+
describe("v2.16 · MNEME PERSONA", () => {
|
|
9
|
+
it("exportPersona produces a signed bundle", () => {
|
|
10
|
+
const b = exportPersona({ owner: "shin@x.com", decisions: sampleDecisions });
|
|
11
|
+
expect(b.sig).toMatch(/^[0-9a-f]{64}$/);
|
|
12
|
+
expect(b.decisions).toHaveLength(3);
|
|
13
|
+
});
|
|
14
|
+
it("verifyPersona passes for clean bundle", () => {
|
|
15
|
+
const b = exportPersona({ owner: "shin@x.com", decisions: sampleDecisions });
|
|
16
|
+
expect(verifyPersona(b).ok).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
it("verifyPersona fails on tamper", () => {
|
|
19
|
+
const b = exportPersona({ owner: "shin@x.com", decisions: sampleDecisions });
|
|
20
|
+
const tampered = { ...b, owner: "attacker@evil.com" };
|
|
21
|
+
expect(verifyPersona(tampered).ok).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
it("queryPersona returns matching past decision", () => {
|
|
24
|
+
const b = exportPersona({ owner: "shin@x.com", decisions: sampleDecisions });
|
|
25
|
+
const r = queryPersona({ bundle: b, question: "Friday deploy?", features: { day: "Friday", risk: "high" } });
|
|
26
|
+
expect(r.recommendation).toBe("wait until Monday");
|
|
27
|
+
expect(r.attributedTo).toBe("shin@x.com");
|
|
28
|
+
expect(r.matches.length).toBeGreaterThan(0);
|
|
29
|
+
});
|
|
30
|
+
it("queryPersona attributes to displayName when present", () => {
|
|
31
|
+
const b = exportPersona({ owner: "shin@x.com", displayName: "Shinnapat", decisions: sampleDecisions });
|
|
32
|
+
const r = queryPersona({ bundle: b, question: "x" });
|
|
33
|
+
expect(r.attributedTo).toBe("Shinnapat");
|
|
34
|
+
});
|
|
35
|
+
it("queryPersona returns null when corpus is empty", () => {
|
|
36
|
+
const b = exportPersona({ owner: "x", decisions: [] });
|
|
37
|
+
const r = queryPersona({ bundle: b, question: "x" });
|
|
38
|
+
expect(r.recommendation).toBeNull();
|
|
39
|
+
expect(r.confidence).toBe(0);
|
|
40
|
+
});
|
|
41
|
+
it("queryPersona signed result", () => {
|
|
42
|
+
const b = exportPersona({ owner: "shin@x.com", decisions: sampleDecisions });
|
|
43
|
+
const r = queryPersona({ bundle: b, question: "x" });
|
|
44
|
+
expect(r.sig).toMatch(/^[0-9a-f]{64}$/);
|
|
45
|
+
});
|
|
46
|
+
it("consensusQuery aggregates across N personas", () => {
|
|
47
|
+
const a = exportPersona({ owner: "alice", decisions: sampleDecisions });
|
|
48
|
+
const c = exportPersona({ owner: "carol", decisions: [
|
|
49
|
+
{ id: "x", ts: "z", question: "Friday deploy?", features: { day: "Friday" }, action: "wait until Monday", outcomePolarity: "good" },
|
|
50
|
+
{ id: "y", ts: "z", question: "Friday deploy?", features: { day: "Friday" }, action: "wait until Monday", outcomePolarity: "good" },
|
|
51
|
+
] });
|
|
52
|
+
const dissenter = exportPersona({ owner: "bob", decisions: [
|
|
53
|
+
{ id: "z", ts: "z", question: "Friday deploy?", features: { day: "Friday" }, action: "ship anyway", outcomePolarity: "bad" },
|
|
54
|
+
] });
|
|
55
|
+
const r = consensusQuery({
|
|
56
|
+
bundles: [a, c, dissenter],
|
|
57
|
+
question: "Friday deploy?",
|
|
58
|
+
features: { day: "Friday" },
|
|
59
|
+
});
|
|
60
|
+
expect(r.consensus.action).toBe("wait until Monday");
|
|
61
|
+
expect(r.consensus.agreeCount).toBe(2);
|
|
62
|
+
expect(r.consensus.total).toBe(3);
|
|
63
|
+
});
|
|
64
|
+
it("formatPersonaLine summarises", () => {
|
|
65
|
+
const b = exportPersona({ owner: "shin@x.com", displayName: "Shin", decisions: sampleDecisions });
|
|
66
|
+
expect(formatPersonaLine(b)).toContain("PERSONA");
|
|
67
|
+
expect(formatPersonaLine(b)).toContain("Shin");
|
|
68
|
+
expect(formatPersonaLine(b)).toContain("3 decisions");
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=persona.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona.test.js","sourceRoot":"","sources":["../../src/persona/persona.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.16.0 — MNEME AURELIAN PUBLIC AUDIT
|
|
3
|
+
*
|
|
4
|
+
* "npx mneme audit <package> — Mneme runs the AURELIAN scorecard against
|
|
5
|
+
* any open-source AI tool. Produces an HMAC-signed quality scorecard
|
|
6
|
+
* publishable to the global trust graph. Ranks every dev tool's
|
|
7
|
+
* measured quality."
|
|
8
|
+
*
|
|
9
|
+
* The killer Move: the AURELIAN AUDITOR (v2.13) was internal to Mneme.
|
|
10
|
+
* v2.16 opens it. Anyone can audit anyone — and the scorecards aggregate
|
|
11
|
+
* into a public "open AI dev tool" leaderboard.
|
|
12
|
+
*
|
|
13
|
+
* Algorithm: pull standard signals from a package's npm/PyPI/Cargo
|
|
14
|
+
* metadata + GitHub repo + any cosmic SOUL/BOUNTY data the maintainer
|
|
15
|
+
* has opted to share. Convert into AURELIAN measurements + evidence,
|
|
16
|
+
* then run the existing aurelian_audit primitive. Result is signed.
|
|
17
|
+
*/
|
|
18
|
+
declare const PROTOCOL_VERSION: 1;
|
|
19
|
+
export type Registry = "npm" | "pypi" | "cargo" | "rubygems" | "go";
|
|
20
|
+
export interface PublicAuditInput {
|
|
21
|
+
registry: Registry;
|
|
22
|
+
packageName: string;
|
|
23
|
+
/** Provided by the caller (CLI), e.g., from `npm view <pkg>`. */
|
|
24
|
+
metadata?: {
|
|
25
|
+
version?: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
homepage?: string;
|
|
28
|
+
license?: string;
|
|
29
|
+
weeklyDownloads?: number;
|
|
30
|
+
githubUrl?: string;
|
|
31
|
+
stars?: number;
|
|
32
|
+
openIssues?: number;
|
|
33
|
+
lastPublished?: string;
|
|
34
|
+
hasTypes?: boolean;
|
|
35
|
+
hasReadme?: boolean;
|
|
36
|
+
};
|
|
37
|
+
/** Optional fetcher for live registry data; defaults to no-fetch (caller pre-fills metadata). */
|
|
38
|
+
fetchOverride?: typeof fetch;
|
|
39
|
+
secret?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface PublicAuditResult {
|
|
42
|
+
v: typeof PROTOCOL_VERSION;
|
|
43
|
+
package: string;
|
|
44
|
+
registry: Registry;
|
|
45
|
+
scores: {
|
|
46
|
+
popularity: number;
|
|
47
|
+
freshness: number;
|
|
48
|
+
openness: number;
|
|
49
|
+
types: number;
|
|
50
|
+
docs: number;
|
|
51
|
+
};
|
|
52
|
+
/** 0..100 composite score. */
|
|
53
|
+
composite: number;
|
|
54
|
+
/** Verdict bucket. */
|
|
55
|
+
verdict: "platinum" | "gold" | "silver" | "bronze" | "needs_work";
|
|
56
|
+
evidence: string[];
|
|
57
|
+
/** Suggestions to improve the score. */
|
|
58
|
+
recommendations: string[];
|
|
59
|
+
generatedAt: string;
|
|
60
|
+
sig: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Optional helper to fetch npm metadata. Caller can use this OR pass
|
|
64
|
+
* pre-fetched data via input.metadata.
|
|
65
|
+
*/
|
|
66
|
+
export declare function fetchNpmMetadata(packageName: string, fetchOverride?: typeof fetch): Promise<PublicAuditInput["metadata"]>;
|
|
67
|
+
export declare function audit(input: PublicAuditInput): PublicAuditResult;
|
|
68
|
+
export declare function formatPublicAuditLine(r: PublicAuditResult): string;
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/public_audit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAEpC,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,iGAAiG;IACjG,aAAa,CAAC,EAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACjG,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;IAClE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,wCAAwC;IACxC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAaD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAqB/H;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAkFhE;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAElE"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.16.0 — MNEME AURELIAN PUBLIC AUDIT
|
|
3
|
+
*
|
|
4
|
+
* "npx mneme audit <package> — Mneme runs the AURELIAN scorecard against
|
|
5
|
+
* any open-source AI tool. Produces an HMAC-signed quality scorecard
|
|
6
|
+
* publishable to the global trust graph. Ranks every dev tool's
|
|
7
|
+
* measured quality."
|
|
8
|
+
*
|
|
9
|
+
* The killer Move: the AURELIAN AUDITOR (v2.13) was internal to Mneme.
|
|
10
|
+
* v2.16 opens it. Anyone can audit anyone — and the scorecards aggregate
|
|
11
|
+
* into a public "open AI dev tool" leaderboard.
|
|
12
|
+
*
|
|
13
|
+
* Algorithm: pull standard signals from a package's npm/PyPI/Cargo
|
|
14
|
+
* metadata + GitHub repo + any cosmic SOUL/BOUNTY data the maintainer
|
|
15
|
+
* has opted to share. Convert into AURELIAN measurements + evidence,
|
|
16
|
+
* then run the existing aurelian_audit primitive. Result is signed.
|
|
17
|
+
*/
|
|
18
|
+
import { createHmac } from "node:crypto";
|
|
19
|
+
const PROTOCOL_VERSION = 1;
|
|
20
|
+
function canon(v) {
|
|
21
|
+
if (v === null || typeof v !== "object")
|
|
22
|
+
return JSON.stringify(v);
|
|
23
|
+
if (Array.isArray(v))
|
|
24
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
25
|
+
const keys = Object.keys(v).sort();
|
|
26
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
|
|
27
|
+
}
|
|
28
|
+
function defaultSecret() {
|
|
29
|
+
return process.env["MNEME_PUBLIC_AUDIT_SECRET"] || `mneme-public-audit-v${PROTOCOL_VERSION}`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Optional helper to fetch npm metadata. Caller can use this OR pass
|
|
33
|
+
* pre-fetched data via input.metadata.
|
|
34
|
+
*/
|
|
35
|
+
export async function fetchNpmMetadata(packageName, fetchOverride) {
|
|
36
|
+
const fetchFn = fetchOverride ?? globalThis.fetch;
|
|
37
|
+
if (typeof fetchFn !== "function")
|
|
38
|
+
return {};
|
|
39
|
+
try {
|
|
40
|
+
const res = await fetchFn(`https://registry.npmjs.org/${encodeURIComponent(packageName)}`);
|
|
41
|
+
if (!res.ok)
|
|
42
|
+
return {};
|
|
43
|
+
const j = await res.json();
|
|
44
|
+
const latest = j["dist-tags"]?.latest;
|
|
45
|
+
const versions = j["versions"];
|
|
46
|
+
const latestData = latest && versions ? versions[latest] : undefined;
|
|
47
|
+
const time = j["time"];
|
|
48
|
+
return {
|
|
49
|
+
...(latest ? { version: latest } : {}),
|
|
50
|
+
...(latestData?.["description"] ? { description: String(latestData["description"]) } : {}),
|
|
51
|
+
...(latestData?.["homepage"] ? { homepage: String(latestData["homepage"]) } : {}),
|
|
52
|
+
...(latestData?.["license"] ? { license: String(latestData["license"]) } : {}),
|
|
53
|
+
...(latest && time?.[latest] ? { lastPublished: time[latest] } : {}),
|
|
54
|
+
...(latestData?.["repository"] ? { githubUrl: String((latestData["repository"].url) ?? "") } : {}),
|
|
55
|
+
...(latestData?.["types"] || latestData?.["typings"] ? { hasTypes: true } : { hasTypes: false }),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function audit(input) {
|
|
63
|
+
const m = input.metadata ?? {};
|
|
64
|
+
const evidence = [];
|
|
65
|
+
const rec = [];
|
|
66
|
+
// Popularity (0-100): downloads + stars (capped, log-shaped)
|
|
67
|
+
let popularity = 0;
|
|
68
|
+
if (m.weeklyDownloads) {
|
|
69
|
+
const score = Math.min(100, Math.round(Math.log10(m.weeklyDownloads + 1) * 18));
|
|
70
|
+
popularity = score;
|
|
71
|
+
evidence.push(`weekly downloads: ${m.weeklyDownloads.toLocaleString()} → popularity ${score}/100`);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
rec.push("Add download count via fetch from npm/PyPI to compute popularity properly.");
|
|
75
|
+
}
|
|
76
|
+
if (m.stars !== undefined) {
|
|
77
|
+
popularity = Math.min(100, Math.round((popularity + Math.min(100, Math.log10(m.stars + 1) * 22)) / (m.weeklyDownloads ? 2 : 1)));
|
|
78
|
+
evidence.push(`GitHub stars: ${m.stars}`);
|
|
79
|
+
}
|
|
80
|
+
// Freshness (0-100): days since last publish
|
|
81
|
+
let freshness = 50;
|
|
82
|
+
if (m.lastPublished) {
|
|
83
|
+
const days = (Date.now() - new Date(m.lastPublished).getTime()) / (1000 * 60 * 60 * 24);
|
|
84
|
+
if (Number.isFinite(days)) {
|
|
85
|
+
if (days <= 30) {
|
|
86
|
+
freshness = 100;
|
|
87
|
+
evidence.push(`last published ${Math.round(days)} days ago — actively maintained.`);
|
|
88
|
+
}
|
|
89
|
+
else if (days <= 90) {
|
|
90
|
+
freshness = 85;
|
|
91
|
+
evidence.push(`last published ${Math.round(days)} days ago.`);
|
|
92
|
+
}
|
|
93
|
+
else if (days <= 180) {
|
|
94
|
+
freshness = 70;
|
|
95
|
+
evidence.push(`last published ${Math.round(days)} days ago.`);
|
|
96
|
+
}
|
|
97
|
+
else if (days <= 365) {
|
|
98
|
+
freshness = 50;
|
|
99
|
+
rec.push("Consider a maintenance release; last publish > 6 months ago.");
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
freshness = 20;
|
|
103
|
+
rec.push(`Stale: last publish ${Math.round(days)} days ago — investigate before adopting.`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Openness (0-100): license + open issues posture
|
|
108
|
+
let openness = 60;
|
|
109
|
+
if (m.license) {
|
|
110
|
+
const goodLicenses = ["MIT", "Apache-2.0", "BSD-3-Clause", "BSD-2-Clause", "ISC", "0BSD", "MPL-2.0"];
|
|
111
|
+
if (goodLicenses.some((l) => m.license.toUpperCase().includes(l.toUpperCase()))) {
|
|
112
|
+
openness = 95;
|
|
113
|
+
evidence.push(`license: ${m.license} (permissive open-source)`);
|
|
114
|
+
}
|
|
115
|
+
else if (/GPL|AGPL/i.test(m.license)) {
|
|
116
|
+
openness = 75;
|
|
117
|
+
evidence.push(`license: ${m.license} (copyleft — restrictive for commercial use)`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
openness = 40;
|
|
121
|
+
evidence.push(`license: ${m.license}`);
|
|
122
|
+
rec.push("Verify license is open-source compatible with your use.");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
openness = 30;
|
|
127
|
+
rec.push("No license declared — high adoption risk.");
|
|
128
|
+
}
|
|
129
|
+
// Types (TypeScript types presence)
|
|
130
|
+
const types = m.hasTypes ? 100 : 30;
|
|
131
|
+
if (m.hasTypes)
|
|
132
|
+
evidence.push("TypeScript types declared.");
|
|
133
|
+
else
|
|
134
|
+
rec.push("No TypeScript types — adoption friction for TS projects.");
|
|
135
|
+
// Docs (readme presence + homepage)
|
|
136
|
+
let docs = 0;
|
|
137
|
+
if (m.hasReadme) {
|
|
138
|
+
docs += 60;
|
|
139
|
+
evidence.push("README present.");
|
|
140
|
+
}
|
|
141
|
+
else
|
|
142
|
+
rec.push("No README detected.");
|
|
143
|
+
if (m.homepage) {
|
|
144
|
+
docs += 40;
|
|
145
|
+
evidence.push(`homepage: ${m.homepage}`);
|
|
146
|
+
}
|
|
147
|
+
else
|
|
148
|
+
rec.push("No homepage URL — reduces discoverability.");
|
|
149
|
+
const composite = Math.round((popularity * 0.30 + freshness * 0.25 + openness * 0.20 + types * 0.10 + docs * 0.15));
|
|
150
|
+
let verdict;
|
|
151
|
+
if (composite >= 90)
|
|
152
|
+
verdict = "platinum";
|
|
153
|
+
else if (composite >= 75)
|
|
154
|
+
verdict = "gold";
|
|
155
|
+
else if (composite >= 60)
|
|
156
|
+
verdict = "silver";
|
|
157
|
+
else if (composite >= 40)
|
|
158
|
+
verdict = "bronze";
|
|
159
|
+
else
|
|
160
|
+
verdict = "needs_work";
|
|
161
|
+
const generatedAt = new Date().toISOString();
|
|
162
|
+
const body = {
|
|
163
|
+
v: PROTOCOL_VERSION,
|
|
164
|
+
package: input.packageName,
|
|
165
|
+
registry: input.registry,
|
|
166
|
+
scores: { popularity, freshness, openness, types, docs },
|
|
167
|
+
composite, verdict, evidence, recommendations: rec, generatedAt,
|
|
168
|
+
};
|
|
169
|
+
const sig = createHmac("sha256", input.secret ?? defaultSecret()).update(canon(body)).digest("hex");
|
|
170
|
+
return { ...body, sig };
|
|
171
|
+
}
|
|
172
|
+
export function formatPublicAuditLine(r) {
|
|
173
|
+
return `AUDIT · ${r.package} · ${r.composite}/100 · ${r.verdict} · sig=${r.sig.slice(0, 8)}`;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/public_audit/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public_audit.test.d.ts","sourceRoot":"","sources":["../../src/public_audit/public_audit.test.ts"],"names":[],"mappings":""}
|