@clawos-dev/clawd 0.2.425 → 0.2.427

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
@@ -59787,11 +59787,6 @@ var LoginFlow = class {
59787
59787
  ttcTokenExpiresAt: Number.isFinite(expiresAtNum) ? expiresAtNum : null,
59788
59788
  loginAt: new Date(now).toISOString()
59789
59789
  });
59790
- void this.deps.syncOrgMesh?.().catch((err) => {
59791
- this.deps.logWarn?.("org-mesh: \u767B\u5F55\u540E\u540C\u6B65\u5931\u8D25\uFF08\u4E0D\u5F71\u54CD\u767B\u5F55\uFF09", {
59792
- error: err instanceof Error ? err.message : String(err)
59793
- });
59794
- });
59795
59790
  return { ok: true, identity };
59796
59791
  }
59797
59792
  gcExpired(now) {
@@ -60063,6 +60058,7 @@ async function syncOrgMesh(deps) {
60063
60058
  const peers = await deps.fetchPeers();
60064
60059
  if (peers.length === 0) {
60065
60060
  deps.log("org-mesh: \u4E0D\u5728\u4EFB\u4F55\u7EC4\u7EC7\uFF08\u6216\u7EC4\u91CC\u53EA\u6709\u81EA\u5DF1\uFF09\uFF0C\u8DF3\u8FC7");
60061
+ deps.onProgress?.({ total: 0, done: 0, connected: 0, failed: 0, active: false });
60066
60062
  return { peers: 0, attempted: 0, connected: 0, failed: 0 };
60067
60063
  }
60068
60064
  const targets = [];
@@ -60075,6 +60071,13 @@ async function syncOrgMesh(deps) {
60075
60071
  deps.log("org-mesh: \u5F00\u59CB\u540C\u6B65", { peers: peers.length, targets: targets.length });
60076
60072
  let connected = 0;
60077
60073
  let failed = 0;
60074
+ deps.onProgress?.({
60075
+ total: targets.length,
60076
+ done: 0,
60077
+ connected: 0,
60078
+ failed: 0,
60079
+ active: targets.length > 0
60080
+ });
60078
60081
  for (const t of targets) {
60079
60082
  try {
60080
60083
  await deps.connectToDevice({ deviceId: t.deviceId, name: t.displayName });
@@ -60088,6 +60091,13 @@ async function syncOrgMesh(deps) {
60088
60091
  reason: e.message
60089
60092
  });
60090
60093
  }
60094
+ deps.onProgress?.({
60095
+ total: targets.length,
60096
+ done: connected + failed,
60097
+ connected,
60098
+ failed,
60099
+ active: connected + failed < targets.length
60100
+ });
60091
60101
  }
60092
60102
  deps.log("org-mesh: \u540C\u6B65\u5B8C\u6210", { peers: peers.length, attempted: targets.length, connected, failed });
60093
60103
  return { peers: peers.length, attempted: targets.length, connected, failed };
@@ -62485,7 +62495,7 @@ function computeMethodAccess(args) {
62485
62495
  }
62486
62496
 
62487
62497
  // src/version.ts
62488
- var version = "0.2.425".length > 0 ? "0.2.425" : "dev";
62498
+ var version = "0.2.427".length > 0 ? "0.2.427" : "dev";
62489
62499
 
62490
62500
  // src/cli-probe/probe.ts
62491
62501
  var fs65 = __toESM(require("fs"), 1);
@@ -66968,6 +66978,32 @@ async function startDaemon(config) {
66968
66978
  logger.warn("device register failed (best-effort)", { err: err.message });
66969
66979
  }
66970
66980
  };
66981
+ let orgMeshInFlight = false;
66982
+ const runOrgMesh = async () => {
66983
+ if (!feishuActive || orgMeshInFlight) return;
66984
+ const record3 = ownerIdentityStore.read();
66985
+ if (!record3) return;
66986
+ orgMeshInFlight = true;
66987
+ try {
66988
+ await syncOrgMesh({
66989
+ store: contactStore,
66990
+ fetchPeers: () => fetchOrgPeers({
66991
+ apiUrl: config.clawosApi ?? DEFAULT_CLAWOS_API,
66992
+ apiKey: resolveClawdTicketsApiKey(),
66993
+ deviceId: authFile.deviceId,
66994
+ displayName: record3.identity.displayName || authFile.deviceId
66995
+ }),
66996
+ connectToDevice: createConnectToDevice(feishuDeviceDeps),
66997
+ log: (msg, meta) => logger.info(msg, meta),
66998
+ // 进度上报:串行建联 20+ 台要几十秒,UI 靠这个帧渲染进度条
66999
+ onProgress: (progress) => wsServer?.broadcastToOwners({ type: "org-mesh:progress", ...progress })
67000
+ });
67001
+ } catch (err) {
67002
+ logger.warn("org-mesh sync failed (best-effort)", { err: err.message });
67003
+ } finally {
67004
+ orgMeshInFlight = false;
67005
+ }
67006
+ };
66971
67007
  const fetchServerKey = async () => {
66972
67008
  if (!feishuActive) return;
66973
67009
  try {
@@ -67049,23 +67085,7 @@ async function startDaemon(config) {
67049
67085
  });
67050
67086
  throw err;
67051
67087
  }
67052
- },
67053
- // org auto-mesh(spec 2026-08-31):登录成功后自动跟同组织的人建联。
67054
- // 不进 fail-hard 链——login-flow 内部 void + catch,组网失败不拖垮登录。
67055
- syncOrgMesh: () => syncOrgMesh({
67056
- store: contactStore,
67057
- fetchPeers: () => fetchOrgPeers({
67058
- apiUrl: config.clawosApi ?? DEFAULT_CLAWOS_API,
67059
- apiKey: resolveClawdTicketsApiKey(),
67060
- deviceId: authFile.deviceId,
67061
- displayName: ownerIdentityStore.read()?.identity.displayName ?? authFile.deviceId
67062
- }),
67063
- connectToDevice: createConnectToDevice(feishuDeviceDeps),
67064
- log: (msg, meta) => logger.info(msg, meta)
67065
- }),
67066
- // 组网整体失败(拉清单挂了)的出口:走 logger 才进 SLS——
67067
- // "自动组网悄悄没发生"正是要靠日志排查的场景,console.warn 只有 stdout。
67068
- logWarn: (msg, meta) => logger.warn(msg, meta)
67088
+ }
67069
67089
  });
67070
67090
  const visitorStore = createVisitorStore({ dir: config.dataDir });
67071
67091
  const exchangeVisitorToken = buildVisitorLogin({
@@ -67572,6 +67592,7 @@ async function startDaemon(config) {
67572
67592
  setImmediate(() => wsServer?.closeAllClients());
67573
67593
  void reportDevice();
67574
67594
  void fetchServerKey();
67595
+ void runOrgMesh();
67575
67596
  } else {
67576
67597
  logger.warn("feishu-login failed", {
67577
67598
  reason: result.reason,
@@ -67778,6 +67799,7 @@ ${bar}
67778
67799
  }
67779
67800
  void reportDevice();
67780
67801
  void fetchServerKey();
67802
+ void runOrgMesh();
67781
67803
  const tickAttachmentGc = () => {
67782
67804
  try {
67783
67805
  runAttachmentGc({