@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 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 withBoundaries = injectTurnBoundaries(messages);
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: withBoundaries.slice(offset, offset + limit), total, offset };
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.346".length > 0 ? "0.2.346" : "dev";
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
- label: cand.label || `${cand.tool} 会话`,
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),