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.
Files changed (149) hide show
  1. package/dist/audit/canonical.d.ts +7 -0
  2. package/dist/audit/canonical.d.ts.map +1 -0
  3. package/dist/audit/canonical.js +24 -0
  4. package/dist/audit/canonical.js.map +1 -0
  5. package/dist/audit/chain.d.ts +33 -0
  6. package/dist/audit/chain.d.ts.map +1 -0
  7. package/dist/audit/chain.js +285 -0
  8. package/dist/audit/chain.js.map +1 -0
  9. package/dist/audit/entropy.d.ts +95 -0
  10. package/dist/audit/entropy.d.ts.map +1 -0
  11. package/dist/audit/entropy.js +229 -0
  12. package/dist/audit/entropy.js.map +1 -0
  13. package/dist/audit/merkle.d.ts +87 -0
  14. package/dist/audit/merkle.d.ts.map +1 -0
  15. package/dist/audit/merkle.js +315 -0
  16. package/dist/audit/merkle.js.map +1 -0
  17. package/dist/audit/rotation.d.ts +61 -0
  18. package/dist/audit/rotation.d.ts.map +1 -0
  19. package/dist/audit/rotation.js +160 -0
  20. package/dist/audit/rotation.js.map +1 -0
  21. package/dist/audit/verify.d.ts +20 -0
  22. package/dist/audit/verify.d.ts.map +1 -0
  23. package/dist/audit/verify.js +73 -0
  24. package/dist/audit/verify.js.map +1 -0
  25. package/dist/board/board.d.ts +67 -0
  26. package/dist/board/board.d.ts.map +1 -0
  27. package/dist/board/board.js +191 -0
  28. package/dist/board/board.js.map +1 -0
  29. package/dist/board/concerns.d.ts +59 -0
  30. package/dist/board/concerns.d.ts.map +1 -0
  31. package/dist/board/concerns.js +149 -0
  32. package/dist/board/concerns.js.map +1 -0
  33. package/dist/board/director.d.ts +49 -0
  34. package/dist/board/director.d.ts.map +1 -0
  35. package/dist/board/director.js +127 -0
  36. package/dist/board/director.js.map +1 -0
  37. package/dist/cli/health.d.ts +8 -0
  38. package/dist/cli/health.d.ts.map +1 -0
  39. package/dist/cli/health.js +119 -0
  40. package/dist/cli/health.js.map +1 -0
  41. package/dist/cli/init.d.ts +8 -0
  42. package/dist/cli/init.d.ts.map +1 -0
  43. package/dist/cli/init.js +67 -0
  44. package/dist/cli/init.js.map +1 -0
  45. package/dist/cli/inspect.d.ts +8 -0
  46. package/dist/cli/inspect.d.ts.map +1 -0
  47. package/dist/cli/inspect.js +114 -0
  48. package/dist/cli/inspect.js.map +1 -0
  49. package/dist/cli/main.d.ts +3 -0
  50. package/dist/cli/main.d.ts.map +1 -0
  51. package/dist/cli/main.js +35 -0
  52. package/dist/cli/main.js.map +1 -0
  53. package/dist/cli/snapshot.d.ts +10 -0
  54. package/dist/cli/snapshot.d.ts.map +1 -0
  55. package/dist/cli/snapshot.js +61 -0
  56. package/dist/cli/snapshot.js.map +1 -0
  57. package/dist/cli/tb.d.ts +8 -0
  58. package/dist/cli/tb.d.ts.map +1 -0
  59. package/dist/cli/tb.js +43 -0
  60. package/dist/cli/tb.js.map +1 -0
  61. package/dist/cli/verify.d.ts +7 -0
  62. package/dist/cli/verify.d.ts.map +1 -0
  63. package/dist/cli/verify.js +32 -0
  64. package/dist/cli/verify.js.map +1 -0
  65. package/dist/config.d.ts +12 -0
  66. package/dist/config.d.ts.map +1 -0
  67. package/dist/config.js +34 -0
  68. package/dist/config.js.map +1 -0
  69. package/dist/detect.d.ts +18 -0
  70. package/dist/detect.d.ts.map +1 -0
  71. package/dist/detect.js +49 -0
  72. package/dist/detect.js.map +1 -0
  73. package/dist/govern.d.ts +75 -0
  74. package/dist/govern.d.ts.map +1 -0
  75. package/dist/govern.js +581 -0
  76. package/dist/govern.js.map +1 -0
  77. package/dist/index.d.ts +6 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +8 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/ledger/client.d.ts +89 -0
  82. package/dist/ledger/client.d.ts.map +1 -0
  83. package/dist/ledger/client.js +417 -0
  84. package/dist/ledger/client.js.map +1 -0
  85. package/dist/ledger/engine.d.ts +68 -0
  86. package/dist/ledger/engine.d.ts.map +1 -0
  87. package/dist/ledger/engine.js +142 -0
  88. package/dist/ledger/engine.js.map +1 -0
  89. package/dist/ledger/pricing.d.ts +35 -0
  90. package/dist/ledger/pricing.d.ts.map +1 -0
  91. package/dist/ledger/pricing.js +142 -0
  92. package/dist/ledger/pricing.js.map +1 -0
  93. package/dist/memory/patterns.d.ts +35 -0
  94. package/dist/memory/patterns.d.ts.map +1 -0
  95. package/dist/memory/patterns.js +152 -0
  96. package/dist/memory/patterns.js.map +1 -0
  97. package/dist/policy/decay.d.ts +95 -0
  98. package/dist/policy/decay.d.ts.map +1 -0
  99. package/dist/policy/decay.js +133 -0
  100. package/dist/policy/decay.js.map +1 -0
  101. package/dist/policy/default-rules.d.ts +21 -0
  102. package/dist/policy/default-rules.d.ts.map +1 -0
  103. package/dist/policy/default-rules.js +60 -0
  104. package/dist/policy/default-rules.js.map +1 -0
  105. package/dist/policy/gate.d.ts +116 -0
  106. package/dist/policy/gate.d.ts.map +1 -0
  107. package/dist/policy/gate.js +227 -0
  108. package/dist/policy/gate.js.map +1 -0
  109. package/dist/policy/pii.d.ts +28 -0
  110. package/dist/policy/pii.d.ts.map +1 -0
  111. package/dist/policy/pii.js +124 -0
  112. package/dist/policy/pii.js.map +1 -0
  113. package/dist/proxy.d.ts +33 -0
  114. package/dist/proxy.d.ts.map +1 -0
  115. package/dist/proxy.js +36 -0
  116. package/dist/proxy.js.map +1 -0
  117. package/dist/resilience/circuit.d.ts +87 -0
  118. package/dist/resilience/circuit.d.ts.map +1 -0
  119. package/dist/resilience/circuit.js +167 -0
  120. package/dist/resilience/circuit.js.map +1 -0
  121. package/dist/resilience/scope.d.ts +97 -0
  122. package/dist/resilience/scope.d.ts.map +1 -0
  123. package/dist/resilience/scope.js +244 -0
  124. package/dist/resilience/scope.js.map +1 -0
  125. package/dist/shared/constants.d.ts +7 -0
  126. package/dist/shared/constants.d.ts.map +1 -0
  127. package/dist/shared/constants.js +7 -0
  128. package/dist/shared/constants.js.map +1 -0
  129. package/dist/shared/errors.d.ts +31 -0
  130. package/dist/shared/errors.d.ts.map +1 -0
  131. package/dist/shared/errors.js +61 -0
  132. package/dist/shared/errors.js.map +1 -0
  133. package/dist/shared/ids.d.ts +7 -0
  134. package/dist/shared/ids.d.ts.map +1 -0
  135. package/dist/shared/ids.js +31 -0
  136. package/dist/shared/ids.js.map +1 -0
  137. package/dist/shared/types.d.ts +162 -0
  138. package/dist/shared/types.d.ts.map +1 -0
  139. package/dist/shared/types.js +41 -0
  140. package/dist/shared/types.js.map +1 -0
  141. package/dist/snapshot/checkpoint.d.ts +22 -0
  142. package/dist/snapshot/checkpoint.d.ts.map +1 -0
  143. package/dist/snapshot/checkpoint.js +172 -0
  144. package/dist/snapshot/checkpoint.js.map +1 -0
  145. package/dist/streaming.d.ts +44 -0
  146. package/dist/streaming.d.ts.map +1 -0
  147. package/dist/streaming.js +123 -0
  148. package/dist/streaming.js.map +1 -0
  149. 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"}
@@ -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"}