@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.
Files changed (98) hide show
  1. package/README.md +33 -0
  2. package/bin/admin/auth-error.d.ts +30 -0
  3. package/bin/admin/auth-error.d.ts.map +1 -0
  4. package/bin/admin/auth-error.js +45 -0
  5. package/bin/admin/auth-error.js.map +1 -0
  6. package/bin/admin/commands/accounts.d.ts +6 -0
  7. package/bin/admin/commands/accounts.d.ts.map +1 -0
  8. package/bin/admin/commands/accounts.js +44 -0
  9. package/bin/admin/commands/accounts.js.map +1 -0
  10. package/bin/admin/commands/balance.d.ts +6 -0
  11. package/bin/admin/commands/balance.d.ts.map +1 -0
  12. package/bin/admin/commands/balance.js +100 -0
  13. package/bin/admin/commands/balance.js.map +1 -0
  14. package/bin/admin/commands/config.d.ts +9 -0
  15. package/bin/admin/commands/config.d.ts.map +1 -0
  16. package/bin/admin/commands/config.js +55 -0
  17. package/bin/admin/commands/config.js.map +1 -0
  18. package/bin/admin/commands/custom.d.ts +6 -0
  19. package/bin/admin/commands/custom.d.ts.map +1 -0
  20. package/bin/admin/commands/custom.js +47 -0
  21. package/bin/admin/commands/custom.js.map +1 -0
  22. package/bin/admin/commands/models.d.ts +14 -0
  23. package/bin/admin/commands/models.d.ts.map +1 -0
  24. package/bin/admin/commands/models.js +56 -0
  25. package/bin/admin/commands/models.js.map +1 -0
  26. package/bin/admin/commands/payment.d.ts +6 -0
  27. package/bin/admin/commands/payment.d.ts.map +1 -0
  28. package/bin/admin/commands/payment.js +33 -0
  29. package/bin/admin/commands/payment.js.map +1 -0
  30. package/bin/admin/commands/plugin-env.d.ts +11 -0
  31. package/bin/admin/commands/plugin-env.d.ts.map +1 -0
  32. package/bin/admin/commands/plugin-env.js +283 -0
  33. package/bin/admin/commands/plugin-env.js.map +1 -0
  34. package/bin/admin/commands/products.d.ts +6 -0
  35. package/bin/admin/commands/products.d.ts.map +1 -0
  36. package/bin/admin/commands/products.js +77 -0
  37. package/bin/admin/commands/products.js.map +1 -0
  38. package/bin/admin/commands/usage.d.ts +6 -0
  39. package/bin/admin/commands/usage.d.ts.map +1 -0
  40. package/bin/admin/commands/usage.js +44 -0
  41. package/bin/admin/commands/usage.js.map +1 -0
  42. package/bin/admin/loop.d.ts +6 -0
  43. package/bin/admin/loop.d.ts.map +1 -0
  44. package/bin/admin/loop.js +75 -0
  45. package/bin/admin/loop.js.map +1 -0
  46. package/bin/agent/pi-agent.d.ts +15 -0
  47. package/bin/agent/pi-agent.d.ts.map +1 -0
  48. package/bin/agent/pi-agent.js +136 -0
  49. package/bin/agent/pi-agent.js.map +1 -0
  50. package/bin/app.d.ts +13 -0
  51. package/bin/app.d.ts.map +1 -0
  52. package/bin/app.js +67 -0
  53. package/bin/app.js.map +1 -0
  54. package/bin/auth/admin.d.ts +8 -0
  55. package/bin/auth/admin.d.ts.map +1 -0
  56. package/bin/auth/admin.js +24 -0
  57. package/bin/auth/admin.js.map +1 -0
  58. package/bin/auth/mode-select.d.ts +12 -0
  59. package/bin/auth/mode-select.d.ts.map +1 -0
  60. package/bin/auth/mode-select.js +30 -0
  61. package/bin/auth/mode-select.js.map +1 -0
  62. package/bin/auth/server-switch.d.ts +16 -0
  63. package/bin/auth/server-switch.d.ts.map +1 -0
  64. package/bin/auth/server-switch.js +98 -0
  65. package/bin/auth/server-switch.js.map +1 -0
  66. package/bin/auth/user.d.ts +21 -0
  67. package/bin/auth/user.d.ts.map +1 -0
  68. package/bin/auth/user.js +223 -0
  69. package/bin/auth/user.js.map +1 -0
  70. package/bin/core/env.d.ts +15 -0
  71. package/bin/core/env.d.ts.map +1 -0
  72. package/bin/core/env.js +67 -0
  73. package/bin/core/env.js.map +1 -0
  74. package/bin/core/session.d.ts +53 -0
  75. package/bin/core/session.d.ts.map +1 -0
  76. package/bin/core/session.js +118 -0
  77. package/bin/core/session.js.map +1 -0
  78. package/bin/core/ui.d.ts +29 -0
  79. package/bin/core/ui.d.ts.map +1 -0
  80. package/bin/core/ui.js +58 -0
  81. package/bin/core/ui.js.map +1 -0
  82. package/bin/user/balance.d.ts +19 -0
  83. package/bin/user/balance.d.ts.map +1 -0
  84. package/bin/user/balance.js +62 -0
  85. package/bin/user/balance.js.map +1 -0
  86. package/bin/user/chat.d.ts +12 -0
  87. package/bin/user/chat.d.ts.map +1 -0
  88. package/bin/user/chat.js +70 -0
  89. package/bin/user/chat.js.map +1 -0
  90. package/bin/user/loop.d.ts +13 -0
  91. package/bin/user/loop.d.ts.map +1 -0
  92. package/bin/user/loop.js +87 -0
  93. package/bin/user/loop.js.map +1 -0
  94. package/bin/user/models.d.ts +10 -0
  95. package/bin/user/models.d.ts.map +1 -0
  96. package/bin/user/models.js +39 -0
  97. package/bin/user/models.js.map +1 -0
  98. package/package.json +52 -0
