@panguard-ai/manager 0.2.0 → 0.2.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/dist/server.js ADDED
@@ -0,0 +1,468 @@
1
+ /**
2
+ * Manager HTTP API Server
3
+ * Manager HTTP API 伺服器
4
+ *
5
+ * Exposes the Manager orchestrator as a REST API for Guard agents
6
+ * and the Admin dashboard.
7
+ *
8
+ * Endpoints:
9
+ * - POST /api/agents/register Register a new agent
10
+ * - POST /api/agents/:id/heartbeat Agent heartbeat
11
+ * - POST /api/agents/:id/events Submit threat report
12
+ * - DELETE /api/agents/:id Deregister an agent
13
+ * - GET /api/agents List all agents
14
+ * - GET /api/agents/:id Get single agent
15
+ * - GET /api/overview Dashboard overview
16
+ * - GET /api/threats Recent threats
17
+ * - GET /api/threats/summary Threat summary
18
+ * - POST /api/policy Create policy
19
+ * - GET /api/policy/active Get active policy
20
+ * - GET /api/policy/agent/:id Get policy for agent
21
+ * - GET /api/events/stream SSE stream for real-time updates
22
+ * - GET /health Health check
23
+ *
24
+ * @module @panguard-ai/manager/server
25
+ */
26
+ import { createServer } from 'node:http';
27
+ import { createHash, timingSafeEqual } from 'node:crypto';
28
+ import { createLogger } from '@panguard-ai/core';
29
+ import { Manager } from './manager.js';
30
+ const logger = createLogger('panguard-manager:server');
31
+ /**
32
+ * Manager HTTP API Server
33
+ * Wraps the Manager class with a REST API using raw node:http.
34
+ */
35
+ export class ManagerServer {
36
+ server = null;
37
+ manager;
38
+ config;
39
+ rateLimits = new Map();
40
+ hashedAuthToken;
41
+ sseClients = new Set();
42
+ constructor(config) {
43
+ this.config = config;
44
+ this.manager = new Manager(config);
45
+ // In production, require an auth token to prevent unauthenticated access
46
+ if (process.env['NODE_ENV'] === 'production' && !config.authToken) {
47
+ throw new Error('MANAGER_AUTH_TOKEN is required in production. ' +
48
+ 'Generate one with: openssl rand -hex 32');
49
+ }
50
+ // Pre-hash auth token for constant-time comparison
51
+ this.hashedAuthToken = config.authToken
52
+ ? createHash('sha256').update(config.authToken).digest()
53
+ : Buffer.alloc(0);
54
+ }
55
+ /** Get the underlying Manager instance */
56
+ getManager() {
57
+ return this.manager;
58
+ }
59
+ /** Start the HTTP server and Manager service */
60
+ async start() {
61
+ return new Promise((resolve, reject) => {
62
+ this.server = createServer((req, res) => {
63
+ void this.handleRequest(req, res);
64
+ });
65
+ this.server.once('error', (err) => {
66
+ reject(err);
67
+ });
68
+ this.server.listen(this.config.port, () => {
69
+ this.manager.start();
70
+ logger.info(`Manager server started on port ${this.config.port} / ` +
71
+ `Manager 伺服器已啟動於埠 ${this.config.port}`);
72
+ resolve();
73
+ });
74
+ });
75
+ }
76
+ /** Stop the server and Manager service gracefully */
77
+ async stop() {
78
+ // Close all SSE connections / 關閉所有 SSE 連線
79
+ for (const client of this.sseClients) {
80
+ client.end();
81
+ }
82
+ this.sseClients.clear();
83
+ this.manager.stop();
84
+ return new Promise((resolve) => {
85
+ if (this.server) {
86
+ this.server.close(() => resolve());
87
+ setTimeout(() => resolve(), 10_000);
88
+ }
89
+ else {
90
+ resolve();
91
+ }
92
+ });
93
+ }
94
+ // ===== Request Handling / 請求處理 =====
95
+ async handleRequest(req, res) {
96
+ // Security headers
97
+ res.setHeader('X-Content-Type-Options', 'nosniff');
98
+ res.setHeader('X-Frame-Options', 'DENY');
99
+ res.setHeader('X-XSS-Protection', '0');
100
+ res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
101
+ res.setHeader('Content-Type', 'application/json');
102
+ if (process.env['NODE_ENV'] === 'production') {
103
+ res.setHeader('Strict-Transport-Security', 'max-age=63072000; includeSubDomains; preload');
104
+ }
105
+ // CORS
106
+ const corsEnv = process.env['CORS_ALLOWED_ORIGINS'] ?? '';
107
+ const allowedOrigins = corsEnv ? corsEnv.split(',').map((o) => o.trim()) : [];
108
+ const origin = req.headers.origin ?? '';
109
+ if (allowedOrigins.includes('*') && process.env['NODE_ENV'] !== 'production') {
110
+ res.setHeader('Access-Control-Allow-Origin', origin || '*');
111
+ }
112
+ else if (origin && allowedOrigins.includes(origin)) {
113
+ res.setHeader('Access-Control-Allow-Origin', origin);
114
+ }
115
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
116
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
117
+ if (req.method === 'OPTIONS') {
118
+ res.writeHead(204);
119
+ res.end();
120
+ return;
121
+ }
122
+ const clientIP = req.socket.remoteAddress ?? 'unknown';
123
+ // Rate limiting
124
+ if (!this.checkRateLimit(clientIP)) {
125
+ this.sendJson(res, 429, { ok: false, error: 'Rate limit exceeded' });
126
+ return;
127
+ }
128
+ const url = req.url ?? '/';
129
+ const pathname = url.split('?')[0] ?? '/';
130
+ // Health check (no auth required)
131
+ if (pathname === '/health') {
132
+ this.sendJson(res, 200, {
133
+ ok: true,
134
+ data: {
135
+ status: 'healthy',
136
+ uptime: process.uptime(),
137
+ agents: this.manager.getAgentCount(),
138
+ running: this.manager.isRunning(),
139
+ },
140
+ });
141
+ return;
142
+ }
143
+ // Auth check for all other endpoints
144
+ if (!this.verifyAuth(req)) {
145
+ this.sendJson(res, 401, { ok: false, error: 'Unauthorized' });
146
+ return;
147
+ }
148
+ // Content-Type check for POST requests
149
+ if (req.method === 'POST') {
150
+ const contentType = req.headers['content-type'] ?? '';
151
+ if (!contentType.includes('application/json')) {
152
+ this.sendJson(res, 415, { ok: false, error: 'Content-Type must be application/json' });
153
+ return;
154
+ }
155
+ }
156
+ try {
157
+ await this.route(req, res, pathname);
158
+ }
159
+ catch (err) {
160
+ const message = err instanceof Error ? err.message : 'Internal server error';
161
+ logger.error(`Request error: ${message}`);
162
+ this.sendJson(res, 500, { ok: false, error: message });
163
+ }
164
+ }
165
+ /** Route requests to handlers */
166
+ async route(req, res, pathname) {
167
+ const method = req.method ?? 'GET';
168
+ // POST /api/agents/register
169
+ if (pathname === '/api/agents/register' && method === 'POST') {
170
+ await this.handleRegister(req, res);
171
+ return;
172
+ }
173
+ // POST /api/agents/:id/heartbeat
174
+ const heartbeatMatch = pathname.match(/^\/api\/agents\/([^/]+)\/heartbeat$/);
175
+ if (heartbeatMatch && method === 'POST') {
176
+ await this.handleHeartbeat(req, res, heartbeatMatch[1]);
177
+ return;
178
+ }
179
+ // POST /api/agents/:id/events
180
+ const eventsMatch = pathname.match(/^\/api\/agents\/([^/]+)\/events$/);
181
+ if (eventsMatch && method === 'POST') {
182
+ await this.handleEvents(req, res, eventsMatch[1]);
183
+ return;
184
+ }
185
+ // DELETE /api/agents/:id
186
+ const deleteMatch = pathname.match(/^\/api\/agents\/([^/]+)$/);
187
+ if (deleteMatch && method === 'DELETE') {
188
+ this.handleDeregister(res, deleteMatch[1]);
189
+ return;
190
+ }
191
+ // GET /api/agents/:id
192
+ const agentMatch = pathname.match(/^\/api\/agents\/([^/]+)$/);
193
+ if (agentMatch && method === 'GET') {
194
+ this.handleGetAgent(res, agentMatch[1]);
195
+ return;
196
+ }
197
+ // GET /api/agents
198
+ if (pathname === '/api/agents' && method === 'GET') {
199
+ this.handleListAgents(req, res);
200
+ return;
201
+ }
202
+ // GET /api/overview
203
+ if (pathname === '/api/overview' && method === 'GET') {
204
+ this.handleOverview(req, res);
205
+ return;
206
+ }
207
+ // GET /api/threats/summary
208
+ if (pathname === '/api/threats/summary' && method === 'GET') {
209
+ this.handleThreatSummary(res);
210
+ return;
211
+ }
212
+ // GET /api/threats
213
+ if (pathname === '/api/threats' && method === 'GET') {
214
+ this.handleRecentThreats(req, res);
215
+ return;
216
+ }
217
+ // POST /api/policy
218
+ if (pathname === '/api/policy' && method === 'POST') {
219
+ await this.handleCreatePolicy(req, res);
220
+ return;
221
+ }
222
+ // GET /api/policy/active
223
+ if (pathname === '/api/policy/active' && method === 'GET') {
224
+ this.handleActivePolicy(res);
225
+ return;
226
+ }
227
+ // GET /api/policy/agent/:id
228
+ const policyAgentMatch = pathname.match(/^\/api\/policy\/agent\/([^/]+)$/);
229
+ if (policyAgentMatch && method === 'GET') {
230
+ this.handlePolicyForAgent(res, policyAgentMatch[1]);
231
+ return;
232
+ }
233
+ // GET /api/events/stream (SSE)
234
+ if (pathname === '/api/events/stream' && method === 'GET') {
235
+ this.handleSSEStream(res);
236
+ return;
237
+ }
238
+ // 404
239
+ this.sendJson(res, 404, { ok: false, error: 'Not found' });
240
+ }
241
+ // ===== Route Handlers / 路由處理器 =====
242
+ async handleRegister(req, res) {
243
+ const body = await this.readBody(req);
244
+ if (!body || !body.hostname || !body.os || !body.arch || !body.version) {
245
+ this.sendJson(res, 400, {
246
+ ok: false,
247
+ error: 'Missing required fields: hostname, os, arch, version',
248
+ });
249
+ return;
250
+ }
251
+ try {
252
+ const registration = this.manager.handleRegistration(body);
253
+ this.sendJson(res, 201, { ok: true, data: registration });
254
+ this.broadcastSSE('agent_online', {
255
+ agentId: registration.agentId,
256
+ hostname: registration.hostname,
257
+ });
258
+ }
259
+ catch (err) {
260
+ const message = err instanceof Error ? err.message : 'Registration failed';
261
+ this.sendJson(res, 409, { ok: false, error: message });
262
+ }
263
+ }
264
+ async handleHeartbeat(req, res, agentId) {
265
+ const body = await this.readBody(req);
266
+ if (!body) {
267
+ this.sendJson(res, 400, { ok: false, error: 'Invalid JSON body' });
268
+ return;
269
+ }
270
+ const heartbeat = { ...body, agentId };
271
+ const updated = this.manager.handleHeartbeat(heartbeat);
272
+ if (!updated) {
273
+ this.sendJson(res, 404, { ok: false, error: `Agent ${agentId} not found` });
274
+ return;
275
+ }
276
+ this.sendJson(res, 200, { ok: true, data: updated });
277
+ }
278
+ async handleEvents(req, res, agentId) {
279
+ const body = await this.readBody(req);
280
+ if (!body || !Array.isArray(body.threats)) {
281
+ this.sendJson(res, 400, { ok: false, error: 'Invalid body: threats array required' });
282
+ return;
283
+ }
284
+ const report = { ...body, agentId };
285
+ const aggregated = this.manager.handleThreatReport(report);
286
+ this.sendJson(res, 200, {
287
+ ok: true,
288
+ data: { accepted: aggregated.length, threats: aggregated },
289
+ });
290
+ if (aggregated.length > 0) {
291
+ this.broadcastSSE('threats_reported', {
292
+ agentId,
293
+ count: aggregated.length,
294
+ threats: aggregated.map((t) => ({
295
+ id: t.id,
296
+ severity: t.originalThreat.verdict.conclusion,
297
+ sourceHostname: t.sourceHostname,
298
+ })),
299
+ });
300
+ }
301
+ }
302
+ handleDeregister(res, agentId) {
303
+ const removed = this.manager.handleDeregistration(agentId);
304
+ if (!removed) {
305
+ this.sendJson(res, 404, { ok: false, error: `Agent ${agentId} not found` });
306
+ return;
307
+ }
308
+ this.sendJson(res, 200, { ok: true, data: { agentId, removed: true } });
309
+ this.broadcastSSE('agent_offline', { agentId });
310
+ }
311
+ handleGetAgent(res, agentId) {
312
+ const agent = this.manager.getAgent(agentId);
313
+ if (!agent) {
314
+ this.sendJson(res, 404, { ok: false, error: `Agent ${agentId} not found` });
315
+ return;
316
+ }
317
+ this.sendJson(res, 200, { ok: true, data: agent });
318
+ }
319
+ handleListAgents(_req, res) {
320
+ const overview = this.manager.getOverview();
321
+ this.sendJson(res, 200, { ok: true, data: overview.agents });
322
+ }
323
+ handleOverview(_req, res) {
324
+ const overview = this.manager.getOverview();
325
+ this.sendJson(res, 200, { ok: true, data: overview });
326
+ }
327
+ handleThreatSummary(res) {
328
+ const summary = this.manager.getThreatSummary();
329
+ this.sendJson(res, 200, { ok: true, data: summary });
330
+ }
331
+ handleRecentThreats(req, res) {
332
+ const url = req.url ?? '/';
333
+ const params = new URL(url, 'http://localhost').searchParams;
334
+ const sinceParam = params.get('since');
335
+ const since = sinceParam ? new Date(sinceParam) : new Date(Date.now() - 3_600_000); // default 1h
336
+ const threats = this.manager.getRecentThreats(since);
337
+ this.sendJson(res, 200, { ok: true, data: threats });
338
+ }
339
+ async handleCreatePolicy(req, res) {
340
+ const body = await this.readBody(req);
341
+ if (!body || !Array.isArray(body.rules)) {
342
+ this.sendJson(res, 400, { ok: false, error: 'Invalid body: rules array required' });
343
+ return;
344
+ }
345
+ const policy = await this.manager.createPolicy(body.rules, body.broadcast ?? true);
346
+ this.sendJson(res, 201, { ok: true, data: policy });
347
+ this.broadcastSSE('policy_created', {
348
+ policyId: policy.policyId,
349
+ version: policy.version,
350
+ });
351
+ }
352
+ handleActivePolicy(res) {
353
+ const policy = this.manager.getActivePolicy();
354
+ if (!policy) {
355
+ this.sendJson(res, 200, { ok: true, data: null });
356
+ return;
357
+ }
358
+ this.sendJson(res, 200, { ok: true, data: policy });
359
+ }
360
+ handlePolicyForAgent(res, agentId) {
361
+ const policy = this.manager.getPolicyForAgent(agentId);
362
+ this.sendJson(res, 200, { ok: true, data: policy });
363
+ }
364
+ // ===== SSE / 伺服器推送事件 =====
365
+ /** Handle a new SSE stream connection / 處理新的 SSE 串流連線 */
366
+ handleSSEStream(res) {
367
+ res.writeHead(200, {
368
+ 'Content-Type': 'text/event-stream',
369
+ 'Cache-Control': 'no-cache',
370
+ 'Connection': 'keep-alive',
371
+ 'X-Accel-Buffering': 'no',
372
+ });
373
+ // Send initial connection event / 發送初始連線事件
374
+ this.sendSSE(res, 'connected', { timestamp: new Date().toISOString() });
375
+ // Keep-alive every 30 seconds to prevent proxy timeouts / 每 30 秒保持連線
376
+ const keepAlive = setInterval(() => {
377
+ res.write(':keep-alive\n\n');
378
+ }, 30_000);
379
+ // Track client / 追蹤客戶端
380
+ this.sseClients.add(res);
381
+ // Clean up on disconnect / 斷線時清理
382
+ res.on('close', () => {
383
+ clearInterval(keepAlive);
384
+ this.sseClients.delete(res);
385
+ });
386
+ }
387
+ /** Broadcast an event to all connected SSE clients / 向所有已連線的 SSE 客戶端廣播事件 */
388
+ broadcastSSE(eventType, data) {
389
+ const payload = `data: ${JSON.stringify({ type: eventType, data, timestamp: new Date().toISOString() })}\n\n`;
390
+ for (const client of this.sseClients) {
391
+ try {
392
+ client.write(payload);
393
+ }
394
+ catch {
395
+ this.sseClients.delete(client);
396
+ }
397
+ }
398
+ }
399
+ /** Send an SSE event to a single client / 向單個客戶端發送 SSE 事件 */
400
+ sendSSE(res, event, data) {
401
+ res.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
402
+ }
403
+ // ===== Utilities / 工具方法 =====
404
+ /** Read and parse JSON body from request */
405
+ readBody(req) {
406
+ return new Promise((resolve) => {
407
+ const chunks = [];
408
+ let size = 0;
409
+ const maxSize = 1_048_576; // 1 MB
410
+ req.on('data', (chunk) => {
411
+ size += chunk.length;
412
+ if (size > maxSize) {
413
+ req.destroy();
414
+ resolve(null);
415
+ return;
416
+ }
417
+ chunks.push(chunk);
418
+ });
419
+ req.on('end', () => {
420
+ try {
421
+ const raw = Buffer.concat(chunks).toString('utf8');
422
+ resolve(JSON.parse(raw));
423
+ }
424
+ catch {
425
+ resolve(null);
426
+ }
427
+ });
428
+ req.on('error', () => resolve(null));
429
+ });
430
+ }
431
+ /** Send JSON response */
432
+ sendJson(res, status, body) {
433
+ const json = JSON.stringify(body);
434
+ res.writeHead(status, { 'Content-Type': 'application/json' });
435
+ res.end(json);
436
+ }
437
+ /** Verify Bearer token authentication */
438
+ verifyAuth(req) {
439
+ // If no auth token configured, allow all (dev mode)
440
+ if (this.hashedAuthToken.length === 0)
441
+ return true;
442
+ const authHeader = req.headers.authorization ?? '';
443
+ const token = authHeader.startsWith('Bearer ') ? authHeader.slice(7) : '';
444
+ if (!token)
445
+ return false;
446
+ const tokenHash = createHash('sha256').update(token).digest();
447
+ try {
448
+ return timingSafeEqual(tokenHash, this.hashedAuthToken);
449
+ }
450
+ catch {
451
+ return false;
452
+ }
453
+ }
454
+ /** Simple in-memory rate limiter */
455
+ checkRateLimit(key, maxRequests = 60) {
456
+ const now = Date.now();
457
+ const windowMs = 60_000;
458
+ const entry = this.rateLimits.get(key);
459
+ if (!entry || now > entry.resetAt) {
460
+ this.rateLimits.set(key, { count: 1, resetAt: now + windowMs });
461
+ return true;
462
+ }
463
+ const newCount = entry.count + 1;
464
+ this.rateLimits.set(key, { ...entry, count: newCount });
465
+ return newCount <= maxRequests;
466
+ }
467
+ }
468
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -17,15 +17,18 @@ export interface AgentPlatformInfo {
17
17
  export interface AgentRegistration {
18
18
  readonly agentId: string;
19
19
  readonly hostname: string;
20
+ readonly endpoint: string;
20
21
  readonly platform: AgentPlatformInfo;
21
22
  readonly version: string;
22
23
  readonly registeredAt: string;
23
24
  readonly lastHeartbeat: string;
24
25
  readonly status: AgentStatus;
26
+ readonly organizationId?: string;
25
27
  }
26
28
  /** Incoming registration request from a Guard agent / 來自 Guard 代理的登錄請求 */
27
29
  export interface AgentRegistrationRequest {
28
30
  readonly hostname: string;
31
+ readonly endpoint: string;
29
32
  readonly os: string;
30
33
  readonly arch: string;
31
34
  readonly version: string;
@@ -66,6 +69,7 @@ export interface AggregatedThreat {
66
69
  readonly sourceHostname: string;
67
70
  readonly receivedAt: string;
68
71
  readonly correlatedWith: readonly string[];
72
+ readonly organizationId?: string;
69
73
  }
70
74
  /** Correlation match indicating related threats / 表示相關威脅的關聯比對 */
71
75
  export interface CorrelationMatch {
@@ -100,6 +104,7 @@ export interface PolicyUpdate {
100
104
  readonly rules: readonly PolicyRule[];
101
105
  readonly updatedAt: string;
102
106
  readonly appliedTo: readonly string[];
107
+ readonly organizationId?: string;
103
108
  }
104
109
  /** Manager server configuration / Manager 伺服器配置 */
105
110
  export interface ManagerConfig {
@@ -132,10 +137,19 @@ export interface ManagerOverview {
132
137
  readonly activePolicyVersion: number;
133
138
  readonly uptimeMs: number;
134
139
  }
140
+ /** Per-agent policy push result / 單一代理策略推送結果 */
141
+ export interface AgentPushResult {
142
+ readonly agentId: string;
143
+ readonly success: boolean;
144
+ readonly error?: string;
145
+ }
135
146
  /** Policy broadcast result / 策略廣播結果 */
136
147
  export interface PolicyBroadcastResult {
137
148
  readonly policyId: string;
138
149
  readonly targetAgents: readonly string[];
139
150
  readonly queuedAt: string;
151
+ readonly agentResults?: readonly AgentPushResult[];
152
+ readonly successCount?: number;
153
+ readonly failureCount?: number;
140
154
  }
141
155
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqIH,oDAAoD;AACpD,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,IAAI,EAAE,IAAI;IACV,SAAS,EAAE,EAAE;IACb,mBAAmB,EAAE,MAAM;IAC3B,kBAAkB,EAAE,MAAM;IAC1B,SAAS,EAAE,GAAG;IACd,mBAAmB,EAAE,OAAO,EAAE,YAAY;IAC1C,iBAAiB,EAAE,UAAU,EAAE,WAAW;CAC3C,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0IH,oDAAoD;AACpD,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,IAAI,EAAE,IAAI;IACV,SAAS,EAAE,EAAE;IACb,mBAAmB,EAAE,MAAM;IAC3B,kBAAkB,EAAE,MAAM;IAC1B,SAAS,EAAE,GAAG;IACd,mBAAmB,EAAE,OAAO,EAAE,YAAY;IAC1C,iBAAiB,EAAE,UAAU,EAAE,WAAW;CAC3C,CAAC"}
package/package.json CHANGED
@@ -1,21 +1,33 @@
1
1
  {
2
2
  "name": "@panguard-ai/manager",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
+ "license": "MIT",
4
5
  "type": "module",
5
6
  "description": "Manager node for distributed Guard agent orchestration / Guard 代理分散式架構管理節點",
6
7
  "main": "./dist/index.js",
7
8
  "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
8
15
  "publishConfig": {
9
16
  "access": "public"
10
17
  },
18
+ "engines": {
19
+ "node": ">=18.0.0"
20
+ },
11
21
  "files": [
12
22
  "dist",
13
23
  "package.json"
14
24
  ],
15
25
  "dependencies": {
16
- "@panguard-ai/core": "0.2.0"
26
+ "better-sqlite3": "^11.0.0",
27
+ "@panguard-ai/core": "0.3.2"
17
28
  },
18
29
  "devDependencies": {
30
+ "@types/better-sqlite3": "^7.6.8",
19
31
  "@types/node": "^22.14.0",
20
32
  "typescript": "~5.7.3"
21
33
  },