@clawos-dev/clawd 0.2.666 → 0.2.668

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.
@@ -31386,6 +31386,14 @@ var VerificationSchema = external_exports.object({
31386
31386
  verifiedAt: external_exports.string().refine((s) => Number.isFinite(Date.parse(s))),
31387
31387
  test: PublisherTestReceiptSchema.optional()
31388
31388
  }).strict();
31389
+ var DeployConfigSchema = external_exports.object({
31390
+ engine: external_exports.string().min(1),
31391
+ model: external_exports.string(),
31392
+ effort: external_exports.string(),
31393
+ size: external_exports.string().min(1),
31394
+ cpu: external_exports.number().positive(),
31395
+ taskConcurrency: external_exports.number().int().positive()
31396
+ }).strict();
31389
31397
  var VerifiedPersonaReleaseSchema = external_exports.object({
31390
31398
  version: external_exports.literal(1),
31391
31399
  environment: external_exports.literal("integration"),
@@ -31395,6 +31403,7 @@ var VerifiedPersonaReleaseSchema = external_exports.object({
31395
31403
  baseImage: ImageDigestSchema,
31396
31404
  pipelineCommit: SourceCommitSchema,
31397
31405
  repository: external_exports.string().regex(/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/),
31406
+ config: DeployConfigSchema.optional(),
31398
31407
  verification: VerificationSchema.refine((v) => v.checks.includes("persona-smoke")),
31399
31408
  test: PublisherTestSchema.optional()
31400
31409
  }).strict().refine((record2) => {
@@ -31411,6 +31420,160 @@ var VerifiedBaseReleaseSchema = external_exports.object({
31411
31420
  verification: VerificationSchema.refine((v) => v.checks.includes("base-smoke"))
31412
31421
  }).strict();
31413
31422
 
31423
+ // ../protocol/src/tool-family.ts
31424
+ var CLOUD_TOOL_SUFFIX = "-cloud";
31425
+ var CODEX_CLOUD_TOOL_ID = `codex${CLOUD_TOOL_SUFFIX}`;
31426
+ var CODEX_SERVICE_TIERS = { standard: "default", fast: "priority" };
31427
+ var CLAUDE_CLOUD_TOOL_ID = `claude${CLOUD_TOOL_SUFFIX}`;
31428
+ var PI_TOOL_ID = "pi";
31429
+ var PI_CLOUD_TOOL_ID = `${PI_TOOL_ID}${CLOUD_TOOL_SUFFIX}`;
31430
+
31431
+ // ../protocol/src/persona-schemas.ts
31432
+ var CodexServiceTierSchema = external_exports.enum([CODEX_SERVICE_TIERS.standard, CODEX_SERVICE_TIERS.fast]);
31433
+ var PERSONA_SIZES = ["tiny", "small", "medium", "large", "xlarge"];
31434
+ var PersonaSizeSchema = external_exports.enum(PERSONA_SIZES);
31435
+ var PERSONA_CPUS = [0.5, 1, 2];
31436
+ var PersonaCpuSchema = external_exports.number().refine((cpu) => PERSONA_CPUS.includes(cpu), "Unsupported CPU");
31437
+ var PersonaCloudEngineSchema = external_exports.object({
31438
+ model: external_exports.string().optional(),
31439
+ effort: external_exports.string().optional()
31440
+ }).strict();
31441
+ var PersonaFileSchema = external_exports.object({
31442
+ personaId: external_exports.string(),
31443
+ label: external_exports.string(),
31444
+ model: external_exports.string().optional(),
31445
+ // 与 model 平行的第二个 session 默认值:reasoning effort。值域跟着 tool 走
31446
+ // (claude 是 '' | low | medium | high | xhigh | max,codex 是 per-model 档位),
31447
+ // 协议层保持 string,由消费侧按 capabilities 收窄。
31448
+ effort: external_exports.string().optional(),
31449
+ serviceTier: CodexServiceTierSchema.optional(),
31450
+ public: external_exports.boolean(),
31451
+ // 8-key set defined UI-side in `lib/session-icons.ts`; protocol stays plain string
31452
+ // for forward compatibility, consumer fallbacks to default when key not found.
31453
+ iconKey: external_exports.string().optional(),
31454
+ // Default engine binding for new sessions; missing values are consumed as claude.
31455
+ tool: external_exports.string().optional(),
31456
+ /** Cloud resource size is string-compatible in stored files and narrowed at update/deploy boundaries; local execution ignores it. */
31457
+ size: external_exports.string().optional(),
31458
+ cpu: external_exports.number().finite().optional(),
31459
+ /** Cloud task-Pod concurrency, validated at release. Local execution ignores it; changes apply on the next publication. */
31460
+ taskConcurrency: external_exports.number().int().positive().optional(),
31461
+ cloudEngine: PersonaCloudEngineSchema.optional(),
31462
+ createdAt: external_exports.number(),
31463
+ updatedAt: external_exports.number(),
31464
+ /** Registry-only cloud entry, with no local persona directory. Local key adds -cloud; gateway paths use cloud.personaId and the registered engine determines the cloud tool id. */
31465
+ cloud: external_exports.object({
31466
+ gatewayUrl: external_exports.string().min(1),
31467
+ personaId: external_exports.string().min(1),
31468
+ publishedByMe: external_exports.boolean().optional(),
31469
+ environment: DeployEnvironmentSchema.optional(),
31470
+ expectedImage: ImageDigestSchema.optional(),
31471
+ testReleaseId: external_exports.string().optional()
31472
+ }).strict().optional()
31473
+ }).strict();
31474
+ var PersonaSkillSummarySchema = external_exports.object({
31475
+ // 目录名作为 skill name(对齐 CC:frontmatter `name:` 仅作 displayName 用)
31476
+ name: external_exports.string().min(1),
31477
+ description: external_exports.string().optional()
31478
+ });
31479
+ var PersonaPluginSummarySchema = external_exports.object({
31480
+ id: external_exports.string().min(1)
31481
+ });
31482
+ var CodexSandboxSettingsSchema = external_exports.object({
31483
+ // 额外可写的绝对路径或 ~ 路径(pnpm 工具链等);workspace(cwd) 和 userWorkDir 由 daemon 自动加,不用列。
31484
+ writableRoots: external_exports.array(external_exports.string()).optional(),
31485
+ // 禁读 glob(相对 workspace root 或绝对),如 ".secrets/**"、"**/*.env"。
31486
+ denyRead: external_exports.array(external_exports.string()).optional(),
31487
+ // true → 网络全放(*);false / 缺省 → 断网(fail-closed)。**「新建默认联网」不靠这里的缺省**,
31488
+ // 靠 persona 创建时就把 CODEX_SANDBOX_DEFAULT 物化进文件(见 PersonaManager.create)——
31489
+ // 缺省只在文件损坏这种异常路径上出现,那时断网是更安全的一侧。
31490
+ network: external_exports.boolean().optional()
31491
+ }).strict();
31492
+ var PersonaSandboxSettingsSchema = external_exports.object({
31493
+ permissions: external_exports.object({
31494
+ defaultMode: external_exports.string().optional(),
31495
+ allow: external_exports.array(external_exports.string()).optional(),
31496
+ // deny 优先级最高;强制底座(persona 私密区)由 daemon compose 强制 union,owner 删不掉。
31497
+ deny: external_exports.array(external_exports.string()).optional()
31498
+ }).optional(),
31499
+ sandbox: external_exports.object({
31500
+ enabled: external_exports.boolean().optional(),
31501
+ autoAllowBashIfSandboxed: external_exports.boolean().optional(),
31502
+ allowUnsandboxedCommands: external_exports.boolean().optional(),
31503
+ // 命令前缀白名单(CC `sandbox.excludedCommands`):匹配的命令在沙箱外运行,
31504
+ // 用于需逃出沙箱的工具(如 'docker *' / 'aliyun *' 要访问宿主 socket / 凭证)。
31505
+ excludedCommands: external_exports.array(external_exports.string()).optional(),
31506
+ filesystem: external_exports.object({
31507
+ denyRead: external_exports.array(external_exports.string()).optional(),
31508
+ allowRead: external_exports.array(external_exports.string()).optional(),
31509
+ denyWrite: external_exports.array(external_exports.string()).optional(),
31510
+ allowWrite: external_exports.array(external_exports.string()).optional()
31511
+ }).optional(),
31512
+ network: external_exports.object({
31513
+ allowedDomains: external_exports.array(external_exports.string()).optional(),
31514
+ allowLocalBinding: external_exports.boolean().optional()
31515
+ }).optional()
31516
+ }).optional()
31517
+ });
31518
+ var PersonaInfoResponseSchema = PersonaFileSchema.extend({
31519
+ // 人格 builtin 层:`<personaDir>/CLAUDE.md`(= AGENTS.md 镜像)。预装 persona 的这份是
31520
+ // daemon ship 的产品规格,每次 daemon 启动被覆盖回 bundle 版(personalityManaged 标记它)。
31521
+ personality: external_exports.string().optional(),
31522
+ // Owner-managed personality overlay survives daemon resource refreshes and is injected for owner and guest sessions. Empty text clears it.
31523
+ personalityLocal: external_exports.string().optional(),
31524
+ // Managed builtin personality is refreshed by daemon and shown read-only; user edits belong to the overlay. User-created persona files remain editable.
31525
+ personalityManaged: external_exports.boolean().optional(),
31526
+ // 仅 'persona:get' 携带;null = 文件不存在 / parse 失败;undefined = 不在该响应类型上
31527
+ skills: external_exports.array(PersonaSkillSummarySchema).optional(),
31528
+ // 仅 'persona:get' 携带;空数组 = 没启用任何插件 / settings.json 不存在;undefined = 不在该响应类型上
31529
+ plugins: external_exports.array(PersonaPluginSummarySchema).optional(),
31530
+ sandboxSettings: PersonaSandboxSettingsSchema.nullable().optional(),
31531
+ // 仅 'persona:get' 携带;null = codex-sandbox.json 不存在 / parse 失败。
31532
+ // UI 的「访客联网」开关读它(见 PersonaCardSettings)。
31533
+ codexSandbox: CodexSandboxSettingsSchema.nullable().optional()
31534
+ });
31535
+ var PersonaCreateArgsSchema = external_exports.object({
31536
+ // Caller provides a safe slug, daemon adds persona-. Keep identity separate from the freely editable display label.
31537
+ slug: external_exports.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/).max(32),
31538
+ label: external_exports.string().min(1),
31539
+ personality: external_exports.string(),
31540
+ model: external_exports.string().optional(),
31541
+ effort: external_exports.string().optional(),
31542
+ serviceTier: PersonaFileSchema.shape.serviceTier,
31543
+ tool: external_exports.string().optional(),
31544
+ public: external_exports.boolean().optional(),
31545
+ iconKey: external_exports.string().optional()
31546
+ }).strict();
31547
+ var PersonaIdArgsSchema = external_exports.object({
31548
+ personaId: external_exports.string().min(1)
31549
+ });
31550
+ var PersonaUpdateArgsSchema = external_exports.object({
31551
+ personaId: external_exports.string().min(1),
31552
+ patch: external_exports.object({
31553
+ label: external_exports.string().min(1).optional(),
31554
+ model: external_exports.string().optional(),
31555
+ effort: external_exports.string().optional(),
31556
+ serviceTier: PersonaFileSchema.shape.serviceTier,
31557
+ tool: external_exports.string().optional(),
31558
+ size: PersonaSizeSchema.optional(),
31559
+ cpu: PersonaCpuSchema.optional(),
31560
+ taskConcurrency: PersonaFileSchema.shape.taskConcurrency,
31561
+ // 整体替换(上云页每次交完整的 { model, effort });切 tool 不清它
31562
+ cloudEngine: PersonaCloudEngineSchema.optional(),
31563
+ personality: external_exports.string().optional(),
31564
+ // 人格补充层正文(见 PersonaInfoResponseSchema.personalityLocal)。与 personality 各写
31565
+ // 各层、互不影响;'' = 清空补充层。预装 persona 的编辑入口写的就是这个字段。
31566
+ personalityLocal: external_exports.string().optional(),
31567
+ public: external_exports.boolean().optional(),
31568
+ // pass `null` to clear; daemon strips the field from PersonaFile on null
31569
+ iconKey: external_exports.string().nullable().optional(),
31570
+ // codex guest 沙箱(落盘 .clawd/codex-sandbox.json,不在 PersonaFile 里)。与 personality
31571
+ // 同款分层写:handler 剥出来单独落盘,且**局部合并**——只带 network 的 patch 不能抹掉
31572
+ // owner 手配的 writableRoots / denyRead。
31573
+ codexSandbox: CodexSandboxSettingsSchema.optional()
31574
+ }).strict()
31575
+ }).strict();
31576
+
31414
31577
  // ../protocol/src/deploy-schemas.ts
31415
31578
  var DeployFileSchema = external_exports.object({
31416
31579
  version: external_exports.literal(1),
@@ -31452,6 +31615,12 @@ var DeployReleasedSchema = external_exports.object({
31452
31615
  runAttempt: external_exports.number().int().positive().optional(),
31453
31616
  artifactId: external_exports.number().int().positive().optional(),
31454
31617
  verified: VerifiedPersonaReleaseSchema.optional(),
31618
+ /** 这一轮测试用的配置(design 2026-10-14-deploy-config-decouple §3.1);老记录没有,按「发布时 commit 里的 persona.json」算 */
31619
+ config: DeployConfigSchema.optional(),
31620
+ /** 「应用配置」产生的记录:复用的是哪条测试发布的镜像(它的 id)。首次构建的记录没有 */
31621
+ reconfigOf: external_exports.string().min(1).optional(),
31622
+ /** 发布时写进仓库的 workflow 模板版本;缺 = 老模板(不认 config_json 输入,要先完整重发一次) */
31623
+ workflowVersion: external_exports.number().int().positive().optional(),
31455
31624
  confirmation: external_exports.object({
31456
31625
  fingerprint: external_exports.string().regex(/^[a-f0-9]{64}$/),
31457
31626
  runId: external_exports.number().int().positive(),
@@ -31621,6 +31790,7 @@ var DeployReleaseArgsSchema = DeployPersonaArgsSchema.extend({
31621
31790
  }).strict();
31622
31791
  var DeployConfirmTestArgsSchema = DeployPersonaArgsSchema.extend({ releaseId: external_exports.string().min(1) }).strict();
31623
31792
  var DeployPromoteArgsSchema = DeployConfirmTestArgsSchema;
31793
+ var DeployApplyConfigArgsSchema = DeployConfirmTestArgsSchema;
31624
31794
  var DeployOpenTestArgsSchema = DeployConfirmTestArgsSchema;
31625
31795
  var DeployEnvironmentArgsSchema = DeployPersonaArgsSchema.extend({ environment: DeployEnvironmentSchema.default("production") }).strict();
31626
31796
  var DeployConfirmTestResultSchema = external_exports.object({ confirmation: DeployReleasedSchema.shape.confirmation.unwrap() }).strict();
@@ -32670,160 +32840,6 @@ var DashboardOpenUrlResultSchema = external_exports.object({
32670
32840
  expiresAt: external_exports.number().int()
32671
32841
  }).strict();
32672
32842
 
32673
- // ../protocol/src/tool-family.ts
32674
- var CLOUD_TOOL_SUFFIX = "-cloud";
32675
- var CODEX_CLOUD_TOOL_ID = `codex${CLOUD_TOOL_SUFFIX}`;
32676
- var CODEX_SERVICE_TIERS = { standard: "default", fast: "priority" };
32677
- var CLAUDE_CLOUD_TOOL_ID = `claude${CLOUD_TOOL_SUFFIX}`;
32678
- var PI_TOOL_ID = "pi";
32679
- var PI_CLOUD_TOOL_ID = `${PI_TOOL_ID}${CLOUD_TOOL_SUFFIX}`;
32680
-
32681
- // ../protocol/src/persona-schemas.ts
32682
- var CodexServiceTierSchema = external_exports.enum([CODEX_SERVICE_TIERS.standard, CODEX_SERVICE_TIERS.fast]);
32683
- var PERSONA_SIZES = ["tiny", "small", "medium", "large", "xlarge"];
32684
- var PersonaSizeSchema = external_exports.enum(PERSONA_SIZES);
32685
- var PERSONA_CPUS = [0.5, 1, 2];
32686
- var PersonaCpuSchema = external_exports.number().refine((cpu) => PERSONA_CPUS.includes(cpu), "Unsupported CPU");
32687
- var PersonaCloudEngineSchema = external_exports.object({
32688
- model: external_exports.string().optional(),
32689
- effort: external_exports.string().optional()
32690
- }).strict();
32691
- var PersonaFileSchema = external_exports.object({
32692
- personaId: external_exports.string(),
32693
- label: external_exports.string(),
32694
- model: external_exports.string().optional(),
32695
- // 与 model 平行的第二个 session 默认值:reasoning effort。值域跟着 tool 走
32696
- // (claude 是 '' | low | medium | high | xhigh | max,codex 是 per-model 档位),
32697
- // 协议层保持 string,由消费侧按 capabilities 收窄。
32698
- effort: external_exports.string().optional(),
32699
- serviceTier: CodexServiceTierSchema.optional(),
32700
- public: external_exports.boolean(),
32701
- // 8-key set defined UI-side in `lib/session-icons.ts`; protocol stays plain string
32702
- // for forward compatibility, consumer fallbacks to default when key not found.
32703
- iconKey: external_exports.string().optional(),
32704
- // Default engine binding for new sessions; missing values are consumed as claude.
32705
- tool: external_exports.string().optional(),
32706
- /** Cloud resource size is string-compatible in stored files and narrowed at update/deploy boundaries; local execution ignores it. */
32707
- size: external_exports.string().optional(),
32708
- cpu: external_exports.number().finite().optional(),
32709
- /** Cloud task-Pod concurrency, validated at release. Local execution ignores it; changes apply on the next publication. */
32710
- taskConcurrency: external_exports.number().int().positive().optional(),
32711
- cloudEngine: PersonaCloudEngineSchema.optional(),
32712
- createdAt: external_exports.number(),
32713
- updatedAt: external_exports.number(),
32714
- /** Registry-only cloud entry, with no local persona directory. Local key adds -cloud; gateway paths use cloud.personaId and the registered engine determines the cloud tool id. */
32715
- cloud: external_exports.object({
32716
- gatewayUrl: external_exports.string().min(1),
32717
- personaId: external_exports.string().min(1),
32718
- publishedByMe: external_exports.boolean().optional(),
32719
- environment: DeployEnvironmentSchema.optional(),
32720
- expectedImage: ImageDigestSchema.optional(),
32721
- testReleaseId: external_exports.string().optional()
32722
- }).strict().optional()
32723
- }).strict();
32724
- var PersonaSkillSummarySchema = external_exports.object({
32725
- // 目录名作为 skill name(对齐 CC:frontmatter `name:` 仅作 displayName 用)
32726
- name: external_exports.string().min(1),
32727
- description: external_exports.string().optional()
32728
- });
32729
- var PersonaPluginSummarySchema = external_exports.object({
32730
- id: external_exports.string().min(1)
32731
- });
32732
- var CodexSandboxSettingsSchema = external_exports.object({
32733
- // 额外可写的绝对路径或 ~ 路径(pnpm 工具链等);workspace(cwd) 和 userWorkDir 由 daemon 自动加,不用列。
32734
- writableRoots: external_exports.array(external_exports.string()).optional(),
32735
- // 禁读 glob(相对 workspace root 或绝对),如 ".secrets/**"、"**/*.env"。
32736
- denyRead: external_exports.array(external_exports.string()).optional(),
32737
- // true → 网络全放(*);false / 缺省 → 断网(fail-closed)。**「新建默认联网」不靠这里的缺省**,
32738
- // 靠 persona 创建时就把 CODEX_SANDBOX_DEFAULT 物化进文件(见 PersonaManager.create)——
32739
- // 缺省只在文件损坏这种异常路径上出现,那时断网是更安全的一侧。
32740
- network: external_exports.boolean().optional()
32741
- }).strict();
32742
- var PersonaSandboxSettingsSchema = external_exports.object({
32743
- permissions: external_exports.object({
32744
- defaultMode: external_exports.string().optional(),
32745
- allow: external_exports.array(external_exports.string()).optional(),
32746
- // deny 优先级最高;强制底座(persona 私密区)由 daemon compose 强制 union,owner 删不掉。
32747
- deny: external_exports.array(external_exports.string()).optional()
32748
- }).optional(),
32749
- sandbox: external_exports.object({
32750
- enabled: external_exports.boolean().optional(),
32751
- autoAllowBashIfSandboxed: external_exports.boolean().optional(),
32752
- allowUnsandboxedCommands: external_exports.boolean().optional(),
32753
- // 命令前缀白名单(CC `sandbox.excludedCommands`):匹配的命令在沙箱外运行,
32754
- // 用于需逃出沙箱的工具(如 'docker *' / 'aliyun *' 要访问宿主 socket / 凭证)。
32755
- excludedCommands: external_exports.array(external_exports.string()).optional(),
32756
- filesystem: external_exports.object({
32757
- denyRead: external_exports.array(external_exports.string()).optional(),
32758
- allowRead: external_exports.array(external_exports.string()).optional(),
32759
- denyWrite: external_exports.array(external_exports.string()).optional(),
32760
- allowWrite: external_exports.array(external_exports.string()).optional()
32761
- }).optional(),
32762
- network: external_exports.object({
32763
- allowedDomains: external_exports.array(external_exports.string()).optional(),
32764
- allowLocalBinding: external_exports.boolean().optional()
32765
- }).optional()
32766
- }).optional()
32767
- });
32768
- var PersonaInfoResponseSchema = PersonaFileSchema.extend({
32769
- // 人格 builtin 层:`<personaDir>/CLAUDE.md`(= AGENTS.md 镜像)。预装 persona 的这份是
32770
- // daemon ship 的产品规格,每次 daemon 启动被覆盖回 bundle 版(personalityManaged 标记它)。
32771
- personality: external_exports.string().optional(),
32772
- // Owner-managed personality overlay survives daemon resource refreshes and is injected for owner and guest sessions. Empty text clears it.
32773
- personalityLocal: external_exports.string().optional(),
32774
- // Managed builtin personality is refreshed by daemon and shown read-only; user edits belong to the overlay. User-created persona files remain editable.
32775
- personalityManaged: external_exports.boolean().optional(),
32776
- // 仅 'persona:get' 携带;null = 文件不存在 / parse 失败;undefined = 不在该响应类型上
32777
- skills: external_exports.array(PersonaSkillSummarySchema).optional(),
32778
- // 仅 'persona:get' 携带;空数组 = 没启用任何插件 / settings.json 不存在;undefined = 不在该响应类型上
32779
- plugins: external_exports.array(PersonaPluginSummarySchema).optional(),
32780
- sandboxSettings: PersonaSandboxSettingsSchema.nullable().optional(),
32781
- // 仅 'persona:get' 携带;null = codex-sandbox.json 不存在 / parse 失败。
32782
- // UI 的「访客联网」开关读它(见 PersonaCardSettings)。
32783
- codexSandbox: CodexSandboxSettingsSchema.nullable().optional()
32784
- });
32785
- var PersonaCreateArgsSchema = external_exports.object({
32786
- // Caller provides a safe slug, daemon adds persona-. Keep identity separate from the freely editable display label.
32787
- slug: external_exports.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/).max(32),
32788
- label: external_exports.string().min(1),
32789
- personality: external_exports.string(),
32790
- model: external_exports.string().optional(),
32791
- effort: external_exports.string().optional(),
32792
- serviceTier: PersonaFileSchema.shape.serviceTier,
32793
- tool: external_exports.string().optional(),
32794
- public: external_exports.boolean().optional(),
32795
- iconKey: external_exports.string().optional()
32796
- }).strict();
32797
- var PersonaIdArgsSchema = external_exports.object({
32798
- personaId: external_exports.string().min(1)
32799
- });
32800
- var PersonaUpdateArgsSchema = external_exports.object({
32801
- personaId: external_exports.string().min(1),
32802
- patch: external_exports.object({
32803
- label: external_exports.string().min(1).optional(),
32804
- model: external_exports.string().optional(),
32805
- effort: external_exports.string().optional(),
32806
- serviceTier: PersonaFileSchema.shape.serviceTier,
32807
- tool: external_exports.string().optional(),
32808
- size: PersonaSizeSchema.optional(),
32809
- cpu: PersonaCpuSchema.optional(),
32810
- taskConcurrency: PersonaFileSchema.shape.taskConcurrency,
32811
- // 整体替换(上云页每次交完整的 { model, effort });切 tool 不清它
32812
- cloudEngine: PersonaCloudEngineSchema.optional(),
32813
- personality: external_exports.string().optional(),
32814
- // 人格补充层正文(见 PersonaInfoResponseSchema.personalityLocal)。与 personality 各写
32815
- // 各层、互不影响;'' = 清空补充层。预装 persona 的编辑入口写的就是这个字段。
32816
- personalityLocal: external_exports.string().optional(),
32817
- public: external_exports.boolean().optional(),
32818
- // pass `null` to clear; daemon strips the field from PersonaFile on null
32819
- iconKey: external_exports.string().nullable().optional(),
32820
- // codex guest 沙箱(落盘 .clawd/codex-sandbox.json,不在 PersonaFile 里)。与 personality
32821
- // 同款分层写:handler 剥出来单独落盘,且**局部合并**——只带 network 的 patch 不能抹掉
32822
- // owner 手配的 writableRoots / denyRead。
32823
- codexSandbox: CodexSandboxSettingsSchema.optional()
32824
- }).strict()
32825
- }).strict();
32826
-
32827
32843
  // ../protocol/src/events.ts
32828
32844
  var SESSION_STATUS_VALUES = [
32829
32845
  "idle",
@@ -33882,6 +33898,10 @@ var METHOD_DOCS = {
33882
33898
  summary: "\u786E\u8BA4\u6240\u9009\u6D4B\u8BD5\u7248\u901A\u8FC7\u5B9E\u9645\u8BD5\u7528\uFF1B\u6309\u5DF2\u4FDD\u5B58\u5236\u54C1\u548C\u6D4B\u8BD5\u767B\u8BB0\u6821\u9A8C\uFF0Cowner-only\u3001human-only",
33883
33899
  args: DeployConfirmTestArgsSchema
33884
33900
  },
33901
+ "deploy:applyConfig": {
33902
+ summary: "\u628A releaseId \u90A3\u6761\u6D4B\u8BD5\u53D1\u5E03\u7684**\u955C\u50CF**\u6362\u4E0A persona \u5F53\u524D\u7684\u5F15\u64CE / \u6A21\u578B / \u8D44\u6E90\u914D\u7F6E\uFF0C\u5728\u6D4B\u8BD5\u73AF\u5883\u91CD\u6D4B\u4E00\u904D\uFF1A\u4E0D\u626B\u63CF\u3001\u4E0D\u6784\u5EFA\uFF0C\u6D41\u6C34\u7EBF\u8D70 smoke \u2192 \u767B\u8BB0 \u2192 \u9A8C\u8BC1\u3002\u524D\u7F6E\uFF1A\u90A3\u6761\u53D1\u5E03\u5DF2\u63A8\u9001\u5E76\u901A\u8FC7\u9A8C\u8BC1\uFF0C\u4E14\u4ED3\u5E93\u91CC\u7684 workflow \u6A21\u677F\u591F\u65B0\uFF08\u7F3A config_json \u8F93\u5165\u7684\u8981\u5148\u300C\u53D1\u5E03\u5230\u6D4B\u8BD5\u300D\u5B8C\u6574\u91CD\u53D1\u4E00\u6B21\uFF09\uFF1B\u8FC7\u4E0E\u53D1\u5E03\u540C\u4E00\u5957\u95F8\uFF08\u9009\u4E86\u6A21\u578B\u3001\u8BA2\u9605\u51ED\u636E\u6210\u5BF9\u7B49\uFF09\u3002\u56DE\u65B0\u6D4B\u8BD5\u53D1\u5E03\u7684 commit \u4E0E Actions \u5730\u5740\uFF1B\u4E4B\u540E\u8D70\u5E38\u89C4\u7684\u6D4B\u8BD5\u786E\u8BA4 / \u664B\u7EA7\uFF1Bowner-only\u3001human-only",
33903
+ args: DeployApplyConfigArgsSchema
33904
+ },
33885
33905
  "deploy:promote": {
33886
33906
  summary: "\u5C06\u5DF2\u786E\u8BA4\u6D4B\u8BD5\u7248\u7684\u63D0\u4EA4\u63A8\u8FDB main \u5E76\u4E0A\u7EBF\u76F8\u540C\u955C\u50CF\uFF1B\u6062\u590D\u4E2D\u65AD\u7684\u540C\u4E00\u6B21\u664B\u7EA7\uFF0Cowner-only\u3001human-only",
33887
33907
  args: DeployPromoteArgsSchema
@@ -34536,6 +34556,7 @@ function renderDeployWorkflow(config2) {
34536
34556
  " - name: Select pinned source identities",
34537
34557
  " env:",
34538
34558
  " RELEASE_JSON: ${{ inputs.release_json }}",
34559
+ " CONFIG_JSON: ${{ inputs.config_json }}",
34539
34560
  " run: |",
34540
34561
  " node --input-type=module <<'NODE'",
34541
34562
  ' import fs from "node:fs"',
@@ -34543,7 +34564,9 @@ function renderDeployWorkflow(config2) {
34543
34564
  ' const r = fs.existsSync(file) ? JSON.parse(fs.readFileSync(file, "utf8")) : process.env.RELEASE_JSON ? JSON.parse(process.env.RELEASE_JSON) : undefined',
34544
34565
  ' if (r && (!/^[a-f0-9]{40}$/.test(r.commit) || !/^[a-f0-9]{40}$/.test(r.pipelineCommit) || r.repository !== process.env.GITHUB_REPOSITORY)) throw new Error("invalid Persona release identity")',
34545
34566
  ' if (process.env.DEPLOY_ENVIRONMENT === "production" && (!r || process.env.GITHUB_REF_NAME !== "main" || process.env.GITHUB_SHA !== r.commit)) throw new Error("production main must equal tested commit")',
34546
- ' fs.appendFileSync(process.env.GITHUB_ENV, "SOURCE_COMMIT=" + (r?.commit ?? process.env.GITHUB_SHA) + "\\nPIPELINE_COMMIT=" + (r?.pipelineCommit ?? process.env.CLAWOS_REF) + "\\n")',
34567
+ " // \u5E94\u7528\u914D\u7F6E\uFF08integration + config_json + release_json\uFF0C\u4E14\u8FD8\u6CA1\u6709\u5019\u9009\u6587\u4EF6\uFF09\u8981\u6362\u4E0A\u5F53\u524D\u6D41\u6C34\u7EBF\uFF1A\u8BB0\u5F55\u91CC\u9489\u7684\u65E7\u811A\u672C\u4E0D\u8BA4\u8BC6 config_json",
34568
+ ' const reconfigure = process.env.DEPLOY_ENVIRONMENT === "integration" && process.env.CONFIG_JSON && !fs.existsSync(file)',
34569
+ ' fs.appendFileSync(process.env.GITHUB_ENV, "SOURCE_COMMIT=" + (r?.commit ?? process.env.GITHUB_SHA) + "\\nPIPELINE_COMMIT=" + (reconfigure ? process.env.CLAWOS_REF : r?.pipelineCommit ?? process.env.CLAWOS_REF) + "\\n")',
34547
34570
  " NODE",
34548
34571
  ""
34549
34572
  ];
@@ -34570,6 +34593,8 @@ function renderDeployWorkflow(config2) {
34570
34593
  "",
34571
34594
  " - name: \u8BFB\u90E8\u7F72\u6587\u4EF6",
34572
34595
  " id: plan",
34596
+ " env:",
34597
+ " CLAWD_CONFIG_JSON: ${{ inputs.config_json }}",
34573
34598
  " run: |",
34574
34599
  " node clawos/cloud-host/pipeline/deploy-file.mjs \\",
34575
34600
  " --persona-dir persona \\",
@@ -34634,6 +34659,7 @@ function renderDeployWorkflow(config2) {
34634
34659
  " --effort '${{ steps.plan.outputs.effort }}' \\",
34635
34660
  " --size '${{ steps.plan.outputs.size }}' \\",
34636
34661
  " --cpu '${{ steps.plan.outputs.cpu }}' \\",
34662
+ " --config-source '${{ steps.plan.outputs.config_source }}' \\",
34637
34663
  " --task-concurrency '${{ steps.plan.outputs.task_concurrency }}' \\",
34638
34664
  " --engine '${{ steps.plan.outputs.engine }}' \\",
34639
34665
  " --connectors '${{ steps.plan.outputs.connectors }}' \\",
@@ -34649,7 +34675,7 @@ function renderDeployWorkflow(config2) {
34649
34675
  ];
34650
34676
  return [
34651
34677
  "name: clawd deploy",
34652
- "run-name: ${{ inputs.environment == 'production' && format('persona-production-{0}', inputs.promotion_id) || 'persona-integration' }}",
34678
+ "run-name: ${{ inputs.environment == 'production' && format('persona-production-{0}', inputs.promotion_id) || inputs.config_id && format('persona-integration-config-{0}', inputs.config_id) || 'persona-integration' }}",
34653
34679
  "# \u7531 clawd \u751F\u6210\u3001\u7531 clawd \u7EF4\u62A4\u3002push \u6784\u5EFA int \u5019\u9009\uFF1Bproduction \u624B\u52A8\u664B\u7EA7\u5DF2\u9A8C\u6536\u5236\u54C1\u3002",
34654
34680
  "on:",
34655
34681
  " push:",
@@ -34664,7 +34690,15 @@ function renderDeployWorkflow(config2) {
34664
34690
  " type: string",
34665
34691
  " required: false",
34666
34692
  " release_json:",
34667
- " description: Verified Persona release JSON for production promotion",
34693
+ " description: Verified Persona release JSON for production promotion or config re-test",
34694
+ " type: string",
34695
+ " required: false",
34696
+ " config_json:",
34697
+ " description: Engine/model/resource config (canonical JSON); replaces .clawd/persona.json for this run",
34698
+ " type: string",
34699
+ " required: false",
34700
+ " config_id:",
34701
+ " description: Identifies an integration config re-test run (run-name)",
34668
34702
  " type: string",
34669
34703
  " required: false",
34670
34704
  "",
@@ -34717,6 +34751,7 @@ function renderDeployWorkflow(config2) {
34717
34751
  " ALIBABA_CLOUD_ACCESS_KEY_ID: ${{ secrets.ALI_ACS_ACCESS_KEY_ID }}",
34718
34752
  " ALIBABA_CLOUD_ACCESS_KEY_SECRET: ${{ secrets.ALI_ACS_ACCESS_KEY_SECRET }}",
34719
34753
  " RELEASE_JSON: ${{ inputs.release_json }}",
34754
+ " CLAWD_CONFIG_JSON: ${{ steps.plan.outputs.config_json }}",
34720
34755
  " CLAWD_PUBLISHER_TEST: ${{ steps.plan.outputs.test }}",
34721
34756
  " run: node clawos/cloud-host/pipeline/persona-candidate.mjs",
34722
34757
  "",