@tokenbuddy/tb-admin 1.0.30 → 1.0.32

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 (52) hide show
  1. package/dist/src/cli.d.ts.map +1 -1
  2. package/dist/src/cli.js +280 -19
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/client.d.ts +82 -2
  5. package/dist/src/client.d.ts.map +1 -1
  6. package/dist/src/client.js +93 -0
  7. package/dist/src/client.js.map +1 -1
  8. package/dist/src/provider.d.ts +120 -0
  9. package/dist/src/provider.d.ts.map +1 -0
  10. package/dist/src/provider.js +73 -0
  11. package/dist/src/provider.js.map +1 -0
  12. package/dist/src/seller.d.ts +104 -0
  13. package/dist/src/seller.d.ts.map +1 -0
  14. package/dist/src/seller.js +283 -0
  15. package/dist/src/seller.js.map +1 -0
  16. package/dist/src/ui-actions.d.ts +25 -0
  17. package/dist/src/ui-actions.d.ts.map +1 -1
  18. package/dist/src/ui-actions.js +81 -11
  19. package/dist/src/ui-actions.js.map +1 -1
  20. package/dist/src/ui-server.js +9 -0
  21. package/dist/src/ui-server.js.map +1 -1
  22. package/dist/src/ui-state.d.ts +77 -2
  23. package/dist/src/ui-state.d.ts.map +1 -1
  24. package/dist/src/ui-state.js +242 -14
  25. package/dist/src/ui-state.js.map +1 -1
  26. package/dist/src/ui-static.d.ts.map +1 -1
  27. package/dist/src/ui-static.js +95 -17
  28. package/dist/src/ui-static.js.map +1 -1
  29. package/dist/src/vendor-client.d.ts +23 -0
  30. package/dist/src/vendor-client.d.ts.map +1 -0
  31. package/dist/src/vendor-client.js +2 -0
  32. package/dist/src/vendor-client.js.map +1 -0
  33. package/dist/src/vendor-commands.d.ts +35 -0
  34. package/dist/src/vendor-commands.d.ts.map +1 -0
  35. package/dist/src/vendor-commands.js +33 -0
  36. package/dist/src/vendor-commands.js.map +1 -0
  37. package/package.json +1 -1
  38. package/src/cli.ts +305 -31
  39. package/src/client.ts +119 -2
  40. package/src/provider.ts +150 -0
  41. package/src/seller.ts +362 -0
  42. package/src/ui-actions.ts +89 -11
  43. package/src/ui-server.ts +9 -0
  44. package/src/ui-state.ts +293 -15
  45. package/src/ui-static.ts +95 -17
  46. package/src/vendor-client.ts +23 -0
  47. package/src/vendor-commands.ts +65 -0
  48. package/tests/admin.test.ts +20 -1
  49. package/tests/seller.test.ts +307 -0
  50. package/tests/ui-state-fleet.test.ts +257 -0
  51. package/tests/ui-static-row.test.ts +202 -0
  52. package/tests/vendor-cli.test.ts +197 -0
@@ -3,8 +3,8 @@
3
3
  * 内部封装 Bearer Token 鉴权、JSON 序列化、非 2xx 抛错的统一行为。
4
4
  */
5
5
  export declare class AdminClient {
6
- private baseUrl;
7
- private token;
6
+ protected baseUrl: string;
7
+ protected token: string;
8
8
  constructor(baseUrl: string, token: string);
9
9
  private request;
10
10
  get(path: string): Promise<any>;
@@ -21,4 +21,84 @@ export declare class AdminClient {
21
21
  [key: string]: string;
22
22
  }): Promise<any>;
23
23
  }
