@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 +166 -10
- package/dist/dispatch/mcp-server.cjs +20 -1
- package/dist/share-md-viewer-error.html +1 -1
- package/dist/share-md-viewer.html +1 -1
- package/dist/share-ui/assets/{guest-BYFRrJkW.css → guest-CdTJbtWU.css} +1 -1
- package/dist/share-ui/assets/{guest-CDKzPfYt.js → guest-kR-iXTSq.js} +130 -130
- package/dist/share-ui/guest.html +2 -2
- package/package.json +1 -1
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("\
|
|
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("\
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|