@clawos-dev/clawd 0.2.478 → 0.2.480

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.
@@ -21344,12 +21344,9 @@ var EnvEvidenceSchema = external_exports.object({
21344
21344
  });
21345
21345
 
21346
21346
  // ../protocol/src/deploy-schemas.ts
21347
- var FulfillmentSchema = external_exports.enum(["deployer", "user"]);
21348
21347
  var DeployFileSchema = external_exports.object({
21349
21348
  version: external_exports.literal(1),
21350
- manifest: EnvironmentManifestSchema,
21351
- /** secret name → 谁提供。缺席 = 还没定 */
21352
- fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).default({})
21349
+ manifest: EnvironmentManifestSchema
21353
21350
  }).strict();
21354
21351
  var DeployScanStatusSchema = external_exports.enum(["scanning", "done", "failed"]);
21355
21352
  var DeployScanSchema = external_exports.object({
@@ -21400,7 +21397,6 @@ var DeployPersonaArgsSchema = external_exports.object({
21400
21397
  var DeployPatchArgsSchema = external_exports.object({
21401
21398
  personaId: external_exports.string().min(1),
21402
21399
  patch: external_exports.object({
21403
- fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).optional(),
21404
21400
  // 人工补依赖;整份替换 manifest
21405
21401
  manifest: EnvironmentManifestSchema.optional()
21406
21402
  }).strict()
@@ -21613,6 +21609,22 @@ var AuthGetIdentityResponseSchema = external_exports.object({
21613
21609
  var AuthLogoutResponseSchema = external_exports.object({
21614
21610
  type: external_exports.literal("auth:logout:ok")
21615
21611
  });
21612
+ var GatewayUrl = external_exports.string().nullable();
21613
+ var AuthApiKeyGetResponseSchema = external_exports.object({
21614
+ type: external_exports.literal("auth:apiKey:get:ok"),
21615
+ /** null = 还没发过。**发过就能一直看到** —— 中心存的是明文,设置页据此展示 */
21616
+ apiKey: external_exports.string().nullable(),
21617
+ /** ISO 时间;apiKey 为 null 时同为 null */
21618
+ createdAt: external_exports.string().nullable(),
21619
+ gatewayUrl: GatewayUrl
21620
+ });
21621
+ var AuthApiKeyRegenerateResponseSchema = external_exports.object({
21622
+ type: external_exports.literal("auth:apiKey:regenerate:ok"),
21623
+ /** 新发的那把。**旧的当场失效** —— 一人一把,按 union_id 覆盖 */
21624
+ apiKey: external_exports.string().min(1),
21625
+ createdAt: external_exports.string().min(1),
21626
+ gatewayUrl: GatewayUrl
21627
+ });
21616
21628
  var AuthLoginDoneEventSchema = external_exports.object({
21617
21629
  type: external_exports.literal("auth:login:done"),
21618
21630
  identity: FeishuIdentitySchema
@@ -23884,7 +23896,7 @@ var METHOD_DOCS = {
23884
23896
  },
23885
23897
  // ---- deploy:*(persona 上云:persona 目录 = git 仓库工作树,发布 = 推送触发仓库流水线)----
23886
23898
  "deploy:start": {
23887
- summary: "\u5BF9\u67D0\u4E2A persona \u8D77\u4E00\u6B21\u4E0A\u4E91\u626B\u63CF\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08gh repo create\uFF0C\u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\u3001\u63A8\u9996\u4E2A\u63D0\u4EA4\uFF09\uFF0C\u518D\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u7ED3\u679C\u5199\u8FDB persona \u76EE\u5F55\u7684 .clawd/deploy.json \uFF08\u6E05\u5355 + \u5C65\u7EA6\uFF0C\u8FDB\u4ED3\u5E93\uFF09\u4E0E .clawd/deploy-scan.json\uFF08\u8BC1\u636E\uFF0C\u4E0D\u8FDB\u4ED3\u5E93\uFF09\u3002\u5DF2\u7ECF\u5728\u626B\u7684\u8BDD\u539F\u6837\u8FD4\u56DE\u3001\u4E0D\u8D77\u7B2C\u4E8C\u4E2A\u626B\u63CF\u4F1A\u8BDD\uFF1Bowner-only",
23899
+ summary: "\u5BF9\u67D0\u4E2A persona \u8D77\u4E00\u6B21\u4E0A\u4E91\u626B\u63CF\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08gh repo create\uFF0C\u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\u3001\u63A8\u9996\u4E2A\u63D0\u4EA4\uFF09\uFF0C\u518D\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u7ED3\u679C\u5199\u8FDB persona \u76EE\u5F55\u7684 .clawd/deploy.json \uFF08\u73AF\u5883\u6E05\u5355\uFF0C\u8FDB\u4ED3\u5E93\uFF09\u4E0E .clawd/deploy-scan.json\uFF08\u8BC1\u636E\uFF0C\u4E0D\u8FDB\u4ED3\u5E93\uFF09\u3002\u5DF2\u7ECF\u5728\u626B\u7684\u8BDD\u539F\u6837\u8FD4\u56DE\u3001\u4E0D\u8D77\u7B2C\u4E8C\u4E2A\u626B\u63CF\u4F1A\u8BDD\uFF1Bowner-only",
23888
23900
  args: DeployPersonaArgsSchema
23889
23901
  },
23890
23902
  "deploy:get": {
@@ -23892,7 +23904,7 @@ var METHOD_DOCS = {
23892
23904
  args: DeployPersonaArgsSchema
23893
23905
  },
23894
23906
  "deploy:patch": {
23895
- summary: "\u7F16\u8F91\u90E8\u7F72\u6587\u4EF6\uFF1A\u9009\u5C65\u7EA6\uFF08\u8C01\u51FA\u8FD9\u6761\u51ED\u636E\uFF09/ \u624B\u5DE5\u8865\u4F9D\u8D56\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1B\u5C65\u7EA6\u540D\u5FC5\u987B\u662F\u6E05\u5355\u91CC\u58F0\u660E\u8FC7\u7684\u51ED\u636E\uFF1Bowner-only",
23907
+ summary: "\u7F16\u8F91\u90E8\u7F72\u6587\u4EF6\uFF1A\u624B\u5DE5\u8865\u4F9D\u8D56\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
23896
23908
  args: DeployPatchArgsSchema
23897
23909
  },
23898
23910
  "deploy:putSecret": {
@@ -23908,7 +23920,7 @@ var METHOD_DOCS = {
23908
23920
  args: DeployFinishScanArgsSchema
23909
23921
  },
23910
23922
  "deploy:release": {
23911
- summary: "\u53D1\u5E03 = \u63D0\u4EA4\u5E76\u63A8\u9001\u5230\u4ED3\u5E93\uFF1A\u91CD\u5199 workflow \u6A21\u677F \u2192 git add -A \u2192 \u7A7A\u63D0\u4EA4\u4E5F\u5141\u8BB8 \u2192 push\u3002\u4ED3\u5E93\u91CC\u7684\u6D41\u6C34\u7EBF\u63A5\u7740\u6784\u955C\u50CF\u3001\u5728\u96C6\u7FA4\u4E0A\u771F\u8D77\u4E00\u6B21\u3001\u767B\u8BB0\u6210\u6B63\u5F0F\uFF0C\u8FDB\u5EA6\u5728 GitHub Actions \u770B\u3002\u524D\u7F6E\uFF1A\u5DF2\u7ED1\u5B9A\u4ED3\u5E93\u3001\u6709\u6E05\u5355\u3001\u6BCF\u6761\u51ED\u636E\u90FD\u5B9A\u4E86\u5C65\u7EA6\u3001\u6BCF\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\uFF1Bowner-only",
23923
+ summary: "\u53D1\u5E03 = \u63D0\u4EA4\u5E76\u63A8\u9001\u5230\u4ED3\u5E93\uFF1A\u91CD\u5199 workflow \u6A21\u677F \u2192 git add -A \u2192 \u7A7A\u63D0\u4EA4\u4E5F\u5141\u8BB8 \u2192 push\u3002\u4ED3\u5E93\u91CC\u7684\u6D41\u6C34\u7EBF\u63A5\u7740\u6784\u955C\u50CF\u3001\u5728\u96C6\u7FA4\u4E0A\u771F\u8D77\u4E00\u6B21\u3001\u767B\u8BB0\u6210\u6B63\u5F0F\uFF0C\u8FDB\u5EA6\u5728 GitHub Actions \u770B\u3002\u524D\u7F6E\uFF1A\u5DF2\u7ED1\u5B9A\u4ED3\u5E93\u3001\u6709\u6E05\u5355\u3001\u6BCF\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\uFF1Bowner-only",
23912
23924
  args: DeployPersonaArgsSchema
23913
23925
  },
23914
23926
  "shift:list": {
@@ -24287,6 +24299,14 @@ var METHOD_DOCS = {
24287
24299
  summary: "\u767B\u51FA\u98DE\u4E66\u8EAB\u4EFD\uFF08\u6E05 owner-identity \u843D\u76D8\uFF09\u3002owner-only",
24288
24300
  args: NO_ARGS
24289
24301
  },
24302
+ "auth:apiKey:get": {
24303
+ summary: "\u8BFB\u56DE\u81EA\u5DF1\u90A3\u628A\u4E91 persona \u8C03\u7528 key\uFF08\u6CA1\u53D1\u8FC7 \u2192 apiKey:null\uFF09\u3002daemon \u62FF\u672C\u673A\u767B\u5F55\u51ED\u8BC1\u5411\u4E2D\u5FC3\u4EE3\u53D6\uFF0C\u51ED\u8BC1\u4E0D\u51FA ws\u3002owner-only",
24304
+ args: NO_ARGS
24305
+ },
24306
+ "auth:apiKey:regenerate": {
24307
+ summary: "\u6362\u4E00\u628A\u65B0\u7684\u4E91 persona \u8C03\u7528 key\uFF0C**\u65E7\u7684\u5F53\u573A\u5931\u6548**\uFF08\u4E00\u4EBA\u4E00\u628A\uFF0C\u4E2D\u5FC3\u6309 union_id \u8986\u76D6\uFF09\u3002owner-only",
24308
+ args: NO_ARGS
24309
+ },
24290
24310
  "device:list": {
24291
24311
  summary: "\u5217\u51FA\u516C\u5171\u8BBE\u5907\u76EE\u5F55\u91CC\u53EF\u8FDE\u63A5\u7684\u8BBE\u5907\uFF08daemon \u4EE3\u7406\u4E2D\u5FC3 server\uFF09\u3002owner-only",
24292
24312
  args: NO_ARGS
package/dist/cli.cjs CHANGED
@@ -6025,18 +6025,15 @@ var init_environment_schemas = __esm({
6025
6025
  function repoSlug(url) {
6026
6026
  return url.trim().replace(/^git@[^:]+:/, "").replace(/^https?:\/\/[^/]+\//, "").replace(/\.git$/, "");
6027
6027
  }
6028
- var FulfillmentSchema, DeployFileSchema, DeployScanStatusSchema, DeployScanSchema, DeployRepoSchema, DeploySecretPresenceSchema, DeployStateSchema, DeployReleaseResultSchema, DeployPersonaArgsSchema, DeployPatchArgsSchema, DeployPutSecretArgsSchema, DeployReportFindingArgsSchema, DeployFinishScanArgsSchema, PERSONA_REPO_ORG;
6028
+ var DeployFileSchema, DeployScanStatusSchema, DeployScanSchema, DeployRepoSchema, DeploySecretPresenceSchema, DeployStateSchema, DeployReleaseResultSchema, DeployPersonaArgsSchema, DeployPatchArgsSchema, DeployPutSecretArgsSchema, DeployReportFindingArgsSchema, DeployFinishScanArgsSchema, PERSONA_REPO_ORG;
6029
6029
  var init_deploy_schemas = __esm({
6030
6030
  "../protocol/src/deploy-schemas.ts"() {
6031
6031
  "use strict";
6032
6032
  init_zod();
6033
6033
  init_environment_schemas();
6034
- FulfillmentSchema = external_exports.enum(["deployer", "user"]);
6035
6034
  DeployFileSchema = external_exports.object({
6036
6035
  version: external_exports.literal(1),
6037
- manifest: EnvironmentManifestSchema,
6038
- /** secret name → 谁提供。缺席 = 还没定 */
6039
- fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).default({})
6036
+ manifest: EnvironmentManifestSchema
6040
6037
  }).strict();
6041
6038
  DeployScanStatusSchema = external_exports.enum(["scanning", "done", "failed"]);
6042
6039
  DeployScanSchema = external_exports.object({
@@ -6087,7 +6084,6 @@ var init_deploy_schemas = __esm({
6087
6084
  DeployPatchArgsSchema = external_exports.object({
6088
6085
  personaId: external_exports.string().min(1),
6089
6086
  patch: external_exports.object({
6090
- fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).optional(),
6091
6087
  // 人工补依赖;整份替换 manifest
6092
6088
  manifest: EnvironmentManifestSchema.optional()
6093
6089
  }).strict()
@@ -6244,7 +6240,7 @@ var init_contact = __esm({
6244
6240
  });
6245
6241
 
6246
6242
  // ../protocol/src/feishu-auth.ts
6247
- var FEISHU_GATED_METHODS, LOGIN_EXPIRED_ERROR_MARKER, DeviceEntrySchema, DeviceListResponseSchema, DeviceConnectArgsSchema, DeviceConnectResponseSchema, FeishuIdentitySchema, AuthLoginStartResponseSchema, AuthGetIdentityResponseSchema, AuthLogoutResponseSchema, AuthLoginDoneEventSchema, AuthLoginFailedEventSchema;
6243
+ var FEISHU_GATED_METHODS, LOGIN_EXPIRED_ERROR_MARKER, DeviceEntrySchema, DeviceListResponseSchema, DeviceConnectArgsSchema, DeviceConnectResponseSchema, FeishuIdentitySchema, AuthLoginStartResponseSchema, AuthGetIdentityResponseSchema, AuthLogoutResponseSchema, GatewayUrl, AuthApiKeyGetResponseSchema, AuthApiKeyRegenerateResponseSchema, AuthLoginDoneEventSchema, AuthLoginFailedEventSchema;
6248
6244
  var init_feishu_auth = __esm({
6249
6245
  "../protocol/src/feishu-auth.ts"() {
6250
6246
  "use strict";
@@ -6341,6 +6337,22 @@ var init_feishu_auth = __esm({
6341
6337
  AuthLogoutResponseSchema = external_exports.object({
6342
6338
  type: external_exports.literal("auth:logout:ok")
6343
6339
  });
6340
+ GatewayUrl = external_exports.string().nullable();
6341
+ AuthApiKeyGetResponseSchema = external_exports.object({
6342
+ type: external_exports.literal("auth:apiKey:get:ok"),
6343
+ /** null = 还没发过。**发过就能一直看到** —— 中心存的是明文,设置页据此展示 */
6344
+ apiKey: external_exports.string().nullable(),
6345
+ /** ISO 时间;apiKey 为 null 时同为 null */
6346
+ createdAt: external_exports.string().nullable(),
6347
+ gatewayUrl: GatewayUrl
6348
+ });
6349
+ AuthApiKeyRegenerateResponseSchema = external_exports.object({
6350
+ type: external_exports.literal("auth:apiKey:regenerate:ok"),
6351
+ /** 新发的那把。**旧的当场失效** —— 一人一把,按 union_id 覆盖 */
6352
+ apiKey: external_exports.string().min(1),
6353
+ createdAt: external_exports.string().min(1),
6354
+ gatewayUrl: GatewayUrl
6355
+ });
6344
6356
  AuthLoginDoneEventSchema = external_exports.object({
6345
6357
  type: external_exports.literal("auth:login:done"),
6346
6358
  identity: FeishuIdentitySchema
@@ -8836,7 +8848,7 @@ var init_methods = __esm({
8836
8848
  },
8837
8849
  // ---- deploy:*(persona 上云:persona 目录 = git 仓库工作树,发布 = 推送触发仓库流水线)----
8838
8850
  "deploy:start": {
8839
- summary: "\u5BF9\u67D0\u4E2A persona \u8D77\u4E00\u6B21\u4E0A\u4E91\u626B\u63CF\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08gh repo create\uFF0C\u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\u3001\u63A8\u9996\u4E2A\u63D0\u4EA4\uFF09\uFF0C\u518D\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u7ED3\u679C\u5199\u8FDB persona \u76EE\u5F55\u7684 .clawd/deploy.json \uFF08\u6E05\u5355 + \u5C65\u7EA6\uFF0C\u8FDB\u4ED3\u5E93\uFF09\u4E0E .clawd/deploy-scan.json\uFF08\u8BC1\u636E\uFF0C\u4E0D\u8FDB\u4ED3\u5E93\uFF09\u3002\u5DF2\u7ECF\u5728\u626B\u7684\u8BDD\u539F\u6837\u8FD4\u56DE\u3001\u4E0D\u8D77\u7B2C\u4E8C\u4E2A\u626B\u63CF\u4F1A\u8BDD\uFF1Bowner-only",
8851
+ summary: "\u5BF9\u67D0\u4E2A persona \u8D77\u4E00\u6B21\u4E0A\u4E91\u626B\u63CF\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08gh repo create\uFF0C\u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\u3001\u63A8\u9996\u4E2A\u63D0\u4EA4\uFF09\uFF0C\u518D\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u7ED3\u679C\u5199\u8FDB persona \u76EE\u5F55\u7684 .clawd/deploy.json \uFF08\u73AF\u5883\u6E05\u5355\uFF0C\u8FDB\u4ED3\u5E93\uFF09\u4E0E .clawd/deploy-scan.json\uFF08\u8BC1\u636E\uFF0C\u4E0D\u8FDB\u4ED3\u5E93\uFF09\u3002\u5DF2\u7ECF\u5728\u626B\u7684\u8BDD\u539F\u6837\u8FD4\u56DE\u3001\u4E0D\u8D77\u7B2C\u4E8C\u4E2A\u626B\u63CF\u4F1A\u8BDD\uFF1Bowner-only",
8840
8852
  args: DeployPersonaArgsSchema
8841
8853
  },
8842
8854
  "deploy:get": {
@@ -8844,7 +8856,7 @@ var init_methods = __esm({
8844
8856
  args: DeployPersonaArgsSchema
8845
8857
  },
8846
8858
  "deploy:patch": {
8847
- summary: "\u7F16\u8F91\u90E8\u7F72\u6587\u4EF6\uFF1A\u9009\u5C65\u7EA6\uFF08\u8C01\u51FA\u8FD9\u6761\u51ED\u636E\uFF09/ \u624B\u5DE5\u8865\u4F9D\u8D56\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1B\u5C65\u7EA6\u540D\u5FC5\u987B\u662F\u6E05\u5355\u91CC\u58F0\u660E\u8FC7\u7684\u51ED\u636E\uFF1Bowner-only",
8859
+ summary: "\u7F16\u8F91\u90E8\u7F72\u6587\u4EF6\uFF1A\u624B\u5DE5\u8865\u4F9D\u8D56\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
8848
8860
  args: DeployPatchArgsSchema
8849
8861
  },
8850
8862
  "deploy:putSecret": {
@@ -8860,7 +8872,7 @@ var init_methods = __esm({
8860
8872
  args: DeployFinishScanArgsSchema
8861
8873
  },
8862
8874
  "deploy:release": {
8863
- summary: "\u53D1\u5E03 = \u63D0\u4EA4\u5E76\u63A8\u9001\u5230\u4ED3\u5E93\uFF1A\u91CD\u5199 workflow \u6A21\u677F \u2192 git add -A \u2192 \u7A7A\u63D0\u4EA4\u4E5F\u5141\u8BB8 \u2192 push\u3002\u4ED3\u5E93\u91CC\u7684\u6D41\u6C34\u7EBF\u63A5\u7740\u6784\u955C\u50CF\u3001\u5728\u96C6\u7FA4\u4E0A\u771F\u8D77\u4E00\u6B21\u3001\u767B\u8BB0\u6210\u6B63\u5F0F\uFF0C\u8FDB\u5EA6\u5728 GitHub Actions \u770B\u3002\u524D\u7F6E\uFF1A\u5DF2\u7ED1\u5B9A\u4ED3\u5E93\u3001\u6709\u6E05\u5355\u3001\u6BCF\u6761\u51ED\u636E\u90FD\u5B9A\u4E86\u5C65\u7EA6\u3001\u6BCF\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\uFF1Bowner-only",
8875
+ summary: "\u53D1\u5E03 = \u63D0\u4EA4\u5E76\u63A8\u9001\u5230\u4ED3\u5E93\uFF1A\u91CD\u5199 workflow \u6A21\u677F \u2192 git add -A \u2192 \u7A7A\u63D0\u4EA4\u4E5F\u5141\u8BB8 \u2192 push\u3002\u4ED3\u5E93\u91CC\u7684\u6D41\u6C34\u7EBF\u63A5\u7740\u6784\u955C\u50CF\u3001\u5728\u96C6\u7FA4\u4E0A\u771F\u8D77\u4E00\u6B21\u3001\u767B\u8BB0\u6210\u6B63\u5F0F\uFF0C\u8FDB\u5EA6\u5728 GitHub Actions \u770B\u3002\u524D\u7F6E\uFF1A\u5DF2\u7ED1\u5B9A\u4ED3\u5E93\u3001\u6709\u6E05\u5355\u3001\u6BCF\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\uFF1Bowner-only",
8864
8876
  args: DeployPersonaArgsSchema
8865
8877
  },
8866
8878
  "shift:list": {
@@ -9239,6 +9251,14 @@ var init_methods = __esm({
9239
9251
  summary: "\u767B\u51FA\u98DE\u4E66\u8EAB\u4EFD\uFF08\u6E05 owner-identity \u843D\u76D8\uFF09\u3002owner-only",
9240
9252
  args: NO_ARGS
9241
9253
  },
9254
+ "auth:apiKey:get": {
9255
+ summary: "\u8BFB\u56DE\u81EA\u5DF1\u90A3\u628A\u4E91 persona \u8C03\u7528 key\uFF08\u6CA1\u53D1\u8FC7 \u2192 apiKey:null\uFF09\u3002daemon \u62FF\u672C\u673A\u767B\u5F55\u51ED\u8BC1\u5411\u4E2D\u5FC3\u4EE3\u53D6\uFF0C\u51ED\u8BC1\u4E0D\u51FA ws\u3002owner-only",
9256
+ args: NO_ARGS
9257
+ },
9258
+ "auth:apiKey:regenerate": {
9259
+ summary: "\u6362\u4E00\u628A\u65B0\u7684\u4E91 persona \u8C03\u7528 key\uFF0C**\u65E7\u7684\u5F53\u573A\u5931\u6548**\uFF08\u4E00\u4EBA\u4E00\u628A\uFF0C\u4E2D\u5FC3\u6309 union_id \u8986\u76D6\uFF09\u3002owner-only",
9260
+ args: NO_ARGS
9261
+ },
9242
9262
  "device:list": {
9243
9263
  summary: "\u5217\u51FA\u516C\u5171\u8BBE\u5907\u76EE\u5F55\u91CC\u53EF\u8FDE\u63A5\u7684\u8BBE\u5907\uFF08daemon \u4EE3\u7406\u4E2D\u5FC3 server\uFF09\u3002owner-only",
9244
9264
  args: NO_ARGS
@@ -54676,7 +54696,7 @@ async function writeScan(dir, scan) {
54676
54696
  await writeJson(import_node_path30.default.join(dir, SCAN_FILE), DeployScanSchema.parse(scan));
54677
54697
  }
54678
54698
  function emptyDeployFile() {
54679
- return { version: 1, manifest: { version: 1, clis: [], secrets: [], assets: [] }, fulfillment: {} };
54699
+ return { version: 1, manifest: { version: 1, clis: [], secrets: [], assets: [] } };
54680
54700
  }
54681
54701
  function parseFinding(kind, item) {
54682
54702
  const schema = kind === "cli" ? EnvCliSchema : kind === "secret" ? EnvSecretSchema : EnvAssetSchema;
@@ -54736,7 +54756,7 @@ var L = [
54736
54756
  "# \u6784\u5EFA\u5668 / \u6D41\u6C34\u7EBF\u811A\u672C / \u968F\u884C\u8D44\u4EA7\u5728 ottin4ttc/clawos \u4ED3\u5E93\u91CC\uFF0C\u8FD9\u91CC checkout \u4E00\u4EFD\u6765\u7528\u3002",
54737
54757
  "#",
54738
54758
  "# \u8981\u7684\u7EC4\u7EC7\u7EA7 Secrets\uFF1AALI_DOCKER_USERNAME / ALI_DOCKER_PASSWORD\uFF08\u63A8 ACR\uFF09\u3001CLAWOS_READ_TOKEN",
54739
- "#\uFF08\u8BFB clawos \u4ED3\u5E93\uFF09\u3001CLAWD_GATEWAY_ADMIN_KEY / CLAWD_GATEWAY_API_KEY\uFF1B\u7EC4\u7EC7\u7EA7 Variable\uFF1ACLAWD_GATEWAY_URL\u3002",
54759
+ "#\uFF08\u8BFB clawos \u4ED3\u5E93\uFF09\u3001CLAWD_GATEWAY_ADMIN_KEY\uFF1B\u7EC4\u7EC7\u7EA7 Variable\uFF1ACLAWD_GATEWAY_URL\u3002",
54740
54760
  "# \u4ED3\u5E93\u7EA7\u540C\u540D\u914D\u7F6E\u4F1A\u76D6\u8FC7\u7EC4\u7EC7\u7EA7\u2014\u2014\u67D0\u4E2A persona \u8981\u6307\u5230\u53E6\u4E00\u53F0 gateway\uFF0C\u5728\u81EA\u5DF1\u4ED3\u5E93\u91CC\u914D\u5373\u53EF\u3002",
54741
54761
  "",
54742
54762
  "on:",
@@ -54768,8 +54788,6 @@ var L = [
54768
54788
  " image: ${{ steps.plan.outputs.image }}",
54769
54789
  " persona_id: ${{ steps.plan.outputs.persona_id }}",
54770
54790
  " env_names: ${{ steps.plan.outputs.env_names }}",
54771
- " deployer_env_names: ${{ steps.plan.outputs.deployer_env_names }}",
54772
- " user_secrets: ${{ steps.plan.outputs.user_secrets }}",
54773
54791
  " steps:",
54774
54792
  " - name: Checkout persona",
54775
54793
  " uses: actions/checkout@v4",
@@ -54884,7 +54902,6 @@ var L = [
54884
54902
  " env:",
54885
54903
  " CLAWD_GATEWAY_URL: ${{ vars.CLAWD_GATEWAY_URL }}",
54886
54904
  " CLAWD_GATEWAY_ADMIN_KEY: ${{ secrets.CLAWD_GATEWAY_ADMIN_KEY }}",
54887
- " CLAWD_GATEWAY_API_KEY: ${{ secrets.CLAWD_GATEWAY_API_KEY }}",
54888
54905
  " CLAWD_SECRETS_JSON: ${{ toJSON(secrets) }}",
54889
54906
  " CLAWD_ENV_NAMES: ${{ needs.build.outputs.env_names }}",
54890
54907
  " run: |",
@@ -54914,8 +54931,7 @@ var L = [
54914
54931
  " CLAWD_GATEWAY_URL: ${{ vars.CLAWD_GATEWAY_URL }}",
54915
54932
  " CLAWD_GATEWAY_ADMIN_KEY: ${{ secrets.CLAWD_GATEWAY_ADMIN_KEY }}",
54916
54933
  " CLAWD_SECRETS_JSON: ${{ toJSON(secrets) }}",
54917
- " CLAWD_DEPLOYER_ENV_NAMES: ${{ needs.build.outputs.deployer_env_names }}",
54918
- " CLAWD_USER_SECRETS: ${{ needs.build.outputs.user_secrets }}",
54934
+ " CLAWD_ENV_NAMES: ${{ needs.build.outputs.env_names }}",
54919
54935
  " run: |",
54920
54936
  " node clawos/cloud-host/pipeline/register.mjs \\",
54921
54937
  " --image '${{ needs.build.outputs.image }}' \\",
@@ -55239,7 +55255,7 @@ function buildDeployHandlers(deps) {
55239
55255
  secretsCache.delete(personaId2);
55240
55256
  }
55241
55257
  const prev = await readDeployFile(dir).catch(() => void 0);
55242
- await writeDeployFile(dir, { ...emptyDeployFile(), fulfillment: prev?.fulfillment ?? {} });
55258
+ await writeDeployFile(dir, emptyDeployFile());
55243
55259
  const startedAt = deps.now();
55244
55260
  await writeScan(dir, { status: "scanning", evidence: [], notes: [], scannedAssets: [], startedAt });
55245
55261
  const started = deps.startScan(personaId2);
@@ -55269,16 +55285,9 @@ function buildDeployHandlers(deps) {
55269
55285
  const args = parseArgs2(DeployPatchArgsSchema, frame, "deploy:patch");
55270
55286
  const dir = mustPersona(args.personaId);
55271
55287
  const file = await readDeployFile(dir) ?? emptyDeployFile();
55272
- if (args.patch.fulfillment) {
55273
- const declared = new Set((args.patch.manifest ?? file.manifest).secrets.map((s) => s.name));
55274
- for (const name of Object.keys(args.patch.fulfillment)) {
55275
- if (!declared.has(name)) throw invalid(`\u6E05\u5355\u91CC\u6CA1\u6709\u53EB\u300C${name}\u300D\u7684\u51ED\u636E`);
55276
- }
55277
- }
55278
55288
  const next = {
55279
55289
  ...file,
55280
- ...args.patch.manifest ? { manifest: args.patch.manifest } : {},
55281
- ...args.patch.fulfillment ? { fulfillment: { ...file.fulfillment, ...args.patch.fulfillment } } : {}
55290
+ ...args.patch.manifest ? { manifest: args.patch.manifest } : {}
55282
55291
  };
55283
55292
  await writeDeployFile(dir, next);
55284
55293
  return view(args.personaId);
@@ -55355,8 +55364,6 @@ function buildDeployHandlers(deps) {
55355
55364
  if (scan?.status === "scanning") throw invalid("\u626B\u63CF\u8FD8\u6CA1\u7ED3\u675F");
55356
55365
  if (scan?.status !== "done") throw invalid(scan?.status === "failed" ? "\u4E0A\u6B21\u626B\u63CF\u5931\u8D25\u4E86\uFF0C\u5148\u91CD\u65B0\u626B\u63CF" : "\u8FD8\u6CA1\u626B\u63CF\u8FC7\uFF0C\u5148\u626B\u63CF");
55357
55366
  const blockers = [];
55358
- const undecided = file.manifest.secrets.filter((s) => !file.fulfillment[s.name]).map((s) => `\u300C${s.name}\u300D\u8FD8\u6CA1\u5B9A\u8C01\u51FA`);
55359
- blockers.push(...undecided);
55360
55367
  let present;
55361
55368
  try {
55362
55369
  present = new Set((await cachedSecrets(personaId2, dir, true)).filter((p2) => p2.setAt).map((p2) => p2.env));
@@ -61572,6 +61579,40 @@ async function centralPrincipalStatus(opts) {
61572
61579
  }
61573
61580
  return { active: body.active };
61574
61581
  }
61582
+ async function centralGetApiKey(opts) {
61583
+ const body = await centralRequest(
61584
+ opts,
61585
+ `/api/persona-cloud/api-key?provider=${encodeURIComponent(opts.provider)}`,
61586
+ { method: "GET", bearer: opts.ttcJwt }
61587
+ );
61588
+ if (body.apiKey !== null && typeof body.apiKey !== "string") {
61589
+ throw new CentralClientError("BAD_RESPONSE", "api-key: apiKey must be string or null");
61590
+ }
61591
+ return {
61592
+ apiKey: body.apiKey,
61593
+ createdAt: typeof body.createdAt === "string" ? body.createdAt : null,
61594
+ // 中心没配就是 null —— 不当成错误,key 本身照样有效
61595
+ gatewayUrl: typeof body.gatewayUrl === "string" ? body.gatewayUrl : null
61596
+ };
61597
+ }
61598
+ async function centralIssueApiKey(opts) {
61599
+ const body = await centralRequest(opts, "/api/persona-cloud/api-key", {
61600
+ method: "POST",
61601
+ bearer: opts.ttcJwt,
61602
+ body: { provider: opts.provider }
61603
+ });
61604
+ if (typeof body.apiKey !== "string" || body.apiKey.length === 0) {
61605
+ throw new CentralClientError("BAD_RESPONSE", "api-key: missing apiKey");
61606
+ }
61607
+ if (typeof body.createdAt !== "string" || body.createdAt.length === 0) {
61608
+ throw new CentralClientError("BAD_RESPONSE", "api-key: missing createdAt");
61609
+ }
61610
+ return {
61611
+ apiKey: body.apiKey,
61612
+ createdAt: body.createdAt,
61613
+ gatewayUrl: typeof body.gatewayUrl === "string" ? body.gatewayUrl : null
61614
+ };
61615
+ }
61575
61616
  async function centralListDevices(opts) {
61576
61617
  const body = await centralRequest(
61577
61618
  opts,
@@ -63982,6 +64023,7 @@ function buildWhoamiHandler(deps) {
63982
64023
  }
63983
64024
 
63984
64025
  // src/handlers/feishu-auth.ts
64026
+ init_protocol();
63985
64027
  function buildFeishuAuthHandlers(deps) {
63986
64028
  const loginStart = async () => {
63987
64029
  const { authUrl, state } = deps.loginFlow.start();
@@ -64010,10 +64052,34 @@ function buildFeishuAuthHandlers(deps) {
64010
64052
  response: { type: "auth:logout:ok" }
64011
64053
  };
64012
64054
  };
64055
+ function requireLogin() {
64056
+ const record3 = deps.ownerIdentityStore.read();
64057
+ if (!record3) {
64058
+ throw new ClawdError(
64059
+ ERROR_CODES.FEISHU_LOGIN_REQUIRED,
64060
+ "\u8FD8\u6CA1\u767B\u5F55\u98DE\u4E66\uFF0C\u62FF\u4E0D\u5230\u4E91 persona \u7684\u8C03\u7528 key"
64061
+ );
64062
+ }
64063
+ return { ttcJwt: record3.ttcToken, provider: record3.identity.provider };
64064
+ }
64065
+ const apiKeyGet = async () => {
64066
+ const { apiKey, createdAt, gatewayUrl } = await deps.apiKeyClient.get(requireLogin());
64067
+ return {
64068
+ response: { type: "auth:apiKey:get:ok", apiKey, createdAt, gatewayUrl }
64069
+ };
64070
+ };
64071
+ const apiKeyRegenerate = async () => {
64072
+ const { apiKey, createdAt, gatewayUrl } = await deps.apiKeyClient.issue(requireLogin());
64073
+ return {
64074
+ response: { type: "auth:apiKey:regenerate:ok", apiKey, createdAt, gatewayUrl }
64075
+ };
64076
+ };
64013
64077
  return {
64014
64078
  "auth:login:start": loginStart,
64015
64079
  "auth:getIdentity": getIdentity,
64016
- "auth:logout": logout
64080
+ "auth:logout": logout,
64081
+ "auth:apiKey:get": apiKeyGet,
64082
+ "auth:apiKey:regenerate": apiKeyRegenerate
64017
64083
  };
64018
64084
  }
64019
64085
 
@@ -64063,7 +64129,7 @@ var METHOD_GRANT_MAP = {
64063
64129
  // ---- visitor:* (访客名单,owner-only) ----
64064
64130
  // owner 看完整访客名单(含没开会话的);guest 不可调(handler 内再 assertOwner 兜底)。
64065
64131
  "visitor:list": ADMIN_ANY,
64066
- // deploy:*(persona 上云):全部 owner-only。里面有履约决策、凭据录入口、建仓和推送,
64132
+ // deploy:*(persona 上云):全部 owner-only。里面有凭据录入口、建仓和推送,
64067
64133
  // guest 不该看见更不该动。
64068
64134
  "deploy:start": ADMIN_ANY,
64069
64135
  "deploy:get": ADMIN_ANY,
@@ -64254,6 +64320,9 @@ var METHOD_GRANT_MAP = {
64254
64320
  "auth:login:start": ADMIN_ANY,
64255
64321
  "auth:getIdentity": ADMIN_ANY,
64256
64322
  "auth:logout": ADMIN_ANY,
64323
+ // 云 persona 调用 key:本机主人自己的东西,guest 一律够不着
64324
+ "auth:apiKey:get": ADMIN_ANY,
64325
+ "auth:apiKey:regenerate": ADMIN_ANY,
64257
64326
  // ---- device:* 设备目录 + 连接(决策 #15,owner-only) ----
64258
64327
  // 设备目录 / 连接都是 owner 本机操作(用 owner 的 ttcJwt 找中心 server),guest 不可调
64259
64328
  "device:list": ADMIN_ANY,
@@ -64317,7 +64386,7 @@ function computeMethodAccess(args) {
64317
64386
  }
64318
64387
 
64319
64388
  // src/version.ts
64320
- var version = "0.2.478".length > 0 ? "0.2.478" : "dev";
64389
+ var version = "0.2.480".length > 0 ? "0.2.480" : "dev";
64321
64390
 
64322
64391
  // src/cli-probe/probe.ts
64323
64392
  var fs70 = __toESM(require("fs"), 1);
@@ -69318,6 +69387,12 @@ async function startDaemon(config) {
69318
69387
  ownerId = "";
69319
69388
  ownerProvider = "";
69320
69389
  ownerDisplayName = loadOwnerDisplayName(config.dataDir);
69390
+ },
69391
+ // 云 persona 调用 key(design 2026-09-08):daemon 拿本机登录凭证向中心代取。
69392
+ // 凭证不出 ws —— UI 只拿到 key 本身,跟 exchange / listDevices 同一条纪律。
69393
+ apiKeyClient: {
69394
+ get: (args) => centralGetApiKey({ api: config.clawosApi ?? DEFAULT_CLAWOS_API, ...args }),
69395
+ issue: (args) => centralIssueApiKey({ api: config.clawosApi ?? DEFAULT_CLAWOS_API, ...args })
69321
69396
  }
69322
69397
  },
69323
69398
  // 设备目录 + 连接(决策 #15:daemon 代理中心 server)。
@@ -21337,12 +21337,9 @@ var EnvEvidenceSchema = external_exports.object({
21337
21337
  });
21338
21338
 
21339
21339
  // ../protocol/src/deploy-schemas.ts
21340
- var FulfillmentSchema = external_exports.enum(["deployer", "user"]);
21341
21340
  var DeployFileSchema = external_exports.object({
21342
21341
  version: external_exports.literal(1),
21343
- manifest: EnvironmentManifestSchema,
21344
- /** secret name → 谁提供。缺席 = 还没定 */
21345
- fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).default({})
21342
+ manifest: EnvironmentManifestSchema
21346
21343
  }).strict();
21347
21344
  var DeployScanStatusSchema = external_exports.enum(["scanning", "done", "failed"]);
21348
21345
  var DeployScanSchema = external_exports.object({
@@ -21393,7 +21390,6 @@ var DeployPersonaArgsSchema = external_exports.object({
21393
21390
  var DeployPatchArgsSchema = external_exports.object({
21394
21391
  personaId: external_exports.string().min(1),
21395
21392
  patch: external_exports.object({
21396
- fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).optional(),
21397
21393
  // 人工补依赖;整份替换 manifest
21398
21394
  manifest: EnvironmentManifestSchema.optional()
21399
21395
  }).strict()
@@ -21606,6 +21602,22 @@ var AuthGetIdentityResponseSchema = external_exports.object({
21606
21602
  var AuthLogoutResponseSchema = external_exports.object({
21607
21603
  type: external_exports.literal("auth:logout:ok")
21608
21604
  });
21605
+ var GatewayUrl = external_exports.string().nullable();
21606
+ var AuthApiKeyGetResponseSchema = external_exports.object({
21607
+ type: external_exports.literal("auth:apiKey:get:ok"),
21608
+ /** null = 还没发过。**发过就能一直看到** —— 中心存的是明文,设置页据此展示 */
21609
+ apiKey: external_exports.string().nullable(),
21610
+ /** ISO 时间;apiKey 为 null 时同为 null */
21611
+ createdAt: external_exports.string().nullable(),
21612
+ gatewayUrl: GatewayUrl
21613
+ });
21614
+ var AuthApiKeyRegenerateResponseSchema = external_exports.object({
21615
+ type: external_exports.literal("auth:apiKey:regenerate:ok"),
21616
+ /** 新发的那把。**旧的当场失效** —— 一人一把,按 union_id 覆盖 */
21617
+ apiKey: external_exports.string().min(1),
21618
+ createdAt: external_exports.string().min(1),
21619
+ gatewayUrl: GatewayUrl
21620
+ });
21609
21621
  var AuthLoginDoneEventSchema = external_exports.object({
21610
21622
  type: external_exports.literal("auth:login:done"),
21611
21623
  identity: FeishuIdentitySchema
@@ -23876,7 +23888,7 @@ var METHOD_DOCS = {
23876
23888
  },
23877
23889
  // ---- deploy:*(persona 上云:persona 目录 = git 仓库工作树,发布 = 推送触发仓库流水线)----
23878
23890
  "deploy:start": {
23879
- summary: "\u5BF9\u67D0\u4E2A persona \u8D77\u4E00\u6B21\u4E0A\u4E91\u626B\u63CF\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08gh repo create\uFF0C\u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\u3001\u63A8\u9996\u4E2A\u63D0\u4EA4\uFF09\uFF0C\u518D\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u7ED3\u679C\u5199\u8FDB persona \u76EE\u5F55\u7684 .clawd/deploy.json \uFF08\u6E05\u5355 + \u5C65\u7EA6\uFF0C\u8FDB\u4ED3\u5E93\uFF09\u4E0E .clawd/deploy-scan.json\uFF08\u8BC1\u636E\uFF0C\u4E0D\u8FDB\u4ED3\u5E93\uFF09\u3002\u5DF2\u7ECF\u5728\u626B\u7684\u8BDD\u539F\u6837\u8FD4\u56DE\u3001\u4E0D\u8D77\u7B2C\u4E8C\u4E2A\u626B\u63CF\u4F1A\u8BDD\uFF1Bowner-only",
23891
+ summary: "\u5BF9\u67D0\u4E2A persona \u8D77\u4E00\u6B21\u4E0A\u4E91\u626B\u63CF\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08gh repo create\uFF0C\u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\u3001\u63A8\u9996\u4E2A\u63D0\u4EA4\uFF09\uFF0C\u518D\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u7ED3\u679C\u5199\u8FDB persona \u76EE\u5F55\u7684 .clawd/deploy.json \uFF08\u73AF\u5883\u6E05\u5355\uFF0C\u8FDB\u4ED3\u5E93\uFF09\u4E0E .clawd/deploy-scan.json\uFF08\u8BC1\u636E\uFF0C\u4E0D\u8FDB\u4ED3\u5E93\uFF09\u3002\u5DF2\u7ECF\u5728\u626B\u7684\u8BDD\u539F\u6837\u8FD4\u56DE\u3001\u4E0D\u8D77\u7B2C\u4E8C\u4E2A\u626B\u63CF\u4F1A\u8BDD\uFF1Bowner-only",
23880
23892
  args: DeployPersonaArgsSchema
23881
23893
  },
23882
23894
  "deploy:get": {
@@ -23884,7 +23896,7 @@ var METHOD_DOCS = {
23884
23896
  args: DeployPersonaArgsSchema
23885
23897
  },
23886
23898
  "deploy:patch": {
23887
- summary: "\u7F16\u8F91\u90E8\u7F72\u6587\u4EF6\uFF1A\u9009\u5C65\u7EA6\uFF08\u8C01\u51FA\u8FD9\u6761\u51ED\u636E\uFF09/ \u624B\u5DE5\u8865\u4F9D\u8D56\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1B\u5C65\u7EA6\u540D\u5FC5\u987B\u662F\u6E05\u5355\u91CC\u58F0\u660E\u8FC7\u7684\u51ED\u636E\uFF1Bowner-only",
23899
+ summary: "\u7F16\u8F91\u90E8\u7F72\u6587\u4EF6\uFF1A\u624B\u5DE5\u8865\u4F9D\u8D56\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1Bowner-only",
23888
23900
  args: DeployPatchArgsSchema
23889
23901
  },
23890
23902
  "deploy:putSecret": {
@@ -23900,7 +23912,7 @@ var METHOD_DOCS = {
23900
23912
  args: DeployFinishScanArgsSchema
23901
23913
  },
23902
23914
  "deploy:release": {
23903
- summary: "\u53D1\u5E03 = \u63D0\u4EA4\u5E76\u63A8\u9001\u5230\u4ED3\u5E93\uFF1A\u91CD\u5199 workflow \u6A21\u677F \u2192 git add -A \u2192 \u7A7A\u63D0\u4EA4\u4E5F\u5141\u8BB8 \u2192 push\u3002\u4ED3\u5E93\u91CC\u7684\u6D41\u6C34\u7EBF\u63A5\u7740\u6784\u955C\u50CF\u3001\u5728\u96C6\u7FA4\u4E0A\u771F\u8D77\u4E00\u6B21\u3001\u767B\u8BB0\u6210\u6B63\u5F0F\uFF0C\u8FDB\u5EA6\u5728 GitHub Actions \u770B\u3002\u524D\u7F6E\uFF1A\u5DF2\u7ED1\u5B9A\u4ED3\u5E93\u3001\u6709\u6E05\u5355\u3001\u6BCF\u6761\u51ED\u636E\u90FD\u5B9A\u4E86\u5C65\u7EA6\u3001\u6BCF\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\uFF1Bowner-only",
23915
+ summary: "\u53D1\u5E03 = \u63D0\u4EA4\u5E76\u63A8\u9001\u5230\u4ED3\u5E93\uFF1A\u91CD\u5199 workflow \u6A21\u677F \u2192 git add -A \u2192 \u7A7A\u63D0\u4EA4\u4E5F\u5141\u8BB8 \u2192 push\u3002\u4ED3\u5E93\u91CC\u7684\u6D41\u6C34\u7EBF\u63A5\u7740\u6784\u955C\u50CF\u3001\u5728\u96C6\u7FA4\u4E0A\u771F\u8D77\u4E00\u6B21\u3001\u767B\u8BB0\u6210\u6B63\u5F0F\uFF0C\u8FDB\u5EA6\u5728 GitHub Actions \u770B\u3002\u524D\u7F6E\uFF1A\u5DF2\u7ED1\u5B9A\u4ED3\u5E93\u3001\u6709\u6E05\u5355\u3001\u6BCF\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\uFF1Bowner-only",
23904
23916
  args: DeployPersonaArgsSchema
23905
23917
  },
23906
23918
  "shift:list": {
@@ -24279,6 +24291,14 @@ var METHOD_DOCS = {
24279
24291
  summary: "\u767B\u51FA\u98DE\u4E66\u8EAB\u4EFD\uFF08\u6E05 owner-identity \u843D\u76D8\uFF09\u3002owner-only",
24280
24292
  args: NO_ARGS
24281
24293
  },
24294
+ "auth:apiKey:get": {
24295
+ summary: "\u8BFB\u56DE\u81EA\u5DF1\u90A3\u628A\u4E91 persona \u8C03\u7528 key\uFF08\u6CA1\u53D1\u8FC7 \u2192 apiKey:null\uFF09\u3002daemon \u62FF\u672C\u673A\u767B\u5F55\u51ED\u8BC1\u5411\u4E2D\u5FC3\u4EE3\u53D6\uFF0C\u51ED\u8BC1\u4E0D\u51FA ws\u3002owner-only",
24296
+ args: NO_ARGS
24297
+ },
24298
+ "auth:apiKey:regenerate": {
24299
+ summary: "\u6362\u4E00\u628A\u65B0\u7684\u4E91 persona \u8C03\u7528 key\uFF0C**\u65E7\u7684\u5F53\u573A\u5931\u6548**\uFF08\u4E00\u4EBA\u4E00\u628A\uFF0C\u4E2D\u5FC3\u6309 union_id \u8986\u76D6\uFF09\u3002owner-only",
24300
+ args: NO_ARGS
24301
+ },
24282
24302
  "device:list": {
24283
24303
  summary: "\u5217\u51FA\u516C\u5171\u8BBE\u5907\u76EE\u5F55\u91CC\u53EF\u8FDE\u63A5\u7684\u8BBE\u5907\uFF08daemon \u4EE3\u7406\u4E2D\u5FC3 server\uFF09\u3002owner-only",
24284
24304
  args: NO_ARGS
@@ -82,7 +82,7 @@ call({ method: "deploy:reportFinding", args: {
82
82
  - 一份凭据含多个字段就把多个环境变量都列进 `env`(AK 是 id+secret 两个,supabase 是四个)
83
83
  - **绝对不要把凭据的值写进来**,哪怕你在文件里看到了明文的 key。你只报告「这里需要一份
84
84
  supabase 凭据」,值由老板另外填进仓库的 GitHub Secrets。看到明文 key 也不要复述它的内容。
85
- - **不要判断这条凭据该谁出**(部署者出还是使用者自带)。那是老板的决定,不是你能扫出来的。
85
+ - **不要判断这条凭据该谁出**。凭据全部由部署者提供,清单只说需要什么。
86
86
 
87
87
  ### kind: "asset" —— persona 目录之外的共享资产
88
88