Fix new chat's message box position and fix popover layout#4
Draft
Fix new chat's message box position and fix popover layout#4
Conversation
142273a to
e4d6e2e
Compare
caseyjkey
commented
Feb 18, 2026
| flex: 1, | ||
| width: '100%', | ||
| // Keep the content centered on web. Without this, the boundary wrapper (flex:1) | ||
| // can cause the inner content to stick to the top even when the modal is centered. |
Collaborator
Author
There was a problem hiding this comment.
This was the case, let me know if we want the app to always have the chat on the bottom instead of centered for new chats.
e4d6e2e to
1a00e3c
Compare
017ddcd to
eab341e
Compare
Remove preflightOnly parameter from maybeAutoInstallRepoDeps and take the preflight-only exit out of the helper, handling it in main instead. This centralizes process.exit behavior in main (apps/stack/scripts/repo_local.mjs) and prevents the helper from terminating the process directly; runtime behavior is unchanged apart from where the early exit occurs.
Introduce unified provisioning and lightweight smoke test flows for macOS/Linux Lima VMs. Add linux-ubuntu-provision.sh (dependency-only provisioner) and its node:test-based linux-ubuntu-provision.test.mjs; rename the in-VM runner to linux-ubuntu-hstack-smoke.sh (was linux-ubuntu-e2e.sh) and update internal env/log names (E2E -> SMOKE). Replace macOS helpers with macos-lima-vm.sh and macos-lima-hstack-smoke.sh (replacing macos-lima-happy-vm.sh and macos-lima-hstack-e2e.sh), remove obsolete linux-ubuntu-review-pr.sh, and update docs to reference the new script names and paths. These changes separate dependency provisioning from installer/runner logic, standardize naming, and add tests to ensure provisioning actions (e.g. corepack enable) run with expected privileges.
Add dedicated provider guides and reorganize the auth docs for clarity. - Add new detailed guides: apps/docs/content/docs/server/auth-github.mdx and apps/docs/content/docs/server/auth-oidc.mdx (setup, env vars, allowlists, app modes, examples). - Simplify and refactor apps/docs/content/docs/server/auth.mdx into a concise overview that links to the new provider-specific pages and clarifies auth policy env vars and offboarding behavior. - Update apps/docs/content/docs/server/index.mdx and apps/docs/content/docs/server/meta.json to include and link the new pages. Purpose: split large authentication documentation into focused pages for easier maintenance and clearer operator guidance.
Add robust error handling to scripts/pipeline/github/promote-branch.mjs: introduce normalizeExecError, isGhNotFoundError, and formatExecError helpers; switch PATCH calls to use typed -F fields; only fall back to creating the ref when the PATCH fails with a 404 (do not mask other errors). Add tests (scripts/release/pipeline_promote_branch_script.test.mjs) that stub the gh CLI to verify typed force usage, ensure no POST fallback on forbidden errors, and validate the overall promote behavior.
Add a repo-local ghops wrapper and supporting infra - Add apps/stack/scripts/ghops.mjs: wrapper to run GitHub CLI as the Happier bot (forces HAPPIER_GITHUB_BOT_TOKEN, non-interactive, isolated GH_CONFIG_DIR). - Add apps/stack/scripts/ghops.test.mjs and tests to validate behavior. - Export "ghops" npm script in package.json. - Add .github issue templates (bug, feature, task) to standardize issue reports. - Add workflows: roadmap-bootstrap-labels.yml (create/update roadmap labels) and roadmap-add-to-project.yml (sync priority/stage labels into Project v2 fields using app token). - Add skills/happier-github-ops/SKILL.md documenting usage and conventions. - Update .gitignore to ignore .happier/local/ These changes introduce safer, consistent tooling for bot-driven GitHub operations and automate roadmap label/project management.
Add a new hstack logs command (apps/stack/scripts/logs.mjs) with JSON output, tailing, and selection of runner/server/expo/ui/daemon/service sources, plus accompanying tests. Register the command in the CLI registry and expose tail/log helpers. Implement default log teeing via a new HAPPIER_STACK_LOG_TEE_DIR: spawnProc will create per-label tee files when no explicit teeFile is provided, and tests cover tee behavior. Improve repo-local wrapper: sync a minimal managed env file (preserve user keys) via ensureEnvFileUpdated/pruned, add mobile:install convenience mapping, and surface stack-scoped log/cli dirs; add tests for env preservation and wrapper behaviors. Add cross-platform script PTY arg builder (utils/tui/script_pty_command.mjs) and wire it into tui.mjs to spawn script correctly on Linux/BSD, with tests. Expo/dev updates: ensureDevExpoServer updates env when forced metro port is unavailable and persist chosen port; tests added. Server port resolution tightened: non-main stacks will error if a pinned HAPPIER_STACK_SERVER_PORT is occupied by a non-happier process. Misc: add/expand tests for metro port selection and resolve_stack_server_port behavior, and update package.json scripts to expose mobile:install and repo-local script aliases.
Add support for self-updating when the CLI is installed as a native binary by fetching and verifying GitHub release assets. - Integrate @happier-dev/release-runtime into apps/cli package.json. - Add binarySelfUpdate module (apps/cli/src/cli/runtime/update/binarySelfUpdate.ts) to resolve release bundles, download & verify checksums/minisig, extract archive, and atomically replace the running binary. - Add tests for binary update behavior and asset resolution (binarySelfUpdate.test.ts). - Extend self command to detect binary vs npm installs, use GitHub tag-based releases, and honor env vars (HAPPIER_GITHUB_REPO, HAPPIER_GITHUB_TOKEN, HAPPIER_SELF_UPDATE_OS/ARCH, HAPPIER_MINISIGN_PUBKEY). - Make update/check commands wire into the new update flow and print appropriate messages. - Harden auto-update spawn so update checks are best-effort and won't crash the CLI if spawn throws. - Add resolveSpawnDetachedNodeInvocation helper to cli-common and tests to allow spawning detached processes correctly for runtime vs self-contained binaries. This enables secure, signed binary updates for native CLI distributions and improves robustness of background update checks.
Avoid stale/legacy pinned server ports from overriding stable per-stack port ranges. Added parsing helpers (coercePositiveInt, isPortWithinRange, readEnvFileObject) and use parseEnvToObject to inspect existing stackless env. repo_local now only injects runtime-derived HAPPIER_STACK_SERVER_PORT / HAPPIER_STACK_EXPO_DEV_PORT when they fall within the configured stable base/range and when no user-pinned port already exists; it also prunes stale pinned ports that lie outside the configured range. resolve_stack_server_port was updated to ignore runtime ports that fall outside an explicitly configured stable range so runtime state cannot accidentally force legacy low ports. Tests added to cover pruning behavior and range-ignoring logic.
Rename npm-e2e-smoke to release-assets-e2e and add optional Docker Hub image smoke validation for release assets. Introduces compose.dockerhub.yml, new CLI flags (--with-docker-images, --docker-channel, --docker-images-db) and a run_dockerhub_images_smoke runner in run.sh to validate published relay-server and dev-box images across sqlite/postgres cases. Update README, shell helpers (support preinstalled happier-cli), and add tests to exercise the new flags, compose file, and image preflight checks.
Add a suite of pipeline scripts and tests to support publishing and CI workflows. New utilities include github/commit-and-push, github/audit-release-assets, github/resolve-github-repo-slug, git/ensure-clean-worktree, expo/eas-local-build-env, and release/publish-cli-binaries (plus related tauri helpers). Improvements were made to docker/publish-images (GHCR auth via gh CLI in local mode, rename devcontainer->dev-box, cache scope updates), expo native-build and submit (CI/non-interactive logic and local EAS env handling), npm scripts (auto boolean handling in release-packages and write flag in set-preview-versions), and various release tests/workflows. These changes make local developer workflows and CI release flows more robust, non-interactive where appropriate, and add tooling for auditing and publishing binary release artifacts.
…loyments When the web app is deployed at a custom domain (e.g. https://happier.example.com) without EXPO_PUBLIC_HAPPY_SERVER_URL set at build time, parsePreconfiguredServersFromEnv() returned no servers. This left activeServerId as '' which caused applyMachines() to skip populating machineListByServerId, so the /new session page always showed the "connect machine" onboarding guidance even when machines were online. Fix: fall back to the web same-origin URL when no server is explicitly configured and no entries have been parsed from env vars. This ensures self-hosted deployments get a server profile without requiring build-time env var configuration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ation On Windows, Node.js execFileSync/spawn does not resolve .cmd/.exe extensions automatically. The Codex MCP server spawn hardcoded 'codex' as the command, causing ENOENT on Windows where the binary is 'codex.cmd'. Add resolveCodexOnPath() that searches PATH with PATHEXT candidates, matching the pattern already used by codex-acp resolution. Also wrap JSON.stringify in logger's logToFile and sendToRemoteServer with try-catch to handle circular references (e.g. Error objects from execFileSync that have error.error circular properties) and cross-realm Error objects where instanceof Error fails. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevents console windows from flashing on Windows for all subprocess spawn/exec calls. Most critically, the daemon session spawn path (startDaemon.ts) was missing windowsHide when spawning hidden-mode sessions, causing cmd windows to persist for codex sessions. 14 files patched across backends (claude, codex, pi), daemon, integrations (difftastic, ripgrep), probes, and RPC handlers. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a non-installing --version action to the CLI and self-host installers to report the release version without downloading or installing artifacts. Implement action_version handlers in install.sh and self-host.sh, add platform/arch detection and json_lookup_asset_url helpers that parse GitHub release metadata, and wire the new ACTION value into usage and argument parsing. Update installer behavior to fetch release asset names from the GitHub API (supporting stable/preview channels and cli/server/stack product variants) and print inferred versions. Add tests (installers_cli_actions.test.mjs and installers_self_host_actions.test.mjs) to verify the --version behavior and ensure no downloads occur. Also consolidate / relocate duplicated helpers and adjust the systemctl check placement.
Add a new --version action to the public installer scripts to report the latest release version without installing. Implemented action_version and supporting helpers (detect_os, detect_arch, json_lookup_asset_url) across install, install-preview, install-preview.sh, install.sh, self-host and self-host-preview scripts. The new flow queries the GitHub Releases API (releases/tags/<tag>) for the appropriate tag (cli/server/stack stable or preview), finds the asset matching platform/arch via a small jq-free parser, extracts the version from the asset name, and prints a human-friendly summary. The implementation respects GITHUB_TOKEN for authenticated API requests. Also cleaned up duplicated parsing logic and adjusted the placement of the systemctl availability check.
Unify subprocess launch resolution across daemon, tmux, and visible-console paths via a shared launch-spec helper. Add regression coverage for missing /$bunfs/dist/index.mjs and ensure bundled Bun runtime can spawn child happier sessions without relying on dist/index.mjs on disk. Closes happier-dev#76 Refs happier-dev#75
…list flickering Machine-activity ephemeral WebSocket updates were applied individually, each triggering a full session list rebuild. On app resume with N machines, this caused N sequential re-renders and visible status flickering. Add MachineActivityAccumulator (mirroring existing ActivityUpdateAccumulator) to collect machine-activity updates and flush them as a single batch. Significant state changes (active/inactive transitions) still flush immediately but are batched with any other pending updates. Closes happier-dev#43 Generated with [Claude Code](https://claude.ai/code) via [Happier](https://app.happier.dev) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happier <yesreply@happier.dev>
- Use @/sync/ alias import instead of relative path in socket.ts - Type addActivityUpdate as ApiEphemeralActivityUpdate instead of any - Use MachineActivityUpdate type instead of inline object type - Convert if to else if for mutually-exclusive discriminated union - Import MachineActivityUpdate at top-level instead of inline import() - Rename misleading test description to match actual assertions - Add cancel() safety comment documenting drop-without-flush invariant Generated with [Claude Code](https://claude.ai/code) via [Happier](https://app.happier.dev) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happier <yesreply@happier.dev>
…roy/upstream-dev
…compliance OIDC providers that support RFC 9207 (Authorization Response Issuer Identification) include an `iss` parameter in the callback URL. The openid-client library validates this parameter when present in the provider's discovery metadata. Happier was reconstructing the callback URL with only `code` and `state`, causing authorizationCodeGrant to reject the response before making the token exchange request.
PrismaJson is a global namespace declared in sources/storage/types.ts via
'declare global { namespace PrismaJson { ... } }'. It is not exported from
@prisma/client and the import caused TypeScript build failures in Docker.
Remove the erroneous import from pendingRoutes.ts and registerSessionMessageRoutes.ts;
the namespace is already globally available through tsconfig include.
- Add `foregroundBehavior` setting to NotificationsSettingsV1Schema with options: 'full' (default), 'silent', 'off' - Suppress notifications for the session currently being viewed (same-session suppression is always active) - Add active session tracker module for use outside React tree - Wire tracker into SessionView's useFocusEffect - Replace static Notifications.setNotificationHandler with dynamic handler that reads foregroundBehavior setting - Add "In-app notifications" radio group to notification settings UI - Add translations for all 10 languages Default is 'full' — identical to previous behavior, zero regression. Background/killed notifications are unaffected (handled by OS natively). Generated with [Claude Code](https://claude.ai/code) via [Happier](https://app.happier.dev) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happier <yesreply@happier.dev>
Use typed storage access and safeParse instead of unsafe cast, per review feedback. Generated with [Claude Code](https://claude.ai/code) via [Happier](https://app.happier.dev) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happier <yesreply@happier.dev>
- Remove redundant `as` cast on notification data (already typed) - Replace safeParse + guard with direct parse (.catch() never fails) - Drop deprecated shouldShowAlert in favor of shouldShowBanner/shouldShowList Generated with [Claude Code](https://claude.ai/code) via [Happier](https://app.happier.dev) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happier <yesreply@happier.dev>
Add optional chaining on data?.sessionId to prevent throw if notification payload has no data object. Generated with [Claude Code](https://claude.ai/code) via [Happier](https://app.happier.dev) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happier <yesreply@happier.dev>
Skip sending push notifications when the current permission mode would auto-approve the tool (yolo, bypassPermissions, and read-only tools in safe-yolo). Applies to all four push call sites: Codex ACP, catalog provider ACP, Claude permission handler, and local permission bridge. Generated with [Claude Code](https://claude.ai/code) via [Happier](https://app.happier.dev) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happier <yesreply@happier.dev>
…ression Address CodeRabbit review: use the strong PermissionMode type from @/api/types for compile-time validation of permission mode values. Generated with [Claude Code](https://claude.ai/code) via [Happier](https://app.happier.dev) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happier <yesreply@happier.dev>
- Remove native anchor-to-composer workaround - Cap width like other agent-input popovers - Add unit test covering popover props
d7a8149 to
14e7e3f
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR fixes the new chat's message box to be sticky to the bottom as intended by existing code/comments. It also remedies several rendering glitches in agent input popover.
Verified on Android dev app: