* Quick placeholder title: strip display tags, take the first sentence, * collapse whitespace, truncate to 50 chars. Returns undefined if the result * is empty (e.g. message was only ). Replaced by * generateSessionTitle once Haiku resolves (~1-15s).
(raw: string)
| 553 | * generateSessionTitle once Haiku resolves (~1-15s). |
| 554 | */ |
| 555 | function deriveTitle(raw: string): string | undefined { |
| 556 | // Strip <ide_opened_file>, <session-start-hook>, etc. — these appear in |
| 557 | // user messages when IDE/hooks inject context. stripDisplayTagsAllowEmpty |
| 558 | // returns '' (not the original) so pure-tag messages are skipped. |
| 559 | const clean = stripDisplayTagsAllowEmpty(raw) |
| 560 | // First sentence is usually the intent; rest is often context/detail. |
| 561 | // Capture group instead of lookbehind — keeps YARR JIT happy. |
| 562 | const firstSentence = /^(.*?[.!?])\s/.exec(clean)?.[1] ?? clean |
| 563 | // Collapse newlines/tabs — titles are single-line in the claude.ai list. |
| 564 | const flat = firstSentence.replace(/\s+/g, ' ').trim() |
| 565 | if (!flat) return undefined |
| 566 | return flat.length > TITLE_MAX_LEN |
| 567 | ? flat.slice(0, TITLE_MAX_LEN - 1) + '\u2026' |
| 568 | : flat |
| 569 | } |
| 570 | |
| 571 |
no test coverage detected