@modelzen/feishu-codex-bridge 0.3.12-test.1 → 0.3.12-test.3

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 (2) hide show
  1. package/dist/cli.js +81 -75
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -9471,7 +9471,7 @@ function createOrchestrator(channel, cfg, fallbackCwd) {
9471
9471
  }
9472
9472
  const ts = turnSession(msg.chatId, project, msg.senderId);
9473
9473
  if (cmd === "model") {
9474
- postModelCard(msg, ts.sessionKey);
9474
+ postModelCard(msg, ts.sessionKey, false);
9475
9475
  return;
9476
9476
  }
9477
9477
  if (cmd === "compact") {
@@ -9505,7 +9505,7 @@ function createOrchestrator(channel, cfg, fallbackCwd) {
9505
9505
  }
9506
9506
  const ts = turnSession(msg.threadId, project, msg.senderId);
9507
9507
  if (cmd === "model") {
9508
- postModelCard(msg, ts.sessionKey);
9508
+ postModelCard(msg, ts.sessionKey, true);
9509
9509
  return;
9510
9510
  }
9511
9511
  if (cmd === "compact") {
@@ -9911,7 +9911,7 @@ function createOrchestrator(channel, cfg, fallbackCwd) {
9911
9911
  }
9912
9912
  });
9913
9913
  }
