-
Notifications
You must be signed in to change notification settings - Fork 701
Not Dead Yet Release #487
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Not Dead Yet Release #487
Conversation
Update the 'resume.codex' checklist to support both MCP and ACP resume flows, including new parameters for UI enablement and install prompts. Add runtime resume prefetch plan logic for Codex ACP mode in registry UI behavior to improve session resume UX.
Delete cli/docs/bug-fix-plan-2025-01-15-athundt.md as part of documentation cleanup or because the plan is no longer needed.
- Read HAPPY_ACP_PROBE_TIMEOUT_MS and per-agent overrides\n- Increase default probe timeout to reduce false negatives\n- Emit a status message when Codex/OpenCode resume fails and a new session is started
- Re-probe ACP runtime support when needed and show a resume-checking spinner\n- Surface translated, user-facing details when resume can’t be verified\n- Session Info: show/copy vendor session ID via registry metadata field (independent of resumability gating)
Add screen for accessing sessions via public share links. Handles token-based decryption and consent flow with owner display. - sources/app/(app)/share/[token].tsx
Use username as primary display name with firstName as fallback. Maintains consistency across user profile displays. - sources/components/ActiveSessionsGroup.tsx
Remove non-existent CustomModal dependency from FriendSelector and PublicLinkDialog. Convert to standard View components without modal wrapper logic. - sources/components/SessionSharing/FriendSelector.tsx - sources/components/SessionSharing/PublicLinkDialog.tsx
Updated theme property references to match existing codebase patterns. Changed background->surface, typography->text, primary->textLink, margins to fixed pixel values. Applied consistent radio button styling using theme.colors.radio. - sources/components/SessionSharing/SessionShareDialog.tsx - sources/components/SessionSharing/FriendSelector.tsx - sources/components/SessionSharing/PublicLinkDialog.tsx
Added translation keys for share error messages, public link options, and consent flow. Includes shareNotFound, shareExpired, failedToDecrypt, and various UI labels. - sources/text/_default.ts
Fixed component props to match actual interfaces (Avatar, Item). Updated translation key format from sessionSharing to session.sharing. Prioritized username display over firstName+lastName concatenation. - sources/app/(app)/session/[id]/sharing.tsx - sources/app/(app)/share/[token].tsx
Added missing translation keys for session sharing feature. Includes error messages, public link options, and consent flow strings. - sources/text/translations/ru.ts - sources/text/translations/pl.ts - sources/text/translations/es.ts - sources/text/translations/pt.ts - sources/text/translations/ca.ts - sources/text/translations/it.ts - sources/text/translations/ja.ts - sources/text/translations/zh-Hans.ts
Added remaining translation keys for public link options, error messages, and consent flow. Includes expiration options, usage limits, and dynamic count functions. - sources/text/translations/ru.ts - sources/text/translations/pl.ts - sources/text/translations/es.ts - sources/text/translations/pt.ts - sources/text/translations/ca.ts - sources/text/translations/it.ts - sources/text/translations/ja.ts - sources/text/translations/zh-Hans.ts
Fixed parameter names in translation function calls. Changed count->used for usage count display functions. Changed common.close->common.cancel for consistency. Removed non-existent ownerUsername property reference. - sources/app/(app)/share/[token].tsx - sources/components/SessionSharing/PublicLinkDialog.tsx - sources/components/SessionSharing/SessionShareDialog.tsx
Replaced `sync.getServerUrl` with direct `getServerUrl` call. Removed redundant `getServerUrl` method from `sync`. - sources/app/(app)/share/[token].tsx - sources/sync/sync.ts
Remove unused Modal import from sharing screen - sources/app/(app)/share/[token].tsx
Replaced `ItemGroup` with `ItemList` for better structure. Adjusted styles and removed unused `isCreating` state logic. Consolidated common sections and updated QR code dimensions for consistency. - sources/components/SessionSharing/PublicLinkDialog.tsx
Updated icons in SessionShareDialog to use Ionicons for consistency and styling improvements. Adjusted size and color to align with design guidelines. - sources/components/SessionSharing/SessionShareDialog.tsx
Add three event schemas for real-time session sharing notifications. These schemas enable clients to receive updates when sessions are shared, share permissions are modified, or shares are revoked. - sources/sync/apiTypes.ts
Replace plain Item component with RoundButton for the create button. Makes the primary action more visible and easier to recognize in the dialog. - sources/components/SessionSharing/PublicLinkDialog.tsx
- Store public-share token as sha256(token)\n- Add account content key + signature registration in /v1/auth\n- Accept client-provided encryptedDataKey for direct shares\n- Enforce share access levels across REST + sockets
- Friend details: list shared sessions and open by id\n- Session info: manage shares screen\n- Direct shares: wrap session DEK for recipient (encryptedDataKey v0)\n- Public share: byte-safe DEK wrapping + unauth read-only viewer\n- Normalize sharing translations + optional auth headers
Introduce featuresRoutes to expose a new /v1/features API endpoint returning supported feature flags (sessionSharing, publicSharing, contentKeys). Register the new route in the API startup.
…ations Extend the schema to support session sharing features by adding SessionShare, SessionShareAccessLog, PublicSessionShare, PublicShareAccessLog, and PublicShareBlockedUser tables. Add related indexes and new fields to Account for content public keys. Enables granular session sharing, public links, access logging, and user blocking for public shares.
Introduce tables and indexes for session sharing, public session sharing, access logs, and blocked users. Add contentPublicKey and contentPublicKeySig columns to Account. Enables granular session sharing, public links, and auditing capabilities.
|
Wow, I saw my name in the release notes – I’m so excited! Thanks to everyone for pulling in and merging my PR. I hope these changes make things better for everyone, and I’m looking forward to working on more together! @leeroybrun |
Thank you! Looking forward to working together more as well, and apologies for the delay in the review process. Hopefully we can merge all of this soon and things should move faster and smoother from there |
Not Dead Yet Release
🚀 Highlights
/v1/featuresgatingpreview-env: env-var-based profiles + effective spawn-env preview (with secrets policy)/clearsession reset handlinghappy auth login --no-open🙏 Special Thanks
This PR additionally includes and ports work from:
/clearhandling: slopus/happy-cli#72How to try it
You can use happy-stacks to easily run this PR in an isolated sandbox:
WIP / not fully tested yet / not fully finished yet
This branch/PR is not finalized yet, but can still be used/reviewed/tested already. Other changes will be pushed as they are finalized.
🏗 Core Architecture
1. Server Light (SQLite & Local Files)
We have introduced a "Light" server flavor designed for local-only use, removing the dependency on Docker (Postgres/Minio) for personal usage.
'full'(Postgres/S3) or'light'(SQLite/Local FS) mode.schema:sync), atomic write-ahead DB handling, and baseline migrations.file:///...URLs (URL-escaped), and light flavor validatesPORTfallbacks and normalizes public paths across platforms.HAPPY_SERVER_LIGHT_DATA_DIR(trim/require) and centralize the deploy plan args; light entrypoint does not exit after start.~/.happy/server-light/filesvia a secured/files/*route.encodeURIComponent) so#/?cannot be interpreted as fragment/query.schema:syncgenerator produces the SQLite schema and enum exports (with--checkdrift tests), and server code centralizes Prisma init/types with a fail-fastdbproxy.2. Pending MessageQueue V1 (Metadata-Backed)
We replaced the ephemeral socket-based pending queue with a persistent, encrypted queue stored in session metadata.
session.metadata.messageQueueV1. This ensures queue state survives server restarts and synchronizes perfectly across devices.update-metadatawith version checking (Compare-And-Swap) to prevent race conditions.settings.sessionMessageSendMode(agent_queue|interrupt|server_pending). The defaultagent_queuemode choosesserver_pendingautomatically when queue support exists and the agent is busy/offline/not-ready or controlled by the terminal (so we never “lose” input that cannot be injected safely).localId) before clearingmessageQueueV1.inFlight, preventing loss if the CLI crashes between emit and server persistence.messageQueueV1Discarded, and committed transcript messages can be marked discarded viadiscardedCommittedMessageLocalIds(UI dims and labels discarded bubbles).inFlight) are rejected so corrupted state doesn’t partially apply.optimisticThinkingAtmarker when sending/enqueueing so sessions reflect activity immediately, then clears it once the server reportsthinking: true.messageQueueV1(queue + inFlight + discarded). Actions like “send now”, discard, and delete are performed via metadata updates, with fail-closed ordering so send failures never delete items.3. Capabilities Protocol
Machine introspection has been standardized into a flexible Capabilities Protocol, replacing ad-hoc RPCs. This allows to easily detect what is currently installed on the user's computer and surface clear options
capabilities.detect(e.g., checking for "new-session" requirements or "resume" support).capabilities.describe/capabilities.detect/capabilities.invokesupport checklist-driven discovery (e.g.new-session,machine-details,resume.codex) and user-initiated install/upgrade operations.codex-mcp-resumebridge) into a managed prefix (e.g.~/.happy/tools/codex-mcp-resume).useCLIDetectionnow produces a stable timestamp even when loaded snapshots lackcheckedAt, avoiding UI flapping; covered by fake-timer tests.erroron detection throws (avoids “stuck loading” states while preserving any previous snapshot).detect-cliis daemon-side (PATH scan, no login shell) and can include best-effortversionand optionalisLoggedInprobes (plustmux), guarded by timeouts so it never blocks core flows.tmuxversion probe timeouts (e.g. 1.5s) to reduce false negatives on slow hosts.@happy/protocoldefines shared daemon↔app contracts (RPC result shapes/error codes, checklist helpers, socket RPC event typing) so the CLI/daemon and Expo app stay in sync without copy/paste drift.🤖 Agents & Runtimes
ACP providers (OpenCode + Auggie)
Agent catalog (Expo + CLI)
@happy/agentsprovides canonicalAgentIdand shared agent metadata used across the Expo app and CLI (resume gating, connect targets, and stable identifier mapping).expo-app/sources/agents/catalog.ts) backed by per-agent providers (expo-app/sources/agents/providers/*) so agent UI behavior/copy/capability wiring is centralized and testable.cli/src/backends/<agentId>/**and is composed viacli/src/backends/catalog.tsto drive CLI subcommands, detection snapshots, capability/checklist contributions, daemon spawn hooks, and ACP backend factories.ACP runtimes (Codex + OpenCode + Auggie)
ACP runtimes support multiple ACP-backed agents with consistent UI semantics.
loadSessionsupport on the CLI side, plus slash-command publishing for ACP backends.task_started,task_complete,turn_aborted) with stable task ids so the UI can render agent “thinking/task” boundaries consistently across backends.--permission-mode-updated-atparsing), and supports--existing-sessionand vendor--resumewhere applicable.Claude Reliability & Switching
Significant hardening of the Claude local/remote runner.
transcript_pathreported by hook scripts. This allows switching between Remote and Local modes without losing session context.transcriptPathsurface to prevent regressions.SIGINT,SIGTERM,SIGHUP) to the underlying Claude binary, preventing orphaned processes.switchRPC is idempotent and does not thrash mode state under repeated calls.Ctrl+T, raw-mode reset + brief stdin drain after Ink unmount, and non-async input handlers with cancellable timeouts).-cas--continuefor session control detection; and remote runner handles--resume/-rwith or without an id (without id resumes the most recent valid UUID session for the project).CLAUDE_CONFIG_DIRoverrides are trimmed so accidental whitespace doesn’t create wrong paths.claudeArgslast for slash-command correctness, forwards OS signals to spawned local children, and treats abort errors as expected (reduces spurious “process error” noise).permissionRPC.answerskeyed by the question text when supported; otherwise it falls back to denying the tool call and sending a normal user message with the same content so older agents can proceed.permission.id, fail-closed when missing, and show localized errors on submit failures.Codex Approvals & MCP Interaction
{ Ok: ... }/{ Err: ... }outputs (no lossy||fallthrough), with unit tests.call_idwhere available, reducing “wrong tool result attached” edge cases.mcp_tool_call_begin/mcp_tool_call_endevents are surfaced into the transcript as tool calls/results (prefixedmcp__...) for consistent UI rendering.process.execPath(node/bun) to avoid relying on.mjsexecutable bits across runtimes.codexvscodex-cli, optionalvprefix) and avoids printing full elicitation payloads to stdout (debug-only, redacted logging instead).🛡️ Permissions & Safety
Persistent Permission State
lastPermissionMode, and local spawns/threading update CLI args so switching local/remote does not drop the active policy.permissionMode(+permissionModeUpdatedAt) into session metadata at session creation and on changes (Claude/Codex/Gemini), so the UI can seed state even before the first app-originated message meta exists.permissionModeUpdatedAtunless the effective mode actually changed (prevents “latest wins” churn overriding real user selections).Secrets Vault
SecretStringcontainers before persistence. Plaintext values are never stored in settings.SecretRequirementModalresolves missing secrets at spawn time, allowing users to provide "session-only" keys in memory ("Enter Once") or select from the vault.***) for vault-backed values.Daemon Process Safety
HAPPY_HOME_DIRso a daemon never reattaches or kills sessions from another stack.🖥️ Terminal & Session Management
Inactive Session Resume
Users can now reconnect to stopped or crashed sessions.
codex-mcp-resumebridge that re-hydrates session context using MCP.deps.*status strings).HAPPY_HOME_DIR/sessions/<happySessionId>.json(metadata, agentState, versions) to make reattach/resume possible.resume-sessionRPC and securely provides the session encryption key so the daemon can reconnect to the existing Happy session (--existing-session <happySessionId>). This path is intentionally UI-only (a CLI user cannot resume an existing Happy session without the key).--resume <vendorSessionId>where supported (Claude baseline; Codex is experimental and gated; OpenCode currently falls back because its ACP backend lacksloadSession).agentSessionId; resume is keyed by Happy session id + agent type so vendor-id derivation happens on the machine/daemon side.AgentIdto reduce agent-type mismatches.offlineSessionStub(EventEmitter-based, aligned to the real client surface) to avoid “missing method/event” crashes.Tmux & Headless Support
happy-cli --tmux.happy attachcommand handles identifying and attaching to running tmux sessions.encodeURIComponentfor session filenames) and blocks unsafe legacy fallback reads whensessionIdcontains path separators.TMUX_PANE, rejects invalid target injection, correct kill-window targeting) with focused tests.-S <socket>) and passesTMUX_TMPDIRvia the tmux command environment (not conflated with socket path), with deterministic session selection and opt-in integration tests.new-windowon index conflicts) and avoids attach/spawn edge cases that could desync terminal state.TMUX_*env from agent env, and passes internal runtime flags to surface fallback reasons when tmux is unavailable.--happy-starting-modevalues.General Improvements
happy connectclarifications: we also made it clearer which providers currently supportshappy connectand which ones are not wired into Happy yet (only connection work, but then it's not effectively used anywhere yet), to reduce confusion withhappy connect claudeandhappy connect codexnot changing the authentication of the CLI yet.🤝 Session Sharing (Friends + Public Links)
Happy sessions can be shared securely with other users, either directly (friends-only) or via a public view-only link.
view,edit,admin). Shared sessions appear in the session list with clear indicators./v1/featuresso the app can detect whether session sharing/public sharing/content keys are supported and adjust UI accordingly.💅 UI & UX Improvements
New Session Wizard
NewSessionWizard) with dedicated pickers for Machine, Path, and Profile.preview-envto ensure the selected machine meets the profile's requirements before spawning.Stack.Screenoptions and pick flows were stabilized to reduce “stale selection / wrong route params” issues; wizard can pre-visualize the selected machine for faster verification.BaseModalwith an explicit header/close; Codex resume “not installed” dialogs are localized and route users to the Machine screen to install/inspect the resume server.containedModal(with explicit back buttons) so they never render “behind” the wizard modal.InteractionManager.runAfterInteractionson native to keep iOS taps/animations responsive.UI Primitives & Polish
PopoverandOverlayPortalto handle floating UI consistently on Web (Radix-based) and Native.EXPO_UNSTABLE_WEB_MODAL=1, pins/patchesexpo-router, and ensures patches apply in both hoisted and non-hoisted installs).libsodium-wrappersto a compatible version and aligns patch-package directories so the Expo-router patch is applied reliably.SearchHeader, refactoredSearchableListSelectorgrouping/search placement, and added inline row actions with an overflow menu modal (plus click-through guards).OverlayPortalHost/OverlayPortalProviderand aPopoverprimitive with web/native portal support, spotlight/backdrop options, and aModalPortalTargetProviderfor correct web focus/stacking inside modals.getBoundingClientRect()fallback + retries) and iOS portal pointerEvents to prevent invisible/click-through overlay failures.buttons: []config still renders a defaultOKbutton (prevents non-dismissible alert modals).InteractionManagerwith timeout fallback) so actions aren’t delayed indefinitely under continuous interactions.t(...)keys; tooling was added to help find remaining untranslated literals.🛠️ Foundations & DevX
happys test/typecheck. Added Vitest stubs for Expo/React Native modules to enable fast Node-based unit testing of UI logic.react-test-rendererto stay aligned with the repo’s React version (prevents subtle test renderer mismatches).@more-tech/react-native-libsodiumpodspec evaluation sopod installdoesn’t fail whenfolly_versionis undefined (falls back toRCT-Follywhen needed).expo-apppostinstall that reliably runspatch-packageeven when hoisted; includes libsodium-wrappers patching plus a web adapter that forces the CJS build to avoid Metro parsing failures from ESM/top-levelawait.expo-app/so patches apply for hoisted deps and non-hoisted deps (e.g.expo-router).expo-router) were actually applied, failing fast when patching silently didn’t happen.EXPO_APP_NAME,EXPO_APP_BUNDLE_ID,EXPO_APP_SCHEME) and safe fallbacks whenAPP_ENVis unknown (prevents undefined config values, reduces multi-install collisions).__DEV__ = falsein Vitest so dev-gated code paths behave predictably under unit tests.expo-app) fromStyleSheettoreact-native-unistylesfor consistent theming.StyleSheetimports fromreact-native” and prevent regressions..projectartifacts and adds naming-conventions documentation used by tooling/agents.translations/en.ts, expanded locale dictionaries for new surfaces, and added scripts to compare translation coverage and scan for likely-untranslated literals (with follow-up parsing fixes for file kinds and:in literal grouping keys).__DEV__(keeps errors as errors; avoids incidental message/metadata logging).📦 Appendix: Additional Details
Additional implementation details and edge-case hardening notes that didn’t fit cleanly in the high-level sections above.
Auth & Storage Scoping
tokenStorageno longer throws on malformedlocalStorageJSON;setItem/removeItemfailures returnfalse(quota/security errors handled).happy auth login --no-open(andHAPPY_NO_BROWSER_OPEN) skips auto-opening a browser for login; unit-tested.EXPO_PUBLIC_HAPPY_STORAGE_SCOPEto prevent cross-stack/worktree state bleed on device.usage.service_tier: nullso messages/events aren’t dropped on schema failures (helps keep auth/401 failures visible).Settings, Profiles, and Requirements
environmentVariablesentries (e.g.OPENAI_*,ANTHROPIC_*,AZURE_OPENAI_*,TOGETHER_*); non-persistable fields (e.g.startupBashScript,tmuxConfig.updateEnvironment) are dropped from the persisted GUI profile model.replaceSettings(settings, version)to converge after server/account switching or server-side resets (used to prevent version mismatch retry loops).${VAR},${VAR:-fallback},${VAR:=fallback}and bash-like empty-string fallback semantics.preview-envend-to-end: UI prefers daemon-computed “effective spawn env” (supportsextraEnvexpansion + secrets policynone|redacted|full+ per-key sensitivity metadata); falls back to non-sensitive only bash probing when unsupported (node-backed JSON protocol when available; robust unset sentinel parsing; avoids pulling secret-like values into UI memory). Daemon handler validates key names and caps requests; sensitive-key detection is heuristic with an overridable (safe-fallback) regex.preview-envaccepts lowercase keys and explicitly blocks prototype-pollution keys (__proto__/constructor/prototype), usingObject.create(null)to avoid inherited properties.expCodexResume).sessionMessageSendMode,sessionUseTmux, etc.) with migrations/aliases for legacy keys and routes.preview-envand provides a resolver modal (use machine env, select a saved credential, or enter once for session-only use).Sessions UX
readStateV1) and updated on focus/blur with debounced writes.homeDir. Session list formatting consistently shows~-prefixed home-relative paths.update-metadata(version-checked), with a prompt-based UX.modelto avoid spurious restarts.agentStateVersionimmediately after session creation so UI readiness flips true without requiring anupdate-stateevent.CLI / Sync / Daemon reliability
HAPPY_HOME_DIR, strict PID classification, and process-command-hash verification; avoids unsafe cross-process interactions and PID reuse hazards.ENOENTwhen the daemon state file appears shortly after startup (race hardening; regression-tested).pidSafety/reattachhelpers and added opt-in “real process” integration tests gated byHAPPY_CLI_DAEMON_REATTACH_INTEGRATION=1for validating PID hashing + marker adoption on the host OS.waitForMetadataUpdate()resolvesfalseon socket disconnect and always cleans up listeners (prevents hanging awaiters; tested).nodeorbun(selectable) with tested invocation building; missing entrypoints surface a clear error instead of failing silently.invalidateAndAwait()never hangs forever when the sync command throws (awaiters resolve; retries are bounded; tests included).failuresCountincrements per attempt; tests de-flaked by stubbing jitter).errorCode=RPC_METHOD_NOT_AVAILABLE(while preserving legacy message strings) so the app can do reliable back-compat fallbacks without brittle string matching.refreshMachinesThrottledhelper to prevent network churn.HappyError(kind/status)typing.profileIdis threaded through daemon spawn into session metadata (identity only; separate from env var contents), enabling consistent UI display across devices.${VAR:-default}/${VAR:=default}templates to avoid leaking embedded secrets.Record<string,string>) to keep GUI/CLI interoperable as provider keys evolve.tmuxConfigand stops exporting tmux env vars from profiles (terminal behavior is driven by explicit terminal spawn options).Server hardening beyond “Server Light”
#/?safely).S3_PORTrange and errors if the bucket does not exist).Misc
/clearhandling: treat/clearas a session boundary so Codex session state resets deterministically.✅ Test Plan (what maintainers should validate)
This is the suggested “high-signal” manual test checklist for the master PR:
preview-env: verify capability detection for key tools (Claude/Codex/Gemini/Tmux/OpenCode), verifypreview-envdetects missing requirements and wizard shows actionable preflight errors.view/edit/admin) and enforcement (view-only disables send), verify realtime updates on share changes, create/rotate/disable a public link (expiry/max-uses), verify consent-required flows, and verify/share/[token]viewing works as expected.permissionRPC (including answers-on-permission where supported).🔗 GitHub Issue Crosswalk (happy + happy-cli)
This is a conservative, audit-driven mapping between GitHub issues and the changes described above.
(Scan date: 2026-01-26; audit base:
upstream/mainvsleeroy-wip)Legend
leeroy-wipthat plausibly resolve the issue.upstream/main; changes here are refinements (scoping, hardening, polish).Server selection & self-hosting (server URL + deployment/docs)
MessageQueueV1 / pending-message reliability
Inactive session resume
max_tokensexceed context limit" after a 5 hour block "resume" #73, Sessions not properly marked as inactive when CLI exits happy-cli#10Claude reliability (switching + terminal state restoration)
Codex MCP / approvals / tool-call correctness
happyfailed to start: %1 is not a valid Win32 application. (os error 193) #181, after unsucessfull mcp connect there is no way to continue with anything #445, Codex flashes cmd.exe on each MCP interaction in Windows #447, MCP client forhappyfailed to start: %1 不是有效的 Win32 应用程序 #470happy codexcommand #146, Codex error #139, Android app hasn't been updated to see new models for codex #247, Hardcoded system prompts force frequent change_title tool calls causing unnecessary API requests with no user override option happy-cli#43Permission modes / YOLO / approval state persistence
happy codexcommand #146, Feature Request: Arrow key navigation through user message history across sessions #365, feat: Add local interactive mode for Gemini (matching Claude's behavior) #469, feat: Add local interactive mode for Gemini (matching Claude's behavior) happy-cli#147, feat: Add git diff view for Claude Code file changes #227ACP agent expansion (Codex ACP + OpenCode ACP + Auggie ACP + agent catalog)
Slash commands (Claude + ACP)
Models / Gemini availability
Daemon process safety (reattach/ownership gating) + service requests
Auth / linking / backups
Secrets / logging / path safety
New Session Wizard + machine/endpoint selection
Sessions UX (unread/rename/notifications/deep linking)
Terminal/TMUX & headless attach
Tool UX (specialized renderers + native interaction routing)
🧾 Upstream Open PRs Cross-check (double-verified)
Scan date: 2026-01-26 (open PRs in
slopus/happy,slopus/happy-cli, andslopus/happy-server).Verification method: sampled added/removed diff lines from each PR (via GitHub
pulls/<n>/filespatches) and checked whether those lines are present/absent in the monorepo branchslopus/tmp/leeroy-wip(file paths mapped toexpo-app/…,cli/…, andserver/…).PORTED: we intentionally extracted/ported this PR into the monorepo and added explicit credits elsewhere in this PR description.VERIFIED: strong evidence the PR’s changes are already present (or superseded) inleeroy-wip.PROBABLE: meaningful overlap, but not tight enough to claim superseded without a quick human spot-check.PRs without sufficient evidence are intentionally omitted to avoid false positives.
slopus/happy
PORTED (credited above)
VERIFIED (likely superseded)
PROBABLE (review)
slopus/happy-cli
PORTED (credited above)
PROBABLE (review)
slopus/happy-server
PORTED (credited above)
@bra1nDump @GrocerPublishAgent @Scoteezy