@singbox-iac/cli 0.1.15 → 0.1.17

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 (80) hide show
  1. package/README.md +70 -24
  2. package/dist/cli/commands/author.d.ts +2 -0
  3. package/dist/cli/commands/author.js +49 -19
  4. package/dist/cli/commands/author.js.map +1 -1
  5. package/dist/cli/commands/build.js +25 -13
  6. package/dist/cli/commands/build.js.map +1 -1
  7. package/dist/cli/commands/diagnose.d.ts +2 -0
  8. package/dist/cli/commands/diagnose.js +120 -0
  9. package/dist/cli/commands/diagnose.js.map +1 -0
  10. package/dist/cli/commands/doctor.js +21 -1
  11. package/dist/cli/commands/doctor.js.map +1 -1
  12. package/dist/cli/commands/restart.js +42 -2
  13. package/dist/cli/commands/restart.js.map +1 -1
  14. package/dist/cli/commands/rulesets.d.ts +2 -0
  15. package/dist/cli/commands/rulesets.js +125 -0
  16. package/dist/cli/commands/rulesets.js.map +1 -0
  17. package/dist/cli/commands/runtime-watchdog.d.ts +2 -0
  18. package/dist/cli/commands/runtime-watchdog.js +45 -0
  19. package/dist/cli/commands/runtime-watchdog.js.map +1 -0
  20. package/dist/cli/commands/setup.js +190 -20
  21. package/dist/cli/commands/setup.js.map +1 -1
  22. package/dist/cli/commands/start.js +29 -1
  23. package/dist/cli/commands/start.js.map +1 -1
  24. package/dist/cli/commands/status.js +135 -28
  25. package/dist/cli/commands/status.js.map +1 -1
  26. package/dist/cli/commands/stop.js +19 -1
  27. package/dist/cli/commands/stop.js.map +1 -1
  28. package/dist/cli/commands/use.js +3 -1
  29. package/dist/cli/commands/use.js.map +1 -1
  30. package/dist/cli/index.js +12 -4
  31. package/dist/cli/index.js.map +1 -1
  32. package/dist/config/schema.d.ts +49 -6
  33. package/dist/config/schema.js +17 -0
  34. package/dist/config/schema.js.map +1 -1
  35. package/dist/modules/authoring/index.js +25 -8
  36. package/dist/modules/authoring/index.js.map +1 -1
  37. package/dist/modules/build/index.d.ts +4 -1
  38. package/dist/modules/build/index.js +17 -4
  39. package/dist/modules/build/index.js.map +1 -1
  40. package/dist/modules/bundle-registry/index.d.ts +46 -0
  41. package/dist/modules/bundle-registry/index.js +650 -0
  42. package/dist/modules/bundle-registry/index.js.map +1 -0
  43. package/dist/modules/desktop-runtime/index.d.ts +11 -0
  44. package/dist/modules/desktop-runtime/index.js +41 -0
  45. package/dist/modules/desktop-runtime/index.js.map +1 -1
  46. package/dist/modules/diagnostics/index.d.ts +28 -0
  47. package/dist/modules/diagnostics/index.js +288 -0
  48. package/dist/modules/diagnostics/index.js.map +1 -0
  49. package/dist/modules/layered-authoring/index.d.ts +45 -0
  50. package/dist/modules/layered-authoring/index.js +549 -0
  51. package/dist/modules/layered-authoring/index.js.map +1 -0
  52. package/dist/modules/natural-language/index.d.ts +6 -3
  53. package/dist/modules/natural-language/index.js +74 -69
  54. package/dist/modules/natural-language/index.js.map +1 -1
  55. package/dist/modules/proxifier/index.d.ts +1 -14
  56. package/dist/modules/proxifier/index.js +10 -139
  57. package/dist/modules/proxifier/index.js.map +1 -1
  58. package/dist/modules/rule-set-catalog/index.d.ts +25 -0
  59. package/dist/modules/rule-set-catalog/index.js +135 -0
  60. package/dist/modules/rule-set-catalog/index.js.map +1 -0
  61. package/dist/modules/runtime-watchdog/index.d.ts +73 -0
  62. package/dist/modules/runtime-watchdog/index.js +532 -0
  63. package/dist/modules/runtime-watchdog/index.js.map +1 -0
  64. package/dist/modules/status/index.d.ts +48 -0
  65. package/dist/modules/status/index.js +254 -23
  66. package/dist/modules/status/index.js.map +1 -1
  67. package/dist/modules/system-proxy/index.d.ts +31 -0
  68. package/dist/modules/system-proxy/index.js +164 -0
  69. package/dist/modules/system-proxy/index.js.map +1 -0
  70. package/docs/agent-context.md +131 -0
  71. package/docs/natural-language-authoring.md +106 -1
  72. package/docs/proxifier-onboarding.md +15 -4
  73. package/docs/rule-templates.md +2 -0
  74. package/docs/runtime-modes.md +84 -0
  75. package/docs/runtime-on-macos.md +53 -4
  76. package/examples/builder.config.yaml +60 -0
  77. package/package.json +3 -2
  78. package/dist/cli/commands/quickstart.d.ts +0 -2
  79. package/dist/cli/commands/quickstart.js +0 -54
  80. package/dist/cli/commands/quickstart.js.map +0 -1
