feat(providers): add omo as a discovery and transcript provider - #39
Merged
Conversation
omo writes the same pi-derived JSONL dialect as gjc and Oh My Pi, so session reading and synchronization are reused wholesale through a widened PiTranscriptProvider union; OmoProvider itself is 29 lines. - registry, LLMProvider union, capability matrix, and parseProvider entry - process detection, resume flag, transcript root, and spawn binary mapping - `omo --list-models` prints an aligned text table rather than JSON, so the catalog gets its own six-column parser guarded on the yes/no flag columns - inferOpenOmpSessionIds generalized to every pi transcript root Capabilities are deliberately conservative. There is no omo send runtime yet, and omo's TUI renders "↑↓ navigate • enter select • esc close" with no "Other (type your own)" row, which every parser in tmux-interactive-prompt.service.ts requires, so interactive prompts stay off until omo gets its own parser. Verified against the live process table: a real omo pane classifies as `omo` with the correct pid and cwd. The detection test pins the measured argv, where the extensionless PATH shim is what makes the match work. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Aug 13, 2026
devswha
added a commit
that referenced
this pull request
Aug 13, 2026
…not see (#43) * fix(providers): register omo in the runtime lists the type system cannot see Adding omo to the unions in #39 left three runtime lookups untouched, so the provider typechecked and shipped while behaving wrongly at every layer. - omo read gjc's transcripts. The agent home came from `provider === 'omp' ? '.omp' : '.gjc'`, and a ternary routes a new union member into its else branch without a type error. 632 gjc sessions were indexed as omo, and none of omo's own five transcripts were ever read. - omo never appeared in the sidebar. Two `Array.includes` allowlists in useExternalCliSessions filtered it out after the backend reported it. - omo replies never refreshed. Its transcript root was missing from PROVIDER_WATCH_PATHS, so the initial scan found sessions that no watcher ever updated. The root and title lookups are now exhaustive Records, which makes the next provider a compile error instead of a silent fallthrough. The remaining allowlists (external spawn, completion identity, event-driven notifications, notification label) get omo wherever omp already appears. Also swaps the placeholder logo for the official `oh-my-openagent/.github/assets/omo-icon-light.svg`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(chat): label omo assistant messages as omo, not Claude The message-author chain ends in `: t('messageTypes.claude')`, so omo fell through to the Claude label the same way its transcript root fell through to gjc. Follows the gjc/omp pattern of an i18n key with a defaultValue, so no locale file changes are needed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(providers): correct omo session flag, stderr handling, and avatar display Four defects found by running omo through ChatMux end to end. - omo could not continue a session. `--resume` means different things in the two CLIs: Oh My Pi resumes the given id, omo takes no value and opens an interactive picker, which under `--print` with no stdin exits 13 without running the turn. Measured across valid id, wrong cwd, and `--resume=<id>`; all exit non-zero. omo's equivalent is `--session-id`, verified to resume an existing id and create a missing one. - Ordinary CLI logging surfaced as chat errors. Both CLIs write config notices and hook status to stderr on runs that exit 0, and every line was forwarded as an error message. stderr is now buffered and reported only when the process actually fails. - Assistant avatars were gjc-only. `transcriptView` existed solely to hide the author row for every live provider except gjc; the prop is removed, so all providers show their icon and name. omo also fell through the author chain to the Claude label. - The omo logo rendered small. The official asset sits at ~63% of its canvas, so the viewBox is cropped to the mark's measured bounds. omo's send runtime stays unregistered in spawnFns: sending to a session that is already live in a tmux pane would start a second headless process on the same transcript. Filed separately. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
omo joins the provider registry as a discovery + transcript provider.
LLMProviderunion, registry entry, capability matrix row,parseProvider--resume|-rextraction, transcript root, spawn binary maplist/omo/(provider, auth, mcp, skills, models)Why it is cheap
omo writes the same pi-derived JSONL dialect as gjc and Oh My Pi, so the session reader and synchronizer are reused as-is through a widened
PiTranscriptProviderunion.OmoProvideris 29 lines; no new transcript parsing exists anywhere in this PR.message,model_change,thinking_level_change,custom_messageinferOpenOmpSessionIdsis generalized toinferOpenPiSessionIdsso every pi transcript root resolves the same way.Two things the spike disproved
↑↓ navigate • enter select • esc close; Oh My Pi rendersup/down navigate enter select esc cancel. omo also has noOther (type your own)row, whichparseGjcQuestion/parseOmpQuestionboth require before returning a prompt. A hint regex alone would not work, sosupportsPermissionRequests: false— the same posture Cursor already ships.omo modelssubcommand.omo --list-modelsprints an aligned text table, so the catalog gets a six-column parser guarded on the yes/no flag columns, which rejects both the header and the CLI's startup notice.Scope held back deliberately
There is no omo send runtime (no
server/omo-cli.ts), so this is discovery and reading only.supportsImages,supportsAbort,supportsTokenUsage, andsupportsEffortare all declaredfalserather than optimistically enabled. The logo is a placeholder because the omo package ships no brand asset.Verification
Live process table, not just fixtures:
The detection test pins the measured argv (
node /…/bin/omo --resume <id>); the extensionless PATH shim is exactly what makes the match work, and a.jsentry would silently fail the way #36 did for gjc.npm run typecheck,npm run lint,npm run check:identity,npm test(server 911, client 262) all green.