Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
9c76b4e
feat(notifications): add mention consent and OneSignal role scaffolding
May 19, 2026
aa7f199
feat(chat): dispatch mention push/email notifications after send
May 19, 2026
a32dcef
fix(chat): harden mention deep-link fallback and add helper tests
May 19, 2026
a2b8829
fix(agents): restart ordered list numbering in OneSignal role
May 19, 2026
9805981
fix(i18n): remove hardcoded mention consent label fallback
May 19, 2026
16507b3
style: apply prettier fixes for PR CI main check
May 19, 2026
e89e605
fix(chat): load mention candidates from space room in signal threads
May 19, 2026
cd7a952
style(chat): format human-right-panel mention candidate block
May 19, 2026
276064d
docs(requirements): add team-scoped signal collaboration spec
May 19, 2026
5afbacc
feat(chat): add team-scoped interaction controls for signal threads
May 19, 2026
e3db64f
feat(notifications): move mention consent into get-notified section
May 19, 2026
17d5485
fix(chat): encode signal-team updates as room messages
May 19, 2026
121817e
fix(chat): use notice msgtype for signal team timeline events
May 19, 2026
b091ba4
fix(chat): refresh mention candidates for parent room membership
May 19, 2026
9b7ad8d
fix(chat): build mention links from canonical space route
May 19, 2026
16b6350
fix(notifications): surface mention delivery channel failures
May 19, 2026
96ed7a8
fix(notifications): sanitize mention email links and escape href attr…
May 19, 2026
381d676
fix(chat): use MsgType.Notice for signal team events
May 19, 2026
13e53a7
fix(chat): use body markers for signal team timeline metadata
May 19, 2026
aac4e5e
fix(chat): cast signal team message payloads for matrix sendEvent
May 19, 2026
4256798
fix(chat): enforce signal-team mention and call access
May 19, 2026
f9fb09c
feat(onboarding): update adventure subtitle across locales
May 19, 2026
2cfae14
fix(docs): normalize ordered-list numbering in chat requirements
May 19, 2026
14e7377
fix(chat): block attachment draft ingestion when composer is locked
May 19, 2026
259bb60
fix(chat): show lock-specific mention tooltip when composer is read-only
May 19, 2026
cad465a
fix(chat): handle signal-team publish failures safely
May 19, 2026
1d74e06
fix(chat): surface request-to-join send failures in signal threads
May 19, 2026
edac56a
fix(chat): handle signal-team approval failures explicitly
May 19, 2026
4093c15
fix(chat): include spaceSlug in mention deep-link dependencies
May 19, 2026
e6850e3
fix(notifications): default mention consent to yes for legacy configs
May 19, 2026
c952677
fix(i18n): improve natural english mention consent wording
May 19, 2026
48120a4
fix(i18n): localize signal-team thread strings in german
May 19, 2026
d422b55
fix(i18n): translate signal-team thread copy in spanish
May 19, 2026
debc09b
fix(i18n): localize signal-team messages in french
May 19, 2026
452684b
fix(i18n): translate signal-team strings in portuguese
May 19, 2026
8c8277b
fix(chat): resolve signal-team member labels via matrix profiles
May 19, 2026
07f2998
fix(chat): harden signal-team UX and archive signal controls
May 19, 2026
3cb4571
fix(chat): route mention clicks to the correct thread context
May 19, 2026
e79f769
fix(chat): lock and grey out composer actions for non-team members
May 19, 2026
129e0da
feat(coherence): add saved signal boards and compact card layout
May 19, 2026
3459ed4
fix(ci): resolve coherence board typing and formatting
May 19, 2026
f118aaa
feat(coherence): improve board filters and archive interactions
May 19, 2026
2b3c8aa
fix(coherence): keep archive label on one line
May 19, 2026
996ca54
fix(coherence): slightly reduce signal card header height
May 19, 2026
ba0e12e
fix(coherence): align signal grid breakpoints with proposals
May 19, 2026
40c652a
fix(chat): restore signal form sections and member name fallback
May 19, 2026
fa071d1
fix(ci): address typecheck and formatting regressions
May 19, 2026
5053c13
fix(coherence): refine card overlays and board toolbar controls
May 19, 2026
643e587
feat(coherence): add board editing and compact board actions
May 19, 2026
273f448
fix(ui): make proposal and signal grids downshift earlier
May 19, 2026
3448091
fix(chat): align signal-team panel styling and labels
May 19, 2026
39d4346
fix(chat): unify signal-team labels with mention resolver
May 19, 2026
a17f684
fix(ui): keep tag picker all-tags action clickable in dialogs
May 19, 2026
49d5a4a
fix(ui): refine accent controls across chat and coherence panels
May 19, 2026
0cf46a2
fix(coherence): wrap board filters to right-aligned second row
May 19, 2026
c0f60d1
fix(coherence): move signal metadata off image overlay
May 19, 2026
ad4900a
fix(coherence): polish signal cards and fill grid rows
May 19, 2026
3b2ae07
fix(coherence): soften signal card footer action styling
May 19, 2026
b0d9139
fix(coherence): add type and priority icons to signal badges
May 19, 2026
69553d2
fix(coherence): rebalance signal card header and metadata hierarchy
May 19, 2026
892ae38
fix(coherence): restore badge contrast with colored icons
May 19, 2026
584a8f6
fix(coherence): align signal card action buttons with title row
May 19, 2026
d06645c
fix(coherence): enrich creator metadata and default signal team membe…
May 19, 2026
ae05d7e
fix(chat): publish signal team updates only on done
May 19, 2026
d48235a
fix(coherence): improve board dialog tag controls interaction
May 19, 2026
8442c8f
fix(chat): trust signal-team marker events only from authorized senders
May 19, 2026
ed6ff83
fix(notifications): verify auth token before mention fanout
May 19, 2026
3958e1d
refactor(chat): type signal-team event payloads
May 19, 2026
0aae660
fix(notifications): correct invalid consent row DOM nesting
May 19, 2026
6c690ad
fix(i18n): polish onboarding subtitle phrasing
May 19, 2026
2c0f960
fix(ci): resolve check-types and formatting regressions
May 19, 2026
4497327
fix(chat): align signal-team event typing with matrix message content
May 19, 2026
b5359df
fix(coherence): add accessible label for signal message count
May 20, 2026
be76da7
fix(call-ui): localize dock resize handle labels
May 20, 2026
54264bf
fix(chat): refresh coherence mentions on parent room membership changes
May 20, 2026
e67100f
fix(i18n): localize remaining Portuguese AI hero copy
May 20, 2026
3b593ae
fix(matrix): pause token SWR until jwt is available
May 20, 2026
18643ac
fix(onboarding): localize hero heading instead of hardcoded English
May 20, 2026
c05a065
test(e2e): add axe audit to ecosystem logo panel test
May 20, 2026
c3a8e4f
fix(onboarding): restore adventure page state to resolve typecheck
May 20, 2026
90fbe6d
fix(coherence): restore signal card type priority and creator metadata
May 20, 2026
774dfcc
Revert "fix(onboarding): restore adventure page state to resolve type…
May 20, 2026
ac466e8
fix(coherence): refine signal card badge and avatar styling
Jun 26, 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._
19 changes: 19 additions & 0 deletions apps/web-e2e/src/panels-space-context.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';
import { gotoApp } from './utils/nav-url';

/**
Expand Down Expand Up @@ -49,6 +50,24 @@ test.describe('Panels visible on space pages', () => {

await expect(page.getByRole('button', { name: AI_TRIGGER })).toBeVisible();
});

test('ecosystem logo should link to root space configuration', async ({
page,
}) => {
await gotoApp(page, '/en/dho/hypha/agreements');
await page.waitForLoadState('domcontentloaded');
const a11y = await new AxeBuilder({ page }).analyze();
expect(a11y.violations).toEqual([]);

const ecosystemLogoLink = page.getByRole('link', {
name: 'Ecosystem Logo',
});
await expect(ecosystemLogoLink).toBeVisible();
await expect(ecosystemLogoLink).toHaveAttribute(
'href',
/\/en\/dho\/[^/]+\/agreements\/space-configuration$/,
);
});
});

test.describe('Panels hidden on non-space pages', () => {
Expand Down
24 changes: 22 additions & 2 deletions apps/web/src/app/[lang]/dho/[id]/@aside/[tab]/new-signal/page.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,36 @@
import { CreateSignalForm, ProposalOverlayShell } from '@hypha-platform/epics';
import { getDhoPathCoherence } from '../../../@tab/coherence/constants';
import { Locale } from '@hypha-platform/i18n';
import { findSpaceBySlug } from '@hypha-platform/core/server';
import { COHERENCE_TAGS, findSpaceBySlug } from '@hypha-platform/core/server';
import { db } from '@hypha-platform/storage-postgres';
import { notFound } from 'next/navigation';

type PageProps = {
params: Promise<{ lang: Locale; id: string; tab: string }>;
searchParams: Promise<{ boardTag?: string | string[] }>;
};

export default async function NewSignalPage({ params }: PageProps) {
export default async function NewSignalPage({
params,
searchParams,
}: PageProps) {
const { lang, id } = await params;
const { boardTag } = await searchParams;

const spaceFromDb = await findSpaceBySlug({ slug: id }, { db });

if (!spaceFromDb) notFound();

const boardTagsRaw = Array.isArray(boardTag)
? boardTag
: boardTag
? [boardTag]
: [];
const canonicalTags = new Set(COHERENCE_TAGS as readonly string[]);
const inheritedBoardTags = [...new Set(boardTagsRaw.map((tag) => tag.trim()))]
.filter(Boolean)
.filter((tag) => canonicalTags.has(tag));

const successfulUrl = getDhoPathCoherence(lang, id);
return (
<ProposalOverlayShell>
Expand All @@ -24,6 +39,11 @@ export default async function NewSignalPage({ params }: PageProps) {
closeUrl={successfulUrl}
backUrl={successfulUrl}
spaceId={spaceFromDb.id}
initialValues={
inheritedBoardTags.length > 0
? { tags: inheritedBoardTags }
: undefined
}
/>
</ProposalOverlayShell>
);
Expand Down
Loading