Skip to content

Merge upstream CodexBar 0.49.3 - #2

Merged
proxynico merged 639 commits into
mainfrom
codex/upstream-0.49.3-protected
Aug 14, 2026
Merged

Merge upstream CodexBar 0.49.3#2
proxynico merged 639 commits into
mainfrom
codex/upstream-0.49.3-protected

Conversation

@proxynico

@proxynico proxynico commented Aug 13, 2026

Copy link
Copy Markdown
Owner

Summary

  • Merge the exact upstream stable tag v0.49.3 (build 117); exclude the 69 later commits currently on upstream main as of the final freshness check.
  • Preserve fork contracts: disabled self-updater, fork-only publication, no-prompt Keychain access, Claude OAuth -> Web -> CLI routing, compact Claude menu behavior, and typed PTY shutdown lifecycle.
  • Make the upstream remote fail closed for pushes (origin push URL must be DISABLED) and enforce that boundary in make check.

Verification

  • make check — passed; SwiftLint reported 0 violations across 1,853 files, docs reported 219 valid local links, and fork publication policy passed.
  • make test — passed 845 selections in 71 groups; 0 failed groups, retries, recoveries, or timeouts.
  • swift build -c release — passed.
  • Focused protected-contract tests — 40 tests in 3 suites passed.
  • Final integration re-review — no blockers.

Scope and limitations

  • This PR intentionally targets the stable release tag, not moving upstream main.
  • The app bundle was not installed or relaunched; validation used CLI tests, policy checks, and a production build to avoid live account or Keychain prompts.
  • Existing uncommitted Buy Credits changes in the original local main checkout were left untouched and are not included.

steipete and others added 30 commits August 2, 2026 20:44
Replace repeated macOS process-inspection subprocesses with scoped libproc and sysctl calls while preserving the Linux ps, lsof, and /proc paths. Add defensive PROCARGS2 parsing and self-process integration coverage to harden steipete#2267.

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
…teipete#2604)

Root Package.resolved moved ahead of the widget workspace copy, so
Scripts/package_app.sh release failed at the widget step with an
out-of-date resolved file error. The script's failure handling was
verified correct (non-zero exit, no stale bundle produced).

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* refactor: consolidate provider bootstrap manifests

* refactor: derive provider icon styles from descriptors

* refactor: derive provider ancillary registrations

* refactor: derive widget provider metadata

* test: enforce provider widget metadata sync

* docs: simplify provider authoring workflow

---------

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
…te#2608)

Four fixes from live multi-Mac testing:
- CKRecord rebase crash: allKeys() includes encrypted field names; routing
  them through the plain subscript threw NSInvalidArgumentException and
  crash-looped every receiver applying fetched records (regression test).
- Fetch-before-push on first sync: a fresh device now applies fleet state
  before composing pushes, so its editCount-1 records can't win conflict
  ties and clobber the fleet.
- Persist remote applies: applyExternalConfig skips disk writes by design
  (reload path); sync applies now schedulePersistConfig so config.json,
  the CLI, and the next launch see the merged result.
- Dirty-set push gating: startup no longer wholesale-uploads local config
  (a relaunched stale Mac degraded the richest Mac's config twice in
  testing). Providers push only when locally edited (persisted dirty set,
  cleared on save success), with an empty-fleet bootstrap seeding path.

