@zincapp/zn-vault-agent 1.6.13 → 1.6.15
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/README.md +196 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +15 -0
- package/dist/commands/start.js.map +1 -1
- package/dist/lib/config.d.ts +3 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/health.d.ts +14 -3
- package/dist/lib/health.d.ts.map +1 -1
- package/dist/lib/health.js +115 -94
- package/dist/lib/health.js.map +1 -1
- package/dist/lib/websocket.d.ts.map +1 -1
- package/dist/lib/websocket.js +109 -2
- package/dist/lib/websocket.js.map +1 -1
- package/dist/plugins/context.d.ts +17 -0
- package/dist/plugins/context.d.ts.map +1 -0
- package/dist/plugins/context.js +175 -0
- package/dist/plugins/context.js.map +1 -0
- package/dist/plugins/index.d.ts +5 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +9 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +116 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +399 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/storage.d.ts +18 -0
- package/dist/plugins/storage.d.ts.map +1 -0
- package/dist/plugins/storage.js +166 -0
- package/dist/plugins/storage.js.map +1 -0
- package/dist/plugins/types.d.ts +341 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +12 -0
- package/dist/plugins/types.js.map +1 -0
- package/package.json +13 -1
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// Path: src/plugins/context.ts
|
|
2
|
+
// Plugin context implementation - provides safe access to agent internals
|
|
3
|
+
import { EventEmitter } from 'node:events';
|
|
4
|
+
import { createLogger } from '../lib/logger.js';
|
|
5
|
+
import { getSecret as apiGetSecret, decryptCertificate } from '../lib/api.js';
|
|
6
|
+
import { getPluginStorage } from './storage.js';
|
|
7
|
+
/**
|
|
8
|
+
* Inter-plugin event emitter (singleton)
|
|
9
|
+
*/
|
|
10
|
+
const pluginEventEmitter = new EventEmitter();
|
|
11
|
+
pluginEventEmitter.setMaxListeners(50); // Support many plugins
|
|
12
|
+
/**
|
|
13
|
+
* Create a plugin context for a specific plugin
|
|
14
|
+
*/
|
|
15
|
+
export function createPluginContext(pluginName, agentInternals, _loader) {
|
|
16
|
+
const logger = createLogger({ module: `plugin:${pluginName}` });
|
|
17
|
+
return {
|
|
18
|
+
logger,
|
|
19
|
+
// Read-only config snapshot
|
|
20
|
+
get config() {
|
|
21
|
+
return Object.freeze({ ...agentInternals.config });
|
|
22
|
+
},
|
|
23
|
+
get vaultUrl() {
|
|
24
|
+
return agentInternals.config.vaultUrl;
|
|
25
|
+
},
|
|
26
|
+
get tenantId() {
|
|
27
|
+
return agentInternals.config.tenantId;
|
|
28
|
+
},
|
|
29
|
+
/**
|
|
30
|
+
* Fetch a secret from vault by alias or ID
|
|
31
|
+
*/
|
|
32
|
+
async getSecret(aliasOrId) {
|
|
33
|
+
logger.debug({ aliasOrId }, 'Plugin fetching secret');
|
|
34
|
+
const decrypted = await apiGetSecret(aliasOrId);
|
|
35
|
+
return {
|
|
36
|
+
id: decrypted.id,
|
|
37
|
+
alias: decrypted.alias,
|
|
38
|
+
data: decrypted.data,
|
|
39
|
+
version: decrypted.version,
|
|
40
|
+
type: decrypted.type,
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
/**
|
|
44
|
+
* Get certificate content by ID or name
|
|
45
|
+
*/
|
|
46
|
+
async getCertificate(certIdOrName) {
|
|
47
|
+
logger.debug({ certIdOrName }, 'Plugin fetching certificate');
|
|
48
|
+
// Find cert ID from targets if name given
|
|
49
|
+
let certId = certIdOrName;
|
|
50
|
+
const targets = agentInternals.config.targets || [];
|
|
51
|
+
const target = targets.find(t => t.name === certIdOrName || t.certId === certIdOrName);
|
|
52
|
+
if (target) {
|
|
53
|
+
certId = target.certId;
|
|
54
|
+
}
|
|
55
|
+
// Decrypt certificate from vault
|
|
56
|
+
const decrypted = await decryptCertificate(certId, 'plugin-access');
|
|
57
|
+
// Parse PEM to extract components
|
|
58
|
+
const certData = decrypted.certificateData;
|
|
59
|
+
const parts = parsePemBundle(certData);
|
|
60
|
+
return {
|
|
61
|
+
id: decrypted.id,
|
|
62
|
+
name: target?.name || certId,
|
|
63
|
+
certificate: parts.certificate,
|
|
64
|
+
privateKey: parts.privateKey,
|
|
65
|
+
chain: parts.chain,
|
|
66
|
+
fullchain: parts.fullchain,
|
|
67
|
+
fingerprint: decrypted.fingerprintSha256,
|
|
68
|
+
expiresAt: '', // Would need to parse from cert
|
|
69
|
+
commonName: '', // Would need to parse from cert
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
/**
|
|
73
|
+
* Get configured certificate targets
|
|
74
|
+
*/
|
|
75
|
+
getCertTargets() {
|
|
76
|
+
return agentInternals.config.targets || [];
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* Get configured secret targets
|
|
80
|
+
*/
|
|
81
|
+
getSecretTargets() {
|
|
82
|
+
return agentInternals.config.secretTargets || [];
|
|
83
|
+
},
|
|
84
|
+
/**
|
|
85
|
+
* Request child process restart
|
|
86
|
+
*/
|
|
87
|
+
async restartChild(reason) {
|
|
88
|
+
if (agentInternals.restartChild) {
|
|
89
|
+
logger.info({ reason }, 'Plugin requesting child restart');
|
|
90
|
+
await agentInternals.restartChild(reason);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
logger.debug('restartChild called but no exec mode configured');
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
/**
|
|
97
|
+
* Get current child process state
|
|
98
|
+
*/
|
|
99
|
+
getChildState() {
|
|
100
|
+
if (agentInternals.childProcessManager) {
|
|
101
|
+
return agentInternals.childProcessManager.getState();
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
},
|
|
105
|
+
/**
|
|
106
|
+
* Emit custom event to other plugins
|
|
107
|
+
*/
|
|
108
|
+
emit(event, data) {
|
|
109
|
+
const eventName = `plugin:${event}`;
|
|
110
|
+
logger.debug({ event: eventName }, 'Plugin emitting event');
|
|
111
|
+
pluginEventEmitter.emit(eventName, data);
|
|
112
|
+
},
|
|
113
|
+
/**
|
|
114
|
+
* Listen for custom events from other plugins
|
|
115
|
+
*/
|
|
116
|
+
on(event, handler) {
|
|
117
|
+
const eventName = `plugin:${event}`;
|
|
118
|
+
pluginEventEmitter.on(eventName, handler);
|
|
119
|
+
},
|
|
120
|
+
/**
|
|
121
|
+
* Remove event listener
|
|
122
|
+
*/
|
|
123
|
+
off(event, handler) {
|
|
124
|
+
const eventName = `plugin:${event}`;
|
|
125
|
+
pluginEventEmitter.off(eventName, handler);
|
|
126
|
+
},
|
|
127
|
+
/**
|
|
128
|
+
* Plugin-specific persistent storage
|
|
129
|
+
*/
|
|
130
|
+
storage: getPluginStorage(pluginName),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Parse a PEM bundle into components
|
|
135
|
+
*/
|
|
136
|
+
function parsePemBundle(pemData) {
|
|
137
|
+
const blocks = [];
|
|
138
|
+
const regex = /-----BEGIN ([^-]+)-----[\s\S]*?-----END \1-----/g;
|
|
139
|
+
let match;
|
|
140
|
+
while ((match = regex.exec(pemData)) !== null) {
|
|
141
|
+
blocks.push(match[0]);
|
|
142
|
+
}
|
|
143
|
+
let certificate = '';
|
|
144
|
+
let privateKey = '';
|
|
145
|
+
const chainCerts = [];
|
|
146
|
+
for (const block of blocks) {
|
|
147
|
+
if (block.includes('CERTIFICATE')) {
|
|
148
|
+
if (!certificate) {
|
|
149
|
+
certificate = block;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
chainCerts.push(block);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (block.includes('PRIVATE KEY')) {
|
|
156
|
+
privateKey = block;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const chain = chainCerts.length > 0 ? chainCerts.join('\n') : undefined;
|
|
160
|
+
const fullchain = chain ? `${certificate}\n${chain}` : certificate;
|
|
161
|
+
return { certificate, privateKey, chain, fullchain };
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get the inter-plugin event emitter (for testing)
|
|
165
|
+
*/
|
|
166
|
+
export function getPluginEventEmitter() {
|
|
167
|
+
return pluginEventEmitter;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Clear all plugin event listeners (for testing)
|
|
171
|
+
*/
|
|
172
|
+
export function clearPluginEventListeners() {
|
|
173
|
+
pluginEventEmitter.removeAllListeners();
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/plugins/context.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,0EAA0E;AAE1E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAQ9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD;;GAEG;AACH,MAAM,kBAAkB,GAAG,IAAI,YAAY,EAAE,CAAC;AAC9C,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB;AAE/D;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,cAA8B,EAC9B,OAAqB;IAErB,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,UAAU,EAAE,EAAE,CAAC,CAAC;IAEhE,OAAO;QACL,MAAM;QAEN,4BAA4B;QAC5B,IAAI,MAAM;YACR,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,QAAQ;YACV,OAAO,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;QACxC,CAAC;QAED,IAAI,QAAQ;YACV,OAAO,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;QACxC,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,SAAS,CAAC,SAAiB;YAC/B,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,wBAAwB,CAAC,CAAC;YAEtD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;YAEhD,OAAO;gBACL,EAAE,EAAE,SAAS,CAAC,EAAE;gBAChB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB,CAAC;QACJ,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,cAAc,CAAC,YAAoB;YACvC,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,EAAE,6BAA6B,CAAC,CAAC;YAE9D,0CAA0C;YAC1C,IAAI,MAAM,GAAG,YAAY,CAAC;YAC1B,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;YACvF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACzB,CAAC;YAED,iCAAiC;YACjC,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YAEpE,kCAAkC;YAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,eAAe,CAAC;YAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YAEvC,OAAO;gBACL,EAAE,EAAE,SAAS,CAAC,EAAE;gBAChB,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,MAAM;gBAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,WAAW,EAAE,SAAS,CAAC,iBAAiB;gBACxC,SAAS,EAAE,EAAE,EAAE,gCAAgC;gBAC/C,UAAU,EAAE,EAAE,EAAE,gCAAgC;aACjD,CAAC;QACJ,CAAC;QAED;;WAEG;QACH,cAAc;YACZ,OAAO,cAAc,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QAC7C,CAAC;QAED;;WAEG;QACH,gBAAgB;YACd,OAAO,cAAc,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;QACnD,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,YAAY,CAAC,MAAc;YAC/B,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,iCAAiC,CAAC,CAAC;gBAC3D,MAAM,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED;;WAEG;QACH,aAAa;YACX,IAAI,cAAc,CAAC,mBAAmB,EAAE,CAAC;gBACvC,OAAO,cAAc,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;YACvD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED;;WAEG;QACH,IAAI,CAAC,KAAa,EAAE,IAAa;YAC/B,MAAM,SAAS,GAAG,UAAU,KAAK,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,uBAAuB,CAAC,CAAC;YAC5D,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;QAED;;WAEG;QACH,EAAE,CAAC,KAAa,EAAE,OAAgC;YAChD,MAAM,SAAS,GAAG,UAAU,KAAK,EAAE,CAAC;YACpC,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAED;;WAEG;QACH,GAAG,CAAC,KAAa,EAAE,OAAgC;YACjD,MAAM,SAAS,GAAG,UAAU,KAAK,EAAE,CAAC;YACpC,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QAED;;WAEG;QACH,OAAO,EAAE,gBAAgB,CAAC,UAAU,CAAC;KACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe;IAMrC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,kDAAkD,CAAC;IACjE,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,WAAW,GAAG,KAAK,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACzC,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,WAAW,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAEnE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { AgentPlugin, PluginFactory, PluginConfig, PluginContext, PluginStorage, SecretValue, CertificateContent, CertificateDeployedEvent, SecretDeployedEvent, KeyRotatedEvent, ChildProcessEvent, PluginHealthStatus, LoadedPlugin, PluginEventMap, } from './types.js';
|
|
2
|
+
export { PluginLoader, createPluginLoader, getPluginLoader, clearPluginLoader, type AgentInternals, type PluginLoaderOptions, } from './loader.js';
|
|
3
|
+
export { createPluginContext, getPluginEventEmitter, clearPluginEventListeners, } from './context.js';
|
|
4
|
+
export { getPluginStorage, deletePluginStorage, listPluginsWithStorage, clearStorageCache, } from './storage.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Path: src/plugins/index.ts
|
|
2
|
+
// Plugin system public exports
|
|
3
|
+
// Loader
|
|
4
|
+
export { PluginLoader, createPluginLoader, getPluginLoader, clearPluginLoader, } from './loader.js';
|
|
5
|
+
// Context
|
|
6
|
+
export { createPluginContext, getPluginEventEmitter, clearPluginEventListeners, } from './context.js';
|
|
7
|
+
// Storage
|
|
8
|
+
export { getPluginStorage, deletePluginStorage, listPluginsWithStorage, clearStorageCache, } from './storage.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,+BAA+B;AAoB/B,SAAS;AACT,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAGlB,MAAM,aAAa,CAAC;AAErB,UAAU;AACV,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAEtB,UAAU;AACV,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { FastifyInstance } from 'fastify';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
import type { AgentPlugin, PluginConfig, LoadedPlugin, PluginEventMap, PluginHealthStatus } from './types.js';
|
|
4
|
+
import type { AgentConfig } from '../lib/config.js';
|
|
5
|
+
import type { ChildProcessManager } from '../services/child-process-manager.js';
|
|
6
|
+
/**
|
|
7
|
+
* Agent internals passed to plugin context
|
|
8
|
+
*/
|
|
9
|
+
export interface AgentInternals {
|
|
10
|
+
/** Current agent config */
|
|
11
|
+
config: AgentConfig;
|
|
12
|
+
/** Child process manager (if exec mode) */
|
|
13
|
+
childProcessManager: ChildProcessManager | null;
|
|
14
|
+
/** Restart child process callback */
|
|
15
|
+
restartChild?: (reason: string) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Plugin loader options
|
|
19
|
+
*/
|
|
20
|
+
export interface PluginLoaderOptions {
|
|
21
|
+
/** Plugin directory for local plugins */
|
|
22
|
+
pluginDir?: string;
|
|
23
|
+
/** Skip npm package discovery */
|
|
24
|
+
skipNpmDiscovery?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Manages plugin discovery, loading, and lifecycle
|
|
28
|
+
*/
|
|
29
|
+
export declare class PluginLoader extends EventEmitter {
|
|
30
|
+
private plugins;
|
|
31
|
+
private agentInternals;
|
|
32
|
+
private options;
|
|
33
|
+
private isStarted;
|
|
34
|
+
constructor(agentInternals: AgentInternals, options?: PluginLoaderOptions);
|
|
35
|
+
/**
|
|
36
|
+
* Load all plugins from config and auto-discovered locations
|
|
37
|
+
*/
|
|
38
|
+
loadPlugins(config: AgentConfig): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Load a single plugin by config
|
|
41
|
+
*/
|
|
42
|
+
loadPlugin(config: PluginConfig): Promise<AgentPlugin | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Load plugins from local directory
|
|
45
|
+
*/
|
|
46
|
+
private loadLocalPlugins;
|
|
47
|
+
/**
|
|
48
|
+
* Validate plugin has required fields
|
|
49
|
+
*/
|
|
50
|
+
private validatePlugin;
|
|
51
|
+
/**
|
|
52
|
+
* Initialize all loaded plugins
|
|
53
|
+
*/
|
|
54
|
+
initializePlugins(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Start all initialized plugins
|
|
57
|
+
*/
|
|
58
|
+
startPlugins(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Stop all running plugins
|
|
61
|
+
*/
|
|
62
|
+
stopPlugins(): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Register plugin routes on Fastify server
|
|
65
|
+
*/
|
|
66
|
+
registerRoutes(fastify: FastifyInstance): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Dispatch event to all plugins
|
|
69
|
+
*/
|
|
70
|
+
dispatchEvent<K extends keyof PluginEventMap>(eventType: K, event: PluginEventMap[K]): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Collect health status from all plugins
|
|
73
|
+
*/
|
|
74
|
+
collectHealthStatus(): Promise<PluginHealthStatus[]>;
|
|
75
|
+
/**
|
|
76
|
+
* Get loaded plugins
|
|
77
|
+
*/
|
|
78
|
+
getPlugins(): AgentPlugin[];
|
|
79
|
+
/**
|
|
80
|
+
* Get plugin by name
|
|
81
|
+
*/
|
|
82
|
+
getPlugin(name: string): AgentPlugin | undefined;
|
|
83
|
+
/**
|
|
84
|
+
* Get plugin status
|
|
85
|
+
*/
|
|
86
|
+
getPluginStatus(name: string): LoadedPlugin['status'] | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Get all plugin statuses
|
|
89
|
+
*/
|
|
90
|
+
getAllPluginStatuses(): Array<{
|
|
91
|
+
name: string;
|
|
92
|
+
status: LoadedPlugin['status'];
|
|
93
|
+
error?: string;
|
|
94
|
+
}>;
|
|
95
|
+
/**
|
|
96
|
+
* Check if any plugins are loaded
|
|
97
|
+
*/
|
|
98
|
+
hasPlugins(): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Update agent internals (called when config changes)
|
|
101
|
+
*/
|
|
102
|
+
updateInternals(internals: Partial<AgentInternals>): void;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get or create the plugin loader instance
|
|
106
|
+
*/
|
|
107
|
+
export declare function getPluginLoader(): PluginLoader | null;
|
|
108
|
+
/**
|
|
109
|
+
* Create and set the plugin loader instance
|
|
110
|
+
*/
|
|
111
|
+
export declare function createPluginLoader(agentInternals: AgentInternals, options?: PluginLoaderOptions): PluginLoader;
|
|
112
|
+
/**
|
|
113
|
+
* Clear the plugin loader instance (for testing)
|
|
114
|
+
*/
|
|
115
|
+
export declare function clearPluginLoader(): void;
|
|
116
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}
|