@singbox-iac/cli 0.1.5 → 0.1.7
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/README-en.md +22 -2
- package/README.md +22 -2
- package/dist/cli/command-helpers.js +1 -1
- package/dist/cli/command-helpers.js.map +1 -1
- package/dist/cli/commands/apply.js +21 -9
- package/dist/cli/commands/apply.js.map +1 -1
- package/dist/cli/commands/author.d.ts +28 -0
- package/dist/cli/commands/author.js +119 -121
- package/dist/cli/commands/author.js.map +1 -1
- package/dist/cli/commands/build.js +7 -34
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/go.d.ts +2 -0
- package/dist/cli/commands/go.js +38 -0
- package/dist/cli/commands/go.js.map +1 -0
- package/dist/cli/commands/history.d.ts +2 -0
- package/dist/cli/commands/history.js +21 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +2 -0
- package/dist/cli/commands/rollback.js +38 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/update.js +16 -2
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/use.d.ts +2 -0
- package/dist/cli/commands/use.js +45 -0
- package/dist/cli/commands/use.js.map +1 -0
- package/dist/cli/commands/verify.js +72 -20
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/index.js +45 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/domain/dns-plan.d.ts +27 -0
- package/dist/domain/dns-plan.js +2 -0
- package/dist/domain/dns-plan.js.map +1 -0
- package/dist/domain/intent.d.ts +61 -0
- package/dist/domain/intent.js +2 -0
- package/dist/domain/intent.js.map +1 -0
- package/dist/domain/transaction.d.ts +12 -0
- package/dist/domain/transaction.js +2 -0
- package/dist/domain/transaction.js.map +1 -0
- package/dist/domain/verification-plan.d.ts +34 -0
- package/dist/domain/verification-plan.js +2 -0
- package/dist/domain/verification-plan.js.map +1 -0
- package/dist/modules/authoring/index.d.ts +2 -0
- package/dist/modules/authoring/index.js +32 -17
- package/dist/modules/authoring/index.js.map +1 -1
- package/dist/modules/build/index.d.ts +3 -0
- package/dist/modules/build/index.js +8 -1
- package/dist/modules/build/index.js.map +1 -1
- package/dist/modules/compiler/index.d.ts +2 -2
- package/dist/modules/compiler/index.js +45 -60
- package/dist/modules/compiler/index.js.map +1 -1
- package/dist/modules/dns-plan/index.d.ts +10 -0
- package/dist/modules/dns-plan/index.js +104 -0
- package/dist/modules/dns-plan/index.js.map +1 -0
- package/dist/modules/fetcher/index.d.ts +1 -0
- package/dist/modules/fetcher/index.js +66 -19
- package/dist/modules/fetcher/index.js.map +1 -1
- package/dist/modules/intent/index.d.ts +7 -0
- package/dist/modules/intent/index.js +101 -0
- package/dist/modules/intent/index.js.map +1 -0
- package/dist/modules/manager/index.d.ts +1 -0
- package/dist/modules/manager/index.js +15 -0
- package/dist/modules/manager/index.js.map +1 -1
- package/dist/modules/natural-language/index.js +2 -1
- package/dist/modules/natural-language/index.js.map +1 -1
- package/dist/modules/transactions/index.d.ts +20 -0
- package/dist/modules/transactions/index.js +150 -0
- package/dist/modules/transactions/index.js.map +1 -0
- package/dist/modules/update/index.d.ts +2 -0
- package/dist/modules/update/index.js +25 -6
- package/dist/modules/update/index.js.map +1 -1
- package/dist/modules/verification/index.d.ts +57 -0
- package/dist/modules/verification/index.js +326 -23
- package/dist/modules/verification/index.js.map +1 -1
- package/dist/modules/verification-plan/index.d.ts +9 -0
- package/dist/modules/verification-plan/index.js +117 -0
- package/dist/modules/verification-plan/index.js.map +1 -0
- package/docs/runtime-on-macos.md +21 -5
- package/examples/builder.config.yaml +7 -26
- package/package.json +1 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { getDefaultConfigPath, getDefaultRulesPath } from "../command-helpers.js";
|
|
2
|
+
import { runSetupFlow } from "./setup.js";
|
|
3
|
+
export function registerGoCommand(program) {
|
|
4
|
+
const command = program
|
|
5
|
+
.command("go")
|
|
6
|
+
.description("Shortest first-run onboarding: subscription URL plus one routing sentence.")
|
|
7
|
+
.argument("<subscription-url>", "subscription URL")
|
|
8
|
+
.argument("<prompt>", "one-sentence routing intent")
|
|
9
|
+
.option("-c, --config <path>", "path to builder config YAML", getDefaultConfigPath())
|
|
10
|
+
.option("--rules-out <path>", "path to generated custom-rules file", getDefaultRulesPath())
|
|
11
|
+
.option("-f, --force", "overwrite generated files during first-time setup")
|
|
12
|
+
.option("--no-run", "prepare and publish, but do not keep sing-box in the foreground")
|
|
13
|
+
.option("--no-browser", "skip opening isolated browser windows during the foreground run")
|
|
14
|
+
.option("--no-load", "write the LaunchAgent without calling launchctl bootstrap")
|
|
15
|
+
.action(async (subscriptionUrl, prompt, options) => {
|
|
16
|
+
await runSetupFlow({
|
|
17
|
+
config: options.config,
|
|
18
|
+
rulesOut: options.rulesOut,
|
|
19
|
+
subscriptionUrl,
|
|
20
|
+
prompt,
|
|
21
|
+
execArg: [],
|
|
22
|
+
label: "org.singbox-iac.update",
|
|
23
|
+
...(options.force ? { force: true } : {}),
|
|
24
|
+
doctor: true,
|
|
25
|
+
verify: true,
|
|
26
|
+
apply: true,
|
|
27
|
+
ready: true,
|
|
28
|
+
installSchedule: true,
|
|
29
|
+
run: options.run !== false,
|
|
30
|
+
openBrowser: options.browser !== false,
|
|
31
|
+
load: options.load !== false,
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
for (const optionName of ["rulesOut", "browser", "load"]) {
|
|
35
|
+
command.options.find((entry) => entry.attributeName() === optionName)?.hideHelp();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=go.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go.js","sourceRoot":"","sources":["../../../src/cli/commands/go.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,IAAI,CAAC;SACb,WAAW,CAAC,4EAA4E,CAAC;SACzF,QAAQ,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;SAClD,QAAQ,CAAC,UAAU,EAAE,6BAA6B,CAAC;SACnD,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,CAAC;SACpF,MAAM,CAAC,oBAAoB,EAAE,qCAAqC,EAAE,mBAAmB,EAAE,CAAC;SAC1F,MAAM,CAAC,aAAa,EAAE,mDAAmD,CAAC;SAC1E,MAAM,CAAC,UAAU,EAAE,iEAAiE,CAAC;SACrF,MAAM,CAAC,cAAc,EAAE,iEAAiE,CAAC;SACzF,MAAM,CAAC,WAAW,EAAE,2DAA2D,CAAC;SAChF,MAAM,CACL,KAAK,EACH,eAAuB,EACvB,MAAc,EACd,OAOC,EACD,EAAE;QACF,MAAM,YAAY,CAAC;YACjB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,eAAe;YACf,MAAM;YACN,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,wBAAwB;YAC/B,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,IAAI;YACX,eAAe,EAAE,IAAI;YACrB,GAAG,EAAE,OAAO,CAAC,GAAG,KAAK,KAAK;YAC1B,WAAW,EAAE,OAAO,CAAC,OAAO,KAAK,KAAK;YACtC,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK;SAC7B,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEJ,KAAK,MAAM,UAAU,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { listTransactionHistory } from "../../modules/transactions/index.js";
|
|
2
|
+
import { resolveBuilderConfig } from "../command-helpers.js";
|
|
3
|
+
export function registerHistoryCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command("history")
|
|
6
|
+
.description("Show recent publish transactions.")
|
|
7
|
+
.option("-c, --config <path>", "path to builder config YAML")
|
|
8
|
+
.action(async (options) => {
|
|
9
|
+
const builderConfig = await resolveBuilderConfig(options);
|
|
10
|
+
if (!builderConfig) {
|
|
11
|
+
throw new Error("history requires a builder config.");
|
|
12
|
+
}
|
|
13
|
+
const entries = await listTransactionHistory(builderConfig);
|
|
14
|
+
const lines = [
|
|
15
|
+
`Transactions: ${entries.length}`,
|
|
16
|
+
...entries.map((entry) => `- ${entry.txId} ${entry.status} ${entry.startedAt} ${entry.generatedPath} -> ${entry.livePath}`),
|
|
17
|
+
];
|
|
18
|
+
process.stdout.write(`${lines.join("\n")}\n`);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/cli/commands/history.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,OAAqC,EAAE,EAAE;QACtD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,aAAa,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG;YACZ,iBAAiB,OAAO,CAAC,MAAM,EAAE;YACjC,GAAG,OAAO,CAAC,GAAG,CACZ,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,aAAa,OAAO,KAAK,CAAC,QAAQ,EAAE,CACnG;SACF,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { reloadRuntime, resolveSingBoxBinary } from "../../modules/manager/index.js";
|
|
2
|
+
import { rollbackToPrevious } from "../../modules/transactions/index.js";
|
|
3
|
+
import { resolveBuilderConfig } from "../command-helpers.js";
|
|
4
|
+
export function registerRollbackCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("rollback")
|
|
7
|
+
.description("Rollback the live config to the previous published snapshot.")
|
|
8
|
+
.option("-c, --config <path>", "path to builder config YAML")
|
|
9
|
+
.option("--to <target>", 'rollback target, currently only "previous"', "previous")
|
|
10
|
+
.option("--sing-box-bin <path>", "path to sing-box binary")
|
|
11
|
+
.option("--reload", "reload sing-box after restoring the previous snapshot")
|
|
12
|
+
.action(async (options) => {
|
|
13
|
+
if (options.to !== "previous") {
|
|
14
|
+
throw new Error('Only "--to previous" is currently supported.');
|
|
15
|
+
}
|
|
16
|
+
const builderConfig = await resolveBuilderConfig(options);
|
|
17
|
+
if (!builderConfig) {
|
|
18
|
+
throw new Error("rollback requires a builder config.");
|
|
19
|
+
}
|
|
20
|
+
const afterRestore = options.reload || options.singBoxBin
|
|
21
|
+
? async () => {
|
|
22
|
+
await resolveSingBoxBinary(options.singBoxBin);
|
|
23
|
+
if (options.reload) {
|
|
24
|
+
await reloadRuntime({
|
|
25
|
+
...(options.singBoxBin ? { singBoxBinary: options.singBoxBin } : {}),
|
|
26
|
+
runtime: builderConfig.runtime.reload,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
: undefined;
|
|
31
|
+
const transaction = await rollbackToPrevious({
|
|
32
|
+
config: builderConfig,
|
|
33
|
+
...(afterRestore ? { afterRestore } : {}),
|
|
34
|
+
});
|
|
35
|
+
process.stdout.write(`Rollback complete.\nTransaction: ${transaction.txId}\nLive: ${transaction.livePath}\nSnapshot: ${transaction.snapshotPath}\n`);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=rollback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../../src/cli/commands/rollback.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,8DAA8D,CAAC;SAC3E,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;SAC5D,MAAM,CAAC,eAAe,EAAE,4CAA4C,EAAE,UAAU,CAAC;SACjF,MAAM,CAAC,uBAAuB,EAAE,yBAAyB,CAAC;SAC1D,MAAM,CAAC,UAAU,EAAE,uDAAuD,CAAC;SAC3E,MAAM,CAAC,KAAK,EAAE,OAA+B,EAAE,EAAE;QAChD,IAAI,OAAO,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,YAAY,GAChB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU;YAClC,CAAC,CAAC,KAAK,IAAI,EAAE;gBACT,MAAM,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC/C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,MAAM,aAAa,CAAC;wBAClB,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACpE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM;qBACtC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACH,CAAC,CAAC,SAAS,CAAC;QAEhB,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC;YAC3C,MAAM,EAAE,aAAa;YACrB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oCAAoC,WAAW,CAAC,IAAI,WAAW,WAAW,CAAC,QAAQ,eAAe,WAAW,CAAC,YAAY,IAAI,CAC/H,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { runUpdate } from "../../modules/update/index.js";
|
|
2
2
|
import { resolveBuilderConfig } from "../command-helpers.js";
|
|
3
3
|
export function registerUpdateCommand(program) {
|
|
4
|
-
program
|
|
4
|
+
const command = program
|
|
5
5
|
.command("update")
|
|
6
|
-
.description("
|
|
6
|
+
.description("Refresh subscription, verify, publish, and auto-reload if sing-box is running.")
|
|
7
7
|
.option("-c, --config <path>", "path to builder config YAML")
|
|
8
8
|
.option("--subscription-url <url>", "override subscription URL when rebuilding")
|
|
9
9
|
.option("--subscription-file <path>", "use a local subscription file instead of fetching")
|
|
@@ -40,6 +40,7 @@ export function registerUpdateCommand(program) {
|
|
|
40
40
|
verificationSummary,
|
|
41
41
|
`Live: ${result.livePath}`,
|
|
42
42
|
result.backupPath ? `Backup: ${result.backupPath}` : undefined,
|
|
43
|
+
`Reload: ${result.reloaded ? "triggered" : "skipped"}`,
|
|
43
44
|
`Warnings: ${result.build.warnings.length}`,
|
|
44
45
|
]
|
|
45
46
|
.filter((line) => typeof line === "string")
|
|
@@ -48,5 +49,18 @@ export function registerUpdateCommand(program) {
|
|
|
48
49
|
process.stdout.write(`${result.build.warnings.map((warning) => `- ${warning}`).join("\n")}\n`);
|
|
49
50
|
}
|
|
50
51
|
});
|
|
52
|
+
for (const optionName of [
|
|
53
|
+
"subscriptionUrl",
|
|
54
|
+
"subscriptionFile",
|
|
55
|
+
"output",
|
|
56
|
+
"livePath",
|
|
57
|
+
"backupPath",
|
|
58
|
+
"singBoxBin",
|
|
59
|
+
"chromeBin",
|
|
60
|
+
"skipVerify",
|
|
61
|
+
"reload",
|
|
62
|
+
]) {
|
|
63
|
+
command.options.find((entry) => entry.attributeName() === optionName)?.hideHelp();
|
|
64
|
+
}
|
|
51
65
|
}
|
|
52
66
|
//# sourceMappingURL=update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { runAuthorFlow } from "./author.js";
|
|
2
|
+
export function registerUseCommand(program) {
|
|
3
|
+
const command = program
|
|
4
|
+
.command("use")
|
|
5
|
+
.description("Change routing policy with one sentence and apply it.")
|
|
6
|
+
.argument("<prompt>", "one-sentence routing intent")
|
|
7
|
+
.option("-c, --config <path>", "path to builder config YAML")
|
|
8
|
+
.option("--preview", "print diffs without writing any files")
|
|
9
|
+
.option("--subscription-url <url>", "override subscription URL when rebuilding")
|
|
10
|
+
.option("--subscription-file <path>", "use a local subscription file instead of fetching")
|
|
11
|
+
.option("--provider <provider>", "authoring provider: deterministic, auto, claude, exec")
|
|
12
|
+
.option("--author-timeout-ms <ms>", "timeout for local AI CLI authoring")
|
|
13
|
+
.option("--sing-box-bin <path>", "path to sing-box binary")
|
|
14
|
+
.option("--chrome-bin <path>", "path to Chrome binary for runtime verification")
|
|
15
|
+
.option("--skip-verify", "skip runtime verification before publish")
|
|
16
|
+
.action(async (prompt, options) => {
|
|
17
|
+
await runAuthorFlow({
|
|
18
|
+
prompt,
|
|
19
|
+
execArg: [],
|
|
20
|
+
label: "org.singbox-iac.update",
|
|
21
|
+
...(options.config ? { config: options.config } : {}),
|
|
22
|
+
...(options.preview ? { preview: true } : {}),
|
|
23
|
+
...(options.subscriptionUrl ? { subscriptionUrl: options.subscriptionUrl } : {}),
|
|
24
|
+
...(options.subscriptionFile ? { subscriptionFile: options.subscriptionFile } : {}),
|
|
25
|
+
...(options.provider ? { provider: options.provider } : {}),
|
|
26
|
+
...(options.authorTimeoutMs ? { authorTimeoutMs: options.authorTimeoutMs } : {}),
|
|
27
|
+
...(options.singBoxBin ? { singBoxBin: options.singBoxBin } : {}),
|
|
28
|
+
...(options.chromeBin ? { chromeBin: options.chromeBin } : {}),
|
|
29
|
+
...(options.skipVerify ? { skipVerify: true } : {}),
|
|
30
|
+
update: true,
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
for (const optionName of [
|
|
34
|
+
"subscriptionUrl",
|
|
35
|
+
"subscriptionFile",
|
|
36
|
+
"provider",
|
|
37
|
+
"authorTimeoutMs",
|
|
38
|
+
"singBoxBin",
|
|
39
|
+
"chromeBin",
|
|
40
|
+
"skipVerify",
|
|
41
|
+
]) {
|
|
42
|
+
command.options.find((entry) => entry.attributeName() === optionName)?.hideHelp();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../../src/cli/commands/use.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,uDAAuD,CAAC;SACpE,QAAQ,CAAC,UAAU,EAAE,6BAA6B,CAAC;SACnD,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;SAC5D,MAAM,CAAC,WAAW,EAAE,uCAAuC,CAAC;SAC5D,MAAM,CAAC,0BAA0B,EAAE,2CAA2C,CAAC;SAC/E,MAAM,CAAC,4BAA4B,EAAE,mDAAmD,CAAC;SACzF,MAAM,CAAC,uBAAuB,EAAE,uDAAuD,CAAC;SACxF,MAAM,CAAC,0BAA0B,EAAE,oCAAoC,CAAC;SACxE,MAAM,CAAC,uBAAuB,EAAE,yBAAyB,CAAC;SAC1D,MAAM,CAAC,qBAAqB,EAAE,gDAAgD,CAAC;SAC/E,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;SACnE,MAAM,CACL,KAAK,EACH,MAAc,EACd,OAUC,EACD,EAAE;QACF,MAAM,aAAa,CAAC;YAClB,MAAM;YACN,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,wBAAwB;YAC/B,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEJ,KAAK,MAAM,UAAU,IAAI;QACvB,iBAAiB;QACjB,kBAAkB;QAClB,UAAU;QACV,iBAAiB;QACjB,YAAY;QACZ,WAAW;QACX,YAAY;KACb,EAAE,CAAC;QACF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpF,CAAC;AACH,CAAC"}
|
|
@@ -1,19 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { buildConfigArtifact, resolveEffectiveIntent } from "../../modules/build/index.js";
|
|
4
|
+
import { buildDnsPlan } from "../../modules/dns-plan/index.js";
|
|
5
|
+
import { buildVerificationPlan } from "../../modules/verification-plan/index.js";
|
|
6
|
+
import { assertVerificationReportPassed, verifyAppPlan, verifyConfigRoutes, verifyDnsPlan, verifyEgressPlan, verifyProtocolPlan, } from "../../modules/verification/index.js";
|
|
3
7
|
import { resolveBuilderConfig } from "../command-helpers.js";
|
|
4
8
|
export function registerVerifyCommand(program) {
|
|
5
9
|
program
|
|
6
10
|
.command("verify")
|
|
7
11
|
.description("Build and run closed-loop route verification with sing-box and Chrome.")
|
|
12
|
+
.argument("[mode]", "verification scope: all, route, dns, egress, app, protocol", "all")
|
|
8
13
|
.option("-c, --config <path>", "path to builder config YAML")
|
|
9
14
|
.option("-i, --input <path>", "path to an existing config JSON to verify")
|
|
10
15
|
.option("--subscription-url <url>", "override subscription URL when rebuilding")
|
|
11
16
|
.option("--subscription-file <path>", "use a local subscription file instead of fetching")
|
|
12
17
|
.option("--sing-box-bin <path>", "path to sing-box binary")
|
|
13
18
|
.option("--chrome-bin <path>", "path to Chrome binary")
|
|
14
|
-
.action(async (options) => {
|
|
19
|
+
.action(async (mode, options) => {
|
|
15
20
|
let configPath = options.input;
|
|
16
21
|
const builderConfig = await resolveBuilderConfig(options);
|
|
22
|
+
let effectiveIntent = builderConfig ? await resolveEffectiveIntent(builderConfig) : undefined;
|
|
17
23
|
if (!configPath) {
|
|
18
24
|
if (!builderConfig) {
|
|
19
25
|
throw new Error("Verification requires --input or a builder config.");
|
|
@@ -24,26 +30,72 @@ export function registerVerifyCommand(program) {
|
|
|
24
30
|
...(options.subscriptionUrl ? { subscriptionUrl: options.subscriptionUrl } : {}),
|
|
25
31
|
});
|
|
26
32
|
configPath = result.outputPath;
|
|
33
|
+
effectiveIntent = result.intent;
|
|
27
34
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
if (!builderConfig || !effectiveIntent) {
|
|
36
|
+
throw new Error("Verification requires a builder config so the verification plan can be built.");
|
|
37
|
+
}
|
|
38
|
+
const dnsPlan = buildDnsPlan({
|
|
39
|
+
config: builderConfig,
|
|
40
|
+
intent: effectiveIntent,
|
|
41
|
+
activeRuleSetTags: builderConfig.ruleSets
|
|
42
|
+
.filter((ruleSet) => existsSync(ruleSet.path))
|
|
43
|
+
.map((ruleSet) => ruleSet.tag),
|
|
44
|
+
});
|
|
45
|
+
const verificationPlan = buildVerificationPlan({
|
|
46
|
+
config: builderConfig,
|
|
47
|
+
intent: effectiveIntent,
|
|
48
|
+
dnsPlan,
|
|
33
49
|
});
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
const rawConfig = JSON.parse(await readFile(configPath, "utf8"));
|
|
51
|
+
const lines = [`Verified config: ${configPath}`, `Mode: ${mode}`];
|
|
52
|
+
if (mode === "all" || mode === "route") {
|
|
53
|
+
const report = await verifyConfigRoutes({
|
|
54
|
+
configPath,
|
|
55
|
+
...(options.singBoxBin ? { singBoxBinary: options.singBoxBin } : {}),
|
|
56
|
+
...(options.chromeBin ? { chromeBinary: options.chromeBin } : {}),
|
|
57
|
+
configuredScenarios: builderConfig.verification.scenarios,
|
|
58
|
+
});
|
|
59
|
+
lines.push("");
|
|
60
|
+
lines.push("Route checks:");
|
|
61
|
+
lines.push(...report.scenarios.map((scenario) => `- ${scenario.passed ? "PASS" : "FAIL"} ${scenario.name}: ${scenario.expectedOutboundTag} via ${scenario.inboundTag}`));
|
|
62
|
+
assertVerificationReportPassed(report);
|
|
63
|
+
}
|
|
64
|
+
if (mode === "all" || mode === "dns") {
|
|
65
|
+
lines.push("");
|
|
66
|
+
lines.push("DNS checks:");
|
|
67
|
+
lines.push(...formatDnsChecks(verifyDnsPlan(verificationPlan, dnsPlan)));
|
|
68
|
+
}
|
|
69
|
+
if (mode === "all" || mode === "app") {
|
|
70
|
+
lines.push("");
|
|
71
|
+
lines.push("App checks:");
|
|
72
|
+
lines.push(...verifyAppPlan(verificationPlan, rawConfig).map((check) => `- ${check.passed ? "PASS" : "FAIL"} ${check.app}: ${check.expectedInbound} -> ${check.expectedOutboundGroup}`));
|
|
73
|
+
}
|
|
74
|
+
if (mode === "all" || mode === "protocol") {
|
|
75
|
+
lines.push("");
|
|
76
|
+
lines.push("Protocol checks:");
|
|
77
|
+
lines.push(...formatProtocolChecks(verifyProtocolPlan(verificationPlan, rawConfig)));
|
|
78
|
+
}
|
|
79
|
+
if (mode === "all" || mode === "egress") {
|
|
80
|
+
const egressResults = await verifyEgressPlan({
|
|
81
|
+
configPath,
|
|
82
|
+
checks: verificationPlan.egressChecks,
|
|
83
|
+
...(options.singBoxBin ? { singBoxBinary: options.singBoxBin } : {}),
|
|
84
|
+
});
|
|
85
|
+
lines.push("");
|
|
86
|
+
lines.push("Egress checks:");
|
|
87
|
+
lines.push(...formatEgressChecks(egressResults));
|
|
88
|
+
}
|
|
45
89
|
process.stdout.write(`${lines.join("\n")}\n`);
|
|
46
|
-
assertVerificationReportPassed(report);
|
|
47
90
|
});
|
|
48
91
|
}
|
|
92
|
+
function formatDnsChecks(checks) {
|
|
93
|
+
return checks.map((check) => `- ${check.passed ? "PASS" : "FAIL"} ${check.domain}: ${check.actualMode} via ${check.resolver}`);
|
|
94
|
+
}
|
|
95
|
+
function formatProtocolChecks(checks) {
|
|
96
|
+
return checks.map((check) => `- ${check.passed ? "PASS" : "FAIL"} ${new URL(check.target).hostname}: ${check.details}`);
|
|
97
|
+
}
|
|
98
|
+
function formatEgressChecks(checks) {
|
|
99
|
+
return checks.map((check) => `- ${check.passed ? "PASS" : "FAIL"} ${check.expectedOutboundGroup}: ${check.ip ?? "unknown-ip"} ${check.country ?? ""} ${check.asn ?? ""}`.trim());
|
|
100
|
+
}
|
|
49
101
|
//# sourceMappingURL=verify.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -7,22 +7,38 @@ import { registerAuthorCommand } from "./commands/author.js";
|
|
|
7
7
|
import { registerBuildCommand } from "./commands/build.js";
|
|
8
8
|
import { registerCheckCommand } from "./commands/check.js";
|
|
9
9
|
import { registerDoctorCommand } from "./commands/doctor.js";
|
|
10
|
+
import { registerGoCommand } from "./commands/go.js";
|
|
11
|
+
import { registerHistoryCommand } from "./commands/history.js";
|
|
10
12
|
import { registerInitCommand } from "./commands/init.js";
|
|
11
13
|
import { registerProxifierCommand } from "./commands/proxifier.js";
|
|
12
14
|
import { registerQuickstartCommand } from "./commands/quickstart.js";
|
|
13
15
|
import { registerReloadCommand } from "./commands/reload.js";
|
|
16
|
+
import { registerRollbackCommand } from "./commands/rollback.js";
|
|
14
17
|
import { registerRunCommand } from "./commands/run.js";
|
|
15
18
|
import { registerScheduleCommand } from "./commands/schedule.js";
|
|
16
19
|
import { registerSetupCommand } from "./commands/setup.js";
|
|
17
20
|
import { registerTemplatesCommand } from "./commands/templates.js";
|
|
18
21
|
import { registerUpdateCommand } from "./commands/update.js";
|
|
22
|
+
import { registerUseCommand } from "./commands/use.js";
|
|
19
23
|
import { registerVerifyCommand } from "./commands/verify.js";
|
|
20
24
|
export function createProgram() {
|
|
21
25
|
const program = new Command();
|
|
22
26
|
program
|
|
23
27
|
.name("singbox-iac")
|
|
24
28
|
.description("Policy-first subscription compiler for sing-box on macOS.")
|
|
25
|
-
.version("0.1.
|
|
29
|
+
.version("0.1.6")
|
|
30
|
+
.addHelpText("after", [
|
|
31
|
+
"",
|
|
32
|
+
"Most users only need:",
|
|
33
|
+
" singbox-iac go <subscription-url> <一句话需求>",
|
|
34
|
+
" singbox-iac use <一句话需求>",
|
|
35
|
+
" singbox-iac update",
|
|
36
|
+
"",
|
|
37
|
+
"Advanced commands: quickstart, setup, author, build, verify, proxifier, schedule",
|
|
38
|
+
].join("\n"));
|
|
39
|
+
registerGoCommand(program);
|
|
40
|
+
registerUseCommand(program);
|
|
41
|
+
registerUpdateCommand(program);
|
|
26
42
|
registerInitCommand(program);
|
|
27
43
|
registerSetupCommand(program);
|
|
28
44
|
registerQuickstartCommand(program);
|
|
@@ -30,16 +46,43 @@ export function createProgram() {
|
|
|
30
46
|
registerBuildCommand(program);
|
|
31
47
|
registerCheckCommand(program);
|
|
32
48
|
registerApplyCommand(program);
|
|
49
|
+
registerHistoryCommand(program);
|
|
33
50
|
registerRunCommand(program);
|
|
51
|
+
registerRollbackCommand(program);
|
|
34
52
|
registerVerifyCommand(program);
|
|
35
|
-
registerUpdateCommand(program);
|
|
36
53
|
registerDoctorCommand(program);
|
|
37
54
|
registerProxifierCommand(program);
|
|
38
55
|
registerReloadCommand(program);
|
|
39
56
|
registerScheduleCommand(program);
|
|
40
57
|
registerTemplatesCommand(program);
|
|
58
|
+
hideAdvancedCommands(program);
|
|
41
59
|
return program;
|
|
42
60
|
}
|
|
61
|
+
function hideAdvancedCommands(program) {
|
|
62
|
+
for (const commandName of [
|
|
63
|
+
"init",
|
|
64
|
+
"setup",
|
|
65
|
+
"quickstart",
|
|
66
|
+
"author",
|
|
67
|
+
"build",
|
|
68
|
+
"check",
|
|
69
|
+
"apply",
|
|
70
|
+
"history",
|
|
71
|
+
"run",
|
|
72
|
+
"rollback",
|
|
73
|
+
"verify",
|
|
74
|
+
"doctor",
|
|
75
|
+
"proxifier",
|
|
76
|
+
"reload",
|
|
77
|
+
"schedule",
|
|
78
|
+
"templates",
|
|
79
|
+
]) {
|
|
80
|
+
const command = program.commands.find((entry) => entry.name() === commandName);
|
|
81
|
+
if (command) {
|
|
82
|
+
command._hidden = true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
43
86
|
export async function run(argv) {
|
|
44
87
|
await createProgram().parseAsync(argv);
|
|
45
88
|
}
|
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,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface DnsPlanServer {
|
|
2
|
+
readonly type: "local" | "tcp";
|
|
3
|
+
readonly tag: string;
|
|
4
|
+
readonly server?: string;
|
|
5
|
+
readonly serverPort?: number;
|
|
6
|
+
readonly preferGo?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface DnsPlanRule {
|
|
9
|
+
readonly match: {
|
|
10
|
+
readonly domain?: readonly string[];
|
|
11
|
+
readonly domainSuffix?: readonly string[];
|
|
12
|
+
readonly ruleSet?: readonly string[];
|
|
13
|
+
};
|
|
14
|
+
readonly resolvers: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
export interface DNSPlan {
|
|
17
|
+
readonly mode: "real-ip" | "fake-ip";
|
|
18
|
+
readonly defaultResolvers: readonly string[];
|
|
19
|
+
readonly directResolvers: readonly string[];
|
|
20
|
+
readonly proxyResolvers: readonly string[];
|
|
21
|
+
readonly fallbackResolvers: readonly string[];
|
|
22
|
+
readonly servers: readonly DnsPlanServer[];
|
|
23
|
+
readonly nameserverPolicy: readonly DnsPlanRule[];
|
|
24
|
+
readonly fakeIpFilter: readonly string[];
|
|
25
|
+
readonly localHosts?: Record<string, string>;
|
|
26
|
+
readonly strategy: "prefer_ipv4" | "prefer_ipv6";
|
|
27
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dns-plan.js","sourceRoot":"","sources":["../../src/domain/dns-plan.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export type IntentVersion = "v1";
|
|
2
|
+
export type IntentPlacement = "beforeBuiltins" | "afterBuiltins";
|
|
3
|
+
export interface IntentVerifyHint {
|
|
4
|
+
readonly expectedCountry?: readonly string[];
|
|
5
|
+
readonly expectedASN?: readonly string[];
|
|
6
|
+
readonly probeUrls?: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export interface IntentSiteMatch {
|
|
9
|
+
readonly inbound?: readonly string[];
|
|
10
|
+
readonly protocol?: string;
|
|
11
|
+
readonly network?: "tcp" | "udp";
|
|
12
|
+
readonly port?: number;
|
|
13
|
+
readonly domain?: readonly string[];
|
|
14
|
+
readonly domainSuffix?: readonly string[];
|
|
15
|
+
readonly ruleSet?: readonly string[];
|
|
16
|
+
readonly category?: readonly string[];
|
|
17
|
+
}
|
|
18
|
+
export type IntentSiteAction = {
|
|
19
|
+
readonly type: "route";
|
|
20
|
+
readonly outboundGroup: string;
|
|
21
|
+
} | {
|
|
22
|
+
readonly type: "reject";
|
|
23
|
+
};
|
|
24
|
+
export interface IntentSitePolicy {
|
|
25
|
+
readonly placement: IntentPlacement;
|
|
26
|
+
readonly name?: string;
|
|
27
|
+
readonly match: IntentSiteMatch;
|
|
28
|
+
readonly action: IntentSiteAction;
|
|
29
|
+
readonly verify?: IntentVerifyHint;
|
|
30
|
+
}
|
|
31
|
+
export interface IntentProcessMatch {
|
|
32
|
+
readonly bundleId?: readonly string[];
|
|
33
|
+
readonly processName?: readonly string[];
|
|
34
|
+
}
|
|
35
|
+
export interface IntentProcessPolicy {
|
|
36
|
+
readonly name?: string;
|
|
37
|
+
readonly match: IntentProcessMatch;
|
|
38
|
+
readonly inbound: "in-proxifier" | "in-default";
|
|
39
|
+
readonly outboundGroup: string;
|
|
40
|
+
readonly verify?: {
|
|
41
|
+
readonly expectProxyHit?: boolean;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export interface IntentLocalOverride {
|
|
45
|
+
readonly hosts?: Record<string, string>;
|
|
46
|
+
readonly dnsPolicy?: readonly {
|
|
47
|
+
readonly domainSuffix: readonly string[];
|
|
48
|
+
readonly server: readonly string[];
|
|
49
|
+
}[];
|
|
50
|
+
}
|
|
51
|
+
export interface IntentIR {
|
|
52
|
+
readonly version: IntentVersion;
|
|
53
|
+
readonly globals: {
|
|
54
|
+
readonly updateIntervalMinutes?: number;
|
|
55
|
+
readonly preferIPv6?: boolean;
|
|
56
|
+
readonly enableTUN?: boolean;
|
|
57
|
+
};
|
|
58
|
+
readonly sitePolicies: readonly IntentSitePolicy[];
|
|
59
|
+
readonly processPolicies: readonly IntentProcessPolicy[];
|
|
60
|
+
readonly localOverrides: IntentLocalOverride;
|
|
61
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent.js","sourceRoot":"","sources":["../../src/domain/intent.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ApplyTransaction {
|
|
2
|
+
readonly txId: string;
|
|
3
|
+
readonly generatedPath: string;
|
|
4
|
+
readonly livePath: string;
|
|
5
|
+
readonly backupPath: string;
|
|
6
|
+
readonly snapshotPath?: string;
|
|
7
|
+
readonly startedAt: string;
|
|
8
|
+
readonly completedAt?: string;
|
|
9
|
+
readonly status: "pending" | "applied" | "rolled-back" | "failed";
|
|
10
|
+
readonly verificationSummary: Record<string, unknown>;
|
|
11
|
+
readonly error?: string;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/domain/transaction.ts"],"names":[],"mappings":""}
|