@vainplex/openclaw-governance 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 (83) hide show
  1. package/README.md +297 -0
  2. package/dist/index.d.ts +10 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +30 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/audit-redactor.d.ts +3 -0
  7. package/dist/src/audit-redactor.d.ts.map +1 -0
  8. package/dist/src/audit-redactor.js +68 -0
  9. package/dist/src/audit-redactor.js.map +1 -0
  10. package/dist/src/audit-trail.d.ts +27 -0
  11. package/dist/src/audit-trail.d.ts.map +1 -0
  12. package/dist/src/audit-trail.js +192 -0
  13. package/dist/src/audit-trail.js.map +1 -0
  14. package/dist/src/builtin-policies.d.ts +3 -0
  15. package/dist/src/builtin-policies.d.ts.map +1 -0
  16. package/dist/src/builtin-policies.js +152 -0
  17. package/dist/src/builtin-policies.js.map +1 -0
  18. package/dist/src/conditions/context.d.ts +3 -0
  19. package/dist/src/conditions/context.d.ts.map +1 -0
  20. package/dist/src/conditions/context.js +60 -0
  21. package/dist/src/conditions/context.js.map +1 -0
  22. package/dist/src/conditions/index.d.ts +4 -0
  23. package/dist/src/conditions/index.d.ts.map +1 -0
  24. package/dist/src/conditions/index.js +28 -0
  25. package/dist/src/conditions/index.js.map +1 -0
  26. package/dist/src/conditions/simple.d.ts +10 -0
  27. package/dist/src/conditions/simple.d.ts.map +1 -0
  28. package/dist/src/conditions/simple.js +94 -0
  29. package/dist/src/conditions/simple.js.map +1 -0
  30. package/dist/src/conditions/time.d.ts +3 -0
  31. package/dist/src/conditions/time.d.ts.map +1 -0
  32. package/dist/src/conditions/time.js +48 -0
  33. package/dist/src/conditions/time.js.map +1 -0
  34. package/dist/src/conditions/tool.d.ts +3 -0
  35. package/dist/src/conditions/tool.d.ts.map +1 -0
  36. package/dist/src/conditions/tool.js +57 -0
  37. package/dist/src/conditions/tool.js.map +1 -0
  38. package/dist/src/config.d.ts +3 -0
  39. package/dist/src/config.d.ts.map +1 -0
  40. package/dist/src/config.js +80 -0
  41. package/dist/src/config.js.map +1 -0
  42. package/dist/src/cross-agent.d.ts +23 -0
  43. package/dist/src/cross-agent.d.ts.map +1 -0
  44. package/dist/src/cross-agent.js +142 -0
  45. package/dist/src/cross-agent.js.map +1 -0
  46. package/dist/src/engine.d.ts +29 -0
  47. package/dist/src/engine.d.ts.map +1 -0
  48. package/dist/src/engine.js +195 -0
  49. package/dist/src/engine.js.map +1 -0
  50. package/dist/src/frequency-tracker.d.ts +12 -0
  51. package/dist/src/frequency-tracker.d.ts.map +1 -0
  52. package/dist/src/frequency-tracker.js +44 -0
  53. package/dist/src/frequency-tracker.js.map +1 -0
  54. package/dist/src/hooks.d.ts +4 -0
  55. package/dist/src/hooks.d.ts.map +1 -0
  56. package/dist/src/hooks.js +198 -0
  57. package/dist/src/hooks.js.map +1 -0
  58. package/dist/src/policy-evaluator.d.ts +16 -0
  59. package/dist/src/policy-evaluator.d.ts.map +1 -0
  60. package/dist/src/policy-evaluator.js +99 -0
  61. package/dist/src/policy-evaluator.js.map +1 -0
  62. package/dist/src/policy-loader.d.ts +8 -0
  63. package/dist/src/policy-loader.d.ts.map +1 -0
  64. package/dist/src/policy-loader.js +105 -0
  65. package/dist/src/policy-loader.js.map +1 -0
  66. package/dist/src/risk-assessor.d.ts +8 -0
  67. package/dist/src/risk-assessor.d.ts.map +1 -0
  68. package/dist/src/risk-assessor.js +80 -0
  69. package/dist/src/risk-assessor.js.map +1 -0
  70. package/dist/src/trust-manager.d.ts +29 -0
  71. package/dist/src/trust-manager.d.ts.map +1 -0
  72. package/dist/src/trust-manager.js +219 -0
  73. package/dist/src/trust-manager.js.map +1 -0
  74. package/dist/src/types.d.ts +438 -0
  75. package/dist/src/types.d.ts.map +1 -0
  76. package/dist/src/types.js +3 -0
  77. package/dist/src/types.js.map +1 -0
  78. package/dist/src/util.d.ts +28 -0
  79. package/dist/src/util.d.ts.map +1 -0
  80. package/dist/src/util.js +125 -0
  81. package/dist/src/util.js.map +1 -0
  82. package/openclaw.plugin.json +87 -0
  83. package/package.json +48 -0
