@bili-agent-kit/cli 0.1.0 → 0.2.1
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/NOTICE.md +3 -14
- package/README.md +7 -5
- package/dist/index.mjs +1 -1
- package/dist/main.mjs +1 -1
- package/dist/{src-_hsq7X7k.mjs → src-Bz4kcLrS.mjs} +10 -4
- package/dist/src-Bz4kcLrS.mjs.map +1 -0
- package/package.json +2 -2
- package/dist/src-_hsq7X7k.mjs.map +0 -1
package/NOTICE.md
CHANGED
|
@@ -1,18 +1,7 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Third-party notices
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
See LICENSE for copyright notices and MIT license terms.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
| Original file | Adaptation |
|
|
8
|
-
| ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
9
|
-
| tools/lib/bili-api.mjs | WBI mixing table, canonical signing and signed video endpoints in core/wbi.ts and core/client.ts |
|
|
10
|
-
| tools/lib/traffic.mjs | Conservative budgets, account isolation, persistent risk backoff and uncertain sends in core/traffic.ts and core/writes.ts |
|
|
11
|
-
| tools/lib/dm-history.mjs | Sequence pagination, same-second deduplication and fail-closed cursors in core/poll.ts |
|
|
12
|
-
| tools/commands/{search,subtitles,comments,comment,comment-del,dm,danmaku}.mjs | Read/write endpoints and form parameters |
|
|
13
|
-
|
|
14
|
-
Modified: strict TypeScript, injected credentials/storage/transport/clock, immutable drafts with separate administrator approval, shared SDK/JSON CLI/MCP schemas, explicit local configuration, typed errors, tests and packaging. Removed: DSH/Codex host integration, home-directory assumptions, persona, AI sessions, background scheduling, dashboard and automatic publication. No sibling-port source was used.
|
|
15
|
-
|
|
16
|
-
This is an independent, unofficial tool. Bilibili does not endorse or maintain it. Bilibili web interfaces may change without notice. The upstream repository references bilibili-API-collect; its documentation is not copied into this distribution.
|
|
5
|
+
This is an independent, unofficial tool. Bilibili does not endorse or maintain it. Bilibili web interfaces may change without notice.
|
|
17
6
|
|
|
18
7
|
ffmpeg is optional, separately installed, and not bundled. Its own LGPL/GPL terms depend on the chosen build: https://ffmpeg.org/legal.html. Node.js, Zod, MCP SDK, TypeScript, pnpm and Vite+ retain their respective licenses. The sponsorship image in the repository is reused from Cansiny0320/Nexlet at the owner's request; it is not included in the npm packages.
|
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# @bili-agent-kit/cli
|
|
2
2
|
|
|
3
|
-
JSON command line interface and trusted
|
|
3
|
+
JSON command line interface for discovery, content, media, events, approved writes and trusted account administration for bili-agent-kit. ESM; requires Node.js 22.18+, 24.11+ or 26+ (Node 23/25 unsupported).
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
|
-
npx --yes @bili-agent-kit/cli@0.1
|
|
7
|
-
npx --yes @bili-agent-kit/cli@0.1
|
|
8
|
-
npx --yes @bili-agent-kit/cli@0.1
|
|
6
|
+
npx --yes @bili-agent-kit/cli@0.2.1 help
|
|
7
|
+
npx --yes @bili-agent-kit/cli@0.2.1 --config ./config.local.json auth.login '{}'
|
|
8
|
+
npx --yes @bili-agent-kit/cli@0.2.1 --config ./config.local.json auth.status '{}'
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
Create `config.local.json` before login:
|
|
@@ -20,6 +20,8 @@ Create `config.local.json` before login:
|
|
|
20
20
|
|
|
21
21
|
Scan with the Bilibili app and confirm on your phone. QR/progress goes to stderr; stdout contains JSON. Login can save a PNG with `'{"png":"login-qr.png"}'`. Credentials are stored as a local plaintext file with restricted permissions; failed login preserves the previous file. `auth.logout '{}'` removes only local credentials, preserving history and other devices' sessions.
|
|
22
22
|
|
|
23
|
+
`help` lists the shared operation schemas. Trusted commands also include `auth.refresh-check` and `auth.refresh`; refresh is explicit, not scheduled. New interactions and open-platform submissions require action and target allowlists. Open-platform credentials are independent from QR login.
|
|
24
|
+
|
|
23
25
|
Writes are disabled by default. Administrator commands must be separated from model-controlled shell access. See [operations/configuration](https://github.com/Cansiny0320/bili-agent-kit/blob/main/docs/usage.md) and [security/recovery](https://github.com/Cansiny0320/bili-agent-kit/blob/main/SECURITY.md).
|
|
24
26
|
|
|
25
|
-
MIT;
|
|
27
|
+
MIT; see LICENSE and NOTICE.md. Not affiliated with Bilibili.
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { t as runCli } from "./src-
|
|
1
|
+
export { t as runCli } from "./src-Bz4kcLrS.mjs";
|
package/dist/main.mjs
CHANGED
|
@@ -8,9 +8,13 @@ async function runAuthCli(config, name, input, options = {}) {
|
|
|
8
8
|
if (![
|
|
9
9
|
"auth.login",
|
|
10
10
|
"auth.status",
|
|
11
|
-
"auth.logout"
|
|
11
|
+
"auth.logout",
|
|
12
|
+
"auth.refresh-check",
|
|
13
|
+
"auth.refresh"
|
|
12
14
|
].includes(name) || Object.keys(args).some((k) => name !== "auth.login" || k !== "png") || args.png !== void 0 && (typeof args.png !== "string" || !args.png.length)) throw new KitError("INVALID_INPUT", "Use auth.login {\"png\":\"optional-new-file.png\"}, auth.status {} or auth.logout {}.");
|
|
13
15
|
const auth = await (options.load ?? loadAuth)(config);
|
|
16
|
+
if (name === "auth.refresh-check") return auth.refreshCheck(options.signal);
|
|
17
|
+
if (name === "auth.refresh") return auth.refresh(options.signal);
|
|
14
18
|
if (name === "auth.status") return auth.status(options.signal);
|
|
15
19
|
if (name === "auth.logout") return auth.logout();
|
|
16
20
|
if (typeof args.png === "string") {
|
|
@@ -62,11 +66,13 @@ async function runCli(argv, stdin, load = loadKit, authOptions = {}) {
|
|
|
62
66
|
version: 1,
|
|
63
67
|
ok: true,
|
|
64
68
|
data: {
|
|
65
|
-
usage: "bili-agent --config config.local.json <operation|auth.login|auth.status|auth.logout|admin.approve|admin.reconcile|admin.resume> <JSON|->",
|
|
69
|
+
usage: "bili-agent --config config.local.json <operation|auth.login|auth.status|auth.logout|auth.refresh-check|auth.refresh|admin.approve|admin.reconcile|admin.resume> <JSON|->",
|
|
66
70
|
auth: {
|
|
67
71
|
"auth.login": { png: "optional new PNG path" },
|
|
68
72
|
"auth.status": {},
|
|
69
|
-
"auth.logout": {}
|
|
73
|
+
"auth.logout": {},
|
|
74
|
+
"auth.refresh-check": {},
|
|
75
|
+
"auth.refresh": {}
|
|
70
76
|
},
|
|
71
77
|
operations: describeOperations()
|
|
72
78
|
}
|
|
@@ -104,4 +110,4 @@ async function runCli(argv, stdin, load = loadKit, authOptions = {}) {
|
|
|
104
110
|
}
|
|
105
111
|
export { runCli as t };
|
|
106
112
|
|
|
107
|
-
//# sourceMappingURL=src-
|
|
113
|
+
//# sourceMappingURL=src-Bz4kcLrS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src-Bz4kcLrS.mjs","names":[],"sources":["../src/auth.ts","../src/index.ts"],"sourcesContent":["import QRCode from \"qrcode\";\nimport { resolve } from \"node:path\";\nimport {\n loadAuth,\n writePrivateFile,\n KitError,\n FileStore,\n type FileAuth,\n} from \"@bili-agent-kit/core\";\n\nexport interface AuthCliOptions {\n load?: (path: string) => Promise<FileAuth>;\n stderr?: (text: string) => void;\n signal?: AbortSignal;\n}\nexport async function runAuthCli(\n config: string,\n name: string,\n input: unknown,\n options: AuthCliOptions = {},\n): Promise<unknown> {\n if (!input || typeof input !== \"object\" || Array.isArray(input))\n throw new KitError(\"INVALID_INPUT\", \"Auth input must be an object.\");\n const args = input as Record<string, unknown>;\n if (\n ![\"auth.login\", \"auth.status\", \"auth.logout\", \"auth.refresh-check\", \"auth.refresh\"].includes(\n name,\n ) ||\n Object.keys(args).some((k) => name !== \"auth.login\" || k !== \"png\") ||\n (args.png !== undefined && (typeof args.png !== \"string\" || !args.png.length))\n )\n throw new KitError(\n \"INVALID_INPUT\",\n 'Use auth.login {\"png\":\"optional-new-file.png\"}, auth.status {} or auth.logout {}.',\n );\n const auth = await (options.load ?? loadAuth)(config);\n if (name === \"auth.refresh-check\") return auth.refreshCheck(options.signal);\n if (name === \"auth.refresh\") return auth.refresh(options.signal);\n if (name === \"auth.status\") return auth.status(options.signal);\n if (name === \"auth.logout\") return auth.logout();\n if (typeof args.png === \"string\") {\n const normalize = (path: string) =>\n process.platform === \"win32\" ? resolve(path).toLowerCase() : resolve(path);\n const reserved = [config, auth.credentials.path, `${auth.credentials.path}.lock`];\n if (auth.store instanceof FileStore)\n reserved.push(\n resolve(auth.store.directory, \"state.json\"),\n resolve(auth.store.directory, \"state.json.lock\"),\n );\n if (reserved.some((path) => normalize(path) === normalize(args.png as string)))\n throw new KitError(\n \"INVALID_INPUT\",\n \"Choose a PNG path separate from configuration, credentials and state.\",\n );\n }\n const stderr =\n options.stderr ??\n ((text) => {\n process.stderr.write(text);\n });\n let previous = \"\";\n return auth.login({\n ...(options.signal ? { signal: options.signal } : {}),\n onQr: async (qr) => {\n if (typeof args.png === \"string\") {\n const path = resolve(args.png);\n await writePrivateFile(\n path,\n await QRCode.toBuffer(qr.url, { type: \"png\", margin: 4, scale: 6 }),\n );\n stderr(`二维码已保存到 ${path}\\n`);\n }\n stderr(await QRCode.toString(qr.url, { type: \"terminal\", small: true }));\n stderr(\"请用哔哩哔哩 App 扫码并在手机上确认。Ctrl+C 取消。\\n\");\n },\n onStatus: (status) => {\n if (previous === status) return;\n previous = status;\n stderr(status === \"scanned\" ? \"已扫码,等待手机确认。\\n\" : \"等待扫码。\\n\");\n },\n });\n}\n","import {\n loadKit,\n invoke,\n describeOperations,\n envelope,\n KitError,\n type BiliKit,\n type Envelope,\n} from \"@bili-agent-kit/core\";\nimport { runAuthCli, type AuthCliOptions } from \"./auth.js\";\n\nexport async function runCli(\n argv: string[],\n stdin: () => Promise<string>,\n load: (path: string) => Promise<BiliKit> = loadKit,\n authOptions: AuthCliOptions = {},\n): Promise<Envelope<unknown>> {\n if (argv.length === 1 && [\"help\", \"--help\", \"list\"].includes(argv[0] ?? \"\"))\n return {\n version: 1,\n ok: true,\n data: {\n usage:\n \"bili-agent --config config.local.json <operation|auth.login|auth.status|auth.logout|auth.refresh-check|auth.refresh|admin.approve|admin.reconcile|admin.resume> <JSON|->\",\n auth: {\n \"auth.login\": { png: \"optional new PNG path\" },\n \"auth.status\": {},\n \"auth.logout\": {},\n \"auth.refresh-check\": {},\n \"auth.refresh\": {},\n },\n operations: describeOperations(),\n },\n };\n return envelope(async () => {\n if (argv[0] !== \"--config\" || !argv[1] || !argv[2] || argv.length !== 4)\n throw new KitError(\n \"INVALID_INPUT\",\n \"Expected --config <file> <operation> <JSON|->. Use help for schemas.\",\n );\n const [, , name, argument] = argv;\n const raw = argument === \"-\" ? await stdin() : (argument ?? \"\");\n if (raw.length > 1024 * 1024) throw new KitError(\"INVALID_INPUT\", \"JSON input exceeds 1 MiB.\");\n let input: unknown;\n try {\n input = JSON.parse(raw);\n } catch {\n throw new KitError(\"INVALID_INPUT\", \"Input must be valid JSON.\");\n }\n if (name?.startsWith(\"auth.\")) return runAuthCli(argv[1], name, input, authOptions);\n const kit = await load(argv[1]);\n if (name?.startsWith(\"admin.\")) {\n if (!input || typeof input !== \"object\" || Array.isArray(input))\n throw new KitError(\"INVALID_INPUT\", \"Admin input must be an object.\");\n const obj = input as Record<string, unknown>;\n const exact = (keys: string[]) =>\n Object.keys(obj).length === keys.length && keys.every((k) => typeof obj[k] === \"string\");\n if (name === \"admin.approve\" && exact([\"draftId\", \"digest\", \"by\"]))\n return kit.admin.approve(String(obj.draftId), String(obj.digest), String(obj.by));\n if (\n name === \"admin.reconcile\" &&\n exact([\"draftId\", \"outcome\"]) &&\n (obj.outcome === \"sent\" || obj.outcome === \"not-sent\")\n )\n return kit.admin.reconcile(String(obj.draftId), obj.outcome);\n if (name === \"admin.resume\" && exact([])) return kit.admin.resumeAccount();\n throw new KitError(\"INVALID_INPUT\", \"Unknown administrator command or invalid arguments.\");\n }\n const result = await invoke(kit, name ?? \"\", input);\n if (!result.ok) throw new KitError(result.error.code, result.error.message);\n return result.data;\n });\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bili-agent-kit/cli",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "JSON CLI for bili-agent-kit",
|
|
5
5
|
"homepage": "https://github.com/Cansiny0320/bili-agent-kit#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"registry": "https://registry.npmjs.org/"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@bili-agent-kit/core": "0.1
|
|
35
|
+
"@bili-agent-kit/core": "0.2.1",
|
|
36
36
|
"qrcode": "1.5.4"
|
|
37
37
|
},
|
|
38
38
|
"engines": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"src-_hsq7X7k.mjs","names":[],"sources":["../src/auth.ts","../src/index.ts"],"sourcesContent":["import QRCode from \"qrcode\";\nimport { resolve } from \"node:path\";\nimport {\n loadAuth,\n writePrivateFile,\n KitError,\n FileStore,\n type FileAuth,\n} from \"@bili-agent-kit/core\";\n\nexport interface AuthCliOptions {\n load?: (path: string) => Promise<FileAuth>;\n stderr?: (text: string) => void;\n signal?: AbortSignal;\n}\nexport async function runAuthCli(\n config: string,\n name: string,\n input: unknown,\n options: AuthCliOptions = {},\n): Promise<unknown> {\n if (!input || typeof input !== \"object\" || Array.isArray(input))\n throw new KitError(\"INVALID_INPUT\", \"Auth input must be an object.\");\n const args = input as Record<string, unknown>;\n if (\n ![\"auth.login\", \"auth.status\", \"auth.logout\"].includes(name) ||\n Object.keys(args).some((k) => name !== \"auth.login\" || k !== \"png\") ||\n (args.png !== undefined && (typeof args.png !== \"string\" || !args.png.length))\n )\n throw new KitError(\n \"INVALID_INPUT\",\n 'Use auth.login {\"png\":\"optional-new-file.png\"}, auth.status {} or auth.logout {}.',\n );\n const auth = await (options.load ?? loadAuth)(config);\n if (name === \"auth.status\") return auth.status(options.signal);\n if (name === \"auth.logout\") return auth.logout();\n if (typeof args.png === \"string\") {\n const normalize = (path: string) =>\n process.platform === \"win32\" ? resolve(path).toLowerCase() : resolve(path);\n const reserved = [config, auth.credentials.path, `${auth.credentials.path}.lock`];\n if (auth.store instanceof FileStore)\n reserved.push(\n resolve(auth.store.directory, \"state.json\"),\n resolve(auth.store.directory, \"state.json.lock\"),\n );\n if (reserved.some((path) => normalize(path) === normalize(args.png as string)))\n throw new KitError(\n \"INVALID_INPUT\",\n \"Choose a PNG path separate from configuration, credentials and state.\",\n );\n }\n const stderr =\n options.stderr ??\n ((text) => {\n process.stderr.write(text);\n });\n let previous = \"\";\n return auth.login({\n ...(options.signal ? { signal: options.signal } : {}),\n onQr: async (qr) => {\n if (typeof args.png === \"string\") {\n const path = resolve(args.png);\n await writePrivateFile(\n path,\n await QRCode.toBuffer(qr.url, { type: \"png\", margin: 4, scale: 6 }),\n );\n stderr(`二维码已保存到 ${path}\\n`);\n }\n stderr(await QRCode.toString(qr.url, { type: \"terminal\", small: true }));\n stderr(\"请用哔哩哔哩 App 扫码并在手机上确认。Ctrl+C 取消。\\n\");\n },\n onStatus: (status) => {\n if (previous === status) return;\n previous = status;\n stderr(status === \"scanned\" ? \"已扫码,等待手机确认。\\n\" : \"等待扫码。\\n\");\n },\n });\n}\n","import {\n loadKit,\n invoke,\n describeOperations,\n envelope,\n KitError,\n type BiliKit,\n type Envelope,\n} from \"@bili-agent-kit/core\";\nimport { runAuthCli, type AuthCliOptions } from \"./auth.js\";\n\nexport async function runCli(\n argv: string[],\n stdin: () => Promise<string>,\n load: (path: string) => Promise<BiliKit> = loadKit,\n authOptions: AuthCliOptions = {},\n): Promise<Envelope<unknown>> {\n if (argv.length === 1 && [\"help\", \"--help\", \"list\"].includes(argv[0] ?? \"\"))\n return {\n version: 1,\n ok: true,\n data: {\n usage:\n \"bili-agent --config config.local.json <operation|auth.login|auth.status|auth.logout|admin.approve|admin.reconcile|admin.resume> <JSON|->\",\n auth: {\n \"auth.login\": { png: \"optional new PNG path\" },\n \"auth.status\": {},\n \"auth.logout\": {},\n },\n operations: describeOperations(),\n },\n };\n return envelope(async () => {\n if (argv[0] !== \"--config\" || !argv[1] || !argv[2] || argv.length !== 4)\n throw new KitError(\n \"INVALID_INPUT\",\n \"Expected --config <file> <operation> <JSON|->. Use help for schemas.\",\n );\n const [, , name, argument] = argv;\n const raw = argument === \"-\" ? await stdin() : (argument ?? \"\");\n if (raw.length > 1024 * 1024) throw new KitError(\"INVALID_INPUT\", \"JSON input exceeds 1 MiB.\");\n let input: unknown;\n try {\n input = JSON.parse(raw);\n } catch {\n throw new KitError(\"INVALID_INPUT\", \"Input must be valid JSON.\");\n }\n if (name?.startsWith(\"auth.\")) return runAuthCli(argv[1], name, input, authOptions);\n const kit = await load(argv[1]);\n if (name?.startsWith(\"admin.\")) {\n if (!input || typeof input !== \"object\" || Array.isArray(input))\n throw new KitError(\"INVALID_INPUT\", \"Admin input must be an object.\");\n const obj = input as Record<string, unknown>;\n const exact = (keys: string[]) =>\n Object.keys(obj).length === keys.length && keys.every((k) => typeof obj[k] === \"string\");\n if (name === \"admin.approve\" && exact([\"draftId\", \"digest\", \"by\"]))\n return kit.admin.approve(String(obj.draftId), String(obj.digest), String(obj.by));\n if (\n name === \"admin.reconcile\" &&\n exact([\"draftId\", \"outcome\"]) &&\n (obj.outcome === \"sent\" || obj.outcome === \"not-sent\")\n )\n return kit.admin.reconcile(String(obj.draftId), obj.outcome);\n if (name === \"admin.resume\" && exact([])) return kit.admin.resumeAccount();\n throw new KitError(\"INVALID_INPUT\", \"Unknown administrator command or invalid arguments.\");\n }\n const result = await invoke(kit, name ?? \"\", input);\n if (!result.ok) throw new KitError(result.error.code, result.error.message);\n return result.data;\n });\n}\n"],"mappings":"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"}
|