cc98-cli 0.1.0 → 0.2.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/CHANGELOG.md +30 -0
- package/README.md +45 -180
- package/dist/api/client.d.ts +3 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +67 -1
- package/dist/api/client.js.map +1 -1
- package/dist/api/types.d.ts +12 -0
- package/dist/api/types.d.ts.map +1 -1
- package/dist/cli/commands/cache.d.ts +2 -0
- package/dist/cli/commands/cache.d.ts.map +1 -0
- package/dist/cli/commands/cache.js +68 -0
- package/dist/cli/commands/cache.js.map +1 -0
- package/dist/cli/commands/update.d.ts +2 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +24 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/router.d.ts.map +1 -1
- package/dist/cli/router.js +10 -1
- package/dist/cli/router.js.map +1 -1
- package/dist/storage/cache-store.d.ts +45 -2
- package/dist/storage/cache-store.d.ts.map +1 -1
- package/dist/storage/cache-store.js +158 -5
- package/dist/storage/cache-store.js.map +1 -1
- package/dist/storage/token-store.js +1 -1
- package/dist/storage/token-store.js.map +1 -1
- package/dist/tui/app.d.ts.map +1 -1
- package/dist/tui/app.js +792 -123
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/cached-client.d.ts +20 -1
- package/dist/tui/cached-client.d.ts.map +1 -1
- package/dist/tui/cached-client.js +20 -2
- package/dist/tui/cached-client.js.map +1 -1
- package/dist/update.d.ts +17 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +88 -0
- package/dist/update.js.map +1 -0
- package/dist/version.d.ts +6 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/docs/images/tui.jpg +0 -0
- package/package.json +4 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## v0.2.0 - 2026-05-26
|
|
4
|
+
|
|
5
|
+
这次更新主要改进 TUI 的浏览体验,并补上本地缓存和更新检查能力。
|
|
6
|
+
|
|
7
|
+
### 新增
|
|
8
|
+
|
|
9
|
+
- 新增 `cc98 update`,可检查 GitHub Release 上的最新版本。
|
|
10
|
+
- 新增 `cc98 cache` 命令,支持查看缓存统计、清理过期缓存和清空缓存。
|
|
11
|
+
- TUI 新增设置页,支持缓存清理、快捷键帮助和检查更新。
|
|
12
|
+
- 帖子阅读新增楼层概念,支持数字加 Enter 跳转楼层,`【` / `】` 在楼层之间切换。
|
|
13
|
+
- 帖子阅读右栏新增当前楼层、当前行、图片、链接、评分和热门回复信息。
|
|
14
|
+
|
|
15
|
+
### 改进
|
|
16
|
+
|
|
17
|
+
- 优化 TUI 左栏、中栏和右栏的信息架构,每个栏目拥有独立的右侧说明。
|
|
18
|
+
- 优化消息、设置等栏目标题和选中态显示。
|
|
19
|
+
- 优化帖子内 `j/k` 行滚动,保留逐行查看内容的能力。
|
|
20
|
+
- 增强本地缓存,加入文件缓存统计、过期清理和内存缓存上限。
|
|
21
|
+
|
|
22
|
+
### 修复
|
|
23
|
+
|
|
24
|
+
- 修复进入设置后按键处理错误导致无法执行设置项的问题。
|
|
25
|
+
- 修复版面帖子列表操作菜单中的返回动作无效的问题。
|
|
26
|
+
- 修复 token 刷新后可能把当前账号错误保存为 `default` 的问题。
|
|
27
|
+
|
|
28
|
+
## v0.1.0 - 2026-05-26
|
|
29
|
+
|
|
30
|
+
- 初始版本,提供 CC98 CLI 和 TUI 基础浏览能力。
|
package/README.md
CHANGED
|
@@ -1,36 +1,29 @@
|
|
|
1
|
-
# CC98
|
|
1
|
+
# CC98-CLI
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
CC98 的命令行客户端,包含面向脚本使用的 CLI 和适合日常浏览的 TUI。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
- 直接运行 `cc98`:进入终端界面。
|
|
6
|
+
- 带参数运行 `cc98 <command>`:执行 CLI,默认输出 JSON。
|
|
7
|
+
- 当前主要面向读取场景,TUI 会尽量按需加载和缓存,减少请求。
|
|
6
8
|
|
|
7
|
-
##
|
|
9
|
+
## 概要
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
- TUI:支持十大、收藏版面帖子流、最新、版面、关注动态、消息、我的信息。
|
|
11
|
-
- 读帖:只按需加载第一页,`n` / `Space` 手动加载下一页。
|
|
12
|
-
- 图片:默认只渲染链接占位,不自动下载图片。
|
|
13
|
-
- 缓存:对首页、版面、帖子、私信、用户信息做本地 TTL 缓存,减少对服务器压力。
|
|
14
|
-
- 账号:支持多账号本地 token 存储和切换。
|
|
11
|
+
vibe coding 累了的话,不妨在终端里水水 98。
|
|
15
12
|
|
|
16
|
-
|
|
13
|
+
这是一个个人兴趣项目,基于 CC98 的公开接口实现,与 CC98 官方无关。请合理使用本工具,避免违反 CC98 的用户协议。
|
|
17
14
|
|
|
18
|
-
##
|
|
15
|
+
## 预览
|
|
19
16
|
|
|
20
|
-
|
|
17
|
+
<p align="center">
|
|
18
|
+
<img src="docs/images/tui.jpg" alt="CC98-CLI TUI 截图" width="900">
|
|
19
|
+
</p>
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
npm install -g cc98-cli
|
|
24
|
-
```
|
|
21
|
+
## 安装
|
|
25
22
|
|
|
26
|
-
|
|
23
|
+
需要 Node.js 20+。
|
|
27
24
|
|
|
28
25
|
```bash
|
|
29
|
-
|
|
30
|
-
cd CC98-CLI
|
|
31
|
-
npm install
|
|
32
|
-
npm run build
|
|
33
|
-
npm link
|
|
26
|
+
npm install -g cc98-cli
|
|
34
27
|
```
|
|
35
28
|
|
|
36
29
|
## 登录
|
|
@@ -39,156 +32,66 @@ npm link
|
|
|
39
32
|
cc98 login
|
|
40
33
|
```
|
|
41
34
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
```text
|
|
45
|
-
~/.cc98-cli/tokens.json
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
多账号相关命令:
|
|
35
|
+
多账号:
|
|
49
36
|
|
|
50
37
|
```bash
|
|
51
38
|
cc98 account list
|
|
52
|
-
cc98 account current
|
|
53
39
|
cc98 account use <name>
|
|
54
|
-
cc98 account
|
|
40
|
+
cc98 --account <name> me
|
|
55
41
|
```
|
|
56
42
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
cc98 --account <name> topic <topic-id>
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## TUI 使用
|
|
43
|
+
## TUI
|
|
64
44
|
|
|
65
45
|
```bash
|
|
66
46
|
cc98
|
|
67
47
|
```
|
|
68
48
|
|
|
69
|
-
|
|
49
|
+
常用按键:
|
|
70
50
|
|
|
71
51
|
```text
|
|
52
|
+
j/k 或 ↑/↓ 上下移动
|
|
53
|
+
l 或 → 进入下一层
|
|
54
|
+
h 或 ← 返回上一层
|
|
55
|
+
Enter 确认执行
|
|
56
|
+
r 刷新
|
|
57
|
+
o 打开操作菜单
|
|
58
|
+
? 显示帮助
|
|
59
|
+
n 或 Space 加载更多
|
|
72
60
|
q 退出
|
|
73
|
-
h / 左方向键 返回左栏
|
|
74
|
-
l / Enter / 右方向键 进入内容或打开选中项
|
|
75
|
-
j / 下方向键 向下
|
|
76
|
-
k / 上方向键 向上
|
|
77
|
-
r 刷新当前视图
|
|
78
|
-
n / Space 读取下一页帖子或更早私信
|
|
79
|
-
Esc / Backspace 返回上一级列表
|
|
80
61
|
```
|
|
81
62
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
```text
|
|
85
|
-
十大 热门话题
|
|
86
|
-
收藏 收藏版面的帖子流
|
|
87
|
-
最新 全站新帖
|
|
88
|
-
版面 全部版面,并可进入具体版面主题列表
|
|
89
|
-
关注 关注用户动态
|
|
90
|
-
消息 私信联系人和历史
|
|
91
|
-
我的 当前账号信息
|
|
92
|
-
```
|
|
63
|
+
左栏导航包含:十大、收藏、最新、版面、关注、消息、我的、设置。
|
|
93
64
|
|
|
94
|
-
## CLI
|
|
65
|
+
## CLI
|
|
95
66
|
|
|
96
|
-
|
|
67
|
+
CLI 默认输出 JSON,适合配合 `jq` 或脚本使用。
|
|
97
68
|
|
|
98
69
|
```bash
|
|
99
|
-
cc98
|
|
70
|
+
cc98 me
|
|
100
71
|
cc98 topic <topic-id>
|
|
101
72
|
cc98 board <board-id>
|
|
102
73
|
cc98 search <keyword>
|
|
74
|
+
cc98 message recent
|
|
75
|
+
cc98 update
|
|
103
76
|
```
|
|
104
77
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
```bash
|
|
108
|
-
cc98 forum index
|
|
109
|
-
cc98 forum boards
|
|
110
|
-
cc98 forum card-stat
|
|
111
|
-
|
|
112
|
-
cc98 board list
|
|
113
|
-
cc98 board info <board-id>
|
|
114
|
-
cc98 board topics <board-id> [--from n] [--size n] [--best]
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
说明:`forum card-stat` 对接的是 `card.cc98.org` 的接口,该站点使用独立 Web OIDC cookie session,普通 CC98 API token 可能会收到 `401`。
|
|
118
|
-
|
|
119
|
-
### 帖子
|
|
120
|
-
|
|
121
|
-
```bash
|
|
122
|
-
cc98 topic <topic-id> [--from n] [--size n]
|
|
123
|
-
cc98 topic <topic-id> --meta
|
|
124
|
-
cc98 topic <topic-id> --posts
|
|
125
|
-
cc98 topic new [--from n] [--size n]
|
|
126
|
-
cc98 topic random [--size n]
|
|
127
|
-
cc98 topic recent [--me | --user id] [--from n] [--size n]
|
|
128
|
-
cc98 topic favorite [--group id] [--order n] [--from n] [--size n]
|
|
129
|
-
cc98 topic is-favorite <topic-id>
|
|
130
|
-
cc98 topic vote <topic-id>
|
|
131
|
-
cc98 topic basic <ids...>
|
|
132
|
-
cc98 topic search <keyword> [--from n] [--size n]
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### 用户
|
|
136
|
-
|
|
137
|
-
```bash
|
|
138
|
-
cc98 me
|
|
139
|
-
cc98 user me
|
|
140
|
-
cc98 user profile <user-id>
|
|
141
|
-
cc98 user basic <ids...>
|
|
142
|
-
cc98 user list <ids...>
|
|
143
|
-
cc98 user followers [--from n] [--size n]
|
|
144
|
-
cc98 user followees [--from n] [--size n]
|
|
145
|
-
cc98 user moment [--from n] [--size n]
|
|
146
|
-
cc98 user favorite-updates [--from n] [--size n]
|
|
147
|
-
cc98 user favorite-groups
|
|
148
|
-
cc98 user search <name>
|
|
149
|
-
cc98 user unread
|
|
150
|
-
cc98 user browse-history [--from n] [--size n]
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### 消息
|
|
78
|
+
查看完整命令:
|
|
154
79
|
|
|
155
80
|
```bash
|
|
156
|
-
cc98
|
|
157
|
-
cc98
|
|
158
|
-
cc98
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
### 通知
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
cc98 notice system [--from n] [--size n]
|
|
165
|
-
cc98 notice at [--from n] [--size n]
|
|
166
|
-
cc98 notice reply [--from n] [--size n]
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### 帖子相关状态
|
|
170
|
-
|
|
171
|
-
```bash
|
|
172
|
-
cc98 post reaction-state <post-id>
|
|
173
|
-
cc98 post rate-reasons <type>
|
|
81
|
+
cc98 --help
|
|
82
|
+
cc98 topic --help
|
|
83
|
+
cc98 user --help
|
|
84
|
+
cc98 update --help
|
|
174
85
|
```
|
|
175
86
|
|
|
176
|
-
##
|
|
87
|
+
## 本地数据
|
|
177
88
|
|
|
178
|
-
|
|
89
|
+
登录信息和缓存保存在:
|
|
179
90
|
|
|
180
91
|
```text
|
|
181
|
-
~/.cc98-cli/
|
|
92
|
+
~/.cc98-cli/
|
|
182
93
|
```
|
|
183
94
|
|
|
184
|
-
TUI 会尽量避免不必要请求:
|
|
185
|
-
|
|
186
|
-
- 首页和十大:短 TTL。
|
|
187
|
-
- 全部版面:长 TTL。
|
|
188
|
-
- 版面帖子、新帖、关注动态、私信:短 TTL。
|
|
189
|
-
- 帖子正文:第一页短 TTL,后续页更长 TTL。
|
|
190
|
-
- 图片:默认不下载,只显示链接占位。
|
|
191
|
-
|
|
192
95
|
## 开发
|
|
193
96
|
|
|
194
97
|
```bash
|
|
@@ -198,49 +101,11 @@ npm run build
|
|
|
198
101
|
node dist/main.js
|
|
199
102
|
```
|
|
200
103
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
```bash
|
|
204
|
-
node dist/main.js --help
|
|
205
|
-
node dist/main.js topic <topic-id>
|
|
206
|
-
```
|
|
104
|
+
## 致谢
|
|
207
105
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
首次发布需要:
|
|
211
|
-
|
|
212
|
-
1. 一个 npm 账号。
|
|
213
|
-
2. 本机登录 npm:
|
|
214
|
-
|
|
215
|
-
```bash
|
|
216
|
-
npm login
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
3. 确认包名没有被占用:
|
|
220
|
-
|
|
221
|
-
```bash
|
|
222
|
-
npm view cc98-cli
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
如果返回 `404 Not Found`,通常表示包名还没有被占用。
|
|
226
|
-
|
|
227
|
-
4. 构建并发布:
|
|
228
|
-
|
|
229
|
-
```bash
|
|
230
|
-
npm run check
|
|
231
|
-
npm run build
|
|
232
|
-
npm publish --access public
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
如果 npm 账号开启了 2FA,发布时会要求输入 OTP。
|
|
236
|
-
|
|
237
|
-
后续版本发布需要先修改 `package.json` 的 `version`,推荐用:
|
|
238
|
-
|
|
239
|
-
```bash
|
|
240
|
-
npm version patch
|
|
241
|
-
npm publish --access public
|
|
242
|
-
```
|
|
106
|
+
- [Ansherly](https://github.com/Ansherly):感谢前辈的积极鼓励!
|
|
107
|
+
- [CC98-Desktop](https://github.com/Ansherly/CC98-Desktop):部分 TUI 信息架构参考了该桌面客户端的交互设计。
|
|
243
108
|
|
|
244
|
-
##
|
|
109
|
+
## License
|
|
245
110
|
|
|
246
111
|
MIT
|
package/dist/api/client.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ interface RequestOptions {
|
|
|
4
4
|
}
|
|
5
5
|
export declare class Cc98Client {
|
|
6
6
|
private readonly tokenStore;
|
|
7
|
+
private refreshPromise;
|
|
7
8
|
constructor(options: ClientOptions);
|
|
8
9
|
loginWithPassword(username: string, password: string): Promise<{
|
|
9
10
|
accessToken: string;
|
|
@@ -42,6 +43,8 @@ export declare class Cc98Client {
|
|
|
42
43
|
getPostReactionState(postId: number): Promise<unknown>;
|
|
43
44
|
getPostRateReasons(type: number): Promise<unknown>;
|
|
44
45
|
private request;
|
|
46
|
+
private tryRefreshToken;
|
|
47
|
+
private doRefreshToken;
|
|
45
48
|
}
|
|
46
49
|
export {};
|
|
47
50
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKvE,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/api/client.js
CHANGED
|
@@ -3,6 +3,7 @@ const passwordClientId = "9a1fd200-8687-44b1-4c20-08d50a96e5cd";
|
|
|
3
3
|
const passwordClientSecret = "8b53f727-08e2-4509-8857-e34bf92b27f2";
|
|
4
4
|
export class Cc98Client {
|
|
5
5
|
tokenStore;
|
|
6
|
+
refreshPromise = null;
|
|
6
7
|
constructor(options) {
|
|
7
8
|
this.tokenStore = options.tokenStore;
|
|
8
9
|
}
|
|
@@ -143,10 +144,21 @@ export class Cc98Client {
|
|
|
143
144
|
}
|
|
144
145
|
headers.set("authorization", `Bearer ${token}`);
|
|
145
146
|
}
|
|
146
|
-
|
|
147
|
+
let response = await fetch(url, {
|
|
147
148
|
...init,
|
|
148
149
|
headers
|
|
149
150
|
});
|
|
151
|
+
// Try to refresh token on 401
|
|
152
|
+
if (response.status === 401 && authorize) {
|
|
153
|
+
const refreshed = await this.tryRefreshToken();
|
|
154
|
+
if (refreshed) {
|
|
155
|
+
headers.set("authorization", `Bearer ${refreshed.accessToken}`);
|
|
156
|
+
response = await fetch(url, {
|
|
157
|
+
...init,
|
|
158
|
+
headers
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
150
162
|
const text = await response.text();
|
|
151
163
|
const data = parseJson(text);
|
|
152
164
|
if (!response.ok) {
|
|
@@ -158,6 +170,60 @@ export class Cc98Client {
|
|
|
158
170
|
}
|
|
159
171
|
return data;
|
|
160
172
|
}
|
|
173
|
+
async tryRefreshToken() {
|
|
174
|
+
// Deduplicate concurrent refresh attempts
|
|
175
|
+
if (this.refreshPromise) {
|
|
176
|
+
return this.refreshPromise;
|
|
177
|
+
}
|
|
178
|
+
this.refreshPromise = this.doRefreshToken();
|
|
179
|
+
try {
|
|
180
|
+
const result = await this.refreshPromise;
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
this.refreshPromise = null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async doRefreshToken() {
|
|
188
|
+
const account = await this.tokenStore.getCurrentAccount?.();
|
|
189
|
+
const refreshToken = account ? account.refreshToken : await this.tokenStore.getRefreshToken();
|
|
190
|
+
if (!refreshToken) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
const body = new URLSearchParams({
|
|
195
|
+
refresh_token: refreshToken,
|
|
196
|
+
client_id: passwordClientId,
|
|
197
|
+
client_secret: passwordClientSecret,
|
|
198
|
+
grant_type: "refresh_token",
|
|
199
|
+
scope: "cc98-api openid offline_access"
|
|
200
|
+
});
|
|
201
|
+
const token = await this.request(endpoints.auth.token, {
|
|
202
|
+
method: "POST",
|
|
203
|
+
headers: {
|
|
204
|
+
"content-type": "application/x-www-form-urlencoded"
|
|
205
|
+
},
|
|
206
|
+
body
|
|
207
|
+
}, false);
|
|
208
|
+
if (!token.access_token) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
const result = {
|
|
212
|
+
accessToken: token.access_token,
|
|
213
|
+
refreshToken: token.refresh_token
|
|
214
|
+
};
|
|
215
|
+
if (account && this.tokenStore.saveAccount) {
|
|
216
|
+
await this.tokenStore.saveAccount(account.account, result);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
await this.tokenStore.save(result);
|
|
220
|
+
}
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
161
227
|
}
|
|
162
228
|
function parseJson(text) {
|
|
163
229
|
if (!text) {
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AAChE,MAAM,oBAAoB,GAAG,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/api/types.d.ts
CHANGED
|
@@ -8,6 +8,18 @@ export interface ClientOptions {
|
|
|
8
8
|
tokenStore: {
|
|
9
9
|
getAccessToken(): Promise<string | undefined>;
|
|
10
10
|
getRefreshToken(): Promise<string | undefined>;
|
|
11
|
+
getCurrentAccount?(): Promise<{
|
|
12
|
+
account: string;
|
|
13
|
+
refreshToken?: string;
|
|
14
|
+
} | undefined>;
|
|
15
|
+
save(tokens: {
|
|
16
|
+
accessToken: string;
|
|
17
|
+
refreshToken?: string;
|
|
18
|
+
}): Promise<void>;
|
|
19
|
+
saveAccount?(account: string, tokens: {
|
|
20
|
+
accessToken: string;
|
|
21
|
+
refreshToken?: string;
|
|
22
|
+
}): Promise<unknown>;
|
|
11
23
|
};
|
|
12
24
|
}
|
|
13
25
|
export type JsonObject = Record<string, unknown>;
|
package/dist/api/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE;QACV,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;QAC9C,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE;QACV,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;QAC9C,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;QAC/C,iBAAiB,CAAC,IAAI,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAC,CAAC;QACtF,IAAI,CAAC,MAAM,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5E,WAAW,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACzG,CAAC;CACH;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cache.ts"],"names":[],"mappings":"AAEA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDhE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CacheStore } from "../../storage/cache-store.js";
|
|
2
|
+
export async function cacheCommand(args) {
|
|
3
|
+
const [subcommand, ...rest] = args;
|
|
4
|
+
switch (subcommand) {
|
|
5
|
+
case undefined:
|
|
6
|
+
case "--help":
|
|
7
|
+
case "-h":
|
|
8
|
+
case "help":
|
|
9
|
+
printCacheHelp();
|
|
10
|
+
return;
|
|
11
|
+
case "stats": {
|
|
12
|
+
const cache = new CacheStore();
|
|
13
|
+
const stats = await cache.getStats();
|
|
14
|
+
console.log(JSON.stringify(stats, null, 2));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
case "cleanup": {
|
|
18
|
+
const cache = new CacheStore();
|
|
19
|
+
const result = await cache.cleanupFileCache();
|
|
20
|
+
console.log(JSON.stringify({
|
|
21
|
+
action: "cleanup",
|
|
22
|
+
removed: result.removed,
|
|
23
|
+
kept: result.kept
|
|
24
|
+
}, null, 2));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
case "clear": {
|
|
28
|
+
const target = rest[0] ?? "all";
|
|
29
|
+
const cache = new CacheStore();
|
|
30
|
+
switch (target) {
|
|
31
|
+
case "all":
|
|
32
|
+
await cache.clearAll();
|
|
33
|
+
console.log(JSON.stringify({ action: "clear", target: "all" }, null, 2));
|
|
34
|
+
return;
|
|
35
|
+
case "memory":
|
|
36
|
+
cache.clearMemory();
|
|
37
|
+
console.log(JSON.stringify({ action: "clear", target: "memory" }, null, 2));
|
|
38
|
+
return;
|
|
39
|
+
case "file":
|
|
40
|
+
await cache.clearFileCache();
|
|
41
|
+
console.log(JSON.stringify({ action: "clear", target: "file" }, null, 2));
|
|
42
|
+
return;
|
|
43
|
+
default:
|
|
44
|
+
throw new Error(`unknown cache clear target: ${target}. Use "all", "memory", or "file".`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
default:
|
|
48
|
+
throw new Error(`unknown cache command: ${subcommand}. Run "cc98 cache --help" for usage.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function printCacheHelp() {
|
|
52
|
+
console.log(`cc98 cache
|
|
53
|
+
|
|
54
|
+
Usage:
|
|
55
|
+
cc98 cache stats Show cache statistics
|
|
56
|
+
cc98 cache cleanup Remove expired cache entries
|
|
57
|
+
cc98 cache clear [target] Clear cache (default: all)
|
|
58
|
+
|
|
59
|
+
Clear targets:
|
|
60
|
+
all Clear both memory and file cache
|
|
61
|
+
memory Clear memory cache only
|
|
62
|
+
file Clear file cache only
|
|
63
|
+
|
|
64
|
+
Options:
|
|
65
|
+
-h, --help Show this help
|
|
66
|
+
`);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/cli/commands/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAEnC,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,MAAM;YACT,cAAc,EAAE,CAAC;YACjB,OAAO;QAET,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;YAE/B,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,KAAK;oBACR,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBACzE,OAAO;gBACT,KAAK,QAAQ;oBACX,KAAK,CAAC,WAAW,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC5E,OAAO;gBACT,KAAK,MAAM;oBACT,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC1E,OAAO;gBACT;oBACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,mCAAmC,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,sCAAsC,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;CAcb,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAEA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAcjE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { checkForUpdate, formatUpdateResult } from "../../update.js";
|
|
2
|
+
export async function updateCommand(args) {
|
|
3
|
+
const [subcommand] = args;
|
|
4
|
+
if (subcommand === "--help" || subcommand === "-h" || subcommand === "help") {
|
|
5
|
+
printUpdateHelp();
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
if (subcommand !== undefined) {
|
|
9
|
+
throw new Error(`unknown update command: ${subcommand}. Run "cc98 update --help" for usage.`);
|
|
10
|
+
}
|
|
11
|
+
const result = await checkForUpdate();
|
|
12
|
+
console.log(formatUpdateResult(result));
|
|
13
|
+
}
|
|
14
|
+
function printUpdateHelp() {
|
|
15
|
+
console.log(`cc98 update
|
|
16
|
+
|
|
17
|
+
Usage:
|
|
18
|
+
cc98 update Check the latest GitHub Release
|
|
19
|
+
|
|
20
|
+
Options:
|
|
21
|
+
-h, --help Show this help
|
|
22
|
+
`);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IAE1B,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC5E,eAAe,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2BAA2B,UAAU,uCAAuC,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,CAAC,GAAG,CAAC;;;;;;;CAOb,CAAC,CAAC;AACH,CAAC"}
|
package/dist/cli/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/cli/router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/cli/router.ts"],"names":[],"mappings":"AAsCA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB1D"}
|