@baizor/cc-switch 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.
package/dist/index.js ADDED
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import { Command } from "commander";
4
+ import { confirm, input, password } from "@inquirer/prompts";
5
+ import { addToken, readConfig, removeToken, writeConfig } from "./config.js";
6
+ import { dashboard, configScreen, renderDashboard } from "./tui.js";
7
+ import { loadState, recordServiceStatus, saveState } from "./state.js";
8
+ import { installService, restartService, serviceStatus, startService, stopService, uninstallService } from "./service.js";
9
+ import { collectStatusLine, installStatusLineCollector } from "./statusLine.js";
10
+ import { runMonitor } from "./monitor.js";
11
+ import { switchToToken } from "./switcher.js";
12
+ import { maskToken } from "./util.js";
13
+ import { recentLogs } from "./logger.js";
14
+ const program = new Command();
15
+ program
16
+ .name("cc-switch")
17
+ .description("Manage multiple Claude Code subscription OAuth tokens")
18
+ .version("0.1.0")
19
+ .option("--config <path>", "Path to cc-switch .env config");
20
+ program.action(async () => {
21
+ await dashboard(program.opts().config);
22
+ });
23
+ program.command("config").description("Open the interactive configuration UI").action(async () => {
24
+ await configScreen(program.opts().config);
25
+ });
26
+ const add = program.command("add").description("Add resources");
27
+ add
28
+ .command("subscription [token]")
29
+ .description("Add a Claude Code OAuth token")
30
+ .option("--label <label>", "Subscription label")
31
+ .action(async (token, options) => {
32
+ const config = readConfig(program.opts().config);
33
+ const nextToken = token || (await password({ message: "Claude Code OAuth token", mask: "*" }));
34
+ const label = options.label ?? (await input({ message: "Label", default: `Subscription ${config.tokens.length}` }));
35
+ writeConfig(addToken(config, nextToken, label));
36
+ console.log(`Added subscription ${config.tokens.length}: ${maskToken(nextToken)}`);
37
+ });
38
+ const remove = program.command("remove").description("Remove resources");
39
+ remove
40
+ .command("subscription <index>")
41
+ .description("Remove a subscription by zero-based index")
42
+ .option("-y, --yes", "Skip confirmation")
43
+ .action(async (indexText, options) => {
44
+ const config = readConfig(program.opts().config);
45
+ const index = Number(indexText);
46
+ const token = config.tokens[index];
47
+ if (!options.yes) {
48
+ if (!process.stdin.isTTY) {
49
+ throw new Error("Use --yes to confirm non-interactive removal.");
50
+ }
51
+ const ok = await confirm({ message: `Remove subscription ${index}: ${token ? maskToken(token) : "unknown"}?`, default: false });
52
+ if (!ok)
53
+ return;
54
+ }
55
+ writeConfig(removeToken(config, index));
56
+ console.log(`Removed subscription ${index}: ${token ? maskToken(token) : "unknown"}`);
57
+ });
58
+ const list = program.command("list").description("List resources");
59
+ list.command("subscriptions").description("List configured subscriptions").action(() => {
60
+ const config = readConfig(program.opts().config);
61
+ if (!config.tokens.length) {
62
+ console.log("No subscriptions configured.");
63
+ return;
64
+ }
65
+ for (const [index, token] of config.tokens.entries()) {
66
+ console.log(`${index}: ${config.tokenLabels[index] || `Subscription ${index}`} ${maskToken(token)}`);
67
+ }
68
+ });
69
+ program.command("status").description("Print dashboard status once").action(() => {
70
+ const config = readConfig(program.opts().config);
71
+ renderDashboard(config);
72
+ });
73
+ program.command("switch <index>").description("Manually switch to a subscription by index").action((indexText) => {
74
+ const config = readConfig(program.opts().config);
75
+ const state = loadState(config.statePath);
76
+ const index = Number(indexText);
77
+ switchToToken(config, state, index, "Manual switch from CLI");
78
+ console.log(`Active subscription set to ${index}.`);
79
+ });
80
+ const install = program.command("install").description("Install integrations");
81
+ install.command("service").description("Install the per-user background monitor").action(() => {
82
+ const config = readConfig(program.opts().config);
83
+ const state = loadState(config.statePath);
84
+ const status = installService(config);
85
+ saveState(config.statePath, recordServiceStatus(state, status));
86
+ console.log(status.detail);
87
+ });
88
+ install.command("status-line").description("Install the Claude Code status-line collector").option("--settings <path>", "Claude settings.json path").action((options) => {
89
+ const config = readConfig(program.opts().config);
90
+ const state = loadState(config.statePath);
91
+ installStatusLineCollector(config, state, options.settings);
92
+ console.log("Installed status-line collector.");
93
+ });
94
+ const uninstall = program.command("uninstall").description("Uninstall integrations");
95
+ uninstall.command("service").description("Stop and remove the per-user background monitor").action(() => {
96
+ const config = readConfig(program.opts().config);
97
+ const state = loadState(config.statePath);
98
+ const status = uninstallService();
99
+ saveState(config.statePath, recordServiceStatus(state, status));
100
+ console.log(status.detail);
101
+ });
102
+ const service = program.command("service").description("Control the per-user background service");
103
+ service.command("status").action(() => {
104
+ const status = serviceStatus();
105
+ console.log(`${status.installed ? "installed" : "not installed"} / ${status.running ? "running" : "stopped"}`);
106
+ console.log(status.detail);
107
+ });
108
+ service.command("start").action(() => {
109
+ const status = startService();
110
+ console.log(status.detail);
111
+ });
112
+ service.command("stop").action(() => {
113
+ const status = stopService();
114
+ console.log(status.detail);
115
+ });
116
+ service.command("restart").action(() => {
117
+ const status = restartService();
118
+ console.log(status.detail);
119
+ });
120
+ program.command("logs").description("Show recent cc-switch logs").option("-n, --lines <lines>", "Number of lines", "80").action((options) => {
121
+ console.log(recentLogs(Number(options.lines)));
122
+ });
123
+ program.command("monitor").description("Run the background monitor").option("--once", "Run one monitor iteration").action(async (options) => {
124
+ await runMonitor(program.opts().config, Boolean(options.once));
125
+ });
126
+ program.command("collect-status-line").description("Collect Claude Code status-line telemetry from stdin").option("--forward <base64>", "Base64 encoded previous status-line command").action(async (options) => {
127
+ const config = readConfig(program.opts().config);
128
+ const state = loadState(config.statePath);
129
+ const inputText = fs.readFileSync(0, "utf8");
130
+ const result = collectStatusLine(config, state, inputText, options.forward);
131
+ process.stdout.write(result.forwardedOutput);
132
+ });
133
+ program.parseAsync().catch((error) => {
134
+ console.error(error instanceof Error ? error.message : String(error));
135
+ process.exitCode = 1;
136
+ });
137
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { LogLevel } from "./types.js";
2
+ export declare function log(message: string, level?: LogLevel, configuredLevel?: LogLevel): void;
3
+ export declare function recentLogs(lines?: number): string;
package/dist/logger.js ADDED
@@ -0,0 +1,24 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { defaultLogPath } from "./paths.js";
4
+ const weights = {
5
+ debug: 10,
6
+ info: 20,
7
+ warn: 30,
8
+ error: 40
9
+ };
10
+ export function log(message, level = "info", configuredLevel = "info") {
11
+ if (weights[level] < weights[configuredLevel])
12
+ return;
13
+ const logPath = defaultLogPath();
14
+ fs.mkdirSync(path.dirname(logPath), { recursive: true });
15
+ fs.appendFileSync(logPath, `${new Date().toISOString()} ${level.toUpperCase()} ${message}\n`, "utf8");
16
+ }
17
+ export function recentLogs(lines = 80) {
18
+ const logPath = defaultLogPath();
19
+ if (!fs.existsSync(logPath))
20
+ return "No logs yet.";
21
+ const all = fs.readFileSync(logPath, "utf8").trimEnd().split(/\r?\n/);
22
+ return all.slice(-lines).join("\n") || "No logs yet.";
23
+ }
24
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,OAAO,GAA6B;IACxC,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,EAAE;CACV,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,QAAkB,MAAM,EAAE,kBAA4B,MAAM;IAC/F,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;QAAE,OAAO;IACtD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAK,GAAG,EAAE;IACnC,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,cAAc,CAAC;IACnD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC;AACxD,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runMonitor(configPath?: string, once?: boolean): Promise<void>;
@@ -0,0 +1,25 @@
1
+ import { readConfig } from "./config.js";
2
+ import { log } from "./logger.js";
3
+ import { loadState } from "./state.js";
4
+ import { decideSwitch, switchToToken } from "./switcher.js";
5
+ export async function runMonitor(configPath, once = false) {
6
+ while (true) {
7
+ const config = readConfig(configPath);
8
+ const state = loadState(config.statePath);
9
+ const decision = decideSwitch(config, state);
10
+ if (decision.shouldSwitch && decision.toIndex != null) {
11
+ switchToToken(config, state, decision.toIndex, decision.reason);
12
+ log(`Switched to token index ${decision.toIndex}: ${decision.reason}`, "info", config.logLevel);
13
+ }
14
+ else if (decision.reason.includes("no official telemetry")) {
15
+ log(decision.reason, "warn", config.logLevel);
16
+ }
17
+ else {
18
+ log(decision.reason, "debug", config.logLevel);
19
+ }
20
+ if (once)
21
+ return;
22
+ await new Promise((resolve) => setTimeout(resolve, config.pollSeconds * 1000));
23
+ }
24
+ }
25
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAmB,EAAE,IAAI,GAAG,KAAK;IAChE,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YACtD,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChE,GAAG,CAAC,2BAA2B,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClG,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,IAAI;YAAE,OAAO;QACjB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC;IACjF,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function appDir(): string;
2
+ export declare function defaultConfigPath(): string;
3
+ export declare function defaultStatePath(configPath?: string): string;
4
+ export declare function defaultLogPath(): string;
5
+ export declare function defaultClaudeSettingsPath(): string;
6
+ export declare function activeEnvPath(): string;
7
+ export declare function activePowerShellEnvPath(): string;
8
+ export declare function serviceName(): string;
package/dist/paths.js ADDED
@@ -0,0 +1,27 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ export function appDir() {
4
+ return path.join(os.homedir(), ".cc-switch");
5
+ }
6
+ export function defaultConfigPath() {
7
+ return process.env.CC_SWITCH_CONFIG_PATH || path.join(appDir(), ".env");
8
+ }
9
+ export function defaultStatePath(configPath = defaultConfigPath()) {
10
+ return process.env.CC_SWITCH_STATE_PATH || path.join(path.dirname(configPath), "state.json");
11
+ }
12
+ export function defaultLogPath() {
13
+ return path.join(appDir(), "cc-switch.log");
14
+ }
15
+ export function defaultClaudeSettingsPath() {
16
+ return path.join(os.homedir(), ".claude", "settings.json");
17
+ }
18
+ export function activeEnvPath() {
19
+ return path.join(appDir(), "active.env");
20
+ }
21
+ export function activePowerShellEnvPath() {
22
+ return path.join(appDir(), "active.ps1");
23
+ }
24
+ export function serviceName() {
25
+ return "cc-switch-monitor";
26
+ }
27
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAU,GAAG,iBAAiB,EAAE;IAC/D,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { AppConfig, ServiceStatusCache } from "./types.js";
2
+ export interface ServiceFiles {
3
+ kind: "windows" | "macos" | "linux" | "fallback";
4
+ path: string;
5
+ content: string;
6
+ }
7
+ export declare function generateServiceFile(config: AppConfig, platform?: NodeJS.Platform): ServiceFiles;
8
+ export declare function installService(config: AppConfig): ServiceStatusCache;
9
+ export declare function uninstallService(): ServiceStatusCache;
10
+ export declare function startService(): ServiceStatusCache;
11
+ export declare function stopService(): ServiceStatusCache;
12
+ export declare function restartService(): ServiceStatusCache;
13
+ export declare function serviceStatus(): ServiceStatusCache;
@@ -0,0 +1,227 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { spawnSync } from "node:child_process";
5
+ import { appDir, defaultLogPath, serviceName } from "./paths.js";
6
+ export function generateServiceFile(config, platform = process.platform) {
7
+ const command = process.execPath;
8
+ const cliPath = process.argv[1] || "cc-switch";
9
+ const args = [cliPath, "monitor", "--config", config.configPath].map(quoteXmlArg).join(" ");
10
+ const logPath = defaultLogPath();
11
+ if (platform === "win32") {
12
+ const taskPath = path.join(appDir(), `${serviceName()}.xml`);
13
+ return {
14
+ kind: "windows",
15
+ path: taskPath,
16
+ content: `<?xml version="1.0" encoding="UTF-16"?>
17
+ <Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
18
+ <RegistrationInfo><Description>cc-switch per-user monitor</Description></RegistrationInfo>
19
+ <Triggers><LogonTrigger><Enabled>true</Enabled></LogonTrigger></Triggers>
20
+ <Principals><Principal id="Author"><LogonType>InteractiveToken</LogonType><RunLevel>LeastPrivilege</RunLevel></Principal></Principals>
21
+ <Settings><MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy><DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries><StopIfGoingOnBatteries>false</StopIfGoingOnBatteries><ExecutionTimeLimit>PT0S</ExecutionTimeLimit></Settings>
22
+ <Actions Context="Author"><Exec><Command>${escapeXml(command)}</Command><Arguments>${escapeXml(args)}</Arguments></Exec></Actions>
23
+ </Task>
24
+ `
25
+ };
26
+ }
27
+ if (platform === "darwin") {
28
+ const plistPath = path.join(os.homedir(), "Library", "LaunchAgents", "com.cc-switch.monitor.plist");
29
+ return {
30
+ kind: "macos",
31
+ path: plistPath,
32
+ content: `<?xml version="1.0" encoding="UTF-8"?>
33
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
34
+ <plist version="1.0">
35
+ <dict>
36
+ <key>Label</key><string>com.cc-switch.monitor</string>
37
+ <key>ProgramArguments</key>
38
+ <array>
39
+ <string>${escapeXml(command)}</string>
40
+ <string>${escapeXml(cliPath)}</string>
41
+ <string>monitor</string>
42
+ <string>--config</string>
43
+ <string>${escapeXml(config.configPath)}</string>
44
+ </array>
45
+ <key>RunAtLoad</key><${config.serviceAutostart ? "true" : "false"}/>
46
+ <key>KeepAlive</key><true/>
47
+ <key>StandardOutPath</key><string>${escapeXml(logPath)}</string>
48
+ <key>StandardErrorPath</key><string>${escapeXml(logPath)}</string>
49
+ </dict>
50
+ </plist>
51
+ `
52
+ };
53
+ }
54
+ const unitPath = path.join(os.homedir(), ".config", "systemd", "user", `${serviceName()}.service`);
55
+ return {
56
+ kind: "linux",
57
+ path: unitPath,
58
+ content: `[Unit]
59
+ Description=cc-switch per-user monitor
60
+
61
+ [Service]
62
+ Type=simple
63
+ ExecStart=${command} ${cliPath} monitor --config ${config.configPath}
64
+ Restart=always
65
+ RestartSec=10
66
+ StandardOutput=append:${logPath}
67
+ StandardError=append:${logPath}
68
+
69
+ [Install]
70
+ WantedBy=default.target
71
+ `
72
+ };
73
+ }
74
+ export function installService(config) {
75
+ const file = generateServiceFile(config);
76
+ fs.mkdirSync(path.dirname(file.path), { recursive: true });
77
+ fs.writeFileSync(file.path, file.content, "utf8");
78
+ let detail = `Installed ${file.kind} service definition at ${file.path}`;
79
+ if (file.kind === "windows") {
80
+ const result = spawnSync("schtasks", ["/Create", "/TN", serviceName(), "/XML", file.path, "/F"], {
81
+ encoding: "utf8"
82
+ });
83
+ detail = result.status === 0 ? detail : `${detail}; schtasks returned ${result.status}: ${result.stderr}`;
84
+ }
85
+ else if (file.kind === "macos") {
86
+ const result = spawnSync("launchctl", ["bootstrap", `gui/${process.getuid?.() ?? ""}`, file.path], {
87
+ encoding: "utf8"
88
+ });
89
+ detail = result.status === 0 ? detail : `${detail}; launchctl returned ${result.status}: ${result.stderr}`;
90
+ }
91
+ else {
92
+ const result = spawnSync("systemctl", ["--user", "daemon-reload"], { encoding: "utf8" });
93
+ if (result.status === 0 && config.serviceAutostart) {
94
+ spawnSync("systemctl", ["--user", "enable", "--now", `${serviceName()}.service`], { encoding: "utf8" });
95
+ }
96
+ else if (result.status !== 0) {
97
+ detail = `${detail}; systemctl --user unavailable or failed. Start manually with: ${process.execPath} ${process.argv[1]} monitor --config ${config.configPath}`;
98
+ }
99
+ }
100
+ return {
101
+ installed: true,
102
+ running: config.serviceAutostart,
103
+ detail,
104
+ checkedAt: new Date().toISOString()
105
+ };
106
+ }
107
+ export function uninstallService() {
108
+ const name = serviceName();
109
+ let detail = "Service removal attempted";
110
+ if (process.platform === "win32") {
111
+ const result = spawnSync("schtasks", ["/Delete", "/TN", name, "/F"], { encoding: "utf8" });
112
+ detail = result.status === 0 ? "Removed Windows scheduled task" : `schtasks returned ${result.status}: ${result.stderr}`;
113
+ }
114
+ else if (process.platform === "darwin") {
115
+ const plistPath = path.join(os.homedir(), "Library", "LaunchAgents", "com.cc-switch.monitor.plist");
116
+ spawnSync("launchctl", ["bootout", `gui/${process.getuid?.() ?? ""}`, plistPath], { encoding: "utf8" });
117
+ if (fs.existsSync(plistPath))
118
+ fs.unlinkSync(plistPath);
119
+ detail = "Removed macOS launch agent";
120
+ }
121
+ else {
122
+ spawnSync("systemctl", ["--user", "disable", "--now", `${name}.service`], { encoding: "utf8" });
123
+ const unitPath = path.join(os.homedir(), ".config", "systemd", "user", `${name}.service`);
124
+ if (fs.existsSync(unitPath))
125
+ fs.unlinkSync(unitPath);
126
+ spawnSync("systemctl", ["--user", "daemon-reload"], { encoding: "utf8" });
127
+ detail = "Removed Linux systemd user unit if present";
128
+ }
129
+ return {
130
+ installed: false,
131
+ running: false,
132
+ detail,
133
+ checkedAt: new Date().toISOString()
134
+ };
135
+ }
136
+ export function startService() {
137
+ let detail = "Service start attempted";
138
+ if (process.platform === "win32") {
139
+ const result = spawnSync("schtasks", ["/Run", "/TN", serviceName()], { encoding: "utf8" });
140
+ detail = result.status === 0 ? "Started Windows scheduled task" : `schtasks returned ${result.status}: ${result.stderr}`;
141
+ }
142
+ else if (process.platform === "darwin") {
143
+ const plistPath = path.join(os.homedir(), "Library", "LaunchAgents", "com.cc-switch.monitor.plist");
144
+ const result = spawnSync("launchctl", ["kickstart", "-k", `gui/${process.getuid?.() ?? ""}/com.cc-switch.monitor`], {
145
+ encoding: "utf8"
146
+ });
147
+ detail = result.status === 0 ? "Started macOS launch agent" : `launchctl returned ${result.status}: ${result.stderr || plistPath}`;
148
+ }
149
+ else {
150
+ const result = spawnSync("systemctl", ["--user", "start", `${serviceName()}.service`], { encoding: "utf8" });
151
+ detail = result.status === 0 ? "Started Linux systemd user unit" : `systemctl returned ${result.status}: ${result.stderr}`;
152
+ }
153
+ return {
154
+ ...serviceStatus(),
155
+ running: true,
156
+ detail
157
+ };
158
+ }
159
+ export function stopService() {
160
+ let detail = "Service stop attempted";
161
+ if (process.platform === "win32") {
162
+ const result = spawnSync("schtasks", ["/End", "/TN", serviceName()], { encoding: "utf8" });
163
+ detail = result.status === 0 ? "Stopped Windows scheduled task" : `schtasks returned ${result.status}: ${result.stderr}`;
164
+ }
165
+ else if (process.platform === "darwin") {
166
+ const result = spawnSync("launchctl", ["kill", "TERM", `gui/${process.getuid?.() ?? ""}/com.cc-switch.monitor`], {
167
+ encoding: "utf8"
168
+ });
169
+ detail = result.status === 0 ? "Stopped macOS launch agent" : `launchctl returned ${result.status}: ${result.stderr}`;
170
+ }
171
+ else {
172
+ const result = spawnSync("systemctl", ["--user", "stop", `${serviceName()}.service`], { encoding: "utf8" });
173
+ detail = result.status === 0 ? "Stopped Linux systemd user unit" : `systemctl returned ${result.status}: ${result.stderr}`;
174
+ }
175
+ return {
176
+ ...serviceStatus(),
177
+ running: false,
178
+ detail
179
+ };
180
+ }
181
+ export function restartService() {
182
+ stopService();
183
+ return startService();
184
+ }
185
+ export function serviceStatus() {
186
+ let installed = false;
187
+ let running = false;
188
+ let detail = "No service definition found";
189
+ if (process.platform === "win32") {
190
+ const result = spawnSync("schtasks", ["/Query", "/TN", serviceName()], { encoding: "utf8" });
191
+ installed = result.status === 0;
192
+ running = result.stdout.includes("Running");
193
+ detail = installed ? "Windows scheduled task exists" : "Windows scheduled task not found";
194
+ }
195
+ else if (process.platform === "darwin") {
196
+ const plistPath = path.join(os.homedir(), "Library", "LaunchAgents", "com.cc-switch.monitor.plist");
197
+ installed = fs.existsSync(plistPath);
198
+ detail = installed ? `Launch agent exists at ${plistPath}` : "Launch agent not found";
199
+ }
200
+ else {
201
+ const unitPath = path.join(os.homedir(), ".config", "systemd", "user", `${serviceName()}.service`);
202
+ installed = fs.existsSync(unitPath);
203
+ const result = spawnSync("systemctl", ["--user", "is-active", `${serviceName()}.service`], {
204
+ encoding: "utf8"
205
+ });
206
+ running = result.stdout.trim() === "active";
207
+ detail = installed ? `systemd user unit exists at ${unitPath}` : "systemd user unit not found";
208
+ }
209
+ return {
210
+ installed,
211
+ running,
212
+ detail,
213
+ checkedAt: new Date().toISOString()
214
+ };
215
+ }
216
+ function escapeXml(value) {
217
+ return value
218
+ .replace(/&/g, "&amp;")
219
+ .replace(/</g, "&lt;")
220
+ .replace(/>/g, "&gt;")
221
+ .replace(/"/g, "&quot;")
222
+ .replace(/'/g, "&apos;");
223
+ }
224
+ function quoteXmlArg(value) {
225
+ return /\s/.test(value) ? `"${value.replace(/"/g, '\\"')}"` : value;
226
+ }
227
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AppState, QuotaSnapshot, ServiceStatusCache, SwitchHistoryEntry } from "./types.js";
2
+ export declare function emptyState(): AppState;
3
+ export declare function loadState(statePath: string): AppState;
4
+ export declare function saveState(statePath: string, state: AppState): void;
5
+ export declare function recordSnapshot(state: AppState, snapshot: QuotaSnapshot): AppState;
6
+ export declare function recordSwitch(state: AppState, entry: SwitchHistoryEntry): AppState;
7
+ export declare function recordServiceStatus(state: AppState, cache: ServiceStatusCache): AppState;
package/dist/state.js ADDED
@@ -0,0 +1,51 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export function emptyState() {
4
+ return {
5
+ activeTokenIndex: null,
6
+ snapshots: {},
7
+ switchHistory: [],
8
+ statusLine: {
9
+ installed: false
10
+ }
11
+ };
12
+ }
13
+ export function loadState(statePath) {
14
+ if (!fs.existsSync(statePath))
15
+ return emptyState();
16
+ const parsed = JSON.parse(fs.readFileSync(statePath, "utf8"));
17
+ return {
18
+ ...emptyState(),
19
+ ...parsed,
20
+ snapshots: parsed.snapshots || {},
21
+ switchHistory: parsed.switchHistory || [],
22
+ statusLine: parsed.statusLine || { installed: false }
23
+ };
24
+ }
25
+ export function saveState(statePath, state) {
26
+ fs.mkdirSync(path.dirname(statePath), { recursive: true });
27
+ fs.writeFileSync(statePath, `${JSON.stringify(state, null, 2)}\n`, "utf8");
28
+ }
29
+ export function recordSnapshot(state, snapshot) {
30
+ return {
31
+ ...state,
32
+ snapshots: {
33
+ ...state.snapshots,
34
+ [snapshot.tokenFingerprint]: snapshot
35
+ }
36
+ };
37
+ }
38
+ export function recordSwitch(state, entry) {
39
+ return {
40
+ ...state,
41
+ activeTokenIndex: entry.toIndex,
42
+ switchHistory: [entry, ...state.switchHistory].slice(0, 50)
43
+ };
44
+ }
45
+ export function recordServiceStatus(state, cache) {
46
+ return {
47
+ ...state,
48
+ serviceStatusCache: cache
49
+ };
50
+ }
51
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,gBAAgB,EAAE,IAAI;QACtB,SAAS,EAAE,EAAE;QACb,aAAa,EAAE,EAAE;QACjB,UAAU,EAAE;YACV,SAAS,EAAE,KAAK;SACjB;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,UAAU,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAsB,CAAC;IACnF,OAAO;QACL,GAAG,UAAU,EAAE;QACf,GAAG,MAAM;QACT,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE;QACzC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;KACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,KAAe;IAC1D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAe,EAAE,QAAuB;IACrE,OAAO;QACL,GAAG,KAAK;QACR,SAAS,EAAE;YACT,GAAG,KAAK,CAAC,SAAS;YAClB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ;SACtC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAe,EAAE,KAAyB;IACrE,OAAO;QACL,GAAG,KAAK;QACR,gBAAgB,EAAE,KAAK,CAAC,OAAO;QAC/B,aAAa,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAe,EAAE,KAAyB;IAC5E,OAAO;QACL,GAAG,KAAK;QACR,kBAAkB,EAAE,KAAK;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { AppConfig, AppState } from "./types.js";
2
+ export declare function installStatusLineCollector(config: AppConfig, state: AppState, settingsPath?: string): AppState;
3
+ export declare function collectStatusLine(config: AppConfig, state: AppState, input: string, forwardBase64?: string): {
4
+ state: AppState;
5
+ forwardedOutput: string;
6
+ };