9914
- function postModelCard(msg, sessionKey) {
9914
+ function postModelCard(msg, sessionKey, inThread) {
9915
9915
  void withTrace({ chatId: msg.chatId, msgId: msg.messageId }, async () => {
9916
9916
  try {
9917
9917
  const [rec, project] = await Promise.all([getSession(sessionKey), getProjectByChatId(msg.chatId)]);
@@ -9929,7 +9929,7 @@ function createOrchestrator(channel, cfg, fallbackCwd) {
9929
9929
  backend: be.id,
9930
9930
  createdAt: Date.now()
9931
9931
  };
9932
- const res = await sendManagedCard(channel, msg.chatId, buildModelCard(state), msg.messageId, true);
9932
+ const res = await sendManagedCard(channel, msg.chatId, buildModelCard(state), msg.messageId, inThread);
9933
9933
  pruneModelPending();
9934
9934
  modelPending.set(res.messageId, state);
9935
9935
  log.info("card", "model", { threadId: sessionKey, model: state.model, effort: state.effort });
@@ -11889,6 +11889,7 @@ function createAdminService(deps = {}) {
11889
11889
  return readRecentLogs({ maxBytes: opts?.maxBytes ?? 64 * 1024 });
11890
11890
  },
11891
11891
  registerBot(input2) {
11892
+ if (deps.readonlyPreview) throw new NotWiredYetError("\u2795 \u6DFB\u52A0\u673A\u5668\u4EBA");
11892
11893
  return registerBotFromCredentials({
11893
11894
  appId: input2.appId,
11894
11895
  appSecret: input2.appSecret,
@@ -11957,6 +11958,7 @@ function createAdminService(deps = {}) {
11957
11958
  };
11958
11959
  },
11959
11960
  async registerBotByQr(opts) {
11961
+ if (deps.readonlyPreview) throw new NotWiredYetError("\u2795 \u6DFB\u52A0\u673A\u5668\u4EBA");
11960
11962
  let creds;
11961
11963
  try {
11962
11964
  creds = await startRegistration({ signal: opts.signal, onQr: opts.onQr, onStatus: opts.onStatus });
@@ -12186,7 +12188,7 @@ async function probeAllBackends() {
12186
12188
  );
12187
12189
  }
12188
12190
  function createReadonlyAdminService(deps = {}) {
12189
- return createAdminService({ startDaemon: deps.startDaemon });
12191
+ return createAdminService({ startDaemon: deps.startDaemon, applyUpdate: deps.applyUpdate, readonlyPreview: true });
12190
12192
  }
12191
12193
  function isAlive(pid) {
12192
12194
  try {
@@ -13400,7 +13402,7 @@ ${UI_PURE_JS}
13400
13402
  bots.forEach(function (b) {
13401
13403
  nav.appendChild(navItem({ icon: 'bot', label: botTitle(b), on: r.tab === 'bot' && r.botId === b.appId, dot: !!b.running, onClick: function () { go({ tab: 'bot', botId: b.appId }); } }));
13402
13404
  });
13403
- nav.appendChild(navItem({ icon: 'add', label: '\u6DFB\u52A0\u673A\u5668\u4EBA', add: true, onClick: function () { openWizard(); } }));
13405
+ nav.appendChild(navItem({ icon: 'add', label: '\u6DFB\u52A0\u673A\u5668\u4EBA', add: true, onClick: function () { tryAddBot(); } }));
13404
13406
  nav.appendChild(el('div', 'nav-sec', '\u914D\u7F6E'));
13405
13407
  nav.appendChild(navItem({ icon: 'backend', label: '\u540E\u7AEF Agent', on: r.tab === 'backends', onClick: function () { go({ tab: 'backends' }); } }));
13406
13408
  nav.appendChild(navItem({ icon: 'doctor', label: '\u5BBF\u4E3B\u673A\u4F53\u68C0', on: r.tab === 'doctor', onClick: function () { go({ tab: 'doctor' }); } }));
@@ -13428,7 +13430,7 @@ ${UI_PURE_JS}
13428
13430
  act.textContent = '';
13429
13431
  if (r.tab === 'overview' || r.tab === 'bot') {
13430
13432
  var add = el('button', 'btn primary sm', '\u2795 \u6DFB\u52A0\u673A\u5668\u4EBA');
13431
- add.onclick = function () { openWizard(); };
13433
+ add.onclick = function () { tryAddBot(); };
13432
13434
  act.appendChild(add);
13433
13435
  }
13434
13436
  }
@@ -13502,7 +13504,7 @@ ${UI_PURE_JS}
13502
13504
  hero.appendChild(el('div', 'home-sub', '\u628A\u98DE\u4E66\u63A5\u5230\u672C\u673A\u7684 Codex / Claude \u2014\u2014 \u4E00\u4E2A\u7FA4\u4E00\u4E2A\u9879\u76EE\uFF0C@\u4E00\u53E5\u8BDD\u5C31\u5F00\u5E72\u3002\u591A\u673A\u5668\u4EBA\u3001\u591A\u540E\u7AEF\uFF0C\u5168\u7A0B\u8DD1\u5728\u4F60\u8FD9\u53F0\u673A\u5668\u4E0A\uFF0C\u79C1\u6709\u53EF\u63A7\u3002'));
13503
13505
  var ctaRow = el('div', 'home-cta-row');
13504
13506
  var primary = el('button', 'btn primary home-cta', hasBots ? '\u8FDB\u5165\u63A7\u5236\u53F0' : '\u2795 \u626B\u7801\u521B\u5EFA\u7B2C\u4E00\u4E2A\u673A\u5668\u4EBA');
13505
- primary.onclick = function () { if (hasBots) go({ tab: 'overview' }); else openWizard(); };
13507
+ primary.onclick = function () { if (hasBots) go({ tab: 'overview' }); else tryAddBot(); };
13506
13508
  ctaRow.appendChild(primary);
13507
13509
  if (hasBots) {
13508
13510
  var sec = el('button', 'btn home-cta', '\u540E\u7AEF\u7BA1\u7406');
@@ -13953,6 +13955,10 @@ ${UI_PURE_JS}
13953
13955
  } else {
13954
13956
  var pb = el('button', 'btn sm primary', '\u25B6\uFE0F \u542F\u52A8'); pb.onclick = askStart; acts.appendChild(pb);
13955
13957
  }
13958
+ // \u68C0\u67E5\u66F4\u65B0\u5165\u53E3\uFF1A\u59CB\u7EC8\u5728\uFF08\u4E0D\u7BA1\u8DD1\u6CA1\u8DD1\uFF09\u3002\u6CA1\u542F\u52A8\u65F6\u80FD\u505A\u7684\u5C31\u662F\u300C\u542F\u52A8\u300D+\u300C\u66F4\u65B0\u300D\u3002
13959
+ var ub = el('button', 'btn sm', '\u{1F504} \u68C0\u67E5\u66F4\u65B0'); ub.style.marginLeft = '6px';
13960
+ ub.onclick = function () { var bx = $('updateBody'); if (bx) { bx.textContent = '\u7248\u672C\u68C0\u67E5\u4E2D\u2026'; loadUpdate(bx); } toast('\u{1F504} \u6B63\u5728\u68C0\u67E5\u66F4\u65B0\u2026'); };
13961
+ acts.appendChild(ub);
13956
13962
  }
13957
13963
  var line = el('div', 'statline');
13958
13964
  if (d.running) line.appendChild(el('span', 'tag green', '\u2705 \u8FD0\u884C\u4E2D' + (d.pid ? ' \xB7 pid ' + d.pid : '')));
@@ -14066,7 +14072,7 @@ ${UI_PURE_JS}
14066
14072
  hero.appendChild(el('div', 'fr-title', '\u6B22\u8FCE\uFF01\u8FD8\u5DEE\u6700\u540E\u4E00\u6B65\uFF1A\u521B\u5EFA\u4F60\u7684\u7B2C\u4E00\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA'));
14067
14073
  hero.appendChild(el('div', 'fr-sub', '\u70B9\u4E0B\u9762\u7684\u6309\u94AE\uFF0C\u7528\u98DE\u4E66\u626B\u7801\u5373\u53EF\u521B\u5EFA\u5E76\u6388\u6743\u2014\u2014\u5168\u7A0B\u5728\u8FD9\u4E2A\u7F51\u9875\u91CC\u5B8C\u6210\uFF0C\u4E0D\u7528\u78B0\u7EC8\u7AEF\u3002'));
14068
14074
  var cta = el('button', 'btn primary fr-cta', '\u2795 \u626B\u7801\u521B\u5EFA\u7B2C\u4E00\u4E2A\u673A\u5668\u4EBA');
14069
- cta.onclick = function () { openWizard(); };
14075
+ cta.onclick = function () { tryAddBot(); };
14070
14076
  hero.appendChild(cta);
14071
14077
  box.appendChild(hero);
14072
14078
  if (countEl) countEl.textContent = '';
@@ -14355,6 +14361,18 @@ ${UI_PURE_JS}
14355
14361
  if (drawerProject) renderDrawer(drawerProject);
14356
14362
  }
14357
14363
 
14364
+ // \u98DE\u4E66 applink\u300C\u6253\u5F00\u673A\u5668\u4EBA\u300D\uFF1A\u5728\u98DE\u4E66\u5BA2\u6237\u7AEF\u91CC\u76F4\u63A5\u62C9\u8D77\u4E0E\u8BE5 bot \u7684\u79C1\u804A\uFF08\u540C\u5F00\u53D1\u8005\u540E\u53F0
14365
+ // \u300C\u521B\u5EFA\u6210\u529F \u2192 \u6253\u5F00\u5E94\u7528\u300D\u90A3\u6761\u94FE\uFF09\u3002feishu / lark \u5404\u81EA\u57DF\u540D\u3002
14366
+ function botOpenLink(appId, tenant) {
14367
+ var host = tenant === 'lark' ? 'applink.larksuite.com' : 'applink.feishu.cn';
14368
+ return 'https://' + host + '/client/bot/open?appId=' + encodeURIComponent(appId || '');
14369
+ }
14370
+ function openBotBtn(appId, tenant, label) {
14371
+ var a = el('a', 'btn', label || '\u{1F517} \u5728\u98DE\u4E66\u4E2D\u6253\u5F00');
14372
+ a.href = botOpenLink(appId, tenant); a.target = '_blank'; a.rel = 'noopener';
14373
+ return a;
14374
+ }
14375
+
14358
14376
  function renderBotOverview(card, b) {
14359
14377
  var line1 = el('div', 'statline');
14360
14378
  line1.appendChild(el('span', 'tag', b.tenant === 'lark' ? 'Lark' : '\u98DE\u4E66'));
@@ -14362,6 +14380,9 @@ ${UI_PURE_JS}
14362
14380
  if (b.current) line1.appendChild(el('span', 'tag blue', '\u4E3B bot'));
14363
14381
  if (b.active) line1.appendChild(el('span', 'tag blue', '\u6D3B\u8DC3\u96C6'));
14364
14382
  card.appendChild(line1);
14383
+ var openRow = el('div'); openRow.style.marginTop = '8px';
14384
+ openRow.appendChild(openBotBtn(b.appId, b.tenant, '\u{1F517} \u5728\u98DE\u4E66\u4E2D\u6253\u5F00\u673A\u5668\u4EBA'));
14385
+ card.appendChild(openRow);
14365
14386
  var line2 = el('div', 'statline');
14366
14387
  if (b.running) {
14367
14388
  line2.appendChild(el('span', 'tag green', '\u2705 bridge \u8FD0\u884C\u4E2D \xB7 pid ' + b.pid));
@@ -14579,6 +14600,21 @@ ${UI_PURE_JS}
14579
14600
  var wizAutoEnabled = false; // \u65B0 bot \u662F\u5426\u5DF2\u81EA\u52A8\u52A0\u5165\u6D3B\u8DC3\u96C6\uFF08\u4E00\u6B21\u6027\uFF09
14580
14601
  var wizRestartPrompted = false; // \u5B8C\u6210\u6B65\u662F\u5426\u5DF2\u5F39\u8FC7\u300C\u91CD\u542F\u62C9\u8D77\u300D\u786E\u8BA4\uFF08\u4E00\u6B21\u6027\uFF09
14581
14602
 
14603
+ // \u6DFB\u52A0\u673A\u5668\u4EBA\u662F\u5199\u64CD\u4F5C\uFF1AFeishu Bridge \u6CA1\u5728\u8DD1\u65F6\u63A7\u5236\u53F0\u4E3A\u53EA\u8BFB\uFF0C\u4E0D\u80FD\u52A0\uFF08\u4E0E\u300C\u6CA1\u542F\u52A8\u53EA\u8BFB\u300D\u4E00\u81F4\uFF09\u3002
14604
+ // \u6CA1\u5728\u8DD1\u5C31\u5F15\u5BFC\u5148\u542F\u52A8\uFF0C\u800C\u4E0D\u662F\u6253\u5F00\u5411\u5BFC\u8BA9\u7528\u6237\u767D\u586B\u4E00\u901A\u518D\u88AB 501 \u6321\u56DE\u3002
14605
+ function tryAddBot() {
14606
+ if (daemon && daemon.running) { openWizard(); return; }
14607
+ confirmDialog({
14608
+ title: '\u9700\u8981\u5148\u542F\u52A8 Feishu Bridge',
14609
+ lines: [
14610
+ 'Feishu Bridge \u672A\u5728\u8FD0\u884C\u65F6\u63A7\u5236\u53F0\u4E3A\u53EA\u8BFB\uFF0C\u65E0\u6CD5\u6DFB\u52A0\u673A\u5668\u4EBA\u3002',
14611
+ '\u5148\u542F\u52A8 Feishu Bridge\uFF0C\u518D\u56DE\u6765\u6DFB\u52A0\u3002',
14612
+ ],
14613
+ confirmLabel: '\u7ACB\u5373\u542F\u52A8',
14614
+ onConfirm: function () { postAction('/api/daemon/start', '\u542F\u52A8'); },
14615
+ });
14616
+ }
14617
+
14582
14618
  function openWizard() {
14583
14619
  wizStep = 1; wizBotId = null; wizSetup = null; wizManualOpen = false;
14584
14620
  wizAutoEnabled = false; wizRestartPrompted = false;
@@ -14631,6 +14667,11 @@ ${UI_PURE_JS}
14631
14667
  qrWrap.appendChild(el('div', 'note', '\u6B63\u5728\u751F\u6210\u4E8C\u7EF4\u7801\u2026'));
14632
14668
  w.appendChild(qrWrap);
14633
14669
 
14670
+ var steps = el('div', 'note');
14671
+ steps.style.cssText = 'margin-top:6px;line-height:1.7';
14672
+ steps.textContent = '\u2460 \u7528\u98DE\u4E66 App \u626B\u7801 \u2192 \u2461 \u5728\u98DE\u4E66\u91CC\u70B9\u300C\u521B\u5EFA\u5E76\u6388\u6743\u300D \u2192 \u2462 \u56DE\u5230\u672C\u9875\uFF08\u65E0\u9700\u624B\u52A8\u5237\u65B0\uFF09\uFF0C\u521B\u5EFA\u6210\u529F\u4F1A\u81EA\u52A8\u8FDB\u5165\u7B2C\u2461\u6B65\u300C\u63A5\u5165\u68C0\u6D4B\u300D\u3002';
14673
+ w.appendChild(steps);
14674
+
14634
14675
  var statusLine = el('div', 'note'); statusLine.id = 'wizScanStatus';
14635
14676
  statusLine.style.textAlign = 'center';
14636
14677
  w.appendChild(statusLine);
@@ -14862,16 +14903,8 @@ ${UI_PURE_JS}
14862
14903
  w.appendChild(checkItem('\u26A0\uFE0F', '\u7F3A ' + miss.length + ' \u9879\u5FC5\u9700\u6743\u9650', miss.join('\u3001'), grant));
14863
14904
  }
14864
14905
  }
14865
- var conn = s.connection || {};
14866
- if (conn.running && conn.connection === 'connected') {
14867
- w.appendChild(checkItem('\u2705', '\u957F\u8FDE\u63A5\u5728\u7EBF', 'bridge \u5DF2\u8FDE\u4E0A\u98DE\u4E66\uFF0C\u53EF\u5B9E\u65F6\u6536\u53D1'));
14868
- } else if (conn.running) {
14869
- w.appendChild(checkItem('spin', 'bridge \u8FD0\u884C\u4E2D', '\u957F\u8FDE\u63A5' + (conn.connection ? '\uFF08' + conn.connection + '\uFF09' : '\u5EFA\u7ACB\u4E2D\u2026')));
14870
- } else {
14871
- // \u65B0 bot \u5DF2\u81EA\u52A8\u52A0\u5165\u6D3B\u8DC3\u96C6\uFF08\u89C1 pollWizSetup\uFF09\uFF1B\u4E0D\u518D\u8BA9\u7528\u6237\u70B9\u6309\u94AE / \u590D\u5236\u547D\u4EE4\u3002\u771F\u6B63\u62C9\u8D77
14872
- // \u4E0A\u7EBF\u9760\u6700\u540E\u4E00\u6B65\u300C\u5B8C\u6210\u300D\u65F6\u5F39\u7A97\u786E\u8BA4\u91CD\u542F Feishu Bridge\u3002
14873
- w.appendChild(checkItem('spin', '\u5F85\u62C9\u8D77\u4E0A\u7EBF', '\u5DF2\u81EA\u52A8\u52A0\u5165\u6D3B\u8DC3\u96C6 \xB7 \u70B9\u300C\u4E0B\u4E00\u6B65\u300D\u5230\u5B8C\u6210\u9875\uFF0C\u786E\u8BA4\u91CD\u542F Feishu Bridge \u5373\u4E0A\u7EBF\u3002'));
14874
- }
14906
+ // \u300C\u52A0\u5165\u6D3B\u8DC3\u96C6 + \u62C9\u8D77\u4E0A\u7EBF\u300D\u5168\u7A0B\u9759\u9ED8\uFF1A\u65B0 bot \u5DF2\u5728 pollWizSetup \u81EA\u52A8\u52A0\u5165\u6D3B\u8DC3\u96C6\uFF0C\u771F\u6B63\u62C9\u8D77
14907
+ // \u9760\u6700\u540E\u4E00\u6B65\u300C\u5B8C\u6210\u300D\u5F39\u7A97\u786E\u8BA4\u91CD\u542F\u2014\u2014\u8FD9\u91CC\u4E0D\u518D\u663E\u793A\u300C\u5F85\u62C9\u8D77\u4E0A\u7EBF\u300D\u4E4B\u7C7B\u7684\u4E2D\u95F4\u6001\u9879\u3002
14875
14908
  // \u4E8B\u4EF6\u8BA2\u9605\uFF1A\u7CFB\u7EDF\u65E0\u6CD5\u53EF\u9760\u68C0\u6D4B\uFF08\u957F\u8FDE\u63A5\u8BA2\u9605\u5728\u5DF2\u53D1\u5E03\u7248\u672C\u91CC\u7684\u4F53\u73B0\u4E0D\u7A33\u5B9A\uFF09\uFF0C\u6545\u53EA\u505A\u63D0\u9192\u3001\u4E0D\u4E0B\u7ED3\u8BBA\u3001
14876
14909
  // \u4E0D\u963B\u585E\u300C\u4E0B\u4E00\u6B65\u300D\u3002\u7528\u6237\u81EA\u884C\u53BB\u540E\u53F0\u6838\u5BF9\u3002
14877
14910
  var evHint = el('div');
@@ -14895,33 +14928,6 @@ ${UI_PURE_JS}
14895
14928
  return actions;
14896
14929
  }
14897
14930
 
14898
- // \u5B8C\u6210\u6B65\uFF1A\u65B0 bot \u5DF2\u81EA\u52A8\u52A0\u5165\u6D3B\u8DC3\u96C6\uFF0C\u4F46\u8981\u91CD\u542F Feishu Bridge \u624D\u771F\u6B63\u62C9\u8D77\u4E0A\u7EBF\u3002\u5F39\u7A97\u786E\u8BA4
14899
- // \uFF08\u91CD\u542F\u4F1A\u77ED\u6682\u5F71\u54CD\u5176\u5B83\u5728\u7EBF bot\uFF0C\u6240\u4EE5\u4E0D\u9759\u9ED8\u91CD\u542F\uFF09\uFF1Bdaemon \u6CA1\u5728\u8DD1\u5C31\u6539\u4E3A\u300C\u542F\u52A8\u300D\u3002\u4E00\u6B21\u6027\u3002
14900
- function maybePromptRestartAtDone() {
14901
- if (wizRestartPrompted) return;
14902
- var conn = (wizSetup && wizSetup.connection) || {};
14903
- if (conn.running && conn.connection === 'connected') return; // \u5DF2\u7ECF\u5728\u7EBF\uFF0C\u65E0\u9700\u91CD\u542F
14904
- wizRestartPrompted = true;
14905
- if (daemon && daemon.running) {
14906
- confirmDialog({
14907
- title: '\u{1F504} \u7ACB\u5373\u91CD\u542F Feishu Bridge \u8BA9\u65B0\u673A\u5668\u4EBA\u4E0A\u7EBF\uFF1F',
14908
- lines: [
14909
- '\u65B0\u673A\u5668\u4EBA\u5DF2\u52A0\u5165\u6D3B\u8DC3\u96C6\uFF0C\u91CD\u542F Feishu Bridge \u540E\u5373\u53EF\u4E0A\u7EBF\u3002',
14910
- '\u91CD\u542F\u7EA6\u6570\u79D2\uFF0C\u671F\u95F4\u6240\u6709\u5728\u7EBF\u673A\u5668\u4EBA\u7684\u957F\u8FDE\u63A5\u4F1A\u77ED\u6682\u65AD\u5F00\u5E76\u81EA\u52A8\u91CD\u8FDE\u3002',
14911
- ],
14912
- confirmLabel: '\u7ACB\u5373\u91CD\u542F',
14913
- onConfirm: function () { postAction('/api/daemon/restart', '\u91CD\u542F'); },
14914
- });
14915
- } else {
14916
- confirmDialog({
14917
- title: '\u{1F680} \u7ACB\u5373\u542F\u52A8 Feishu Bridge \u8BA9\u673A\u5668\u4EBA\u4E0A\u7EBF\uFF1F',
14918
- lines: ['Feishu Bridge \u5F53\u524D\u672A\u5728\u8FD0\u884C\uFF0C\u542F\u52A8\u540E\u65B0\u673A\u5668\u4EBA\u5373\u53EF\u4E0A\u7EBF\u3002'],
14919
- confirmLabel: '\u7ACB\u5373\u542F\u52A8',
14920
- onConfirm: function () { postAction('/api/daemon/start', '\u542F\u52A8'); },
14921
- });
14922
- }
14923
- }
14924
-
14925
14931
  function copyRow(text) {
14926
14932
  var row = el('div', 'copybox');
14927
14933
  row.appendChild(el('code', null, text));
@@ -14942,35 +14948,23 @@ ${UI_PURE_JS}
14942
14948
  w.textContent = '';
14943
14949
  w.appendChild(el('h3', null, '\u{1F389} \u63A5\u5165\u5B8C\u6210'));
14944
14950
  w.appendChild(wizStepBar(3));
14945
- w.appendChild(el('div', 'note', '\u673A\u5668\u4EBA\u300C' + ((wizSetup && wizSetup.botName) || wizBotId || '') + '\u300D\u5DF2\u52A0\u5165\u6D3B\u8DC3\u96C6\u3002'));
14946
- // \u8FDB\u5165\u5B8C\u6210\u9875\u5373\u5F39\u7A97\u786E\u8BA4\u91CD\u542F Feishu Bridge \u628A\u65B0 bot \u62C9\u8D77\u4E0A\u7EBF\uFF08\u4E00\u6B21\u6027\uFF1B\u5DF2\u5728\u7EBF\u5219\u4E0D\u5F39\uFF09\u3002
14947
- maybePromptRestartAtDone();
14948
- var ul = el('div'); ul.style.margin = '12px 0';
14949
- [
14950
- '\u2460 \u5728\u98DE\u4E66\u91CC\u79C1\u804A\u8FD9\u4E2A\u673A\u5668\u4EBA\uFF0C\u70B9\u300C\u2795 \u65B0\u5EFA\u9879\u76EE\u300D\u628A\u4E00\u4E2A\u76EE\u5F55\u7ED1\u6210\u9879\u76EE\u7FA4\uFF1B',
14951
- '\u2461 \u6216\u628A\u673A\u5668\u4EBA\u62C9\u8FDB\u4E00\u4E2A\u5DF2\u6709\u7FA4\uFF08\u9700\u5F00\u300C\u52A0\u5165\u5B58\u91CF\u7FA4\u300D\u76F8\u5173\u6743\u9650\uFF09\u81EA\u52A8\u7ED1\u5B9A\uFF1B',
14952
- '\u2462 \u7136\u540E\u5728\u7FA4\u91CC @\u673A\u5668\u4EBA \u63D0\u9700\u6C42\uFF0C\u5B83\u5C31\u5728\u7ED1\u5B9A\u7684\u76EE\u5F55\u91CC\u5E72\u6D3B\u3002',
14953
- ].forEach(function (line) {
14954
- var d = el('div'); d.style.padding = '4px 0'; d.textContent = line;
14955
- ul.appendChild(d);
14956
- });
14957
- w.appendChild(ul);
14958
- w.appendChild(el('div', 'note', '\u63D0\u793A\uFF1A\u79C1\u804A\u673A\u5668\u4EBA\u53D1\u4EFB\u610F\u6D88\u606F\u5373\u53EF\u5524\u51FA\u79C1\u804A\u7BA1\u7406\u53F0\uFF1BWeb \u63A7\u5236\u53F0\u4E0E\u79C1\u804A\u5361\u7247\u5171\u4EAB\u540C\u4E00\u5957\u8BBE\u7F6E\uFF0C\u53CC\u7AEF\u5B9E\u65F6\u4E00\u81F4\u3002'));
14959
- // \u65B0\u5EFA\u7684\u673A\u5668\u4EBA\u8981\u7B49 daemon \u91CD\u542F\u3001\u88AB supervisor \u63A5\u7BA1\u540E\u624D\u771F\u6B63\u4E0A\u7EBF\uFF08\u5C24\u5176\u300C\u5F15\u5BFC\u63A7\u5236\u53F0\u300D\u662F
14960
- // \u96F6 bot \u8D77\u7684\uFF0C\u5F97\u91CD\u542F\u624D\u4F1A\u8FDE\u4E0A\u8FD9\u4E2A\u65B0 bot\uFF09\u3002\u7ED9\u4E00\u6761\u9192\u76EE\u63D0\u793A + \u4E00\u952E\u91CD\u542F\uFF08\u786E\u8BA4\u5F39\u7A97\u91CC\u4F1A\u8BF4\u660E
14961
- // \u91CD\u542F\u4F1A\u77ED\u6682\u6253\u65AD\u5176\u5B83\u5728\u8DD1\u7684\u673A\u5668\u4EBA\uFF09\u3002
14962
- var liveTip = el('div', 'note');
14963
- liveTip.style.cssText = 'margin-top:10px;padding:10px 12px;background:var(--blue-tint);border-radius:8px;color:var(--text-2)';
14964
- liveTip.textContent = '\u26A1 \u8BA9\u5B83\u4E0A\u7EBF\uFF1A\u65B0\u673A\u5668\u4EBA\u9700\u91CD\u542F Feishu Bridge \u540E\u7531\u540E\u53F0\u63A5\u7BA1\u3002\u70B9\u4E0B\u9762\u300C\u91CD\u542F\u4F7F\u5176\u4E0A\u7EBF\u300D\u5373\u53EF\uFF08\u9996\u6B21\u521B\u5EFA\u65F6\u91CD\u542F\u5F88\u5B89\u5168\uFF0C\u4E0D\u5F71\u54CD\u522B\u7684\u673A\u5668\u4EBA\uFF09\u3002';
14965
- w.appendChild(liveTip);
14951
+ var who = (wizSetup && wizSetup.botName) || wizBotId || '';
14952
+ // \u5230\u8FD9\u4E00\u6B65\u53EA\u5269\u4E00\u4EF6\u4E8B\uFF1A\u91CD\u542F Feishu Bridge \u8BA9\u65B0 bot \u4E0A\u7EBF\u3002\u4E0D\u518D\u5806\u300C\u65B0\u5EFA\u9879\u76EE/\u62C9\u7FA4/@\u300D\u90A3\u5957
14953
+ // \u5F15\u5BFC\uFF08\u90A3\u4F1A\u8BA9\u4EBA\u4EE5\u4E3A\u5F97\u5148\u505A\u5B8C\u624D\u80FD\u7EE7\u7EED\uFF09\u3002\u91CD\u542F\u5165\u53E3**\u53EA\u6B64\u4E00\u5904**\uFF1A\u4E3B\u6309\u94AE\u300C\u91CD\u542F\u4F7F\u5176\u4E0A\u7EBF\u300D\uFF1B
14954
+ // \u60F3\u665A\u70B9\u518D\u8BF4\u5C31\u70B9\u300C\u7A0D\u540E\u518D\u91CD\u542F\u300D\u3002
14955
+ w.appendChild(el('div', 'note', '\u673A\u5668\u4EBA\u300C' + who + '\u300D\u5DF2\u52A0\u5165\u6D3B\u8DC3\u96C6\u3002\u6700\u540E\u4E00\u6B65\uFF1A\u91CD\u542F Feishu Bridge \u8BA9\u5B83\u4E0A\u7EBF\uFF08\u7EA6\u6570\u79D2\uFF0C\u5176\u5B83\u5728\u7EBF\u673A\u5668\u4EBA\u4F1A\u77ED\u6682\u65AD\u8FDE\u540E\u81EA\u52A8\u91CD\u8FDE\uFF09\u3002'));
14956
+ var openRow = el('div'); openRow.style.margin = '4px 0 12px';
14957
+ openRow.appendChild(openBotBtn(wizBotId, wizSetup && wizSetup.tenant, '\u{1F517} \u5728\u98DE\u4E66\u4E2D\u6253\u5F00\u673A\u5668\u4EBA'));
14958
+ w.appendChild(openRow);
14959
+ var gotoBot = function () { var id = wizBotId; closeWizard(); if (id) go({ tab: 'bot', botId: id }); };
14966
14960
  var actions = el('div', 'actions');
14967
- var restart = el('button', 'btn', '\u{1F501} \u91CD\u542F\u4F7F\u5176\u4E0A\u7EBF');
14968
- restart.onclick = askRestart;
14969
- actions.appendChild(restart);
14961
+ var later = el('button', 'btn', '\u7A0D\u540E\u518D\u91CD\u542F');
14962
+ later.onclick = gotoBot;
14963
+ actions.appendChild(later);
14970
14964
  actions.appendChild(el('div', 'grow'));
14971
- var done = el('button', 'btn primary', '\u5B8C\u6210\u5E76\u8FDB\u5165\u8BE5\u673A\u5668\u4EBA \u2192');
14972
- done.onclick = function () { var id = wizBotId; closeWizard(); if (id) go({ tab: 'bot', botId: id }); };
14973
- actions.appendChild(done);
14965
+ var restart = el('button', 'btn primary', '\u{1F501} \u91CD\u542F\u4F7F\u5176\u4E0A\u7EBF');
14966
+ restart.onclick = function () { postAction('/api/daemon/restart', '\u91CD\u542F'); gotoBot(); };
14967
+ actions.appendChild(restart);
14974
14968
  w.appendChild(actions);
14975
14969
  }
14976
14970
 
@@ -15374,7 +15368,16 @@ function createWebServer(opts) {
15374
15368
  const appSecret = typeof body.appSecret === "string" ? body.appSecret : "";
15375
15369
  const tenant = body.tenant === "lark" ? "lark" : "feishu";
15376
15370
  const desiredName = typeof body.name === "string" && body.name.trim() ? body.name.trim() : void 0;
15377
- const result = await opts.service.registerBot({ appId, appSecret, tenant, desiredName });
15371
+ let result;
15372
+ try {
15373
+ result = await opts.service.registerBot({ appId, appSecret, tenant, desiredName });
15374
+ } catch (err) {
15375
+ if (err instanceof NotWiredYetError) {
15376
+ sendJson(res, 501, { error: "not_wired_yet", message: err.message });
15377
+ return;
15378
+ }
15379
+ throw err;
15380
+ }
15378
15381
  if (result.ok) {
15379
15382
  sendJson(res, 201, {
15380
15383
  ok: true,
@@ -16493,7 +16496,10 @@ async function runWeb(opts = {}) {
16493
16496
  process.exitCode = 1;
16494
16497
  return;
16495
16498
  }
16496
- const service = createReadonlyAdminService({ startDaemon: () => spawnDaemonControl("start") });
16499
+ const service = createReadonlyAdminService({
16500
+ startDaemon: () => spawnDaemonControl("start"),
16501
+ applyUpdate: () => spawnDaemonControl("update")
16502
+ });
16497
16503
  const web = createWebServer({ service, token: stableWebConsoleToken(), liveConsole: () => readWebConsole() });
16498
16504
  let url;
16499
16505
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modelzen/feishu-codex-bridge",
3
- "version": "0.3.12-test.1",
3
+ "version": "0.3.12-test.3",
4
4
  "description": "Bridge Feishu/Lark messenger with local Codex via app-server (project=group, thread=session)",
5
5
  "type": "module",
6
6
  "bin": {