feat(agents): add Oh My Pi (omp) agent#1132
Conversation
Adds omp (Oh My Pi, @oh-my-pi/pi-coding-agent) as a real, selectable BETA agent registered everywhere gemini-cli is. Spawns non-interactively as 'omp -p --mode json' with --resume and --model; new custom OmpOutputParser handles omp's JSON event stream (session/message_update[text_delta]/message_end[usage+cost]/agent_end), modeled on the sibling Pi parser. Includes capabilities, error patterns, path discovery, NewInstanceModal entry, README, and tests (parser fixture, definitions, capabilities, metadata, ids); agent-completeness passes.
📝 WalkthroughWalkthroughAdds ChangesOh My Pi agent support
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Greptile SummaryThis PR adds Oh My Pi as a beta agent. The main changes are:
Confidence Score: 5/5This looks safe to merge.
Important Files Changed
Reviews (2): Last reviewed commit: "fix(agents): omp prompt-separator, tab-n..." | Re-trigger Greptile |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
src/main/agents/definitions.ts (1)
438-447: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win
modeloptiontype: 'select'contradicts the documented fuzzy free-form input.The description advertises arbitrary fuzzy values (e.g.
anthropic/claude-opus-4-8), andmodelArgs/argBuilderaccept any string, but aselectcontrol restricts users to the fixedoptionslist. Users can't enter the very values the description suggests. Considertype: 'text'(asopencodedoes) to honor free-form fuzzy matching, or keepselectonly if the set is truly closed.♻️ Option: use free-form text to match the description
{ key: 'model', - type: 'select' as const, + type: 'text' as const, label: 'Model', description: 'Fuzzy model selector passed to --model (for example, opus, sonnet, or anthropic/claude-opus-4-8). Leave empty for the CLI default.', - options: ['', 'opus', 'sonnet', 'haiku', 'gpt-5', 'gemini-2.5-pro'], default: '', argBuilder: (value: string) => (value && value.trim() ? ['--model', value.trim()] : []), },🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/agents/definitions.ts` around lines 438 - 447, The `model` field in `agents/definitions.ts` is configured as a closed `select`, which conflicts with its free-form fuzzy model description and `argBuilder` behavior. Update the `model` option definition to use a free-text input (matching the `modelArgs`/`argBuilder` flexibility) so users can enter arbitrary model names like the description examples, or otherwise tighten the description and accepted values if you intend to keep `select`.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/main/parsers/omp-output-parser.ts`:
- Around line 233-253: detectErrorFromParsed is treating non-error events as
errors because extractErrorText can return messageText even when the event is
not flagged as an error. Update extractErrorText and/or detectErrorFromParsed in
OmpOutputParser so messageText is only used when event.isError is explicitly
true, or otherwise limit the fallback to error-specific fields. Keep the current
error matching flow with matchErrorPattern/getErrorPatterns, but ensure only
genuine error payloads produce an AgentError.
- Around line 98-105: The top-level error guard in omp-output-parser.ts is too
broad and is intercepting recoverable tool failures before the switch in
parseEvent. Update the early return around event.error /
event.message?.errorMessage so it does not treat tool_execution_end as a fatal
error, and let the tool_execution_end branch use event.isError and
toolState.status to classify failures correctly. Keep the fix localized to
parseEvent and the tool_execution_end handling logic.
---
Nitpick comments:
In `@src/main/agents/definitions.ts`:
- Around line 438-447: The `model` field in `agents/definitions.ts` is
configured as a closed `select`, which conflicts with its free-form fuzzy model
description and `argBuilder` behavior. Update the `model` option definition to
use a free-text input (matching the `modelArgs`/`argBuilder` flexibility) so
users can enter arbitrary model names like the description examples, or
otherwise tighten the description and accepted values if you intend to keep
`select`.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 32ecbf5c-ac0e-4290-b40b-d6c8bf0163dd
📒 Files selected for processing (19)
README.mdsrc/__tests__/main/agents/capabilities.test.tssrc/__tests__/main/agents/definitions.test.tssrc/__tests__/main/parsers/index.test.tssrc/__tests__/main/parsers/omp-output-parser.test.tssrc/__tests__/shared/agentIds.test.tssrc/__tests__/shared/agentMetadata.test.tssrc/main/agents/capabilities.tssrc/main/agents/definitions.tssrc/main/agents/path-prober.tssrc/main/parsers/error-patterns.tssrc/main/parsers/index.tssrc/main/parsers/omp-output-parser.tssrc/main/parsers/parser-factory.tssrc/renderer/components/NewInstanceModal/types.tssrc/renderer/constants/agentIcons.tssrc/shared/agentConstants.tssrc/shared/agentIds.tssrc/shared/agentMetadata.ts
| if (event.error || event.message?.errorMessage) { | ||
| return { | ||
| type: 'error', | ||
| text: this.extractErrorText(event), | ||
| sessionId, | ||
| raw: event, | ||
| }; | ||
| } |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor
🧩 Analysis chain
🏁 Script executed:
cat -n src/main/parsers/omp-output-parser.ts | sed -n '90,110p'Repository: RunMaestro/Maestro
Length of output: 785
🏁 Script executed:
cat -n src/main/parsers/omp-output-parser.ts | sed -n '180,210p'Repository: RunMaestro/Maestro
Length of output: 1078
🏁 Script executed:
rg -n "tool_execution_end" src/main/parsers/omp-output-parser.ts -A 5 -B 5Repository: RunMaestro/Maestro
Length of output: 459
🏁 Script executed:
rg -n "interface OmpRawEvent" src/main/parsers/omp-output-parser.ts -A 30Repository: RunMaestro/Maestro
Length of output: 901
🏁 Script executed:
rg -n "error" src/main/parsers/omp-output-parser.ts | head -20Repository: RunMaestro/Maestro
Length of output: 1041
🏁 Script executed:
cat -n src/main/parsers/omp-output-parser.ts | sed -n '95,125p'Repository: RunMaestro/Maestro
Length of output: 1114
🏁 Script executed:
rg -n "\.error.*tool" src/main --type ts -iRepository: RunMaestro/Maestro
Length of output: 272
🏁 Script executed:
rg -n "tool_execution_end" src/main --type ts -B 3 -A 3Repository: RunMaestro/Maestro
Length of output: 992
🏁 Script executed:
cat -n src/main/parsers/pi-output-parser.ts | sed -n '170,185p'Repository: RunMaestro/Maestro
Length of output: 589
🏁 Script executed:
rg -n "interface OmpRawEvent" src/main/parsers/pi-output-parser.ts -A 30Repository: RunMaestro/Maestro
Length of output: 156
🏁 Script executed:
head -80 src/main/parsers/pi-output-parser.tsRepository: RunMaestro/Maestro
Length of output: 1841
🏁 Script executed:
cat -n src/main/parsers/pi-output-parser.ts | sed -n '85,110p'Repository: RunMaestro/Maestro
Length of output: 913
The global event.error check incorrectly intercepts recoverable tool failures.
The condition if (event.error || event.message?.errorMessage) at Lines 98-105 short-circuits execution before the switch statement. If a tool_execution_end event carries a top-level error field (even when intended only to signal a recoverable tool failure via toolState.status: 'failed'), it will be misclassified as a fatal agent error instead of a tool_use event.
The parser relies on event.isError within the tool_execution_end case (Lines 187-198) to determine failure status. Ensure the global error guard excludes tool_execution_end events, or verify that the upstream omp tool never sets a truthy error field on recoverable tool failures.
Problematic flow
if (event.error || event.message?.errorMessage) {
- // If event.type === 'tool_execution_end' but event.error is set,
- // this returns 'error' here, skipping the switch below.
return { type: 'error', ... };
}
switch (event.type) {
case 'tool_execution_end':
- // This code is unreachable if event.error is set,
- // even if the intention was just to mark the tool as 'failed' (recoverable).
return { type: 'tool_use', toolState: { status: event.isError ? 'failed' : ... } };
}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/main/parsers/omp-output-parser.ts` around lines 98 - 105, The top-level
error guard in omp-output-parser.ts is too broad and is intercepting recoverable
tool failures before the switch in parseEvent. Update the early return around
event.error / event.message?.errorMessage so it does not treat
tool_execution_end as a fatal error, and let the tool_execution_end branch use
event.isError and toolState.status to classify failures correctly. Keep the fix
localized to parseEvent and the tool_execution_end handling logic.
| detectErrorFromParsed(parsed: unknown): AgentError | null { | ||
| if (!parsed || typeof parsed !== 'object') { | ||
| return null; | ||
| } | ||
|
|
||
| const event = parsed as OmpRawEvent; | ||
| const errorText = this.extractErrorText(event); | ||
| if (!errorText) { | ||
| return null; | ||
| } | ||
|
|
||
| const match = matchErrorPattern(getErrorPatterns(this.agentId), errorText, { minLength: 0 }); | ||
| return { | ||
| type: match?.type || 'unknown', | ||
| message: match?.message || errorText, | ||
| recoverable: match?.recoverable ?? true, | ||
| agentId: this.agentId, | ||
| timestamp: Date.now(), | ||
| parsedJson: parsed, | ||
| }; | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Find any omp sample fixtures and inspect occurrences of messageText / error fields
fd -e jsonl -e json | xargs rg -l 'messageText' 2>/dev/null
rg -n 'messageText' --type=ts -C2 src/main/parsers/omp-output-parser.ts
rg -n 'messageText' --type=ts src/__tests__/main/parsers/omp-output-parser.test.tsRepository: RunMaestro/Maestro
Length of output: 327
detectErrorFromParsed risks false-positive errors by treating any messageText as an error.
The extractErrorText function falls back to event.messageText || '' (line 335) without verifying event.isError. Consequently, detectErrorFromParsed classifies any event containing a messageText field as an unknown error (lines 240–252), regardless of whether the event is actually an error.
Ensure messageText is only treated as an error payload when event.isError is explicitly true, or restrict the fallback to fields specific to error events.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/main/parsers/omp-output-parser.ts` around lines 233 - 253,
detectErrorFromParsed is treating non-error events as errors because
extractErrorText can return messageText even when the event is not flagged as an
error. Update extractErrorText and/or detectErrorFromParsed in OmpOutputParser
so messageText is only used when event.isError is explicitly true, or otherwise
limit the fallback to error-specific fields. Keep the current error matching
flow with matchErrorPattern/getErrorPatterns, but ensure only genuine error
payloads produce an AgentError.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 19a6de1c47
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| modelArgs: (modelId: string) => ['--model', modelId], | ||
| workingDirArgs: (dir: string) => ['--cwd', dir], | ||
| imageArgs: (imagePath: string) => [`@${imagePath}`], | ||
| configOptions: [ |
There was a problem hiding this comment.
Disable OMP tools for tab naming
For OMP agents, tab naming currently launches with tools enabled because tabNaming.ts only appends a tool-disabling flag when agent.noToolsArgs is present, and this new definition omits it. I checked the OMP CLI parser and --no-tools is a recognized value-less launch flag, so task-like first messages can make the throwaway naming request run a real OMP agent with read/write/bash tools or time out instead of returning a short name. Add noToolsArgs: ['--no-tools'] here, matching the Pi integration.
Useful? React with 👍 / 👎.
| args: [], | ||
| batchModePrefix: ['-p'], | ||
| jsonOutputArgs: ['--mode', 'json'], | ||
| noPromptSeparator: true, |
There was a problem hiding this comment.
Preserve flag-like prompts with the POSIX separator
With noPromptSeparator set, Maestro appends the user prompt directly after OMP's flags, so prompts that begin with -, --, or markdown front matter like --- are parsed by OMP as CLI options and can fail with unknown flags instead of reaching the model. I checked OMP's parser and it supports -- as the end-of-options marker, so this agent should use Maestro's default separator path rather than treating the prompt as an unguarded positional.
Useful? React with 👍 / 👎.
| supportsGroupChatModeration: false, | ||
| usesJsonLineOutput: true, | ||
| usesCombinedContextWindow: false, | ||
| supportsAppendSystemPrompt: false, |
There was a problem hiding this comment.
Use OMP's native append-system-prompt flag
OMP exposes --append-system-prompt, but this capability is set to false, so process:spawn falls back to prepending Maestro's system prompt into the first user message and then skips re-sending it on resumed turns. For OMP agents with nudge or custom system instructions, that makes the instructions part of the conversation transcript instead of system metadata and prevents updates from applying on subsequent resumes; mark this true so the existing spawn path passes OMP's native flag.
Useful? React with 👍 / 👎.
| configOptions: [ | ||
| { | ||
| key: 'model', | ||
| type: 'select' as const, |
There was a problem hiding this comment.
Allow custom OMP model selectors
Using a fixed select here prevents users from entering OMP's normal fuzzy or provider-qualified model strings in the new-agent and edit-agent config panels, because AgentConfigPanel renders selects only from the declared options. This even makes the documented example anthropic/claude-opus-4-8 impossible to choose unless it is one of the hard-coded entries; use the text input pattern from Pi so any OMP-supported selector can be passed to --model.
Useful? React with 👍 / 👎.
| */ | ||
| omp: { | ||
| supportsResume: true, | ||
| supportsReadOnlyMode: false, |
There was a problem hiding this comment.
Expose OMP's read-only tool allowlist
With supportsReadOnlyMode false, Maestro hides the Read-Only toggle for OMP even though OMP accepts a --tools allowlist like the Pi integration uses. Since OMP's default approval mode allows write and exec tools, users running OMP on untrusted prompts have no way to start a read-only turn from the UI; add read-only args such as a read/search tool allowlist and mark this capability true.
Useful? React with 👍 / 👎.
…(#omp) Review fixes for the Oh My Pi agent: drop noPromptSeparator so omp uses Maestro's '--' end-of-options separator (verified omp supports it), protecting flag-like prompts while keeping @image args before the separator; add noToolsArgs ['--no-tools'] so tab-naming launches name-only (mirrors Pi); make OmpOutputParser fall back to assembled streamed text when agent_end has no/empty messages. Declined --append-system-prompt (Windows uses --append-system-prompt-file which omp lacks; cross-cutting) and model free-text (SELECT matches gemini/qwen convention); deferred read-only allowlist.
|
@greptile re-review please |
…fixed dropdown omp --model is fuzzy and multi-provider (opus, gpt-5.2, openai/gpt-5.2, ollama/..., 20+ providers). The hardcoded 6-item select (incl. stale gpt-5) couldn't represent that; switched to type:'text' matching its sibling pi/hermes/opencode/codex agents.
Adds an omp case to runModelDiscovery so the model combobox lists omp's full multi-provider catalog (provider-qualified selectors, de-duplicated). Without it the picker showed no models. Mirrors the OpenCode discovery pattern; parseJsonWithBom for robustness.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/main/agents/detector.ts`:
- Line 475: The model discovery call in detector.ts is running locally via
execFileNoThrow, so it ignores SSH remote execution when sshRemoteConfig.enabled
is set. Update the omp models --json path in the relevant discovery flow to use
wrapSpawnWithSsh() (or the existing SSH-aware spawn helper used for agent
processes) so it queries the remote agent instead of the local machine, and make
sure it fails loudly if SSH is enabled but the remote cannot be resolved.
- Around line 489-493: The parse failure branch in detector.ts only logs and
returns an empty list, so explicit malformed omp models --json errors are not
reported to Sentry. In the catch block around the JSON parse in the relevant
detector helper, keep the existing warn log but also call captureException()
from src/utils/sentry.ts with the parseError and add enough context (for example
the omp models --json operation and LOG_CONTEXT) so handled failures are visible
in Sentry before returning [].
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: da9f3198-1a70-47b3-b72c-83ac8902ce85
📒 Files selected for processing (2)
src/__tests__/main/agents/detector.test.tssrc/main/agents/detector.ts
| // Oh My Pi: `omp models --json` returns { models: [{ id, selector, ... }] } | ||
| // across every configured provider. Prefer the provider-qualified `selector` | ||
| // (e.g. anthropic/claude-opus-4-8), which is unambiguous for --model. | ||
| const result = await execFileNoThrow(command, ['models', '--json'], undefined, env); |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift
Make omp model discovery SSH-aware.
This new spawn path runs omp models --json locally only. When omp is configured with sshRemoteConfig.enabled, discovery will query the wrong machine and the model picker can come back empty/stale even though the remote agent is available.
As per coding guidelines, src/main/**/*.{ts,js} features that spawn agent processes must “support SSH remote execution… use wrapSpawnWithSsh()… and fail loudly if SSH is enabled but the remote can't be resolved.”
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/main/agents/detector.ts` at line 475, The model discovery call in
detector.ts is running locally via execFileNoThrow, so it ignores SSH remote
execution when sshRemoteConfig.enabled is set. Update the omp models --json path
in the relevant discovery flow to use wrapSpawnWithSsh() (or the existing
SSH-aware spawn helper used for agent processes) so it queries the remote agent
instead of the local machine, and make sure it fails loudly if SSH is enabled
but the remote cannot be resolved.
Source: Coding guidelines
| } catch (parseError) { | ||
| logger.warn('Failed to parse omp models --json output', LOG_CONTEXT, { | ||
| error: parseError, | ||
| }); | ||
| return []; |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
Report handled parse failures to Sentry too.
This branch handles malformed omp models --json output explicitly, so the outer catch never sees it. Right now that means we silently downgrade to [] with only a log line, which makes field failures hard to diagnose.
Suggested change
} catch (parseError) {
logger.warn('Failed to parse omp models --json output', LOG_CONTEXT, {
error: parseError,
});
+ captureException(parseError, {
+ operation: 'agent:modelDiscovery',
+ agentId,
+ command: 'omp models --json',
+ });
return [];
}As per coding guidelines, src/**/*.{ts,tsx,js,jsx} should “Use captureException() and captureMessage() from src/utils/sentry.ts for explicit error reporting with context.”
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| } catch (parseError) { | |
| logger.warn('Failed to parse omp models --json output', LOG_CONTEXT, { | |
| error: parseError, | |
| }); | |
| return []; | |
| } catch (parseError) { | |
| logger.warn('Failed to parse omp models --json output', LOG_CONTEXT, { | |
| error: parseError, | |
| }); | |
| captureException(parseError, { | |
| operation: 'agent:modelDiscovery', | |
| agentId, | |
| command: 'omp models --json', | |
| }); | |
| return []; |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/main/agents/detector.ts` around lines 489 - 493, The parse failure branch
in detector.ts only logs and returns an empty list, so explicit malformed omp
models --json errors are not reported to Sentry. In the catch block around the
JSON parse in the relevant detector helper, keep the existing warn log but also
call captureException() from src/utils/sentry.ts with the parseError and add
enough context (for example the omp models --json operation and LOG_CONTEXT) so
handled failures are visible in Sentry before returning [].
Source: Coding guidelines
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9cc36d288e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| private extractErrorText(event: OmpRawEvent): string { | ||
| if (event.message?.errorMessage) { | ||
| return event.message.errorMessage; |
There was a problem hiding this comment.
Handle OMP's top-level errorMessage
When OMP finishes a failed turn it can put the failure on the event itself as errorMessage, for example on agent_end, but this extractor never reads that field. The stdout path calls detectErrorFromParsed before normal parsing, so those frames fall through as system/result events and the UI or CLI can report a successful or empty response instead of the provider error. Add errorMessage?: string to OmpRawEvent and check it here before looking at nested messages.
Useful? React with 👍 / 👎.
| requiresPromptToStart: true, | ||
| supportsStreaming: true, | ||
| supportsResultMessages: true, | ||
| supportsModelSelection: true, |
There was a problem hiding this comment.
Add OMP-specific SSH model discovery
I checked discoverModelsRemote in src/main/ipc/handlers/agents.ts: once this capability is true, SSH model refreshes run the generic omp models command and split stdout by line. OMP documents that models prints provider-grouped tables, not one selector per line, so SSH sessions can populate the dropdown with headers or table rows; choosing one saves that row and later passes it to --model. Add an OMP-specific remote discovery path that requests and parses JSON selectors, or disable remote model suggestions for OMP.
Useful? React with 👍 / 👎.
|
Superseded by #1138, which bundles Qwen Coder (qwen3-coder) and Oh My Pi (omp) into a single PR. The two agents edit the same shared registry files (parser registry, agent metadata/constants, error patterns, supported-agents list, parser-count test), so they cannot merge independently without conflicts; #1138 resolves that union once. Closing in favor of #1138. |
Summary
Adds Oh My Pi (
omp, package@oh-my-pi/pi-coding-agent) as a real, selectable BETA agent, registered in every spotgemini-cliis. It complements the existingpiagent (omp's predecessor, same protocol).Changes
omp -p --mode jsonwith--resume <id>,--model <fuzzy>,--cwd, and@imagesupport (verified againstomp --help, v16.x).OmpOutputParserfor omp's JSON event stream (session/agent_start/message_update[text_delta, thinking_delta]/message_end[usage + cost]/agent_end/tool_execution_*), modeled on the siblingpi-output-parser. Registered inparser-factoryandparsers/index.OMP_ERROR_PATTERNS, capabilities (json/stream/resume/model/sessionId/usage/cost/thinking/image/batch), 200K context window, BETA badge, agent icon,NewInstanceModalentry, path discovery (~/.bun/bin/omp[.exe], npm, version managers), and README.Output format provenance
The parser was written against a real captured
omp -p --mode jsonsample (used inline as the parser test fixture), not inferred docs.Verification
npm run lint(tsc x3): cleanvitest run: parser (fixture), parsers/index, definitions, capabilities, agentMetadata, agentIds, and agent-completeness: 177 tests passeslint+prettier: cleanNotes / deviations
AgentDefinitiontype has no field for it (trusted the code over the suggested arg); capability left false.supportsReadOnlyModeis false:omp --helpdid not confirm a read-only/tools-allowlist flag. Easy to enable later.Summary by CodeRabbit
ompfailure scenarios.