Verified live: three-Mac convergence (golden profile incl. E2E-encrypted
secrets propagated to two receivers; source unchanged; fleet devices and
snapshots visible everywhere; no-account Mac degrades gracefully).

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tAuthorised (hardcoded switchAgent) (steipete#2533)

* fix(alibaba-token-plan): personal requests rejected with Workspace.NotAuthorised

The Personal/Solo path hardcoded `switchAgent: 1_233_135` in the
`cornerstoneParam` request body. The gateway binds that value to a specific
account's workspace, so for any other account the call is rejected with
`BailianGateway.Workspace.NotAuthorised` even though the outer envelope
claims `code: "200"`. Omitting the field lets the gateway resolve the
session's default workspace.

Also:
- Resolve `sec_token` best-effort for personal requests (the browser always
  sends it; some accounts are rejected without it) and append it to the body
  when available, mirroring the Teams path.
- `throwIfErrorPayload` now reads `errorCode`/`errorMsg` from the nested
  frame that carries `success: false`, so the real gateway error is surfaced
  instead of a misleading "API error: 200". Authorization-family errors map
  to `invalidCredentials` so the UI prompts for re-authentication.

Fixes steipete#2500. Verified live against the mainland Personal/Solo API and covered
by new regression tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: preserve Alibaba personal sessions

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
* Add Notion AI provider

Tracks the two usage-allowance windows Notion shows in Settings > Notion AI >
Usage: the rolling 6-hour window and the billing-period window. Notion begins
enforcing the allowance on 2026-08-03; before then the same endpoint already
returns real numbers with "enforcement": "preview".

Reads two cookie-authenticated endpoints on app.notion.com that the Notion web
app itself calls: getSpaces for account identity and workspace plans, and
getCreditRateLimitStatus for the allowance. Only Business and Enterprise
workspaces carry one; anything else reports not_applicable as a clear error
rather than an empty gauge.

The imported cookie header is persisted through CookieHeaderCache. Chromium
cookie reads are gated to user-initiated refreshes to avoid a Keychain prompt,
so without a cached header the provider fails on every background refresh and
reports "no cookies found" while the session is valid. Cookies are also
de-duplicated by name across the Notion domains, since a stale token_v2 left on
the legacy notion.so alongside the live one would otherwise send both.

Every field of the rate-limit response is optional, so an unrelated 200 body
decodes cleanly into an all-nil status. The parser rejects a payload carrying
neither window, and a window with no usable limit is omitted rather than
reported as 0% used.

Adding the .notion debug-log case tipped UsageStore.debugLogText past the
cyclomatic-complexity cap, so .openai and .azureopenai are folded into one case;
both already call the same apiKeyDebugLine helper.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(notion): harden cookie session handling

* test: isolate widget snapshot persistence

* feat(notion): pace both allowance bars and honor CLI provider settings

The billing-period window is scored against the real calendar month ending
at its reset rather than a flat 30 days, and the rolling window gets the
session-pace treatment on both the card and in `codexbar usage`.

Notion reports only `periodEndMs` for the billing period, so the snapshot
carries the shared monthly sentinel and the descriptor declares
`.calendarMonthResetWindow`. Resolution then substitutes the true cycle
length. Three paths scored these windows without resolving first --
`UsageStore.weeklyPace` (menu-bar pace token, "runs out" text, predictive
pace warnings) and `resetWindowPaceDetail` when handed a precomputed pace
-- so a February cycle read 6% expected at 0% used and a 31-day cycle lost
its pace token for a day. Both now resolve, which also fixes the eight
other providers that carry the same sentinel.

The CLI ignored the Notion settings snapshot entirely, so Workspace ID, a
manual cookie header, and the `off` source had no effect on `codexbar`.

Also drops a rolling window length that parses to exactly the monthly
sentinel (`30d`, `720h`, `43200m`), which would otherwise be resolved as a
calendar cycle ending hours from now.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The AppIntents metadata processor in current Xcode rejects computed
caseDisplayRepresentations (must be a literal, exhaustive dictionary),
which broke the 0.47.0 release build. Titles are pinned to the
descriptor registry by WidgetProviderChoiceTests so providers cannot
drift silently.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…pete#2440)

* Add scoped-weekly (Fable) percentage as a menu-bar layout token

Claude's model-scoped weekly carve-outs (the "Fable only" window from steipete#1851)
already show in the dropdown and in quota notifications, but the always-visible
menu bar could only show session, weekly, or automatic. This adds a scoped-weekly
token so the promo-window limit can sit in the bar.

- New PercentWindow.scopedWeekly, shown with an "F" prefix, selectable in the
  layout editor (palette, label, live and representative previews).
- scopedWeeklyWindow resolver matches the claude-weekly-scoped-* id prefix rather
  than a model name; when several are active it shows the most constrained one.
- The scoped-weekly percent is added to the icon-observation signature so a
  scoped-only change refreshes the title, mirroring weekly= and avoiding the
  stale-title problem from steipete#2300 and steipete#2299.
- Absent window renders the standard "–" placeholder; editor label localized.

Addresses steipete#2360.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Address review: label scoped-weekly token by active model

Codex flagged that the token hard-coded "F" / "Fable only" while the resolver
accepts any claude-weekly-scoped-* window and picks the most constrained, so a
non-Fable window could be shown under the wrong model label.

- scopedWeeklyNamedWindow now returns the NamedRateWindow.
- The .scopedWeekly token derives its prefix from the active window's title
  (first letter) and its accessibility text from the full title, instead of a
  fixed "F" / "Fable only".
- Carry the title through MenuBarLayoutRenderData and include it in the
  icon-observation signature, so a model change refreshes the title.
- Resolver test now asserts a non-Fable most-constrained window carries its title.

The editor palette label stays "Fable %" (a proper noun that reads the same across
locales); a generic name is left as a naming choice.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Add menu bar pace layout tokens

The 0.45 layout editor replaced the old Percent/Pace/Both display modes,
but no token exposes the signed pace delta the Both mode used to render.
`Runs out` is not a substitute: it answers when a window ends, always
estimating from the weekly (or automatic) lane, while pace answers how far
off the sustainable rate usage currently runs.

Add Session/Weekly/Auto pace tokens that mirror the percent tokens' window
selection and reuse the existing `MenuBarDisplayText.paceText` formatting
(`+11%` ahead of the rate, `-8%` behind, `0%` on pace). Each token resolves
pace for its own window, so Weekly pace never borrows the session delta.

Pace needs the store's historical dataset and work-day setting, so it is
resolved upstream like `runsOut` through a shared `menuBarLayoutPaceText`
helper that both the status item and the editor preview call. The existing
3% expected-usage floor in `weeklyPace` still applies, so a token renders
the en-dash placeholder early in a window while its siblings stay visible.

Refs steipete#2534

* Include layout pace tokens in the icon observation signature

Pace values change with the historical dataset, the work-day setting,
and the clock, none of which move the percent fields already hashed by
providerStoreIconObservationSignature. A historicalPaceRevision bump
therefore woke the icon observer but produced an unchanged signature,
so updateIcons() was skipped and a custom pace token kept its stale
value until an unrelated icon change forced a redraw.

Contribute the active layout's pace values to the signature the same
way cost and account tokens already do, gated on the layout actually
containing a pace token. The regression test renders two snapshots with
identical used percents but different resets: without this fix both
signatures were identical.

Refs steipete#2534

* docs: credit menu bar pace contributor

* fix: localize scoped weekly label

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Petr Kratochvíl <krato@krato.cz>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
* Add one-shot dashboard snapshot command

* Fix dashboard pricing refresh policy

* Honor Cursor source policy in dashboard

* test: dedupe cliExecutableURL helper after branch update

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ete#2617)

* feat: add provider plugin runtime

* feat: convert synthetic venice and crof to JS plugins

* test: prove JS provider parity

* docs: document provider plugin prototype

* fix: satisfy plugin runtime lint checks

---------

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: Shun Min Chang <ji394m6y7@gmail.com>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: haoli <haoli@local.dev>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: haoli <haoli@local.dev>
…ipete#2624)

* feat: add declarative provider detail model

* feat: render declarative provider details

* feat: bridge provider details from JavaScript

* feat: convert detail providers to JavaScript

* style: satisfy provider detail test lint

* fix: align z.ai plugin quota lanes

---------

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
* Add live OhMyPi agent session discovery

Detect running OhMyPi harness processes, correlate them with bounded session metadata, and expose normalized sessions through the existing CLI and menu paths.

* Address OhMyPi review correlation gaps

Resolve OhMyPi metadata per live process environment, reject stale records, and isolate directory scan budget so existing provider discovery remains intact. Add focused regression coverage and document the fail-closed behavior.

* Preserve existing session metadata during OhMyPi scans

Give OhMyPi its own bounded directory budget so Codex and Claude correlation remain available, with regression coverage for the shared-provider behavior.

* Preserve legacy session JSON compatibility

Add an explicit v2 session payload for OhMyPi while keeping legacy remote clients decodable, and document and test the negotiated fallback.

* Expose OhMyPi in local session JSON

Keep the documented local --json output complete while preserving the remote v2-first compatibility fallback for older installations. Update CLI help, focused protocol coverage, and session documentation to distinguish current local output from legacy remote responses.

* fix(sessions): preserve legacy JSON compatibility

* Correct session JSON protocol overview

* feat(sessions): unify Pi-family discovery

Co-authored-by: William Mitchell <wdmitchell.uk@gmail.com>

---------

Co-authored-by: William Mitchell <wdmitchell.uk@gmail.com>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
* fix: show cached spend while refreshing

Co-authored-by: hhh2210 <hzy2210@gmail.com>

* test: add cached spend refresh proof

---------

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: hhh2210 <hzy2210@gmail.com>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: haoli <haoli@local.dev>
* Centralize Codex priority pricing

* fix: define Codex Fast USD pricing

* test: split pricing expectation math for CI type-checker

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Bryan Font <bfont@me.com>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: Derek Zeng <zengzhuoxi@gmail.com>
* feat: extend plugin host and convert providers

* fix: align z.ai plugin credential routing

---------

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
* test: characterize provider instance identity

* feat: add provider instance identity seam

---------

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
…te#2642)

* feat: add user-installed provider plugins

* fix: broker owns plugin HTTP representation headers

Apply broker-owned Accept, Accept-Encoding, and Content-Type after
plugin-supplied headers so a plugin cannot relax the user-plugin
response boundary. Test transport gains configurable response headers.

* build: add reproducible sucrase bundle verification script

Regenerates and verifies Sources/CodexBarCore/Resources/Plugins/
sucrase-3.35.1.min.js from the official npm artifact (sucrase@3.35.1,
esbuild@0.25.8 pinned, IIFE browser bundle). Expected SHA-256
4d997e15b72cbc9ccf6e743c30c6eb48bf4533f6709852367b40766be5eba70b was
independently reproduced by the coordinator from the npm registry;
'check' mode fails closed on any mismatch.

* fix: gate user-plugin registry lookup for non-JavaScriptCore platforms

Linux CLI builds compile CodexBarConfig without the plugin runtime;
unknown plugin config entries are dropped with the existing warning,
matching the documented macOS-only plugin boundary.

---------

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
yuansaysay and others added 28 commits August 11, 2026 19:09
…t-balance

Restore OpenRouter balance in menu bar layouts
…story-noop-writes

Avoid rewriting unchanged plan history files
Fix menu bar layout chip drag by moving .draggable onto the label
…link-resources

Fix CLI resource loading through symlinks
@proxynico
proxynico merged commit 5e07c74 into main Aug 14, 2026
@proxynico
proxynico deleted the codex/upstream-0.49.3-protected branch August 14, 2026 07:30
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.