-
Notifications
You must be signed in to change notification settings - Fork 24
chore: catch 2.6.x up with latest main updates #671
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Conversation
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
chore: sync v2.6-rc docs from 2.6.x branch
* Add member search, introduction emails, and analytics Features: - search_members tool for Addie to find member organizations - request_introduction tool to send introduction emails via Resend - Member search analytics tracking (impressions, clicks, introductions) - Admin analytics endpoint and Addie tool for viewing search analytics - Improved member profile search to include offerings and tokenize queries Security: - Event delegation for member card clicks (no inline onclick) - Email validation for introduction requests - Subject line sanitization for introduction emails 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Fix migration version conflict (141 -> 142) Renamed member_search_analytics migration from 141 to 142 to avoid conflict with 141_fix_feed_email_slugs.sql on main branch. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Public API: Include 'completed' events when querying past events (?past=true) - Addie: Rename list_upcoming_events to list_events with include_past option - Registration: Match by email in addition to workos_user_id This allows Luma-imported registrations (which only have email) to be associated with users who later sign up with the same email. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
#628) * Skip welcome goals for highly engaged users The outbound planner was suggesting the "Welcome - What Brings You" goal to users who are clearly already engaged with the community (e.g., committee leaders, working group members). These users don't need to be asked what brings them here. Added eligibility check to skip intro goals for users who show any of these engagement indicators: - Committee leader status - Working group membership - Council membership - 10+ Slack messages in the last 30 days 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Add passive note extraction from public channels Two improvements to how Addie understands members: 1. Enriched LLM context in outbound planner: - Role in Community now prominently shows Committee Leader, Council Member, WG Member - Notes from channel conversations displayed separately for context - Removed duplicate committee leader from capabilities section 2. Passive note extraction from public channels: - New 'note' insight type for storing interesting tidbits as text - Watches all public channels Addie is in - Rate-limited queue (5s between LLM calls) to avoid API overload - Only extracts notable statements (interests, what they're building, opinions) - Stores as observations with medium confidence Example flow: Christina posts "I'm really interested in doing more with user data" → Extracted note: "Mentioned being interested in doing more with user data (in #wg-creative)" → Shows in planner context: "Notes from Channel Conversations: - Mentioned being interested..." 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Fix duplicate migration version number Rename 141_note_insight_type.sql to 142_note_insight_type.sql since 141_fix_feed_email_slugs.sql already exists on main. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Fix migration version conflict (142 -> 143) Rename note_insight_type migration to 143 since 142_member_search_analytics.sql was added to main. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…642) The company profile modal on the dashboard was getting stuck on "Saving..." when users selected "Data & Measurement" or "AI & Tech Platforms" because the backend validation only accepted 5 company types (brand, publisher, agency, adtech, other) while the frontend offered 7. Changes: - Update billing-public.ts and organizations.ts to use centralized COMPANY_TYPE_VALUES instead of hardcoded arrays - Add migration to update database CHECK constraint to accept all types - Update admin-tools.ts MCP schema enums to use centralized values 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* fix: industry alerts not posting to Slack channels The `hasAlertedPerspective()` check was blocking articles from being posted to real Slack channels if they had already been posted to website-only channels. The function checked if a perspective was alerted to ANY channel, but the SQL query already handles per-channel deduplication via the NOT EXISTS clause with channel_id filter. Changes: - Remove redundant hasAlertedPerspective() call from processAlerts() - Remove unused hasAlertedPerspective() function - Remove unused getPerspectivesToAlert() function (had same bug) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: sync package-lock.json version 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Replace filesystem symlinks (v2, v2.5, v1) with dynamic HTTP middleware that resolves version aliases at request time. This improves Docker compatibility where symlinks can cause issues. Changes: - Add version alias middleware that rewrites /v2.5/* → /2.5.1/* - Fix version matching bug: use semver parsing instead of string prefix matching - Add caching for version directory listing (60s TTL) - Add directory redirect middleware to serve /schemas/2.6.0/ → /schemas/2.6.0/index.json - Add schema discovery endpoint at GET /schemas/ with available versions and aliases - Remove createSymlink() function from build script 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
- Add hasRelevantUpcomingEvents() to check if user has relevant events - Skip "Discover Events" goal when no relevant events exist for user - Personalize list_events tool to show only relevant events: - Events user is registered for - Events at industry gatherings they're interested in - Events in regional chapters they're members of - Major global summits - Exclude virtual webinars (belong in education goals) - Prompt users to share location when unknown - Fix N+1 query in chapter events lookup (single query with unnest) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…ty parsing (#647) - Add generic numeric HTML entity decoding (’ etc) using fromCodePoint - Populate published_at field in addie_knowledge for proper chronological sorting - Normalize article URLs before storage to prevent duplicates across feeds - Add migration to backfill published_at and clean up existing duplicates 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add error hook system to Pino logger that captures error/fatal logs - Create initPostHogErrorTracking() to connect logger to PostHog - Remove duplicate captureException call in global error handler - Add rate limiting (100ms) and deduplication (5s window) to prevent flooding - Use addEventListener instead of window.onerror to not overwrite handlers - Add try-catch around PostHog client initialization All logger.error() calls are now automatically captured to PostHog with module context and stack traces when POSTHOG_API_KEY is configured. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Remove engagement_reasons column from queries (computed dynamically, not stored) - Fix next_step/next_step_due_date references to use org_activities table - Fix stripe_subscription_status to use correct subscription_status column These columns were queried from the organizations table but either: 1. Don't exist (engagement_reasons is computed in functions) 2. Are on a different table (next_step fields are on org_activities) 3. Have a different name (subscription_status not stripe_subscription_status) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add RSS content validation to detect when feeds return HTML instead of XML (e.g., when sites disable their RSS feeds and redirect to homepage) - Allow NULL feed_url for email-only feeds in database schema - Update getFeedsToFetch() to exclude email-only feeds (feed_url IS NULL) - Migrate existing email:// placeholder URLs to NULL 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Two improvements to Addie's conversational behavior in Slack threads: 1. Auto-respond in active threads: When a user replies to a thread where Addie has already participated, Addie now responds automatically without requiring an explicit @mention. This creates natural conversation flow - users can say "Yes please" to Addie's follow-up questions without needing to @mention her again. 2. Conversation history for @mentions: Addie now remembers what she said in previous @mention interactions. Previously, she only had access to other users' messages in the thread (not her own), which caused hallucinations where she would confabulate what she had previously said/done. Implementation details: - Added checkAddieThreadParticipation() to detect Addie's presence in threads - Added handleActiveThreadReply() to handle implicit mentions in active threads - Added conversation history fetching to handleAppMention() for Claude context - Optimized to reuse thread messages from participation check (single API call) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…lity (#646) Changes all schemas from additionalProperties: false to additionalProperties: true. This enables clients running older versions to accept responses from servers with newer schemas without breaking validation - a standard practice for protocol evolution in distributed systems. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
…654) This PR addresses an issue where committee leaders were showing as Slack user IDs (like U0A1RAMRWNS) instead of their names. Changes: - Add LEFT JOIN to slack_user_mappings in getLeaders/getLeadersBatch to look up names for leaders stored with Slack user IDs - Add resolveSlackMentions() to convert <@u123> to <@u123|Name> before sending to LLM, so Claude/Addie can correctly identify mentioned users - Update add/remove_committee_leader handlers to auto-resolve Slack IDs to WorkOS IDs when possible - Use more robust Slack ID pattern matching (/^U[A-Z0-9]{8,}$/) - Escape $ characters in names during replacement to prevent issues 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Always show all price tiers (no personalization based on login) - Company Membership now displays both $10K ($5M+) and $2,500 (Under $5M) tiers - Industry Council Leader uses "Sign Up Now" button instead of "Contact Us" - Remove invoice request modal and related code - All tiers use unified signup flow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add founding member designation for members who joined before April 1, 2026 - Add is_founding_member column to member_profiles with migration - Display founding member badge on member cards and detail view - Fix invoice voiding/deletion to immediately update local cache (don't wait for webhook) - Add invoice deduplication in Stripe queries to prevent duplicates - Fix XSS vulnerability in org-index.html dynamic member rendering - Update AAO homepage with "Go Agentic" section and static founding member logos 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Remove JS references to non-existent HTML elements (engagedProspects, trials) - Move /accounts/view-counts route before /accounts/:orgId to fix 404 - Add early error buffer to capture JS errors before PostHog loads 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
#658) - Add OpenTelemetry logging integration for PostHog Logs feature - New otel-logs.ts module with OTLP HTTP exporter - Integrates with Pino logger via setLogHook() - Configurable min log level via OTEL_MIN_LOG_LEVEL env var - Configurable service name via OTEL_SERVICE_NAME env var - Reads version from package.json for accurate version tracking - Fix client-side JavaScript errors shown in PostHog Error Tracking: - admin-prospects.html: Fix quickInvoice() referencing non-existent invoice-step elements - dashboard.html: Add optional chaining for DashboardNav.showLeadershipNav to handle cached JS files - Performance optimization: Add early return in logger hook when no hooks are set to avoid unnecessary argument parsing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add new Activity tab showing unified activity stream (Slack, emails, events, payments, working groups) - Fix "Needs Attention" to exclude paying members in good standing - Fix fire emoji display by removing letter-spacing that broke rendering - Loosen "Hot Prospects" criteria (engagement >= 50 OR high interest) - Extend "New Insights" from 7 days to 30 days - Add source filter validation for security - Improve escapeHtml to handle quotes - Add expiring_soon attention badge styling 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Website/app-only changes should not bump the protocol version. Converted 18 changesets to empty format (---\n---) so they don't trigger version bumps in adcontextprotocol. Changes affected: - Addie bot fixes (DM threading, email linking, role suggestions, etc.) - Admin UI improvements (clickable username, engagement scoring) - Documentation fixes (broken links, versioning) - Various app fixes (daily digest, company validation, login display) Kept protocol version bumps for actual schema changes: - allow-extra-fields.md (additionalProperties change) - error-details-type.md (error.json details property) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: decode HTML entities in news feed API responses RSS feeds sometimes contain HTML entities like ' (apostrophe) that weren't being decoded before being displayed in the API responses. Changes: - Create shared decodeHtmlEntities utility in server/src/utils/html-entities.ts - Apply HTML entity decoding in /api/latest/sections/:slug/articles endpoint - Apply HTML entity decoding in /api/latest/featured endpoint - Apply HTML entity decoding in admin feeds route for article titles - Consolidate duplicate decodeHtmlEntities implementations across codebase - Add unit tests for the HTML entities utility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: add empty changeset for HTML entities fix 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
For security, billing notifications should not go to public channels. This change: - Only shows private channels in the billing channel dropdown - Adds server-side validation to reject public channel IDs - Shows a helpful message when no private channels are found 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Show actual user names instead of raw Slack user IDs in the admin outreach history table. Joins member_outreach with slack_user_mappings to fetch display_name/real_name, falling back to slack_user_id if no name is available. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add collapse/expand button to chat sidebar (like Claude's UI) - Persist collapsed state in localStorage - Fix iframe sandbox to allow external links to open in browser - Add proper ARIA attributes for accessibility - Add focus-visible styles for keyboard navigation - Handle localStorage unavailability in private browsing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Names like "Brian O'Kelley" were causing JavaScript syntax errors when clicking on user name links because the apostrophe broke the string in onclick attributes. Added escapeJs() function to properly escape strings for JavaScript contexts and updated all onclick handlers that include user names to use it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
The Home button in the Addie chat sidebar was clearing the entire messagesContainer innerHTML, which destroyed the addieHomeContainer element that lives inside it. After clearing, trying to show the home content failed silently because the elements no longer existed. Changes: - Add clearChatMessages() helper that selectively removes only .message elements instead of wiping the entire container - Update switchToHome, switchToConversation, and startNewChat to use the new helper - Add proper visibility toggling for addieHomeContainer in addMessage() and createStreamingMessage() to ensure home content hides when chatting 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Slack-only users (those who haven't signed up for an AAO account) were showing empty engagement scores in the admin dashboard. This updates the unified_contacts view to compute scores on-the-fly based on: - Slack activity (messages, reactions, thread replies) from last 30 days - Addie conversations and insights from last 30 days Uses LATERAL joins for efficient single-pass computation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…pages (#666) Fixed two issues reported by David Porzelt on the German chapter page: 1. Duplicate members in chapter lists - Users belonging to multiple organizations appeared multiple times due to a SQL JOIN that returned multiple rows per user. Fixed by using LEFT JOIN LATERAL with LIMIT 1 to ensure only one organization membership row per user. 2. Leader actions not working - The /api/config endpoint was not returning the user's ID, causing the frontend leader check to always fail since currentUser.id was undefined. Added id field to the response. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Remove 3 value prop points from hero section (index.html) - Move Go Agentic section immediately after release banner - Remove gray mission statement band (org-index.html) - Tighten hero padding and typography on both pages - Update Go Agentic prompts to be more actionable - Add focus states for accessibility - Standardize prompt hint styling across both pages 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…on (#668) - Simplified engagement scoring: 10 points per Slack action + 20 points per event (capped at 100). Removed email engagement, conversation score, and complex org_activities scoring - these either weren't good signals or measured things that were on us to initiate, not the member. - Fixed working group count to include leaders as implicit members. Committee leaders were tracked in working_group_leaders but not counted in working_group_count, which only queried working_group_memberships. - Committee leaders no longer receive "Discover Working Groups" recommendations, which was nonsensical for someone leading 3 groups. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Merged 32 commits from main including: - Schema: Allow additional properties for forward compatibility (#646) - Schema versioning: Replace symlinks with HTTP middleware (#644) - Workflow: Add schema sync to versioned docs (#639) - Addie: Home button fix, sidebar, thread flow improvements - Admin: PostHog integration, activity feed, engagement scoring - Slack: User mentions, leader names, channel fixes - Members: Search, intro emails, founding badge - Server: Company type validation, HTML entity parsing Conflicts resolved: - .github/workflows/sync-versioned-docs.yml: kept main version with schema sync - package-lock.json: accepted main version
Rebuilds 2.6.0 schemas to include the relaxed validation from #646. All schema objects now allow unknown fields for forward compatibility.
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.
catch 2.6.x up with latest main updates