@clawos-dev/clawd 0.2.758 → 0.2.759

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.
@@ -21620,9 +21620,12 @@ var PersonaCloudEngineSchema = external_exports.object({
21620
21620
  model: external_exports.string().optional(),
21621
21621
  effort: external_exports.string().optional()
21622
21622
  }).strict();
21623
+ var PERSONA_DESCRIPTION_MAX = 80;
21623
21624
  var PersonaFileSchema = external_exports.object({
21624
21625
  personaId: external_exports.string(),
21625
21626
  label: external_exports.string(),
21627
+ /** 一句话描述,上云时随 label 登记到 gateway,列表和卡片里用来辨认 persona。读文件不限长(手写超长不该让整个 persona 解析失败),写入口和 gateway 才截 / 拒 80 字 */
21628
+ description: external_exports.string().optional(),
21626
21629
  model: external_exports.string().optional(),
21627
21630
  // 与 model 平行的第二个 session 默认值:reasoning effort。值域跟着 tool 走
21628
21631
  // (claude 是 '' | low | medium | high | xhigh | max,codex 是 per-model 档位),
@@ -21651,8 +21654,12 @@ var PersonaFileSchema = external_exports.object({
21651
21654
  personaId: external_exports.string().min(1),
21652
21655
  publishedByMe: external_exports.boolean().optional(),
21653
21656
  collaboratedByMe: external_exports.boolean().optional(),
21654
- /** Display name (persona.json label) registered on the gateway; the row's top-level label stays the gateway id. */
21657
+ /** Display name (persona.json label) registered on the gateway; the row's top-level label falls back to the gateway id when absent. */
21655
21658
  label: external_exports.string().optional(),
21659
+ /** One-line description (persona.json description) registered on the gateway. */
21660
+ description: external_exports.string().optional(),
21661
+ /** Who published it, from the center. name absent = center has no name for them; creator absent = not looked up (older center / lookup failed). */
21662
+ creator: external_exports.object({ name: external_exports.string().optional(), mine: external_exports.boolean() }).strict().optional(),
21656
21663
  environment: DeployEnvironmentSchema.optional(),
21657
21664
  expectedImage: ImageDigestSchema.optional(),
21658
21665
  testReleaseId: external_exports.string().optional()
@@ -21738,6 +21745,7 @@ var PersonaUpdateArgsSchema = external_exports.object({
21738
21745
  personaId: external_exports.string().min(1),
21739
21746
  patch: external_exports.object({
21740
21747
  label: external_exports.string().min(1).optional(),
21748
+ description: external_exports.string().max(PERSONA_DESCRIPTION_MAX).optional(),
21741
21749
  model: external_exports.string().optional(),
21742
21750
  effort: external_exports.string().optional(),
21743
21751
  serviceTier: PersonaFileSchema.shape.serviceTier,
@@ -31548,9 +31548,12 @@ var PersonaCloudEngineSchema = external_exports.object({
31548
31548
  model: external_exports.string().optional(),
31549
31549
  effort: external_exports.string().optional()
31550
31550
  }).strict();
31551
+ var PERSONA_DESCRIPTION_MAX = 80;
31551
31552
  var PersonaFileSchema = external_exports.object({
31552
31553
  personaId: external_exports.string(),
31553
31554
  label: external_exports.string(),
31555
+ /** 一句话描述,上云时随 label 登记到 gateway,列表和卡片里用来辨认 persona。读文件不限长(手写超长不该让整个 persona 解析失败),写入口和 gateway 才截 / 拒 80 字 */
31556
+ description: external_exports.string().optional(),
31554
31557
  model: external_exports.string().optional(),
31555
31558
  // 与 model 平行的第二个 session 默认值:reasoning effort。值域跟着 tool 走
31556
31559
  // (claude 是 '' | low | medium | high | xhigh | max,codex 是 per-model 档位),
@@ -31579,8 +31582,12 @@ var PersonaFileSchema = external_exports.object({
31579
31582
  personaId: external_exports.string().min(1),
31580
31583
  publishedByMe: external_exports.boolean().optional(),
31581
31584
  collaboratedByMe: external_exports.boolean().optional(),
31582
- /** Display name (persona.json label) registered on the gateway; the row's top-level label stays the gateway id. */
31585
+ /** Display name (persona.json label) registered on the gateway; the row's top-level label falls back to the gateway id when absent. */
31583
31586
  label: external_exports.string().optional(),
31587
+ /** One-line description (persona.json description) registered on the gateway. */
31588
+ description: external_exports.string().optional(),
31589
+ /** Who published it, from the center. name absent = center has no name for them; creator absent = not looked up (older center / lookup failed). */
31590
+ creator: external_exports.object({ name: external_exports.string().optional(), mine: external_exports.boolean() }).strict().optional(),
31584
31591
  environment: DeployEnvironmentSchema.optional(),
31585
31592
  expectedImage: ImageDigestSchema.optional(),
31586
31593
  testReleaseId: external_exports.string().optional()
@@ -31666,6 +31673,7 @@ var PersonaUpdateArgsSchema = external_exports.object({
31666
31673
  personaId: external_exports.string().min(1),
31667
31674
  patch: external_exports.object({
31668
31675
  label: external_exports.string().min(1).optional(),
31676
+ description: external_exports.string().max(PERSONA_DESCRIPTION_MAX).optional(),
31669
31677
  model: external_exports.string().optional(),
31670
31678
  effort: external_exports.string().optional(),
31671
31679
  serviceTier: PersonaFileSchema.shape.serviceTier,
package/dist/cli.cjs CHANGED
@@ -6443,7 +6443,7 @@ var init_tool_family = __esm({
6443
6443
  });
6444
6444
 
6445
6445
  // ../protocol/src/persona-schemas.ts
6446
- var CodexServiceTierSchema, PERSONA_SIZES, PersonaSizeSchema, DEFAULT_PERSONA_SIZE, PERSONA_CPUS, PersonaCpuSchema, PERSONA_CPU_DEFAULTS, PersonaCloudEngineSchema, PersonaFileSchema, PersonaSkillSummarySchema, PersonaPluginSummarySchema, CodexSandboxSettingsSchema, PersonaSandboxSettingsSchema, PersonaInfoResponseSchema, PersonaCreateArgsSchema, PersonaIdArgsSchema, PersonaUpdateArgsSchema;
6446
+ var CodexServiceTierSchema, PERSONA_SIZES, PersonaSizeSchema, DEFAULT_PERSONA_SIZE, PERSONA_CPUS, PersonaCpuSchema, PERSONA_CPU_DEFAULTS, PersonaCloudEngineSchema, PERSONA_DESCRIPTION_MAX, PersonaFileSchema, PersonaSkillSummarySchema, PersonaPluginSummarySchema, CodexSandboxSettingsSchema, PersonaSandboxSettingsSchema, PersonaInfoResponseSchema, PersonaCreateArgsSchema, PersonaIdArgsSchema, PersonaUpdateArgsSchema;
6447
6447
  var init_persona_schemas = __esm({
6448
6448
  "../protocol/src/persona-schemas.ts"() {
6449
6449
  "use strict";
@@ -6461,9 +6461,12 @@ var init_persona_schemas = __esm({
6461
6461
  model: external_exports.string().optional(),
6462
6462
  effort: external_exports.string().optional()
6463
6463
  }).strict();
6464
+ PERSONA_DESCRIPTION_MAX = 80;
6464
6465
  PersonaFileSchema = external_exports.object({
6465
6466
  personaId: external_exports.string(),
6466
6467
  label: external_exports.string(),
6468
+ /** 一句话描述,上云时随 label 登记到 gateway,列表和卡片里用来辨认 persona。读文件不限长(手写超长不该让整个 persona 解析失败),写入口和 gateway 才截 / 拒 80 字 */
6469
+ description: external_exports.string().optional(),
6467
6470
  model: external_exports.string().optional(),
6468
6471
  // 与 model 平行的第二个 session 默认值:reasoning effort。值域跟着 tool 走
6469
6472
  // (claude 是 '' | low | medium | high | xhigh | max,codex 是 per-model 档位),
@@ -6492,8 +6495,12 @@ var init_persona_schemas = __esm({
6492
6495
  personaId: external_exports.string().min(1),
6493
6496
  publishedByMe: external_exports.boolean().optional(),
6494
6497
  collaboratedByMe: external_exports.boolean().optional(),
6495
- /** Display name (persona.json label) registered on the gateway; the row's top-level label stays the gateway id. */
6498
+ /** Display name (persona.json label) registered on the gateway; the row's top-level label falls back to the gateway id when absent. */
6496
6499
  label: external_exports.string().optional(),
6500
+ /** One-line description (persona.json description) registered on the gateway. */
6501
+ description: external_exports.string().optional(),
6502
+ /** Who published it, from the center. name absent = center has no name for them; creator absent = not looked up (older center / lookup failed). */
6503
+ creator: external_exports.object({ name: external_exports.string().optional(), mine: external_exports.boolean() }).strict().optional(),
6497
6504
  environment: DeployEnvironmentSchema.optional(),
6498
6505
  expectedImage: ImageDigestSchema.optional(),
6499
6506
  testReleaseId: external_exports.string().optional()
@@ -6579,6 +6586,7 @@ var init_persona_schemas = __esm({
6579
6586
  personaId: external_exports.string().min(1),
6580
6587
  patch: external_exports.object({
6581
6588
  label: external_exports.string().min(1).optional(),
6589
+ description: external_exports.string().max(PERSONA_DESCRIPTION_MAX).optional(),
6582
6590
  model: external_exports.string().optional(),
6583
6591
  effort: external_exports.string().optional(),
6584
6592
  serviceTier: PersonaFileSchema.shape.serviceTier,
@@ -53363,6 +53371,7 @@ var PersonaManager = class {
53363
53371
  if (patch.effort === void 0) delete updated.effort;
53364
53372
  if (patch.serviceTier === void 0) delete updated.serviceTier;
53365
53373
  }
53374
+ if (updated.description !== void 0 && updated.description.trim() === "") delete updated.description;
53366
53375
  if (iconKeyPatch === null) {
53367
53376
  delete updated.iconKey;
53368
53377
  } else if (iconKeyPatch !== void 0) {
@@ -54016,6 +54025,23 @@ async function centralVisiblePersonas(opts) {
54016
54025
  for (const id of ids) roles[id] = given ? given[id] === "owner" ? "owner" : "editor" : "owner";
54017
54026
  return { all: body.all, personaIds: ids, roles };
54018
54027
  }
54028
+ var PUBLISHERS_BATCH = 100;
54029
+ async function centralPersonaPublishers(opts) {
54030
+ const out = {};
54031
+ for (let i2 = 0; i2 < opts.personaIds.length; i2 += PUBLISHERS_BATCH) {
54032
+ const ids = opts.personaIds.slice(i2, i2 + PUBLISHERS_BATCH);
54033
+ const body = await centralRequest(opts, `/api/persona-cloud/personas/publishers?ids=${encodeURIComponent(ids.join(","))}`, { method: "GET", bearer: opts.loginPass });
54034
+ if (!body || typeof body !== "object" || Array.isArray(body)) throw new CentralClientError("BAD_RESPONSE", "personas/publishers: expected an object");
54035
+ for (const [id, v3] of Object.entries(body)) {
54036
+ const row = v3;
54037
+ if (!row || typeof row !== "object" || typeof row.mine !== "boolean" || row.displayName !== null && typeof row.displayName !== "string") {
54038
+ throw new CentralClientError("BAD_RESPONSE", `personas/publishers: malformed row for ${id}`);
54039
+ }
54040
+ out[id] = { displayName: row.displayName, mine: row.mine };
54041
+ }
54042
+ }
54043
+ return out;
54044
+ }
54019
54045
  var personaPath = (personaId2) => `/api/persona-cloud/personas/${encodeURIComponent(personaId2)}`;
54020
54046
  async function centralPersonaAccess(opts) {
54021
54047
  const body = await centralRequest(opts, `${personaPath(opts.personaId)}/access`, { method: "GET", bearer: opts.loginPass });
@@ -58900,18 +58926,18 @@ var CloudApiKeyRequiredError = class extends Error {
58900
58926
  }
58901
58927
  };
58902
58928
  var CLOUD_PERSONA_ID_SUFFIX = "-cloud";
58903
- function cloudPersonaToFile(p3, publishedByMe = false, collaboratedByMe = false) {
58929
+ function cloudPersonaToFile(p3, publishedByMe = false, collaboratedByMe = false, creator) {
58904
58930
  const at3 = p3.registeredAt ?? 0;
58905
58931
  return {
58906
58932
  personaId: p3.personaId + CLOUD_PERSONA_ID_SUFFIX,
58907
- label: p3.personaId,
58933
+ label: p3.label ?? p3.personaId,
58908
58934
  tool: p3.engine + CLOUD_TOOL_SUFFIX,
58909
58935
  ...p3.model ? { model: p3.model } : {},
58910
58936
  ...p3.effort ? { effort: p3.effort } : {},
58911
58937
  public: false,
58912
58938
  createdAt: at3,
58913
58939
  updatedAt: at3,
58914
- cloud: { gatewayUrl: p3.gatewayUrl, personaId: p3.personaId, ...publishedByMe ? { publishedByMe: true } : {}, ...collaboratedByMe ? { collaboratedByMe: true } : {}, ...p3.label ? { label: p3.label } : {} }
58940
+ cloud: { gatewayUrl: p3.gatewayUrl, personaId: p3.personaId, ...publishedByMe ? { publishedByMe: true } : {}, ...collaboratedByMe ? { collaboratedByMe: true } : {}, ...p3.label ? { label: p3.label } : {}, ...p3.description ? { description: p3.description } : {}, ...creator ? { creator } : {} }
58915
58941
  };
58916
58942
  }
58917
58943
  var CloudGatewayClient = class {
@@ -58959,6 +58985,7 @@ var CloudGatewayClient = class {
58959
58985
  gatewayUrl,
58960
58986
  engine: d2.engine,
58961
58987
  ...typeof d2.label === "string" && d2.label ? { label: d2.label } : {},
58988
+ ...typeof d2.description === "string" && d2.description ? { description: d2.description } : {},
58962
58989
  ...typeof d2.image === "string" ? { image: d2.image } : {},
58963
58990
  ...typeof d2.model === "string" && d2.model ? { model: d2.model } : {},
58964
58991
  ...typeof d2.effort === "string" && d2.effort ? { effort: d2.effort } : {},
@@ -76514,7 +76541,7 @@ function computeMethodAccess(args) {
76514
76541
  }
76515
76542
 
76516
76543
  // src/version.ts
76517
- var version = "0.2.758".length > 0 ? "0.2.758" : "dev";
76544
+ var version = "0.2.759".length > 0 ? "0.2.759" : "dev";
76518
76545
 
76519
76546
  // src/cli-probe/probe.ts
76520
76547
  var fs87 = __toESM(require("fs"), 1);
@@ -79878,7 +79905,16 @@ async function startDaemon(config) {
79878
79905
  logger.warn("cloud bot publisher lookup failed; binding controls hidden", { reason: err.message });
79879
79906
  }
79880
79907
  }
79881
- const shadowed = personaRegistry.setCloudSnapshot(list.map((p3) => cloudPersonaToFile(p3, publishedIds.has(p3.personaId), collaboratedIds.has(p3.personaId) && !personaStore.has(p3.personaId))));
79908
+ let publishers = {};
79909
+ if (loginPass) {
79910
+ try {
79911
+ publishers = await centralPersonaPublishers({ api: config.clawosApi ?? DEFAULT_CLAWOS_API, loginPass, personaIds: list.map((p3) => p3.personaId) });
79912
+ } catch (err) {
79913
+ logger.debug("cloud persona publishers lookup skipped", { reason: err.message });
79914
+ }
79915
+ }
79916
+ const creatorOf = (id) => publishers[id] ? { ...publishers[id].displayName ? { name: publishers[id].displayName } : {}, mine: publishers[id].mine } : void 0;
79917
+ const shadowed = personaRegistry.setCloudSnapshot(list.map((p3) => cloudPersonaToFile(p3, publishedIds.has(p3.personaId), collaboratedIds.has(p3.personaId) && !personaStore.has(p3.personaId), creatorOf(p3.personaId))));
79882
79918
  if (shadowed.length > 0) {
79883
79919
  logger.warn("cloud personas shadowed by local personas with the same id", { personaIds: shadowed });
79884
79920
  }