diff --git a/.changeset/account-lifecycle-stage.md b/.changeset/account-lifecycle-stage.md deleted file mode 100644 index 1a3d295713..0000000000 --- a/.changeset/account-lifecycle-stage.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Internal tooling: Add unified account lifecycle stage to admin tools diff --git a/.changeset/activity-user-names.md b/.changeset/activity-user-names.md deleted file mode 100644 index 3b1026e46e..0000000000 --- a/.changeset/activity-user-names.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Display user names instead of Slack IDs in proactive outreach history diff --git a/.changeset/add-update-meeting-tool.md b/.changeset/add-update-meeting-tool.md new file mode 100644 index 0000000000..9710cb748f --- /dev/null +++ b/.changeset/add-update-meeting-tool.md @@ -0,0 +1,13 @@ +--- +--- + +feat: Add update_meeting tool to Addie + +Added a new tool that allows updating existing meetings through conversation: +- Change title, description, or agenda +- Reschedule to a new time (properly handles timezone conversion) +- Update duration + +Updates are synchronized to Zoom and Google Calendar when those integrations +are configured. This enables fixing meeting times or details without having +to cancel and recreate. diff --git a/.changeset/addie-bot-token-fix.md b/.changeset/addie-bot-token-fix.md deleted file mode 100644 index b527df12db..0000000000 --- a/.changeset/addie-bot-token-fix.md +++ /dev/null @@ -1,8 +0,0 @@ ---- ---- - -Server-only: Fix Addie using wrong bot token to send messages. - -Addie was using SLACK_BOT_TOKEN (AAO bot) to send messages, which -failed with channel_not_found because Addie's DM channels are only -accessible via ADDIE_BOT_TOKEN. diff --git a/.changeset/addie-code-version.md b/.changeset/addie-code-version.md new file mode 100644 index 0000000000..6d641bb2b2 --- /dev/null +++ b/.changeset/addie-code-version.md @@ -0,0 +1,5 @@ +--- +"adcontextprotocol": patch +--- + +Add Addie code version tracking and shorter performance timeframes diff --git a/.changeset/addie-dm-no-threading.md b/.changeset/addie-dm-no-threading.md deleted file mode 100644 index 7c2dd05f25..0000000000 --- a/.changeset/addie-dm-no-threading.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix DM response posting as thread instead of regular message diff --git a/.changeset/addie-first-dm-fix.md b/.changeset/addie-first-dm-fix.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/addie-first-dm-fix.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/addie-home-nav-fix.md b/.changeset/addie-home-nav-fix.md deleted file mode 100644 index c9428e1ddd..0000000000 --- a/.changeset/addie-home-nav-fix.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix Addie chat home button navigation - clicking Home now properly shows the dashboard diff --git a/.changeset/addie-knowledge-improvements.md b/.changeset/addie-knowledge-improvements.md deleted file mode 100644 index 75e77a5735..0000000000 --- a/.changeset/addie-knowledge-improvements.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Addie admin improvements: Unified Knowledge Base tab, Slack message indexing, and curated content system. Server-only changes, no protocol impact. diff --git a/.changeset/addie-newline-fix.md b/.changeset/addie-newline-fix.md deleted file mode 100644 index 1658dde4dd..0000000000 --- a/.changeset/addie-newline-fix.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix missing newlines between context sections in Addie message formatting diff --git a/.changeset/addie-news-feeds.md b/.changeset/addie-news-feeds.md deleted file mode 100644 index babf21bb3d..0000000000 --- a/.changeset/addie-news-feeds.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add get_recent_news tool to Addie for browsing curated industry feeds diff --git a/.changeset/addie-role-suggestions.md b/.changeset/addie-role-suggestions.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/addie-role-suggestions.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/addie-slack-endpoint.md b/.changeset/addie-slack-endpoint.md deleted file mode 100644 index ce0693d8b8..0000000000 --- a/.changeset/addie-slack-endpoint.md +++ /dev/null @@ -1,18 +0,0 @@ ---- ---- - -Server-only changes: Refactor Slack endpoints with consistent URL structure. - -**BREAKING CHANGE:** Slack endpoint URLs changed: -- AAO bot: `/api/slack/events` → `/api/slack/aaobot/events` -- AAO bot: `/api/slack/commands` → `/api/slack/aaobot/commands` -- Addie: Added `/api/slack/addie/events` - -Update Slack app Event Subscription URLs in production. - -Also: -- Extract Slack middleware to `server/src/middleware/slack.ts` -- Extract public Slack routes to `server/src/routes/slack.ts` -- Extract admin Slack routes to `server/src/routes/admin/slack.ts` -- Extract admin Email routes to `server/src/routes/admin/email.ts` -- Create shared unified users cache in `server/src/cache/unified-users.ts` diff --git a/.changeset/addie-thread-reply-fix.md b/.changeset/addie-thread-reply-fix.md deleted file mode 100644 index 88e73d82fb..0000000000 --- a/.changeset/addie-thread-reply-fix.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix Addie mentions to reply in threads with full context diff --git a/.changeset/addie-thread-sharing.md b/.changeset/addie-thread-sharing.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/addie-thread-sharing.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/addie-user-simulation.md b/.changeset/addie-user-simulation.md deleted file mode 100644 index 2e2228725e..0000000000 --- a/.changeset/addie-user-simulation.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add admin user simulation support for Addie web chat debugging (server-side implementation only, no protocol changes). diff --git a/.changeset/afraid-ends-mate.md b/.changeset/afraid-ends-mate.md deleted file mode 100644 index 6dcf0b4089..0000000000 --- a/.changeset/afraid-ends-mate.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix missing column references in admin stats queries (engagement_reasons, next_step, subscription_status) diff --git a/.changeset/afraid-pigs-sit.md b/.changeset/afraid-pigs-sit.md deleted file mode 100644 index c4d6ca9058..0000000000 --- a/.changeset/afraid-pigs-sit.md +++ /dev/null @@ -1,8 +0,0 @@ ---- ---- - -Add member welcome and user signup email notifications via Resend. - -- New member thank you email sent after Stripe subscription created -- User signup email with conditional content based on org subscription status -- Updated naming from "Alliance for Agentic Advertising" to "AgenticAdvertising.org" diff --git a/.changeset/afraid-hairs-add.md b/.changeset/afraid-times-cover.md similarity index 100% rename from .changeset/afraid-hairs-add.md rename to .changeset/afraid-times-cover.md diff --git a/.changeset/alert-dedupe-url.md b/.changeset/alert-dedupe-url.md new file mode 100644 index 0000000000..07ab477ba2 --- /dev/null +++ b/.changeset/alert-dedupe-url.md @@ -0,0 +1,14 @@ +--- +"adcontextprotocol": patch +--- + +Fix Addie alert spam and improve content relevance + +**Alert deduplication fix:** +The alert query now checks if ANY perspective with the same external_url +has been alerted to a channel, preventing spam from cross-feed duplicates. + +**Content relevance improvement:** +Tightened `mentions_agentic` detection to require BOTH agentic AI terms +AND advertising context. This prevents general AI news (e.g., ChatGPT updates) +from being flagged as relevant to our agentic advertising community. diff --git a/.changeset/allow-extra-fields.md b/.changeset/allow-extra-fields.md deleted file mode 100644 index 85eea668ec..0000000000 --- a/.changeset/allow-extra-fields.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"adcontextprotocol": patch ---- - -Allow additional properties in all JSON schemas for forward compatibility - -Changes all schemas from `"additionalProperties": false` to `"additionalProperties": true`. This enables clients running older schema versions to accept responses from servers with newer schemas without breaking validation - a standard practice for protocol evolution in distributed systems. diff --git a/.changeset/anthropic-timeout.md b/.changeset/anthropic-timeout.md deleted file mode 100644 index 18d0d43420..0000000000 --- a/.changeset/anthropic-timeout.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add timeout to Anthropic API calls in webhook handler (no protocol changes) diff --git a/.changeset/big-lies-end.md b/.changeset/big-lies-end.md deleted file mode 100644 index b916c68583..0000000000 --- a/.changeset/big-lies-end.md +++ /dev/null @@ -1,6 +0,0 @@ ---- ---- - -Fix duplicate migration version 039 and add CI check. - -This is an internal fix for database migration numbering and does not affect the protocol specification or public API. diff --git a/.changeset/block-gmail-corp-domain.md b/.changeset/block-gmail-corp-domain.md deleted file mode 100644 index aefb92e1e1..0000000000 --- a/.changeset/block-gmail-corp-domain.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix domain health page to exclude free email providers (gmail.com, etc.) from "Related Organizations" section diff --git a/.changeset/brave-forks-crash.md b/.changeset/brave-forks-crash.md deleted file mode 100644 index 186b5d34c5..0000000000 --- a/.changeset/brave-forks-crash.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix Addie's response to empty mentions - when mentioned with just "@Addie" (no question), she no longer incorrectly welcomes the mentioner as if they were new to the channel. diff --git a/.changeset/bright-kids-say.md b/.changeset/bright-kids-say.md deleted file mode 100644 index d8ebeebfc6..0000000000 --- a/.changeset/bright-kids-say.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -fix: correct GitHub issue drafting repo and add confidentiality guidelines for Addie diff --git a/.changeset/bumpy-kings-follow.md b/.changeset/bumpy-kings-follow.md deleted file mode 100644 index 2a9f4be3f0..0000000000 --- a/.changeset/bumpy-kings-follow.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix Docker image to include docs directory and git for Addie knowledge search and external repo indexing. diff --git a/.changeset/chubby-baboons-kick.md b/.changeset/chubby-baboons-kick.md deleted file mode 100644 index 4d017f0a0e..0000000000 --- a/.changeset/chubby-baboons-kick.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix invoice modal positioning: modals now appear centered on screen instead of at page bottom. diff --git a/.changeset/clean-ghosts-beam.md b/.changeset/clean-ghosts-beam.md deleted file mode 100644 index 87a9ee43f8..0000000000 --- a/.changeset/clean-ghosts-beam.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Documentation cleanup - streamlined CLAUDE.md to workspace-specific guidance only. No protocol changes. diff --git a/.changeset/clean-jokes-invent.md b/.changeset/clean-jokes-invent.md deleted file mode 100644 index 3d7d2144d3..0000000000 --- a/.changeset/clean-jokes-invent.md +++ /dev/null @@ -1,10 +0,0 @@ ---- ---- - -Add multi-select company types with "Data & Measurement" and "AI & Tech Platforms" categories (registry only) - -- Organizations can now have multiple company types (e.g., Microsoft can be both "brand" and "ai") -- Added new company type categories: "data" (Data & Measurement) and "ai" (AI & Tech Platforms) -- Renamed "AI Infrastructure" to "AI & Tech Platforms" to include agent builders -- Created centralized company-types config for frontend and backend consistency -- Migration preserves existing single-value data while enabling multi-select diff --git a/.changeset/clickable-user-name.md b/.changeset/clickable-user-name.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/clickable-user-name.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/cool-maps-sniff.md b/.changeset/cool-maps-sniff.md new file mode 100644 index 0000000000..37f1132cc2 --- /dev/null +++ b/.changeset/cool-maps-sniff.md @@ -0,0 +1,4 @@ +--- +--- + +Add ARTF and Prebid.org to Agentic Protocol Landscape perspectives content. diff --git a/.changeset/cool-memes-wear.md b/.changeset/cool-memes-wear.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/cool-memes-wear.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/all-dolls-beam.md b/.changeset/crisp-goats-sink.md similarity index 100% rename from .changeset/all-dolls-beam.md rename to .changeset/crisp-goats-sink.md diff --git a/.changeset/crisp-moments-wear.md b/.changeset/crisp-moments-wear.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/crisp-moments-wear.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/crisp-pets-tease.md b/.changeset/crisp-pets-tease.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/crisp-pets-tease.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/crisp-readers-rule.md b/.changeset/crisp-readers-rule.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/crisp-readers-rule.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/cuddly-pets-sort.md b/.changeset/cuddly-pets-sort.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/cuddly-pets-sort.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/cuddly-windows-accept.md b/.changeset/cuddly-windows-accept.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/cuddly-windows-accept.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/curvy-kiwis-clap.md b/.changeset/curvy-kiwis-clap.md new file mode 100644 index 0000000000..747a702cf8 --- /dev/null +++ b/.changeset/curvy-kiwis-clap.md @@ -0,0 +1,8 @@ +--- +--- + +fix: ensure tool documentation is always included in Addie's system prompt + +Tool documentation was only present in a hardcoded fallback prompt that wasn't used +when database rules existed. Now tool reference is always appended to the system prompt, +ensuring Addie knows about meeting scheduling and other tools regardless of DB state. diff --git a/.changeset/curvy-rice-bake.md b/.changeset/curvy-rice-bake.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/curvy-rice-bake.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/cute-taxes-boil.md b/.changeset/cute-taxes-boil.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/cute-taxes-boil.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/cyan-cooks-hang.md b/.changeset/cyan-cooks-hang.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/cyan-cooks-hang.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/dashboard-user-menu.md b/.changeset/dashboard-user-menu.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/dashboard-user-menu.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/david-event-mgmt-fix.md b/.changeset/david-event-mgmt-fix.md deleted file mode 100644 index b0344a2e57..0000000000 --- a/.changeset/david-event-mgmt-fix.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix chapter leader event management permission checks for users added via Slack diff --git a/.changeset/all-llamas-sin.md b/.changeset/dirty-hoops-eat.md similarity index 100% rename from .changeset/all-llamas-sin.md rename to .changeset/dirty-hoops-eat.md diff --git a/.changeset/dirty-kiwis-cheer.md b/.changeset/dirty-kiwis-cheer.md deleted file mode 100644 index 172b54291e..0000000000 --- a/.changeset/dirty-kiwis-cheer.md +++ /dev/null @@ -1,46 +0,0 @@ ---- ---- - -Improve Addie router intelligence and search observability - -**Router improvements:** -- Add `usage_hints` field to AddieTool interface for router-specific guidance -- Router now builds tool descriptions from tool definitions (no duplication) -- Distinguish "how does X work?" (search_docs) from "validate my X" (validate_adagents) -- Separate expertise areas for validation vs learning questions - -**Docs indexing:** -- Extract markdown headings as separate searchable artifacts -- Generate anchor links for deep linking to specific sections -- Build headings index alongside docs index (1659 headings from 100 docs) - -**Search tracking:** -- Log all search queries for pattern analysis -- Track results count, latency, and tool used -- Enable content gap detection via zero-result query analysis - -**Prompt improvements:** -- Strengthen GitHub issue drafting instructions - users cannot see tool outputs -- Add conversation context maintenance guidance to prevent entity substitution - -**Bug fixes:** -- Fix DM Assistant thread context loss - now fetches conversation history from database -- Previous messages are passed to Claude so it maintains context across turns - -**Member insights integration:** -- Router now uses member insights (role, interests, pain points) for smarter tool selection -- Fetch member context and insights in parallel for better performance -- Add in-memory cache with 30-minute TTL (long since we invalidate on writes) -- Prefetch insights when user opens Addie (before first message) -- Auto-invalidate cache when new insights are extracted or added via admin API - -**Performance optimizations:** -- Add 30-minute cache for admin status checks (isSlackUserAdmin) -- Admin status rarely changes and was being checked multiple times per conversation -- Add 30-minute cache for active insight goals (only 2 possible variants: mapped/unmapped) -- Auto-invalidate goals cache on goal create/update/delete via admin API -- Add 30-minute cache for Slack channel info (names/purposes rarely change) - -**Previous work (already in PR):** -- Log router decisions to unified thread messages -- Add config versioning for feedback analysis by configuration diff --git a/.changeset/dirty-meteors-sell.md b/.changeset/dirty-meteors-sell.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/dirty-meteors-sell.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/dirty-spies-burn.md b/.changeset/dirty-spies-burn.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/dirty-spies-burn.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/docs-versioning.md b/.changeset/docs-versioning.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/docs-versioning.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/dry-singers-pull.md b/.changeset/dry-singers-pull.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/dry-singers-pull.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/dull-dogs-live.md b/.changeset/dull-dogs-live.md deleted file mode 100644 index 724918eea8..0000000000 --- a/.changeset/dull-dogs-live.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add organization_domains table and WorkOS webhook handlers for domain sync diff --git a/.changeset/dull-rooms-battle.md b/.changeset/dull-rooms-battle.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/dull-rooms-battle.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/dull-singers-mate.md b/.changeset/dull-singers-mate.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/dull-singers-mate.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/eager-eels-sneeze.md b/.changeset/eager-eels-sneeze.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/eager-eels-sneeze.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/eager-humans-change.md b/.changeset/eager-humans-change.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/eager-humans-change.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/easy-lizards-hug.md b/.changeset/easy-lizards-hug.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/easy-lizards-hug.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/eighty-dingos-lay.md b/.changeset/eighty-dingos-lay.md new file mode 100644 index 0000000000..f671d57204 --- /dev/null +++ b/.changeset/eighty-dingos-lay.md @@ -0,0 +1,11 @@ +--- +"adcontextprotocol": patch +--- + +Fix API response parsing in Addie member tools + +Multiple MCP tool handlers were incorrectly parsing API responses, expecting flat arrays/objects when APIs return wrapped responses. Fixed: +- `list_working_groups`: Extract `working_groups` from `{ working_groups: [...] }` +- `get_working_group`: Extract `working_group` from `{ working_group: {...}, is_member }` +- `get_my_working_groups`: Extract `working_groups` from wrapped response +- `get_my_profile`: Extract `profile` from `{ profile, organization_id, organization_name }` diff --git a/.changeset/eighty-onions-leave.md b/.changeset/eighty-onions-leave.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/eighty-onions-leave.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/eighty-sloths-feel.md b/.changeset/eighty-sloths-feel.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/eighty-sloths-feel.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/eleven-rabbits-enter.md b/.changeset/eleven-rabbits-enter.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/eleven-rabbits-enter.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/eleven-wolves-return.md b/.changeset/eleven-wolves-return.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/eleven-wolves-return.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/email-tracking-logging.md b/.changeset/email-tracking-logging.md deleted file mode 100644 index 431f9dde3d..0000000000 --- a/.changeset/email-tracking-logging.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add diagnostic logging to email webhook handler (no protocol changes) diff --git a/.changeset/enable-addie-public.md b/.changeset/enable-addie-public.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/enable-addie-public.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/engagement-scoring-job.md b/.changeset/engagement-scoring-job.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/engagement-scoring-job.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/error-details-type.md b/.changeset/error-details-type.md deleted file mode 100644 index c9ee80212e..0000000000 --- a/.changeset/error-details-type.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"adcontextprotocol": patch ---- - -Add explicit type definition to error.json details property - -The `details` property in core/error.json now explicitly declares `"type": "object"` and `"additionalProperties": true`, consistent with other error details definitions in the codebase. This addresses issue #343 where the data type was unspecified. diff --git a/.changeset/event-attendance-tracking.md b/.changeset/event-attendance-tracking.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/event-attendance-tracking.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/event-visibility-fix.md b/.changeset/event-visibility-fix.md deleted file mode 100644 index 17c91e4e55..0000000000 --- a/.changeset/event-visibility-fix.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Internal: Fix event visibility and registration matching (no protocol changes) diff --git a/.changeset/every-falcons-peel.md b/.changeset/every-falcons-peel.md deleted file mode 100644 index a0791a3b6b..0000000000 --- a/.changeset/every-falcons-peel.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Update Addie's core thesis to incorporate the allocation vs efficiency framing. Advertisers are stuck at 3-5 platforms due to execution costs - the opportunity is scaling to 20+ partners, not optimizing the existing 3-5. Walled gardens benefit from AdCP because it lets them capture new allocation budgets without commoditizing their differentiation. diff --git a/.changeset/every-moose-kick.md b/.changeset/every-moose-kick.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/every-moose-kick.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fair-plants-reply.md b/.changeset/fair-plants-reply.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fair-plants-reply.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fair-turkeys-sell.md b/.changeset/fair-turkeys-sell.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fair-turkeys-sell.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/famous-rockets-report.md b/.changeset/famous-rockets-report.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/famous-rockets-report.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/famous-sides-hide.md b/.changeset/famous-sides-hide.md deleted file mode 100644 index 25bd707397..0000000000 --- a/.changeset/famous-sides-hide.md +++ /dev/null @@ -1,7 +0,0 @@ ---- ---- - -feat: Add membership metrics to admin analytics dashboard - -Adds new admin analytics endpoints and UI tables showing membership counts -broken down by company type and revenue tier. Includes CSV export functionality. diff --git a/.changeset/fast-hounds-lick.md b/.changeset/fast-hounds-lick.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fast-hounds-lick.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fast-sloths-press.md b/.changeset/fast-sloths-press.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fast-sloths-press.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/better-papayas-attack.md b/.changeset/few-dots-build.md similarity index 100% rename from .changeset/better-papayas-attack.md rename to .changeset/few-dots-build.md diff --git a/.changeset/few-rivers-travel.md b/.changeset/few-rivers-travel.md new file mode 100644 index 0000000000..abd698c584 --- /dev/null +++ b/.changeset/few-rivers-travel.md @@ -0,0 +1,9 @@ +--- +--- + +Add topic Slack channels for working groups + +- Working group topics can now have an optional Slack channel ID +- New invite mode 'slack_channel' allows scheduling meetings for Slack channel members +- Admin UI for managing topics with Slack channel linking +- Addie can manage topics via manage_committee_topics tool diff --git a/.changeset/fiery-actors-show.md b/.changeset/fiery-actors-show.md deleted file mode 100644 index 450cd1d6c0..0000000000 --- a/.changeset/fiery-actors-show.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add unified user counts (members + Slack-only) to accounts list and detail pages. Add Addie tools for listing organizations by user count and listing Slack users by organization. diff --git a/.changeset/fiery-days-roll.md b/.changeset/fiery-days-roll.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fiery-days-roll.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fiery-maps-tan.md b/.changeset/fiery-maps-tan.md deleted file mode 100644 index 79826f3d12..0000000000 --- a/.changeset/fiery-maps-tan.md +++ /dev/null @@ -1,12 +0,0 @@ ---- ---- - -Add call_adcp_agent tool and Claude Skills for full AdCP protocol access. - -This enables clients to execute the full AdCP spec (not just testing API) via: -- `call_adcp_agent` tool: Low-level proxy to any AdCP-compliant sales agent -- Claude Skills: Protocol knowledge for media-buy, signals, and creative - -Skills teach Claude the protocol schemas and workflows; the tool routes to -whatever agent the user specifies. Auth tokens are looked up from saved -agent context or can be provided directly. diff --git a/.changeset/fiery-sides-allow.md b/.changeset/fiery-sides-allow.md deleted file mode 100644 index c4472c0b66..0000000000 --- a/.changeset/fiery-sides-allow.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Admin AI analysis UX improvements - no protocol changes diff --git a/.changeset/fifty-bars-pump.md b/.changeset/fifty-bars-pump.md deleted file mode 100644 index d6ac9145fb..0000000000 --- a/.changeset/fifty-bars-pump.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Remove insight_goals table and consolidate goal management into outreach_goals. Admin insight goals CRUD endpoints and UI have been removed. The insight extractor and passive extraction now read from outreach_goals. diff --git a/.changeset/fifty-pandas-sleep.md b/.changeset/fifty-pandas-sleep.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fifty-pandas-sleep.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fix-addie-github-link.md b/.changeset/fix-addie-github-link.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/fix-addie-github-link.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/fix-admin-checks-mobile-pane.md b/.changeset/fix-admin-checks-mobile-pane.md deleted file mode 100644 index 8c994eaea1..0000000000 --- a/.changeset/fix-admin-checks-mobile-pane.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -No protocol changes - internal admin check consistency fix and mobile CSS improvement. diff --git a/.changeset/fix-admin-member-links.md b/.changeset/fix-admin-member-links.md deleted file mode 100644 index 7a519b2209..0000000000 --- a/.changeset/fix-admin-member-links.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix broken admin organization links and make member names clickable. diff --git a/.changeset/fix-analytics-views.md b/.changeset/fix-analytics-views.md deleted file mode 100644 index e28feb4dae..0000000000 --- a/.changeset/fix-analytics-views.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix analytics dashboard: rename "Revenue by Month" to "Bookings by Month" and fix empty "Revenue by Product" view by querying revenue_events instead of subscription_line_items. diff --git a/.changeset/fix-auto-add-members.md b/.changeset/fix-auto-add-members.md new file mode 100644 index 0000000000..7aec3e34db --- /dev/null +++ b/.changeset/fix-auto-add-members.md @@ -0,0 +1,4 @@ +--- +--- + +Fix auto-add domain users feature to properly handle pending invitations diff --git a/.changeset/fix-auto-add-pagination.md b/.changeset/fix-auto-add-pagination.md new file mode 100644 index 0000000000..8dd27cd9b2 --- /dev/null +++ b/.changeset/fix-auto-add-pagination.md @@ -0,0 +1,5 @@ +--- +"adcontextprotocol": patch +--- + +Fix pagination in auto-add domain users feature to fetch all organization members diff --git a/.changeset/fix-broken-readme-links.md b/.changeset/fix-broken-readme-links.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/fix-broken-readme-links.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/fix-calendar-timezone.md b/.changeset/fix-calendar-timezone.md new file mode 100644 index 0000000000..c6e2a018a2 --- /dev/null +++ b/.changeset/fix-calendar-timezone.md @@ -0,0 +1,14 @@ +--- +--- + +fix: Parse meeting times in specified timezone correctly + +Fixed timezone handling end-to-end: +- Added parseDateInTimezone() to interpret input times in the target timezone +- When Claude sends "2026-01-15T13:00:00" for "1 PM ET", we now create a Date + representing 18:00 UTC (the correct moment for 1 PM ET) +- Both display in Slack and API calls to Zoom/Calendar now show correct time +- Removed formatDateWithoutZ() workaround since Date objects are now correct + +Before: "1 PM ET" → Date(13:00 UTC) → displayed as "8 AM ET", but Calendar showed 1 PM +After: "1 PM ET" → Date(18:00 UTC) → displayed as "1 PM ET", Calendar shows 1 PM diff --git a/.changeset/fix-company-type-validation.md b/.changeset/fix-company-type-validation.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/fix-company-type-validation.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/fix-daily-digest.md b/.changeset/fix-daily-digest.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/fix-daily-digest.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/fix-domain-health-orgs.md b/.changeset/fix-domain-health-orgs.md deleted file mode 100644 index 233db1edd7..0000000000 --- a/.changeset/fix-domain-health-orgs.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Improve admin domain health page to show existing organizations for unlinked domains instead of only proposing new prospects. diff --git a/.changeset/fix-duplicate-members.md b/.changeset/fix-duplicate-members.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fix-duplicate-members.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fix-email-preferences-table.md b/.changeset/fix-email-preferences-table.md deleted file mode 100644 index 02940fd408..0000000000 --- a/.changeset/fix-email-preferences-table.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix table name in getMemberCapabilities: email_preferences → user_email_preferences diff --git a/.changeset/fix-feed-email-slugs.md b/.changeset/fix-feed-email-slugs.md deleted file mode 100644 index 21b8491247..0000000000 --- a/.changeset/fix-feed-email-slugs.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix feed email slug lookup - prepend 'feed-' prefix to seeded email slugs to match webhook extraction diff --git a/.changeset/fix-feedback-modal.md b/.changeset/fix-feedback-modal.md deleted file mode 100644 index aa53c2615c..0000000000 --- a/.changeset/fix-feedback-modal.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix feedback modal not displaying saved feedback when viewing threads diff --git a/.changeset/fix-html-entities-news.md b/.changeset/fix-html-entities-news.md deleted file mode 100644 index 745e2fe647..0000000000 --- a/.changeset/fix-html-entities-news.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix HTML entity encoding in news feed API responses. RSS feed titles with entities like `'` are now properly decoded before being returned in API responses. diff --git a/.changeset/fix-industry-alerts-channel-filter.md b/.changeset/fix-industry-alerts-channel-filter.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/fix-industry-alerts-channel-filter.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/fix-industry-alerts-token.md b/.changeset/fix-industry-alerts-token.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/fix-industry-alerts-token.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/fix-interaction-analyzer-column.md b/.changeset/fix-interaction-analyzer-column.md deleted file mode 100644 index faab1dc733..0000000000 --- a/.changeset/fix-interaction-analyzer-column.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix organization_domains column name in interaction-analyzer query diff --git a/.changeset/fix-invoice-products.md b/.changeset/fix-invoice-products.md deleted file mode 100644 index aaa9496d8e..0000000000 --- a/.changeset/fix-invoice-products.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Filter invoice modal dropdown to show only subscription products, excluding legacy one-time invoice products. diff --git a/.changeset/fix-login-display-and-stats.md b/.changeset/fix-login-display-and-stats.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/fix-login-display-and-stats.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/fix-meeting-id-lookup.md b/.changeset/fix-meeting-id-lookup.md new file mode 100644 index 0000000000..40bbb03b93 --- /dev/null +++ b/.changeset/fix-meeting-id-lookup.md @@ -0,0 +1,12 @@ +--- +--- + +fix: Accept both UUID and Zoom meeting IDs in meeting tools + +Updated meeting tools to accept both internal UUIDs and Zoom meeting IDs: +- Show meeting ID in list_upcoming_meetings output +- get_meeting_details, cancel_meeting, rsvp_to_meeting, add_meeting_attendee + now try UUID first, then fall back to Zoom meeting ID lookup + +This fixes the issue where Claude would see Zoom meeting IDs in meeting links +but the tools only accepted internal UUIDs. diff --git a/.changeset/fix-meeting-z-suffix.md b/.changeset/fix-meeting-z-suffix.md new file mode 100644 index 0000000000..f086904417 --- /dev/null +++ b/.changeset/fix-meeting-z-suffix.md @@ -0,0 +1,8 @@ +--- +--- + +fix: Clarify start_time format in meeting scheduling schema + +Updated schema description to explicitly tell Claude NOT to add Z suffix to +start_time. Claude was interpreting "11 AM ET" as "11 AM UTC" with Z suffix, +causing meetings to be rejected as "already passed". diff --git a/.changeset/fix-meetings-section-display.md b/.changeset/fix-meetings-section-display.md new file mode 100644 index 0000000000..68ca5f8610 --- /dev/null +++ b/.changeset/fix-meetings-section-display.md @@ -0,0 +1,11 @@ +--- +--- + +fix: Display meetings section on committee pages and add admin edit + +Fixed a bug where the meetings section wasn't showing on committee detail pages. +The API returns `{ meetings: [...] }` but the code was calling `.filter()` directly +on the response object instead of `response.meetings`. + +Also added edit functionality to the admin meetings page - admins can now click +"Edit" to reschedule or update meeting details (title, description, time). diff --git a/.changeset/fix-member-insights-query.md b/.changeset/fix-member-insights-query.md new file mode 100644 index 0000000000..acc452d082 --- /dev/null +++ b/.changeset/fix-member-insights-query.md @@ -0,0 +1,4 @@ +--- +--- + +Fix member insights 500 error by removing invalid column reference diff --git a/.changeset/addie-email-domain-linking.md b/.changeset/fix-member-metrics.md similarity index 100% rename from .changeset/addie-email-domain-linking.md rename to .changeset/fix-member-metrics.md diff --git a/.changeset/fix-member-name-click.md b/.changeset/fix-member-name-click.md deleted file mode 100644 index 9aa2754cbc..0000000000 --- a/.changeset/fix-member-name-click.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -fix: escape apostrophes in user names for onclick handlers diff --git a/.changeset/fix-migration-151.md b/.changeset/fix-migration-151.md deleted file mode 100644 index 4ec327c8b6..0000000000 --- a/.changeset/fix-migration-151.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"adcontextprotocol": patch ---- - -Fix migration 151 to delete duplicates before updating Slack IDs to WorkOS IDs diff --git a/.changeset/fix-org-memberships-table.md b/.changeset/fix-org-memberships-table.md deleted file mode 100644 index fbe7f3984a..0000000000 --- a/.changeset/fix-org-memberships-table.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix organization member lookup table name in inbound email webhook diff --git a/.changeset/fix-outreach-stats.md b/.changeset/fix-outreach-stats.md deleted file mode 100644 index 8a7bfeefe1..0000000000 --- a/.changeset/fix-outreach-stats.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -fix: align frontend outreach stats field names with backend API response diff --git a/.changeset/fix-package-request-fields.md b/.changeset/fix-package-request-fields.md deleted file mode 100644 index d8b68492b7..0000000000 --- a/.changeset/fix-package-request-fields.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -"adcontextprotocol": patch ---- - -Add missing fields to package request schemas for consistency with core/package.json. - -**Schema Changes:** - -- `media-buy/package-request.json`: Added `impressions` and `paused` fields -- `media-buy/update-media-buy-request.json`: Added `impressions` field to package updates - -**Details:** - -- `impressions`: Impression goal for the package (optional, minimum: 0) -- `paused`: Create package in paused state (optional, default: false) - -These fields were defined in `core/package.json` but missing from the request schemas, making it impossible to set impression goals or initial paused state when creating/updating media buys. - -**Documentation:** - -- Updated `create_media_buy` task reference with new package parameters -- Updated `update_media_buy` task reference with impressions parameter diff --git a/.changeset/fix-pending-articles.md b/.changeset/fix-pending-articles.md deleted file mode 100644 index 122252461e..0000000000 --- a/.changeset/fix-pending-articles.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix industry feeds pending article count mismatch diff --git a/.changeset/fix-perspectives-body.md b/.changeset/fix-perspectives-body.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/fix-perspectives-body.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/fix-perspectives-link.md b/.changeset/fix-perspectives-link.md deleted file mode 100644 index 6c8028d3d0..0000000000 --- a/.changeset/fix-perspectives-link.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix broken working group post links in Slack notifications and frontend diff --git a/.changeset/fix-planner-column-names.md b/.changeset/fix-planner-column-names.md deleted file mode 100644 index 3f9e4cd8d0..0000000000 --- a/.changeset/fix-planner-column-names.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix column name mismatch in getMemberCapabilities query (messages_sent → message_count, date → activity_date) diff --git a/.changeset/fix-resend-inbound-webhook.md b/.changeset/fix-resend-inbound-webhook.md deleted file mode 100644 index 678a402d5e..0000000000 --- a/.changeset/fix-resend-inbound-webhook.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix Resend inbound email webhook timeout by skipping global JSON parser diff --git a/.changeset/fix-slack-auth-security.md b/.changeset/fix-slack-auth-security.md deleted file mode 100644 index dd0727322d..0000000000 --- a/.changeset/fix-slack-auth-security.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Update dependencies to address security vulnerabilities. diff --git a/.changeset/fix-slack-leader-display.md b/.changeset/fix-slack-leader-display.md deleted file mode 100644 index 3620cb18ae..0000000000 --- a/.changeset/fix-slack-leader-display.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"adcontextprotocol": patch ---- - -fix: display Slack profile name for chapter leaders without WorkOS accounts - -Leaders added via Slack ID that haven't linked their WorkOS account now display -their Slack profile name (real_name or display_name) instead of the raw Slack -user ID (e.g., U09BEKNJ3GB). - -The getLeaders and getLeadersBatch queries now include slack_user_mappings as an -additional name source in the COALESCE chain. diff --git a/.changeset/fix-zoom-meeting-timezone.md b/.changeset/fix-zoom-meeting-timezone.md new file mode 100644 index 0000000000..c3ffd19f75 --- /dev/null +++ b/.changeset/fix-zoom-meeting-timezone.md @@ -0,0 +1,11 @@ +--- +--- + +fix: Strip Z suffix from Zoom meeting start_time + +When creating Zoom meetings, toISOString() was adding a Z suffix which made +Zoom interpret times as UTC instead of the specified timezone. A meeting for +"11 AM ET" was being scheduled for 11:00 UTC = 6:00 AM ET. + +Fixed by stripping the Z suffix so Zoom interprets the time in the timezone +parameter (e.g., America/New_York). diff --git a/.changeset/flat-candies-crash.md b/.changeset/flat-candies-crash.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/flat-candies-crash.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/flat-friends-learn.md b/.changeset/flat-friends-learn.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/flat-friends-learn.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/flat-frogs-go.md b/.changeset/flat-frogs-go.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/flat-frogs-go.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/flat-turkeys-tell.md b/.changeset/flat-turkeys-tell.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/flat-turkeys-tell.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/floppy-apples-live.md b/.changeset/floppy-apples-live.md deleted file mode 100644 index 8134d5058f..0000000000 --- a/.changeset/floppy-apples-live.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Update @adcp/client to 3.5.2 to fix schema validation for empty publisher_domains arrays. diff --git a/.changeset/floppy-crews-greet.md b/.changeset/floppy-crews-greet.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/floppy-crews-greet.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/forty-emus-sniff.md b/.changeset/forty-emus-sniff.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/forty-emus-sniff.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/forty-symbols-kick.md b/.changeset/forty-symbols-kick.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/forty-symbols-kick.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/four-forks-go.md b/.changeset/four-forks-go.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/four-forks-go.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/four-ways-yawn.md b/.changeset/four-ways-yawn.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/four-ways-yawn.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/block-personal-workspace-merge.md b/.changeset/frank-donkeys-dress.md similarity index 100% rename from .changeset/block-personal-workspace-merge.md rename to .changeset/frank-donkeys-dress.md diff --git a/.changeset/frank-pets-tan.md b/.changeset/frank-pets-tan.md deleted file mode 100644 index 7d477a6dad..0000000000 --- a/.changeset/frank-pets-tan.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -No protocol changes - website improvements only. diff --git a/.changeset/frank-teeth-jam.md b/.changeset/frank-teeth-jam.md new file mode 100644 index 0000000000..48e374f611 --- /dev/null +++ b/.changeset/frank-teeth-jam.md @@ -0,0 +1,4 @@ +--- +--- + +Add Stripe customer conflict handling to organization merge flow diff --git a/.changeset/free-chicken-write.md b/.changeset/free-chicken-write.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/free-chicken-write.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/free-terms-send.md b/.changeset/free-terms-send.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/free-terms-send.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fresh-crews-wash.md b/.changeset/fresh-crews-wash.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fresh-crews-wash.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fresh-numbers-hide.md b/.changeset/fresh-numbers-hide.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fresh-numbers-hide.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fruity-papayas-act.md b/.changeset/fruity-papayas-act.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fruity-papayas-act.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fruity-states-spend.md b/.changeset/fruity-states-spend.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fruity-states-spend.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fruity-wasps-hope.md b/.changeset/fruity-wasps-hope.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fruity-wasps-hope.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/funky-bars-chew.md b/.changeset/funky-bars-chew.md deleted file mode 100644 index 92afc14bf7..0000000000 --- a/.changeset/funky-bars-chew.md +++ /dev/null @@ -1,9 +0,0 @@ ---- ---- - -Improve industry news alert format for engagement - -- Replace priority headers with article title in Slack alerts -- Add "Addie's take" with emoji and discussion prompt to drive engagement -- Decode HTML entities in RSS feed titles -- Reduce false positives in agentic mention detection by only checking original content diff --git a/.changeset/funny-jeans-attack.md b/.changeset/funny-jeans-attack.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/funny-jeans-attack.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/funny-sheep-remain.md b/.changeset/funny-sheep-remain.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/funny-sheep-remain.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fuzzy-showers-know.md b/.changeset/fuzzy-showers-know.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fuzzy-showers-know.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fuzzy-streets-call.md b/.changeset/fuzzy-streets-call.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/fuzzy-streets-call.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/gentle-coins-live.md b/.changeset/gentle-coins-live.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/gentle-coins-live.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/gentle-moose-greet.md b/.changeset/gentle-moose-greet.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/gentle-moose-greet.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/gentle-pianos-spend.md b/.changeset/gentle-pianos-spend.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/gentle-pianos-spend.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/gentle-rivers-add.md b/.changeset/gentle-rivers-add.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/gentle-rivers-add.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/giant-eggs-stare.md b/.changeset/giant-eggs-stare.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/giant-eggs-stare.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/giant-parts-heal.md b/.changeset/giant-parts-heal.md deleted file mode 100644 index 8dfffdc2cb..0000000000 --- a/.changeset/giant-parts-heal.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add Addie Desktop app with native OAuth flow and multi-thread chat UI for web. diff --git a/.changeset/giant-tires-argue.md b/.changeset/giant-tires-argue.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/giant-tires-argue.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/github-issue-offer.md b/.changeset/github-issue-offer.md deleted file mode 100644 index a780d5e737..0000000000 --- a/.changeset/github-issue-offer.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add GitHub issue offer for open-source agent test failures diff --git a/.changeset/gold-spies-wait.md b/.changeset/gold-spies-wait.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/gold-spies-wait.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/good-ads-rule.md b/.changeset/good-ads-rule.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/good-ads-rule.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/good-cougars-serve.md b/.changeset/good-cougars-serve.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/good-cougars-serve.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/good-kiwis-tie.md b/.changeset/good-kiwis-tie.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/good-kiwis-tie.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/good-lemons-accept.md b/.changeset/good-lemons-accept.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/good-lemons-accept.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/good-steaks-slide.md b/.changeset/good-steaks-slide.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/good-steaks-slide.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/goofy-deer-pick.md b/.changeset/goofy-deer-pick.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/goofy-deer-pick.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/great-cobras-wave.md b/.changeset/great-cobras-wave.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/great-cobras-wave.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/great-singers-greet.md b/.changeset/great-singers-greet.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/great-singers-greet.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/green-banks-juggle.md b/.changeset/green-banks-juggle.md deleted file mode 100644 index 26569a2f78..0000000000 --- a/.changeset/green-banks-juggle.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add static admin API key for programmatic access (ADMIN_API_KEY env var) diff --git a/.changeset/green-bottles-fly.md b/.changeset/green-bottles-fly.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/green-bottles-fly.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/green-cooks-double.md b/.changeset/green-cooks-double.md deleted file mode 100644 index bed9202737..0000000000 --- a/.changeset/green-cooks-double.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Consolidate check_agent_health and get_agent_capabilities into probe_adcp_agent tool diff --git a/.changeset/happy-llamas-hope.md b/.changeset/happy-llamas-hope.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/happy-llamas-hope.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/happy-nights-talk.md b/.changeset/happy-nights-talk.md deleted file mode 100644 index 4c3ad70f2f..0000000000 --- a/.changeset/happy-nights-talk.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add committee leadership management tools for Addie and display industry gatherings in the dashboard committees section. diff --git a/.changeset/blue-tables-agree.md b/.changeset/happy-singers-cry.md similarity index 100% rename from .changeset/blue-tables-agree.md rename to .changeset/happy-singers-cry.md diff --git a/.changeset/heavy-dots-doubt.md b/.changeset/heavy-dots-doubt.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/heavy-dots-doubt.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/heavy-tips-visit.md b/.changeset/heavy-tips-visit.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/heavy-tips-visit.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/hip-bugs-jam.md b/.changeset/hip-bugs-jam.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/hip-bugs-jam.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/honest-maps-decide.md b/.changeset/honest-maps-decide.md new file mode 100644 index 0000000000..03781f4130 --- /dev/null +++ b/.changeset/honest-maps-decide.md @@ -0,0 +1,10 @@ +--- +"adcontextprotocol": patch +--- + +Add debug logging support to Addie's AdCP tools and clarify probe vs test behavior. + +- Add `debug` parameter to all 10 AdCP tool schemas (get_products, create_media_buy, etc.) +- Include debug_logs in tool output when debug mode is enabled +- Remove redundant `call_adcp_agent` tool (individual tools provide better schema validation) +- Fix `probe_adcp_agent` messaging to clarify it only checks connectivity, not protocol compliance diff --git a/.changeset/honest-spiders-tickle.md b/.changeset/honest-spiders-tickle.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/honest-spiders-tickle.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/bold-hornets-behave.md b/.changeset/honest-stamps-switch.md similarity index 100% rename from .changeset/bold-hornets-behave.md rename to .changeset/honest-stamps-switch.md diff --git a/.changeset/hot-teams-leave.md b/.changeset/hot-teams-leave.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/hot-teams-leave.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/huge-taxes-sin.md b/.changeset/huge-taxes-sin.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/huge-taxes-sin.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/humble-clouds-smell.md b/.changeset/humble-clouds-smell.md deleted file mode 100644 index f4fc7b5d9b..0000000000 --- a/.changeset/humble-clouds-smell.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix chat page showing logged-out state for authenticated users. diff --git a/.changeset/hungry-bars-jump.md b/.changeset/hungry-bars-jump.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/hungry-bars-jump.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/hungry-feet-jump.md b/.changeset/hungry-feet-jump.md deleted file mode 100644 index fff40c1626..0000000000 --- a/.changeset/hungry-feet-jump.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Ignore Slackbot system messages in Addie handlers (no protocol changes) diff --git a/.changeset/brave-emus-invite.md b/.changeset/icy-cases-dig.md similarity index 100% rename from .changeset/brave-emus-invite.md rename to .changeset/icy-cases-dig.md diff --git a/.changeset/icy-toes-pay.md b/.changeset/icy-toes-pay.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/icy-toes-pay.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/industry-gathering-slug-fix.md b/.changeset/industry-gathering-slug-fix.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/industry-gathering-slug-fix.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/itchy-gifts-go.md b/.changeset/itchy-gifts-go.md new file mode 100644 index 0000000000..cf7ba53df8 --- /dev/null +++ b/.changeset/itchy-gifts-go.md @@ -0,0 +1,10 @@ +--- +--- + +Fix founding member badge not displaying for members who joined after initial migration ran. + +The original migration 147 only set `is_founding_member = TRUE` for profiles that existed at migration time. Profiles created afterward were not automatically flagged, even though they joined before the April 2026 cutoff. + +Changes: +- Update `createProfile` to set founding member status based on cutoff date +- Add migration 180 to backfill existing profiles that should have the flag diff --git a/.changeset/breezy-cats-own.md b/.changeset/itchy-ravens-feel.md similarity index 100% rename from .changeset/breezy-cats-own.md rename to .changeset/itchy-ravens-feel.md diff --git a/.changeset/jolly-chefs-knock.md b/.changeset/jolly-chefs-knock.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/jolly-chefs-knock.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/jolly-houses-shake.md b/.changeset/jolly-houses-shake.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/jolly-houses-shake.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/jolly-spoons-jump.md b/.changeset/jolly-spoons-jump.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/jolly-spoons-jump.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/kind-horses-fry.md b/.changeset/kind-horses-fry.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/kind-horses-fry.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/late-candles-invite.md b/.changeset/late-candles-invite.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/late-candles-invite.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/late-teeth-divide.md b/.changeset/late-teeth-divide.md deleted file mode 100644 index 836280767f..0000000000 --- a/.changeset/late-teeth-divide.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Improve domain health admin page UX: inline domain linking, www normalization, and verify button for existing domains. diff --git a/.changeset/lazy-doors-read.md b/.changeset/lazy-doors-read.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/lazy-doors-read.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/legal-dodos-rush.md b/.changeset/legal-dodos-rush.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/legal-dodos-rush.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/legal-islands-kick.md b/.changeset/legal-islands-kick.md new file mode 100644 index 0000000000..10b4399a09 --- /dev/null +++ b/.changeset/legal-islands-kick.md @@ -0,0 +1,8 @@ +--- +--- + +fix: Remove RSS and email content from Editorial working group + +Migration 153 incorrectly swept RSS feed articles into the Editorial working group. +RSS content should remain unassigned (working_group_id = NULL) and display +via The Latest sections through addie_knowledge. diff --git a/.changeset/lemon-cats-brake.md b/.changeset/lemon-cats-brake.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/lemon-cats-brake.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/breezy-pens-kick.md b/.changeset/light-tables-stare.md similarity index 100% rename from .changeset/breezy-pens-kick.md rename to .changeset/light-tables-stare.md diff --git a/.changeset/link-org-direct.md b/.changeset/link-org-direct.md deleted file mode 100644 index 6a38402a25..0000000000 --- a/.changeset/link-org-direct.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Link domain directly when clicking "Link to Org" on domain health page instead of showing modal diff --git a/.changeset/loose-feet-live.md b/.changeset/loose-feet-live.md deleted file mode 100644 index a9f04a1ea0..0000000000 --- a/.changeset/loose-feet-live.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add heading-level indexing for external repos (Addie knowledge base improvement - no protocol changes) diff --git a/.changeset/loud-ducks-cough.md b/.changeset/loud-ducks-cough.md deleted file mode 100644 index 0e7d225748..0000000000 --- a/.changeset/loud-ducks-cough.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix ambiguous ORDER BY column in getMembershipsByWorkingGroup query. diff --git a/.changeset/loud-hairs-repeat.md b/.changeset/loud-hairs-repeat.md deleted file mode 100644 index 76db2d2794..0000000000 --- a/.changeset/loud-hairs-repeat.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Filter RSS and email content from research section to show only member perspectives. diff --git a/.changeset/loud-pigs-heal.md b/.changeset/loud-pigs-heal.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/loud-pigs-heal.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/lovely-banks-argue.md b/.changeset/lovely-banks-argue.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/lovely-banks-argue.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/lovely-dragons-know.md b/.changeset/lovely-dragons-know.md deleted file mode 100644 index 74fa3d2804..0000000000 --- a/.changeset/lovely-dragons-know.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix profile modal Continue button not working on dashboard. Added proper change event listeners to radio buttons for more reliable selection handling across browsers and mobile devices. diff --git a/.changeset/many-cups-teach.md b/.changeset/many-cups-teach.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/many-cups-teach.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/many-doors-shine.md b/.changeset/many-doors-shine.md deleted file mode 100644 index 8973ad0967..0000000000 --- a/.changeset/many-doors-shine.md +++ /dev/null @@ -1,10 +0,0 @@ ---- ---- - -Add unified account management system with action items, user stakeholders, and momentum tracking. - -- New migration for user_stakeholders and action_items tables -- Database service for managing account assignments and action items -- Momentum check job for analyzing outreach history and creating action items -- Admin UI with action items panel and My Accounts tab -- Reorganized admin sidebar with Account Management section diff --git a/.changeset/member-search-intros.md b/.changeset/member-search-intros.md deleted file mode 100644 index 11dfde4a52..0000000000 --- a/.changeset/member-search-intros.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Member search analytics and introduction email improvements (no protocol changes) diff --git a/.changeset/breezy-zoos-hope.md b/.changeset/metal-hats-agree.md similarity index 100% rename from .changeset/breezy-zoos-hope.md rename to .changeset/metal-hats-agree.md diff --git a/.changeset/metal-ravens-argue.md b/.changeset/metal-ravens-argue.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/metal-ravens-argue.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/mighty-needles-count.md b/.changeset/mighty-needles-count.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/mighty-needles-count.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/mighty-rings-add.md b/.changeset/mighty-rings-add.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/mighty-rings-add.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/modern-maps-happen.md b/.changeset/modern-maps-happen.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/modern-maps-happen.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/modern-planets-marry.md b/.changeset/modern-planets-marry.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/modern-planets-marry.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/brown-doors-fly.md b/.changeset/moody-beers-love.md similarity index 100% rename from .changeset/brown-doors-fly.md rename to .changeset/moody-beers-love.md diff --git a/.changeset/neat-things-lay.md b/.changeset/neat-things-lay.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/neat-things-lay.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/new-coins-think.md b/.changeset/new-coins-think.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/new-coins-think.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/new-meals-battle.md b/.changeset/new-meals-battle.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/new-meals-battle.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/new-olives-play.md b/.changeset/new-olives-play.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/new-olives-play.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/new-suns-study.md b/.changeset/new-suns-study.md deleted file mode 100644 index 781b121132..0000000000 --- a/.changeset/new-suns-study.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Server-only audit logging changes - adds comprehensive audit logging for organization lifecycle events and admin viewer. diff --git a/.changeset/nice-camels-serve.md b/.changeset/nice-camels-serve.md deleted file mode 100644 index 4c5176df57..0000000000 --- a/.changeset/nice-camels-serve.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add collapsible sidebar to chat interface with localStorage persistence. Fix external link handling in desktop app iframe. diff --git a/.changeset/nice-kings-add.md b/.changeset/nice-kings-add.md new file mode 100644 index 0000000000..80516bcb48 --- /dev/null +++ b/.changeset/nice-kings-add.md @@ -0,0 +1,14 @@ +--- +--- + +### Zoom Meeting Webhooks & User Timezone + +**Zoom Webhook Integration:** +- Handle `meeting.started` and `meeting.ended` webhooks to update meeting status +- Handle `recording.completed` webhook to store transcripts and Zoom AI Companion summaries +- Send Slack notifications to working group channels when meetings start/end +- Fix JSON body parsing to allow webhook signature verification + +**User Timezone:** +- Add timezone column to users table for scheduling preferences +- Add helper functions for timezone management (getUserTimezone, updateUserTimezone, etc.) diff --git a/.changeset/nice-meals-help.md b/.changeset/nice-meals-help.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/nice-meals-help.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/nine-lies-raise.md b/.changeset/nine-lies-raise.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/nine-lies-raise.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/nine-rings-beam.md b/.changeset/nine-rings-beam.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/nine-rings-beam.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/nine-views-clap.md b/.changeset/nine-views-clap.md deleted file mode 100644 index bd889bacfb..0000000000 --- a/.changeset/nine-views-clap.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add committee types system: Evolves working groups into multi-type committees (Working Groups, Industry Councils, Regional Chapters, Governance). Includes new navigation dropdown, landing pages for councils/chapters, admin panel updates, and seed data for initial committees. diff --git a/.changeset/ninety-oranges-rush.md b/.changeset/ninety-oranges-rush.md deleted file mode 100644 index 8bb529999c..0000000000 --- a/.changeset/ninety-oranges-rush.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Consolidate Contacts page into Users page - engagement scores, goals, and insights now shown in Users table and context modal. Remove redundant Contacts page and APIs. diff --git a/.changeset/bumpy-carrots-change.md b/.changeset/old-aliens-live.md similarity index 100% rename from .changeset/bumpy-carrots-change.md rename to .changeset/old-aliens-live.md diff --git a/.changeset/old-geese-dress.md b/.changeset/old-geese-dress.md deleted file mode 100644 index 7bd09068db..0000000000 --- a/.changeset/old-geese-dress.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add industry gathering management for Addie admin and improve admin form UX. diff --git a/.changeset/old-shirts-hammer.md b/.changeset/old-shirts-hammer.md deleted file mode 100644 index 2e662e7335..0000000000 --- a/.changeset/old-shirts-hammer.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix outreach preview showing Slack-linking messages for already-linked users and remove guilt-inducing language from outreach variants. diff --git a/.changeset/olive-buses-doubt.md b/.changeset/olive-buses-doubt.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/olive-buses-doubt.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/olive-coats-bathe.md b/.changeset/olive-coats-bathe.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/olive-coats-bathe.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/open-rooms-tap.md b/.changeset/open-rooms-tap.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/open-rooms-tap.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/open-squids-flow.md b/.changeset/open-squids-flow.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/open-squids-flow.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/orange-bottles-reply.md b/.changeset/orange-bottles-reply.md deleted file mode 100644 index 741650006f..0000000000 --- a/.changeset/orange-bottles-reply.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Clarify AdCP/MCP relationship in docs: AdCP works *over* MCP and A2A as transports, not "built on" MCP. diff --git a/.changeset/orange-coins-wish.md b/.changeset/orange-coins-wish.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/orange-coins-wish.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/perky-deserts-matter.md b/.changeset/perky-deserts-matter.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/perky-deserts-matter.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/personal-workspace-enforcement.md b/.changeset/personal-workspace-enforcement.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/personal-workspace-enforcement.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/petite-eels-fly.md b/.changeset/petite-eels-fly.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/petite-eels-fly.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/pink-corners-allow.md b/.changeset/pink-corners-allow.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/pink-corners-allow.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/plain-needles-smell.md b/.changeset/plain-needles-smell.md deleted file mode 100644 index d55d877750..0000000000 --- a/.changeset/plain-needles-smell.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix ON CONFLICT clause in domain insert queries to match database schema constraint. diff --git a/.changeset/plain-terms-sip.md b/.changeset/plain-terms-sip.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/plain-terms-sip.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/plenty-trees-relate.md b/.changeset/plenty-trees-relate.md deleted file mode 100644 index a10b808acf..0000000000 --- a/.changeset/plenty-trees-relate.md +++ /dev/null @@ -1,28 +0,0 @@ ---- ---- - -Server/dashboard changes: Add Luma integration for AAO events management. - -**Luma API Client** (`server/src/luma/client.ts`): -- Full Luma API client with typed interfaces -- Event operations: create, get, update, delete -- Guest/registration operations: list guests, approve, decline, check-in -- Calendar operations: list calendars, list calendar events -- Webhook payload parsing and validation - -**Luma Webhook Handler** (`POST /api/webhooks/luma`): -- Handles `guest.created` - Syncs new registrations from Luma to AAO database -- Handles `guest.updated` - Updates registration status (approved/declined/checked-in) -- Handles `event.updated` - Syncs event changes from Luma back to AAO - -**Addie Event Tools** for natural language event management: -- `create_event` - Create events in both Luma and AAO database -- `list_upcoming_events` - List upcoming events with filtering -- `get_event_details` - Get event details with registration counts -- `manage_event_registrations` - List, approve waitlist, export registrations -- `update_event` - Update event details - -**Admin Navigation**: -- Added "Events" link to admin sidebar in the Community section - -Requires `LUMA_API_KEY` environment variable for Luma integration. diff --git a/.changeset/polite-candies-rescue.md b/.changeset/polite-candies-rescue.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/polite-candies-rescue.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/polite-candles-walk.md b/.changeset/polite-candles-walk.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/polite-candles-walk.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/polite-cycles-hang.md b/.changeset/polite-cycles-hang.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/polite-cycles-hang.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/polite-socks-swim.md b/.changeset/polite-socks-swim.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/polite-socks-swim.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/polite-tables-fail.md b/.changeset/polite-tables-fail.md deleted file mode 100644 index 8469f93f36..0000000000 --- a/.changeset/polite-tables-fail.md +++ /dev/null @@ -1,11 +0,0 @@ ---- ---- - -Add comprehensive prospect ownership and management system: - -- Database migration to convert legacy prospect_owner text to org_stakeholders records -- 5 new Addie admin tools: my_engaged_prospects, my_followups_needed, unassigned_prospects, claim_prospect, suggest_prospects -- "My Prospects" section at top of admin dashboard with hot/followup lists -- Prospect stats in Slack App Home admin panel -- mine=true filter on prospects API -- Fix org owner display to fall back to legacy prospect_owner field when no stakeholder owner exists diff --git a/.changeset/polite-webs-cheat.md b/.changeset/polite-webs-cheat.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/polite-webs-cheat.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/posthog-analytics.md b/.changeset/posthog-analytics.md deleted file mode 100644 index 4f21593d06..0000000000 --- a/.changeset/posthog-analytics.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add PostHog analytics integration for tracking rage clicks, session recordings, and heatmaps. diff --git a/.changeset/pretty-cameras-jog.md b/.changeset/pretty-cameras-jog.md deleted file mode 100644 index 3c864ac716..0000000000 --- a/.changeset/pretty-cameras-jog.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Admin UI improvements: dynamic owner dropdowns with "(me)" indicator, quick follow-up form. diff --git a/.changeset/pretty-crabs-create.md b/.changeset/pretty-crabs-create.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/pretty-crabs-create.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/pretty-horses-add.md b/.changeset/pretty-horses-add.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/pretty-horses-add.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/proud-jars-attack.md b/.changeset/proud-jars-attack.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/proud-jars-attack.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/proud-pugs-punch.md b/.changeset/proud-pugs-punch.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/proud-pugs-punch.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/public-needles-argue.md b/.changeset/public-needles-argue.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/public-needles-argue.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/puny-terms-start.md b/.changeset/puny-terms-start.md deleted file mode 100644 index bafe4fd5eb..0000000000 --- a/.changeset/puny-terms-start.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add AXE (Agentic eXecution Engine) documentation with real-time targeting, brand safety, and frequency management details. diff --git a/.changeset/purple-rice-unite.md b/.changeset/purple-rice-unite.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/purple-rice-unite.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/quick-pandas-invent.md b/.changeset/quick-pandas-invent.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/quick-pandas-invent.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/ready-breads-matter.md b/.changeset/ready-breads-matter.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/ready-breads-matter.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/ready-kids-teach.md b/.changeset/ready-kids-teach.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/ready-kids-teach.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/real-cases-join.md b/.changeset/real-cases-join.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/real-cases-join.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/real-places-float.md b/.changeset/real-places-float.md deleted file mode 100644 index 23458d9db1..0000000000 --- a/.changeset/real-places-float.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -CI fix: Add publish step to release workflow to enable GitHub release creation. diff --git a/.changeset/red-mails-do.md b/.changeset/red-mails-do.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/red-mails-do.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/reduce-log-noise.md b/.changeset/reduce-log-noise.md new file mode 100644 index 0000000000..8482d302ba --- /dev/null +++ b/.changeset/reduce-log-noise.md @@ -0,0 +1,4 @@ +--- +--- + +Reduce log noise by changing per-item logs to debug level and making job summaries conditional diff --git a/.changeset/release-relaxed-schemas.md b/.changeset/release-relaxed-schemas.md deleted file mode 100644 index fb0609cfce..0000000000 --- a/.changeset/release-relaxed-schemas.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"adcontextprotocol": patch ---- - -Release schemas with `additionalProperties: true` for forward compatibility - -This releases `dist/schemas/2.5.2/` containing the relaxed schema validation -introduced in #646. Clients can now safely ignore unknown fields when parsing -API responses, allowing the API to evolve without breaking existing integrations. diff --git a/.changeset/bumpy-cycles-hear.md b/.changeset/rich-toes-grow.md similarity index 100% rename from .changeset/bumpy-cycles-hear.md rename to .changeset/rich-toes-grow.md diff --git a/.changeset/ripe-ghosts-bet.md b/.changeset/ripe-ghosts-bet.md deleted file mode 100644 index 50f3463080..0000000000 --- a/.changeset/ripe-ghosts-bet.md +++ /dev/null @@ -1,9 +0,0 @@ ---- ---- - -Add escalation and learning capture tools for Addie - -- New `escalate_to_admin` tool for capability gaps and requests needing human action -- New `capture_learning` tool to flag valuable user insights for synthesis -- Admin API endpoints for managing escalations -- System prompt updates to prevent Addie from promising actions without tools diff --git a/.changeset/ripe-zebras-sell.md b/.changeset/ripe-zebras-sell.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/ripe-zebras-sell.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/salty-cooks-grin.md b/.changeset/salty-cooks-grin.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/salty-cooks-grin.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/seven-deer-marry.md b/.changeset/seven-deer-marry.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/seven-deer-marry.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/seven-heads-smile.md b/.changeset/seven-heads-smile.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/seven-heads-smile.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/seven-rules-invent.md b/.changeset/seven-rules-invent.md deleted file mode 100644 index 37a3d4f1bc..0000000000 --- a/.changeset/seven-rules-invent.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Allow working group leaders to schedule meetings for groups they lead via Addie. Added meeting and event tools documentation to Addie's system prompt. diff --git a/.changeset/seven-squids-carry.md b/.changeset/seven-squids-carry.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/seven-squids-carry.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/shaggy-rocks-train.md b/.changeset/shaggy-rocks-train.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/shaggy-rocks-train.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/shaky-paths-attend.md b/.changeset/shaky-paths-attend.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/shaky-paths-attend.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/shiny-dots-act.md b/.changeset/shiny-dots-act.md new file mode 100644 index 0000000000..3aacdbb4cb --- /dev/null +++ b/.changeset/shiny-dots-act.md @@ -0,0 +1,4 @@ +--- +--- + +Reduce log noise from scheduled jobs by moving routine success logs to debug level while keeping error logs at info level. diff --git a/.changeset/shiny-points-spend.md b/.changeset/shiny-points-spend.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/shiny-points-spend.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/short-clouds-feel.md b/.changeset/short-clouds-feel.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/short-clouds-feel.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/shy-bats-run.md b/.changeset/shy-bats-run.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/shy-bats-run.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/shy-kings-crash.md b/.changeset/shy-kings-crash.md new file mode 100644 index 0000000000..d21d7fc8c3 --- /dev/null +++ b/.changeset/shy-kings-crash.md @@ -0,0 +1,4 @@ +--- +--- + +Add Schedule button to admin working groups page diff --git a/.changeset/busy-swans-judge.md b/.changeset/shy-rivers-hug.md similarity index 100% rename from .changeset/busy-swans-judge.md rename to .changeset/shy-rivers-hug.md diff --git a/.changeset/calm-lamps-doubt.md b/.changeset/silent-adults-nail.md similarity index 100% rename from .changeset/calm-lamps-doubt.md rename to .changeset/silent-adults-nail.md diff --git a/.changeset/silent-cars-watch.md b/.changeset/silent-cars-watch.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/silent-cars-watch.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/silent-crews-lose.md b/.changeset/silent-crews-lose.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/silent-crews-lose.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/silly-paws-lick.md b/.changeset/silly-paws-lick.md new file mode 100644 index 0000000000..7572fa4a1a --- /dev/null +++ b/.changeset/silly-paws-lick.md @@ -0,0 +1,4 @@ +--- +--- + +Fix admin meetings page crash when loading meetings and series diff --git a/.changeset/silly-readers-hunt.md b/.changeset/silly-readers-hunt.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/silly-readers-hunt.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/silver-goats-exist.md b/.changeset/silver-goats-exist.md deleted file mode 100644 index e454a20f63..0000000000 --- a/.changeset/silver-goats-exist.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Internal server improvements: static fs import and proper 404 handling for HTML serving. diff --git a/.changeset/silver-suns-sell.md b/.changeset/silver-suns-sell.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/silver-suns-sell.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/sixty-colts-bathe.md b/.changeset/sixty-colts-bathe.md deleted file mode 100644 index a9682143b2..0000000000 --- a/.changeset/sixty-colts-bathe.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add company type and revenue tier collection during onboarding flow. diff --git a/.changeset/sixty-ends-ask.md b/.changeset/sixty-ends-ask.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/sixty-ends-ask.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/sixty-paws-punch.md b/.changeset/sixty-paws-punch.md deleted file mode 100644 index 9105fb5231..0000000000 --- a/.changeset/sixty-paws-punch.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add OpenTelemetry logging integration for PostHog and fix client-side JavaScript errors. diff --git a/.changeset/skip-welcome-engaged-users.md b/.changeset/skip-welcome-engaged-users.md deleted file mode 100644 index 01554d803f..0000000000 --- a/.changeset/skip-welcome-engaged-users.md +++ /dev/null @@ -1,6 +0,0 @@ ---- ---- - -No protocol impact - internal behavior change only. - -Skip intro/welcome goals for highly engaged users (committee leaders, working group members, council members, active Slack users). diff --git a/.changeset/slack-engagement-scores.md b/.changeset/slack-engagement-scores.md deleted file mode 100644 index 2a2fb92cb5..0000000000 --- a/.changeset/slack-engagement-scores.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Website only: Compute engagement scores for Slack-only contacts in admin dashboard diff --git a/.changeset/slick-camels-hide.md b/.changeset/slick-camels-hide.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/slick-camels-hide.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/slick-singers-prove.md b/.changeset/slick-singers-prove.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/slick-singers-prove.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/slick-tigers-invite.md b/.changeset/slick-tigers-invite.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/slick-tigers-invite.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/slimy-meteors-grab.md b/.changeset/slimy-meteors-grab.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/slimy-meteors-grab.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/slimy-singers-care.md b/.changeset/slimy-singers-care.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/slimy-singers-care.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/slow-snails-stand.md b/.changeset/slow-snails-stand.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/slow-snails-stand.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/slow-trains-agree.md b/.changeset/slow-trains-agree.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/slow-trains-agree.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/small-geese-leave.md b/.changeset/small-geese-leave.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/small-geese-leave.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/smart-olives-sort.md b/.changeset/smart-olives-sort.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/smart-olives-sort.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/chatty-tools-lead.md b/.changeset/smart-pants-admire.md similarity index 100% rename from .changeset/chatty-tools-lead.md rename to .changeset/smart-pants-admire.md diff --git a/.changeset/smooth-rice-chew.md b/.changeset/smooth-rice-chew.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/smooth-rice-chew.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/soft-apples-play.md b/.changeset/soft-apples-play.md deleted file mode 100644 index 6bf8a359b8..0000000000 --- a/.changeset/soft-apples-play.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix profile completion goal to only show for paid members, handle personal workspaces diff --git a/.changeset/soft-rooms-spend.md b/.changeset/soft-rooms-spend.md deleted file mode 100644 index 968502484e..0000000000 --- a/.changeset/soft-rooms-spend.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Internal improvements to industry news page: HTML entity parsing, article sorting by publication date, and URL deduplication. diff --git a/.changeset/solid-hotels-occur.md b/.changeset/solid-hotels-occur.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/solid-hotels-occur.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/solid-ideas-shake.md b/.changeset/solid-ideas-shake.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/solid-ideas-shake.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/chubby-books-film.md b/.changeset/solid-rooms-scream.md similarity index 100% rename from .changeset/chubby-books-film.md rename to .changeset/solid-rooms-scream.md diff --git a/.changeset/some-phones-study.md b/.changeset/some-phones-study.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/some-phones-study.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/some-teeth-judge.md b/.changeset/some-teeth-judge.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/some-teeth-judge.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/sparkly-camels-dream.md b/.changeset/sparkly-camels-dream.md deleted file mode 100644 index 648b907b34..0000000000 --- a/.changeset/sparkly-camels-dream.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Homepage layout refinement: tightened hero sections, moved Go Agentic section to prominent position after release banner, updated prompts to be more actionable, and removed mission statement band from org-index.html. diff --git a/.changeset/sparkly-onions-hug.md b/.changeset/sparkly-onions-hug.md deleted file mode 100644 index d9927220e2..0000000000 --- a/.changeset/sparkly-onions-hug.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add Addie email response capability - allows Addie to reply to email threads when CC'd and explicitly invoked diff --git a/.changeset/spicy-animals-fail.md b/.changeset/spicy-animals-fail.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/spicy-animals-fail.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/spicy-doors-flow.md b/.changeset/spicy-doors-flow.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/spicy-doors-flow.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/spicy-plants-rescue.md b/.changeset/spicy-plants-rescue.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/spicy-plants-rescue.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/spicy-tigers-double.md b/.changeset/spicy-tigers-double.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/spicy-tigers-double.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/stale-cobras-smile.md b/.changeset/stale-cobras-smile.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/stale-cobras-smile.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/stale-hats-dance.md b/.changeset/stale-hats-dance.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/stale-hats-dance.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/stale-tips-drive.md b/.changeset/stale-tips-drive.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/stale-tips-drive.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/strict-foxes-wash.md b/.changeset/strict-foxes-wash.md deleted file mode 100644 index 64c4740cc9..0000000000 --- a/.changeset/strict-foxes-wash.md +++ /dev/null @@ -1,8 +0,0 @@ ---- ---- - -fix: simplify engagement scoring and fix working group leader detection - -- Simplified engagement scoring: 10 points per Slack action + 20 points per event (capped at 100) -- Fixed working group count to include leaders as implicit members -- Committee leaders no longer receive "Discover Working Groups" recommendations diff --git a/.changeset/strict-lamps-turn.md b/.changeset/strict-lamps-turn.md deleted file mode 100644 index aab5a8b79f..0000000000 --- a/.changeset/strict-lamps-turn.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix Slack user linking in bulk prospect creation from domain discovery. diff --git a/.changeset/chubby-pumas-smoke.md b/.changeset/strong-wings-cough.md similarity index 100% rename from .changeset/chubby-pumas-smoke.md rename to .changeset/strong-wings-cough.md diff --git a/.changeset/sunny-apples-jam.md b/.changeset/sunny-apples-jam.md deleted file mode 100644 index 3146a532c7..0000000000 --- a/.changeset/sunny-apples-jam.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Improve Addie's GitHub issue detection for client library bugs vs agent bugs diff --git a/.changeset/sunny-bears-stare.md b/.changeset/sunny-bears-stare.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/sunny-bears-stare.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/clean-groups-press.md b/.changeset/sunny-cars-pick.md similarity index 100% rename from .changeset/clean-groups-press.md rename to .changeset/sunny-cars-pick.md diff --git a/.changeset/sweet-brooms-give.md b/.changeset/sweet-brooms-give.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/sweet-brooms-give.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/sweet-planes-follow.md b/.changeset/sweet-planes-follow.md deleted file mode 100644 index 6aa9556f09..0000000000 --- a/.changeset/sweet-planes-follow.md +++ /dev/null @@ -1,10 +0,0 @@ ---- ---- - -Improve Addie's Slack message understanding - -- Fix Addie not seeing forwarded Slack messages (content is in `attachments`, not `text`) -- Add reaction-based confirmations: thumbs up on "should I proceed?" means yes -- Add file share awareness: Addie now sees file metadata when users share files -- Add `fetch_url` tool: Addie can read content from URLs shared in messages -- Add `read_slack_file` tool: Addie can read text files shared in Slack diff --git a/.changeset/sweet-queens-send.md b/.changeset/sweet-queens-send.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/sweet-queens-send.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/sweet-taxis-act.md b/.changeset/sweet-taxis-act.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/sweet-taxis-act.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/swift-points-sniff.md b/.changeset/swift-points-sniff.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/swift-points-sniff.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/tame-hornets-peel.md b/.changeset/tame-hornets-peel.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/tame-hornets-peel.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/tame-hounds-swim.md b/.changeset/tame-hounds-swim.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/tame-hounds-swim.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/tame-llamas-shake.md b/.changeset/tame-llamas-shake.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/tame-llamas-shake.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/tasty-sails-tie.md b/.changeset/tasty-sails-tie.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/tasty-sails-tie.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/ten-bikes-shout.md b/.changeset/ten-bikes-shout.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/ten-bikes-shout.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/ten-crews-joke.md b/.changeset/ten-crews-joke.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/ten-crews-joke.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/ten-experts-fall.md b/.changeset/ten-experts-fall.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/ten-experts-fall.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/ten-groups-heal.md b/.changeset/ten-groups-heal.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/ten-groups-heal.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/ten-towns-admire.md b/.changeset/ten-towns-admire.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/ten-towns-admire.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/tender-experts-repeat.md b/.changeset/tender-experts-repeat.md deleted file mode 100644 index 4ceb3aa470..0000000000 --- a/.changeset/tender-experts-repeat.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Remove insight_goal_id references following migration 166 column drop. diff --git a/.changeset/tender-jeans-double.md b/.changeset/tender-jeans-double.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/tender-jeans-double.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/tender-needles-beg.md b/.changeset/tender-needles-beg.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/tender-needles-beg.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/tender-pants-glow.md b/.changeset/tender-pants-glow.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/tender-pants-glow.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/clean-pumas-open.md b/.changeset/tender-trees-cut.md similarity index 100% rename from .changeset/clean-pumas-open.md rename to .changeset/tender-trees-cut.md diff --git a/.changeset/thick-cows-add.md b/.changeset/thick-cows-add.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/thick-cows-add.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/thin-lions-trade.md b/.changeset/thin-lions-trade.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/thin-lions-trade.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/thirty-dots-feel.md b/.changeset/thirty-dots-feel.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/thirty-dots-feel.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/thirty-papayas-rescue.md b/.changeset/thirty-papayas-rescue.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/thirty-papayas-rescue.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/thirty-regions-dance.md b/.changeset/thirty-regions-dance.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/thirty-regions-dance.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/thirty-snails-kneel.md b/.changeset/thirty-snails-kneel.md deleted file mode 100644 index efbd790a09..0000000000 --- a/.changeset/thirty-snails-kneel.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add token-aware context limiting for Addie to prevent prompt overflow errors in long conversations. diff --git a/.changeset/thirty-snakes-fix.md b/.changeset/thirty-snakes-fix.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/thirty-snakes-fix.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/timezone-meeting-fix.md b/.changeset/timezone-meeting-fix.md new file mode 100644 index 0000000000..e9ce99d6fd --- /dev/null +++ b/.changeset/timezone-meeting-fix.md @@ -0,0 +1,8 @@ +--- +--- + +fix: Meeting scheduling timezone comparison bug + +Fixed Addie incorrectly rejecting meeting times as "already passed" when users +specified times in their local timezone. The datetime comparison now correctly +interprets times in the specified timezone context. diff --git a/.changeset/tiny-games-decide.md b/.changeset/tiny-games-decide.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/tiny-games-decide.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/clear-colts-wink.md b/.changeset/tiny-groups-share.md similarity index 100% rename from .changeset/clear-colts-wink.md rename to .changeset/tiny-groups-share.md diff --git a/.changeset/tiny-news-smash.md b/.changeset/tiny-news-smash.md deleted file mode 100644 index d453bc8770..0000000000 --- a/.changeset/tiny-news-smash.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add mobile app-like experience with slide-in navigation, safe area handling, touch-optimized targets, and PWA support. diff --git a/.changeset/tired-rockets-lie.md b/.changeset/tired-rockets-lie.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/tired-rockets-lie.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/clever-pets-brush.md b/.changeset/tough-bottles-roll.md similarity index 100% rename from .changeset/clever-pets-brush.md rename to .changeset/tough-bottles-roll.md diff --git a/.changeset/tricky-baths-obey.md b/.changeset/tricky-baths-obey.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/tricky-baths-obey.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/tricky-worms-push.md b/.changeset/tricky-worms-push.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/tricky-worms-push.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/cold-shrimps-taste.md b/.changeset/true-buttons-fall.md similarity index 100% rename from .changeset/cold-shrimps-taste.md rename to .changeset/true-buttons-fall.md diff --git a/.changeset/twelve-baboons-smell.md b/.changeset/twelve-baboons-smell.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/twelve-baboons-smell.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/twelve-books-cross.md b/.changeset/twelve-books-cross.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/twelve-books-cross.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/common-cougars-unite.md b/.changeset/twelve-hounds-stand.md similarity index 100% rename from .changeset/common-cougars-unite.md rename to .changeset/twelve-hounds-stand.md diff --git a/.changeset/twenty-ads-lay.md b/.changeset/twenty-ads-lay.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/twenty-ads-lay.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/twenty-bobcats-fall.md b/.changeset/twenty-bobcats-fall.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/twenty-bobcats-fall.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/wacky-seals-eat.md b/.changeset/wacky-seals-eat.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/wacky-seals-eat.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/wacky-things-refuse.md b/.changeset/wacky-things-refuse.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/wacky-things-refuse.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/wacky-worms-speak.md b/.changeset/wacky-worms-speak.md deleted file mode 100644 index 42ecbe41cd..0000000000 --- a/.changeset/wacky-worms-speak.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Fix admin tools not being available in Slack DM threads, add timeframe filtering to conversation stats, and fix feedback UI re-rendering after save diff --git a/.changeset/warm-jars-attack.md b/.changeset/warm-jars-attack.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/warm-jars-attack.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/warm-lamps-accept.md b/.changeset/warm-lamps-accept.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/warm-lamps-accept.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/wet-keys-wash.md b/.changeset/wet-keys-wash.md deleted file mode 100644 index 2405357f90..0000000000 --- a/.changeset/wet-keys-wash.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add brand_manifest parameter to test_adcp_agent tool, allowing users to specify custom brands when testing agents. Defaults to Nike if not provided. diff --git a/.changeset/wicked-islands-tickle.md b/.changeset/wicked-islands-tickle.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/wicked-islands-tickle.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/wicked-memes-act.md b/.changeset/wicked-memes-act.md deleted file mode 100644 index 7596795353..0000000000 --- a/.changeset/wicked-memes-act.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Admin collaboration features for outreach: add insight button, year reference cleanup, vendor membership goal, admin nudge/override diff --git a/.changeset/wide-kiwis-say.md b/.changeset/wide-kiwis-say.md deleted file mode 100644 index 34a6a9b184..0000000000 --- a/.changeset/wide-kiwis-say.md +++ /dev/null @@ -1,11 +0,0 @@ ---- ---- - -Consolidate rating system to thumbs up/down and add rating_source to distinguish user vs admin feedback. - -Add eval framework for testing rule changes against historical interactions: -- New tables: addie_eval_runs, addie_eval_results -- Re-execute historical messages with proposed rules using real Claude calls -- Compare original vs new responses (routing, tools, response text) -- Human review with verdicts (improved/same/worse/uncertain) -- API endpoints: POST/GET /api/admin/addie/eval/runs, GET /results, PUT /review diff --git a/.changeset/wide-shirts-attack.md b/.changeset/wide-shirts-attack.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/wide-shirts-attack.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/wise-bags-invite.md b/.changeset/wise-bags-invite.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/wise-bags-invite.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/wise-places-invent.md b/.changeset/wise-places-invent.md deleted file mode 100644 index 1a9d8eea67..0000000000 --- a/.changeset/wise-places-invent.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Documentation improvements: Added testable JSON examples with $schema declarations to formats.mdx, consolidated list_creative_formats docs, and split preview_creative.mdx into core reference and advanced guide for better readability. diff --git a/.changeset/wise-tigers-lose.md b/.changeset/wise-tigers-lose.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/wise-tigers-lose.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/witty-teeth-live.md b/.changeset/witty-teeth-live.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/witty-teeth-live.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/common-geckos-wash.md b/.changeset/yellow-baboons-arrive.md similarity index 100% rename from .changeset/common-geckos-wash.md rename to .changeset/yellow-baboons-arrive.md diff --git a/.changeset/yellow-deer-brush.md b/.changeset/yellow-deer-brush.md new file mode 100644 index 0000000000..19e5573f43 --- /dev/null +++ b/.changeset/yellow-deer-brush.md @@ -0,0 +1,4 @@ +--- +--- + +Internal changes only - no protocol impact diff --git a/.changeset/yellow-ghosts-appear.md b/.changeset/yellow-ghosts-appear.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/yellow-ghosts-appear.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/yellow-knives-warn.md b/.changeset/yellow-knives-warn.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/yellow-knives-warn.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/yellow-llamas-lie.md b/.changeset/yellow-llamas-lie.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/yellow-llamas-lie.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/young-baths-kiss.md b/.changeset/young-baths-kiss.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/young-baths-kiss.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/young-masks-care.md b/.changeset/young-masks-care.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/young-masks-care.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/yummy-areas-bet.md b/.changeset/yummy-areas-bet.md deleted file mode 100644 index 99bd059314..0000000000 --- a/.changeset/yummy-areas-bet.md +++ /dev/null @@ -1,9 +0,0 @@ ---- ---- - -Add regional chapters and industry event presence features: -- User location tracking (city, country) for chapter matching -- Event groups (committee_type: 'event') linked to industry events -- Slack channel auto-sync: join channel = join group -- Admin UI for event groups and chapters -- Addie tools for member-driven chapter creation diff --git a/.github/workflows/broken-links.yml b/.github/workflows/broken-links.yml index fe1197b0cd..fed80be4bf 100644 --- a/.github/workflows/broken-links.yml +++ b/.github/workflows/broken-links.yml @@ -32,8 +32,16 @@ jobs: - name: Install dependencies run: npm ci + - name: Exclude versioned docs from broken links check + run: rm -rf v2.6-rc + - name: Check for broken links in docs (v2.5) - run: npx mintlify@latest broken-links + run: | + # Temporarily remove v2.6-rc docs which have WIP governance links + # These will be fixed when governance section is complete + rm -rf v2.6-rc + npx mintlify@latest broken-links + git checkout v2.6-rc - name: Check README links run: npx markdown-link-check README.md --config .markdown-link-check.json diff --git a/.github/workflows/sync-versioned-docs.yml b/.github/workflows/sync-versioned-docs.yml index 2c32ebb41f..a641090206 100644 --- a/.github/workflows/sync-versioned-docs.yml +++ b/.github/workflows/sync-versioned-docs.yml @@ -47,6 +47,48 @@ jobs: echo "dist/schemas/2.6.0 does not exist in 2.6.x branch, skipping" fi + - name: Sync navigation from 2.6.x docs.json + run: | + # Extract docs.json from 2.6.x branch + git show origin/2.6.x:docs.json > /tmp/source-docs.json + + # Create jq script to transform navigation + # Takes the first version's groups from 2.6.x (which has the actual content) + # and transforms all paths by prepending "v2.6-rc/" + cat << 'JQSCRIPT' > /tmp/transform.jq + def transform_paths: + if type == "array" then + map(transform_paths) + elif type == "object" then + if has("pages") then + .pages = (.pages | transform_paths) + else + . + end + elif type == "string" then + "v2.6-rc/" + . + else + . + end; + + # $source is from --slurpfile (array), so use $source[0] + ($source[0].navigation.versions[0].groups | transform_paths) as $transformed | + (.navigation.versions | to_entries | map(select(.value.version == "2.6-rc")) | .[0].key) as $idx | + if $idx != null then + .navigation.versions[$idx].groups = $transformed + else + . + end + JQSCRIPT + + # Apply transformation: read source groups from 2.6.x, transform paths, update main's docs.json + jq --slurpfile source /tmp/source-docs.json -f /tmp/transform.jq docs.json > /tmp/updated-docs.json + + # Replace docs.json with updated version + mv /tmp/updated-docs.json docs.json + + echo "Synced navigation from 2.6.x docs.json to v2.6-rc version" + - name: Create Pull Request uses: peter-evans/create-pull-request@v7 with: @@ -57,6 +99,7 @@ jobs: This PR syncs from the 2.6.x branch: - Documentation to `v2.6-rc/docs/` - Schemas to `dist/schemas/2.6.0/` (if available) + - Navigation config from 2.6.x's docs.json to main's v2.6-rc version Auto-generated by the sync-versioned-docs workflow. branch: auto/sync-v2.6-rc @@ -64,3 +107,4 @@ jobs: add-paths: | v2.6-rc/ dist/schemas/2.6.0/ + docs.json diff --git a/.husky/pre-push b/.husky/pre-push index 29d47a2d34..b39a618810 100755 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -8,10 +8,15 @@ npm run verify-version-sync echo "🔍 Validating Mintlify documentation..." # Check for broken internal links -npx --yes mintlify@latest broken-links || { +# Temporarily remove v2.6-rc docs which have WIP governance links +rm -rf v2.6-rc +npx --yes mintlify@latest broken-links +BROKEN_LINKS_EXIT=$? +git checkout v2.6-rc +if [ $BROKEN_LINKS_EXIT -ne 0 ]; then echo "❌ Mintlify broken links check failed. Please fix broken links before pushing." exit 1 -} +fi # Check for accessibility issues (warn only, don't fail) npx --yes mintlify@latest a11y || { diff --git a/CHANGELOG.md b/CHANGELOG.md index fc9abadea1..2a983990bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,50 @@ ## 2.6.0 +### Major Changes + +- Add Content Standards Protocol for brand safety and suitability evaluation (#621) + + **New Protocol:** + + Introduces a comprehensive content standards framework enabling buyers to define, calibrate, and enforce brand safety policies across advertising placements. + + **New Tasks:** + - `list_content_standards` - List available content standards configurations + - `get_content_standards` - Retrieve full standards configuration with policy details + - `create_content_standards` - Create new content standards configuration + - `update_content_standards` - Update existing content standards configuration + - `calibrate_content` - Collaborative calibration dialogue for policy alignment + - `validate_content_delivery` - Batch validate delivery records against standards + - `get_media_buy_artifacts` - Retrieve content artifacts from media buys for validation + + **New Schemas:** + - `content-standards.json` - Reusable content standards configuration + - `content-standards-artifact.json` - Content artifact for evaluation + - `artifact-webhook-payload.json` - Webhook payload for artifact delivery + +- Add Property Governance Protocol for AdCP 3.0 (#588) + + **New Protocol:** + + Enables governance agents to evaluate properties against feature-based requirements for brand safety, content quality, and compliance. + + **New Tasks:** + - `list_property_features` - Discover governance agent capabilities + - `create_property_list` - Create managed property lists with filters + - `update_property_list` - Update existing property lists + - `get_property_list` - Retrieve property list with resolved properties + - `list_property_lists` - List all property lists + - `delete_property_list` - Delete a property list + + **New Schemas:** + - `property-feature-definition.json` - Feature definition schema + - `property-feature.json` - Feature assessment schema + - `feature-requirement.json` - Feature-based requirement schema + - `property-list.json` - Managed property list schema + - `property-list-filters.json` - Dynamic filter schema + - `property-list-changed-webhook.json` - Webhook payload for list changes + ### Minor Changes - Add unified `assets` field to format schema for better asset discovery @@ -39,6 +83,113 @@ **Migration:** Non-breaking change. `assets_required` is deprecated but still supported. New implementations should use `assets`. +- Add typed extensions infrastructure with auto-discovery (#648) + + **New Feature:** + + Introduces a typed extension system allowing vendors and domains to add custom data to AdCP schemas in a discoverable, validated way. + + **New Schemas:** + - `extensions/extension-meta.json` - Meta schema for extension definitions + - `extensions/index.json` - Auto-generated registry of all extensions + - `protocols/adcp-extension.json` - AdCP extension for agent cards + + **Benefits:** + - Vendor-specific data without polluting core schemas + - Auto-discovery of available extensions + - Validation support for extension data + +- Add OpenAI Commerce integration to brand manifest (#802) + + **Schema Changes:** + - **brand-manifest.json**: Add `openai_commerce` field for OpenAI shopping integration + + Enables brands to include their OpenAI Commerce merchant ID for AI-powered shopping experiences. + +- Add privacy_policy_url to brand manifest and adagents.json (#801) + + **Schema Changes:** + - **brand-manifest.json**: Add optional `privacy_policy_url` field + - **adagents.json**: Add optional `privacy_policy_url` field + + Enables publishers and brands to declare their privacy policy URLs for compliance and transparency. + +- Refactor: replace creative_ids with creative_assignments (#794) + + **Breaking Change:** + + Package schema now uses `creative_assignments` array instead of `creative_ids` for more flexible creative-to-package mapping with placement support. + + **Migration:** + ```json + // Before + { "creative_ids": ["creative_1", "creative_2"] } + + // After + { "creative_assignments": [ + { "creative_id": "creative_1" }, + { "creative_id": "creative_2", "placement_ids": ["homepage_banner"] } + ]} + ``` + +### Patch Changes + +- fix: Mintlify callout syntax and case-insensitivity docs (#834) +- fix: Convert governance docs to relative links (#820) +- build: rebuild dist/schemas/2.6.0 with impressions and paused fields +- chore: regenerate dist/schemas/2.6.0 with additionalProperties: true +- ci: add 2.6.x branch to all workflows +- docs: add deprecated assets_required examples with deprecation comments +- schema: make 'required' field mandatory in assets array and nested repeatable_group assets +- schema: add formal deprecated: true to assets_required field + +## 2.5.3 + +### Patch Changes + +- 309a880: Allow additional properties in all JSON schemas for forward compatibility + + Changes all schemas from `"additionalProperties": false` to `"additionalProperties": true`. This enables clients running older schema versions to accept responses from servers with newer schemas without breaking validation - a standard practice for protocol evolution in distributed systems. + +- 5d0ce75: Add explicit type definition to error.json details property + + The `details` property in core/error.json now explicitly declares `"type": "object"` and `"additionalProperties": true`, consistent with other error details definitions in the codebase. This addresses issue #343 where the data type was unspecified. + +- cdcd70f: Fix migration 151 to delete duplicates before updating Slack IDs to WorkOS IDs +- 39abf79: Add missing fields to package request schemas for consistency with core/package.json. + + **Schema Changes:** + + - `media-buy/package-request.json`: Added `impressions` and `paused` fields + - `media-buy/update-media-buy-request.json`: Added `impressions` field to package updates + + **Details:** + + - `impressions`: Impression goal for the package (optional, minimum: 0) + - `paused`: Create package in paused state (optional, default: false) + + These fields were defined in `core/package.json` but missing from the request schemas, making it impossible to set impression goals or initial paused state when creating/updating media buys. + + **Documentation:** + + - Updated `create_media_buy` task reference with new package parameters + - Updated `update_media_buy` task reference with impressions parameter + +- fa68588: fix: display Slack profile name for chapter leaders without WorkOS accounts + + Leaders added via Slack ID that haven't linked their WorkOS account now display + their Slack profile name (real_name or display_name) instead of the raw Slack + user ID (e.g., U09BEKNJ3GB). + + The getLeaders and getLeadersBatch queries now include slack_user_mappings as an + additional name source in the COALESCE chain. + +- 9315247: Release schemas with `additionalProperties: true` for forward compatibility + + This releases `dist/schemas/2.5.2/` containing the relaxed schema validation + introduced in #646. Clients can now safely ignore unknown fields when parsing + API responses, allowing the API to evolve without breaking existing integrations. + ## 2.5.2 ### Patch Changes diff --git a/CLAUDE.md b/CLAUDE.md index e97734e883..2d5ade832e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -89,6 +89,19 @@ Types: `patch` (fixes), `minor` (new features), `major` (breaking), `--empty` (n - **MINOR**: Add optional fields, new enum values, new tasks - **MAJOR**: Remove/rename fields, change types, remove enum values +### Addie Code Version +When making significant changes to Addie's core logic, bump `CODE_VERSION` in `server/src/addie/config-version.ts`. + +**When to bump:** +- Claude client behavior (`claude-client.ts`) +- Tool implementations (`mcp/*.ts`) +- Message processing logic (`thread-service.ts`, `bolt-app.ts`) +- Router logic beyond `ROUTING_RULES` (`router.ts`) + +**Format:** `YYYY.MM.N` (e.g., `2025.01.1`, `2025.01.2`, `2025.02.1`) + +This creates a new Addie config version, allowing performance comparison before/after code changes. + ## Deployment Production deploys to **Fly.io** (not Vercel). Migrations run automatically on startup. diff --git a/dist/schemas/2.5.3/adagents.json b/dist/schemas/2.5.3/adagents.json new file mode 100644 index 0000000000..f36134db23 --- /dev/null +++ b/dist/schemas/2.5.3/adagents.json @@ -0,0 +1,494 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/2.5.3/adagents.json", + "title": "Authorized Sales Agents", + "description": "Declaration of authorized sales agents for advertising inventory. Hosted at /.well-known/adagents.json on publisher domains. Can either contain the full structure inline or reference an authoritative URL.", + "oneOf": [ + { + "type": "object", + "description": "URL reference variant - points to the authoritative location of the adagents.json file", + "properties": { + "$schema": { + "type": "string", + "description": "JSON Schema identifier for this adagents.json file" + }, + "authoritative_location": { + "type": "string", + "format": "uri", + "pattern": "^https://", + "description": "HTTPS URL of the authoritative adagents.json file. When present, this file is a reference and the authoritative location contains the actual agent authorization data." + }, + "last_updated": { + "type": "string", + "format": "date-time", + "description": "ISO 8601 timestamp indicating when this reference was last updated" + } + }, + "required": [ + "authoritative_location" + ], + "additionalProperties": true + }, + { + "type": "object", + "description": "Inline structure variant - contains full agent authorization data", + "properties": { + "$schema": { + "type": "string", + "description": "JSON Schema identifier for this adagents.json file" + }, + "contact": { + "type": "object", + "description": "Contact information for the entity managing this adagents.json file (may be publisher or third-party operator)", + "properties": { + "name": { + "type": "string", + "description": "Name of the entity managing this file (e.g., 'Meta Advertising Operations', 'Clear Channel Digital')", + "minLength": 1, + "maxLength": 255 + }, + "email": { + "type": "string", + "format": "email", + "description": "Contact email for questions or issues with this authorization file", + "minLength": 1, + "maxLength": 255 + }, + "domain": { + "type": "string", + "description": "Primary domain of the entity managing this file", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "seller_id": { + "type": "string", + "description": "Seller ID from IAB Tech Lab sellers.json (if applicable)", + "minLength": 1, + "maxLength": 255 + }, + "tag_id": { + "type": "string", + "description": "TAG Certified Against Fraud ID for verification (if applicable)", + "minLength": 1, + "maxLength": 100 + } + }, + "required": [ + "name" + ], + "additionalProperties": true + }, + "properties": { + "type": "array", + "description": "Array of all properties covered by this adagents.json file. Defines the canonical property list that authorized agents reference.", + "items": { + "$ref": "/schemas/2.5.3/core/property.json" + }, + "minItems": 1 + }, + "tags": { + "type": "object", + "description": "Metadata for each tag referenced by properties. Provides human-readable context for property tag values.", + "additionalProperties": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Human-readable name for this tag" + }, + "description": { + "type": "string", + "description": "Description of what this tag represents" + } + }, + "required": [ + "name", + "description" + ], + "additionalProperties": true + } + }, + "authorized_agents": { + "type": "array", + "description": "Array of sales agents authorized to sell inventory for properties in this file", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "The authorized agent's API endpoint URL" + }, + "authorized_for": { + "type": "string", + "description": "Human-readable description of what this agent is authorized to sell", + "minLength": 1, + "maxLength": 500 + }, + "authorization_type": { + "type": "string", + "const": "property_ids", + "description": "Discriminator indicating authorization by specific property IDs" + }, + "property_ids": { + "type": "array", + "description": "Property IDs this agent is authorized for. Resolved against the top-level properties array in this file", + "items": { + "$ref": "/schemas/2.5.3/core/property-id.json" + }, + "minItems": 1 + } + }, + "required": [ + "url", + "authorized_for", + "authorization_type", + "property_ids" + ], + "additionalProperties": true + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "The authorized agent's API endpoint URL" + }, + "authorized_for": { + "type": "string", + "description": "Human-readable description of what this agent is authorized to sell", + "minLength": 1, + "maxLength": 500 + }, + "authorization_type": { + "type": "string", + "const": "property_tags", + "description": "Discriminator indicating authorization by property tags" + }, + "property_tags": { + "type": "array", + "description": "Tags identifying which properties this agent is authorized for. Resolved against the top-level properties array in this file using tag matching", + "items": { + "$ref": "/schemas/2.5.3/core/property-tag.json" + }, + "minItems": 1 + } + }, + "required": [ + "url", + "authorized_for", + "authorization_type", + "property_tags" + ], + "additionalProperties": true + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "The authorized agent's API endpoint URL" + }, + "authorized_for": { + "type": "string", + "description": "Human-readable description of what this agent is authorized to sell", + "minLength": 1, + "maxLength": 500 + }, + "authorization_type": { + "type": "string", + "const": "inline_properties", + "description": "Discriminator indicating authorization by inline property definitions" + }, + "properties": { + "type": "array", + "description": "Specific properties this agent is authorized for (alternative to property_ids/property_tags)", + "items": { + "$ref": "/schemas/2.5.3/core/property.json" + }, + "minItems": 1 + } + }, + "required": [ + "url", + "authorized_for", + "authorization_type", + "properties" + ], + "additionalProperties": true + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "The authorized agent's API endpoint URL" + }, + "authorized_for": { + "type": "string", + "description": "Human-readable description of what this agent is authorized to sell", + "minLength": 1, + "maxLength": 500 + }, + "authorization_type": { + "type": "string", + "const": "publisher_properties", + "description": "Discriminator indicating authorization for properties from other publisher domains" + }, + "publisher_properties": { + "type": "array", + "description": "Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell", + "items": { + "$ref": "/schemas/2.5.3/core/publisher-property-selector.json" + }, + "minItems": 1 + } + }, + "required": [ + "url", + "authorized_for", + "authorization_type", + "publisher_properties" + ], + "additionalProperties": true + } + ] + }, + "minItems": 1 + }, + "last_updated": { + "type": "string", + "format": "date-time", + "description": "ISO 8601 timestamp indicating when this file was last updated" + } + }, + "required": [ + "authorized_agents" + ], + "additionalProperties": true + } + ], + "examples": [ + { + "$schema": "/schemas/2.5.3/adagents.json", + "authoritative_location": "https://cdn.example.com/adagents/v2/adagents.json", + "last_updated": "2025-01-15T10:00:00Z" + }, + { + "$schema": "/schemas/2.5.3/adagents.json", + "properties": [ + { + "property_type": "website", + "name": "Example Site", + "identifiers": [ + { + "type": "domain", + "value": "example.com" + } + ], + "publisher_domain": "example.com" + } + ], + "authorized_agents": [ + { + "url": "https://agent.example.com", + "authorized_for": "Official sales agent", + "authorization_type": "property_tags", + "property_tags": [ + "all" + ] + } + ], + "tags": { + "all": { + "name": "All Properties", + "description": "All properties in this file" + } + }, + "last_updated": "2025-01-10T12:00:00Z" + }, + { + "$schema": "/schemas/2.5.3/adagents.json", + "contact": { + "name": "Meta Advertising Operations", + "email": "adops@meta.com", + "domain": "meta.com", + "seller_id": "pub-meta-12345", + "tag_id": "12345" + }, + "properties": [ + { + "property_type": "mobile_app", + "name": "Instagram", + "identifiers": [ + { + "type": "ios_bundle", + "value": "com.burbn.instagram" + }, + { + "type": "android_package", + "value": "com.instagram.android" + } + ], + "tags": [ + "meta_network", + "social_media" + ], + "publisher_domain": "instagram.com" + }, + { + "property_type": "mobile_app", + "name": "Facebook", + "identifiers": [ + { + "type": "ios_bundle", + "value": "com.facebook.Facebook" + }, + { + "type": "android_package", + "value": "com.facebook.katana" + } + ], + "tags": [ + "meta_network", + "social_media" + ], + "publisher_domain": "facebook.com" + }, + { + "property_type": "mobile_app", + "name": "WhatsApp", + "identifiers": [ + { + "type": "ios_bundle", + "value": "net.whatsapp.WhatsApp" + }, + { + "type": "android_package", + "value": "com.whatsapp" + } + ], + "tags": [ + "meta_network", + "messaging" + ], + "publisher_domain": "whatsapp.com" + } + ], + "tags": { + "meta_network": { + "name": "Meta Network", + "description": "All Meta-owned properties" + }, + "social_media": { + "name": "Social Media Apps", + "description": "Social networking applications" + }, + "messaging": { + "name": "Messaging Apps", + "description": "Messaging and communication apps" + } + }, + "authorized_agents": [ + { + "url": "https://meta-ads.com", + "authorized_for": "All Meta properties", + "authorization_type": "property_tags", + "property_tags": [ + "meta_network" + ] + } + ], + "last_updated": "2025-01-10T15:30:00Z" + }, + { + "$schema": "/schemas/2.5.3/adagents.json", + "contact": { + "name": "Tumblr Advertising" + }, + "properties": [ + { + "property_type": "website", + "name": "Tumblr Corporate", + "identifiers": [ + { + "type": "domain", + "value": "tumblr.com" + } + ], + "tags": [ + "corporate" + ], + "publisher_domain": "tumblr.com" + } + ], + "tags": { + "corporate": { + "name": "Corporate Properties", + "description": "Tumblr-owned corporate properties (not user blogs)" + } + }, + "authorized_agents": [ + { + "url": "https://tumblr-sales.com", + "authorized_for": "Tumblr corporate properties only", + "authorization_type": "property_tags", + "property_tags": [ + "corporate" + ] + } + ], + "last_updated": "2025-01-10T16:00:00Z" + }, + { + "$schema": "/schemas/2.5.3/adagents.json", + "contact": { + "name": "Example Third-Party Sales Agent", + "email": "sales@agent.example", + "domain": "agent.example" + }, + "authorized_agents": [ + { + "url": "https://agent.example/api", + "authorized_for": "CNN CTV properties via publisher authorization", + "authorization_type": "publisher_properties", + "publisher_properties": [ + { + "publisher_domain": "cnn.com", + "selection_type": "by_id", + "property_ids": [ + "cnn_ctv_app" + ] + } + ] + }, + { + "url": "https://agent.example/api", + "authorized_for": "All CTV properties from multiple publishers", + "authorization_type": "publisher_properties", + "publisher_properties": [ + { + "publisher_domain": "cnn.com", + "selection_type": "by_tag", + "property_tags": [ + "ctv" + ] + }, + { + "publisher_domain": "espn.com", + "selection_type": "by_tag", + "property_tags": [ + "ctv" + ] + } + ] + } + ], + "last_updated": "2025-01-10T17:00:00Z" + } + ] +} diff --git a/dist/schemas/2.5.3/bundled/media-buy/build-creative-request.json b/dist/schemas/2.5.3/bundled/media-buy/build-creative-request.json new file mode 100644 index 0000000000..f915a27362 --- /dev/null +++ b/dist/schemas/2.5.3/bundled/media-buy/build-creative-request.json @@ -0,0 +1,1349 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/2.5.3/bundled/media-buy/build-creative-request.json", + "title": "Build Creative Request", + "description": "Request to transform or generate a creative manifest. Takes a source manifest (which may be minimal for pure generation) and produces a target manifest in the specified format. The source manifest should include all assets required by the target format (e.g., promoted_offerings for generative formats).", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Natural language instructions for the transformation or generation. For pure generation, this is the creative brief. For transformation, this provides guidance on how to adapt the creative." + }, + "creative_manifest": { + "title": "Creative Manifest", + "description": "Creative manifest to transform or generate from. For pure generation, this should include the target format_id and any required input assets (e.g., promoted_offerings for generative formats). For transformation (e.g., resizing, reformatting), this is the complete creative to adapt.", + "type": "object", + "properties": { + "format_id": { + "title": "Format ID", + "description": "Format identifier this manifest is for. Can be a template format (id only) or a deterministic format (id + dimensions/duration). For dimension-specific creatives, include width/height/unit in the format_id to create a unique identifier (e.g., {id: 'display_static', width: 300, height: 250, unit: 'px'}).", + "type": "object", + "properties": { + "agent_url": { + "type": "string", + "format": "uri", + "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + }, + "id": { + "type": "string", + "pattern": "^[a-zA-Z0-9_-]+$", + "description": "Format identifier within the agent's namespace (e.g., 'display_static', 'video_hosted', 'audio_standard'). When used alone, references a template format. When combined with dimension/duration fields, creates a parameterized format ID for a specific variant." + }, + "width": { + "type": "integer", + "minimum": 1, + "description": "Width in pixels for visual formats. When specified, height must also be specified. Both fields together create a parameterized format ID for dimension-specific variants." + }, + "height": { + "type": "integer", + "minimum": 1, + "description": "Height in pixels for visual formats. When specified, width must also be specified. Both fields together create a parameterized format ID for dimension-specific variants." + }, + "duration_ms": { + "type": "number", + "minimum": 1, + "description": "Duration in milliseconds for time-based formats (video, audio). When specified, creates a parameterized format ID. Omit to reference a template format without parameters." + } + }, + "required": [ + "agent_url", + "id" + ], + "additionalProperties": true, + "dependencies": { + "width": [ + "height" + ], + "height": [ + "width" + ] + } + }, + "promoted_offering": { + "type": "string", + "description": "Product name or offering being advertised. Maps to promoted_offerings in create_media_buy request to associate creative with the product being promoted." + }, + "assets": { + "type": "object", + "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets_required array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Creative manifest validation MUST be performed in the context of the format specification. The format defines what type each asset_id should be, which eliminates any validation ambiguity.", + "patternProperties": { + "^[a-z0-9_]+$": { + "oneOf": [ + { + "title": "Image Asset", + "description": "Image asset with URL and dimensions", + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "URL to the image asset" + }, + "width": { + "type": "integer", + "minimum": 1, + "description": "Width in pixels" + }, + "height": { + "type": "integer", + "minimum": 1, + "description": "Height in pixels" + }, + "format": { + "type": "string", + "description": "Image file format (jpg, png, gif, webp, etc.)" + }, + "alt_text": { + "type": "string", + "description": "Alternative text for accessibility" + } + }, + "required": [ + "url", + "width", + "height" + ], + "additionalProperties": true + }, + { + "title": "Video Asset", + "description": "Video asset with URL and specifications", + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "URL to the video asset" + }, + "width": { + "type": "integer", + "minimum": 1, + "description": "Width in pixels" + }, + "height": { + "type": "integer", + "minimum": 1, + "description": "Height in pixels" + }, + "duration_ms": { + "type": "integer", + "description": "Video duration in milliseconds", + "minimum": 1 + }, + "format": { + "type": "string", + "description": "Video file format (mp4, webm, mov, etc.)" + }, + "bitrate_kbps": { + "type": "integer", + "description": "Video bitrate in kilobits per second", + "minimum": 1 + } + }, + "required": [ + "url", + "width", + "height" + ], + "additionalProperties": true + }, + { + "title": "Audio Asset", + "description": "Audio asset with URL and specifications", + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "URL to the audio asset" + }, + "duration_ms": { + "type": "integer", + "description": "Audio duration in milliseconds", + "minimum": 0 + }, + "format": { + "type": "string", + "description": "Audio file format (mp3, wav, aac, etc.)" + }, + "bitrate_kbps": { + "type": "integer", + "description": "Audio bitrate in kilobits per second", + "minimum": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": true + }, + { + "title": "VAST Asset", + "description": "VAST (Video Ad Serving Template) tag for third-party video ad serving", + "oneOf": [ + { + "type": "object", + "properties": { + "delivery_type": { + "type": "string", + "const": "url", + "description": "Discriminator indicating VAST is delivered via URL endpoint" + }, + "url": { + "type": "string", + "format": "uri", + "description": "URL endpoint that returns VAST XML" + }, + "vast_version": { + "title": "VAST Version", + "description": "VAST specification version", + "type": "string", + "enum": [ + "2.0", + "3.0", + "4.0", + "4.1", + "4.2" + ] + }, + "vpaid_enabled": { + "type": "boolean", + "description": "Whether VPAID (Video Player-Ad Interface Definition) is supported" + }, + "duration_ms": { + "type": "integer", + "description": "Expected video duration in milliseconds (if known)", + "minimum": 0 + }, + "tracking_events": { + "type": "array", + "items": { + "title": "VAST Tracking Event", + "description": "Standard VAST tracking events for video ad playback and interaction", + "type": "string", + "enum": [ + "start", + "firstQuartile", + "midpoint", + "thirdQuartile", + "complete", + "impression", + "click", + "pause", + "resume", + "skip", + "mute", + "unmute", + "fullscreen", + "exitFullscreen", + "playerExpand", + "playerCollapse" + ] + }, + "description": "Tracking events supported by this VAST tag" + } + }, + "required": [ + "delivery_type", + "url" + ], + "additionalProperties": true + }, + { + "type": "object", + "properties": { + "delivery_type": { + "type": "string", + "const": "inline", + "description": "Discriminator indicating VAST is delivered as inline XML content" + }, + "content": { + "type": "string", + "description": "Inline VAST XML content" + }, + "vast_version": { + "title": "VAST Version", + "description": "VAST specification version", + "type": "string", + "enum": [ + "2.0", + "3.0", + "4.0", + "4.1", + "4.2" + ] + }, + "vpaid_enabled": { + "type": "boolean", + "description": "Whether VPAID (Video Player-Ad Interface Definition) is supported" + }, + "duration_ms": { + "type": "integer", + "description": "Expected video duration in milliseconds (if known)", + "minimum": 0 + }, + "tracking_events": { + "type": "array", + "items": { + "title": "VAST Tracking Event", + "description": "Standard VAST tracking events for video ad playback and interaction", + "type": "string", + "enum": [ + "start", + "firstQuartile", + "midpoint", + "thirdQuartile", + "complete", + "impression", + "click", + "pause", + "resume", + "skip", + "mute", + "unmute", + "fullscreen", + "exitFullscreen", + "playerExpand", + "playerCollapse" + ] + }, + "description": "Tracking events supported by this VAST tag" + } + }, + "required": [ + "delivery_type", + "content" + ], + "additionalProperties": true + } + ] + }, + { + "title": "Text Asset", + "description": "Text content asset", + "type": "object", + "properties": { + "content": { + "type": "string", + "description": "Text content" + }, + "language": { + "type": "string", + "description": "Language code (e.g., 'en', 'es', 'fr')" + } + }, + "required": [ + "content" + ], + "additionalProperties": true + }, + { + "title": "URL Asset", + "description": "URL reference asset", + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "URL reference" + }, + "url_type": { + "title": "URL Asset Type", + "description": "Type of URL asset: 'clickthrough' for user click destination (landing page), 'tracker_pixel' for impression/event tracking via HTTP request (fires GET, expects pixel/204 response), 'tracker_script' for measurement SDKs that must load as diff --git a/server/public/admin-data-cleanup.html b/server/public/admin-data-cleanup.html index cad886f2e3..2cd5a49286 100644 --- a/server/public/admin-data-cleanup.html +++ b/server/public/admin-data-cleanup.html @@ -698,6 +698,33 @@

