cclawd 2026.3.26 → 2026.3.27

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 (40) hide show
  1. package/dist/.buildstamp +1 -1
  2. package/dist/{agents-C2_apaRl.js → agents-BNKB08km.js} +4 -4
  3. package/dist/{agents-jRHu-yVW.js → agents-BdtFdlIN.js} +1 -1
  4. package/dist/build-info.json +3 -3
  5. package/dist/{channel-DbrLPVRk.js → channel-Dz1n3akq.js} +270 -11
  6. package/dist/{channels-CZH2hny_.js → channels-Bt0w3hbW.js} +4 -4
  7. package/dist/{channels-cli-DBYTAjRU.js → channels-cli-DgqDIEVC.js} +7 -7
  8. package/dist/{command-registry-BUCg5Yjv.js → command-registry-jlEvUAKq.js} +2 -2
  9. package/dist/{command-registry-DuepL5IT.js → command-registry-maV_byWv.js} +7 -7
  10. package/dist/{completion-cli-DEwxxtpl.js → completion-cli-B7KByNii.js} +2 -2
  11. package/dist/{completion-cli-BHl_-TbA.js → completion-cli-BgpfJ8GC.js} +3 -3
  12. package/dist/{config-cli-BUJXj3eo.js → config-cli-CkDay3qv.js} +1 -1
  13. package/dist/{configure-9-PQJTTK.js → configure-Bhpnr3RQ.js} +4 -4
  14. package/dist/{configure-CiRiSByg.js → configure-DEgPFToe.js} +1 -1
  15. package/dist/{doctor-completion-BKC_yRJu.js → doctor-completion-Bhbtito8.js} +1 -1
  16. package/dist/entry.js +1 -1
  17. package/dist/extensions/feishu/index.js +2 -2
  18. package/dist/extensions/feishu/setup-entry.js +1 -1
  19. package/dist/{feishu-CaswV1Oq.js → feishu-p4QIwtc9.js} +1 -1
  20. package/dist/{gateway-cli-Du6MIaFO.js → gateway-cli-jjoIZrdZ.js} +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/{onboard-CVHxysXI.js → onboard-bnQMb8SY.js} +1 -1
  23. package/dist/{onboard-channels-CFM-GqSa.js → onboard-channels-CYyBfLIY.js} +3 -3
  24. package/dist/{onboard-channels-katsK5NE.js → onboard-channels-aMYUZrDN.js} +1 -1
  25. package/dist/plugin-sdk/extensions/feishu/src/bot.d.ts +2 -0
  26. package/dist/plugin-sdk/extensions/feishu/src/real-person-auth.d.ts +14 -0
  27. package/dist/{program-vgusBOnw.js → program-Xr3NHOnX.js} +2 -2
  28. package/dist/{prompt-select-styled-BoBpzerB.js → prompt-select-styled-ClRa2a-J.js} +1 -1
  29. package/dist/{register.agent-WOPQnmT4.js → register.agent-D2oBiVp5.js} +4 -4
  30. package/dist/{register.configure-Mll-Mq42.js → register.configure-DYLRiwv_.js} +4 -4
  31. package/dist/{register.maintenance-Rj539JWw.js → register.maintenance-C_px1a87.js} +5 -5
  32. package/dist/{register.onboard-u9mcSt7t.js → register.onboard-D3kGpBcj.js} +2 -2
  33. package/dist/{register.setup-CkZS2aXC.js → register.setup-BfTBJ7il.js} +2 -2
  34. package/dist/{register.subclis-B6HYIWdr.js → register.subclis-Dd2E6UgL.js} +4 -4
  35. package/dist/{register.subclis-mDzvRQMA.js → register.subclis-pNtiPM8G.js} +1 -1
  36. package/dist/{run-main-DvmjKiL6.js → run-main-CypZFyVz.js} +7 -7
  37. package/dist/{setup-BDaeBY6O.js → setup-CLruc3vw.js} +2 -2
  38. package/dist/{setup.finalize-Bs2AabmP.js → setup.finalize-DUXM1TZ3.js} +4 -4
  39. package/dist/{update-cli-BgZUMbWl.js → update-cli-8mkYBPsE.js} +5 -5
  40. package/package.json +1 -1
package/dist/.buildstamp CHANGED
@@ -1 +1 @@
1
- {"builtAt":1775620275191,"head":"1b8c91f7876702f0e4e28e0c1617c4d46fcf945c"}
1
+ {"builtAt":1775637451867,"head":"843e6a14abe65fe2a4a053fdc32d029755e1bb67"}
@@ -252,9 +252,9 @@ import "./setup-core-CcGzCpOK.js";
252
252
  import "./shared-x4Yc8-25.js";
253
253
  import "./setup-entry-CcHvI1Mu.js";
254
254
  import "./reactions-CVOq_v6N.js";
255
- import "./feishu-CaswV1Oq.js";
255
+ import "./feishu-p4QIwtc9.js";
256
256
  import "./runtime-api-lhuSYASv.js";
257
- import "./channel-DbrLPVRk.js";
257
+ import "./channel-Dz1n3akq.js";
258
258
  import "./send-C3ijC8Mw.js";
259
259
  import "./runtime-p5-el0rU.js";
260
260
  import "./setup-core-Bw009yg5.js";
@@ -303,7 +303,7 @@ import "./agents.config-siTlMqn8.js";
303
303
  import "./provider-auth-choice-helpers-fXJv3eWi.js";
304
304
  import "./provider-auth-guidance-DXgeysMX.js";
305
305
  import "./config-validation-9iWWSktF.js";
306
- import { t as agentsListCommand } from "./agents-jRHu-yVW.js";
306
+ import { t as agentsListCommand } from "./agents-BdtFdlIN.js";
307
307
  import "./provider-auth-choices-D3uPSLCc.js";
308
308
  import "./provider-wizard-D8q7vx9b.js";
309
309
  import "./auth-choice-options-DGRXgwnh.js";
@@ -312,5 +312,5 @@ import "./provider-auth-choice-B6Vf-54o.js";
312
312
  import "./auth-choice.apply-helpers-DnZSQbUl.js";
313
313
  import "./provider-auth-choice-preference-MiQguMwm.js";
314
314
  import "./auth-choice-DdOY5kEs.js";
315
- import "./onboard-channels-katsK5NE.js";
315
+ import "./onboard-channels-aMYUZrDN.js";
316
316
  export { agentsListCommand };
@@ -20,7 +20,7 @@ import { i as loadAgentIdentity, n as buildAgentSummaries, o as pruneAgentConfig
20
20
  import { a as parseBindingSpecs, i as describeBinding, n as applyAgentBindings, o as removeAgentBindings, r as buildChannelBindings, t as requireValidConfigSnapshot } from "./config-validation-9iWWSktF.js";
21
21
  import { t as promptAuthChoiceGrouped } from "./auth-choice-prompt-Bkr-WsTr.js";
22
22
  import { n as applyAuthChoice, t as warnIfModelConfigLooksOff } from "./auth-choice-DdOY5kEs.js";
23
- import { i as setupChannels } from "./onboard-channels-katsK5NE.js";
23
+ import { i as setupChannels } from "./onboard-channels-aMYUZrDN.js";
24
24
  import path from "node:path";
25
25
  import fs from "node:fs/promises";
26
26
  //#region src/commands/agents.command-shared.ts
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.3.26",
3
- "commit": "1b8c91f7876702f0e4e28e0c1617c4d46fcf945c",
4
- "builtAt": "2026-04-08T03:51:34.349Z"
2
+ "version": "2026.3.27",
3
+ "commit": "843e6a14abe65fe2a4a053fdc32d029755e1bb67",
4
+ "builtAt": "2026-04-08T08:40:38.891Z"
5
5
  }
