@visiblebase/manager 0.1.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/README.md +33 -0
- package/bin/admin/auth-error.d.ts +30 -0
- package/bin/admin/auth-error.d.ts.map +1 -0
- package/bin/admin/auth-error.js +45 -0
- package/bin/admin/auth-error.js.map +1 -0
- package/bin/admin/commands/accounts.d.ts +6 -0
- package/bin/admin/commands/accounts.d.ts.map +1 -0
- package/bin/admin/commands/accounts.js +44 -0
- package/bin/admin/commands/accounts.js.map +1 -0
- package/bin/admin/commands/balance.d.ts +6 -0
- package/bin/admin/commands/balance.d.ts.map +1 -0
- package/bin/admin/commands/balance.js +100 -0
- package/bin/admin/commands/balance.js.map +1 -0
- package/bin/admin/commands/config.d.ts +9 -0
- package/bin/admin/commands/config.d.ts.map +1 -0
- package/bin/admin/commands/config.js +55 -0
- package/bin/admin/commands/config.js.map +1 -0
- package/bin/admin/commands/custom.d.ts +6 -0
- package/bin/admin/commands/custom.d.ts.map +1 -0
- package/bin/admin/commands/custom.js +47 -0
- package/bin/admin/commands/custom.js.map +1 -0
- package/bin/admin/commands/models.d.ts +14 -0
- package/bin/admin/commands/models.d.ts.map +1 -0
- package/bin/admin/commands/models.js +56 -0
- package/bin/admin/commands/models.js.map +1 -0
- package/bin/admin/commands/payment.d.ts +6 -0
- package/bin/admin/commands/payment.d.ts.map +1 -0
- package/bin/admin/commands/payment.js +33 -0
- package/bin/admin/commands/payment.js.map +1 -0
- package/bin/admin/commands/plugin-env.d.ts +11 -0
- package/bin/admin/commands/plugin-env.d.ts.map +1 -0
- package/bin/admin/commands/plugin-env.js +283 -0
- package/bin/admin/commands/plugin-env.js.map +1 -0
- package/bin/admin/commands/products.d.ts +6 -0
- package/bin/admin/commands/products.d.ts.map +1 -0
- package/bin/admin/commands/products.js +77 -0
- package/bin/admin/commands/products.js.map +1 -0
- package/bin/admin/commands/usage.d.ts +6 -0
- package/bin/admin/commands/usage.d.ts.map +1 -0
- package/bin/admin/commands/usage.js +44 -0
- package/bin/admin/commands/usage.js.map +1 -0
- package/bin/admin/loop.d.ts +6 -0
- package/bin/admin/loop.d.ts.map +1 -0
- package/bin/admin/loop.js +75 -0
- package/bin/admin/loop.js.map +1 -0
- package/bin/agent/pi-agent.d.ts +15 -0
- package/bin/agent/pi-agent.d.ts.map +1 -0
- package/bin/agent/pi-agent.js +136 -0
- package/bin/agent/pi-agent.js.map +1 -0
- package/bin/app.d.ts +13 -0
- package/bin/app.d.ts.map +1 -0
- package/bin/app.js +67 -0
- package/bin/app.js.map +1 -0
- package/bin/auth/admin.d.ts +8 -0
- package/bin/auth/admin.d.ts.map +1 -0
- package/bin/auth/admin.js +24 -0
- package/bin/auth/admin.js.map +1 -0
- package/bin/auth/mode-select.d.ts +12 -0
- package/bin/auth/mode-select.d.ts.map +1 -0
- package/bin/auth/mode-select.js +30 -0
- package/bin/auth/mode-select.js.map +1 -0
- package/bin/auth/server-switch.d.ts +16 -0
- package/bin/auth/server-switch.d.ts.map +1 -0
- package/bin/auth/server-switch.js +98 -0
- package/bin/auth/server-switch.js.map +1 -0
- package/bin/auth/user.d.ts +21 -0
- package/bin/auth/user.d.ts.map +1 -0
- package/bin/auth/user.js +223 -0
- package/bin/auth/user.js.map +1 -0
- package/bin/core/env.d.ts +15 -0
- package/bin/core/env.d.ts.map +1 -0
- package/bin/core/env.js +67 -0
- package/bin/core/env.js.map +1 -0
- package/bin/core/session.d.ts +53 -0
- package/bin/core/session.d.ts.map +1 -0
- package/bin/core/session.js +118 -0
- package/bin/core/session.js.map +1 -0
- package/bin/core/ui.d.ts +29 -0
- package/bin/core/ui.d.ts.map +1 -0
- package/bin/core/ui.js +58 -0
- package/bin/core/ui.js.map +1 -0
- package/bin/user/balance.d.ts +19 -0
- package/bin/user/balance.d.ts.map +1 -0
- package/bin/user/balance.js +62 -0
- package/bin/user/balance.js.map +1 -0
- package/bin/user/chat.d.ts +12 -0
- package/bin/user/chat.d.ts.map +1 -0
- package/bin/user/chat.js +70 -0
- package/bin/user/chat.js.map +1 -0
- package/bin/user/loop.d.ts +13 -0
- package/bin/user/loop.d.ts.map +1 -0
- package/bin/user/loop.js +87 -0
- package/bin/user/loop.js.map +1 -0
- package/bin/user/models.d.ts +10 -0
- package/bin/user/models.d.ts.map +1 -0
- package/bin/user/models.js +39 -0
- package/bin/user/models.js.map +1 -0
- package/package.json +52 -0
package/README.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# @visiblebase/manager
|
|
2
|
+
|
|
3
|
+
`@visiblebase/manager` 是 VisibleBase 的交互式终端代理。
|
|
4
|
+
|
|
5
|
+
它把管理侧和用户侧的常见操作收口到一个 `visiblebase` 命令里,适合本地调试、初始化 Base、切换身份、查看模型以及直接体验产品侧调用。
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm i -g @visiblebase/manager
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 使用
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
visiblebase
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
默认会进入交互式终端界面,你可以:
|
|
20
|
+
|
|
21
|
+
- 切换 Base 服务端
|
|
22
|
+
- 以 Admin 身份管理 env、models、products、accounts、usage、payment
|
|
23
|
+
- 以 User 身份登录并直接体验 chat、models、service 调用
|
|
24
|
+
|
|
25
|
+
## 依赖关系
|
|
26
|
+
|
|
27
|
+
- `@visiblebase/manager` 负责终端里的交互入口
|
|
28
|
+
- `@visiblebase/client` 负责真正的 SDK 调用边界
|
|
29
|
+
|
|
30
|
+
## 文档
|
|
31
|
+
|
|
32
|
+
- 仓库首页:[visiblebase](https://github.com/wangenius/visiblebase)
|
|
33
|
+
- 文档目录:[homepage/content/docs](https://github.com/wangenius/visiblebase/tree/main/homepage/content/docs)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin 鉴权错误工具。
|
|
3
|
+
*
|
|
4
|
+
* 关键说明(中文)
|
|
5
|
+
* - 当 admin key 不正确或已失效时,SDK 会把请求失败包装成带 `status` 的 Error。
|
|
6
|
+
* - 这里统一把 401 转成可识别的 AdminAuthError,方便外层清理缓存 session 并提示重新输入。
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* admin key 无效时给用户展示的统一提示。
|
|
10
|
+
*/
|
|
11
|
+
export declare const ADMIN_AUTH_INVALID_MESSAGE = "Current server admin key is incorrect or expired. Please set it again.";
|
|
12
|
+
/**
|
|
13
|
+
* admin 鉴权失效错误。
|
|
14
|
+
*/
|
|
15
|
+
export declare class AdminAuthError extends Error {
|
|
16
|
+
constructor(message?: string);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 判断当前错误是否是 admin 鉴权失效。
|
|
20
|
+
*/
|
|
21
|
+
export declare function isAdminAuthError(error: unknown): error is AdminAuthError;
|
|
22
|
+
/**
|
|
23
|
+
* 如果底层错误是 401,则提升为 AdminAuthError。
|
|
24
|
+
*/
|
|
25
|
+
export declare function rethrowAdminAuthError(error: unknown): void;
|
|
26
|
+
/**
|
|
27
|
+
* 提取可展示的错误文本。
|
|
28
|
+
*/
|
|
29
|
+
export declare function adminErrorMessage(error: unknown): string;
|
|
30
|
+
//# sourceMappingURL=auth-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-error.d.ts","sourceRoot":"","sources":["../../src/admin/auth-error.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,eAAO,MAAM,0BAA0B,2EACmC,CAAC;AAO3E;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,SAA6B;CAIjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAExE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAK1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKxD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin 鉴权错误工具。
|
|
3
|
+
*
|
|
4
|
+
* 关键说明(中文)
|
|
5
|
+
* - 当 admin key 不正确或已失效时,SDK 会把请求失败包装成带 `status` 的 Error。
|
|
6
|
+
* - 这里统一把 401 转成可识别的 AdminAuthError,方便外层清理缓存 session 并提示重新输入。
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* admin key 无效时给用户展示的统一提示。
|
|
10
|
+
*/
|
|
11
|
+
export const ADMIN_AUTH_INVALID_MESSAGE = "Current server admin key is incorrect or expired. Please set it again.";
|
|
12
|
+
/**
|
|
13
|
+
* admin 鉴权失效错误。
|
|
14
|
+
*/
|
|
15
|
+
export class AdminAuthError extends Error {
|
|
16
|
+
constructor(message = ADMIN_AUTH_INVALID_MESSAGE) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = "AdminAuthError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 判断当前错误是否是 admin 鉴权失效。
|
|
23
|
+
*/
|
|
24
|
+
export function isAdminAuthError(error) {
|
|
25
|
+
return error instanceof AdminAuthError;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 如果底层错误是 401,则提升为 AdminAuthError。
|
|
29
|
+
*/
|
|
30
|
+
export function rethrowAdminAuthError(error) {
|
|
31
|
+
const status = error?.status;
|
|
32
|
+
if (status === 401) {
|
|
33
|
+
throw new AdminAuthError();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 提取可展示的错误文本。
|
|
38
|
+
*/
|
|
39
|
+
export function adminErrorMessage(error) {
|
|
40
|
+
if (error instanceof Error) {
|
|
41
|
+
return error.message;
|
|
42
|
+
}
|
|
43
|
+
return String(error);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=auth-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-error.js","sourceRoot":"","sources":["../../src/admin/auth-error.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GACrC,wEAAwE,CAAC;AAO3E;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAO,GAAG,0BAA0B;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,KAAK,YAAY,cAAc,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,MAAM,GAAI,KAAqC,EAAE,MAAM,CAAC;IAC9D,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,MAAM,IAAI,cAAc,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/admin/commands/accounts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKlD,wBAAsB,cAAc,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkClE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Accounts 管理命令。
|
|
3
|
+
*/
|
|
4
|
+
import { select, isCancel } from "@clack/prompts";
|
|
5
|
+
import { showError } from "../../core/ui.js";
|
|
6
|
+
import { adminErrorMessage, rethrowAdminAuthError } from "../auth-error.js";
|
|
7
|
+
export async function manageAccounts(a) {
|
|
8
|
+
const svc = a.service("accounts");
|
|
9
|
+
while (true) {
|
|
10
|
+
const act = await select({
|
|
11
|
+
message: "Accounts",
|
|
12
|
+
options: [
|
|
13
|
+
{ label: "List users", value: "users" },
|
|
14
|
+
{ label: "List sessions", value: "sessions" },
|
|
15
|
+
{ label: "Back", value: "back" },
|
|
16
|
+
],
|
|
17
|
+
});
|
|
18
|
+
if (!act || isCancel(act) || act === "back")
|
|
19
|
+
return;
|
|
20
|
+
try {
|
|
21
|
+
if (act === "users") {
|
|
22
|
+
const b = await svc.get("users");
|
|
23
|
+
console.log(`\n${b.items.length} users:\n`);
|
|
24
|
+
for (const u of b.items) {
|
|
25
|
+
console.log(` ${u.user_id.padEnd(30)} ${u.email.padEnd(30)} ${u.created_at.slice(0, 10)}`);
|
|
26
|
+
}
|
|
27
|
+
console.log("");
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const b = await svc.get("sessions");
|
|
31
|
+
console.log(`\n${b.items.length} sessions:\n`);
|
|
32
|
+
for (const s of b.items) {
|
|
33
|
+
console.log(` ${s.session_id.padEnd(36)} ${s.user_id.padEnd(30)} [${s.status}]`);
|
|
34
|
+
}
|
|
35
|
+
console.log("");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
rethrowAdminAuthError(e);
|
|
40
|
+
showError(adminErrorMessage(e));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/admin/commands/accounts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,CAAc;IACjD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;YACvB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE;gBACvC,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE;gBAC7C,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aACjC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO;QAEpD,IAAI,CAAC;YACH,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,CAAsE,OAAO,CAAC,CAAC;gBACtG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC;gBAC5C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC9F,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,CAAuE,UAAU,CAAC,CAAC;gBAC1G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,cAAc,CAAC,CAAC;gBAC/C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBACpF,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACzB,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../../src/admin/commands/balance.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAgDlD,wBAAsB,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FjE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Balance 管理命令。
|
|
3
|
+
*/
|
|
4
|
+
import { isCancel, select } from "@clack/prompts";
|
|
5
|
+
import { askText, showError, showSuccess } from "../../core/ui.js";
|
|
6
|
+
import { adminErrorMessage, rethrowAdminAuthError } from "../auth-error.js";
|
|
7
|
+
export async function manageBalance(a) {
|
|
8
|
+
const svc = a.service("balance");
|
|
9
|
+
while (true) {
|
|
10
|
+
const act = await select({
|
|
11
|
+
message: "Balance",
|
|
12
|
+
options: [
|
|
13
|
+
{ label: "List users", value: "users" },
|
|
14
|
+
{ label: "History", value: "history" },
|
|
15
|
+
{ label: "Topups", value: "topups" },
|
|
16
|
+
{ label: "Add balance", value: "add" },
|
|
17
|
+
{ label: "Subtract balance", value: "sub" },
|
|
18
|
+
{ label: "Finish topup", value: "finish" },
|
|
19
|
+
{ label: "Cancel topup", value: "cancel" },
|
|
20
|
+
{ label: "Back", value: "back" },
|
|
21
|
+
],
|
|
22
|
+
});
|
|
23
|
+
if (!act || isCancel(act) || act === "back")
|
|
24
|
+
return;
|
|
25
|
+
try {
|
|
26
|
+
if (act === "users") {
|
|
27
|
+
const response = await svc.get("users", { limit: 30 });
|
|
28
|
+
console.log(`\n${response.items.length} balance accounts:\n`);
|
|
29
|
+
for (const item of response.items) {
|
|
30
|
+
console.log(` ${item.user_id.padEnd(28)} ${String(item.balance).padStart(8)} ${item.unit.padEnd(10)} ${item.updated_at.slice(0, 19)}`);
|
|
31
|
+
}
|
|
32
|
+
console.log("");
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (act === "history") {
|
|
36
|
+
const userId = await askText("user_id (optional)");
|
|
37
|
+
const response = await svc.get("history", {
|
|
38
|
+
limit: 30,
|
|
39
|
+
user_id: userId ?? "",
|
|
40
|
+
});
|
|
41
|
+
console.log(`\n${response.items.length} balance history entries:\n`);
|
|
42
|
+
for (const item of response.items) {
|
|
43
|
+
console.log(` ${item.created_at.slice(0, 19)} ${item.user_id.padEnd(20)} ${item.kind.padEnd(8)} ${String(item.amount).padStart(6)} -> ${String(item.balance_after).padStart(6)} ${item.note}`);
|
|
44
|
+
}
|
|
45
|
+
console.log("");
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (act === "topups") {
|
|
49
|
+
const userId = await askText("user_id (optional)");
|
|
50
|
+
const response = await svc.get("topups", {
|
|
51
|
+
limit: 30,
|
|
52
|
+
user_id: userId ?? "",
|
|
53
|
+
});
|
|
54
|
+
console.log(`\n${response.items.length} topup orders:\n`);
|
|
55
|
+
for (const item of response.items) {
|
|
56
|
+
console.log(` ${item.topup_id.padEnd(24)} ${item.user_id.padEnd(20)} ${String(item.amount).padStart(6)} ${item.unit.padEnd(10)} [${item.status}] ${item.note}`);
|
|
57
|
+
}
|
|
58
|
+
console.log("");
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (act === "add" || act === "sub") {
|
|
62
|
+
const userId = await askText("user_id");
|
|
63
|
+
if (!userId)
|
|
64
|
+
continue;
|
|
65
|
+
const rawAmount = await askText("amount");
|
|
66
|
+
if (!rawAmount)
|
|
67
|
+
continue;
|
|
68
|
+
const amount = Number(rawAmount);
|
|
69
|
+
if (!Number.isInteger(amount) || amount <= 0) {
|
|
70
|
+
showError("amount must be a positive integer");
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const note = await askText("note (optional)");
|
|
74
|
+
const path = act === "add" ? "add" : "sub";
|
|
75
|
+
const account = await svc.action(path).invoke({
|
|
76
|
+
user_id: userId,
|
|
77
|
+
amount,
|
|
78
|
+
note: note ?? "",
|
|
79
|
+
});
|
|
80
|
+
showSuccess(`balance updated: ${account.user_id} -> ${account.balance} ${account.unit}`);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const topupId = await askText("topup_id");
|
|
84
|
+
if (!topupId)
|
|
85
|
+
continue;
|
|
86
|
+
const note = await askText("note (optional)");
|
|
87
|
+
const path = act === "finish" ? "topups/finish" : "topups/cancel";
|
|
88
|
+
const topup = await svc.action(path).invoke({
|
|
89
|
+
topup_id: topupId,
|
|
90
|
+
note: note ?? "",
|
|
91
|
+
});
|
|
92
|
+
showSuccess(`topup updated: ${topup.topup_id} -> ${topup.status}`);
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
rethrowAdminAuthError(e);
|
|
96
|
+
showError(adminErrorMessage(e));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../../src/admin/commands/balance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin 服务端管理命令。
|
|
3
|
+
*
|
|
4
|
+
* 支持多服务端地址:列表、切换、添加、删除。
|
|
5
|
+
* 切换后清除当前 session 提示重新鉴权。
|
|
6
|
+
*/
|
|
7
|
+
import { type AdminSession } from "../../core/session.js";
|
|
8
|
+
export declare function changeServerUrl(session: AdminSession): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/admin/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA+D,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAKvH,wBAAsB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B1E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin 服务端管理命令。
|
|
3
|
+
*
|
|
4
|
+
* 支持多服务端地址:列表、切换、添加、删除。
|
|
5
|
+
* 切换后清除当前 session 提示重新鉴权。
|
|
6
|
+
*/
|
|
7
|
+
import { readConfig, switchServer, removeServer, clearServerSessions } from "../../core/session.js";
|
|
8
|
+
import { promptAddServer } from "../../auth/server-switch.js";
|
|
9
|
+
import { showSuccess, showError } from "../../core/ui.js";
|
|
10
|
+
import { isCancel, select } from "@clack/prompts";
|
|
11
|
+
export async function changeServerUrl(session) {
|
|
12
|
+
while (true) {
|
|
13
|
+
const config = readConfig();
|
|
14
|
+
const choices = config.servers.map((s) => ({
|
|
15
|
+
label: s.url === config.base_url ? `★ ${s.name}` : ` ${s.name}`,
|
|
16
|
+
value: s.url,
|
|
17
|
+
hint: s.url,
|
|
18
|
+
}));
|
|
19
|
+
choices.push({ label: "Add new server...", value: "__add__", hint: "" }, { label: "Delete server...", value: "__del__", hint: "" });
|
|
20
|
+
const selected = await select({ message: "Servers (★ active)", options: choices });
|
|
21
|
+
if (!selected || isCancel(selected))
|
|
22
|
+
return;
|
|
23
|
+
if (selected === "__add__") {
|
|
24
|
+
await promptAddServer();
|
|
25
|
+
}
|
|
26
|
+
else if (selected === "__del__") {
|
|
27
|
+
await promptDeleteServer(config);
|
|
28
|
+
}
|
|
29
|
+
else if (selected !== config.base_url) {
|
|
30
|
+
const oldUrl = config.base_url;
|
|
31
|
+
switchServer(selected);
|
|
32
|
+
clearServerSessions(oldUrl);
|
|
33
|
+
showSuccess(`Switched to ${selected}. Please re-authenticate.`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async function promptDeleteServer(config) {
|
|
39
|
+
if (config.servers.length <= 1) {
|
|
40
|
+
showError("Cannot delete the only server");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const choices = config.servers.map((s) => ({
|
|
44
|
+
label: `${s.name} (${s.url})`,
|
|
45
|
+
value: s.url,
|
|
46
|
+
hint: s.url === config.base_url ? "★ active" : "",
|
|
47
|
+
}));
|
|
48
|
+
choices.push({ label: "Cancel", value: "__cancel__", hint: "" });
|
|
49
|
+
const selected = await select({ message: "Delete server", options: choices });
|
|
50
|
+
if (!selected || isCancel(selected) || selected === "__cancel__")
|
|
51
|
+
return;
|
|
52
|
+
removeServer(selected);
|
|
53
|
+
showSuccess(`Removed: ${selected}`);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/admin/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../../src/admin/commands/custom.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKlD,wBAAsB,YAAY,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Custom Service 命令。
|
|
3
|
+
*/
|
|
4
|
+
import { select, isCancel } from "@clack/prompts";
|
|
5
|
+
import { askText, showError } from "../../core/ui.js";
|
|
6
|
+
import { adminErrorMessage, rethrowAdminAuthError } from "../auth-error.js";
|
|
7
|
+
export async function manageCustom(a) {
|
|
8
|
+
while (true) {
|
|
9
|
+
const name = await askText("service name (empty to go back)");
|
|
10
|
+
if (!name)
|
|
11
|
+
return;
|
|
12
|
+
const act = await select({
|
|
13
|
+
message: name,
|
|
14
|
+
options: [
|
|
15
|
+
{ label: "GET", value: "get" },
|
|
16
|
+
{ label: "POST", value: "post" },
|
|
17
|
+
{ label: "Back", value: "back" },
|
|
18
|
+
],
|
|
19
|
+
});
|
|
20
|
+
if (!act || isCancel(act) || act === "back")
|
|
21
|
+
return;
|
|
22
|
+
try {
|
|
23
|
+
const svc = a.service(name);
|
|
24
|
+
if (act === "get") {
|
|
25
|
+
const path = await askText("path") ?? "";
|
|
26
|
+
console.log(JSON.stringify(await svc.get(path), null, 2));
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const raw = await askText("body (JSON)") ?? "{}";
|
|
30
|
+
let body;
|
|
31
|
+
try {
|
|
32
|
+
body = JSON.parse(raw);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
showError("Invalid JSON body");
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
console.log(JSON.stringify(await svc.action("").invoke(body), null, 2));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
rethrowAdminAuthError(e);
|
|
43
|
+
showError(adminErrorMessage(e));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=custom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom.js","sourceRoot":"","sources":["../../../src/admin/commands/custom.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,CAAc;IAC/C,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;YACvB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC9B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAChC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aACjC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO;QAEpD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBAClB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;gBACjD,IAAI,IAA6B,CAAC;gBAClC,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACzB,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS,CAAC,mBAAmB,CAAC,CAAC;oBAC/B,SAAS;gBACX,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACzB,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Models 只读视图。
|
|
3
|
+
*
|
|
4
|
+
* 关键说明(中文)
|
|
5
|
+
* - 这里不提供模型新增、删除、启停。
|
|
6
|
+
* - 模型定义仍然来自代码注册;admin 只负责查看当前可用状态。
|
|
7
|
+
* - 如果模型缺少 provider key,会在这里直接显示缺失项。
|
|
8
|
+
*/
|
|
9
|
+
import { AdminClient } from "@visiblebase/client";
|
|
10
|
+
/**
|
|
11
|
+
* 展示全部代码注册模型及其运行状态。
|
|
12
|
+
*/
|
|
13
|
+
export declare function manageModels(a: AdminClient): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/admin/commands/models.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAgClD;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA0ChE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Models 只读视图。
|
|
3
|
+
*
|
|
4
|
+
* 关键说明(中文)
|
|
5
|
+
* - 这里不提供模型新增、删除、启停。
|
|
6
|
+
* - 模型定义仍然来自代码注册;admin 只负责查看当前可用状态。
|
|
7
|
+
* - 如果模型缺少 provider key,会在这里直接显示缺失项。
|
|
8
|
+
*/
|
|
9
|
+
import { show, showError } from "../../core/ui.js";
|
|
10
|
+
import { adminErrorMessage, rethrowAdminAuthError } from "../auth-error.js";
|
|
11
|
+
/**
|
|
12
|
+
* 展示全部代码注册模型及其运行状态。
|
|
13
|
+
*/
|
|
14
|
+
export async function manageModels(a) {
|
|
15
|
+
try {
|
|
16
|
+
const [modelResp, envItems] = await Promise.all([
|
|
17
|
+
a.json("/v1/ai/models", { method: "GET" }),
|
|
18
|
+
a.env.list(),
|
|
19
|
+
]);
|
|
20
|
+
const items = modelResp.items ?? [];
|
|
21
|
+
const envMap = new Map(envItems.map((item) => [item.key, item.value]));
|
|
22
|
+
if (items.length === 0) {
|
|
23
|
+
show("No models registered on server.");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
console.log(`\n${items.length} models:\n`);
|
|
27
|
+
for (const model of items) {
|
|
28
|
+
const requirements = model.env_requirements ?? [];
|
|
29
|
+
const missingEnv = requirements
|
|
30
|
+
.filter((item) => item.required && !envMap.get(item.key))
|
|
31
|
+
.map((item) => item.key);
|
|
32
|
+
const status = missingEnv.length === 0 ? "READY" : `MISSING ${missingEnv.join(", ")}`;
|
|
33
|
+
const defaults = (model.default_modes ?? []).length > 0
|
|
34
|
+
? `default: ${(model.default_modes ?? []).join(", ")}`
|
|
35
|
+
: "default: none";
|
|
36
|
+
const envText = requirements.length > 0
|
|
37
|
+
? requirements
|
|
38
|
+
.map((item) => `${item.key}${envMap.get(item.key) ? "✓" : "✗"}`)
|
|
39
|
+
.join(", ")
|
|
40
|
+
: "none";
|
|
41
|
+
console.log(` ${model.name} (${model.id})`);
|
|
42
|
+
console.log(` status: ${status}`);
|
|
43
|
+
console.log(` modalities: ${model.modalities.join(", ") || "none"}`);
|
|
44
|
+
console.log(` ${defaults}`);
|
|
45
|
+
console.log(` env: ${envText}`);
|
|
46
|
+
if (model.description)
|
|
47
|
+
console.log(` desc: ${model.description}`);
|
|
48
|
+
console.log("");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
rethrowAdminAuthError(e);
|
|
53
|
+
showError(adminErrorMessage(e));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/admin/commands/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment.d.ts","sourceRoot":"","sources":["../../../src/admin/commands/payment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKlD,wBAAsB,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBjE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Payment 管理命令。
|
|
3
|
+
*/
|
|
4
|
+
import { select, isCancel } from "@clack/prompts";
|
|
5
|
+
import { showError } from "../../core/ui.js";
|
|
6
|
+
import { adminErrorMessage, rethrowAdminAuthError } from "../auth-error.js";
|
|
7
|
+
export async function managePayment(a) {
|
|
8
|
+
const svc = a.service("payment.stripe");
|
|
9
|
+
while (true) {
|
|
10
|
+
const act = await select({
|
|
11
|
+
message: "Payment",
|
|
12
|
+
options: [
|
|
13
|
+
{ label: "List entitlements", value: "entitlements" },
|
|
14
|
+
{ label: "Back", value: "back" },
|
|
15
|
+
],
|
|
16
|
+
});
|
|
17
|
+
if (!act || isCancel(act) || act === "back")
|
|
18
|
+
return;
|
|
19
|
+
try {
|
|
20
|
+
const b = await svc.get("entitlements");
|
|
21
|
+
console.log(`\n${b.items.length} entitlements:\n`);
|
|
22
|
+
for (const e of b.items) {
|
|
23
|
+
console.log(` ${e.product_id.padEnd(22)} ${e.user_id.padEnd(26)} ${e.plan_id.padEnd(16)} [${e.status}]`);
|
|
24
|
+
}
|
|
25
|
+
console.log("");
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
rethrowAdminAuthError(e);
|
|
29
|
+
showError(adminErrorMessage(e));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=payment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment.js","sourceRoot":"","sources":["../../../src/admin/commands/payment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAc;IAChD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;YACvB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,cAAc,EAAE;gBACrD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aACjC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO;QAEpD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,CAAwF,cAAc,CAAC,CAAC;YAC/H,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;YACnD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5G,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACzB,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Env 管理命令。
|
|
3
|
+
*
|
|
4
|
+
* 三种模式:
|
|
5
|
+
* - Init:遍历所有 service 的 env 需求,逐一交互式配置
|
|
6
|
+
* - 按 Service 查看:选择一个 service,查看/配置其 env
|
|
7
|
+
* - 直接管理:list / upsert / remove 裸 key-value
|
|
8
|
+
*/
|
|
9
|
+
import { AdminClient } from "@visiblebase/client";
|
|
10
|
+
export declare function manageEnv(a: AdminClient): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=plugin-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-env.d.ts","sourceRoot":"","sources":["../../../src/admin/commands/plugin-env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAyClD,wBAAsB,SAAS,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC7D"}
|