@clawos-dev/clawd 0.2.436 → 0.2.438

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/dist/cli.cjs CHANGED
@@ -6944,13 +6944,14 @@ var init_github = __esm({
6944
6944
  });
6945
6945
 
6946
6946
  // ../protocol/src/lark-bot-schemas.ts
6947
- var LarkBotPersonaArgs, LarkBotUnbindArgs, LarkBotStatusArgs, LarkBotProvisionArgs, LarkBotProvisionCancelArgs, LARK_BOT_PROVISION_ERROR_REASONS, LarkBotProvisionErrorReasonSchema, LarkBotBindManualArgs, LarkBotGroupSchema, LarkBotStatusResultSchema, LarkBotStateFrameSchema;
6947
+ var LarkBotPersonaArgs, LarkBotUnbindArgs, LarkBotUpgradeArgs, LarkBotStatusArgs, LarkBotProvisionArgs, LarkBotProvisionCancelArgs, LARK_BOT_PROVISION_ERROR_REASONS, LarkBotProvisionErrorReasonSchema, LarkBotBindManualArgs, LarkBotGroupSchema, LarkBotStatusResultSchema, LarkBotStateFrameSchema;
6948
6948
  var init_lark_bot_schemas = __esm({
6949
6949
  "../protocol/src/lark-bot-schemas.ts"() {
6950
6950
  "use strict";
6951
6951
  init_zod();
6952
6952
  LarkBotPersonaArgs = external_exports.object({ personaId: external_exports.string().min(1) });
6953
6953
  LarkBotUnbindArgs = LarkBotPersonaArgs;
6954
+ LarkBotUpgradeArgs = external_exports.object({ personaId: external_exports.string().min(1) });
6954
6955
  LarkBotStatusArgs = LarkBotPersonaArgs;
6955
6956
  LarkBotProvisionArgs = LarkBotPersonaArgs;
6956
6957
  LarkBotProvisionCancelArgs = LarkBotPersonaArgs;
@@ -6984,7 +6985,21 @@ var init_lark_bot_schemas = __esm({
6984
6985
  qrUrl: external_exports.string().optional(),
6985
6986
  /** provision 失败后的 unbound 帧携带;正常 unbound 无此字段 */
6986
6987
  errorReason: LarkBotProvisionErrorReasonSchema.optional(),
6987
- groups: external_exports.array(LarkBotGroupSchema)
6988
+ groups: external_exports.array(LarkBotGroupSchema),
6989
+ /**
6990
+ * bound 态:该 bot 实际授予的 scope 缺了 LARK_PROVISION_ADDONS 里声明的项
6991
+ * (spec 2026-09-01)——addons 是扫码时一次性写进飞书应用配置的,后来新增的
6992
+ * scope / 事件对存量 bot 不生效,不提示的话用户只会觉得「功能没生效」。
6993
+ * 判定真源是飞书回读的 granted scopes,不落库任何版本号。
6994
+ */
6995
+ needsUpgrade: external_exports.boolean().optional(),
6996
+ /**
6997
+ * bound 态叠加:正在扫码更新授权(spec 2026-09-01)。
6998
+ * **不复用 provisioning 态**——升级期间 bot 仍在正常服务(长连接不断、群照常响应),
6999
+ * 降级成 provisioning 会丢掉 botName / groups,UI 上像是断了。
7000
+ * 有值即渲染二维码弹层;升级结束(成功或取消)该字段消失。
7001
+ */
7002
+ upgradeQrUrl: external_exports.string().optional()
6988
7003
  });
6989
7004
  LarkBotStateFrameSchema = LarkBotStatusResultSchema.extend({
6990
7005
  personaId: external_exports.string().min(1)
@@ -8712,6 +8727,10 @@ var init_methods = __esm({
8712
8727
  summary: "\u89E3\u7ED1 persona \u7684\u98DE\u4E66 bot\uFF08\u5220\u4E91\u7AEF\u7ED1\u5B9A + \u65AD\u957F\u8FDE\u63A5\uFF0C\u98DE\u4E66\u4FA7 app \u4FDD\u7559\uFF09\uFF1Bowner-only",
8713
8728
  args: LarkBotUnbindArgs
8714
8729
  },
8730
+ "larkBot:upgrade": {
8731
+ summary: "\u626B\u7801\u66F4\u65B0\u5DF2\u7ED1\u5B9A bot \u7684\u6388\u6743\uFF08\u8865\u540E\u6765\u65B0\u589E\u7684 scope / \u4E8B\u4EF6\uFF09\uFF1B\u5168\u7A0B\u4FDD\u6301 bound\uFF0Cbot \u4E0D\u65AD\u8FDE\uFF1Bowner-only",
8732
+ args: LarkBotUpgradeArgs
8733
+ },
8715
8734
  "larkBot:status": {
8716
8735
  summary: "\u67E5 persona \u7684\u98DE\u4E66 bot \u72B6\u6001\uFF08unbound/bound/broken + \u670D\u52A1\u4E2D\u7FA4\u6E05\u5355\uFF09\uFF1Bowner-only",
8717
8736
  args: LarkBotStatusArgs
@@ -9157,8 +9176,8 @@ var init_visitor_schemas = __esm({
9157
9176
  function formatLarkSpeakerReminder(speaker) {
9158
9177
  return `<system-reminder>\u6B64\u6D88\u606F\u6765\u81EA\u98DE\u4E66\u7FA4\u6210\u5458 ${speaker}</system-reminder>`;
9159
9178
  }
9160
- function formatSenderAttribution(sender) {
9161
- if (sender.principal === "owner") return "";
9179
+ function formatSenderAttribution(sender, declaredParty) {
9180
+ if (sender.principal === "owner" && declaredParty === "owner") return "";
9162
9181
  if (!sender.displayName) return "";
9163
9182
  return `<system-reminder>\u6B64\u6D88\u606F\u6765\u81EA ${sender.principal}\uFF1A${sender.displayName}</system-reminder>`;
9164
9183
  }
@@ -44934,7 +44953,7 @@ function renderIdentityLines(fields) {
44934
44953
  function buildConnectionPrompt(args) {
44935
44954
  const parts = ["# \u8FDE\u63A5\u4E0A\u4E0B\u6587"];
44936
44955
  if (args.mode === "owner") {
44937
- parts.push("\u5F53\u524D\u8FDE\u63A5\u65B9\uFF08\u5C31\u662F owner \u672C\u4EBA\uFF09\uFF1A");
44956
+ parts.push("\u5F00\u8FD9\u4E2A session \u7684\u8FDE\u63A5\u65B9\uFF08\u5C31\u662F owner \u672C\u4EBA\uFF09\uFF1A");
44938
44957
  parts.push(
44939
44958
  renderIdentityLines({
44940
44959
  label: args.ownerLabel,
@@ -44943,7 +44962,7 @@ function buildConnectionPrompt(args) {
44943
44962
  })
44944
44963
  );
44945
44964
  } else {
44946
- parts.push("\u5F53\u524D\u8FDE\u63A5\u65B9\uFF08\u4E0D\u662F owner \u672C\u4EBA\uFF09\uFF1A");
44965
+ parts.push("\u5F00\u8FD9\u4E2A session \u7684\u8FDE\u63A5\u65B9\uFF08\u4E0D\u662F owner \u672C\u4EBA\uFF09\uFF1A");
44947
44966
  parts.push(
44948
44967
  renderIdentityLines({
44949
44968
  label: args.guestLabel,
@@ -44962,6 +44981,10 @@ function buildConnectionPrompt(args) {
44962
44981
  })
44963
44982
  );
44964
44983
  }
44984
+ parts.push("");
44985
+ parts.push(
44986
+ `\u4E0A\u9762\u5199\u7684\u662F\u5F00\u8FD9\u4E2A session \u7684\u4EBA\uFF0C\u4E4B\u540E\u7684\u6D88\u606F\u4E0D\u4E00\u5B9A\u90FD\u6765\u81EA\u4ED6 \u2014\u2014 \u4E2D\u9014\u53EF\u80FD\u6362\u4EBA\u8BF4\u8BDD\uFF0C\u6BD4\u5982 ${args.mode === "owner" ? "guest \u4ECE\u522B\u7684\u8BBE\u5907\u8FDE\u8FDB\u6765" : "owner \u672C\u4EBA\u8FDB\u6765"}\u63A5\u4E00\u53E5\u3002\u6D88\u606F\u5C3E\u90E8\u5E26 <system-reminder>\u6B64\u6D88\u606F\u6765\u81EA owner\uFF0Fguest\uFF1A\u67D0\u67D0</system-reminder> \u65F6\uFF0C\u4EE5\u5C3E\u6CE8\u91CC\u7684\u4EBA\u4E3A\u51C6\uFF1B\u6CA1\u6709\u5C3E\u6CE8\u5C31\u662F\u4E0A\u9762\u8FD9\u4F4D\u3002`
44987
+ );
44965
44988
  if (args.workDir) {
44966
44989
  parts.push("");
44967
44990
  let line = `\u4F60\u7684\u6587\u4EF6\u5DE5\u4F5C\u76EE\u5F55\u662F ${args.workDir}\uFF0C\u8FD9\u4E2A\u76EE\u5F55\u5BF9\u4F60\u53EF\u8BFB\u53EF\u5199\uFF0C\u6587\u4EF6\u7684\u8BFB\u53D6/\u521B\u5EFA/\u4FEE\u6539\u90FD\u5728\u8FD9\u91CC\u8FDB\u884C\u3002`;
@@ -44975,7 +44998,7 @@ function buildConnectionPrompt(args) {
44975
44998
  if (args.mode === "guest" && args.guestDeviceId) {
44976
44999
  parts.push("");
44977
45000
  parts.push(
44978
- `\u5BF9\u65B9\u8BF4\u7684\u300C\u6211\u7684\u684C\u9762 / \u6211\u672C\u5730\u7684\u2026\u300D\u662F\u4ED6\u90A3\u53F0\u8BBE\u5907\u3001\u4E0D\u662F\u672C\u673A\uFF1B\u8981\u5728\u90A3\u8FB9\u770B\u6587\u4EF6\u6216\u8DD1\u547D\u4EE4\uFF0C\u7528 peer-ops \u7684 exec\uFF0CpeerDeviceId \u586B ${args.guestDeviceId}\u3002`
45001
+ `${args.guestLabel}\u8BF4\u7684\u300C\u6211\u7684\u684C\u9762 / \u6211\u672C\u5730\u7684\u2026\u300D\u662F\u4ED6\u90A3\u53F0\u8BBE\u5907\u3001\u4E0D\u662F\u672C\u673A\uFF1B\u8981\u5728\u90A3\u8FB9\u770B\u6587\u4EF6\u6216\u8DD1\u547D\u4EE4\uFF0C\u7528 peer-ops \u7684 exec\uFF0CpeerDeviceId \u586B ${args.guestDeviceId}\u3002`
44979
45002
  );
44980
45003
  }
44981
45004
  parts.push("");
@@ -54026,6 +54049,7 @@ function buildShiftInternalHandlers(deps) {
54026
54049
  init_protocol();
54027
54050
  var PROVISION_ERROR_SET = new Set(LARK_BOT_PROVISION_ERROR_REASONS);
54028
54051
  var PROVISION_POLL_INTERVAL_MS = 2e3;
54052
+ var UPGRADE_POLL_MAX_FAILURES = 5;
54029
54053
  var PROVISION_MAX_CONSECUTIVE_FAILURES = 5;
54030
54054
  var PROVISION_POLL_MAX_MS = 60 * 60 * 1e3;
54031
54055
  function normalizeProvisionReason(reason) {
@@ -54039,6 +54063,7 @@ function buildLarkBotHandlers(deps) {
54039
54063
  const sleep2 = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
54040
54064
  const pollIntervalMs = deps.pollIntervalMs ?? PROVISION_POLL_INTERVAL_MS;
54041
54065
  const inFlight = /* @__PURE__ */ new Map();
54066
+ const upgradeInFlight = /* @__PURE__ */ new Map();
54042
54067
  const groupsOf = (personaId2) => {
54043
54068
  const removed = new Set(deps.store.read(personaId2)?.removedChatIds ?? []);
54044
54069
  return deps.listLarkSessions(personaId2).filter((g2) => !removed.has(g2.chatId));
@@ -54137,8 +54162,121 @@ function buildLarkBotHandlers(deps) {
54137
54162
  void runProvisionPolling(personaId2, provisionId);
54138
54163
  return { response: { type: "larkBot:provision:ok" } };
54139
54164
  };
54165
+ const runUpgradePolling = async (personaId2) => {
54166
+ const backToBound = (needsUpgrade) => {
54167
+ upgradeInFlight.delete(personaId2);
54168
+ const fresh = deps.store.read(personaId2);
54169
+ if (!fresh) {
54170
+ emit(personaId2, { state: "unbound", groups: [] });
54171
+ return;
54172
+ }
54173
+ emit(personaId2, {
54174
+ state: "bound",
54175
+ appId: fresh.appId,
54176
+ botName: fresh.botName,
54177
+ ...needsUpgrade ? { needsUpgrade: true } : {},
54178
+ groups: groupsOf(personaId2)
54179
+ });
54180
+ };
54181
+ const startedAt = now();
54182
+ let failures = 0;
54183
+ for (; ; ) {
54184
+ await sleep2(pollIntervalMs);
54185
+ const entry = upgradeInFlight.get(personaId2);
54186
+ if (!entry || entry.cancelled) return;
54187
+ if (now() - startedAt >= PROVISION_POLL_MAX_MS) {
54188
+ deps.logger?.warn(`larkBot upgrade poll deadline exceeded: ${personaId2}`);
54189
+ backToBound(true);
54190
+ return;
54191
+ }
54192
+ let stillNeeds;
54193
+ try {
54194
+ const binding = (await deps.cloud.listBindings()).find((b2) => b2.personaId === personaId2);
54195
+ if (!binding) {
54196
+ backToBound(false);
54197
+ return;
54198
+ }
54199
+ stillNeeds = binding.needsUpgrade !== false;
54200
+ failures = 0;
54201
+ if (!upgradeInFlight.get(personaId2) || upgradeInFlight.get(personaId2)?.cancelled) return;
54202
+ } catch (err) {
54203
+ failures += 1;
54204
+ deps.logger?.warn(`larkBot upgrade poll failed (${failures}): ${err.message}`);
54205
+ if (failures >= UPGRADE_POLL_MAX_FAILURES) {
54206
+ backToBound(true);
54207
+ return;
54208
+ }
54209
+ await sleep2(pollIntervalMs * 2 ** failures);
54210
+ continue;
54211
+ }
54212
+ if (!stillNeeds) {
54213
+ backToBound(false);
54214
+ return;
54215
+ }
54216
+ }
54217
+ };
54218
+ const upgrade = async (frame) => {
54219
+ const { personaId: personaId2 } = parseArgs2(LarkBotUpgradeArgs, frame, "larkBot:upgrade");
54220
+ const meta = deps.store.read(personaId2);
54221
+ if (!meta) throw new Error(`larkBot not bound: ${personaId2}`);
54222
+ if (inFlight.has(personaId2) || upgradeInFlight.has(personaId2)) {
54223
+ throw new Error(`larkBot provision already in flight: ${personaId2}`);
54224
+ }
54225
+ upgradeInFlight.set(personaId2, { provisionId: "", qrUrl: "", cancelled: false });
54226
+ let provisionId;
54227
+ let qrUrl;
54228
+ try {
54229
+ ;
54230
+ ({ provisionId, qrUrl } = await deps.cloud.provisionUpgrade({ personaId: personaId2 }));
54231
+ } catch (err) {
54232
+ upgradeInFlight.delete(personaId2);
54233
+ throw err;
54234
+ }
54235
+ const placeholder = upgradeInFlight.get(personaId2);
54236
+ if (!placeholder || placeholder.cancelled) {
54237
+ upgradeInFlight.delete(personaId2);
54238
+ void deps.cloud.provisionCancel(provisionId).catch(
54239
+ (err) => deps.logger?.warn(`larkBot upgrade cancel-during-begin: ${err.message}`)
54240
+ );
54241
+ return { response: { type: "larkBot:upgrade:ok" } };
54242
+ }
54243
+ upgradeInFlight.set(personaId2, { provisionId, qrUrl, cancelled: false });
54244
+ emit(personaId2, {
54245
+ state: "bound",
54246
+ appId: meta.appId,
54247
+ botName: meta.botName,
54248
+ needsUpgrade: true,
54249
+ upgradeQrUrl: qrUrl,
54250
+ groups: groupsOf(personaId2)
54251
+ });
54252
+ void runUpgradePolling(personaId2);
54253
+ return { response: { type: "larkBot:upgrade:ok" } };
54254
+ };
54140
54255
  const provisionCancel = async (frame) => {
54141
54256
  const { personaId: personaId2 } = parseArgs2(LarkBotProvisionCancelArgs, frame, "larkBot:provisionCancel");
54257
+ const upgrading = upgradeInFlight.get(personaId2);
54258
+ if (upgrading) {
54259
+ upgrading.cancelled = true;
54260
+ upgradeInFlight.delete(personaId2);
54261
+ if (upgrading.provisionId) {
54262
+ await deps.cloud.provisionCancel(upgrading.provisionId).catch(
54263
+ (err) => deps.logger?.warn(`larkBot upgrade cancel cloud failed: ${err.message}`)
54264
+ );
54265
+ }
54266
+ const meta = deps.store.read(personaId2);
54267
+ emit(
54268
+ personaId2,
54269
+ meta ? {
54270
+ state: "bound",
54271
+ appId: meta.appId,
54272
+ botName: meta.botName,
54273
+ // 取消了就是没升成,提示条留着
54274
+ needsUpgrade: true,
54275
+ groups: groupsOf(personaId2)
54276
+ } : { state: "unbound", groups: [] }
54277
+ );
54278
+ return { response: { type: "larkBot:provisionCancel:ok" } };
54279
+ }
54142
54280
  const entry = inFlight.get(personaId2);
54143
54281
  if (!entry) throw new Error(`larkBot provision not in flight: ${personaId2}`);
54144
54282
  entry.cancelled = true;
@@ -54178,6 +54316,7 @@ function buildLarkBotHandlers(deps) {
54178
54316
  const ownerId = deps.getOwnerId();
54179
54317
  if (!ownerId) throw new Error("larkBot bind requires feishu login (owner identity)");
54180
54318
  const name = botName ?? deps.getPersonaName(personaId2) ?? personaId2;
54319
+ upgradeInFlight.delete(personaId2);
54181
54320
  await deps.cloud.bind({ personaId: personaId2, appId, appSecret, botName: name, tunnelUrl, ownerId });
54182
54321
  deps.store.write(personaId2, { appId, botName: name, boundAt: now() });
54183
54322
  emit(personaId2, { state: "bound", appId, botName: name, groups: groupsOf(personaId2) });
@@ -54185,6 +54324,7 @@ function buildLarkBotHandlers(deps) {
54185
54324
  };
54186
54325
  const unbind = async (frame) => {
54187
54326
  const { personaId: personaId2 } = parseArgs2(LarkBotUnbindArgs, frame, "larkBot:unbind");
54327
+ upgradeInFlight.delete(personaId2);
54188
54328
  const meta = deps.store.read(personaId2);
54189
54329
  if (!meta) throw new Error(`larkBot not bound: ${personaId2}`);
54190
54330
  try {
@@ -54210,6 +54350,8 @@ function buildLarkBotHandlers(deps) {
54210
54350
  }
54211
54351
  };
54212
54352
  }
54353
+ const upgrading = upgradeInFlight.get(personaId2);
54354
+ const upgradingQr = upgrading && !upgrading.cancelled ? upgrading.qrUrl : void 0;
54213
54355
  const meta = deps.store.read(personaId2);
54214
54356
  let cloudReachable = false;
54215
54357
  let cloudBinding;
@@ -54231,7 +54373,10 @@ function buildLarkBotHandlers(deps) {
54231
54373
  state: broken2 ? "broken" : "bound",
54232
54374
  appId: cloudBinding.appId,
54233
54375
  botName: cloudBinding.botName,
54376
+ ...upgradingQr ? { needsUpgrade: true, upgradeQrUrl: upgradingQr } : {},
54234
54377
  ...broken2 ? { brokenReason: cloudBinding.brokenReason ?? "unknown" } : {},
54378
+ // 云端判定(它持有飞书回读的 granted scopes),daemon 只透传(spec 2026-09-01)
54379
+ ...cloudBinding.needsUpgrade ? { needsUpgrade: true } : {},
54235
54380
  groups: groupsOf(personaId2)
54236
54381
  };
54237
54382
  return { response: { type: "larkBot:status:ok", ...result2 } };
@@ -54258,7 +54403,10 @@ function buildLarkBotHandlers(deps) {
54258
54403
  state: broken ? "broken" : "bound",
54259
54404
  appId: cloudBinding?.appId ?? meta.appId,
54260
54405
  botName: cloudBinding?.botName ?? meta.botName,
54406
+ ...upgradingQr ? { needsUpgrade: true, upgradeQrUrl: upgradingQr } : {},
54261
54407
  ...broken ? { brokenReason: cloudBinding?.brokenReason ?? "unknown" } : {},
54408
+ // 云端不可达时 cloudBinding 为空 → 不提示升级(宁可不提示也不误报)
54409
+ ...cloudBinding?.needsUpgrade ? { needsUpgrade: true } : {},
54262
54410
  groups: groupsOf(personaId2)
54263
54411
  };
54264
54412
  return { response: { type: "larkBot:status:ok", ...result } };
@@ -54268,7 +54416,8 @@ function buildLarkBotHandlers(deps) {
54268
54416
  "larkBot:provisionCancel": provisionCancel,
54269
54417
  "larkBot:bindManual": bindManual,
54270
54418
  "larkBot:unbind": unbind,
54271
- "larkBot:status": status
54419
+ "larkBot:status": status,
54420
+ "larkBot:upgrade": upgrade
54272
54421
  };
54273
54422
  }
54274
54423
  async function refreshTunnelUrlOnStartup(deps) {
@@ -54388,6 +54537,10 @@ function createLarkBotCloudClient(opts) {
54388
54537
  const json = await request("POST", "/api/lark-bot/provision", { ...args });
54389
54538
  return { provisionId: String(json.provisionId), qrUrl: String(json.qrUrl) };
54390
54539
  },
54540
+ async provisionUpgrade(args) {
54541
+ const json = await request("POST", "/api/lark-bot/upgrade", { ...args });
54542
+ return { provisionId: String(json.provisionId), qrUrl: String(json.qrUrl) };
54543
+ },
54391
54544
  async provisionStatus(provisionId) {
54392
54545
  const json = await request("GET", `/api/lark-bot/provision/${encodeURIComponent(provisionId)}`);
54393
54546
  if (json.state === "success") {
@@ -61017,7 +61170,9 @@ function buildSessionHandlers(deps) {
61017
61170
  deps.getOwnerIdentity().feishuUnionId
61018
61171
  )
61019
61172
  );
61020
- const attribution = formatSenderAttribution(sender);
61173
+ const creatorPrincipalId = manager.findOwnedSession(args.sessionId)?.creatorPrincipalId;
61174
+ const declaredParty = creatorPrincipalId && creatorPrincipalId !== ownerPrincipalId ? "guest" : "owner";
61175
+ const attribution = formatSenderAttribution(sender, declaredParty);
61021
61176
  const outbound = attribution ? { ...args, text: `${args.text}
61022
61177
 
61023
61178
  ${attribution}` } : args;
@@ -62515,6 +62670,7 @@ var METHOD_GRANT_MAP = {
62515
62670
  "larkBot:bindManual": ADMIN_ANY,
62516
62671
  "larkBot:unbind": ADMIN_ANY,
62517
62672
  "larkBot:status": ADMIN_ANY,
62673
+ "larkBot:upgrade": ADMIN_ANY,
62518
62674
  // ---- onboarding:* / tools:probe / session:externalScan(首启 wizard,owner-only)----
62519
62675
  "onboarding:complete": ADMIN_ANY,
62520
62676
  "onboarding:iosInterest": ADMIN_ANY,
@@ -62651,7 +62807,7 @@ function computeMethodAccess(args) {
62651
62807
  }
62652
62808
 
62653
62809
  // src/version.ts
62654
- var version = "0.2.436".length > 0 ? "0.2.436" : "dev";
62810
+ var version = "0.2.438".length > 0 ? "0.2.438" : "dev";
62655
62811
 
62656
62812
  // src/cli-probe/probe.ts
62657
62813
  var fs65 = __toESM(require("fs"), 1);
@@ -22118,6 +22118,7 @@ var GithubPrRequestReviewersArgs = external_exports.object({
22118
22118
  // ../protocol/src/lark-bot-schemas.ts
22119
22119
  var LarkBotPersonaArgs = external_exports.object({ personaId: external_exports.string().min(1) });
22120
22120
  var LarkBotUnbindArgs = LarkBotPersonaArgs;
22121
+ var LarkBotUpgradeArgs = external_exports.object({ personaId: external_exports.string().min(1) });
22121
22122
  var LarkBotStatusArgs = LarkBotPersonaArgs;
22122
22123
  var LarkBotProvisionArgs = LarkBotPersonaArgs;
22123
22124
  var LarkBotProvisionCancelArgs = LarkBotPersonaArgs;
@@ -22151,7 +22152,21 @@ var LarkBotStatusResultSchema = external_exports.object({
22151
22152
  qrUrl: external_exports.string().optional(),
22152
22153
  /** provision 失败后的 unbound 帧携带;正常 unbound 无此字段 */
22153
22154
  errorReason: LarkBotProvisionErrorReasonSchema.optional(),
22154
- groups: external_exports.array(LarkBotGroupSchema)
22155
+ groups: external_exports.array(LarkBotGroupSchema),
22156
+ /**
22157
+ * bound 态:该 bot 实际授予的 scope 缺了 LARK_PROVISION_ADDONS 里声明的项
22158
+ * (spec 2026-09-01)——addons 是扫码时一次性写进飞书应用配置的,后来新增的
22159
+ * scope / 事件对存量 bot 不生效,不提示的话用户只会觉得「功能没生效」。
22160
+ * 判定真源是飞书回读的 granted scopes,不落库任何版本号。
22161
+ */
22162
+ needsUpgrade: external_exports.boolean().optional(),
22163
+ /**
22164
+ * bound 态叠加:正在扫码更新授权(spec 2026-09-01)。
22165
+ * **不复用 provisioning 态**——升级期间 bot 仍在正常服务(长连接不断、群照常响应),
22166
+ * 降级成 provisioning 会丢掉 botName / groups,UI 上像是断了。
22167
+ * 有值即渲染二维码弹层;升级结束(成功或取消)该字段消失。
22168
+ */
22169
+ upgradeQrUrl: external_exports.string().optional()
22155
22170
  });
22156
22171
  var LarkBotStateFrameSchema = LarkBotStatusResultSchema.extend({
22157
22172
  personaId: external_exports.string().min(1)
@@ -23772,6 +23787,10 @@ var METHOD_DOCS = {
23772
23787
  summary: "\u89E3\u7ED1 persona \u7684\u98DE\u4E66 bot\uFF08\u5220\u4E91\u7AEF\u7ED1\u5B9A + \u65AD\u957F\u8FDE\u63A5\uFF0C\u98DE\u4E66\u4FA7 app \u4FDD\u7559\uFF09\uFF1Bowner-only",
23773
23788
  args: LarkBotUnbindArgs
23774
23789
  },
23790
+ "larkBot:upgrade": {
23791
+ summary: "\u626B\u7801\u66F4\u65B0\u5DF2\u7ED1\u5B9A bot \u7684\u6388\u6743\uFF08\u8865\u540E\u6765\u65B0\u589E\u7684 scope / \u4E8B\u4EF6\uFF09\uFF1B\u5168\u7A0B\u4FDD\u6301 bound\uFF0Cbot \u4E0D\u65AD\u8FDE\uFF1Bowner-only",
23792
+ args: LarkBotUpgradeArgs
23793
+ },
23775
23794
  "larkBot:status": {
23776
23795
  summary: "\u67E5 persona \u7684\u98DE\u4E66 bot \u72B6\u6001\uFF08unbound/bound/broken + \u670D\u52A1\u4E2D\u7FA4\u6E05\u5355\uFF09\uFF1Bowner-only",
23777
23796
  args: LarkBotStatusArgs