Repository navigation
refactor(server): move the Claude transcript parser into its own module - #1760
Conversation
Moves the Claude transcript parser verbatim into server/claude-transcript.ts, a leaf module that imports nothing back from conversation.ts or prompt.ts. conversation.ts imports the four names it still uses and re-exports parseClaudeTranscript, createClaudeTranscriptParser and unwrapPastes, so every importer keeps its path. Plan: .omo/plans/agent-modules-split.md C1.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Summary
Merge Risk: ⚪ Minimal · up to
|
|
Merge pass: this is a move-only PR (per-agent split, wave C1). As AGENTS.md allows, it is merged on its checks without waiting for a CodeRabbit review.
All required checks are green and no review thread is open. |
…s/live.ts (#1761) Wave P1b of the per-agent module split. The plan is `.omo/plans/agent-modules-split.md` in the maintainer's workspace, and plan-reviewer approved it. It follows P1a (#1755) and C1 (#1760). This wave moves the live-screen tail checks out of `server/prompt.ts` into a new leaf module, `server/dialogs/live.ts`. These are the per-agent checks that say whether a dialog parsed from the screen is still drawn at its bottom. `prompt.ts` keeps every per-pane map, the queue drivers and every route. ## What changes - **Moved verbatim, with their doc comments:** - the omo task and spinner patterns (`OMO_TASK_ROW_RE` through `OMO_EMPTY_BOX_RE`); - `CLAUDE_SUBMIT_TAIL_RE`, `omoFooterIsActive` and `promptTailIsActive`; - the pi and Command Code footer helpers (`PI_MENU_HINT_AT_END_RE`, `PI_INPUT_HINT_AT_END_RE`, `CMD_HINT_RE`, `CMD_FOOTER_WORDS`, `cmdFooterEnds`, `PI_MODEL_HINT_AT_END_RE`, `PI_FOOTER_LINES`); - `hintAtEnd`, `parsePrompt` and `liveScreen`. - **New `export` keywords:** `parsePrompt`, `promptTailIsActive` and `liveScreen`. `prompt.ts` imports these three back. - **No re-exports:** nothing else imported these names from `prompt.ts`. - **Imports:** `prompt.ts`'s imports from `./dialogs/*` narrow to what it still uses. `live.ts` imports the same names from the same dialogs modules, plus `paneRead` from `../herdr/client.ts`. - **State:** none. Nothing that moves holds module state, and no `herdrRpc` call moves (`liveScreen` uses the typed `paneRead` wrapper). `server/prompt.ts` goes from 1,530 to 1,334 lines. ## Checks - **`--color-moved`:** `git diff --color-moved=plain --color-moved-ws=allow-indentation-change origin/main...HEAD` shows 382 lines as moved. The other 30 lines are: - `live.ts`'s eleven import lines; - `prompt.ts`'s narrowed and new import lines; - the three declarations whose only change is the added `export`, each shown as removed and added. - **No import cycle:** `bun <plan>/no-path.ts server/dialogs/live.ts server/prompt.ts server/conversation.ts` prints "no path to server/prompt.ts, server/conversation.ts". The new module never reaches either file through value imports. - **Typecheck:** `bun run typecheck` passes. - **Unit tests:** **589 pass, 0 fail across 20 files**, from: `HERDR_TEST_MODE=unit bun test server/prompt.test.ts server/dialogs/ server/hermes-prompt.test.ts server/cmd.test.ts server/core/` Every `parseInteractivePrompt` path runs through `parsePrompt`. - `bun run check fast`: passes (unit 6253 pass, 0 fail, 13 skip in 443 files, 8 at a time, 73.5s) - **Integration lane:** CI runs pending-input, prompt, opencode-prompt and claude-session contracts. ## Outside PRs that touch the same files No other maintainer PR touches these files. Three outside contributors' PRs touch `server/prompt.ts`. Each has a small change inside a function that now lives in `server/dialogs/live.ts`, so its rebase carries that change into the new file. I checked each with `git merge-tree`: - **#1670** merges cleanly with main, and conflicts with this branch in `server/prompt.ts`. - **#1714** already conflicts with main in `server/prompt.ts`, and needs a rebase either way. - **#1669** already conflicts with main in `server/prompt.ts`, and needs a rebase either way. Move-only: moved declarations plus imports and three `export` keywords. No changelog fragment: users see no change.
…ersation-shared.ts (#1763) Wave C2 of the per-agent module split. The plan is `.omo/plans/agent-modules-split.md` in the maintainer's workspace, and plan-reviewer approved it. It follows C1 (#1760) and P1b (#1761). This wave moves the conversation types and constants that agent modules share out of `server/conversation.ts` into a new leaf module, `server/conversation-shared.ts`. Later waves (Devin's session lookup, then the Claude and omp sessions) can then throw `ConversationUnavailable` without importing `conversation.ts`. ## What changes - **Moved verbatim, with their doc comments:** - `TRANSCRIPT_WINDOW_BYTES`; - the error classes `ConversationUnavailable`, `ConversationNotStarted` and `HistoryChanged`; - the types `RecognizedConversation`, `StreamSource` and `ConversationPage`; - `PROCESS_VERSION` and `answerVersion`. - **State:** `PROCESS_VERSION` holds one `randomUUID()`, set once and never changed. It moves with its only user, `answerVersion`, so it still has a single owner. - **New `export`:** only `StreamSource` gains one, because `conversation.ts` imports it back. - **Re-exports:** `conversation.ts` re-exports every name that was exported before, so no other importer changes. - **One import path changes on purpose:** `server/hermes.ts` now imports the same names from `./conversation-shared.ts` instead of `./conversation.ts`. That removes the runtime import cycle between `hermes.ts` and `conversation.ts`. ## Checks - **`--color-moved`:** `git diff --color-moved=plain --color-moved-ws=allow-indentation-change origin/main...HEAD` shows 138 lines as moved. The other 8 lines are: - the new file's two import lines; - `StreamSource` with its added `export`, shown as removed and added; - `conversation.ts`'s import and re-export lines; - `hermes.ts`'s changed module path. - **No cycles:** checked with `bun <plan>/no-path.ts`. - With `server/conversation-shared.ts server/conversation.ts server/prompt.ts`, it prints "no path to server/conversation.ts, server/prompt.ts". - With `server/hermes.ts server/conversation.ts`, it prints "no path to server/conversation.ts". The cycle is gone. - **Typecheck:** `bun run typecheck` passes. - **Unit tests:** `HERDR_TEST_MODE=unit bun test server/hermes.test.ts server/conversation.test.ts server/chat-history.test.ts`: 177 pass, 0 fail. - `bun run check fast`: passes (unit 6253 pass, 0 fail, 13 skip in 443 files, 8 at a time, 66.5s) - **Integration lane:** CI runs the gjc, api, opencode and hermes contracts. ## Outside PRs that touch the same files No other maintainer PR touches these files. Three outside contributors' PRs touch `server/conversation.ts`. Each adds a member to `RecognizedConversation`'s `source` union, which now lives in `server/conversation-shared.ts`, so a rebase carries that one line into the new file. I checked each with `git merge-tree`: - **#1706** merges cleanly with main, and conflicts with this branch in `server/conversation.ts`. - **#1652** already conflicts with main in `server/conversation.ts`, and needs a rebase either way. - **#1442** already conflicts with main in `server/conversation.ts`, and needs a rebase either way. Move-only: moved declarations plus imports, one re-export line, one added `export`, and the `hermes.ts` module path. No changelog fragment: users see no change.
Wave C1 of the per-agent module split. The plan is
.omo/plans/agent-modules-split.mdin the maintainer's workspace, and plan-reviewer approved it. It follows P1a (#1755).This wave moves the Claude transcript parser out of
server/conversation.tsinto a new leaf module,server/claude-transcript.ts.conversation.tskeeps:forget*functions;paneTranscript,readCommandTranscript,paneProcessRoots).It re-exports the parser's public names, so no importer changes.
What changes
isCommandEntrythroughparseClaudeTranscript:stripTerminalControlsandunwrapPastes;TranscriptEntry,claudeResultText,IMAGE_TYPES;createClaudeTranscriptParser,claudeTranscriptParserandparseClaudeTranscript.exportkeywords: four names gain one, becauseconversation.tsstill uses them:isCommandEntry,claudeResultText,IMAGE_TYPESand the typeTranscriptEntry.conversation.tsre-exportsparseClaudeTranscript,createClaudeTranscriptParserandunwrapPastes. Its other imports narrow to what it still uses.Checks
--color-moved:git diff --color-moved=plain --color-moved-ws=allow-indentation-change origin/main...HEAD -- servershows 831 lines as moved. The other 19 lines are the new module's imports,conversation.ts's narrowed imports, the re-export, and the fourexportkeywords.No import cycle:
bun <plan>/no-path.ts server/claude-transcript.ts server/conversation.ts server/prompt.tsexits 0. It follows value imports through every file, and the new module never reachesconversation.tsorprompt.ts.Spied names stay put:
paneTranscript,readCommandTranscriptandpaneProcessRootsare still declared inconversation.ts.No new herdr call:
server/claude-transcript.tshas noherdrRpccall (server/conventions.test.tsforbids new ones).Typecheck:
bun run typecheckpasses.Unit tests: 212 pass, 0 fail, from:
HERDR_TEST_MODE=unit bun test server/chat-history.test.ts server/claude-incremental.test.ts server/claude-turn-boundaries.test.ts server/skill-activity.test.ts server/conversation.test.ts server/native-incremental.test.ts server/large-history-agents.test.ts server/outcome-transcript*.test.tsbun run check fast: passes (unit 6251 pass, 0 fail, 13 skip in 443 files, 8 at a time, 73.4s)Integration lane: CI runs
claude-session.contractandconversation-push.contract.Outside PRs that touch the same files
No other maintainer PR touches these files. Three outside contributors' PRs touch
server/conversation.ts. I checked each against this branch withgit merge-tree:conversation.ts: the../shared/protocol.tstype import, and the line after./tool-output.tswhere it adds its Copilot imports. Its code changes do not touch the moved parser.conversation.ts, and needs a rebase either way.Move-only: moved declarations plus imports, re-exports and four
exportkeywords. No changelog fragment: users see no change.