24
+ /**
25
+ * Vendor domain client. Step 5 of the registry redesign: vendor
26
+ * tokens call `/platform/*` (Bearer auth). The old `bootstrap
27
+ * config*`, `bootstrap registry publish`, and `bootstrap default-
28
+ * seller set` commands have been removed; vendors stage sellers and
29
+ * submit release requests instead.
30
+ */
31
+ export declare class RegistryVendorClient extends AdminClient {
32
+ me(): Promise<{
33
+ vendor: {
34
+ id: string;
35
+ name: string;
36
+ status: string;
37
+ };
38
+ }>;
39
+ listSellers(): Promise<{
40
+ sellers: unknown[];
41
+ }>;
42
+ /**
43
+ * Step 14 (v1.1): vendor-scoped seller status mutation.
44
+ * Replaces the old `tb-admin bootstrap sellers status` path which called
45
+ * /operator/registry/sellers/:id/status (operator-level, super-admin scope).
46
+ * Vendor can only mutate sellers in its own scope; the platform vendor
47
+ * (DEFAULT_PLATFORM_VENDOR_ID) can mutate any.
48
+ */
49
+ setSellerStatus(id: string, status: "active" | "draining" | "offline", options?: {
50
+ expectedVersion?: number;
51
+ idempotencyKey?: string;
52
+ }): Promise<{
53
+ registry: {
54
+ version: number;
55
+ sellers: unknown[];
56
+ };
57
+ }>;
58
+ stageSeller(seller: unknown): Promise<{
59
+ pendingSeller: unknown;
60
+ }>;
61
+ listPendingSellers(status?: string): Promise<{
62
+ pendingSellers: unknown[];
63
+ }>;
64
+ submitRelease(input: {
65
+ stagedSellerIds: string[];
66
+ note?: string;
67
+ }): Promise<{
68
+ releaseRequest: unknown;
69
+ }>;
70
+ listReleaseRequests(limit?: number): Promise<{
71
+ releaseRequests: unknown[];
72
+ }>;
73
+ getReleaseRequest(id: number): Promise<{
74
+ releaseRequest: unknown;
75
+ }>;
76
+ }
77
+ /**
78
+ * Super-admin client. Used by automated scripts / CI to drive the
79
+ * admin web endpoints (force-publish, registry versions, audit).
80
+ * Step 5 keeps this narrow; the human-facing flow is the browser.
81
+ */
82
+ export declare class RegistryAdminClient extends AdminClient {
83
+ constructor(baseUrl: string, superAdminKey: string);
84
+ protected overrideHeaders(headers: Record<string, string>): Record<string, string>;
85
+ private requestAdmin;
86
+ listVendors(): Promise<{
87
+ vendors: unknown[];
88
+ }>;
89
+ createVendor(name: string): Promise<{
90
+ vendor: unknown;
91
+ token: string;
92
+ }>;
93
+ forcePublish(releaseId: number): Promise<{
94
+ releaseRequest: unknown;
95
+ publishedVersion: number | null;
96
+ }>;
97
+ listVersions(): Promise<{
98
+ versions: unknown[];
99
+ }>;
100
+ listAudit(): Promise<{
101
+ records: unknown[];
102
+ }>;
103
+ }
24
104
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;YAK5B,OAAO;IA8BR,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAI/B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAIhF,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAIjF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAIlF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;CAGjG"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -52,4 +52,97 @@ export class AdminClient {
52
52
  return this.request(path, "DELETE", body, headers);
53
53
  }
54
54
  }
55
+ /**
56
+ * Vendor domain client. Step 5 of the registry redesign: vendor
57
+ * tokens call `/platform/*` (Bearer auth). The old `bootstrap
58
+ * config*`, `bootstrap registry publish`, and `bootstrap default-
59
+ * seller set` commands have been removed; vendors stage sellers and
60
+ * submit release requests instead.
61
+ */
62
+ export class RegistryVendorClient extends AdminClient {
63
+ async me() {
64
+ return this.get("/platform/me");
65
+ }
66
+ async listSellers() {
67
+ return this.get("/platform/sellers");
68
+ }
69
+ /**
70
+ * Step 14 (v1.1): vendor-scoped seller status mutation.
71
+ * Replaces the old `tb-admin bootstrap sellers status` path which called
72
+ * /operator/registry/sellers/:id/status (operator-level, super-admin scope).
73
+ * Vendor can only mutate sellers in its own scope; the platform vendor
74
+ * (DEFAULT_PLATFORM_VENDOR_ID) can mutate any.
75
+ */
76
+ async setSellerStatus(id, status, options = {}) {
77
+ const headers = {};
78
+ if (options.idempotencyKey) {
79
+ headers["Idempotency-Key"] = options.idempotencyKey;
80
+ }
81
+ return this.put(`/platform/sellers/${encodeURIComponent(id)}/status`, {
82
+ status,
83
+ ...(options.expectedVersion !== undefined ? { expectedVersion: options.expectedVersion } : {})
84
+ }, headers);
85
+ }
86
+ async stageSeller(seller) {
87
+ return this.post("/platform/sellers/stage", { seller });
88
+ }
89
+ async listPendingSellers(status) {
90
+ const path = status ? `/platform/sellers/pending?status=${encodeURIComponent(status)}` : "/platform/sellers/pending";
91
+ return this.get(path);
92
+ }
93
+ async submitRelease(input) {
94
+ return this.post("/platform/release-requests", input);
95
+ }
96
+ async listReleaseRequests(limit = 20) {
97
+ return this.get(`/platform/release-requests?limit=${limit}`);
98
+ }
99
+ async getReleaseRequest(id) {
100
+ return this.get(`/platform/release-requests/${id}`);
101
+ }
102
+ }
103
+ /**
104
+ * Super-admin client. Used by automated scripts / CI to drive the
105
+ * admin web endpoints (force-publish, registry versions, audit).
106
+ * Step 5 keeps this narrow; the human-facing flow is the browser.
107
+ */
108
+ export class RegistryAdminClient extends AdminClient {
109
+ constructor(baseUrl, superAdminKey) {
110
+ // We pass the super-admin key as the "token" but override the
111
+ // Authorization header below — super-admin uses the
112
+ // `X-Registry-Admin-Key` header, not Bearer.
113
+ super(baseUrl, superAdminKey);
114
+ }
115
+ overrideHeaders(headers) {
116
+ return { ...headers, "X-Registry-Admin-Key": this.token };
117
+ }
118
+ async requestAdmin(path, method, body) {
119
+ const url = `${this.baseUrl}${path}`;
120
+ const headers = this.overrideHeaders({ "Content-Type": "application/json" });
121
+ const options = { method, headers };
122
+ if (body)
123
+ options.body = JSON.stringify(body);
124
+ const response = await fetch(url, options);
125
+ if (!response.ok) {
126
+ const text = await response.text();
127
+ throw new Error(`HTTP Error ${response.status}: ${text || response.statusText}`);
128
+ }
129
+ const text = await response.text();
130
+ return text ? JSON.parse(text) : {};
131
+ }
132
+ async listVendors() {
133
+ return this.requestAdmin("/platform/vendors", "GET");
134
+ }
135
+ async createVendor(name) {
136
+ return this.requestAdmin("/platform/vendors", "POST", { name });
137
+ }
138
+ async forcePublish(releaseId) {
139
+ return this.requestAdmin(`/platform/admin/release-requests/${releaseId}/force-publish`, "POST");
140
+ }
141
+ async listVersions() {
142
+ return this.requestAdmin("/platform/admin/registry-versions", "GET");
143
+ }
144
+ async listAudit() {
145
+ return this.requestAdmin("/platform/audit", "GET");
146
+ }
147
+ }
55
148
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,WAAW;IACd,OAAO,CAAS;IAChB,KAAK,CAAS;IAEtB,YAAY,OAAe,EAAE,KAAa;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,MAAc,EAAE,IAAU,EAAE,eAA0C,EAAE;QAC1G,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAA8B;YACzC,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACvC,GAAG,YAAY;SAChB,CAAC;QAEF,MAAM,OAAO,GAAgB;YAC3B,MAAM;YACN,OAAO;SACR,CAAC;QAEF,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,IAAY;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,IAAU,EAAE,OAAmC;QAC5E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,IAAU,EAAE,OAAmC;QAC7E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,IAAU,EAAE,OAAmC;QAC9E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,IAAU,EAAE,OAAmC;QAC/E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;CACF"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,WAAW;IACZ,OAAO,CAAS;IAChB,KAAK,CAAS;IAExB,YAAY,OAAe,EAAE,KAAa;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,MAAc,EAAE,IAAU,EAAE,eAA0C,EAAE;QAC1G,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAA8B;YACzC,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACvC,GAAG,YAAY;SAChB,CAAC;QAEF,MAAM,OAAO,GAAgB;YAC3B,MAAM;YACN,OAAO;SACR,CAAC;QAEF,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,IAAY;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,IAAU,EAAE,OAAmC;QAC5E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,IAAU,EAAE,OAAmC;QAC7E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,IAAU,EAAE,OAAmC;QAC9E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,IAAU,EAAE,OAAmC;QAC/E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IAC5C,KAAK,CAAC,EAAE;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,WAAW;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,eAAe,CAC1B,EAAU,EACV,MAAyC,EACzC,UAAiE,EAAE;QAEnE,MAAM,OAAO,GAA8B,EAAE,CAAC;QAC9C,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CACb,qBAAqB,kBAAkB,CAAC,EAAE,CAAC,SAAS,EACpD;YACE,MAAM;YACN,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/F,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,MAAe;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,MAAe;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,oCAAoC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B,CAAC;QACrH,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,KAAmD;QAC5E,OAAO,IAAI,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,KAAK,GAAG,EAAE;QACzC,OAAO,IAAI,CAAC,GAAG,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,EAAU;QACvC,OAAO,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IAClD,YAAY,OAAe,EAAE,aAAqB;QAChD,8DAA8D;QAC9D,oDAAoD;QACpD,6CAA6C;QAC7C,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAChC,CAAC;IAES,eAAe,CAAC,OAA+B;QACvD,OAAO,EAAE,GAAG,OAAO,EAAE,sBAAsB,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,MAAc,EAAE,IAAU;QACjE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACjD,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,WAAW;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,IAAY;QACpC,OAAO,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,SAAiB;QACzC,OAAO,IAAI,CAAC,YAAY,CAAC,oCAAoC,SAAS,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAClG,CAAC;IAEM,KAAK,CAAC,YAAY;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;IAEM,KAAK,CAAC,SAAS;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;CACF"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Step 12 (provider-agnostic seller management):
3
+ * 抽象 seller provider 接口, 让 tb-admin CLI + UI 不再 hardcode
4
+ * Fly.io 调用。
5
+ *
6
+ * 设计原则 (跟用户 ZCG 在 2026-06-11 凌晨讨论):
7
+ * - 一个 `SellerProvider` 实现对应一种底层平台 (Fly.io / mock / ...).
8
+ * - 5 个核心操作: listApps / statusApp / createApp / deployApp / removeApp.
9
+ * - 所有方法都接受 dryRun, 都在 provider config 缺失必填字段时抛错.
10
+ * - 所有方法都支持 `json: true` 输出, 方便 UI / 测试 / 自动化调用.
11
+ * - Provider 通过 `ProviderRegistry` 注册, 默认 'fly' 实现是
12
+ * `FlyProvider` (从 server-cmd.ts 拆出), 'mock' 是测试实现.
13
+ * - 调用方 (CLI / UI / 其他) 都通过 `ProviderRegistry.get(name)` 取.
14
+ * - `tb-admin seller <cmd>` CLI 子命令全部加 `--provider <name>`
15
+ * (默认 'fly') + `--json` flag.
16
+ *
17
+ * 注意: Fly 字段 (`flyctl_path` / `default_region` / ...) 仍放在
18
+ * `SellerProviderConfig` 里, 不引入新的 provider 专用 config 字段
19
+ * (避免拆得过细). 未来加 K8s / 自建集群 provider 时, 把 `flyctl_path`
20
+ * 等字段移到 `FlyConfig` 子接口, 让 `SellerProviderConfig` 持有
21
+ * 通用字段 (default_region / default_image / volume_* 跨 provider 通用).
22
+ */
23
+ import type { SellerProviderConfig } from "./config.js";
24
+ /** Dry-run / json 通用选项, 所有方法都接受 */
25
+ export interface ProviderCallOptions {
26
+ dryRun?: boolean;
27
+ /** 静默: 不打 [Fly.io] / [Mock] 之类的人类可读日志, 只输出 json */
28
+ silent?: boolean;
29
+ }
30
+ /** Provider 必须能列出所有它知道的应用, 跨 provider 字段对齐 */
31
+ export interface SellerAppEntry {
32
+ /** Provider 内的应用 id (Fly 跟 K8s 各自定义) */
33
+ name: string;
34
+ /** 状态 (active / suspended / deployed / pending / unknown). 各 provider 各自定义枚举. */
35
+ status: string;
36
+ /** Provider 内部 id, 跨 provider 不必有意义. UI 用它跳转详情. */
37
+ providerId: string;
38
+ /** Region / zone / namespace. */
39
+ region?: string;
40
+ /** 上次部署时间 ISO 字符串. */
41
+ lastDeployAt?: string;
42
+ /** provider 特有的元数据 (machines count / image / 等) */
43
+ metadata?: Record<string, unknown>;
44
+ }
45
+ /** Provider 创建入参. 字段尽量 provider-agnostic; 私有字段放 `providerOptions` */
46
+ export interface SellerCreateInput {
47
+ name: string;
48
+ region?: string;
49
+ image?: string;
50
+ operatorSecret: string;
51
+ initialConfigPath?: string;
52
+ volumeName?: string;
53
+ volumeSizeGb?: number;
54
+ volumeId?: string;
55
+ volumeSnapshotRetentionDays?: number;
56
+ dryRun?: boolean;
57
+ /** provider 私有扩展 (FlyConfig / K8sConfig / ...) */
58
+ providerOptions?: Record<string, unknown>;
59
+ }
60
+ /** Provider deploy 入参 */
61
+ export interface SellerDeployInput {
62
+ app: string;
63
+ image?: string;
64
+ dryRun?: boolean;
65
+ providerOptions?: Record<string, unknown>;
66
+ }
67
+ /** Provider 通用 5 操作接口 */
68
+ export interface SellerProvider {
69
+ /** provider 名 ('fly' / 'mock' / 'k8s' 等), 用于 `tb-admin --provider <name>` 选择 */
70
+ readonly name: string;
71
+ /** 检测 provider runtime 是否装好 (flyctl / kubectl / etc). CLI 启动时调用一次. */
72
+ isAvailable(): boolean;
73
+ /** List all apps this provider manages. */
74
+ listApps(options?: ProviderCallOptions): Promise<SellerAppEntry[]>;
75
+ /** Get one app's status (machine state / region / last deploy). */
76
+ statusApp(name: string, options?: ProviderCallOptions): Promise<SellerAppEntry>;
77
+ /** Create + initial deploy. `dryRun` 模式只输出计划. */
78
+ createApp(input: SellerCreateInput): Promise<{
79
+ ok: true;
80
+ app: string;
81
+ dryRun: boolean;
82
+ }>;
83
+ /** Update image on existing app. */
84
+ deployApp(input: SellerDeployInput): Promise<{
85
+ ok: true;
86
+ app: string;
87
+ machines: string[];
88
+ dryRun: boolean;
89
+ }>;
90
+ /** Destroy app. */
91
+ removeApp(name: string, options?: ProviderCallOptions): Promise<{
92
+ ok: true;
93
+ app: string;
94
+ dryRun: boolean;
95
+ }>;
96
+ }
97
+ /**
98
+ * Provider registry: CLI / UI / 测试都通过 `ProviderRegistry.get(name)`
99
+ * 拿 provider. 构造时塞一份 SellerProviderConfig, 跟现有
100
+ * `configManager.getSellerProvider(name)` 同源.
101
+ */
102
+ export declare class ProviderRegistry {
103
+ private configManager;
104
+ private providers;
105
+ constructor(configManager: {
106
+ getSellerProvider(name?: string): SellerProviderConfig | undefined;
107
+ });
108
+ /** 注册一个 provider. 测试场景用. */
109
+ register(provider: SellerProvider): void;
110
+ /** 取 provider. 默认 'fly'. 不存在抛错 (CLI 应该 fail fast). */
111
+ get(name?: string): SellerProvider;
112
+ /** 列出所有已注册 provider 名. */
113
+ list(): string[];
114
+ }
115
+ /**
116
+ * 默认 provider 工厂. 'fly' -> FlyProvider.
117
+ * 任何未知 name 抛错. 通过 import 避免循环依赖, 所以放在文件底部.
118
+ */
119
+ export declare function createDefaultProvider(name: string, config: SellerProviderConfig): SellerProvider;
120
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Step 12 (provider-agnostic seller management):
3
+ * 抽象 seller provider 接口, 让 tb-admin CLI + UI 不再 hardcode
4
+ * Fly.io 调用。
5
+ *
6
+ * 设计原则 (跟用户 ZCG 在 2026-06-11 凌晨讨论):
7
+ * - 一个 `SellerProvider` 实现对应一种底层平台 (Fly.io / mock / ...).
8
+ * - 5 个核心操作: listApps / statusApp / createApp / deployApp / removeApp.
9
+ * - 所有方法都接受 dryRun, 都在 provider config 缺失必填字段时抛错.
10
+ * - 所有方法都支持 `json: true` 输出, 方便 UI / 测试 / 自动化调用.
11
+ * - Provider 通过 `ProviderRegistry` 注册, 默认 'fly' 实现是
12
+ * `FlyProvider` (从 server-cmd.ts 拆出), 'mock' 是测试实现.
13
+ * - 调用方 (CLI / UI / 其他) 都通过 `ProviderRegistry.get(name)` 取.
14
+ * - `tb-admin seller <cmd>` CLI 子命令全部加 `--provider <name>`
15
+ * (默认 'fly') + `--json` flag.
16
+ *
17
+ * 注意: Fly 字段 (`flyctl_path` / `default_region` / ...) 仍放在
18
+ * `SellerProviderConfig` 里, 不引入新的 provider 专用 config 字段
19
+ * (避免拆得过细). 未来加 K8s / 自建集群 provider 时, 把 `flyctl_path`
20
+ * 等字段移到 `FlyConfig` 子接口, 让 `SellerProviderConfig` 持有
21
+ * 通用字段 (default_region / default_image / volume_* 跨 provider 通用).
22
+ */
23
+ /**
24
+ * Provider registry: CLI / UI / 测试都通过 `ProviderRegistry.get(name)`
25
+ * 拿 provider. 构造时塞一份 SellerProviderConfig, 跟现有
26
+ * `configManager.getSellerProvider(name)` 同源.
27
+ */
28
+ export class ProviderRegistry {
29
+ configManager;
30
+ providers = new Map();
31
+ constructor(configManager) {
32
+ this.configManager = configManager;
33
+ }
34
+ /** 注册一个 provider. 测试场景用. */
35
+ register(provider) {
36
+ this.providers.set(provider.name, provider);
37
+ }
38
+ /** 取 provider. 默认 'fly'. 不存在抛错 (CLI 应该 fail fast). */
39
+ get(name = "fly") {
40
+ const registered = this.providers.get(name);
41
+ if (registered) {
42
+ return registered;
43
+ }
44
+ // 还没注册 -> 现造一个 (FlyProvider / MockProvider 各自 lazy 构造)
45
+ const config = this.configManager.getSellerProvider(name);
46
+ if (!config) {
47
+ throw new Error(`provider '${name}' is not configured. ` +
48
+ `Run \`tb-admin config set <profile>\` first, or add a [seller_providers.${name}] section.`);
49
+ }
50
+ const instance = createDefaultProvider(name, config);
51
+ this.providers.set(name, instance);
52
+ return instance;
53
+ }
54
+ /** 列出所有已注册 provider 名. */
55
+ list() {
56
+ return Array.from(this.providers.keys());
57
+ }
58
+ }
59
+ /**
60
+ * 默认 provider 工厂. 'fly' -> FlyProvider.
61
+ * 任何未知 name 抛错. 通过 import 避免循环依赖, 所以放在文件底部.
62
+ */
63
+ export function createDefaultProvider(name, config) {
64
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
65
+ const { FlyProvider } = require("./server-cmd.js");
66
+ if (name === "fly") {
67
+ // Step 14 之前 FlyProvider 暂不 implements SellerProvider (保留 1.0.31 行为 1:1).
68
+ // 这里通过 unknown 桥接; 真用时调用方应通过 SellerCommandRunner 而不是直接用 ProviderRegistry.
69
+ return new FlyProvider(config);
70
+ }
71
+ throw new Error(`unknown provider name: '${name}' (built-in: fly)`);
72
+ }
73
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AA2EH;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IAGP;IAFZ,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEtD,YAAoB,aAAqF;QAArF,kBAAa,GAAb,aAAa,CAAwE;IAAG,CAAC;IAE7G,4BAA4B;IAC5B,QAAQ,CAAC,QAAwB;QAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,sDAAsD;IACtD,GAAG,CAAC,OAAe,KAAK;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,uDAAuD;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,aAAa,IAAI,uBAAuB;gBACxC,2EAA2E,IAAI,YAAY,CAC5F,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,MAA4B;IAC9E,8DAA8D;IAC9D,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAqC,CAAC;IACvF,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,0EAA0E;QAC1E,0EAA0E;QAC1E,OAAO,IAAI,WAAW,CAAC,MAAM,CAA8B,CAAC;IAC9D,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,mBAAmB,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Step 12 v1.1 (增量): tb-admin seller 子命令 CLI 门面层.
3
+ *
4
+ * 1.0.31 现状:
5
+ * - `tb-admin seller ls|create|deploy|remove` 4 个子命令
6
+ * - 每个命令内部直接 `console.log(FlyProvider.<method>() 的 string 返回值)`
7
+ * - 1.0.31 文本输出跟 flyctl 原始 stdout 一致 (人类可读表 / 状态文案)
8
+ *
9
+ * v1.1 增量:
10
+ * 1. 新增 `tb-admin seller status <app>` 第 5 子命令
11
+ * 2. 5 个子命令全部加 `--json` flag
12
+ * 3. `--json` 输出统一包装:
13
+ * - ls/status: 直接拿 flyctl `--json` 解析后的 array / object
14
+ * - create/deploy/remove: `{ ok, provider, action, app, dryRun, ... }`
15
+ * 4. 默认路径 1:1 保留 1.0.31 行为 (FlyProvider 不变, server-cmd.ts 不动)
16
+ * 5. UI 之后通过 spawn `tb-admin seller <cmd> --json` 取结构化数据
17
+ *
18
+ * 不改: FlyProvider 类 / server-cmd.ts / admin web / provider.ts.
19
+ * 不写 UI (Step 13).
20
+ */
21
+ import { type SellerCreateOptions } from "./server-cmd.js";
22
+ import type { ConfigManager } from "./config.js";
23
+ /** 单个 seller app 的 JSON 形态 (跟 flyctl apps list --json 对齐, 但只保留 UI 关心字段) */
24
+ export interface SellerAppJson {
25
+ name: string;
26
+ status: string;
27
+ owner?: string;
28
+ region?: string;
29
+ version?: number;
30
+ latestDeployAt?: string;
31
+ /** raw flyctl 字段, 保留供未来扩展 */
32
+ raw: Record<string, unknown>;
33
+ }
34
+ /** ls --json 输出 */
35
+ export interface SellerListResult {
36
+ ok: true;
37
+ provider: "fly";
38
+ action: "list";
39
+ count: number;
40
+ apps: SellerAppJson[];
41
+ }
42
+ /** status --json 输出 */
43
+ export interface SellerStatusResult {
44
+ ok: true;
45
+ provider: "fly";
46
+ action: "status";
47
+ app: string;
48
+ status: Record<string, unknown>;
49
+ }
50
+ /** create / deploy / remove --json 输出 */
51
+ export interface SellerActionResult<T extends "create" | "deploy" | "remove"> {
52
+ ok: true;
53
+ provider: "fly";
54
+ action: T;
55
+ app: string;
56
+ dryRun: boolean;
57
+ /** dry-run 模式下, 列出实际会跑的 flyctl 命令 */
58
+ commands?: string[];
59
+ /** 实际执行后, flyctl 输出摘录 (limited to stdout summary) */
60
+ summary?: string;
61
+ /** create/deploy 额外信息 */
62
+ machines?: string[];
63
+ }
64
+ export type SellerCommandResult = SellerListResult | SellerStatusResult | SellerActionResult<"create"> | SellerActionResult<"deploy"> | SellerActionResult<"remove">;
65
+ export declare class FlyCliMissingError extends Error {
66
+ readonly flyctl: string;
67
+ constructor(flyctl: string);
68
+ }
69
+ export declare class FlyCommandError extends Error {
70
+ readonly command: string;
71
+ readonly exitCode: number;
72
+ readonly stderr: string;
73
+ constructor(command: string, exitCode: number, stderr: string);
74
+ }
75
+ /**
76
+ * 解析 flyctl apps list 文本输出 (人类可读表) -> 数组.
77
+ * 默认路径不变; --json 路径用 `parseFlyListJson` 走结构化路径.
78
+ */
79
+ declare function parseFlyListText(text: string): SellerAppJson[];
80
+ declare function parseFlyListJson(jsonText: string): SellerAppJson[];
81
+ declare function parseFlyStatusJson(jsonText: string): Record<string, unknown>;
82
+ /**
83
+ * 顶层 seller 命令入口. 5 个 op 都走这里.
84
+ * - `json=false` (默认): 走 FlyProvider 现有方法, 返回人类可读 string, 调用方 console.log
85
+ * - `json=true`: 走结构化 flyctl --json + 包装, 返回 SellerCommandResult 对象
86
+ */
87
+ export declare class SellerCommandRunner {
88
+ private configManager;
89
+ constructor(configManager: ConfigManager);
90
+ private getProviderConfig;
91
+ private getProvider;
92
+ private getFlyctl;
93
+ ls(json: boolean): SellerListResult | string;
94
+ status(appName: string, json: boolean): SellerStatusResult | string;
95
+ create(options: SellerCreateOptions, json: boolean): SellerActionResult<"create"> | string;
96
+ deploy(args: {
97
+ app: string;
98
+ image?: string;
99
+ dryRun?: boolean;
100
+ }, json: boolean): SellerActionResult<"deploy"> | string;
101
+ remove(appName: string, dryRun: boolean, json: boolean): SellerActionResult<"remove"> | string;
102
+ }
103
+ export { parseFlyListJson, parseFlyListText, parseFlyStatusJson };
104
+ //# sourceMappingURL=seller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller.d.ts","sourceRoot":"","sources":["../../src/seller.ts"],"names":[],"mappings":"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"}