Loading merge preview...

` : ''; + // Stripe customer conflict handling + const stripeConflict = preview.stripe_customer_conflict || {}; + const stripeConflictHtml = stripeConflict.has_conflict ? ` +
+ 🔴 Stripe Customer Conflict +

Both organizations have Stripe customers. Choose which to keep:

+ +
+ + + +
+
+ ` : ''; + const changesHtml = preview.estimated_changes.length > 0 ? `
Data to be moved: @@ -746,12 +773,13 @@

Merge Preview

+ ${stripeConflictHtml} ${warningsHtml} ${changesHtml}
-
@@ -763,11 +791,18 @@

Merge Preview

} } - async function executeMerge(primaryOrgId, secondaryOrgId) { + async function executeMerge(primaryOrgId, secondaryOrgId, hasStripeConflict = false) { if (!confirm('Are you sure you want to merge these organizations? This action cannot be undone.')) { return; } + // Get Stripe customer resolution if there's a conflict + let stripeCustomerResolution = null; + if (hasStripeConflict) { + const selected = document.querySelector('input[name="stripe_resolution"]:checked'); + stripeCustomerResolution = selected ? selected.value : 'keep_primary'; + } + const modal = document.getElementById('aiAnalysisModal'); if (modal) { modal.innerHTML = ` @@ -781,10 +816,14 @@

Merging organizations...

} try { + const body = { primary_org_id: primaryOrgId, secondary_org_id: secondaryOrgId }; + if (stripeCustomerResolution) { + body.stripe_customer_resolution = stripeCustomerResolution; + } const response = await fetch('/api/admin/cleanup/merge', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ primary_org_id: primaryOrgId, secondary_org_id: secondaryOrgId }) + body: JSON.stringify(body) }); if (!response.ok) { diff --git a/server/public/admin-domain-discovery.html b/server/public/admin-domain-discovery.html index beba880490..b7d1d3f686 100644 --- a/server/public/admin-domain-discovery.html +++ b/server/public/admin-domain-discovery.html @@ -507,7 +507,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); @@ -548,7 +548,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Bulk enrichment failed'); @@ -627,7 +627,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); diff --git a/server/public/admin-domain-health.html b/server/public/admin-domain-health.html index 120ac6731b..e7ee4ff44e 100644 --- a/server/public/admin-domain-health.html +++ b/server/public/admin-domain-health.html @@ -1511,6 +1511,33 @@

Error

` : ''; + // Stripe customer conflict handling + const stripeConflict = preview.stripe_customer_conflict || {}; + const stripeConflictHtml = stripeConflict.has_conflict ? ` +
+ 🔴 Stripe Customer Conflict +

Both organizations have Stripe customers. Choose which to keep:

+ +
+ + + +
+
+ ` : ''; + const changesHtml = preview.estimated_changes.length > 0 ? `
Data to be moved: @@ -1569,6 +1596,7 @@

Merge Preview${secondaryOrgIds.length > 1 ? ` (1 of ${secondaryOrgIds.length

+ ${stripeConflictHtml} ${warningsHtml} ${changesHtml} @@ -1577,7 +1605,8 @@

Merge Preview${secondaryOrgIds.length > 1 ? ` (1 of ${secondaryOrgIds.length @@ -1590,14 +1619,15 @@

Merge Preview${secondaryOrgIds.length > 1 ? ` (1 of ${secondaryOrgIds.length const primaryId = decodeURIComponent(this.dataset.primaryId); const secondaryId = decodeURIComponent(this.dataset.secondaryId); const remainingIds = this.dataset.remainingIds ? this.dataset.remainingIds.split(',').map(decodeURIComponent).join(',') : ''; - confirmMerge(primaryId, secondaryId, remainingIds); + const hasStripeConflict = this.dataset.hasStripeConflict === 'true'; + confirmMerge(primaryId, secondaryId, remainingIds, hasStripeConflict); }); } catch (error) { alert('Failed to load merge preview: ' + error.message); } } - async function confirmMerge(primaryOrgId, secondaryOrgId, remainingOrgIds) { + async function confirmMerge(primaryOrgId, secondaryOrgId, remainingOrgIds, hasStripeConflict = false) { // Disable all buttons immediately to prevent double-clicks document.querySelectorAll('#mergeModal button, #confirmMergeBtn, #continueMergeBtn').forEach(btn => { btn.disabled = true; @@ -1611,6 +1641,13 @@

Merge Preview${secondaryOrgIds.length > 1 ? ` (1 of ${secondaryOrgIds.length return; } + // Get Stripe customer resolution if there's a conflict + let stripeCustomerResolution = null; + if (hasStripeConflict) { + const selected = document.querySelector('input[name="stripe_resolution"]:checked'); + stripeCustomerResolution = selected ? selected.value : 'keep_primary'; + } + mergeModalElement.innerHTML = `
@@ -1621,10 +1658,14 @@

Merging organizations...

`; try { + const body = { primary_org_id: primaryOrgId, secondary_org_id: secondaryOrgId }; + if (stripeCustomerResolution) { + body.stripe_customer_resolution = stripeCustomerResolution; + } const response = await fetch('/api/admin/cleanup/merge', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ primary_org_id: primaryOrgId, secondary_org_id: secondaryOrgId }) + body: JSON.stringify(body) }); if (!response.ok) { diff --git a/server/public/admin-email.html b/server/public/admin-email.html index 912ec9cb60..cc92292404 100644 --- a/server/public/admin-email.html +++ b/server/public/admin-email.html @@ -430,7 +430,7 @@

Recent Email Sends

const response = await fetch('/api/admin/email/stats'); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load stats'); diff --git a/server/public/admin-escalations.html b/server/public/admin-escalations.html new file mode 100644 index 0000000000..104e17a907 --- /dev/null +++ b/server/public/admin-escalations.html @@ -0,0 +1,430 @@ + + + + + + + Admin - Escalations - AgenticAdvertising.org + + + + + + +
+ +
+ Loading... +
+ + + + + + diff --git a/server/public/admin-feeds.html b/server/public/admin-feeds.html index 0ccfd7e690..21cb704ecf 100644 --- a/server/public/admin-feeds.html +++ b/server/public/admin-feeds.html @@ -678,7 +678,7 @@

Delete Feed

const response = await fetch('/api/admin/feeds'); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load feeds'); diff --git a/server/public/admin-meetings.html b/server/public/admin-meetings.html index f6aa4e2009..c61c6f57e4 100644 --- a/server/public/admin-meetings.html +++ b/server/public/admin-meetings.html @@ -317,7 +317,7 @@

Schedule Meeting

-
@@ -365,9 +365,10 @@

Schedule Meeting

- + Members will receive a calendar invite via email @@ -381,6 +382,16 @@

Schedule Meeting

+ + @@ -414,7 +426,7 @@

Meeting Details

const response = await fetch('/api/admin/working-groups'); if (!response.ok) { if (response.status === 401) { - window.AdminNav?.redirectToLogin(); + window.AdminSidebar?.redirectToLogin(); return; } throw new Error('Failed to load working groups'); @@ -462,7 +474,8 @@

Meeting Details

const response = await fetch(url); if (!response.ok) throw new Error('Failed to load meetings'); - meetings = await response.json(); + const data = await response.json(); + meetings = data.meetings || []; renderMeetings(); document.getElementById('loading').style.display = 'none'; @@ -478,15 +491,20 @@

Meeting Details

async function loadSeries() { try { const groupId = document.getElementById('groupFilter').value; - let url = '/api/admin/meetings/series'; - if (groupId) { - url += `?working_group_id=${groupId}`; + + // Series endpoint requires a working group filter + if (!groupId) { + series = []; + renderSeries(); + return; } + const url = `/api/admin/meetings/series?working_group_id=${groupId}`; const response = await fetch(url); if (!response.ok) throw new Error('Failed to load series'); - series = await response.json(); + const data = await response.json(); + series = data.series || []; renderSeries(); } catch (error) { console.error('Error loading series:', error); @@ -633,56 +651,120 @@

${escapeHtml(s.title)}

document.getElementById('meetingModal').style.display = 'flex'; } + // Edit existing meeting + function editMeeting() { + if (!viewingMeeting) return; + + const m = viewingMeeting; + const date = new Date(m.start_time); + const tz = m.timezone || 'America/New_York'; + + // Format date/time in the meeting's timezone for editing + const dateFormatter = new Intl.DateTimeFormat('en-CA', { timeZone: tz, year: 'numeric', month: '2-digit', day: '2-digit' }); + const timeFormatter = new Intl.DateTimeFormat('en-US', { timeZone: tz, hour: '2-digit', minute: '2-digit', hour12: false }); + const formattedDate = dateFormatter.format(date); // YYYY-MM-DD format + const formattedTime = timeFormatter.format(date).replace(/^24:/, '00:'); // HH:MM format + + document.getElementById('modalTitle').textContent = 'Edit Meeting'; + document.getElementById('meetingId').value = m.id; + document.getElementById('workingGroupId').value = m.working_group_id; + document.getElementById('title').value = m.title; + document.getElementById('meetingDate').value = formattedDate; + document.getElementById('meetingTime').value = formattedTime; + document.getElementById('timezone').value = tz; + document.getElementById('description').value = m.description || m.agenda || ''; + + // Calculate duration from start_time and end_time + if (m.end_time) { + const endDate = new Date(m.end_time); + const durationMs = endDate.getTime() - date.getTime(); + document.getElementById('duration').value = Math.round(durationMs / 60000); + } else { + document.getElementById('duration').value = 60; + } + + // Hide invite mode for edits (can't change invites after creation) + document.getElementById('inviteMode').parentElement.style.display = 'none'; + + document.getElementById('saveBtn').textContent = 'Save Changes'; + closeDetailsModal(); + document.getElementById('meetingModal').style.display = 'flex'; + } + function closeModal() { document.getElementById('meetingModal').style.display = 'none'; + // Reset invite mode visibility + document.getElementById('inviteMode').parentElement.style.display = 'block'; + document.getElementById('saveBtn').textContent = 'Schedule'; } - // Save meeting + // Save meeting (create or update) async function saveMeeting(event) { event.preventDefault(); + const meetingId = document.getElementById('meetingId').value; + const isUpdate = !!meetingId; + const date = document.getElementById('meetingDate').value; const time = document.getElementById('meetingTime').value; const timezone = document.getElementById('timezone').value; + const durationMinutes = parseInt(document.getElementById('duration').value) || 60; // Construct ISO datetime const startTime = new Date(`${date}T${time}`); + const endTime = new Date(startTime.getTime() + durationMinutes * 60000); const data = { - working_group_id: document.getElementById('workingGroupId').value, title: document.getElementById('title').value.trim(), description: document.getElementById('description').value.trim() || null, start_time: startTime.toISOString(), - duration_minutes: parseInt(document.getElementById('duration').value) || 60, + end_time: endTime.toISOString(), timezone: timezone, - invite_mode: document.getElementById('inviteMode').value, }; + // Only include these fields for new meetings + if (!isUpdate) { + data.working_group_id = document.getElementById('workingGroupId').value; + data.duration_minutes = durationMinutes; + data.invite_mode = document.getElementById('inviteMode').value; + // Include Slack channel ID if that invite mode is selected + if (data.invite_mode === 'slack_channel') { + data.invite_slack_channel_id = document.getElementById('inviteSlackChannelId').value; + if (!data.invite_slack_channel_id) { + alert('Please select a Slack channel'); + return; + } + } + } + const saveBtn = document.getElementById('saveBtn'); saveBtn.disabled = true; - saveBtn.textContent = 'Scheduling...'; + saveBtn.textContent = isUpdate ? 'Saving...' : 'Scheduling...'; try { - const response = await fetch('/api/admin/meetings', { - method: 'POST', + const url = isUpdate ? `/api/admin/meetings/${meetingId}` : '/api/admin/meetings'; + const method = isUpdate ? 'PUT' : 'POST'; + + const response = await fetch(url, { + method: method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); if (!response.ok) { const error = await response.json(); - throw new Error(error.message || 'Failed to schedule meeting'); + throw new Error(error.message || `Failed to ${isUpdate ? 'update' : 'schedule'} meeting`); } closeModal(); loadMeetings(); } catch (error) { - console.error('Error scheduling meeting:', error); - alert('Failed to schedule meeting: ' + error.message); + console.error(`Error ${isUpdate ? 'updating' : 'scheduling'} meeting:`, error); + alert(`Failed to ${isUpdate ? 'update' : 'schedule'} meeting: ` + error.message); } saveBtn.disabled = false; - saveBtn.textContent = 'Schedule'; + saveBtn.textContent = isUpdate ? 'Save Changes' : 'Schedule'; } // View meeting details @@ -691,7 +773,8 @@

${escapeHtml(s.title)}

const response = await fetch(`/api/admin/meetings/${id}`); if (!response.ok) throw new Error('Failed to load meeting'); - viewingMeeting = await response.json(); + const data = await response.json(); + viewingMeeting = { ...data.meeting, attendees: data.attendees }; const m = viewingMeeting; const group = workingGroups.find(g => g.id === m.working_group_id); const date = new Date(m.start_time); @@ -731,7 +814,10 @@

${escapeHtml(s.title)}

`; - document.getElementById('cancelMeetingBtn').style.display = m.status === 'scheduled' ? 'block' : 'none'; + // Only show Edit and Cancel buttons for scheduled meetings + const isScheduled = m.status === 'scheduled'; + document.getElementById('editMeetingBtn').style.display = isScheduled ? 'inline-block' : 'none'; + document.getElementById('cancelMeetingBtn').style.display = isScheduled ? 'inline-block' : 'none'; document.getElementById('detailsModal').style.display = 'flex'; } catch (error) { console.error('Error loading meeting:', error); @@ -768,6 +854,90 @@

${escapeHtml(s.title)}

closeDetailsModal(); } + // Handle working group selection change + function onWorkingGroupChange() { + const inviteMode = document.getElementById('inviteMode').value; + // Reload channels if in slack_channel mode + if (inviteMode === 'slack_channel') { + const groupId = document.getElementById('workingGroupId').value; + if (groupId) { + loadSlackChannelsForGroup(groupId); + } + } + } + + // Toggle visibility of invite mode-specific sections + function updateInviteModeVisibility() { + const inviteMode = document.getElementById('inviteMode').value; + const topicsSection = document.getElementById('topicsSection'); + const slackChannelSection = document.getElementById('slackChannelSection'); + + // Show topics section only for topic_subscribers mode + topicsSection.style.display = inviteMode === 'topic_subscribers' ? 'block' : 'none'; + + // Show Slack channel section only for slack_channel mode + slackChannelSection.style.display = inviteMode === 'slack_channel' ? 'block' : 'none'; + + // Load channels if switching to slack_channel mode + if (inviteMode === 'slack_channel') { + const groupId = document.getElementById('workingGroupId').value; + if (groupId) { + loadSlackChannelsForGroup(groupId); + } + } + } + + // Load available Slack channels for a working group (group channel + topic channels) + async function loadSlackChannelsForGroup(groupId) { + const channelSelect = document.getElementById('inviteSlackChannelId'); + channelSelect.innerHTML = ''; + + try { + // Find the working group + const group = workingGroups.find(g => g.id === groupId); + if (!group) { + channelSelect.innerHTML = ''; + return; + } + + // Build list of available channels + const channels = []; + + // Add the main working group channel if it has one + if (group.slack_channel_id) { + channels.push({ + id: group.slack_channel_id, + name: `${group.name} (main channel)`, + }); + } + + // Add any topic channels + if (group.topics && group.topics.length > 0) { + for (const topic of group.topics) { + if (topic.slack_channel_id) { + channels.push({ + id: topic.slack_channel_id, + name: `${topic.name} (topic)`, + }); + } + } + } + + if (channels.length === 0) { + channelSelect.innerHTML = ''; + return; + } + + channelSelect.innerHTML = ''; + channels.forEach(c => { + channelSelect.innerHTML += ``; + }); + } catch (error) { + console.error('Error loading channels:', error); + channelSelect.innerHTML = ''; + } + } + // Escape helpers function escapeHtml(text) { if (!text) return ''; @@ -785,6 +955,18 @@

${escapeHtml(s.title)}

async function init() { await loadWorkingGroups(); await loadMeetings(); + + // Auto-open schedule modal if requested via URL + const params = new URLSearchParams(window.location.search); + if (params.get('action') === 'schedule') { + showCreateModal(); + // Clear the action param to prevent re-triggering on refresh + params.delete('action'); + const newUrl = params.toString() + ? `${window.location.pathname}?${params.toString()}` + : window.location.pathname; + window.history.replaceState({}, '', newUrl); + } } init(); diff --git a/server/public/admin-members.html b/server/public/admin-members.html index da41e33aec..e5a3e3f7bd 100644 --- a/server/public/admin-members.html +++ b/server/public/admin-members.html @@ -462,7 +462,7 @@

This action cannot be undone

console.log('[admin-members] Response status:', response.status); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load members'); @@ -709,7 +709,7 @@

This action cannot be undone

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const errorData = await response.json().catch(() => ({ message: response.statusText })); @@ -749,7 +749,7 @@

This action cannot be undone

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to sync member data'); @@ -818,7 +818,7 @@

This action cannot be undone

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load payment history'); @@ -944,7 +944,7 @@

This action cannot be undone

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } diff --git a/server/public/admin-notification-channels.html b/server/public/admin-notification-channels.html index ad6e3d4d7f..a912d25b74 100644 --- a/server/public/admin-notification-channels.html +++ b/server/public/admin-notification-channels.html @@ -418,7 +418,7 @@

Delete Channel

const response = await fetch('/api/admin/notification-channels'); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load channels'); diff --git a/server/public/admin-org-detail.html b/server/public/admin-org-detail.html index 0676d408ae..f3e33ebac7 100644 --- a/server/public/admin-org-detail.html +++ b/server/public/admin-org-detail.html @@ -1489,7 +1489,7 @@

Set Discount

if (!orgResponse.ok) { if (orgResponse.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } if (orgResponse.status === 404) { @@ -1505,11 +1505,6 @@

Set Discount

domainsData = domainsResponse.ok ? await domainsResponse.json() : { domains: [], workos_domains: [] }; teamMembers = teamResponse.ok ? await teamResponse.json() : []; - // Get current user ID from AdminNav if available - if (window.AdminNav && window.AdminNav.user) { - currentUserId = window.AdminNav.user.id; - } - renderOrganization(); renderOwnerSelector(); populateOwnerDropdowns(); @@ -1799,7 +1794,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const data = await response.json(); @@ -2231,7 +2226,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to save changes'); @@ -2301,7 +2296,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to save activity'); @@ -2355,7 +2350,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to save follow-up'); @@ -2383,7 +2378,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to complete step'); @@ -2531,7 +2526,7 @@

Set Discount

if (response && !response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to update owner'); @@ -2570,7 +2565,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to update watch status'); @@ -2730,7 +2725,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error(await getErrorMessage(response, 'Failed to add domain')); @@ -2760,7 +2755,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error(await getErrorMessage(response, 'Failed to set primary domain')); @@ -2790,7 +2785,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error(await getErrorMessage(response, 'Failed to remove domain')); @@ -2822,7 +2817,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error(await getErrorMessage(response, 'Failed to verify domain')); @@ -2954,7 +2949,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to save interest level'); @@ -3186,7 +3181,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error(await getErrorMessage(response, 'Failed to link domain')); @@ -4260,7 +4255,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } if (response.status === 503) { diff --git a/server/public/admin-products.html b/server/public/admin-products.html index 71a2ce3ee5..a50a0ed04b 100644 --- a/server/public/admin-products.html +++ b/server/public/admin-products.html @@ -557,7 +557,7 @@

Archive Product

const response = await fetch('/api/admin/products'); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load products'); @@ -915,7 +915,7 @@

Archive Product

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const result = await response.json(); @@ -960,7 +960,7 @@

Archive Product

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to archive product'); diff --git a/server/public/admin-prospects.html b/server/public/admin-prospects.html index 94aa32d19d..7c2039b19c 100644 --- a/server/public/admin-prospects.html +++ b/server/public/admin-prospects.html @@ -1390,7 +1390,7 @@

Bulk Import Prospects

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load prospects'); @@ -1772,7 +1772,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); @@ -1814,7 +1814,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Bulk enrichment failed'); @@ -1852,7 +1852,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); @@ -1944,7 +1944,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); @@ -2161,7 +2161,7 @@

Search for Companies

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); @@ -2262,7 +2262,7 @@

No Results Found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } if (response.status === 409) { @@ -2714,6 +2714,33 @@

Loading merge preview...

` : ''; + // Stripe customer conflict handling + const stripeConflict = preview.stripe_customer_conflict || {}; + const stripeConflictHtml = stripeConflict.has_conflict ? ` +
+ 🔴 Stripe Customer Conflict +

Both organizations have Stripe customers. Choose which to keep:

+ +
+ + + +
+
+ ` : ''; + const changesHtml = preview.estimated_changes.length > 0 ? `
Data to be moved: @@ -2766,12 +2793,13 @@

Merge Preview

+ ${stripeConflictHtml} ${warningsHtml} ${changesHtml}
-
@@ -2784,11 +2812,18 @@

Merge Preview

} // Execute merge operation - async function executeMerge(primaryOrgId, secondaryOrgId) { + async function executeMerge(primaryOrgId, secondaryOrgId, hasStripeConflict = false) { if (!confirm('Are you sure you want to merge these organizations? This action cannot be undone.')) { return; } + // Get Stripe customer resolution if there's a conflict + let stripeCustomerResolution = null; + if (hasStripeConflict) { + const selected = document.querySelector('input[name="stripe_resolution"]:checked'); + stripeCustomerResolution = selected ? selected.value : 'keep_primary'; + } + const modal = document.getElementById('aiAnalysisModal'); modal.innerHTML = `
@@ -2800,10 +2835,14 @@

Merging organizations...

`; try { + const body = { primary_org_id: primaryOrgId, secondary_org_id: secondaryOrgId }; + if (stripeCustomerResolution) { + body.stripe_customer_resolution = stripeCustomerResolution; + } const response = await fetch('/api/admin/cleanup/merge', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ primary_org_id: primaryOrgId, secondary_org_id: secondaryOrgId }) + body: JSON.stringify(body) }); if (!response.ok) { @@ -3283,7 +3322,7 @@

No accounts found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); diff --git a/server/public/admin-settings.html b/server/public/admin-settings.html index d7b9e6ce67..e639b4a6e4 100644 --- a/server/public/admin-settings.html +++ b/server/public/admin-settings.html @@ -192,6 +192,32 @@

Billing Notifications Channel

+ +
+

Escalation Notifications Channel

+

+ Choose which Slack channel receives escalation notifications when Addie cannot fulfill a request. + This allows admins to be notified when users need human assistance. +

+ +
+ Loading... +
+ +
+
+ + + Select a channel where admins can see and respond to escalations. View escalations +
+ +
+
+ @@ -214,6 +240,7 @@

Billing Notifications Channel

currentSettings = await response.json(); updateCurrentChannelDisplay(); + updateCurrentEscalationChannelDisplay(); document.getElementById('loading').style.display = 'none'; document.getElementById('content').style.display = 'block'; @@ -229,7 +256,8 @@

Billing Notifications Channel

// Load Slack channels for picker async function loadSlackChannels() { - const select = document.getElementById('billingChannel'); + const billingSelect = document.getElementById('billingChannel'); + const escalationSelect = document.getElementById('escalationChannel'); try { const response = await fetch('/api/admin/settings/slack-channels'); @@ -241,24 +269,34 @@

Billing Notifications Channel

const data = await response.json(); slackChannels = data.channels; - // Build options - let html = ''; + // Build options for both dropdowns + let billingHtml = ''; + let escalationHtml = ''; + if (slackChannels.length === 0) { - html = ''; - select.innerHTML = html; - showStatusMessage('Addie is not in any private channels. Invite @Addie to your billing channel and refresh.', 'error'); + const emptyOption = ''; + billingSelect.innerHTML = emptyOption; + escalationSelect.innerHTML = emptyOption; + showStatusMessage('Addie is not in any private channels. Invite @Addie to your channels and refresh.', 'error'); } else { slackChannels.forEach(ch => { - const selected = currentSettings?.billing_channel?.channel_id === ch.id ? 'selected' : ''; - html += ``; + const billingSelected = currentSettings?.billing_channel?.channel_id === ch.id ? 'selected' : ''; + const escalationSelected = currentSettings?.escalation_channel?.channel_id === ch.id ? 'selected' : ''; + billingHtml += ``; + escalationHtml += ``; }); - select.innerHTML = html; - select.disabled = false; + billingSelect.innerHTML = billingHtml; + billingSelect.disabled = false; document.getElementById('saveBtn').disabled = false; + + escalationSelect.innerHTML = escalationHtml; + escalationSelect.disabled = false; + document.getElementById('saveEscalationBtn').disabled = false; } } catch (error) { console.error('Error loading Slack channels:', error); - select.innerHTML = ''; + billingSelect.innerHTML = ''; + escalationSelect.innerHTML = ''; showStatusMessage('Failed to load Slack channels: ' + error.message, 'error'); } } @@ -277,6 +315,20 @@

Billing Notifications Channel

} } + // Update the current escalation channel display + function updateCurrentEscalationChannelDisplay() { + const el = document.getElementById('currentEscalationChannel'); + const channel = currentSettings?.escalation_channel; + + if (channel?.channel_id && channel?.channel_name) { + el.className = 'current-value'; + el.innerHTML = `Current: #${escapeHtml(channel.channel_name)}`; + } else { + el.className = 'current-value not-set'; + el.innerHTML = 'Current: Not configured (escalation notifications disabled)'; + } + } + // Save billing channel async function saveBillingChannel() { const select = document.getElementById('billingChannel'); @@ -326,6 +378,55 @@

Billing Notifications Channel

} } + // Save escalation channel + async function saveEscalationChannel() { + const select = document.getElementById('escalationChannel'); + const saveBtn = document.getElementById('saveEscalationBtn'); + const channelId = select.value || null; + + // Find channel name + let channelName = null; + if (channelId) { + const channel = slackChannels.find(c => c.id === channelId); + channelName = channel?.name || null; + } + + saveBtn.disabled = true; + saveBtn.textContent = 'Saving...'; + + try { + const response = await fetch('/api/admin/settings/escalation-channel', { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ channel_id: channelId, channel_name: channelName }), + }); + + if (!response.ok) { + const data = await response.json(); + throw new Error(data.message || 'Failed to save'); + } + + const data = await response.json(); + currentSettings.escalation_channel = data.escalation_channel; + updateCurrentEscalationChannelDisplay(); + + saveBtn.textContent = 'Saved!'; + saveBtn.classList.add('btn-success'); + showStatusMessage('Escalation channel updated successfully', 'success'); + + setTimeout(() => { + saveBtn.textContent = 'Save'; + saveBtn.classList.remove('btn-success'); + saveBtn.disabled = false; + }, 2000); + } catch (error) { + console.error('Error saving escalation channel:', error); + showStatusMessage('Failed to save: ' + error.message, 'error'); + saveBtn.textContent = 'Save'; + saveBtn.disabled = false; + } + } + // Status message helpers function showStatusMessage(message, type) { const el = document.getElementById('statusMessage'); diff --git a/server/public/admin-sidebar.js b/server/public/admin-sidebar.js index 3dc75dce5c..8035b13066 100644 --- a/server/public/admin-sidebar.js +++ b/server/public/admin-sidebar.js @@ -46,6 +46,7 @@ { href: '/admin/agreements', label: 'Agreements', icon: '📋' }, { href: '/admin/email', label: 'Email', icon: '📧' }, { href: '/admin/addie', label: 'Addie', icon: '🤖' }, + { href: '/admin/escalations', label: 'Escalations', icon: '🚨' }, { href: '/admin/feeds', label: 'Industry Feeds', icon: '📰' }, { href: '/admin/notification-channels', label: 'Alert Channels', icon: '📢' }, { href: '/admin/api-keys', label: 'API Keys', icon: '🔑' }, @@ -385,6 +386,17 @@ window.location.href = `/auth/login?return_to=${returnUrl}`; } + // Shared fetch wrapper that handles 401 redirects automatically + async function adminFetch(url, options = {}) { + const response = await fetch(url, options); + if (response.status === 401) { + redirectToLogin(); + // Return a never-resolving promise to prevent further processing + return new Promise(() => {}); + } + return response; + } + // Auto-initialize only on admin pages function shouldInitialize() { return window.location.pathname.startsWith('/admin'); @@ -404,6 +416,7 @@ init, toggleSidebar, closeSidebar, - redirectToLogin + redirectToLogin, + fetch: adminFetch }; })(); diff --git a/server/public/admin-users.html b/server/public/admin-users.html index ba1b46f2da..1831b93363 100644 --- a/server/public/admin-users.html +++ b/server/public/admin-users.html @@ -996,7 +996,7 @@

Different Approach

if (!groupsResponse.ok) { if (groupsResponse.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load working groups'); diff --git a/server/public/admin-working-groups.html b/server/public/admin-working-groups.html index 31e81ad277..900fd38023 100644 --- a/server/public/admin-working-groups.html +++ b/server/public/admin-working-groups.html @@ -504,6 +504,46 @@

Add Committee

+ +
+

Topics

+

+ Topics help organize meetings and filter invitations. Each topic can have its own Slack channel for subgroup discussions. +

+
+ + + + +
+

Leadership

@@ -593,7 +633,7 @@

Delete Committee

const response = await fetch('/api/admin/working-groups'); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load working groups'); @@ -788,6 +828,7 @@

${escapeHtml(group.name)}

+
@@ -808,6 +849,149 @@

${escapeHtml(group.name)}

// Current leaders in the form let currentLeaders = []; + // Current topics in the form + let currentTopics = []; + + // Topic management functions + function showAddTopicForm() { + document.getElementById('editingTopicIndex').value = '-1'; + document.getElementById('topicName').value = ''; + document.getElementById('topicSlug').value = ''; + document.getElementById('topicDescription').value = ''; + document.getElementById('topicSlackUrl').value = ''; + validateTopicSlackUrl(); + document.getElementById('topicForm').style.display = 'block'; + } + + function editTopic(index) { + const topic = currentTopics[index]; + if (!topic) return; + + document.getElementById('editingTopicIndex').value = index; + document.getElementById('topicName').value = topic.name || ''; + document.getElementById('topicSlug').value = topic.slug || ''; + document.getElementById('topicDescription').value = topic.description || ''; + // Convert channel ID back to URL format for editing + document.getElementById('topicSlackUrl').value = topic.slack_channel_id + ? `https://agenticads.slack.com/archives/${topic.slack_channel_id}` + : ''; + validateTopicSlackUrl(); + document.getElementById('topicForm').style.display = 'block'; + } + + function cancelTopicEdit() { + document.getElementById('topicForm').style.display = 'none'; + } + + function autoGenerateTopicSlug() { + const name = document.getElementById('topicName').value; + const slugInput = document.getElementById('topicSlug'); + // Only auto-generate if slug is empty or matches previous auto-generation + if (!slugInput.value || slugInput.dataset.autoGenerated === 'true') { + const slug = name.toLowerCase() + .replace(/[^a-z0-9\s-]/g, '') + .replace(/\s+/g, '-') + .replace(/-+/g, '-') + .replace(/^-|-$/g, ''); + slugInput.value = slug; + slugInput.dataset.autoGenerated = 'true'; + } + } + + function validateTopicSlackUrl() { + const url = document.getElementById('topicSlackUrl').value.trim(); + const statusEl = document.getElementById('topicSlackUrlStatus'); + + if (!url) { + statusEl.innerHTML = 'Optional - link a separate channel for this topic\'s discussions'; + return; + } + + const channelId = extractSlackChannelId(url); + if (channelId) { + statusEl.innerHTML = `✓ Channel ID: ${escapeHtml(channelId)}`; + } else { + statusEl.innerHTML = '⚠ Could not detect channel ID from URL'; + } + } + + function saveTopic() { + const name = document.getElementById('topicName').value.trim(); + const slug = document.getElementById('topicSlug').value.trim(); + const description = document.getElementById('topicDescription').value.trim(); + const slackUrl = document.getElementById('topicSlackUrl').value.trim(); + const editingIndex = parseInt(document.getElementById('editingTopicIndex').value); + + if (!name || !slug) { + alert('Topic name and slug are required'); + return; + } + + // Validate slug format + if (!/^[a-z0-9-]+$/.test(slug)) { + alert('Slug must contain only lowercase letters, numbers, and hyphens'); + return; + } + + // Check for duplicate slugs (excluding current topic if editing) + const duplicateIndex = currentTopics.findIndex((t, i) => t.slug === slug && i !== editingIndex); + if (duplicateIndex !== -1) { + alert('A topic with this slug already exists'); + return; + } + + const topic = { + name, + slug, + description: description || undefined, + slack_channel_id: slackUrl ? extractSlackChannelId(slackUrl) : undefined, + }; + + if (editingIndex >= 0) { + currentTopics[editingIndex] = topic; + } else { + currentTopics.push(topic); + } + + renderTopicsList(); + cancelTopicEdit(); + } + + function removeTopic(index) { + if (!confirm('Remove this topic?')) return; + currentTopics.splice(index, 1); + renderTopicsList(); + } + + function renderTopicsList() { + const listDiv = document.getElementById('topicsList'); + + if (currentTopics.length === 0) { + listDiv.innerHTML = '
No topics configured
'; + return; + } + + listDiv.innerHTML = currentTopics.map((t, i) => ` +
+
+ ${escapeHtml(t.name)} + (${escapeHtml(t.slug)}) + ${t.slack_channel_id ? `📢 ${escapeHtml(t.slack_channel_id)}` : ''} + ${t.description ? `
${escapeHtml(t.description)}
` : ''} +
+
+ + +
+
+ `).join(''); + } + + function clearTopics() { + currentTopics = []; + renderTopicsList(); + } + // Search users async function searchUsers(type) { const inputId = type === 'leader' ? 'leaderSearch' : 'memberSearch'; @@ -1183,6 +1367,8 @@

${escapeHtml(group.name)}

document.getElementById('gatheringWebsite').value = ''; document.getElementById('gatheringLogo').value = ''; clearLeaders(); + clearTopics(); + cancelTopicEdit(); // Hide topic form if open validateSlackUrl(); // Reset status message updateRegionVisibility(); // Hide region for non-chapters, hide gathering fields for non-gatherings updateMembersSectionVisibility(); // Hide members section for new groups @@ -1226,6 +1412,16 @@

${escapeHtml(group.name)}

})); renderLeadersList(); + // Topics + currentTopics = (editingGroup.topics || []).map(t => ({ + name: t.name, + slug: t.slug, + description: t.description, + slack_channel_id: t.slack_channel_id + })); + renderTopicsList(); + cancelTopicEdit(); + // Show members section for existing groups updateMembersSectionVisibility(); await loadMembers(id); @@ -1257,6 +1453,10 @@

${escapeHtml(group.name)}

document.getElementById('interestSection').style.display = 'none'; document.getElementById('interestList').innerHTML = ''; + // Reset topics section + clearTopics(); + cancelTopicEdit(); + // Reset committee type fields document.getElementById('committeeType').value = 'working_group'; document.getElementById('region').value = ''; @@ -1281,6 +1481,12 @@

${escapeHtml(group.name)}

is_private: document.getElementById('isPrivate').checked, display_order: parseInt(document.getElementById('displayOrder').value) || 0, leader_user_ids: currentLeaders.map(l => l.user_id), + topics: currentTopics.map(t => ({ + name: t.name, + slug: t.slug, + description: t.description || undefined, + slack_channel_id: t.slack_channel_id || undefined + })), // Industry gathering-specific fields event_start_date: isGathering ? (document.getElementById('gatheringStartDate').value || null) : null, event_end_date: isGathering ? (document.getElementById('gatheringEndDate').value || null) : null, diff --git a/server/public/admin.html b/server/public/admin.html index e430365383..ed7b21e245 100644 --- a/server/public/admin.html +++ b/server/public/admin.html @@ -789,12 +789,8 @@

Dashboard

async function loadStats() { try { - const response = await fetch('/api/admin/stats'); + const response = await AdminSidebar.fetch('/api/admin/stats'); if (!response.ok) { - if (response.status === 401) { - window.AdminNav.redirectToLogin(); - return; - } throw new Error('Failed to load stats'); } diff --git a/server/public/dashboard.html b/server/public/dashboard.html index 26fbb00a38..93e1f81d5a 100644 --- a/server/public/dashboard.html +++ b/server/public/dashboard.html @@ -634,8 +634,64 @@

Tell Us About Your Organization

background: var(--color-gray-100); } + /* Setup alerts banner styles */ + .setup-alert { + background: var(--color-warning-50); + border: 1px solid var(--color-warning-200); + border-left: 4px solid var(--color-warning-500); + border-radius: var(--radius-md); + padding: var(--space-4); + margin-bottom: var(--space-4); + display: flex; + align-items: flex-start; + gap: var(--space-3); + } + .setup-alert-icon { + font-size: 18px; + line-height: 1; + flex-shrink: 0; + } + .setup-alert-content { + flex: 1; + min-width: 0; + } + .setup-alert-title { + font-weight: 600; + color: var(--color-warning-800); + margin: 0 0 2px 0; + font-size: 14px; + } + .setup-alert-message { + color: var(--color-warning-700); + margin: 0; + font-size: 13px; + } + .setup-alert-action { + flex-shrink: 0; + } + .setup-alert-action .btn { + font-size: 12px; + padding: 6px 12px; + } + .setup-alert-dismiss { + background: none; + border: none; + color: var(--color-warning-500); + cursor: pointer; + padding: 4px; + font-size: 16px; + line-height: 1; + opacity: 0.7; + } + .setup-alert-dismiss:hover { + opacity: 1; + } + + + + @@ -1289,6 +1345,9 @@

Unable to Load // Show member promo banner (e.g., for upcoming events) renderMemberPromoBanner(org); + + // Show setup alerts for incomplete profile items + renderSetupAlerts(org); } else { // Hide the small membership card and show CTA section membershipCard.style.display = 'none'; @@ -1578,6 +1637,125 @@

Join the Agentic Advertising Organization

// promoBanner.style.display = 'block'; } + // Render setup alerts for incomplete profile items (members only) + async function renderSetupAlerts(org) { + const setupAlerts = document.getElementById('setupAlerts'); + if (!setupAlerts) return; + + // Only show for active members + if (org.billing?.status !== 'active') { + setupAlerts.style.display = 'none'; + return; + } + + // Get dismissed alerts from session storage + const dismissedAlerts = JSON.parse(sessionStorage.getItem('dismissedSetupAlerts') || '[]'); + + // Fetch member profile to check for missing items + try { + const response = await fetch(`/api/member-profiles/org/${org.id}`); + if (!response.ok) { + setupAlerts.style.display = 'none'; + return; + } + + const profile = await response.json(); + const alerts = []; + + // Check for missing logo + if (!profile.logo_url && !dismissedAlerts.includes('missing-logo')) { + alerts.push({ + id: 'missing-logo', + icon: '🖼️', + title: 'Add Your Company Logo', + message: 'Upload a logo so your company appears in the member directory and on the homepage.', + actionLabel: 'Add Logo', + actionUrl: '/dashboard-settings#logo' + }); + } + + // Check for missing tagline + if (!profile.tagline && !dismissedAlerts.includes('missing-tagline')) { + alerts.push({ + id: 'missing-tagline', + icon: '✏️', + title: 'Add a Company Description', + message: 'Help others learn about your organization by adding a tagline.', + actionLabel: 'Add Description', + actionUrl: '/dashboard-settings#profile' + }); + } + + // Check for pending join requests (admins only) + try { + const pendingResponse = await fetch(`/api/organizations/${org.id}/join-requests`); + if (pendingResponse.ok) { + const pendingData = await pendingResponse.json(); + const pendingCount = pendingData.requests?.length || 0; + if (pendingCount > 0 && !dismissedAlerts.includes('pending-join-requests')) { + alerts.push({ + id: 'pending-join-requests', + icon: '👋', + title: `${pendingCount} Pending Join Request${pendingCount > 1 ? 's' : ''}`, + message: `${pendingCount} ${pendingCount > 1 ? 'people are' : 'person is'} waiting to join your team.`, + actionLabel: 'Review Requests', + actionUrl: `/team?org=${org.id}` + }); + } + } + } catch (e) { + // Ignore errors - user may not be admin + } + + // If no alerts, hide the container + if (alerts.length === 0) { + setupAlerts.style.display = 'none'; + return; + } + + // Render alerts + setupAlerts.innerHTML = alerts.map(alert => ` +
+
${alert.icon}
+
+

${escapeHtml(alert.title)}

+

${escapeHtml(alert.message)}

+
+ + +
+ `).join(''); + + setupAlerts.style.display = 'block'; + } catch (error) { + console.error('Error fetching member profile for setup alerts:', error); + setupAlerts.style.display = 'none'; + } + } + + // Dismiss a setup alert for the current session + function dismissSetupAlert(alertId) { + const dismissedAlerts = JSON.parse(sessionStorage.getItem('dismissedSetupAlerts') || '[]'); + if (!dismissedAlerts.includes(alertId)) { + dismissedAlerts.push(alertId); + sessionStorage.setItem('dismissedSetupAlerts', JSON.stringify(dismissedAlerts)); + } + + // Remove the alert from the DOM + const alertEl = document.querySelector(`.setup-alert[data-alert-id="${alertId}"]`); + if (alertEl) { + alertEl.remove(); + } + + // Hide container if no more alerts + const setupAlerts = document.getElementById('setupAlerts'); + if (setupAlerts && setupAlerts.children.length === 0) { + setupAlerts.style.display = 'none'; + } + } + // Load team count for status card async function loadTeamCount(orgId) { try { diff --git a/server/public/index.html b/server/public/index.html index 187c3a1a78..972063797a 100644 --- a/server/public/index.html +++ b/server/public/index.html @@ -409,6 +409,92 @@ gap: 1.5rem; } } + + /* Latest Posts Section */ + .latestPostsSection_AdCP { + padding: 4rem 0; + background: var(--ifm-color-emphasis-50, #f9fafb); + } + .latestPostsHeader_AdCP { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; + } + .latestPostsHeader_AdCP .sectionTitle_Ut5p { + margin-bottom: 0; + } + .viewAllLink_AdCP { + font-size: 0.95rem; + font-weight: 500; + color: var(--color-brand, #1a36b4); + text-decoration: none; + } + .viewAllLink_AdCP:hover { + text-decoration: underline; + } + .latestPostsGrid_AdCP { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1.5rem; + } + .latestPostCard_AdCP { + background: white; + border-radius: 12px; + padding: 1.5rem; + box-shadow: 0 2px 8px rgba(0,0,0,0.06); + transition: all 0.2s ease; + border: 1px solid transparent; + display: flex; + flex-direction: column; + } + .latestPostCard_AdCP:hover { + border-color: var(--color-brand, #1a36b4); + box-shadow: 0 4px 16px rgba(26, 54, 180, 0.1); + transform: translateY(-2px); + } + .latestPostMeta_AdCP { + font-size: 0.8rem; + color: var(--ifm-color-emphasis-600); + margin-bottom: 0.75rem; + } + .latestPostTitle_AdCP { + font-size: 1.1rem; + font-weight: 600; + line-height: 1.4; + margin-bottom: 0.75rem; + color: var(--ifm-heading-color); + } + .latestPostTitle_AdCP a { + color: inherit; + text-decoration: none; + } + .latestPostTitle_AdCP a:hover { + color: var(--color-brand, #1a36b4); + } + .latestPostExcerpt_AdCP { + font-size: 0.9rem; + color: var(--ifm-color-emphasis-700); + line-height: 1.6; + flex-grow: 1; + } + .latestPostsLoading_AdCP, + .latestPostsEmpty_AdCP { + grid-column: 1 / -1; + text-align: center; + padding: 2rem; + color: var(--ifm-color-emphasis-600); + } + @media (max-width: 900px) { + .latestPostsGrid_AdCP { + grid-template-columns: 1fr; + } + .latestPostsHeader_AdCP { + flex-direction: column; + align-items: flex-start; + gap: 0.5rem; + } + } @@ -696,6 +782,23 @@

Join the community

+ +
+
+
+
+
+

The Latest

+ View all perspectives +
+
+
Loading...
+
+
+
+
+
+
@@ -717,5 +820,51 @@

Built in the open

+ + \ No newline at end of file diff --git a/server/public/nav.js b/server/public/nav.js index 82f4a9107d..24531f17c4 100644 --- a/server/public/nav.js +++ b/server/public/nav.js @@ -204,7 +204,7 @@