@clawos-dev/clawd 0.2.620 → 0.2.621
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.
- package/dist/app-builder-plugin/mcp-server.cjs +73 -567
- package/dist/cli.cjs +165 -1023
- package/dist/dispatch/mcp-server.cjs +73 -567
- package/dist/persona-defaults/persona-app-builder/mcp/clawd-app-builder/deploy-kit/scripts/ensure-credentials.sh +10 -47
- package/dist/persona-defaults/persona-app-builder/mcp/clawd-app-builder/deploy-kit/scripts/ensure-toolchain.sh +3 -17
- package/dist/persona-defaults/persona-app-builder/mcp/clawd-app-builder/deploy-kit/scripts/new-extension.sh +8 -21
- package/dist/persona-defaults/persona-app-builder/mcp/clawd-app-builder/deploy-kit/scripts/publish.sh +14 -67
- package/dist/persona-defaults/persona-app-builder/mcp/clawd-app-builder/deploy-kit/scripts/remove-extension.sh +6 -24
- package/dist/persona-defaults/persona-app-builder/mcp/clawd-app-builder/deploy-kit/scripts/verify.sh +3 -15
- package/dist/persona-defaults/persona-app-builder/mcp/clawd-app-builder/mcp-server.cjs +73 -567
- package/dist/persona-defaults/persona-dataclaw-builder/extension-kit/hooks/pre-deploy.sh +0 -2
- package/dist/persona-defaults/persona-dataclaw-builder/mcp/clawd-app-builder/deploy-kit/scripts/ensure-credentials.sh +10 -47
- package/dist/persona-defaults/persona-dataclaw-builder/mcp/clawd-app-builder/deploy-kit/scripts/ensure-toolchain.sh +3 -17
- package/dist/persona-defaults/persona-dataclaw-builder/mcp/clawd-app-builder/deploy-kit/scripts/new-extension.sh +8 -21
- package/dist/persona-defaults/persona-dataclaw-builder/mcp/clawd-app-builder/deploy-kit/scripts/publish.sh +14 -67
- package/dist/persona-defaults/persona-dataclaw-builder/mcp/clawd-app-builder/deploy-kit/scripts/remove-extension.sh +6 -24
- package/dist/persona-defaults/persona-dataclaw-builder/mcp/clawd-app-builder/deploy-kit/scripts/verify.sh +3 -15
- package/dist/persona-defaults/persona-dataclaw-builder/mcp/clawd-app-builder/mcp-server.cjs +73 -567
- package/dist/pi-mcp-bridge/extension.cjs +0 -1
- package/package.json +1 -1
|
@@ -21338,14 +21338,11 @@ var SubscriptionChannelActivateArgsSchema = external_exports.object({
|
|
|
21338
21338
|
var TOKEN_ROLES = ["owner"];
|
|
21339
21339
|
var GROUP_FILE_SOURCES = ["agent", "owner", "user-upload"];
|
|
21340
21340
|
var GroupFileEntrySchema = external_exports.object({
|
|
21341
|
-
/** daemon 派发的稳定 id(用于 RPC remove / UI key) */
|
|
21342
21341
|
id: external_exports.string().min(1),
|
|
21343
|
-
/**
|
|
21342
|
+
/** Current entries may be absolute; legacy entries can be relative to session.cwd. */
|
|
21344
21343
|
relPath: external_exports.string().min(1),
|
|
21345
21344
|
from: external_exports.enum(GROUP_FILE_SOURCES),
|
|
21346
|
-
/** owner 手动加入时的可选备注 */
|
|
21347
21345
|
label: external_exports.string().optional(),
|
|
21348
|
-
/** 文件字节数(stat 时拍) */
|
|
21349
21346
|
size: external_exports.number().int().nonnegative(),
|
|
21350
21347
|
mime: external_exports.string().min(1),
|
|
21351
21348
|
/** 加入清单时间戳(ms) */
|
|
@@ -21356,19 +21353,15 @@ var GroupFileEntrySchema = external_exports.object({
|
|
|
21356
21353
|
stale: external_exports.boolean().optional()
|
|
21357
21354
|
});
|
|
21358
21355
|
var AttachmentSignUrlArgs = external_exports.object({
|
|
21359
|
-
/** 群文件所属的 session */
|
|
21360
21356
|
sessionId: external_exports.string().min(1),
|
|
21361
|
-
/**
|
|
21357
|
+
/** Absolute path or legacy cwd-relative path; normalized for group ACL matching. */
|
|
21362
21358
|
relPath: external_exports.string().min(1),
|
|
21363
21359
|
/** TTL 秒数;缺省 / null = 永久 URL(不带 e 字段);只有显式传秒数才限时 */
|
|
21364
21360
|
ttlSeconds: external_exports.number().int().positive().nullable().optional(),
|
|
21365
|
-
/**
|
|
21366
|
-
* /share/md/... viewer URL(同一签名,daemon 端换前缀),外人浏览器打开就是
|
|
21367
|
-
* drawer 同款 ReactMarkdown 渲染。FilesDrawer 等不关心渲染的 caller 不传。 */
|
|
21361
|
+
/** Select raw-file or markdown-viewer route; both use the same signature. */
|
|
21368
21362
|
view: external_exports.enum(["raw", "md-rendered"]).optional()
|
|
21369
21363
|
});
|
|
21370
21364
|
var AttachmentSignUrlResponseSchema = external_exports.object({
|
|
21371
|
-
/** 完整 URL(含 httpBaseUrl 前缀),UI 直接 window.open / 复制到剪贴板 */
|
|
21372
21365
|
url: external_exports.string().min(1),
|
|
21373
21366
|
/** 失效时间戳(ms);null = 永久 */
|
|
21374
21367
|
expiresAt: external_exports.number().int().nonnegative().nullable()
|
|
@@ -21376,7 +21369,6 @@ var AttachmentSignUrlResponseSchema = external_exports.object({
|
|
|
21376
21369
|
var AttachmentGroupAddArgs = external_exports.object({
|
|
21377
21370
|
sessionId: external_exports.string().min(1),
|
|
21378
21371
|
relPath: external_exports.string().min(1),
|
|
21379
|
-
/** owner 手动加入时可选备注;agent 自动入清单不走此 RPC */
|
|
21380
21372
|
label: external_exports.string().optional(),
|
|
21381
21373
|
/**
|
|
21382
21374
|
* 统一 RPC 鉴权(spec 2026-07-28 §8 决策 B):agent 经 clawd-rpc 调用持 owner token,
|
|
@@ -21403,9 +21395,8 @@ var AttachmentGroupListResponseSchema = external_exports.object({
|
|
|
21403
21395
|
var AttachmentUploadResponseSchema = external_exports.object({
|
|
21404
21396
|
/** sha256(bytes) 前 16 位,前端持有的稳定 ref */
|
|
21405
21397
|
attachmentId: external_exports.string().min(1),
|
|
21406
|
-
/** 完整 tunnel signed URL,前端拼 marker / 直接送 Anthropic 都用它 */
|
|
21407
21398
|
url: external_exports.string().min(1),
|
|
21408
|
-
/**
|
|
21399
|
+
/** Absolute path for subsequent group RPCs, despite the legacy field name. */
|
|
21409
21400
|
relPath: external_exports.string().min(1),
|
|
21410
21401
|
sizeBytes: external_exports.number().int().nonnegative(),
|
|
21411
21402
|
mimeType: external_exports.string().min(1)
|
|
@@ -21424,27 +21415,15 @@ var GrantSchema = external_exports.object({
|
|
|
21424
21415
|
}).strict();
|
|
21425
21416
|
var CapabilitySchema = external_exports.object({
|
|
21426
21417
|
id: external_exports.string().min(1),
|
|
21427
|
-
// sha256(token) hex 64
|
|
21428
21418
|
secretHash: external_exports.string().regex(/^[a-f0-9]{64}$/),
|
|
21429
21419
|
displayName: external_exports.string(),
|
|
21430
|
-
// 空数组合法 = 纯访客(只能 DM)
|
|
21431
21420
|
grants: external_exports.array(GrantSchema),
|
|
21432
21421
|
issuedAt: external_exports.number().int().nonnegative(),
|
|
21433
21422
|
expiresAt: external_exports.number().int().positive().optional(),
|
|
21434
21423
|
maxUses: external_exports.number().int().positive().optional(),
|
|
21435
21424
|
usedCount: external_exports.number().int().nonnegative(),
|
|
21436
|
-
/**
|
|
21437
|
-
* guest 在 auth 帧捎带 selfPrincipalId 时由 AuthGate.authenticate 回写;
|
|
21438
|
-
* 未被消费的 cap 此字段缺失。
|
|
21439
|
-
*/
|
|
21440
21425
|
peerOwnerId: external_exports.string().min(1).optional(),
|
|
21441
|
-
/** 首次 client hello 时间戳(与 peerOwnerId 同步写入) */
|
|
21442
21426
|
firstUsedByPeerAt: external_exports.number().int().positive().optional(),
|
|
21443
|
-
/**
|
|
21444
|
-
* 对方 daemon owner 的 displayName,guest auth 帧 selfDisplayName 触发
|
|
21445
|
-
* recordPeerHello 时同步回写。视角 B (2026-05-23) UI 派生联系人列表用此字段
|
|
21446
|
-
* 显示对方名字(避免 fallback 到我颁 cap 时填的 displayName)。
|
|
21447
|
-
*/
|
|
21448
21427
|
peerDisplayName: external_exports.string().optional()
|
|
21449
21428
|
}).strict();
|
|
21450
21429
|
var CapabilityWireSchema = CapabilitySchema.omit({ secretHash: true });
|
|
@@ -21454,9 +21433,7 @@ var WhoamiResponseSchema = external_exports.object({
|
|
|
21454
21433
|
id: external_exports.string(),
|
|
21455
21434
|
kind: external_exports.enum(["owner", "guest"]),
|
|
21456
21435
|
displayName: external_exports.string(),
|
|
21457
|
-
/** 归属人 id(决策 #16:TTC unique_id 等,落 contact.ownerId) */
|
|
21458
21436
|
ownerId: external_exports.string(),
|
|
21459
|
-
/** 身份来源(决策 #16:'ttc'/'google',落 contact.provider) */
|
|
21460
21437
|
provider: external_exports.string()
|
|
21461
21438
|
}).strict(),
|
|
21462
21439
|
capability: CapabilityWireSchema,
|
|
@@ -21515,27 +21492,10 @@ var EnvArtifactSchema = external_exports.object({
|
|
|
21515
21492
|
size: external_exports.number().int().positive()
|
|
21516
21493
|
});
|
|
21517
21494
|
var EnvPackageSchema = external_exports.object({
|
|
21518
|
-
// 装完后在 PATH 里能直接调到的名字('aliyun' / 's' / 'pnpm' / 'python3');npm 包报 bin 名,包名进 from
|
|
21519
21495
|
name: external_exports.string().min(1),
|
|
21520
|
-
/**
|
|
21521
|
-
* 从哪装,约定 `<kind>:<ref>`:`npm:@serverless-devs/s` / `github:aliyun/aliyun-cli` /
|
|
21522
|
-
* `apt:python3`。
|
|
21523
|
-
*
|
|
21524
|
-
* **不是装饰字段,是构建器的必需输入**:可执行名往往推不出安装源——Serverless Devs 的命令
|
|
21525
|
-
* 就叫单个字母 `s`,没人能从 's' 猜到要 `npm i -g @serverless-devs/s`;`aliyun` 也不在
|
|
21526
|
-
* apt 源里,得从 GitHub release 拉 tarball。扫描器读 ensure-toolchain.sh 的时候本来就看见
|
|
21527
|
-
* 了这些,顺手带出来即可。
|
|
21528
|
-
*
|
|
21529
|
-
* 它同时解决人的阅读问题:单据上只写一个 `s`,看的人不知道那是什么东西。
|
|
21530
|
-
*
|
|
21531
|
-
* 允许缺省:扫描器拿不准安装源时不该编一个(编错了构建期才炸,还查不出来源)。缺省时构建
|
|
21532
|
-
* 器会失败或猜错,流水线当场红——这跟整体「宁可让流水线发现,不要靠猜」的取向一致。
|
|
21533
|
-
*
|
|
21534
|
-
* 只给一个源,不给平台回落链:本地那套 brew → GitHub → npm 的三级兜底是
|
|
21535
|
-
* ensure-toolchain.sh 的事,云上只构一个镜像、一个基础环境,多给反而要求构建器做选择。
|
|
21536
|
-
*/
|
|
21496
|
+
/** Installation source, not inferable from executable name. A missing source remains unresolved rather than invented; cloud uses one source instead of local fallback chains. */
|
|
21537
21497
|
from: external_exports.string().optional(),
|
|
21538
|
-
//
|
|
21498
|
+
// Exact requested version; daemon can use local version for non-apt packages. Apt versions follow the cloud Debian repository; absence means unpinned.
|
|
21539
21499
|
version: external_exports.string().optional(),
|
|
21540
21500
|
// 版本下限('20.6' 这种)。与 version 的区别:version 是「就要这个」,min 是「不低于」。
|
|
21541
21501
|
// 两者都缺省即完全不约束。
|
|
@@ -21551,7 +21511,6 @@ var EnvPackageSchema = external_exports.object({
|
|
|
21551
21511
|
* 与 version 并存:老板事后在页面上手改 version(显式接受差异)时,version ≠ localVersion 一眼可见。
|
|
21552
21512
|
*/
|
|
21553
21513
|
localVersion: external_exports.string().optional(),
|
|
21554
|
-
/** `github:` 专用——那个版本是哪个文件。见 EnvArtifactSchema */
|
|
21555
21514
|
artifact: EnvArtifactSchema.optional(),
|
|
21556
21515
|
/**
|
|
21557
21516
|
* `apt:` 专用——daemon 上报时查过底座那个 Debian(CLOUD_DEBIAN)的仓库,**没有**这个包。云上装不了,怎么办由老板在页面上定(换源 / 去掉 / 接受);
|
|
@@ -21566,7 +21525,6 @@ var EnvPackageSchema = external_exports.object({
|
|
|
21566
21525
|
aptVersion: external_exports.string().optional()
|
|
21567
21526
|
});
|
|
21568
21527
|
var EnvSecretSchema = external_exports.object({
|
|
21569
|
-
// 凭据的命名引用('aliyun-ak' / 'supabase-shared')。部署时按这个名字去解析实际的值。
|
|
21570
21528
|
name: external_exports.string().min(1),
|
|
21571
21529
|
// 解析出的值注入到哪些环境变量。一份凭据可含多个字段(AK 是 id+secret 两个,
|
|
21572
21530
|
// supabase 是 url/anon/service-role/jwt 四个),所以是数组不是单值。
|
|
@@ -21604,7 +21562,6 @@ var normalizeLegacyManifest = (v) => {
|
|
|
21604
21562
|
return o;
|
|
21605
21563
|
};
|
|
21606
21564
|
var MANIFEST_BODY = {
|
|
21607
|
-
// 构镜像时要装进去的所有东西(工具 / 运行时 / 包)。底座已有的构建器会跳过;persona 目录整个进镜像,不在这里列
|
|
21608
21565
|
packages: external_exports.array(EnvPackageSchema),
|
|
21609
21566
|
secrets: external_exports.array(EnvSecretSchema),
|
|
21610
21567
|
/**
|
|
@@ -21627,9 +21584,7 @@ var EnvironmentManifestSchema = external_exports.preprocess(normalizeLegacyManif
|
|
|
21627
21584
|
var EnvEvidenceSchema = external_exports.object({
|
|
21628
21585
|
// 这条证据支持的是哪一项:`${kind}:${name}`,如 'package:aliyun' / 'secret:aliyun-ak' / 'connector:feishu'
|
|
21629
21586
|
target: external_exports.string().min(1),
|
|
21630
|
-
// 一句人话:为什么需要它 + 从哪看出来的。单据默认显示这句。
|
|
21631
21587
|
reason: external_exports.string().min(1),
|
|
21632
|
-
// persona 目录内的相对路径('CLAUDE.md' / '.claude/skills/foo/SKILL.md')
|
|
21633
21588
|
file: external_exports.string().min(1),
|
|
21634
21589
|
// 原文摘录(一两句即可,不是整段)。默认收起,起疑时才看。
|
|
21635
21590
|
//
|
|
@@ -21649,35 +21604,15 @@ var DeployScanStatusSchema = external_exports.enum(["scanning", "done", "failed"
|
|
|
21649
21604
|
var DeployScanSchema = external_exports.object({
|
|
21650
21605
|
/** 历史里指名用(发布 / patch / putSecret 都按它找)。daemon 生成;存量单条记录迁过来的叫 `legacy` */
|
|
21651
21606
|
id: external_exports.string().min(1),
|
|
21652
|
-
/**
|
|
21653
|
-
* 这次扫描的清单——原来在 `deploy.json` 里的那份,现在每次扫描各存一份。
|
|
21654
|
-
* 扫描期由 `deploy:reportFinding` 逐条长出来,扫完人在页面上改(`deploy:patch`)也改这份;
|
|
21655
|
-
* 发布时选中的那条被写成 `deploy.json` 进仓库。
|
|
21656
|
-
*/
|
|
21607
|
+
/** Scan findings and manual patches modify this snapshot; release writes the selected snapshot into deploy.json. */
|
|
21657
21608
|
manifest: EnvironmentManifestSchema,
|
|
21658
|
-
/** 干这次扫描的 butler 会话,「看它怎么干的」入口 */
|
|
21659
21609
|
scanSessionId: external_exports.string().optional(),
|
|
21660
21610
|
status: DeployScanStatusSchema,
|
|
21661
21611
|
evidence: external_exports.array(EnvEvidenceSchema).default([]),
|
|
21662
21612
|
notes: external_exports.array(external_exports.string()).default([]),
|
|
21663
|
-
/**
|
|
21664
|
-
* 这次扫描是**对哪个内容版本的断言**:起扫描前先把 persona 目录提交到本地(只提交不推,推是发布的事),
|
|
21665
|
-
* 落存那一下的 HEAD 就是它——发布 commit 不算内容版本,见 `contentHeadOf`。所以这个值一定是仓库里真实存在的一版,
|
|
21666
|
-
* 同一内容上扫几次 `head` 都相同。**从此不动**:发布不再把它挪成发布 commit(线上是哪版记在 `DeployReleased` 里)。
|
|
21667
|
-
*
|
|
21668
|
-
* 有了它,「清单过没过时」才是个可判定的等式(`head === contentHeadOf(repo, released)`),
|
|
21669
|
-
* 而不是从 `dirty` / `ahead` 里猜——那两个字段判不出「清单是好几版之前扫的」。
|
|
21670
|
-
*
|
|
21671
|
-
* 缺席 = 旧版 clawd 扫的记录。**一律当过时**:没有第三种情况,重扫一次就有了。
|
|
21672
|
-
*/
|
|
21613
|
+
/** Immutable content commit asserted by this scan. Missing on old records means stale; release commits are tracked separately. */
|
|
21673
21614
|
head: external_exports.string().min(1).optional(),
|
|
21674
|
-
/**
|
|
21675
|
-
* 这次**实际**怎么扫的。档位由 daemon 定(有线上版本可比 + 有跑完的清单 → 软扫,否则硬扫),
|
|
21676
|
-
* 页面要显示的是真正发生的那个。
|
|
21677
|
-
*
|
|
21678
|
-
* `.default('hard')` 而不是必填:这个文件是 strict 解析的,存量记录没有这个字段,
|
|
21679
|
-
* 定成必填会让 `readScan` 当场抛、上云页面直接打不开。而老记录确实都是从零扫的。
|
|
21680
|
-
*/
|
|
21615
|
+
/** Actual scan mode, including fallback. Default hard keeps pre-field records readable because those scans were full scans. */
|
|
21681
21616
|
baseKind: ScanBaseKindSchema.default("hard"),
|
|
21682
21617
|
/** 软扫比的那个 commit(= 当时 `DeployReleased.head`)。硬扫时缺席 */
|
|
21683
21618
|
base: external_exports.string().min(1).optional(),
|
|
@@ -21700,17 +21635,8 @@ var DeployRepoSchema = external_exports.object({
|
|
|
21700
21635
|
url: external_exports.string().min(1),
|
|
21701
21636
|
branch: external_exports.string().min(1),
|
|
21702
21637
|
head: external_exports.string().min(1),
|
|
21703
|
-
/**
|
|
21704
|
-
* persona 的**内容**有没有未提交的改动。
|
|
21705
|
-
*
|
|
21706
|
-
* **两个文件不算**(daemon 侧 `repoInfo` 的 `DIRTY_IGNORED` 把它们排出了 pathspec):
|
|
21707
|
-
* - `.clawd/deploy.json`——发布产物,`deploy:release` 那一刻整份重写;算进来的话发布前后那几秒页面会闪「有未提交的改动」
|
|
21708
|
-
* - `.clawd/persona.json`——结构化配置(tool / model / size …),扫描不读它、流水线从发布 commit 读它,改了不需要重扫
|
|
21709
|
-
* (design 2026-09-21-deploy-page-polish §3.4)
|
|
21710
|
-
* `.clawd/` 下别的、以及 persona 的内容(CLAUDE.md / skills / .mcp.json)照旧算。
|
|
21711
|
-
*/
|
|
21638
|
+
/** Uncommitted persona content, excluding release output and structured persona configuration, neither of which requires rescanning. */
|
|
21712
21639
|
dirty: external_exports.boolean(),
|
|
21713
|
-
/** 本地领先远端几个提交 */
|
|
21714
21640
|
ahead: external_exports.number()
|
|
21715
21641
|
}).strict();
|
|
21716
21642
|
var DeploySecretPresenceSchema = external_exports.object({
|
|
@@ -21724,7 +21650,6 @@ var DeployStageKeySchema = external_exports.enum(DEPLOY_STAGE_KEYS);
|
|
|
21724
21650
|
var DeployJobSchema = external_exports.object({
|
|
21725
21651
|
key: DeployStageKeySchema,
|
|
21726
21652
|
status: DeployStageStatusSchema,
|
|
21727
|
-
/** 这个 job 在 GitHub 上的页面。还没跑起来的段没有 */
|
|
21728
21653
|
url: external_exports.string().optional(),
|
|
21729
21654
|
/** GitHub 的 job databaseId,`gh run rerun --job` 要用。还没跑起来的段没有 */
|
|
21730
21655
|
jobId: external_exports.number().optional(),
|
|
@@ -21751,9 +21676,7 @@ var DeployStateSchema = external_exports.object({
|
|
|
21751
21676
|
/** 本机 GitHub 身份(机器级,githubAuth:* 的同一份;上云页顶上那张卡用)。老 daemon 不给(可选只为兼容),UI 缺席时按未知处理 */
|
|
21752
21677
|
github: GithubAuthStatusSchema.optional(),
|
|
21753
21678
|
repo: DeployRepoSchema.optional(),
|
|
21754
|
-
/** 扫描历史,升序,最后一条最新。没扫过就是空数组 */
|
|
21755
21679
|
scans: external_exports.array(DeployScanSchema).default([]),
|
|
21756
|
-
/** 发布历史,升序,最后一条 = 线上正跑的那版。从没发布过就是空数组 */
|
|
21757
21680
|
releases: external_exports.array(DeployReleasedSchema).default([]),
|
|
21758
21681
|
/** 没仓库时缺席(查不了) */
|
|
21759
21682
|
secrets: external_exports.array(DeploySecretPresenceSchema).optional(),
|
|
@@ -21768,7 +21691,6 @@ var DeployStateSchema = external_exports.object({
|
|
|
21768
21691
|
* 不看 `releases`:发布过不等于还在线上(下线过、或者被人用脚本撤了)
|
|
21769
21692
|
*/
|
|
21770
21693
|
online: external_exports.boolean().optional(),
|
|
21771
|
-
/** 最新那次下线流水线。没下线过 / 没仓库 / 没 GitHub 身份 / 查不到都缺席 */
|
|
21772
21694
|
unpublish: DeployUnpublishRunSchema.optional(),
|
|
21773
21695
|
/**
|
|
21774
21696
|
* `.clawd/deploy-scan.json` 读不出来(坏 JSON / 不合形状)时的人话。有它 `scans` 为空。
|
|
@@ -21798,7 +21720,6 @@ var DeployReleaseArgsSchema = DeployPersonaArgsSchema.extend({
|
|
|
21798
21720
|
}).strict();
|
|
21799
21721
|
var DeployPatchArgsSchema = external_exports.object({
|
|
21800
21722
|
personaId: external_exports.string().min(1),
|
|
21801
|
-
/** 改的是历史里哪次扫描的清单。扫描期 butler 删条目也走这条(scanId 在它的任务提示里) */
|
|
21802
21723
|
scanId: external_exports.string().min(1),
|
|
21803
21724
|
patch: external_exports.object({
|
|
21804
21725
|
/**
|
|
@@ -21806,10 +21727,7 @@ var DeployPatchArgsSchema = external_exports.object({
|
|
|
21806
21727
|
* aptMissing、连接器上点过的 credentialSource / auth)快照里缺了会从记录里补回——旧快照冲不掉它们。
|
|
21807
21728
|
*/
|
|
21808
21729
|
manifest: EnvironmentManifestSchema.optional(),
|
|
21809
|
-
/**
|
|
21810
|
-
* 只换清单里**同名那一条**连接器(上云页连接器卡片上的点选走这条)。不带整份清单:页面手里的清单可能是旧快照,
|
|
21811
|
-
* 整份写回会把 daemon 之后写进去的东西冲掉(2026-09-23 persona-log-tracer 的 hbi 资产就是这么丢的)。同名的不在 → 拒
|
|
21812
|
-
*/
|
|
21730
|
+
/** Replace one named connector to avoid overwriting newer unrelated fields with a stale UI manifest snapshot. Missing names reject. */
|
|
21813
21731
|
connector: EnvConnectorSchema.optional()
|
|
21814
21732
|
}).strict()
|
|
21815
21733
|
}).strict();
|
|
@@ -21817,7 +21735,6 @@ var DeployPutSecretArgsSchema = external_exports.object({
|
|
|
21817
21735
|
personaId: external_exports.string().min(1),
|
|
21818
21736
|
/** 按哪次扫描的清单校验凭据名 / env 名。值本身是仓库级的(GitHub Secrets),跟扫描无关 */
|
|
21819
21737
|
scanId: external_exports.string().min(1),
|
|
21820
|
-
// 对应 manifest.secrets[].name
|
|
21821
21738
|
name: external_exports.string().min(1),
|
|
21822
21739
|
// 环境变量名 → 值。key 必须是该 secret 声明过的 env 之一,handler 校验。
|
|
21823
21740
|
values: external_exports.record(external_exports.string(), external_exports.string())
|
|
@@ -21831,7 +21748,6 @@ var DeploySetEngineAuthArgsSchema = external_exports.object({
|
|
|
21831
21748
|
});
|
|
21832
21749
|
var DeployRerunJobArgsSchema = external_exports.object({
|
|
21833
21750
|
personaId: external_exports.string().min(1),
|
|
21834
|
-
/** GitHub 的 job databaseId。**是数字**——字符串会在拼命令时静默出错 */
|
|
21835
21751
|
jobId: external_exports.number()
|
|
21836
21752
|
}).strict();
|
|
21837
21753
|
var DeployReportFindingArgsSchema = external_exports.object({
|
|
@@ -21912,38 +21828,17 @@ var ContactSchema = external_exports.object({
|
|
|
21912
21828
|
ownerId: external_exports.string().min(1),
|
|
21913
21829
|
/** 身份来源(决策 #16):'ttc'(飞书/手机/邮箱登入 TTC)| 'google' | ...,token 背书 */
|
|
21914
21830
|
provider: external_exports.string().min(1),
|
|
21915
|
-
/** 联系人显示名 */
|
|
21916
21831
|
displayName: external_exports.string(),
|
|
21917
|
-
/** 该设备可达的 ws/tunnel 地址 */
|
|
21918
21832
|
remoteUrl: external_exports.string().min(1),
|
|
21919
|
-
//
|
|
21920
|
-
// 联系人,但它不持有 A 颁发的 token(A 从未给它换票)→ connectToken 为空串。
|
|
21921
|
-
// device:connect 出站路径仍存中心 server 签发的真实 connect token(断线重连复用)。
|
|
21922
|
-
// 不用 .min(1):自动反向路径合法地存空串,禁止填假 token 占位(不造假数据)。
|
|
21833
|
+
// Accept historical empty tokens for schema compatibility. Current handshake paths exchange a real audience-bound token before storing.
|
|
21923
21834
|
connectToken: external_exports.string(),
|
|
21924
21835
|
grants: external_exports.array(GrantSchema),
|
|
21925
21836
|
addedAt: external_exports.number().int().nonnegative(),
|
|
21926
|
-
/**
|
|
21927
|
-
* pin 时间戳(ms,Date.now() 语义);null = 未 pin。sidebar 顶部固定区渲染由此驱动。
|
|
21928
|
-
* 老 contacts.json 缺此字段 → zod default 补 null(无破坏性升级;不 orphan)。
|
|
21929
|
-
* 对齐 SessionFile.pinnedAt 语义(daemon 侧持久化,contact:pin RPC 更新 → contact:pinned push)。
|
|
21930
|
-
*/
|
|
21837
|
+
/** Pin timestamp in ms; null means unpinned. The default preserves records created before this field existed. */
|
|
21931
21838
|
pinnedAt: external_exports.number().int().nullable().default(null),
|
|
21932
|
-
/**
|
|
21933
|
-
* 远程访问授权(spec 2026-07-16)。owner 视角:允许该 contact 反向操作我的设备——
|
|
21934
|
-
* 跨设备 exec 的总开关(peerExec:run handler 运行时判它)。default=false,owner 显式开。
|
|
21935
|
-
* 授权粒度 per-people (per-contact):借用别人 persona 本来就带信任对方本人的前提。
|
|
21936
|
-
*/
|
|
21839
|
+
/** Owner-controlled permission for this contact to execute commands on the local device. Default denial requires explicit opt-in. */
|
|
21937
21840
|
remoteAccessAllowed: external_exports.boolean().default(false),
|
|
21938
|
-
/**
|
|
21939
|
-
* owner 给这台设备写的备注(2026-08-31)。**我对他那台机器的私记**,不上行、不同步给对方。
|
|
21940
|
-
*
|
|
21941
|
-
* 动机:一人多设备时卡片里只能显示 deviceId(`owner-8bf96a56-6b7e-…` 这种 uuid),
|
|
21942
|
-
* 认不出哪台是哪台。备注让用户能写「老王的 MacBook」。
|
|
21943
|
-
*
|
|
21944
|
-
* 空串 = 没写。default('') 兼容老 contacts.json(无破坏性升级,不 orphan)。
|
|
21945
|
-
* 跟 pinnedAt / remoteAccessAllowed 同类:owner 已配置状态,重复建联 upsert 必须保留。
|
|
21946
|
-
*/
|
|
21841
|
+
/** Local-only owner note. Empty-string default preserves older records; repeated handshakes must retain it. */
|
|
21947
21842
|
note: external_exports.string().default("")
|
|
21948
21843
|
}).strict();
|
|
21949
21844
|
var ContactWireSchema = ContactSchema;
|
|
@@ -21998,9 +21893,7 @@ var DeviceEntrySchema = external_exports.object({
|
|
|
21998
21893
|
* 中心 server clawd_devices 注册表仅作服务发现(url 下发 + 目录),不在安全路径上。
|
|
21999
21894
|
*/
|
|
22000
21895
|
deviceId: external_exports.string().min(1),
|
|
22001
|
-
/** 显示名 */
|
|
22002
21896
|
name: external_exports.string().min(1),
|
|
22003
|
-
/** ws/tunnel 地址 */
|
|
22004
21897
|
url: external_exports.string().min(1)
|
|
22005
21898
|
});
|
|
22006
21899
|
var DeviceListResponseSchema = external_exports.object({
|
|
@@ -22008,7 +21901,6 @@ var DeviceListResponseSchema = external_exports.object({
|
|
|
22008
21901
|
devices: external_exports.array(DeviceEntrySchema)
|
|
22009
21902
|
});
|
|
22010
21903
|
var DeviceConnectArgsSchema = external_exports.object({
|
|
22011
|
-
/** 目标设备的 deviceId(对方 daemon 生成的 dev-<uuid>) */
|
|
22012
21904
|
deviceId: external_exports.string().min(1),
|
|
22013
21905
|
/**
|
|
22014
21906
|
* 目标设备的 ws/tunnel 地址(可选):
|
|
@@ -22017,12 +21909,11 @@ var DeviceConnectArgsSchema = external_exports.object({
|
|
|
22017
21909
|
* - 注册表不在安全路径上:知道对方 url 时显式传入即可连接(不依赖中心 server 服务发现)
|
|
22018
21910
|
*/
|
|
22019
21911
|
url: external_exports.string().min(1).optional(),
|
|
22020
|
-
/**
|
|
21912
|
+
/** Optional display name; otherwise populate it from the handshake acknowledgement. */
|
|
22021
21913
|
name: external_exports.string().optional()
|
|
22022
21914
|
});
|
|
22023
21915
|
var DeviceConnectResponseSchema = external_exports.object({
|
|
22024
21916
|
type: external_exports.literal("device:connect:ok"),
|
|
22025
|
-
/** 连接的目标设备标识(= 请求 args.deviceId) */
|
|
22026
21917
|
deviceId: external_exports.string(),
|
|
22027
21918
|
name: external_exports.string(),
|
|
22028
21919
|
url: external_exports.string()
|
|
@@ -22032,7 +21923,6 @@ var FeishuIdentitySchema = external_exports.object({
|
|
|
22032
21923
|
ownerId: external_exports.string().min(1),
|
|
22033
21924
|
/** 身份来源:'ttc'(飞书/手机/邮箱登入 TTC)| 'google' | ...(决策 #16,拓展用) */
|
|
22034
21925
|
provider: external_exports.string().min(1),
|
|
22035
|
-
/** 显示名。TTC user_info 接口 data.name */
|
|
22036
21926
|
displayName: external_exports.string().min(1),
|
|
22037
21927
|
/** TTC user_info 接口 data.avatar_url,可缺省 */
|
|
22038
21928
|
avatarUrl: external_exports.string().optional(),
|
|
@@ -22041,7 +21931,6 @@ var FeishuIdentitySchema = external_exports.object({
|
|
|
22041
21931
|
});
|
|
22042
21932
|
var AuthLoginStartResponseSchema = external_exports.object({
|
|
22043
21933
|
type: external_exports.literal("auth:login:start:ok"),
|
|
22044
|
-
/** 完整 TTC 授权页 URL(含 callback_url + state + auto=1),UI 直接 window.open */
|
|
22045
21934
|
authUrl: external_exports.string().min(1),
|
|
22046
21935
|
/** 防 CSRF 的一次性 nonce;回调时 daemon 校验 */
|
|
22047
21936
|
state: external_exports.string().min(1)
|
|
@@ -22050,11 +21939,7 @@ var AuthGetIdentityResponseSchema = external_exports.object({
|
|
|
22050
21939
|
type: external_exports.literal("auth:getIdentity:ok"),
|
|
22051
21940
|
/** null = 未登录 */
|
|
22052
21941
|
identity: FeishuIdentitySchema.nullable(),
|
|
22053
|
-
/**
|
|
22054
|
-
* 本机设备标识(决策 #15:daemon 生成并持久化在 auth.json,如 dev-<uuid>)。
|
|
22055
|
-
* 设备属性,与登录态无关、登录登出不变。UI"我的设备标识"用它拼
|
|
22056
|
-
* clawos://device/<deviceId>(替代旧的 unionId——不再向外暴露人的身份标识)。
|
|
22057
|
-
*/
|
|
21942
|
+
/** Stable device identifier independent of login, used for the shareable device link. */
|
|
22058
21943
|
deviceId: external_exports.string().min(1)
|
|
22059
21944
|
});
|
|
22060
21945
|
var AuthLogoutResponseSchema = external_exports.object({
|
|
@@ -22105,39 +21990,21 @@ var DispatchOutcomeSchema = external_exports.discriminatedUnion("kind", [
|
|
|
22105
21990
|
})
|
|
22106
21991
|
]);
|
|
22107
21992
|
var DispatchRunArgsSchema = external_exports.object({
|
|
22108
|
-
// 新开必填;续派(dispatchId 非空)时可省略——targetPersonaId 从台账行取。
|
|
22109
21993
|
targetPersona: external_exports.string().min(1).optional(),
|
|
22110
21994
|
// 续派(spec 2026-07-21,单 dispatchId 语义:一件事一行一 id):非空 = 把 prompt
|
|
22111
21995
|
// 作为新 turn 打进该 dispatch 的原 worker session 接着干(台账行复位 running)。
|
|
22112
21996
|
// 省略 = 新开一件事,daemon 铸新 id。
|
|
22113
21997
|
dispatchId: external_exports.string().min(1).optional(),
|
|
22114
21998
|
prompt: external_exports.string(),
|
|
22115
|
-
// 派活方写的 2-3 句摘要(与 prompt 同源同结构)。落台账 `taskBrief` + 进任务包信封
|
|
22116
|
-
// `<brief>`,worker session 的卡片头常显。optional 同 DispatchOutcome.brief 的理由。
|
|
22117
21999
|
brief: external_exports.string().optional(),
|
|
22118
22000
|
// 跨设备 dispatch:非空 = A 角色,转发到该 contact deviceId 的 peer daemon;
|
|
22119
22001
|
// 省略 = 本地 dispatch / B 角色本地执行。A 转发给 B 时 body 不带此字段。
|
|
22120
22002
|
targetDeviceId: external_exports.string().min(1).optional(),
|
|
22121
|
-
//
|
|
22122
|
-
// 合法值集**从属于 tool**(见下面的 tool 字段):claude 侧与 tools/claude.ts
|
|
22123
|
-
// CLAUDE_MODEL_IDS 一致,codex 侧是运行时查来的模型表;handler 层做二次校验,
|
|
22124
|
-
// 非法值 fail-fast。protocol 层保持 string(不在协议里钉死枚举)。
|
|
22125
|
-
// **只能用于新开 dispatch**:续派不改任何 spawn 参数(worker session 已经跑起来了),
|
|
22126
|
-
// 与 dispatchId 互斥(下方 refine 硬拒)。
|
|
22003
|
+
// Model values depend on the selected engine and are validated against its runtime catalog. Overrides apply only to new dispatches.
|
|
22127
22004
|
model: external_exports.string().min(1).optional(),
|
|
22128
|
-
//
|
|
22129
|
-
// 语义是**一次性**——不改 persona 的持久绑定,只决定这条 dispatch 起的 worker session。
|
|
22130
|
-
// 为什么需要:`model` 的合法值集从属于 tool,想让一个 claude persona 这次用
|
|
22131
|
-
// `gpt-5.6-sol` 干活,必须能连 engine 一起换(否则 model 校验按 persona.tool 选表直接拒)。
|
|
22132
|
-
// 合法值集 = daemon 的 adapter 注册表('claude' / 'codex'),handler 层运行时校验;
|
|
22133
|
-
// protocol 层保持 string(与 model / SessionFile.tool 同款处理,不在协议里钉死枚举)。
|
|
22134
|
-
// 与 model 同样**只能用于新开 dispatch**(下方 refine 硬拒 dispatchId 组合)。
|
|
22005
|
+
// One-time engine override for the worker session; it does not change the persona binding. Validate against registered adapters at runtime.
|
|
22135
22006
|
tool: external_exports.string().min(1).optional(),
|
|
22136
|
-
//
|
|
22137
|
-
// 仅在**新开 dispatch**(dispatchId 缺席)时生效;续派(dispatchId 非空)
|
|
22138
|
-
// 时 daemon 层静默丢弃(避免半途改 label 造成 sidebar 抖动)。
|
|
22139
|
-
// 上限 60 字符——sidebar 显示 tolerance,卡在 dispatch 入口即可。
|
|
22140
|
-
// 协议层不硬拒 sessionLabel + dispatchId 同传,保留 forward-compat。
|
|
22007
|
+
// Worker label applies to new dispatches only. Follow-ups tolerate this field but do not update the running session label.
|
|
22141
22008
|
sessionLabel: external_exports.string().min(1).max(60).optional(),
|
|
22142
22009
|
// 上层消费者(Master)挂载话题/线语义:topicId / lineId / 验收标准 / rejectCount 等。
|
|
22143
22010
|
// daemon **不解释**内容,只透传进台账行 DispatchRecord.meta(新开)或与既有 meta
|
|
@@ -22163,35 +22030,17 @@ var DispatchRecordSchema = external_exports.object({
|
|
|
22163
22030
|
sourceSessionId: external_exports.string().min(1),
|
|
22164
22031
|
sourcePersonaId: external_exports.string().min(1).optional(),
|
|
22165
22032
|
targetPersonaId: external_exports.string().min(1),
|
|
22166
|
-
/**
|
|
22167
|
-
* 跨设备派活时 B 所在的设备(`DispatchRunArgs.targetDeviceId`),A 端台账记「我派给了谁的机器」。
|
|
22168
|
-
*
|
|
22169
|
-
* **缺省即本机**,与入参侧用 `undefined` 表示本机是同一条口径——不引第二种表示法。
|
|
22170
|
-
* 存量台账行没有这个字段,消费方(dispatch 卡片的归属带)据此只显示 persona、不显示设备。
|
|
22171
|
-
*
|
|
22172
|
-
* B 端自己的台账行**不会**有它:peer-forward 转发时故意 strip 掉(B 据此判定本地执行),
|
|
22173
|
-
* 那条行记的是 B 视角的本地 dispatch。
|
|
22174
|
-
*/
|
|
22033
|
+
/** A-side target device attribution; absence means local for existing records. Forwarding strips it from the B-side local ledger. */
|
|
22175
22034
|
targetDeviceId: external_exports.string().min(1).optional(),
|
|
22176
22035
|
/** B 的 sessionId;registerBSession 后回填 */
|
|
22177
22036
|
workerSessionId: external_exports.string().min(1).optional(),
|
|
22178
|
-
/** 任务摘要;截断(≤500 字符)在 daemon store.add 处保证 */
|
|
22179
22037
|
taskText: external_exports.string(),
|
|
22180
|
-
/**
|
|
22181
|
-
* 派活方写的 2-3 句任务摘要(`DispatchRunArgs.brief`)。台账列表 / butler 面板显示它
|
|
22182
|
-
* 而不是被截断到 500 字符的 `taskText` 半截原文。回报侧的 brief 随 `outcome` 已落盘,
|
|
22183
|
-
* 不在这里重复存。
|
|
22184
|
-
*/
|
|
22038
|
+
/** Explicit task summary for list/cards instead of truncated taskText; outcome owns the result summary. */
|
|
22185
22039
|
taskBrief: external_exports.string().optional(),
|
|
22186
|
-
/**
|
|
22187
|
-
* 第几轮:新开 = 1,每次续派 +1。续派**不单开分型**(一件事一行一 id),
|
|
22188
|
-
* 「第 N 轮」这个语义就落在这里,并透进任务包信封的 `round` 属性供卡片头显示。
|
|
22189
|
-
* 老台账行缺省 → 消费方按 1 处理。
|
|
22190
|
-
*/
|
|
22040
|
+
/** One ledger row across follow-up rounds. Missing on old rows is consumed as round one. */
|
|
22191
22041
|
round: external_exports.number().int().positive().optional(),
|
|
22192
22042
|
status: DispatchStatusSchema,
|
|
22193
22043
|
outcome: DispatchOutcomeSchema.optional(),
|
|
22194
|
-
/** 上层消费者语义(如司礼监的口谕/验收状态),daemon 不解释 */
|
|
22195
22044
|
meta: external_exports.record(external_exports.unknown()).optional(),
|
|
22196
22045
|
createdAt: external_exports.string().min(1),
|
|
22197
22046
|
completedAt: external_exports.string().min(1).optional(),
|
|
@@ -22200,15 +22049,7 @@ var DispatchRecordSchema = external_exports.object({
|
|
|
22200
22049
|
});
|
|
22201
22050
|
var DispatchListArgsSchema = external_exports.object({
|
|
22202
22051
|
sourceSessionId: external_exports.string().min(1).optional(),
|
|
22203
|
-
/**
|
|
22204
|
-
* 「**这条会话卷入的**所有台账行」:`sourceSessionId === it || workerSessionId === it`。
|
|
22205
|
-
*
|
|
22206
|
-
* 为什么不复用 `sourceSessionId`:一条会话既可能是派活方(在自己这儿看回报卡),也可能是
|
|
22207
|
-
* 干活方(在 worker 会话里看任务包),后者用 sourceSessionId 过滤一条也查不到。UI 的
|
|
22208
|
-
* dispatch 卡片要的正是「跟我这条会话有关的全部 dispatch」,一次调用答完,不必拉全量再本地筛。
|
|
22209
|
-
*
|
|
22210
|
-
* 与 `sourceSessionId` 同时给时两个条件都要满足(AND),但调用方没有这么用的场景。
|
|
22211
|
-
*/
|
|
22052
|
+
/** Include rows where this session is either source or worker. If sourceSessionId is also provided, both filters must match. */
|
|
22212
22053
|
relatedSessionId: external_exports.string().min(1).optional()
|
|
22213
22054
|
});
|
|
22214
22055
|
var DispatchListResultSchema = external_exports.object({
|
|
@@ -22409,7 +22250,6 @@ var InboxPostMessageArgsSchema = external_exports.object({
|
|
|
22409
22250
|
id: external_exports.string().min(1),
|
|
22410
22251
|
text: external_exports.string().min(1),
|
|
22411
22252
|
createdAt: external_exports.number().int().nonnegative(),
|
|
22412
|
-
// persona 代发署名(跨 daemon forward 时随远程腿透传;真人发缺省)。
|
|
22413
22253
|
origin: external_exports.object({ kind: external_exports.literal("persona"), personaId: external_exports.string().min(1) }).optional()
|
|
22414
22254
|
}).strict();
|
|
22415
22255
|
var InboxListArgsSchema = external_exports.object({
|
|
@@ -22504,7 +22344,6 @@ var ChannelMemberPersonaSchema = external_exports.object({
|
|
|
22504
22344
|
var ChannelSchema = external_exports.object({
|
|
22505
22345
|
id: external_exports.string().min(1),
|
|
22506
22346
|
name: external_exports.string().min(1),
|
|
22507
|
-
/** 该频道里可被派活的 persona 全集(本机 + 远程) */
|
|
22508
22347
|
memberPersonas: external_exports.array(ChannelMemberPersonaSchema),
|
|
22509
22348
|
/** 人类成员(contact deviceId):可发 DM。**不隐含任何派活权限** —— 跨设备派活认的是
|
|
22510
22349
|
* 上面那张 memberPersonas。P1 人类异步询问也用它 */
|
|
@@ -22544,20 +22383,9 @@ var TOPIC_DECISION_STATUS_RESOLVED = TOPIC_DECISION_STATUSES[1];
|
|
|
22544
22383
|
var TopicDecisionTypeSchema = external_exports.enum(TOPIC_DECISION_TYPES);
|
|
22545
22384
|
var TopicDecisionStatusSchema = external_exports.enum(TOPIC_DECISION_STATUSES);
|
|
22546
22385
|
var TopicDecisionSchema = external_exports.object({
|
|
22547
|
-
/**
|
|
22548
|
-
* 这条决策的标识,供后来的答复回指。可选:存量记录一条都没有,**不迁移**。
|
|
22549
|
-
*
|
|
22550
|
-
* 之所以要它——提问和答复是**两条**流水(`open` 一条、`resolved` 一条,见 `resolves`),
|
|
22551
|
-
* 两条之间没有任何关联时,展示层只能逐条渲染,于是**已经拍板完的待办永远挂在那儿**。
|
|
22552
|
-
*/
|
|
22386
|
+
/** Optional stable decision id for later resolution links; old entries remain readable without migration. */
|
|
22553
22387
|
id: nonBlank2.optional(),
|
|
22554
|
-
/**
|
|
22555
|
-
* 本条解决的是哪条决策(填对方的 `id`)。展示层据此把提问与答复合并成一行。
|
|
22556
|
-
*
|
|
22557
|
-
* **只关联、不改写**:不去改动已落盘那条 `open` 记录的 status。原地改写会丢掉
|
|
22558
|
-
* 「什么时候提出 / 什么时候解决」的双时间戳,也丢掉「Master 建议了什么 vs
|
|
22559
|
-
* 老板最终定了什么」的差异——而老板事后要看的恰恰是这个差异。合并只发生在展示层。
|
|
22560
|
-
*/
|
|
22388
|
+
/** Link the resolved entry to its original question without rewriting history, preserving both timestamps and proposed/final conclusions. */
|
|
22561
22389
|
resolves: nonBlank2.optional(),
|
|
22562
22390
|
type: TopicDecisionTypeSchema,
|
|
22563
22391
|
status: TopicDecisionStatusSchema,
|
|
@@ -22580,7 +22408,6 @@ var TopicActivityEntrySchema = external_exports.object({
|
|
|
22580
22408
|
action: external_exports.string().min(1),
|
|
22581
22409
|
target: external_exports.string().optional(),
|
|
22582
22410
|
reason: external_exports.string().min(1),
|
|
22583
|
-
/** 该动作确认的产出物(watcher 返回的 artifacts);影响面视图的唯一数据源 */
|
|
22584
22411
|
artifacts: external_exports.array(nonBlank2).optional(),
|
|
22585
22412
|
/**
|
|
22586
22413
|
* Optional decision projection; legacy activity entries omit this field. `open` means the
|
|
@@ -22591,57 +22418,22 @@ var TopicActivityEntrySchema = external_exports.object({
|
|
|
22591
22418
|
var TopicLineMetaSchema = external_exports.object({
|
|
22592
22419
|
rejectCount: external_exports.number().int().min(0),
|
|
22593
22420
|
accepted: external_exports.boolean().default(false),
|
|
22594
|
-
/**
|
|
22595
|
-
* 该线在本话题内的**序号**,daemon 按建线先后顺序发,从 1 起。
|
|
22596
|
-
*
|
|
22597
|
-
* 存在的理由只有一个:老板说「第 2 条线」和 Master 说「线2」得指同一条。所以它必须
|
|
22598
|
-
* **稳定且不复用**——删掉第 2 条后新建的线拿 4 而不是 2,否则昨天说的号今天指向别的线,
|
|
22599
|
-
* 序号就没有价值了。发号点见 topic-store.claimLineOrdinal。
|
|
22600
|
-
*
|
|
22601
|
-
* 早先这个号是 UI 从 lineId 字符串里 parse 的(`line-<N>-<slug>`),等于把序号语义
|
|
22602
|
-
* 寄生在 Master 随手起的名字上:Master 用语义命名(`line-channel-fix`)就 parse 不出,
|
|
22603
|
-
* sidebar 整个不显示号。序号的产生端必须是 daemon。
|
|
22604
|
-
*
|
|
22605
|
-
* optional 而非 default:store 不按 schema parse(见 topic-store),存量 lineMeta
|
|
22606
|
-
* 里没有这个字段,读侧一律 `?? null`,回填由 `topic:get` 的发号 pass 幂等补上。
|
|
22607
|
-
*/
|
|
22421
|
+
/** Stable daemon-issued line number, never reused. Old metadata is filled by the handler; readers tolerate missing values before that pass. */
|
|
22608
22422
|
ordinal: external_exports.number().int().min(1).optional(),
|
|
22609
|
-
/**
|
|
22610
|
-
* Master 在 watcher 判 fail 的情况下仍判合格的次数。
|
|
22611
|
-
*
|
|
22612
|
-
* 为什么要单独数:watcher 的 fail 若能被一句「这是可观测性缺口」无声绕过,核验就形同
|
|
22613
|
-
* 虚设——实测一个话题三条线的 watcher 全报 fail、无一打回,Master 自己下场补证后判了合格。
|
|
22614
|
-
* 覆盖本身不禁止(watcher 确实会误判),但必须留痕、必须计数、反复覆盖必须惊动老板。
|
|
22615
|
-
*
|
|
22616
|
-
* optional 而非 default(0):store 不按 schema parse(见 topic-store),存量 lineMeta
|
|
22617
|
-
* 里本来就没有这个字段,读侧一律 `?? 0`。
|
|
22618
|
-
*/
|
|
22423
|
+
/** Count accepted watcher-failure overrides for audit/escalation. Legacy entries omit it and readers treat absence as zero. */
|
|
22619
22424
|
overrideCount: external_exports.number().int().min(0).optional()
|
|
22620
22425
|
});
|
|
22621
22426
|
var TopicSchema = external_exports.object({
|
|
22622
22427
|
id: external_exports.string().min(1),
|
|
22623
22428
|
channelId: external_exports.string().min(1),
|
|
22624
22429
|
title: external_exports.string(),
|
|
22625
|
-
/** 该话题的 Master session;topic:create 时一并起,1:1 */
|
|
22626
22430
|
masterSessionId: external_exports.string().min(1),
|
|
22627
22431
|
goal: external_exports.string(),
|
|
22628
22432
|
boundaries: external_exports.string(),
|
|
22629
22433
|
acceptanceCriteria: external_exports.array(external_exports.string()),
|
|
22630
22434
|
activity: external_exports.array(TopicActivityEntrySchema),
|
|
22631
|
-
/** lineId -> 线级元数据 */
|
|
22632
22435
|
lineMeta: external_exports.record(TopicLineMetaSchema),
|
|
22633
|
-
/**
|
|
22634
|
-
* 线号水位:下一条线该拿的号。发一个加一,**只增不减**。
|
|
22635
|
-
*
|
|
22636
|
-
* 为什么是话题上的一个独立字段,而不是「现有 lineMeta 里的最大号 + 1」现算:现算的水位
|
|
22637
|
-
* 跟着现存线数走,删掉最大号那条线水位就退,下一条新线会**捡回那个号**。老板原话:
|
|
22638
|
-
* 「删了线,已经标记的线的序号不能变吧,要不然留档的记录不都坏了么」——号对不上只是难用,
|
|
22639
|
-
* 号能对上、却对到了另一条线(流水里「#3 判合格」后来指向一条新线)是把留档直接读坏。
|
|
22640
|
-
* 所以不变式有两条:**已发的号永不改**、**号永不复用**,后者必须与现存线数彻底脱钩。
|
|
22641
|
-
*
|
|
22642
|
-
* optional 而非 default:store 不按 schema parse(见 topic-store),存量话题没有这个
|
|
22643
|
-
* 字段,读盘时按「现有最大号 + 1」一次性归一(不能从 1 重开,否则现有的 #1 #2 会被复用)。
|
|
22644
|
-
*/
|
|
22436
|
+
/** Monotonic allocation watermark independent of live line count. Removing the highest line must never recycle its number; legacy load starts above existing ordinals. */
|
|
22645
22437
|
nextLineOrdinal: external_exports.number().int().min(1).optional(),
|
|
22646
22438
|
state: TopicStateSchema,
|
|
22647
22439
|
createdAt: external_exports.string().min(1),
|
|
@@ -22656,7 +22448,6 @@ var TopicLineViewSchema = external_exports.object({
|
|
|
22656
22448
|
status: DispatchStatusSchema,
|
|
22657
22449
|
acceptance: external_exports.array(external_exports.string()),
|
|
22658
22450
|
rejectCount: external_exports.number().int().min(0),
|
|
22659
|
-
/** 已被 Master 判定合格(`topic:accept`)。UI 的「合格」态靠它,不是猜的 */
|
|
22660
22451
|
accepted: external_exports.boolean(),
|
|
22661
22452
|
/**
|
|
22662
22453
|
* 线号(见 TopicLineMetaSchema.ordinal)。UI 直接渲染,**不再从 lineId 猜**。
|
|
@@ -22675,7 +22466,6 @@ var TopicGetArgsSchema = external_exports.object({
|
|
|
22675
22466
|
});
|
|
22676
22467
|
var TopicCreateArgsSchema = external_exports.object({
|
|
22677
22468
|
channelId: external_exports.string().min(1),
|
|
22678
|
-
/** 可后补:spike 动线是老板先说一句话,标题随 topic:setPlan 落 */
|
|
22679
22469
|
title: nonBlank2.optional()
|
|
22680
22470
|
});
|
|
22681
22471
|
var TopicSetPlanArgsSchema = external_exports.object({
|
|
@@ -22692,7 +22482,6 @@ var TopicAppendArgsSchema = external_exports.object({
|
|
|
22692
22482
|
action: nonBlank2,
|
|
22693
22483
|
target: nonBlank2.optional(),
|
|
22694
22484
|
reason: nonBlank2,
|
|
22695
|
-
/** 该动作确认的产出物;影响面视图只吃这个字段 */
|
|
22696
22485
|
artifacts: external_exports.array(nonBlank2).optional(),
|
|
22697
22486
|
decision: TopicActivityEntrySchema.shape.decision
|
|
22698
22487
|
});
|
|
@@ -22704,9 +22493,7 @@ var TopicRejectArgsSchema = external_exports.object({
|
|
|
22704
22493
|
var TopicAcceptArgsSchema = external_exports.object({
|
|
22705
22494
|
topicId: external_exports.string().min(1),
|
|
22706
22495
|
lineId: nonBlank2,
|
|
22707
|
-
/** 凭什么判合格(逐条标准对应到什么证据)——与打回同样必填 */
|
|
22708
22496
|
reason: nonBlank2,
|
|
22709
|
-
/** watcher 认定的产出物,一并进影响面 */
|
|
22710
22497
|
artifacts: external_exports.array(nonBlank2).optional(),
|
|
22711
22498
|
/**
|
|
22712
22499
|
* 这条线的 watcher 核验结论。**必填**:不填等于允许「压根没跑 watcher 就发合格证」,
|
|
@@ -22744,15 +22531,12 @@ var TopicCreateResultSchema = external_exports.object({
|
|
|
22744
22531
|
});
|
|
22745
22532
|
var TopicRejectResultSchema = external_exports.object({
|
|
22746
22533
|
rejectCount: external_exports.number().int().min(1),
|
|
22747
|
-
/** 连续两次打回仍不合格 → 必须上报老板(PRD §10.3),不靠 Master 自己数 */
|
|
22748
22534
|
needsOwnerAttention: external_exports.boolean()
|
|
22749
22535
|
});
|
|
22750
22536
|
var TopicAcceptResultSchema = external_exports.object({
|
|
22751
22537
|
acceptedLines: external_exports.number().int().min(1),
|
|
22752
22538
|
totalLines: external_exports.number().int().min(1),
|
|
22753
|
-
/** 全部线都合格了 → 可以收敛上报。由 daemon 数,不让 Master 自己盘 */
|
|
22754
22539
|
allAccepted: external_exports.boolean(),
|
|
22755
|
-
/** 本话题累计推翻 watcher 的次数(含这一次) */
|
|
22756
22540
|
overrides: external_exports.number().int().min(0),
|
|
22757
22541
|
/**
|
|
22758
22542
|
* 反复推翻 watcher = 取证链路有系统性问题(如 worker 用 heredoc 写文件导致正文
|
|
@@ -22828,7 +22612,6 @@ var LarkBotBindManualArgs = external_exports.object({
|
|
|
22828
22612
|
var LarkBotGroupSchema = external_exports.object({
|
|
22829
22613
|
chatId: external_exports.string().min(1),
|
|
22830
22614
|
chatName: external_exports.string().optional(),
|
|
22831
|
-
/** epoch ms,该群 session 最近一次活跃时间 */
|
|
22832
22615
|
lastActiveAt: external_exports.number().int().optional()
|
|
22833
22616
|
});
|
|
22834
22617
|
var LarkBotStatusResultSchema = external_exports.object({
|
|
@@ -22843,19 +22626,9 @@ var LarkBotStatusResultSchema = external_exports.object({
|
|
|
22843
22626
|
/** provision 失败后的 unbound 帧携带;正常 unbound 无此字段 */
|
|
22844
22627
|
errorReason: LarkBotProvisionErrorReasonSchema.optional(),
|
|
22845
22628
|
groups: external_exports.array(LarkBotGroupSchema),
|
|
22846
|
-
/**
|
|
22847
|
-
* bound 态:该 bot 实际授予的 scope 缺了 LARK_PROVISION_ADDONS 里声明的项
|
|
22848
|
-
* (spec 2026-09-01)——addons 是扫码时一次性写进飞书应用配置的,后来新增的
|
|
22849
|
-
* scope / 事件对存量 bot 不生效,不提示的话用户只会觉得「功能没生效」。
|
|
22850
|
-
* 判定真源是飞书回读的 granted scopes,不落库任何版本号。
|
|
22851
|
-
*/
|
|
22629
|
+
/** Granted scopes, not a stored version, determine whether an existing bot needs an authorization upgrade. */
|
|
22852
22630
|
needsUpgrade: external_exports.boolean().optional(),
|
|
22853
|
-
/**
|
|
22854
|
-
* bound 态叠加:正在扫码更新授权(spec 2026-09-01)。
|
|
22855
|
-
* **不复用 provisioning 态**——升级期间 bot 仍在正常服务(长连接不断、群照常响应),
|
|
22856
|
-
* 降级成 provisioning 会丢掉 botName / groups,UI 上像是断了。
|
|
22857
|
-
* 有值即渲染二维码弹层;升级结束(成功或取消)该字段消失。
|
|
22858
|
-
*/
|
|
22631
|
+
/** Upgrade QR overlays bound status so a still-serving bot retains its name/groups. Removed after upgrade success or cancellation. */
|
|
22859
22632
|
upgradeQrUrl: external_exports.string().optional()
|
|
22860
22633
|
});
|
|
22861
22634
|
var LarkBotStateFrameSchema = LarkBotStatusResultSchema.extend({
|
|
@@ -22913,15 +22686,11 @@ var EngineAccountSchema = external_exports.discriminatedUnion("kind", [
|
|
|
22913
22686
|
external_exports.object({
|
|
22914
22687
|
kind: external_exports.literal("claude"),
|
|
22915
22688
|
loggedIn: external_exports.boolean(),
|
|
22916
|
-
/** claude.ai / console / … */
|
|
22917
22689
|
authMethod: external_exports.string().optional(),
|
|
22918
|
-
/** firstParty / bedrock / vertex / foundry */
|
|
22919
22690
|
apiProvider: external_exports.string().optional(),
|
|
22920
|
-
/** ANTHROPIC_API_KEY / apiKeyHelper */
|
|
22921
22691
|
apiKeySource: external_exports.string().optional(),
|
|
22922
22692
|
email: external_exports.string().optional(),
|
|
22923
22693
|
orgName: external_exports.string().optional(),
|
|
22924
|
-
/** max / pro / team / … */
|
|
22925
22694
|
subscriptionType: external_exports.string().optional()
|
|
22926
22695
|
}).strict(),
|
|
22927
22696
|
// app-server `account/read`:account 为 null → none;`config/read`:model_provider + 自定义 provider 的 base_url
|
|
@@ -22980,7 +22749,6 @@ var DashboardPageSchema = external_exports.enum(DASHBOARD_PAGES);
|
|
|
22980
22749
|
var DASHBOARD_LINK_TTL_SECONDS = 24 * 3600;
|
|
22981
22750
|
var DashboardOpenUrlArgs = external_exports.object({ page: DashboardPageSchema }).strict();
|
|
22982
22751
|
var DashboardOpenUrlResultSchema = external_exports.object({
|
|
22983
|
-
/** `https://<tunnel 地址>/dashboard/<page>?e=&s=` */
|
|
22984
22752
|
url: external_exports.string(),
|
|
22985
22753
|
/** 过期时刻(ms) */
|
|
22986
22754
|
expiresAt: external_exports.number().int()
|
|
@@ -23001,44 +22769,23 @@ var PersonaFileSchema = external_exports.object({
|
|
|
23001
22769
|
// 8-key set defined UI-side in `lib/session-icons.ts`; protocol stays plain string
|
|
23002
22770
|
// for forward compatibility, consumer fallbacks to default when key not found.
|
|
23003
22771
|
iconKey: external_exports.string().optional(),
|
|
23004
|
-
//
|
|
23005
|
-
// 与 model 平行:persona 新建 session 的默认 tool,可平滑切换。
|
|
22772
|
+
// Default engine binding for new sessions; missing values are consumed as claude.
|
|
23006
22773
|
tool: external_exports.string().optional(),
|
|
23007
|
-
/**
|
|
23008
|
-
* 云上任务 Pod 的规格档(design 2026-09-18-persona-size):`tiny` / `small` / `medium` / `large`,没写按 medium。
|
|
23009
|
-
* 只有发布上云的流水线读它(cloud-host/pipeline/deploy-file.mjs 收窄值域,不认识的拒发);本机跑不看。
|
|
23010
|
-
* 协议层同 model / effort 保持 string(文件层向前兼容);改它的入口是上云页标题行的规格下拉
|
|
23011
|
-
* (design 2026-09-20-persona-size-ui),`persona:update` 那头按 PersonaSizeSchema 收窄。
|
|
23012
|
-
*/
|
|
22774
|
+
/** Cloud resource size is string-compatible in stored files and narrowed at update/deploy boundaries; local execution ignores it. */
|
|
23013
22775
|
size: external_exports.string().optional(),
|
|
23014
|
-
/**
|
|
23015
|
-
* 云上 task 运行模式下一个 task Pod 同时跑几个 task(design 2026-09-19-cloud-task-mode §3.6),没写按 4。
|
|
23016
|
-
* 只有发布上云的流水线读它(cloud-host/pipeline/deploy-file.mjs 校验正整数、不合格拒发);本机跑不看。
|
|
23017
|
-
* 发布页的资源预估卡通过 persona:update 保存,下次发布生效。
|
|
23018
|
-
*/
|
|
22776
|
+
/** Cloud task-Pod concurrency, validated at release. Local execution ignores it; changes apply on the next publication. */
|
|
23019
22777
|
taskConcurrency: external_exports.number().int().positive().optional(),
|
|
23020
22778
|
createdAt: external_exports.number(),
|
|
23021
22779
|
updatedAt: external_exports.number(),
|
|
23022
|
-
/**
|
|
23023
|
-
* 云上 persona(design 2026-09-09-cloud-persona-in-clawd):这个 persona 跑在哪台 gateway 上、在那台 gateway 上叫什么。
|
|
23024
|
-
* 有这个字段 = 条目来自 gateway 的登记表(daemon 每次 persona:list 拉 /healthz 合进 registry),
|
|
23025
|
-
* 本机没有它的目录;会话的 cwd 是 `<gatewayUrl>/p/<cloud.personaId>`,tool 是 `codex-cloud`。
|
|
23026
|
-
* 没有 = 本机 persona,一切照旧。UI 按它分组、隐藏设置 / 上云 / 删除入口。
|
|
23027
|
-
*
|
|
23028
|
-
* 顶层 `personaId` 是本机列表里的键,固定为 `<cloud.personaId>-cloud`(design 2026-09-11-cloud-persona-slug):
|
|
23029
|
-
* 上云的就是本机同名 persona,不加后缀发布者自己永远看不到「云上」组。gateway 不认识带后缀的名字,
|
|
23030
|
-
* 跟它说话(路径段、登记表)一律用 `cloud.personaId`。
|
|
23031
|
-
*/
|
|
22780
|
+
/** 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. */
|
|
23032
22781
|
cloud: external_exports.object({ gatewayUrl: external_exports.string().min(1), personaId: external_exports.string().min(1), publishedByMe: external_exports.boolean().optional() }).strict().optional()
|
|
23033
22782
|
}).strict();
|
|
23034
22783
|
var PersonaSkillSummarySchema = external_exports.object({
|
|
23035
22784
|
// 目录名作为 skill name(对齐 CC:frontmatter `name:` 仅作 displayName 用)
|
|
23036
22785
|
name: external_exports.string().min(1),
|
|
23037
|
-
// SKILL.md frontmatter `description:`;缺省时省略字段
|
|
23038
22786
|
description: external_exports.string().optional()
|
|
23039
22787
|
});
|
|
23040
22788
|
var PersonaPluginSummarySchema = external_exports.object({
|
|
23041
|
-
// settings.json 中 enabledPlugins 的 key,例如 'superpowers@claude-plugins-official'
|
|
23042
22789
|
id: external_exports.string().min(1)
|
|
23043
22790
|
});
|
|
23044
22791
|
var CodexSandboxSettingsSchema = external_exports.object({
|
|
@@ -23054,7 +22801,6 @@ var CodexSandboxSettingsSchema = external_exports.object({
|
|
|
23054
22801
|
var PersonaSandboxSettingsSchema = external_exports.object({
|
|
23055
22802
|
permissions: external_exports.object({
|
|
23056
22803
|
defaultMode: external_exports.string().optional(),
|
|
23057
|
-
// CC 工具 allowlist('Bash'/'Read'/...)。per-persona profile 在最严格 base 上追加放开。
|
|
23058
22804
|
allow: external_exports.array(external_exports.string()).optional(),
|
|
23059
22805
|
// deny 优先级最高;强制底座(persona 私密区)由 daemon compose 强制 union,owner 删不掉。
|
|
23060
22806
|
deny: external_exports.array(external_exports.string()).optional()
|
|
@@ -23072,7 +22818,6 @@ var PersonaSandboxSettingsSchema = external_exports.object({
|
|
|
23072
22818
|
denyWrite: external_exports.array(external_exports.string()).optional(),
|
|
23073
22819
|
allowWrite: external_exports.array(external_exports.string()).optional()
|
|
23074
22820
|
}).optional(),
|
|
23075
|
-
// 出站网络 + 本机端口。base 不放(空),profile 按需追加域名(app-builder = ['*'])。
|
|
23076
22821
|
network: external_exports.object({
|
|
23077
22822
|
allowedDomains: external_exports.array(external_exports.string()).optional(),
|
|
23078
22823
|
allowLocalBinding: external_exports.boolean().optional()
|
|
@@ -23083,17 +22828,9 @@ var PersonaInfoResponseSchema = PersonaFileSchema.extend({
|
|
|
23083
22828
|
// 人格 builtin 层:`<personaDir>/CLAUDE.md`(= AGENTS.md 镜像)。预装 persona 的这份是
|
|
23084
22829
|
// daemon ship 的产品规格,每次 daemon 启动被覆盖回 bundle 版(personalityManaged 标记它)。
|
|
23085
22830
|
personality: external_exports.string().optional(),
|
|
23086
|
-
//
|
|
23087
|
-
// persona 的配置,只是所有权不同**:builtin 归 daemon、随版本更新覆盖;这一层归 persona 的
|
|
23088
|
-
// 主人,不在 DAEMON_MANAGED_PATHS 里,OTA / daemon 重启都不碰。两层叠加生效(人格上冲突时
|
|
23089
|
-
// 以补充层为准),经 SpawnContext.extraSystemPrompt 注入,claude / codex 两端同源,
|
|
23090
|
-
// **owner / guest 会话一律注入**(它是 persona 属性不是私人偏好,同 builtin 人格的待遇)。
|
|
23091
|
-
// 仅 'persona:get' 携带;'' = 没写补充(与 personality 同口径,不用 null)。
|
|
22831
|
+
// Owner-managed personality overlay survives daemon resource refreshes and is injected for owner and guest sessions. Empty text clears it.
|
|
23092
22832
|
personalityLocal: external_exports.string().optional(),
|
|
23093
|
-
// builtin
|
|
23094
|
-
// 下次启动覆盖 → UI 渲染成只读,编辑落到 personalityLocal;false = 用户自建 persona,
|
|
23095
|
-
// 它的 CLAUDE.md daemon 不碰,照旧直接编辑。派生自 daemon 的预装名单,**只读不可回写**。
|
|
23096
|
-
// 仅 'persona:get' 携带。
|
|
22833
|
+
// Managed builtin personality is refreshed by daemon and shown read-only; user edits belong to the overlay. User-created persona files remain editable.
|
|
23097
22834
|
personalityManaged: external_exports.boolean().optional(),
|
|
23098
22835
|
// 仅 'persona:get' 携带;null = 文件不存在 / parse 失败;undefined = 不在该响应类型上
|
|
23099
22836
|
skills: external_exports.array(PersonaSkillSummarySchema).optional(),
|
|
@@ -23105,10 +22842,7 @@ var PersonaInfoResponseSchema = PersonaFileSchema.extend({
|
|
|
23105
22842
|
codexSandbox: CodexSandboxSettingsSchema.nullable().optional()
|
|
23106
22843
|
});
|
|
23107
22844
|
var PersonaCreateArgsSchema = external_exports.object({
|
|
23108
|
-
//
|
|
23109
|
-
// 「所有 persona id 带该前缀」的约定由构造保证。与 label(显示名,可中文、可随时改)是两个概念:
|
|
23110
|
-
// 曾经只有 label、id 从 label 推,导致中文 label 被剥空后一律降级成 persona-persona。
|
|
23111
|
-
// 正则即安全边界——该值直接落进 ~/.clawd/personas/<id>/,此处排除 . / 空格后路径穿越无从构造。
|
|
22845
|
+
// Caller provides a safe slug, daemon adds persona-. Keep identity separate from the freely editable display label.
|
|
23112
22846
|
slug: external_exports.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/).max(32),
|
|
23113
22847
|
label: external_exports.string().min(1),
|
|
23114
22848
|
personality: external_exports.string(),
|
|
@@ -23128,7 +22862,6 @@ var PersonaUpdateArgsSchema = external_exports.object({
|
|
|
23128
22862
|
model: external_exports.string().optional(),
|
|
23129
22863
|
effort: external_exports.string().optional(),
|
|
23130
22864
|
tool: external_exports.string().optional(),
|
|
23131
|
-
// 云上任务 Pod 的规格档:只收四档之一(PersonaFile 层是 string,边界在这里收窄)
|
|
23132
22865
|
size: PersonaSizeSchema.optional(),
|
|
23133
22866
|
taskConcurrency: PersonaFileSchema.shape.taskConcurrency,
|
|
23134
22867
|
personality: external_exports.string().optional(),
|
|
@@ -23186,15 +22919,10 @@ var PrincipalSchema = external_exports.object({
|
|
|
23186
22919
|
id: external_exports.string().min(1),
|
|
23187
22920
|
kind: PrincipalKindSchema,
|
|
23188
22921
|
displayName: external_exports.string(),
|
|
23189
|
-
/**
|
|
23190
|
-
* 飞书 union_id。owner: 本机 daemon 已飞书登录时透传自 owner-identity.json;未登录 undefined。
|
|
23191
|
-
* guest: v1 保持 undefined(connect token 当前不携带 unionId;未来若签名 payload 加字段可透传)。
|
|
23192
|
-
* 消费方(如 ticket MCP / 未来别的飞书身份挂钩场景)按 undefined 决定是否降级;本层不做 fallback。
|
|
23193
|
-
*/
|
|
22922
|
+
/** Optional identity attribution: owner login supplies it; connect guests receive token subOwner. Consumers decide how to handle absence. */
|
|
23194
22923
|
feishuUnionId: external_exports.string().optional()
|
|
23195
22924
|
}).strict();
|
|
23196
22925
|
var SenderInfoSchema = external_exports.object({
|
|
23197
|
-
/** = principal.id = deviceId(决策 #16)。稳定路由 id */
|
|
23198
22926
|
did: external_exports.string().min(1),
|
|
23199
22927
|
displayName: external_exports.string(),
|
|
23200
22928
|
/** owner 未登录 / guest 无飞书身份时缺省。消费方各自决定是否降级 */
|
|
@@ -23213,16 +22941,11 @@ var ContextUsageSchema = external_exports.object({
|
|
|
23213
22941
|
var sessionMetaShape = {
|
|
23214
22942
|
gitBranch: external_exports.string().optional(),
|
|
23215
22943
|
resolvedModel: external_exports.string().optional(),
|
|
23216
|
-
//
|
|
23217
|
-
// 与 resolvedModel 对称:session.effort 是「用户选的」('' = 没选),这个是「实际用的」。
|
|
23218
|
-
// 没选时 UI 拿它显示确切值,而不是「由 CC 决定」这种占位。
|
|
22944
|
+
// Effective reasoning effort from the engine, distinct from the user-selected effort.
|
|
23219
22945
|
resolvedEffort: external_exports.string().optional(),
|
|
23220
22946
|
contextUsage: ContextUsageSchema.optional(),
|
|
23221
22947
|
contextWindowSize: external_exports.number().int().positive().optional(),
|
|
23222
|
-
//
|
|
23223
|
-
// 与用户手改的 label 分离:用户 Rename 只写 label,AI 只写 aiLabel,显示优先级
|
|
23224
|
-
// label > aiLabel——结构上杜绝「自动标题覆盖用户改名」。创建时 UI 把首行截断
|
|
23225
|
-
// 占位写进 SessionCreateArgs.aiLabel,之后由 meta_update 用真标题覆盖。
|
|
22948
|
+
// User label overrides aiLabel. Automatic title updates must never overwrite the user's label.
|
|
23226
22949
|
aiLabel: external_exports.string().optional()
|
|
23227
22950
|
};
|
|
23228
22951
|
var SessionMetaSchema = external_exports.object(sessionMetaShape);
|
|
@@ -23237,15 +22960,10 @@ var ModelInfoSchema = external_exports.object({
|
|
|
23237
22960
|
description: external_exports.string().optional(),
|
|
23238
22961
|
contextWindowSize: external_exports.number().int().positive(),
|
|
23239
22962
|
default: external_exports.boolean().optional(),
|
|
23240
|
-
//
|
|
23241
|
-
// 缺省 = 该 tool 的 effort 与模型无关(claude 即此情形),消费方回落到 configSchema 里
|
|
23242
|
-
// name==='effort' 那条字段的 options。
|
|
22963
|
+
// Per-model efforts override the global effort options; absence uses the tool's global config field.
|
|
23243
22964
|
efforts: external_exports.array(SelectOptionSchema).optional(),
|
|
23244
22965
|
defaultEffort: external_exports.string().optional(),
|
|
23245
|
-
//
|
|
23246
|
-
// 缺省 = 该 tool 的模型不分组(claude 即此情形),消费方平铺渲染、不出标题。
|
|
23247
|
-
// 全表只落在一个家族时 daemon 也不填——一个横跨全表的标题没有信息量。
|
|
23248
|
-
// 消费方假定同 group 的条目已连续排好(排序在 daemon 侧,见 codex-model-list.mergeProviderModels)。
|
|
22966
|
+
// Optional display grouping; same-group models must already be contiguous. A single whole-catalog group adds no information.
|
|
23249
22967
|
group: external_exports.string().optional()
|
|
23250
22968
|
});
|
|
23251
22969
|
var ModeInfoSchema = external_exports.object({
|
|
@@ -23307,24 +23025,17 @@ var SessionFileSchema = external_exports.object({
|
|
|
23307
23025
|
cloudPendingCommand: external_exports.object({ id: external_exports.string().min(1), text: external_exports.string(), prepared: external_exports.boolean().optional() }).optional(),
|
|
23308
23026
|
cwd: external_exports.string().min(1),
|
|
23309
23027
|
tool: external_exports.literal("claude").or(external_exports.string().min(1)).default("claude"),
|
|
23310
|
-
// 归一化 tool 侧 session id(CC = claude session uuid,Codex = codex 自己的 id)
|
|
23311
23028
|
toolSessionId: external_exports.string().optional(),
|
|
23312
23029
|
label: external_exports.string().optional(),
|
|
23313
23030
|
model: external_exports.string().optional(),
|
|
23314
23031
|
permissionMode: external_exports.string().optional(),
|
|
23315
23032
|
effort: external_exports.string().optional(),
|
|
23316
|
-
// 归一化运行时观测字段(daemon 独立计算,session:update 不接受;meta_update 事件投递)
|
|
23317
23033
|
...sessionMetaShape,
|
|
23318
|
-
//
|
|
23319
|
-
// (observer ai-title 回灌与 daemon 自产两个生产者同路)。为空 = 还没生成过 →
|
|
23320
|
-
// manager.send 首条消息触发生成。session:update(外部 RPC)zod strip 不接受此字段。
|
|
23034
|
+
// Daemon-owned title generation marker; external session:update cannot set it. Missing marker allows first-message generation.
|
|
23321
23035
|
aiLabelGeneratedAt: external_exports.string().optional(),
|
|
23322
23036
|
permissionRules: external_exports.array(AllowRuleSchema).optional(),
|
|
23323
|
-
// Sidebar 置顶时间戳;null/undefined 表示未置顶
|
|
23324
23037
|
pinnedAt: external_exports.number().int().nonnegative().nullable().optional(),
|
|
23325
|
-
//
|
|
23326
|
-
// marker 语义:不 bump updatedAt(与 pinnedAt 同款)。session:archive 归档时 daemon
|
|
23327
|
-
// 在同一次落盘里原子清 pinnedAt;取消归档不恢复置顶。
|
|
23038
|
+
// Archive does not bump updatedAt; archiving clears pin atomically, while unarchiving does not restore it.
|
|
23328
23039
|
archivedAt: external_exports.number().int().nonnegative().nullable().optional(),
|
|
23329
23040
|
// pinned 行手动拖拽顺序;越小越靠前。session:reorderPins 整体重写所有 pinned 的此字段。
|
|
23330
23041
|
// 缺失时 view-state 排序回退到 pinnedAt desc(旧数据兼容)
|
|
@@ -23334,22 +23045,13 @@ var SessionFileSchema = external_exports.object({
|
|
|
23334
23045
|
// session:markRead RPC 或新 turn 开始(→ running)时清为 null。
|
|
23335
23046
|
// 所有客户端(desktop / mobile)共享同一份,任一端标读全端清。
|
|
23336
23047
|
unreadAt: external_exports.string().min(1).nullable().optional(),
|
|
23337
|
-
// 用户在 NewSessionDialog 或 Edit modal 选择的 icon 标识;UI 端做 enum 兜底
|
|
23338
23048
|
iconKey: external_exports.string().optional(),
|
|
23339
|
-
//
|
|
23340
|
-
// 不受 parent clear / re-spawn 影响);sidebar 据此挂 fork 图标。非 fork session 该字段缺省。
|
|
23341
|
-
// 旧字段 forkedFromToolSessionId 已弃用,daemon 启动时一次性迁移老数据
|
|
23049
|
+
// Stable source clawd session id for a fork, independent of clearing/restarting the source engine session.
|
|
23342
23050
|
forkedFromSessionId: external_exports.string().min(1).optional(),
|
|
23343
23051
|
// 快速问答临时会话标记(spec 2026-06-23-fork-quick-ask):true = 关闭抽屉即删、
|
|
23344
23052
|
// 不进 sidebar 树、daemon 启动清扫孤儿。普通会话缺省。
|
|
23345
23053
|
ephemeral: external_exports.boolean().optional(),
|
|
23346
|
-
/**
|
|
23347
|
-
* 这条会话属于哪张部署单(persona 上云的环境扫描会话)。
|
|
23348
|
-
*
|
|
23349
|
-
* 有值 = 它在单据页右栏里活着,**sidebar 不再列它**——同一条会话两处出现,和话题 worker
|
|
23350
|
-
* 会话不进「最近」是同一条规矩。不复用 `ephemeral`:那个标记会被 daemon 启动清扫**删掉**,
|
|
23351
|
-
* 而扫描会话要跟单据一样长期留着(人隔天回来还要翻管家当时是怎么判的、还要接着追问)。
|
|
23352
|
-
*/
|
|
23054
|
+
/** Scan-session grouping, retained with deployment history. Do not reuse ephemeral: startup cleanup would delete evidence needed later. */
|
|
23353
23055
|
deployId: external_exports.string().min(1).optional(),
|
|
23354
23056
|
// owner-mode persona session 身份标识;UI 用它在 SessionList 过滤 + jump,
|
|
23355
23057
|
// daemon 用它做 idempotent dedupe + spawn 时派生 ctx.personaMode='owner'
|
|
@@ -23360,103 +23062,25 @@ var SessionFileSchema = external_exports.object({
|
|
|
23360
23062
|
* 本机资源指针——mirror 上与 ownerPersonaId 同地点 strip(#750 防线)。
|
|
23361
23063
|
*/
|
|
23362
23064
|
projectPath: external_exports.string().min(1).optional(),
|
|
23363
|
-
//
|
|
23364
|
-
// 派生 sessionId 是单向 hash `${personaId}-${tokenHash12}-${chatHash8}`,必须保留原始 chatId
|
|
23365
|
-
// 才能让 alice 重连同一 sub-session(持久化在 alice localStorage 之外,由 daemon push 同步)。
|
|
23366
|
-
// optional 是因为 owner-mode session 不带;只要写入就是 listener-mode 必填三元组。
|
|
23065
|
+
// Legacy chat identifier retained in stored session shape; current bot routing uses larkChatId.
|
|
23367
23066
|
chatId: external_exports.string().min(1).optional(),
|
|
23368
|
-
/**
|
|
23369
|
-
* 创建该 session 的设备 id(决策 #16:从 ctx.principal.id 派生 = deviceId)。
|
|
23370
|
-
* UI 端 self 判定收敛为单一比较 `!creatorPrincipalId || creatorPrincipalId === 本机 deviceId`
|
|
23371
|
-
* → 「我自己创建」vs「别的设备接入创建」。MyPersonas 二级分组按 creatorPrincipalId(设备)
|
|
23372
|
-
* 分桶、按 contact(deviceId→ownerName) 反查显示名。
|
|
23373
|
-
*
|
|
23374
|
-
* 命名保留 creatorPrincipalId(命名债,语义已是 creatorDeviceId);值由 connect token
|
|
23375
|
-
* subDevice 背书(guest ctx)或本机 deviceId(owner ctx)。optional 兼容老 session。
|
|
23376
|
-
*
|
|
23377
|
-
* 决策 #16 删除了 creatorOwnerPrincipalId(personal token #735 遗留)——当年 guest 的
|
|
23378
|
-
* principal.id 都是同张 cap.id 区分不了人才加它;现在 principal.id = 设备 deviceId、
|
|
23379
|
-
* 归属人由 contact(deviceId→ownerId) 反查,该字段理由消失。
|
|
23380
|
-
*/
|
|
23067
|
+
/** Creator routing identity, stamped at creation. Missing on old records means local-self fallback. Connect guests use signed device identity; this is distinct from human attribution. */
|
|
23381
23068
|
creatorPrincipalId: external_exports.string().min(1).optional(),
|
|
23382
|
-
/**
|
|
23383
|
-
* 创建该 session 的连接者飞书 displayName(一次性 stamp)。session:create handler
|
|
23384
|
-
* 从 ctx.principal.displayName 传入;newRunner 时读这个字段派生 SubSessionMeta.callerDisplayName,
|
|
23385
|
-
* 注入到 cc system prompt 引导自我介绍(见 connection-prompt.ts)。
|
|
23386
|
-
* Optional 兼容老 SessionFile——newRunner 读不到时 fallback ContactStore 反查(guest)
|
|
23387
|
-
* 或 deps.ownerDisplayName(owner)。
|
|
23388
|
-
*/
|
|
23069
|
+
/** Creator display-name snapshot for the connection prompt; missing on old records falls back to current owner/contact attribution. */
|
|
23389
23070
|
creatorDisplayName: external_exports.string().min(1).optional(),
|
|
23390
|
-
/**
|
|
23391
|
-
* 创建该 session 的连接者飞书 union_id(一次性 stamp,T-31 persona prompt injection)。
|
|
23392
|
-
* session:create / dispatch spawnB handler 从 ctx.principal.feishuUnionId(guest 场景来自
|
|
23393
|
-
* connect token subOwner)或 deps.ownerFeishuUnionId(owner 场景)传入;newRunner 时读这个
|
|
23394
|
-
* 字段派生 SubSessionMeta.callerFeishuUnionId 注入 cc system prompt「身份卡」的 union_id 行。
|
|
23395
|
-
* Optional:老 SessionFile / owner 未登飞书路径缺省,缺省时 prompt 不渲染该行(向后兼容)。
|
|
23396
|
-
*/
|
|
23071
|
+
/** Creator identity attribution stamped for the connection prompt. Missing on older/unattributed sessions omits that prompt row. */
|
|
23397
23072
|
creatorFeishuUnionId: external_exports.string().min(1).optional(),
|
|
23398
|
-
/**
|
|
23399
|
-
* Mirror peer sessions (2026-05-26): mirror 标识。**我在朋友 daemon 上创建的 session**,
|
|
23400
|
-
* 远端是 source of truth,本机是持久化副本,方便 sidebar 跨设备聚合。
|
|
23401
|
-
* 字段值 = 远端 daemon 的 deviceId(决策 #16:朋友设备标识,即我接入的那台机器)。
|
|
23402
|
-
*
|
|
23403
|
-
* 语义关键澄清:mirror **不是朋友创建给我的会话**——它是我自己的会话,只是在朋友
|
|
23404
|
-
* 的机器上跑。sidebar chip 显示 `@<朋友>` 暗示「位置」,不是「来源」。
|
|
23405
|
-
*
|
|
23406
|
-
* - undefined / 缺省 → 本机 native session(在我自己机器上跑)
|
|
23407
|
-
* - 非空 → 我的会话在该 deviceId 朋友的 daemon 上跑,本机为持久化副本
|
|
23408
|
-
*
|
|
23409
|
-
* 四类 session 取值矩阵(决策 #16 deviceId 版,creatorOwnerPrincipalId 列已删):
|
|
23410
|
-
* | 形态 | creatorPrincipalId(=设备) | originOwnerPrincipalId(=朋友设备) |
|
|
23411
|
-
* |-------------------------------------|--------------------------|----------------------------------|
|
|
23412
|
-
* | 本机 owner 自创 | 本机 deviceId | undefined |
|
|
23413
|
-
* | 本机被别的设备接入创建 | 接入者 deviceId(token 背书) | undefined |
|
|
23414
|
-
* | 我在朋友 daemon 上创建(mirror 回本机) | 我的 deviceId | 朋友 deviceId |
|
|
23415
|
-
*
|
|
23416
|
-
* UI 用法:
|
|
23417
|
-
* - sidebar Active/Pinned/Recents 过滤:`origin 非空 → 一律视作 self`(绕过 #739 隔离)
|
|
23418
|
-
* - 行内显示 `@<朋友>` chip 暗示位置
|
|
23419
|
-
* - 进 ChatPanel 时按 origin 路由到 `pool.ensureRemoteForOwner(origin)` 走远端(按 deviceId)
|
|
23420
|
-
*
|
|
23421
|
-
* daemon 用法:
|
|
23422
|
-
* - `peerSession:upsert` / `peerSession:remove` 一族 RPC 专管 mirror 写删;
|
|
23423
|
-
* daemon dumb write/delete,**不广播任何 push 帧**,UI 是写入唯一源
|
|
23424
|
-
* - native `session:*` handler 完全不感知 mirror(UI 操作 mirror 不走 native 路径)
|
|
23425
|
-
*/
|
|
23073
|
+
/** Remote device hosting the caller's mirrored session. The remote daemon is authoritative; this record is local sidebar storage. UI routes operations remotely and treats mirror as self; mirror upsert/remove do not broadcast native-session frames. */
|
|
23426
23074
|
originOwnerPrincipalId: external_exports.string().min(1).optional(),
|
|
23427
|
-
/**
|
|
23428
|
-
* Mirror 的 persona 身份(2026-07-17 android-dispatch-task spec §3.2):
|
|
23429
|
-
* 该 mirror 在朋友 daemon 上是用哪个 persona 创建的(朋友侧的 persona id)。
|
|
23430
|
-
* 与 originOwnerPrincipalId 平行的「位置」语义——**不参与**本机 persona 反查
|
|
23431
|
-
* (那是 ownerPersonaId 的职责,mirror 上按 #750 防线 strip)。
|
|
23432
|
-
* 消费方:mobile picker「借的」组按 (originOwnerPrincipalId, originOwnerPersonaId) 去重。
|
|
23433
|
-
* 写入方:ui toMirrorSessionFile / mobile buildMirrorUpsertArgs 在 strip ownerPersonaId 时 stamp。
|
|
23434
|
-
*/
|
|
23075
|
+
/** Persona id at the remote hosting device. Used with originOwnerPrincipalId for remote picker grouping, never for local persona lookup. */
|
|
23435
23076
|
originOwnerPersonaId: external_exports.string().min(1).optional(),
|
|
23436
|
-
/**
|
|
23437
|
-
* Dispatch 派生的 session 在 create 时记录源 session 的 sessionId(稳定 key);
|
|
23438
|
-
* sidebar 据此把 dispatch 出来的 sub-session 折叠在源 session 下。非 dispatch session 缺省。
|
|
23439
|
-
* mirror SessionFile 上必须 strip(朋友 daemon 上的 sessionId 在本机无意义,会让本机
|
|
23440
|
-
* 反查路径走错;按 #750 一族防线处理,跟 ownerPersonaId 同地点 strip)。
|
|
23441
|
-
*/
|
|
23077
|
+
/** Dispatch source session for local tree grouping. Strip on mirrors because remote session ids cannot link into the local tree. */
|
|
23442
23078
|
dispatchedFromSessionId: external_exports.string().min(1).optional(),
|
|
23443
|
-
/**
|
|
23444
|
-
* Shift fire 派生的 session 记录调 addShift 的 source cc session id(稳定 key);
|
|
23445
|
-
* sidebar 据此把 fire 出的 session 折叠在 source session 下,跟 dispatchedFromSessionId
|
|
23446
|
-
* 平行但渲染不同 icon(AlarmClock 区别于 dispatch 的 CornerDownRight),让 owner 一眼
|
|
23447
|
-
* 分清"派生于人为委派"还是"派生于定时唤起"。非 shift fire session 缺省。
|
|
23448
|
-
* 跟 dispatchedFromSessionId / forkedFromSessionId 三者互斥(同一 session 不会兼任)。
|
|
23449
|
-
* mirror SessionFile 同 dispatchedFromSessionId 处理(shift fire 本地概念,理论上不会
|
|
23450
|
-
* mirror,留 strip 防御)。
|
|
23451
|
-
*/
|
|
23079
|
+
/** Scheduler source session, distinct from dispatch/fork ancestry. Strip on mirrors because this linkage is local-only. */
|
|
23452
23080
|
shiftFiredFromSessionId: external_exports.string().min(1).optional(),
|
|
23453
|
-
/**
|
|
23454
|
-
* LarkBotConnector(spec 2026-08-05):该 session 是某飞书群的专属会话。
|
|
23455
|
-
* larkChatId = 飞书群 chat_id(oc_ 前缀),与 persona-guest scope 的 capId `lark-<chat_id>` 对应;
|
|
23456
|
-
* 由 daemon lark-bot-connector 模块写入,UI 只读(sidebar 按此字段隐藏,Drawer 群清单按此聚合)。
|
|
23457
|
-
*/
|
|
23081
|
+
/** Bot session key, potentially virtual topic/speaker or document key, not necessarily a real IM chat id. UI hides these sessions from ordinary recent-session lists. */
|
|
23458
23082
|
larkChatId: external_exports.string().min(1).optional(),
|
|
23459
|
-
/**
|
|
23083
|
+
/** Session display-name snapshot, including topic/speaker where appropriate; updated on later events. */
|
|
23460
23084
|
larkChatName: external_exports.string().min(1).optional(),
|
|
23461
23085
|
/** lark 会话类型(spec 2026-08-06 P9):p2p 与群的 chat_id 形态无法区分,UI 文案分支需要。可选=兼容老数据(缺省按 group 展示) */
|
|
23462
23086
|
larkChatType: external_exports.enum(["p2p", "group"]).optional(),
|
|
@@ -23485,7 +23109,6 @@ var StructuredPatchHunkSchema = external_exports.object({
|
|
|
23485
23109
|
oldLines: external_exports.number().int().nonnegative(),
|
|
23486
23110
|
newStart: external_exports.number().int().nonnegative(),
|
|
23487
23111
|
newLines: external_exports.number().int().nonnegative(),
|
|
23488
|
-
// 每行以 '+' / '-' / ' ' 开头(diff npm 包的标准 hunk lines)
|
|
23489
23112
|
lines: external_exports.array(external_exports.string())
|
|
23490
23113
|
});
|
|
23491
23114
|
var ToolResultExtraSchema = external_exports.object({
|
|
@@ -23515,7 +23138,6 @@ var AskQuestionOptionSchema = external_exports.object({
|
|
|
23515
23138
|
});
|
|
23516
23139
|
var AskQuestionItemSchema = external_exports.object({
|
|
23517
23140
|
question: external_exports.string().min(1),
|
|
23518
|
-
// multiSelect 必填(boolean 不给默认值):daemon emit 时必须显式传,避免 UI 端漂移
|
|
23519
23141
|
multiSelect: external_exports.boolean(),
|
|
23520
23142
|
options: external_exports.array(AskQuestionOptionSchema).min(1)
|
|
23521
23143
|
});
|
|
@@ -23542,13 +23164,7 @@ var ParsedEventSchema = external_exports.discriminatedUnion("kind", [
|
|
|
23542
23164
|
// 同一文本块的多次 stream_event 增量带相同 partialId;语义同 thinking
|
|
23543
23165
|
partialId: external_exports.string().optional()
|
|
23544
23166
|
}),
|
|
23545
|
-
//
|
|
23546
|
-
// meta 非空表示是 CC 注入的系统消息(task-notification / slash-command / system-reminder 等),
|
|
23547
|
-
// UI 据此走低视觉权重渲染或子 agent 通知卡。
|
|
23548
|
-
//
|
|
23549
|
-
// sender(2026-07-08 spec §4.1):daemon 'send' 命令 synth 的 user_text 携带发起人 SenderInfo;
|
|
23550
|
-
// observer 回灌路径(cc jsonl)永远不带 —— cc 自己写盘不知道 daemon 层身份。
|
|
23551
|
-
// UI 端 sender 缺省 → 不渲染 displayName label;有 → 气泡下方渲染。
|
|
23167
|
+
// Realtime user events carry daemon attribution. Engine transcripts omit structured sender, so history reconstructs persisted attribution from text.
|
|
23552
23168
|
external_exports.object({
|
|
23553
23169
|
...ParsedEventBase,
|
|
23554
23170
|
kind: external_exports.literal("user_text"),
|
|
@@ -23563,7 +23179,6 @@ var ParsedEventSchema = external_exports.discriminatedUnion("kind", [
|
|
|
23563
23179
|
kind: external_exports.literal("tool_call"),
|
|
23564
23180
|
toolUseId: external_exports.string(),
|
|
23565
23181
|
tool: external_exports.string(),
|
|
23566
|
-
// 等于 session.tool;UI 按 {toolKind, tool} 分派渲染。additive 可选,旧 adapter 不填也能解析
|
|
23567
23182
|
toolKind: external_exports.string().optional(),
|
|
23568
23183
|
input: external_exports.unknown()
|
|
23569
23184
|
}),
|
|
@@ -23578,11 +23193,7 @@ var ParsedEventSchema = external_exports.discriminatedUnion("kind", [
|
|
|
23578
23193
|
toolResultExtra: ToolResultExtraSchema.optional(),
|
|
23579
23194
|
// 精确指向发起 tool 的 assistant 消息顶层 uuid;toolUseId 已够 UI 聚合,这个仅作调试辅助
|
|
23580
23195
|
sourceToolAssistantUUID: external_exports.string().optional(),
|
|
23581
|
-
//
|
|
23582
|
-
// CC 用户答完后把 answers 写在 user 帧顶层 toolUseResult.answers,daemon parser
|
|
23583
|
-
// 抽到这里。UI eventsToLines 用 toolUseId 配对到 question-card line,把卡片转为
|
|
23584
|
-
// 只读态显示用户的答案。仅 AskUserQuestion 配对的 tool_result 行携带;普通工具不带。
|
|
23585
|
-
// 等价于 HistoryMessage.askQuestionAnswers(历史回放路径),两端字段名对齐。
|
|
23196
|
+
// Question answers pair tool results to their inline question-card anchor; history carries the equivalent answer projection.
|
|
23586
23197
|
askQuestionAnswers: external_exports.record(external_exports.string(), external_exports.string()).optional()
|
|
23587
23198
|
}),
|
|
23588
23199
|
// CC 命中项目记忆(`type:"attachment"`,`attachment.type:"memories"`)的独立事件;
|
|
@@ -23604,35 +23215,20 @@ var ParsedEventSchema = external_exports.discriminatedUnion("kind", [
|
|
|
23604
23215
|
// 选项 ii)。老 daemon / legacy CC 不发该字段时保持向后兼容(optional)。
|
|
23605
23216
|
toolUseId: external_exports.string().optional()
|
|
23606
23217
|
}),
|
|
23607
|
-
//
|
|
23608
|
-
// daemon parser 把 assistant tool_use AskUserQuestion 翻译成本 kind(不是 permission_request、
|
|
23609
|
-
// 也不是 tool_call),让 UI 在事件流自然位置渲染问答卡(紧跟 assistant 消息 / 在后续消息之前),
|
|
23610
|
-
// 而不是被强行挂在末尾。permission_request 帧仍正常下发驱动 pendingQuestions 状态机,
|
|
23611
|
-
// 但只走 wire 帧不入 ring buffer——状态由 daemon pendingQuestions 持有,
|
|
23612
|
-
// 渲染锚点由本 kind 的 ParsedEvent 提供。
|
|
23613
|
-
// 历史回放:history-to-lines.ts 在 jsonl tool_use AskUserQuestion 处插入对应 'question-card' line,
|
|
23614
|
-
// 配对的 tool_result 携带 toolUseResult.answers,已答完的展示只读态。
|
|
23218
|
+
// Inline question anchor determines card position. Pending-question wire state remains daemon-owned; answered tool results turn the same card read-only.
|
|
23615
23219
|
external_exports.object({
|
|
23616
23220
|
...ParsedEventBase,
|
|
23617
23221
|
kind: external_exports.literal("ask_user_question"),
|
|
23618
23222
|
toolUseId: external_exports.string(),
|
|
23619
23223
|
questions: external_exports.array(AskQuestionItemSchema)
|
|
23620
23224
|
}),
|
|
23621
|
-
//
|
|
23622
|
-
// UI useChatPanelState 收 "Claude is working" spinner(lastEventKind===turn_end)。
|
|
23623
|
-
// 三个产生来源:
|
|
23624
|
-
// ① SDK 模式 stream-json `result` 帧(claude.ts)—— stdout 最后一帧,可靠
|
|
23625
|
-
// ② TUI 模式 observer 读 JSONL `system/turn_duration` 行(claude-tui.ts parseLine)
|
|
23626
|
-
// ⚠️ CC 写此行早于该轮尾段正文落盘,可能被尾随 text 覆盖 lastEventKind(③ 存在的原因)
|
|
23627
|
-
// ③ TUI 模式 gate 关闭期被 drop 的 ② 信号,屏幕稳定后由 manager.notifyScreenIdle flush
|
|
23628
|
-
// 注入(PR #962 双源确认模型;旧 dispatchTurnIdle 已拆除)—— 排在 buffer 末条
|
|
23225
|
+
// End of one response turn. Engine adapters and TUI idle confirmation supply this event; reducer closes the turn and UI consumes status.
|
|
23629
23226
|
external_exports.object({
|
|
23630
23227
|
...ParsedEventBase,
|
|
23631
23228
|
kind: external_exports.literal("turn_end"),
|
|
23632
23229
|
// 本轮耗时(ms)。SDK=result.duration_ms;TUI=turn_duration.durationMs;缺失时 reducer 按 turnStartedAt 兜底
|
|
23633
23230
|
durationMs: external_exports.number().int().nonnegative().optional(),
|
|
23634
23231
|
reason: external_exports.enum(TURN_END_REASONS).optional(),
|
|
23635
|
-
/** Codex 完成轮次的原生 id;用于在该轮末条回复上显示 Fork / Quick Ask。 */
|
|
23636
23232
|
turnId: external_exports.string().min(1).optional()
|
|
23637
23233
|
}),
|
|
23638
23234
|
// SDK system 帧 task_started / task_progress / task_notification 的归一化产物:
|
|
@@ -23665,10 +23261,7 @@ var ParsedEventSchema = external_exports.discriminatedUnion("kind", [
|
|
|
23665
23261
|
kind: external_exports.literal("meta_update"),
|
|
23666
23262
|
patch: SessionMetaSchema
|
|
23667
23263
|
}),
|
|
23668
|
-
//
|
|
23669
|
-
// metaSource='cc' → CC 注入的系统消息(默认低视觉权重渲染)
|
|
23670
|
-
// metaSource='owner' → 老板通过 persona:appendOwnerMessage 插入的话(蓝色气泡)
|
|
23671
|
-
// 缺省视为 'cc';现有非 persona 场景保持兼容(不需要 owner 时不下发该字段)
|
|
23264
|
+
// metaSource selects engine-injected versus owner-authored system presentation; missing defaults to engine source.
|
|
23672
23265
|
external_exports.object({
|
|
23673
23266
|
...ParsedEventBase,
|
|
23674
23267
|
kind: external_exports.literal("meta-text"),
|
|
@@ -23681,28 +23274,16 @@ var SessionCreateArgs = external_exports.object({
|
|
|
23681
23274
|
cwd: external_exports.string().min(1).optional(),
|
|
23682
23275
|
tool: external_exports.string().optional(),
|
|
23683
23276
|
label: external_exports.string().optional(),
|
|
23684
|
-
// AI 标题的创建期占位(UI 传首行截断);正式值由 daemon 经 meta_update 投递,
|
|
23685
|
-
// session:update 不接受此字段(用户改名走 label)
|
|
23686
23277
|
aiLabel: external_exports.string().optional(),
|
|
23687
23278
|
model: external_exports.string().optional(),
|
|
23688
23279
|
permissionMode: external_exports.string().optional(),
|
|
23689
23280
|
effort: external_exports.string().optional(),
|
|
23690
|
-
// 用户在 NewSessionDialog 选择的 icon 标识;UI 端做 enum 兜底
|
|
23691
23281
|
iconKey: external_exports.string().optional(),
|
|
23692
|
-
// session:fork 派生 session 时由 UI 传入源 sessionId,daemon 写到 SessionFile.forkedFromSessionId
|
|
23693
23282
|
forkedFromSessionId: external_exports.string().min(1).optional(),
|
|
23694
|
-
// 快速问答:创建时打 ephemeral 标记,daemon 写到 SessionFile.ephemeral
|
|
23695
23283
|
ephemeral: external_exports.boolean().optional(),
|
|
23696
|
-
//
|
|
23697
|
-
// 且按 ownerPersonaId 做 idempotent dedupe(每 persona 永远只有一个 owner session)
|
|
23284
|
+
// Persona context derives cwd and spawn defaults; missing cwd is allowed when persona identity determines it.
|
|
23698
23285
|
ownerPersonaId: external_exports.string().min(1).optional(),
|
|
23699
|
-
/**
|
|
23700
|
-
* 新建会话选择的 project(spec 2026-08-17-projects-sidebar §4.2):
|
|
23701
|
-
* - 单独出现:daemon 以它为 cwd(等价传 cwd)
|
|
23702
|
-
* - 与 ownerPersonaId 同时出现:cwd 仍派生为 persona 目录,project 目录经
|
|
23703
|
-
* addDirs(CC --add-dir)/ codexSandbox.writableRoots(codex guest)挂载,
|
|
23704
|
-
* 并写入 SessionFile.projectPath 供归组
|
|
23705
|
-
*/
|
|
23286
|
+
/** Alone, projectPath supplies cwd. With a persona, retain persona cwd and attach the project for owner access/grouping. */
|
|
23706
23287
|
projectPath: external_exports.string().min(1).optional()
|
|
23707
23288
|
}).refine((args) => args.cwd != null || args.ownerPersonaId != null || args.projectPath != null, {
|
|
23708
23289
|
message: "cwd / ownerPersonaId / projectPath \u81F3\u5C11\u4F20\u4E00\u4E2A"
|
|
@@ -23710,7 +23291,6 @@ var SessionCreateArgs = external_exports.object({
|
|
|
23710
23291
|
var ProjectEntry = external_exports.object({
|
|
23711
23292
|
/** 归一化绝对路径(daemon 侧 ~ 展开 + resolve) */
|
|
23712
23293
|
path: external_exports.string().min(1),
|
|
23713
|
-
/** 展示名,缺省 basename */
|
|
23714
23294
|
name: external_exports.string().min(1),
|
|
23715
23295
|
createdAt: external_exports.string().datetime(),
|
|
23716
23296
|
/** 置顶时间(ms epoch,与 SessionFile.pinnedAt 同语义)。clawd-local,不同步 Codex */
|
|
@@ -23718,7 +23298,6 @@ var ProjectEntry = external_exports.object({
|
|
|
23718
23298
|
});
|
|
23719
23299
|
var ProjectPatchArgs = external_exports.object({
|
|
23720
23300
|
path: external_exports.string().min(1),
|
|
23721
|
-
/** number = 置顶(ms epoch);null = 取消置顶 */
|
|
23722
23301
|
pinnedAt: external_exports.number().nullable()
|
|
23723
23302
|
});
|
|
23724
23303
|
var ProjectRevealArgs = external_exports.object({
|
|
@@ -23748,22 +23327,10 @@ var SessionImportExternalArgs = external_exports.object({
|
|
|
23748
23327
|
var SessionListArgs = external_exports.object({
|
|
23749
23328
|
/** true = 只返回 mirror(originOwnerPrincipalId 非空,即「我在朋友 daemon 上创建」的本机存证)。 */
|
|
23750
23329
|
originOnly: external_exports.boolean().optional(),
|
|
23751
|
-
/**
|
|
23752
|
-
* 按 own persona 窄化(2026-07-21 self-persona-sessions 追加):只留
|
|
23753
|
-
* `s.ownerPersonaId === args.ownerPersonaId` 的 sessions。
|
|
23754
|
-
* - mirror 行(`ownerPersonaId` 恒 null)天然排除
|
|
23755
|
-
* - 与 `originOnly=true` 同传恒返 0
|
|
23756
|
-
* - 老 daemon 不识别时忽略字段返回全量,客户端消费侧本就自带过滤/截断,天然向后兼容
|
|
23757
|
-
*/
|
|
23330
|
+
/** Filter by local ownerPersonaId. Mirrors have this local pointer stripped; originOnly with this filter therefore produces no rows. */
|
|
23758
23331
|
ownerPersonaId: external_exports.string().min(1).optional(),
|
|
23759
|
-
/** 按 updatedAt desc(list 的既有排序)截断前 N 条。 */
|
|
23760
23332
|
limit: external_exports.number().int().positive().optional(),
|
|
23761
|
-
/**
|
|
23762
|
-
* 分页起点(2026-07-18 android-tasks-tab 迭代追加):originOnly / ownerPersonaId 过滤后、
|
|
23763
|
-
* limit 截断前跳过前 N 条。与 limit 组合 = updatedAt desc 序上的一页。响应带 total
|
|
23764
|
-
* (过滤后总数,见 handler)供客户端判 hasMore。老 daemon 不识别时忽略 → 回全量,
|
|
23765
|
-
* 客户端按全量兼容。
|
|
23766
|
-
*/
|
|
23333
|
+
/** Offset applies after filtering and before limit. Response total counts the filtered set; older daemons can return full data for client fallback. */
|
|
23767
23334
|
offset: external_exports.number().int().nonnegative().optional()
|
|
23768
23335
|
});
|
|
23769
23336
|
var SessionIdArgs = external_exports.object({ sessionId: external_exports.string().min(1) });
|
|
@@ -23775,12 +23342,8 @@ var SessionUpdateArgs = external_exports.object({
|
|
|
23775
23342
|
permissionMode: external_exports.string().optional(),
|
|
23776
23343
|
effort: external_exports.string().optional(),
|
|
23777
23344
|
cwd: external_exports.string().optional(),
|
|
23778
|
-
// 用户在 Edit modal 选择的 icon 标识;UI 端做 enum 兜底
|
|
23779
23345
|
iconKey: external_exports.string().optional(),
|
|
23780
|
-
//
|
|
23781
|
-
// z.literal(false) 让「不可逆」这条产品语义与协议约束是同一件事:反向标记会让会话
|
|
23782
|
-
// 从所有 sidebar 消费者视野消失(App.visibleSessions / buildSessionTree),用户看不见
|
|
23783
|
-
// 也删不掉,再被 sweepEphemeralOnStartup 静默删除——数据丢失级别的口子。
|
|
23346
|
+
// Promotion can only remove ephemeral status; adding it later would hide retained data and make startup cleanup delete it.
|
|
23784
23347
|
ephemeral: external_exports.literal(false).optional()
|
|
23785
23348
|
})
|
|
23786
23349
|
});
|
|
@@ -23793,11 +23356,7 @@ var QueuedMessage = external_exports.object({
|
|
|
23793
23356
|
var SessionSendArgs = external_exports.object({
|
|
23794
23357
|
sessionId: external_exports.string().min(1),
|
|
23795
23358
|
text: external_exports.string(),
|
|
23796
|
-
/**
|
|
23797
|
-
* turn 在跑时是入队还是直发。**入队与否由调用方显式声明,daemon 不按来源猜**:
|
|
23798
|
-
* UI 输入框传 true;IM / 飞书 / dispatch 注入不传 = 维持原状直发(老板 2026-08-31:
|
|
23799
|
-
* 其他地方先不加队列)。缺省 false → 行为与本字段引入前逐字一致。
|
|
23800
|
-
*/
|
|
23359
|
+
/** Queueing is caller opt-in, not inferred from origin. Missing/false preserves direct delivery for existing callers. */
|
|
23801
23360
|
queueWhileRunning: external_exports.boolean().optional()
|
|
23802
23361
|
});
|
|
23803
23362
|
var SessionDequeueArgs = external_exports.object({
|
|
@@ -23851,21 +23410,11 @@ var SessionResumeArgs = external_exports.object({
|
|
|
23851
23410
|
var SessionForkArgs = external_exports.object({
|
|
23852
23411
|
cwd: external_exports.string().min(1),
|
|
23853
23412
|
toolSessionId: external_exports.string().min(1),
|
|
23854
|
-
/** Claude 消息 UUID;Codex 改用 turnId。 */
|
|
23855
23413
|
messageUuid: external_exports.string().min(1).optional(),
|
|
23856
|
-
/** Codex 原生已完成 turn ID。 */
|
|
23857
23414
|
turnId: external_exports.string().min(1).optional(),
|
|
23858
23415
|
/** 源 clawd session ID;Codex 必填,handler 用它校验 thread 归属。 */
|
|
23859
23416
|
sourceSessionId: external_exports.string().min(1).optional(),
|
|
23860
|
-
/**
|
|
23861
|
-
* 派生 jsonl 的落点 cwd(缺省 = 源文件所在目录,保持老行为)。
|
|
23862
|
-
*
|
|
23863
|
-
* 必须传的场景:调用方随后要用这条 transcript 建 session,而那个 session 的 cwd 与
|
|
23864
|
-
* 源 session 不同——最典型是 persona session(daemon 按 ownerPersonaId 把 cwd 强制
|
|
23865
|
-
* 派生成 persona 根)。CC `--resume` 只在**当前 cwd 的** projects 目录里找 session,
|
|
23866
|
-
* 落点与目标 cwd 分家 = 历史读不到 + resume 接不上(bug: quick-ask-blank-after-worktree)。
|
|
23867
|
-
* 正确编排:先 sessionCreate 拿到 daemon 定的真实 cwd,再以它作 targetCwd fork。
|
|
23868
|
-
*/
|
|
23417
|
+
/** Fork into the actual target cwd when it differs from the source: Claude resumes only from the current cwd's transcript directory. Create the target session first to obtain that derived cwd. */
|
|
23869
23418
|
targetCwd: external_exports.string().min(1).optional()
|
|
23870
23419
|
}).refine((args) => Boolean(args.messageUuid || args.turnId), "messageUuid or turnId required");
|
|
23871
23420
|
var SessionForkResponseSchema = external_exports.object({
|
|
@@ -23901,14 +23450,7 @@ var HistoryReadArgs = external_exports.object({
|
|
|
23901
23450
|
offset: external_exports.number().int().nonnegative().optional(),
|
|
23902
23451
|
/** 云历史分页快照标识;续页原样带回,避免多条链交错时混读。 */
|
|
23903
23452
|
snapshotId: external_exports.string().uuid().optional(),
|
|
23904
|
-
/**
|
|
23905
|
-
* 瘦身投影(2026-07-18 android-tasks-tab 迭代,v2 语义):true = daemon 裁掉窄消费面客户端
|
|
23906
|
-
* (mobile)不渲染的大字段(input / output / raw / toolResultExtra / memories /
|
|
23907
|
-
* sourceToolAssistantUUID),meta 注入行 text 截 500 字符。**例外:出错的工具调用全量保留**——
|
|
23908
|
-
* 本页内 error 非空的 tool_result 保留 output,且其同 toolUseId 的 tool_call 保留 input
|
|
23909
|
-
* (用户要能看清「啥错了」;老板 2026-07-18 拍板:普通工具调用手机不渲染,错误全量展示)。
|
|
23910
|
-
* desktop 渲染 tool card 需全文,不用此参数。老 daemon 不识别 → 回全量,客户端向后兼容。
|
|
23911
|
-
*/
|
|
23453
|
+
/** Slim drops large non-rendered fields and truncates metadata text. Failed tool results keep output and page-local matching calls keep input, so error diagnosis remains possible. */
|
|
23912
23454
|
slim: external_exports.boolean().optional()
|
|
23913
23455
|
});
|
|
23914
23456
|
var HistorySubagentsArgs = external_exports.object({
|
|
@@ -23921,7 +23463,6 @@ var HistorySubagentReadArgs = external_exports.object({
|
|
|
23921
23463
|
subagentId: external_exports.string().min(1)
|
|
23922
23464
|
});
|
|
23923
23465
|
var WorkspaceListArgs = external_exports.object({
|
|
23924
|
-
// cwd 缺省则 daemon 兜底 os.homedir();UI 的 DirBrowser 首次浏览就走这条路径
|
|
23925
23466
|
cwd: external_exports.string().min(1).optional(),
|
|
23926
23467
|
path: external_exports.string().optional(),
|
|
23927
23468
|
showHidden: external_exports.boolean().optional()
|
|
@@ -23972,8 +23513,6 @@ var SessionSearchContentArgs = external_exports.object({
|
|
|
23972
23513
|
});
|
|
23973
23514
|
var SessionSearchMatchSchema = external_exports.object({
|
|
23974
23515
|
sessionId: external_exports.string().min(1),
|
|
23975
|
-
// 命中处上下文片段,已单行化。**不回高亮 offset**:调用方手里有 query,
|
|
23976
|
-
// 自己在 snippet 里 indexOf 就能高亮,wire 上少一组坐标少一处漂
|
|
23977
23516
|
snippet: external_exports.string()
|
|
23978
23517
|
});
|
|
23979
23518
|
var SessionSearchContentResponseSchema = external_exports.object({
|
|
@@ -24017,14 +23556,12 @@ var SessionQuestionFrameSchema = external_exports.object({
|
|
|
24017
23556
|
sessionId: external_exports.string().min(1),
|
|
24018
23557
|
toolUseId: external_exports.string().min(1),
|
|
24019
23558
|
requestId: external_exports.string().min(1),
|
|
24020
|
-
// UI 单卡承载多 question;空数组语义无效,schema 必拒
|
|
24021
23559
|
questions: external_exports.array(AskQuestionItemSchema).min(1)
|
|
24022
23560
|
});
|
|
24023
23561
|
var SessionQuestionClearedFrameSchema = external_exports.object({
|
|
24024
23562
|
type: external_exports.literal("session:question:cleared"),
|
|
24025
23563
|
sessionId: external_exports.string().min(1),
|
|
24026
23564
|
toolUseId: external_exports.string().min(1),
|
|
24027
|
-
// record<string,string>:与 AnswerQuestionArgs.answers 同形状(question text → label)
|
|
24028
23565
|
answers: external_exports.record(external_exports.string(), external_exports.string()).optional()
|
|
24029
23566
|
});
|
|
24030
23567
|
var AnswerQuestionArgs = external_exports.object({
|
|
@@ -24049,15 +23586,7 @@ var AuthRequestFrameSchema = external_exports.object({
|
|
|
24049
23586
|
type: external_exports.literal("auth"),
|
|
24050
23587
|
token: external_exports.string().min(1),
|
|
24051
23588
|
scheme: external_exports.literal("bearer").optional(),
|
|
24052
|
-
/**
|
|
24053
|
-
* 决策 #16:自报身份字段(selfPrincipalId / selfDisplayName / selfDeviceId)全部删除——
|
|
24054
|
-
* guest 的设备 id / 人 id / 来源全部由 connect token 的 subDevice/subOwner/provider 签名背书
|
|
24055
|
-
* (server 签、目标设备本地验签,不可伪造),不再接受任何自报身份。
|
|
24056
|
-
*
|
|
24057
|
-
* selfUrl 已废弃(spec 2026-07-22 双向确认建联):可达地址自报移入 contact:handshake
|
|
24058
|
-
* args——auth 层回归纯验票。旧客户端发来的 selfUrl 被 strip(zod 默认),无害;
|
|
24059
|
-
* 旧客户端本身由 whoami 的 connect-token 拒绝路径拦截(CLIENT_OUTDATED)。
|
|
24060
|
-
*/
|
|
23589
|
+
/** Guest identity comes from signed token claims. Legacy self-reported fields and selfUrl are stripped; reachability belongs to contact:handshake. */
|
|
24061
23590
|
/**
|
|
24062
23591
|
* 客户端自报的 user-agent 性质标签(诊断/展示用)。
|
|
24063
23592
|
* 「自报事实」,非身份(决策 #16 边界):不参与鉴权、不参与路由、
|
|
@@ -24113,15 +23642,8 @@ var InfoResponseSchema = external_exports.object({
|
|
|
24113
23642
|
os: external_exports.string(),
|
|
24114
23643
|
tools: external_exports.array(external_exports.object({ id: external_exports.string(), available: external_exports.boolean() })),
|
|
24115
23644
|
runningSessions: external_exports.array(InfoRunningSessionSchema),
|
|
24116
|
-
|
|
24117
|
-
// PR 1 阶段标 optional(daemon 还没下发,旧 daemon info 响应不带这五个字段);
|
|
24118
|
-
// PR 2 daemon 实现 single HTTP server + auth-context 后,daemon 必返这五个字段,
|
|
24119
|
-
// 届时可考虑改成 required。spec §11 第 3 条:"tokenRole 是协议字段,daemon 查 token
|
|
24120
|
-
// 表后显式下发,UI 不自行推导"——所以 UI 一律读这里,禁止本地推导。
|
|
24121
|
-
/** 'owner' = 拿到 owner-token 的连接(不限来源 IP)。来源 TOKEN_ROLES(spec §11 #1 中央真理源)。
|
|
24122
|
-
* 历史 'personal' role(persona file-sharing token)在 2026-05-21 删除;tokenPersonaId 一同移除。 */
|
|
23645
|
+
/** File-token role supplied by daemon; derive accepted values from the central TOKEN_ROLES array. */
|
|
24123
23646
|
tokenRole: external_exports.enum(TOKEN_ROLES).optional(),
|
|
24124
|
-
/** socket.remoteAddress 是否落在 127.0.0.1 / ::1;本期无 RPC 消费,保留协议槽位给未来 "Reveal in Finder" 等本机动作 */
|
|
24125
23647
|
isLoopback: external_exports.boolean().optional(),
|
|
24126
23648
|
/** UI 拼 file-sharing HTTP 路由的前缀(http(s)://host:port),不含尾斜杠;frpc 反代时返反代地址 */
|
|
24127
23649
|
httpBaseUrl: external_exports.string().optional(),
|
|
@@ -24327,7 +23849,6 @@ var METHOD_DOCS = {
|
|
|
24327
23849
|
summary: "\u8BFB\u6587\u4EF6\u5185\u5BB9\uFF1Bguest \u8DEF\u5F84\u8FB9\u754C\u4E0E workspace:list \u540C",
|
|
24328
23850
|
args: WorkspaceReadArgs
|
|
24329
23851
|
},
|
|
24330
|
-
// ---- deploy:*(persona 上云:persona 目录 = git 仓库工作树,发布 = 推送触发仓库流水线)----
|
|
24331
23852
|
"deploy:get": {
|
|
24332
23853
|
summary: "\u4E0A\u4E91\u9875\u9762\u8981\u7684\u5168\u90E8\uFF1A\u4ED3\u5E93\u7ED1\u5B9A\u72B6\u6001\uFF08git \u73B0\u7B97\uFF09\u3001\u626B\u63CF\u5386\u53F2\uFF08\u6BCF\u6761\u5E26\u6E05\u5355\u5FEB\u7167\uFF09\u3001\u53D1\u5E03\u5386\u53F2\uFF08\u6700\u540E\u4E00\u6761 = \u7EBF\u4E0A\u6B63\u8DD1\u7684\uFF09\u3001\u4ED3\u5E93 Secrets \u91CC\u5404\u53D8\u91CF\u540D\u586B\u8FC7\u6CA1\u6709\uFF08**\u53EA\u6709\u540D\u5B57\u548C\u65F6\u95F4\uFF0C\u6CA1\u6709\u503C**\uFF09\u3001\u4E00\u6761\u6D41\u6C34\u7EBF\u72B6\u6001\uFF08\u7F3A\u7701\u4ED3\u5E93\u6700\u65B0\u90A3\u6761\uFF1B`releaseHead` \u6307\u540D\u770B\u54EA\u6B21\u53D1\u5E03\u7684\uFF09\uFF1Bowner-only",
|
|
24333
23854
|
args: DeployGetArgsSchema
|
|
@@ -24371,7 +23892,6 @@ var METHOD_DOCS = {
|
|
|
24371
23892
|
summary: "\u4E0B\u7EBF\uFF1A\u89E6\u53D1 persona \u4ED3\u5E93\u91CC\u7684 clawd-unpublish.yml\uFF08workflow_dispatch\uFF09\uFF0C\u7531\u6D41\u6C34\u7EBF\u5728 gateway \u64A4\u6389\u6B63\u5F0F\u767B\u8BB0\u2014\u2014\u522B\u4EBA\u770B\u4E0D\u5230\u3001\u7528\u4E0D\u4E86\uFF1B\u4ED3\u5E93 / \u955C\u50CF / \u672C\u673A\u4E0A\u4E91\u8BB0\u5F55\u90FD\u4E0D\u52A8\uFF0C\u91CD\u65B0\u53D1\u5E03\u5C31\u56DE\u6765\u3002\u6700\u540E\u4E00\u6B21\u53D1\u5E03\u7684 commit \u91CC\u6CA1\u6709\u8FD9\u4EFD workflow\uFF08\u65E7\u6A21\u677F\uFF09\u65F6\u62D2\uFF0C\u8981\u5148\u91CD\u65B0\u53D1\u5E03\u4E00\u6B21\u3002\u56DE { before }\uFF1A\u89E6\u53D1\u4E4B\u524D\u73B0\u67E5\u7684\u6700\u65B0\u4E0B\u7EBF run id\uFF08\u6CA1\u4E0B\u7EBF\u8FC7 = null\uFF09\uFF0C\u9875\u9762\u62FF\u5B83\u8BA4\u65B0 run\uFF1Bowner-only\u3001human-only",
|
|
24372
23893
|
args: DeployPersonaArgsSchema
|
|
24373
23894
|
},
|
|
24374
|
-
// ---- githubAuth:*(本机 GitHub 身份,机器级;spec 2026-09-15-github-auth-unify-design §4.3)----
|
|
24375
23895
|
"githubAuth:get": {
|
|
24376
23896
|
summary: "\u672C\u673A\u7684 GitHub \u8EAB\u4EFD\uFF1Aauthorized\uFF08@login\uFF0C\u6765\u81EA git \u51ED\u636E\u5B58\u50A8 / \u672C\u673A\u51ED\u636E\u8868\uFF09/ missing / invalid\uFF08GitHub \u4E0D\u8BA4\uFF09/ pending\uFF08\u7B49 GitHub \u8DF3\u56DE\u4E2D\u5FC3\uFF09\u3002\u8BBE\u7F6E\u9875\u300C\u8D26\u53F7\u300D\u3001\u4E0A\u4E91\u9875\u9876\u4E0A\u90A3\u5F20\u5361\u3001PR \u6536\u4EF6\u7BB1\u90FD\u770B\u5B83\uFF1Bpending \u671F\u9875\u9762\u6BCF 2 \u79D2\u8F6E\u8BE2\uFF0Cdaemon \u987A\u624B\u5411\u4E2D\u5FC3\u9886 token\u3002\u65E0\u53C2\u6570",
|
|
24377
23897
|
args: NO_ARGS
|
|
@@ -24384,7 +23904,6 @@ var METHOD_DOCS = {
|
|
|
24384
23904
|
summary: "\u628A\u7528\u6237\u7C98\u7684 GitHub token \u5B58\u6210\u672C\u673A\u8EAB\u4EFD\uFF08\u70B9\u94FE\u63A5\u8D70\u4E0D\u901A\u65F6\u7684\u9000\u8DEF\uFF09\uFF1A\u5148 GET /user \u9A8C\u8BC1\uFF0C\u518D git credential approve \u4EA4\u7ED9 git \u7684 helper \u5B58\uFF08git \u6CA1\u914D helper \u65F6\u9000\u5230\u672C\u673A\u51ED\u636E\u8868 secrets/github.env\uFF09\u3002\u5165\u53C2\u4E0D\u8FDB\u65E5\u5FD7\u3001\u54CD\u5E94\u4E0D\u56DE\u663E token\uFF1Bowner-only",
|
|
24385
23905
|
args: GithubAuthAuthorizeArgsSchema
|
|
24386
23906
|
},
|
|
24387
|
-
// ---- cloud:connectors:*(云 persona 卡片上的连接器;design 2026-09-11-mcp-connector §3.8)----
|
|
24388
23907
|
"cloud:connectors:list": {
|
|
24389
23908
|
summary: "\u4E91\u4E0A persona \u5361\u7247\u4E0A\u7684\u8FDE\u63A5\u5668\u533A\uFF1A\u8FD9\u4E2A persona \u58F0\u660E\u7684\u3001**\u8981\u4F7F\u7528\u8005\u672C\u4EBA\u6388\u6743\u7684**\u8FDE\u63A5\u5668\u5404\u81EA\u8FDE\u6CA1\u8FDE\u4E0A\uFF08connected / missing / reauth\uFF09\u3001\u6309\u94AE\u662F\u5173\u8054\uFF08OAuth\uFF0C\u5E26\u73B0\u7B97\u7684 authUrl\uFF09\u8FD8\u662F\u7C98\u8D34 API key\uFF08\u5E26\u8981\u586B\u7684\u53D8\u91CF\uFF09\u3002daemon \u62FF gateway \u767B\u8BB0\u884C + \u672C\u673A\u767B\u5F55\u51ED\u8BC1\u5411\u4E2D\u5FC3\u4EE3\u67E5\uFF0C\u51ED\u8BC1\u4E0D\u51FA ws\uFF1Bowner-only",
|
|
24390
23909
|
args: CloudConnectorsListArgsSchema
|
|
@@ -24393,12 +23912,10 @@ var METHOD_DOCS = {
|
|
|
24393
23912
|
summary: "\u586B\u5199\u578B\u8FDE\u63A5\u5668\uFF1A\u628A\u4F7F\u7528\u8005\u672C\u4EBA\u7684\u51ED\u636E\u503C\u4EA4\u7ED9\u4E2D\u5FC3\u52A0\u5BC6\u5165\u5E93\uFF08\u4E00\u6B21\u586B\u5199\u5168\u5C40\u5171\u7528\uFF09\u3002**\u8FD9\u662F\u503C\u552F\u4E00\u7684\u5165\u53E3**\uFF1A\u5165\u53C2\u4E0D\u8FDB\u65E5\u5FD7\u3001\u54CD\u5E94\u4E0D\u56DE\u663E\u3001\u672C\u673A\u4E0D\u843D\u76D8\uFF1B\u683C\u540D\u5FC5\u987B\u662F\u8BE5\u8FDE\u63A5\u5668\u58F0\u660E\u8FC7\u7684\uFF1Bowner-only",
|
|
24394
23913
|
args: CloudConnectorFillArgsSchema
|
|
24395
23914
|
},
|
|
24396
|
-
// ---- cloud:volume:get(云上会话聊天页顶栏的云盘角标;design 2026-09-19-cloud-volume-usage §3.3)----
|
|
24397
23915
|
"cloud:volume:get": {
|
|
24398
23916
|
summary: "\u8C03\u7528\u65B9\u81EA\u5DF1\u90A3\u5757\u4E91\u76D8\u4E0A\u4E00\u8F6E\u672B\u7684\u7528\u91CF\uFF08usedBytes / sizeBytes / measuredAt\uFF09\u3002\u6309\u4EBA\u4E0D\u6309 persona\uFF1A\u4E91\u4E0A\u6240\u6709 persona \u5171\u7528\u4E00\u5757\u76D8\u3002daemon \u62FF\u672C\u673A api key \u95EE gateway /me/volume\uFF1B\u6CA1\u767B\u5F55 / \u6CA1 key / gateway \u4E0D\u901A / \u6CA1\u8DD1\u8FC7\u4EFB\u52A1\u4E00\u5F8B\u56DE volume:null\uFF08\u89D2\u6807\u4E0D\u6E32\uFF09\uFF0C\u4E0D\u629B\uFF1Bowner-only\u3002\u65E0\u53C2\u6570\uFF08\u67E5\u7684\u662F\u8C03\u7528\u65B9\u81EA\u5DF1\u7684\u76D8\uFF09",
|
|
24399
23917
|
args: NO_ARGS
|
|
24400
23918
|
},
|
|
24401
|
-
// ---- dashboard:*(设置 → Dashboard 专区;design 2026-09-23-cloud-persona-metrics §3.8)----
|
|
24402
23919
|
"dashboard:openUrl": {
|
|
24403
23920
|
summary: "\u7B7E\u4E00\u4E2A\u770B\u677F\u9875\u9762\u7684\u6D4F\u89C8\u5668\u94FE\u63A5\uFF08\u73B0\u5728\u53EA\u6709 cloud-persona-metrics\uFF1A\u4E91 persona \u8FD0\u884C\u72B6\u51B5\uFF09\u3002\u94FE\u63A5\u8D70\u672C\u673A tunnel \u516C\u7F51\u5730\u5740\u300124 \u5C0F\u65F6\u540E\u8FC7\u671F\uFF0C\u9875\u9762\u4E0E\u5B83\u7684\u6570\u636E\u63A5\u53E3\u90FD\u51ED\u94FE\u63A5\u4E0A\u7684\u7B7E\u540D\u653E\u884C\uFF1B\u6570\u636E\u7531\u672C\u673A daemon \u62FF\u672C\u673A api key \u5411\u4E91\u4E0A gateway \u4EE3\u53D6\u3002tunnel \u6CA1\u8FDE\u4E0A\u62A5 TUNNEL_UNAVAILABLE\uFF1Bowner-only",
|
|
24404
23921
|
args: DashboardOpenUrlArgs
|
|
@@ -24407,7 +23924,6 @@ var METHOD_DOCS = {
|
|
|
24407
23924
|
summary: "\u5217\u51FA owner \u7684\u5168\u90E8 shift\uFF08\u6392\u73ED\uFF09\uFF0C\u7ED9 UI \u65E5\u5386\u6E32\u67D3\u7528\uFF1Bowner-only",
|
|
24408
23925
|
args: NO_ARGS
|
|
24409
23926
|
},
|
|
24410
|
-
// ---- channel:*(Channel × Master:话题的聚合,纯组织单位)----
|
|
24411
23927
|
"channel:list": {
|
|
24412
23928
|
summary: "\u5217\u51FA\u5168\u90E8\u9891\u9053\uFF08Channel \xD7 Master \u7684\u7EC4\u7EC7\u5355\u4F4D\uFF1A\u6210\u5458\u540D\u5355 + \u8BDD\u9898\u7684\u805A\u5408\uFF09\uFF1Bowner-only\u3002\u65E0\u53C2\u6570",
|
|
24413
23929
|
args: NO_ARGS
|
|
@@ -24424,7 +23940,6 @@ var METHOD_DOCS = {
|
|
|
24424
23940
|
summary: "\u5220\u9891\u9053\uFF1B\u5176\u4E0B\u4ECD\u6709\u672A\u7ED3\u675F\u8BDD\u9898\u65F6\u62D2\u7EDD\uFF08fail-fast\uFF0C\u4E0D\u7EA7\u8054\u5220\u8BDD\u9898\uFF09",
|
|
24425
23941
|
args: ChannelDeleteArgsSchema
|
|
24426
23942
|
},
|
|
24427
|
-
// ---- topic:*(话题:一个任务的容器;一个话题 = 一个 Master session)----
|
|
24428
23943
|
"topic:list": {
|
|
24429
23944
|
summary: "\u5217\u67D0\u9891\u9053\u4E0B\u5168\u90E8\u8BDD\u9898\uFF08\u542B\u72B6\u6001\uFF0C\u4F9B\u9891\u9053 flyout \u5217\u8868\uFF09",
|
|
24430
23945
|
args: TopicListArgsSchema
|
|
@@ -24456,7 +23971,6 @@ var METHOD_DOCS = {
|
|
|
24456
23971
|
summary: "\u5224\u67D0\u6761\u7EBF\u5408\u683C\uFF1A\u7F6E accepted \u5E76\u540C\u6B65\u843D\u4E00\u6761\u6D41\u6C34\uFF1Breason \u4E0E watcherVerdict \u5FC5\u586B\uFF08\u4E0E\u6253\u56DE\u5BF9\u79F0\uFF0C\u53EA\u8BB0\u6253\u56DE\u7B49\u4E8E\u53EA\u8BB0\u5206\u5B50\uFF09\u3002watcherVerdict=fail \u65F6\u5FC5\u987B\u7ED9 overrideReason\uFF0Cdaemon \u5355\u72EC\u8BA1\u63A8\u7FFB\u6B21\u6570\u3002\u8FD4\u56DE acceptedLines / totalLines / allAccepted / overrides / needsOwnerAttention\uFF0C\u6536\u655B\u65F6\u673A\u7531 daemon \u6570\u4E0D\u7531 Master \u76D8",
|
|
24457
23972
|
args: TopicAcceptArgsSchema,
|
|
24458
23973
|
argsConstraints: {
|
|
24459
|
-
// watcherVerdict=fail 时 overrideReason 必填(.refine 的谓词不可序列化,这里显式声明)
|
|
24460
23974
|
if: { properties: { watcherVerdict: { const: "fail" } }, required: ["watcherVerdict"] },
|
|
24461
23975
|
then: { required: ["overrideReason"] }
|
|
24462
23976
|
}
|
|
@@ -24473,7 +23987,6 @@ var METHOD_DOCS = {
|
|
|
24473
23987
|
summary: "\u5220\u8BDD\u9898\uFF1A\u8FDE\u5E26\u5220\u8FD9\u4E2A\u8BDD\u9898\u540D\u4E0B\u7684\u5168\u90E8\u4F1A\u8BDD\u2014\u2014\u5B83\u7684 Master session\uFF081:1\uFF09+ \u5B83\u6D3E\u51FA\u53BB\u7684\u6BCF\u4E00\u6761 worker session\uFF1Bdispatch \u53F0\u8D26\u884C\u4FDD\u7559\u3002\u4F1A\u8BDD\u5DF2\u4E0D\u5728\u65F6\u8BDD\u9898\u7167\u5220\uFF0CMaster \u90A3\u6761\u56DE removedMasterSessionId: null\uFF0Cworker \u90A3\u4E9B\u4E0D\u8FDB removedWorkerSessionIds",
|
|
24474
23988
|
args: TopicDeleteArgsSchema
|
|
24475
23989
|
},
|
|
24476
|
-
// ---- master:*(授权查表,Master 经 clawd-rpc 桥调)----
|
|
24477
23990
|
"master:authorityCheck": {
|
|
24478
23991
|
summary: "\u67E5 Master \u7684\u6388\u6743\u8BBE\u5B9A\uFF08\u5168\u5C40\u4E00\u5957\uFF09\uFF1A\u8FD4\u56DE ask / allow / deny + source\u3002**\u8BBE\u5B9A\u6587\u4EF6\u4E0D\u5B58\u5728 \u2192 \u7528\u51FA\u5382\u9ED8\u8BA4\u89C4\u5219\u8868**\uFF08source=default\uFF0C\u5F53\u524D\u56DB\u6761\u5BF9\u5916\u4E0D\u53EF\u9006\u52A8\u4F5C\u5168\u662F ask\uFF0C\u522B\u628A\u5B83\u5F53\u5F02\u5E38\u515C\u5E95\uFF09\uFF1B\u8BFB\u574F / \u7ED3\u6784\u4E0D\u5BF9 / action \u62FC\u9519 / id \u672A\u767B\u8BB0 \u2192 **fail-safe \u88C1\u51B3 ask**\uFF08source=fallback:<\u539F\u56E0>\uFF0C\u4E0D\u9759\u9ED8\u541E\uFF09",
|
|
24479
23992
|
args: AuthorityCheckArgsSchema
|
|
@@ -24838,20 +24351,15 @@ var METHOD_NAMES = Object.keys(METHOD_DOCS);
|
|
|
24838
24351
|
var RPC_METHOD_STATUSES = ["allowed", "conditional", "denied"];
|
|
24839
24352
|
var RpcMethodStatusSchema = external_exports.enum(RPC_METHOD_STATUSES);
|
|
24840
24353
|
var RpcMethodInfoSchema = external_exports.object({
|
|
24841
|
-
/** canonical method 名,直接可作为 clawd-rpc call 的 method 参数 */
|
|
24842
24354
|
name: external_exports.string().min(1),
|
|
24843
24355
|
status: RpcMethodStatusSchema,
|
|
24844
|
-
/** 该 method 干什么,取自 {@link METHOD_DOCS} 的 summary */
|
|
24845
24356
|
description: external_exports.string().min(1),
|
|
24846
24357
|
/**
|
|
24847
24358
|
* 参数字段,从 {@link METHOD_DOCS} 的 args schema **反射**得来(不手写)。
|
|
24848
24359
|
* `null` = 该 method 还没有中央 zod schema(欠账,见 RpcMethodDoc),调用方需自行试探。
|
|
24849
24360
|
*/
|
|
24850
24361
|
args: external_exports.array(external_exports.object({ name: external_exports.string(), required: external_exports.boolean() })).nullable(),
|
|
24851
|
-
/**
|
|
24852
|
-
* 完整 args JSON Schema(draft-07),来自 {@link methodArgsSchema}。
|
|
24853
|
-
* **只在按 method 单查时下发**——全量目录带上 105 份 schema 会吃掉消费方一大块 context。
|
|
24854
|
-
*/
|
|
24362
|
+
/** Full JSON Schema is included only for a method-specific query to bound the directory response size. */
|
|
24855
24363
|
argsSchema: external_exports.record(external_exports.unknown()).optional(),
|
|
24856
24364
|
/**
|
|
24857
24365
|
* `denied` 必带:daemon error code(`UNAUTHORIZED` / `FEISHU_LOGIN_REQUIRED` /
|
|
@@ -24865,13 +24373,11 @@ var RpcMethodInfoSchema = external_exports.object({
|
|
|
24865
24373
|
});
|
|
24866
24374
|
var MetaMethodsResultSchema = external_exports.object({
|
|
24867
24375
|
type: external_exports.literal("meta:methods"),
|
|
24868
|
-
/** METHOD_NAMES 全集,顺序与之一致 */
|
|
24869
24376
|
methods: external_exports.array(RpcMethodInfoSchema)
|
|
24870
24377
|
});
|
|
24871
24378
|
|
|
24872
24379
|
// ../protocol/src/cloud-volume-schemas.ts
|
|
24873
24380
|
var CloudVolumeUsageSchema = external_exports.object({
|
|
24874
|
-
/** 已用字节(df 的 Used 列) */
|
|
24875
24381
|
usedBytes: external_exports.number().int().nonnegative(),
|
|
24876
24382
|
/** 盘的总字节(df 的 1B-blocks 列;ext4 预留之后比 PVC 的 5Gi 略小) */
|
|
24877
24383
|
sizeBytes: external_exports.number().int().positive(),
|