Skip to content

Fix new chat's message box position and fix popover layout#4

Draft
caseyjkey wants to merge 162 commits intodevfrom
chat-input-bottom-mobile
Draft

Fix new chat's message box position and fix popover layout#4
caseyjkey wants to merge 162 commits intodevfrom
chat-input-bottom-mobile

Conversation

@caseyjkey
Copy link
Collaborator

@caseyjkey caseyjkey commented Feb 18, 2026

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.

  • Message box sticky to bottom of viewport
  • Set the initial visiblity of the AgentInput popover's bottom inset shadow to fix snap-in effect

Verified on Android dev app:

  • Large message box sizes with multiple blank lines
  • Keyboard open and closed states
  • AgentInput Popover remains stable when keyboard toggles
  • AgentInput bottom edge fade renders smoothly without content shifting
  • AgentInput is scrollable and shows bottom/top indicators

@caseyjkey caseyjkey force-pushed the chat-input-bottom-mobile branch from 142273a to e4d6e2e Compare February 18, 2026 01:18
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.
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@caseyjkey caseyjkey changed the title Center message box and fix popover layout Fix new chat's message box position and fix popover layout Feb 18, 2026
@caseyjkey caseyjkey marked this pull request as draft February 18, 2026 02:48
@caseyjkey caseyjkey force-pushed the chat-input-bottom-mobile branch from e4d6e2e to 1a00e3c Compare February 18, 2026 06:39
@caseyjkey caseyjkey force-pushed the chat-input-bottom-mobile branch 3 times, most recently from 017ddcd to eab341e Compare February 18, 2026 07:11
leeroybrun and others added 21 commits February 20, 2026 10:03
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>
leeroybrun and others added 29 commits February 21, 2026 20:01
…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>
…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
@leeroybrun leeroybrun force-pushed the chat-input-bottom-mobile branch from d7a8149 to 14e7e3f Compare February 26, 2026 18:51
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.

7 participants