@clawos-dev/clawd 0.2.346 → 0.2.348
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 +34 -43
- package/dist/dispatch/mcp-server.cjs +12 -1
- package/dist/persona-defaults/persona-clawd-butler/.claude/skills/clawd-session-import/scripts/link-sessions.mjs +3 -1
- package/dist/share-ui/assets/{guest-CuCYJfhF.js → guest-D2HBeAD5.js} +50 -50
- package/dist/share-ui/guest.html +1 -1
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -6935,7 +6935,12 @@ var init_schemas = __esm({
|
|
|
6935
6935
|
// 没选时 UI 拿它显示确切值,而不是「由 CC 决定」这种占位。
|
|
6936
6936
|
resolvedEffort: external_exports.string().optional(),
|
|
6937
6937
|
contextUsage: ContextUsageSchema.optional(),
|
|
6938
|
-
contextWindowSize: external_exports.number().int().positive().optional()
|
|
6938
|
+
contextWindowSize: external_exports.number().int().positive().optional(),
|
|
6939
|
+
// AI 生成的会话标题(CC transcript 的 ai-title 行 / codex thread/name/updated 通知)。
|
|
6940
|
+
// 与用户手改的 label 分离:用户 Rename 只写 label,AI 只写 aiLabel,显示优先级
|
|
6941
|
+
// label > aiLabel——结构上杜绝「自动标题覆盖用户改名」。创建时 UI 把首行截断
|
|
6942
|
+
// 占位写进 SessionCreateArgs.aiLabel,之后由 meta_update 用真标题覆盖。
|
|
6943
|
+
aiLabel: external_exports.string().optional()
|
|
6939
6944
|
};
|
|
6940
6945
|
SessionMetaSchema = external_exports.object(sessionMetaShape);
|
|
6941
6946
|
SelectOptionSchema = external_exports.object({
|
|
@@ -7358,6 +7363,9 @@ var init_schemas = __esm({
|
|
|
7358
7363
|
cwd: external_exports.string().min(1).optional(),
|
|
7359
7364
|
tool: external_exports.string().optional(),
|
|
7360
7365
|
label: external_exports.string().optional(),
|
|
7366
|
+
// AI 标题的创建期占位(UI 传首行截断);正式值由 daemon 经 meta_update 投递,
|
|
7367
|
+
// session:update 不接受此字段(用户改名走 label)
|
|
7368
|
+
aiLabel: external_exports.string().optional(),
|
|
7361
7369
|
model: external_exports.string().optional(),
|
|
7362
7370
|
permissionMode: external_exports.string().optional(),
|
|
7363
7371
|
effort: external_exports.string().optional(),
|
|
@@ -7382,6 +7390,9 @@ var init_schemas = __esm({
|
|
|
7382
7390
|
tool: external_exports.string().min(1),
|
|
7383
7391
|
toolSessionId: external_exports.string().min(1),
|
|
7384
7392
|
label: external_exports.string().optional(),
|
|
7393
|
+
// 扫描派生的标题(ai-title / 首条消息截断)走这里——label 归用户手改专属,
|
|
7394
|
+
// 写 label 会把自动标题焊死在最高显示优先级、live 更新的 aiLabel 永远不显示
|
|
7395
|
+
aiLabel: external_exports.string().optional(),
|
|
7385
7396
|
iconKey: external_exports.string().optional(),
|
|
7386
7397
|
createdAt: external_exports.string().datetime(),
|
|
7387
7398
|
updatedAt: external_exports.string().datetime(),
|
|
@@ -13935,42 +13946,6 @@ function isUserPlainTextLine(obj) {
|
|
|
13935
13946
|
const part = content[0];
|
|
13936
13947
|
return part?.type === "text";
|
|
13937
13948
|
}
|
|
13938
|
-
function injectTurnBoundaries(messages) {
|
|
13939
|
-
let lastBoundaryIdx = -1;
|
|
13940
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
13941
|
-
if (messages[i].kind === "turn-end") {
|
|
13942
|
-
lastBoundaryIdx = i;
|
|
13943
|
-
break;
|
|
13944
|
-
}
|
|
13945
|
-
}
|
|
13946
|
-
const out = [];
|
|
13947
|
-
let contentSeen = false;
|
|
13948
|
-
for (let i = 0; i < messages.length; i++) {
|
|
13949
|
-
const m2 = messages[i];
|
|
13950
|
-
if (i <= lastBoundaryIdx) {
|
|
13951
|
-
out.push(m2);
|
|
13952
|
-
continue;
|
|
13953
|
-
}
|
|
13954
|
-
if (m2.isSidechain) {
|
|
13955
|
-
out.push(m2);
|
|
13956
|
-
continue;
|
|
13957
|
-
}
|
|
13958
|
-
if (m2.kind === "turn-end") {
|
|
13959
|
-
contentSeen = false;
|
|
13960
|
-
out.push(m2);
|
|
13961
|
-
continue;
|
|
13962
|
-
}
|
|
13963
|
-
if (m2.kind === "user-text" && m2.meta === void 0 && contentSeen) {
|
|
13964
|
-
out.push({ kind: "turn-end" });
|
|
13965
|
-
contentSeen = false;
|
|
13966
|
-
}
|
|
13967
|
-
if (m2.kind === "assistant-text" || m2.kind === "tool_call" || m2.kind === "tool_result") {
|
|
13968
|
-
contentSeen = true;
|
|
13969
|
-
}
|
|
13970
|
-
out.push(m2);
|
|
13971
|
-
}
|
|
13972
|
-
return out;
|
|
13973
|
-
}
|
|
13974
13949
|
function appendTurnDurationRowToJsonl(args) {
|
|
13975
13950
|
const base = args.baseDir ?? import_node_path5.default.join(import_node_os3.default.homedir(), ".claude");
|
|
13976
13951
|
const file = import_node_path5.default.join(
|
|
@@ -14347,11 +14322,10 @@ var init_claude_history = __esm({
|
|
|
14347
14322
|
const msg = messageFromJsonl(line);
|
|
14348
14323
|
if (msg) messages.push(msg);
|
|
14349
14324
|
}
|
|
14350
|
-
const
|
|
14351
|
-
const total = withBoundaries.length;
|
|
14325
|
+
const total = messages.length;
|
|
14352
14326
|
const limit = args.limit ?? total;
|
|
14353
14327
|
const offset = args.offset !== void 0 ? Math.min(Math.max(0, args.offset), total) : Math.max(0, total - limit);
|
|
14354
|
-
return { messages:
|
|
14328
|
+
return { messages: messages.slice(offset, offset + limit), total, offset };
|
|
14355
14329
|
}
|
|
14356
14330
|
// CC 子 agent(Agent / Task tool 派发)的对话写在独立文件:
|
|
14357
14331
|
// <projectsRoot>/<cwdHash>/<toolSessionId>/subagents/agent-<agentId>.jsonl
|
|
@@ -14723,6 +14697,13 @@ function parseClaudeObjectInner(obj) {
|
|
|
14723
14697
|
if (typeof effort === "string" && effort.length > 0) {
|
|
14724
14698
|
events.push({ kind: "meta_update", patch: { resolvedEffort: effort } });
|
|
14725
14699
|
}
|
|
14700
|
+
if (type === "ai-title") {
|
|
14701
|
+
const title = obj.aiTitle;
|
|
14702
|
+
if (typeof title === "string" && title.length > 0) {
|
|
14703
|
+
events.push({ kind: "meta_update", patch: { aiLabel: title } });
|
|
14704
|
+
}
|
|
14705
|
+
return events;
|
|
14706
|
+
}
|
|
14726
14707
|
if (type === "system" && subtype === "init") {
|
|
14727
14708
|
const sid = obj.session_id;
|
|
14728
14709
|
const model = obj.model;
|
|
@@ -44623,7 +44604,7 @@ function eqContextUsage(a, b2) {
|
|
|
44623
44604
|
return a.inputTokens === b2.inputTokens && a.outputTokens === b2.outputTokens && a.cacheReadTokens === b2.cacheReadTokens && a.cacheCreateTokens === b2.cacheCreateTokens;
|
|
44624
44605
|
}
|
|
44625
44606
|
function shallowEqMeta(a, b2) {
|
|
44626
|
-
return a.gitBranch === b2.gitBranch && a.resolvedModel === b2.resolvedModel && a.resolvedEffort === b2.resolvedEffort && a.contextWindowSize === b2.contextWindowSize && eqContextUsage(a.contextUsage, b2.contextUsage);
|
|
44607
|
+
return a.gitBranch === b2.gitBranch && a.resolvedModel === b2.resolvedModel && a.resolvedEffort === b2.resolvedEffort && a.contextWindowSize === b2.contextWindowSize && a.aiLabel === b2.aiLabel && eqContextUsage(a.contextUsage, b2.contextUsage);
|
|
44627
44608
|
}
|
|
44628
44609
|
function applyMetaUpdate(state, patch, deps) {
|
|
44629
44610
|
const next = cloneState(state);
|
|
@@ -45020,6 +45001,8 @@ function applyCommand(state, command, deps) {
|
|
|
45020
45001
|
contextWindowSize: _win,
|
|
45021
45002
|
gitBranch: _branch,
|
|
45022
45003
|
resolvedModel: _model,
|
|
45004
|
+
// aiLabel 是旧对话内容生成的标题,/clear 后属于不存在的话题,一并清掉
|
|
45005
|
+
aiLabel: _aiLabel,
|
|
45023
45006
|
...rest
|
|
45024
45007
|
} = next.file;
|
|
45025
45008
|
void _drop;
|
|
@@ -45027,6 +45010,7 @@ function applyCommand(state, command, deps) {
|
|
|
45027
45010
|
void _win;
|
|
45028
45011
|
void _branch;
|
|
45029
45012
|
void _model;
|
|
45013
|
+
void _aiLabel;
|
|
45030
45014
|
const nextFile = {
|
|
45031
45015
|
...rest,
|
|
45032
45016
|
...command.nextToolSessionId ? { toolSessionId: command.nextToolSessionId } : {},
|
|
@@ -46433,6 +46417,7 @@ var SessionManager = class {
|
|
|
46433
46417
|
tool,
|
|
46434
46418
|
toolSessionId,
|
|
46435
46419
|
label: args.label,
|
|
46420
|
+
aiLabel: args.aiLabel,
|
|
46436
46421
|
model: args.model,
|
|
46437
46422
|
permissionMode: args.permissionMode,
|
|
46438
46423
|
effort: args.effort,
|
|
@@ -46472,6 +46457,7 @@ var SessionManager = class {
|
|
|
46472
46457
|
tool: args.tool,
|
|
46473
46458
|
toolSessionId: args.toolSessionId,
|
|
46474
46459
|
label: args.label,
|
|
46460
|
+
aiLabel: args.aiLabel,
|
|
46475
46461
|
iconKey: args.iconKey,
|
|
46476
46462
|
ownerPersonaId: args.ownerPersonaId,
|
|
46477
46463
|
creatorPrincipalId,
|
|
@@ -49609,6 +49595,11 @@ function translateNotification(method, params) {
|
|
|
49609
49595
|
return itemCompleted(rec(p2?.item));
|
|
49610
49596
|
case "thread/tokenUsage/updated":
|
|
49611
49597
|
return tokenUsage(rec(rec(p2?.tokenUsage)));
|
|
49598
|
+
// codex 自动生成的 thread 标题(实测 0.145:payload = { threadId, threadName })
|
|
49599
|
+
case "thread/name/updated": {
|
|
49600
|
+
const name = str(p2?.threadName);
|
|
49601
|
+
return name ? [{ kind: "meta_update", patch: { aiLabel: name } }] : [];
|
|
49602
|
+
}
|
|
49612
49603
|
case "turn/completed":
|
|
49613
49604
|
return turnCompleted(rec(p2?.turn));
|
|
49614
49605
|
default:
|
|
@@ -58557,7 +58548,7 @@ function buildSessionHandlers(deps) {
|
|
|
58557
58548
|
appendImportLedger(deps.dataDir, {
|
|
58558
58549
|
sessionId: String(response.sessionId),
|
|
58559
58550
|
tool: args.tool,
|
|
58560
|
-
...args.label ? { label: args.label } : {},
|
|
58551
|
+
...args.label || args.aiLabel ? { label: args.label ?? args.aiLabel } : {},
|
|
58561
58552
|
toolSessionId: args.toolSessionId,
|
|
58562
58553
|
...args.ownerPersonaId ? { ownerPersonaId: args.ownerPersonaId } : {}
|
|
58563
58554
|
});
|
|
@@ -60236,7 +60227,7 @@ function computeMethodAccess(args) {
|
|
|
60236
60227
|
}
|
|
60237
60228
|
|
|
60238
60229
|
// src/version.ts
|
|
60239
|
-
var version = "0.2.
|
|
60230
|
+
var version = "0.2.348".length > 0 ? "0.2.348" : "dev";
|
|
60240
60231
|
|
|
60241
60232
|
// src/cli-probe/probe.ts
|
|
60242
60233
|
var fs59 = __toESM(require("fs"), 1);
|
|
@@ -22063,7 +22063,12 @@ var sessionMetaShape = {
|
|
|
22063
22063
|
// 没选时 UI 拿它显示确切值,而不是「由 CC 决定」这种占位。
|
|
22064
22064
|
resolvedEffort: external_exports.string().optional(),
|
|
22065
22065
|
contextUsage: ContextUsageSchema.optional(),
|
|
22066
|
-
contextWindowSize: external_exports.number().int().positive().optional()
|
|
22066
|
+
contextWindowSize: external_exports.number().int().positive().optional(),
|
|
22067
|
+
// AI 生成的会话标题(CC transcript 的 ai-title 行 / codex thread/name/updated 通知)。
|
|
22068
|
+
// 与用户手改的 label 分离:用户 Rename 只写 label,AI 只写 aiLabel,显示优先级
|
|
22069
|
+
// label > aiLabel——结构上杜绝「自动标题覆盖用户改名」。创建时 UI 把首行截断
|
|
22070
|
+
// 占位写进 SessionCreateArgs.aiLabel,之后由 meta_update 用真标题覆盖。
|
|
22071
|
+
aiLabel: external_exports.string().optional()
|
|
22067
22072
|
};
|
|
22068
22073
|
var SessionMetaSchema = external_exports.object(sessionMetaShape);
|
|
22069
22074
|
var SelectOptionSchema = external_exports.object({
|
|
@@ -22486,6 +22491,9 @@ var SessionCreateArgs = external_exports.object({
|
|
|
22486
22491
|
cwd: external_exports.string().min(1).optional(),
|
|
22487
22492
|
tool: external_exports.string().optional(),
|
|
22488
22493
|
label: external_exports.string().optional(),
|
|
22494
|
+
// AI 标题的创建期占位(UI 传首行截断);正式值由 daemon 经 meta_update 投递,
|
|
22495
|
+
// session:update 不接受此字段(用户改名走 label)
|
|
22496
|
+
aiLabel: external_exports.string().optional(),
|
|
22489
22497
|
model: external_exports.string().optional(),
|
|
22490
22498
|
permissionMode: external_exports.string().optional(),
|
|
22491
22499
|
effort: external_exports.string().optional(),
|
|
@@ -22510,6 +22518,9 @@ var SessionImportExternalArgs = external_exports.object({
|
|
|
22510
22518
|
tool: external_exports.string().min(1),
|
|
22511
22519
|
toolSessionId: external_exports.string().min(1),
|
|
22512
22520
|
label: external_exports.string().optional(),
|
|
22521
|
+
// 扫描派生的标题(ai-title / 首条消息截断)走这里——label 归用户手改专属,
|
|
22522
|
+
// 写 label 会把自动标题焊死在最高显示优先级、live 更新的 aiLabel 永远不显示
|
|
22523
|
+
aiLabel: external_exports.string().optional(),
|
|
22513
22524
|
iconKey: external_exports.string().optional(),
|
|
22514
22525
|
createdAt: external_exports.string().datetime(),
|
|
22515
22526
|
updatedAt: external_exports.string().datetime(),
|
|
@@ -433,7 +433,9 @@ async function link(cand, icon, ownerPersonaId = '') {
|
|
|
433
433
|
cwd: cand.cwd,
|
|
434
434
|
tool: cand.tool,
|
|
435
435
|
toolSessionId: cand.toolSessionId,
|
|
436
|
-
|
|
436
|
+
// 扫描派生的标题写 aiLabel 不写 label——label 归用户手改专属(写 label 会把
|
|
437
|
+
// 自动标题焊死在最高显示优先级,live 更新的 ai-title 永远不显示)
|
|
438
|
+
aiLabel: cand.label || `${cand.tool} 会话`,
|
|
437
439
|
iconKey: icon,
|
|
438
440
|
createdAt: isoOf(cand.createdMs),
|
|
439
441
|
updatedAt: isoOf(cand.updatedMs),
|