dsh-himarket 0.1.1 → 0.1.4

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/lib/client.js CHANGED
@@ -65,7 +65,21 @@ var zh = {
65
65
  installed: "\u5DF2\u88C5",
66
66
  empty: "\u6682\u65E0\u6570\u636E\uFF0C\u8BF7\u5148\u300C\u540C\u6B65\u300D\u6216\u68C0\u67E5\u8D26\u53F7\u662F\u5426\u5DF2\u8BA2\u9605/\u4E0A\u67B6\u3002",
67
67
  error: "\u51FA\u9519\u4E86",
68
- ok: "\u5B8C\u6210"
68
+ ok: "\u5B8C\u6210",
69
+ publishTitle: "\u2463 \u53D1\u5E03\u6211\u7684\u5C97\u4F4D\u5230\u5E02\u573A",
70
+ publishHint: "\u628A\u672C\u673A\u5DF2\u8FED\u4EE3\u4F18\u5316\u7684\u6570\u5B57\u5458\u5DE5\u5C97\u4F4D\uFF08preset \u4EBA\u8BBE + \u5C97\u4F4D\u6280\u80FD\uFF09\u6253\u5305\u4E0A\u67B6\uFF0C\u4F9B\u540C\u4E8B\u540C\u6B65\u5B89\u88C5\u3002\u53D1\u5E03\u8D70\u5305\u88C5\u5C42\uFF08\u4F01\u4E1A\u7EDF\u4E00\u901A\u9053\uFF0C\u81EA\u52A8\u767B\u8BB0\u5F52\u5C5E/\u6765\u6E90\uFF09\uFF0C\u8BF7\u5148\u586B\u597D\u4E0A\u65B9\u5305\u88C5\u5C42\u5730\u5740\u3002",
71
+ publish: "\u53D1\u5E03",
72
+ publishing: "\u53D1\u5E03\u4E2D",
73
+ gatewayLabel: "\u5305\u88C5\u5C42\u5730\u5740",
74
+ gatewayPlaceholder: "\u5982 http://ai-job.ict.cmcc\uFF0C\u53D1\u5E03\u4E0E\u6765\u6E90\u6807\u7B7E\u90FD\u8D70\u5B83",
75
+ sourceOfficial: "\u4F01\u4E1A\u53D1\u5E03",
76
+ sourceCommunity: "\u5458\u5DE5\u5171\u5EFA",
77
+ filterAll: "\u5168\u90E8",
78
+ filterOfficial: "\u4F01\u4E1A\u53D1\u5E03",
79
+ filterCommunity: "\u5458\u5DE5\u5171\u5EFA",
80
+ overrideTag: "\u5458\u5DE5\u6539\u8FDB\u7248",
81
+ overrideOf: "\u8986\u76D6",
82
+ overriddenHint: "\u6709\u5458\u5DE5\u6539\u8FDB\u7248\uFF08\u5B98\u65B9\u9ED8\u8BA4\uFF0C\u53EF\u9009\u7528\u6539\u8FDB\u7248\uFF09"
69
83
  };
