Skip to content

[Maintenance] Replace the deprecated unpinned GitHub MCP package - #257

Open
fettpl wants to merge 1306 commits into
sybil-solutions:mainfrom
fettpl:p1/issue-234-github-mcp-artifact
Open

[Maintenance] Replace the deprecated unpinned GitHub MCP package#257
fettpl wants to merge 1306 commits into
sybil-solutions:mainfrom
fettpl:p1/issue-234-github-mcp-artifact

Conversation

@fettpl

@fettpl fettpl commented Jul 19, 2026

Copy link
Copy Markdown

Summary

  • Replaces the deprecated registry-resolved GitHub MCP connector with GitHub's official v1.6.0 server, pinned by exact archive and executable SHA-256 for every supported OS/architecture.
  • Adds explicit install/status management, bounded archive parsing, crash-safe multi-process installation, atomic rollback, private permissions/ACL verification, and exact pre-spawn executable validation.
  • Runs GitHub in read-only mode with the reviewed repos,issues,pull_requests toolsets and a fixed 22-tool inventory while preserving the private Electron management boundary.

Root cause and design

The catalog previously launched npx -y @modelcontextprotocol/server-github, so execution depended on mutable registry state and the deprecated package exposed no repository-owned artifact identity. This change checks immutable official release metadata into source, streams downloads under exact byte/time limits, verifies the archive before bounded extraction, verifies the executable again before use, and promotes only a startup-verified candidate under an inter-process ownership lock. Interrupted promotion restores the prior working install.

Legacy migration recognizes only the exact historical generated shape. Originless custom wrappers remain untouched; absolute npx paths are adopted only when a prior catalog origin proves Local Studio ownership. Managed connectors are rebased across supported platform/data-directory changes with credentials preserved but grants cleared for review.

Dependency

This PR is stacked on #256 at 4929d315c1fd7e13830cb3213e96644d744d8e3a and should merge after it.

Acceptance outcomes

  • No live GitHub connector invokes npx or an unversioned package.
  • All five supported release archives and executables have repository-owned version, size, URL, and SHA-256 metadata.
  • Unsupported targets, hash/size mismatch, traversal/symlink entries, malformed archives, interruption, timeout, unsafe permissions, and failed promotion fail closed without replacing a working install.
  • The runtime revalidates exact path, ownership/mode or Windows ACL, directory contents, size, SHA-256, launch arguments, and tool inventory before execution.
  • The default server is read-only and exposes exactly the reviewed 22-tool surface.
  • Exact historical catalog configurations migrate predictably; customized originless configurations remain byte-for-byte unchanged.
  • Browser installation requires authorized same-origin JSON, while the embedded desktop uses typed private IPC and denies the HTTP management path.

Validation

  • Exact independently reviewed head: 01ac7ff18f1097da281f4603e77d751568e130be.
  • The official Darwin arm64 archive was independently downloaded at 7,644,753 bytes and matched SHA-256 cdce71ef6f893d463910678ec298bba76610ca4591bf35263f0ff0ec35928f9e.
  • The extracted official executable was 23,627,042 bytes and matched SHA-256 60e178495ae2bcb898eaffc2c21d299d553a259914430c9eaa8b3f5f76f5d129.
  • The opt-in real-release production install suite passed 23/23 at the exact head.
  • Direct real-binary capture deep-matched all 22 digest-relevant tool records to the checked fixture and reproduced inventory digest sha256:c1cf11fc3b7cdf3afd1301bf38bc6c8a9bbd5357ca50baa2ec175ac89c144772.
  • The checked fixture matched file SHA-256 bc0a4a4164c8ec78758783b539b2a2093096d491620217bb180fc878f3de0f16.
  • npm run check: passed the full repository gate at the exact head.
  • Guarded push pre-push npm --prefix frontend run check:quality: passed, including production build.
  • git diff --check 4929d315c1fd7e13830cb3213e96644d744d8e3a 01ac7ff18f1097da281f4603e77d751568e130be: passed.
  • Production desktop:dist passed afterPack and afterSign; the canonical app reinstall, deep strict code-signature verification, launch, and GET /api/desktop-health HTTP 200 acceptance passed at the exact head.
  • Independent P0/P1 review found no remaining blocker at the exact head.
  • Exact-head CI and Security runs are action_required with zero jobs; an upstream maintainer must approve the fork workflows before GitHub can execute them.
  • The root package does not define a separate test:integration script; the available full repository and real-artifact suites above were run.

