@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/LICENSE +21 -0
- package/README.md +76 -0
- package/assets/readme-header.svg +236 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.js +180 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +137 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.js +24 -0
- package/dist/logger.js.map +1 -0
- package/dist/monitor.d.ts +1 -0
- package/dist/monitor.js +25 -0
- package/dist/monitor.js.map +1 -0
- package/dist/paths.d.ts +8 -0
- package/dist/paths.js +27 -0
- package/dist/paths.js.map +1 -0
- package/dist/service.d.ts +13 -0
- package/dist/service.js +227 -0
- package/dist/service.js.map +1 -0
- package/dist/state.d.ts +7 -0
- package/dist/state.js +51 -0
- package/dist/state.js.map +1 -0
- package/dist/statusLine.d.ts +6 -0
- package/dist/statusLine.js +83 -0
- package/dist/statusLine.js.map +1 -0
- package/dist/switcher.d.ts +11 -0
- package/dist/switcher.js +137 -0
- package/dist/switcher.js.map +1 -0
- package/dist/telemetry.d.ts +2 -0
- package/dist/telemetry.js +43 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tui.d.ts +7 -0
- package/dist/tui.js +300 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +8 -0
- package/dist/util.js +67 -0
- package/dist/util.js.map +1 -0
- package/package.json +52 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 IvanMurzak
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# cc-switch
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
`cc-switch` is a TypeScript CLI for managing multiple Claude Code subscription OAuth tokens.
|
|
6
|
+
|
|
7
|
+
It uses only official Claude Code status-line telemetry. The collector records `rate_limits` snapshots when Claude Code passes them to a status-line command; it does not call undocumented quota endpoints.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install -g @baizor/cc-switch
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Commands
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
cc-switch
|
|
19
|
+
cc-switch config
|
|
20
|
+
cc-switch add subscription
|
|
21
|
+
cc-switch remove subscription 1
|
|
22
|
+
cc-switch list subscriptions
|
|
23
|
+
cc-switch status
|
|
24
|
+
cc-switch switch 0
|
|
25
|
+
cc-switch install service
|
|
26
|
+
cc-switch uninstall service
|
|
27
|
+
cc-switch service status
|
|
28
|
+
cc-switch install status-line
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Configuration
|
|
32
|
+
|
|
33
|
+
By default, configuration is stored at `~/.cc-switch/.env` and state at `~/.cc-switch/state.json`.
|
|
34
|
+
|
|
35
|
+
Important `.env` keys:
|
|
36
|
+
|
|
37
|
+
```dotenv
|
|
38
|
+
CC_SWITCH_TOKENS=["token-one","token-two"]
|
|
39
|
+
CC_SWITCH_TOKEN_LABELS=["Work","Personal"]
|
|
40
|
+
CC_SWITCH_POLL_SECONDS=60
|
|
41
|
+
CC_SWITCH_FIVE_HOUR_MIN_LEFT_PERCENT=10
|
|
42
|
+
CC_SWITCH_WEEKLY_MIN_LEFT_PERCENT=10
|
|
43
|
+
CC_SWITCH_SWITCHING_MODE=env
|
|
44
|
+
CC_SWITCH_LOG_LEVEL=info
|
|
45
|
+
CC_SWITCH_SERVICE_AUTOSTART=true
|
|
46
|
+
CC_SWITCH_STATE_PATH=
|
|
47
|
+
CC_SWITCH_CREDENTIALS_PATH=
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`env` mode writes the active token into cc-switch managed environment files and uses `setx` on Windows for new shells. `credentials-file` mode is experimental and writes a guarded JSON credentials file only when explicitly enabled.
|
|
51
|
+
|
|
52
|
+
## Status-Line Collector
|
|
53
|
+
|
|
54
|
+
Run:
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
cc-switch install status-line
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
This wraps an existing Claude Code `statusLine` command if one is present and forwards its output unchanged while recording official `rate_limits` snapshots.
|
|
61
|
+
|
|
62
|
+
## Publishing
|
|
63
|
+
|
|
64
|
+
This package is configured for npm Trusted Publishing through `.github/workflows/publish.yml`.
|
|
65
|
+
|
|
66
|
+
On npmjs.com, configure the trusted publisher for `@baizor/cc-switch` with:
|
|
67
|
+
|
|
68
|
+
- Publisher: GitHub Actions
|
|
69
|
+
- Organization or user: `IvanMurzak`
|
|
70
|
+
- Repository: `Claude-Subscription-Switcher`
|
|
71
|
+
- Workflow filename: `publish.yml`
|
|
72
|
+
- Allowed action: `npm publish`
|
|
73
|
+
|
|
74
|
+
For the first manual publish, run `npm publish --access public` from a local npm login. Do not enable local provenance for this first publish; provenance is generated by the GitHub Actions trusted publisher after npm is configured.
|
|
75
|
+
|
|
76
|
+
After the trusted publisher is configured, publish by creating a GitHub Release for the version in `package.json`, or run the `Publish to npm` workflow manually from GitHub Actions.
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="320" viewBox="0 0 1200 320" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">cc-switch subscription swap animation</title>
|
|
3
|
+
<desc id="desc">A smooth animated header showing two Claude Code subscription plans: the first fills to its limit, the plans swap, the second becomes active and starts consuming quota, then the scene glides back to the start.</desc>
|
|
4
|
+
<style>
|
|
5
|
+
:root {
|
|
6
|
+
--canvas: #f6f8fa;
|
|
7
|
+
--panel: #ffffff;
|
|
8
|
+
--soft: #f1f6ff;
|
|
9
|
+
--border: #d0d7de;
|
|
10
|
+
--rule: #eaeef2;
|
|
11
|
+
--text: #24292f;
|
|
12
|
+
--muted: #57606a;
|
|
13
|
+
--track: #d8dee4;
|
|
14
|
+
--blue: #0969da;
|
|
15
|
+
--teal: #1b7f83;
|
|
16
|
+
--green: #1a7f37;
|
|
17
|
+
--amber: #9a6700;
|
|
18
|
+
--red: #cf222e;
|
|
19
|
+
--claude: hsl(14.8, 63.1%, 59.6%);
|
|
20
|
+
--shadow: rgba(31, 35, 40, 0.10);
|
|
21
|
+
--wash: rgba(9, 105, 218, 0.08);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@media (prefers-color-scheme: dark) {
|
|
25
|
+
:root {
|
|
26
|
+
--canvas: #0d1117;
|
|
27
|
+
--panel: #161b22;
|
|
28
|
+
--soft: #0f1b2d;
|
|
29
|
+
--border: #30363d;
|
|
30
|
+
--rule: #21262d;
|
|
31
|
+
--text: #e6edf3;
|
|
32
|
+
--muted: #8b949e;
|
|
33
|
+
--track: #30363d;
|
|
34
|
+
--blue: #58a6ff;
|
|
35
|
+
--teal: #39c5cf;
|
|
36
|
+
--green: #3fb950;
|
|
37
|
+
--amber: #d29922;
|
|
38
|
+
--red: #ff7b72;
|
|
39
|
+
--claude: hsl(14.8, 63.1%, 63%);
|
|
40
|
+
--shadow: rgba(1, 4, 9, 0.38);
|
|
41
|
+
--wash: rgba(88, 166, 255, 0.11);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.canvas { fill: var(--canvas); }
|
|
46
|
+
.wash { fill: var(--wash); }
|
|
47
|
+
.panel { fill: var(--panel); stroke: var(--border); filter: drop-shadow(0 16px 30px var(--shadow)); }
|
|
48
|
+
.soft { fill: var(--soft); stroke: var(--border); }
|
|
49
|
+
.track { fill: var(--track); }
|
|
50
|
+
.rule { stroke: var(--rule); stroke-width: 1; }
|
|
51
|
+
.text { fill: var(--text); font: 700 22px ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace; }
|
|
52
|
+
.label { fill: var(--text); font: 700 14px ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace; }
|
|
53
|
+
.muted { fill: var(--muted); font: 600 12px ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace; }
|
|
54
|
+
.tiny { fill: var(--muted); font: 600 11px ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace; }
|
|
55
|
+
.blue { fill: var(--blue); }
|
|
56
|
+
.teal { fill: var(--teal); }
|
|
57
|
+
.green { fill: var(--green); }
|
|
58
|
+
.amber { fill: var(--amber); }
|
|
59
|
+
.red { fill: var(--red); }
|
|
60
|
+
.stroke-blue { stroke: var(--blue); }
|
|
61
|
+
.stroke-teal { stroke: var(--teal); }
|
|
62
|
+
.stroke-green { stroke: var(--green); }
|
|
63
|
+
.claude-mark {
|
|
64
|
+
fill: var(--claude);
|
|
65
|
+
}
|
|
66
|
+
.claude-motion {
|
|
67
|
+
transform-box: fill-box;
|
|
68
|
+
transform-origin: center;
|
|
69
|
+
animation: claudeBreathe 14s ease-in-out infinite;
|
|
70
|
+
}
|
|
71
|
+
.logo-word {
|
|
72
|
+
fill: var(--text);
|
|
73
|
+
font: 800 18px ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace;
|
|
74
|
+
}
|
|
75
|
+
.logo-sub {
|
|
76
|
+
fill: var(--muted);
|
|
77
|
+
font: 700 12px ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.sub-a {
|
|
81
|
+
transform-origin: 828px 104px;
|
|
82
|
+
animation: cardA 14s cubic-bezier(0.42, 0, 0.2, 1) infinite;
|
|
83
|
+
}
|
|
84
|
+
.sub-b {
|
|
85
|
+
transform-origin: 828px 202px;
|
|
86
|
+
animation: cardB 14s cubic-bezier(0.42, 0, 0.2, 1) infinite;
|
|
87
|
+
}
|
|
88
|
+
.meter-a {
|
|
89
|
+
animation: meterA 14s ease-in-out infinite;
|
|
90
|
+
}
|
|
91
|
+
.meter-b {
|
|
92
|
+
animation: meterB 14s ease-in-out infinite;
|
|
93
|
+
}
|
|
94
|
+
.status-a {
|
|
95
|
+
animation: statusA 14s ease-in-out infinite;
|
|
96
|
+
}
|
|
97
|
+
.status-b {
|
|
98
|
+
animation: statusB 14s ease-in-out infinite;
|
|
99
|
+
}
|
|
100
|
+
.route {
|
|
101
|
+
fill: none;
|
|
102
|
+
stroke-width: 3;
|
|
103
|
+
stroke-linecap: round;
|
|
104
|
+
stroke-dasharray: 10 16;
|
|
105
|
+
animation: routeFlow 4.8s linear infinite;
|
|
106
|
+
opacity: 0.72;
|
|
107
|
+
}
|
|
108
|
+
.terminal-meter {
|
|
109
|
+
animation: terminalMeter 14s ease-in-out infinite;
|
|
110
|
+
}
|
|
111
|
+
.cursor { animation: cursor 1.8s steps(2, end) infinite; }
|
|
112
|
+
|
|
113
|
+
@keyframes cardA {
|
|
114
|
+
0%, 34% { transform: translateY(0); }
|
|
115
|
+
46%, 84% { transform: translateY(98px); }
|
|
116
|
+
96%, 100% { transform: translateY(0); }
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
@keyframes cardB {
|
|
120
|
+
0%, 34% { transform: translateY(0); }
|
|
121
|
+
46%, 84% { transform: translateY(-98px); }
|
|
122
|
+
96%, 100% { transform: translateY(0); }
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@keyframes meterA {
|
|
126
|
+
0% { width: 54px; fill: var(--green); }
|
|
127
|
+
28% { width: 176px; fill: var(--green); }
|
|
128
|
+
34%, 46% { width: 206px; fill: var(--red); }
|
|
129
|
+
66%, 84% { width: 70px; fill: var(--amber); }
|
|
130
|
+
96%, 100% { width: 54px; fill: var(--green); }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@keyframes meterB {
|
|
134
|
+
0%, 34% { width: 64px; fill: var(--teal); }
|
|
135
|
+
46% { width: 64px; fill: var(--green); }
|
|
136
|
+
72% { width: 154px; fill: var(--green); }
|
|
137
|
+
84% { width: 176px; fill: var(--green); }
|
|
138
|
+
96%, 100% { width: 64px; fill: var(--teal); }
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@keyframes statusA {
|
|
142
|
+
0%, 26% { fill: var(--green); }
|
|
143
|
+
34%, 52% { fill: var(--red); }
|
|
144
|
+
72%, 100% { fill: var(--amber); }
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
@keyframes statusB {
|
|
148
|
+
0%, 34% { fill: var(--teal); }
|
|
149
|
+
46%, 84% { fill: var(--green); }
|
|
150
|
+
96%, 100% { fill: var(--teal); }
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
@keyframes claudeBreathe {
|
|
154
|
+
0%, 100% { opacity: 0.88; transform: scale(0.96) rotate(0deg); }
|
|
155
|
+
28% { opacity: 1; transform: scale(1.02) rotate(0deg); }
|
|
156
|
+
46% { opacity: 1; transform: scale(1.04) rotate(4deg); }
|
|
157
|
+
72% { opacity: 1; transform: scale(1.01) rotate(0deg); }
|
|
158
|
+
96% { opacity: 0.9; transform: scale(0.96) rotate(0deg); }
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
@keyframes terminalMeter {
|
|
162
|
+
0% { width: 54px; }
|
|
163
|
+
28% { width: 174px; }
|
|
164
|
+
46% { width: 54px; }
|
|
165
|
+
72% { width: 138px; }
|
|
166
|
+
84% { width: 160px; }
|
|
167
|
+
96%, 100% { width: 54px; }
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
@keyframes routeFlow {
|
|
171
|
+
to { stroke-dashoffset: -26; }
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
@keyframes cursor {
|
|
175
|
+
50% { opacity: 0; }
|
|
176
|
+
}
|
|
177
|
+
</style>
|
|
178
|
+
|
|
179
|
+
<rect class="canvas" width="1200" height="320" rx="22"/>
|
|
180
|
+
<rect class="wash" x="72" y="46" width="1056" height="228" rx="18"/>
|
|
181
|
+
|
|
182
|
+
<g>
|
|
183
|
+
<rect class="panel" x="94" y="66" width="338" height="188" rx="14"/>
|
|
184
|
+
<circle cx="118" cy="91" r="5" fill="#ff7b72"/>
|
|
185
|
+
<circle class="amber" cx="137" cy="91" r="5"/>
|
|
186
|
+
<circle class="green" cx="156" cy="91" r="5"/>
|
|
187
|
+
<text class="muted" x="178" y="96">terminal</text>
|
|
188
|
+
<line class="rule" x1="94" y1="116" x2="432" y2="116"/>
|
|
189
|
+
<text class="text" x="116" y="158">cc-switch</text>
|
|
190
|
+
<rect class="blue cursor" x="250" y="139" width="10" height="24" rx="2"/>
|
|
191
|
+
<text class="muted" x="116" y="187">active subscription quota</text>
|
|
192
|
+
<rect class="track" x="116" y="207" width="206" height="12" rx="6"/>
|
|
193
|
+
<rect class="terminal-meter blue" x="116" y="207" height="12" rx="6"/>
|
|
194
|
+
<line class="rule" x1="116" y1="235" x2="410" y2="235"/>
|
|
195
|
+
<text class="tiny" x="116" y="255">limit reached -> swap -> continue</text>
|
|
196
|
+
</g>
|
|
197
|
+
|
|
198
|
+
<g>
|
|
199
|
+
<path class="route stroke-blue" d="M435 160H528"/>
|
|
200
|
+
<path class="route stroke-teal" d="M672 160H748"/>
|
|
201
|
+
</g>
|
|
202
|
+
|
|
203
|
+
<g>
|
|
204
|
+
<g class="claude-mark" transform="translate(552 102) scale(0.96)">
|
|
205
|
+
<g class="claude-motion">
|
|
206
|
+
<path d="m19.6 66.5 19.7-11 .3-1-.3-.5h-1l-3.3-.2-11.2-.3L14 53l-9.5-.5-2.4-.5L0 49l.2-1.5 2-1.3 2.9.2 6.3.5 9.5.6 6.9.4L38 49.1h1.6l.2-.7-.5-.4-.4-.4L29 41l-10.6-7-5.6-4.1-3-2-1.5-2-.6-4.2 2.7-3 3.7.3.9.2 3.7 2.9 8 6.1L37 36l1.5 1.2.6-.4.1-.3-.7-1.1L33 25l-6-10.4-2.7-4.3-.7-2.6c-.3-1-.4-2-.4-3l3-4.2L28 0l4.2.6L33.8 2l2.6 6 4.1 9.3L47 29.9l2 3.8 1 3.4.3 1h.7v-.5l.5-7.2 1-8.7 1-11.2.3-3.2 1.6-3.8 3-2L61 2.6l2 2.9-.3 1.8-1.1 7.7L59 27.1l-1.5 8.2h.9l1-1.1 4.1-5.4 6.9-8.6 3-3.5L77 13l2.3-1.8h4.3l3.1 4.7-1.4 4.9-4.4 5.6-3.7 4.7-5.3 7.1-3.2 5.7.3.4h.7l12-2.6 6.4-1.1 7.6-1.3 3.5 1.6.4 1.6-1.4 3.4-8.2 2-9.6 2-14.3 3.3-.2.1.2.3 6.4.6 2.8.2h6.8l12.6 1 3.3 2 1.9 2.7-.3 2-5.1 2.6-6.8-1.6-16-3.8-5.4-1.3h-.8v.4l4.6 4.5 8.3 7.5L89 80.1l.5 2.4-1.3 2-1.4-.2-9.2-7-3.6-3-8-6.8h-.5v.7l1.8 2.7 9.8 14.7.5 4.5-.7 1.4-2.6 1-2.7-.6-5.8-8-6-9-4.7-8.2-.5.4-2.9 30.2-1.3 1.5-3 1.2-2.5-2-1.4-3 1.4-6.2 1.6-8 1.3-6.4 1.2-7.9.7-2.6v-.2H49L43 72l-9 12.3-7.2 7.6-1.7.7-3-1.5.3-2.8L24 86l10-12.8 6-7.9 4-4.6-.1-.5h-.3L17.2 77.4l-4.7.6-2-2 .2-3 1-1 8-5.5Z"/>
|
|
207
|
+
</g>
|
|
208
|
+
</g>
|
|
209
|
+
<text class="logo-word" x="540" y="226">Claude Code</text>
|
|
210
|
+
<text class="logo-sub" x="566" y="245">token switch</text>
|
|
211
|
+
</g>
|
|
212
|
+
|
|
213
|
+
<g>
|
|
214
|
+
<g class="sub-a">
|
|
215
|
+
<rect class="panel" x="758" y="66" width="352" height="76" rx="14"/>
|
|
216
|
+
<circle class="status-a" cx="790" cy="95" r="10"/>
|
|
217
|
+
<text class="label" x="814" y="100">subscription plan A</text>
|
|
218
|
+
<rect class="track" x="814" y="114" width="266" height="12" rx="6"/>
|
|
219
|
+
<rect class="meter-a" x="814" y="114" height="12" rx="6"/>
|
|
220
|
+
</g>
|
|
221
|
+
|
|
222
|
+
<g class="sub-b">
|
|
223
|
+
<rect class="panel" x="758" y="164" width="352" height="76" rx="14"/>
|
|
224
|
+
<circle class="status-b" cx="790" cy="193" r="10"/>
|
|
225
|
+
<text class="label" x="814" y="198">subscription plan B</text>
|
|
226
|
+
<rect class="track" x="814" y="212" width="266" height="12" rx="6"/>
|
|
227
|
+
<rect class="meter-b" x="814" y="212" height="12" rx="6"/>
|
|
228
|
+
</g>
|
|
229
|
+
</g>
|
|
230
|
+
|
|
231
|
+
<g>
|
|
232
|
+
<line class="rule" x1="94" y1="286" x2="1104" y2="286"/>
|
|
233
|
+
<text class="muted" x="94" y="304">official status-line telemetry only</text>
|
|
234
|
+
<text class="muted" x="878" y="304">two plans, one active token</text>
|
|
235
|
+
</g>
|
|
236
|
+
</svg>
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AppConfig } from "./types.js";
|
|
2
|
+
export declare function parseEnvText(text: string): Record<string, string>;
|
|
3
|
+
export declare function readConfig(configPath?: string): AppConfig;
|
|
4
|
+
export declare function writeConfig(config: AppConfig): void;
|
|
5
|
+
export declare function validateConfig(config: AppConfig): void;
|
|
6
|
+
export declare function addToken(config: AppConfig, token: string, label?: string): AppConfig;
|
|
7
|
+
export declare function removeToken(config: AppConfig, index: number): AppConfig;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { defaultConfigPath, defaultStatePath } from "./paths.js";
|
|
4
|
+
import { parseBoolean, parseJsonArrayOrCsv } from "./util.js";
|
|
5
|
+
const KNOWN_KEYS = [
|
|
6
|
+
"CC_SWITCH_TOKENS",
|
|
7
|
+
"CC_SWITCH_TOKEN_LABELS",
|
|
8
|
+
"CC_SWITCH_POLL_SECONDS",
|
|
9
|
+
"CC_SWITCH_FIVE_HOUR_MIN_LEFT_PERCENT",
|
|
10
|
+
"CC_SWITCH_WEEKLY_MIN_LEFT_PERCENT",
|
|
11
|
+
"CC_SWITCH_SWITCHING_MODE",
|
|
12
|
+
"CC_SWITCH_LOG_LEVEL",
|
|
13
|
+
"CC_SWITCH_SERVICE_AUTOSTART",
|
|
14
|
+
"CC_SWITCH_STATE_PATH",
|
|
15
|
+
"CC_SWITCH_CREDENTIALS_PATH"
|
|
16
|
+
];
|
|
17
|
+
const defaults = {
|
|
18
|
+
pollSeconds: 60,
|
|
19
|
+
fiveHourMinLeftPercent: 10,
|
|
20
|
+
weeklyMinLeftPercent: 10,
|
|
21
|
+
switchingMode: "env",
|
|
22
|
+
logLevel: "info",
|
|
23
|
+
serviceAutostart: true
|
|
24
|
+
};
|
|
25
|
+
export function parseEnvText(text) {
|
|
26
|
+
const values = {};
|
|
27
|
+
for (const rawLine of text.split(/\r?\n/)) {
|
|
28
|
+
const line = rawLine.trim();
|
|
29
|
+
if (!line || line.startsWith("#"))
|
|
30
|
+
continue;
|
|
31
|
+
const match = /^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/.exec(line);
|
|
32
|
+
if (!match)
|
|
33
|
+
continue;
|
|
34
|
+
let value = match[2] ?? "";
|
|
35
|
+
if (value.startsWith('"') && value.endsWith('"')) {
|
|
36
|
+
try {
|
|
37
|
+
value = JSON.parse(value);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
value = value.slice(1, -1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if (value.startsWith("'") && value.endsWith("'")) {
|
|
44
|
+
value = value.slice(1, -1);
|
|
45
|
+
}
|
|
46
|
+
values[match[1]] = value.replace(/\\n/g, "\n");
|
|
47
|
+
}
|
|
48
|
+
return values;
|
|
49
|
+
}
|
|
50
|
+
export function readConfig(configPath = defaultConfigPath()) {
|
|
51
|
+
const resolvedConfigPath = path.resolve(configPath);
|
|
52
|
+
const envText = fs.existsSync(resolvedConfigPath) ? fs.readFileSync(resolvedConfigPath, "utf8") : "";
|
|
53
|
+
const env = { ...parseEnvText(envText), ...process.env };
|
|
54
|
+
const config = {
|
|
55
|
+
tokens: parseJsonArrayOrCsv(env.CC_SWITCH_TOKENS),
|
|
56
|
+
tokenLabels: parseJsonArrayOrCsv(env.CC_SWITCH_TOKEN_LABELS),
|
|
57
|
+
pollSeconds: numberFromEnv(env.CC_SWITCH_POLL_SECONDS, defaults.pollSeconds),
|
|
58
|
+
fiveHourMinLeftPercent: numberFromEnv(env.CC_SWITCH_FIVE_HOUR_MIN_LEFT_PERCENT, defaults.fiveHourMinLeftPercent),
|
|
59
|
+
weeklyMinLeftPercent: numberFromEnv(env.CC_SWITCH_WEEKLY_MIN_LEFT_PERCENT, defaults.weeklyMinLeftPercent),
|
|
60
|
+
switchingMode: switchModeFromEnv(env.CC_SWITCH_SWITCHING_MODE),
|
|
61
|
+
logLevel: logLevelFromEnv(env.CC_SWITCH_LOG_LEVEL),
|
|
62
|
+
serviceAutostart: parseBoolean(env.CC_SWITCH_SERVICE_AUTOSTART, defaults.serviceAutostart),
|
|
63
|
+
configPath: resolvedConfigPath,
|
|
64
|
+
statePath: path.resolve(env.CC_SWITCH_STATE_PATH || defaultStatePath(resolvedConfigPath)),
|
|
65
|
+
credentialsPath: env.CC_SWITCH_CREDENTIALS_PATH
|
|
66
|
+
? path.resolve(env.CC_SWITCH_CREDENTIALS_PATH)
|
|
67
|
+
: undefined
|
|
68
|
+
};
|
|
69
|
+
validateConfig(config);
|
|
70
|
+
return config;
|
|
71
|
+
}
|
|
72
|
+
export function writeConfig(config) {
|
|
73
|
+
validateConfig(config);
|
|
74
|
+
fs.mkdirSync(path.dirname(config.configPath), { recursive: true });
|
|
75
|
+
const existing = fs.existsSync(config.configPath) ? fs.readFileSync(config.configPath, "utf8") : "";
|
|
76
|
+
const preserved = existing
|
|
77
|
+
.split(/\r?\n/)
|
|
78
|
+
.filter((line) => {
|
|
79
|
+
const match = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=/.exec(line);
|
|
80
|
+
return !match || !KNOWN_KEYS.includes(match[1]);
|
|
81
|
+
})
|
|
82
|
+
.filter((line, index, all) => line.trim() || index < all.length - 1);
|
|
83
|
+
const knownLines = [
|
|
84
|
+
["CC_SWITCH_TOKENS", JSON.stringify(config.tokens)],
|
|
85
|
+
["CC_SWITCH_TOKEN_LABELS", JSON.stringify(config.tokenLabels)],
|
|
86
|
+
["CC_SWITCH_POLL_SECONDS", String(config.pollSeconds)],
|
|
87
|
+
["CC_SWITCH_FIVE_HOUR_MIN_LEFT_PERCENT", String(config.fiveHourMinLeftPercent)],
|
|
88
|
+
["CC_SWITCH_WEEKLY_MIN_LEFT_PERCENT", String(config.weeklyMinLeftPercent)],
|
|
89
|
+
["CC_SWITCH_SWITCHING_MODE", config.switchingMode],
|
|
90
|
+
["CC_SWITCH_LOG_LEVEL", config.logLevel],
|
|
91
|
+
["CC_SWITCH_SERVICE_AUTOSTART", String(config.serviceAutostart)],
|
|
92
|
+
["CC_SWITCH_STATE_PATH", config.statePath],
|
|
93
|
+
["CC_SWITCH_CREDENTIALS_PATH", config.credentialsPath || ""]
|
|
94
|
+
].map(([key, value]) => `${key}=${escapeEnvValue(value)}`);
|
|
95
|
+
const body = [...preserved, ...(preserved.length ? [""] : []), ...knownLines].join("\n");
|
|
96
|
+
fs.writeFileSync(config.configPath, `${body}\n`, "utf8");
|
|
97
|
+
}
|
|
98
|
+
export function validateConfig(config) {
|
|
99
|
+
if (!Number.isInteger(config.pollSeconds) || config.pollSeconds < 5 || config.pollSeconds > 86400) {
|
|
100
|
+
throw new Error("CC_SWITCH_POLL_SECONDS must be an integer from 5 to 86400");
|
|
101
|
+
}
|
|
102
|
+
validatePercent(config.fiveHourMinLeftPercent, "CC_SWITCH_FIVE_HOUR_MIN_LEFT_PERCENT");
|
|
103
|
+
validatePercent(config.weeklyMinLeftPercent, "CC_SWITCH_WEEKLY_MIN_LEFT_PERCENT");
|
|
104
|
+
if (!["env", "credentials-file"].includes(config.switchingMode)) {
|
|
105
|
+
throw new Error("CC_SWITCH_SWITCHING_MODE must be env or credentials-file");
|
|
106
|
+
}
|
|
107
|
+
if (!["debug", "info", "warn", "error"].includes(config.logLevel)) {
|
|
108
|
+
throw new Error("CC_SWITCH_LOG_LEVEL must be debug, info, warn, or error");
|
|
109
|
+
}
|
|
110
|
+
const duplicates = new Set();
|
|
111
|
+
for (const token of config.tokens) {
|
|
112
|
+
if (!token.trim())
|
|
113
|
+
throw new Error("Tokens cannot be blank");
|
|
114
|
+
if (duplicates.has(token))
|
|
115
|
+
throw new Error("Duplicate tokens are not allowed");
|
|
116
|
+
duplicates.add(token);
|
|
117
|
+
}
|
|
118
|
+
if (config.tokenLabels.length > config.tokens.length) {
|
|
119
|
+
throw new Error("CC_SWITCH_TOKEN_LABELS cannot contain more entries than CC_SWITCH_TOKENS");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export function addToken(config, token, label) {
|
|
123
|
+
const trimmed = token.trim();
|
|
124
|
+
if (!trimmed)
|
|
125
|
+
throw new Error("Token cannot be blank");
|
|
126
|
+
if (config.tokens.includes(trimmed))
|
|
127
|
+
throw new Error("That token is already configured");
|
|
128
|
+
return {
|
|
129
|
+
...config,
|
|
130
|
+
tokens: [...config.tokens, trimmed],
|
|
131
|
+
tokenLabels: label ? [...config.tokenLabels, label] : config.tokenLabels
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export function removeToken(config, index) {
|
|
135
|
+
if (!Number.isInteger(index) || index < 0 || index >= config.tokens.length) {
|
|
136
|
+
throw new Error(`Invalid token index ${index}`);
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
...config,
|
|
140
|
+
tokens: config.tokens.filter((_, itemIndex) => itemIndex !== index),
|
|
141
|
+
tokenLabels: config.tokenLabels.filter((_, itemIndex) => itemIndex !== index)
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function numberFromEnv(value, fallback) {
|
|
145
|
+
if (value == null || value === "")
|
|
146
|
+
return fallback;
|
|
147
|
+
const parsed = Number(value);
|
|
148
|
+
if (!Number.isFinite(parsed))
|
|
149
|
+
throw new Error(`Expected numeric value, received ${value}`);
|
|
150
|
+
return parsed;
|
|
151
|
+
}
|
|
152
|
+
function switchModeFromEnv(value) {
|
|
153
|
+
if (!value)
|
|
154
|
+
return defaults.switchingMode;
|
|
155
|
+
if (value !== "env" && value !== "credentials-file") {
|
|
156
|
+
throw new Error("CC_SWITCH_SWITCHING_MODE must be env or credentials-file");
|
|
157
|
+
}
|
|
158
|
+
return value;
|
|
159
|
+
}
|
|
160
|
+
function logLevelFromEnv(value) {
|
|
161
|
+
if (!value)
|
|
162
|
+
return defaults.logLevel;
|
|
163
|
+
if (!["debug", "info", "warn", "error"].includes(value)) {
|
|
164
|
+
throw new Error("CC_SWITCH_LOG_LEVEL must be debug, info, warn, or error");
|
|
165
|
+
}
|
|
166
|
+
return value;
|
|
167
|
+
}
|
|
168
|
+
function validatePercent(value, key) {
|
|
169
|
+
if (!Number.isFinite(value) || value < 0 || value > 100) {
|
|
170
|
+
throw new Error(`${key} must be from 0 to 100`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function escapeEnvValue(value) {
|
|
174
|
+
if (value === "")
|
|
175
|
+
return "";
|
|
176
|
+
if (/^[A-Za-z0-9_./:@%+\-[\]",{} ]+$/.test(value))
|
|
177
|
+
return value;
|
|
178
|
+
return JSON.stringify(value);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED