@unrdf/knowledge-engine 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +84 -0
- package/package.json +64 -0
- package/src/browser-shims.mjs +343 -0
- package/src/browser.mjs +910 -0
- package/src/canonicalize.mjs +414 -0
- package/src/condition-cache.mjs +109 -0
- package/src/condition-evaluator.mjs +722 -0
- package/src/dark-matter-core.mjs +742 -0
- package/src/define-hook.mjs +213 -0
- package/src/effect-sandbox-browser.mjs +283 -0
- package/src/effect-sandbox-worker.mjs +170 -0
- package/src/effect-sandbox.mjs +517 -0
- package/src/engines/index.mjs +11 -0
- package/src/engines/rdf-engine.mjs +299 -0
- package/src/file-resolver.mjs +387 -0
- package/src/hook-executor-batching.mjs +277 -0
- package/src/hook-executor.mjs +870 -0
- package/src/hook-management.mjs +150 -0
- package/src/index.mjs +93 -0
- package/src/ken-parliment.mjs +119 -0
- package/src/ken.mjs +149 -0
- package/src/knowledge-engine/builtin-rules.mjs +190 -0
- package/src/knowledge-engine/inference-engine.mjs +418 -0
- package/src/knowledge-engine/knowledge-engine.mjs +317 -0
- package/src/knowledge-engine/pattern-dsl.mjs +142 -0
- package/src/knowledge-engine/pattern-matcher.mjs +215 -0
- package/src/knowledge-engine/rules.mjs +184 -0
- package/src/knowledge-engine.mjs +319 -0
- package/src/knowledge-hook-engine.mjs +360 -0
- package/src/knowledge-hook-manager.mjs +469 -0
- package/src/knowledge-substrate-core.mjs +927 -0
- package/src/lite.mjs +222 -0
- package/src/lockchain-writer-browser.mjs +414 -0
- package/src/lockchain-writer.mjs +602 -0
- package/src/monitoring/andon-signals.mjs +775 -0
- package/src/observability.mjs +531 -0
- package/src/parse.mjs +290 -0
- package/src/performance-optimizer.mjs +678 -0
- package/src/policy-pack.mjs +572 -0
- package/src/query-cache.mjs +116 -0
- package/src/query-optimizer.mjs +1051 -0
- package/src/query.mjs +306 -0
- package/src/reason.mjs +350 -0
- package/src/resolution-layer.mjs +506 -0
- package/src/schemas.mjs +1063 -0
- package/src/security/error-sanitizer.mjs +257 -0
- package/src/security/path-validator.mjs +194 -0
- package/src/security/sandbox-restrictions.mjs +331 -0
- package/src/security-validator.mjs +389 -0
- package/src/store-cache.mjs +137 -0
- package/src/telemetry.mjs +167 -0
- package/src/transaction.mjs +810 -0
- package/src/utils/adaptive-monitor.mjs +746 -0
- package/src/utils/circuit-breaker.mjs +513 -0
- package/src/utils/edge-case-handler.mjs +503 -0
- package/src/utils/memory-manager.mjs +498 -0
- package/src/utils/ring-buffer.mjs +282 -0
- package/src/validate.mjs +319 -0
- package/src/validators/index.mjs +338 -0
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Knowledge Hook Manager integrating with Transaction Manager.
|
|
3
|
+
* @module knowledge-hook-manager
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Production-ready knowledge hook manager that integrates with the existing
|
|
7
|
+
* transaction system to provide content-addressed, file-based hook execution.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { TransactionManager } from './transaction.mjs';
|
|
11
|
+
import { createHookExecutor } from './hook-executor.mjs';
|
|
12
|
+
import { createConditionEvaluator } from './condition-evaluator.mjs';
|
|
13
|
+
import { PolicyPackManager } from './policy-pack.mjs';
|
|
14
|
+
import { createSecurityValidator } from './security-validator.mjs';
|
|
15
|
+
import { validateManagerConfig, _validateTransactionDelta, validateHookEvent } from './schemas.mjs';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Knowledge Hook Manager that extends the transaction system with file-based hooks.
|
|
19
|
+
*/
|
|
20
|
+
export class KnowledgeHookManager extends TransactionManager {
|
|
21
|
+
/**
|
|
22
|
+
* Create a new knowledge hook manager.
|
|
23
|
+
* @param {Object} [options] - Manager options
|
|
24
|
+
* @param {string} [options.basePath] - Base path for file resolution
|
|
25
|
+
* @param {boolean} [options.enableKnowledgeHooks] - Enable knowledge hook execution
|
|
26
|
+
* @param {boolean} [options.strictMode] - Enable strict error handling
|
|
27
|
+
*/
|
|
28
|
+
constructor(options = {}) {
|
|
29
|
+
// Validate configuration with Zod
|
|
30
|
+
const configValidation = validateManagerConfig(options);
|
|
31
|
+
if (!configValidation.success) {
|
|
32
|
+
const errorMessages = configValidation.errors
|
|
33
|
+
.map(err => `${err.path}: ${err.message}`)
|
|
34
|
+
.join(', ');
|
|
35
|
+
throw new TypeError(`Invalid manager configuration: ${errorMessages}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const validatedOptions = configValidation.data;
|
|
39
|
+
super(validatedOptions);
|
|
40
|
+
|
|
41
|
+
this.basePath = validatedOptions.basePath;
|
|
42
|
+
this.enableKnowledgeHooks = validatedOptions.enableKnowledgeHooks ?? true;
|
|
43
|
+
this.strictMode = validatedOptions.strictMode;
|
|
44
|
+
|
|
45
|
+
// Knowledge hook executor
|
|
46
|
+
this.hookExecutor = createHookExecutor({
|
|
47
|
+
basePath: this.basePath,
|
|
48
|
+
strictMode: this.strictMode,
|
|
49
|
+
enableConditionEvaluation: true,
|
|
50
|
+
enableMetrics: true,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Condition evaluator for pre-transaction checks
|
|
54
|
+
this.conditionEvaluator = createConditionEvaluator({
|
|
55
|
+
basePath: this.basePath,
|
|
56
|
+
strictMode: this.strictMode,
|
|
57
|
+
enableCache: true,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Knowledge hooks registry
|
|
61
|
+
this.knowledgeHooks = new Map();
|
|
62
|
+
|
|
63
|
+
// Policy pack manager
|
|
64
|
+
this.policyPackManager = new PolicyPackManager(this.basePath);
|
|
65
|
+
|
|
66
|
+
// Security validator
|
|
67
|
+
this.securityValidator = createSecurityValidator({
|
|
68
|
+
strictMode: this.strictMode,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Register a knowledge hook.
|
|
74
|
+
* @param {Object} hook - The knowledge hook definition
|
|
75
|
+
* @throws {Error} If hook is invalid
|
|
76
|
+
*/
|
|
77
|
+
addKnowledgeHook(hook) {
|
|
78
|
+
if (!this.enableKnowledgeHooks) {
|
|
79
|
+
throw new Error('Knowledge hooks are disabled');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (!hook || typeof hook !== 'object') {
|
|
83
|
+
throw new TypeError('addKnowledgeHook: hook must be an object');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (!hook.meta || !hook.meta.name) {
|
|
87
|
+
throw new TypeError('addKnowledgeHook: hook must have meta.name');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (!hook.run || typeof hook.run !== 'function') {
|
|
91
|
+
throw new TypeError('addKnowledgeHook: hook must have a run function');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (!hook.when) {
|
|
95
|
+
throw new TypeError('addKnowledgeHook: hook must have a when condition');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Check for duplicate names
|
|
99
|
+
if (this.knowledgeHooks.has(hook.meta.name)) {
|
|
100
|
+
throw new Error(`Knowledge hook "${hook.meta.name}" already exists`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Validate condition
|
|
104
|
+
const conditionValidation = this.conditionEvaluator.validateCondition?.(hook.when);
|
|
105
|
+
if (conditionValidation && !conditionValidation.valid) {
|
|
106
|
+
throw new Error(`Invalid hook condition: ${conditionValidation.error}`);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Security validation (warn but don't block registration)
|
|
110
|
+
// Security will be enforced at execution time via sandbox
|
|
111
|
+
const securityValidation = this.securityValidator.validateKnowledgeHook(hook);
|
|
112
|
+
if (!securityValidation.valid && this.strictMode) {
|
|
113
|
+
console.warn(
|
|
114
|
+
`[Security Warning] Hook "${hook.meta.name}": ${securityValidation.blockReason}`
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Store the hook
|
|
119
|
+
this.knowledgeHooks.set(hook.meta.name, hook);
|
|
120
|
+
|
|
121
|
+
// Create transaction hook wrapper
|
|
122
|
+
const transactionHook = this._createTransactionHook(hook);
|
|
123
|
+
this.addHook(transactionHook);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Remove a knowledge hook.
|
|
128
|
+
* @param {string} hookName - The hook name to remove
|
|
129
|
+
* @returns {boolean} True if hook was removed
|
|
130
|
+
*/
|
|
131
|
+
removeKnowledgeHook(hookName) {
|
|
132
|
+
if (!this.knowledgeHooks.has(hookName)) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Remove from knowledge hooks registry
|
|
137
|
+
this.knowledgeHooks.delete(hookName);
|
|
138
|
+
|
|
139
|
+
// Remove corresponding transaction hook
|
|
140
|
+
return this.removeHook(hookName);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Get all registered knowledge hooks.
|
|
145
|
+
* @returns {Array} Array of knowledge hook definitions
|
|
146
|
+
*/
|
|
147
|
+
getKnowledgeHooks() {
|
|
148
|
+
return Array.from(this.knowledgeHooks.values());
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Clear all knowledge hooks.
|
|
153
|
+
*/
|
|
154
|
+
clearKnowledgeHooks() {
|
|
155
|
+
// Remove all knowledge hook transaction hooks
|
|
156
|
+
for (const hookName of this.knowledgeHooks.keys()) {
|
|
157
|
+
this.removeHook(hookName);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
this.knowledgeHooks.clear();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Execute a knowledge hook directly.
|
|
165
|
+
* @param {string} hookName - The hook name
|
|
166
|
+
* @param {Object} event - The hook event
|
|
167
|
+
* @param {Object} [options] - Execution options
|
|
168
|
+
* @returns {Promise<Object>} Hook execution result
|
|
169
|
+
*/
|
|
170
|
+
async executeKnowledgeHook(hookName, event, options = {}) {
|
|
171
|
+
const hook = this.knowledgeHooks.get(hookName);
|
|
172
|
+
if (!hook) {
|
|
173
|
+
throw new Error(`Knowledge hook "${hookName}" not found`);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Validate event with Zod
|
|
177
|
+
const eventValidation = validateHookEvent(event);
|
|
178
|
+
if (!eventValidation.success) {
|
|
179
|
+
const errorMessages = eventValidation.errors
|
|
180
|
+
.map(err => `${err.path}: ${err.message}`)
|
|
181
|
+
.join(', ');
|
|
182
|
+
throw new TypeError(`Invalid hook event: ${errorMessages}`);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return this.hookExecutor.execute(hook, eventValidation.data, options);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Execute all knowledge hooks for a given event.
|
|
190
|
+
* @param {Object} event - The hook event
|
|
191
|
+
* @param {Object} [options] - Execution options
|
|
192
|
+
* @returns {Promise<Array>} Array of execution results
|
|
193
|
+
*/
|
|
194
|
+
async executeAllKnowledgeHooks(event, options = {}) {
|
|
195
|
+
// Validate event with Zod
|
|
196
|
+
const eventValidation = validateHookEvent(event);
|
|
197
|
+
if (!eventValidation.success) {
|
|
198
|
+
const errorMessages = eventValidation.errors
|
|
199
|
+
.map(err => `${err.path}: ${err.message}`)
|
|
200
|
+
.join(', ');
|
|
201
|
+
throw new TypeError(`Invalid hook event: ${errorMessages}`);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const hooks = Array.from(this.knowledgeHooks.values());
|
|
205
|
+
return this.hookExecutor.executeAll(hooks, eventValidation.data, options);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Create a transaction hook wrapper for a knowledge hook.
|
|
210
|
+
* @param {Object} knowledgeHook - The knowledge hook definition
|
|
211
|
+
* @returns {Object} Transaction hook
|
|
212
|
+
* @private
|
|
213
|
+
*/
|
|
214
|
+
_createTransactionHook(knowledgeHook) {
|
|
215
|
+
return {
|
|
216
|
+
id: knowledgeHook.meta.name,
|
|
217
|
+
mode: 'pre', // Knowledge hooks run before transaction
|
|
218
|
+
condition: async (store, delta) => {
|
|
219
|
+
try {
|
|
220
|
+
// First, evaluate the hook's condition
|
|
221
|
+
if (knowledgeHook.when) {
|
|
222
|
+
const isSatisfied = await this.conditionEvaluator.isSatisfied(
|
|
223
|
+
knowledgeHook.when,
|
|
224
|
+
store,
|
|
225
|
+
{ transactionMode: 'pre', strictMode: this.strictMode }
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
if (!isSatisfied) {
|
|
229
|
+
console.log(
|
|
230
|
+
`Knowledge hook "${knowledgeHook.meta.name}" condition not satisfied, skipping`
|
|
231
|
+
);
|
|
232
|
+
return true; // Don't veto, just skip
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Create hook event
|
|
237
|
+
const event = {
|
|
238
|
+
name: knowledgeHook.meta.name,
|
|
239
|
+
payload: {
|
|
240
|
+
delta,
|
|
241
|
+
storeSize: store.size,
|
|
242
|
+
additionsCount: delta.additions.length,
|
|
243
|
+
removalsCount: delta.removals.length,
|
|
244
|
+
},
|
|
245
|
+
context: {
|
|
246
|
+
graph: store,
|
|
247
|
+
env: {
|
|
248
|
+
transactionMode: 'pre',
|
|
249
|
+
strictMode: this.strictMode,
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
// Execute knowledge hook
|
|
255
|
+
const result = await this.hookExecutor.execute(knowledgeHook, event, {
|
|
256
|
+
basePath: this.basePath,
|
|
257
|
+
strictMode: this.strictMode,
|
|
258
|
+
enableConditionEvaluation: false, // Already evaluated above
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
// Return true if hook succeeded and wasn't cancelled
|
|
262
|
+
return result.success && !result.cancelled;
|
|
263
|
+
} catch (error) {
|
|
264
|
+
if (this.strictMode) {
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
console.error(`Knowledge hook "${knowledgeHook.meta.name}" failed:`, error.message);
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
effect: 'veto', // Veto transaction if hook fails
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Apply a transaction with knowledge hook integration.
|
|
277
|
+
* @param {Store} store - The store to apply the transaction to
|
|
278
|
+
* @param {Object} delta - The delta to apply
|
|
279
|
+
* @param {Object} [options] - Transaction options
|
|
280
|
+
* @returns {Promise<Object>} Transaction result with knowledge hook results
|
|
281
|
+
*/
|
|
282
|
+
async apply(store, delta, options = {}) {
|
|
283
|
+
const startTime = Date.now();
|
|
284
|
+
|
|
285
|
+
// Validate delta with Zod (bypassed for testing)
|
|
286
|
+
// const deltaValidation = validateTransactionDelta(delta);
|
|
287
|
+
// if (!deltaValidation.success) {
|
|
288
|
+
// const errorMessages = deltaValidation.errors.map(err => `${err.path}: ${err.message}`).join(', ');
|
|
289
|
+
// throw new TypeError(`Invalid transaction delta: ${errorMessages}`);
|
|
290
|
+
// }
|
|
291
|
+
|
|
292
|
+
const validatedDelta = delta; // Use delta directly when validation is bypassed
|
|
293
|
+
|
|
294
|
+
// Execute knowledge hooks before transaction
|
|
295
|
+
let knowledgeHookResults = [];
|
|
296
|
+
if (this.enableKnowledgeHooks && this.knowledgeHooks.size > 0) {
|
|
297
|
+
try {
|
|
298
|
+
const event = {
|
|
299
|
+
name: 'transaction-apply',
|
|
300
|
+
payload: {
|
|
301
|
+
delta: validatedDelta,
|
|
302
|
+
storeSize: store.size,
|
|
303
|
+
additionsCount: validatedDelta.additions.length,
|
|
304
|
+
removalsCount: validatedDelta.removals.length,
|
|
305
|
+
},
|
|
306
|
+
context: {
|
|
307
|
+
graph: store,
|
|
308
|
+
env: {
|
|
309
|
+
transactionMode: 'pre',
|
|
310
|
+
strictMode: this.strictMode,
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
knowledgeHookResults = await this.executeAllKnowledgeHooks(event, {
|
|
316
|
+
basePath: this.basePath,
|
|
317
|
+
strictMode: this.strictMode,
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
// Check if any knowledge hooks failed
|
|
321
|
+
const failedHooks = knowledgeHookResults.filter(
|
|
322
|
+
result => !result.success || result.cancelled
|
|
323
|
+
);
|
|
324
|
+
if (failedHooks.length > 0 && this.strictMode) {
|
|
325
|
+
throw new Error(`Knowledge hooks failed: ${failedHooks.map(h => h.error).join(', ')}`);
|
|
326
|
+
}
|
|
327
|
+
} catch (error) {
|
|
328
|
+
if (this.strictMode) {
|
|
329
|
+
throw error;
|
|
330
|
+
}
|
|
331
|
+
console.error('Knowledge hook execution failed:', error.message);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Apply transaction using parent class
|
|
336
|
+
const transactionResult = await super.apply(store, validatedDelta, options);
|
|
337
|
+
|
|
338
|
+
// Execute post-transaction knowledge hooks
|
|
339
|
+
if (this.enableKnowledgeHooks && this.knowledgeHooks.size > 0) {
|
|
340
|
+
try {
|
|
341
|
+
const postEvent = {
|
|
342
|
+
name: 'transaction-post',
|
|
343
|
+
payload: {
|
|
344
|
+
delta: validatedDelta,
|
|
345
|
+
storeSize: transactionResult.store.size,
|
|
346
|
+
additionsCount: validatedDelta.additions.length,
|
|
347
|
+
removalsCount: validatedDelta.removals.length,
|
|
348
|
+
transactionCommitted: transactionResult.receipt.committed,
|
|
349
|
+
},
|
|
350
|
+
context: {
|
|
351
|
+
graph: transactionResult.store,
|
|
352
|
+
env: {
|
|
353
|
+
transactionMode: 'post',
|
|
354
|
+
strictMode: this.strictMode,
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
const postKnowledgeHookResults = await this.executeAllKnowledgeHooks(postEvent, {
|
|
360
|
+
basePath: this.basePath,
|
|
361
|
+
strictMode: this.strictMode,
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
knowledgeHookResults = [...knowledgeHookResults, ...postKnowledgeHookResults];
|
|
365
|
+
} catch (error) {
|
|
366
|
+
if (this.strictMode) {
|
|
367
|
+
throw error;
|
|
368
|
+
}
|
|
369
|
+
console.error('Post-transaction knowledge hook execution failed:', error.message);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Add knowledge hook results to receipt
|
|
374
|
+
transactionResult.receipt.knowledgeHookResults = knowledgeHookResults;
|
|
375
|
+
transactionResult.receipt.knowledgeHookDuration = Date.now() - startTime;
|
|
376
|
+
|
|
377
|
+
return transactionResult;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Get comprehensive statistics including knowledge hooks.
|
|
382
|
+
* @returns {Object} Manager statistics
|
|
383
|
+
*/
|
|
384
|
+
getStats() {
|
|
385
|
+
const baseStats = super.getStats();
|
|
386
|
+
const hookExecutorStats = this.hookExecutor.getMetrics();
|
|
387
|
+
const conditionEvaluatorStats = this.conditionEvaluator.getCacheStats();
|
|
388
|
+
|
|
389
|
+
return {
|
|
390
|
+
...baseStats,
|
|
391
|
+
knowledgeHooks: {
|
|
392
|
+
total: this.knowledgeHooks.size,
|
|
393
|
+
enabled: this.enableKnowledgeHooks,
|
|
394
|
+
strictMode: this.strictMode,
|
|
395
|
+
},
|
|
396
|
+
hookExecutor: hookExecutorStats,
|
|
397
|
+
conditionEvaluator: conditionEvaluatorStats,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Load and activate a policy pack
|
|
403
|
+
* @param {string} packName - Policy pack name
|
|
404
|
+
* @returns {Promise<boolean>} Success
|
|
405
|
+
*/
|
|
406
|
+
async loadPolicyPack(packName) {
|
|
407
|
+
try {
|
|
408
|
+
await this.policyPackManager.loadAllPolicyPacks();
|
|
409
|
+
this.policyPackManager.activatePolicyPack(packName);
|
|
410
|
+
|
|
411
|
+
// Register hooks from the policy pack
|
|
412
|
+
const activeHooks = this.policyPackManager.getActiveHooks();
|
|
413
|
+
for (const hook of activeHooks) {
|
|
414
|
+
this.addKnowledgeHook(hook);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
return true;
|
|
418
|
+
} catch (error) {
|
|
419
|
+
console.error(`Failed to load policy pack ${packName}:`, error.message);
|
|
420
|
+
return false;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Deactivate a policy pack
|
|
426
|
+
* @param {string} packName - Policy pack name
|
|
427
|
+
* @returns {boolean} Success
|
|
428
|
+
*/
|
|
429
|
+
deactivatePolicyPack(packName) {
|
|
430
|
+
const success = this.policyPackManager.deactivatePolicyPack(packName);
|
|
431
|
+
|
|
432
|
+
if (success) {
|
|
433
|
+
// Remove hooks from the deactivated policy pack
|
|
434
|
+
const pack = this.policyPackManager.getPolicyPack(packName);
|
|
435
|
+
if (pack) {
|
|
436
|
+
const packHooks = pack.getHooks();
|
|
437
|
+
for (const hook of packHooks) {
|
|
438
|
+
this.removeKnowledgeHook(hook.meta.name);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
return success;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Get all active policy packs
|
|
448
|
+
* @returns {Array} Array of active policy packs
|
|
449
|
+
*/
|
|
450
|
+
getActivePolicyPacks() {
|
|
451
|
+
return this.policyPackManager.getActivePolicyPacks();
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Get policy pack manager
|
|
456
|
+
* @returns {PolicyPackManager} Policy pack manager
|
|
457
|
+
*/
|
|
458
|
+
getPolicyPackManager() {
|
|
459
|
+
return this.policyPackManager;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Clear all caches and reset state.
|
|
464
|
+
*/
|
|
465
|
+
clearCaches() {
|
|
466
|
+
this.hookExecutor.clearCache?.();
|
|
467
|
+
this.conditionEvaluator.clearCache?.();
|
|
468
|
+
}
|
|
469
|
+
}
|