usertrust 0.1.0
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/audit/canonical.d.ts +7 -0
- package/dist/audit/canonical.d.ts.map +1 -0
- package/dist/audit/canonical.js +24 -0
- package/dist/audit/canonical.js.map +1 -0
- package/dist/audit/chain.d.ts +33 -0
- package/dist/audit/chain.d.ts.map +1 -0
- package/dist/audit/chain.js +285 -0
- package/dist/audit/chain.js.map +1 -0
- package/dist/audit/entropy.d.ts +95 -0
- package/dist/audit/entropy.d.ts.map +1 -0
- package/dist/audit/entropy.js +229 -0
- package/dist/audit/entropy.js.map +1 -0
- package/dist/audit/merkle.d.ts +87 -0
- package/dist/audit/merkle.d.ts.map +1 -0
- package/dist/audit/merkle.js +315 -0
- package/dist/audit/merkle.js.map +1 -0
- package/dist/audit/rotation.d.ts +61 -0
- package/dist/audit/rotation.d.ts.map +1 -0
- package/dist/audit/rotation.js +160 -0
- package/dist/audit/rotation.js.map +1 -0
- package/dist/audit/verify.d.ts +20 -0
- package/dist/audit/verify.d.ts.map +1 -0
- package/dist/audit/verify.js +73 -0
- package/dist/audit/verify.js.map +1 -0
- package/dist/board/board.d.ts +67 -0
- package/dist/board/board.d.ts.map +1 -0
- package/dist/board/board.js +191 -0
- package/dist/board/board.js.map +1 -0
- package/dist/board/concerns.d.ts +59 -0
- package/dist/board/concerns.d.ts.map +1 -0
- package/dist/board/concerns.js +149 -0
- package/dist/board/concerns.js.map +1 -0
- package/dist/board/director.d.ts +49 -0
- package/dist/board/director.d.ts.map +1 -0
- package/dist/board/director.js +127 -0
- package/dist/board/director.js.map +1 -0
- package/dist/cli/health.d.ts +8 -0
- package/dist/cli/health.d.ts.map +1 -0
- package/dist/cli/health.js +119 -0
- package/dist/cli/health.js.map +1 -0
- package/dist/cli/init.d.ts +8 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +67 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/inspect.d.ts +8 -0
- package/dist/cli/inspect.d.ts.map +1 -0
- package/dist/cli/inspect.js +114 -0
- package/dist/cli/inspect.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +35 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/snapshot.d.ts +10 -0
- package/dist/cli/snapshot.d.ts.map +1 -0
- package/dist/cli/snapshot.js +61 -0
- package/dist/cli/snapshot.js.map +1 -0
- package/dist/cli/tb.d.ts +8 -0
- package/dist/cli/tb.d.ts.map +1 -0
- package/dist/cli/tb.js +43 -0
- package/dist/cli/tb.js.map +1 -0
- package/dist/cli/verify.d.ts +7 -0
- package/dist/cli/verify.d.ts.map +1 -0
- package/dist/cli/verify.js +32 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -0
- package/dist/detect.d.ts +18 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +49 -0
- package/dist/detect.js.map +1 -0
- package/dist/govern.d.ts +75 -0
- package/dist/govern.d.ts.map +1 -0
- package/dist/govern.js +581 -0
- package/dist/govern.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger/client.d.ts +89 -0
- package/dist/ledger/client.d.ts.map +1 -0
- package/dist/ledger/client.js +417 -0
- package/dist/ledger/client.js.map +1 -0
- package/dist/ledger/engine.d.ts +68 -0
- package/dist/ledger/engine.d.ts.map +1 -0
- package/dist/ledger/engine.js +142 -0
- package/dist/ledger/engine.js.map +1 -0
- package/dist/ledger/pricing.d.ts +35 -0
- package/dist/ledger/pricing.d.ts.map +1 -0
- package/dist/ledger/pricing.js +142 -0
- package/dist/ledger/pricing.js.map +1 -0
- package/dist/memory/patterns.d.ts +35 -0
- package/dist/memory/patterns.d.ts.map +1 -0
- package/dist/memory/patterns.js +152 -0
- package/dist/memory/patterns.js.map +1 -0
- package/dist/policy/decay.d.ts +95 -0
- package/dist/policy/decay.d.ts.map +1 -0
- package/dist/policy/decay.js +133 -0
- package/dist/policy/decay.js.map +1 -0
- package/dist/policy/default-rules.d.ts +21 -0
- package/dist/policy/default-rules.d.ts.map +1 -0
- package/dist/policy/default-rules.js +60 -0
- package/dist/policy/default-rules.js.map +1 -0
- package/dist/policy/gate.d.ts +116 -0
- package/dist/policy/gate.d.ts.map +1 -0
- package/dist/policy/gate.js +227 -0
- package/dist/policy/gate.js.map +1 -0
- package/dist/policy/pii.d.ts +28 -0
- package/dist/policy/pii.d.ts.map +1 -0
- package/dist/policy/pii.js +124 -0
- package/dist/policy/pii.js.map +1 -0
- package/dist/proxy.d.ts +33 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +36 -0
- package/dist/proxy.js.map +1 -0
- package/dist/resilience/circuit.d.ts +87 -0
- package/dist/resilience/circuit.d.ts.map +1 -0
- package/dist/resilience/circuit.js +167 -0
- package/dist/resilience/circuit.js.map +1 -0
- package/dist/resilience/scope.d.ts +97 -0
- package/dist/resilience/scope.d.ts.map +1 -0
- package/dist/resilience/scope.js +244 -0
- package/dist/resilience/scope.js.map +1 -0
- package/dist/shared/constants.d.ts +7 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +7 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/errors.d.ts +31 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +61 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/ids.d.ts +7 -0
- package/dist/shared/ids.d.ts.map +1 -0
- package/dist/shared/ids.js +31 -0
- package/dist/shared/ids.js.map +1 -0
- package/dist/shared/types.d.ts +162 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +41 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/snapshot/checkpoint.d.ts +22 -0
- package/dist/snapshot/checkpoint.d.ts.map +1 -0
- package/dist/snapshot/checkpoint.js +172 -0
- package/dist/snapshot/checkpoint.js.map +1 -0
- package/dist/streaming.d.ts +44 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +123 -0
- package/dist/streaming.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concerns.d.ts","sourceRoot":"","sources":["../../src/board/concerns.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAItE,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC5B,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,GAAG,IAAI,CAsBzE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,GAAG,IAAI,CAWhE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,GAAG,IAAI,CAiBlE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,GAAG,IAAI,CAuBtE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,GAAG,IAAI,CAczE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,GAAG,IAAI,CAW3E;AAcD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,EAAE,CAS/D"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Concern Detection Library
|
|
3
|
+
*
|
|
4
|
+
* 6 pure-function detectors for Board of Directors oversight.
|
|
5
|
+
* Each detector: (request) => Concern | null
|
|
6
|
+
*/
|
|
7
|
+
// ── Individual Detectors ──
|
|
8
|
+
/**
|
|
9
|
+
* Hallucination — absolute claims, factual assertions without evidence.
|
|
10
|
+
* Triggers on "always"/"never" overgeneralizations and policy overrides lacking justification.
|
|
11
|
+
*/
|
|
12
|
+
export function detectHallucination(request) {
|
|
13
|
+
const description = request.description.toLowerCase();
|
|
14
|
+
if (description.includes("always") || description.includes("never")) {
|
|
15
|
+
return {
|
|
16
|
+
type: "hallucination",
|
|
17
|
+
severity: "medium",
|
|
18
|
+
description: "Absolute claims detected - may be overgeneralization",
|
|
19
|
+
evidence: "Contains 'always' or 'never' statements",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (request.decisionType === "policy_override" && !request.context.justification) {
|
|
23
|
+
return {
|
|
24
|
+
type: "hallucination",
|
|
25
|
+
severity: "high",
|
|
26
|
+
description: "Policy override without justification",
|
|
27
|
+
evidence: "Missing justification field in context",
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Bias — preferential routing, demographic skew.
|
|
34
|
+
* Triggers when a preferred worker is specified during scope expansion.
|
|
35
|
+
*/
|
|
36
|
+
export function detectBias(request) {
|
|
37
|
+
if (request.context.preferredWorker && request.decisionType === "scope_expansion") {
|
|
38
|
+
return {
|
|
39
|
+
type: "bias",
|
|
40
|
+
severity: "medium",
|
|
41
|
+
description: "Potential worker preference bias in scope assignment",
|
|
42
|
+
evidence: `Preferred worker: ${request.context.preferredWorker}`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Safety — credentials in scope, dangerous content.
|
|
49
|
+
* Scans scope paths and description for security-sensitive patterns.
|
|
50
|
+
*/
|
|
51
|
+
export function detectSafety(request) {
|
|
52
|
+
const sensitivePatterns = ["password", "credential", "secret", "token", "key"];
|
|
53
|
+
const scopeStr = (request.scope ?? []).join(" ").toLowerCase();
|
|
54
|
+
const description = request.description.toLowerCase();
|
|
55
|
+
for (const pattern of sensitivePatterns) {
|
|
56
|
+
if (scopeStr.includes(pattern) || description.includes(pattern)) {
|
|
57
|
+
return {
|
|
58
|
+
type: "safety",
|
|
59
|
+
severity: "high",
|
|
60
|
+
description: `Security-sensitive operation: ${pattern}`,
|
|
61
|
+
evidence: `Pattern '${pattern}' found in scope or description`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Scope creep — root wildcards, unbounded scope.
|
|
69
|
+
* Triggers on root-level ** wildcards or excessive scope breadth (>10 patterns).
|
|
70
|
+
*/
|
|
71
|
+
export function detectScopeCreep(request) {
|
|
72
|
+
const scope = request.scope ?? [];
|
|
73
|
+
// Root-level ** wildcard (not scoped under a directory)
|
|
74
|
+
if (scope.some((s) => s.includes("**") && !s.includes("/"))) {
|
|
75
|
+
return {
|
|
76
|
+
type: "scope_creep",
|
|
77
|
+
severity: "medium",
|
|
78
|
+
description: "Overly broad scope pattern detected",
|
|
79
|
+
evidence: "Contains root-level ** wildcard",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (scope.length > 10) {
|
|
83
|
+
return {
|
|
84
|
+
type: "scope_creep",
|
|
85
|
+
severity: "high",
|
|
86
|
+
description: "Excessive scope breadth",
|
|
87
|
+
evidence: `${scope.length} scope patterns`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Resource abuse — cost exceeds threshold, excessive token usage.
|
|
94
|
+
* Triggers when estimated cost exceeds $100 on resource-intensive operations.
|
|
95
|
+
*/
|
|
96
|
+
export function detectResourceAbuse(request) {
|
|
97
|
+
if (request.decisionType === "resource_intensive") {
|
|
98
|
+
const estimatedCost = request.context.estimatedCost;
|
|
99
|
+
if (estimatedCost !== undefined && estimatedCost > 100) {
|
|
100
|
+
return {
|
|
101
|
+
type: "resource_abuse",
|
|
102
|
+
severity: "high",
|
|
103
|
+
description: "High resource cost operation",
|
|
104
|
+
evidence: `Estimated cost: $${estimatedCost}`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Policy violation — explicit policy override attempts.
|
|
112
|
+
* Triggers on any policy_override decision type.
|
|
113
|
+
*/
|
|
114
|
+
export function detectPolicyViolation(request) {
|
|
115
|
+
if (request.decisionType === "policy_override") {
|
|
116
|
+
return {
|
|
117
|
+
type: "policy_violation",
|
|
118
|
+
severity: "medium",
|
|
119
|
+
description: "Policy override requested",
|
|
120
|
+
evidence: "Explicit policy override decision type",
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
// ── Aggregate Detector ──
|
|
126
|
+
/** All individual detectors in order. */
|
|
127
|
+
const ALL_DETECTORS = [
|
|
128
|
+
detectHallucination,
|
|
129
|
+
detectBias,
|
|
130
|
+
detectSafety,
|
|
131
|
+
detectScopeCreep,
|
|
132
|
+
detectResourceAbuse,
|
|
133
|
+
detectPolicyViolation,
|
|
134
|
+
];
|
|
135
|
+
/**
|
|
136
|
+
* Run all concern detectors against a request.
|
|
137
|
+
* Returns every concern found (zero or more).
|
|
138
|
+
*/
|
|
139
|
+
export function detectConcerns(request) {
|
|
140
|
+
const concerns = [];
|
|
141
|
+
for (const detect of ALL_DETECTORS) {
|
|
142
|
+
const concern = detect(request);
|
|
143
|
+
if (concern) {
|
|
144
|
+
concerns.push(concern);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return concerns;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=concerns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concerns.js","sourceRoot":"","sources":["../../src/board/concerns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Board Director — Heuristic Concern Review
|
|
3
|
+
*
|
|
4
|
+
* Each Director independently reviews decisions using the concern
|
|
5
|
+
* detection library. No LLM calls — pure heuristic pattern matching.
|
|
6
|
+
*
|
|
7
|
+
* Two default Directors with complementary focus areas:
|
|
8
|
+
* Alpha: hallucination, safety, policy_violation
|
|
9
|
+
* Beta: bias, scope_creep, resource_abuse
|
|
10
|
+
*/
|
|
11
|
+
import type { ConcernType, DirectorVote, PolicySeverity } from "../shared/types.js";
|
|
12
|
+
import type { BoardRequest, Concern } from "./concerns.js";
|
|
13
|
+
export interface DirectorConfig {
|
|
14
|
+
/** Director ID */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Director name for display */
|
|
17
|
+
name: string;
|
|
18
|
+
/** Review focus areas */
|
|
19
|
+
focusAreas: ConcernType[];
|
|
20
|
+
/** Veto threshold — concerns at or above this severity trigger veto */
|
|
21
|
+
vetoThreshold: PolicySeverity;
|
|
22
|
+
}
|
|
23
|
+
export interface DirectorReview {
|
|
24
|
+
directorId: string;
|
|
25
|
+
vote: DirectorVote;
|
|
26
|
+
reasoning: string;
|
|
27
|
+
concerns: Concern[];
|
|
28
|
+
/** Confidence 0-1 (lower with more concerns) */
|
|
29
|
+
confidence: number;
|
|
30
|
+
reviewedAt: string;
|
|
31
|
+
}
|
|
32
|
+
export declare const DIRECTOR_CONFIGS: Record<string, DirectorConfig>;
|
|
33
|
+
/**
|
|
34
|
+
* Determine vote based on concern severities relative to the veto threshold.
|
|
35
|
+
*/
|
|
36
|
+
export declare function determineVote(concerns: Concern[], vetoThreshold: PolicySeverity): DirectorVote;
|
|
37
|
+
/**
|
|
38
|
+
* A Director reviews a request independently.
|
|
39
|
+
*/
|
|
40
|
+
export declare function reviewDecision(directorId: string, request: BoardRequest): DirectorReview;
|
|
41
|
+
/**
|
|
42
|
+
* Get Director configuration by ID.
|
|
43
|
+
*/
|
|
44
|
+
export declare function getDirectorConfig(directorId: string): DirectorConfig | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* List all Directors.
|
|
47
|
+
*/
|
|
48
|
+
export declare function listDirectors(): DirectorConfig[];
|
|
49
|
+
//# sourceMappingURL=director.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"director.d.ts","sourceRoot":"","sources":["../../src/board/director.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAY3D,MAAM,WAAW,cAAc;IAC9B,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,uEAAuE;IACvE,aAAa,EAAE,cAAc,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB;AAID,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAa3D,CAAC;AAwCF;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,cAAc,GAAG,YAAY,CAc9F;AA0BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,cAAc,CAmBxF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEhF;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,cAAc,EAAE,CAEhD"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Board Director — Heuristic Concern Review
|
|
3
|
+
*
|
|
4
|
+
* Each Director independently reviews decisions using the concern
|
|
5
|
+
* detection library. No LLM calls — pure heuristic pattern matching.
|
|
6
|
+
*
|
|
7
|
+
* Two default Directors with complementary focus areas:
|
|
8
|
+
* Alpha: hallucination, safety, policy_violation
|
|
9
|
+
* Beta: bias, scope_creep, resource_abuse
|
|
10
|
+
*/
|
|
11
|
+
import { detectBias, detectHallucination, detectPolicyViolation, detectResourceAbuse, detectSafety, detectScopeCreep, } from "./concerns.js";
|
|
12
|
+
// ── Default Configurations ──
|
|
13
|
+
export const DIRECTOR_CONFIGS = {
|
|
14
|
+
"director-a": {
|
|
15
|
+
id: "director-a",
|
|
16
|
+
name: "Director Alpha",
|
|
17
|
+
focusAreas: ["hallucination", "safety", "policy_violation"],
|
|
18
|
+
vetoThreshold: "high",
|
|
19
|
+
},
|
|
20
|
+
"director-b": {
|
|
21
|
+
id: "director-b",
|
|
22
|
+
name: "Director Beta",
|
|
23
|
+
focusAreas: ["bias", "scope_creep", "resource_abuse"],
|
|
24
|
+
vetoThreshold: "high",
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
// ── Concern routing by type ──
|
|
28
|
+
const DETECTOR_BY_TYPE = {
|
|
29
|
+
hallucination: detectHallucination,
|
|
30
|
+
bias: detectBias,
|
|
31
|
+
safety: detectSafety,
|
|
32
|
+
scope_creep: detectScopeCreep,
|
|
33
|
+
resource_abuse: detectResourceAbuse,
|
|
34
|
+
policy_violation: detectPolicyViolation,
|
|
35
|
+
};
|
|
36
|
+
// ── Severity ranking ──
|
|
37
|
+
const SEVERITY_RANK = {
|
|
38
|
+
info: 0,
|
|
39
|
+
low: 1,
|
|
40
|
+
medium: 2,
|
|
41
|
+
high: 3,
|
|
42
|
+
critical: 4,
|
|
43
|
+
};
|
|
44
|
+
// ── Core Logic ──
|
|
45
|
+
/**
|
|
46
|
+
* Detect concerns scoped to a Director's focus areas.
|
|
47
|
+
*/
|
|
48
|
+
function detectForDirector(request, focusAreas) {
|
|
49
|
+
const concerns = [];
|
|
50
|
+
for (const area of focusAreas) {
|
|
51
|
+
const detector = DETECTOR_BY_TYPE[area];
|
|
52
|
+
const concern = detector(request);
|
|
53
|
+
if (concern) {
|
|
54
|
+
concerns.push(concern);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return concerns;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Determine vote based on concern severities relative to the veto threshold.
|
|
61
|
+
*/
|
|
62
|
+
export function determineVote(concerns, vetoThreshold) {
|
|
63
|
+
const thresholdRank = SEVERITY_RANK[vetoThreshold];
|
|
64
|
+
for (const concern of concerns) {
|
|
65
|
+
if (SEVERITY_RANK[concern.severity] >= thresholdRank) {
|
|
66
|
+
return "veto";
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (concerns.some((c) => c.severity === "medium")) {
|
|
70
|
+
return "abstain";
|
|
71
|
+
}
|
|
72
|
+
return "approve";
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate human-readable reasoning from vote and concerns.
|
|
76
|
+
*/
|
|
77
|
+
function generateReasoning(vote, concerns, request) {
|
|
78
|
+
if (concerns.length === 0) {
|
|
79
|
+
return `Approved: No concerns detected for ${request.decisionType} decision.`;
|
|
80
|
+
}
|
|
81
|
+
const summary = concerns
|
|
82
|
+
.map((c) => `[${c.severity.toUpperCase()}] ${c.type}: ${c.description}`)
|
|
83
|
+
.join("; ");
|
|
84
|
+
switch (vote) {
|
|
85
|
+
case "veto":
|
|
86
|
+
return `VETO: Critical concerns detected. ${summary}`;
|
|
87
|
+
case "abstain":
|
|
88
|
+
return `ABSTAIN: Moderate concerns require attention. ${summary}`;
|
|
89
|
+
case "approve":
|
|
90
|
+
return `Approved with minor notes: ${summary}`;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// ── Public API ──
|
|
94
|
+
/**
|
|
95
|
+
* A Director reviews a request independently.
|
|
96
|
+
*/
|
|
97
|
+
export function reviewDecision(directorId, request) {
|
|
98
|
+
const config = DIRECTOR_CONFIGS[directorId];
|
|
99
|
+
if (!config) {
|
|
100
|
+
throw new Error(`Unknown director: ${directorId}`);
|
|
101
|
+
}
|
|
102
|
+
const concerns = detectForDirector(request, config.focusAreas);
|
|
103
|
+
const vote = determineVote(concerns, config.vetoThreshold);
|
|
104
|
+
const reasoning = generateReasoning(vote, concerns, request);
|
|
105
|
+
const confidence = Math.max(0.5, 1 - concerns.length * 0.15);
|
|
106
|
+
return {
|
|
107
|
+
directorId,
|
|
108
|
+
vote,
|
|
109
|
+
reasoning,
|
|
110
|
+
concerns,
|
|
111
|
+
confidence,
|
|
112
|
+
reviewedAt: new Date().toISOString(),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get Director configuration by ID.
|
|
117
|
+
*/
|
|
118
|
+
export function getDirectorConfig(directorId) {
|
|
119
|
+
return DIRECTOR_CONFIGS[directorId];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* List all Directors.
|
|
123
|
+
*/
|
|
124
|
+
export function listDirectors() {
|
|
125
|
+
return Object.values(DIRECTOR_CONFIGS);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=director.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"director.js","sourceRoot":"","sources":["../../src/board/director.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI: usertrust health — Show entropy diagnostics
|
|
3
|
+
*
|
|
4
|
+
* Uses entropy.ts to compute 6-signal health score from audit events.
|
|
5
|
+
* Displays per-signal breakdown with status indicators.
|
|
6
|
+
*/
|
|
7
|
+
export declare function run(rootDir?: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/cli/health.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6DH,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEzD"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI: usertrust health — Show entropy diagnostics
|
|
3
|
+
*
|
|
4
|
+
* Uses entropy.ts to compute 6-signal health score from audit events.
|
|
5
|
+
* Displays per-signal breakdown with status indicators.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { computeEntropyScore, } from "../audit/entropy.js";
|
|
10
|
+
import { verifyChain } from "../audit/verify.js";
|
|
11
|
+
import { VAULT_DIR } from "../shared/constants.js";
|
|
12
|
+
function loadEvents(vaultPath) {
|
|
13
|
+
const logPath = join(vaultPath, "audit", "events.jsonl");
|
|
14
|
+
if (!existsSync(logPath))
|
|
15
|
+
return [];
|
|
16
|
+
try {
|
|
17
|
+
const content = readFileSync(logPath, "utf-8").trim();
|
|
18
|
+
if (!content)
|
|
19
|
+
return [];
|
|
20
|
+
return content
|
|
21
|
+
.split("\n")
|
|
22
|
+
.filter((l) => l.trim())
|
|
23
|
+
.map((line) => JSON.parse(line));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function loadConfig(vaultPath) {
|
|
30
|
+
const configPath = join(vaultPath, "usertrust.config.json");
|
|
31
|
+
if (!existsSync(configPath))
|
|
32
|
+
return { budget: 0 };
|
|
33
|
+
try {
|
|
34
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
35
|
+
const config = JSON.parse(raw);
|
|
36
|
+
return { budget: typeof config.budget === "number" ? config.budget : 0 };
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return { budget: 0 };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function levelLabel(level) {
|
|
43
|
+
switch (level) {
|
|
44
|
+
case "low":
|
|
45
|
+
return "healthy";
|
|
46
|
+
case "elevated":
|
|
47
|
+
return "elevated";
|
|
48
|
+
case "critical":
|
|
49
|
+
return "critical";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function statusTag(value, hits) {
|
|
53
|
+
if (hits === 0)
|
|
54
|
+
return "[ok]";
|
|
55
|
+
if (value < 0.3)
|
|
56
|
+
return "[low]";
|
|
57
|
+
if (value < 0.6)
|
|
58
|
+
return "[elevated]";
|
|
59
|
+
return "[critical]";
|
|
60
|
+
}
|
|
61
|
+
export async function run(rootDir) {
|
|
62
|
+
const root = rootDir ?? process.cwd();
|
|
63
|
+
const vaultPath = join(root, VAULT_DIR);
|
|
64
|
+
if (!existsSync(vaultPath)) {
|
|
65
|
+
console.log("No governance vault found. Run `usertrust init` first.");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const events = loadEvents(vaultPath);
|
|
69
|
+
const config = loadConfig(vaultPath);
|
|
70
|
+
// Convert audit events to entropy event inputs
|
|
71
|
+
const entropyEvents = events.map((e) => ({
|
|
72
|
+
kind: e.kind,
|
|
73
|
+
data: e.data,
|
|
74
|
+
}));
|
|
75
|
+
const report = computeEntropyScore(entropyEvents);
|
|
76
|
+
// Verify chain integrity directly
|
|
77
|
+
const logPath = join(vaultPath, "audit", "events.jsonl");
|
|
78
|
+
const verification = verifyChain(logPath);
|
|
79
|
+
const chainLabel = verification.valid ? "verified" : "FAILED";
|
|
80
|
+
const chainStatus = verification.valid ? "[ok]" : "[critical]";
|
|
81
|
+
// Compute budget utilization percentage
|
|
82
|
+
let spent = 0;
|
|
83
|
+
for (const e of events) {
|
|
84
|
+
if (e.kind !== "llm_call")
|
|
85
|
+
continue;
|
|
86
|
+
const cost = e.data.cost;
|
|
87
|
+
if (typeof cost === "number") {
|
|
88
|
+
spent += cost;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const budgetPct = config.budget > 0 ? ((spent / config.budget) * 100).toFixed(1) : "0.0";
|
|
92
|
+
console.log(`Entropy score: ${report.score}/100 (${levelLabel(report.level)})`);
|
|
93
|
+
// Signal 1: Policy violations
|
|
94
|
+
const policySignal = report.signals.find((s) => s.condition === "policy_violations");
|
|
95
|
+
const policyHits = policySignal?.hits ?? 0;
|
|
96
|
+
const policyStatus = statusTag(policySignal?.value ?? 0, policyHits);
|
|
97
|
+
console.log(` Policy violations (30d): ${policyHits} ${policyStatus}`);
|
|
98
|
+
// Signal 2: Budget utilization
|
|
99
|
+
const budgetStatus = Number.parseFloat(budgetPct) > 80 ? "[elevated]" : "[ok]";
|
|
100
|
+
console.log(` Budget utilization: ${budgetPct}% ${budgetStatus}`);
|
|
101
|
+
// Signal 3: Chain integrity
|
|
102
|
+
console.log(` Chain integrity: ${chainLabel} ${chainStatus}`);
|
|
103
|
+
// Signal 4: PII detections
|
|
104
|
+
const piiSignal = report.signals.find((s) => s.condition === "pii_detections");
|
|
105
|
+
const piiHits = piiSignal?.hits ?? 0;
|
|
106
|
+
const piiStatus = statusTag(piiSignal?.value ?? 0, piiHits);
|
|
107
|
+
console.log(` PII detections (30d): ${piiHits} ${piiStatus}`);
|
|
108
|
+
// Signal 5: Circuit breaker trips
|
|
109
|
+
const cbSignal = report.signals.find((s) => s.condition === "circuit_breaker_trips");
|
|
110
|
+
const cbHits = cbSignal?.hits ?? 0;
|
|
111
|
+
const cbStatus = statusTag(cbSignal?.value ?? 0, cbHits);
|
|
112
|
+
console.log(` Circuit breaker trips: ${cbHits} ${cbStatus}`);
|
|
113
|
+
// Signal 6: Pattern memory hits
|
|
114
|
+
const pmSignal = report.signals.find((s) => s.condition === "pattern_memory_hits");
|
|
115
|
+
const pmHits = pmSignal?.hits ?? 0;
|
|
116
|
+
const pmStatus = statusTag(pmSignal?.value ?? 0, pmHits);
|
|
117
|
+
console.log(` Pattern memory hits: ${pmHits} ${pmStatus}`);
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/cli/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI: usertrust init — Initialize governance vault
|
|
3
|
+
*
|
|
4
|
+
* Creates the .usertrust/ directory structure with default config,
|
|
5
|
+
* policy, and .gitignore. Sets permissions to 700 (owner only).
|
|
6
|
+
*/
|
|
7
|
+
export declare function run(rootDir?: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0CH,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCzD"}
|
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI: usertrust init — Initialize governance vault
|
|
3
|
+
*
|
|
4
|
+
* Creates the .usertrust/ directory structure with default config,
|
|
5
|
+
* policy, and .gitignore. Sets permissions to 700 (owner only).
|
|
6
|
+
*/
|
|
7
|
+
import { chmodSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { VAULT_DIR } from "../shared/constants.js";
|
|
10
|
+
const DEFAULT_CONFIG = {
|
|
11
|
+
budget: 50000,
|
|
12
|
+
tier: "mini",
|
|
13
|
+
policies: "./policies/default.yml",
|
|
14
|
+
pii: "warn",
|
|
15
|
+
board: { enabled: false, vetoThreshold: "high" },
|
|
16
|
+
circuitBreaker: { failureThreshold: 5, resetTimeout: 60000 },
|
|
17
|
+
patterns: { enabled: true, feedProxy: false },
|
|
18
|
+
audit: { rotation: "daily", indexLimit: 10000 },
|
|
19
|
+
};
|
|
20
|
+
const DEFAULT_POLICY = `rules:
|
|
21
|
+
- name: block-zero-budget
|
|
22
|
+
effect: deny
|
|
23
|
+
enforcement: hard
|
|
24
|
+
conditions:
|
|
25
|
+
- field: budget_remaining
|
|
26
|
+
operator: lte
|
|
27
|
+
value: 0
|
|
28
|
+
|
|
29
|
+
- name: warn-high-cost
|
|
30
|
+
effect: warn
|
|
31
|
+
enforcement: soft
|
|
32
|
+
conditions:
|
|
33
|
+
- field: estimated_cost
|
|
34
|
+
operator: gt
|
|
35
|
+
value: 1000
|
|
36
|
+
`;
|
|
37
|
+
const GITIGNORE = `tigerbeetle/
|
|
38
|
+
*.tigerbeetle
|
|
39
|
+
dlq/
|
|
40
|
+
`;
|
|
41
|
+
const SUBDIRS = ["audit", "policies", "patterns", "snapshots", "board", "dlq"];
|
|
42
|
+
export async function run(rootDir) {
|
|
43
|
+
const root = rootDir ?? process.cwd();
|
|
44
|
+
const vaultPath = join(root, VAULT_DIR);
|
|
45
|
+
if (existsSync(vaultPath)) {
|
|
46
|
+
console.log(`Vault already exists at ${vaultPath}`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Create directory structure
|
|
50
|
+
mkdirSync(vaultPath, { recursive: true });
|
|
51
|
+
for (const sub of SUBDIRS) {
|
|
52
|
+
mkdirSync(join(vaultPath, sub), { recursive: true });
|
|
53
|
+
}
|
|
54
|
+
// Write default config
|
|
55
|
+
writeFileSync(join(vaultPath, "usertrust.config.json"), JSON.stringify(DEFAULT_CONFIG, null, "\t"), "utf-8");
|
|
56
|
+
// Write default policy
|
|
57
|
+
writeFileSync(join(vaultPath, "policies", "default.yml"), DEFAULT_POLICY, "utf-8");
|
|
58
|
+
// Write .gitignore
|
|
59
|
+
writeFileSync(join(vaultPath, ".gitignore"), GITIGNORE, "utf-8");
|
|
60
|
+
// Set vault permissions to 700 (owner only)
|
|
61
|
+
chmodSync(vaultPath, 0o700);
|
|
62
|
+
console.log(`Initialized governance vault at ${vaultPath}`);
|
|
63
|
+
console.log(" Created: audit/, policies/, patterns/, snapshots/, board/, dlq/");
|
|
64
|
+
console.log(" Config: usertrust.config.json");
|
|
65
|
+
console.log(" Policy: policies/default.yml");
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,cAAc,GAAG;IACtB,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,wBAAwB;IAClC,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE;IAChD,cAAc,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE;IAC5D,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;IAC7C,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE;CAC/C,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;CAgBtB,CAAC;AAEF,MAAM,SAAS,GAAG;;;CAGjB,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AAExF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAgB;IACzC,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAExC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;QACpD,OAAO;IACR,CAAC;IAED,6BAA6B;IAC7B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,uBAAuB;IACvB,aAAa,CACZ,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,EACxC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,EAC1C,OAAO,CACP,CAAC;IAEF,uBAAuB;IACvB,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEnF,mBAAmB;IACnB,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAEjE,4CAA4C;IAC5C,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI: usertrust inspect — Show governance bank statement
|
|
3
|
+
*
|
|
4
|
+
* Reads vault state and displays balance, audit chain stats,
|
|
5
|
+
* recent transactions, and Merkle root in a formatted table.
|
|
6
|
+
*/
|
|
7
|
+
export declare function run(rootDir?: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/cli/inspect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqEH,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DzD"}
|