downcity 1.1.174 → 1.1.177

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "downcity",
3
- "version": "1.1.174",
3
+ "version": "1.1.177",
4
4
  "type": "module",
5
5
  "description": "Downcity CLI bundle — installs city and town commands",
6
6
  "bin": {
@@ -23,10 +23,10 @@
23
23
  "@ai-sdk/openai": "^3.0.67",
24
24
  "@ai-sdk/openai-compatible": "^2.0.48",
25
25
  "@ai-sdk/xai": "^3.0.93",
26
- "@downcity/agent": "^1.1.118",
27
- "@downcity/city": "^0.2.66",
28
- "@downcity/plugins": "^1.0.71",
29
- "@downcity/shell": "^0.1.4",
26
+ "@downcity/agent": "^1.1.119",
27
+ "@downcity/city": "^0.2.67",
28
+ "@downcity/plugins": "^1.0.72",
29
+ "@downcity/shell": "^0.1.7",
30
30
  "@larksuiteoapi/node-sdk": "^1.66.0",
31
31
  "@openrouter/ai-sdk-provider": "^2.9.0",
32
32
  "ai": "^6.0.193",
@@ -1 +1 @@
1
- {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../../src/agent/http/shell/shell.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,KAAK,kBAAkB,GAAG;IACxB;;OAEG;IACH,QAAQ,EAAE,MAAM,KAAK,GAAG,SAAS,CAAC;CACnC,CAAC;AAUF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAkCnE"}
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../../src/agent/http/shell/shell.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAG7C,KAAK,kBAAkB,GAAG;IACxB;;OAEG;IACH,QAAQ,EAAE,MAAM,KAAK,GAAG,SAAS,CAAC;CACnC,CAAC;AAUF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAoEnE"}
@@ -25,6 +25,37 @@ export function createShellRouter(options) {
25
25
  approvals: shell.approvals(),
26
26
  });
27
27
  });
