@clawos-dev/clawd 0.2.577 → 0.2.579

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.
@@ -21749,8 +21749,16 @@ var DeployPatchArgsSchema = external_exports.object({
21749
21749
  /** 改的是历史里哪次扫描的清单。扫描期 butler 删条目也走这条(scanId 在它的任务提示里) */
21750
21750
  scanId: external_exports.string().min(1),
21751
21751
  patch: external_exports.object({
21752
- // 人工补依赖;整份替换 manifest
21753
- manifest: EnvironmentManifestSchema.optional()
21752
+ /**
21753
+ * 整份替换 manifest(butler 扫描期删条目走这条)。daemon 写的字段(package 的 version / localVersion / artifact / aptVersion /
21754
+ * aptMissing、连接器上点过的 credentialSource / auth)快照里缺了会从记录里补回——旧快照冲不掉它们。
21755
+ */
21756
+ manifest: EnvironmentManifestSchema.optional(),
21757
+ /**
21758
+ * 只换清单里**同名那一条**连接器(上云页连接器卡片上的点选走这条)。不带整份清单:页面手里的清单可能是旧快照,
21759
+ * 整份写回会把 daemon 之后写进去的东西冲掉(2026-09-23 persona-log-tracer 的 hbi 资产就是这么丢的)。同名的不在 → 拒
21760
+ */
21761
+ connector: EnvConnectorSchema.optional()
21754
21762
  }).strict()
21755
21763
  }).strict();