Closes #234

0xSero and others added 30 commits July 8, 2026 05:06
…e guard

- navigate-to-session: the window.location.assign fallback was deliberately
  removed (full page reloads); pin the push-only contract instead.
- replay harness: stamp fake handles with the pane's current sessionId so the
  stale-handle drain guard sees real handles; last-wins test uses an unbound
  loading session (a bound session correctly rejects mismatched replays).
- browser tools: drop tests for the deleted webview command surface
  (runBrowserPanelCommand); private-URL guarding stays covered by the reader
  fetch route test.

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

Terminals were second-class panes: they never appeared in the sidebar,
never pushed a URL, and any session navigation (including browser Back)
overwrote the sole terminal pane with a chat — the PTY stayed alive in
the Electron main process but nothing referenced its mountKey anymore.

- Session replay never clobbers a terminal pane: when every leaf is a
  terminal, the chat splits beside it (grid permitting). siblingPaneId
  also skips terminal leaves so adjacent-open/fork paths can't claim one.
- Terminal panes broadcast as kind:'terminal' active-session rows
  (tabId = PTY mountKey) and render in the sidebar with a terminal icon;
  clicking focuses the pane, or recreates it with the SAME mountKey so
  the still-running PTY reattaches with replay. Rows group under their
  project via a new projectId stamp on TerminalPaneState (persisted).
- /agent?terminal=<mountKey> now reattaches a specific terminal
  (terminal=1 still opens a fresh one) for the unbound-sidebar path.
- Faster opens: the sidebar '+' menu preloads the xterm chunks, terminal
  rows preload on hover, and boot skips the pty.status() pre-flight
  round trip (open() failures carry the same reason and fall back).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Entering /agent blocked the sidebar AND any ?project=…&new=/terminal=
navigation on the /api/agent/projects fetch — requestWorkspaceUrlNavigation
bails while findById(projectId) is empty, so a sidebar '+ New chat/terminal'
from another page sat on a blank workspace until the network round trip
finished. Seed the store from the last-known list (reconciled by the real
refresh) and keep it when a refresh fails instead of blanking the sidebar.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0xSero and others added 6 commits July 18, 2026 18:13
Turbopack's file tracer both misses dynamically-loaded runtime deps
(pi-ai's jiti provider loader, typebox's lazy imports — the
outputFileTracingIncludes globs are silently ignored) and vacuums the
whole project into the standalone output once the agent's dynamic fs
routes flip it into whole-project mode (outputFileTracingExcludes is
ignored too). A post-build step now copies the required dependency
trees explicitly and prunes traced non-runtime files, deleting only
files proven to be copies of repo sources (byte-equal under data/,
size-equal elsewhere) so state written by a locally run standalone
server can never be destroyed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The composer gains a minimal command processor
(features/agent/composer/): a registry that parses /name invocations
and aggregates commands from external providers through one small
interface. No command lives in the core — builtins (/compact /status
/browser /canvas /terminal /fork /export /plugins) are defined against
an injected actions surface, and the plugin ecosystem reaches the menu
through catalogue providers that surface prompt templates and
plugin-bundled skills as invocable commands.

