14 Commits

Author SHA1 Message Date
Scoteezy 1677fadc30 feat: refresh mobile UI and improve session handling 2026-07-24 15:16:59 +03:00
Scoteezy 4a5f91dc92 feat(app): Codex-style sidebar, zen mode, unread tracking, unified header
- Redesign sidebar: persistent header with logo/status/nav buttons, "New Session" button, settings at bottom
- Add zen mode: hides all sidebars, simplifies input bar, Escape to exit (web)
- Add unread session tracking: solid blue dot when agent finishes while user is elsewhere
- Simplify ChatHeaderView: remove back button, clickable title for session info
- Remove diff sidebar toggle: always visible, hidden only in zen mode
- Persistent header overlay stays in same position regardless of zen mode
- Add i18n strings for zen/unread/sidebar across all languages

via [Happy](https://happy.engineering)
2026-04-27 22:50:38 +03:00
Scoteezy 33b48e761e feat(diff): replace custom DiffView with @pierre/diffs (web) + plain-text fallback (native)
Swaps the hand-rolled DiffView + calculateDiff.ts for @pierre/diffs,
which brings Shiki-backed syntax highlighting, proper split/unified
modes, and smart overflow handling. Native keeps a plain-text renderer
to avoid pulling WASM into Hermes.

- Add @pierre/diffs dep and patches/expose-pierre-diffs-style.cjs
  (adds ./style.js to the package's exports map so we can import CSS).
- New PierreDiffView component:
    * Web: lazy-imports @pierre/diffs + @pierre/diffs/react, caches
      the bundle in a module-scoped promise and prefetches on session
      mount so the first chat diff doesn't wait on chunk download.
    * Native: routes `patch` through a prefix-colored PlainPatchView
      and `oldFile/newFile` through the classic DiffView (restored
      from git history for the native code path). Always unified.
- Rewrite ToolDiffView to accept `patch` or `oldText`/`newText` +
  `fileName`, map wrapLinesInDiffs/showLineNumbersInToolViews to
  Pierre options, drop the outer horizontal ScrollView (Pierre
  handles overflow itself).
- Migrate consumers (CodexDiffView, CodexPatchView, MultiEditView,
  MultiEditViewFull, InlineFileDiff) onto the new API.

Diff-fetch corrections:
- Tracked files in InlineFileDiff use `git diff HEAD -- path` so the
  pane shows staged + unstaged changes together regardless of which
  sidebar section was clicked. Previously staged-only files rendered
  as "No changes".
- Untracked files read contents via `cat` and render as a pure addition
  through PierreDiffView's oldFile/newFile API. `git diff` without
  --cached returns empty for untracked files.
- SessionView stores the whole GitFileStatus so the file status can
  be passed into InlineFileDiff.
- gitStatusFiles uses `git diff --numstat` (not `--numstat HEAD`) for
  unstaged row stats so files with both staged and unstaged changes
  don't double-count staged lines.
2026-04-23 01:24:44 +03:00
Kirill Dubovitskiy f5b44cddeb fix: patch LiveKit stale Room reuse — fixes voice second-session disconnect
Root cause: @livekit/components-react's useLiveKitRoom creates one Room
instance and reuses it forever because `token` is missing from the effect
deps array. After disconnect(), reconnecting the same Room silently fails.

Fix: postinstall patch adds `token` to the Room creation effect's deps,
forcing a fresh Room per session. The existing cleanup effect disconnects
the old one automatically.

Also reverts broken @elevenlabs/react import on native (needs react-native),
restores ElevenLabsProvider wrapping, and removes the voiceSessionGeneration
counter workaround that caused phantom keyboard on cold launch.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-04-15 03:18:09 -07:00
Kirill Dubovitskiy 802aece4f2 feat: migrate from yarn 1 to pnpm 10 (#1033)
* feat: migrate from yarn 1 to pnpm 10

Yarn install was taking ~82s (warm cache, no scripts). pnpm achieves
~7.5s for the same operation — an 11x speedup thanks to its
content-addressable store and hard-linking.

Key changes:
- Add pnpm-workspace.yaml, .npmrc (shamefully-hoist for RN compat)
- Replace yarn.lock with pnpm-lock.yaml (imported via pnpm import)
- Use workspace:* protocol for @slopus/happy-wire cross-references
- Move happy-cli resolutions to root pnpm.overrides
- Add pnpm.onlyBuiltDependencies allowlist for native build scripts
- Update all 3 Dockerfiles to use corepack + pnpm
- Update CI workflows to use pnpm/action-setup@v4
- Update all scripts, tests, and docs referencing yarn

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* chore: bump changelog to version 8 for pnpm migration OTA

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* fix(ci): pnpm pack outputs to repo root, use --pack-destination

pnpm pack puts the tarball in the current directory (repo root) unlike
yarn which puts it in the package directory. Use --pack-destination to
match the expected path in the smoke test workflow.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Happy <yesreply@happy.engineering>
2026-04-12 02:52:14 -07:00
Kirill Dubovitskiy c3c98d4993 feat(app): voice usage UI, signed URL auth, hard limit messaging
- Switch to signedUrl for ElevenLabs session auth (websocket default)
- Bypass mode only with custom agent ID (can't bypass default agent)
- Voice settings shows usage bar (UsageBar component)
- Hard limit: "configure your own ElevenLabs agent" modal
- Subscription required: paywall presentation
- All 10 language translations for usage + limit strings

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-04-07 01:54:12 -07:00
Kirill Dubovitskiy 6ff74401a5 feat(server): voice rate limiting with DB-tracked signed URL auth
Switch to ElevenLabs signed URLs with include_conversation_id=true
for server-side conversation tracking. Per-user rate limiting via
VoiceConversation DB model instead of ElevenLabs user_id (which gets
overridden on authorized agents).

- POST /v1/voice/conversations: usage check, signed URL, DB record
- GET /v1/voice/usage: per-user usage for settings UI
- 1hr free → subscription required → 5hr hard block
- ELEVENLABS_API_KEY and REVENUECAT_API_KEY required or 500
- VoiceConversation model with lazy duration backfill
- Signed URL conversation_id is cryptographically bound (can't fake)
- scripts/voice-usage.py for admin analytics
- docs/paid-voice.md, docs/user-identity.md

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-04-07 01:54:12 -07:00
Kirill Dubovitskiy 9e99583631 fix(pglite): patch pglite-prisma-adapter Bytes column serialization
The adapter's parsePgBytes returns Uint8Array which doesn't serialize
correctly across the JS-WASM boundary. Patch converts to Array.from
via postinstall script.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 23:05:49 -08:00
Steve Korshakov 1e36c48f52 fix(docker): skip happy-wire postinstall build in deps stage 2026-02-13 21:52:14 -08:00
Steve Korshakov 9fbf4276ae Add happy-app interactive release options 2026-02-13 15:45:31 -08:00
Steve Korshakov c553fcf3e3 Use inquirer select for release target prompt 2026-02-12 19:13:46 -08:00
Steve Korshakov e0adde20d4 Harden workspace release command resolution 2026-02-12 18:58:22 -08:00
Steve Korshakov 0f28f62b66 Fail fast when release-it is missing 2026-02-12 18:55:50 -08:00
Steve Korshakov 96e60148c7 Add root release selector and simplify release scripts 2026-02-12 18:50:17 -08:00