@singbox-iac/cli 0.1.0 → 0.1.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/CONTRIBUTING.md +61 -0
- package/README-en.md +337 -0
- package/README.md +253 -181
- package/dist/cli/command-helpers.d.ts +5 -0
- package/dist/cli/command-helpers.js +27 -3
- package/dist/cli/command-helpers.js.map +1 -1
- package/dist/cli/commands/author.js +1 -7
- package/dist/cli/commands/author.js.map +1 -1
- package/dist/cli/commands/init.js +4 -4
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/setup.d.ts +2 -0
- package/dist/cli/commands/setup.js +356 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/index.js +3 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/modules/fetcher/index.js +1 -1
- package/dist/modules/fetcher/index.js.map +1 -1
- package/dist/modules/natural-language/index.d.ts +10 -0
- package/dist/modules/natural-language/index.js +77 -1
- package/dist/modules/natural-language/index.js.map +1 -1
- package/dist/modules/rule-set-sync/index.d.ts +16 -0
- package/dist/modules/rule-set-sync/index.js +55 -0
- package/dist/modules/rule-set-sync/index.js.map +1 -0
- package/dist/modules/verification/index.d.ts +18 -0
- package/dist/modules/verification/index.js +38 -0
- package/dist/modules/verification/index.js.map +1 -1
- package/docs/releasing.md +15 -6
- package/docs/runtime-on-macos.md +12 -0
- package/package.json +10 -2
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { homedir } from "node:os";
|
|
2
1
|
import path from "node:path";
|
|
3
2
|
import { initWorkspace } from "../../modules/init/index.js";
|
|
3
|
+
import { getDefaultConfigPath, getDefaultRulesPath, resolvePackageRoot, } from "../command-helpers.js";
|
|
4
4
|
export function registerInitCommand(program) {
|
|
5
5
|
program
|
|
6
6
|
.command("init")
|
|
7
7
|
.description("Create example singbox-iac configuration assets.")
|
|
8
|
-
.option("-c, --config-out <path>", "path to write builder config",
|
|
9
|
-
.option("--rules-out <path>", "path to write the custom rules YAML",
|
|
8
|
+
.option("-c, --config-out <path>", "path to write builder config", getDefaultConfigPath())
|
|
9
|
+
.option("--rules-out <path>", "path to write the custom rules YAML", getDefaultRulesPath())
|
|
10
10
|
.option("--subscription-url <url>", "seed the generated config with a real subscription URL")
|
|
11
11
|
.option("-f, --force", "overwrite existing generated assets")
|
|
12
12
|
.action(async (options) => {
|
|
13
13
|
const result = await initWorkspace({
|
|
14
14
|
configOutPath: path.resolve(options.configOut),
|
|
15
15
|
rulesOutPath: path.resolve(options.rulesOut),
|
|
16
|
-
examplesDir: path.
|
|
16
|
+
examplesDir: path.join(resolvePackageRoot(import.meta.url), "examples"),
|
|
17
17
|
...(options.subscriptionUrl ? { subscriptionUrl: options.subscriptionUrl } : {}),
|
|
18
18
|
force: options.force === true,
|
|
19
19
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,yBAAyB,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,CAAC;SACzF,MAAM,CAAC,oBAAoB,EAAE,qCAAqC,EAAE,mBAAmB,EAAE,CAAC;SAC1F,MAAM,CAAC,0BAA0B,EAAE,wDAAwD,CAAC;SAC5F,MAAM,CAAC,aAAa,EAAE,qCAAqC,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;YACjC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YAC9C,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC5C,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;YACvE,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI;SAC9B,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,WAAW,MAAM,CAAC,UAAU,EAAE,EAAE,UAAU,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACjF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { access } from "node:fs/promises";
|
|
4
|
+
import net from "node:net";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { loadConfig } from "../../config/load-config.js";
|
|
7
|
+
import { generateAuthoringPlan } from "../../modules/authoring/index.js";
|
|
8
|
+
import { buildConfigArtifact } from "../../modules/build/index.js";
|
|
9
|
+
import { runDoctor } from "../../modules/doctor/index.js";
|
|
10
|
+
import { initWorkspace } from "../../modules/init/index.js";
|
|
11
|
+
import { applyConfig, checkConfig, resolveSingBoxBinary } from "../../modules/manager/index.js";
|
|
12
|
+
import { applyPlanToBuilderConfig, selectVerificationScenariosForPrompt, updateBuilderAuthoring, writeGeneratedRules, } from "../../modules/natural-language/index.js";
|
|
13
|
+
import { syncLocalRuleSets } from "../../modules/rule-set-sync/index.js";
|
|
14
|
+
import { installLaunchdSchedule } from "../../modules/schedule/index.js";
|
|
15
|
+
import { assertVerificationReportPassed, openVisibleChromeWindows, verifyConfigRoutes, } from "../../modules/verification/index.js";
|
|
16
|
+
import { getDefaultConfigPath, getDefaultRulesPath, resolveCliEntrypoint, resolvePackageRoot, } from "../command-helpers.js";
|
|
17
|
+
export function registerSetupCommand(program) {
|
|
18
|
+
program
|
|
19
|
+
.command("setup")
|
|
20
|
+
.description("One-step setup: initialize config, sync rule sets, optionally author rules, and build.")
|
|
21
|
+
.option("-c, --config <path>", "path to builder config YAML", getDefaultConfigPath())
|
|
22
|
+
.option("--rules-out <path>", "target custom-rules file for first-time setup", getDefaultRulesPath())
|
|
23
|
+
.option("--subscription-url <url>", "subscription URL; required on first setup")
|
|
24
|
+
.option("--subscription-file <path>", "use a local subscription file for the initial build")
|
|
25
|
+
.option("-p, --prompt <text>", "optional natural-language routing prompt")
|
|
26
|
+
.option("--provider <provider>", "authoring provider: deterministic, auto, claude, exec")
|
|
27
|
+
.option("--author-timeout-ms <ms>", "timeout for local AI CLI authoring")
|
|
28
|
+
.option("--exec-command <command>", "command for the exec authoring provider")
|
|
29
|
+
.option("--exec-arg <arg>", "append one argument for the exec authoring provider", collectOption, [])
|
|
30
|
+
.option("--skip-rulesets", "skip syncing the configured local rule sets")
|
|
31
|
+
.option("--skip-build", "create/update configuration only and skip the initial build")
|
|
32
|
+
.option("--no-doctor", "skip environment checks during setup")
|
|
33
|
+
.option("--verify", "run runtime verification after the initial build")
|
|
34
|
+
.option("--apply", "publish the generated config to the configured live path")
|
|
35
|
+
.option("--reload", "reload sing-box after a successful publish")
|
|
36
|
+
.option("--run", "run sing-box in the foreground after setup completes")
|
|
37
|
+
.option("--open-browser", "open isolated Chrome windows for prompt-relevant verification URLs")
|
|
38
|
+
.option("--ready", "run the guided first-run activation flow: doctor, verify, publish, and install the schedule")
|
|
39
|
+
.option("--sing-box-bin <path>", "path to sing-box binary")
|
|
40
|
+
.option("--chrome-bin <path>", "path to Chrome binary")
|
|
41
|
+
.option("--install-schedule", "install a launchd job after setup")
|
|
42
|
+
.option("--label <label>", "LaunchAgent label", "org.singbox-iac.update")
|
|
43
|
+
.option("--launch-agents-dir <path>", "override LaunchAgents directory")
|
|
44
|
+
.option("--logs-dir <path>", "override launchd log directory")
|
|
45
|
+
.option("-f, --force", "overwrite generated files during first-time setup and re-download rulesets")
|
|
46
|
+
.option("--no-load", "write the LaunchAgent without calling launchctl bootstrap")
|
|
47
|
+
.action(async (options) => {
|
|
48
|
+
const configPath = resolvePath(options.config);
|
|
49
|
+
const rulesPath = resolvePath(options.rulesOut);
|
|
50
|
+
const createdFreshConfig = options.force === true || !(await pathExists(configPath));
|
|
51
|
+
if (createdFreshConfig) {
|
|
52
|
+
if (!options.subscriptionUrl) {
|
|
53
|
+
throw new Error("setup needs --subscription-url the first time. Existing configs can omit it.");
|
|
54
|
+
}
|
|
55
|
+
await initWorkspace({
|
|
56
|
+
configOutPath: configPath,
|
|
57
|
+
rulesOutPath: rulesPath,
|
|
58
|
+
examplesDir: path.join(resolvePackageRoot(import.meta.url), "examples"),
|
|
59
|
+
subscriptionUrl: options.subscriptionUrl,
|
|
60
|
+
force: options.force === true,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
let builderConfig = await loadConfig(configPath);
|
|
64
|
+
if (!createdFreshConfig && options.subscriptionUrl) {
|
|
65
|
+
await updateBuilderAuthoring({
|
|
66
|
+
configPath,
|
|
67
|
+
subscriptionUrl: options.subscriptionUrl,
|
|
68
|
+
});
|
|
69
|
+
builderConfig = await loadConfig(configPath);
|
|
70
|
+
}
|
|
71
|
+
let effectiveConfig = builderConfig;
|
|
72
|
+
let planSummary;
|
|
73
|
+
if (options.prompt) {
|
|
74
|
+
const planResult = await generateAuthoringPlan({
|
|
75
|
+
prompt: options.prompt,
|
|
76
|
+
config: builderConfig,
|
|
77
|
+
...(options.provider ? { provider: options.provider } : {}),
|
|
78
|
+
...(options.authorTimeoutMs
|
|
79
|
+
? { timeoutMs: Number.parseInt(options.authorTimeoutMs, 10) }
|
|
80
|
+
: {}),
|
|
81
|
+
...(options.execCommand ? { execCommand: options.execCommand } : {}),
|
|
82
|
+
...(options.execArg.length > 0 ? { execArgs: options.execArg } : {}),
|
|
83
|
+
});
|
|
84
|
+
effectiveConfig = applyPlanToBuilderConfig(builderConfig, {
|
|
85
|
+
rulesPath: builderConfig.rules.userRulesFile,
|
|
86
|
+
plan: planResult.plan,
|
|
87
|
+
});
|
|
88
|
+
await writeGeneratedRules({
|
|
89
|
+
filePath: effectiveConfig.rules.userRulesFile,
|
|
90
|
+
plan: planResult.plan,
|
|
91
|
+
});
|
|
92
|
+
await updateBuilderAuthoring({
|
|
93
|
+
configPath,
|
|
94
|
+
rulesPath: effectiveConfig.rules.userRulesFile,
|
|
95
|
+
...(planResult.plan.scheduleIntervalMinutes
|
|
96
|
+
? { intervalMinutes: planResult.plan.scheduleIntervalMinutes }
|
|
97
|
+
: {}),
|
|
98
|
+
...(planResult.plan.groupDefaults
|
|
99
|
+
? { groupDefaults: planResult.plan.groupDefaults }
|
|
100
|
+
: {}),
|
|
101
|
+
...(planResult.plan.verificationOverrides
|
|
102
|
+
? { verificationOverrides: planResult.plan.verificationOverrides }
|
|
103
|
+
: {}),
|
|
104
|
+
});
|
|
105
|
+
builderConfig = await loadConfig(configPath);
|
|
106
|
+
effectiveConfig = builderConfig;
|
|
107
|
+
planSummary = {
|
|
108
|
+
providerRequested: planResult.providerRequested,
|
|
109
|
+
providerUsed: planResult.providerUsed,
|
|
110
|
+
templates: planResult.plan.templateIds,
|
|
111
|
+
generatedRules: planResult.plan.beforeBuiltins.length + planResult.plan.afterBuiltins.length,
|
|
112
|
+
notes: planResult.plan.notes,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const lines = [`Config: ${configPath}`, `Rules: ${effectiveConfig.rules.userRulesFile}`];
|
|
116
|
+
const shouldDoctor = options.doctor !== false || options.ready === true;
|
|
117
|
+
const shouldVerify = options.verify === true || options.ready === true;
|
|
118
|
+
const shouldApply = options.apply === true || options.ready === true;
|
|
119
|
+
const shouldInstallSchedule = options.installSchedule === true || options.ready === true;
|
|
120
|
+
const shouldRun = options.run === true;
|
|
121
|
+
const shouldOpenBrowser = options.openBrowser === true || (options.ready === true && options.run === true);
|
|
122
|
+
if (options.skipBuild && (shouldVerify || shouldApply)) {
|
|
123
|
+
throw new Error("setup cannot use --skip-build together with --verify or --apply.");
|
|
124
|
+
}
|
|
125
|
+
if (options.skipBuild && shouldRun) {
|
|
126
|
+
throw new Error("setup cannot use --skip-build together with --run.");
|
|
127
|
+
}
|
|
128
|
+
if (shouldDoctor) {
|
|
129
|
+
const doctorReport = await runDoctor({
|
|
130
|
+
config: effectiveConfig,
|
|
131
|
+
configPath,
|
|
132
|
+
...(options.singBoxBin ? { singBoxBinary: resolvePath(options.singBoxBin) } : {}),
|
|
133
|
+
...(options.chromeBin ? { chromeBinary: resolvePath(options.chromeBin) } : {}),
|
|
134
|
+
...(options.launchAgentsDir
|
|
135
|
+
? { launchAgentsDir: resolvePath(options.launchAgentsDir) }
|
|
136
|
+
: {}),
|
|
137
|
+
});
|
|
138
|
+
lines.push(...formatDoctorSummary(doctorReport));
|
|
139
|
+
}
|
|
140
|
+
if (options.skipRulesets) {
|
|
141
|
+
lines.push("Rule sets: skipped");
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const syncResult = await syncLocalRuleSets({
|
|
145
|
+
ruleSets: effectiveConfig.ruleSets,
|
|
146
|
+
force: options.force === true,
|
|
147
|
+
});
|
|
148
|
+
lines.push(`Rule sets: downloaded ${syncResult.downloaded.length}, skipped ${syncResult.skipped.length}, failed ${syncResult.failed.length}`);
|
|
149
|
+
if (syncResult.failed.length > 0) {
|
|
150
|
+
lines.push(...syncResult.failed.map((failure) => `- ${failure.tag}: ${failure.reason}`));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (planSummary) {
|
|
154
|
+
lines.push(`Provider requested: ${planSummary.providerRequested}`);
|
|
155
|
+
lines.push(`Provider used: ${planSummary.providerUsed}`);
|
|
156
|
+
lines.push(`Templates: ${planSummary.templates.length > 0 ? planSummary.templates.join(", ") : "(none)"}`);
|
|
157
|
+
lines.push(`Generated rules: ${planSummary.generatedRules}`);
|
|
158
|
+
if (planSummary.notes.length > 0) {
|
|
159
|
+
lines.push(...planSummary.notes.map((note) => `- ${note}`));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
let buildSummary;
|
|
163
|
+
let schedulePath;
|
|
164
|
+
if (options.skipBuild) {
|
|
165
|
+
lines.push("Staging: skipped");
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
const build = await buildConfigArtifact({
|
|
169
|
+
config: effectiveConfig,
|
|
170
|
+
...(options.subscriptionFile
|
|
171
|
+
? { subscriptionFile: resolvePath(options.subscriptionFile) }
|
|
172
|
+
: {}),
|
|
173
|
+
...(options.subscriptionUrl ? { subscriptionUrl: options.subscriptionUrl } : {}),
|
|
174
|
+
});
|
|
175
|
+
lines.push(`Staging: ${build.outputPath}`);
|
|
176
|
+
lines.push(`Nodes: ${build.nodeCount}`);
|
|
177
|
+
let verification;
|
|
178
|
+
if (shouldVerify) {
|
|
179
|
+
verification = await verifyConfigRoutes({
|
|
180
|
+
configPath: build.outputPath,
|
|
181
|
+
...(options.singBoxBin ? { singBoxBinary: resolvePath(options.singBoxBin) } : {}),
|
|
182
|
+
...(options.chromeBin ? { chromeBinary: resolvePath(options.chromeBin) } : {}),
|
|
183
|
+
configuredScenarios: effectiveConfig.verification.scenarios,
|
|
184
|
+
});
|
|
185
|
+
assertVerificationReportPassed(verification);
|
|
186
|
+
lines.push(`Verified scenarios: ${verification.scenarios.filter((scenario) => scenario.passed).length}/${verification.scenarios.length}`);
|
|
187
|
+
}
|
|
188
|
+
if (shouldApply) {
|
|
189
|
+
await applyConfig({
|
|
190
|
+
stagingPath: build.outputPath,
|
|
191
|
+
livePath: effectiveConfig.output.livePath,
|
|
192
|
+
...(effectiveConfig.output.backupPath
|
|
193
|
+
? { backupPath: effectiveConfig.output.backupPath }
|
|
194
|
+
: {}),
|
|
195
|
+
...(options.singBoxBin ? { singBoxBinary: resolvePath(options.singBoxBin) } : {}),
|
|
196
|
+
reload: options.reload === true,
|
|
197
|
+
runtime: effectiveConfig.runtime.reload,
|
|
198
|
+
});
|
|
199
|
+
lines.push(`Live: ${effectiveConfig.output.livePath}`);
|
|
200
|
+
if (effectiveConfig.output.backupPath) {
|
|
201
|
+
lines.push(`Backup: ${effectiveConfig.output.backupPath}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
buildSummary = {
|
|
205
|
+
outputPath: build.outputPath,
|
|
206
|
+
nodeCount: build.nodeCount,
|
|
207
|
+
...(verification ? { verification } : {}),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
if (shouldInstallSchedule) {
|
|
211
|
+
const schedule = await installLaunchdSchedule({
|
|
212
|
+
configPath,
|
|
213
|
+
intervalMinutes: effectiveConfig.schedule.intervalMinutes,
|
|
214
|
+
cliEntrypoint: resolveCliEntrypoint(import.meta.url),
|
|
215
|
+
label: options.label,
|
|
216
|
+
...(options.launchAgentsDir
|
|
217
|
+
? { launchAgentsDir: resolvePath(options.launchAgentsDir) }
|
|
218
|
+
: {}),
|
|
219
|
+
...(options.logsDir ? { logsDir: resolvePath(options.logsDir) } : {}),
|
|
220
|
+
force: options.force === true,
|
|
221
|
+
load: options.load !== false,
|
|
222
|
+
});
|
|
223
|
+
schedulePath = schedule.plistPath;
|
|
224
|
+
lines.push(`LaunchAgent: ${schedule.plistPath}`);
|
|
225
|
+
}
|
|
226
|
+
lines.push(`Proxy ports: mixed ${effectiveConfig.listeners.mixed.listen}:${effectiveConfig.listeners.mixed.port}, proxifier ${effectiveConfig.listeners.proxifier.listen}:${effectiveConfig.listeners.proxifier.port}`);
|
|
227
|
+
if (shouldApply) {
|
|
228
|
+
lines.push("Next: sing-box run -c ~/.config/sing-box/config.json");
|
|
229
|
+
if (schedulePath) {
|
|
230
|
+
lines.push("Schedule: installed and ready for recurring updates");
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
lines.push("Next: singbox-iac schedule install");
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else if (buildSummary) {
|
|
237
|
+
lines.push("Next: singbox-iac run");
|
|
238
|
+
lines.push("Next: singbox-iac update --reload");
|
|
239
|
+
}
|
|
240
|
+
process.stdout.write(`${lines.join("\n")}\n`);
|
|
241
|
+
if (!shouldRun || !buildSummary) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const runConfigPath = shouldApply ? effectiveConfig.output.livePath : buildSummary.outputPath;
|
|
245
|
+
const singBoxBinary = await resolveSingBoxBinary(options.singBoxBin ? resolvePath(options.singBoxBin) : undefined);
|
|
246
|
+
await checkConfig({
|
|
247
|
+
configPath: runConfigPath,
|
|
248
|
+
singBoxBinary,
|
|
249
|
+
});
|
|
250
|
+
const child = spawn(singBoxBinary, ["run", "-c", runConfigPath], {
|
|
251
|
+
stdio: "inherit",
|
|
252
|
+
});
|
|
253
|
+
try {
|
|
254
|
+
await waitForPorts([
|
|
255
|
+
{
|
|
256
|
+
host: effectiveConfig.listeners.mixed.listen,
|
|
257
|
+
port: effectiveConfig.listeners.mixed.port,
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
host: effectiveConfig.listeners.proxifier.listen,
|
|
261
|
+
port: effectiveConfig.listeners.proxifier.port,
|
|
262
|
+
},
|
|
263
|
+
], 15_000);
|
|
264
|
+
if (shouldOpenBrowser) {
|
|
265
|
+
const selectedScenarios = options.prompt
|
|
266
|
+
? selectVerificationScenariosForPrompt(options.prompt, effectiveConfig.verification.scenarios)
|
|
267
|
+
: effectiveConfig.verification.scenarios.slice(0, Math.min(3, effectiveConfig.verification.scenarios.length));
|
|
268
|
+
const visibleScenarios = selectedScenarios.map((scenario) => ({
|
|
269
|
+
id: scenario.id,
|
|
270
|
+
name: scenario.name,
|
|
271
|
+
url: scenario.url,
|
|
272
|
+
inbound: scenario.inbound,
|
|
273
|
+
}));
|
|
274
|
+
const launches = await openVisibleChromeWindows({
|
|
275
|
+
scenarios: visibleScenarios,
|
|
276
|
+
mixedPort: effectiveConfig.listeners.mixed.port,
|
|
277
|
+
proxifierPort: effectiveConfig.listeners.proxifier.port,
|
|
278
|
+
...(options.chromeBin ? { chromeBinary: resolvePath(options.chromeBin) } : {}),
|
|
279
|
+
});
|
|
280
|
+
process.stdout.write(`${launches
|
|
281
|
+
.map((launch) => `Opened Chrome for ${launch.inbound} on ${launch.urls.join(", ")} via 127.0.0.1:${launch.proxyPort}`)
|
|
282
|
+
.join("\n")}\n`);
|
|
283
|
+
}
|
|
284
|
+
process.stdout.write(`Running sing-box in foreground: ${runConfigPath}\n`);
|
|
285
|
+
const exitCode = await new Promise((resolve, reject) => {
|
|
286
|
+
child.on("error", reject);
|
|
287
|
+
child.on("close", (code) => resolve(code ?? 0));
|
|
288
|
+
});
|
|
289
|
+
process.exitCode = exitCode;
|
|
290
|
+
}
|
|
291
|
+
finally {
|
|
292
|
+
if (!child.killed && child.exitCode === null) {
|
|
293
|
+
child.kill("SIGINT");
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
function resolvePath(filePath) {
|
|
299
|
+
return filePath.startsWith("/") ? filePath : path.resolve(process.cwd(), filePath);
|
|
300
|
+
}
|
|
301
|
+
function collectOption(value, previous) {
|
|
302
|
+
return [...previous, value];
|
|
303
|
+
}
|
|
304
|
+
function formatDoctorSummary(report) {
|
|
305
|
+
const passCount = report.checks.filter((check) => check.status === "PASS").length;
|
|
306
|
+
const warnCount = report.checks.filter((check) => check.status === "WARN").length;
|
|
307
|
+
const failCount = report.checks.filter((check) => check.status === "FAIL").length;
|
|
308
|
+
const lines = [`Doctor: PASS ${passCount}, WARN ${warnCount}, FAIL ${failCount}`];
|
|
309
|
+
for (const check of report.checks.filter((entry) => entry.status !== "PASS" ||
|
|
310
|
+
entry.name === "sing-box" ||
|
|
311
|
+
entry.name === "chrome" ||
|
|
312
|
+
entry.name === "local-ai-clis")) {
|
|
313
|
+
lines.push(`- [${check.status}] ${check.name}: ${check.details}`);
|
|
314
|
+
}
|
|
315
|
+
return lines;
|
|
316
|
+
}
|
|
317
|
+
async function pathExists(filePath) {
|
|
318
|
+
try {
|
|
319
|
+
await access(filePath, constants.F_OK);
|
|
320
|
+
return true;
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
async function waitForPorts(ports, timeoutMs) {
|
|
327
|
+
const startedAt = Date.now();
|
|
328
|
+
while (Date.now() - startedAt < timeoutMs) {
|
|
329
|
+
const allReady = await Promise.all(ports.map((entry) => isTcpPortOpen(entry.host, entry.port)));
|
|
330
|
+
if (allReady.every(Boolean)) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
334
|
+
}
|
|
335
|
+
throw new Error(`Timed out waiting for local listeners: ${ports
|
|
336
|
+
.map((entry) => `${entry.host}:${entry.port}`)
|
|
337
|
+
.join(", ")}`);
|
|
338
|
+
}
|
|
339
|
+
async function isTcpPortOpen(host, port) {
|
|
340
|
+
return new Promise((resolve) => {
|
|
341
|
+
const socket = net.createConnection({ host, port });
|
|
342
|
+
socket.setTimeout(500);
|
|
343
|
+
socket.on("connect", () => {
|
|
344
|
+
socket.destroy();
|
|
345
|
+
resolve(true);
|
|
346
|
+
});
|
|
347
|
+
socket.on("timeout", () => {
|
|
348
|
+
socket.destroy();
|
|
349
|
+
resolve(false);
|
|
350
|
+
});
|
|
351
|
+
socket.on("error", () => {
|
|
352
|
+
resolve(false);
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import { registerInitCommand } from "./commands/init.js";
|
|
|
11
11
|
import { registerReloadCommand } from "./commands/reload.js";
|
|
12
12
|
import { registerRunCommand } from "./commands/run.js";
|
|
13
13
|
import { registerScheduleCommand } from "./commands/schedule.js";
|
|
14
|
+
import { registerSetupCommand } from "./commands/setup.js";
|
|
14
15
|
import { registerTemplatesCommand } from "./commands/templates.js";
|
|
15
16
|
import { registerUpdateCommand } from "./commands/update.js";
|
|
16
17
|
import { registerVerifyCommand } from "./commands/verify.js";
|
|
@@ -19,8 +20,9 @@ export function createProgram() {
|
|
|
19
20
|
program
|
|
20
21
|
.name("singbox-iac")
|
|
21
22
|
.description("Policy-first subscription compiler for sing-box on macOS.")
|
|
22
|
-
.version("0.1.
|
|
23
|
+
.version("0.1.1");
|
|
23
24
|
registerInitCommand(program);
|
|
25
|
+
registerSetupCommand(program);
|
|
24
26
|
registerAuthorCommand(program);
|
|
25
27
|
registerBuildCommand(program);
|
|
26
28
|
registerCheckCommand(program);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,aAAa,CAAC;SACnB,WAAW,CAAC,2DAA2D,CAAC;SACxE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAElC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoB,EAAE,QAA4B;IACtF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,KAAK,QAAQ,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,aAAa,CAAC;SACnB,WAAW,CAAC,2DAA2D,CAAC;SACxE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAElC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoB,EAAE,QAA4B;IACtF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,KAAK,QAAQ,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export async function fetchSubscription(input) {
|
|
2
|
-
const userAgents = ["subconverter/1.0", "curl/8.7.1", "singbox-iac
|
|
2
|
+
const userAgents = ["subconverter/1.0", "curl/8.7.1", "singbox-iac/0.1.0"];
|
|
3
3
|
let fallbackContent = "";
|
|
4
4
|
for (const userAgent of userAgents) {
|
|
5
5
|
const response = await fetch(input.url, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/fetcher/index.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA6B;IACnE,MAAM,UAAU,GAAG,CAAC,kBAAkB,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/fetcher/index.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA6B;IACnE,MAAM,UAAU,GAAG,CAAC,kBAAkB,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAC3E,IAAI,eAAe,GAAG,EAAE,CAAC;IAEzB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACtC,OAAO,EAAE;gBACP,MAAM,EAAE,gBAAgB;gBACxB,YAAY,EAAE,SAAS;aACxB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,IAAI,4BAA4B,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,eAAe,GAAG,OAAO,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,4BAA4B,CAAC,OAAe;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvF,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC;SAC9E,QAAQ,CAAC,MAAM,CAAC;SAChB,IAAI,EAAE,CAAC;IAEV,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -24,7 +24,15 @@ export interface NaturalLanguagePlan {
|
|
|
24
24
|
}>;
|
|
25
25
|
readonly verificationOverrides?: readonly NaturalLanguageVerificationOverride[];
|
|
26
26
|
}
|
|
27
|
+
export interface PromptSelectableVerificationScenario {
|
|
28
|
+
readonly id: string;
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly url: string;
|
|
31
|
+
readonly inbound: "in-mixed" | "in-proxifier";
|
|
32
|
+
readonly expectedOutbound: string;
|
|
33
|
+
}
|
|
27
34
|
export declare function generateRulesFromPrompt(prompt: string): NaturalLanguagePlan;
|
|
35
|
+
export declare function selectVerificationScenariosForPrompt(prompt: string, scenarios: readonly PromptSelectableVerificationScenario[]): readonly PromptSelectableVerificationScenario[];
|
|
28
36
|
export declare function writeGeneratedRules(input: {
|
|
29
37
|
readonly filePath: string;
|
|
30
38
|
readonly plan: NaturalLanguagePlan;
|
|
@@ -37,6 +45,7 @@ export declare function updateBuilderSchedule(input: {
|
|
|
37
45
|
export declare function updateBuilderAuthoring(input: {
|
|
38
46
|
readonly configPath: string;
|
|
39
47
|
readonly rulesPath?: string;
|
|
48
|
+
readonly subscriptionUrl?: string;
|
|
40
49
|
readonly intervalMinutes?: number;
|
|
41
50
|
readonly groupDefaults?: NaturalLanguagePlan["groupDefaults"];
|
|
42
51
|
readonly verificationOverrides?: NaturalLanguagePlan["verificationOverrides"];
|
|
@@ -44,6 +53,7 @@ export declare function updateBuilderAuthoring(input: {
|
|
|
44
53
|
export declare function renderUpdatedBuilderConfig(input: {
|
|
45
54
|
readonly rawConfig: string;
|
|
46
55
|
readonly rulesPath?: string;
|
|
56
|
+
readonly subscriptionUrl?: string;
|
|
47
57
|
readonly intervalMinutes?: number;
|
|
48
58
|
readonly groupDefaults?: NaturalLanguagePlan["groupDefaults"];
|
|
49
59
|
readonly verificationOverrides?: NaturalLanguagePlan["verificationOverrides"];
|
|
@@ -40,6 +40,8 @@ const categoryTemplateDefinitions = [
|
|
|
40
40
|
aliases: [
|
|
41
41
|
"ai工具",
|
|
42
42
|
"ai 工具",
|
|
43
|
+
"ai类",
|
|
44
|
+
"ai 类",
|
|
43
45
|
"ai tools",
|
|
44
46
|
"third-party ai",
|
|
45
47
|
"developer ai",
|
|
@@ -49,7 +51,15 @@ const categoryTemplateDefinitions = [
|
|
|
49
51
|
templateId: "developer-ai-sites",
|
|
50
52
|
},
|
|
51
53
|
{
|
|
52
|
-
aliases: [
|
|
54
|
+
aliases: [
|
|
55
|
+
"开发者网站",
|
|
56
|
+
"开发者网站类",
|
|
57
|
+
"开发工具网站",
|
|
58
|
+
"开发工具网站类",
|
|
59
|
+
"developer sites",
|
|
60
|
+
"developer tools",
|
|
61
|
+
"dev sites",
|
|
62
|
+
],
|
|
53
63
|
templateId: "developer-common-sites",
|
|
54
64
|
},
|
|
55
65
|
{
|
|
@@ -180,6 +190,65 @@ export function generateRulesFromPrompt(prompt) {
|
|
|
180
190
|
...(verificationOverrides.length > 0 ? { verificationOverrides } : {}),
|
|
181
191
|
};
|
|
182
192
|
}
|
|
193
|
+
export function selectVerificationScenariosForPrompt(prompt, scenarios) {
|
|
194
|
+
const text = normalizePrompt(prompt);
|
|
195
|
+
const clauses = splitClauses(text);
|
|
196
|
+
const selected = new Map();
|
|
197
|
+
for (const clause of clauses) {
|
|
198
|
+
const requestedDomains = new Set();
|
|
199
|
+
for (const definition of siteAliasDefinitions) {
|
|
200
|
+
if (definition.aliases.some((alias) => clause.includes(alias))) {
|
|
201
|
+
for (const domain of definition.domains) {
|
|
202
|
+
requestedDomains.add(domain);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
for (const domain of extractExplicitDomains(clause)) {
|
|
207
|
+
requestedDomains.add(domain);
|
|
208
|
+
}
|
|
209
|
+
const wantsProcess = processAliasDefinitions.some((alias) => clause.includes(alias));
|
|
210
|
+
const wantsChinaDirect = clause.includes("国内") ||
|
|
211
|
+
clause.includes("中国") ||
|
|
212
|
+
clause.includes("大陆") ||
|
|
213
|
+
clause.includes("直连") ||
|
|
214
|
+
clause.includes("direct");
|
|
215
|
+
const wantsAiCategory = hasTemplateAlias(clause, "developer-ai-sites");
|
|
216
|
+
const wantsDeveloperCategory = hasTemplateAlias(clause, "developer-common-sites") ||
|
|
217
|
+
clause.includes("github") ||
|
|
218
|
+
clause.includes("google 服务") ||
|
|
219
|
+
clause.includes("google services") ||
|
|
220
|
+
clause.includes("google");
|
|
221
|
+
for (const scenario of scenarios) {
|
|
222
|
+
const host = new URL(scenario.url).hostname.toLowerCase();
|
|
223
|
+
const matchesExplicitDomain = [...requestedDomains].some((domain) => host === domain || host.endsWith(`.${domain}`) || domain.endsWith(`.${host}`));
|
|
224
|
+
const matchesProcess = wantsProcess && scenario.inbound === "in-proxifier";
|
|
225
|
+
const matchesChina = wantsChinaDirect && host.endsWith("baidu.com");
|
|
226
|
+
const matchesAiCategory = wantsAiCategory &&
|
|
227
|
+
[
|
|
228
|
+
"chatgpt.com",
|
|
229
|
+
"openai.com",
|
|
230
|
+
"gemini.google.com",
|
|
231
|
+
"anthropic.com",
|
|
232
|
+
"claude.ai",
|
|
233
|
+
"openrouter.ai",
|
|
234
|
+
"perplexity.ai",
|
|
235
|
+
].some((domain) => host === domain || host.endsWith(`.${domain}`));
|
|
236
|
+
const matchesDeveloperCategory = wantsDeveloperCategory &&
|
|
237
|
+
["github.com", "githubusercontent.com", "google.com", "googleapis.com", "gstatic.com"].some((domain) => host === domain || host.endsWith(`.${domain}`));
|
|
238
|
+
if (matchesExplicitDomain ||
|
|
239
|
+
matchesProcess ||
|
|
240
|
+
matchesChina ||
|
|
241
|
+
matchesAiCategory ||
|
|
242
|
+
matchesDeveloperCategory) {
|
|
243
|
+
selected.set(scenario.id, scenario);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (selected.size === 0) {
|
|
248
|
+
return scenarios.slice(0, Math.min(3, scenarios.length));
|
|
249
|
+
}
|
|
250
|
+
return scenarios.filter((scenario) => selected.has(scenario.id));
|
|
251
|
+
}
|
|
183
252
|
export async function writeGeneratedRules(input) {
|
|
184
253
|
const rendered = renderGeneratedRules(input.plan);
|
|
185
254
|
await mkdir(path.dirname(input.filePath), { recursive: true });
|
|
@@ -205,6 +274,7 @@ export async function updateBuilderAuthoring(input) {
|
|
|
205
274
|
const rendered = renderUpdatedBuilderConfig({
|
|
206
275
|
rawConfig: raw,
|
|
207
276
|
...(input.rulesPath ? { rulesPath: input.rulesPath } : {}),
|
|
277
|
+
...(input.subscriptionUrl ? { subscriptionUrl: input.subscriptionUrl } : {}),
|
|
208
278
|
...(input.intervalMinutes ? { intervalMinutes: input.intervalMinutes } : {}),
|
|
209
279
|
...(input.groupDefaults ? { groupDefaults: input.groupDefaults } : {}),
|
|
210
280
|
...(input.verificationOverrides ? { verificationOverrides: input.verificationOverrides } : {}),
|
|
@@ -219,6 +289,12 @@ export function renderUpdatedBuilderConfig(input) {
|
|
|
219
289
|
userRulesFile: input.rulesPath,
|
|
220
290
|
};
|
|
221
291
|
}
|
|
292
|
+
if (input.subscriptionUrl) {
|
|
293
|
+
parsed.subscription = {
|
|
294
|
+
...parsed.subscription,
|
|
295
|
+
url: input.subscriptionUrl,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
222
298
|
if (input.intervalMinutes) {
|
|
223
299
|
parsed.schedule = {
|
|
224
300
|
...parsed.schedule,
|