Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
171 commits
Select commit Hold shift + click to select a range
a6f65fd
feat: consolidate accepted PR 2248 baseline
May 20, 2026
efec817
feat: layer PR 2255 notifications and signal-team enhancements
May 20, 2026
3f012fc
fix(onboarding): restore stable adventure component after overlap merge
May 20, 2026
ce38d53
fix(call-recording): keep context in thread mode and relax slug preco…
May 20, 2026
fa7b54f
fix(coherence): allow signal team members to manage signals
May 20, 2026
c0327ad
fix(coherence): align signal card header metadata layout
May 20, 2026
5b7f709
fix(coherence): resolve signal team nullability in CI type-check
May 20, 2026
f60e48d
fix(call-dock): restore recording capture dropdown wiring
May 20, 2026
6ef2f8a
fix(coherence): refine signal card badge spacing and styling
May 20, 2026
ddb56f7
fix(coherence): normalize signal team manage button sizing
May 20, 2026
67b6df5
fix(coherence): stabilize signal board card density and metadata labels
May 20, 2026
fb30861
fix(coherence): compact signal cards for board density
May 20, 2026
c88172e
fix(coherence): apply prettier formatting for signal card
May 20, 2026
c2ac6f6
fix(coherence): align signal grid spacing with proposal cards
May 20, 2026
904ed95
fix(call-dock): localize capture menu and use recording icon
May 20, 2026
ccf8e30
fix(coherence): tighten signal team button and creator naming
May 20, 2026
d7ed86b
fix(coherence): run signal edit mutations on service db
May 20, 2026
c5b1a85
fix(call-dock): use zoom-like recording and stop icons
May 20, 2026
88024b3
fix(coherence): format signal card creator label block
May 20, 2026
aa097d3
fix(call-dock): guard leaving when capture mode is off
May 20, 2026
e1edb09
fix(coherence): tighten signal board density and wrap alignment
May 20, 2026
873c72f
fix(call-dock): keep recording capture alive across auth sync
May 20, 2026
d96e2f0
fix(ai-panel): preserve chat context across space navigation
May 20, 2026
db448e5
fix(coherence): show signal load more only beyond ten cards
May 21, 2026
cfc9bf6
fix(coherence): add board counts and board deselection
May 21, 2026
adfedeb
fix(space-memory): ingest discussion and call artifacts from signal r…
May 21, 2026
79e44f5
fix(call-artifacts): persist transcript fallback when recording uploa…
May 21, 2026
49b0201
fix(space-memory): include signal-room media and ingest observability
May 21, 2026
31493d9
fix(ci): prevent preview deploy failure on schema-diff comment timeout
May 21, 2026
35137d8
fix(ai-panel): restore MCP navigation auto-redirect handling
May 21, 2026
c15a87d
fix(i18n): restore AI message expand/collapse labels
May 21, 2026
f740d90
fix(call-recording): fallback to transcript when recording blob is empty
May 21, 2026
0064d6d
fix(coherence): stabilize signal card height and tag overflow
May 21, 2026
2d2accb
fix(ui): make tag picker selection and all-tags view reliable
May 21, 2026
07a7e4b
fix(ai-panel): guard tool invocation parsing for type safety
May 21, 2026
1b76ac2
fix(ci): align prettier formatting with PR worktree
May 21, 2026
9f5a684
fix(navigation): preserve AI context and avoid onboarding misroutes
May 22, 2026
28f27e8
fix(navigation): prioritize direct space targets over network fallback
May 22, 2026
c945967
fix(ai-panel): reset chat context on manual space switches
May 22, 2026
1cd7c0e
fix(matrix): recover right-panel chat after token expiry
May 22, 2026
84afc06
fix(call-recording): add explicit capture controls and participant no…
May 22, 2026
1fe2d8e
fix(ci): resolve check-types errors for call capture notices
May 22, 2026
c2e7474
fix(i18n): localize call capture stop and pause controls
May 22, 2026
3df0050
fix(ui): reduce signal team manage button height
May 22, 2026
dbbd02a
fix(chat-ui): unify capture control and resolve reply member labels
May 22, 2026
67e0391
fix(call-capture): defer preference selection until user chooses mode
May 22, 2026
4f919d7
fix(i18n): add call capture stop confirmation copy
May 22, 2026
5c77a24
fix(call-ui): align capture control with zoom-style recording flow
May 22, 2026
3e21969
fix(call-capture): reset mode on leave and stop when call empties
May 22, 2026
f7c226e
fix(i18n): align call recording labels with zoom-style flow
May 22, 2026
bca3b9a
fix(call-ui): correct recording button states and stop confirmations
May 22, 2026
82f3afa
fix(ci): apply prettier formatting to call capture controls
May 22, 2026
45e8f82
fix(call-ui): show pulsing on-air record state when capture starts
May 22, 2026
591695e
fix(call-capture): actually start runtime and upload on stop
May 22, 2026
432a57b
fix(call-capture): keep session alive and show pause/stop menu
May 22, 2026
865e89e
fix(matrix): keep capture alive through transient group call errors
May 22, 2026
deeb93a
fix(ci): resolve duplicate isMatrixRateLimitedError export and format
May 22, 2026
4efe19f
fix(space-memory): save new memory to DB without web3 proposal
May 22, 2026
2c4a8ba
fix(space-memory): persist memories as document state memory
May 22, 2026
3d9321d
fix(space-memory): tier-1 stability for user-facing memory list
May 23, 2026
d394fc3
fix(space-memory): pass mxc_uri for call recording playback
May 23, 2026
39e0590
fix(human-chat): resolve prod_privy Matrix IDs to roster names after …
May 23, 2026
0e66db8
fix(chat): resolve reply preview names and reduce Matrix 429s
May 23, 2026
46cdfc5
fix(chat): hide privy IDs in signal team list until names resolve
May 23, 2026
e355f98
fix(space-memory): exclude decorative proposal header images
May 23, 2026
9ef6c72
fix(ui): stack alert dialogs above global call dock
May 23, 2026
4e848d7
fix(memory): require uploads, fix progress copy, close overlay
May 23, 2026
e96999a
fix(chat): satisfy usePersonBySub types and format test file
May 23, 2026
0b56a85
fix(spaces): remove gradient avatar fallback on banner reload
May 23, 2026
d94652e
fix(call-dock): flush video to frame and hide expand at medium size
May 23, 2026
4ed21ee
fix(space-memory): refresh list immediately after publishing memory
May 23, 2026
73cb65d
fix(space-memory): refresh list after call recording upload
May 23, 2026
8bd8aa9
fix(space-memory): show call transcript excerpt in timeline cards
May 23, 2026
f07001c
feat(space-memory): add Calls tab and route summaries to Conversations
May 23, 2026
bd50917
fix(call): hide local share preview and align local muted badge
May 23, 2026
8b78404
feat(call-dock): add document picture-in-picture floating window
May 23, 2026
55a5332
i18n: add strings for Calls tab, screen share, and call dock PiP
May 23, 2026
f13df78
fix(call-dock): sync theme styles into document PiP window
May 23, 2026
cddd20a
feat(call): side-by-side share layout in dock for multi-participant c…
May 23, 2026
efc52f6
fix(call-recording): flush MediaRecorder data before stop
May 23, 2026
e31dc52
fix(call): clarify error when capture upload has no data
May 23, 2026
411e186
fix(call): repair stop-recording dialog and capture control UX
May 23, 2026
8d6a206
feat(call): add capture consent helpers and banner component
May 23, 2026
81f3999
fix(call): strengthen capture consent wiring and pending controls
May 23, 2026
08d52fd
fix(call-dock): compact document picture-in-picture layout
May 23, 2026
3f2f3cd
feat(call): add Zoom-style capture voice announcements
May 23, 2026
dcdd6ed
feat(chat): add living thread summaries with org memory integration
May 23, 2026
c38b58c
fix(ci): resolve capturePending type error and epics tsc OOM
May 23, 2026
4cf0659
fix(ci): raise epics typecheck heap to 12GB
May 23, 2026
2f0ba01
fix(ci): give check-types 10GB heap on CI runners
May 23, 2026
96160b5
fix(ci): replace epics heap workaround with slim typecheck path
May 23, 2026
e70cd59
Revert "fix(ci): replace epics heap workaround with slim typecheck path"
May 23, 2026
2294c2f
Revert "fix(ci): give check-types 10GB heap on CI runners"
May 23, 2026
dfa6c5f
Revert "fix(ci): raise epics typecheck heap to 12GB"
May 23, 2026
d4a194d
Revert "fix(ci): resolve capturePending type error and epics tsc OOM"
May 23, 2026
a77c217
Revert "feat(chat): add living thread summaries with org memory integ…
May 23, 2026
041f3e1
Revert "feat(call): add Zoom-style capture voice announcements"
May 23, 2026
88b2926
fix(call): declare capturePending before captureStatusText
May 23, 2026
94d725d
fix(call): start capture on record button click
May 23, 2026
0886bca
style: format call capture files for CI
May 23, 2026
c2760db
fix(matrix): backoff room history scrollback on 429
May 23, 2026
54033ca
fix(call): restore capture menu UX and improve recording start
May 23, 2026
87bb879
fix(call): preserve capture errors and pin upload context for space m…
May 23, 2026
a548206
fix(call): retry capture start and preserve upload context for space …
May 23, 2026
9fb936e
fix(call): fall back to transcript-only when recording media missing
May 23, 2026
4fdc6b2
fix(call-artifacts): allow ingestion when room linkage metadata is stale
May 24, 2026
007994d
fix(call-artifacts): resolve target space from room fallback in uploa…
May 24, 2026
a5478b0
fix(call): persist transcript fallback marker and reduce noisy teleme…
May 24, 2026
fd5789f
fix(call): persist marker transcript when capture stops before runtim…
May 24, 2026
6c2086f
fix(call): ensure recorder generation with silent audio fallback track
May 24, 2026
360baba
fix(call): bootstrap capture runtime synchronously on mode select
May 24, 2026
0ac848e
fix(call): start capture without group call when Matrix state races
May 24, 2026
ae85720
fix(call): record from microphone when Matrix feeds are unavailable
May 24, 2026
23bba52
fix(call): satisfy TS control flow after async capture bootstrap
May 24, 2026
bfa4f6f
fix(call): recover from stale group call state stuck on connecting
May 24, 2026
a5d6665
fix(call): stop teardown effect from closing dock during join
May 24, 2026
7f3c6f5
fix(call): upload recordings via Matrix client and reduce video flicker
May 24, 2026
a6e5a8b
fix(call): improve capture consent banner contrast in call UI
May 24, 2026
d17ea49
fix(ui): add full-viewport alert dialog content option
May 24, 2026
c17007c
fix(call): improve stop-capture dialog overlay and copy
May 24, 2026
7b0157c
feat(call): add speaker-labeled live transcripts
May 24, 2026
50d140e
feat(call): include video track in call recordings
May 24, 2026
09cf721
feat(space-memory): show call recording preview with play button
May 24, 2026
f7c37ec
fix(ci): retry vercel deploy on transient API failures
May 24, 2026
9ff13bd
fix(call): address CodeRabbit capture upload review findings
May 24, 2026
cea1c0d
fix(ci): align prettier formatting with PR worktree
May 24, 2026
0f4738a
fix(call): improve dock UX, PiP audio, and recording upload limits
May 24, 2026
a42d77b
fix(call): use clearer icons on the call dock
May 24, 2026
a92ddec
fix(call): constrain call dock resize to usable bounds
May 24, 2026
dabbcfc
fix(call): add four-corner resize handles on call dock
May 24, 2026
8469a7d
fix(call): use icon-only screen share layout control in dock
May 24, 2026
a85f442
fix(chat): resolve privy IDs to member names in transcripts and TTS
May 24, 2026
f2f3143
fix(call): composite all participants in call recordings
May 24, 2026
7c85e93
fix(call): sync screenshare state and add takeover confirmation
May 24, 2026
439292d
fix(chat): style unread banner with space accent color
May 24, 2026
db807dc
fix(call): type screenshare takeover payload for RoomMessageEventContent
May 24, 2026
c162c85
fix(call): make return to space button navigate and open chat panel
May 24, 2026
4d801bb
fix(space-memory): show human-friendly titles instead of technical ids
May 24, 2026
4e8dbb3
feat(call): persist signal context on call artifact upload
May 24, 2026
f5ffe85
fix(chat): hide bridged privy ids after idle auth refresh
May 24, 2026
7336897
fix(chat): soften @mention pill styling in chat bubbles
May 24, 2026
e892173
fix(call): remove persistent capture-off hint from call dock
May 24, 2026
9967175
feat(space-memory): add fullscreen call recording player
May 24, 2026
0cdea76
feat(chat): navigate from mention inbox to source message
May 24, 2026
b40589a
fix(spaces): gate side panels by space activity transparency
May 24, 2026
108c231
fix(call): correct dock resize handles and edge dragging
May 24, 2026
046a865
fix(call): show participant sidebar only while presenting screen share
May 24, 2026
e2f999c
feat(call): store recordings in object storage with upload safeguards
May 24, 2026
673e374
fix(call): resolve typecheck error and format recording modules
May 24, 2026
bf9e611
fix(call): guard nullable recordingWarning in capture controls
May 24, 2026
cbd3662
fix(call): raise recording bitrates for clearer capture
May 24, 2026
0a7d593
fix(call): recover local camera after toggle off and on
May 24, 2026
6ccb439
fix(call): show participant-only layout when presenting screen share
May 24, 2026
0cf77ba
fix(chat): improve mention inbox readability and pill alignment
May 24, 2026
9303ed2
fix(call): improve audio/video reliability when joining calls
May 24, 2026
3a00811
fix(security): fail closed when call transcript job secret is missing
May 24, 2026
6830ec3
fix(security): require off-chain membership for call artifact upload
May 24, 2026
cd8c162
fix(security): restrict call artifact ingest to trusted media URLs
May 24, 2026
c6e2c74
fix(security): tighten object storage key matching for call recordings
May 24, 2026
7f44b6e
fix(security): cap transcript payload size on v1 call artifact ingest
May 24, 2026
d3be085
fix(call): skip sub-threshold silent call recording uploads
May 24, 2026
48fcf96
fix(chat): export mention replace helpers for inbox parsing
May 24, 2026
bd84efb
fix(chat): honor m.replace edits when listing mention inbox items
May 24, 2026
39de0aa
fix(chat): move call join alert mute control to join strip
May 24, 2026
8cd13ad
fix(call): preserve dock mode during upload and resume restore
May 24, 2026
abddc1c
fix(call): defer Matrix client recycle during active group calls
May 24, 2026
bdaec8e
fix(i18n): add missing Space Memory and AI panel locale keys
May 24, 2026
1d398ba
fix(call): improve group call recording quality settings
May 24, 2026
2cb6d7e
fix(call): use valid UploadThing max file size tier for recordings
May 24, 2026
d665091
fix(call): rebind local video when camera is turned back on
May 24, 2026
b9f8b48
fix(call): declare showVideo before video bind effect
May 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .agents/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ When the user has not specified a role, select the best-matching one based on th
| **Meta-Cognitive Reasoning Expert** | [roles/meta-cognitive-reasoning-expert.base.md](roles/meta-cognitive-reasoning-expert.base.md) | Structured problem-solving, confidence calibration, systematic verification, uncertainty reasoning, complex analysis |
| **Senior UI/UX Design Engineer** | [roles/senior-ui-ux-design-engineer.base.md](roles/senior-ui-ux-design-engineer.base.md) | UI design, component specs, design system, accessibility, Tailwind, packages/ui, Figma-to-code |
| **Senior Lead Fullstack Next.js Engineer** | [roles/senior-lead-fullstack-nextjs-engineer.base.md](roles/senior-lead-fullstack-nextjs-engineer.base.md) | Next.js architecture, App Router, React Server Components, server actions, route handlers, fullstack TypeScript, API design, caching, revalidation, performance, delivery leadership |
| **Senior OneSignal Notifications Engineer** | [roles/senior-onesignal-notifications-engineer.base.md](roles/senior-onesignal-notifications-engineer.base.md) | OneSignal, push notifications, email notifications, mention alerts, desktop notifications, mobile notifications, notification preferences, deep links, deliverability, notification architecture |
| **Senior OneSignal Expert** | [roles/senior-onesignal-expert.base.md](roles/senior-onesignal-expert.base.md) | OneSignal expert alias, mention notifications, push/email consent, notification delivery strategy, deep links |
| **Senior Neon Database Engineer** | [roles/senior-neon-db-engineer.base.md](roles/senior-neon-db-engineer.base.md) | Neon PostgreSQL, database schema design, migrations, query performance, index optimization, connection pooling, Row-Level Security, database InfoSec, Drizzle ORM, branching, `storage-postgres` |
| **Senior QA / Test Engineer** | [roles/senior-qa-test-engineer.base.md](roles/senior-qa-test-engineer.base.md) | QA strategy, Playwright E2E tests, test automation, accessibility testing, visual regression, performance testing, CI/CD test integration, WCAG compliance, axe-core, Vitest, test coverage |
| **Senior Application Security Engineer** | [roles/senior-application-security-engineer.base.md](roles/senior-application-security-engineer.base.md) | Application security, OWASP Top 10, threat modeling, secure code review, XSS, CSRF, SSRF, injection, auth bypass, CSP, CORS, security headers, dependency audit, supply chain security, secrets management, penetration testing, ASVS |
Expand Down
9 changes: 9 additions & 0 deletions .agents/roles/senior-onesignal-expert.base.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Senior OneSignal Expert System Message

This role is an alias for the OneSignal specialization used in Hypha.

Use the full role definition in:

- [Senior OneSignal Notifications Engineer](./senior-onesignal-notifications-engineer.base.md)

When activated, follow that role's identity, protocols, and quality checklist exactly.
136 changes: 136 additions & 0 deletions .agents/roles/senior-onesignal-notifications-engineer.base.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
# Senior OneSignal Notifications Engineer System Message

You are a senior notifications engineer specializing in OneSignal across web, desktop, email, and mobile push delivery. You design and implement reliable mention-driven notification systems for real-time chat products, with deep expertise in event pipelines, deliverability, user preference models, and deep-link routing.

**IMPORTANT:** You ALWAYS check the official OneSignal documentation at `https://documentation.onesignal.com/` before answering questions about SDK APIs, REST fields, aliases, subscriptions, segmentation, templates, or channel behavior. Notification APIs evolve quickly, so you prioritize current, version-accurate guidance over assumptions.

---

## Core Competencies

### Notification Platform

1. [Critical Analysis](../references/competencies/critical-analysis.md)
2. [Agile Delivery](../references/competencies/agile-delivery.md)

### Supporting Engineering Competencies

1. [Requirements Engineering](../references/competencies/requirements-engineering.md)
2. [Information Synthesis](../references/competencies/information-synthesis.md)

### Domain Specialization

Experienced in production notification engineering across multiple dimensions:

- **OneSignal Architecture:** App IDs, users/subscriptions, aliases and external IDs, segments, outcomes, templates, and channel orchestration.
- **Real-Time Triggering:** Mention/event fanout pipelines, idempotent delivery jobs, dedupe keys, retry/backoff, and dead-letter handling.
- **Cross-Channel Delivery:** Web push (service worker), desktop notifications, email notifications, and mobile push workflows with channel fallback.
- **Preference & Policy Models:** Per-user and per-room notification settings, mentions-only vs all messages, mute, quiet hours, and default inheritance.
- **Deep Link Reliability:** Deterministic URLs to room/thread/message targets with auth-aware routing and read-state transitions.
- **Observability & Quality:** Delivery metrics, open/click tracking, webhook feedback, bounce handling, and incident triage for silent notification failures.

---

## Methodologies

1. [Development Lifecycle](../references/methodologies/development-lifecycle.md)

---

## Best Practices

1. [Code Quality Best Practices](../references/best-practices/code-quality.md)
2. [Truthfulness & Integrity](../references/best-practices/truthfulness-integrity.md)

---

## Collaboration

[Cross-Functional Collaboration](../references/collaboration/cross-functional-teams.md)

---

## Tools & Techniques

[Development Tooling](../references/tools/development-tooling.md)

---

## Engagement Model

[Implementation Engagement Model](../references/engagement-models/implementation-engagement.md)

---

## Output Standards

1. [Code Output Standards](../references/output-standards/code-output-standards.md)
2. [Actionable Recommendations](../references/output-standards/actionable-recommendations.md)

---

## Notification Engineering Philosophy

Design notifications so users trust them: timely, relevant, and never noisy.

- Mentions are high-intent events and must be delivered quickly and consistently.
- Delivery is not success; actionability is success (deep links must land in exact context).
- Preference controls must be predictable and explicit (inherit, override, mute).
- Every notification path needs observability and replay-safe behavior.
- Quiet defaults beat spam defaults; escalation should be intentional.

---

## OneSignal Delivery Playbook

When implementing mention-driven notifications:

1. **Model the event contract** — Define mention event shape, IDs, actor/target, room/thread/message references, and idempotency key.
2. **Map recipients to OneSignal identity** — Resolve aliases/external IDs to active subscriptions by channel.
3. **Apply preferences before send** — Enforce user/channel policy (mentions-only, all, mute) before queueing.
4. **Send across channels with guardrails** — Push first, email fallback when user is offline or unsubscribed from push.
5. **Generate exact deep links** — Include room/thread/message route data and resilient post-login redirect behavior.
6. **Observe and verify** — Track send, delivery, click-through, and failures with actionable alerts.

---

## Documentation-First Protocol

**CRITICAL:** Before answering any question about OneSignal setup or delivery behavior:

1. **Check OneSignal Docs** — Reference `https://documentation.onesignal.com/` for current SDK and REST semantics.
2. **Verify channel context** — Distinguish web push vs mobile push vs email requirements and constraints.
3. **Confirm identity model** — Verify whether aliases/external IDs/subscriptions are used in the project and map correctly.
4. **Check platform prerequisites** — Service worker, origin constraints, keys, and app configuration for the relevant environment.
5. **Cite sources** — Reference relevant documentation pages when giving recommendations.

---

## Quality Checklist

Before delivering guidance or implementation plans, verify:

- [ ] OneSignal docs were checked for each used API field/SDK behavior.
- [ ] Mention trigger and idempotency rules are clearly defined.
- [ ] Deep links include room/thread/message and auth-safe routing behavior.
- [ ] Notification preferences and overrides are explicit and testable.
- [ ] Retry, dedupe, and failure observability are addressed.
- [ ] Web, desktop, and mobile channel coverage is explicit.
- [ ] Recommendations are maintainable in a multi-team codebase.

---

## Response Protocol

When given a notification challenge:

1. **Verify docs first** — Check OneSignal docs for exact API/SDK behavior.
2. **Clarify event flow** — Identify source event, recipients, channels, and intended UX outcome.
3. **Design the contract** — Define payload schema, deep-link contract, and preference gates.
4. **Propose implementation slices** — Break down into backend trigger, client routing, and QA instrumentation steps.
5. **Validate operationally** — Include metrics, alert thresholds, and rollback/mitigation guidance.
6. **Ship with tests** — Include unit/integration/e2e validation across mention creation and open-through flow.

---

_Remember: a great chat notification system is invisible when correct and painful when wrong. Optimize for trust, timeliness, and precision._
28 changes: 19 additions & 9 deletions .github/workflows/deploy-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,8 @@ jobs:

- name: Post Schema Diff Comment to PR
if: needs.detect-changes.outputs.has_migrations == 'true'
continue-on-error: true
timeout-minutes: 2
uses: neondatabase/schema-diff-action@v1
with:
project_id: ${{ secrets.NEON_PROJECT_ID }}
Expand All @@ -165,15 +167,23 @@ jobs:
# GITHUB_OUTPUT breaks when the capture is multiline, leaving preview_url empty and
# breaking `vercel alias`. Parse the deployment URL explicitly.
export CI=1 FORCE_COLOR=0 NO_COLOR=1
deploy_output="$(
vercel deploy --prebuilt --yes \
--token="${VERCEL_TOKEN}" \
--env "BRANCH_DB_URL=${BRANCH_DB_URL:-}" \
2>&1
)" || {
printf '%s\n' "${deploy_output}"
exit 1
}
deploy_output=""
for attempt in 1 2 3; do
if deploy_output="$(
vercel deploy --prebuilt --yes \
--token="${VERCEL_TOKEN}" \
--env "BRANCH_DB_URL=${BRANCH_DB_URL:-}" \
2>&1
)"; then
break
fi
if [ "${attempt}" -eq 3 ]; then
printf '%s\n' "${deploy_output}"
exit 1
fi
echo "vercel deploy failed (attempt ${attempt}/3), retrying in 30s..."
sleep 30
done
preview_url="$(
set +o pipefail
printf '%s\n' "${deploy_output}" \
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ vitest.config.*.timestamp*
.playwright-cli/
test-results/
playwright-report/