21756
21764
  var DeployPutSecretArgsSchema = external_exports.object({
@@ -24232,7 +24240,7 @@ var METHOD_DOCS = {
24232
24240
  args: DeployScanArgsSchema
24233
24241
  },
24234
24242
  "deploy:patch": {
24235
- summary: "\u7F16\u8F91\u5386\u53F2\u91CC\u67D0\u6B21\u626B\u63CF\u7684\u6E05\u5355\uFF08scanId \u6307\u540D\uFF09\uFF1A\u624B\u5DE5\u8865 / \u5220\u4F9D\u8D56\uFF0C\u626B\u63CF\u671F butler \u5220\u6761\u76EE\u4E5F\u8D70\u8FD9\u6761\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
24243
+ summary: "\u7F16\u8F91\u5386\u53F2\u91CC\u67D0\u6B21\u626B\u63CF\u7684\u6E05\u5355\uFF08scanId \u6307\u540D\uFF09\u3002patch.connector = \u53EA\u6362\u540C\u540D\u90A3\u4E00\u6761\u8FDE\u63A5\u5668\uFF08\u4E0A\u4E91\u9875\u70B9\u9009\u8D70\u8FD9\u6761\uFF0C\u4E0D\u5728\u5C31\u62D2\uFF09\uFF1Bpatch.manifest = \u6574\u4EFD\u66FF\u6362\uFF08\u624B\u5DE5\u8865 / \u5220\u4F9D\u8D56\uFF0C\u626B\u63CF\u671F butler \u5220\u6761\u76EE\u4E5F\u8D70\u8FD9\u6761\uFF09\uFF0C\u4F46 daemon \u5199\u7684\u5B57\u6BB5\uFF08\u5305\u7684 version / localVersion / artifact / aptVersion / aptMissing\u3001\u8FDE\u63A5\u5668\u70B9\u8FC7\u7684 credentialSource / auth\uFF09\u5FEB\u7167\u91CC\u7F3A\u4E86\u4F1A\u4ECE\u8BB0\u5F55\u8865\u56DE\uFF0C\u6E05\u4E0D\u6389\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
24236
24244
  args: DeployPatchArgsSchema
24237
24245
  },
24238
24246
  "deploy:putSecret": {
package/dist/cli.cjs CHANGED
@@ -6320,8 +6320,16 @@ var init_deploy_schemas = __esm({
6320
6320
  /** 改的是历史里哪次扫描的清单。扫描期 butler 删条目也走这条(scanId 在它的任务提示里) */
6321
6321
  scanId: external_exports.string().min(1),
6322
6322
  patch: external_exports.object({
6323
- // 人工补依赖;整份替换 manifest
6324
- manifest: EnvironmentManifestSchema.optional()
6323
+ /**
6324
+ * 整份替换 manifest(butler 扫描期删条目走这条)。daemon 写的字段(package 的 version / localVersion / artifact / aptVersion /
6325
+ * aptMissing、连接器上点过的 credentialSource / auth)快照里缺了会从记录里补回——旧快照冲不掉它们。
6326
+ */
6327
+ manifest: EnvironmentManifestSchema.optional(),
6328
+ /**
6329
+ * 只换清单里**同名那一条**连接器(上云页连接器卡片上的点选走这条)。不带整份清单:页面手里的清单可能是旧快照,
6330
+ * 整份写回会把 daemon 之后写进去的东西冲掉(2026-09-23 persona-log-tracer 的 hbi 资产就是这么丢的)。同名的不在 → 拒
6331
+ */
6332
+ connector: EnvConnectorSchema.optional()
6325
6333
  }).strict()
6326
6334
  }).strict();
6327
6335
  DeployPutSecretArgsSchema = external_exports.object({
@@ -9088,7 +9096,7 @@ var init_methods = __esm({
9088
9096
  args: DeployScanArgsSchema
9089
9097
  },
9090
9098
  "deploy:patch": {
9091
- summary: "\u7F16\u8F91\u5386\u53F2\u91CC\u67D0\u6B21\u626B\u63CF\u7684\u6E05\u5355\uFF08scanId \u6307\u540D\uFF09\uFF1A\u624B\u5DE5\u8865 / \u5220\u4F9D\u8D56\uFF0C\u626B\u63CF\u671F butler \u5220\u6761\u76EE\u4E5F\u8D70\u8FD9\u6761\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
9099
+ summary: "\u7F16\u8F91\u5386\u53F2\u91CC\u67D0\u6B21\u626B\u63CF\u7684\u6E05\u5355\uFF08scanId \u6307\u540D\uFF09\u3002patch.connector = \u53EA\u6362\u540C\u540D\u90A3\u4E00\u6761\u8FDE\u63A5\u5668\uFF08\u4E0A\u4E91\u9875\u70B9\u9009\u8D70\u8FD9\u6761\uFF0C\u4E0D\u5728\u5C31\u62D2\uFF09\uFF1Bpatch.manifest = \u6574\u4EFD\u66FF\u6362\uFF08\u624B\u5DE5\u8865 / \u5220\u4F9D\u8D56\uFF0C\u626B\u63CF\u671F butler \u5220\u6761\u76EE\u4E5F\u8D70\u8FD9\u6761\uFF09\uFF0C\u4F46 daemon \u5199\u7684\u5B57\u6BB5\uFF08\u5305\u7684 version / localVersion / artifact / aptVersion / aptMissing\u3001\u8FDE\u63A5\u5668\u70B9\u8FC7\u7684 credentialSource / auth\uFF09\u5FEB\u7167\u91CC\u7F3A\u4E86\u4F1A\u4ECE\u8BB0\u5F55\u8865\u56DE\uFF0C\u6E05\u4E0D\u6389\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
9092
9100
  args: DeployPatchArgsSchema
9093
9101
  },
9094
9102
  "deploy:putSecret": {
@@ -55709,6 +55717,38 @@ function parseFinding(kind, item) {
55709
55717
  }
55710
55718
  return parsed.data;
55711
55719
  }
55720
+ function keepDaemonFields(existing, incoming) {
55721
+ const oldPkg = new Map(existing.packages.map((p3) => [p3.name, p3]));
55722
+ const packages = incoming.packages.map((p3) => {
55723
+ const o2 = oldPkg.get(p3.name);
55724
+ if (!o2 || o2.from !== p3.from) return p3;
55725
+ const version2 = p3.version ?? (p3.min === o2.min ? o2.version : void 0);
55726
+ const aptFromSnapshot = p3.aptVersion !== void 0 || p3.aptMissing !== void 0;
55727
+ return {
55728
+ ...p3,
55729
+ ...version2 !== void 0 ? { version: version2 } : {},
55730
+ ...p3.localVersion === void 0 && o2.localVersion !== void 0 ? { localVersion: o2.localVersion } : {},
55731
+ ...!aptFromSnapshot && o2.aptVersion !== void 0 ? { aptVersion: o2.aptVersion } : {},
55732
+ ...!aptFromSnapshot && o2.aptMissing !== void 0 ? { aptMissing: o2.aptMissing } : {},
55733
+ ...p3.artifact === void 0 && o2.artifact !== void 0 && o2.version === version2 ? { artifact: o2.artifact } : {}
55734
+ };
55735
+ });
55736
+ const oldConn = new Map(existing.connectors.map((c2) => [c2.name, c2]));
55737
+ const connectors = incoming.connectors.map((c2) => {
55738
+ const o2 = oldConn.get(c2.name);
55739
+ if (!o2) return c2;
55740
+ return {
55741
+ ...c2,
55742
+ ...c2.credentialSource === void 0 && o2.credentialSource !== void 0 ? { credentialSource: o2.credentialSource } : {},
55743
+ ...c2.auth === void 0 && o2.auth !== void 0 ? { auth: o2.auth } : {}
55744
+ };
55745
+ });
55746
+ return { ...incoming, packages, connectors };
55747
+ }
55748
+ function replaceConnector(manifest, connector) {
55749
+ if (!manifest.connectors.some((c2) => c2.name === connector.name)) throw new Error(`\u6E05\u5355\u91CC\u6CA1\u6709\u8FDE\u63A5\u5668 ${connector.name}`);
55750
+ return { ...manifest, connectors: manifest.connectors.map((c2) => c2.name === connector.name ? connector : c2) };
55751
+ }
55712
55752
  function upsertFinding(manifest, kind, item) {
55713
55753
  if (kind === "connector") {
55714
55754
  const incoming = item;
@@ -60217,7 +60257,16 @@ function buildDeployHandlers(deps) {
60217
60257
  if (entry.status === "scanning" && mustBeLiveScan(args.personaId, file, "deploy:patch").id !== entry.id) {
60218
60258
  throw invalid("deploy:patch \u6307\u540D\u7684\u4E0D\u662F\u6B63\u5728\u8DD1\u7684\u90A3\u6B21\u626B\u63CF");
60219
60259
  }
60220
- if (args.patch.manifest) await writeScanFile(dir, replaceScan(file, { ...entry, manifest: args.patch.manifest }));
60260
+ let manifest = entry.manifest;
60261
+ if (args.patch.manifest) manifest = keepDaemonFields(manifest, args.patch.manifest);
60262
+ if (args.patch.connector) {
60263
+ try {
60264
+ manifest = replaceConnector(manifest, args.patch.connector);
60265
+ } catch (err) {
60266
+ throw invalid(err instanceof Error ? err.message : String(err));
60267
+ }
60268
+ }
60269
+ if (manifest !== entry.manifest) await writeScanFile(dir, replaceScan(file, { ...entry, manifest }));
60221
60270
  return view(args.personaId);
60222
60271
  };
60223
60272
  const putSecret = async (frame, _client, ctx) => {
@@ -71609,7 +71658,7 @@ function computeMethodAccess(args) {
71609
71658
  }
71610
71659
 
71611
71660
  // src/version.ts
71612
- var version = "0.2.577".length > 0 ? "0.2.577" : "dev";
71661
+ var version = "0.2.579".length > 0 ? "0.2.579" : "dev";
71613
71662
 
71614
71663
  // src/cli-probe/probe.ts
71615
71664
  var fs79 = __toESM(require("fs"), 1);
@@ -21563,8 +21563,16 @@ var DeployPatchArgsSchema = external_exports.object({
21563
21563
  /** 改的是历史里哪次扫描的清单。扫描期 butler 删条目也走这条(scanId 在它的任务提示里) */
21564
21564
  scanId: external_exports.string().min(1),
21565
21565
  patch: external_exports.object({
21566
- // 人工补依赖;整份替换 manifest
21567
- manifest: EnvironmentManifestSchema.optional()
21566
+ /**
21567
+ * 整份替换 manifest(butler 扫描期删条目走这条)。daemon 写的字段(package 的 version / localVersion / artifact / aptVersion /
21568
+ * aptMissing、连接器上点过的 credentialSource / auth)快照里缺了会从记录里补回——旧快照冲不掉它们。
21569
+ */
21570
+ manifest: EnvironmentManifestSchema.optional(),
21571
+ /**
21572
+ * 只换清单里**同名那一条**连接器(上云页连接器卡片上的点选走这条)。不带整份清单:页面手里的清单可能是旧快照,
21573
+ * 整份写回会把 daemon 之后写进去的东西冲掉(2026-09-23 persona-log-tracer 的 hbi 资产就是这么丢的)。同名的不在 → 拒
21574
+ */
21575
+ connector: EnvConnectorSchema.optional()
21568
21576
  }).strict()
21569
21577
  }).strict();
21570
21578
  var DeployPutSecretArgsSchema = external_exports.object({
@@ -24046,7 +24054,7 @@ var METHOD_DOCS = {
24046
24054
  args: DeployScanArgsSchema
24047
24055
  },
24048
24056
  "deploy:patch": {
24049
- summary: "\u7F16\u8F91\u5386\u53F2\u91CC\u67D0\u6B21\u626B\u63CF\u7684\u6E05\u5355\uFF08scanId \u6307\u540D\uFF09\uFF1A\u624B\u5DE5\u8865 / \u5220\u4F9D\u8D56\uFF0C\u626B\u63CF\u671F butler \u5220\u6761\u76EE\u4E5F\u8D70\u8FD9\u6761\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
24057
+ summary: "\u7F16\u8F91\u5386\u53F2\u91CC\u67D0\u6B21\u626B\u63CF\u7684\u6E05\u5355\uFF08scanId \u6307\u540D\uFF09\u3002patch.connector = \u53EA\u6362\u540C\u540D\u90A3\u4E00\u6761\u8FDE\u63A5\u5668\uFF08\u4E0A\u4E91\u9875\u70B9\u9009\u8D70\u8FD9\u6761\uFF0C\u4E0D\u5728\u5C31\u62D2\uFF09\uFF1Bpatch.manifest = \u6574\u4EFD\u66FF\u6362\uFF08\u624B\u5DE5\u8865 / \u5220\u4F9D\u8D56\uFF0C\u626B\u63CF\u671F butler \u5220\u6761\u76EE\u4E5F\u8D70\u8FD9\u6761\uFF09\uFF0C\u4F46 daemon \u5199\u7684\u5B57\u6BB5\uFF08\u5305\u7684 version / localVersion / artifact / aptVersion / aptMissing\u3001\u8FDE\u63A5\u5668\u70B9\u8FC7\u7684 credentialSource / auth\uFF09\u5FEB\u7167\u91CC\u7F3A\u4E86\u4F1A\u4ECE\u8BB0\u5F55\u8865\u56DE\uFF0C\u6E05\u4E0D\u6389\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
24050
24058
  args: DeployPatchArgsSchema
24051
24059
  },
24052
24060
  "deploy:putSecret": {
@@ -21749,8 +21749,16 @@ var DeployPatchArgsSchema = external_exports.object({
21749
21749
  /** 改的是历史里哪次扫描的清单。扫描期 butler 删条目也走这条(scanId 在它的任务提示里) */
21750
21750
  scanId: external_exports.string().min(1),
21751
21751
  patch: external_exports.object({
21752
- // 人工补依赖;整份替换 manifest
21753
- manifest: EnvironmentManifestSchema.optional()
21752
+ /**
21753
+ * 整份替换 manifest(butler 扫描期删条目走这条)。daemon 写的字段(package 的 version / localVersion / artifact / aptVersion /
21754
+ * aptMissing、连接器上点过的 credentialSource / auth)快照里缺了会从记录里补回——旧快照冲不掉它们。
21755
+ */
21756
+ manifest: EnvironmentManifestSchema.optional(),
21757
+ /**
21758
+ * 只换清单里**同名那一条**连接器(上云页连接器卡片上的点选走这条)。不带整份清单:页面手里的清单可能是旧快照,
21759
+ * 整份写回会把 daemon 之后写进去的东西冲掉(2026-09-23 persona-log-tracer 的 hbi 资产就是这么丢的)。同名的不在 → 拒
21760
+ */
21761
+ connector: EnvConnectorSchema.optional()
21754
21762
  }).strict()
21755
21763
  }).strict();
21756
21764
  var DeployPutSecretArgsSchema = external_exports.object({
@@ -24232,7 +24240,7 @@ var METHOD_DOCS = {
24232
24240
  args: DeployScanArgsSchema
24233
24241
  },
24234
24242
  "deploy:patch": {
24235
- summary: "\u7F16\u8F91\u5386\u53F2\u91CC\u67D0\u6B21\u626B\u63CF\u7684\u6E05\u5355\uFF08scanId \u6307\u540D\uFF09\uFF1A\u624B\u5DE5\u8865 / \u5220\u4F9D\u8D56\uFF0C\u626B\u63CF\u671F butler \u5220\u6761\u76EE\u4E5F\u8D70\u8FD9\u6761\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
24243
+ summary: "\u7F16\u8F91\u5386\u53F2\u91CC\u67D0\u6B21\u626B\u63CF\u7684\u6E05\u5355\uFF08scanId \u6307\u540D\uFF09\u3002patch.connector = \u53EA\u6362\u540C\u540D\u90A3\u4E00\u6761\u8FDE\u63A5\u5668\uFF08\u4E0A\u4E91\u9875\u70B9\u9009\u8D70\u8FD9\u6761\uFF0C\u4E0D\u5728\u5C31\u62D2\uFF09\uFF1Bpatch.manifest = \u6574\u4EFD\u66FF\u6362\uFF08\u624B\u5DE5\u8865 / \u5220\u4F9D\u8D56\uFF0C\u626B\u63CF\u671F butler \u5220\u6761\u76EE\u4E5F\u8D70\u8FD9\u6761\uFF09\uFF0C\u4F46 daemon \u5199\u7684\u5B57\u6BB5\uFF08\u5305\u7684 version / localVersion / artifact / aptVersion / aptMissing\u3001\u8FDE\u63A5\u5668\u70B9\u8FC7\u7684 credentialSource / auth\uFF09\u5FEB\u7167\u91CC\u7F3A\u4E86\u4F1A\u4ECE\u8BB0\u5F55\u8865\u56DE\uFF0C\u6E05\u4E0D\u6389\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
24236
24244
  args: DeployPatchArgsSchema
24237
24245
  },
24238
24246
  "deploy:putSecret": {
@@ -21749,8 +21749,16 @@ var DeployPatchArgsSchema = external_exports.object({
21749
21749
  /** 改的是历史里哪次扫描的清单。扫描期 butler 删条目也走这条(scanId 在它的任务提示里) */
21750
21750
  scanId: external_exports.string().min(1),
21751
21751
  patch: external_exports.object({
21752
- // 人工补依赖;整份替换 manifest
21753
- manifest: EnvironmentManifestSchema.optional()
21752
+ /**
21753
+ * 整份替换 manifest(butler 扫描期删条目走这条)。daemon 写的字段(package 的 version / localVersion / artifact / aptVersion /
21754
+ * aptMissing、连接器上点过的 credentialSource / auth)快照里缺了会从记录里补回——旧快照冲不掉它们。
21755
+ */
21756
+ manifest: EnvironmentManifestSchema.optional(),
21757
+ /**
21758
+ * 只换清单里**同名那一条**连接器(上云页连接器卡片上的点选走这条)。不带整份清单:页面手里的清单可能是旧快照,
21759
+ * 整份写回会把 daemon 之后写进去的东西冲掉(2026-09-23 persona-log-tracer 的 hbi 资产就是这么丢的)。同名的不在 → 拒
21760
+ */
21761
+ connector: EnvConnectorSchema.optional()
21754
21762
  }).strict()
21755
21763
  }).strict();
21756
21764
  var DeployPutSecretArgsSchema = external_exports.object({
@@ -24232,7 +24240,7 @@ var METHOD_DOCS = {
24232
24240
  args: DeployScanArgsSchema
24233
24241
  },
24234
24242
  "deploy:patch": {
24235
- summary: "\u7F16\u8F91\u5386\u53F2\u91CC\u67D0\u6B21\u626B\u63CF\u7684\u6E05\u5355\uFF08scanId \u6307\u540D\uFF09\uFF1A\u624B\u5DE5\u8865 / \u5220\u4F9D\u8D56\uFF0C\u626B\u63CF\u671F butler \u5220\u6761\u76EE\u4E5F\u8D70\u8FD9\u6761\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
24243
+ summary: "\u7F16\u8F91\u5386\u53F2\u91CC\u67D0\u6B21\u626B\u63CF\u7684\u6E05\u5355\uFF08scanId \u6307\u540D\uFF09\u3002patch.connector = \u53EA\u6362\u540C\u540D\u90A3\u4E00\u6761\u8FDE\u63A5\u5668\uFF08\u4E0A\u4E91\u9875\u70B9\u9009\u8D70\u8FD9\u6761\uFF0C\u4E0D\u5728\u5C31\u62D2\uFF09\uFF1Bpatch.manifest = \u6574\u4EFD\u66FF\u6362\uFF08\u624B\u5DE5\u8865 / \u5220\u4F9D\u8D56\uFF0C\u626B\u63CF\u671F butler \u5220\u6761\u76EE\u4E5F\u8D70\u8FD9\u6761\uFF09\uFF0C\u4F46 daemon \u5199\u7684\u5B57\u6BB5\uFF08\u5305\u7684 version / localVersion / artifact / aptVersion / aptMissing\u3001\u8FDE\u63A5\u5668\u70B9\u8FC7\u7684 credentialSource / auth\uFF09\u5FEB\u7167\u91CC\u7F3A\u4E86\u4F1A\u4ECE\u8BB0\u5F55\u8865\u56DE\uFF0C\u6E05\u4E0D\u6389\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
24236
24244
  args: DeployPatchArgsSchema
24237
24245
  },
24238
24246
  "deploy:putSecret": {