@@ -33,7 +33,9 @@ import { A as listFeishuDirectoryPeers, C as sendMediaFeishu, E as getFeishuRunt
33
33
  import fs from "node:fs";
34
34
  import path from "node:path";
35
35
  import os from "node:os";
36
+ import fs$1 from "node:fs/promises";
36
37
  import crypto from "node:crypto";
38
+ import { config } from "dotenv";
37
39
  import { z as z$2 } from "zod";
38
40
  import * as http from "http";
39
41
  import * as crypto$1 from "crypto";
@@ -904,8 +906,196 @@ function resolveFeishuReplyPolicy(params) {
904
906
  }
905
907
  //#endregion
906
908
  //#region extensions/feishu/src/real-person-auth.ts
909
+ const REAL_PERSON_AUTH_API_BASE_URL = "https://cclawd.dbhl.cn";
910
+ const REAL_PERSON_AUTH_H5_BASE_URL = "https://h5.dabby.com.cn";
911
+ const MFA_AUTH_API_KEY = "MFA_AUTH_API_KEY";
912
+ const REAL_PERSON_AUTH_REQUEST_TIMEOUT_MS = 12e3;
913
+ function getResponseMessage(payload, fallback) {
914
+ if (typeof payload.data?.message === "string" && payload.data.message.trim()) return payload.data.message;
915
+ if (typeof payload.message === "string" && payload.message.trim()) return payload.message;
916
+ if (typeof payload.msg === "string" && payload.msg.trim()) return payload.msg;
917
+ return fallback;
918
+ }
919
+ async function parseJsonResponse(response, fallbackMessage) {
920
+ let payload = {};
921
+ try {
922
+ payload = await response.json();
923
+ } catch {
924
+ if (!response.ok) throw new Error(`${fallbackMessage}: ${response.status} ${response.statusText}`);
925
+ return {};
926
+ }
927
+ if (!response.ok) throw new Error(getResponseMessage(payload, `${fallbackMessage}: ${response.status} ${response.statusText}`));
928
+ return payload;
929
+ }
930
+ async function requestJson(input, init, fallbackMessage) {
931
+ const controller = new AbortController();
932
+ const timeout = setTimeout(() => controller.abort(), REAL_PERSON_AUTH_REQUEST_TIMEOUT_MS);
933
+ try {
934
+ return await parseJsonResponse(await fetch(input, {
935
+ ...init,
936
+ signal: controller.signal
937
+ }), fallbackMessage);
938
+ } catch (err) {
939
+ if (err?.name === "AbortError") throw new Error(`${fallbackMessage}: request timed out after ${REAL_PERSON_AUTH_REQUEST_TIMEOUT_MS}ms`);
940
+ throw err;
941
+ } finally {
942
+ clearTimeout(timeout);
943
+ }
944
+ }
945
+ async function getVerifyCode(apiKey) {
946
+ const trimmedApiKey = apiKey.trim();
947
+ if (!trimmedApiKey) throw new Error("MFA_AUTH_API_KEY is required");
948
+ const payload = await requestJson(new URL("/api/v1/getVerifyCode", REAL_PERSON_AUTH_API_BASE_URL), {
949
+ method: "POST",
950
+ headers: { "Content-Type": "application/json" },
951
+ body: JSON.stringify({
952
+ apiKey: trimmedApiKey,
953
+ authType: "ScanAuth",
954
+ mode: "66"
955
+ })
956
+ }, "Failed to create verification QR code");
957
+ const certToken = typeof payload.data?.certToken === "string" ? payload.data.certToken : "";
958
+ const qrCodeUrl = typeof payload.data?.qrCodeUrl === "string" ? payload.data.qrCodeUrl : "";
959
+ if (!certToken || !qrCodeUrl) throw new Error(getResponseMessage(payload, "Verification QR code response was incomplete"));
960
+ return {
961
+ certToken,
962
+ qrCodeUrl
963
+ };
964
+ }
965
+ async function checkAuthStatus(apiKey, certToken) {
966
+ const trimmedApiKey = apiKey.trim();
967
+ const trimmedCertToken = certToken.trim();
968
+ if (!trimmedApiKey) throw new Error("MFA_AUTH_API_KEY is required");
969
+ if (!trimmedCertToken) throw new Error("certToken is required");
970
+ const payload = await requestJson(new URL("/api/v1/checkAuthStatus", REAL_PERSON_AUTH_API_BASE_URL), {
971
+ method: "POST",
972
+ headers: { "Content-Type": "application/json" },
973
+ body: JSON.stringify({
974
+ apiKey: trimmedApiKey,
975
+ certToken: trimmedCertToken
976
+ })
977
+ }, "Failed to check verification status");
978
+ if (payload.data?.authSuccess === true) return "success";
979
+ if (payload.retCode === 4401) return "pending";
980
+ return "failed";
981
+ }
982
+ function resolveRealPersonAuthStorePath() {
983
+ return path.join(os.homedir(), ".openclaw", "cclawd-guard", "feishu-real-person-auth.json");
984
+ }
985
+ async function readRealPersonAuthStore(authFilePath, error) {
986
+ try {
987
+ const content = await fs$1.readFile(authFilePath, "utf-8");
988
+ return JSON.parse(content);
989
+ } catch (err) {
990
+ if (err.code === "ENOENT") {
991
+ await fs$1.mkdir(path.dirname(authFilePath), { recursive: true });
992
+ await fs$1.writeFile(authFilePath, "{}", "utf-8");
993
+ return {};
994
+ }
995
+ error(`Failed to read auth file: ${err.message}`, err);
996
+ return {};
997
+ }
998
+ }
999
+ async function writeRealPersonAuthStore(authFilePath, data) {
1000
+ await fs$1.writeFile(authFilePath, JSON.stringify(data, null, 2), "utf-8");
1001
+ }
1002
+ function resolveMfaApiKey(log, error) {
1003
+ config({ path: path.join(os.homedir(), ".openclaw", ".env") });
1004
+ const apiKey = process.env[MFA_AUTH_API_KEY];
1005
+ log(`[real-person-auth] MFA_AUTH_API_KEY exists: ${!!apiKey}`);
1006
+ if (!apiKey) {
1007
+ error("MFA_AUTH_API_KEY not found in environment variables", void 0);
1008
+ throw new Error("MFA_AUTH_API_KEY not configured");
1009
+ }
1010
+ return apiKey;
1011
+ }
1012
+ function resolveVerificationUrl(certToken) {
1013
+ return `${process.env.DABBY_AUTH_H5_BASE_URL || REAL_PERSON_AUTH_H5_BASE_URL}/authhtml/index.html#/auth?certToken=${certToken}&fromSource=Cclawd`;
1014
+ }
1015
+ async function checkFeishuRealPersonAuthStatus(params) {
1016
+ const authFilePath = resolveRealPersonAuthStorePath();
1017
+ const authData = await readRealPersonAuthStore(authFilePath, params.error);
1018
+ const userAuth = authData[params.senderId];
1019
+ if (!userAuth) return { status: "missing" };
1020
+ if (userAuth.authenticated) return { status: "success" };
1021
+ const certToken = userAuth.certToken?.trim() ?? "";
1022
+ if (!certToken) return { status: "missing" };
1023
+ const apiKey = resolveMfaApiKey(params.log, params.error);
1024
+ params.log(`[real-person-auth] checking auth status for certToken: ${certToken.slice(0, 8)}...`);
1025
+ const status = await checkAuthStatus(apiKey, certToken);
1026
+ params.log(`[real-person-auth] auth status: ${status}`);
1027
+ if (status === "success") {
1028
+ authData[params.senderId] = {
1029
+ authenticated: true,
1030
+ certToken,
1031
+ successNotified: true
1032
+ };
1033
+ await writeRealPersonAuthStore(authFilePath, authData);
1034
+ return { status: "success" };
1035
+ }
1036
+ if (status === "pending") return {
1037
+ status: "pending",
1038
+ verificationUrl: resolveVerificationUrl(certToken),
1039
+ certToken
1040
+ };
1041
+ return { status: "failed" };
1042
+ }
907
1043
  async function resolveFeishuRealPersonAuthGate(params) {
908
- return { action: "allow" };
1044
+ try {
1045
+ const authFilePath = resolveRealPersonAuthStorePath();
1046
+ const authData = await readRealPersonAuthStore(authFilePath, params.error);
1047
+ const apiKey = resolveMfaApiKey(params.log, params.error);
1048
+ const authH5BaseUrl = process.env.DABBY_AUTH_H5_BASE_URL || REAL_PERSON_AUTH_H5_BASE_URL;
1049
+ params.log(`[real-person-auth] authH5BaseUrl: ${authH5BaseUrl}`);
1050
+ const userAuth = authData[params.senderId];
1051
+ if (userAuth?.authenticated) {
1052
+ if (!userAuth.successNotified) {
1053
+ authData[params.senderId] = {
1054
+ ...userAuth,
1055
+ successNotified: true
1056
+ };
1057
+ await writeRealPersonAuthStore(authFilePath, authData);
1058
+ return { action: "allow-with-success" };
1059
+ }
1060
+ return { action: "allow" };
1061
+ }
1062
+ if (userAuth?.certToken) {
1063
+ params.log(`[real-person-auth] checking auth status for certToken: ${userAuth.certToken.slice(0, 8)}...`);
1064
+ const status = await checkAuthStatus(apiKey, userAuth.certToken);
1065
+ params.log(`[real-person-auth] auth status: ${status}`);
1066
+ if (status === "success") {
1067
+ authData[params.senderId] = {
1068
+ authenticated: true,
1069
+ certToken: userAuth.certToken,
1070
+ successNotified: true
1071
+ };
1072
+ await writeRealPersonAuthStore(authFilePath, authData);
1073
+ return { action: "allow-with-success" };
1074
+ }
1075
+ if (status === "pending") return {
1076
+ action: "block",
1077
+ verificationUrl: `${authH5BaseUrl}/authhtml/index.html#/auth?certToken=${userAuth.certToken}&fromSource=Cclawd`,
1078
+ certToken: userAuth.certToken
1079
+ };
1080
+ }
1081
+ params.log("[real-person-auth] calling getVerifyCode API...");
1082
+ const { certToken } = await getVerifyCode(apiKey);
1083
+ params.log(`[real-person-auth] got certToken: ${certToken.slice(0, 8)}...`);
1084
+ authData[params.senderId] = {
1085
+ authenticated: false,
1086
+ certToken,
1087
+ successNotified: false
1088
+ };
1089
+ await writeRealPersonAuthStore(authFilePath, authData);
1090
+ return {
1091
+ action: "block",
1092
+ verificationUrl: `${authH5BaseUrl}/authhtml/index.html#/auth?certToken=${certToken}&fromSource=Cclawd`,
1093
+ certToken
1094
+ };
1095
+ } catch (err) {
1096
+ params.error(`resolveFeishuRealPersonAuthGate error: ${err.message}`, err);
1097
+ throw err;
1098
+ }
909
1099
  }
910
1100
  //#endregion
911
1101
  //#region extensions/feishu/src/streaming-card.ts
@@ -1667,6 +1857,18 @@ function createFeishuReplyDispatcher(params) {
1667
1857
  //#region extensions/feishu/src/bot.ts
1668
1858
  const permissionErrorNotifiedAt = /* @__PURE__ */ new Map();
1669
1859
  const PERMISSION_ERROR_COOLDOWN_MS = 300 * 1e3;
1860
+ const REAL_PERSON_AUTH_POLL_INTERVAL_MS = 2e3;
1861
+ const REAL_PERSON_AUTH_POLL_TIMEOUT_MS = 300 * 1e3;
1862
+ const pendingAuthReplayByKey = /* @__PURE__ */ new Map();
1863
+ const activeAuthPollByKey = /* @__PURE__ */ new Map();
1864
+ function buildAuthReplayKey(accountId, senderId) {
1865
+ return `${accountId}:${senderId}`;
1866
+ }
1867
+ function sleep(ms) {
1868
+ return new Promise((resolve) => {
1869
+ setTimeout(resolve, ms);
1870
+ });
1871
+ }
1670
1872
  function resolveBroadcastAgents(cfg, peerId) {
1671
1873
  const broadcast = cfg.broadcast;
1672
1874
  if (!broadcast || typeof broadcast !== "object") return null;
@@ -1733,7 +1935,7 @@ function buildFeishuAgentBody(params) {
1733
1935
  return messageBody;
1734
1936
  }
1735
1937
  async function handleFeishuMessage(params) {
1736
- const { cfg, event, botOpenId, botName, runtime, chatHistories, accountId, processingClaimHeld = false } = params;
1938
+ const { cfg, event, botOpenId, botName, runtime, chatHistories, accountId, processingClaimHeld = false, skipDedupe = false, skipRealPersonAuth = false } = params;
1737
1939
  const account = resolveFeishuAccount({
1738
1940
  cfg,
1739
1941
  accountId
@@ -1742,14 +1944,16 @@ async function handleFeishuMessage(params) {
1742
1944
  const log = runtime?.log ?? console.log;
1743
1945
  const error = runtime?.error ?? console.error;
1744
1946
  const messageId = event.message.message_id;
1745
- if (!await finalizeFeishuMessageProcessing({
1746
- messageId,
1747
- namespace: account.accountId,
1748
- log,
1749
- claimHeld: processingClaimHeld
1750
- })) {
1751
- log(`feishu: skipping duplicate message ${messageId}`);
1752
- return;
1947
+ if (!skipDedupe) {
1948
+ if (!await finalizeFeishuMessageProcessing({
1949
+ messageId,
1950
+ namespace: account.accountId,
1951
+ log,
1952
+ claimHeld: processingClaimHeld
1953
+ })) {
1954
+ log(`feishu: skipping duplicate message ${messageId}`);
1955
+ return;
1956
+ }
1753
1957
  }
1754
1958
  let ctx = parseFeishuMessageEvent(event, botOpenId, botName);
1755
1959
  const isGroup = ctx.chatType === "group";
@@ -1776,7 +1980,10 @@ async function handleFeishuMessage(params) {
1776
1980
  accountId: account.accountId
1777
1981
  });
1778
1982
  };
1779
- if (ctx.chatType === "p2p" && senderIdForAuth && senderIdForAuth !== botOpenId) {
1983
+ const requiresRealPersonAuth = !skipRealPersonAuth && (ctx.chatType === "p2p" || ctx.chatType === "private") && senderIdForAuth && senderIdForAuth !== botOpenId;
1984
+ log(`feishu[${account.accountId}]: auth check - chatType=${ctx.chatType}, senderIdForAuth=${senderIdForAuth}, botOpenId=${botOpenId}, requiresRealPersonAuth=${requiresRealPersonAuth}, hasSender=${!!senderIdForAuth}, notSelf=${senderIdForAuth !== botOpenId}`);
1985
+ if (requiresRealPersonAuth) {
1986
+ log(`feishu[${account.accountId}]: checking real-person auth for ${senderIdForAuth}`);
1780
1987
  const gate = await resolveFeishuRealPersonAuthGate({
1781
1988
  accountId: account.accountId,
1782
1989
  senderId: senderIdForAuth,
@@ -1784,6 +1991,58 @@ async function handleFeishuMessage(params) {
1784
1991
  error
1785
1992
  });
1786
1993
  if (gate.action === "block") {
1994
+ const replayKey = buildAuthReplayKey(account.accountId, senderIdForAuth);
1995
+ pendingAuthReplayByKey.set(replayKey, {
1996
+ cfg,
1997
+ event,
1998
+ botOpenId,
1999
+ botName,
2000
+ runtime,
2001
+ chatHistories,
2002
+ accountId: account.accountId
2003
+ });
2004
+ if (!activeAuthPollByKey.has(replayKey)) {
2005
+ const pollPromise = (async () => {
2006
+ const startedAt = Date.now();
2007
+ while (Date.now() - startedAt < REAL_PERSON_AUTH_POLL_TIMEOUT_MS) {
2008
+ await sleep(REAL_PERSON_AUTH_POLL_INTERVAL_MS);
2009
+ try {
2010
+ const status = await checkFeishuRealPersonAuthStatus({
2011
+ accountId: account.accountId,
2012
+ senderId: senderIdForAuth,
2013
+ log,
2014
+ error
2015
+ });
2016
+ log(`feishu[${account.accountId}]: real-person auth poll status for ${senderIdForAuth}: ${status.status}`);
2017
+ if (status.status === "pending") continue;
2018
+ if (status.status === "success") {
2019
+ const pending = pendingAuthReplayByKey.get(replayKey);
2020
+ pendingAuthReplayByKey.delete(replayKey);
2021
+ if (pending) {
2022
+ await sendAuthSuccess();
2023
+ await handleFeishuMessage({
2024
+ ...pending,
2025
+ skipDedupe: true,
2026
+ skipRealPersonAuth: true
2027
+ });
2028
+ }
2029
+ return;
2030
+ }
2031
+ pendingAuthReplayByKey.delete(replayKey);
2032
+ return;
2033
+ } catch (pollErr) {
2034
+ log(`feishu[${account.accountId}]: real-person auth poll retry for ${senderIdForAuth} after error: ${pollErr instanceof Error ? pollErr.message : String(pollErr)}`);
2035
+ error(`feishu[${account.accountId}]: real-person auth polling failed for ${senderIdForAuth}`, pollErr);
2036
+ continue;
2037
+ }
2038
+ }
2039
+ log(`feishu[${account.accountId}]: real-person auth poll timeout for ${senderIdForAuth}; keeping gate pending`);
2040
+ pendingAuthReplayByKey.delete(replayKey);
2041
+ })().finally(() => {
2042
+ activeAuthPollByKey.delete(replayKey);
2043
+ });
2044
+ activeAuthPollByKey.set(replayKey, pollPromise);
2045
+ }
1787
2046
  await sendAuthPrompt(gate.verificationUrl);
1788
2047
  return;
1789
2048
  }
@@ -255,9 +255,9 @@ import "./setup-core-CcGzCpOK.js";
255
255
  import "./shared-x4Yc8-25.js";
256
256
  import "./setup-entry-CcHvI1Mu.js";
257
257
  import "./reactions-CVOq_v6N.js";
258
- import "./feishu-CaswV1Oq.js";
258
+ import "./feishu-p4QIwtc9.js";
259
259
  import "./runtime-api-lhuSYASv.js";
260
- import "./channel-DbrLPVRk.js";
260
+ import "./channel-Dz1n3akq.js";
261
261
  import "./send-C3ijC8Mw.js";
262
262
  import "./runtime-p5-el0rU.js";
263
263
  import "./setup-core-Bw009yg5.js";
@@ -307,7 +307,7 @@ import { n as buildReadOnlySourceChannelAccountSnapshot, t as buildChannelAccoun
307
307
  import { t as collectChannelStatusIssues } from "./channels-status-issues-D1LfcYYR.js";
308
308
  import { t as parseLogLine } from "./parse-log-line-fV0tN7JU.js";
309
309
  import { i as describeBinding, n as applyAgentBindings, t as requireValidConfigSnapshot } from "./config-validation-9iWWSktF.js";
310
- import { a as isCatalogChannelInstalled, r as runCollectedChannelOnboardingPostWriteHooks, t as createChannelOnboardingPostWriteHookCollector } from "./onboard-channels-katsK5NE.js";
310
+ import { a as isCatalogChannelInstalled, r as runCollectedChannelOnboardingPostWriteHooks, t as createChannelOnboardingPostWriteHookCollector } from "./onboard-channels-aMYUZrDN.js";
311
311
  import fs from "node:fs/promises";
312
312
  //#region src/commands/channels/add-mutators.ts
313
313
  function applyAccountName(params) {
@@ -377,7 +377,7 @@ async function channelsAddCommand(opts, runtime = defaultRuntime, params) {
377
377
  if (!cfg) return;
378
378
  let nextConfig = cfg;
379
379
  if (shouldUseWizard(params)) {
380
- const [{ buildAgentSummaries }, { setupChannels }] = await Promise.all([import("./agents.config-Nk87RmV3.js"), import("./onboard-channels-CFM-GqSa.js")]);
380
+ const [{ buildAgentSummaries }, { setupChannels }] = await Promise.all([import("./agents.config-Nk87RmV3.js"), import("./onboard-channels-CYyBfLIY.js")]);
381
381
  const prompter = createClackPrompter();
382
382
  const postWriteHooks = createChannelOnboardingPostWriteHookCollector();
383
383
  let selection = [];
@@ -365,25 +365,25 @@ function registerChannelsCli(program) {
365
365
  ])}\n\n${theme.muted("Docs:")} ${formatDocsLink("/cli/channels", "docs.openclaw.ai/cli/channels")}\n`);
366
366
  channels.command("list").description("List configured channels + auth profiles").option("--no-usage", "Skip model provider usage/quota snapshots").option("--json", "Output JSON", false).action(async (opts) => {
367
367
  await runChannelsCommand(async () => {
368
- const { channelsListCommand } = await import("./channels-CZH2hny_.js");
368
+ const { channelsListCommand } = await import("./channels-Bt0w3hbW.js");
369
369
  await channelsListCommand(opts, defaultRuntime);
370
370
  });
371
371
  });
372
372
  channels.command("status").description("Show gateway channel status (use status --deep for local)").option("--probe", "Probe channel credentials", false).option("--timeout <ms>", "Timeout in ms", "10000").option("--json", "Output JSON", false).action(async (opts) => {
373
373
  await runChannelsCommand(async () => {
374
- const { channelsStatusCommand } = await import("./channels-CZH2hny_.js");
374
+ const { channelsStatusCommand } = await import("./channels-Bt0w3hbW.js");
375
375
  await channelsStatusCommand(opts, defaultRuntime);
376
376
  });
377
377
  });
378
378
  channels.command("capabilities").description("Show provider capabilities (intents/scopes + supported features)").option("--channel <name>", `Channel (${formatCliChannelOptions(["all"])})`).option("--account <id>", "Account id (only with --channel)").option("--target <dest>", "Channel target for permission audit (Discord channel:<id>)").option("--timeout <ms>", "Timeout in ms", "10000").option("--json", "Output JSON", false).action(async (opts) => {
379
379
  await runChannelsCommand(async () => {
380
- const { channelsCapabilitiesCommand } = await import("./channels-CZH2hny_.js");
380
+ const { channelsCapabilitiesCommand } = await import("./channels-Bt0w3hbW.js");
381
381
  await channelsCapabilitiesCommand(opts, defaultRuntime);
382
382
  });
383
383
  });
384
384
  channels.command("resolve").description("Resolve channel/user names to IDs").argument("<entries...>", "Entries to resolve (names or ids)").option("--channel <name>", `Channel (${channelNames})`).option("--account <id>", "Account id (accountId)").option("--kind <kind>", "Target kind (auto|user|group)", "auto").option("--json", "Output JSON", false).action(async (entries, opts) => {
385
385
  await runChannelsCommand(async () => {
386
- const { channelsResolveCommand } = await import("./channels-CZH2hny_.js");
386
+ const { channelsResolveCommand } = await import("./channels-Bt0w3hbW.js");
387
387
  await channelsResolveCommand({
388
388
  channel: opts.channel,
389
389
  account: opts.account,
@@ -395,19 +395,19 @@ function registerChannelsCli(program) {
395
395
  });
396
396
  channels.command("logs").description("Show recent channel logs from the gateway log file").option("--channel <name>", `Channel (${formatCliChannelOptions(["all"])})`, "all").option("--lines <n>", "Number of lines (default: 200)", "200").option("--json", "Output JSON", false).action(async (opts) => {
397
397
  await runChannelsCommand(async () => {
398
- const { channelsLogsCommand } = await import("./channels-CZH2hny_.js");
398
+ const { channelsLogsCommand } = await import("./channels-Bt0w3hbW.js");
399
399
  await channelsLogsCommand(opts, defaultRuntime);
400
400
  });
401
401
  });
402
402
  channels.command("add").description("Add or update a channel account").option("--channel <name>", `Channel (${channelNames})`).option("--account <id>", "Account id (default when omitted)").option("--name <name>", "Display name for this account").option("--token <token>", "Bot token (Telegram/Discord)").option("--private-key <key>", "Nostr private key (nsec... or hex)").option("--token-file <path>", "Bot token file (Telegram)").option("--bot-token <token>", "Slack bot token (xoxb-...)").option("--app-token <token>", "Slack app token (xapp-...)").option("--signal-number <e164>", "Signal account number (E.164)").option("--cli-path <path>", "CLI path (signal-cli or imsg)").option("--db-path <path>", "iMessage database path").option("--service <service>", "iMessage service (imessage|sms|auto)").option("--region <region>", "iMessage region (for SMS)").option("--auth-dir <path>", "WhatsApp auth directory override").option("--http-url <url>", "Signal HTTP daemon base URL").option("--http-host <host>", "Signal HTTP host").option("--http-port <port>", "Signal HTTP port").option("--webhook-path <path>", "Webhook path (Google Chat/BlueBubbles)").option("--webhook-url <url>", "Google Chat webhook URL").option("--audience-type <type>", "Google Chat audience type (app-url|project-number)").option("--audience <value>", "Google Chat audience value (app URL or project number)").option("--homeserver <url>", "Matrix homeserver URL").option("--user-id <id>", "Matrix user ID").option("--access-token <token>", "Matrix access token").option("--password <password>", "Matrix password").option("--device-name <name>", "Matrix device name").option("--initial-sync-limit <n>", "Matrix initial sync limit").option("--ship <ship>", "Tlon ship name (~sampel-palnet)").option("--url <url>", "Tlon ship URL").option("--relay-urls <list>", "Nostr relay URLs (comma-separated)").option("--code <code>", "Tlon login code").option("--group-channels <list>", "Tlon group channels (comma-separated)").option("--dm-allowlist <list>", "Tlon DM allowlist (comma-separated ships)").option("--auto-discover-channels", "Tlon auto-discover group channels").option("--no-auto-discover-channels", "Disable Tlon auto-discovery").option("--use-env", "Use env token (default account only)", false).action(async (opts, command) => {
403
403
  await runChannelsCommand(async () => {
404
- const { channelsAddCommand } = await import("./channels-CZH2hny_.js");
404
+ const { channelsAddCommand } = await import("./channels-Bt0w3hbW.js");
405
405
  await channelsAddCommand(opts, defaultRuntime, { hasFlags: hasExplicitOptions(command, optionNamesAdd) });
406
406
  });
407
407
  });
408
408
  channels.command("remove").description("Disable or delete a channel account").option("--channel <name>", `Channel (${channelNames})`).option("--account <id>", "Account id (default when omitted)").option("--delete", "Delete config entries (no prompt)", false).action(async (opts, command) => {
409
409
  await runChannelsCommand(async () => {
410
- const { channelsRemoveCommand } = await import("./channels-CZH2hny_.js");
410
+ const { channelsRemoveCommand } = await import("./channels-Bt0w3hbW.js");
411
411
  await channelsRemoveCommand(opts, defaultRuntime, { hasFlags: hasExplicitOptions(command, optionNamesRemove) });
412
412
  });
413
413
  });
@@ -7,7 +7,7 @@ import "./subsystem-DISldKSB.js";
7
7
  import "./ansi-BEJF8NKS.js";
8
8
  import "./boolean-C3GkJetE.js";
9
9
  import "./env-Dnra1IpT.js";
10
- import "./register.subclis-B6HYIWdr.js";
10
+ import "./register.subclis-Dd2E6UgL.js";
11
11
  import "./core-command-descriptors-CCqK_2TG.js";
12
- import { n as registerCoreCliByName } from "./command-registry-DuepL5IT.js";
12
+ import { n as registerCoreCliByName } from "./command-registry-maV_byWv.js";
13
13
  export { registerCoreCliByName };
@@ -1,5 +1,5 @@
1
1
  import { E as getPrimaryCommand, k as hasHelpOrVersion } from "./logger-kwZIqwuw.js";
2
- import { a as removeCommandByName, i as registerSubCliCommands, o as reparseProgramFromActionArgs } from "./register.subclis-B6HYIWdr.js";
2
+ import { a as removeCommandByName, i as registerSubCliCommands, o as reparseProgramFromActionArgs } from "./register.subclis-Dd2E6UgL.js";
3
3
  import { t as getCoreCliCommandDescriptors } from "./core-command-descriptors-CCqK_2TG.js";
4
4
  //#region src/cli/program/command-registry.ts
5
5
  const shouldRegisterCorePrimaryOnly = (argv) => {
@@ -14,7 +14,7 @@ const coreEntries = [
14
14
  hasSubcommands: false
15
15
  }],
16
16
  register: async ({ program }) => {
17
- (await import("./register.setup-CkZS2aXC.js")).registerSetupCommand(program);
17
+ (await import("./register.setup-BfTBJ7il.js")).registerSetupCommand(program);
18
18
  }
19
19
  },
20
20
  {
@@ -24,7 +24,7 @@ const coreEntries = [
24
24
  hasSubcommands: false
25
25
  }],
26
26
  register: async ({ program }) => {
27
- (await import("./register.onboard-u9mcSt7t.js")).registerOnboardCommand(program);
27
+ (await import("./register.onboard-D3kGpBcj.js")).registerOnboardCommand(program);
28
28
  }
29
29
  },
30
30
  {
@@ -34,7 +34,7 @@ const coreEntries = [
34
34
  hasSubcommands: false
35
35
  }],
36
36
  register: async ({ program }) => {
37
- (await import("./register.configure-Mll-Mq42.js")).registerConfigureCommand(program);
37
+ (await import("./register.configure-DYLRiwv_.js")).registerConfigureCommand(program);
38
38
  }
39
39
  },
40
40
  {
@@ -44,7 +44,7 @@ const coreEntries = [
44
44
  hasSubcommands: true
45
45
  }],
46
46
  register: async ({ program }) => {
47
- (await import("./config-cli-BUJXj3eo.js")).registerConfigCli(program);
47
+ (await import("./config-cli-CkDay3qv.js")).registerConfigCli(program);
48
48
  }
49
49
  },
50
50
  {
@@ -81,7 +81,7 @@ const coreEntries = [
81
81
  }
82
82
  ],
83
83
  register: async ({ program }) => {
84
- (await import("./register.maintenance-Rj539JWw.js")).registerMaintenanceCommands(program);
84
+ (await import("./register.maintenance-C_px1a87.js")).registerMaintenanceCommands(program);
85
85
  }
86
86
  },
87
87
  {
@@ -125,7 +125,7 @@ const coreEntries = [
125
125
  hasSubcommands: true
126
126
  }],
127
127
  register: async ({ program, ctx }) => {
128
- (await import("./register.agent-WOPQnmT4.js")).registerAgentCommands(program, { agentChannelOptions: ctx.agentChannelOptions });
128
+ (await import("./register.agent-D2oBiVp5.js")).registerAgentCommands(program, { agentChannelOptions: ctx.agentChannelOptions });
129
129
  }
130
130
  },
131
131
  {
@@ -3,8 +3,8 @@ import { r as theme } from "./theme-CdOoMzRk.js";
3
3
  import { c as routeLogsToStderr } from "./subsystem-DISldKSB.js";
4
4
  import { h as pathExists } from "./utils-CS0Ikux6.js";
5
5
  import { t as formatDocsLink } from "./links-8xRhWBQL.js";
6
- import { r as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-B6HYIWdr.js";
7
- import { n as registerCoreCliByName, t as getCoreCliCommandNames } from "./command-registry-DuepL5IT.js";
6
+ import { r as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-Dd2E6UgL.js";
7
+ import { n as registerCoreCliByName, t as getCoreCliCommandNames } from "./command-registry-maV_byWv.js";
8
8
  import { t as getProgramContext } from "./program-context-SgNgozNB.js";
9
9
  import path from "node:path";
10
10
  import os from "node:os";
@@ -9,8 +9,8 @@ import "./boolean-C3GkJetE.js";
9
9
  import "./env-Dnra1IpT.js";
10
10
  import "./utils-CS0Ikux6.js";
11
11
  import "./links-8xRhWBQL.js";
12
- import { a as registerCompletionCli } from "./completion-cli-DEwxxtpl.js";
13
- import "./register.subclis-B6HYIWdr.js";
14
- import "./command-registry-DuepL5IT.js";
12
+ import { a as registerCompletionCli } from "./completion-cli-B7KByNii.js";
13
+ import "./register.subclis-Dd2E6UgL.js";
14
+ import "./command-registry-maV_byWv.js";
15
15
  import "./program-context-SgNgozNB.js";
16
16
  export { registerCompletionCli };
@@ -917,7 +917,7 @@ async function runConfigValidate(opts = {}) {
917
917
  }
918
918
  function registerConfigCli(program) {
919
919
  const cmd = program.command("config").description("Non-interactive config helpers (get/set/unset/file/validate). Run without subcommand for guided setup.").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/config", "docs.openclaw.ai/cli/config")}\n`).option("--section <section>", "Configuration sections for guided setup (repeatable). Use with no subcommand.", (value, previous) => [...previous, value], []).action(async (opts) => {
920
- const { configureCommandFromSectionsArg } = await import("./configure-9-PQJTTK.js");
920
+ const { configureCommandFromSectionsArg } = await import("./configure-Bhpnr3RQ.js");
921
921
  await configureCommandFromSectionsArg(opts.section, defaultRuntime);
922
922
  });
923
923
  cmd.command("get").description("Get a config value by dot path").argument("<path>", "Config path (dot or bracket notation)").option("--json", "Output JSON", false).action(async (path, opts) => {
@@ -259,9 +259,9 @@ import "./setup-core-CcGzCpOK.js";
259
259
  import "./shared-x4Yc8-25.js";
260
260
  import "./setup-entry-CcHvI1Mu.js";
261
261
  import "./reactions-CVOq_v6N.js";
262
- import "./feishu-CaswV1Oq.js";
262
+ import "./feishu-p4QIwtc9.js";
263
263
  import "./runtime-api-lhuSYASv.js";
264
- import "./channel-DbrLPVRk.js";
264
+ import "./channel-Dz1n3akq.js";
265
265
  import "./send-C3ijC8Mw.js";
266
266
  import "./runtime-p5-el0rU.js";
267
267
  import "./setup-core-Bw009yg5.js";
@@ -324,8 +324,8 @@ import "./provider-auth-choice-B6Vf-54o.js";
324
324
  import "./auth-choice.apply-helpers-DnZSQbUl.js";
325
325
  import "./provider-auth-choice-preference-MiQguMwm.js";
326
326
  import "./auth-choice-DdOY5kEs.js";
327
- import "./onboard-channels-katsK5NE.js";
328
- import { n as configureCommandFromSectionsArg } from "./configure-CiRiSByg.js";
327
+ import "./onboard-channels-aMYUZrDN.js";
328
+ import { n as configureCommandFromSectionsArg } from "./configure-DEgPFToe.js";
329
329
  import "./systemd-linger-BasN9UtI.js";
330
330
  import "./model-picker-ewbext_V.js";
331
331
  import "./onboard-custom-ojsh_yzx.js";
@@ -29,7 +29,7 @@ import { n as resolveProviderPluginChoice } from "./provider-wizard-D8q7vx9b.js"
29
29
  import { t as promptAuthChoiceGrouped } from "./auth-choice-prompt-Bkr-WsTr.js";
30
30
  import { t as resolvePreferredProviderForAuthChoice } from "./provider-auth-choice-preference-MiQguMwm.js";
31
31
  import { n as applyAuthChoice } from "./auth-choice-DdOY5kEs.js";
32
- import { i as setupChannels, n as noteChannelStatus } from "./onboard-channels-katsK5NE.js";
32
+ import { i as setupChannels, n as noteChannelStatus } from "./onboard-channels-aMYUZrDN.js";
33
33
  import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-BasN9UtI.js";
34
34
  import { i as promptModelAllowlist, n as applyModelFallbacksFromSelection, r as promptDefaultModel, t as applyModelAllowlist } from "./model-picker-ewbext_V.js";
35
35
  import { i as promptCustomApiConfig } from "./onboard-custom-ojsh_yzx.js";
@@ -1,7 +1,7 @@
1
1
  import { t as resolveOpenClawPackageRoot } from "./openclaw-root-ax52pETb.js";
2
2
  import { n as resolveCliName } from "./cli-name-CgLQPAaK.js";
3
3
  import { t as note } from "./note-CrfOOz26.js";
4
- import { c as usesSlowDynamicCompletion, i as isCompletionInstalled, o as resolveCompletionCachePath, r as installCompletion, s as resolveShellFromEnv, t as completionCacheExists } from "./completion-cli-DEwxxtpl.js";
4
+ import { c as usesSlowDynamicCompletion, i as isCompletionInstalled, o as resolveCompletionCachePath, r as installCompletion, s as resolveShellFromEnv, t as completionCacheExists } from "./completion-cli-B7KByNii.js";
5
5
  import path from "node:path";
6
6
  import { spawnSync } from "node:child_process";
7
7
  //#region src/commands/doctor-completion.ts
package/dist/entry.js CHANGED
@@ -200,7 +200,7 @@ function tryHandleRootHelpFastPath(argv, deps = {}) {
200
200
  }
201
201
  function runMainOrRootHelp(argv) {
202
202
  if (tryHandleRootHelpFastPath(argv)) return;
203
- import("./run-main-DvmjKiL6.js").then(({ runCli }) => runCli(argv)).catch((error) => {
203
+ import("./run-main-CypZFyVz.js").then(({ runCli }) => runCli(argv)).catch((error) => {
204
204
  console.error("[openclaw] Failed to start CLI:", error instanceof Error ? error.stack ?? error.message : error);
205
205
  process$1.exitCode = 1;
206
206
  });
@@ -211,8 +211,8 @@ import "../../setup-api-islC9-vs.js";
211
211
  import "../../api-4UdyHpJg.js";
212
212
  import "../../feishu-B0Fh98aM.js";
213
213
  import { i as removeReactionFeishu, n as addReactionFeishu, r as listReactionsFeishu, t as FeishuEmoji } from "../../reactions-CVOq_v6N.js";
214
- import { t as feishu_default } from "../../feishu-CaswV1Oq.js";
214
+ import { t as feishu_default } from "../../feishu-p4QIwtc9.js";
215
215
  import "../../runtime-api-lhuSYASv.js";
216
- import { n as monitorFeishuProvider, t as feishuPlugin } from "../../channel-DbrLPVRk.js";
216
+ import { n as monitorFeishuProvider, t as feishuPlugin } from "../../channel-Dz1n3akq.js";
217
217
  import { C as sendMediaFeishu, D as setFeishuRuntime, S as sendImageFeishu, T as uploadImageFeishu, _ as formatMentionForText, a as sendCardFeishu, d as buildMentionedMessage, f as extractMentionTargets, g as formatMentionForCard, h as formatMentionAllForText, l as updateCardFeishu, m as formatMentionAllForCard, n as getMessageFeishu, p as extractMessageBody, s as sendMessageFeishu, t as editMessageFeishu, u as buildMentionedCardContent, v as isMentionForwardRequest, w as uploadFileFeishu, x as sendFileFeishu } from "../../send-C3ijC8Mw.js";
218
218
  export { FeishuEmoji, addReactionFeishu, buildMentionedCardContent, buildMentionedMessage, feishu_default as default, editMessageFeishu, extractMentionTargets, extractMessageBody, feishuPlugin, formatMentionAllForCard, formatMentionAllForText, formatMentionForCard, formatMentionForText, getMessageFeishu, isMentionForwardRequest, listReactionsFeishu, monitorFeishuProvider, probeFeishu, removeReactionFeishu, sendCardFeishu, sendFileFeishu, sendImageFeishu, sendMediaFeishu, sendMessageFeishu, setFeishuRuntime, updateCardFeishu, uploadFileFeishu, uploadImageFeishu };
@@ -211,7 +211,7 @@ import "../../setup-api-islC9-vs.js";
211
211
  import "../../api-4UdyHpJg.js";
212
212
  import "../../feishu-B0Fh98aM.js";
213
213
  import "../../runtime-api-lhuSYASv.js";
214
- import { t as feishuPlugin } from "../../channel-DbrLPVRk.js";
214
+ import { t as feishuPlugin } from "../../channel-Dz1n3akq.js";
215
215
  import "../../send-C3ijC8Mw.js";
216
216
  //#region extensions/feishu/setup-entry.ts
217
217
  var setup_entry_default = defineSetupPluginEntry(feishuPlugin);
@@ -2,7 +2,7 @@ import { Wb as defineChannelPluginEntry } from "./pi-embedded-CbisRyrM.js";
2
2
  import { c as listEnabledFeishuAccounts, d as resolveFeishuAccount, i as createFeishuClient } from "./setup-surface-DNWv-m0c.js";
3
3
  import { a as parseFeishuConversationId, i as buildFeishuConversationId, r as getFeishuThreadBindingManager } from "./api-4UdyHpJg.js";
4
4
  import { c as registerFeishuChatTools, l as resolveToolsConfig } from "./reactions-CVOq_v6N.js";
5
- import { t as feishuPlugin } from "./channel-DbrLPVRk.js";
5
+ import { t as feishuPlugin } from "./channel-Dz1n3akq.js";
6
6
  import { D as setFeishuRuntime, E as getFeishuRuntime, P as normalizeFeishuTarget } from "./send-C3ijC8Mw.js";
7
7
  import { existsSync, promises } from "node:fs";
8
8
  import { basename, isAbsolute } from "node:path";
@@ -317,7 +317,7 @@ import { _ as computePreviousRunAtMs, g as computeNextRunAtMs, h as coerceFinite
317
317
  import { a as resolveNpmChannelTag, n as compareSemverStrings, p as normalizeUpdateChannel, t as checkUpdateStatus } from "./update-check-7-eHz7QM.js";
318
318
  import { i as resolveGatewayStartupPluginIds, r as resolveConfiguredDeferredChannelPluginIds } from "./channel-plugin-ids-BAljJj2h.js";
319
319
  import "./setup.secret-input-zTHnk276.js";
320
- import { t as runSetupWizard } from "./setup-BDaeBY6O.js";
320
+ import { t as runSetupWizard } from "./setup-CLruc3vw.js";
321
321
  import { a as resolveApnsAuthConfigFromEnv, c as shouldClearStoredApnsRegistration, d as parseMessageWithAttachments, f as formatForLog, g as setGatewayWsLogStyle, h as summarizeAgentEventForWsLog, l as resolveApnsRelayConfigFromEnv, m as shouldLogWs, n as loadApnsRegistration, o as sendApnsAlert, p as logWs, r as normalizeApnsEnvironment, s as sendApnsBackgroundWake, t as clearApnsRegistrationIfCurrent, u as normalizeRpcAttachmentsToChatAttachments } from "./push-apns-BQDWAAg5.js";
322
322
  import { _ as buildGogWatchStartArgs, g as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, w as resolveGmailHookRuntimeConfig } from "./gmail-setup-utils-BsgKN1Rw.js";
323
323
  import { i as loadAgentIdentity, o as pruneAgentConfig, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-siTlMqn8.js";
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ let saveSessionStore;
29
29
  let toWhatsappJid;
30
30
  let waitForever;
31
31
  async function loadLegacyCliDeps() {
32
- const [{ installGaxiosFetchCompat }, { runCli }] = await Promise.all([import("./gaxios-fetch-compat-Kvjn-opL.js"), import("./run-main-DvmjKiL6.js")]);
32
+ const [{ installGaxiosFetchCompat }, { runCli }] = await Promise.all([import("./gaxios-fetch-compat-Kvjn-opL.js"), import("./run-main-CypZFyVz.js")]);
33
33
  return {
34
34
  installGaxiosFetchCompat,
35
35
  runCli
@@ -11,7 +11,7 @@ import { a as ensureWorkspaceAndSessions, b as waitForGatewayReachable, c as han
11
11
  import { n as logConfigUpdated } from "./logging-7-QuqqfS.js";
12
12
  import { t as WizardCancelledError } from "./prompts-BEHcWT6j.js";
13
13
  import { t as createClackPrompter } from "./clack-prompter-c8uEEGtv.js";
14
- import { t as runSetupWizard } from "./setup-BDaeBY6O.js";
14
+ import { t as runSetupWizard } from "./setup-CLruc3vw.js";
15
15
  import { i as resolveManifestProviderOnboardAuthFlags } from "./provider-auth-choices-D3uPSLCc.js";
16
16
  import { n as isDeprecatedAuthChoice, r as normalizeLegacyOnboardAuthChoice } from "./auth-choice-legacy-BPFWRR4r.js";
17
17
  import { r as applyLocalSetupWorkspaceConfig } from "./onboard-config-CxoUyTRN.js";
@@ -248,9 +248,9 @@ import "./setup-core-CcGzCpOK.js";
248
248
  import "./shared-x4Yc8-25.js";
249
249
  import "./setup-entry-CcHvI1Mu.js";
250
250
  import "./reactions-CVOq_v6N.js";
251
- import "./feishu-CaswV1Oq.js";
251
+ import "./feishu-p4QIwtc9.js";
252
252
  import "./runtime-api-lhuSYASv.js";
253
- import "./channel-DbrLPVRk.js";
253
+ import "./channel-Dz1n3akq.js";
254
254
  import "./send-C3ijC8Mw.js";
255
255
  import "./runtime-p5-el0rU.js";
256
256
  import "./setup-core-Bw009yg5.js";
@@ -292,5 +292,5 @@ import "./catalog-D1IL8FHf.js";
292
292
  import "./plugin-install-plan-CRu1xZih.js";
293
293
  import "./bundled-sources-C0-2GZmN.js";
294
294
  import "./plugin-install-DJYiPPuS.js";
295
- import { i as setupChannels, n as noteChannelStatus, r as runCollectedChannelOnboardingPostWriteHooks, t as createChannelOnboardingPostWriteHookCollector } from "./onboard-channels-katsK5NE.js";
295
+ import { i as setupChannels, n as noteChannelStatus, r as runCollectedChannelOnboardingPostWriteHooks, t as createChannelOnboardingPostWriteHookCollector } from "./onboard-channels-aMYUZrDN.js";
296
296
  export { createChannelOnboardingPostWriteHookCollector, noteChannelStatus, runCollectedChannelOnboardingPostWriteHooks, setupChannels };
@@ -13,7 +13,7 @@ import { t as promptChannelAccessConfig } from "./setup-group-access-H4Pp_4Aj.js
13
13
  import { t as bluebubblesPlugin } from "./channel-blbw1Rcq.js";
14
14
  import { n as discordPlugin } from "./discord-D66aw8Yl.js";
15
15
  import { n as discordSetupPlugin } from "./setup-entry-CcHvI1Mu.js";
16
- import { t as feishuPlugin } from "./channel-DbrLPVRk.js";
16
+ import { t as feishuPlugin } from "./channel-Dz1n3akq.js";
17
17
  import { n as imessagePlugin } from "./imessage-B87cXMZF.js";
18
18
  import { n as imessageSetupPlugin } from "./setup-entry-C-3pj2nB.js";
19
19
  import { t as ircPlugin } from "./channel-DyLSZ-yv2.js";
@@ -67,4 +67,6 @@ export declare function handleFeishuMessage(params: {
67
67
  chatHistories?: Map<string, HistoryEntry[]>;
68
68
  accountId?: string;
69
69
  processingClaimHeld?: boolean;
70
+ skipDedupe?: boolean;
71
+ skipRealPersonAuth?: boolean;
70
72
  }): Promise<void>;
@@ -6,6 +6,7 @@ export type FeishuRealPersonAuthGateResult = {
6
6
  } | {
7
7
  action: "block";
8
8
  verificationUrl: string;
9
+ certToken: string;
9
10
  };
10
11
  export type FeishuRealPersonAuthGateParams = {
11
12
  accountId: string;
@@ -13,4 +14,17 @@ export type FeishuRealPersonAuthGateParams = {
13
14
  log: (message: string) => void;
14
15
  error: (message: string, err?: unknown) => void;
15
16
  };
17
+ export type FeishuRealPersonAuthStatusParams = FeishuRealPersonAuthGateParams;
18
+ export type FeishuRealPersonAuthStatusResult = {
19
+ status: "success";
20
+ } | {
21
+ status: "pending";
22
+ verificationUrl: string;
23
+ certToken: string;
24
+ } | {
25
+ status: "failed";
26
+ } | {
27
+ status: "missing";
28
+ };
29
+ export declare function checkFeishuRealPersonAuthStatus(params: FeishuRealPersonAuthStatusParams): Promise<FeishuRealPersonAuthStatusResult>;
16
30
  export declare function resolveFeishuRealPersonAuthGate(params: FeishuRealPersonAuthGateParams): Promise<FeishuRealPersonAuthGateResult>;
@@ -14,8 +14,8 @@ import "./registry-C5UkPpaO.js";
14
14
  import { n as resolveCliName } from "./cli-name-CgLQPAaK.js";
15
15
  import "./ports-lsof-BLEgL_Gn.js";
16
16
  import { n as resolveCliChannelOptions } from "./channel-options-04p5Gy2y.js";
17
- import "./register.subclis-B6HYIWdr.js";
18
- import { i as registerProgramCommands } from "./command-registry-DuepL5IT.js";
17
+ import "./register.subclis-Dd2E6UgL.js";
18
+ import { i as registerProgramCommands } from "./command-registry-maV_byWv.js";
19
19
  import { n as setProgramContext } from "./program-context-SgNgozNB.js";
20
20
  import { t as isCommandJsonOutputMode } from "./json-mode-i0z3_kJ3.js";
21
21
  import "./ports-xb_TQvEY.js";
@@ -80,7 +80,7 @@ import { t as collectChannelStatusIssues } from "./channels-status-issues-D1LfcY
80
80
  import { n as resolveProviderAuthLoginCommand, t as buildProviderAuthRecoveryHint } from "./provider-auth-guidance-DXgeysMX.js";
81
81
  import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-BasN9UtI.js";
82
82
  import { t as formatHealthCheckFailure } from "./health-format-Cq-7EnWP.js";
83
- import { n as doctorShellCompletion } from "./doctor-completion-BKC_yRJu.js";
83
+ import { n as doctorShellCompletion } from "./doctor-completion-Bhbtito8.js";
84
84
  import { a as stripUnknownConfigKeys, i as resolveConfigPathTarget, n as formatConfigPath, r as noteOpencodeProviderOverrides, t as runDoctorConfigPreflight } from "./doctor-config-preflight-DRiu7A6q.js";
85
85
  import { a as isMattermostMutableAllowEntry, i as isMSTeamsMutableAllowEntry, n as isGoogleChatMutableAllowEntry, o as isSlackMutableAllowEntry, r as isIrcMutableAllowEntry, s as isZalouserMutableGroupEntry, t as isDiscordMutableAllowEntry } from "./mutable-allowlist-detectors-CWXjyMok.js";
86
86
  import { t as resolveDefaultChannelAccountContext } from "./channel-account-context-CzAEVT7u.js";
@@ -257,9 +257,9 @@ import "./setup-core-CcGzCpOK.js";
257
257
  import "./shared-x4Yc8-25.js";
258
258
  import "./setup-entry-CcHvI1Mu.js";
259
259
  import "./reactions-CVOq_v6N.js";
260
- import "./feishu-CaswV1Oq.js";
260
+ import "./feishu-p4QIwtc9.js";
261
261
  import "./runtime-api-lhuSYASv.js";
262
- import "./channel-DbrLPVRk.js";
262
+ import "./channel-Dz1n3akq.js";
263
263
  import "./send-C3ijC8Mw.js";
264
264
  import "./runtime-p5-el0rU.js";
265
265
  import "./setup-core-Bw009yg5.js";
@@ -311,7 +311,7 @@ import "./agents.config-siTlMqn8.js";
311
311
  import "./provider-auth-choice-helpers-fXJv3eWi.js";
312
312
  import "./provider-auth-guidance-DXgeysMX.js";
313
313
  import "./config-validation-9iWWSktF.js";
314
- import { a as agentsBindCommand, i as agentsAddCommand, n as agentsSetIdentityCommand, o as agentsBindingsCommand, r as agentsDeleteCommand, s as agentsUnbindCommand, t as agentsListCommand } from "./agents-jRHu-yVW.js";
314
+ import { a as agentsBindCommand, i as agentsAddCommand, n as agentsSetIdentityCommand, o as agentsBindingsCommand, r as agentsDeleteCommand, s as agentsUnbindCommand, t as agentsListCommand } from "./agents-BdtFdlIN.js";
315
315
  import "./provider-auth-choices-D3uPSLCc.js";
316
316
  import "./provider-wizard-D8q7vx9b.js";
317
317
  import "./auth-choice-options-DGRXgwnh.js";
@@ -320,7 +320,7 @@ import "./provider-auth-choice-B6Vf-54o.js";
320
320
  import "./auth-choice.apply-helpers-DnZSQbUl.js";
321
321
  import "./provider-auth-choice-preference-MiQguMwm.js";
322
322
  import "./auth-choice-DdOY5kEs.js";
323
- import "./onboard-channels-katsK5NE.js";
323
+ import "./onboard-channels-aMYUZrDN.js";
324
324
  //#region src/commands/agent-via-gateway.ts
325
325
  const NO_GATEWAY_TIMEOUT_MS = 2147e6;
326
326
  function parseTimeoutSeconds(opts) {
@@ -259,9 +259,9 @@ import "./setup-core-CcGzCpOK.js";
259
259
  import "./shared-x4Yc8-25.js";
260
260
  import "./setup-entry-CcHvI1Mu.js";
261
261
  import "./reactions-CVOq_v6N.js";
262
- import "./feishu-CaswV1Oq.js";
262
+ import "./feishu-p4QIwtc9.js";
263
263
  import "./runtime-api-lhuSYASv.js";
264
- import "./channel-DbrLPVRk.js";
264
+ import "./channel-Dz1n3akq.js";
265
265
  import "./send-C3ijC8Mw.js";
266
266
  import "./runtime-p5-el0rU.js";
267
267
  import "./setup-core-Bw009yg5.js";
@@ -325,8 +325,8 @@ import "./provider-auth-choice-B6Vf-54o.js";
325
325
  import "./auth-choice.apply-helpers-DnZSQbUl.js";
326
326
  import "./provider-auth-choice-preference-MiQguMwm.js";
327
327
  import "./auth-choice-DdOY5kEs.js";
328
- import "./onboard-channels-katsK5NE.js";
329
- import { n as configureCommandFromSectionsArg, o as CONFIGURE_WIZARD_SECTIONS } from "./configure-CiRiSByg.js";
328
+ import "./onboard-channels-aMYUZrDN.js";
329
+ import { n as configureCommandFromSectionsArg, o as CONFIGURE_WIZARD_SECTIONS } from "./configure-DEgPFToe.js";
330
330
  import "./systemd-linger-BasN9UtI.js";
331
331
  import "./model-picker-ewbext_V.js";
332
332
  import "./onboard-custom-ojsh_yzx.js";
@@ -232,9 +232,9 @@ import "./status-DpkO40zw.js";
232
232
  import "./auth-health-C-jfjkhn.js";
233
233
  import { n as runCommandWithRuntime } from "./cli-utils-BbclpBci.js";
234
234
  import "./note-CrfOOz26.js";
235
- import "./completion-cli-DEwxxtpl.js";
236
- import "./register.subclis-B6HYIWdr.js";
237
- import "./command-registry-DuepL5IT.js";
235
+ import "./completion-cli-B7KByNii.js";
236
+ import "./register.subclis-Dd2E6UgL.js";
237
+ import "./command-registry-maV_byWv.js";
238
238
  import "./program-context-SgNgozNB.js";
239
239
  import "./heartbeat-summary-1I5G8fLI.js";
240
240
  import "./health-dwK_gUNI.js";
@@ -245,8 +245,8 @@ import "./channels-status-issues-D1LfcYYR.js";
245
245
  import "./provider-auth-guidance-DXgeysMX.js";
246
246
  import "./systemd-linger-BasN9UtI.js";
247
247
  import "./health-format-Cq-7EnWP.js";
248
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-BoBpzerB.js";
249
- import "./doctor-completion-BKC_yRJu.js";
248
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-ClRa2a-J.js";
249
+ import "./doctor-completion-Bhbtito8.js";
250
250
  import "./doctor-config-preflight-DRiu7A6q.js";
251
251
  import "./channel-account-context-CzAEVT7u.js";
252
252
  import "./doctor-state-migrations-PI6hf8TK.js";
@@ -212,11 +212,11 @@ import { n as runCommandWithRuntime } from "./cli-utils-BbclpBci.js";
212
212
  import "./note-CrfOOz26.js";
213
213
  import "./clack-prompter-c8uEEGtv.js";
214
214
  import "./setup.secret-input-zTHnk276.js";
215
- import "./setup-BDaeBY6O.js";
215
+ import "./setup-CLruc3vw.js";
216
216
  import { i as resolveManifestProviderOnboardAuthFlags } from "./provider-auth-choices-D3uPSLCc.js";
217
217
  import "./provider-wizard-D8q7vx9b.js";
218
218
  import { n as formatAuthChoiceChoicesForCli } from "./auth-choice-options-DGRXgwnh.js";
219
- import { n as CORE_ONBOARD_AUTH_FLAGS, t as setupWizardCommand } from "./onboard-CVHxysXI.js";
219
+ import { n as CORE_ONBOARD_AUTH_FLAGS, t as setupWizardCommand } from "./onboard-bnQMb8SY.js";
220
220
  //#region src/cli/program/register.onboard.ts
221
221
  function resolveInstallDaemonFlag(command, opts) {
222
222
  if (!command || typeof command !== "object") return;
@@ -213,9 +213,9 @@ import { n as runCommandWithRuntime } from "./cli-utils-BbclpBci.js";
213
213
  import "./note-CrfOOz26.js";
214
214
  import "./clack-prompter-c8uEEGtv.js";
215
215
  import "./setup.secret-input-zTHnk276.js";
216
- import "./setup-BDaeBY6O.js";
216
+ import "./setup-CLruc3vw.js";
217
217
  import "./provider-auth-choices-D3uPSLCc.js";
218
- import { t as setupWizardCommand } from "./onboard-CVHxysXI.js";
218
+ import { t as setupWizardCommand } from "./onboard-bnQMb8SY.js";
219
219
  import JSON5 from "json5";
220
220
  import fs from "node:fs/promises";
221
221
  //#region src/commands/setup.ts
@@ -58,7 +58,7 @@ const entries = [
58
58
  description: "Run, inspect, and query the WebSocket Gateway",
59
59
  hasSubcommands: true,
60
60
  register: async (program) => {
61
- (await import("./gateway-cli-Du6MIaFO.js")).registerGatewayCli(program);
61
+ (await import("./gateway-cli-jjoIZrdZ.js")).registerGatewayCli(program);
62
62
  }
63
63
  },
64
64
  {
@@ -224,7 +224,7 @@ const entries = [
224
224
  description: "Manage connected chat channels (Telegram, Discord, etc.)",
225
225
  hasSubcommands: true,
226
226
  register: async (program) => {
227
- (await import("./channels-cli-DBYTAjRU.js")).registerChannelsCli(program);
227
+ (await import("./channels-cli-DgqDIEVC.js")).registerChannelsCli(program);
228
228
  }
229
229
  },
230
230
  {
@@ -264,7 +264,7 @@ const entries = [
264
264
  description: "Update OpenClaw and inspect update channel status",
265
265
  hasSubcommands: true,
266
266
  register: async (program) => {
267
- (await import("./update-cli-BgZUMbWl.js")).registerUpdateCli(program);
267
+ (await import("./update-cli-8mkYBPsE.js")).registerUpdateCli(program);
268
268
  }
269
269
  },
270
270
  {
@@ -272,7 +272,7 @@ const entries = [
272
272
  description: "Generate shell completion script",
273
273
  hasSubcommands: false,
274
274
  register: async (program) => {
275
- (await import("./completion-cli-BHl_-TbA.js")).registerCompletionCli(program);
275
+ (await import("./completion-cli-BgpfJ8GC.js")).registerCompletionCli(program);
276
276
  }
277
277
  }
278
278
  ];
@@ -7,6 +7,6 @@ import "./subsystem-DISldKSB.js";
7
7
  import "./ansi-BEJF8NKS.js";
8
8
  import "./boolean-C3GkJetE.js";
9
9
  import "./env-Dnra1IpT.js";
10
- import { n as loadValidatedConfigForPluginRegistration, r as registerSubCliByName } from "./register.subclis-B6HYIWdr.js";
10
+ import { n as loadValidatedConfigForPluginRegistration, r as registerSubCliByName } from "./register.subclis-Dd2E6UgL.js";
11
11
  import "./subcli-descriptors-buRXfptb.js";
12
12
  export { loadValidatedConfigForPluginRegistration, registerSubCliByName };
@@ -150,7 +150,7 @@ const routeAgentsList = {
150
150
  run: async (argv) => {
151
151
  const json = hasFlag(argv, "--json");
152
152
  const bindings = hasFlag(argv, "--bindings");
153
- const { agentsListCommand } = await import("./agents-C2_apaRl.js");
153
+ const { agentsListCommand } = await import("./agents-BNKB08km.js");
154
154
  await agentsListCommand({
155
155
  json,
156
156
  bindings
@@ -217,7 +217,7 @@ const routes = [
217
217
  const pathArg = positionals[0];
218
218
  if (!pathArg) return false;
219
219
  const json = hasFlag(argv, "--json");
220
- const { runConfigGet } = await import("./config-cli-BUJXj3eo.js");
220
+ const { runConfigGet } = await import("./config-cli-CkDay3qv.js");
221
221
  await runConfigGet({
222
222
  path: pathArg,
223
223
  json
@@ -232,7 +232,7 @@ const routes = [
232
232
  if (!positionals || positionals.length !== 1) return false;
233
233
  const pathArg = positionals[0];
234
234
  if (!pathArg) return false;
235
- const { runConfigUnset } = await import("./config-cli-BUJXj3eo.js");
235
+ const { runConfigUnset } = await import("./config-cli-CkDay3qv.js");
236
236
  await runConfigUnset({ path: pathArg });
237
237
  return true;
238
238
  }
@@ -387,7 +387,7 @@ async function runCli(argv = process$1.argv) {
387
387
  }
388
388
  if (await tryRouteCli(normalizedArgv)) return;
389
389
  enableConsoleCapture();
390
- const { buildProgram } = await import("./program-vgusBOnw.js");
390
+ const { buildProgram } = await import("./program-Xr3NHOnX.js");
391
391
  const program = buildProgram();
392
392
  const { installUnhandledRejectionHandler } = await import("./unhandled-rejections-O6cVOz2D.js");
393
393
  installUnhandledRejectionHandler();
@@ -401,10 +401,10 @@ async function runCli(argv = process$1.argv) {
401
401
  const { getProgramContext } = await import("./program-context-CLR9R8wO.js");
402
402
  const ctx = getProgramContext(program);
403
403
  if (ctx) {
404
- const { registerCoreCliByName } = await import("./command-registry-BUCg5Yjv.js");
404
+ const { registerCoreCliByName } = await import("./command-registry-jlEvUAKq.js");
405
405
  await registerCoreCliByName(program, ctx, primary, parseArgv);
406
406
  }
407
- const { registerSubCliByName } = await import("./register.subclis-mDzvRQMA.js");
407
+ const { registerSubCliByName } = await import("./register.subclis-pNtiPM8G.js");
408
408
  await registerSubCliByName(program, primary);
409
409
  }
410
410
  if (!shouldSkipPluginCommandRegistration({
@@ -413,7 +413,7 @@ async function runCli(argv = process$1.argv) {
413
413
  hasBuiltinPrimary: primary !== null && program.commands.some((command) => command.name() === primary)
414
414
  })) {
415
415
  const { registerPluginCliCommands } = await import("./cli-BNJBssJu.js");
416
- const { loadValidatedConfigForPluginRegistration } = await import("./register.subclis-mDzvRQMA.js");
416
+ const { loadValidatedConfigForPluginRegistration } = await import("./register.subclis-pNtiPM8G.js");
417
417
  const config = await loadValidatedConfigForPluginRegistration();
418
418
  if (config) registerPluginCliCommands(program, config);
419
419
  }
@@ -345,7 +345,7 @@ async function runSetupWizard(opts, runtime = defaultRuntime, prompter) {
345
345
  if (opts.skipChannels ?? opts.skipProviders) await prompter.note("Skipping channel setup.", "Channels");
346
346
  else {
347
347
  const { listChannelPlugins } = await import("./plugins-BStRM4Qp.js");
348
- const { setupChannels } = await import("./onboard-channels-CFM-GqSa.js");
348
+ const { setupChannels } = await import("./onboard-channels-CYyBfLIY.js");
349
349
  const quickstartAllowFromChannels = flow === "quickstart" ? listChannelPlugins().filter((plugin) => plugin.meta.quickstartAllowFrom).map((plugin) => plugin.id) : [];
350
350
  nextConfig = await setupChannels(nextConfig, runtime, prompter, {
351
351
  allowSignalInstall: true,
@@ -380,7 +380,7 @@ async function runSetupWizard(opts, runtime = defaultRuntime, prompter) {
380
380
  mode
381
381
  });
382
382
  await writeConfigFile(nextConfig);
383
- const { finalizeSetupWizard } = await import("./setup.finalize-Bs2AabmP.js");
383
+ const { finalizeSetupWizard } = await import("./setup.finalize-DUXM1TZ3.js");
384
384
  const { launchedTui } = await finalizeSetupWizard({
385
385
  flow,
386
386
  opts,
@@ -218,16 +218,16 @@ import "./gateway-runtime-CnT-i6bE.js";
218
218
  import "./connection-auth-DVYDVm4S.js";
219
219
  import "./mcp-config-D_JUsitu.js";
220
220
  import "./note-CrfOOz26.js";
221
- import { r as installCompletion } from "./completion-cli-DEwxxtpl.js";
222
- import "./register.subclis-B6HYIWdr.js";
223
- import "./command-registry-DuepL5IT.js";
221
+ import { r as installCompletion } from "./completion-cli-B7KByNii.js";
222
+ import "./register.subclis-Dd2E6UgL.js";
223
+ import "./command-registry-maV_byWv.js";
224
224
  import "./program-context-SgNgozNB.js";
225
225
  import "./heartbeat-summary-1I5G8fLI.js";
226
226
  import { r as healthCommand } from "./health-dwK_gUNI.js";
227
227
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-B5-glm9S.js";
228
228
  import { t as resolveSetupSecretInputString } from "./setup.secret-input-zTHnk276.js";
229
229
  import { t as formatHealthCheckFailure } from "./health-format-Cq-7EnWP.js";
230
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-BKC_yRJu.js";
230
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-Bhbtito8.js";
231
231
  import { t as runTui } from "./tui-BpGN18Aq.js";
232
232
  import path from "node:path";
233
233
  import os from "node:os";
@@ -249,9 +249,9 @@ import "./status-DpkO40zw.js";
249
249
  import "./auth-health-C-jfjkhn.js";
250
250
  import "./note-CrfOOz26.js";
251
251
  import "./bundled-sources-C0-2GZmN.js";
252
- import { r as installCompletion } from "./completion-cli-DEwxxtpl.js";
253
- import "./register.subclis-B6HYIWdr.js";
254
- import "./command-registry-DuepL5IT.js";
252
+ import { r as installCompletion } from "./completion-cli-B7KByNii.js";
253
+ import "./register.subclis-Dd2E6UgL.js";
254
+ import "./command-registry-maV_byWv.js";
255
255
  import "./program-context-SgNgozNB.js";
256
256
  import { n as renderTable, t as getTerminalTableWidth } from "./table-CMVjkoOs.js";
257
257
  import "./heartbeat-summary-1I5G8fLI.js";
@@ -265,8 +265,8 @@ import { n as updateNpmInstalledPlugins, t as syncPluginsForUpdateChannel } from
265
265
  import "./provider-auth-guidance-DXgeysMX.js";
266
266
  import "./systemd-linger-BasN9UtI.js";
267
267
  import "./health-format-Cq-7EnWP.js";
268
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-BoBpzerB.js";
269
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-BKC_yRJu.js";
268
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-ClRa2a-J.js";
269
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-Bhbtito8.js";
270
270
  import "./doctor-config-preflight-DRiu7A6q.js";
271
271
  import "./channel-account-context-CzAEVT7u.js";
272
272
  import "./doctor-state-migrations-PI6hf8TK.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cclawd",
3
- "version": "2026.3.26",
3
+ "version": "2026.3.27",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/openclaw/openclaw#readme",