28
+ router.get("/api/shell/approval-modes", (c) => {
29
+ const shell = requireShell(options);
30
+ return c.json({
31
+ success: true,
32
+ modes: shell.approval_modes(),
33
+ });
34
+ });
35
+ router.get("/api/shell/approval-mode", (c) => {
36
+ const session_id = String(c.req.query("session_id") || c.req.query("sessionId") || "").trim();
37
+ if (!session_id) {
38
+ return c.json({ success: false, error: "session_id is required" }, 400);
39
+ }
40
+ const shell = requireShell(options);
41
+ return c.json({
42
+ success: true,
43
+ ...shell.approval_mode({ session_id }),
44
+ });
45
+ });
46
+ router.post("/api/shell/approval-mode", async (c) => {
47
+ const body = await c.req.json().catch(() => null);
48
+ const session_id = String(body?.session_id || body?.sessionId || "").trim();
49
+ const mode = String(body?.mode || "").trim();
50
+ if (!session_id) {
51
+ return c.json({ success: false, error: "session_id is required" }, 400);
52
+ }
53
+ if (mode !== "ask" && mode !== "always-allow") {
54
+ return c.json({ success: false, error: "mode must be ask or always-allow" }, 400);
55
+ }
56
+ const shell = requireShell(options);
57
+ return c.json(shell.set_approval_mode({ session_id, mode }));
58
+ });
28
59
  router.post("/api/shell/approve", async (c) => {
29
60
  const body = await c.req.json().catch(() => null);
30
61
  const approval_id = String(body?.approval_id || body?.approvalId || "").trim();
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../../src/agent/http/shell/shell.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAU5B,SAAS,YAAY,CAAC,OAA2B;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA2B;IAC3D,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IAE1B,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE;QACvC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,WAAW,IAAI,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,WAAW,IAAI,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../../src/agent/http/shell/shell.ts"],"names":[],"mappings":"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"}
@@ -17,8 +17,8 @@ export function registerCityConnectionCommand(program) {
17
17
  const city = program
18
18
  .command("city")
19
19
  .description(t({
20
- zh: "管理 Town 的 City user 连接与登录态",
21
- en: "manage Town City user connections and login state",
20
+ zh: "管理 Town 的 City 连接与账号登录态",
21
+ en: "manage Town City connections and account login state",
22
22
  }))
23
23
  .helpOption("--help", helpText())
24
24
  .action(async () => {
@@ -31,8 +31,8 @@ export function registerCityConnectionCommand(program) {
31
31
  city
32
32
  .command("status")
33
33
  .description(t({
34
- zh: "查看 Town 当前 City user 连接状态",
35
- en: "show the current Town City user connection status",
34
+ zh: "查看 Town 当前 City 连接状态",
35
+ en: "show the current Town City connection status",
36
36
  }))
37
37
  .option("--json [enabled]", t({
38
38
  zh: "以 JSON 输出",
@@ -44,8 +44,8 @@ export function registerCityConnectionCommand(program) {
44
44
  city
45
45
  .command("list")
46
46
  .description(t({
47
- zh: "列出 Town 可选择的 City base",
48
- en: "list City bases available to Town",
47
+ zh: "列出 Town 可选择的 City",
48
+ en: "list Cities available to Town",
49
49
  }))
50
50
  .option("--json [enabled]", t({
51
51
  zh: "以 JSON 输出",
@@ -57,8 +57,8 @@ export function registerCityConnectionCommand(program) {
57
57
  city
58
58
  .command("whoami")
59
59
  .description(t({
60
- zh: "查看 Town 当前实际使用的 City user",
61
- en: "show the current City user resolved by Town",
60
+ zh: "查看 Town 当前实际使用的 City 账号",
61
+ en: "show the current City account resolved by Town",
62
62
  }))
63
63
  .option("--json [enabled]", t({
64
64
  zh: "以 JSON 输出",
@@ -70,8 +70,8 @@ export function registerCityConnectionCommand(program) {
70
70
  city
71
71
  .command("connect [url]")
72
72
  .description(t({
73
- zh: "手动添加并选择一个 City base(默认 base.downcity.ai)",
74
- en: "manually add and select a City base (default: base.downcity.ai)",
73
+ zh: "手动添加并选择一个 City(默认 base.downcity.ai)",
74
+ en: "manually add and select a City (default: base.downcity.ai)",
75
75
  }))
76
76
  .option("--json [enabled]", t({
77
77
  zh: "以 JSON 输出",
@@ -84,10 +84,10 @@ export function registerCityConnectionCommand(program) {
84
84
  });
85
85
  });
86
86
  city
87
- .command("use [server]")
87
+ .command("use [city]")
88
88
  .description(t({
89
- zh: "选择一个 City base;可使用 Town 本地或 city admin 已保存 base",
90
- en: "select a City base from Town-local or city-admin saved bases",
89
+ zh: "选择一个 City;可使用 Town 本地或 city admin 已保存 City",
90
+ en: "select a City from Town-local or city-admin saved Cities",
91
91
  }))
92
92
  .option("--json [enabled]", t({
93
93
  zh: "以 JSON 输出",
@@ -102,8 +102,8 @@ export function registerCityConnectionCommand(program) {
102
102
  city
103
103
  .command("login [url]")
104
104
  .description(t({
105
- zh: " user 身份登录当前或指定 City base",
106
- en: "sign in to the current or specified City base as a user",
105
+ zh: "登录当前或指定 City",
106
+ en: "sign in to the current or specified City",
107
107
  }))
108
108
  .option("--town-id <townId>", t({
109
109
  zh: "City town id",
@@ -123,8 +123,8 @@ export function registerCityConnectionCommand(program) {
123
123
  city
124
124
  .command("logout")
125
125
  .description(t({
126
- zh: "清除当前 City base 的 Town user session",
127
- en: "clear the Town user session for the current City base",
126
+ zh: "清除当前 City 的 Town 登录态",
127
+ en: "clear the Town session for the current City",
128
128
  }))
129
129
  .option("--json [enabled]", t({
130
130
  zh: "以 JSON 输出",
@@ -136,8 +136,8 @@ export function registerCityConnectionCommand(program) {
136
136
  city
137
137
  .command("disconnect")
138
138
  .description(t({
139
- zh: "移除当前 Town City base 选择并回到默认 base",
140
- en: "remove the current Town City base selection and fall back to the default base",
139
+ zh: "重置 Town City 选择并回到默认 City",
140
+ en: "reset the Town City selection and fall back to the default City",
141
141
  }))
142
142
  .option("--json [enabled]", t({
143
143
  zh: "以 JSON 输出",
@@ -1 +1 @@
1
- {"version":3,"file":"CityCommand.js","sourceRoot":"","sources":["../../src/command/CityCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CityCommand.js","sourceRoot":"","sources":["../../src/command/CityCommand.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CityConnection.d.ts","sourceRoot":"","sources":["../../src/shared/CityConnection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,OAAO,KAAK,EACV,uBAAuB,EAExB,MAAM,gCAAgC,CAAC;AAwBxC,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnF;AAcD,wBAAgB,2BAA2B,IAAI,uBAAuB,CA0BrE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA8B9E;AAED,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDvF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA+BxE;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhB;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChB;AAiBD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAiB1E;AAED,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAqB9E;AAqID,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CA8D/D"}
1
+ {"version":3,"file":"CityConnection.d.ts","sourceRoot":"","sources":["../../src/shared/CityConnection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EACV,uBAAuB,EAExB,MAAM,gCAAgC,CAAC;AAsBxC,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnF;AAcD,wBAAgB,2BAA2B,IAAI,uBAAuB,CA0BrE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA8B9E;AAED,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDvF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA+BxE;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhB;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChB;AAiBD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAiB1E;AAED,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAqB9E;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAG/D"}
@@ -7,15 +7,13 @@
7
7
  * - Town 可以只读发现 `city` CLI 已配置的 base 地址,但不依赖 city 内部模块。
8
8
  * - CLI 命令装配统一放在 `src/command/CityCommand.ts`,本模块只保留状态与登录流程。
9
9
  */
10
- import prompts from "../tui/Prompts.js";
11
10
  import { emitCliBlock, emitCliList } from "./CliReporter.js";
12
11
  import { printResult } from "../utils/cli/CliOutput.js";
13
12
  import { performTownCityUserLogin } from "./CityUserLogin.js";
14
- import { emitCurrentTownCityBalance, emitTownCityRechargeResult, rechargeCurrentTownCityUser, } from "./CityBalance.js";
13
+ import { open_city_manager_tui } from "../tui/CityManagerTui.js";
14
+ import prompts from "../tui/Prompts.js";
15
15
  import { CityUserManager } from "./CityUserManager.js";
16
- import { DEFAULT_CITY_URL, DEFAULT_TOWN_ID, listTownCityServers, normalizeCityUrl, readCityAdminSecretForUrl, readCityString, readCurrentTownCitySession, readPersistedTownCliLocale, readTownCityState, resolveSelectedBaseUrl, upsertTownProfile, writeTownCityState, } from "./CityStateStore.js";
17
- import { getCliLocale, t } from "./CliLocale.js";
18
- import { promptAndPersistTownCliLocale } from "./InteractiveLocale.js";
16
+ import { DEFAULT_CITY_URL, DEFAULT_TOWN_ID, listTownCityServers, normalizeCityUrl, readCityAdminSecretForUrl, readCityString, readCurrentTownCitySession, readTownCityState, resolveSelectedBaseUrl, upsertTownProfile, writeTownCityState, } from "./CityStateStore.js";
19
17
  const cityUserManager = new CityUserManager();
20
18
  function readString(value) {
21
19
  return readCityString(value);
@@ -23,7 +21,7 @@ function readString(value) {
23
21
  export function readTownCityAdminSecretForBase(city_url) {
24
22
  return readCityAdminSecretForUrl(city_url);
25
23
  }
26
- function findCityServer(input) {
24
+ function findTownCityServer(input) {
27
25
  const query = String(input || "").trim();
28
26
  const servers = listTownCityServers();
29
27
  if (!query)
@@ -76,7 +74,7 @@ export function emitCityConnectionStatus(options) {
76
74
  emitCliBlock({
77
75
  tone: state.has_user_token ? "success" : "warning",
78
76
  title: "City connection",
79
- summary: state.has_user_token ? "signed in" : "base selected",
77
+ summary: state.has_user_token ? "signed in" : "city selected",
80
78
  facts: [
81
79
  { label: "url", value: state.city_url },
82
80
  { label: "town", value: state.town_id },
@@ -86,7 +84,7 @@ export function emitCityConnectionStatus(options) {
86
84
  ],
87
85
  note: state.has_user_token
88
86
  ? undefined
89
- : "Run `town city login` to sign in as a City user.",
87
+ : "Run `town city login` to sign in.",
90
88
  });
91
89
  }
92
90
  export async function emitCityUserWhoami(options) {
@@ -111,7 +109,7 @@ export async function emitCityUserWhoami(options) {
111
109
  }
112
110
  emitCliBlock({
113
111
  tone: "success",
114
- title: "City user",
112
+ title: "City account",
115
113
  summary: user.source,
116
114
  facts: [
117
115
  { label: "url", value: user.city_url },
@@ -140,7 +138,7 @@ export async function emitCityUserWhoami(options) {
140
138
  }
141
139
  emitCliBlock({
142
140
  tone: "error",
143
- title: "City user unavailable",
141
+ title: "City account unavailable",
144
142
  note: error instanceof Error ? error.message : String(error),
145
143
  });
146
144
  }
@@ -151,7 +149,7 @@ export function emitCityServerList(options) {
151
149
  printResult({
152
150
  asJson: true,
153
151
  success: true,
154
- title: "city bases",
152
+ title: "cities",
155
153
  payload: {
156
154
  count: servers.length,
157
155
  servers,
@@ -161,7 +159,7 @@ export function emitCityServerList(options) {
161
159
  }
162
160
  emitCliList({
163
161
  tone: "accent",
164
- title: "City bases",
162
+ title: "Cities",
165
163
  summary: `${servers.length} available`,
166
164
  items: servers.map((server) => ({
167
165
  tone: server.selected ? "success" : "info",
@@ -182,7 +180,7 @@ export async function runCityConnectCommand(params) {
182
180
  const response = (await prompts({
183
181
  type: "text",
184
182
  name: "city_url",
185
- message: "City base URL",
183
+ message: "City URL",
186
184
  initial: DEFAULT_CITY_URL,
187
185
  }));
188
186
  city_url = normalizeCityUrl(String(response.city_url || ""));
@@ -194,7 +192,7 @@ export async function runCityConnectCommand(params) {
194
192
  printResult({
195
193
  asJson: params.as_json === true,
196
194
  success: true,
197
- title: "city base connected",
195
+ title: "city connected",
198
196
  payload: {
199
197
  city_url,
200
198
  fix: "Run `town city login` to sign in as a user.",
@@ -202,15 +200,15 @@ export async function runCityConnectCommand(params) {
202
200
  });
203
201
  }
204
202
  export async function runCityUseCommand(params) {
205
- const server = findCityServer(params.server);
203
+ const server = findTownCityServer(params.server);
206
204
  if (!server) {
207
205
  printResult({
208
206
  asJson: params.as_json === true,
209
207
  success: false,
210
208
  title: "city use failed",
211
209
  payload: {
212
- error: "No City base matched the input",
213
- fix: "Run `town city list` to inspect available bases.",
210
+ error: "No City matched the input",
211
+ fix: "Run `town city list` to inspect available Cities.",
214
212
  },
215
213
  });
216
214
  return;
@@ -223,7 +221,7 @@ export async function runCityUseCommand(params) {
223
221
  printResult({
224
222
  asJson: params.as_json === true,
225
223
  success: true,
226
- title: "city base selected",
224
+ title: "city selected",
227
225
  payload: {
228
226
  city_url: server.base_url,
229
227
  source: server.source,
@@ -232,7 +230,7 @@ export async function runCityUseCommand(params) {
232
230
  },
233
231
  });
234
232
  }
235
- function saveUserSession(session) {
233
+ function saveTownCityUserSession(session) {
236
234
  const state = upsertTownProfile(readTownCityState(), {
237
235
  base_url: session.base_url,
238
236
  });
@@ -269,7 +267,7 @@ export async function runCityLoginCommand(params) {
269
267
  });
270
268
  return;
271
269
  }
272
- saveUserSession(session);
270
+ saveTownCityUserSession(session);
273
271
  printResult({
274
272
  asJson: params.as_json === true,
275
273
  success: true,
@@ -322,259 +320,9 @@ export function runCityDisconnectCommand(options) {
322
320
  },
323
321
  });
324
322
  }
325
- async function promptCityManagerAction() {
326
- const state = readTownCityConnectionState();
327
- const current_locale = getCliLocale();
328
- const persisted_locale = readPersistedTownCliLocale();
329
- const response = (await prompts({
330
- type: "select",
331
- name: "action",
332
- message: t({
333
- zh: "管理 City user 连接",
334
- en: "Manage City user connections",
335
- }),
336
- choices: [
337
- {
338
- title: t({
339
- zh: "查看连接状态",
340
- en: "View connection status",
341
- }),
342
- description: state.city_url,
343
- value: "status",
344
- },
345
- {
346
- title: t({
347
- zh: "选择 City base",
348
- en: "Select City base",
349
- }),
350
- description: t({
351
- zh: "从 Town / city admin / 默认 base 候选中选择",
352
- en: "Choose from Town, city admin, or default base candidates",
353
- }),
354
- value: "use",
355
- },
356
- {
357
- title: t({
358
- zh: "添加 City base",
359
- en: "Add City base",
360
- }),
361
- description: t({
362
- zh: "手动写入一个 Town user base",
363
- en: "Manually add a Town user base",
364
- }),
365
- value: "connect",
366
- },
367
- {
368
- title: t({
369
- zh: "User 登录",
370
- en: "User login",
371
- }),
372
- description: state.has_user_token
373
- ? t({ zh: "重新登录当前 base", en: "Sign in again to the current base" })
374
- : t({ zh: "登录当前 base", en: "Sign in to the current base" }),
375
- value: "login",
376
- },
377
- {
378
- title: t({
379
- zh: "查看当前 User",
380
- en: "View current user",
381
- }),
382
- description: t({
383
- zh: "显示 Town 当前实际使用的 City user",
384
- en: "Show the current City user resolved by Town",
385
- }),
386
- value: "whoami",
387
- },
388
- {
389
- title: t({
390
- zh: "查看 User 余额",
391
- en: "View user balance",
392
- }),
393
- description: state.has_user_token
394
- ? t({ zh: "读取当前登录 user 的余额", en: "Read the balance of the current signed-in user" })
395
- : t({ zh: "需要先登录 user", en: "A user login is required first" }),
396
- value: "balance",
397
- },
398
- {
399
- title: t({
400
- zh: "User 充值",
401
- en: "User recharge",
402
- }),
403
- description: state.has_user_token
404
- ? t({ zh: "给当前登录 user 发起 checkout 充值", en: "Start a checkout recharge for the current signed-in user" })
405
- : t({ zh: "需要先登录 user", en: "A user login is required first" }),
406
- value: "recharge",
407
- },
408
- {
409
- title: t({
410
- zh: "User 登出",
411
- en: "User logout",
412
- }),
413
- description: t({
414
- zh: "清除当前 base 的 Town user session",
415
- en: "Clear the Town user session for the current base",
416
- }),
417
- value: "logout",
418
- },
419
- {
420
- title: t({
421
- zh: "查看可用 base",
422
- en: "List available bases",
423
- }),
424
- description: t({
425
- zh: "包含默认 base 与 city admin 已保存 base",
426
- en: "Includes the default base and city-admin saved bases",
427
- }),
428
- value: "list",
429
- },
430
- {
431
- title: t({
432
- zh: "切换语言",
433
- en: "Language",
434
- }),
435
- description: formatTownCliLocaleDescription(persisted_locale ?? current_locale),
436
- value: "language",
437
- },
438
- {
439
- title: t({
440
- zh: "退出",
441
- en: "Exit",
442
- }),
443
- description: t({
444
- zh: "关闭 City user 连接管理",
445
- en: "Close City user connection management",
446
- }),
447
- value: "exit",
448
- },
449
- ],
450
- initial: state.has_user_token ? 0 : 3,
451
- }));
452
- return String(response.action || "").trim() || null;
453
- }
454
323
  export async function runInteractiveCityManager() {
455
324
  if (!process.stdin.isTTY || !process.stdout.isTTY)
456
325
  return;
457
- while (true) {
458
- const action = await promptCityManagerAction();
459
- if (!action || action === "exit") {
460
- emitCliBlock({
461
- tone: "info",
462
- title: t({
463
- zh: "City 管理器已关闭",
464
- en: "City manager closed",
465
- }),
466
- });
467
- return;
468
- }
469
- if (action === "status") {
470
- emitCityConnectionStatus();
471
- continue;
472
- }
473
- if (action === "list") {
474
- emitCityServerList();
475
- continue;
476
- }
477
- if (action === "connect") {
478
- await runCityConnectCommand({});
479
- continue;
480
- }
481
- if (action === "use") {
482
- const server = await promptSelectCityBase();
483
- if (server)
484
- await runCityUseCommand({ server: server.base_url });
485
- continue;
486
- }
487
- if (action === "login") {
488
- await runCityLoginCommand({});
489
- continue;
490
- }
491
- if (action === "whoami") {
492
- await emitCityUserWhoami();
493
- continue;
494
- }
495
- if (action === "balance") {
496
- await emitCurrentTownCityBalance();
497
- continue;
498
- }
499
- if (action === "recharge") {
500
- const input = await promptRechargeInput();
501
- if (input) {
502
- const result = await rechargeCurrentTownCityUser(input);
503
- if (result)
504
- emitTownCityRechargeResult(result);
505
- }
506
- continue;
507
- }
508
- if (action === "language") {
509
- await promptAndPersistTownCliLocale();
510
- continue;
511
- }
512
- if (action === "logout") {
513
- runCityLogoutCommand();
514
- continue;
515
- }
516
- }
517
- }
518
- function formatTownCliLocaleDescription(cli_locale) {
519
- if (cli_locale === "zh") {
520
- return t({
521
- zh: "当前默认语言:中文",
522
- en: "Current default language: Chinese",
523
- });
524
- }
525
- return t({
526
- zh: "当前默认语言:英文",
527
- en: "Current default language: English",
528
- });
529
- }
530
- async function promptSelectCityBase() {
531
- const servers = listTownCityServers();
532
- const response = (await prompts({
533
- type: "select",
534
- name: "base_url",
535
- message: "选择 City base",
536
- choices: servers.map((server) => ({
537
- title: server.selected ? `* ${server.name}` : server.name,
538
- description: `${server.source} · ${server.base_url}`,
539
- value: server.base_url,
540
- })),
541
- initial: Math.max(0, servers.findIndex((server) => server.selected)),
542
- }));
543
- const base_url = readString(response.base_url);
544
- if (!base_url)
545
- return null;
546
- return servers.find((server) => server.base_url === base_url) ?? null;
547
- }
548
- async function promptRechargeInput() {
549
- const response = (await prompts([
550
- {
551
- type: "number",
552
- name: "amount",
553
- message: "充值金额",
554
- min: 1,
555
- validate: (value) => Number.isInteger(value) && value > 0 ? true : "请输入正整数",
556
- },
557
- {
558
- type: "text",
559
- name: "note",
560
- message: "说明(可选)",
561
- initial: "Town user recharge",
562
- },
563
- {
564
- type: "confirm",
565
- name: "open_checkout",
566
- message: "创建后打开支付页面?",
567
- initial: true,
568
- },
569
- ]));
570
- const amount = Number(response.amount);
571
- if (!Number.isInteger(amount) || amount <= 0)
572
- return null;
573
- return {
574
- amount,
575
- method_id: "stripe",
576
- note: readString(response.note),
577
- open_checkout: response.open_checkout !== false,
578
- };
326
+ await open_city_manager_tui();
579
327
  }
580
328
  //# sourceMappingURL=CityConnection.js.map