@clawos-dev/clawd 0.2.551 → 0.2.553

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.
@@ -22848,6 +22848,8 @@ var EngineConnectPoolResponseSchema = external_exports.object({
22848
22848
  }).strict();
22849
22849
 
22850
22850
  // ../protocol/src/persona-schemas.ts
22851
+ var PERSONA_SIZES = ["small", "medium", "large"];
22852
+ var PersonaSizeSchema = external_exports.enum(PERSONA_SIZES);
22851
22853
  var PersonaFileSchema = external_exports.object({
22852
22854
  personaId: external_exports.string(),
22853
22855
  label: external_exports.string(),
@@ -22866,7 +22868,8 @@ var PersonaFileSchema = external_exports.object({
22866
22868
  /**
22867
22869
  * 云上任务 Pod 的规格档(design 2026-09-18-persona-size):`small` / `medium` / `large`,没写按 medium。
22868
22870
  * 只有发布上云的流水线读它(cloud-host/pipeline/deploy-file.mjs 收窄值域,不认识的拒发);本机跑不看。
22869
- * 协议层同 model / effort 保持 string;现在没有设置页入口,persona.json 手写。
22871
+ * 协议层同 model / effort 保持 string(文件层向前兼容);改它的入口是上云页标题行的规格下拉
22872
+ * (design 2026-09-20-persona-size-ui),`persona:update` 那头按 PersonaSizeSchema 收窄。
22870
22873
  */
22871
22874
  size: external_exports.string().optional(),
22872
22875
  createdAt: external_exports.number(),
@@ -22980,6 +22983,8 @@ var PersonaUpdateArgsSchema = external_exports.object({
22980
22983
  model: external_exports.string().optional(),
22981
22984
  effort: external_exports.string().optional(),
22982
22985
  tool: external_exports.string().optional(),
22986
+ // 云上任务 Pod 的规格档:只收三档之一(PersonaFile 层是 string,边界在这里收窄)
22987
+ size: PersonaSizeSchema.optional(),
22983
22988
  personality: external_exports.string().optional(),
22984
22989
  // 人格补充层正文(见 PersonaInfoResponseSchema.personalityLocal)。与 personality 各写
22985
22990
  // 各层、互不影响;'' = 清空补充层。预装 persona 的编辑入口写的就是这个字段。
@@ -24710,6 +24715,10 @@ var INNER_TAG_NAMES = "clawd-dispatch-task|clawd-dispatch-result|brief|detail|fi
24710
24715
  var INNER_TAG_ESCAPE_RE = new RegExp(`<(\\\\*)(/?)(${INNER_TAG_NAMES})\\b`, "g");
24711
24716
  var INNER_TAG_UNESCAPE_RE = new RegExp(`<\\\\(\\\\*)(/?)(${INNER_TAG_NAMES})\\b`, "g");
24712
24717
 
24718
+ // ../protocol/src/tool-family.ts
24719
+ var CLOUD_TOOL_SUFFIX = "-cloud";
24720
+ var CODEX_CLOUD_TOOL_ID = `codex${CLOUD_TOOL_SUFFIX}`;
24721
+
24713
24722
  // src/deploy/deploy-file.ts
24714
24723
  var import_promises = __toESM(require("fs/promises"), 1);
24715
24724
  var import_node_path3 = __toESM(require("path"), 1);
@@ -24871,7 +24880,7 @@ var L = [
24871
24880
  " rm -rf persona/.git",
24872
24881
  " node clawos/cloud-host/provision/build-image.mjs \\",
24873
24882
  " --manifest persona/.clawd/deploy.json \\",
24874
- ' --from "$REGISTRY/$IMAGE_NAME:base" \\',
24883
+ ' --from "$REGISTRY/$IMAGE_NAME:base-${{ steps.plan.outputs.engine }}" \\',
24875
24884
  " --persona-dir persona \\",
24876
24885
  // persona 在镜像里落 /clawd/personas/<id>/(与本机同构),id 是 gateway 登记的名字;同 smoke / register 用的那个输出
24877
24886
  " --persona-id '${{ steps.plan.outputs.persona_id }}' \\",
@@ -24923,6 +24932,7 @@ var L = [
24923
24932
  " --model '${{ steps.plan.outputs.model }}' \\",
24924
24933
  " --effort '${{ steps.plan.outputs.effort }}' \\",
24925
24934
  " --size '${{ steps.plan.outputs.size }}' \\",
24935
+ " --engine '${{ steps.plan.outputs.engine }}' \\",
24926
24936
  " --connectors '${{ steps.plan.outputs.connectors }}' \\",
24927
24937
  " --run-number '${{ github.run_number }}'",
24928
24938
  "",
@@ -24947,6 +24957,7 @@ var L = [
24947
24957
  " --model '${{ steps.plan.outputs.model }}' \\",
24948
24958
  " --effort '${{ steps.plan.outputs.effort }}' \\",
24949
24959
  " --size '${{ steps.plan.outputs.size }}' \\",
24960
+ " --engine '${{ steps.plan.outputs.engine }}' \\",
24950
24961
  " --connectors '${{ steps.plan.outputs.connectors }}'",
24951
24962
  ""
24952
24963
  ];
package/dist/cli.cjs CHANGED
@@ -7573,11 +7573,13 @@ var init_engine_schemas = __esm({
7573
7573
  });
7574
7574
 
7575
7575
  // ../protocol/src/persona-schemas.ts
7576
- var PersonaFileSchema, PersonaSkillSummarySchema, PersonaPluginSummarySchema, CodexSandboxSettingsSchema, PersonaSandboxSettingsSchema, PersonaInfoResponseSchema, PersonaCreateArgsSchema, PersonaIdArgsSchema, PersonaUpdateArgsSchema;
7576
+ var PERSONA_SIZES, PersonaSizeSchema, PersonaFileSchema, PersonaSkillSummarySchema, PersonaPluginSummarySchema, CodexSandboxSettingsSchema, PersonaSandboxSettingsSchema, PersonaInfoResponseSchema, PersonaCreateArgsSchema, PersonaIdArgsSchema, PersonaUpdateArgsSchema;
7577
7577
  var init_persona_schemas = __esm({
7578
7578
  "../protocol/src/persona-schemas.ts"() {
7579
7579
  "use strict";
7580
7580
  init_zod();
7581
+ PERSONA_SIZES = ["small", "medium", "large"];
7582
+ PersonaSizeSchema = external_exports.enum(PERSONA_SIZES);
7581
7583
  PersonaFileSchema = external_exports.object({
7582
7584
  personaId: external_exports.string(),
7583
7585
  label: external_exports.string(),
@@ -7596,7 +7598,8 @@ var init_persona_schemas = __esm({
7596
7598
  /**
7597
7599
  * 云上任务 Pod 的规格档(design 2026-09-18-persona-size):`small` / `medium` / `large`,没写按 medium。
7598
7600
  * 只有发布上云的流水线读它(cloud-host/pipeline/deploy-file.mjs 收窄值域,不认识的拒发);本机跑不看。
7599
- * 协议层同 model / effort 保持 string;现在没有设置页入口,persona.json 手写。
7601
+ * 协议层同 model / effort 保持 string(文件层向前兼容);改它的入口是上云页标题行的规格下拉
7602
+ * (design 2026-09-20-persona-size-ui),`persona:update` 那头按 PersonaSizeSchema 收窄。
7600
7603
  */
7601
7604
  size: external_exports.string().optional(),
7602
7605
  createdAt: external_exports.number(),
@@ -7710,6 +7713,8 @@ var init_persona_schemas = __esm({
7710
7713
  model: external_exports.string().optional(),
7711
7714
  effort: external_exports.string().optional(),
7712
7715
  tool: external_exports.string().optional(),
7716
+ // 云上任务 Pod 的规格档:只收三档之一(PersonaFile 层是 string,边界在这里收窄)
7717
+ size: PersonaSizeSchema.optional(),
7713
7718
  personality: external_exports.string().optional(),
7714
7719
  // 人格补充层正文(见 PersonaInfoResponseSchema.personalityLocal)。与 personality 各写
7715
7720
  // 各层、互不影响;'' = 清空补充层。预装 persona 的编辑入口写的就是这个字段。
@@ -9713,11 +9718,12 @@ function isCodexFamily(tool) {
9713
9718
  function isRpcAgentTool(tool) {
9714
9719
  return isCodexFamily(tool) || tool === PI_TOOL_ID;
9715
9720
  }
9716
- var CODEX_CLOUD_TOOL_ID, PI_TOOL_ID;
9721
+ var CLOUD_TOOL_SUFFIX, CODEX_CLOUD_TOOL_ID, PI_TOOL_ID;
9717
9722
  var init_tool_family = __esm({
9718
9723
  "../protocol/src/tool-family.ts"() {
9719
9724
  "use strict";
9720
- CODEX_CLOUD_TOOL_ID = "codex-cloud";
9725
+ CLOUD_TOOL_SUFFIX = "-cloud";
9726
+ CODEX_CLOUD_TOOL_ID = `codex${CLOUD_TOOL_SUFFIX}`;
9721
9727
  PI_TOOL_ID = "pi";
9722
9728
  }
9723
9729
  });
@@ -51851,6 +51857,7 @@ function driveCodexThread(opts) {
51851
51857
  ...translateNotification(method, params)
51852
51858
  ] : [];
51853
51859
  if (events.length) sink.pushEvents(events);
51860
+ if (route === "foreground" && method === "turn/completed") opts.onTurnCompleted?.();
51854
51861
  },
51855
51862
  onServerRequest: (id, method, params) => {
51856
51863
  const p3 = params ?? {};
@@ -59300,7 +59307,7 @@ var L2 = [
59300
59307
  " rm -rf persona/.git",
59301
59308
  " node clawos/cloud-host/provision/build-image.mjs \\",
59302
59309
  " --manifest persona/.clawd/deploy.json \\",
59303
- ' --from "$REGISTRY/$IMAGE_NAME:base" \\',
59310
+ ' --from "$REGISTRY/$IMAGE_NAME:base-${{ steps.plan.outputs.engine }}" \\',
59304
59311
  " --persona-dir persona \\",
59305
59312
  // persona 在镜像里落 /clawd/personas/<id>/(与本机同构),id 是 gateway 登记的名字;同 smoke / register 用的那个输出
59306
59313
  " --persona-id '${{ steps.plan.outputs.persona_id }}' \\",
@@ -59352,6 +59359,7 @@ var L2 = [
59352
59359
  " --model '${{ steps.plan.outputs.model }}' \\",
59353
59360
  " --effort '${{ steps.plan.outputs.effort }}' \\",
59354
59361
  " --size '${{ steps.plan.outputs.size }}' \\",
59362
+ " --engine '${{ steps.plan.outputs.engine }}' \\",
59355
59363
  " --connectors '${{ steps.plan.outputs.connectors }}' \\",
59356
59364
  " --run-number '${{ github.run_number }}'",
59357
59365
  "",
@@ -59376,6 +59384,7 @@ var L2 = [
59376
59384
  " --model '${{ steps.plan.outputs.model }}' \\",
59377
59385
  " --effort '${{ steps.plan.outputs.effort }}' \\",
59378
59386
  " --size '${{ steps.plan.outputs.size }}' \\",
59387
+ " --engine '${{ steps.plan.outputs.engine }}' \\",
59379
59388
  " --connectors '${{ steps.plan.outputs.connectors }}'",
59380
59389
  ""
59381
59390
  ];
@@ -62483,6 +62492,7 @@ var GATEWAY_ROUTES = {
62483
62492
  healthz: () => "/healthz",
62484
62493
  session: (personaId2) => `/p/${encodeURIComponent(personaId2)}/session`,
62485
62494
  sessionSend: (personaId2, sessionId) => `/p/${encodeURIComponent(personaId2)}/session/${encodeURIComponent(sessionId)}`,
62495
+ sessionMirror: (personaId2, sessionId) => `/p/${encodeURIComponent(personaId2)}/session/${encodeURIComponent(sessionId)}/mirror`,
62486
62496
  // 调用方自己那块盘的用量(design 2026-09-19-cloud-volume-usage §3.3):同样按人、不挂 persona
62487
62497
  volume: () => "/me/volume"
62488
62498
  };
@@ -62499,7 +62509,7 @@ function cloudPersonaToFile(p3) {
62499
62509
  return {
62500
62510
  personaId: p3.personaId + CLOUD_PERSONA_ID_SUFFIX,
62501
62511
  label: p3.personaId,
62502
- tool: CODEX_CLOUD_TOOL_ID,
62512
+ tool: p3.engine + CLOUD_TOOL_SUFFIX,
62503
62513
  ...p3.model ? { model: p3.model } : {},
62504
62514
  ...p3.effort ? { effort: p3.effort } : {},
62505
62515
  public: false,
@@ -62547,9 +62557,14 @@ var CloudGatewayClient = class {
62547
62557
  for (const raw of rows) {
62548
62558
  const d2 = raw;
62549
62559
  if (d2.kind !== "official" || typeof d2.personaId !== "string") continue;
62560
+ if (typeof d2.engine !== "string" || !d2.engine) {
62561
+ this.deps.logger?.warn("cloud persona row has no engine, skipped", { personaId: d2.personaId });
62562
+ continue;
62563
+ }
62550
62564
  out.push({
62551
62565
  personaId: d2.personaId,
62552
62566
  gatewayUrl,
62567
+ engine: d2.engine,
62553
62568
  ...typeof d2.image === "string" ? { image: d2.image } : {},
62554
62569
  ...typeof d2.model === "string" && d2.model ? { model: d2.model } : {},
62555
62570
  ...typeof d2.effort === "string" && d2.effort ? { effort: d2.effort } : {},
@@ -62572,14 +62587,17 @@ var CloudGatewayClient = class {
62572
62587
  /**
62573
62588
  * 会话通道。返回的行流在 Pod 就绪前就能 write:写入先攒着,收到 `ready` 控制行后按序 POST 出去——
62574
62589
  * 编排那头一构造就发 initialize,不用知道 Pod 还在起。
62590
+ * `toolSessionId`:调用方预分配的引擎会话 id(pi 的 --session-id;codex 的 thread id 是协议内的、不传),进 open 的 body `engineSessionId`
62591
+ * (契约 2026-09-18 §3.2)。
62575
62592
  */
62576
- async openSession(personaId2) {
62593
+ async openSession(personaId2, opts = {}) {
62577
62594
  const { apiKey, gatewayUrl } = await this.credentials();
62578
62595
  return openHttpLineStream({
62579
62596
  fetchImpl: this.fetchImpl,
62580
62597
  gatewayUrl,
62581
62598
  apiKey,
62582
62599
  personaId: personaId2,
62600
+ ...opts.toolSessionId ? { engineSessionId: opts.toolSessionId } : {},
62583
62601
  logger: this.deps.logger
62584
62602
  });
62585
62603
  }
@@ -62624,7 +62642,7 @@ function parseControlLine(line) {
62624
62642
  }
62625
62643
  }
62626
62644
  function openHttpLineStream(opts) {
62627
- const { fetchImpl, gatewayUrl, apiKey, personaId: personaId2, logger } = opts;
62645
+ const { fetchImpl, gatewayUrl, apiKey, personaId: personaId2, engineSessionId, logger } = opts;
62628
62646
  const headers = { authorization: `Bearer ${apiKey}`, "content-type": "application/json" };
62629
62647
  const ac = new AbortController();
62630
62648
  const lineCbs = [];
@@ -62681,7 +62699,7 @@ function openHttpLineStream(opts) {
62681
62699
  res = await fetchImpl(gatewayUrl + GATEWAY_ROUTES.session(personaId2), {
62682
62700
  method: "POST",
62683
62701
  headers,
62684
- body: "{}",
62702
+ body: JSON.stringify(engineSessionId ? { engineSessionId } : {}),
62685
62703
  signal: ac.signal
62686
62704
  });
62687
62705
  } catch (e) {
@@ -62777,6 +62795,16 @@ function openHttpLineStream(opts) {
62777
62795
  close: () => {
62778
62796
  ac.abort();
62779
62797
  finish();
62798
+ },
62799
+ mirror: async () => {
62800
+ if (closed || !sessionId) return;
62801
+ const url = gatewayUrl + GATEWAY_ROUTES.sessionMirror(personaId2, sessionId);
62802
+ try {
62803
+ const res = await fetchImpl(url, { method: "POST", headers, body: "" });
62804
+ if (!res.ok) logger?.warn("cloud session mirror failed", { status: res.status });
62805
+ } catch (e) {
62806
+ if (!closed) logger?.warn("cloud session mirror error", { message: e.message });
62807
+ }
62780
62808
  }
62781
62809
  };
62782
62810
  }
@@ -62923,6 +62951,7 @@ function createCloudCodexSession(ctx, sink, deps) {
62923
62951
  paths.catch(() => {
62924
62952
  });
62925
62953
  stream.onClose(() => rejectPaths(new Error("\u4E91\u4E0A\u901A\u9053\u5728 ready \u4E4B\u524D\u5173\u4E86\uFF0C\u62FF\u4E0D\u5230 Pod \u8DEF\u5F84")));
62954
+ let channel = null;
62926
62955
  const driver = driveCodexThread({
62927
62956
  ctx,
62928
62957
  sink,
@@ -62932,7 +62961,8 @@ function createCloudCodexSession(ctx, sink, deps) {
62932
62961
  imageInput: cloudImageInput(deps),
62933
62962
  // skills 在 Pod 里由 persona 目录自带,本机路径对它没意义
62934
62963
  // 「让对端走人」= 断开下行流,gateway 收到就删 Job;信号对 Pod 没有意义
62935
- kill: () => stream.close()
62964
+ kill: () => stream.close(),
62965
+ onTurnCompleted: () => void channel?.mirror()
62936
62966
  });
62937
62967
  if (!personaId2) {
62938
62968
  queueMicrotask(() => {
@@ -62942,7 +62972,8 @@ function createCloudCodexSession(ctx, sink, deps) {
62942
62972
  return driver.session;
62943
62973
  }
62944
62974
  void deps.client.openSession(personaId2).then(
62945
- (channel) => {
62975
+ (opened) => {
62976
+ channel = opened;
62946
62977
  channel.onControl((c2) => {
62947
62978
  if (c2.kind === "ready") {
62948
62979
  resolvePaths({ personaDir: c2.personaDir, workDir: c2.workDir });
@@ -70970,7 +71001,7 @@ function computeMethodAccess(args) {
70970
71001
  }
70971
71002
 
70972
71003
  // src/version.ts
70973
- var version = "0.2.551".length > 0 ? "0.2.551" : "dev";
71004
+ var version = "0.2.553".length > 0 ? "0.2.553" : "dev";
70974
71005
 
70975
71006
  // src/cli-probe/probe.ts
70976
71007
  var fs78 = __toESM(require("fs"), 1);
@@ -22662,6 +22662,8 @@ var EngineConnectPoolResponseSchema = external_exports.object({
22662
22662
  }).strict();
22663
22663
 
22664
22664
  // ../protocol/src/persona-schemas.ts
22665
+ var PERSONA_SIZES = ["small", "medium", "large"];
22666
+ var PersonaSizeSchema = external_exports.enum(PERSONA_SIZES);
22665
22667
  var PersonaFileSchema = external_exports.object({
22666
22668
  personaId: external_exports.string(),
22667
22669
  label: external_exports.string(),
@@ -22680,7 +22682,8 @@ var PersonaFileSchema = external_exports.object({
22680
22682
  /**
22681
22683
  * 云上任务 Pod 的规格档(design 2026-09-18-persona-size):`small` / `medium` / `large`,没写按 medium。
22682
22684
  * 只有发布上云的流水线读它(cloud-host/pipeline/deploy-file.mjs 收窄值域,不认识的拒发);本机跑不看。
22683
- * 协议层同 model / effort 保持 string;现在没有设置页入口,persona.json 手写。
22685
+ * 协议层同 model / effort 保持 string(文件层向前兼容);改它的入口是上云页标题行的规格下拉
22686
+ * (design 2026-09-20-persona-size-ui),`persona:update` 那头按 PersonaSizeSchema 收窄。
22684
22687
  */
22685
22688
  size: external_exports.string().optional(),
22686
22689
  createdAt: external_exports.number(),
@@ -22794,6 +22797,8 @@ var PersonaUpdateArgsSchema = external_exports.object({
22794
22797
  model: external_exports.string().optional(),
22795
22798
  effort: external_exports.string().optional(),
22796
22799
  tool: external_exports.string().optional(),
22800
+ // 云上任务 Pod 的规格档:只收三档之一(PersonaFile 层是 string,边界在这里收窄)
22801
+ size: PersonaSizeSchema.optional(),
22797
22802
  personality: external_exports.string().optional(),
22798
22803
  // 人格补充层正文(见 PersonaInfoResponseSchema.personalityLocal)。与 personality 各写
22799
22804
  // 各层、互不影响;'' = 清空补充层。预装 persona 的编辑入口写的就是这个字段。
@@ -24524,6 +24529,10 @@ var INNER_TAG_NAMES = "clawd-dispatch-task|clawd-dispatch-result|brief|detail|fi
24524
24529
  var INNER_TAG_ESCAPE_RE = new RegExp(`<(\\\\*)(/?)(${INNER_TAG_NAMES})\\b`, "g");
24525
24530
  var INNER_TAG_UNESCAPE_RE = new RegExp(`<\\\\(\\\\*)(/?)(${INNER_TAG_NAMES})\\b`, "g");
24526
24531
 
24532
+ // ../protocol/src/tool-family.ts
24533
+ var CLOUD_TOOL_SUFFIX = "-cloud";
24534
+ var CODEX_CLOUD_TOOL_ID = `codex${CLOUD_TOOL_SUFFIX}`;
24535
+
24527
24536
  // src/tools/claude-history.ts
24528
24537
  var import_node_crypto = __toESM(require("crypto"), 1);
24529
24538
  var import_node_fs = __toESM(require("fs"), 1);
@@ -22848,6 +22848,8 @@ var EngineConnectPoolResponseSchema = external_exports.object({
22848
22848
  }).strict();
22849
22849
 
22850
22850
  // ../protocol/src/persona-schemas.ts
22851
+ var PERSONA_SIZES = ["small", "medium", "large"];
22852
+ var PersonaSizeSchema = external_exports.enum(PERSONA_SIZES);
22851
22853
  var PersonaFileSchema = external_exports.object({
22852
22854
  personaId: external_exports.string(),
22853
22855
  label: external_exports.string(),
@@ -22866,7 +22868,8 @@ var PersonaFileSchema = external_exports.object({
22866
22868
  /**
22867
22869
  * 云上任务 Pod 的规格档(design 2026-09-18-persona-size):`small` / `medium` / `large`,没写按 medium。
22868
22870
  * 只有发布上云的流水线读它(cloud-host/pipeline/deploy-file.mjs 收窄值域,不认识的拒发);本机跑不看。
22869
- * 协议层同 model / effort 保持 string;现在没有设置页入口,persona.json 手写。
22871
+ * 协议层同 model / effort 保持 string(文件层向前兼容);改它的入口是上云页标题行的规格下拉
22872
+ * (design 2026-09-20-persona-size-ui),`persona:update` 那头按 PersonaSizeSchema 收窄。
22870
22873
  */
22871
22874
  size: external_exports.string().optional(),
22872
22875
  createdAt: external_exports.number(),
@@ -22980,6 +22983,8 @@ var PersonaUpdateArgsSchema = external_exports.object({
22980
22983
  model: external_exports.string().optional(),
22981
22984
  effort: external_exports.string().optional(),
22982
22985
  tool: external_exports.string().optional(),
22986
+ // 云上任务 Pod 的规格档:只收三档之一(PersonaFile 层是 string,边界在这里收窄)
22987
+ size: PersonaSizeSchema.optional(),
22983
22988
  personality: external_exports.string().optional(),
22984
22989
  // 人格补充层正文(见 PersonaInfoResponseSchema.personalityLocal)。与 personality 各写
22985
22990
  // 各层、互不影响;'' = 清空补充层。预装 persona 的编辑入口写的就是这个字段。
@@ -24710,6 +24715,10 @@ var INNER_TAG_NAMES = "clawd-dispatch-task|clawd-dispatch-result|brief|detail|fi
24710
24715
  var INNER_TAG_ESCAPE_RE = new RegExp(`<(\\\\*)(/?)(${INNER_TAG_NAMES})\\b`, "g");
24711
24716
  var INNER_TAG_UNESCAPE_RE = new RegExp(`<\\\\(\\\\*)(/?)(${INNER_TAG_NAMES})\\b`, "g");
24712
24717
 
24718
+ // ../protocol/src/tool-family.ts
24719
+ var CLOUD_TOOL_SUFFIX = "-cloud";
24720
+ var CODEX_CLOUD_TOOL_ID = `codex${CLOUD_TOOL_SUFFIX}`;
24721
+
24713
24722
  // src/deploy/deploy-file.ts
24714
24723
  var import_promises = __toESM(require("fs/promises"), 1);
24715
24724
  var import_node_path3 = __toESM(require("path"), 1);
@@ -24871,7 +24880,7 @@ var L = [
24871
24880
  " rm -rf persona/.git",
24872
24881
  " node clawos/cloud-host/provision/build-image.mjs \\",
24873
24882
  " --manifest persona/.clawd/deploy.json \\",
24874
- ' --from "$REGISTRY/$IMAGE_NAME:base" \\',
24883
+ ' --from "$REGISTRY/$IMAGE_NAME:base-${{ steps.plan.outputs.engine }}" \\',
24875
24884
  " --persona-dir persona \\",
24876
24885
  // persona 在镜像里落 /clawd/personas/<id>/(与本机同构),id 是 gateway 登记的名字;同 smoke / register 用的那个输出
24877
24886
  " --persona-id '${{ steps.plan.outputs.persona_id }}' \\",
@@ -24923,6 +24932,7 @@ var L = [
24923
24932
  " --model '${{ steps.plan.outputs.model }}' \\",
24924
24933
  " --effort '${{ steps.plan.outputs.effort }}' \\",
24925
24934
  " --size '${{ steps.plan.outputs.size }}' \\",
24935
+ " --engine '${{ steps.plan.outputs.engine }}' \\",
24926
24936
  " --connectors '${{ steps.plan.outputs.connectors }}' \\",
24927
24937
  " --run-number '${{ github.run_number }}'",
24928
24938
  "",
@@ -24947,6 +24957,7 @@ var L = [
24947
24957
  " --model '${{ steps.plan.outputs.model }}' \\",
24948
24958
  " --effort '${{ steps.plan.outputs.effort }}' \\",
24949
24959
  " --size '${{ steps.plan.outputs.size }}' \\",
24960
+ " --engine '${{ steps.plan.outputs.engine }}' \\",
24950
24961
  " --connectors '${{ steps.plan.outputs.connectors }}'",
24951
24962
  ""
24952
24963
  ];
@@ -22848,6 +22848,8 @@ var EngineConnectPoolResponseSchema = external_exports.object({
22848
22848
  }).strict();
22849
22849
 
22850
22850
  // ../protocol/src/persona-schemas.ts
22851
+ var PERSONA_SIZES = ["small", "medium", "large"];
22852
+ var PersonaSizeSchema = external_exports.enum(PERSONA_SIZES);
22851
22853
  var PersonaFileSchema = external_exports.object({
22852
22854
  personaId: external_exports.string(),
22853
22855
  label: external_exports.string(),
@@ -22866,7 +22868,8 @@ var PersonaFileSchema = external_exports.object({
22866
22868
  /**
22867
22869
  * 云上任务 Pod 的规格档(design 2026-09-18-persona-size):`small` / `medium` / `large`,没写按 medium。
22868
22870
  * 只有发布上云的流水线读它(cloud-host/pipeline/deploy-file.mjs 收窄值域,不认识的拒发);本机跑不看。
22869
- * 协议层同 model / effort 保持 string;现在没有设置页入口,persona.json 手写。
22871
+ * 协议层同 model / effort 保持 string(文件层向前兼容);改它的入口是上云页标题行的规格下拉
22872
+ * (design 2026-09-20-persona-size-ui),`persona:update` 那头按 PersonaSizeSchema 收窄。
22870
22873
  */
22871
22874
  size: external_exports.string().optional(),
22872
22875
  createdAt: external_exports.number(),
@@ -22980,6 +22983,8 @@ var PersonaUpdateArgsSchema = external_exports.object({
22980
22983
  model: external_exports.string().optional(),
22981
22984
  effort: external_exports.string().optional(),
22982
22985
  tool: external_exports.string().optional(),
22986
+ // 云上任务 Pod 的规格档:只收三档之一(PersonaFile 层是 string,边界在这里收窄)
22987
+ size: PersonaSizeSchema.optional(),
22983
22988
  personality: external_exports.string().optional(),
22984
22989
  // 人格补充层正文(见 PersonaInfoResponseSchema.personalityLocal)。与 personality 各写
22985
22990
  // 各层、互不影响;'' = 清空补充层。预装 persona 的编辑入口写的就是这个字段。
@@ -24710,6 +24715,10 @@ var INNER_TAG_NAMES = "clawd-dispatch-task|clawd-dispatch-result|brief|detail|fi
24710
24715
  var INNER_TAG_ESCAPE_RE = new RegExp(`<(\\\\*)(/?)(${INNER_TAG_NAMES})\\b`, "g");
24711
24716
  var INNER_TAG_UNESCAPE_RE = new RegExp(`<\\\\(\\\\*)(/?)(${INNER_TAG_NAMES})\\b`, "g");
24712
24717
 
24718
+ // ../protocol/src/tool-family.ts
24719
+ var CLOUD_TOOL_SUFFIX = "-cloud";
24720
+ var CODEX_CLOUD_TOOL_ID = `codex${CLOUD_TOOL_SUFFIX}`;
24721
+
24713
24722
  // src/deploy/deploy-file.ts
24714
24723
  var import_promises = __toESM(require("fs/promises"), 1);
24715
24724
  var import_node_path3 = __toESM(require("path"), 1);
@@ -24871,7 +24880,7 @@ var L = [
24871
24880
  " rm -rf persona/.git",
24872
24881
  " node clawos/cloud-host/provision/build-image.mjs \\",
24873
24882
  " --manifest persona/.clawd/deploy.json \\",
24874
- ' --from "$REGISTRY/$IMAGE_NAME:base" \\',
24883
+ ' --from "$REGISTRY/$IMAGE_NAME:base-${{ steps.plan.outputs.engine }}" \\',
24875
24884
  " --persona-dir persona \\",
24876
24885
  // persona 在镜像里落 /clawd/personas/<id>/(与本机同构),id 是 gateway 登记的名字;同 smoke / register 用的那个输出
24877
24886
  " --persona-id '${{ steps.plan.outputs.persona_id }}' \\",
@@ -24923,6 +24932,7 @@ var L = [
24923
24932
  " --model '${{ steps.plan.outputs.model }}' \\",
24924
24933
  " --effort '${{ steps.plan.outputs.effort }}' \\",
24925
24934
  " --size '${{ steps.plan.outputs.size }}' \\",
24935
+ " --engine '${{ steps.plan.outputs.engine }}' \\",
24926
24936
  " --connectors '${{ steps.plan.outputs.connectors }}' \\",
24927
24937
  " --run-number '${{ github.run_number }}'",
24928
24938
  "",
@@ -24947,6 +24957,7 @@ var L = [
24947
24957
  " --model '${{ steps.plan.outputs.model }}' \\",
24948
24958
  " --effort '${{ steps.plan.outputs.effort }}' \\",
24949
24959
  " --size '${{ steps.plan.outputs.size }}' \\",
24960
+ " --engine '${{ steps.plan.outputs.engine }}' \\",
24950
24961
  " --connectors '${{ steps.plan.outputs.connectors }}'",
24951
24962
  ""
24952
24963
  ];