@hopping-dev/hub 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 (165) hide show
  1. package/assets/hopping-skill/SKILL.md +221 -0
  2. package/dist/approval/manager.d.ts +60 -0
  3. package/dist/approval/manager.d.ts.map +1 -0
  4. package/dist/approval/manager.js +101 -0
  5. package/dist/approval/manager.js.map +1 -0
  6. package/dist/approval/session-memory.d.ts +37 -0
  7. package/dist/approval/session-memory.d.ts.map +1 -0
  8. package/dist/approval/session-memory.js +63 -0
  9. package/dist/approval/session-memory.js.map +1 -0
  10. package/dist/cli/config-writer.d.ts +57 -0
  11. package/dist/cli/config-writer.d.ts.map +1 -0
  12. package/dist/cli/config-writer.js +318 -0
  13. package/dist/cli/config-writer.js.map +1 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +82 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/cli/path-resolver.d.ts +48 -0
  19. package/dist/cli/path-resolver.d.ts.map +1 -0
  20. package/dist/cli/path-resolver.js +212 -0
  21. package/dist/cli/path-resolver.js.map +1 -0
  22. package/dist/cli/setup.d.ts +10 -0
  23. package/dist/cli/setup.d.ts.map +1 -0
  24. package/dist/cli/setup.js +268 -0
  25. package/dist/cli/setup.js.map +1 -0
  26. package/dist/cloud/connector.d.ts +74 -0
  27. package/dist/cloud/connector.d.ts.map +1 -0
  28. package/dist/cloud/connector.js +524 -0
  29. package/dist/cloud/connector.js.map +1 -0
  30. package/dist/cloud/index.d.ts +3 -0
  31. package/dist/cloud/index.d.ts.map +1 -0
  32. package/dist/cloud/index.js +6 -0
  33. package/dist/cloud/index.js.map +1 -0
  34. package/dist/config/manager.d.ts +76 -0
  35. package/dist/config/manager.d.ts.map +1 -0
  36. package/dist/config/manager.js +296 -0
  37. package/dist/config/manager.js.map +1 -0
  38. package/dist/dev-mode.d.ts +30 -0
  39. package/dist/dev-mode.d.ts.map +1 -0
  40. package/dist/dev-mode.js +53 -0
  41. package/dist/dev-mode.js.map +1 -0
  42. package/dist/index.d.ts +10 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +354 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/ipc/index.d.ts +12 -0
  47. package/dist/ipc/index.d.ts.map +1 -0
  48. package/dist/ipc/index.js +15 -0
  49. package/dist/ipc/index.js.map +1 -0
  50. package/dist/ipc/watcher.d.ts +226 -0
  51. package/dist/ipc/watcher.d.ts.map +1 -0
  52. package/dist/ipc/watcher.js +745 -0
  53. package/dist/ipc/watcher.js.map +1 -0
  54. package/dist/local/approval-dialog.d.ts +30 -0
  55. package/dist/local/approval-dialog.d.ts.map +1 -0
  56. package/dist/local/approval-dialog.js +214 -0
  57. package/dist/local/approval-dialog.js.map +1 -0
  58. package/dist/local/index.d.ts +8 -0
  59. package/dist/local/index.d.ts.map +1 -0
  60. package/dist/local/index.js +13 -0
  61. package/dist/local/index.js.map +1 -0
  62. package/dist/local/local-approval.d.ts +55 -0
  63. package/dist/local/local-approval.d.ts.map +1 -0
  64. package/dist/local/local-approval.js +125 -0
  65. package/dist/local/local-approval.js.map +1 -0
  66. package/dist/local/notifier.d.ts +19 -0
  67. package/dist/local/notifier.d.ts.map +1 -0
  68. package/dist/local/notifier.js +110 -0
  69. package/dist/local/notifier.js.map +1 -0
  70. package/dist/local/sanitize.d.ts +20 -0
  71. package/dist/local/sanitize.d.ts.map +1 -0
  72. package/dist/local/sanitize.js +28 -0
  73. package/dist/local/sanitize.js.map +1 -0
  74. package/dist/mcp/file-extractor.d.ts +11 -0
  75. package/dist/mcp/file-extractor.d.ts.map +1 -0
  76. package/dist/mcp/file-extractor.js +74 -0
  77. package/dist/mcp/file-extractor.js.map +1 -0
  78. package/dist/mcp/risk-level.d.ts +44 -0
  79. package/dist/mcp/risk-level.d.ts.map +1 -0
  80. package/dist/mcp/risk-level.js +127 -0
  81. package/dist/mcp/risk-level.js.map +1 -0
  82. package/dist/mcp/schemas.d.ts +83 -0
  83. package/dist/mcp/schemas.d.ts.map +1 -0
  84. package/dist/mcp/schemas.js +84 -0
  85. package/dist/mcp/schemas.js.map +1 -0
  86. package/dist/mcp/summary.d.ts +11 -0
  87. package/dist/mcp/summary.d.ts.map +1 -0
  88. package/dist/mcp/summary.js +150 -0
  89. package/dist/mcp/summary.js.map +1 -0
  90. package/dist/mcp/tools.d.ts +45 -0
  91. package/dist/mcp/tools.d.ts.map +1 -0
  92. package/dist/mcp/tools.js +1217 -0
  93. package/dist/mcp/tools.js.map +1 -0
  94. package/dist/pairing/auto-pairing.d.ts +37 -0
  95. package/dist/pairing/auto-pairing.d.ts.map +1 -0
  96. package/dist/pairing/auto-pairing.js +144 -0
  97. package/dist/pairing/auto-pairing.js.map +1 -0
  98. package/dist/pairing/binding-poller.d.ts +26 -0
  99. package/dist/pairing/binding-poller.d.ts.map +1 -0
  100. package/dist/pairing/binding-poller.js +108 -0
  101. package/dist/pairing/binding-poller.js.map +1 -0
  102. package/dist/pairing/pairing-server.d.ts +14 -0
  103. package/dist/pairing/pairing-server.d.ts.map +1 -0
  104. package/dist/pairing/pairing-server.js +277 -0
  105. package/dist/pairing/pairing-server.js.map +1 -0
  106. package/dist/pairing/qr-display.d.ts +14 -0
  107. package/dist/pairing/qr-display.d.ts.map +1 -0
  108. package/dist/pairing/qr-display.js +40 -0
  109. package/dist/pairing/qr-display.js.map +1 -0
  110. package/dist/policy/engine.d.ts +31 -0
  111. package/dist/policy/engine.d.ts.map +1 -0
  112. package/dist/policy/engine.js +187 -0
  113. package/dist/policy/engine.js.map +1 -0
  114. package/dist/policy/store.d.ts +26 -0
  115. package/dist/policy/store.d.ts.map +1 -0
  116. package/dist/policy/store.js +70 -0
  117. package/dist/policy/store.js.map +1 -0
  118. package/dist/policy/system-policies.d.ts +15 -0
  119. package/dist/policy/system-policies.d.ts.map +1 -0
  120. package/dist/policy/system-policies.js +265 -0
  121. package/dist/policy/system-policies.js.map +1 -0
  122. package/dist/policy/tool-mapping.d.ts +45 -0
  123. package/dist/policy/tool-mapping.d.ts.map +1 -0
  124. package/dist/policy/tool-mapping.js +88 -0
  125. package/dist/policy/tool-mapping.js.map +1 -0
  126. package/dist/policy/tool-registry.json +85 -0
  127. package/dist/store/db.d.ts +17 -0
  128. package/dist/store/db.d.ts.map +1 -0
  129. package/dist/store/db.js +193 -0
  130. package/dist/store/db.js.map +1 -0
  131. package/dist/store/index.d.ts +4 -0
  132. package/dist/store/index.d.ts.map +1 -0
  133. package/dist/store/index.js +7 -0
  134. package/dist/store/index.js.map +1 -0
  135. package/dist/store/metadata.d.ts +31 -0
  136. package/dist/store/metadata.d.ts.map +1 -0
  137. package/dist/store/metadata.js +178 -0
  138. package/dist/store/metadata.js.map +1 -0
  139. package/dist/store/operations.d.ts +26 -0
  140. package/dist/store/operations.d.ts.map +1 -0
  141. package/dist/store/operations.js +171 -0
  142. package/dist/store/operations.js.map +1 -0
  143. package/dist/utils/json.d.ts +7 -0
  144. package/dist/utils/json.d.ts.map +1 -0
  145. package/dist/utils/json.js +33 -0
  146. package/dist/utils/json.js.map +1 -0
  147. package/dist/utils/logger.d.ts +13 -0
  148. package/dist/utils/logger.d.ts.map +1 -0
  149. package/dist/utils/logger.js +58 -0
  150. package/dist/utils/logger.js.map +1 -0
  151. package/dist/utils/open-browser.d.ts +8 -0
  152. package/dist/utils/open-browser.d.ts.map +1 -0
  153. package/dist/utils/open-browser.js +38 -0
  154. package/dist/utils/open-browser.js.map +1 -0
  155. package/node_modules/@hopping/shared/dist/types.d.ts +649 -0
  156. package/node_modules/@hopping/shared/dist/types.js +48 -0
  157. package/node_modules/@hopping/shared/dist/types.js.map +1 -0
  158. package/node_modules/@hopping/shared/package.json +14 -0
  159. package/node_modules/@hopping/shared/tsconfig.json +16 -0
  160. package/node_modules/@hopping/shared/types.d.ts +650 -0
  161. package/node_modules/@hopping/shared/types.d.ts.map +1 -0
  162. package/node_modules/@hopping/shared/types.js +48 -0
  163. package/node_modules/@hopping/shared/types.js.map +1 -0
  164. package/node_modules/@hopping/shared/types.ts +895 -0
  165. package/package.json +52 -0
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.startPairingServer = startPairingServer;
40
+ const http = __importStar(require("http"));
41
+ const net = __importStar(require("net"));
42
+ const qrcode_1 = __importDefault(require("qrcode"));
43
+ // ============================================
44
+ // Port 探測
45
+ // ============================================
46
+ const PORT_START = 9921;
47
+ const PORT_END = 9950;
48
+ function isPortAvailable(port) {
49
+ return new Promise((resolve) => {
50
+ const server = net.createServer();
51
+ server.once('error', () => resolve(false));
52
+ server.once('listening', () => {
53
+ server.close(() => resolve(true));
54
+ });
55
+ server.listen(port, '127.0.0.1');
56
+ });
57
+ }
58
+ async function findAvailablePort() {
59
+ for (let port = PORT_START; port <= PORT_END; port++) {
60
+ if (await isPortAvailable(port)) {
61
+ return port;
62
+ }
63
+ }
64
+ throw new Error(`No available port in range ${PORT_START}-${PORT_END}. All ports are occupied.`);
65
+ }
66
+ // ============================================
67
+ // HTML 頁面產生
68
+ // ============================================
69
+ async function buildHtmlPage(pairingCode) {
70
+ const deepLink = `hopping://pair?code=${encodeURIComponent(pairingCode)}`;
71
+ let qrDataUrl = '';
72
+ try {
73
+ qrDataUrl = await qrcode_1.default.toDataURL(deepLink, { width: 280, margin: 2 });
74
+ }
75
+ catch {
76
+ // QR 生成失敗 → 頁面仍顯示文字配對碼
77
+ }
78
+ const qrImg = qrDataUrl
79
+ ? `<img id="qr" src="${qrDataUrl}" alt="QR Code" width="280" height="280" />`
80
+ : `<div id="qr" style="width:280px;height:280px;background:#1e1b2e;display:flex;align-items:center;justify-content:center;border-radius:12px;color:#888;font-size:14px;">QR 生成失敗<br>請輸入配對碼</div>`;
81
+ return `<!DOCTYPE html>
82
+ <html lang="zh-TW">
83
+ <head>
84
+ <meta charset="UTF-8" />
85
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
86
+ <title>HopPing 配對</title>
87
+ <style>
88
+ * { box-sizing: border-box; margin: 0; padding: 0; }
89
+ body {
90
+ background: #13111A;
91
+ color: #e8e4f0;
92
+ font-family: 'Nunito', -apple-system, BlinkMacSystemFont, sans-serif;
93
+ min-height: 100vh;
94
+ display: flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ }
98
+ .card {
99
+ background: #1e1b2e;
100
+ border: 1px solid #2d2945;
101
+ border-radius: 20px;
102
+ padding: 40px 48px;
103
+ text-align: center;
104
+ max-width: 400px;
105
+ width: 100%;
106
+ }
107
+ .logo { font-size: 32px; margin-bottom: 8px; }
108
+ h1 {
109
+ font-size: 22px;
110
+ font-weight: 700;
111
+ color: #F5A623;
112
+ margin-bottom: 6px;
113
+ }
114
+ .subtitle { font-size: 14px; color: #8884a4; margin-bottom: 28px; }
115
+ #qr {
116
+ border-radius: 12px;
117
+ display: block;
118
+ margin: 0 auto 24px;
119
+ }
120
+ .code-label { font-size: 13px; color: #8884a4; margin-bottom: 8px; }
121
+ .code {
122
+ font-family: 'Fira Code', monospace;
123
+ font-size: 24px;
124
+ font-weight: 700;
125
+ letter-spacing: 4px;
126
+ color: #F5A623;
127
+ background: #13111A;
128
+ border-radius: 10px;
129
+ padding: 10px 20px;
130
+ display: inline-block;
131
+ margin-bottom: 28px;
132
+ }
133
+ #status {
134
+ font-size: 14px;
135
+ color: #8884a4;
136
+ min-height: 20px;
137
+ transition: color 0.3s;
138
+ }
139
+ #status.success { color: #4caf80; font-weight: 700; font-size: 18px; }
140
+ #status.error { color: #e07070; }
141
+ </style>
142
+ </head>
143
+ <body>
144
+ <div class="card">
145
+ <div class="logo">☕</div>
146
+ <h1>HopPing 配對</h1>
147
+ <p class="subtitle">用手機掃描 QR Code 或輸入配對碼</p>
148
+ ${qrImg}
149
+ <div class="code-label">配對碼</div>
150
+ <div class="code">${escapeHtml(pairingCode)}</div>
151
+ <div id="status">等待配對中…</div>
152
+ </div>
153
+ <script>
154
+ const statusEl = document.getElementById('status');
155
+ let done = false;
156
+
157
+ async function poll() {
158
+ if (done) return;
159
+ try {
160
+ const res = await fetch('/api/status');
161
+ const data = await res.json();
162
+ if (data.paired) {
163
+ done = true;
164
+ statusEl.textContent = '✅ 配對成功!';
165
+ statusEl.className = 'success';
166
+ clearInterval(timer);
167
+ return;
168
+ }
169
+ if (data.bound) {
170
+ statusEl.textContent = '手機已綁定,確認中…';
171
+ }
172
+ } catch {
173
+ statusEl.textContent = '連線中…';
174
+ statusEl.className = 'error';
175
+ }
176
+ }
177
+
178
+ const timer = setInterval(poll, 2000);
179
+ poll();
180
+ </script>
181
+ </body>
182
+ </html>`;
183
+ }
184
+ function escapeHtml(str) {
185
+ return str
186
+ .replace(/&/g, '&amp;')
187
+ .replace(/</g, '&lt;')
188
+ .replace(/>/g, '&gt;')
189
+ .replace(/"/g, '&quot;');
190
+ }
191
+ // ============================================
192
+ // startPairingServer
193
+ // ============================================
194
+ async function startPairingServer(opts) {
195
+ const { pairingCode, token, cloudUrl, signal } = opts;
196
+ const port = await findAvailablePort();
197
+ const html = await buildHtmlPage(pairingCode);
198
+ let isPaired = false;
199
+ let closeScheduled = false;
200
+ let autoCloseTimer = null;
201
+ let server = null;
202
+ const closeServer = () => new Promise((resolve) => {
203
+ if (autoCloseTimer !== null) {
204
+ clearTimeout(autoCloseTimer);
205
+ autoCloseTimer = null;
206
+ }
207
+ if (!server) {
208
+ resolve();
209
+ return;
210
+ }
211
+ server.close(() => resolve());
212
+ server = null;
213
+ });
214
+ server = http.createServer(async (req, res) => {
215
+ const url = req.url ?? '/';
216
+ // GET /
217
+ if (req.method === 'GET' && url === '/') {
218
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
219
+ res.end(html);
220
+ return;
221
+ }
222
+ // GET /api/status
223
+ if (req.method === 'GET' && url === '/api/status') {
224
+ if (isPaired) {
225
+ res.writeHead(200, { 'Content-Type': 'application/json' });
226
+ res.end(JSON.stringify({ bound: true, paired: true }));
227
+ // 2s 後自動關閉(只排一次)
228
+ if (!closeScheduled) {
229
+ closeScheduled = true;
230
+ autoCloseTimer = setTimeout(() => void closeServer(), 2000);
231
+ autoCloseTimer.unref();
232
+ }
233
+ return;
234
+ }
235
+ // proxy 到 Cloud binding-status
236
+ try {
237
+ const upstream = await fetch(`${cloudUrl}/api/v1/agents/binding-status`, {
238
+ headers: { Authorization: `Bearer ${token}` },
239
+ signal,
240
+ });
241
+ const data = (await upstream.json());
242
+ const bound = data?.data?.bound ?? false;
243
+ res.writeHead(200, { 'Content-Type': 'application/json' });
244
+ res.end(JSON.stringify({ bound }));
245
+ }
246
+ catch {
247
+ res.writeHead(200, { 'Content-Type': 'application/json' });
248
+ res.end(JSON.stringify({ bound: false, error: true }));
249
+ }
250
+ return;
251
+ }
252
+ // 404
253
+ res.writeHead(404);
254
+ res.end('Not found');
255
+ });
256
+ await new Promise((resolve, reject) => {
257
+ server.listen(port, '127.0.0.1', () => resolve());
258
+ server.once('error', reject);
259
+ });
260
+ // AbortSignal 整合
261
+ const onAbort = () => {
262
+ void closeServer();
263
+ };
264
+ signal?.addEventListener('abort', onAbort, { once: true });
265
+ return {
266
+ url: `http://localhost:${port}`,
267
+ port,
268
+ notifyPaired() {
269
+ isPaired = true;
270
+ },
271
+ close() {
272
+ signal?.removeEventListener('abort', onAbort);
273
+ return closeServer();
274
+ },
275
+ };
276
+ }
277
+ //# sourceMappingURL=pairing-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing-server.js","sourceRoot":"","sources":["../../src/pairing/pairing-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface QRDisplayOptions {
2
+ cloudUrl?: string;
3
+ }
4
+ /**
5
+ * displayQRCode — 在 stderr 顯示配對 QR Code
6
+ *
7
+ * 輸出到 stderr 原因:Hub 是 MCP Server,stdout 是 JSON-RPC 協議通道,
8
+ * 任何非協議輸出都會破壞 stdio transport 通訊。
9
+ *
10
+ * QR Code 內容:deep link `hopping://pair?code={pairingCode}`
11
+ * 同時顯示文字配對碼供手動輸入。
12
+ */
13
+ export declare function displayQRCode(pairingCode: string, opts?: QRDisplayOptions): Promise<void>;
14
+ //# sourceMappingURL=qr-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-display.d.ts","sourceRoot":"","sources":["../../src/pairing/qr-display.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB/F"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.displayQRCode = displayQRCode;
7
+ const qrcode_1 = __importDefault(require("qrcode"));
8
+ /**
9
+ * displayQRCode — 在 stderr 顯示配對 QR Code
10
+ *
11
+ * 輸出到 stderr 原因:Hub 是 MCP Server,stdout 是 JSON-RPC 協議通道,
12
+ * 任何非協議輸出都會破壞 stdio transport 通訊。
13
+ *
14
+ * QR Code 內容:deep link `hopping://pair?code={pairingCode}`
15
+ * 同時顯示文字配對碼供手動輸入。
16
+ */
17
+ async function displayQRCode(pairingCode, opts) {
18
+ const deepLink = `hopping://pair?code=${pairingCode}`;
19
+ try {
20
+ const qrString = await qrcode_1.default.toString(deepLink, {
21
+ type: 'terminal',
22
+ small: true,
23
+ });
24
+ process.stderr.write('\n');
25
+ process.stderr.write(qrString);
26
+ process.stderr.write('\n');
27
+ }
28
+ catch {
29
+ // QR 生成失敗 → graceful degradation,只顯示文字配對碼
30
+ }
31
+ process.stderr.write('══════════════════════════════════════════\n');
32
+ process.stderr.write(' 🔗 HopPing 自動配對\n');
33
+ process.stderr.write(' 請用手機掃描上方 QR Code,或手動輸入配對碼:\n');
34
+ process.stderr.write(`\n 配對碼:${pairingCode}\n\n`);
35
+ if (opts?.cloudUrl) {
36
+ process.stderr.write(` Cloud:${opts.cloudUrl}\n`);
37
+ }
38
+ process.stderr.write('══════════════════════════════════════════\n\n');
39
+ }
40
+ //# sourceMappingURL=qr-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-display.js","sourceRoot":"","sources":["../../src/pairing/qr-display.ts"],"names":[],"mappings":";;;;;AAeA,sCAuBC;AAtCD,oDAA4B;AAM5B;;;;;;;;GAQG;AACI,KAAK,UAAU,aAAa,CAAC,WAAmB,EAAE,IAAuB;IAC9E,MAAM,QAAQ,GAAG,uBAAuB,WAAW,EAAE,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,gBAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;YAC/C,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACrE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,WAAW,MAAM,CAAC,CAAC;IACnD,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { PolicyEvaluationResult, EvaluationContext } from '@hopping/shared';
2
+ import { PolicyStore } from './store';
3
+ import { Logger } from '../utils/logger';
4
+ /**
5
+ * Policy Engine v2.1
6
+ *
7
+ * 核心安全模組:評估所有 Agent 請求,決定 WARN / ASK / ALLOW
8
+ * 優先級規則:WARN > ASK > ALLOW
9
+ */
10
+ export declare class PolicyEngine {
11
+ private store;
12
+ private logger;
13
+ constructor(store: PolicyStore, logger: Logger);
14
+ /**
15
+ * 評估請求是否符合 Policy 規則
16
+ */
17
+ evaluate(context: EvaluationContext): Promise<PolicyEvaluationResult>;
18
+ /**
19
+ * 評估單一 Policy 是否匹配(所有條件 AND 邏輯)
20
+ */
21
+ private matchPolicy;
22
+ /**
23
+ * 從上下文中提取欄位值
24
+ */
25
+ private extractFieldValue;
26
+ /**
27
+ * 評估條件是否匹配
28
+ */
29
+ private evaluateCondition;
30
+ }
31
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/policy/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,sBAAsB,EAGtB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAS;gBAEX,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM;IAK9C;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA4E3E;;OAEG;IACH,OAAO,CAAC,WAAW;IAyBnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgCzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA2D1B"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PolicyEngine = void 0;
4
+ /**
5
+ * Policy Engine v2.1
6
+ *
7
+ * 核心安全模組:評估所有 Agent 請求,決定 WARN / ASK / ALLOW
8
+ * 優先級規則:WARN > ASK > ALLOW
9
+ */
10
+ class PolicyEngine {
11
+ store;
12
+ logger;
13
+ constructor(store, logger) {
14
+ this.store = store;
15
+ this.logger = logger;
16
+ }
17
+ /**
18
+ * 評估請求是否符合 Policy 規則
19
+ */
20
+ async evaluate(context) {
21
+ const startTime = Date.now();
22
+ const triggeredPolicies = [];
23
+ let finalAction = 'ALLOW';
24
+ try {
25
+ const policies = this.store.getApplicablePolicies({
26
+ agentType: context.agentType,
27
+ agentId: context.agentId,
28
+ });
29
+ this.logger.debug('Evaluating policies', {
30
+ requestId: context.requestId,
31
+ policyCount: policies.length,
32
+ agentType: context.agentType,
33
+ });
34
+ for (const policy of policies) {
35
+ const matchResult = this.matchPolicy(policy, context);
36
+ if (matchResult.matched) {
37
+ triggeredPolicies.push({
38
+ policyId: policy.id,
39
+ policyName: policy.name,
40
+ action: policy.action,
41
+ matchedConditions: matchResult.matchedConditions,
42
+ });
43
+ // WARN 是最高優先級,立即決定
44
+ if (policy.action === 'WARN') {
45
+ finalAction = 'WARN';
46
+ break;
47
+ }
48
+ // ASK 優先於 ALLOW
49
+ if (policy.action === 'ASK' && finalAction === 'ALLOW') {
50
+ finalAction = 'ASK';
51
+ }
52
+ }
53
+ }
54
+ const evaluationTimeMs = Date.now() - startTime;
55
+ const result = {
56
+ requestId: context.requestId,
57
+ finalAction,
58
+ triggeredPolicies,
59
+ evaluationTimeMs,
60
+ evaluatedAt: new Date().toISOString(),
61
+ };
62
+ this.logger.info('Policy evaluation completed', {
63
+ requestId: context.requestId,
64
+ finalAction,
65
+ triggeredCount: triggeredPolicies.length,
66
+ evaluationTimeMs,
67
+ });
68
+ return result;
69
+ }
70
+ catch (error) {
71
+ this.logger.error('Policy evaluation error', {
72
+ requestId: context.requestId,
73
+ error: error instanceof Error ? error.message : 'Unknown error',
74
+ });
75
+ // 評估失敗時,預設為 ASK(安全導向)
76
+ return {
77
+ requestId: context.requestId,
78
+ finalAction: 'ASK',
79
+ triggeredPolicies: [],
80
+ evaluationTimeMs: Date.now() - startTime,
81
+ evaluatedAt: new Date().toISOString(),
82
+ };
83
+ }
84
+ }
85
+ /**
86
+ * 評估單一 Policy 是否匹配(所有條件 AND 邏輯)
87
+ */
88
+ matchPolicy(policy, context) {
89
+ const matchedConditions = [];
90
+ for (const condition of policy.conditions) {
91
+ const actual = this.extractFieldValue(condition.field, context);
92
+ const matched = this.evaluateCondition(condition, actual);
93
+ if (!matched) {
94
+ return { matched: false, matchedConditions: [] };
95
+ }
96
+ matchedConditions.push({
97
+ field: condition.field,
98
+ operator: condition.operator,
99
+ expected: condition.value,
100
+ actual,
101
+ });
102
+ }
103
+ return { matched: true, matchedConditions };
104
+ }
105
+ /**
106
+ * 從上下文中提取欄位值
107
+ */
108
+ extractFieldValue(field, context) {
109
+ switch (field) {
110
+ case 'command':
111
+ return context.operation.command;
112
+ case 'command_args':
113
+ return context.operation.command?.split(' ').slice(1).join(' ');
114
+ case 'file_path':
115
+ return context.operation.filePath;
116
+ case 'file_extension':
117
+ return context.operation.filePath?.split('.').pop();
118
+ case 'sql_statement':
119
+ return context.operation.sqlStatement;
120
+ case 'api_endpoint':
121
+ return context.operation.apiEndpoint;
122
+ case 'token_cost':
123
+ case 'session_cost':
124
+ return context.session.costUsd;
125
+ case 'agent_type':
126
+ return context.agentType;
127
+ case 'action_type':
128
+ return context.operation.type;
129
+ case 'tool_name':
130
+ return context.operation.toolName;
131
+ case 'target':
132
+ return context.operation.target;
133
+ case 'time_of_day':
134
+ return new Date().getHours();
135
+ default:
136
+ return undefined;
137
+ }
138
+ }
139
+ /**
140
+ * 評估條件是否匹配
141
+ */
142
+ evaluateCondition(condition, actual) {
143
+ const { operator, value, caseSensitive = true } = condition;
144
+ if (actual === null || actual === undefined) {
145
+ return operator === 'not_equals' || operator === 'not_contains';
146
+ }
147
+ const actualStr = String(actual);
148
+ const valueStr = String(value);
149
+ const compareActual = caseSensitive ? actualStr : actualStr.toLowerCase();
150
+ const compareValue = caseSensitive ? valueStr : valueStr.toLowerCase();
151
+ switch (operator) {
152
+ case 'equals':
153
+ return compareActual === compareValue;
154
+ case 'not_equals':
155
+ return compareActual !== compareValue;
156
+ case 'contains':
157
+ return compareActual.includes(compareValue);
158
+ case 'not_contains':
159
+ return !compareActual.includes(compareValue);
160
+ case 'matches_regex':
161
+ try {
162
+ const flags = caseSensitive ? '' : 'i';
163
+ const regex = new RegExp(valueStr, flags);
164
+ return regex.test(actualStr);
165
+ }
166
+ catch {
167
+ return false;
168
+ }
169
+ case 'greater_than':
170
+ return Number(actual) > Number(value);
171
+ case 'less_than':
172
+ return Number(actual) < Number(value);
173
+ case 'in_list': {
174
+ const list = Array.isArray(value) ? value : [value];
175
+ return list.some((v) => caseSensitive ? String(v) === actualStr : String(v).toLowerCase() === compareActual);
176
+ }
177
+ case 'not_in_list': {
178
+ const excludeList = Array.isArray(value) ? value : [value];
179
+ return !excludeList.some((v) => caseSensitive ? String(v) === actualStr : String(v).toLowerCase() === compareActual);
180
+ }
181
+ default:
182
+ return false;
183
+ }
184
+ }
185
+ }
186
+ exports.PolicyEngine = PolicyEngine;
187
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/policy/engine.ts"],"names":[],"mappings":";;;AAYA;;;;;GAKG;AACH,MAAa,YAAY;IACf,KAAK,CAAc;IACnB,MAAM,CAAS;IAEvB,YAAY,KAAkB,EAAE,MAAc;QAC5C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,OAA0B;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,iBAAiB,GAAsB,EAAE,CAAC;QAChD,IAAI,WAAW,GAAiB,OAAO,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC;gBAChD,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;gBACvC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,WAAW,EAAE,QAAQ,CAAC,MAAM;gBAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;YAEH,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAEtD,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;oBACxB,iBAAiB,CAAC,IAAI,CAAC;wBACrB,QAAQ,EAAE,MAAM,CAAC,EAAE;wBACnB,UAAU,EAAE,MAAM,CAAC,IAAI;wBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,iBAAiB,EAAE,WAAW,CAAC,iBAAiB;qBACjD,CAAC,CAAC;oBAEH,mBAAmB;oBACnB,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;wBAC7B,WAAW,GAAG,MAAM,CAAC;wBACrB,MAAM;oBACR,CAAC;oBAED,gBAAgB;oBAChB,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;wBACvD,WAAW,GAAG,KAAK,CAAC;oBACtB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEhD,MAAM,MAAM,GAA2B;gBACrC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,WAAW;gBACX,iBAAiB;gBACjB,gBAAgB;gBAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBAC9C,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,WAAW;gBACX,cAAc,EAAE,iBAAiB,CAAC,MAAM;gBACxC,gBAAgB;aACjB,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBAC3C,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,CAAC,CAAC;YAEH,sBAAsB;YACtB,OAAO;gBACL,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,WAAW,EAAE,KAAK;gBAClB,iBAAiB,EAAE,EAAE;gBACrB,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBACxC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CACjB,MAAc,EACd,OAA0B;QAE1B,MAAM,iBAAiB,GAAuB,EAAE,CAAC;QAEjD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAE1D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;YACnD,CAAC;YAED,iBAAiB,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,QAAQ,EAAE,SAAS,CAAC,KAAK;gBACzB,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAa,EAAE,OAA0B;QACjE,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,SAAS;gBACZ,OAAO,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;YACnC,KAAK,cAAc;gBACjB,OAAO,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClE,KAAK,WAAW;gBACd,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC;YACpC,KAAK,gBAAgB;gBACnB,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACtD,KAAK,eAAe;gBAClB,OAAO,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC;YACxC,KAAK,cAAc;gBACjB,OAAO,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC;YACvC,KAAK,YAAY,CAAC;YAClB,KAAK,cAAc;gBACjB,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;YACjC,KAAK,YAAY;gBACf,OAAO,OAAO,CAAC,SAAS,CAAC;YAC3B,KAAK,aAAa;gBAChB,OAAO,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;YAChC,KAAK,WAAW;gBACd,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC;YACpC,KAAK,QAAQ;gBACX,OAAO,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;YAClC,KAAK,aAAa;gBAChB,OAAO,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC/B;gBACE,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,SAA0B,EAAE,MAAe;QACnE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC;QAE5D,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,cAAc,CAAC;QAClE,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QAC1E,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAEvE,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,OAAO,aAAa,KAAK,YAAY,CAAC;YAExC,KAAK,YAAY;gBACf,OAAO,aAAa,KAAK,YAAY,CAAC;YAExC,KAAK,UAAU;gBACb,OAAO,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAE9C,KAAK,cAAc;gBACjB,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAE/C,KAAK,eAAe;gBAClB,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;oBACvC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YAEH,KAAK,cAAc;gBACjB,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAExC,KAAK,WAAW;gBACd,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAExC,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACpD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACrB,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,aAAa,CACpF,CAAC;YACJ,CAAC;YAED,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC3D,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,aAAa,CACpF,CAAC;YACJ,CAAC;YAED;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;CACF;AArND,oCAqNC"}
@@ -0,0 +1,26 @@
1
+ import { AgentType, Policy } from '@hopping/shared';
2
+ import { Logger } from '../utils/logger';
3
+ /**
4
+ * Policy Store
5
+ * 管理系統預設與自訂 Policy 規則
6
+ */
7
+ export declare class PolicyStore {
8
+ private policies;
9
+ private logger;
10
+ constructor(logger: Logger);
11
+ private loadSystemPolicies;
12
+ /**
13
+ * 新增自訂 Policy
14
+ */
15
+ addPolicy(policy: Policy): void;
16
+ /**
17
+ * 取得適用的 Policy(依優先級排序)
18
+ */
19
+ getApplicablePolicies(context: {
20
+ agentType: AgentType;
21
+ agentId?: string;
22
+ }): Policy[];
23
+ getPolicy(id: string): Policy | undefined;
24
+ getAllPolicies(): Policy[];
25
+ }
26
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/policy/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAK1B,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAY/B;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,EAAE;IA0BpF,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzC,cAAc,IAAI,MAAM,EAAE;CAG3B"}