70
84
  var en = {
71
85
  tab: "HiMarket",
@@ -85,7 +99,21 @@ var en = {
85
99
  installed: "Installed",
86
100
  empty: "Nothing yet. Sync first, or check subscriptions/published items.",
87
101
  error: "Error",
88
- ok: "Done"
102
+ ok: "Done",
103
+ publishTitle: "4. Publish My Job to Market",
104
+ publishHint: "Package your locally iterated digital-employee job (preset persona + job skill) and publish it for colleagues to install. Publishing goes through the gateway (enterprise channel, records ownership/source automatically). Fill in the gateway URL above first.",
105
+ publish: "Publish",
106
+ publishing: "Publishing",
107
+ gatewayLabel: "Gateway URL",
108
+ gatewayPlaceholder: "e.g. http://ai-job.ict.cmcc; publishing and source tags go through it",
109
+ sourceOfficial: "Official",
110
+ sourceCommunity: "Community",
111
+ filterAll: "All",
112
+ filterOfficial: "Official",
113
+ filterCommunity: "Community",
114
+ overrideTag: "Community Fork",
115
+ overrideOf: "of",
116
+ overriddenHint: "has community forks (official default; fork optional)"
89
117
  };
90
118
  var CSS = [
91
119
  ".hm_section{width:100%;max-width:760px;display:flex;flex-direction:column;gap:14px;color:var(--dsw-alias-label-primary)}",
@@ -105,7 +133,14 @@ var CSS = [
105
133
  ".hm_name{font-size:13px;font-weight:600;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}",
106
134
  ".hm_desc{font-size:12px;color:var(--dsw-alias-label-tertiary);margin:0}",
107
135
  ".hm_tag{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);border-radius:999px;padding:1px 8px;font-size:11px;line-height:16px;flex:none}",
108
- ".hm_tag[data-ok=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}"
136
+ ".hm_tag[data-ok=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}",
137
+ ".hm_tag[data-source=official]{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}",
138
+ ".hm_tag[data-source=community]{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary)}",
139
+ ".hm_btn[data-active=true]{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:#fff}",
140
+ ".hm_overrides{margin-top:4px;padding:6px 8px;background:var(--dsw-alias-bg-layer-2);border-radius:8px;display:grid;gap:6px}",
141
+ ".hm_overrides .hm_desc{margin:0 0 2px 0}",
142
+ ".hm_overrides .hm_list{gap:4px}",
143
+ ".hm_overrides .hm_item{padding:6px 8px}"
109
144
  ].join("\n");
110
145
  function injectCss() {
111
146
  const tagId = "dsh-himarket/client.css";
@@ -131,11 +166,14 @@ function HimarketTab(props) {
131
166
  const [baseUrl, setBaseUrl] = import_react.default.useState("");
132
167
  const [username, setUsername] = import_react.default.useState("");
133
168
  const [password, setPassword] = import_react.default.useState("");
169
+ const [gatewayUrl, setGatewayUrl] = import_react.default.useState("");
170
+ const [sourceFilter, setSourceFilter] = import_react.default.useState("ALL");
134
171
  const refresh = import_react.default.useCallback(function() {
135
172
  call("/himarket/state").then(function(data2) {
136
173
  setState({ status: "ready", data: data2 });
137
174
  if (data2 && data2.baseUrl) setBaseUrl(data2.baseUrl);
138
175
  if (data2 && data2.username) setUsername(data2.username);
176
+ if (data2 && data2.gatewayUrl) setGatewayUrl(data2.gatewayUrl);
139
177
  }, function(err) {
140
178
  setState({ status: "error", error: err.message });
141
179
  });
@@ -145,7 +183,8 @@ function HimarketTab(props) {
145
183
  }, [refresh]);
146
184
  function saveConfig() {
147
185
  setBusy(true);
148
- call("/himarket/save-config", { baseUrl, username, password }).then(
186
+ var patch = { baseUrl, username, password, gatewayUrl };
187
+ call("/himarket/save-config", patch).then(
149
188
  function() {
150
189
  setMessage(t("saved"));
151
190
  setBusy(false);
@@ -180,6 +219,18 @@ function HimarketTab(props) {
180
219
  setBusy(false);
181
220
  });
182
221
  }
222
+ function publishMyJob(job) {
223
+ setBusy(true);
224
+ setMessage(t("publishing") + "\uFF1A" + job);
225
+ call("/himarket/publish-job", { job }).then(function(data2) {
226
+ setMessage(data2.summary || t("ok"));
227
+ setBusy(false);
228
+ refresh();
229
+ }, function(err) {
230
+ setMessage(t("error") + "\uFF1A" + err.message);
231
+ setBusy(false);
232
+ });
233
+ }
183
234
  const data = state.status === "ready" ? state.data : null;
184
235
  const mcpServers = data && data.mcpServers || [];
185
236
  const activeNames = data && data.activeMcpNames || [];
@@ -189,6 +240,55 @@ function HimarketTab(props) {
189
240
  const name = skill && skill.name;
190
241
  return installedSkills.indexOf(name) >= 0;
191
242
  }
243
+ function sourceTag(item) {
244
+ if (!item) return null;
245
+ const src = item.source;
246
+ if (src === "OFFICIAL") {
247
+ return el(
248
+ "span",
249
+ { className: "hm_tag", "data-source": "official", title: item.overriddenBy && item.overriddenBy.length > 0 ? t("overriddenHint") : void 0 },
250
+ t("sourceOfficial")
251
+ );
252
+ }
253
+ if (src === "COMMUNITY") {
254
+ const txt = item.overrides ? t("overrideTag") + "\xB7" + t("overrideOf") + " " + item.overrides : t("sourceCommunity");
255
+ return el("span", { className: "hm_tag", "data-source": "community" }, txt);
256
+ }
257
+ return null;
258
+ }
259
+ function overrideBlock(item) {
260
+ if (!item || !item.overriddenBy || item.overriddenBy.length === 0) return null;
261
+ const hint = item.source === "OFFICIAL" ? t("overriddenHint") : t("overrideTag") + "\uFF1A" + item.overriddenBy.length;
262
+ return el(
263
+ "div",
264
+ { className: "hm_overrides" },
265
+ el("p", { className: "hm_desc" }, hint),
266
+ el(
267
+ "ul",
268
+ { className: "hm_list" },
269
+ item.overriddenBy.map(function(o) {
270
+ const done = installedSkills.indexOf(o.name) >= 0;
271
+ return el(
272
+ "li",
273
+ { className: "hm_item", key: o.productId || o.name },
274
+ el(
275
+ "div",
276
+ { className: "hm_itemTop" },
277
+ el("span", { className: "hm_name" }, o.name + "\uFF08" + o.publisher + "\uFF09"),
278
+ el("span", { className: "hm_tag", "data-source": "community" }, t("overrideTag")),
279
+ el(
280
+ "button",
281
+ { className: "hm_btn", type: "button", disabled: busy || done, onClick: function() {
282
+ installSkill(o.productId);
283
+ } },
284
+ done ? t("installed") : t("install")
285
+ )
286
+ )
287
+ );
288
+ })
289
+ )
290
+ );
291
+ }
192
292
  return el(
193
293
  "div",
194
294
  { className: "hm_section" },
@@ -213,6 +313,12 @@ function HimarketTab(props) {
213
313
  el("label", null, t("passwordLabel")),
214
314
  el("input", { className: "hm_input", type: "password", placeholder: t("passwordPlaceholder"), value: password, onChange: (e) => setPassword(e.target.value) })
215
315
  ),
316
+ el(
317
+ "div",
318
+ { className: "hm_field" },
319
+ el("label", null, t("gatewayLabel")),
320
+ el("input", { className: "hm_input", type: "text", placeholder: t("gatewayPlaceholder"), value: gatewayUrl, onChange: (e) => setGatewayUrl(e.target.value) })
321
+ ),
216
322
  el(
217
323
  "div",
218
324
  { className: "hm_row" },
@@ -225,6 +331,7 @@ function HimarketTab(props) {
225
331
  "ul",
226
332
  { className: "hm_list" },
227
333
  mcpServers.map((mm) => {
334
+ if (sourceFilter !== "ALL" && (mm.source || "COMMUNITY") !== sourceFilter) return null;
228
335
  const active = activeNames.indexOf(mm.name) >= 0;
229
336
  return el(
230
337
  "li",
@@ -233,6 +340,7 @@ function HimarketTab(props) {
233
340
  "div",
234
341
  { className: "hm_itemTop" },
235
342
  el("span", { className: "hm_name" }, mm.name),
343
+ sourceTag(mm),
236
344
  el("span", { className: "hm_tag", "data-ok": active ? "true" : void 0 }, active ? "\u5DF2\u63A5\u5165" : "\u672A\u8FDE\u63A5")
237
345
  ),
238
346
  mm.description ? el("p", { className: "hm_desc" }, mm.description) : null
@@ -240,10 +348,18 @@ function HimarketTab(props) {
240
348
  })
241
349
  ),
242
350
  el("h3", null, t("skillTitle")),
351
+ el(
352
+ "div",
353
+ { className: "hm_row" },
354
+ el("button", { className: "hm_btn", type: "button", "data-active": sourceFilter === "ALL" ? "true" : void 0, onClick: () => setSourceFilter("ALL") }, t("filterAll")),
355
+ el("button", { className: "hm_btn", type: "button", "data-active": sourceFilter === "OFFICIAL" ? "true" : void 0, onClick: () => setSourceFilter("OFFICIAL") }, t("filterOfficial")),
356
+ el("button", { className: "hm_btn", type: "button", "data-active": sourceFilter === "COMMUNITY" ? "true" : void 0, onClick: () => setSourceFilter("COMMUNITY") }, t("filterCommunity"))
357
+ ),
243
358
  publishedSkills.length === 0 ? el("p", { className: "hm_message" }, t("empty")) : el(
244
359
  "ul",
245
360
  { className: "hm_list" },
246
361
  publishedSkills.map((sk) => {
362
+ if (sourceFilter !== "ALL" && (sk.source || "COMMUNITY") !== sourceFilter) return null;
247
363
  const done = isInstalled(sk);
248
364
  return el(
249
365
  "li",
@@ -252,12 +368,23 @@ function HimarketTab(props) {
252
368
  "div",
253
369
  { className: "hm_itemTop" },
254
370
  el("span", { className: "hm_name" }, sk.name),
371
+ sourceTag(sk),
255
372
  el("button", { className: "hm_btn", type: "button", disabled: busy || done, onClick: () => installSkill(sk.productId) }, done ? t("installed") : t("install"))
256
373
  ),
257
- sk.description ? el("p", { className: "hm_desc" }, sk.description) : null
374
+ sk.description ? el("p", { className: "hm_desc" }, sk.description) : null,
375
+ overrideBlock(sk)
258
376
  );
259
377
  })
260
378
  ),
379
+ el("h3", null, t("publishTitle")),
380
+ el("p", { className: "hm_message" }, t("publishHint")),
381
+ el(
382
+ "div",
383
+ { className: "hm_row" },
384
+ ["pm", "dev", "qa", "leader", "newbie", "secretary", "general"].map(function(j) {
385
+ return el("button", { className: "hm_btn", type: "button", disabled: busy, key: j, onClick: () => publishMyJob(j) }, t("publish") + "\uFF1A" + j);
386
+ })
387
+ ),
261
388
  state.status === "error" ? el("p", { className: "hm_message", "data-error": "true" }, t("error") + "\uFF1A" + state.error) : null
262
389
  );
263
390
  }
@@ -17,6 +17,16 @@ export interface SubscribedMcp {
17
17
  url: string;
18
18
  transportType: string;
19
19
  description: string;
20
+ /** 来源标签(由包装层网关注入):OFFICIAL=企业发布,COMMUNITY=员工共建。 */
21
+ source?: 'OFFICIAL' | 'COMMUNITY';
22
+ /** 覆盖的官方产品名(社区覆盖版指向它);空=独立产品。 */
23
+ overrides?: string;
24
+ /** 覆盖本产品的社区版列表(官方产品才有)。 */
25
+ overriddenBy?: Array<{
26
+ productId: string;
27
+ name: string;
28
+ publisher: string;
29
+ }>;
20
30
  }
21
31
  /** 单个已发布 Skill(market-skills 条目)。 */
22
32
  export interface PublishedSkill {
@@ -24,6 +34,16 @@ export interface PublishedSkill {
24
34
  name: string;
25
35
  description: string;
26
36
  skillTags: string[];
37
+ /** 来源标签(由包装层网关注入):OFFICIAL=企业发布,COMMUNITY=员工共建。 */
38
+ source?: 'OFFICIAL' | 'COMMUNITY';
39
+ /** 覆盖的官方产品名(社区覆盖版指向它);空=独立产品。 */
40
+ overrides?: string;
41
+ /** 覆盖本产品的社区版列表(官方产品才有)。 */
42
+ overriddenBy?: Array<{
43
+ productId: string;
44
+ name: string;
45
+ publisher: string;
46
+ }>;
27
47
  }
28
48
  export declare class HimarketError extends Error {
29
49
  }
@@ -35,17 +55,30 @@ export declare class HimarketClient {
35
55
  private readonly baseUrl;
36
56
  private readonly username;
37
57
  private readonly password;
58
+ /** 管理员账号(/admins/login 用,默认 admin);与开发者账号区分。 */
59
+ private readonly adminUsername;
60
+ private readonly adminPassword;
61
+ /** 开发者 token(/developers/login),sync/install 用。 */
38
62
  private token;
63
+ /** 管理员 token(/admins/login),publish 用。 */
64
+ private adminToken;
39
65
  private fetchFn;
40
66
  constructor(opts: {
41
67
  baseUrl: string;
42
68
  username: string;
43
69
  password: string;
70
+ adminUsername?: string;
71
+ adminPassword?: string;
44
72
  token?: string;
73
+ adminToken?: string;
45
74
  fetchFn?: typeof fetch;
46
75
  });
47
76
  get hasToken(): boolean;
48
77
  get currentToken(): string;
78
+ /** 是否已缓存管理员 token(发布前判断)。 */
79
+ adminTokenMissing(): boolean;
80
+ /** 返回缓存的管理员 token(供发布后回写 settings)。 */
81
+ cachedAdminToken(): string;
49
82
  /** 登录并缓存 token;返回 access_token。 */
50
83
  login(): Promise<string>;
51
84
  /** 拉取已订阅(且已批准)的 MCP 列表 + 认证头。 */
@@ -57,6 +90,27 @@ export declare class HimarketClient {
57
90
  listPublishedSkills(): Promise<PublishedSkill[]>;
58
91
  /** 下载 Skill ZIP,返回字节。 */
59
92
  downloadSkill(productId: string): Promise<Uint8Array>;
93
+ /** 管理员登录并缓存 token;返回 access_token。publish 系列走管理员端点。 */
94
+ loginAdmin(): Promise<string>;
95
+ /**
96
+ * 发布一个岗位包 / 技能包 ZIP 到 HiMarket(管理员端点):
97
+ * 确保分类存在 → 建/复用产品 → 上传 zip → 发布最新 draft 版本 online → 发布到门户。
98
+ * 契约与 dsh-job-market/scripts/publish-job.mjs 一致(已实测跑通)。
99
+ *
100
+ * @param name 产品名(岗位 id,如 pm/dev;HiMarket 产品名唯一)
101
+ * @param zipBuffer 打包好的 zip 字节
102
+ * @param opts.portalId 发布到的门户 ID(可选,缺省跳过门户发布)
103
+ * @param opts.categoryName 分类名,默认「数字员工岗位」
104
+ */
105
+ publishSkillPackage(name: string, zipBuffer: Uint8Array, opts?: {
106
+ portalId?: string;
107
+ categoryName?: string;
108
+ }): Promise<{
109
+ productId: string;
110
+ version: string;
111
+ }>;
112
+ /** 管理员端点通用请求:带 401 自动重登一次;解析 {code,data} 包装。 */
113
+ private adminRequest;
60
114
  /** 通用请求:带 401 自动重登一次;解析 {code,data} 包装。 */
61
115
  private request;
62
116
  }
@@ -29,13 +29,22 @@ export class HimarketClient {
29
29
  baseUrl;
30
30
  username;
31
31
  password;
32
+ /** 管理员账号(/admins/login 用,默认 admin);与开发者账号区分。 */
33
+ adminUsername;
34
+ adminPassword;
35
+ /** 开发者 token(/developers/login),sync/install 用。 */
32
36
  token;
37
+ /** 管理员 token(/admins/login),publish 用。 */
38
+ adminToken;
33
39
  fetchFn;
34
40
  constructor(opts) {
35
41
  this.baseUrl = normalizeBaseUrl(opts.baseUrl);
36
42
  this.username = opts.username;
37
43
  this.password = opts.password;
44
+ this.adminUsername = opts.adminUsername ?? 'admin';
45
+ this.adminPassword = opts.adminPassword ?? '';
38
46
  this.token = opts.token ?? '';
47
+ this.adminToken = opts.adminToken ?? '';
39
48
  this.fetchFn = opts.fetchFn ?? globalThis.fetch;
40
49
  }
41
50
  get hasToken() {
@@ -44,6 +53,14 @@ export class HimarketClient {
44
53
  get currentToken() {
45
54
  return this.token;
46
55
  }
56
+ /** 是否已缓存管理员 token(发布前判断)。 */
57
+ adminTokenMissing() {
58
+ return this.adminToken === '';
59
+ }
60
+ /** 返回缓存的管理员 token(供发布后回写 settings)。 */
61
+ cachedAdminToken() {
62
+ return this.adminToken;
63
+ }
47
64
  /** 登录并缓存 token;返回 access_token。 */
48
65
  async login() {
49
66
  const wrapped = await this.request('/developers/login', {
@@ -97,6 +114,159 @@ export class HimarketClient {
97
114
  throw new HimarketError('下载到的技能包为空');
98
115
  return buf;
99
116
  }
117
+ /** 管理员登录并缓存 token;返回 access_token。publish 系列走管理员端点。 */
118
+ async loginAdmin() {
119
+ const wrapped = await this.request('/admins/login', {
120
+ method: 'POST',
121
+ body: JSON.stringify({ username: this.adminUsername, password: this.adminPassword }),
122
+ auth: false,
123
+ });
124
+ const token = wrapped.access_token;
125
+ if (token === undefined || token === '') {
126
+ throw new HimarketError('管理员登录成功但未返回 access_token');
127
+ }
128
+ this.adminToken = token;
129
+ return token;
130
+ }
131
+ /**
132
+ * 发布一个岗位包 / 技能包 ZIP 到 HiMarket(管理员端点):
133
+ * 确保分类存在 → 建/复用产品 → 上传 zip → 发布最新 draft 版本 online → 发布到门户。
134
+ * 契约与 dsh-job-market/scripts/publish-job.mjs 一致(已实测跑通)。
135
+ *
136
+ * @param name 产品名(岗位 id,如 pm/dev;HiMarket 产品名唯一)
137
+ * @param zipBuffer 打包好的 zip 字节
138
+ * @param opts.portalId 发布到的门户 ID(可选,缺省跳过门户发布)
139
+ * @param opts.categoryName 分类名,默认「数字员工岗位」
140
+ */
141
+ async publishSkillPackage(name, zipBuffer, opts = {}) {
142
+ if (this.adminToken === '')
143
+ await this.loginAdmin();
144
+ // 1. 确保分类存在(幂等)
145
+ const catName = opts.categoryName ?? '数字员工岗位';
146
+ const cats = await this.adminRequest('/product-categories?size=100');
147
+ const catList = cats.content ?? [];
148
+ let catId = catList.find((c) => c.name === catName)?.categoryId ?? '';
149
+ if (catId === '') {
150
+ const created = await this.adminRequest('/product-categories', {
151
+ method: 'POST',
152
+ body: JSON.stringify({ name: catName, description: '可安装的数字员工岗位包:含岗位 preset 与岗位专项技能' }),
153
+ });
154
+ catId = created.categoryId ?? '';
155
+ if (catId === '')
156
+ throw new HimarketError('创建分类失败');
157
+ }
158
+ // 2. 建/复用产品(按 name 幂等)
159
+ const prods = await this.adminRequest(`/products?type=AGENT_SKILL&size=200`);
160
+ const prodList = prods.content ?? [];
161
+ let productId = prodList.find((p) => p.name === name)?.productId ?? '';
162
+ if (productId === '') {
163
+ const created = await this.adminRequest('/products', {
164
+ method: 'POST',
165
+ body: JSON.stringify({
166
+ name,
167
+ description: `[岗位包] ${name} 数字员工岗位`,
168
+ type: 'AGENT_SKILL',
169
+ document: `# ${name} 数字员工岗位包`,
170
+ autoApprove: true,
171
+ categories: [catId],
172
+ }),
173
+ });
174
+ productId = created.productId ?? '';
175
+ if (productId === '')
176
+ throw new HimarketError('创建产品失败');
177
+ }
178
+ // 3. 上传 zip(multipart/form-data: file=@zip)
179
+ // 文件名带时间戳:HiMarket 服务端对「同产品 + 同文件名」的上传可能判重跳过
180
+ // (不生成新 draft → 内容不更新)。加时间戳保证每次都是新文件名,强制服务端建新版本。
181
+ const uploadBody = new FormData();
182
+ const stamp = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14);
183
+ uploadBody.append('file', new Blob([zipBuffer], { type: 'application/zip' }), `${name}-${stamp}.zip`);
184
+ const uploadUrl = `${this.baseUrl}${API_PREFIX}/skills/${encodeURIComponent(productId)}/package`;
185
+ const uploadRes = await this.fetchFn(uploadUrl, {
186
+ method: 'POST',
187
+ headers: { Authorization: `Bearer ${this.adminToken}` },
188
+ body: uploadBody,
189
+ });
190
+ if (!uploadRes.ok) {
191
+ const body = await uploadRes.text().catch(() => '');
192
+ throw new HimarketError(`上传技能包失败(HTTP ${uploadRes.status})${body.slice(0, 200)}`);
193
+ }
194
+ const uploadJson = (await uploadRes.json().catch(() => ({ code: 'PARSE_ERROR' })));
195
+ if (uploadJson.code !== undefined && uploadJson.code !== 'SUCCESS') {
196
+ throw new HimarketError(uploadJson.message ?? '上传技能包失败');
197
+ }
198
+ // 4. 发布最新 draft 版本为 online(force)
199
+ // 服务端契约(SkillServiceImpl):uploadPackage 只把 zip 覆盖进 Nacos skill draft,
200
+ // **不会**自动在 Product 版本列表建记录。要生成可发布的版本,必须显式
201
+ // POST /{productId}/draft(body { baseVersion, version })创建版本记录,
202
+ // 再 PATCH 该 version 为 online。漏掉 createDraft 会导致:上传内容已更新但版本列表
203
+ // 无新 draft → 旧版本仍被下载(本 bug 曾致 secretary 更新不生效)。
204
+ const versions = await this.adminRequest(`/skills/${encodeURIComponent(productId)}/versions`);
205
+ const vlist = Array.isArray(versions) ? versions : versions;
206
+ const sorted = [...vlist].sort((a, b) => String(b.version).localeCompare(String(a.version)));
207
+ const latestOnline = [...sorted].reverse().find((v) => v.status === 'online');
208
+ const draft = [...sorted].reverse().find((v) => v.status === 'draft');
209
+ let ver = draft?.version !== undefined ? String(draft.version) : undefined;
210
+ if (ver === undefined) {
211
+ // 没有 draft 版本记录 → 显式创建一个(baseVersion=当前最高 online;version=next 递增)。
212
+ const baseVersion = latestOnline?.version !== undefined ? String(latestOnline.version) : undefined;
213
+ const nextVersion = bumpVersion(baseVersion);
214
+ this.adminRequest(`/skills/${encodeURIComponent(productId)}/draft`, {
215
+ method: 'POST',
216
+ body: JSON.stringify({
217
+ ...(baseVersion !== undefined ? { baseVersion } : {}),
218
+ version: nextVersion,
219
+ }),
220
+ });
221
+ ver = nextVersion;
222
+ }
223
+ const pubResp = await this.adminRequest(`/skills/${encodeURIComponent(productId)}/versions/${encodeURIComponent(ver)}`, {
224
+ method: 'PATCH',
225
+ body: JSON.stringify({ status: 'online', force: true, updateLatestLabel: true }),
226
+ });
227
+ if (pubResp.code !== undefined && pubResp.code !== 'SUCCESS') {
228
+ throw new HimarketError(`发布版本失败:${pubResp.message ?? ver}`);
229
+ }
230
+ // 5. 发布到门户(可选)
231
+ if (opts.portalId !== undefined && opts.portalId.trim() !== '') {
232
+ await this.adminRequest(`/products/${encodeURIComponent(productId)}/publications`, {
233
+ method: 'POST',
234
+ body: JSON.stringify({ portalId: opts.portalId }),
235
+ }).catch((e) => {
236
+ // 门户发布失败不阻断主流程(warn 级)。
237
+ throw new HimarketError(`已发布版本,但发布到门户失败:${e instanceof Error ? e.message : String(e)}`);
238
+ });
239
+ }
240
+ return { productId, version: ver };
241
+ }
242
+ /** 管理员端点通用请求:带 401 自动重登一次;解析 {code,data} 包装。 */
243
+ async adminRequest(path, opts = {}) {
244
+ const doFetch = async () => {
245
+ const res = await this.fetchFn(this.baseUrl + API_PREFIX + path, {
246
+ method: opts.method ?? 'GET',
247
+ headers: {
248
+ 'Content-Type': 'application/json',
249
+ ...(this.adminToken !== '' ? { Authorization: `Bearer ${this.adminToken}` } : {}),
250
+ },
251
+ ...(opts.body !== undefined ? { body: opts.body } : {}),
252
+ });
253
+ return res;
254
+ };
255
+ let res = await doFetch();
256
+ if (res.status === 401) {
257
+ await this.loginAdmin();
258
+ res = await doFetch();
259
+ }
260
+ if (!res.ok) {
261
+ const body = await res.text().catch(() => '');
262
+ throw new HimarketError(`HiMarket 管理端请求失败(HTTP ${res.status})${body.slice(0, 200)}`);
263
+ }
264
+ const wrapped = (await res.json().catch(() => ({ code: 'PARSE_ERROR' })));
265
+ if (wrapped.code !== undefined && wrapped.code !== 'SUCCESS') {
266
+ throw new HimarketError(wrapped.message ?? `HiMarket 返回错误码 ${wrapped.code}`);
267
+ }
268
+ return (wrapped.data ?? wrapped);
269
+ }
100
270
  /** 通用请求:带 401 自动重登一次;解析 {code,data} 包装。 */
101
271
  async request(path, opts) {
102
272
  const doFetch = async () => {
@@ -126,4 +296,14 @@ export class HimarketClient {
126
296
  return (wrapped.data ?? wrapped);
127
297
  }
128
298
  }
299
+ /** semver 递增:0.0.1 → 0.0.2;无 base 时返回 0.0.1。 */
300
+ function bumpVersion(base) {
301
+ if (base === undefined || base.trim() === '')
302
+ return '0.0.1';
303
+ const parts = base.trim().split('.').map((p) => parseInt(p, 10) || 0);
304
+ while (parts.length < 3)
305
+ parts.push(0);
306
+ const patch = (parts[2] ?? 0) + 1;
307
+ return `${parts[0] ?? 0}.${parts[1] ?? 0}.${patch}`;
308
+ }
129
309
  //# sourceMappingURL=himarket-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"himarket-client.js","sourceRoot":"","sources":["../src/himarket-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"himarket-client.js","sourceRoot":"","sources":["../src/himarket-client.ts"],"names":[],"mappings":"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"}