@@ -0,0 +1,62 @@
1
+ /**
2
+ * User Balance 命令。
3
+ *
4
+ * 提供:
5
+ * - 查看当前余额
6
+ * - 查看个人流水
7
+ * - 查看个人充值单
8
+ * - 发起充值
9
+ */
10
+ import { askText, show, showError, showSuccess } from "../core/ui.js";
11
+ /** 展示当前余额 */
12
+ export async function showBalance(c) {
13
+ const account = await c.service("balance").get("me");
14
+ show([
15
+ `user_id: ${account.user_id}`,
16
+ `balance: ${account.balance} ${account.unit}`,
17
+ ].join("\n"));
18
+ }
19
+ /** 展示个人流水 */
20
+ export async function showBalanceHistory(c) {
21
+ const response = await c.service("balance").get("history/me", { limit: 20 });
22
+ if (response.items.length === 0) {
23
+ show("No balance history yet.");
24
+ return;
25
+ }
26
+ console.log(`\n${response.items.length} balance entries:\n`);
27
+ for (const item of response.items) {
28
+ console.log(` ${item.created_at.slice(0, 19)} ${item.kind.padEnd(8)} ${String(item.amount).padStart(6)} -> ${String(item.balance_after).padStart(6)} ${item.note}`);
29
+ }
30
+ console.log("");
31
+ }
32
+ /** 展示个人充值单 */
33
+ export async function showTopups(c) {
34
+ const response = await c.service("balance").get("topups/me", { limit: 20 });
35
+ if (response.items.length === 0) {
36
+ show("No topup orders yet.");
37
+ return;
38
+ }
39
+ console.log(`\n${response.items.length} topup orders:\n`);
40
+ for (const item of response.items) {
41
+ console.log(` ${item.topup_id.padEnd(24)} ${String(item.amount).padStart(6)} ${item.unit.padEnd(10)} [${item.status}] ${item.note}`);
42
+ }
43
+ console.log("");
44
+ }
45
+ /** 发起充值 */
46
+ export async function createTopup(c) {
47
+ const rawAmount = await askText("topup amount");
48
+ if (!rawAmount)
49
+ return;
50
+ const amount = Number(rawAmount);
51
+ if (!Number.isInteger(amount) || amount <= 0) {
52
+ showError("topup amount must be a positive integer");
53
+ return;
54
+ }
55
+ const note = await askText("topup note (optional)");
56
+ const result = await c.service("balance").action("topups/create").invoke({
57
+ amount,
58
+ note: note ?? "",
59
+ });
60
+ showSuccess(`topup created: ${result.topup_id} (${result.amount} ${result.unit}, ${result.status})`);
61
+ }
62
+ //# sourceMappingURL=balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/user/balance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * User Chat 命令 — Agent 连续对话。
3
+ *
4
+ * 使用 pi-agent 进行多轮对话(流式输出 + tools)。
5
+ * pi-agent 通过 server 的 /chat/completions 端点调用 AI,
6
+ * client 不做任何 provider 或 model 硬编码。
7
+ * 空输入或 Esc 返回上级菜单。
8
+ */
9
+ import type { UserClient } from "@visiblebase/client";
10
+ import { type UserContext } from "../auth/user.js";
11
+ export declare function doAgentChat(c: UserClient, ctx: UserContext): Promise<void>;
12
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/user/chat.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAMnD,wBAAsB,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DhF"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * User Chat 命令 — Agent 连续对话。
3
+ *
4
+ * 使用 pi-agent 进行多轮对话(流式输出 + tools)。
5
+ * pi-agent 通过 server 的 /chat/completions 端点调用 AI,
6
+ * client 不做任何 provider 或 model 硬编码。
7
+ * 空输入或 Esc 返回上级菜单。
8
+ */
9
+ import { askText, show, showError } from "../core/ui.js";
10
+ import { createPiAgentSession } from "../agent/pi-agent.js";
11
+ let activeAgentSession;
12
+ export async function doAgentChat(c, ctx) {
13
+ // 从 server 获取模型目录,构建 ModelHandle
14
+ let modelName;
15
+ try {
16
+ const catalog = await c.ai.listModels();
17
+ const all = catalog.all();
18
+ if (all.length === 0) {
19
+ showError("No ready models available on server. Please configure provider env first.");
20
+ return;
21
+ }
22
+ const selected = ctx.config.model
23
+ ? (catalog.get(ctx.config.model) ?? catalog.default())
24
+ : catalog.default();
25
+ if (!selected) {
26
+ showError("No ready default model found on server.");
27
+ return;
28
+ }
29
+ modelName = selected.name;
30
+ const handle = c.ai.model(selected);
31
+ show(`Starting agent chat (model: ${modelName})`);
32
+ show("Type your message (empty or Esc to exit chat)");
33
+ activeAgentSession = await createPiAgentSession({
34
+ model: handle,
35
+ tools: "agent",
36
+ onText: (text) => process.stdout.write(text),
37
+ onToolStart: (toolName) => process.stdout.write(`\n[tool:${toolName}] `),
38
+ onToolEnd: (toolName, isError) => {
39
+ if (isError)
40
+ process.stdout.write(`[tool:${toolName} failed]\n`);
41
+ },
42
+ });
43
+ }
44
+ catch (e) {
45
+ showError(`Failed to start agent: ${e instanceof Error ? e.message : String(e)}`);
46
+ return;
47
+ }
48
+ while (true) {
49
+ process.stdout.write("\n");
50
+ const prompt = await askText("You");
51
+ if (!prompt || prompt.trim() === "") {
52
+ show("Exited chat");
53
+ break;
54
+ }
55
+ process.stdout.write("assistant: ");
56
+ try {
57
+ const response = await activeAgentSession.ask(prompt);
58
+ if (response)
59
+ process.stdout.write("\n");
60
+ }
61
+ catch (e) {
62
+ process.stdout.write("\n");
63
+ showError(`Agent error: ${e instanceof Error ? e.message : String(e)}`);
64
+ show("Agent session ended. Please re-enter chat to start a new conversation.");
65
+ break;
66
+ }
67
+ }
68
+ activeAgentSession = undefined;
69
+ }
70
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/user/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * User 命令循环。返回 "logout" | "quit" | "switch_identity"。
3
+ *
4
+ * 关键说明(中文)
5
+ * - chat 直接使用 pi-agent 进行连续对话(流式输出),委托到 chat.ts。
6
+ * - models 合并了列表展示与选择切换,委托到 models.ts。
7
+ * - me / services / service 保持内联(逻辑简单)。
8
+ */
9
+ import { type UserContext } from "../auth/user.js";
10
+ type Result = "logout" | "quit" | "switch_identity";
11
+ export declare function userLoop(ctx: UserContext): Promise<Result>;
12
+ export {};
13
+ //# sourceMappingURL=loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/user/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAOnD,KAAK,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAEpD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBhE"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * User 命令循环。返回 "logout" | "quit" | "switch_identity"。
3
+ *
4
+ * 关键说明(中文)
5
+ * - chat 直接使用 pi-agent 进行连续对话(流式输出),委托到 chat.ts。
6
+ * - models 合并了列表展示与选择切换,委托到 models.ts。
7
+ * - me / services / service 保持内联(逻辑简单)。
8
+ */
9
+ import { UserClient } from "@visiblebase/client";
10
+ import { clearUserSession } from "../core/session.js";
11
+ import { askUserCommand, askText, show, showError, showSuccess } from "../core/ui.js";
12
+ import { createTopup, showBalance, showBalanceHistory, showTopups } from "./balance.js";
13
+ import { doAgentChat } from "./chat.js";
14
+ import { doModels } from "./models.js";
15
+ export async function userLoop(ctx) {
16
+ const client = new UserClient({
17
+ base_url: ctx.session.base_url,
18
+ product_id: ctx.session.product_id,
19
+ user_token: ctx.session.user_token,
20
+ });
21
+ while (true) {
22
+ const cmd = await askUserCommand();
23
+ if (!cmd)
24
+ continue;
25
+ if (cmd === "switch")
26
+ return "switch_identity";
27
+ try {
28
+ const r = await execute(client, ctx, cmd);
29
+ if (r === "quit")
30
+ return "quit";
31
+ if (r === "logout")
32
+ return "logout";
33
+ }
34
+ catch (e) {
35
+ showError(e instanceof Error ? e.message : String(e));
36
+ }
37
+ }
38
+ }
39
+ async function execute(c, ctx, cmd) {
40
+ switch (cmd) {
41
+ case "chat":
42
+ await doAgentChat(c, ctx);
43
+ return "continue";
44
+ case "models":
45
+ await doModels(c, ctx);
46
+ return "continue";
47
+ case "balance":
48
+ await showBalance(c);
49
+ return "continue";
50
+ case "history":
51
+ await showBalanceHistory(c);
52
+ return "continue";
53
+ case "topups":
54
+ await showTopups(c);
55
+ return "continue";
56
+ case "recharge":
57
+ await createTopup(c);
58
+ return "continue";
59
+ case "me": {
60
+ const b = await c.service("accounts").get("me");
61
+ if (b.user)
62
+ show(`user_id: ${b.user.user_id}\nemail: ${b.user.email}`);
63
+ return "continue";
64
+ }
65
+ case "services":
66
+ show((await c.listServices())
67
+ .map((service) => `${service.id} - ${service.name}`)
68
+ .join("\n"));
69
+ return "continue";
70
+ case "service": {
71
+ const n = await askText("service name");
72
+ if (n)
73
+ show(JSON.stringify(await c.service(n).action("").invoke({}), null, 2));
74
+ return "continue";
75
+ }
76
+ case "logout":
77
+ clearUserSession(ctx.session.base_url);
78
+ showSuccess("logged out");
79
+ return "logout";
80
+ case "quit":
81
+ return "quit";
82
+ default:
83
+ showError(`unknown: ${cmd}`);
84
+ return "continue";
85
+ }
86
+ }
87
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/user/loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * User Models 命令 — 模型列表与选择。
3
+ *
4
+ * 从 server 获取模型目录,显示并允许用户切换。
5
+ */
6
+ import type { UserClient } from "@visiblebase/client";
7
+ import { type UserContext } from "../auth/user.js";
8
+ /** 列出模型并选择切换 */
9
+ export declare function doModels(c: UserClient, ctx: UserContext): Promise<void>;
10
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/user/models.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,gBAAgB;AAChB,wBAAsB,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B7E"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * User Models 命令 — 模型列表与选择。
3
+ *
4
+ * 从 server 获取模型目录,显示并允许用户切换。
5
+ */
6
+ import { askModel, show, showError, showSuccess } from "../core/ui.js";
7
+ import { readConfig, writeConfig } from "../core/session.js";
8
+ /** 列出模型并选择切换 */
9
+ export async function doModels(c, ctx) {
10
+ let catalog;
11
+ try {
12
+ catalog = await c.ai.listModels();
13
+ }
14
+ catch (e) {
15
+ showError(`Failed to fetch models: ${e instanceof Error ? e.message : String(e)}`);
16
+ return;
17
+ }
18
+ const all = catalog.all();
19
+ if (all.length === 0) {
20
+ showError("No ready models available from server. Configure provider env first.");
21
+ return;
22
+ }
23
+ const currentModel = ctx.config.model || catalog.default()?.id || "";
24
+ show(`Current model: ${currentModel || "(none)"}`);
25
+ const options = all.map((m) => ({
26
+ id: m.id,
27
+ name: m.name,
28
+ hint: m.description || m.tags?.join(", ") || "",
29
+ }));
30
+ const selected = await askModel(options, currentModel);
31
+ if (selected) {
32
+ ctx.config.model = selected;
33
+ const cfg = readConfig();
34
+ cfg.model = selected;
35
+ writeConfig(cfg);
36
+ showSuccess(`Model switched to: ${selected}`);
37
+ }
38
+ }
39
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/user/models.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,QAAQ,EAAoB,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE7D,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,CAAa,EAAE,GAAgB;IAC5D,IAAI,OAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,SAAS,CAAC,2BAA2B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,sEAAsE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACrE,IAAI,CAAC,kBAAkB,YAAY,IAAI,QAAQ,EAAE,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAkB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;KAChD,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;QAC5B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC;QAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjE,WAAW,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@visiblebase/manager",
3
+ "version": "0.1.1",
4
+ "description": "VisibleBase terminal manager for admin and user flows.",
5
+ "type": "module",
6
+ "bin": {
7
+ "visiblebase": "./bin/app.js"
8
+ },
9
+ "files": [
10
+ "bin"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/wangenius/visiblebase.git",
18
+ "directory": "packages/manager"
19
+ },
20
+ "homepage": "https://github.com/wangenius/visiblebase#readme",
21
+ "bugs": {
22
+ "url": "https://github.com/wangenius/visiblebase/issues"
23
+ },
24
+ "keywords": [
25
+ "visiblebase",
26
+ "ai",
27
+ "manager",
28
+ "terminal",
29
+ "serverbase"
30
+ ],
31
+ "engines": {
32
+ "node": ">=22.13.0"
33
+ },
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "@clack/prompts": "^1.2.0",
37
+ "@mariozechner/pi-ai": "^0.70.0",
38
+ "@mariozechner/pi-coding-agent": "^0.70.0",
39
+ "@visiblebase/client": "0.1.4"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^22.0.0",
43
+ "typescript": "^5.7.0"
44
+ },
45
+ "scripts": {
46
+ "build": "tsc",
47
+ "dev": "tsc --watch",
48
+ "typecheck": "tsc --noEmit",
49
+ "test": "tsc --noEmit",
50
+ "manager": "node ./bin/app.js"
51
+ }
52
+ }