@panguard-ai/core 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 (233) hide show
  1. package/dist/adapters/adapter-registry.d.ts +150 -0
  2. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  3. package/dist/adapters/adapter-registry.js +271 -0
  4. package/dist/adapters/adapter-registry.js.map +1 -0
  5. package/dist/adapters/base-adapter.d.ts +101 -0
  6. package/dist/adapters/base-adapter.d.ts.map +1 -0
  7. package/dist/adapters/base-adapter.js +160 -0
  8. package/dist/adapters/base-adapter.js.map +1 -0
  9. package/dist/adapters/defender-adapter.d.ts +90 -0
  10. package/dist/adapters/defender-adapter.d.ts.map +1 -0
  11. package/dist/adapters/defender-adapter.js +227 -0
  12. package/dist/adapters/defender-adapter.js.map +1 -0
  13. package/dist/adapters/index.d.ts +22 -0
  14. package/dist/adapters/index.d.ts.map +1 -0
  15. package/dist/adapters/index.js +23 -0
  16. package/dist/adapters/index.js.map +1 -0
  17. package/dist/adapters/syslog-adapter.d.ts +207 -0
  18. package/dist/adapters/syslog-adapter.d.ts.map +1 -0
  19. package/dist/adapters/syslog-adapter.js +432 -0
  20. package/dist/adapters/syslog-adapter.js.map +1 -0
  21. package/dist/adapters/types.d.ts +135 -0
  22. package/dist/adapters/types.d.ts.map +1 -0
  23. package/dist/adapters/types.js +13 -0
  24. package/dist/adapters/types.js.map +1 -0
  25. package/dist/adapters/wazuh-adapter.d.ts +120 -0
  26. package/dist/adapters/wazuh-adapter.d.ts.map +1 -0
  27. package/dist/adapters/wazuh-adapter.js +266 -0
  28. package/dist/adapters/wazuh-adapter.js.map +1 -0
  29. package/dist/ai/claude-provider.d.ts +66 -0
  30. package/dist/ai/claude-provider.d.ts.map +1 -0
  31. package/dist/ai/claude-provider.js +166 -0
  32. package/dist/ai/claude-provider.js.map +1 -0
  33. package/dist/ai/funnel-router.d.ts +75 -0
  34. package/dist/ai/funnel-router.d.ts.map +1 -0
  35. package/dist/ai/funnel-router.js +173 -0
  36. package/dist/ai/funnel-router.js.map +1 -0
  37. package/dist/ai/index.d.ts +77 -0
  38. package/dist/ai/index.d.ts.map +1 -0
  39. package/dist/ai/index.js +95 -0
  40. package/dist/ai/index.js.map +1 -0
  41. package/dist/ai/ollama-provider.d.ts +73 -0
  42. package/dist/ai/ollama-provider.d.ts.map +1 -0
  43. package/dist/ai/ollama-provider.js +200 -0
  44. package/dist/ai/ollama-provider.js.map +1 -0
  45. package/dist/ai/openai-provider.d.ts +70 -0
  46. package/dist/ai/openai-provider.d.ts.map +1 -0
  47. package/dist/ai/openai-provider.js +175 -0
  48. package/dist/ai/openai-provider.js.map +1 -0
  49. package/dist/ai/prompts/event-classifier.d.ts +25 -0
  50. package/dist/ai/prompts/event-classifier.d.ts.map +1 -0
  51. package/dist/ai/prompts/event-classifier.js +94 -0
  52. package/dist/ai/prompts/event-classifier.js.map +1 -0
  53. package/dist/ai/prompts/index.d.ts +13 -0
  54. package/dist/ai/prompts/index.d.ts.map +1 -0
  55. package/dist/ai/prompts/index.js +13 -0
  56. package/dist/ai/prompts/index.js.map +1 -0
  57. package/dist/ai/prompts/report-generator.d.ts +25 -0
  58. package/dist/ai/prompts/report-generator.d.ts.map +1 -0
  59. package/dist/ai/prompts/report-generator.js +131 -0
  60. package/dist/ai/prompts/report-generator.js.map +1 -0
  61. package/dist/ai/prompts/threat-analyzer.d.ts +26 -0
  62. package/dist/ai/prompts/threat-analyzer.d.ts.map +1 -0
  63. package/dist/ai/prompts/threat-analyzer.js +75 -0
  64. package/dist/ai/prompts/threat-analyzer.js.map +1 -0
  65. package/dist/ai/provider-base.d.ts +100 -0
  66. package/dist/ai/provider-base.d.ts.map +1 -0
  67. package/dist/ai/provider-base.js +166 -0
  68. package/dist/ai/provider-base.js.map +1 -0
  69. package/dist/ai/response-parser.d.ts +36 -0
  70. package/dist/ai/response-parser.d.ts.map +1 -0
  71. package/dist/ai/response-parser.js +195 -0
  72. package/dist/ai/response-parser.js.map +1 -0
  73. package/dist/ai/token-tracker.d.ts +72 -0
  74. package/dist/ai/token-tracker.d.ts.map +1 -0
  75. package/dist/ai/token-tracker.js +145 -0
  76. package/dist/ai/token-tracker.js.map +1 -0
  77. package/dist/ai/types.d.ts +138 -0
  78. package/dist/ai/types.d.ts.map +1 -0
  79. package/dist/ai/types.js +12 -0
  80. package/dist/ai/types.js.map +1 -0
  81. package/dist/cli/index.d.ts +146 -0
  82. package/dist/cli/index.d.ts.map +1 -0
  83. package/dist/cli/index.js +515 -0
  84. package/dist/cli/index.js.map +1 -0
  85. package/dist/cli/prompts.d.ts +58 -0
  86. package/dist/cli/prompts.d.ts.map +1 -0
  87. package/dist/cli/prompts.js +327 -0
  88. package/dist/cli/prompts.js.map +1 -0
  89. package/dist/cli/wizard.d.ts +58 -0
  90. package/dist/cli/wizard.d.ts.map +1 -0
  91. package/dist/cli/wizard.js +200 -0
  92. package/dist/cli/wizard.js.map +1 -0
  93. package/dist/discovery/firewall-checker.d.ts +28 -0
  94. package/dist/discovery/firewall-checker.d.ts.map +1 -0
  95. package/dist/discovery/firewall-checker.js +379 -0
  96. package/dist/discovery/firewall-checker.js.map +1 -0
  97. package/dist/discovery/index.d.ts +23 -0
  98. package/dist/discovery/index.d.ts.map +1 -0
  99. package/dist/discovery/index.js +29 -0
  100. package/dist/discovery/index.js.map +1 -0
  101. package/dist/discovery/network-scanner.d.ts +60 -0
  102. package/dist/discovery/network-scanner.d.ts.map +1 -0
  103. package/dist/discovery/network-scanner.js +640 -0
  104. package/dist/discovery/network-scanner.js.map +1 -0
  105. package/dist/discovery/os-detector.d.ts +24 -0
  106. package/dist/discovery/os-detector.d.ts.map +1 -0
  107. package/dist/discovery/os-detector.js +253 -0
  108. package/dist/discovery/os-detector.js.map +1 -0
  109. package/dist/discovery/osquery-provider.d.ts +127 -0
  110. package/dist/discovery/osquery-provider.d.ts.map +1 -0
  111. package/dist/discovery/osquery-provider.js +214 -0
  112. package/dist/discovery/osquery-provider.js.map +1 -0
  113. package/dist/discovery/risk-scorer.d.ts +66 -0
  114. package/dist/discovery/risk-scorer.d.ts.map +1 -0
  115. package/dist/discovery/risk-scorer.js +294 -0
  116. package/dist/discovery/risk-scorer.js.map +1 -0
  117. package/dist/discovery/security-tools.d.ts +31 -0
  118. package/dist/discovery/security-tools.d.ts.map +1 -0
  119. package/dist/discovery/security-tools.js +346 -0
  120. package/dist/discovery/security-tools.js.map +1 -0
  121. package/dist/discovery/service-detector.d.ts +28 -0
  122. package/dist/discovery/service-detector.d.ts.map +1 -0
  123. package/dist/discovery/service-detector.js +300 -0
  124. package/dist/discovery/service-detector.js.map +1 -0
  125. package/dist/discovery/types.d.ts +502 -0
  126. package/dist/discovery/types.d.ts.map +1 -0
  127. package/dist/discovery/types.js +12 -0
  128. package/dist/discovery/types.js.map +1 -0
  129. package/dist/discovery/user-auditor.d.ts +28 -0
  130. package/dist/discovery/user-auditor.d.ts.map +1 -0
  131. package/dist/discovery/user-auditor.js +385 -0
  132. package/dist/discovery/user-auditor.js.map +1 -0
  133. package/dist/i18n/config.d.ts +45 -0
  134. package/dist/i18n/config.d.ts.map +1 -0
  135. package/dist/i18n/config.js +135 -0
  136. package/dist/i18n/config.js.map +1 -0
  137. package/dist/i18n/index.d.ts +8 -0
  138. package/dist/i18n/index.d.ts.map +1 -0
  139. package/dist/i18n/index.js +8 -0
  140. package/dist/i18n/index.js.map +1 -0
  141. package/dist/index.d.ts +31 -0
  142. package/dist/index.d.ts.map +1 -0
  143. package/dist/index.js +31 -0
  144. package/dist/index.js.map +1 -0
  145. package/dist/monitor/event-normalizer.d.ts +102 -0
  146. package/dist/monitor/event-normalizer.d.ts.map +1 -0
  147. package/dist/monitor/event-normalizer.js +195 -0
  148. package/dist/monitor/event-normalizer.js.map +1 -0
  149. package/dist/monitor/file-monitor.d.ts +90 -0
  150. package/dist/monitor/file-monitor.d.ts.map +1 -0
  151. package/dist/monitor/file-monitor.js +222 -0
  152. package/dist/monitor/file-monitor.js.map +1 -0
  153. package/dist/monitor/index.d.ts +147 -0
  154. package/dist/monitor/index.d.ts.map +1 -0
  155. package/dist/monitor/index.js +293 -0
  156. package/dist/monitor/index.js.map +1 -0
  157. package/dist/monitor/log-monitor.d.ts +102 -0
  158. package/dist/monitor/log-monitor.d.ts.map +1 -0
  159. package/dist/monitor/log-monitor.js +245 -0
  160. package/dist/monitor/log-monitor.js.map +1 -0
  161. package/dist/monitor/network-monitor.d.ts +103 -0
  162. package/dist/monitor/network-monitor.d.ts.map +1 -0
  163. package/dist/monitor/network-monitor.js +336 -0
  164. package/dist/monitor/network-monitor.js.map +1 -0
  165. package/dist/monitor/process-monitor.d.ts +108 -0
  166. package/dist/monitor/process-monitor.d.ts.map +1 -0
  167. package/dist/monitor/process-monitor.js +245 -0
  168. package/dist/monitor/process-monitor.js.map +1 -0
  169. package/dist/monitor/threat-intel-feeds.d.ts +141 -0
  170. package/dist/monitor/threat-intel-feeds.d.ts.map +1 -0
  171. package/dist/monitor/threat-intel-feeds.js +430 -0
  172. package/dist/monitor/threat-intel-feeds.js.map +1 -0
  173. package/dist/monitor/threat-intel.d.ts +83 -0
  174. package/dist/monitor/threat-intel.d.ts.map +1 -0
  175. package/dist/monitor/threat-intel.js +215 -0
  176. package/dist/monitor/threat-intel.js.map +1 -0
  177. package/dist/monitor/types.d.ts +65 -0
  178. package/dist/monitor/types.d.ts.map +1 -0
  179. package/dist/monitor/types.js +20 -0
  180. package/dist/monitor/types.js.map +1 -0
  181. package/dist/rules/index.d.ts +115 -0
  182. package/dist/rules/index.d.ts.map +1 -0
  183. package/dist/rules/index.js +244 -0
  184. package/dist/rules/index.js.map +1 -0
  185. package/dist/rules/rule-loader.d.ts +54 -0
  186. package/dist/rules/rule-loader.d.ts.map +1 -0
  187. package/dist/rules/rule-loader.js +167 -0
  188. package/dist/rules/rule-loader.js.map +1 -0
  189. package/dist/rules/sigma-matcher.d.ts +40 -0
  190. package/dist/rules/sigma-matcher.d.ts.map +1 -0
  191. package/dist/rules/sigma-matcher.js +447 -0
  192. package/dist/rules/sigma-matcher.js.map +1 -0
  193. package/dist/rules/sigma-parser.d.ts +36 -0
  194. package/dist/rules/sigma-parser.d.ts.map +1 -0
  195. package/dist/rules/sigma-parser.js +180 -0
  196. package/dist/rules/sigma-parser.js.map +1 -0
  197. package/dist/rules/types.d.ts +112 -0
  198. package/dist/rules/types.d.ts.map +1 -0
  199. package/dist/rules/types.js +11 -0
  200. package/dist/rules/types.js.map +1 -0
  201. package/dist/rules/yara-scanner.d.ts +103 -0
  202. package/dist/rules/yara-scanner.d.ts.map +1 -0
  203. package/dist/rules/yara-scanner.js +421 -0
  204. package/dist/rules/yara-scanner.js.map +1 -0
  205. package/dist/scoring/achievements.d.ts +76 -0
  206. package/dist/scoring/achievements.d.ts.map +1 -0
  207. package/dist/scoring/achievements.js +211 -0
  208. package/dist/scoring/achievements.js.map +1 -0
  209. package/dist/scoring/index.d.ts +3 -0
  210. package/dist/scoring/index.d.ts.map +1 -0
  211. package/dist/scoring/index.js +3 -0
  212. package/dist/scoring/index.js.map +1 -0
  213. package/dist/scoring/security-score.d.ts +60 -0
  214. package/dist/scoring/security-score.d.ts.map +1 -0
  215. package/dist/scoring/security-score.js +211 -0
  216. package/dist/scoring/security-score.js.map +1 -0
  217. package/dist/types.d.ts +71 -0
  218. package/dist/types.d.ts.map +1 -0
  219. package/dist/types.js +8 -0
  220. package/dist/types.js.map +1 -0
  221. package/dist/utils/index.d.ts +10 -0
  222. package/dist/utils/index.d.ts.map +1 -0
  223. package/dist/utils/index.js +9 -0
  224. package/dist/utils/index.js.map +1 -0
  225. package/dist/utils/logger.d.ts +38 -0
  226. package/dist/utils/logger.d.ts.map +1 -0
  227. package/dist/utils/logger.js +71 -0
  228. package/dist/utils/logger.js.map +1 -0
  229. package/dist/utils/validation.d.ts +35 -0
  230. package/dist/utils/validation.d.ts.map +1 -0
  231. package/dist/utils/validation.js +56 -0
  232. package/dist/utils/validation.js.map +1 -0
  233. package/package.json +60 -0
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Running services detection
3
+ * 執行中服務偵測
4
+ *
5
+ * Detects and enumerates running services across macOS, Linux, and Windows
6
+ * using platform-specific service management commands.
7
+ * 使用平台特定的服務管理命令,跨 macOS、Linux 和 Windows 偵測並列舉執行中的服務。
8
+ *
9
+ * @module @panguard-ai/core/discovery/service-detector
10
+ */
11
+ import { execFile } from 'child_process';
12
+ import { promisify } from 'util';
13
+ import { platform as osPlatform } from 'os';
14
+ import { createLogger } from '../utils/logger.js';
15
+ const execFileAsync = promisify(execFile);
16
+ const logger = createLogger('discovery:services');
17
+ /**
18
+ * Safely execute a command and return stdout, or empty string on failure
19
+ * 安全地執行命令並回傳 stdout,失敗時回傳空字串
20
+ *
21
+ * @param cmd - Command to execute / 要執行的命令
22
+ * @param args - Command arguments / 命令參數
23
+ * @returns stdout output trimmed / 修剪後的 stdout 輸出
24
+ */
25
+ async function safeExec(cmd, args) {
26
+ try {
27
+ const { stdout } = await execFileAsync(cmd, args, { timeout: 15_000 });
28
+ return stdout.trim();
29
+ }
30
+ catch (err) {
31
+ logger.debug(`Command failed: ${cmd} ${args.join(' ')}`, {
32
+ error: err instanceof Error ? err.message : String(err),
33
+ });
34
+ return '';
35
+ }
36
+ }
37
+ /**
38
+ * Detect running services on macOS via launchctl
39
+ * 透過 launchctl 偵測 macOS 上的執行中服務
40
+ *
41
+ * Parses the output of 'launchctl list' which returns:
42
+ * PID Status Label
43
+ * 解析 'launchctl list' 的輸出,格式為:
44
+ * PID Status Label
45
+ *
46
+ * @returns Array of detected services / 偵測到的服務陣列
47
+ */
48
+ async function detectMacOSServices() {
49
+ const services = [];
50
+ const output = await safeExec('launchctl', ['list']);
51
+ if (!output) {
52
+ logger.warn('launchctl list returned no output');
53
+ return services;
54
+ }
55
+ const lines = output.split('\n').slice(1); // Skip header / 跳過標頭
56
+ for (const line of lines) {
57
+ const parts = line.trim().split(/\t+/);
58
+ if (parts.length < 3)
59
+ continue;
60
+ const pidStr = (parts[0] ?? '').trim();
61
+ const statusStr = (parts[1] ?? '').trim();
62
+ const label = (parts[2] ?? '').trim();
63
+ // Skip empty labels or Apple internal services with very long names
64
+ // 跳過空標籤或名稱很長的 Apple 內部服務
65
+ if (!label)
66
+ continue;
67
+ const pid = pidStr === '-' ? undefined : parseInt(pidStr, 10);
68
+ const isRunning = pid !== undefined && !isNaN(pid);
69
+ // Derive a display name from the label
70
+ // 從標籤衍生顯示名稱
71
+ const displayName = label.split('.').pop() ?? label;
72
+ services.push({
73
+ name: label,
74
+ displayName,
75
+ status: isRunning ? 'running' : statusStr === '0' ? 'stopped' : 'unknown',
76
+ pid: isRunning ? pid : undefined,
77
+ startType: undefined,
78
+ description: undefined,
79
+ });
80
+ }
81
+ return services;
82
+ }
83
+ /**
84
+ * Detect running services on Linux via systemctl
85
+ * 透過 systemctl 偵測 Linux 上的執行中服務
86
+ *
87
+ * Parses the output of 'systemctl list-units --type=service --state=running'.
88
+ * 解析 'systemctl list-units --type=service --state=running' 的輸出。
89
+ *
90
+ * @returns Array of detected services / 偵測到的服務陣列
91
+ */
92
+ async function detectLinuxServices() {
93
+ const services = [];
94
+ const output = await safeExec('systemctl', [
95
+ 'list-units',
96
+ '--type=service',
97
+ '--state=running',
98
+ '--no-pager',
99
+ '--plain',
100
+ ]);
101
+ if (!output) {
102
+ logger.warn('systemctl list-units returned no output');
103
+ return services;
104
+ }
105
+ const lines = output.split('\n');
106
+ for (const line of lines) {
107
+ const trimmed = line.trim();
108
+ // Skip empty lines, header, and footer
109
+ // 跳過空行、標頭和尾部
110
+ if (!trimmed || trimmed.startsWith('UNIT') || trimmed.startsWith('LOAD'))
111
+ continue;
112
+ if (trimmed.includes('loaded units listed'))
113
+ continue;
114
+ // Format: UNIT LOAD ACTIVE SUB DESCRIPTION
115
+ // 格式:UNIT LOAD ACTIVE SUB DESCRIPTION
116
+ const parts = trimmed.split(/\s+/);
117
+ if (parts.length < 4)
118
+ continue;
119
+ const unitName = parts[0] ?? '';
120
+ const active = parts[2] ?? '';
121
+ const sub = parts[3] ?? '';
122
+ if (!unitName)
123
+ continue;
124
+ // Extract service name without .service suffix
125
+ // 擷取不含 .service 後綴的服務名稱
126
+ const serviceName = unitName.replace(/\.service$/, '');
127
+ // Description is everything after the 4th column
128
+ // 描述是第四欄之後的所有內容
129
+ const description = parts.slice(4).join(' ') || undefined;
130
+ services.push({
131
+ name: serviceName,
132
+ displayName: serviceName,
133
+ status: active === 'active' && sub === 'running' ? 'running' : 'stopped',
134
+ pid: undefined,
135
+ startType: undefined,
136
+ description,
137
+ });
138
+ }
139
+ // Try to get PIDs for running services
140
+ // 嘗試取得執行中服務的 PID
141
+ for (const service of services) {
142
+ if (service.status === 'running') {
143
+ const showOutput = await safeExec('systemctl', [
144
+ 'show',
145
+ `${service.name}.service`,
146
+ '--property=MainPID',
147
+ '--no-pager',
148
+ ]);
149
+ if (showOutput) {
150
+ const match = showOutput.match(/MainPID=(\d+)/);
151
+ if (match?.[1]) {
152
+ const pid = parseInt(match[1], 10);
153
+ if (pid > 0) {
154
+ service.pid = pid;
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
160
+ return services;
161
+ }
162
+ /**
163
+ * Detect running services on Windows via sc query
164
+ * 透過 sc query 偵測 Windows 上的執行中服務
165
+ *
166
+ * Parses the output of 'sc query state= all'.
167
+ * 解析 'sc query state= all' 的輸出。
168
+ *
169
+ * @returns Array of detected services / 偵測到的服務陣列
170
+ */
171
+ async function detectWindowsServices() {
172
+ const services = [];
173
+ const output = await safeExec('sc', ['query', 'state=', 'all']);
174
+ if (!output) {
175
+ // Fallback to 'net start' for running services only
176
+ // 備用:使用 'net start' 僅取得執行中服務
177
+ const netOutput = await safeExec('net', ['start']);
178
+ if (netOutput) {
179
+ const lines = netOutput.split('\n');
180
+ for (const line of lines) {
181
+ const trimmed = line.trim();
182
+ if (trimmed &&
183
+ !trimmed.startsWith('These Windows services') &&
184
+ !trimmed.startsWith('The command completed')) {
185
+ services.push({
186
+ name: trimmed,
187
+ displayName: trimmed,
188
+ status: 'running',
189
+ pid: undefined,
190
+ startType: undefined,
191
+ description: undefined,
192
+ });
193
+ }
194
+ }
195
+ }
196
+ return services;
197
+ }
198
+ // Parse sc query output blocks
199
+ // 解析 sc query 輸出區塊
200
+ const blocks = output.split(/\n\n+/);
201
+ for (const block of blocks) {
202
+ const lines = block.trim().split('\n');
203
+ if (lines.length < 3)
204
+ continue;
205
+ let name = '';
206
+ let displayName = '';
207
+ let status = 'unknown';
208
+ let pid;
209
+ for (const line of lines) {
210
+ const trimmed = line.trim();
211
+ const nameMatch = trimmed.match(/^SERVICE_NAME:\s*(.+)/i);
212
+ if (nameMatch?.[1]) {
213
+ name = nameMatch[1].trim();
214
+ continue;
215
+ }
216
+ const displayMatch = trimmed.match(/^DISPLAY_NAME:\s*(.+)/i);
217
+ if (displayMatch?.[1]) {
218
+ displayName = displayMatch[1].trim();
219
+ continue;
220
+ }
221
+ const stateMatch = trimmed.match(/STATE\s*:\s*\d+\s+(\w+)/i);
222
+ if (stateMatch?.[1]) {
223
+ const stateStr = stateMatch[1].toUpperCase();
224
+ if (stateStr === 'RUNNING') {
225
+ status = 'running';
226
+ }
227
+ else if (stateStr === 'STOPPED') {
228
+ status = 'stopped';
229
+ }
230
+ else {
231
+ status = 'unknown';
232
+ }
233
+ continue;
234
+ }
235
+ const pidMatch = trimmed.match(/PID\s*:\s*(\d+)/i);
236
+ if (pidMatch?.[1]) {
237
+ const parsedPid = parseInt(pidMatch[1], 10);
238
+ if (parsedPid > 0) {
239
+ pid = parsedPid;
240
+ }
241
+ }
242
+ }
243
+ if (name) {
244
+ services.push({
245
+ name,
246
+ displayName: displayName || name,
247
+ status,
248
+ pid,
249
+ startType: undefined,
250
+ description: undefined,
251
+ });
252
+ }
253
+ }
254
+ return services;
255
+ }
256
+ /**
257
+ * Detect all running services on the current platform
258
+ * 偵測目前平台上所有執行中的服務
259
+ *
260
+ * Dispatches to platform-specific detection methods:
261
+ * - macOS: launchctl list
262
+ * - Linux: systemctl list-units
263
+ * - Windows: sc query / net start
264
+ * 分派到平台特定的偵測方法:
265
+ * - macOS:launchctl list
266
+ * - Linux:systemctl list-units
267
+ * - Windows:sc query / net start
268
+ *
269
+ * @returns Array of detected services / 偵測到的服務陣列
270
+ */
271
+ export async function detectServices() {
272
+ const currentPlatform = osPlatform();
273
+ logger.info(`Detecting services on ${currentPlatform}`);
274
+ try {
275
+ let services = [];
276
+ switch (currentPlatform) {
277
+ case 'darwin':
278
+ services = await detectMacOSServices();
279
+ break;
280
+ case 'linux':
281
+ services = await detectLinuxServices();
282
+ break;
283
+ case 'win32':
284
+ services = await detectWindowsServices();
285
+ break;
286
+ default:
287
+ logger.warn(`Unsupported platform for service detection: ${currentPlatform}`);
288
+ return [];
289
+ }
290
+ logger.info(`Detected ${services.length} services (${services.filter((s) => s.status === 'running').length} running)`);
291
+ return services;
292
+ }
293
+ catch (err) {
294
+ logger.error('Service detection failed', {
295
+ error: err instanceof Error ? err.message : String(err),
296
+ });
297
+ return [];
298
+ }
299
+ }
300
+ //# sourceMappingURL=service-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-detector.js","sourceRoot":"","sources":["../../src/discovery/service-detector.ts"],"names":[],"mappings":"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"}