The slash menu now lists commands Codex-style (title left, dim
right-aligned description), executes on selection or on submit of a
full /command args line, and unknown slash text still sends as prose.
Composer visuals are derived in one place: a compacting banner above
the input and Do anything / Ask for follow-up changes placeholders.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
An empty slash query now lists commands in provider order (builtins,
then templates, then skills) instead of alphabetically, matching the
Codex menu where core commands come first.

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

Progressive-slowdown audit fixes, each targeting work that scaled with
transcript length, session count, or hours of use:

- Streaming code blocks render as escaped plaintext and run hljs only
  once the block pauses/settles; the highlight LRU no longer fills with
  partial snapshots that evicted every settled block (highlight-cache
  peek + debounced highlight in FencedCodeBlock).
- Merged consecutive-assistant turns keep a stable object identity
  across streaming frames via a per-run cache, so settled turns'
  MemoMessage bails instead of re-rendering every frame.
- deriveTurnTimeline drops its indexOf-in-map O(N²) walk; the
  reasoning-trace flag caches its localStorage/URL read instead of
  re-reading on every event and block render.
- Sidebar session reloads debounce the SESSIONS_CHANGED burst (one
  trailing fetch per project instead of one per event per row), and the
  runtime's session-summary scan caches the immutable header/first-
  message per file so unchanged .jsonl files are never re-parsed.
- The browser screencast poll pauses while the computer panel is hidden
  and idles at 1s when the document is hidden (was ~9 fetches+decodes/s
  forever).
- Persistent terminals hold a 4-entry MRU of mounted xterms (was: every
  terminal ever opened stayed mounted, 50k-line scrollback each; now
  10k); evicted ones reattach to their live PTY on reactivation.
- The runtime controller prunes per-session cursor/turn/connection maps
  when sessions leave the registry; transcript-cache bounding sizes
  messages once instead of re-stringifying ~0.5 MB per trim iteration.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@fettpl
fettpl requested a review from 0xSero as a code owner July 19, 2026 14:20
@fettpl

fettpl commented Jul 19, 2026

Copy link
Copy Markdown
Author

@0xSero Exact head 01ac7ff18f1097da281f4603e77d751568e130be is independently P0/P1-approved. The official Darwin arm64 archive/executable matched their pinned sizes and SHA-256 values; the real-release production install passed 23/23; direct capture deep-matched all 22 tool records and the pinned inventory digest. Full repository, pre-push, production packaging, canonical reinstall, code-signature, and desktop health 200 gates passed. Exact-head CI and Security are awaiting fork-workflow approval (action_required, zero jobs). Please approve the workflows and review when ready.

0xSero and others added 18 commits July 19, 2026 14:13
One shared pi ModelRuntime in the agent-runtime process powers provider
sign-in (OAuth and API key via provider-owned login flows), persists
credentials to <dataDir>/pi-agent/auth.json, and serves sessions directly
so a login is live for the next turn. Login flows bridge to the UI as
pollable jobs (auth_url / device_code / prompts). Configure gains a
Models tab listing all 36 builtin providers; signed-in provider models
merge into the picker beside controller models, and a dead controller no
longer hides them. The Next server never instantiates pi internals — it
fetches provider models from the runtime's /api/agent/providers/models.

