evidential-protocol 2.0.0 → 3.0.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 (49) hide show
  1. package/dist/attestation.d.ts +80 -0
  2. package/dist/attestation.d.ts.map +1 -0
  3. package/dist/attestation.js +115 -0
  4. package/dist/attestation.js.map +1 -0
  5. package/dist/audit-ledger.d.ts +96 -0
  6. package/dist/audit-ledger.d.ts.map +1 -0
  7. package/dist/audit-ledger.js +152 -0
  8. package/dist/audit-ledger.js.map +1 -0
  9. package/dist/dormant.d.ts +59 -0
  10. package/dist/dormant.d.ts.map +1 -0
  11. package/dist/dormant.js +256 -0
  12. package/dist/dormant.js.map +1 -0
  13. package/dist/ergative.d.ts +75 -0
  14. package/dist/ergative.d.ts.map +1 -0
  15. package/dist/ergative.js +203 -0
  16. package/dist/ergative.js.map +1 -0
  17. package/dist/fingerprint.d.ts +126 -0
  18. package/dist/fingerprint.d.ts.map +1 -0
  19. package/dist/fingerprint.js +315 -0
  20. package/dist/fingerprint.js.map +1 -0
  21. package/dist/index.d.ts +14 -4
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +24 -3
  24. package/dist/index.js.map +1 -1
  25. package/dist/provenance.d.ts +101 -0
  26. package/dist/provenance.d.ts.map +1 -0
  27. package/dist/provenance.js +197 -0
  28. package/dist/provenance.js.map +1 -0
  29. package/dist/purity.d.ts +85 -0
  30. package/dist/purity.d.ts.map +1 -0
  31. package/dist/purity.js +124 -0
  32. package/dist/purity.js.map +1 -0
  33. package/dist/resilience.d.ts +63 -0
  34. package/dist/resilience.d.ts.map +1 -0
  35. package/dist/resilience.js +241 -0
  36. package/dist/resilience.js.map +1 -0
  37. package/dist/scoring.d.ts +87 -0
  38. package/dist/scoring.d.ts.map +1 -0
  39. package/dist/scoring.js +202 -0
  40. package/dist/scoring.js.map +1 -0
  41. package/dist/self-describing.d.ts +71 -0
  42. package/dist/self-describing.d.ts.map +1 -0
  43. package/dist/self-describing.js +153 -0
  44. package/dist/self-describing.js.map +1 -0
  45. package/dist/tests/kusunda.test.d.ts +2 -0
  46. package/dist/tests/kusunda.test.d.ts.map +1 -0
  47. package/dist/tests/kusunda.test.js +342 -0
  48. package/dist/tests/kusunda.test.js.map +1 -0
  49. package/package.json +49 -3
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Dormant Asset Scanner — Kusunda Rediscovery
3
+ *
4
+ * Language isolates like Kusunda were "rediscovered" after being
5
+ * presumed extinct. This module scores repositories and digital
6
+ * assets for hidden value — dormant projects that deserve revival
7
+ * vs. those ready for the archive.
8
+ */
9
+ /** Languages considered high-value for the value scoring axis. */
10
+ const POPULAR_LANGUAGES = new Set([
11
+ "TypeScript", "Rust", "Python", "Go", "JavaScript",
12
+ "Java", "C#", "Swift", "Kotlin", "Ruby",
13
+ ]);
14
+ /** Maximum days of inactivity mapped to dormancy 1.0. */
15
+ const MAX_DORMANCY_DAYS = 365;
16
+ /**
17
+ * Scans a collection of asset profiles and scores them on two axes:
18
+ * dormancy (how inactive) and value (how potentially useful).
19
+ */
20
+ export class DormantScanner {
21
+ assets = new Map();
22
+ /** Register an asset for scanning. */
23
+ addAsset(profile) {
24
+ this.assets.set(profile.id, profile);
25
+ }
26
+ /** Score a single asset by ID. */
27
+ score(assetId) {
28
+ const asset = this.assets.get(assetId);
29
+ if (!asset) {
30
+ return {
31
+ asset_id: assetId,
32
+ dormancy_score: 1,
33
+ value_score: 0,
34
+ recommendation: "archive",
35
+ reasons: ["Asset not found in scanner."],
36
+ };
37
+ }
38
+ return this.computeScore(asset);
39
+ }
40
+ /** Score all registered assets. */
41
+ scoreAll() {
42
+ return [...this.assets.values()].map((a) => this.computeScore(a));
43
+ }
44
+ /** Return unpublished assets with value_score > 0.5. */
45
+ getPublishable() {
46
+ return this.scoreAll().filter((s) => {
47
+ const asset = this.assets.get(s.asset_id);
48
+ return asset && asset.publishable && !asset.published && s.value_score > 0.5;
49
+ });
50
+ }
51
+ /** Return dormant assets worth reviving (high value despite dormancy). */
52
+ getRevivable() {
53
+ return this.scoreAll().filter((s) => s.recommendation === "revive");
54
+ }
55
+ /** Return truly dead assets recommended for archival. */
56
+ getArchivable() {
57
+ return this.scoreAll().filter((s) => s.recommendation === "archive");
58
+ }
59
+ /** Generate a Markdown summary report of all assets. */
60
+ generateReport() {
61
+ const scores = this.scoreAll();
62
+ const lines = [];
63
+ lines.push("# Dormant Asset Report");
64
+ lines.push("");
65
+ lines.push(`Generated: ${new Date().toISOString()}`);
66
+ lines.push(`Total assets scanned: ${scores.length}`);
67
+ lines.push("");
68
+ const groups = {
69
+ publish: [],
70
+ revive: [],
71
+ maintain: [],
72
+ investigate: [],
73
+ archive: [],
74
+ };
75
+ for (const s of scores) {
76
+ groups[s.recommendation].push(s);
77
+ }
78
+ lines.push("## Summary");
79
+ lines.push("");
80
+ lines.push(`| Recommendation | Count |`);
81
+ lines.push(`|----------------|-------|`);
82
+ for (const [rec, list] of Object.entries(groups)) {
83
+ if (list.length > 0) {
84
+ lines.push(`| ${rec} | ${list.length} |`);
85
+ }
86
+ }
87
+ lines.push("");
88
+ if (groups.publish.length > 0) {
89
+ lines.push("## Ready to Publish");
90
+ lines.push("");
91
+ lines.push("High-value unpublished assets that should be released.");
92
+ lines.push("");
93
+ for (const s of groups.publish) {
94
+ const asset = this.assets.get(s.asset_id);
95
+ lines.push(`### ${asset?.name ?? s.asset_id}`);
96
+ lines.push(`- Value: ${(s.value_score * 100).toFixed(0)}%`);
97
+ lines.push(`- Dormancy: ${(s.dormancy_score * 100).toFixed(0)}%`);
98
+ lines.push(`- Language: ${asset?.language ?? "unknown"}`);
99
+ for (const r of s.reasons) {
100
+ lines.push(`- ${r}`);
101
+ }
102
+ lines.push("");
103
+ }
104
+ }
105
+ if (groups.revive.length > 0) {
106
+ lines.push("## Worth Reviving");
107
+ lines.push("");
108
+ lines.push("Dormant but valuable — invest time to bring these back.");
109
+ lines.push("");
110
+ for (const s of groups.revive) {
111
+ const asset = this.assets.get(s.asset_id);
112
+ lines.push(`### ${asset?.name ?? s.asset_id}`);
113
+ lines.push(`- Value: ${(s.value_score * 100).toFixed(0)}%`);
114
+ lines.push(`- Dormancy: ${(s.dormancy_score * 100).toFixed(0)}%`);
115
+ for (const r of s.reasons) {
116
+ lines.push(`- ${r}`);
117
+ }
118
+ lines.push("");
119
+ }
120
+ }
121
+ if (groups.archive.length > 0) {
122
+ lines.push("## Archive Candidates");
123
+ lines.push("");
124
+ for (const s of groups.archive) {
125
+ const asset = this.assets.get(s.asset_id);
126
+ lines.push(`- **${asset?.name ?? s.asset_id}** — dormancy ${(s.dormancy_score * 100).toFixed(0)}%, value ${(s.value_score * 100).toFixed(0)}%`);
127
+ }
128
+ lines.push("");
129
+ }
130
+ if (groups.investigate.length > 0) {
131
+ lines.push("## Needs Investigation");
132
+ lines.push("");
133
+ for (const s of groups.investigate) {
134
+ const asset = this.assets.get(s.asset_id);
135
+ lines.push(`- **${asset?.name ?? s.asset_id}** — ${s.reasons.join("; ")}`);
136
+ }
137
+ lines.push("");
138
+ }
139
+ return lines.join("\n");
140
+ }
141
+ /** Compute dormancy and value scores for a single asset. */
142
+ computeScore(asset) {
143
+ const reasons = [];
144
+ // --- Dormancy Score (0 = active, 1 = fully dormant) ---
145
+ let dormancy = 0;
146
+ // Days since last commit: 0-365 -> 0-1
147
+ if (asset.last_commit) {
148
+ const daysSinceCommit = this.daysSince(asset.last_commit);
149
+ dormancy += Math.min(daysSinceCommit / MAX_DORMANCY_DAYS, 1) * 0.4;
150
+ if (daysSinceCommit > 180) {
151
+ reasons.push(`No commits in ${Math.floor(daysSinceCommit)} days.`);
152
+ }
153
+ }
154
+ else {
155
+ dormancy += 0.4;
156
+ reasons.push("No commit history available.");
157
+ }
158
+ // No CI adds dormancy
159
+ if (!asset.has_ci) {
160
+ dormancy += 0.2;
161
+ reasons.push("No CI pipeline configured.");
162
+ }
163
+ // No tests adds dormancy
164
+ if (!asset.has_tests) {
165
+ dormancy += 0.15;
166
+ reasons.push("No test suite found.");
167
+ }
168
+ // No recent publish
169
+ if (asset.last_publish) {
170
+ const daysSincePublish = this.daysSince(asset.last_publish);
171
+ dormancy += Math.min(daysSincePublish / MAX_DORMANCY_DAYS, 1) * 0.15;
172
+ }
173
+ else if (asset.publishable) {
174
+ dormancy += 0.15;
175
+ reasons.push("Publishable but never published.");
176
+ }
177
+ // Published and active reduces dormancy
178
+ if (asset.published) {
179
+ dormancy *= 0.7;
180
+ }
181
+ dormancy = clamp(dormancy, 0, 1);
182
+ // --- Value Score (0 = low value, 1 = high value) ---
183
+ let value = 0;
184
+ if (asset.has_readme) {
185
+ value += 0.2;
186
+ }
187
+ else {
188
+ reasons.push("Missing README.");
189
+ }
190
+ if (asset.has_tests) {
191
+ value += 0.2;
192
+ }
193
+ if (asset.dependencies_count > 0) {
194
+ // More deps suggests more substantial code, diminishing returns
195
+ value += Math.min(asset.dependencies_count / 20, 1) * 0.2;
196
+ }
197
+ if (asset.publishable) {
198
+ value += 0.15;
199
+ if (!asset.published) {
200
+ reasons.push("Publishable but not yet published — potential value unlock.");
201
+ }
202
+ }
203
+ if (asset.language && POPULAR_LANGUAGES.has(asset.language)) {
204
+ value += 0.15;
205
+ }
206
+ if (asset.has_ci) {
207
+ value += 0.1;
208
+ }
209
+ value = clamp(value, 0, 1);
210
+ // --- Recommendation ---
211
+ const recommendation = this.recommend(dormancy, value, asset);
212
+ return {
213
+ asset_id: asset.id,
214
+ dormancy_score: round3(dormancy),
215
+ value_score: round3(value),
216
+ recommendation,
217
+ reasons,
218
+ };
219
+ }
220
+ /** Determine the recommendation based on dormancy/value quadrant. */
221
+ recommend(dormancy, value, asset) {
222
+ // High value, publishable, not yet published
223
+ if (value > 0.5 && asset.publishable && !asset.published) {
224
+ return "publish";
225
+ }
226
+ // Low dormancy, decent value — just keep maintaining
227
+ if (dormancy < 0.3 && value > 0.3) {
228
+ return "maintain";
229
+ }
230
+ // High dormancy, high value — worth reviving
231
+ if (dormancy > 0.5 && value > 0.4) {
232
+ return "revive";
233
+ }
234
+ // High dormancy, low value — archive it
235
+ if (dormancy > 0.6 && value < 0.3) {
236
+ return "archive";
237
+ }
238
+ // Everything else needs a closer look
239
+ return "investigate";
240
+ }
241
+ /** Calculate days between a date string and now. */
242
+ daysSince(isoDate) {
243
+ const then = new Date(isoDate).getTime();
244
+ const now = Date.now();
245
+ return Math.max(0, (now - then) / (24 * 60 * 60 * 1000));
246
+ }
247
+ }
248
+ /** Clamp a number between min and max. */
249
+ function clamp(n, min, max) {
250
+ return Math.max(min, Math.min(max, n));
251
+ }
252
+ /** Round to 3 decimal places. */
253
+ function round3(n) {
254
+ return Math.round(n * 1000) / 1000;
255
+ }
256
+ //# sourceMappingURL=dormant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dormant.js","sourceRoot":"","sources":["../src/dormant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Ergative Permission Model (Kusunda ergative alignment)
3
+ *
4
+ * Agents that READ state get structurally different access than agents
5
+ * that WRITE state. Inspired by Kusunda's ergative-absolutive grammar:
6
+ * the agent of a transitive verb (writer) is marked differently from
7
+ * the subject of an intransitive verb (reader).
8
+ */
9
+ import { type EvidenceClass } from "./types.js";
10
+ /** Role an agent may assume within the ergative model. */
11
+ export type AgentRole = "reader" | "writer" | "observer" | "admin";
12
+ /**
13
+ * A permission entry binding a tool pattern to the roles allowed to
14
+ * invoke it, with an optional minimum evidence class gate.
15
+ */
16
+ export interface ToolPermission {
17
+ /** Tool name or glob pattern (e.g. "solana-rpc:*"). */
18
+ tool_pattern: string;
19
+ /** Roles permitted to invoke tools matching this pattern. */
20
+ allowed_roles: AgentRole[];
21
+ /** Minimum evidence class required to invoke (optional). */
22
+ requires_evidence_class?: EvidenceClass;
23
+ }
24
+ /**
25
+ * A resolved permission manifest for a specific agent, listing every
26
+ * tool it may and may not invoke given its role.
27
+ */
28
+ export interface PermissionManifest {
29
+ agent_id: string;
30
+ role: AgentRole;
31
+ allowed_tools: string[];
32
+ denied_tools: string[];
33
+ generated_at: string;
34
+ }
35
+ /**
36
+ * Central permission gate. Resolves tool access based on agent role,
37
+ * tool name patterns, and optional evidence class requirements.
38
+ */
39
+ export declare class ErgativeGate {
40
+ private readonly permissions;
41
+ constructor(permissions?: ToolPermission[]);
42
+ /** Register an additional permission entry at runtime. */
43
+ addPermission(perm: ToolPermission): void;
44
+ /**
45
+ * Generate a resolved manifest listing all allowed and denied tools
46
+ * for a given agent/role against a concrete set of tool names.
47
+ *
48
+ * When no concrete tool list is available the manifest is generated
49
+ * from the registered permission patterns themselves.
50
+ */
51
+ generateManifest(agentId: string, role: AgentRole): PermissionManifest;
52
+ /** Check whether an agent with the given role may invoke a tool. */
53
+ canInvoke(_agentId: string, role: AgentRole, toolName: string): boolean;
54
+ /** Filter a list of tool names down to those the role may invoke. */
55
+ filterTools(role: AgentRole, allTools: string[]): string[];
56
+ /**
57
+ * Audit a single invocation attempt and return a human-readable
58
+ * explanation alongside the boolean result.
59
+ */
60
+ audit(agentId: string, role: AgentRole, toolName: string): {
61
+ allowed: boolean;
62
+ reason: string;
63
+ };
64
+ /**
65
+ * Determine whether a role is allowed to invoke a tool (or pattern)
66
+ * based on all registered permissions.
67
+ */
68
+ private isAllowedByRole;
69
+ }
70
+ /**
71
+ * Check whether a given `EvidenceClass` meets or exceeds the required
72
+ * minimum class. Uses `CLASS_STRENGTH` for ordering.
73
+ */
74
+ export declare function meetsEvidenceRequirement(actual: EvidenceClass, required: EvidenceClass): boolean;
75
+ //# sourceMappingURL=ergative.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ergative.d.ts","sourceRoot":"","sources":["../src/ergative.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,YAAY,CAAC;AAMhE,0DAA0D;AAC1D,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAEnE;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,4DAA4D;IAC5D,uBAAuB,CAAC,EAAE,aAAa,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAgGD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;gBAEnC,WAAW,GAAE,cAAc,EAAO;IAK9C,0DAA0D;IAC1D,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIzC;;;;;;OAMG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,kBAAkB;IAwBtE,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIvE,qEAAqE;IACrE,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAI1D;;;OAGG;IACH,KAAK,CACH,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,MAAM,GACf;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAsCvC;;;OAGG;IACH,OAAO,CAAC,eAAe;CAWxB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAET"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Ergative Permission Model (Kusunda ergative alignment)
3
+ *
4
+ * Agents that READ state get structurally different access than agents
5
+ * that WRITE state. Inspired by Kusunda's ergative-absolutive grammar:
6
+ * the agent of a transitive verb (writer) is marked differently from
7
+ * the subject of an intransitive verb (reader).
8
+ */
9
+ import { CLASS_STRENGTH } from "./types.js";
10
+ // ---------------------------------------------------------------------------
11
+ // Built-in default permissions
12
+ // ---------------------------------------------------------------------------
13
+ const READER_PATTERNS = [
14
+ "Read",
15
+ "Glob",
16
+ "Grep",
17
+ "WebSearch",
18
+ "WebFetch",
19
+ "*:get*",
20
+ "*:list*",
21
+ "*:query*",
22
+ ];
23
+ const WRITER_PATTERNS = [
24
+ ...READER_PATTERNS,
25
+ "Edit",
26
+ "Write",
27
+ "*:create*",
28
+ "*:update*",
29
+ "*:set*",
30
+ "*:add*",
31
+ "*:push*",
32
+ ];
33
+ const OBSERVER_PATTERNS = [
34
+ "Read",
35
+ "Glob",
36
+ "Grep",
37
+ "*:get*",
38
+ "*:list*",
39
+ "*:query*",
40
+ ];
41
+ /** Default permission sets keyed by role. `admin` is handled specially. */
42
+ const DEFAULT_ROLE_PATTERNS = {
43
+ reader: READER_PATTERNS,
44
+ writer: WRITER_PATTERNS,
45
+ observer: OBSERVER_PATTERNS,
46
+ admin: null, // admin gets everything — no pattern filtering
47
+ };
48
+ /**
49
+ * Built-in `ToolPermission` entries derived from the default role patterns.
50
+ * These are merged into every `ErgativeGate` unless explicitly overridden.
51
+ */
52
+ function buildDefaultPermissions() {
53
+ const seen = new Set();
54
+ const perms = [];
55
+ for (const [role, patterns] of Object.entries(DEFAULT_ROLE_PATTERNS)) {
56
+ if (patterns === null)
57
+ continue;
58
+ for (const p of patterns) {
59
+ if (!seen.has(p)) {
60
+ seen.add(p);
61
+ perms.push({ tool_pattern: p, allowed_roles: [] });
62
+ }
63
+ const perm = perms.find((x) => x.tool_pattern === p);
64
+ if (!perm.allowed_roles.includes(role)) {
65
+ perm.allowed_roles.push(role);
66
+ }
67
+ }
68
+ }
69
+ // admin is implicitly allowed everywhere — add to every entry
70
+ for (const perm of perms) {
71
+ if (!perm.allowed_roles.includes("admin")) {
72
+ perm.allowed_roles.push("admin");
73
+ }
74
+ }
75
+ return perms;
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Glob matching
79
+ // ---------------------------------------------------------------------------
80
+ /**
81
+ * Simple glob match: the pattern may end with `*` to match any suffix.
82
+ * A pattern without `*` must match exactly.
83
+ */
84
+ function globMatch(pattern, value) {
85
+ if (pattern === "*")
86
+ return true;
87
+ if (!pattern.includes("*"))
88
+ return pattern === value;
89
+ const prefix = pattern.slice(0, pattern.indexOf("*"));
90
+ return value.startsWith(prefix);
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // ErgativeGate
94
+ // ---------------------------------------------------------------------------
95
+ /**
96
+ * Central permission gate. Resolves tool access based on agent role,
97
+ * tool name patterns, and optional evidence class requirements.
98
+ */
99
+ export class ErgativeGate {
100
+ permissions;
101
+ constructor(permissions = []) {
102
+ // Merge user-supplied permissions with built-in defaults.
103
+ this.permissions = [...buildDefaultPermissions(), ...permissions];
104
+ }
105
+ /** Register an additional permission entry at runtime. */
106
+ addPermission(perm) {
107
+ this.permissions.push(perm);
108
+ }
109
+ /**
110
+ * Generate a resolved manifest listing all allowed and denied tools
111
+ * for a given agent/role against a concrete set of tool names.
112
+ *
113
+ * When no concrete tool list is available the manifest is generated
114
+ * from the registered permission patterns themselves.
115
+ */
116
+ generateManifest(agentId, role) {
117
+ // Collect every distinct tool pattern known to the gate.
118
+ const allPatterns = [...new Set(this.permissions.map((p) => p.tool_pattern))];
119
+ const allowed = [];
120
+ const denied = [];
121
+ for (const pattern of allPatterns) {
122
+ if (this.isAllowedByRole(role, pattern)) {
123
+ allowed.push(pattern);
124
+ }
125
+ else {
126
+ denied.push(pattern);
127
+ }
128
+ }
129
+ return {
130
+ agent_id: agentId,
131
+ role,
132
+ allowed_tools: allowed,
133
+ denied_tools: denied,
134
+ generated_at: new Date().toISOString(),
135
+ };
136
+ }
137
+ /** Check whether an agent with the given role may invoke a tool. */
138
+ canInvoke(_agentId, role, toolName) {
139
+ return this.isAllowedByRole(role, toolName);
140
+ }
141
+ /** Filter a list of tool names down to those the role may invoke. */
142
+ filterTools(role, allTools) {
143
+ return allTools.filter((tool) => this.isAllowedByRole(role, tool));
144
+ }
145
+ /**
146
+ * Audit a single invocation attempt and return a human-readable
147
+ * explanation alongside the boolean result.
148
+ */
149
+ audit(agentId, role, toolName) {
150
+ // Admin bypass
151
+ if (role === "admin") {
152
+ return { allowed: true, reason: `Role "admin" has unrestricted access.` };
153
+ }
154
+ // Walk permissions looking for a matching pattern that includes the role.
155
+ for (const perm of this.permissions) {
156
+ if (!globMatch(perm.tool_pattern, toolName))
157
+ continue;
158
+ if (!perm.allowed_roles.includes(role))
159
+ continue;
160
+ // Evidence class gate
161
+ if (perm.requires_evidence_class) {
162
+ return {
163
+ allowed: true,
164
+ reason: `Matched pattern "${perm.tool_pattern}" for role "${role}". ` +
165
+ `Requires evidence class >= "${perm.requires_evidence_class}" at invocation time.`,
166
+ };
167
+ }
168
+ return {
169
+ allowed: true,
170
+ reason: `Matched pattern "${perm.tool_pattern}" for role "${role}".`,
171
+ };
172
+ }
173
+ return {
174
+ allowed: false,
175
+ reason: `Agent "${agentId}" with role "${role}" has no permission matching tool "${toolName}".`,
176
+ };
177
+ }
178
+ // -------------------------------------------------------------------------
179
+ // Internal helpers
180
+ // -------------------------------------------------------------------------
181
+ /**
182
+ * Determine whether a role is allowed to invoke a tool (or pattern)
183
+ * based on all registered permissions.
184
+ */
185
+ isAllowedByRole(role, toolName) {
186
+ if (role === "admin")
187
+ return true;
188
+ for (const perm of this.permissions) {
189
+ if (globMatch(perm.tool_pattern, toolName) && perm.allowed_roles.includes(role)) {
190
+ return true;
191
+ }
192
+ }
193
+ return false;
194
+ }
195
+ }
196
+ /**
197
+ * Check whether a given `EvidenceClass` meets or exceeds the required
198
+ * minimum class. Uses `CLASS_STRENGTH` for ordering.
199
+ */
200
+ export function meetsEvidenceRequirement(actual, required) {
201
+ return CLASS_STRENGTH[actual] >= CLASS_STRENGTH[required];
202
+ }
203
+ //# sourceMappingURL=ergative.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ergative.js","sourceRoot":"","sources":["../src/ergative.ts"],"names":[],"mappings":"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"}