Skip to content

feat(providers): add omo as a discovery and transcript provider - #39

Merged
devswha merged 1 commit into
mainfrom
feat/omo-provider
Aug 13, 2026
Merged

feat(providers): add omo as a discovery and transcript provider#39
devswha merged 1 commit into
mainfrom
feat/omo-provider

Conversation

@devswha

@devswha devswha commented Aug 13, 2026

Copy link
Copy Markdown
Owner

What changed

omo joins the provider registry as a discovery + transcript provider.

  • LLMProvider union, registry entry, capability matrix row, parseProvider
  • process detection, --resume|-r extraction, transcript root, spawn binary map
  • new list/omo/ (provider, auth, mcp, skills, models)
  • frontend: provider unions, settings/agent records, sidebar spawn option, logo

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 PiTranscriptProvider union. OmoProvider is 29 lines; no new transcript parsing exists anywhere in this PR.

record vocabulary omp gjc omo
message, model_change, thinking_level_change, custom_message yes yes yes

inferOpenOmpSessionIds is generalized to inferOpenPiSessionIds so every pi transcript root resolves the same way.

Two things the spike disproved

  1. No prompt parity. omo renders ↑↓ navigate • enter select • esc close; Oh My Pi renders up/down navigate enter select esc cancel. omo also has no Other (type your own) row, which parseGjcQuestion/parseOmpQuestion both require before returning a prompt. A hint regex alone would not work, so supportsPermissionRequests: false — the same posture Cursor already ships.
  2. No omo models subcommand. omo --list-models prints 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, and supportsEffort are all declared false rather than optimistically enabled. The logo is a placeholder because the omo package ships no brand asset.

Verification

Live process table, not just fixtures:

omo   omo-verify   pid=2154550  cwd=/tmp
omo   chatmux      pid=1175040  cwd=/home/devswha/workspace/chatmux

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 .js entry 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.

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>
@devswha
devswha merged commit b5a6541 into main Aug 13, 2026
2 checks passed
@devswha
devswha deleted the feat/omo-provider branch August 13, 2026 07:16
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant