@clawos-dev/clawd 0.2.255 → 0.2.256
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 +33 -12
- package/dist/dispatch/mcp-server.cjs +18 -2
- package/dist/share-md-viewer-error.html +1 -1
- package/dist/share-md-viewer.html +1 -1
- package/dist/share-ui/assets/{guest-BnunifuX.js → guest-hgeG05IO.js} +1 -1
- package/dist/share-ui/assets/{guest-53QJqRhe.css → guest-kK-Ir45s.css} +1 -1
- package/dist/share-ui/guest.html +2 -2
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -6238,7 +6238,13 @@ var init_dispatch = __esm({
|
|
|
6238
6238
|
// 合法值集与 claude adapter capabilities.models[].id 一致(见 daemon
|
|
6239
6239
|
// tools/claude.ts CLAUDE_MODEL_IDS);handler 层做二次校验,非法值 fail-fast。
|
|
6240
6240
|
// protocol 层保持 string 便于未来跨 tool 扩展(届时 union 收合法字面量)。
|
|
6241
|
-
model: external_exports.string().min(1).optional()
|
|
6241
|
+
model: external_exports.string().min(1).optional(),
|
|
6242
|
+
// 可选:给新 worker session 起 label(写入 SessionFile.label,sidebar 显示)。
|
|
6243
|
+
// 仅在**新开 dispatch**(dispatchId 缺席)时生效;续派(dispatchId 非空)
|
|
6244
|
+
// 时 daemon 层静默丢弃(避免半途改 label 造成 sidebar 抖动)。
|
|
6245
|
+
// 上限 60 字符——sidebar 显示 tolerance,卡在 dispatch 入口即可。
|
|
6246
|
+
// 协议层不硬拒 sessionLabel + dispatchId 同传,保留 forward-compat。
|
|
6247
|
+
sessionLabel: external_exports.string().min(1).max(60).optional()
|
|
6242
6248
|
}).refine((v2) => v2.targetPersona !== void 0 || v2.dispatchId !== void 0, {
|
|
6243
6249
|
message: "either targetPersona (new dispatch) or dispatchId (follow-up) is required"
|
|
6244
6250
|
}).refine((v2) => !(v2.dispatchId !== void 0 && v2.targetDeviceId !== void 0), {
|
|
@@ -41932,20 +41938,23 @@ var ATTACHMENT_SHARING_HINT = `## \u628A\u4EA7\u51FA\u6587\u4EF6\u5206\u4EAB\u7E
|
|
|
41932
41938
|
- \u53EA\u80FD\u5206\u4EAB\u4F60\u81EA\u5DF1\u5DE5\u4F5C\u76EE\u5F55\u5185\u7684\u6587\u4EF6\uFF0C\u8D8A\u754C\u4F1A\u88AB\u62D2\u3002
|
|
41933
41939
|
- \u88AB dispatch \u63A5\u5230\u4EFB\u52A1\u3001\u8981\u56DE\u4F20\u4EA7\u7269\u65F6\uFF1A\u628A\u7B7E\u540D URL \u5199\u8FDB \`personaDispatchComplete\` tool\uFF08\`clawd-dispatch\` MCP\uFF09\u7684 \`text\` \u91CC\uFF08\`filePaths\` \u53EA\u662F\u4F60\u672C\u673A\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u8DE8\u8BBE\u5907\u5BF9\u65B9\u6253\u4E0D\u5F00\uFF0CURL \u624D\u80FD\u6253\u5F00\uFF09\u3002`;
|
|
41934
41940
|
|
|
41941
|
+
// src/persona/no-ask-user-question-prompt.ts
|
|
41942
|
+
var NO_ASK_USER_QUESTION_HINT = `## \u9700\u8981\u8001\u677F\u62CD\u677F\u65F6\u600E\u4E48\u95EE
|
|
41943
|
+
|
|
41944
|
+
\u8981\u8001\u677F\u9009\u62E9 / \u786E\u8BA4 / \u62CD\u677F\u65F6\uFF0C\u76F4\u63A5\u6B63\u6587\u5199\u95EE\u9898 + \u5217 A/B/C \u9009\u9879\u3002\u4E0D\u8981\u8C03 AskUserQuestion tool\u3002`;
|
|
41945
|
+
|
|
41935
41946
|
// src/dispatch/system-prompt.ts
|
|
41936
41947
|
var DISPATCH_SYSTEM_PROMPT_HINT = `## \u59D4\u6D3E\u7ED9\u53E6\u4E00\u4E2A persona\uFF08dispatch\uFF09
|
|
41937
41948
|
|
|
41938
|
-
\u5F53\u7528\u6237\u6D88\u606F\u91CC\u542B \`@persona/<id>\`\uFF08\u5982 \`@persona/persona-app-builder\`\uFF09\u65F6\uFF0C**\u4F60\u5FC5\u987B**\u7ACB\u5373\u8C03 \`clawd-dispatch\` MCP
|
|
41949
|
+
\u5F53\u7528\u6237\u6D88\u606F\u91CC\u542B \`@persona/<id>\`\uFF08\u5982 \`@persona/persona-app-builder\`\uFF09\u65F6\uFF0C**\u4F60\u5FC5\u987B**\u7ACB\u5373\u8C03 \`clawd-dispatch\` MCP \u7684 \`personaDispatch\` tool \u59D4\u6D3E\uFF1A
|
|
41939
41950
|
|
|
41940
41951
|
- \`targetPersona = <id>\`\uFF08@ token \u91CC\u7684 persona id\uFF09
|
|
41941
41952
|
- \`prompt = \u53BB\u6389 @persona/<id> token \u7684\u7528\u6237\u539F\u6587\`
|
|
41942
41953
|
|
|
41943
|
-
|
|
41954
|
+
\u544A\u8BC9\u7528\u6237"\u4EFB\u52A1\u5DF2\u4EA4\u529E"\u5373\u53EF\u7ED3\u675F\u672C\u8F6E\u3002\u7ED3\u679C\u4F1A\u4F5C\u4E3A\u4E00\u6761\u65B0\u6D88\u606F\u81EA\u52A8\u6CE8\u5165\u56DE\u4F60\u7684 session\uFF0C\u5C4A\u65F6\u518D\u7EFC\u5408\u8F6C\u8FBE\u7ED9\u7528\u6237\u3002\u60F3\u67E5\u8FDB\u5C55\u65F6\uFF08\u7528\u6237\u95EE\u8D77\uFF09\u8C03\u540C\u4E00 MCP \u7684 \`personaDispatchList\`\u3002
|
|
41944
41955
|
|
|
41945
|
-
- **\u4E0D\u8981**\u5C1D\u8BD5\u81EA\u5DF1\u6267\u884C\uFF08\u4F60\u4E0D\u662F\u90A3\u4E2A persona\uFF09
|
|
41946
|
-
- **\u4E0D\u8981** in-place \u6A21\u4EFF\u5BF9\u65B9\u4EBA\u683C \u2014\u2014 dispatch \u662F\u771F\u5207\u5230\u53E6\u4E00\u4E2A\u72EC\u7ACB session
|
|
41956
|
+
- **\u4E0D\u8981**\u5C1D\u8BD5\u81EA\u5DF1\u6267\u884C\uFF08\u4F60\u4E0D\u662F\u90A3\u4E2A persona\uFF09\uFF0C\u4E5F\u4E0D\u8981 in-place \u6A21\u4EFF\u5BF9\u65B9\u4EBA\u683C \u2014\u2014 dispatch \u662F\u771F\u5207\u5230\u53E6\u4E00\u4E2A\u72EC\u7ACB session
|
|
41947
41957
|
- \u4E00\u53E5\u8BDD\u91CC\u591A\u4E2A \`@persona/<id>\` \u65F6\u9009\u7B2C\u4E00\u4E2A\uFF08tool \u4E00\u6B21\u53EA\u5904\u7406\u4E00\u4E2A target\uFF09
|
|
41948
|
-
- \u59D4\u6D3E\u5931\u8D25\uFF08tool_result.is_error=true\uFF09\u65F6\u5982\u5B9E\u544A\u8BC9\u7528\u6237\u539F\u56E0\uFF0C**\u4E0D\u8981\u91CD\u8BD5**
|
|
41949
41958
|
|
|
41950
41959
|
### \u7EED\u6D3E\uFF08\u540C\u4E00\u4EF6\u4E8B\u7684\u540E\u7EED\u6307\u4EE4\uFF09
|
|
41951
41960
|
|
|
@@ -41953,15 +41962,15 @@ tool \u4F1A**\u7ACB\u5373\u8FD4\u56DE** dispatchId\uFF08\u5F02\u6B65\u59D4\u6D3E
|
|
|
41953
41962
|
|
|
41954
41963
|
### \u8DE8\u8BBE\u5907\u59D4\u6D3E\uFF08remote persona\uFF09
|
|
41955
41964
|
|
|
41956
|
-
\u5F53 @ token \u5F62\u5982 \`@persona/<id>@<deviceId>\`\uFF08\u7B2C\u4E8C\u6BB5\u662F\u8054\u7CFB\u4EBA**\u8BBE\u5907\u7684 deviceId**\uFF0CUI \u9009\u8054\u7CFB\u4EBA\u65F6\u5DF2\u89E3\u6790\u597D\u586B\u5165\uFF09\u65F6\uFF0C\u662F\u628A\u4EFB\u52A1\u59D4\u6D3E\u7ED9\u90A3\u53F0\u8BBE\u5907\u4E0A\u7684 persona\u3002\u9664 targetPersona / prompt \u5916\u518D\u5E26\
|
|
41965
|
+
\u5F53 @ token \u5F62\u5982 \`@persona/<id>@<deviceId>\`\uFF08\u7B2C\u4E8C\u6BB5\u662F\u8054\u7CFB\u4EBA**\u8BBE\u5907\u7684 deviceId**\uFF0CUI \u9009\u8054\u7CFB\u4EBA\u65F6\u5DF2\u89E3\u6790\u597D\u586B\u5165\uFF09\u65F6\uFF0C\u662F\u628A\u4EFB\u52A1\u59D4\u6D3E\u7ED9\u90A3\u53F0\u8BBE\u5907\u4E0A\u7684 persona\u3002\u9664 targetPersona / prompt \u5916\u518D\u5E26\uFF1A
|
|
41957
41966
|
|
|
41958
41967
|
- \`targetDeviceId = <token \u7B2C\u4E8C\u6BB5\u7684 deviceId\uFF0C\u539F\u6837\u586B>\`
|
|
41959
41968
|
|
|
41960
|
-
deviceId \u76F4\u63A5\u53D6\u81EA token\uFF0C\u4E0D\u8981\u6539\u5199\u6216\u731C\u6D4B\u3002
|
|
41969
|
+
deviceId \u76F4\u63A5\u53D6\u81EA token\uFF0C\u4E0D\u8981\u6539\u5199\u6216\u731C\u6D4B\u3002
|
|
41961
41970
|
|
|
41962
41971
|
## \u88AB dispatch \u63A5\u5230\u4EFB\u52A1
|
|
41963
41972
|
|
|
41964
|
-
\u5982\u679C\u4F60\u7684 session \u7B2C\u4E00\u6761 user message \u662F\u4EE5 \`[Dispatched from owner \u2014 another persona session\u59D4\u6D3E\u7ED9\u4F60\u6267\u884C\u4EFB\u52A1]\` \u8D77\u5934\u7684 plain text \u4EFB\u52A1\u5305\uFF0C\u4F60\u662F\u88AB\u53E6\u4E00\u4E2A persona \u59D4\u6D3E\u6765\u5E72\u6D3B\u7684\
|
|
41973
|
+
\u5982\u679C\u4F60\u7684 session \u7B2C\u4E00\u6761 user message \u662F\u4EE5 \`[Dispatched from owner \u2014 another persona session\u59D4\u6D3E\u7ED9\u4F60\u6267\u884C\u4EFB\u52A1]\` \u8D77\u5934\u7684 plain text \u4EFB\u52A1\u5305\uFF0C\u4F60\u662F\u88AB\u53E6\u4E00\u4E2A persona \u59D4\u6D3E\u6765\u5E72\u6D3B\u7684\uFF1A
|
|
41965
41974
|
|
|
41966
41975
|
- \u4EFB\u52A1\u5728 \`Task:\` \u6BB5
|
|
41967
41976
|
- \u539F\u4F1A\u8BDD\u7684\u5BF9\u8BDD\u5386\u53F2\u5728 \`Source conversation\` \u6BB5\u7ED9\u7684 jsonl \u8DEF\u5F84\u4E0B\uFF1B\u6309\u9700 Read \u5B83\u4E86\u89E3\u4E0A\u4E0B\u6587\uFF08\u4E0D\u5FC5\u8BFB\u5B8C\uFF09
|
|
@@ -42126,6 +42135,9 @@ function buildSpawnContext(state, deps) {
|
|
|
42126
42135
|
if (daemonUrl) {
|
|
42127
42136
|
ctx.extraSystemPrompt = (ctx.extraSystemPrompt ? ctx.extraSystemPrompt + "\n\n" : "") + ATTACHMENT_SHARING_HINT;
|
|
42128
42137
|
}
|
|
42138
|
+
if (meta?.personaMode && (file.tool ?? "claude") === "claude") {
|
|
42139
|
+
ctx.extraSystemPrompt = (ctx.extraSystemPrompt ? ctx.extraSystemPrompt + "\n\n" : "") + NO_ASK_USER_QUESTION_HINT;
|
|
42140
|
+
}
|
|
42129
42141
|
if (meta?.extraSettings) {
|
|
42130
42142
|
ctx.extraSettings = meta.extraSettings;
|
|
42131
42143
|
}
|
|
@@ -44758,6 +44770,8 @@ var SessionManager = class {
|
|
|
44758
44770
|
} : {},
|
|
44759
44771
|
// T-20:dispatch model override 落盘(reducer spawn 路径读 SessionFile.model 生成 --model flag)
|
|
44760
44772
|
...args.model ? { model: args.model } : {},
|
|
44773
|
+
// butler 顶部入口:dispatch 传下来的 label 落盘,sidebar 显示(否则兜底 cwd-basename)
|
|
44774
|
+
...args.label ? { label: args.label } : {},
|
|
44761
44775
|
createdAt: now,
|
|
44762
44776
|
updatedAt: now
|
|
44763
44777
|
};
|
|
@@ -49415,7 +49429,10 @@ function buildPersonaDispatchHandlers(deps) {
|
|
|
49415
49429
|
guestDisplayName: ctx.principal.displayName,
|
|
49416
49430
|
// T-31: 把 A 的飞书 union_id 透传给 B(connectGuestContext 已把它挂在 principal.feishuUnionId)
|
|
49417
49431
|
...ctx.principal.feishuUnionId ? { guestFeishuUnionId: ctx.principal.feishuUnionId } : {},
|
|
49418
|
-
...args.model ? { model: args.model } : {}
|
|
49432
|
+
...args.model ? { model: args.model } : {},
|
|
49433
|
+
// butler 顶部入口:peer daemon 若在 forwardToPeer 里传了 sessionLabel(当前
|
|
49434
|
+
// 未接线,作 forward-compat 预留),这里也透给 spawnB
|
|
49435
|
+
...args.sessionLabel ? { label: args.sessionLabel } : {}
|
|
49419
49436
|
}).then(() => logger?.info("dispatch.spawnB.ok", { dispatchId: dispatchId2 })).catch((err) => {
|
|
49420
49437
|
const reason = err instanceof Error ? err.message : String(err);
|
|
49421
49438
|
logger?.warn("dispatch.spawnB.failed", { dispatchId: dispatchId2, reason });
|
|
@@ -49450,7 +49467,9 @@ function buildPersonaDispatchHandlers(deps) {
|
|
|
49450
49467
|
sourceSessionId,
|
|
49451
49468
|
targetPersona,
|
|
49452
49469
|
prompt: args.prompt,
|
|
49453
|
-
...args.model ? { model: args.model } : {}
|
|
49470
|
+
...args.model ? { model: args.model } : {},
|
|
49471
|
+
// butler 顶部入口(spec 2026-07-27):sessionLabel 落到 SessionFile.label 让 sidebar 显示
|
|
49472
|
+
...args.sessionLabel ? { label: args.sessionLabel } : {}
|
|
49454
49473
|
}).then(() => {
|
|
49455
49474
|
logger?.info("dispatch.spawnB.ok", { dispatchId });
|
|
49456
49475
|
}).catch((err) => {
|
|
@@ -59773,7 +59792,9 @@ async function startDaemon(config) {
|
|
|
59773
59792
|
// T-31: 把 A 的飞书 union_id stamp 到 B SessionFile,供 cc prompt 身份卡 union_id 行
|
|
59774
59793
|
guestFeishuUnionId: args.guestFeishuUnionId,
|
|
59775
59794
|
// T-20: 可选 model override 透到 SessionFile.model
|
|
59776
|
-
...args.model ? { model: args.model } : {}
|
|
59795
|
+
...args.model ? { model: args.model } : {},
|
|
59796
|
+
// butler 顶部入口(spec 2026-07-27):可选 label 透到 SessionFile.label(sidebar 显示)
|
|
59797
|
+
...args.label ? { label: args.label } : {}
|
|
59777
59798
|
});
|
|
59778
59799
|
},
|
|
59779
59800
|
// A 角色:从 ContactStore 取 peer 可达 URL + connect token,转发到对端 daemon /rpc。
|
|
@@ -22734,7 +22734,13 @@ var DispatchRunArgsSchema = external_exports.object({
|
|
|
22734
22734
|
// 合法值集与 claude adapter capabilities.models[].id 一致(见 daemon
|
|
22735
22735
|
// tools/claude.ts CLAUDE_MODEL_IDS);handler 层做二次校验,非法值 fail-fast。
|
|
22736
22736
|
// protocol 层保持 string 便于未来跨 tool 扩展(届时 union 收合法字面量)。
|
|
22737
|
-
model: external_exports.string().min(1).optional()
|
|
22737
|
+
model: external_exports.string().min(1).optional(),
|
|
22738
|
+
// 可选:给新 worker session 起 label(写入 SessionFile.label,sidebar 显示)。
|
|
22739
|
+
// 仅在**新开 dispatch**(dispatchId 缺席)时生效;续派(dispatchId 非空)
|
|
22740
|
+
// 时 daemon 层静默丢弃(避免半途改 label 造成 sidebar 抖动)。
|
|
22741
|
+
// 上限 60 字符——sidebar 显示 tolerance,卡在 dispatch 入口即可。
|
|
22742
|
+
// 协议层不硬拒 sessionLabel + dispatchId 同传,保留 forward-compat。
|
|
22743
|
+
sessionLabel: external_exports.string().min(1).max(60).optional()
|
|
22738
22744
|
}).refine((v) => v.targetPersona !== void 0 || v.dispatchId !== void 0, {
|
|
22739
22745
|
message: "either targetPersona (new dispatch) or dispatchId (follow-up) is required"
|
|
22740
22746
|
}).refine((v) => !(v.dispatchId !== void 0 && v.targetDeviceId !== void 0), {
|
|
@@ -23557,7 +23563,10 @@ async function handlePersonaDispatchToolCall(input, ctx) {
|
|
|
23557
23563
|
...input.targetDeviceId ? { targetDeviceId: input.targetDeviceId } : {},
|
|
23558
23564
|
// T-20: 可选 override B session 使用的 claude 模型;MCP tool 层已 enum 校验,
|
|
23559
23565
|
// daemon handler 层还会再校验一次(fail-fast)。
|
|
23560
|
-
...input.model ? { model: input.model } : {}
|
|
23566
|
+
...input.model ? { model: input.model } : {},
|
|
23567
|
+
// butler 顶部入口:可选 sessionLabel 落到新 worker SessionFile.label。
|
|
23568
|
+
// 长度 1-60 由 protocol schema 强约束;续派场景(dispatchId 非空)daemon 层静默丢弃。
|
|
23569
|
+
...input.sessionLabel ? { sessionLabel: input.sessionLabel } : {}
|
|
23561
23570
|
})
|
|
23562
23571
|
});
|
|
23563
23572
|
} catch (err) {
|
|
@@ -23738,6 +23747,13 @@ async function main() {
|
|
|
23738
23747
|
// 精确校验(按 target persona tool 选表)在 daemon handler 层做(fail-fast)。
|
|
23739
23748
|
model: external_exports.enum([...CLAUDE_MODEL_IDS, ...CODEX_MODEL_IDS]).optional().describe(
|
|
23740
23749
|
"override the target persona's default model. Omit to use the persona default. Claude personas: " + CLAUDE_MODEL_IDS.join(" / ") + ". Codex personas: " + CODEX_MODEL_IDS.join(" / ") + "."
|
|
23750
|
+
),
|
|
23751
|
+
// butler 顶部入口 (spec 2026-07-27):butler 给新 worker session 起 label 用。
|
|
23752
|
+
// Sidebar 直接显示这个 label(否则兜底 cwd-basename 都是 persona 目录名,同一
|
|
23753
|
+
// persona 的 dispatched session 长得都一样)。仅新开 dispatch 生效;续派
|
|
23754
|
+
// (dispatchId set) 时 daemon 静默丢弃,保 worker session 稳定命名。
|
|
23755
|
+
sessionLabel: external_exports.string().optional().describe(
|
|
23756
|
+
'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).'
|
|
23741
23757
|
)
|
|
23742
23758
|
}
|
|
23743
23759
|
},
|