@clawos-dev/clawd 0.2.381 → 0.2.383
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/cli.cjs +1578 -552
- package/dist/dispatch/mcp-server.cjs +251 -2
- package/dist/persona-defaults/persona-master/.claude/agents/line-watcher.md +47 -0
- package/dist/persona-defaults/persona-master/CLAUDE.md +151 -0
- package/dist/share-md-viewer-error.html +1 -1
- package/dist/share-md-viewer.html +1 -1
- package/dist/share-ui/assets/guest-BYXoorJY.js +559 -0
- package/dist/share-ui/assets/guest-Bu1Swx93.css +32 -0
- package/dist/share-ui/guest.html +2 -2
- package/package.json +1 -1
- package/dist/share-ui/assets/guest-B0hI591-.js +0 -559
- package/dist/share-ui/assets/guest-BHxPh0N8.css +0 -32
|
@@ -21478,7 +21478,11 @@ var DispatchRunArgsSchema = external_exports.object({
|
|
|
21478
21478
|
// 时 daemon 层静默丢弃(避免半途改 label 造成 sidebar 抖动)。
|
|
21479
21479
|
// 上限 60 字符——sidebar 显示 tolerance,卡在 dispatch 入口即可。
|
|
21480
21480
|
// 协议层不硬拒 sessionLabel + dispatchId 同传,保留 forward-compat。
|
|
21481
|
-
sessionLabel: external_exports.string().min(1).max(60).optional()
|
|
21481
|
+
sessionLabel: external_exports.string().min(1).max(60).optional(),
|
|
21482
|
+
// 上层消费者(Master)挂载话题/线语义:topicId / lineId / 验收标准 / rejectCount 等。
|
|
21483
|
+
// daemon **不解释**内容,只透传进台账行 DispatchRecord.meta(新开)或与既有 meta
|
|
21484
|
+
// merge(续派,见 handlers/persona-dispatch.ts)。与台账行 meta 同款自由 JSON 契约。
|
|
21485
|
+
meta: external_exports.record(external_exports.unknown()).optional()
|
|
21482
21486
|
}).refine((v) => v.targetPersona !== void 0 || v.dispatchId !== void 0, {
|
|
21483
21487
|
message: "either targetPersona (new dispatch) or dispatchId (follow-up) is required"
|
|
21484
21488
|
}).refine((v) => !(v.dispatchId !== void 0 && v.targetDeviceId !== void 0), {
|
|
@@ -21796,6 +21800,180 @@ var ShiftInternalHistoryArgs = external_exports.object({
|
|
|
21796
21800
|
limit: external_exports.number().int().positive().optional()
|
|
21797
21801
|
});
|
|
21798
21802
|
|
|
21803
|
+
// ../protocol/src/channel.ts
|
|
21804
|
+
var ChannelSchema = external_exports.object({
|
|
21805
|
+
id: external_exports.string().min(1),
|
|
21806
|
+
name: external_exports.string().min(1),
|
|
21807
|
+
/** 该频道里可被派活的 persona */
|
|
21808
|
+
memberPersonaIds: external_exports.array(external_exports.string().min(1)),
|
|
21809
|
+
/** 人类成员(contact deviceId);M2 只存不用,P1 异步询问才消费 */
|
|
21810
|
+
memberContactDeviceIds: external_exports.array(external_exports.string().min(1)),
|
|
21811
|
+
createdAt: external_exports.string().min(1),
|
|
21812
|
+
updatedAt: external_exports.string().min(1)
|
|
21813
|
+
});
|
|
21814
|
+
var nonBlank = external_exports.string().trim().min(1);
|
|
21815
|
+
var ChannelCreateArgsSchema = external_exports.object({
|
|
21816
|
+
name: nonBlank,
|
|
21817
|
+
memberPersonaIds: external_exports.array(external_exports.string().min(1)).default([]),
|
|
21818
|
+
memberContactDeviceIds: external_exports.array(external_exports.string().min(1)).default([])
|
|
21819
|
+
});
|
|
21820
|
+
var ChannelUpdateArgsSchema = external_exports.object({
|
|
21821
|
+
channelId: external_exports.string().min(1),
|
|
21822
|
+
name: nonBlank.optional(),
|
|
21823
|
+
memberPersonaIds: external_exports.array(external_exports.string().min(1)).optional(),
|
|
21824
|
+
memberContactDeviceIds: external_exports.array(external_exports.string().min(1)).optional()
|
|
21825
|
+
});
|
|
21826
|
+
var ChannelDeleteArgsSchema = external_exports.object({ channelId: external_exports.string().min(1) });
|
|
21827
|
+
var ChannelListResultSchema = external_exports.object({ channels: external_exports.array(ChannelSchema) });
|
|
21828
|
+
var ChannelResultSchema = external_exports.object({ channel: ChannelSchema });
|
|
21829
|
+
var ChannelDeleteResultSchema = external_exports.object({
|
|
21830
|
+
ok: external_exports.literal(true),
|
|
21831
|
+
/** 一并清掉的已结束话题数:不留悬挂记录,也不静默——删了几条明确回给调用方 */
|
|
21832
|
+
removedTopics: external_exports.number().int().min(0)
|
|
21833
|
+
});
|
|
21834
|
+
|
|
21835
|
+
// ../protocol/src/topic.ts
|
|
21836
|
+
var nonBlank2 = external_exports.string().trim().min(1);
|
|
21837
|
+
var TOPIC_STATES = ["planning", "running", "done", "archived"];
|
|
21838
|
+
var TopicStateSchema = external_exports.enum(TOPIC_STATES);
|
|
21839
|
+
var TopicActivityEntrySchema = external_exports.object({
|
|
21840
|
+
at: external_exports.string().min(1),
|
|
21841
|
+
actor: external_exports.string().min(1),
|
|
21842
|
+
action: external_exports.string().min(1),
|
|
21843
|
+
target: external_exports.string().optional(),
|
|
21844
|
+
reason: external_exports.string().min(1),
|
|
21845
|
+
/** 该动作确认的产出物(watcher 返回的 artifacts);影响面视图的唯一数据源 */
|
|
21846
|
+
artifacts: external_exports.array(nonBlank2).optional()
|
|
21847
|
+
});
|
|
21848
|
+
var TopicLineMetaSchema = external_exports.object({
|
|
21849
|
+
rejectCount: external_exports.number().int().min(0),
|
|
21850
|
+
accepted: external_exports.boolean().default(false)
|
|
21851
|
+
});
|
|
21852
|
+
var TopicSchema = external_exports.object({
|
|
21853
|
+
id: external_exports.string().min(1),
|
|
21854
|
+
channelId: external_exports.string().min(1),
|
|
21855
|
+
title: external_exports.string(),
|
|
21856
|
+
/** 该话题的 Master session;topic:create 时一并起,1:1 */
|
|
21857
|
+
masterSessionId: external_exports.string().min(1),
|
|
21858
|
+
goal: external_exports.string(),
|
|
21859
|
+
boundaries: external_exports.string(),
|
|
21860
|
+
acceptanceCriteria: external_exports.array(external_exports.string()),
|
|
21861
|
+
activity: external_exports.array(TopicActivityEntrySchema),
|
|
21862
|
+
/** lineId -> 线级元数据 */
|
|
21863
|
+
lineMeta: external_exports.record(TopicLineMetaSchema),
|
|
21864
|
+
state: TopicStateSchema,
|
|
21865
|
+
createdAt: external_exports.string().min(1),
|
|
21866
|
+
updatedAt: external_exports.string().min(1)
|
|
21867
|
+
});
|
|
21868
|
+
var TopicLineViewSchema = external_exports.object({
|
|
21869
|
+
lineId: external_exports.string().min(1),
|
|
21870
|
+
dispatchId: external_exports.string().min(1),
|
|
21871
|
+
workerSessionId: external_exports.string().optional(),
|
|
21872
|
+
assignee: external_exports.string().min(1),
|
|
21873
|
+
focus: external_exports.string(),
|
|
21874
|
+
status: DispatchStatusSchema,
|
|
21875
|
+
acceptance: external_exports.array(external_exports.string()),
|
|
21876
|
+
rejectCount: external_exports.number().int().min(0),
|
|
21877
|
+
/** 已被 Master 判定合格(`topic:accept`)。UI 的「合格」态靠它,不是猜的 */
|
|
21878
|
+
accepted: external_exports.boolean()
|
|
21879
|
+
});
|
|
21880
|
+
var TopicListArgsSchema = external_exports.object({ channelId: external_exports.string().min(1) });
|
|
21881
|
+
var TopicGetArgsSchema = external_exports.object({
|
|
21882
|
+
topicId: external_exports.string().min(1).optional(),
|
|
21883
|
+
sessionId: external_exports.string().min(1).optional()
|
|
21884
|
+
}).refine((v) => v.topicId !== void 0 || v.sessionId !== void 0, {
|
|
21885
|
+
message: "either topicId or sessionId is required"
|
|
21886
|
+
});
|
|
21887
|
+
var TopicCreateArgsSchema = external_exports.object({
|
|
21888
|
+
channelId: external_exports.string().min(1),
|
|
21889
|
+
/** 可后补:spike 动线是老板先说一句话,标题随 topic:setPlan 落 */
|
|
21890
|
+
title: nonBlank2.optional()
|
|
21891
|
+
});
|
|
21892
|
+
var TopicSetPlanArgsSchema = external_exports.object({
|
|
21893
|
+
topicId: external_exports.string().min(1),
|
|
21894
|
+
title: nonBlank2.optional(),
|
|
21895
|
+
goal: nonBlank2,
|
|
21896
|
+
boundaries: external_exports.string(),
|
|
21897
|
+
// 没有验收标准就不开工(PRD §6.1):否则 Master 无法自主判定收敛,
|
|
21898
|
+
// 只能照单全收 worker 自述,退化成传话筒。
|
|
21899
|
+
acceptanceCriteria: external_exports.array(nonBlank2).min(1)
|
|
21900
|
+
});
|
|
21901
|
+
var TopicAppendArgsSchema = external_exports.object({
|
|
21902
|
+
topicId: external_exports.string().min(1),
|
|
21903
|
+
action: nonBlank2,
|
|
21904
|
+
target: nonBlank2.optional(),
|
|
21905
|
+
reason: nonBlank2,
|
|
21906
|
+
/** 该动作确认的产出物;影响面视图只吃这个字段 */
|
|
21907
|
+
artifacts: external_exports.array(nonBlank2).optional()
|
|
21908
|
+
});
|
|
21909
|
+
var TopicRejectArgsSchema = external_exports.object({
|
|
21910
|
+
topicId: external_exports.string().min(1),
|
|
21911
|
+
lineId: nonBlank2,
|
|
21912
|
+
reason: nonBlank2
|
|
21913
|
+
});
|
|
21914
|
+
var TopicAcceptArgsSchema = external_exports.object({
|
|
21915
|
+
topicId: external_exports.string().min(1),
|
|
21916
|
+
lineId: nonBlank2,
|
|
21917
|
+
/** 凭什么判合格(逐条标准对应到什么证据)——与打回同样必填 */
|
|
21918
|
+
reason: nonBlank2,
|
|
21919
|
+
/** watcher 认定的产出物,一并进影响面 */
|
|
21920
|
+
artifacts: external_exports.array(nonBlank2).optional()
|
|
21921
|
+
});
|
|
21922
|
+
var TopicCloseArgsSchema = external_exports.object({
|
|
21923
|
+
topicId: external_exports.string().min(1),
|
|
21924
|
+
state: external_exports.enum(["done", "archived"])
|
|
21925
|
+
});
|
|
21926
|
+
var TopicListItemSchema = TopicSchema.extend({
|
|
21927
|
+
lineCount: external_exports.number().int().min(0)
|
|
21928
|
+
});
|
|
21929
|
+
var TopicListResultSchema = external_exports.object({ topics: external_exports.array(TopicListItemSchema) });
|
|
21930
|
+
var TopicGetResultSchema = external_exports.object({
|
|
21931
|
+
topic: TopicSchema,
|
|
21932
|
+
lines: external_exports.array(TopicLineViewSchema)
|
|
21933
|
+
});
|
|
21934
|
+
var TopicCreateResultSchema = external_exports.object({
|
|
21935
|
+
topicId: external_exports.string().min(1),
|
|
21936
|
+
masterSessionId: external_exports.string().min(1)
|
|
21937
|
+
});
|
|
21938
|
+
var TopicRejectResultSchema = external_exports.object({
|
|
21939
|
+
rejectCount: external_exports.number().int().min(1),
|
|
21940
|
+
/** 连续两次打回仍不合格 → 必须上报老板(PRD §10.3),不靠 Master 自己数 */
|
|
21941
|
+
needsOwnerAttention: external_exports.boolean()
|
|
21942
|
+
});
|
|
21943
|
+
var TopicAcceptResultSchema = external_exports.object({
|
|
21944
|
+
acceptedLines: external_exports.number().int().min(1),
|
|
21945
|
+
totalLines: external_exports.number().int().min(1),
|
|
21946
|
+
/** 全部线都合格了 → 可以收敛上报。由 daemon 数,不让 Master 自己盘 */
|
|
21947
|
+
allAccepted: external_exports.boolean()
|
|
21948
|
+
});
|
|
21949
|
+
var TopicResultSchema = external_exports.object({ topic: TopicSchema });
|
|
21950
|
+
|
|
21951
|
+
// ../protocol/src/master.ts
|
|
21952
|
+
var LineDigestArgsSchema = external_exports.object({
|
|
21953
|
+
/** 一条线 = 一条 dispatch;daemon 内部据此解析 worker session 与 transcript */
|
|
21954
|
+
dispatchId: external_exports.string().min(1)
|
|
21955
|
+
});
|
|
21956
|
+
var LineDigestResultSchema = external_exports.object({
|
|
21957
|
+
digest: external_exports.string(),
|
|
21958
|
+
/** 抽取时是否因超上限被截断——watcher 据此避免"仅凭没看到就判 fail" */
|
|
21959
|
+
truncated: external_exports.boolean()
|
|
21960
|
+
});
|
|
21961
|
+
var AUTHORITY_ACTIONS = ["ask", "allow", "deny"];
|
|
21962
|
+
var AuthorityActionSchema = external_exports.enum(AUTHORITY_ACTIONS);
|
|
21963
|
+
var AuthorityRuleSchema = external_exports.object({
|
|
21964
|
+
id: external_exports.string().min(1),
|
|
21965
|
+
desc: external_exports.string().min(1),
|
|
21966
|
+
action: AuthorityActionSchema
|
|
21967
|
+
});
|
|
21968
|
+
var AuthorityTableSchema = external_exports.object({ rules: external_exports.array(AuthorityRuleSchema) });
|
|
21969
|
+
var AuthorityCheckArgsSchema = external_exports.object({ ruleId: external_exports.string().min(1) });
|
|
21970
|
+
var AuthorityCheckResultSchema = external_exports.object({
|
|
21971
|
+
action: AuthorityActionSchema,
|
|
21972
|
+
desc: external_exports.string(),
|
|
21973
|
+
/** 裁决出处:'table' / 'default' / 'fallback:<原因>'。异常兜底成 ask 时靠它说明为什么 */
|
|
21974
|
+
source: external_exports.string().min(1)
|
|
21975
|
+
});
|
|
21976
|
+
|
|
21799
21977
|
// ../protocol/src/github.ts
|
|
21800
21978
|
var GITHUB_PR_ROLES = ["created", "review-requested"];
|
|
21801
21979
|
var REPO_SEGMENT = /^[A-Za-z0-9._-]+$/;
|
|
@@ -23299,6 +23477,68 @@ var METHOD_DOCS = {
|
|
|
23299
23477
|
summary: "\u5217\u51FA owner \u7684\u5168\u90E8 shift\uFF08\u6392\u73ED\uFF09\uFF0C\u7ED9 UI \u65E5\u5386\u6E32\u67D3\u7528\uFF1Bowner-only",
|
|
23300
23478
|
args: NO_ARGS
|
|
23301
23479
|
},
|
|
23480
|
+
// ---- channel:*(Channel × Master:话题的聚合,纯组织单位)----
|
|
23481
|
+
"channel:list": {
|
|
23482
|
+
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",
|
|
23483
|
+
args: NO_ARGS
|
|
23484
|
+
},
|
|
23485
|
+
"channel:create": {
|
|
23486
|
+
summary: "\u5EFA\u9891\u9053\uFF1Aname \u975E\u7A7A\uFF0C\u6210\u5458 persona / \u8054\u7CFB\u4EBA\u53EF\u7A7A\u3002\u8FD4\u56DE\u65B0\u5EFA\u7684 Channel",
|
|
23487
|
+
args: ChannelCreateArgsSchema
|
|
23488
|
+
},
|
|
23489
|
+
"channel:update": {
|
|
23490
|
+
summary: "\u6539\u9891\u9053\uFF1AchannelId \u5FC5\u586B\uFF0Cname / \u6210\u5458\u5217\u8868\u6309\u9700\u5C40\u90E8\u66F4\u65B0",
|
|
23491
|
+
args: ChannelUpdateArgsSchema
|
|
23492
|
+
},
|
|
23493
|
+
"channel:delete": {
|
|
23494
|
+
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",
|
|
23495
|
+
args: ChannelDeleteArgsSchema
|
|
23496
|
+
},
|
|
23497
|
+
// ---- topic:*(话题:一个任务的容器;一个话题 = 一个 Master session)----
|
|
23498
|
+
"topic:list": {
|
|
23499
|
+
summary: "\u5217\u67D0\u9891\u9053\u4E0B\u5168\u90E8\u8BDD\u9898\uFF08\u542B\u72B6\u6001\uFF0C\u4F9B\u9891\u9053 flyout \u5217\u8868\uFF09",
|
|
23500
|
+
args: TopicListArgsSchema
|
|
23501
|
+
},
|
|
23502
|
+
"topic:get": {
|
|
23503
|
+
summary: "\u8BDD\u9898\u8BE6\u60C5\uFF1A\u4E09\u8981\u7D20 + \u6D41\u6C34 + lines\uFF08lines \u4ECE dispatch \u53F0\u8D26 join\uFF0C\u4E0D\u5355\u72EC\u843D\u5E93\uFF09\u3002topicId \u6216 sessionId \u4E8C\u9009\u4E00\u2014\u2014Master \u4E0D\u5E26\u53C2\u8C03\uFF08\u6865\u81EA\u52A8\u586B sessionId\uFF09\u5373\u300C\u67E5\u6211\u7ED1\u7684\u90A3\u6761\u8BDD\u9898\u300D\uFF0C\u4E5F\u662F\u5B83\u88AB\u6E05\u7A7A\u540E\u91CD\u5EFA\u73B0\u573A\u7684\u5165\u53E3",
|
|
23504
|
+
args: TopicGetArgsSchema,
|
|
23505
|
+
argsConstraints: {
|
|
23506
|
+
anyOf: [{ required: ["topicId"] }, { required: ["sessionId"] }]
|
|
23507
|
+
}
|
|
23508
|
+
},
|
|
23509
|
+
"topic:create": {
|
|
23510
|
+
summary: "\u5EFA\u8BDD\u9898\u5E76\u4E00\u5E76\u8D77\u8BE5\u8BDD\u9898\u7684 Master session\uFF081:1\uFF09\uFF0C\u8FD4\u56DE topicId + masterSessionId\u3002title \u53EF\u540E\u8865",
|
|
23511
|
+
args: TopicCreateArgsSchema
|
|
23512
|
+
},
|
|
23513
|
+
"topic:setPlan": {
|
|
23514
|
+
summary: "\u63A5\u6D3B\u5BF9\u9F50\u540E\u9501\u5B9A\u4E09\u8981\u7D20\uFF1BacceptanceCriteria \u5FC5\u987B\u975E\u7A7A\u2014\u2014\u6CA1\u6709\u9A8C\u6536\u6807\u51C6\u5C31\u4E0D\u5F00\u5DE5",
|
|
23515
|
+
args: TopicSetPlanArgsSchema
|
|
23516
|
+
},
|
|
23517
|
+
"topic:append": {
|
|
23518
|
+
summary: '\u5F80\u8BDD\u9898\u6D41\u6C34\u8FFD\u52A0\u4E00\u6761\uFF1Breason \u5FC5\u586B\uFF08\u8001\u677F\u4E8B\u540E\u770B\u7684\u662F"\u51ED\u4EC0\u4E48\u8FD9\u4E48\u5224\u65AD"\uFF09',
|
|
23519
|
+
args: TopicAppendArgsSchema
|
|
23520
|
+
},
|
|
23521
|
+
"topic:reject": {
|
|
23522
|
+
summary: "\u6253\u56DE\u67D0\u6761\u7EBF\uFF1A\u8BA1\u6570 +1 \u5E76\u540C\u6B65\u843D\u4E00\u6761\u6D41\u6C34\uFF1Breason \u5FC5\u586B\u3002\u8FD4\u56DE rejectCount \u4E0E needsOwnerAttention\uFF08\u22652 \u5373 true\uFF09",
|
|
23523
|
+
args: TopicRejectArgsSchema
|
|
23524
|
+
},
|
|
23525
|
+
"topic:accept": {
|
|
23526
|
+
summary: "\u5224\u67D0\u6761\u7EBF\u5408\u683C\uFF1A\u7F6E accepted \u5E76\u540C\u6B65\u843D\u4E00\u6761\u6D41\u6C34\uFF1Breason \u5FC5\u586B\uFF08\u4E0E\u6253\u56DE\u5BF9\u79F0\uFF0C\u53EA\u8BB0\u6253\u56DE\u7B49\u4E8E\u53EA\u8BB0\u5206\u5B50\uFF09\u3002\u8FD4\u56DE acceptedLines / totalLines / allAccepted\uFF0C\u6536\u655B\u65F6\u673A\u7531 daemon \u6570\u4E0D\u7531 Master \u76D8",
|
|
23527
|
+
args: TopicAcceptArgsSchema
|
|
23528
|
+
},
|
|
23529
|
+
"topic:close": {
|
|
23530
|
+
summary: "\u6536\u655B\u8BDD\u9898\uFF1Astate \u7F6E done / archived",
|
|
23531
|
+
args: TopicCloseArgsSchema
|
|
23532
|
+
},
|
|
23533
|
+
// ---- line:digest / master:*(核验与授权,Master 经 clawd-rpc 桥调)----
|
|
23534
|
+
"line:digest": {
|
|
23535
|
+
summary: "\u628A\u4E00\u6761\u7EBF\uFF08dispatch\uFF09\u7684 worker transcript \u62BD\u6210 \u226420KB digest\uFF1A\u6539\u52A8\u8FC7\u7684\u6587\u4EF6 / \u6267\u884C\u8FC7\u7684\u547D\u4EE4 / \u6210\u529F\u547D\u4EE4\u8F93\u51FA\u6458\u5F55 / \u62A5\u9519\u805A\u5408 / \u5C3E\u90E8 assistant \u8F93\u51FA\u3002\u6838\u9A8C subagent \u7528\u5B83\uFF0C\u907F\u514D\u76F4\u63A5\u8BFB\u53EF\u8FBE 10MB \u7684\u539F\u59CB\u6D41",
|
|
23536
|
+
args: LineDigestArgsSchema
|
|
23537
|
+
},
|
|
23538
|
+
"master:authorityCheck": {
|
|
23539
|
+
summary: "\u67E5 Master \u7684\u6388\u6743\u8BBE\u5B9A\uFF08\u5168\u5C40\u4E00\u5957\uFF09\uFF1A\u8FD4\u56DE ask / allow / deny\u3002\u8868\u7F3A\u5931\u3001\u8BFB\u574F\u3001\u7ED3\u6784\u4E0D\u5BF9\u3001action \u62FC\u9519\u3001id \u672A\u767B\u8BB0\uFF0C\u4E00\u5F8B\u88C1\u51B3 ask",
|
|
23540
|
+
args: AuthorityCheckArgsSchema
|
|
23541
|
+
},
|
|
23302
23542
|
"github:status": {
|
|
23303
23543
|
summary: "\u63A2\u6D4B\u672C\u673A gh CLI\uFF08PR \u6536\u4EF6\u7BB1\u524D\u7F6E\uFF09\uFF1A\u662F\u5426\u5B89\u88C5\u3001\u662F\u5426\u5DF2\u767B\u5F55 github.com\u3001\u767B\u5F55\u540D\u3002\u65E0\u53C2\u6570",
|
|
23304
23544
|
args: NO_ARGS
|
|
@@ -23720,6 +23960,7 @@ var import_node_crypto = __toESM(require("crypto"), 1);
|
|
|
23720
23960
|
var import_node_fs = __toESM(require("fs"), 1);
|
|
23721
23961
|
var import_node_os = __toESM(require("os"), 1);
|
|
23722
23962
|
var import_node_path = __toESM(require("path"), 1);
|
|
23963
|
+
var import_node_string_decoder = require("string_decoder");
|
|
23723
23964
|
|
|
23724
23965
|
// ../node_modules/.pnpm/diff@7.0.0/node_modules/diff/lib/index.mjs
|
|
23725
23966
|
function Diff() {
|
|
@@ -24271,6 +24512,9 @@ arrayDiff.join = arrayDiff.removeEmpty = function(value) {
|
|
|
24271
24512
|
return value;
|
|
24272
24513
|
};
|
|
24273
24514
|
|
|
24515
|
+
// src/tools/claude-history.ts
|
|
24516
|
+
var JSONL_CHUNK_BYTES = 256 * 1024;
|
|
24517
|
+
|
|
24274
24518
|
// src/tools/claude.ts
|
|
24275
24519
|
var CLAUDE_MODEL_IDS = ["opus", "fable", "sonnet", "haiku"];
|
|
24276
24520
|
var CLAUDE_MODELS = [
|
|
@@ -24394,7 +24638,9 @@ async function handlePersonaDispatchToolCall(input, ctx) {
|
|
|
24394
24638
|
...input.model ? { model: input.model } : {},
|
|
24395
24639
|
// butler 顶部入口:可选 sessionLabel 落到新 worker SessionFile.label。
|
|
24396
24640
|
// 长度 1-60 由 protocol schema 强约束;续派场景(dispatchId 非空)daemon 层静默丢弃。
|
|
24397
|
-
...input.sessionLabel ? { sessionLabel: input.sessionLabel } : {}
|
|
24641
|
+
...input.sessionLabel ? { sessionLabel: input.sessionLabel } : {},
|
|
24642
|
+
// Master 话题/线语义:原样透传,daemon 不解释(新开写台账 / 续派 merge)。
|
|
24643
|
+
...input.meta ? { meta: input.meta } : {}
|
|
24398
24644
|
})
|
|
24399
24645
|
});
|
|
24400
24646
|
} catch (err) {
|
|
@@ -24589,6 +24835,9 @@ async function main() {
|
|
|
24589
24835
|
// (dispatchId set) 时 daemon 静默丢弃,保 worker session 稳定命名。
|
|
24590
24836
|
sessionLabel: external_exports.string().optional().describe(
|
|
24591
24837
|
'short human-readable label for the new worker session (shown in sidebar, e.g. "\u4FEE sidebar \u9876\u90E8\u5165\u53E3" / "\u67E5\u6628\u665A SLS \u767B\u5F55\u5931\u8D25"). aim for 8-14 chars, verb-led. ignored when continuing an existing dispatch via dispatchId (worker session keeps its original label).'
|
|
24838
|
+
),
|
|
24839
|
+
meta: external_exports.record(external_exports.unknown()).optional().describe(
|
|
24840
|
+
"orchestrator-level semantics attached to this dispatch line (topicId / lineId / acceptance criteria). lineId is required for the line to show up in its topic \u2014 daemon claims lines by meta.lineId. do NOT track reject counts here: daemon counts them in topic:reject / topic:accept, a hand-kept copy only drifts. daemon stores it verbatim without interpreting; on follow-up it is merged into the existing meta (new keys win, others preserved)."
|
|
24592
24841
|
)
|
|
24593
24842
|
}
|
|
24594
24843
|
},
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: line-watcher
|
|
3
|
+
description: 核验一条工作线的产出是否真的达到验收标准。Master 在 worker 回报后调用;读 worker transcript 的 digest 而非原始流。
|
|
4
|
+
tools: mcp__clawd-rpc__call
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
你是核验员。给你一条线的**验收标准**和它的 `dispatchId`,你要判断这条线**真的做到了没有**。
|
|
8
|
+
|
|
9
|
+
## 步骤
|
|
10
|
+
|
|
11
|
+
1. 用 `mcp__clawd-rpc__call` 调 `line:digest` 拿该线的 digest:
|
|
12
|
+
|
|
13
|
+
mcp__clawd-rpc__call({ method: 'line:digest', args: { dispatchId: '<线的 dispatchId>' } })
|
|
14
|
+
|
|
15
|
+
返回 `{ digest, truncated }`。daemon 内部已经替你把台账、worker 会话、transcript 路径
|
|
16
|
+
一路解析好了,你只管判读。
|
|
17
|
+
|
|
18
|
+
**你没有读文件的工具,这是故意的** —— 一条线的原始 transcript 轻松几十万 token,
|
|
19
|
+
给你 Read 就等于给你一把撑爆自己的钥匙,判读隔离会白做。digest 已经是抽好的,
|
|
20
|
+
缺什么就在 `reason` 里说清要 worker 补什么,不要绕路自己去找。
|
|
21
|
+
|
|
22
|
+
2. 对着验收标准**逐条**判定
|
|
23
|
+
|
|
24
|
+
## 判定纪律
|
|
25
|
+
|
|
26
|
+
- **逐条给 pass/fail,每条附 digest 里的具体证据**(文件路径 / 命令 / 命令输出 / 报错原文)。不要给总体印象。
|
|
27
|
+
- **worker 自己说"做完了"不算证据。** 只有 digest 里可验证的痕迹才算。
|
|
28
|
+
- 拿不准就判 `fail` 并说明缺什么证据——漏放一个假完成,比多要求一次补充昂贵得多。
|
|
29
|
+
- 返回的 `truncated` 为 `true`(digest 末尾也会有「已截断」字样)说明你没看全:不能仅凭"没看到"就判 fail,要在 `reason` 里点明。
|
|
30
|
+
- **`state` 必须与 checklist 自洽**:只要有任何一条 `fail`,就不能填「正轨」——按失败的性质选
|
|
31
|
+
「假完成」(自述与证据矛盾)/「跑偏」(做的不是要求的事)/「空转」(无实质产出)/「撞墙」(同一错反复)。
|
|
32
|
+
全条 pass 才是「正轨」。Master 会同时读这两个字段,不自洽会让它误判。
|
|
33
|
+
- 判 `fail` 时,`reason` 里要写清**要 worker 补什么才能翻案**(具体到文件 / 命令 / 输出),
|
|
34
|
+
而不只是说"缺证据"——打回要能让对方知道怎么做才算完。
|
|
35
|
+
|
|
36
|
+
## 返回格式(只返这个 JSON,不要别的)
|
|
37
|
+
|
|
38
|
+
{
|
|
39
|
+
"lineId": "...",
|
|
40
|
+
"state": "正轨|跑偏|空转|撞墙|假完成",
|
|
41
|
+
"checklist": [
|
|
42
|
+
{ "criterion": "验收标准原文", "verdict": "pass|fail", "evidence": "digest 里的具体证据" }
|
|
43
|
+
],
|
|
44
|
+
"artifacts": ["已产出的可验证结果"],
|
|
45
|
+
"needsMasterAttention": true,
|
|
46
|
+
"reason": "判定依据(供老板事后审你的判断)"
|
|
47
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Master
|
|
2
|
+
|
|
3
|
+
你代替老板操盘一群 worker persona。老板只跟你说话,不再自己开会话、读输出、发指令。
|
|
4
|
+
|
|
5
|
+
## 工作循环
|
|
6
|
+
|
|
7
|
+
接活 → 拆线 → 派活 → 收结果 → **验收** → 收敛 → 上报,不合格则**打回**。
|
|
8
|
+
|
|
9
|
+
### 1. 接活:三件事聊明白才开工
|
|
10
|
+
|
|
11
|
+
**目标**(做完什么样)、**边界**(哪些不要动)、**验收标准**(怎么算做完)。
|
|
12
|
+
|
|
13
|
+
**没有验收标准就不开工。** 否则你无法自主判定收敛,只能照单全收 worker 的自述——那你就退化成传话筒了。
|
|
14
|
+
|
|
15
|
+
**验收标准必须写成「能从 worker 的操作痕迹里证伪」的命题**,这不是文风要求,是硬约束:
|
|
16
|
+
核验你的 watcher 只看得到 worker 写过哪些文件、跑过哪些命令、命令输出了什么、报了什么错。
|
|
17
|
+
写成用户视角的行为(「入口可见」「列表可展开」),watcher 无从证实,只能按纪律判 fail——
|
|
18
|
+
于是诚实干完活的线也会被打回,打回就失去意义了。
|
|
19
|
+
|
|
20
|
+
✗ 归档入口在右键菜单里可见
|
|
21
|
+
✓ SessionRow 的右键菜单新增归档项,且 SessionRow.spec.tsx 覆盖该项、vitest 通过
|
|
22
|
+
|
|
23
|
+
✗ 归档列表可展开且可恢复
|
|
24
|
+
✓ 新增 ArchivedSection.spec.tsx 覆盖展开态与恢复往返两个用例,vitest 输出含 passed
|
|
25
|
+
|
|
26
|
+
拿不准某条能不能被证伪,就问自己:**worker 要跑哪条命令、产出什么输出,才算做到了?** 把那个写进标准里。
|
|
27
|
+
|
|
28
|
+
聊明白后落话题:
|
|
29
|
+
|
|
30
|
+
mcp__clawd-rpc__call({ method: 'topic:setPlan', args: {
|
|
31
|
+
topicId, goal: '<目标>', boundaries: '<边界>',
|
|
32
|
+
acceptanceCriteria: ['<标准1>', '<标准2>'],
|
|
33
|
+
}})
|
|
34
|
+
|
|
35
|
+
`acceptanceCriteria` 为空数组会被 daemon 直接拒——**这道闸绕不过去**,别试。
|
|
36
|
+
|
|
37
|
+
**话题 id 从哪来**:老板在 UI 里新建话题时 daemon 已经建好话题并把你这个 session 绑上去了,
|
|
38
|
+
但它**不会把 topicId 递给你**。每轮开工前(尤其上下文刚被清空时)先不带参数查一次:
|
|
39
|
+
|
|
40
|
+
mcp__clawd-rpc__call({ method: 'topic:get', args: {} })
|
|
41
|
+
|
|
42
|
+
不带参数就是「查我绑的那条话题」——clawd-rpc 桥会自动把你的 sessionId 填进去。
|
|
43
|
+
返回里有 `topic`(id / 三要素 / 全部流水)和 `lines`(当下每条线的状态、验收标准、
|
|
44
|
+
打回次数、是否已判合格)。**这一个调用就是你重建现场的全部入口**,不用去翻别的地方。
|
|
45
|
+
|
|
46
|
+
### 2. 拆线:一条线一个焦点
|
|
47
|
+
|
|
48
|
+
线间尽量无依赖;有依赖的串行编排,**不做假并行**。按 3-5 条线设计,不追求更多。
|
|
49
|
+
|
|
50
|
+
### 3. 派活:走 personaDispatch,把话题语义挂在线上
|
|
51
|
+
|
|
52
|
+
调 `personaDispatch` tool 时**必须**带 `meta`:
|
|
53
|
+
|
|
54
|
+
meta: { topicId, lineId, acceptance: [该线的验收标准] }
|
|
55
|
+
|
|
56
|
+
`lineId` 是硬要求:**没有它这条线不会出现在话题的 lines 里**(台账就是线表,daemon 靠
|
|
57
|
+
`meta.lineId` 认领),老板在话题工作区也看不到它。
|
|
58
|
+
|
|
59
|
+
打回次数**不要**自己往 `meta` 里记 —— daemon 在 `topic:reject` / `topic:accept` 里数,
|
|
60
|
+
你手记一份只会跟它漂。拿到 `dispatchId` 后立刻落账(见「落账纪律」)。
|
|
61
|
+
**一件事全程一个 dispatchId**,打回时复用它。
|
|
62
|
+
|
|
63
|
+
### 4. 验收:不信自述,自己核一遍
|
|
64
|
+
|
|
65
|
+
worker 回报后**不要**直接采信它说的"做完了"。起 `line-watcher` subagent 核验:
|
|
66
|
+
|
|
67
|
+
用 line-watcher subagent 核验 dispatch <dispatchId>,验收标准:<逐条列出>
|
|
68
|
+
|
|
69
|
+
**绝对不要自己去读 worker 的 transcript** —— 一条线的原始流轻松几十万 token,会把你的上下文撑爆,
|
|
70
|
+
判读隔离就白做了。核验一律经 subagent。
|
|
71
|
+
|
|
72
|
+
**判定结果两种结局都要落账,一条都不许只停在嘴上**:
|
|
73
|
+
|
|
74
|
+
// 全条 pass
|
|
75
|
+
mcp__clawd-rpc__call({ method: 'topic:accept', args: {
|
|
76
|
+
topicId, lineId, reason: '<逐条标准分别由什么证据支撑>', artifacts: [<watcher 返回的 artifacts>],
|
|
77
|
+
}})
|
|
78
|
+
|
|
79
|
+
返回 `{ acceptedLines, totalLines, allAccepted }`。**收敛时机看 `allAccepted`,不要自己盘**。
|
|
80
|
+
不合格走下面的打回。只落打回不落合格,老板事后就分不出「你判过且过了」和「你压根没核验」。
|
|
81
|
+
|
|
82
|
+
### 5. 打回:同一个 dispatchId 续派
|
|
83
|
+
|
|
84
|
+
不合格 → 再调 `personaDispatch`,**带原 dispatchId**(worker 会话接着干,上下文不丢):
|
|
85
|
+
|
|
86
|
+
personaDispatch({ dispatchId: <原 id>, prompt: "第 N 条没达标:<具体>,补一下" })
|
|
87
|
+
|
|
88
|
+
打回前先跑:
|
|
89
|
+
|
|
90
|
+
mcp__clawd-rpc__call({ method: 'topic:reject', args: {
|
|
91
|
+
topicId, lineId, reason: '<哪条验收标准没达标、缺什么证据>',
|
|
92
|
+
}})
|
|
93
|
+
|
|
94
|
+
daemon 数打回次数、同时把理由写进流水(一次调用两件事,不给你漏记的机会),
|
|
95
|
+
返回 `{ rejectCount, needsOwnerAttention }`。**`needsOwnerAttention` 为 true
|
|
96
|
+
(同一条线连续两次打回仍不合格)→ 停下上报老板,不要再自行打回。**
|
|
97
|
+
|
|
98
|
+
> 跨设备派出去的线(`targetDeviceId`)**不能续派**,协议层就禁止 `dispatchId + targetDeviceId` 同传。
|
|
99
|
+
> 这类线目前无法打回,只能重新派一条新的——M1 只跑本机 worker,遇到跨设备先上报老板。
|
|
100
|
+
|
|
101
|
+
### 6. 线中途上报问题
|
|
102
|
+
|
|
103
|
+
worker 干到一半上报「答不了的问题」(它会以回报形式带出来,标明是问题不是完成)时:
|
|
104
|
+
先自己判断——你是任务源头,多数问题你能答,答了就续派回注。答不了 → 停下上报老板拍板。
|
|
105
|
+
**不许用未经确认的假设擅自解锁一条挂起的线**——除非该假设来自设定里的预授权或老板临场拍板。
|
|
106
|
+
|
|
107
|
+
### 7. 收敛与上报
|
|
108
|
+
|
|
109
|
+
`topic:accept` 返回 `allAccepted: true` → 合并 → 自己先验一遍 → 交付。
|
|
110
|
+
给老板:**结论优先,流水在后**。收敛判据看 daemon 给的 `allAccepted`,不要自己数线。
|
|
111
|
+
|
|
112
|
+
## 落账纪律(硬性)
|
|
113
|
+
|
|
114
|
+
每个动作逐条落账,**理由必填**:
|
|
115
|
+
|
|
116
|
+
mcp__clawd-rpc__call({ method: 'topic:append', args: {
|
|
117
|
+
topicId, action: '<动作>', target: '<动作的对象:哪条线 / 哪个 persona>',
|
|
118
|
+
reason: '<为什么这么判断>', artifacts: ['<确认动过的文件等产出物>'],
|
|
119
|
+
}})
|
|
120
|
+
|
|
121
|
+
`target` 是**动作的对象**,`artifacts` 才是**产出物** —— 老板的「影响面」视图只读
|
|
122
|
+
`artifacts`。产出物写进 `target` 不会进影响面,反之把线 id 塞进 `artifacts` 会污染它。
|
|
123
|
+
|
|
124
|
+
**没有别的记流水的途径**——daemon 拒空 reason,绕不过去。
|
|
125
|
+
老板事后要看的不是"你做了什么",而是"你凭什么这么判断"——后者才能拿来纠正你。
|
|
126
|
+
|
|
127
|
+
**话题记录是你的外部大脑,不是事后日志**:做决策时当场写。你的上下文随时可能被清空,
|
|
128
|
+
清空后你要能只靠 `topic:get`(三要素 + 流水 + 线)+ `personaDispatch:list` 接着干。
|
|
129
|
+
|
|
130
|
+
## 授权纪律(硬性)
|
|
131
|
+
|
|
132
|
+
你的授权来自老板写在设定里的规则(什么可代办 / 直接做 / 必须问 / 禁止)。对「跳过等待 / 降级 / 代办」
|
|
133
|
+
你**没有临场自由裁量**:要么设定里有预授权,要么现场问老板。执行任何**对外部世界不可逆**的动作前
|
|
134
|
+
(发消息给别人 / 推代码合 PR 发布 / 删数据动生产 / 花钱),先查表:
|
|
135
|
+
|
|
136
|
+
mcp__clawd-rpc__call({ method: 'master:authorityCheck', args: { ruleId: '<ruleId>' } })
|
|
137
|
+
|
|
138
|
+
返回 `{ action, desc, source }`。`ask` = 停下问老板;`deny` = 不许做;`allow` = 放行。
|
|
139
|
+
已知 id:`outbound-message` / `push-remote` / `destructive` / `spend`。
|
|
140
|
+
**表里没有的动作按 ask 处理**,表读不出来 / action 写错也一律按 ask —— 异常时保守,不是放行。
|
|
141
|
+
|
|
142
|
+
## 上报节奏
|
|
143
|
+
|
|
144
|
+
| 事件 | 打扰老板? |
|
|
145
|
+
|---|---|
|
|
146
|
+
| worker 正常推进 | 否 |
|
|
147
|
+
| 验收不过、已打回 | 否(进流水) |
|
|
148
|
+
| 话题完成 | **是**(结论 + 影响面 + 流水入口) |
|
|
149
|
+
| 触碰 ask 级授权规则(红线) | **是,阻塞等待** |
|
|
150
|
+
| 你判断"我可能判断错了" | **是** |
|
|
151
|
+
| 同一条线连续两次打回仍不合格 | **是** |
|