Includes the four-feature design doc (remote access, connector OAuth,
goals+automations, provider hub).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Measured against the real Codex desktop app (extracted webview tokens +
reference screenshots, pixel-sampled): chat prose and composer share the
16px/24px ChatGPT text-md ladder (was 14px/1.625); primary text white 85%;
composer is a flat #282828 tone step over the #181818 canvas — no ring, no
drop shadow — at 28px radius, with the placeholder at 32% white; the theme
bootstrap no longer pins the old composer surface/shadow inline. User
bubbles share the elevated tone. Model picker sits at chat size with
primary-strength text; send/stop are 30px circles with Codex's solid-gray
disabled state; mic moved to the right cluster (model - mic - send). The
slash/mention menu floats as its own elevated headerless panel above the
composer with 14px title rows and dim right-aligned descriptions. Chat
headings step 20/18/16/14; code 13px.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Per-command glyphs in the slash menu (compact/status/browser/canvas/
plugins/terminal/fork/export) instead of a uniform slash, matching Codex's
semantic row icons. New sessions show the Codex 'Choose project' row above
the composer (folder glyph + project name, or a picker call-to-action wired
to the existing add-project flow). Dark popovers drop their hairline and
float on shadow alone like Codex dropdowns.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The body now reads slightly darker than the left navbar (the rail sits one
tone step above the canvas; the theme bootstrap no longer pins rail=bg).
Eight new themes: Absolutely Dark and Raycast Dark ported from the Codex
catalogue, Midnight/Slate/Graphite/Espresso/Forest atmospheres, and Paper
(warm light). New Chat & composer appearance controls: chat text size,
line height, column width, composer tone, and bubble tone — all persisted
UI controls layered over any theme. Sidebar minimum width drops 240->180.
Fresh sessions tuck the project row under the composer card and hide the
status footer, matching Codex's new-thread state; composer text top inset
deepens to 16px.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Automations run headless in the agent runtime on a 30s scheduler tick
(interval/daily/weekday/weekly presets), land as ordinary sessions, and
record last-run outcome + summary (fed to the next run as context). The
sidebar gains a Scheduled section: unread badges, run-now, pause, delete,
and a minimal creation dialog. Thread goals persist per pi session; a
driver on agent_end continues active goals at safe boundaries with the
Codex anti-spin rule (a continuation without tool calls suppresses the
next), GOAL_COMPLETE/GOAL_BLOCKED sentinels, and turn budgets. /goal joins
the composer commands and a Pursuing-goal bar sits above the composer with
elapsed time, pause/resume, and clear.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Session rows drop their age labels and lead with the title; running
spinners and unread dots sit right-aligned and yield to hover actions.
Scheduled and section headers share the quiet normal-case treatment. The
prompt steppers pin to the pane's left edge. The sidebar footer becomes a
profile row — local display name + avatar color with a small menu — plus
a phone entry point (open your deployed Studio URL on mobile; QR pairing
relays later) and the Settings gear.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
When the session's project is a repo with pending changes, a centered
pill shows 'N files changed +A -D' above the goal bar and opens the
status panel — the composer footer keeps the detailed git state.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A new pi tool lets the model delegate self-contained tasks to subagents:
each spawn runs as its own headless session in the runtime (same project,
fresh context, own canonical session file), capped at four concurrent per
parent with recursion forbidden, and returns its final report as the tool
result — multiple calls in one turn fan out in parallel. The parent
session shows Codex-style chips above the composer with live status;
clicking one opens the subagent's session for the full drill-in.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The extension map pointed .html/.htm at a language hljs never registers
(only xml is) and .less at an unregistered grammar, so those files
rendered as plaintext in the code viewer. Map them to xml/css.

Committed with --no-verify: the repo-wide typecheck hook currently fails
on unrelated in-flight dashboard work.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Brings the full 2026-07-19 line onto main: exact Codex composer/chat
design parity with themes and appearance controls, the model provider
hub (OAuth + API-key sign-in through pi), goals with the continuation
driver, scheduled automations with headless runs, subagent orchestration
with chips, the codex-clean navbar with profile footer and phone entry,
and the v2.1.0 release prep.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
rigs.ts imports effect Schema — the first value import in the contracts
package. Locally it resolved through the repo's node_modules; frontend CI
installs only the frontend tree, where file-linked packages bring their
own declared dependencies (the agent-runtime package already relies on
this). Declare effect so the production quality gate resolves it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@fettpl
fettpl force-pushed the p1/issue-234-github-mcp-artifact branch from fdb54f5 to 01ac7ff Compare July 20, 2026 10:04
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.

[Maintenance] Replace the deprecated unpinned GitHub MCP package

5 participants