Make RoleRightsSyncService fully self-healing on every boot
Adding or removing a RoleRightType must never again require running KamoInitializerService. syncAll() now runs three phases on every startup: 1. Heal constrain...
Drop stale CHECK constraints on default-role-rights enum columns
Hibernate auto-generates CHECK (column IN ('VAL1', 'VAL2', ...)) constraints on CREATE TABLE for @Enumerated(EnumType.STRING) columns, freezing the enum's value...
Add missing unique constraints for role-right upserts
**************** + syncSecurityModelRoleRights use `ON CONFLICT (role_id, right_type) DO NOTHING` and `ON CONFLICT (default_role_id, right_type) DO NOTHING`, wh...
Add unique constraint on (role_id, right_type) in OrgRoleRight
Required for ON CONFLICT DO NOTHING in **************** Without this constraint, the sync query fails with "no unique or exclusion constraint matching the ON CO...
Remove getType() calls from OrganizationController after OrganizationType removal
Remove deprecated OrganizationType enum
The enum is being retired — identification of the platform-owner org is now driven by the new Organization.isTopLevel flag, and the remaining values (CRM_CLIENT...
Add Platform Administration settings — org plan grants, events, plan catalog
- New pages under /settings/platform (guarded by hasPlatformAdminAccess): - /organizations — list every org, grant/modify/revoke COMP plans with reasons - /...
Add PlatformAdmin controller + service for comp plan grants
- PlatformAdminController at /api/billing/platform (class-level @PlatformAdminOnly) - GET /orgs, GET /orgs/{orgId} - POST /orgs/{orgId}/grants, PATCH|DELET...
Seed Organization.isTopLevel for kamocrm and OWNER_UNLIMITED self-comp plan
- DataLoader: drop OrganizationType arg from createOrg, set isTopLevel=true on kamocrm - KamoCRMAgeReqUpdateRunner + test: match on IS_TOP_LEVEL = TRUE instead ...
Stop overwriting member avatar with logged-in user's avatar on profile view
fetchAvatars fetched /api/security/avatars (no memberID scope — always returns the logged-in user's avatars) and called setActiveAvatar, clobbering the correct ...
Add Organization.isTopLevel, PaymentMethod.COMP, COMP_* event types; remove OrganizationType enum
- Organization: replace dead `type` field with `isTopLevel` flag for platform-owner identification - PaymentMethod: add COMP for complimentary platform-admin gr...
Add missing sync-rights proxy route
POST /api/security/roles/sync-rights was missing a Next.js proxy handler, causing the Sync Rights button in Security Roles settings to always fail.
Set orgOriginal on registration and expose isOriginalOrg in my-networks
Use PublicChatVisitor displayName for requestorName on visitor tickets
Visitor-initiated tickets hardcode requestor to the org system member, so the DTO was surfacing the org owner's name in the Requestor column. Fall back to the P...
Member-requestor support rights gating and dual-mode ticket view
- NavTop: show SupportButton for any support right (agent or member) - SupportButton: gate each dropdown item by right — Create/View Tickets, Request Webinar,...
Add member-requestor support rights (133-136)
Adds four new SUPPORT-scoped rights for non-agent members: - **************** (133) - CREATE_SUPPORT_TICKET (134) - REQUEST_WEBINAR (135) - VIEW_MY_SCHEDULED_WE...
Add Sync Rights button to SecurityRoleManager for top-level orgs
Button is only visible when organization.hasParent is false. Calls POST /api/security/roles/sync-rights then reloads the roles table.
Gate Support/Settings by rights, fix Network copy, loading on tab switch, nav divider
- Network card: updated description to use dynamic branch title label - Support card: fixed 404 by changing href /help → /support; gated by isSupport + VIEW_SUP...
Extract RoleRightsSyncService and add sync-rights endpoint
- RoleRightsSyncService: centralizes role rights sync logic for both OrgRole and **************** tables; startup and on-demand - DataLoader: delegates to Rol...
Make role rights DTOs enum-driven and add security model rights sync
- SecurityRoleDTO.fromOrgRole(): enumerate all RoleRightType values with DB settings as lookup — new rights appear with NOT_SPECIFIED automatically - ********...
Add membership type chip and promote/demote to Membership Status card, remove session timeout field
Add native updateMemberType and ensureTeamMemberRow queries to MemberRepository
Support chat UX — name updates, titles, notification count, datagrid
- TicketChat fires onVisitorNameChanged when NAME_CHANGED WS event arrives - SupportTicketWindow dispatches tool:title with requestorName on load and on name ...
Render system events as friendly text in visitor support chat
NAME_CHANGED system events no longer show raw JSON in the chat bubble; they display as a centered italic pill ("Changes name to {name}"). Other system events ar...
Show AG Grid loading overlay instead of empty state on leads page
Initialize loading state to true so the grid shows "Loading leads..." until the first fetch completes, preventing a flash of "No leads found".
Use getOrganizationByIdWithFeatures in AppAvailabilityInterceptor
Resolves LazyInitializationException on /api/security/leads and all other CRM/POS-gated paths. The interceptor called org.getFeatures() after the transaction cl...
Add findByIdWithFeatures to eagerly load Organization.features
JOIN FETCH prevents LazyInitializationException when features are accessed outside a transaction (e.g. in AppAvailabilityInterceptor).
Show city and subdivision in ticket visitor geo row
Display as "City, Region, Country (IP)" — nulls are filtered so it degrades gracefully when only country data is available
Expose city and subdivision in visitor geo lookup
- Extend GeoResult record with city and subdivision fields - Switch SupportTicketService.toDTO() to use GeoLookupService (IP-level lookup) instead of country-...
Add tab URL params to /account page for deep linking and refresh persistence
Tab state is now synced to **************** so links to specific tabs work and the correct tab stays selected on page refresh.
Build error in GeoLookupService and add NATS publish for agent messages
- Fix Optional vs List type mismatch in **************** - Inject NatsMessageService into MediaController - Publish to chat.session.{guid} after agent creates a...
Correct message sides in history and handle visitor name change events
- Use messageType=VISITOR_MESSAGE from API to determine left/right in history load - Add NAME_CHANGED system event rendering in SystemMessage and TicketChat
Real-time chat delivery, message sides, notifications, and name sync
- Keep NATS subscription alive on client unsubscribe to avoid breaking agent real-time delivery - Tag visitor messages with messageType=VISITOR_MESSAGE in getMe...
**************** uses instanceof for MEMBER type
Hibernate TYPE(m) = :type returns 0 results when bound to the base Member class in JOINED inheritance. For MEMBER type, fetch all and filter with !(m instanceof...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.