@@ -0,0 +1,23 @@
1
+ import type { AgentRelationship, EvaluationContext, PluginLogger, Policy, PolicyIndex } from "./types.js";
2
+ import type { TrustManager } from "./trust-manager.js";
3
+ export declare class CrossAgentManager {
4
+ private readonly graph;
5
+ private readonly trustManager;
6
+ private readonly logger;
7
+ constructor(trustManager: TrustManager, logger: PluginLogger);
8
+ registerRelationship(parentSessionKey: string, childSessionKey: string): void;
9
+ removeRelationship(childSessionKey: string): void;
10
+ getParent(childSessionKey: string): AgentRelationship | null;
11
+ getChildren(parentSessionKey: string): AgentRelationship[];
12
+ enrichContext(ctx: EvaluationContext): EvaluationContext;
13
+ resolveEffectivePolicies(ctx: EvaluationContext, index: PolicyIndex): Policy[];
14
+ computeTrustCeiling(sessionKey: string): number;
15
+ getGraphSummary(): {
16
+ agentCount: number;
17
+ relationships: AgentRelationship[];
18
+ };
19
+ private getInheritedPolicyIds;
20
+ private collectAgentPolicies;
21
+ private mergePolicies;
22
+ }
23
+ //# sourceMappingURL=cross-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-agent.d.ts","sourceRoot":"","sources":["../../src/cross-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,MAAM,EACN,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQvD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY;IAM5D,oBAAoB,CAClB,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,GACtB,IAAI;IAkBP,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAIjD,SAAS,CAAC,eAAe,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAoB5D,WAAW,CAAC,gBAAgB,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAU1D,aAAa,CAAC,GAAG,EAAE,iBAAiB,GAAG,iBAAiB;IAuBxD,wBAAwB,CACtB,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,WAAW,GACjB,MAAM,EAAE;IAkBX,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAU/C,eAAe,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,iBAAiB,EAAE,CAAC;KACpC;IAOD,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,oBAAoB;IAsC5B,OAAO,CAAC,aAAa;CAgBtB"}
@@ -0,0 +1,142 @@
1
+ import { extractAgentId, extractParentSessionKey, isSubAgent, scoreToTier, } from "./util.js";
2
+ export class CrossAgentManager {
3
+ graph;
4
+ trustManager;
5
+ logger;
6
+ constructor(trustManager, logger) {
7
+ this.graph = { relationships: new Map() };
8
+ this.trustManager = trustManager;
9
+ this.logger = logger;
10
+ }
11
+ registerRelationship(parentSessionKey, childSessionKey) {
12
+ const parentAgentId = extractAgentId(parentSessionKey);
13
+ const childAgentId = extractAgentId(childSessionKey);
14
+ const rel = {
15
+ parentAgentId,
16
+ parentSessionKey,
17
+ childAgentId,
18
+ childSessionKey,
19
+ createdAt: Date.now(),
20
+ };
21
+ this.graph.relationships.set(childSessionKey, rel);
22
+ this.logger.info(`[governance] Registered sub-agent: ${childAgentId} → parent ${parentAgentId}`);
23
+ }
24
+ removeRelationship(childSessionKey) {
25
+ this.graph.relationships.delete(childSessionKey);
26
+ }
27
+ getParent(childSessionKey) {
28
+ // First check explicit registrations
29
+ const explicit = this.graph.relationships.get(childSessionKey);
30
+ if (explicit)
31
+ return explicit;
32
+ // Fall back to session key parsing
33
+ if (!isSubAgent(childSessionKey))
34
+ return null;
35
+ const parentKey = extractParentSessionKey(childSessionKey);
36
+ if (!parentKey)
37
+ return null;
38
+ return {
39
+ parentAgentId: extractAgentId(parentKey),
40
+ parentSessionKey: parentKey,
41
+ childAgentId: extractAgentId(childSessionKey),
42
+ childSessionKey,
43
+ createdAt: 0,
44
+ };
45
+ }
46
+ getChildren(parentSessionKey) {
47
+ const children = [];
48
+ for (const rel of this.graph.relationships.values()) {
49
+ if (rel.parentSessionKey === parentSessionKey) {
50
+ children.push(rel);
51
+ }
52
+ }
53
+ return children;
54
+ }
55
+ enrichContext(ctx) {
56
+ const parent = this.getParent(ctx.sessionKey);
57
+ if (!parent)
58
+ return ctx;
59
+ const ceiling = this.computeTrustCeiling(ctx.sessionKey);
60
+ const cappedScore = Math.min(ctx.trust.score, ceiling);
61
+ const cappedTier = scoreToTier(cappedScore);
62
+ // Collect inherited policy IDs (we'll resolve them later)
63
+ const inheritedPolicyIds = this.getInheritedPolicyIds(parent);
64
+ return {
65
+ ...ctx,
66
+ trust: { score: cappedScore, tier: cappedTier },
67
+ crossAgent: {
68
+ parentAgentId: parent.parentAgentId,
69
+ parentSessionKey: parent.parentSessionKey,
70
+ inheritedPolicyIds,
71
+ trustCeiling: ceiling,
72
+ },
73
+ };
74
+ }
75
+ resolveEffectivePolicies(ctx, index) {
76
+ // Collect own policies
77
+ const ownPolicies = this.collectAgentPolicies(ctx.agentId, ctx.hook, index);
78
+ const parent = this.getParent(ctx.sessionKey);
79
+ if (!parent)
80
+ return ownPolicies;
81
+ // Collect parent policies (1-level only)
82
+ const parentPolicies = this.collectAgentPolicies(parent.parentAgentId, ctx.hook, index);
83
+ // Merge with deduplication by policy ID
84
+ return this.mergePolicies(ownPolicies, parentPolicies);
85
+ }
86
+ computeTrustCeiling(sessionKey) {
87
+ const parent = this.getParent(sessionKey);
88
+ if (!parent)
89
+ return Infinity;
90
+ const parentTrust = this.trustManager.getAgentTrust(parent.parentAgentId);
91
+ return parentTrust.score;
92
+ }
93
+ getGraphSummary() {
94
+ return {
95
+ agentCount: this.graph.relationships.size,
96
+ relationships: [...this.graph.relationships.values()],
97
+ };
98
+ }
99
+ getInheritedPolicyIds(parent) {
100
+ // We don't have the index here, so just record the parent info
101
+ return [`inherited-from:${parent.parentAgentId}`];
102
+ }
103
+ collectAgentPolicies(agentId, hook, index) {
104
+ const result = [];
105
+ const seen = new Set();
106
+ // Agent-specific policies
107
+ const agentPolicies = index.byAgent.get(agentId) ?? [];
108
+ for (const p of agentPolicies) {
109
+ if (!seen.has(p.id)) {
110
+ seen.add(p.id);
111
+ result.push(p);
112
+ }
113
+ }
114
+ // Global policies
115
+ const globalPolicies = index.byAgent.get("*") ?? [];
116
+ for (const p of globalPolicies) {
117
+ if (!seen.has(p.id)) {
118
+ seen.add(p.id);
119
+ result.push(p);
120
+ }
121
+ }
122
+ // Filter by hook
123
+ const hookPolicies = index.byHook.get(hook);
124
+ if (hookPolicies) {
125
+ const hookIds = new Set(hookPolicies.map((p) => p.id));
126
+ return result.filter((p) => hookIds.has(p.id));
127
+ }
128
+ return result;
129
+ }
130
+ mergePolicies(own, parent) {
131
+ const merged = [...own];
132
+ const seenIds = new Set(own.map((p) => p.id));
133
+ for (const p of parent) {
134
+ if (!seenIds.has(p.id)) {
135
+ seenIds.add(p.id);
136
+ merged.push(p);
137
+ }
138
+ }
139
+ return merged;
140
+ }
141
+ }
142
+ //# sourceMappingURL=cross-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-agent.js","sourceRoot":"","sources":["../../src/cross-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { AgentTrust, EvaluationContext, GovernanceConfig, GovernanceStatus, PluginLogger, TrustStore, Verdict } from "./types.js";
2
+ export declare class GovernanceEngine {
3
+ private readonly config;
4
+ private readonly logger;
5
+ private policyIndex;
6
+ private readonly evaluator;
7
+ private readonly riskAssessor;
8
+ private readonly trustManager;
9
+ private readonly crossAgentManager;
10
+ private readonly auditTrail;
11
+ private readonly frequencyTracker;
12
+ private readonly stats;
13
+ private workspace;
14
+ constructor(config: GovernanceConfig, logger: PluginLogger, workspace?: string);
15
+ start(): Promise<void>;
16
+ stop(): Promise<void>;
17
+ evaluate(ctx: EvaluationContext): Promise<Verdict>;
18
+ private buildDeps;
19
+ private runPipeline;
20
+ private recordAudit;
21
+ private handleEvalError;
22
+ recordOutcome(agentId: string, _toolName: string, success: boolean): void;
23
+ registerSubAgent(parentSessionKey: string, childSessionKey: string): void;
24
+ getStatus(): GovernanceStatus;
25
+ getTrust(agentId?: string): AgentTrust | TrustStore;
26
+ setTrust(agentId: string, score: number): void;
27
+ private updateStats;
28
+ }
29
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,UAAU,EAEV,iBAAiB,EAEjB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EAIZ,UAAU,EACV,OAAO,EACR,MAAM,YAAY,CAAC;AAWpB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;IACxD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,SAAS,CAAS;gBAGxB,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,YAAY,EACpB,SAAS,CAAC,EAAE,MAAM;IA8Bd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAWxD,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,WAAW;IA0BnB,OAAO,CAAC,eAAe;IAgCvB,aAAa,CACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GACf,IAAI;IASP,gBAAgB,CACd,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,GACtB,IAAI;IAOP,SAAS,IAAI,gBAAgB;IAsB7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU;IAKnD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9C,OAAO,CAAC,WAAW;CAUpB"}
@@ -0,0 +1,195 @@
1
+ import { buildPolicyIndex, loadPolicies } from "./policy-loader.js";
2
+ import { PolicyEvaluator } from "./policy-evaluator.js";
3
+ import { createConditionEvaluators } from "./conditions/index.js";
4
+ import { RiskAssessor } from "./risk-assessor.js";
5
+ import { TrustManager } from "./trust-manager.js";
6
+ import { CrossAgentManager } from "./cross-agent.js";
7
+ import { AuditTrail } from "./audit-trail.js";
8
+ import { FrequencyTrackerImpl } from "./frequency-tracker.js";
9
+ import { nowUs } from "./util.js";
10
+ export class GovernanceEngine {
11
+ config;
12
+ logger;
13
+ policyIndex;
14
+ evaluator;
15
+ riskAssessor;
16
+ trustManager;
17
+ crossAgentManager;
18
+ auditTrail;
19
+ frequencyTracker;
20
+ stats;
21
+ workspace;
22
+ constructor(config, logger, workspace) {
23
+ this.config = config;
24
+ this.logger = logger;
25
+ this.workspace =
26
+ workspace ?? `${process.env["HOME"] ?? "/tmp"}/.openclaw/plugins/openclaw-governance`;
27
+ const conditionEvaluators = createConditionEvaluators();
28
+ this.evaluator = new PolicyEvaluator(conditionEvaluators);
29
+ this.riskAssessor = new RiskAssessor(config.toolRiskOverrides);
30
+ this.trustManager = new TrustManager(config.trust, this.workspace, logger);
31
+ this.crossAgentManager = new CrossAgentManager(this.trustManager, logger);
32
+ this.auditTrail = new AuditTrail(config.audit, this.workspace, logger);
33
+ this.frequencyTracker = new FrequencyTrackerImpl(config.performance.frequencyBufferSize);
34
+ this.policyIndex = { byHook: new Map(), byAgent: new Map(), regexCache: new Map() };
35
+ this.stats = {
36
+ totalEvaluations: 0,
37
+ allowCount: 0,
38
+ denyCount: 0,
39
+ errorCount: 0,
40
+ avgEvaluationUs: 0,
41
+ };
42
+ }
43
+ async start() {
44
+ const allPolicies = loadPolicies(this.config.policies, this.config.builtinPolicies, this.logger);
45
+ this.policyIndex = buildPolicyIndex(allPolicies);
46
+ this.trustManager.load();
47
+ this.auditTrail.load();
48
+ this.frequencyTracker.clear();
49
+ this.trustManager.startPersistence();
50
+ this.auditTrail.startAutoFlush();
51
+ this.logger.info(`[governance] Engine started: ${allPolicies.length} policies loaded`);
52
+ }
53
+ async stop() {
54
+ try {
55
+ this.trustManager.stopPersistence();
56
+ }
57
+ catch (e) {
58
+ this.logger.error(`[governance] Error stopping trust persistence: ${e instanceof Error ? e.message : String(e)}`);
59
+ }
60
+ try {
61
+ this.auditTrail.stopAutoFlush();
62
+ }
63
+ catch (e) {
64
+ this.logger.error(`[governance] Error stopping audit flush: ${e instanceof Error ? e.message : String(e)}`);
65
+ }
66
+ this.logger.info("[governance] Engine stopped");
67
+ }
68
+ async evaluate(ctx) {
69
+ const startUs = nowUs();
70
+ try {
71
+ const verdict = this.runPipeline(ctx, startUs);
72
+ this.updateStats(verdict.action, verdict.evaluationUs);
73
+ return verdict;
74
+ }
75
+ catch (e) {
76
+ return this.handleEvalError(e, ctx, startUs);
77
+ }
78
+ }
79
+ buildDeps(risk) {
80
+ return {
81
+ regexCache: this.policyIndex.regexCache,
82
+ timeWindows: this.config.timeWindows,
83
+ risk,
84
+ frequencyTracker: this.frequencyTracker,
85
+ };
86
+ }
87
+ runPipeline(ctx, startUs) {
88
+ const enrichedCtx = this.crossAgentManager.enrichContext(ctx);
89
+ this.frequencyTracker.record({
90
+ timestamp: Date.now(),
91
+ agentId: enrichedCtx.agentId,
92
+ sessionKey: enrichedCtx.sessionKey,
93
+ toolName: enrichedCtx.toolName,
94
+ });
95
+ const risk = this.riskAssessor.assess(enrichedCtx, this.frequencyTracker);
96
+ const policies = this.crossAgentManager.resolveEffectivePolicies(enrichedCtx, this.policyIndex);
97
+ const evalResult = this.evaluator.evaluateWithDeps(enrichedCtx, policies, risk, this.buildDeps(risk));
98
+ const elapsedUs = nowUs() - startUs;
99
+ const verdict = {
100
+ action: evalResult.action, reason: evalResult.reason, risk,
101
+ matchedPolicies: evalResult.matches,
102
+ trust: enrichedCtx.trust, evaluationUs: elapsedUs,
103
+ };
104
+ this.recordAudit(enrichedCtx, verdict, risk, elapsedUs);
105
+ return verdict;
106
+ }
107
+ recordAudit(ctx, verdict, risk, elapsedUs) {
108
+ if (!this.config.audit.enabled)
109
+ return;
110
+ const auditCtx = {
111
+ hook: ctx.hook,
112
+ agentId: ctx.agentId,
113
+ sessionKey: ctx.sessionKey,
114
+ channel: ctx.channel,
115
+ toolName: ctx.toolName,
116
+ toolParams: ctx.toolParams,
117
+ messageContent: ctx.messageContent,
118
+ messageTo: ctx.messageTo,
119
+ crossAgent: ctx.crossAgent,
120
+ };
121
+ this.auditTrail.record(verdict.action, auditCtx, verdict.trust, { level: risk.level, score: risk.score }, verdict.matchedPolicies, elapsedUs);
122
+ }
123
+ handleEvalError(e, ctx, startUs) {
124
+ const elapsedUs = nowUs() - startUs;
125
+ this.stats.errorCount++;
126
+ this.logger.error(`[governance] Evaluation error: ${e instanceof Error ? e.message : String(e)}`);
127
+ const fallback = this.config.failMode === "closed" ? "deny" : "allow";
128
+ if (this.config.audit.enabled) {
129
+ this.auditTrail.record("error_fallback", { hook: ctx.hook, agentId: ctx.agentId, sessionKey: ctx.sessionKey, toolName: ctx.toolName }, ctx.trust, { level: "critical", score: 100 }, [], elapsedUs);
130
+ }
131
+ return {
132
+ action: fallback,
133
+ reason: fallback === "deny"
134
+ ? "Governance engine error (fail-closed)"
135
+ : "Governance engine error (fail-open)",
136
+ risk: { level: "critical", score: 100, factors: [] },
137
+ matchedPolicies: [],
138
+ trust: ctx.trust,
139
+ evaluationUs: elapsedUs,
140
+ };
141
+ }
142
+ recordOutcome(agentId, _toolName, success) {
143
+ if (!this.config.trust.enabled)
144
+ return;
145
+ if (success) {
146
+ this.trustManager.recordSuccess(agentId);
147
+ }
148
+ else {
149
+ this.trustManager.recordViolation(agentId);
150
+ }
151
+ }
152
+ registerSubAgent(parentSessionKey, childSessionKey) {
153
+ this.crossAgentManager.registerRelationship(parentSessionKey, childSessionKey);
154
+ }
155
+ getStatus() {
156
+ let policyCount = 0;
157
+ const counted = new Set();
158
+ for (const policies of this.policyIndex.byHook.values()) {
159
+ for (const p of policies) {
160
+ if (!counted.has(p.id)) {
161
+ counted.add(p.id);
162
+ policyCount++;
163
+ }
164
+ }
165
+ }
166
+ return {
167
+ enabled: this.config.enabled,
168
+ policyCount,
169
+ trustEnabled: this.config.trust.enabled,
170
+ auditEnabled: this.config.audit.enabled,
171
+ failMode: this.config.failMode,
172
+ stats: { ...this.stats },
173
+ };
174
+ }
175
+ getTrust(agentId) {
176
+ if (agentId)
177
+ return this.trustManager.getAgentTrust(agentId);
178
+ return this.trustManager.getStore();
179
+ }
180
+ setTrust(agentId, score) {
181
+ this.trustManager.setScore(agentId, score);
182
+ }
183
+ updateStats(action, us) {
184
+ this.stats.totalEvaluations++;
185
+ if (action === "allow")
186
+ this.stats.allowCount++;
187
+ else
188
+ this.stats.denyCount++;
189
+ // Running average
190
+ this.stats.avgEvaluationUs =
191
+ (this.stats.avgEvaluationUs * (this.stats.totalEvaluations - 1) + us) /
192
+ this.stats.totalEvaluations;
193
+ }
194
+ }
195
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { FrequencyEntry, FrequencyTracker as IFrequencyTracker } from "./types.js";
2
+ export declare class FrequencyTrackerImpl implements IFrequencyTracker {
3
+ private buffer;
4
+ private head;
5
+ private size;
6
+ private readonly capacity;
7
+ constructor(bufferSize: number);
8
+ record(entry: FrequencyEntry): void;
9
+ count(windowSeconds: number, scope: "agent" | "session" | "global", agentId: string, sessionKey: string): number;
10
+ clear(): void;
11
+ }
12
+ //# sourceMappingURL=frequency-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frequency-tracker.d.ts","sourceRoot":"","sources":["../../src/frequency-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAExF,qBAAa,oBAAqB,YAAW,iBAAiB;IAC5D,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,UAAU,EAAE,MAAM;IAO9B,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAMnC,KAAK,CACH,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,EACrC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,MAAM;IAqBT,KAAK,IAAI,IAAI;CAKd"}
@@ -0,0 +1,44 @@
1
+ export class FrequencyTrackerImpl {
2
+ buffer;
3
+ head;
4
+ size;
5
+ capacity;
6
+ constructor(bufferSize) {
7
+ this.capacity = bufferSize;
8
+ this.buffer = new Array(bufferSize);
9
+ this.head = 0;
10
+ this.size = 0;
11
+ }
12
+ record(entry) {
13
+ this.buffer[this.head] = entry;
14
+ this.head = (this.head + 1) % this.capacity;
15
+ if (this.size < this.capacity)
16
+ this.size++;
17
+ }
18
+ count(windowSeconds, scope, agentId, sessionKey) {
19
+ const cutoff = Date.now() - windowSeconds * 1000;
20
+ let total = 0;
21
+ for (let i = 0; i < this.size; i++) {
22
+ const idx = (this.head - 1 - i + this.capacity) % this.capacity;
23
+ const entry = this.buffer[idx];
24
+ if (!entry || entry.timestamp < cutoff)
25
+ continue;
26
+ if (scope === "global") {
27
+ total++;
28
+ }
29
+ else if (scope === "agent" && entry.agentId === agentId) {
30
+ total++;
31
+ }
32
+ else if (scope === "session" && entry.sessionKey === sessionKey) {
33
+ total++;
34
+ }
35
+ }
36
+ return total;
37
+ }
38
+ clear() {
39
+ this.buffer = new Array(this.capacity);
40
+ this.head = 0;
41
+ this.size = 0;
42
+ }
43
+ }
44
+ //# sourceMappingURL=frequency-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frequency-tracker.js","sourceRoot":"","sources":["../../src/frequency-tracker.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAmB;IACzB,IAAI,CAAS;IACb,IAAI,CAAS;IACJ,QAAQ,CAAS;IAElC,YAAY,UAAkB;QAC5B,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAiB,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,KAAqB;QAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5C,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CACH,aAAqB,EACrB,KAAqC,EACrC,OAAe,EACf,UAAkB;QAElB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,IAAI,CAAC;QACjD,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;YAChE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,MAAM;gBAAE,SAAS;YAEjD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvB,KAAK,EAAE,CAAC;YACV,CAAC;iBAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC1D,KAAK,EAAE,CAAC;YACV,CAAC;iBAAM,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBAClE,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAiB,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { GovernanceConfig, OpenClawPluginApi } from "./types.js";
2
+ import type { GovernanceEngine } from "./engine.js";
3
+ export declare function registerGovernanceHooks(api: OpenClawPluginApi, engine: GovernanceEngine, config: GovernanceConfig): void;
4
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAWhB,iBAAiB,EAElB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAiOpD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAwBN"}