# Local Claude Code overrides (contributor-specific, not shared)
**/CLAUDE.local.md
.tmp_pr*_threads_now.json
.tmp_pr*_unresolved_slim.json
40 changes: 25 additions & 15 deletions apps/api/src/routes/v1/wallet/receive/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,32 @@ import type { FastifyInstance } from 'fastify';
import { schema, type Schema } from './schema';

export default async function receiveRoutes(app: FastifyInstance) {
app.get<Schema>('/', { schema }, async (request, reply) => {
const authToken = request.headers.authorization?.split(' ').at(1);
if (authToken == null) return reply.unauthorized();
app.get<Schema>(
'/',
{
schema,
config: {
rateLimit: { max: 100, timeWindow: '1 minute' },
},
},
async (request, reply) => {
const authToken = request.headers.authorization?.split(' ').at(1);
if (authToken == null) return reply.unauthorized();

const userAddress = (await app.db.findPersonByAuth({ authToken }))?.address;
if (!userAddress) return reply.notFound('User not found');
const userAddress = (await app.db.findPersonByAuth({ authToken }))
?.address;
if (!userAddress) return reply.notFound('User not found');

const { chain, tokenId } = request.query;
if (tokenId != null) {
// TODO: check if user can receive the token
}
const { chain, tokenId } = request.query;
if (tokenId != null) {
// TODO: check if user can receive the token
}

return {
network: chain,
address: userAddress,
qr_code_url: `ethereum:${userAddress}`,
};
});
return {
network: chain,
address: userAddress,
qr_code_url: `ethereum:${userAddress}`,
};
},
);
}
Loading
Loading