feat(omp): integrate Oh My Pi provider on current main - #11973
nullStack65 wants to merge 27 commits into
Conversation
Adds omp (https://github.com/can1357/oh-my-pi) as a seventh built-in provider by driving its native stdio ACP server (`omp acp`) through the existing generic ACP client stack (effect-acp), mirroring the Cursor/Grok driver layout: - OmpDriver: provider bundle; manual-only maintenance (T3 never guesses an omp update command); model catalog sourced exclusively from the probe ACP session's configOptions during status checks. - OmpAdapter: session lifecycle on the shared ACP runtime: permission bridging via session/request_permission echoing advertised snake_case option ids, dual elicitation bridging (typed session/elicitation plus the official-SDK ext method elicitation/create with its flat response), task-tool subagent projection into the Agents panel, steering merge, pre-prompt and in-permit cancel checkpoints, and a per-session dispatch lock that serializes the configuration write, the turn.started stamp, and the session/prompt dispatch registration (omp applies model writes to the shared session). The permit is released on dispatch registration or prompt fiber exit (raced), never held across the prompt, so steers stay concurrent; the join carries onInterrupt interruption so post-dispatch cancels cannot orphan a prompt. Rollback is advertised unsupported: the ACP session cannot rewind its native conversation history. - OmpProvider: `omp --version` probe plus ACP model discovery; capabilities attach only to the model the probe session currently runs (trimmed currentValue), other catalog entries report null. Owns both model-option selectors (select-guarded and unguarded existence probe) so their category/id normalization cannot drift. - OmpAcpSupport: spawn args per RuntimeMode (Supervised --approval-mode=always-ask, Auto-accept edits --approval-mode=write, Auto --auto-approve, Full access --approval-mode=yolo); model writes only when the session advertises no model option at all (write through) or advertises the requested slug in its select model option; unadvertised slugs and non-select model options preserve the session's configured model, and the effective model is returned so callers stamp truthful turn/session state. - OmpTextGeneration: unattended commit/PR/branch/title generation with --auto-approve and elicitation disabled. - Contracts: OmpSettings/OmpSettingsPatch, off by default like cursor/grok/opencode; display name "Oh My Pi". - Web/mobile: provider icon, settings metadata, add-provider entry; model rows render the provider and upstream label per model. Tests: adapter/provider/support/text-generation suites on the shared mock ACP agent covering the four model-write cases (no model option, advertised slug, unadvertised slug, non-select model option), flat elicitation responses, prepare-cancel permit release, dispatch serialization order, thread-filtered event consumers, plus picker row label coverage. Validated end to end against a real omp 18.1.15 install (11.9k-model catalog, streamed turn in the built desktop UI). Discussion: pingdotgg#10883.
…, workspace snapshots
…, model-swap warning
…vel command catalog
…urface failed session load
…neration, cache freshness, docs
Merges the OMP provider work from pingdotgg#11791 (head 14ed34f) onto main 3efdcc5. Conflict resolution in ProviderRuntimeIngestion.ts keeps both sides: main's manual-title guard from pingdotgg#10720 (`titleState.source !== "manual"`) and the PR's explicit agent rename override (`nameIsExplicit`), so an OMP `/rename` replaces a generated title while a manual T3 rename still wins. Main's `thread.title.generate.complete` dispatch with optimistic title/version expectations is preserved over the PR's older `thread.meta.update` call. pnpm-lock.yaml takes main's version: the PR changed only a peer-suffix hash for alchemy with no package.json change, which is lockfile drift. OMP feature work is otherwise carried unmodified per file; see the integration report for the per-file audit.
`vp lint` on the integrated files surfaced one error and dead imports carried from the PR: - AgentSessionScanner.test.ts read `NodeOS.platform()`, which current main's `t3code/no-global-process-runtime` rule rejects. Use `HostProcessPlatform.defaultValue()`, the pattern main's own tests use for module-scope platform checks. - Drop unused `Dialog*`/`PiAgentIcon` imports in AddProviderInstanceDialog after the PR removed the Pi Agent coming-soon option, plus unused `EffectAcpSchema` and `acpPermissionOutcome` imports in OMP files. No behavior change.
Current `@effect/tsgo` reports `@effect-diagnostics-next-line
preferSchemaOverJson:off` as TS377000 ("directive has no effect") on
11 OMP lines. effect-tsgo promotes those warnings to a non-zero
`tsc --noEmit` exit, so the server typecheck failed on warnings alone.
The directives suppress nothing on this toolchain; remove exactly the
11 flagged lines and let fmt reflow one JSON.stringify block.
Server typecheck now has 0 errors and 0 warnings (suggestions only).
No behavior change.
Independent exact-head source review — Oh My Pi (omp) integrationVerdict: Reviewed state (re-fetched immediately before posting):
Constraints honored: read-only. No source changes, no commits, no merge, no OMP install, no sign-in, no provider credentials, no inference. Tests were executed in an isolated WSL Ubuntu 24.04 clone ( 1. Provenance / commit graphThe candidate is a genuine descendant of the #11791 implementation, not a re-implementation:
2. Per-file parity audit (independently reproduced)I recomputed blob-level parity between 72 source files = 54 byte-identical + 17 content deltas + 1 source-only ( All 17 deltas classified (A = current-main reconciliation, B = lint/typecheck conformance, C = main already implements differently, D = behavior-changing integration delta, E = suspicious): Lint/typecheck-only (B) — 6 OMP files, all removals of stale/no-op Current-main reconciliation (A/C) — shared files keep main's newer code and re-apply only the OMP hunks:
No feature hunk was dropped. Every OMP-specific production file from #11791 exists in the candidate, and the only deltas in OMP-named files are lint removals. 3. Title / session authorityThe candidate re-implements #11791's explicit-rename behavior on main's newer title machinery instead of the source's old
Walkthrough of the required cases:
4. Feature parity (traced end-to-end, not file existence)All 24 capability areas are wired: provider registration ( Nothing that #11791 exposed is missing in #11973. Gaps found are present in #11791 too (verified byte-identical files), i.e. scope/robustness observations, not regressions: no live 5. Shared-runtime regression reviewGeneric changes are limited and consistent with existing provider patterns:
6. Security / auth / process boundary
Non-blocking security notes (also present in #11791):
7. LockfileKeeping
8. Independent test evidenceRun on the exact candidate head in a clean WSL clone (source-only;
Reported Windows scanner flake: not independently reproduced here (Linux-only runner; 9. Hosted CI stateWorkflow runs for Verdict:
|
Operator-authorized live acceptance — Oh My Pi (omp) integrationVerdict: 1. Exact refs at test time
2. OMP install and state protection
3. Discovery / auth (no inference)Enabled Oh My Pi through the real Settings UI (off by default, as designed). Provider snapshot then reported:
4. Model selection and attemptsPolicy: subscription route, non-Anthropic, low cost. Primary:
No silent fallback occurred; each attempt is recorded above. The quota block is account-wide for the in-catalog codex models until the reset date. 5. Real ACP session lifecycle (verified on the failure-free paths)Exact frame sequence observed through the candidate adapter (
Token accounting is real: 6. Model / thinking switching
7. Commands / context / compaction
8. Titles and
|
Unattended commit/PR/branch/title generation spawned omp with --auto-approve and registered no permission handlers, so repository-derived prompt text could steer the model into write or destructive tool work that ran without any user in the loop. Spawn those sessions with --no-tools and always-ask instead, and answer any remaining permission request with a refusal and any elicitation with a decline, so nothing can pause on UI that does not exist. The interactive provider is unchanged.
The omp usage --json probe refreshes provider quota over the network. Warm runs measure 0.5-1.3s but the first refresh after an omp update measured 4.8s, so the 3s bound dropped a healthy account's limits and could transiently degrade the snapshot. 10s matches omp's own update --check bound and still fails rather than hanging a refresh.
Current-runtime refresh + bounded safety hardening — checkpointVerdict: This slice refreshed the runtime evidence to current OMP, classified current-main drift, repaired one narrow probe-timeout brittleness, and closed the unattended text-generation approval gap found in independent review. No Codex inference was attempted (quota remains exhausted until ~2026-09-19T17:18:32Z). 1. Exact refs
2. Current-main drift classification
No semantic overlap with OMP/shared integration surfaces, so per the dispatch rule the reviewed head was kept and no main merge was performed. 3. OMP user-state proof
4. 18.0.10 → 18.2.1 delta and current compatibility (no inference)Release deltas that matter to this integration: ACP Live run (candidate code driving the real
No runtime incompatibility was found. Raw observations: 5. Probe timings and timeout repair
Conclusion: the 4 s version probe has 15–40× headroom on current OMP and is not brittle — kept. The 3 s usage bound was exceeded by an ordinary cold quota refresh, so it was raised narrowly to 10 s (matching omp's own 6. Unattended text-generation security repairFinding (confirmed in source): Repair, in the smallest shape that keeps generation unattended:
Regression tests added: spawn args assert 7. Source validation (all on
|
…tion-20260915 # Conflicts: # apps/server/src/provider/acp/AcpSessionRuntime.ts
…tion-20260915 # Conflicts: # apps/web/src/components/ComposerPromptEditor.test.ts # apps/web/src/components/ComposerPromptEditor.tsx
Current-main reconciliation — checkpointVerdict: 1. Exact refs
Material authority change: upstream closed #11791 as outside current scope ("first-class Oh My Pi support is outside our current scope… compatibility should be considered through shared ACP support… rather than adding another bespoke provider integration"). This branch is therefore maintained as a reconciled, fork-held candidate: draft kept, no ready-for-review, no upstream merge attempt. Current 2. Provenance / history (unchanged discipline)
3. Conflicts and semantic resolutionsOnly one textual conflict in the first merge:
First-merge auto-merge audit confirmed both sides survive in the overlap files: Second merge (rich-text composer default, #12160) resolved:
4. OMP runtime refresh + state integrity
5. Live no-inference acceptance (reconciled code driving real omp 18.2.3)Candidate modules (
6. Hardening verification in this head
7. Validation on
|
Oh My Pi on generic ACP (Orchestrator V2): read-only compatibility verificationRead-only architecture review plus a live zero-inference compatibility proof against a real local OMP install. Nothing in #2829, #11973, or 1. Refreshed state (2026-09-17 ~05:45Z)
2. Generic ACP Registry contract in V2 (source trace)
3. Live zero-inference result against real OMP (
|
| Probe | Result |
|---|---|
initialize |
responds protocolVersion: 1 with v1 agentInfo shape (oh-my-pi, Oh My Pi, 18.2.1) → T3 selects generation 1 |
| Agent capabilities | loadSession: true; promptCapabilities: { image: true, embeddedContext: true }; sessionCapabilities: { list, fork, resume, close } (no delete); mcpCapabilities: { http, sse } |
authMethods |
exactly one agent method: “Use existing local credentials” |
session/new |
returns configOptions: mode:mode, model:model, thinking:thought_level; no legacy models state |
| Model catalog | 7 models with exact slugs, e.g. openai-codex/gpt-5.6-luna; currentValue = openai-codex/gpt-5.6-luna |
| Thinking ladder | off, auto, low, medium, high, xhigh, max |
session/set_config_option (model) |
succeeds; OMP pushes config_option_update with the new currentValue |
session/set_config_option (thinking) |
succeeds and restores |
session/set_mode |
succeeds (also expressible as the mode config option) |
available_commands_update |
arrives immediately after session/new: ~80 commands including fresh, rename, compact, model, switch, context, usage, session, skill:agent-network, remote-pi …; input.hint present |
session/list |
works; sessions carry cwd, title, updatedAt, _meta.messageCount; no pagination cursor on this install |
session/load |
works, replay captured |
session/close |
works |
| invalid session id | JSON-RPC -32603 + ACP session not found (fail-closed) |
| unknown method | JSON-RPC -32603 + Unknown ACP ext method (fail-closed) |
| stdio MCP servers | honored: a bogus injected server made session/new fail with the server’s launch error, so T3's t3 acp-mcp-bridge injection path is real and OMP-spawned |
Unproven live (requires a model turn, therefore classified rather than fabricated): permission-request shapes during tool use, elicitation during approvals/skill questions, structured usage_update values (context/cost), subagent task event shapes, and real mid-turn session/cancel. These are protocol-covered by the V2 source trace above; OMP advertises the capabilities they rely on.
4. Capability matrix vs #11973
| Capability | Classification | Evidence |
|---|---|---|
| Launch/install | GENERIC_V2_ALREADY_COVERS |
binary/npx/uvx + SHA-256 + managed cache + executable override; requires an official registry entry (OMP is not registered today) |
| Auth | GENERIC_V2_ALREADY_COVERS |
live single agent method; probe readiness; URL-auth confirmation flow |
| Model catalog | GENERIC_V2_ALREADY_COVERS |
live exact slugs + currentValue from the model config option |
| Provider grouping | OMP_SPECIFIC_EXTRA_NOT_NEEDED_FOR_CORE_USE |
one flat picker; exact upstream-prefixed slugs still selectable |
| Thinking ladders | GENERIC_V2_ALREADY_COVERS |
live 7-level ladder; V2 re-reads options after a model switch and skips per-model-invalid values |
| Context meter | GENERIC_V2_ALREADY_COVERS |
usage_update/state_update → used/max/cost; live emission needs a turn |
| Commands | GENERIC_V2_ALREADY_COVERS |
live ~80 commands; live refresh via coordinator |
| Command argument hints | GENERIC_V2_ALREADY_COVERS |
hint normalized and shown in the / menu (description fallback); inline argument completion is cosmetic |
| Skills | OMP_SPECIFIC_EXTRA_NOT_NEEDED_FOR_CORE_USE |
OMP advertises skill:* as normal commands → / menu; the $ menu requires $-prefixed names OMP does not send |
| Usage/quota card | OMP_SPECIFIC_EXTRA_NOT_NEEDED_FOR_CORE_USE |
omp usage --json probe not ported; registry maintenance is manual-only |
| Self-update advisory | OMP_SPECIFIC_EXTRA_NOT_NEEDED_FOR_CORE_USE |
omp update probe not ported; registry agents are version-pinned by the index |
| Onboarding | OMP_SPECIFIC_EXTRA_NOT_NEEDED_FOR_CORE_USE |
generic add-agent + auth guidance covers install/sign-in; OMP-specific wizard panels are a convenience |
| Transcript/project discovery | GENERIC_V2_ALREADY_COVERS |
live session/list: 29 real sessions with title/updatedAt/messageCount |
| Session import | GENERIC_V2_ALREADY_COVERS |
live session/load; deterministic thread mapping. Caveat: OMP replays user turns only, so assistant history is not displayed after import (provider context is intact) |
| Session resume | GENERIC_V2_ALREADY_COVERS |
loadSession: true; activation prefers session/load |
/rename |
GENERIC_V2_SMALL_GENERIC_GAP |
live session_info_update {title} is consumed into provider-thread metadata but does not update the T3 thread title yet |
/fresh |
GENERIC_V2_SMALL_GENERIC_GAP |
live-proven id replacement; V2 drops foreign-session updates (see §5) |
| Approval handling | GENERIC_V2_ALREADY_COVERS |
client-boundary mediation; full-access auto-approves only when an allow option exists; otherwise fail-closed cancel/reject. Registry args are fixed (omp acp), so T3 runtime modes no longer map to OMP --approval-mode flags; OMP’s own default approval policy applies and T3 mediates the prompts |
| Subagents | OMP_SPECIFIC_EXTRA_WORTH_PRESERVING |
generic ACP capabilities set supportsSubagents: false; OMP task tool calls would render as plain tool calls (no Agents panel). A generic ACP Task-tool projection would cover this |
| Images | GENERIC_V2_ALREADY_COVERS |
live promptCapabilities.image: true; V2 sends image blocks when negotiated |
| Cancel | GENERIC_V2_ALREADY_COVERS |
session/cancel implemented; live no-op path verified, mid-turn cancel unproven |
| Web | GENERIC_V2_ALREADY_COVERS |
standard registry provider UI |
| Mobile | GENERIC_V2_ALREADY_COVERS |
mobile ProviderIcon handles driver acpRegistry + registry iconUrl |
| Unattended text generation | GENERIC_V2_ALREADY_COVERS |
excluded by design; hardening becomes irrelevant (see §7) |
| Terminal ANSI cleanup | GENERIC_V2_SMALL_GENERIC_GAP |
live: /context output arrives as agent_message_chunk with raw ANSI escapes; no stripping in V2 |
session/load failure behavior |
GENERIC_V2_ALREADY_COVERS |
bounded load with idle-gap + timeout and typed errors; invalid ids surface as failed import/turn rather than hanging |
No row required ACP_PROTOCOL_CANNOT_EXPRESS; OMP’s limits that also existed in #11973 (no conversation rewind; skill files not openable) stay provider-side.
5. /fresh (required small generic fix)
Live event shape, captured on the wire:
- Client sends
session/prompttargeting session A. - Before the prompt response returns, OMP emits
session/updateunder a new session id B (agent_message_chunk: “Fresh provider session started (1 provider state pruned).”). - The
/freshprompt response is a normalend_turn; all subsequent updates for the thread arrive under B. - B is not an addressable ACP session:
session/prompton B fails withUnsupported ACP session,session/loadon B fails withACP session not found. A remains the persistent, loadable session (with the title from/rename).
V2’s AcpSessionRuntime currently returns early for any update whose sessionId differs from the started session (notification.sessionId !== startState.result.sessionId), with no adoption mechanism, so after /fresh a V2 thread goes silent. #11973 solved this with an opt-in adoptAgentSessionIdChanges (and deliberately kept the replaced id in memory only, never persisted as the resumable native id, because B is not loadable).
Minimal generic delta (no if provider === "omp"):
apps/server/src/provider/acp/AcpSessionRuntime.ts: an opt-in flag + an adopted-id set; forward updates for adopted ids (schema-compatible with the feat(omp): integrate Oh My Pi provider on current main #11973 patch, ~40 lines).apps/server/src/orchestration-v2/Adapters/AcpRegistryAdapterV2.ts: enable adoption for registry instances and expose the live id in provider-thread metadata for diagnostics; do not change the resumable native ref.- If upstream wants strictness, key the opt-in off instance settings (an advanced registry toggle) rather than a hard-coded agent id, since child sessions on other agents (Devin/Grok) must keep being dropped.
6. Session import / discovery
session/list against a real OMP project returned 29 sessions with titles and timestamps, and session/load replayed a six-message session as user_message_chunk updates plus available_commands_update and session_info_update. OMP does not replay assistant messages over ACP in this build, so an imported T3 thread shows the user side of the history while the provider session itself keeps full context for continuation. That is the only user-visible delta versus the bespoke transcript scanner, and it is OMP-side behavior, not a V2 defect. The bespoke scanner is consequently technical debt we can drop.
7. Security
- Unattended text generation never touches registry agents. The registry driver implements an unsupported
TextGenerationservice and advertisessupportsTextGeneration: false, so commit/PR/branch/title generation can never auto-approve tools through this path. The feat(omp): integrate Oh My Pi provider on current main #11973always-ask --no-toolshardening is obsolete on the V2 strategy (it only mattered for the bespoke OMP text-generation path). - Fail-closed mediation. Full-access auto-approves only when the agent offers an allow-once/allow-always option (otherwise cancel); deny selects a reject option (otherwise cancel); unknown elicitation modes decline; client-mediated fs/terminal go through canonical-containment policy checks; approval-required threads keep asking at the T3 boundary.
- Boundary honesty. As the V2 docs state, ACP cannot confine tools the agent runs inside its own process; the enforcement point is
session/request_permissionplus T3’s own handlers. OMP’s default approval mode (as launched by the registry entry,omp acp) is what generates those prompts; T3 no longer injects--approval-modeflags, which is a behavior change but not a safety regression against the documented contract.
8. Maintenance comparison
| Option | T3 files | OMP-specific files | Est. lines | Upstreamable | Drift / conflict | OMP-version burden | Coverage |
|---|---|---|---|---|---|---|---|
| A. Keep #11973 | 71 | 43 (6,460 test lines; ~5.4k prod) | +13,535/−186 | Explicitly declined | Large shared-surface conflicts (composer, contracts, ingestion, desktop) | Per-main rebase + OMP CLI/RPC probes per release | Full, incl. nice-to-haves |
| B. V2 as-is | 0 | 0 | 0 | n/a | none | ACP only | All core except /fresh breaks the thread; ANSI noise |
| C. V2 + small generic fixes | 1–3 | 0 | ~40–120 | Yes, generic | Low | ACP only | Full core; subagents remain plain tool calls |
| D. Wait for V2, then registry metadata only | 0 | 0 | 0 (entry external) | n/a | none | ACP only | Same as B |
The registry entry itself is external metadata (agentclientprotocol/registry), not T3 code, and is required in every V2 option today: OMP has no entry in the official index (41 agents; closest is the unrelated pi-acp shim), and commandPath cannot bypass membership.
9. Verdict
Primary strategy: USE_GENERIC_ACP_V2_WITH_SMALL_GENERIC_FIXES.
Why: the generic registry already expresses everything that matters for core OMP use with zero provider-specific T3 code. Live, zero-inference probing showed exact model slugs, thinking ladders, modes, ~80 commands, session list/load/close, and the full ACP handshake working through the same code path T3 V2 will drive. The only blocking behavioral defect is session ID replacement after /fresh; ANSI noise and the /rename title projection are small generically-useful extras.
Exact missing capabilities:
/freshsession replacement is dropped by V2’s runtime (must fix).- ANSI escapes appear in ACP display text (optional small fix).
session_info_update.titleis stored but not projected to the thread title (optional small fix).- Subagent/
taskpresentation has no generic ACP projection (deferred; nice-to-have). - OMP is absent from the official ACP Registry (external metadata, mandatory for any V2 path).
Minimum source delta: the adopted-session-id support in AcpSessionRuntime plus its wiring in AcpRegistryAdapterV2 (roughly 40–120 lines total, generic, no provider-name branches). Optionally a shared ANSI strip for ACP display text and a provider-sourced thread-title projection.
What becomes obsolete in #11973: OmpAdapter/OmpProvider/OmpDriver, OmpAcpSupport, OmpModelCatalog, OmpCommands, OmpSkillDispatch, OmpUsage, OmpMaintenance, OmpTextGeneration, OmpAnsi, the OMP composer argument-completion and onboarding/update cards, plus the OMP-specific shared-surface edits (contracts, settings, web, mobile icon, ingestion title change, docs). These are ~5.4k production lines plus ~6.5k test lines and 28 shared files of conflict surface.
Worth salvaging separately (as small generic changes, not OMP code): the adopted-session-id runtime behavior, ANSI stripping for ACP display text, explicit agent-rename precedence for thread titles, a generic ACP Task-tool subagent projection, and the session/load-failure hardening (already effectively subsumed by V2’s load timeout).
10. Exact next implementation task (after this decision)
- Freeze feat(omp): integrate Oh My Pi provider on current main #11973. No further polishing; do not mutate the branch.
- Draft an official ACP Registry entry for OMP (agentclientprotocol/registry PR): id
oh-my-pi, name “Oh My Pi”, authors/license/repository fromcan1357/oh-my-pi, a 16×16currentColoricon, and a binary distribution using the rawv18.2.3release assets (omp-darwin-arm64,omp-darwin-x64,omp-linux-arm64,omp-linux-x64,omp-windows-x64.exe) withcmd: "./omp",args: ["acp"], and SHA-256 values fromSHA256SUMS.txt. The npm package@oh-my-pi/pi-coding-agent@18.2.3is a valid fallback but its CLI shebang is#!/usr/bin/env bun, so the binary distribution is the safer registry form. - Prepare the small generic patch to bring once feat(orchestrator): introduce new orchestrator #2829 lands (or as a reviewable follow-up): adopted-session-id forwarding in
AcpSessionRuntime+ registry adapter wiring, with an opt-in that does not flatten child sessions; optional ANSI strip andsession_info_updatetitle projection. - Re-run this zero-inference probe matrix against OMP 18.2.3 with the local binary updated on the operator’s schedule, and add a live registry-path probe using an isolated test registry (
registryUrltest injection +commandPathpointing at the real binary) before enabling the provider.
Oh My Pi ACP Registry entry — implemented upstream (registry PR open)Follow-up to the compatibility verdict above: the registry-metadata implementation now exists as a real upstream contribution. Registry use only — no changes to Refreshed basis (2026-09-17 ~18:24Z)
Entry
Validation performed
Dependency (unchanged)Once PR #613 merges, OMP becomes discoverable/provisionable by any ACP-registry client with no client-specific code. The T3 side still depends on #2829 (Orchestrator V2) landing on |
…heirs (#1438) Upstream has its own Oh My Pi and Pi work — two open PRs for omp (pingdotgg/t3code#11973, #10893) and a closed set for pi (#10474, #5688, #9648, #4355, #2800; #7211 merged into an upstream feature branch as an orchestration-v2 adapter) — and upstream main carries neither today. All of them claim the same paths and the same `omp` / `pi` driver kinds our drivers use, down to the `placeholder: "omp"` in OmpSettings, so the sync that brings one in collides in our files rather than adding a second provider. Each driver page gains the section that says so and what to do: keep ours, drop upstream's arm at every shared registration point (two `omp` keys in one object is a type error at best; two `case "omp"` branches compile and run the first), and treat anything upstream does better as its own PR. The deliberate divergences are named — our `omp-default` sentinel in DEFAULT_MODEL_BY_PROVIDER has no counterpart in #11973, and our quota fold lives in ompUsage.logic.ts rather than their Drivers/OmpUsage.ts. Both ledgers get the clause that points a merge resolver at it. Docs only; no behavior change. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Root-session replacement slice — completion checkpoint (generic V2)Architecture: Refs
Changed files (6, +609/-5)
Adoption design (generic, default strict) Durable vs live id Child-session safety Live zero-inference proof (real omp 18.2.4, zero model prompts)
Tests / validation
#2829 base failure (classified, pre-existing) Remaining dependencies
|
|
Thanks for the PR. We're not taking changes to the orchestration and provider layers right now: that part of the server is being rewritten for V2, and merging into the current code would either conflict with or be thrown away by that work. Closing for now. If this is still an issue once V2 lands, please reopen (or open a fresh PR against the new code) and we'll take a proper look. |
feat(omp): integrate Oh My Pi provider on current main
Candidate head:
4f9419b72bb92bebc6669dd95f345e1ccdf4bced(draft;mergeable=MERGEABLE)What this is
Oh My Pi (
omp) as a first-class provider, driven through its ACP server (omp acp). The implementation is the 18-commit #11791 chain (14ed34f4e2…tip into5766179dbroot), integrated and refreshed on top of currentmain.$lists omp's skills and/lists its commands (machine catalog plus liveavailable_commands_update), including plugin and project commands.usage_updatefeeds the context meter with omp's own window size; Compact runs/compact.omp usage --jsonand shows the authenticated accounts.session/load./rename. omp's session title becomes the thread title, explicitly overriding client-generated titles; manual T3 titles stay authoritative (expected-title/version guard in the decider)./fresh. omp swaps its provider session id on the same connection; the runtime adopts the new id instead of going silent.[soft|remote|snapcompact]; the composer offers those choices.Current-main reconciliation
mainadvanced from87a12b53f(the candidate's original base) through 57 upstream commits to71d12d8c4, including heavy changes to shared OMP integration surfaces. Two merges bring current main in:76a24510e— merge of901db8966(54 commits):ProviderRuntimeIngestionrewrite, decider changes, web composer/command palette work, mobile architecture.4f9419b72— merge of71d12d8c4(3 commits): rich-text composer default (Lexical → Tiptap), keybindings search, PR avatar fallback.Semantic resolutions (current main owns the architecture; OMP behavior re-expressed on current APIs):
AcpSessionRuntime.ts: kept OMP agent-session-id adoption (/fresh) alongside main's newassistantUpdatesOpenRefassistant-chunk gate — both conditions coexist.ProviderRuntimeIngestion.ts: OMP explicit-rename (nameIsExplicit) condition preserved inside main's rewritten pipeline, together with main'sexpectedTitle/expectedVersionconcurrency guard — no stale/replayed rename inversion.ComposerPromptEditor.tsx: main's Tiptap replacement taken wholesale; the OMPskill://guard (isOpenableSkillPath, no "View instructions" for internal skill URLs) was re-expressed inComposerPromptEditorTiptap.tsx, with its unit test restored.README.md,docs/user/install.md,settings.ts(.test),acp-mock-agent.ts,composer-logic.ts(.test),CommandPalette.tsx,Sidebar.tsx,ChatComposer.tsx: both sides coexist with no loss; verified by suites and typechecks.OMP compatibility (verified against current stable)
a2d83061c5d673bf3ee495d7652b63ee5a0ceb14(updates from 18.0.5/18.2.1 viaomp update).initialize(oh-my-pi 18.2.3, auth methodagent,loadSession, fork/close/list/resume),session/new, model + thinkingset_config_option,available_commands_update(46 entries incl.skill:),/context,/rename(+session_info_update),/fresh(session-id adoption observed),/compact, idle cancel (0 ms),session/loadresume (same session id), elicitation decline viaelicitation/create(declined,end_turn, no model output), provider snapshot (version/auth/models/grouping/usage), bounded usage probe.Hardening (kept, verified in this head)
omp acp --approval-mode=always-ask --no-tools, plus permission cancellation, elicitation decline, and unknownelicitation/createdecline. Live proof on 18.2.3: exact spawn args accepted,/contextshows no tools in the session, zero permission/elicitation requests. Interactive provider semantics unchanged.omp usage --jsoncarries a 10 s bound (version probe stays 4 s; ACP turn timeout, commands/model discovery, and update-check bounds unchanged).Verification
git diff --check: clean. Commits pass the repovp fmthook.Remaining (Codex-quota-gated)
Successful streamed assistant generation, approval-driven tool execution, subagent execution, and cancelling an in-flight model turn remain unproven until the Codex quota resets (approximately 2026-09-19T17:18:32Z). Everything around inference was exercised live without consuming a model turn.
Kept draft. Not marked ready for review.