@singbox-iac/cli 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 (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +265 -0
  3. package/dist/cli/command-helpers.d.ts +6 -0
  4. package/dist/cli/command-helpers.js +34 -0
  5. package/dist/cli/command-helpers.js.map +1 -0
  6. package/dist/cli/commands/apply.d.ts +2 -0
  7. package/dist/cli/commands/apply.js +32 -0
  8. package/dist/cli/commands/apply.js.map +1 -0
  9. package/dist/cli/commands/author.d.ts +2 -0
  10. package/dist/cli/commands/author.js +194 -0
  11. package/dist/cli/commands/author.js.map +1 -0
  12. package/dist/cli/commands/build.d.ts +2 -0
  13. package/dist/cli/commands/build.js +198 -0
  14. package/dist/cli/commands/build.js.map +1 -0
  15. package/dist/cli/commands/check.d.ts +2 -0
  16. package/dist/cli/commands/check.js +23 -0
  17. package/dist/cli/commands/check.js.map +1 -0
  18. package/dist/cli/commands/doctor.d.ts +2 -0
  19. package/dist/cli/commands/doctor.js +35 -0
  20. package/dist/cli/commands/doctor.js.map +1 -0
  21. package/dist/cli/commands/init.d.ts +2 -0
  22. package/dist/cli/commands/init.js +23 -0
  23. package/dist/cli/commands/init.js.map +1 -0
  24. package/dist/cli/commands/reload.d.ts +2 -0
  25. package/dist/cli/commands/reload.js +21 -0
  26. package/dist/cli/commands/reload.js.map +1 -0
  27. package/dist/cli/commands/run.d.ts +2 -0
  28. package/dist/cli/commands/run.js +25 -0
  29. package/dist/cli/commands/run.js.map +1 -0
  30. package/dist/cli/commands/schedule.d.ts +2 -0
  31. package/dist/cli/commands/schedule.js +77 -0
  32. package/dist/cli/commands/schedule.js.map +1 -0
  33. package/dist/cli/commands/templates.d.ts +2 -0
  34. package/dist/cli/commands/templates.js +34 -0
  35. package/dist/cli/commands/templates.js.map +1 -0
  36. package/dist/cli/commands/update.d.ts +2 -0
  37. package/dist/cli/commands/update.js +52 -0
  38. package/dist/cli/commands/update.js.map +1 -0
  39. package/dist/cli/commands/verify.d.ts +2 -0
  40. package/dist/cli/commands/verify.js +49 -0
  41. package/dist/cli/commands/verify.js.map +1 -0
  42. package/dist/cli/index.d.ts +5 -0
  43. package/dist/cli/index.js +55 -0
  44. package/dist/cli/index.js.map +1 -0
  45. package/dist/config/load-config.d.ts +2 -0
  46. package/dist/config/load-config.js +29 -0
  47. package/dist/config/load-config.js.map +1 -0
  48. package/dist/config/schema.d.ts +548 -0
  49. package/dist/config/schema.js +92 -0
  50. package/dist/config/schema.js.map +1 -0
  51. package/dist/domain/config.d.ts +8 -0
  52. package/dist/domain/config.js +2 -0
  53. package/dist/domain/config.js.map +1 -0
  54. package/dist/domain/node.d.ts +11 -0
  55. package/dist/domain/node.js +2 -0
  56. package/dist/domain/node.js.map +1 -0
  57. package/dist/domain/outbound.d.ts +15 -0
  58. package/dist/domain/outbound.js +2 -0
  59. package/dist/domain/outbound.js.map +1 -0
  60. package/dist/domain/subscription.d.ts +6 -0
  61. package/dist/domain/subscription.js +2 -0
  62. package/dist/domain/subscription.js.map +1 -0
  63. package/dist/index.d.ts +1 -0
  64. package/dist/index.js +2 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/modules/authoring/index.d.ts +41 -0
  67. package/dist/modules/authoring/index.js +596 -0
  68. package/dist/modules/authoring/index.js.map +1 -0
  69. package/dist/modules/build/index.d.ts +13 -0
  70. package/dist/modules/build/index.js +39 -0
  71. package/dist/modules/build/index.js.map +1 -0
  72. package/dist/modules/compiler/index.d.ts +10 -0
  73. package/dist/modules/compiler/index.js +305 -0
  74. package/dist/modules/compiler/index.js.map +1 -0
  75. package/dist/modules/doctor/index.d.ts +17 -0
  76. package/dist/modules/doctor/index.js +89 -0
  77. package/dist/modules/doctor/index.js.map +1 -0
  78. package/dist/modules/fetcher/index.d.ts +4 -0
  79. package/dist/modules/fetcher/index.js +42 -0
  80. package/dist/modules/fetcher/index.js.map +1 -0
  81. package/dist/modules/init/index.d.ts +12 -0
  82. package/dist/modules/init/index.js +41 -0
  83. package/dist/modules/init/index.js.map +1 -0
  84. package/dist/modules/manager/index.d.ts +29 -0
  85. package/dist/modules/manager/index.js +133 -0
  86. package/dist/modules/manager/index.js.map +1 -0
  87. package/dist/modules/natural-language/index.d.ts +54 -0
  88. package/dist/modules/natural-language/index.js +458 -0
  89. package/dist/modules/natural-language/index.js.map +1 -0
  90. package/dist/modules/parser/index.d.ts +10 -0
  91. package/dist/modules/parser/index.js +113 -0
  92. package/dist/modules/parser/index.js.map +1 -0
  93. package/dist/modules/preview/index.d.ts +22 -0
  94. package/dist/modules/preview/index.js +141 -0
  95. package/dist/modules/preview/index.js.map +1 -0
  96. package/dist/modules/rule-templates/index.d.ts +15 -0
  97. package/dist/modules/rule-templates/index.js +200 -0
  98. package/dist/modules/rule-templates/index.js.map +1 -0
  99. package/dist/modules/schedule/index.d.ts +32 -0
  100. package/dist/modules/schedule/index.js +155 -0
  101. package/dist/modules/schedule/index.js.map +1 -0
  102. package/dist/modules/update/index.d.ts +22 -0
  103. package/dist/modules/update/index.js +38 -0
  104. package/dist/modules/update/index.js.map +1 -0
  105. package/dist/modules/user-rules/index.d.ts +18 -0
  106. package/dist/modules/user-rules/index.js +98 -0
  107. package/dist/modules/user-rules/index.js.map +1 -0
  108. package/dist/modules/verification/index.d.ts +49 -0
  109. package/dist/modules/verification/index.js +432 -0
  110. package/dist/modules/verification/index.js.map +1 -0
  111. package/dist/shared/errors.d.ts +3 -0
  112. package/dist/shared/errors.js +7 -0
  113. package/dist/shared/errors.js.map +1 -0
  114. package/dist/shared/logger.d.ts +2 -0
  115. package/dist/shared/logger.js +5 -0
  116. package/dist/shared/logger.js.map +1 -0
  117. package/dist/shared/result.d.ts +11 -0
  118. package/dist/shared/result.js +7 -0
  119. package/dist/shared/result.js.map +1 -0
  120. package/docs/antigravity-endpoints.md +77 -0
  121. package/docs/competitive-landscape.md +45 -0
  122. package/docs/development-workflow.md +80 -0
  123. package/docs/natural-language-authoring.md +376 -0
  124. package/docs/positioning.md +42 -0
  125. package/docs/releasing.md +72 -0
  126. package/docs/rule-templates.md +122 -0
  127. package/docs/rules-dsl.md +107 -0
  128. package/docs/runtime-on-macos.md +42 -0
  129. package/docs/sing-box-config-primer.md +39 -0
  130. package/docs/subscription-format.md +38 -0
  131. package/examples/builder.config.yaml +220 -0
  132. package/examples/custom.rules.yaml +18 -0
  133. package/package.json +51 -0
@@ -0,0 +1,458 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import YAML from "yaml";
4
+ import { mergeRuleTemplates } from "../rule-templates/index.js";
5
+ const siteAliasDefinitions = [
6
+ { aliases: ["openrouter"], domains: ["openrouter.ai"] },
7
+ { aliases: ["perplexity"], domains: ["perplexity.ai"] },
8
+ { aliases: ["chatgpt"], domains: ["chatgpt.com", "openai.com"] },
9
+ { aliases: ["openai"], domains: ["openai.com"] },
10
+ { aliases: ["gemini"], domains: ["gemini.google.com"] },
11
+ { aliases: ["anthropic", "claude"], domains: ["anthropic.com", "claude.ai"] },
12
+ { aliases: ["github"], domains: ["github.com", "githubusercontent.com"] },
13
+ {
14
+ aliases: ["google", "google 服务", "google services"],
15
+ domains: ["google.com", "googleapis.com", "gstatic.com", "googlevideo.com"],
16
+ },
17
+ {
18
+ aliases: ["apple", "icloud", "apple 服务", "apple services"],
19
+ domains: ["apple.com", "icloud.com", "mzstatic.com", "tv.apple.com"],
20
+ },
21
+ { aliases: ["google stitch", "stitch"], domains: ["stitch.withgoogle.com"] },
22
+ { aliases: ["google tv"], domains: ["tv.youtube.com"] },
23
+ { aliases: ["youtube"], domains: ["youtube.com", "youtu.be"] },
24
+ { aliases: ["netflix"], domains: ["netflix.com", "nflxvideo.net"] },
25
+ {
26
+ aliases: ["amazon prime", "prime video", "primevideo", "amazon video"],
27
+ domains: ["primevideo.com", "amazonvideo.com"],
28
+ },
29
+ {
30
+ aliases: ["disney+", "disney plus", "disneyplus"],
31
+ domains: ["disneyplus.com", "disney-plus.net"],
32
+ },
33
+ { aliases: ["bilibili", "b站"], domains: ["bilibili.com", "bilibili.tv"] },
34
+ { aliases: ["iqiyi", "爱奇艺"], domains: ["iqiyi.com", "iq.com"] },
35
+ { aliases: ["youku", "优酷"], domains: ["youku.com"] },
36
+ { aliases: ["mgtv", "芒果tv", "芒果"], domains: ["mgtv.com"] },
37
+ ];
38
+ const categoryTemplateDefinitions = [
39
+ {
40
+ aliases: [
41
+ "ai工具",
42
+ "ai 工具",
43
+ "ai tools",
44
+ "third-party ai",
45
+ "developer ai",
46
+ "第三方ai",
47
+ "第三方 ai",
48
+ ],
49
+ templateId: "developer-ai-sites",
50
+ },
51
+ {
52
+ aliases: ["开发者网站", "开发工具网站", "developer sites", "developer tools", "dev sites"],
53
+ templateId: "developer-common-sites",
54
+ },
55
+ {
56
+ aliases: ["开发类", "开发相关", "技术网站"],
57
+ templateId: "developer-common-sites",
58
+ },
59
+ {
60
+ aliases: [
61
+ "视频网站",
62
+ "video sites",
63
+ "streaming",
64
+ "google tv",
65
+ "netflix",
66
+ "amazon prime",
67
+ "prime video",
68
+ "disney+",
69
+ "apple tv",
70
+ ],
71
+ templateId: "video-us",
72
+ },
73
+ { aliases: ["日本视频网站", "jp video"], templateId: "video-jp" },
74
+ { aliases: ["国内视频网站", "cn video"], templateId: "cn-video-direct" },
75
+ ];
76
+ const processAliasDefinitions = [
77
+ "proxifier",
78
+ "进程级",
79
+ "独立入口",
80
+ "独立的入口",
81
+ "process-level",
82
+ "process level",
83
+ "ide",
84
+ "antigravity",
85
+ "google antigravity",
86
+ ];
87
+ export function generateRulesFromPrompt(prompt) {
88
+ const text = normalizePrompt(prompt);
89
+ const clauses = splitClauses(text);
90
+ const templateIds = new Set();
91
+ const beforeBuiltins = [];
92
+ const afterBuiltins = [];
93
+ const notes = [];
94
+ const verificationOverrides = [];
95
+ const groupDefaults = {};
96
+ const parsedInterval = parseScheduleIntervalMinutes(text);
97
+ for (const clause of clauses) {
98
+ const route = extractRouteTarget(clause);
99
+ const phase = route === "direct" ? "afterBuiltins" : "beforeBuiltins";
100
+ const hasProcessIntent = processAliasDefinitions.some((alias) => clause.includes(alias));
101
+ const hasAiCategory = hasTemplateAlias(clause, "developer-ai-sites");
102
+ const hasDeveloperCategory = hasTemplateAlias(clause, "developer-common-sites");
103
+ const hasStitchIntent = ["google stitch", "stitch"].some((alias) => clause.includes(alias));
104
+ for (const { aliases, templateId } of categoryTemplateDefinitions) {
105
+ if (aliases.some((alias) => clause.includes(alias))) {
106
+ templateIds.add(resolveTemplateForRoute(templateId, route));
107
+ }
108
+ }
109
+ if (route && isRegionTarget(route)) {
110
+ if (hasAiCategory) {
111
+ groupDefaults.aiOut = {
112
+ ...groupDefaults.aiOut,
113
+ defaultTarget: route,
114
+ };
115
+ }
116
+ if (hasDeveloperCategory) {
117
+ groupDefaults.devCommonOut = {
118
+ ...groupDefaults.devCommonOut,
119
+ defaultTarget: route,
120
+ };
121
+ }
122
+ if (hasStitchIntent) {
123
+ groupDefaults.stitchOut = {
124
+ ...groupDefaults.stitchOut,
125
+ defaultTarget: route,
126
+ };
127
+ }
128
+ if (hasProcessIntent) {
129
+ groupDefaults.processProxy = {
130
+ ...groupDefaults.processProxy,
131
+ defaultTarget: route,
132
+ ...(clause.includes("onlyai") || clause.includes("美国") || clause.includes("us")
133
+ ? { defaultNodePattern: "OnlyAI" }
134
+ : {}),
135
+ };
136
+ }
137
+ }
138
+ const matchedDomains = new Set();
139
+ for (const definition of siteAliasDefinitions) {
140
+ if (definition.aliases.some((alias) => clause.includes(alias))) {
141
+ for (const domain of definition.domains) {
142
+ matchedDomains.add(domain);
143
+ }
144
+ }
145
+ }
146
+ for (const domain of extractExplicitDomains(clause)) {
147
+ matchedDomains.add(domain);
148
+ }
149
+ if (matchedDomains.size > 0 && route && !hasStitchIntent) {
150
+ const rule = {
151
+ name: `Generated from prompt: ${Array.from(matchedDomains).join(", ")}`,
152
+ domainSuffix: [...matchedDomains],
153
+ route,
154
+ };
155
+ if (phase === "beforeBuiltins") {
156
+ beforeBuiltins.push(rule);
157
+ }
158
+ else {
159
+ afterBuiltins.push(rule);
160
+ }
161
+ verificationOverrides.push(...[...matchedDomains].map((domain) => ({
162
+ inbound: "in-mixed",
163
+ domainSuffix: domain,
164
+ expectedOutbound: route,
165
+ })));
166
+ continue;
167
+ }
168
+ if (hasProcessIntent) {
169
+ notes.push(`Prompt clause "${clause}" maps to the built-in proxifier flow. Use Proxifier to send the target apps to in-proxifier.`);
170
+ }
171
+ }
172
+ const mergedTemplates = mergeRuleTemplates([...templateIds]);
173
+ return {
174
+ beforeBuiltins: dedupeRules([...mergedTemplates.beforeBuiltins, ...beforeBuiltins]),
175
+ afterBuiltins: dedupeRules([...mergedTemplates.afterBuiltins, ...afterBuiltins]),
176
+ templateIds: [...templateIds],
177
+ notes,
178
+ ...(parsedInterval ? { scheduleIntervalMinutes: parsedInterval } : {}),
179
+ ...(Object.keys(groupDefaults).length > 0 ? { groupDefaults } : {}),
180
+ ...(verificationOverrides.length > 0 ? { verificationOverrides } : {}),
181
+ };
182
+ }
183
+ export async function writeGeneratedRules(input) {
184
+ const rendered = renderGeneratedRules(input.plan);
185
+ await mkdir(path.dirname(input.filePath), { recursive: true });
186
+ await writeFile(input.filePath, rendered, "utf8");
187
+ return input.filePath;
188
+ }
189
+ export function renderGeneratedRules(plan) {
190
+ const document = {
191
+ version: 1,
192
+ beforeBuiltins: plan.beforeBuiltins.map(serializeRule),
193
+ afterBuiltins: plan.afterBuiltins.map(serializeRule),
194
+ };
195
+ return YAML.stringify(document);
196
+ }
197
+ export async function updateBuilderSchedule(input) {
198
+ const raw = await readFile(input.configPath, "utf8");
199
+ const document = YAML.parseDocument(raw);
200
+ updateScheduleNode(document, input.intervalMinutes);
201
+ await writeFile(input.configPath, document.toString(), "utf8");
202
+ }
203
+ export async function updateBuilderAuthoring(input) {
204
+ const raw = await readFile(input.configPath, "utf8");
205
+ const rendered = renderUpdatedBuilderConfig({
206
+ rawConfig: raw,
207
+ ...(input.rulesPath ? { rulesPath: input.rulesPath } : {}),
208
+ ...(input.intervalMinutes ? { intervalMinutes: input.intervalMinutes } : {}),
209
+ ...(input.groupDefaults ? { groupDefaults: input.groupDefaults } : {}),
210
+ ...(input.verificationOverrides ? { verificationOverrides: input.verificationOverrides } : {}),
211
+ });
212
+ await writeFile(input.configPath, rendered, "utf8");
213
+ }
214
+ export function renderUpdatedBuilderConfig(input) {
215
+ const parsed = YAML.parse(input.rawConfig);
216
+ if (input.rulesPath) {
217
+ parsed.rules = {
218
+ ...parsed.rules,
219
+ userRulesFile: input.rulesPath,
220
+ };
221
+ }
222
+ if (input.intervalMinutes) {
223
+ parsed.schedule = {
224
+ ...parsed.schedule,
225
+ enabled: true,
226
+ intervalMinutes: input.intervalMinutes,
227
+ };
228
+ }
229
+ if (input.groupDefaults) {
230
+ parsed.groups = applyGroupDefaults(parsed.groups, input.groupDefaults);
231
+ }
232
+ if (input.verificationOverrides && input.verificationOverrides.length > 0) {
233
+ parsed.verification = {
234
+ ...parsed.verification,
235
+ scenarios: applyVerificationOverrides(parsed.verification.scenarios, input.verificationOverrides),
236
+ };
237
+ }
238
+ return YAML.stringify(parsed);
239
+ }
240
+ export function applyPlanToBuilderConfig(config, input) {
241
+ return {
242
+ ...config,
243
+ rules: {
244
+ ...config.rules,
245
+ userRulesFile: input.rulesPath,
246
+ },
247
+ ...(input.plan.scheduleIntervalMinutes
248
+ ? {
249
+ schedule: {
250
+ ...config.schedule,
251
+ enabled: true,
252
+ intervalMinutes: input.plan.scheduleIntervalMinutes,
253
+ },
254
+ }
255
+ : {}),
256
+ ...(input.plan.groupDefaults
257
+ ? {
258
+ groups: applyGroupDefaults(config.groups, input.plan.groupDefaults),
259
+ }
260
+ : {}),
261
+ ...(input.plan.verificationOverrides && input.plan.verificationOverrides.length > 0
262
+ ? {
263
+ verification: {
264
+ ...config.verification,
265
+ scenarios: applyVerificationOverrides(config.verification.scenarios, input.plan.verificationOverrides),
266
+ },
267
+ }
268
+ : {}),
269
+ };
270
+ }
271
+ function serializeRule(rule) {
272
+ return {
273
+ ...(rule.name ? { name: rule.name } : {}),
274
+ ...(rule.inbound ? { inbound: simplifyArray(rule.inbound) } : {}),
275
+ ...(rule.protocol ? { protocol: rule.protocol } : {}),
276
+ ...(rule.network ? { network: rule.network } : {}),
277
+ ...(rule.port ? { port: rule.port } : {}),
278
+ ...(rule.domain ? { domain: simplifyArray(rule.domain) } : {}),
279
+ ...(rule.domainSuffix ? { domainSuffix: simplifyArray(rule.domainSuffix) } : {}),
280
+ ...(rule.ruleSet ? { ruleSet: simplifyArray(rule.ruleSet) } : {}),
281
+ ...(rule.route ? { route: rule.route } : {}),
282
+ ...(rule.action ? { action: rule.action } : {}),
283
+ };
284
+ }
285
+ function simplifyArray(values) {
286
+ return values.length === 1 ? (values[0] ?? "") : values;
287
+ }
288
+ function normalizePrompt(prompt) {
289
+ return prompt.toLowerCase();
290
+ }
291
+ function splitClauses(prompt) {
292
+ return prompt
293
+ .split(/[,。,;;!!\n]/)
294
+ .map((clause) => clause.trim())
295
+ .filter((clause) => clause.length > 0);
296
+ }
297
+ function parseScheduleIntervalMinutes(prompt) {
298
+ const minuteMatch = prompt.match(/每\s*(\d+)\s*分钟|every\s*(\d+)\s*minutes?/i);
299
+ if (minuteMatch) {
300
+ const value = Number.parseInt(minuteMatch[1] ?? minuteMatch[2] ?? "", 10);
301
+ if (Number.isInteger(value) && value > 0) {
302
+ return value;
303
+ }
304
+ }
305
+ const hourMatch = prompt.match(/每\s*(\d+)\s*小时|every\s*(\d+)\s*hours?/i);
306
+ if (hourMatch) {
307
+ const value = Number.parseInt(hourMatch[1] ?? hourMatch[2] ?? "", 10);
308
+ if (Number.isInteger(value) && value > 0) {
309
+ return value * 60;
310
+ }
311
+ }
312
+ if (prompt.includes("定时") || prompt.includes("schedule") || prompt.includes("launchd")) {
313
+ return 30;
314
+ }
315
+ return undefined;
316
+ }
317
+ function extractRouteTarget(clause) {
318
+ if (clause.includes("直连") || clause.includes("direct")) {
319
+ return "direct";
320
+ }
321
+ if (clause.includes("ai-out") || clause.includes("ai 组") || clause.includes("ai组")) {
322
+ return "AI-Out";
323
+ }
324
+ if (clause.includes("dev-common-out") || clause.includes("开发组")) {
325
+ return "Dev-Common-Out";
326
+ }
327
+ if (clause.includes("stitch-out")) {
328
+ return "Stitch-Out";
329
+ }
330
+ if (clause.includes("美国") || /\bus\b/.test(clause)) {
331
+ return "US";
332
+ }
333
+ if (clause.includes("香港") || /\bhk\b/.test(clause)) {
334
+ return "HK";
335
+ }
336
+ if (clause.includes("新加坡") || /\bsg\b/.test(clause)) {
337
+ return "SG";
338
+ }
339
+ if (clause.includes("日本") || /\bjp\b/.test(clause)) {
340
+ return "JP";
341
+ }
342
+ return undefined;
343
+ }
344
+ function isRegionTarget(route) {
345
+ return route === "US" || route === "HK" || route === "SG" || route === "JP";
346
+ }
347
+ function extractExplicitDomains(clause) {
348
+ const matches = clause.match(/[a-z0-9-]+(?:\.[a-z0-9-]+)+/g) ?? [];
349
+ return [...new Set(matches)];
350
+ }
351
+ function resolveTemplateForRoute(templateId, route) {
352
+ if (templateId === "video-us" && route === "JP") {
353
+ return "video-jp";
354
+ }
355
+ if (templateId === "video-us" && route === "HK") {
356
+ return "video-hk";
357
+ }
358
+ if (templateId === "video-us" && route === "SG") {
359
+ return "video-sg";
360
+ }
361
+ if (templateId === "video-us" && route === "direct") {
362
+ return "cn-video-direct";
363
+ }
364
+ return templateId;
365
+ }
366
+ function dedupeRules(rules) {
367
+ const byKey = new Map();
368
+ for (const rule of rules) {
369
+ byKey.set(JSON.stringify(rule), rule);
370
+ }
371
+ return [...byKey.values()];
372
+ }
373
+ function hasTemplateAlias(clause, templateId) {
374
+ return categoryTemplateDefinitions
375
+ .filter((definition) => definition.templateId === templateId)
376
+ .some((definition) => definition.aliases.some((alias) => clause.includes(alias)));
377
+ }
378
+ function applyGroupDefaults(groups, overrides) {
379
+ return {
380
+ ...groups,
381
+ ...(overrides.processProxy
382
+ ? {
383
+ processProxy: {
384
+ ...groups.processProxy,
385
+ ...overrides.processProxy,
386
+ },
387
+ }
388
+ : {}),
389
+ ...(overrides.aiOut
390
+ ? {
391
+ aiOut: {
392
+ ...groups.aiOut,
393
+ ...overrides.aiOut,
394
+ },
395
+ }
396
+ : {}),
397
+ ...(overrides.devCommonOut
398
+ ? {
399
+ devCommonOut: {
400
+ ...groups.devCommonOut,
401
+ ...overrides.devCommonOut,
402
+ },
403
+ }
404
+ : {}),
405
+ ...(overrides.stitchOut
406
+ ? {
407
+ stitchOut: {
408
+ ...groups.stitchOut,
409
+ ...overrides.stitchOut,
410
+ },
411
+ }
412
+ : {}),
413
+ };
414
+ }
415
+ function applyVerificationOverrides(scenarios, overrides) {
416
+ return scenarios.map((scenario) => {
417
+ const host = new URL(scenario.url).hostname.toLowerCase();
418
+ const matchedOverride = overrides.find((override) => {
419
+ if (override.inbound && override.inbound !== scenario.inbound) {
420
+ return false;
421
+ }
422
+ if (override.domain && override.domain.toLowerCase() === host) {
423
+ return true;
424
+ }
425
+ if (override.domainSuffix) {
426
+ const suffix = override.domainSuffix.toLowerCase();
427
+ return host === suffix || host.endsWith(`.${suffix}`);
428
+ }
429
+ return false;
430
+ });
431
+ if (!matchedOverride) {
432
+ return scenario;
433
+ }
434
+ return {
435
+ ...scenario,
436
+ expectedOutbound: matchedOverride.expectedOutbound,
437
+ };
438
+ });
439
+ }
440
+ function updateScheduleNode(document, intervalMinutes) {
441
+ const schedule = document.get("schedule", true);
442
+ if (hasYamlSet(schedule)) {
443
+ schedule.set("enabled", true);
444
+ schedule.set("intervalMinutes", intervalMinutes);
445
+ return;
446
+ }
447
+ document.set("schedule", {
448
+ enabled: true,
449
+ intervalMinutes,
450
+ });
451
+ }
452
+ function hasYamlSet(value) {
453
+ return (value !== null &&
454
+ typeof value === "object" &&
455
+ "set" in value &&
456
+ typeof value.set === "function");
457
+ }
458
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/natural-language/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { NormalizedNode } from "../../domain/node.js";
2
+ export interface ParseSubscriptionInput {
3
+ readonly content: string;
4
+ }
5
+ export interface ParseSubscriptionResult {
6
+ readonly nodes: NormalizedNode[];
7
+ readonly errors: string[];
8
+ }
9
+ export declare function decodeSubscriptionContent(content: string): string[];
10
+ export declare function parseSubscription(input: ParseSubscriptionInput): ParseSubscriptionResult;
@@ -0,0 +1,113 @@
1
+ const infoTagPattern = /剩余流量|下次重置|套餐到期|流量|到期|重置/i;
2
+ const regionMatchers = [
3
+ ["HK", /🇭🇰|香港|\bhk\b/i],
4
+ ["SG", /🇸🇬|新加坡|\bsg\b/i],
5
+ ["US", /🇺🇸|美国|\bus\b/i],
6
+ ["JP", /🇯🇵|日本|\bjp\b/i],
7
+ ];
8
+ export function decodeSubscriptionContent(content) {
9
+ const trimmed = content.trim();
10
+ if (trimmed.length === 0) {
11
+ return [];
12
+ }
13
+ if (trimmed.includes("://")) {
14
+ return splitLines(trimmed);
15
+ }
16
+ const sanitized = trimmed.replace(/\s+/gu, "").replace(/-/gu, "+").replace(/_/gu, "/");
17
+ const paddingLength = (4 - (sanitized.length % 4)) % 4;
18
+ const decoded = Buffer.from(`${sanitized}${"=".repeat(paddingLength)}`, "base64")
19
+ .toString("utf8")
20
+ .trim();
21
+ if (!decoded.includes("://")) {
22
+ throw new Error("Subscription content is neither line-based URI text nor valid Base64 URI text.");
23
+ }
24
+ return splitLines(decoded);
25
+ }
26
+ export function parseSubscription(input) {
27
+ const lines = decodeSubscriptionContent(input.content);
28
+ const seenTags = new Map();
29
+ const nodes = [];
30
+ const errors = [];
31
+ for (const [index, line] of lines.entries()) {
32
+ try {
33
+ const node = parseTrojanLine(line, index + 1, seenTags);
34
+ if (node === null) {
35
+ errors.push(`Line ${index + 1}: skipped non-node subscription entry.`);
36
+ continue;
37
+ }
38
+ nodes.push(node);
39
+ }
40
+ catch (error) {
41
+ const message = error instanceof Error ? error.message : String(error);
42
+ errors.push(`Line ${index + 1}: ${message}`);
43
+ }
44
+ }
45
+ return { nodes, errors };
46
+ }
47
+ function splitLines(content) {
48
+ return content
49
+ .split(/\r?\n/u)
50
+ .map((line) => line.trim())
51
+ .filter((line) => line.length > 0);
52
+ }
53
+ function parseTrojanLine(line, lineNumber, seenTags) {
54
+ const url = new URL(line);
55
+ if (url.protocol !== "trojan:") {
56
+ throw new Error(`Unsupported protocol "${url.protocol.replace(":", "")}"`);
57
+ }
58
+ const password = decodeURIComponent(url.username || url.password);
59
+ const server = url.hostname;
60
+ const serverPort = Number.parseInt(url.port, 10);
61
+ const rawTag = decodeURIComponent(url.hash.replace(/^#/u, "")).trim();
62
+ const tag = rawTag.length > 0 ? rawTag : `trojan-${lineNumber}`;
63
+ if (password.length === 0) {
64
+ throw new Error("Missing Trojan password.");
65
+ }
66
+ if (server.length === 0 || Number.isNaN(serverPort)) {
67
+ throw new Error("Missing Trojan server or port.");
68
+ }
69
+ if (infoTagPattern.test(tag)) {
70
+ return null;
71
+ }
72
+ const insecure = parseBoolean(url.searchParams.get("allowInsecure"));
73
+ const sni = firstNonEmpty(url.searchParams.get("sni"), url.searchParams.get("peer"), url.hostname);
74
+ const regionHint = detectRegion(tag);
75
+ return {
76
+ protocol: "trojan",
77
+ tag: makeUniqueTag(tag, seenTags),
78
+ server,
79
+ serverPort,
80
+ password,
81
+ ...(sni ? { sni } : {}),
82
+ ...(insecure !== undefined ? { insecure } : {}),
83
+ ...(regionHint ? { regionHint } : {}),
84
+ };
85
+ }
86
+ function makeUniqueTag(tag, seenTags) {
87
+ const current = seenTags.get(tag) ?? 0;
88
+ seenTags.set(tag, current + 1);
89
+ return current === 0 ? tag : `${tag} (${current + 1})`;
90
+ }
91
+ function detectRegion(tag) {
92
+ for (const [region, pattern] of regionMatchers) {
93
+ if (pattern.test(tag)) {
94
+ return region;
95
+ }
96
+ }
97
+ return undefined;
98
+ }
99
+ function parseBoolean(value) {
100
+ if (value === null) {
101
+ return undefined;
102
+ }
103
+ return /^(1|true|yes)$/iu.test(value);
104
+ }
105
+ function firstNonEmpty(...values) {
106
+ for (const value of values) {
107
+ if (value !== null && value.trim().length > 0) {
108
+ return value;
109
+ }
110
+ }
111
+ return undefined;
112
+ }
113
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/parser/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { BuilderConfig } from "../../config/schema.js";
2
+ import type { NaturalLanguagePlan } from "../natural-language/index.js";
3
+ export interface PreviewDiff {
4
+ readonly label: string;
5
+ readonly changed: boolean;
6
+ readonly diff: string;
7
+ }
8
+ export interface GenerateAuthoringPreviewInput {
9
+ readonly configPath: string;
10
+ readonly config: BuilderConfig;
11
+ readonly plan: NaturalLanguagePlan;
12
+ readonly rulesPath: string;
13
+ readonly subscriptionFile?: string;
14
+ readonly subscriptionUrl?: string;
15
+ readonly buildStaging?: boolean;
16
+ }
17
+ export interface AuthoringPreviewReport {
18
+ readonly rulesDiff: PreviewDiff;
19
+ readonly configDiff: PreviewDiff;
20
+ readonly stagingDiff?: PreviewDiff;
21
+ }
22
+ export declare function generateAuthoringPreview(input: GenerateAuthoringPreviewInput): Promise<AuthoringPreviewReport>;