@vorionsys/a3i 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +190 -0
- package/dist/api/handlers.d.ts +231 -0
- package/dist/api/handlers.d.ts.map +1 -0
- package/dist/api/handlers.js +279 -0
- package/dist/api/handlers.js.map +1 -0
- package/dist/api/index.d.ts +24 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +27 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/middleware.d.ts +106 -0
- package/dist/api/middleware.d.ts.map +1 -0
- package/dist/api/middleware.js +186 -0
- package/dist/api/middleware.js.map +1 -0
- package/dist/api/routes.d.ts +41 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +91 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/authorization/constraints.d.ts +75 -0
- package/dist/authorization/constraints.d.ts.map +1 -0
- package/dist/authorization/constraints.js +302 -0
- package/dist/authorization/constraints.js.map +1 -0
- package/dist/authorization/decision.d.ts +98 -0
- package/dist/authorization/decision.d.ts.map +1 -0
- package/dist/authorization/decision.js +202 -0
- package/dist/authorization/decision.js.map +1 -0
- package/dist/authorization/engine.d.ts +141 -0
- package/dist/authorization/engine.d.ts.map +1 -0
- package/dist/authorization/engine.js +339 -0
- package/dist/authorization/engine.js.map +1 -0
- package/dist/authorization/index.d.ts +10 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +13 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/banding/band-calculator.d.ts +137 -0
- package/dist/banding/band-calculator.d.ts.map +1 -0
- package/dist/banding/band-calculator.js +252 -0
- package/dist/banding/band-calculator.js.map +1 -0
- package/dist/banding/bands.d.ts +56 -0
- package/dist/banding/bands.d.ts.map +1 -0
- package/dist/banding/bands.js +200 -0
- package/dist/banding/bands.js.map +1 -0
- package/dist/banding/hysteresis.d.ts +64 -0
- package/dist/banding/hysteresis.d.ts.map +1 -0
- package/dist/banding/hysteresis.js +143 -0
- package/dist/banding/hysteresis.js.map +1 -0
- package/dist/banding/index.d.ts +10 -0
- package/dist/banding/index.d.ts.map +1 -0
- package/dist/banding/index.js +10 -0
- package/dist/banding/index.js.map +1 -0
- package/dist/canary/canary-service.d.ts +123 -0
- package/dist/canary/canary-service.d.ts.map +1 -0
- package/dist/canary/canary-service.js +353 -0
- package/dist/canary/canary-service.js.map +1 -0
- package/dist/canary/index.d.ts +12 -0
- package/dist/canary/index.d.ts.map +1 -0
- package/dist/canary/index.js +14 -0
- package/dist/canary/index.js.map +1 -0
- package/dist/canary/probe-library.d.ts +43 -0
- package/dist/canary/probe-library.d.ts.map +1 -0
- package/dist/canary/probe-library.js +655 -0
- package/dist/canary/probe-library.js.map +1 -0
- package/dist/execution/engine.d.ts +120 -0
- package/dist/execution/engine.d.ts.map +1 -0
- package/dist/execution/engine.js +220 -0
- package/dist/execution/engine.js.map +1 -0
- package/dist/execution/index.d.ts +7 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +7 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/gate/index.d.ts +12 -0
- package/dist/gate/index.d.ts.map +1 -0
- package/dist/gate/index.js +14 -0
- package/dist/gate/index.js.map +1 -0
- package/dist/gate/pre-action-gate.d.ts +87 -0
- package/dist/gate/pre-action-gate.d.ts.map +1 -0
- package/dist/gate/pre-action-gate.js +286 -0
- package/dist/gate/pre-action-gate.js.map +1 -0
- package/dist/gate/risk-classifier.d.ts +43 -0
- package/dist/gate/risk-classifier.d.ts.map +1 -0
- package/dist/gate/risk-classifier.js +157 -0
- package/dist/gate/risk-classifier.js.map +1 -0
- package/dist/hooks/executor.d.ts +56 -0
- package/dist/hooks/executor.d.ts.map +1 -0
- package/dist/hooks/executor.js +217 -0
- package/dist/hooks/executor.js.map +1 -0
- package/dist/hooks/index.d.ts +45 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +49 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/manager.d.ts +156 -0
- package/dist/hooks/manager.d.ts.map +1 -0
- package/dist/hooks/manager.js +267 -0
- package/dist/hooks/manager.js.map +1 -0
- package/dist/hooks/registry.d.ts +130 -0
- package/dist/hooks/registry.d.ts.map +1 -0
- package/dist/hooks/registry.js +238 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/types.d.ts +226 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +41 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/observation/attestation.d.ts +102 -0
- package/dist/observation/attestation.d.ts.map +1 -0
- package/dist/observation/attestation.js +127 -0
- package/dist/observation/attestation.js.map +1 -0
- package/dist/observation/ceilings.d.ts +60 -0
- package/dist/observation/ceilings.d.ts.map +1 -0
- package/dist/observation/ceilings.js +110 -0
- package/dist/observation/ceilings.js.map +1 -0
- package/dist/observation/index.d.ts +11 -0
- package/dist/observation/index.d.ts.map +1 -0
- package/dist/observation/index.js +14 -0
- package/dist/observation/index.js.map +1 -0
- package/dist/observation/tiers.d.ts +96 -0
- package/dist/observation/tiers.d.ts.map +1 -0
- package/dist/observation/tiers.js +225 -0
- package/dist/observation/tiers.js.map +1 -0
- package/dist/orchestrator/index.d.ts +8 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +8 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +225 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.js +302 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/proof-plane-adapter.d.ts +80 -0
- package/dist/orchestrator/proof-plane-adapter.d.ts.map +1 -0
- package/dist/orchestrator/proof-plane-adapter.js +78 -0
- package/dist/orchestrator/proof-plane-adapter.js.map +1 -0
- package/dist/trust/calculator.d.ts +60 -0
- package/dist/trust/calculator.d.ts.map +1 -0
- package/dist/trust/calculator.js +163 -0
- package/dist/trust/calculator.js.map +1 -0
- package/dist/trust/dimensions.d.ts +133 -0
- package/dist/trust/dimensions.d.ts.map +1 -0
- package/dist/trust/dimensions.js +257 -0
- package/dist/trust/dimensions.js.map +1 -0
- package/dist/trust/index.d.ts +14 -0
- package/dist/trust/index.d.ts.map +1 -0
- package/dist/trust/index.js +25 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/trust/profile-service.d.ts +179 -0
- package/dist/trust/profile-service.d.ts.map +1 -0
- package/dist/trust/profile-service.js +378 -0
- package/dist/trust/profile-service.js.map +1 -0
- package/dist/trust/profile-store.d.ts +122 -0
- package/dist/trust/profile-store.d.ts.map +1 -0
- package/dist/trust/profile-store.js +132 -0
- package/dist/trust/profile-store.js.map +1 -0
- package/dist/trust/trust-calculator.d.ts +111 -0
- package/dist/trust/trust-calculator.d.ts.map +1 -0
- package/dist/trust/trust-calculator.js +271 -0
- package/dist/trust/trust-calculator.js.map +1 -0
- package/dist/trust/trust-dynamics.d.ts +152 -0
- package/dist/trust/trust-dynamics.d.ts.map +1 -0
- package/dist/trust/trust-dynamics.js +302 -0
- package/dist/trust/trust-dynamics.js.map +1 -0
- package/dist/trust/weights.d.ts +57 -0
- package/dist/trust/weights.d.ts.map +1 -0
- package/dist/trust/weights.js +75 -0
- package/dist/trust/weights.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook Manager - High-level API for the hook system
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified interface for registering and executing hooks.
|
|
5
|
+
*/
|
|
6
|
+
import { HookPhase, } from './types.js';
|
|
7
|
+
import { createHookRegistry, } from './registry.js';
|
|
8
|
+
import { createHookExecutor, successResult, abortResult, errorResult, } from './executor.js';
|
|
9
|
+
/**
|
|
10
|
+
* HookManager - High-level hook management API
|
|
11
|
+
*/
|
|
12
|
+
export class HookManager {
|
|
13
|
+
registry;
|
|
14
|
+
executor;
|
|
15
|
+
config;
|
|
16
|
+
constructor(config = {}) {
|
|
17
|
+
this.registry = config.registry ?? createHookRegistry();
|
|
18
|
+
this.executor = createHookExecutor(this.registry);
|
|
19
|
+
this.config = {
|
|
20
|
+
registry: this.registry,
|
|
21
|
+
defaultExecutionOptions: config.defaultExecutionOptions ?? {},
|
|
22
|
+
enableLogging: config.enableLogging ?? false,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// ============================================================
|
|
26
|
+
// Hook Registration - Type-safe methods for each phase
|
|
27
|
+
// ============================================================
|
|
28
|
+
/**
|
|
29
|
+
* Register a pre-authorize hook
|
|
30
|
+
*/
|
|
31
|
+
onPreAuthorize(name, handler, options) {
|
|
32
|
+
return this.registry.register({
|
|
33
|
+
name,
|
|
34
|
+
phase: HookPhase.PRE_AUTHORIZE,
|
|
35
|
+
handler,
|
|
36
|
+
...options,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Register a post-authorize hook
|
|
41
|
+
*/
|
|
42
|
+
onPostAuthorize(name, handler, options) {
|
|
43
|
+
return this.registry.register({
|
|
44
|
+
name,
|
|
45
|
+
phase: HookPhase.POST_AUTHORIZE,
|
|
46
|
+
handler,
|
|
47
|
+
...options,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Register a pre-execute hook
|
|
52
|
+
*/
|
|
53
|
+
onPreExecute(name, handler, options) {
|
|
54
|
+
return this.registry.register({
|
|
55
|
+
name,
|
|
56
|
+
phase: HookPhase.PRE_EXECUTE,
|
|
57
|
+
handler,
|
|
58
|
+
...options,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Register a post-execute hook
|
|
63
|
+
*/
|
|
64
|
+
onPostExecute(name, handler, options) {
|
|
65
|
+
return this.registry.register({
|
|
66
|
+
name,
|
|
67
|
+
phase: HookPhase.POST_EXECUTE,
|
|
68
|
+
handler,
|
|
69
|
+
...options,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Register an execution-failed hook
|
|
74
|
+
*/
|
|
75
|
+
onExecutionFailed(name, handler, options) {
|
|
76
|
+
return this.registry.register({
|
|
77
|
+
name,
|
|
78
|
+
phase: HookPhase.EXECUTION_FAILED,
|
|
79
|
+
handler,
|
|
80
|
+
...options,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Register a trust-change hook
|
|
85
|
+
*/
|
|
86
|
+
onTrustChange(name, handler, options) {
|
|
87
|
+
return this.registry.register({
|
|
88
|
+
name,
|
|
89
|
+
phase: HookPhase.TRUST_CHANGE,
|
|
90
|
+
handler,
|
|
91
|
+
...options,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Register a trust-violation hook
|
|
96
|
+
*/
|
|
97
|
+
onTrustViolation(name, handler, options) {
|
|
98
|
+
return this.registry.register({
|
|
99
|
+
name,
|
|
100
|
+
phase: HookPhase.TRUST_VIOLATION,
|
|
101
|
+
handler,
|
|
102
|
+
...options,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Register an event-emitted hook
|
|
107
|
+
*/
|
|
108
|
+
onEventEmitted(name, handler, options) {
|
|
109
|
+
return this.registry.register({
|
|
110
|
+
name,
|
|
111
|
+
phase: HookPhase.EVENT_EMITTED,
|
|
112
|
+
handler,
|
|
113
|
+
...options,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Register a hook with full options
|
|
118
|
+
*/
|
|
119
|
+
register(options) {
|
|
120
|
+
return this.registry.register(options);
|
|
121
|
+
}
|
|
122
|
+
// ============================================================
|
|
123
|
+
// Hook Execution
|
|
124
|
+
// ============================================================
|
|
125
|
+
/**
|
|
126
|
+
* Execute pre-authorize hooks
|
|
127
|
+
*/
|
|
128
|
+
async executePreAuthorize(context, options) {
|
|
129
|
+
return this.execute(HookPhase.PRE_AUTHORIZE, context, options);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Execute post-authorize hooks
|
|
133
|
+
*/
|
|
134
|
+
async executePostAuthorize(context, options) {
|
|
135
|
+
return this.execute(HookPhase.POST_AUTHORIZE, context, options);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Execute pre-execute hooks
|
|
139
|
+
*/
|
|
140
|
+
async executePreExecute(context, options) {
|
|
141
|
+
return this.execute(HookPhase.PRE_EXECUTE, context, options);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Execute post-execute hooks
|
|
145
|
+
*/
|
|
146
|
+
async executePostExecute(context, options) {
|
|
147
|
+
return this.execute(HookPhase.POST_EXECUTE, context, options);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Execute execution-failed hooks
|
|
151
|
+
*/
|
|
152
|
+
async executeExecutionFailed(context, options) {
|
|
153
|
+
return this.execute(HookPhase.EXECUTION_FAILED, context, options);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Execute trust-change hooks
|
|
157
|
+
*/
|
|
158
|
+
async executeTrustChange(context, options) {
|
|
159
|
+
return this.execute(HookPhase.TRUST_CHANGE, context, options);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Execute trust-violation hooks
|
|
163
|
+
*/
|
|
164
|
+
async executeTrustViolation(context, options) {
|
|
165
|
+
return this.execute(HookPhase.TRUST_VIOLATION, context, options);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Execute event-emitted hooks
|
|
169
|
+
*/
|
|
170
|
+
async executeEventEmitted(context, options) {
|
|
171
|
+
return this.execute(HookPhase.EVENT_EMITTED, context, options);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Execute hooks for a phase
|
|
175
|
+
*/
|
|
176
|
+
async execute(phase, context, options) {
|
|
177
|
+
const mergedOptions = { ...this.config.defaultExecutionOptions, ...options };
|
|
178
|
+
const summary = await this.executor.execute(phase, context, mergedOptions);
|
|
179
|
+
if (this.config.enableLogging) {
|
|
180
|
+
this.logSummary(summary);
|
|
181
|
+
}
|
|
182
|
+
return summary;
|
|
183
|
+
}
|
|
184
|
+
// ============================================================
|
|
185
|
+
// Hook Management
|
|
186
|
+
// ============================================================
|
|
187
|
+
/**
|
|
188
|
+
* Unregister a hook
|
|
189
|
+
*/
|
|
190
|
+
unregister(hookId) {
|
|
191
|
+
return this.registry.unregister(hookId);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Enable a hook
|
|
195
|
+
*/
|
|
196
|
+
enable(hookId) {
|
|
197
|
+
return this.registry.enable(hookId);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Disable a hook
|
|
201
|
+
*/
|
|
202
|
+
disable(hookId) {
|
|
203
|
+
return this.registry.disable(hookId);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get a hook by ID
|
|
207
|
+
*/
|
|
208
|
+
getHook(hookId) {
|
|
209
|
+
return this.registry.get(hookId);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get all hooks for a phase
|
|
213
|
+
*/
|
|
214
|
+
getHooksForPhase(phase) {
|
|
215
|
+
return this.registry.getByPhase(phase);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get hook statistics
|
|
219
|
+
*/
|
|
220
|
+
getStats() {
|
|
221
|
+
return this.registry.getStats();
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Clear all hooks
|
|
225
|
+
*/
|
|
226
|
+
clear() {
|
|
227
|
+
this.registry.clear();
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get the underlying registry
|
|
231
|
+
*/
|
|
232
|
+
getRegistry() {
|
|
233
|
+
return this.registry;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get the underlying executor
|
|
237
|
+
*/
|
|
238
|
+
getExecutor() {
|
|
239
|
+
return this.executor;
|
|
240
|
+
}
|
|
241
|
+
// ============================================================
|
|
242
|
+
// Private Methods
|
|
243
|
+
// ============================================================
|
|
244
|
+
logSummary(summary) {
|
|
245
|
+
const status = summary.aborted ? 'ABORTED' : summary.failed > 0 ? 'FAILED' : 'OK';
|
|
246
|
+
console.log(`[Hooks] ${summary.phase}: ${status} - ` +
|
|
247
|
+
`${summary.succeeded}/${summary.hooksExecuted} succeeded ` +
|
|
248
|
+
`(${summary.totalDurationMs}ms)`);
|
|
249
|
+
if (summary.aborted && summary.abortReason) {
|
|
250
|
+
console.log(`[Hooks] Abort reason: ${summary.abortReason}`);
|
|
251
|
+
}
|
|
252
|
+
for (const result of summary.results) {
|
|
253
|
+
if (!result.result.success) {
|
|
254
|
+
console.log(`[Hooks] ${result.hookName} failed: ${result.result.error?.message}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Create a hook manager
|
|
261
|
+
*/
|
|
262
|
+
export function createHookManager(config) {
|
|
263
|
+
return new HookManager(config);
|
|
264
|
+
}
|
|
265
|
+
// Re-export utility functions
|
|
266
|
+
export { successResult, abortResult, errorResult };
|
|
267
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/hooks/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook Registry - Central registry for hook management
|
|
3
|
+
*
|
|
4
|
+
* Manages registration, retrieval, and lifecycle of hooks.
|
|
5
|
+
*/
|
|
6
|
+
import { HookPhase, HookPriority, type HookDefinition, type HookHandler, type AnyHookContext } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Options for registering a hook
|
|
9
|
+
*/
|
|
10
|
+
export interface RegisterHookOptions<T extends AnyHookContext = AnyHookContext> {
|
|
11
|
+
/** Unique hook ID (auto-generated if not provided) */
|
|
12
|
+
id?: string;
|
|
13
|
+
/** Hook name */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Hook phase */
|
|
16
|
+
phase: HookPhase;
|
|
17
|
+
/** The handler function */
|
|
18
|
+
handler: HookHandler<T>;
|
|
19
|
+
/** Execution priority (default: NORMAL) */
|
|
20
|
+
priority?: HookPriority;
|
|
21
|
+
/** Whether enabled (default: true) */
|
|
22
|
+
enabled?: boolean;
|
|
23
|
+
/** Timeout in ms (default: 5000) */
|
|
24
|
+
timeoutMs?: number;
|
|
25
|
+
/** Continue on error (default: false) */
|
|
26
|
+
continueOnError?: boolean;
|
|
27
|
+
/** Filter function */
|
|
28
|
+
filter?: (context: T) => boolean;
|
|
29
|
+
/** Metadata */
|
|
30
|
+
metadata?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Hook registry error
|
|
34
|
+
*/
|
|
35
|
+
export declare class HookRegistryError extends Error {
|
|
36
|
+
readonly code: HookRegistryErrorCode;
|
|
37
|
+
readonly hookId?: string | undefined;
|
|
38
|
+
constructor(message: string, code: HookRegistryErrorCode, hookId?: string | undefined);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Error codes for hook registry
|
|
42
|
+
*/
|
|
43
|
+
export declare enum HookRegistryErrorCode {
|
|
44
|
+
DUPLICATE_HOOK = "DUPLICATE_HOOK",
|
|
45
|
+
HOOK_NOT_FOUND = "HOOK_NOT_FOUND",
|
|
46
|
+
INVALID_HOOK = "INVALID_HOOK"
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* HookRegistry - Manages hook registration and retrieval
|
|
50
|
+
*/
|
|
51
|
+
export declare class HookRegistry {
|
|
52
|
+
private hooks;
|
|
53
|
+
private hooksByPhase;
|
|
54
|
+
constructor();
|
|
55
|
+
/**
|
|
56
|
+
* Register a new hook
|
|
57
|
+
*/
|
|
58
|
+
register<T extends AnyHookContext>(options: RegisterHookOptions<T>): HookDefinition<T>;
|
|
59
|
+
/**
|
|
60
|
+
* Unregister a hook
|
|
61
|
+
*/
|
|
62
|
+
unregister(hookId: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Get a hook by ID
|
|
65
|
+
*/
|
|
66
|
+
get<T extends AnyHookContext>(hookId: string): HookDefinition<T> | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* Get all hooks for a phase, sorted by priority
|
|
69
|
+
*/
|
|
70
|
+
getByPhase<T extends AnyHookContext>(phase: HookPhase): HookDefinition<T>[];
|
|
71
|
+
/**
|
|
72
|
+
* Get enabled hooks for a phase, sorted by priority
|
|
73
|
+
*/
|
|
74
|
+
getEnabledByPhase<T extends AnyHookContext>(phase: HookPhase): HookDefinition<T>[];
|
|
75
|
+
/**
|
|
76
|
+
* Enable a hook
|
|
77
|
+
*/
|
|
78
|
+
enable(hookId: string): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Disable a hook
|
|
81
|
+
*/
|
|
82
|
+
disable(hookId: string): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Check if a hook exists
|
|
85
|
+
*/
|
|
86
|
+
has(hookId: string): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Get the count of hooks
|
|
89
|
+
*/
|
|
90
|
+
count(phase?: HookPhase): number;
|
|
91
|
+
/**
|
|
92
|
+
* Get all hook IDs
|
|
93
|
+
*/
|
|
94
|
+
getIds(): string[];
|
|
95
|
+
/**
|
|
96
|
+
* Get all hooks
|
|
97
|
+
*/
|
|
98
|
+
getAll(): HookDefinition[];
|
|
99
|
+
/**
|
|
100
|
+
* Clear all hooks
|
|
101
|
+
*/
|
|
102
|
+
clear(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Clear hooks for a specific phase
|
|
105
|
+
*/
|
|
106
|
+
clearPhase(phase: HookPhase): void;
|
|
107
|
+
/**
|
|
108
|
+
* Get statistics about registered hooks
|
|
109
|
+
*/
|
|
110
|
+
getStats(): {
|
|
111
|
+
totalHooks: number;
|
|
112
|
+
enabledHooks: number;
|
|
113
|
+
disabledHooks: number;
|
|
114
|
+
byPhase: Record<string, number>;
|
|
115
|
+
byPriority: Record<string, number>;
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create a new hook registry
|
|
120
|
+
*/
|
|
121
|
+
export declare function createHookRegistry(): HookRegistry;
|
|
122
|
+
/**
|
|
123
|
+
* Get or create the global hook registry
|
|
124
|
+
*/
|
|
125
|
+
export declare function getGlobalHookRegistry(): HookRegistry;
|
|
126
|
+
/**
|
|
127
|
+
* Reset the global hook registry (for testing)
|
|
128
|
+
*/
|
|
129
|
+
export declare function resetGlobalHookRegistry(): void;
|
|
130
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/hooks/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook Registry - Central registry for hook management
|
|
3
|
+
*
|
|
4
|
+
* Manages registration, retrieval, and lifecycle of hooks.
|
|
5
|
+
*/
|
|
6
|
+
import { HookPhase, HookPriority, } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Hook registry error
|
|
9
|
+
*/
|
|
10
|
+
export class HookRegistryError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
hookId;
|
|
13
|
+
constructor(message, code, hookId) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.hookId = hookId;
|
|
17
|
+
this.name = 'HookRegistryError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Error codes for hook registry
|
|
22
|
+
*/
|
|
23
|
+
export var HookRegistryErrorCode;
|
|
24
|
+
(function (HookRegistryErrorCode) {
|
|
25
|
+
HookRegistryErrorCode["DUPLICATE_HOOK"] = "DUPLICATE_HOOK";
|
|
26
|
+
HookRegistryErrorCode["HOOK_NOT_FOUND"] = "HOOK_NOT_FOUND";
|
|
27
|
+
HookRegistryErrorCode["INVALID_HOOK"] = "INVALID_HOOK";
|
|
28
|
+
})(HookRegistryErrorCode || (HookRegistryErrorCode = {}));
|
|
29
|
+
/**
|
|
30
|
+
* Counter for generating unique hook IDs
|
|
31
|
+
*/
|
|
32
|
+
let hookIdCounter = 0;
|
|
33
|
+
/**
|
|
34
|
+
* Generate a unique hook ID
|
|
35
|
+
*/
|
|
36
|
+
function generateHookId(phase) {
|
|
37
|
+
hookIdCounter++;
|
|
38
|
+
return `${phase}-${hookIdCounter}-${Date.now().toString(36)}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* HookRegistry - Manages hook registration and retrieval
|
|
42
|
+
*/
|
|
43
|
+
export class HookRegistry {
|
|
44
|
+
hooks = new Map();
|
|
45
|
+
hooksByPhase = new Map();
|
|
46
|
+
constructor() {
|
|
47
|
+
// Initialize phase sets
|
|
48
|
+
for (const phase of Object.values(HookPhase)) {
|
|
49
|
+
this.hooksByPhase.set(phase, new Set());
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Register a new hook
|
|
54
|
+
*/
|
|
55
|
+
register(options) {
|
|
56
|
+
const id = options.id ?? generateHookId(options.phase);
|
|
57
|
+
if (this.hooks.has(id)) {
|
|
58
|
+
throw new HookRegistryError(`Hook with ID '${id}' already exists`, HookRegistryErrorCode.DUPLICATE_HOOK, id);
|
|
59
|
+
}
|
|
60
|
+
const hook = {
|
|
61
|
+
id,
|
|
62
|
+
name: options.name,
|
|
63
|
+
phase: options.phase,
|
|
64
|
+
priority: options.priority ?? HookPriority.NORMAL,
|
|
65
|
+
handler: options.handler,
|
|
66
|
+
enabled: options.enabled ?? true,
|
|
67
|
+
timeoutMs: options.timeoutMs ?? 5000,
|
|
68
|
+
continueOnError: options.continueOnError ?? false,
|
|
69
|
+
filter: options.filter,
|
|
70
|
+
metadata: options.metadata,
|
|
71
|
+
};
|
|
72
|
+
this.hooks.set(id, hook);
|
|
73
|
+
this.hooksByPhase.get(options.phase).add(id);
|
|
74
|
+
return hook;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Unregister a hook
|
|
78
|
+
*/
|
|
79
|
+
unregister(hookId) {
|
|
80
|
+
const hook = this.hooks.get(hookId);
|
|
81
|
+
if (!hook) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
this.hooks.delete(hookId);
|
|
85
|
+
this.hooksByPhase.get(hook.phase).delete(hookId);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get a hook by ID
|
|
90
|
+
*/
|
|
91
|
+
get(hookId) {
|
|
92
|
+
return this.hooks.get(hookId);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get all hooks for a phase, sorted by priority
|
|
96
|
+
*/
|
|
97
|
+
getByPhase(phase) {
|
|
98
|
+
const hookIds = this.hooksByPhase.get(phase) ?? new Set();
|
|
99
|
+
const hooks = [];
|
|
100
|
+
for (const id of hookIds) {
|
|
101
|
+
const hook = this.hooks.get(id);
|
|
102
|
+
if (hook) {
|
|
103
|
+
hooks.push(hook);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Sort by priority (lower number = higher priority)
|
|
107
|
+
return hooks.sort((a, b) => a.priority - b.priority);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get enabled hooks for a phase, sorted by priority
|
|
111
|
+
*/
|
|
112
|
+
getEnabledByPhase(phase) {
|
|
113
|
+
return this.getByPhase(phase).filter(h => h.enabled);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Enable a hook
|
|
117
|
+
*/
|
|
118
|
+
enable(hookId) {
|
|
119
|
+
const hook = this.hooks.get(hookId);
|
|
120
|
+
if (!hook) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
hook.enabled = true;
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Disable a hook
|
|
128
|
+
*/
|
|
129
|
+
disable(hookId) {
|
|
130
|
+
const hook = this.hooks.get(hookId);
|
|
131
|
+
if (!hook) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
hook.enabled = false;
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Check if a hook exists
|
|
139
|
+
*/
|
|
140
|
+
has(hookId) {
|
|
141
|
+
return this.hooks.has(hookId);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get the count of hooks
|
|
145
|
+
*/
|
|
146
|
+
count(phase) {
|
|
147
|
+
if (phase) {
|
|
148
|
+
return this.hooksByPhase.get(phase)?.size ?? 0;
|
|
149
|
+
}
|
|
150
|
+
return this.hooks.size;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get all hook IDs
|
|
154
|
+
*/
|
|
155
|
+
getIds() {
|
|
156
|
+
return Array.from(this.hooks.keys());
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get all hooks
|
|
160
|
+
*/
|
|
161
|
+
getAll() {
|
|
162
|
+
return Array.from(this.hooks.values());
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Clear all hooks
|
|
166
|
+
*/
|
|
167
|
+
clear() {
|
|
168
|
+
this.hooks.clear();
|
|
169
|
+
for (const phase of Object.values(HookPhase)) {
|
|
170
|
+
this.hooksByPhase.set(phase, new Set());
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Clear hooks for a specific phase
|
|
175
|
+
*/
|
|
176
|
+
clearPhase(phase) {
|
|
177
|
+
const hookIds = this.hooksByPhase.get(phase) ?? new Set();
|
|
178
|
+
for (const id of hookIds) {
|
|
179
|
+
this.hooks.delete(id);
|
|
180
|
+
}
|
|
181
|
+
this.hooksByPhase.set(phase, new Set());
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get statistics about registered hooks
|
|
185
|
+
*/
|
|
186
|
+
getStats() {
|
|
187
|
+
const byPhase = {};
|
|
188
|
+
const byPriority = {};
|
|
189
|
+
let enabledCount = 0;
|
|
190
|
+
let disabledCount = 0;
|
|
191
|
+
for (const [phase, ids] of this.hooksByPhase) {
|
|
192
|
+
byPhase[phase] = ids.size;
|
|
193
|
+
}
|
|
194
|
+
for (const hook of this.hooks.values()) {
|
|
195
|
+
if (hook.enabled) {
|
|
196
|
+
enabledCount++;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
disabledCount++;
|
|
200
|
+
}
|
|
201
|
+
const priorityName = HookPriority[hook.priority] ?? String(hook.priority);
|
|
202
|
+
byPriority[priorityName] = (byPriority[priorityName] ?? 0) + 1;
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
totalHooks: this.hooks.size,
|
|
206
|
+
enabledHooks: enabledCount,
|
|
207
|
+
disabledHooks: disabledCount,
|
|
208
|
+
byPhase,
|
|
209
|
+
byPriority,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Create a new hook registry
|
|
215
|
+
*/
|
|
216
|
+
export function createHookRegistry() {
|
|
217
|
+
return new HookRegistry();
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Global hook registry singleton
|
|
221
|
+
*/
|
|
222
|
+
let globalRegistry = null;
|
|
223
|
+
/**
|
|
224
|
+
* Get or create the global hook registry
|
|
225
|
+
*/
|
|
226
|
+
export function getGlobalHookRegistry() {
|
|
227
|
+
if (!globalRegistry) {
|
|
228
|
+
globalRegistry = createHookRegistry();
|
|
229
|
+
}
|
|
230
|
+
return globalRegistry;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Reset the global hook registry (for testing)
|
|
234
|
+
*/
|
|
235
|
+
export function resetGlobalHookRegistry() {
|
|
236
|
+
globalRegistry = null;
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/hooks/registry.ts"],"names":[],"mappings":"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"}
|