@@ -0,0 +1,135 @@
1
+ import { constants } from "node:fs";
2
+ import { access, mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import path from "node:path";
5
+ const defaultCatalogTtlMs = 24 * 60 * 60 * 1000;
6
+ export function defaultOfficialRuleSetCatalogCachePath() {
7
+ return path.join(homedir(), ".config", "singbox-iac", "cache", "official-rule-set-catalog.json");
8
+ }
9
+ export async function loadOfficialRuleSetCatalog(input = {}) {
10
+ const cachePath = input.cachePath ?? defaultOfficialRuleSetCatalogCachePath();
11
+ const ttlMs = input.ttlMs ?? defaultCatalogTtlMs;
12
+ const now = input.now ?? (() => new Date());
13
+ const cached = await readCatalogCache(cachePath);
14
+ if (input.refresh !== true && cached) {
15
+ const ageMs = Math.max(0, now().getTime() - Date.parse(cached.refreshedAt));
16
+ if (Number.isFinite(ageMs) && ageMs <= ttlMs) {
17
+ return {
18
+ ...cached,
19
+ cachePath,
20
+ source: "cache",
21
+ };
22
+ }
23
+ }
24
+ try {
25
+ const refreshed = await fetchOfficialRuleSetCatalog({
26
+ ...(input.fetchImpl ? { fetchImpl: input.fetchImpl } : {}),
27
+ refreshedAt: now().toISOString(),
28
+ });
29
+ await writeCatalogCache(cachePath, refreshed);
30
+ return {
31
+ ...refreshed,
32
+ cachePath,
33
+ source: "remote",
34
+ };
35
+ }
36
+ catch {
37
+ if (!cached) {
38
+ throw new Error("Unable to refresh the official rule-set catalog and no cached catalog is available.");
39
+ }
40
+ return {
41
+ ...cached,
42
+ cachePath,
43
+ source: "stale-cache",
44
+ };
45
+ }
46
+ }
47
+ export async function fetchOfficialRuleSetCatalog(input) {
48
+ const fetchImpl = input?.fetchImpl ?? fetch;
49
+ const [geositeRef, geoipRef] = await Promise.all([
50
+ fetchRuleSetBranchHead(fetchImpl, "SagerNet", "sing-geosite"),
51
+ fetchRuleSetBranchHead(fetchImpl, "SagerNet", "sing-geoip"),
52
+ ]);
53
+ const [geositeTags, geoipTags] = await Promise.all([
54
+ fetchRuleSetTags(fetchImpl, "SagerNet", "sing-geosite", geositeRef),
55
+ fetchRuleSetTags(fetchImpl, "SagerNet", "sing-geoip", geoipRef),
56
+ ]);
57
+ return {
58
+ refreshedAt: input?.refreshedAt ?? new Date().toISOString(),
59
+ geositeRef,
60
+ geoipRef,
61
+ geositeTags,
62
+ geoipTags,
63
+ };
64
+ }
65
+ export function isOfficialRuleSetTag(catalog, tag) {
66
+ return catalog.geositeTags.includes(tag) || catalog.geoipTags.includes(tag);
67
+ }
68
+ async function fetchRuleSetBranchHead(fetchImpl, owner, repo) {
69
+ const response = await fetchGithubJson(fetchImpl, `https://api.github.com/repos/${owner}/${repo}/git/ref/heads/rule-set`);
70
+ const sha = response.object?.sha;
71
+ if (!sha) {
72
+ throw new Error(`Missing rule-set branch head for ${owner}/${repo}.`);
73
+ }
74
+ return sha;
75
+ }
76
+ async function fetchRuleSetTags(fetchImpl, owner, repo, treeSha) {
77
+ const response = await fetchGithubJson(fetchImpl, `https://api.github.com/repos/${owner}/${repo}/git/trees/${treeSha}?recursive=1`);
78
+ const tags = new Set();
79
+ for (const entry of response.tree ?? []) {
80
+ const nextPath = entry.path;
81
+ if (!nextPath || !nextPath.endsWith(".srs")) {
82
+ continue;
83
+ }
84
+ tags.add(nextPath.slice(0, -4));
85
+ }
86
+ return [...tags].sort();
87
+ }
88
+ async function fetchGithubJson(fetchImpl, url) {
89
+ const response = await fetchImpl(url, {
90
+ headers: {
91
+ accept: "application/vnd.github+json",
92
+ "user-agent": "singbox-iac/0.1.16",
93
+ },
94
+ });
95
+ if (!response.ok) {
96
+ throw new Error(`GitHub API request failed for ${url}: HTTP ${response.status}`);
97
+ }
98
+ return (await response.json());
99
+ }
100
+ async function readCatalogCache(filePath) {
101
+ if (!(await pathExists(filePath))) {
102
+ return undefined;
103
+ }
104
+ const raw = await readFile(filePath, "utf8");
105
+ const parsed = JSON.parse(raw);
106
+ if (!parsed ||
107
+ typeof parsed.refreshedAt !== "string" ||
108
+ typeof parsed.geositeRef !== "string" ||
109
+ typeof parsed.geoipRef !== "string" ||
110
+ !Array.isArray(parsed.geositeTags) ||
111
+ !Array.isArray(parsed.geoipTags)) {
112
+ return undefined;
113
+ }
114
+ return {
115
+ refreshedAt: parsed.refreshedAt,
116
+ geositeRef: parsed.geositeRef,
117
+ geoipRef: parsed.geoipRef,
118
+ geositeTags: parsed.geositeTags.filter((value) => typeof value === "string"),
119
+ geoipTags: parsed.geoipTags.filter((value) => typeof value === "string"),
120
+ };
121
+ }
122
+ async function writeCatalogCache(filePath, catalog) {
123
+ await mkdir(path.dirname(filePath), { recursive: true });
124
+ await writeFile(filePath, JSON.stringify(catalog, null, 2).concat("\n"), "utf8");
125
+ }
126
+ async function pathExists(filePath) {
127
+ try {
128
+ await access(filePath, constants.F_OK);
129
+ return true;
130
+ }
131
+ catch {
132
+ return false;
133
+ }
134
+ }
135
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/rule-set-catalog/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import type { BuilderConfig } from "../../config/schema.js";
2
+ import { type RuntimeAgentRecoverInput, type RuntimeAgentRecoverResult } from "../desktop-runtime/index.js";
3
+ import { type SystemProxyRuntimeSnapshot } from "../system-proxy/index.js";
4
+ export interface RuntimeWatchdogAgentInstallInput {
5
+ readonly configPath: string;
6
+ readonly cliEntrypoint: string;
7
+ readonly intervalSeconds: number;
8
+ readonly label?: string;
9
+ readonly launchAgentsDir?: string;
10
+ readonly logsDir?: string;
11
+ readonly workingDirectory?: string;
12
+ readonly force?: boolean;
13
+ readonly load?: boolean;
14
+ }
15
+ export interface RuntimeWatchdogAgentInstallResult {
16
+ readonly label: string;
17
+ readonly plistPath: string;
18
+ readonly stdoutPath: string;
19
+ readonly stderrPath: string;
20
+ }
21
+ export interface RuntimeWatchdogAgentRemoveInput {
22
+ readonly label?: string;
23
+ readonly launchAgentsDir?: string;
24
+ readonly unload?: boolean;
25
+ }
26
+ export interface RuntimeWatchdogState {
27
+ readonly version: 1;
28
+ readonly label: string;
29
+ readonly lastCheckedAt: string;
30
+ readonly lastResult: "healthy" | "reasserted" | "restarted" | "process-missing" | "listener-missing" | "proxy-unknown" | "reassert-failed" | "restart-failed" | "restart-skipped-cooldown" | "disabled" | "unsupported-profile";
31
+ readonly lastMessage: string;
32
+ readonly lastTrigger?: RuntimeWatchdogTrigger;
33
+ readonly lastRecoveryAction?: RuntimeWatchdogRecoveryAction;
34
+ readonly lastReassertAt?: string;
35
+ readonly lastRestartAt?: string;
36
+ readonly lastError?: string;
37
+ }
38
+ export interface RunRuntimeWatchdogTickInput {
39
+ readonly config: BuilderConfig;
40
+ readonly configPath: string;
41
+ readonly snapshotCollector?: (config: BuilderConfig) => Promise<SystemProxyRuntimeSnapshot>;
42
+ readonly commandRunner?: RuntimeCommandRunner;
43
+ readonly runtimeAgentRecoverer?: RuntimeAgentRecoverer;
44
+ readonly runtimeLaunchAgentsDir?: string;
45
+ readonly statePath?: string;
46
+ }
47
+ export interface RunRuntimeWatchdogTickResult {
48
+ readonly statePath: string;
49
+ readonly state: RuntimeWatchdogState;
50
+ }
51
+ export interface RuntimeCommandRunnerResult {
52
+ readonly stdout: string;
53
+ readonly stderr: string;
54
+ }
55
+ export type RuntimeCommandRunner = (command: string, args: readonly string[]) => Promise<RuntimeCommandRunnerResult>;
56
+ export type RuntimeWatchdogTrigger = "process-missing" | "listener-missing" | "proxy-drift";
57
+ export type RuntimeWatchdogRecoveryAction = "reassert-proxy" | "restart-runtime";
58
+ export type RuntimeAgentRecoverer = (input: RuntimeAgentRecoverInput) => Promise<RuntimeAgentRecoverResult>;
59
+ export declare const defaultRuntimeWatchdogLaunchAgentLabel = "org.singbox-iac.runtime.watchdog";
60
+ export declare const defaultRuntimeWatchdogRestartCooldownMs: number;
61
+ export declare function installRuntimeWatchdogAgent(input: RuntimeWatchdogAgentInstallInput): Promise<RuntimeWatchdogAgentInstallResult>;
62
+ export declare function removeRuntimeWatchdogAgent(input: RuntimeWatchdogAgentRemoveInput): Promise<string>;
63
+ export declare function renderRuntimeWatchdogLaunchAgentPlist(input: {
64
+ readonly label: string;
65
+ readonly intervalSeconds: number;
66
+ readonly workingDirectory: string;
67
+ readonly stdoutPath: string;
68
+ readonly stderrPath: string;
69
+ readonly programArguments: readonly string[];
70
+ }): string;
71
+ export declare function runRuntimeWatchdogTick(input: RunRuntimeWatchdogTickInput): Promise<RunRuntimeWatchdogTickResult>;
72
+ export declare function readRuntimeWatchdogState(statePath: string): Promise<RuntimeWatchdogState | undefined>;
73
+ export declare function resolveRuntimeWatchdogStatePath(label?: string): string;