Chat UI polish - primary color theming, emoji inside input, round send btn, hex status colors
- Department tabs and chatbox header use --color-primary instead of hardcoded green - Emoji picker button moved inside chat input field aligned right - Send but...
Chat system improvements - editing spin, hex mask rotation, colors, maximize-minimize
- Detect editing (backspace/delete) vs typing in input to trigger backwards HexHead spin - Rotate hex clip mask along with border during typing/editing (avatar ...
Don't invalidate *** session when it matches the new OTK session
The validate route was deleting the existing *** session from Redis before looking up the OTK. When the OTK pointed to the same session, the lookup would fail w...
Accept *** from query param for cross-subdomain WebSocket auth
Read *** ID from ?***= query parameter first, falling back to cookie. This allows the frontend on internal.kamocrm.com to authenticate WebSocket connections to ...
Pass *** ID as query param for cross-subdomain WebSocket auth
Instead of relying on cross-domain cookies (which don't work across subdomains), read the *** cookie client-side and pass it as a query parameter when connectin...
Set *** cookie domain to .kamocrm.com for cross-subdomain sharing
Cookie was set without explicit domain, preventing it from being sent to media.kamocrm.com for WebSocket authentication.
Set *** cookie domain to .kamocrm.com for cross-subdomain sharing
The *** cookie was set without an explicit domain, defaulting to internal.kamocrm.com. This prevented the cookie from being sent to media.kamocrm.com during Web...
Handle stale NATS consumer binding with unique consumer retry
- Extract message handler into createNatsMessageHandler() method - Add retry logic with unique consumer name when "Consumer already bound" error occurs after ...
Resolve chat messaging, presence tracking, and auto-open issues
- Fix messages not being received by retrying NATS subscription with unique consumer name when "Consumer already bound" error occurs - Fix offline status by s...
Resolve MUI icons type error and share single STOMP WebSocket connection
- Add tsconfig paths override for @mui/icons-material to bypass broken ESM exports in v7.3.1 that point to non-existent ./esm/index.d.ts - Create ChatWebSocke...
Use ref for memberPanelOpen in openChat to prevent stale closure
When a user opens the member panel, clicks a member to chat, then closes the panel before the async session API call returns, the chat window was positioned wit...
Remove forced WebSocket headers from media middleware
Traefik v3 handles WebSocket Upgrade/Connection headers natively. Remove forced headers that broke non-WebSocket API requests.
Route MediaService traffic through Traefik on port 443
- Add MEDIASERVICE_URL env var for cluster-internal service access - Fix getMediaServiceBaseUrl in 9 API routes to use env var first - WebSocket hook connects t...
Route WebSocket through Traefik on port 443
- service.yaml: fix port 80→8443 to match pod's actual listen port - ingressroute.yaml: use scheme https + port 8443 for backend - serverstransport.yaml: add in...
Make commerce beans conditional on repository availability
Add **************** to EngagementLifecycle and CommerceService so they only load when commerce repositories are scanned. Prevents UnsatisfiedDependencyExceptio...
Add system account to all NATS configs
Add $SYS account with admin credentials to k0m1, k1m1, and k2m1 NATS configs. Enables nats CLI cluster management operations (peer removal, step-down, etc.) for...
Use cluster-internal DNS for NATS connection
Change default NATS URL from WireGuard IPs (100.64.x.x) to nats.kamo.svc.cluster.local for the local server. Remote nodes (k0m1, k2m1) remain on WireGuard IPs.
Allow app startup when NATS is unavailable
Remove @ConditionalOnBean from jetStream() and add @Nullable to the Connection parameter. When natsConnection() returns null (NATS unreachable), Spring no longe...
Reorder stat cards to match tab order
Communications → Docs → Open Tasks → History
Remove layout.tsx, fix docCount/historyCount type errors
- Delete layout.tsx that was incorrectly added (would affect entire site) - Revert page.tsx wrapper div (not needed) - Move gradient background back into LeadVi...
Update PipelineOrdersTab vendor field names to match backend DTOs
Changed v.uid → v.id, v.name → v.companyName, and selectedVendorId type from number to string to align with CommerceMarketVendor DTO.
Align TypeScript types with backend DTOs for commerce markets
The CommerceMarket, CommerceMarketVendor, and VendorCategory TypeScript interfaces used wrong field names (uid/name vs id/title, name vs companyName, websiteUrl...
Pipeline markets not loading and market manager layout spacing
Pipeline was showing "No commerce markets configured" because getPOSConfig() never returned the markets field. Now fetches markets from commerceMarketApi direct...
Resolve 'u.map is not a function' on POS settings and update Commerce nav
- Add defensive array extraction in commerceMarketApi (getMarkets, getVendorCategories, getMarketVendors, seedVendorCategories) to handle wrapped API responses ...
Resolve Next.js dynamic route slug conflict ('id' vs 'marketId')
Merge [marketId] directory into [id] for commerce-markets API routes. Next.js requires all dynamic segments at the same path level to use the same parameter nam...
Resolve TypeScript errors in enterprise pipeline tabs
- Make toCSV columns parameter optional with auto-derivation from object keys - Fix downloadBlob call in ProcurementTab (wrong arg count, missing Blob wrapper) ...
Pass markets prop to dashboard, engagements, and quick actions components
Remove duplicate session timeout fields from session types
Aligns with SecurityService change that removes createdAt/expiresIn from Redis session records and tokenExpiration from session info responses. - user-info/rou...
Remove duplicate session timeout system from Redis records
Session expiry is now managed solely by the Redis key TTL. The internal createdAt/expiresIn fields stored inside the Redis value have been removed — they formed...
Update internal layout and styles
- Make main wrapper background transparent so home page fixed background is not covered - Include latest adjustments to automation, security access, and account...
Handle optional effectiveDate and processedAt in DateTimeDisplay
Type error: string | undefined not assignable to string | number | Date. Add null checks before passing to DateTimeDisplay, show em-dash when absent.
Align Commerce submenu with actual Commerce page tabs
- Rename Domain Configuration to Engagement Types - Add Rental Assets, Vendors, Subscription Plans - Update tab param to engagement-types for consistency - Labe...
Advanced datagrids fill 100% of content area
- SettingsView: tab content wrapper overflow hidden, motion.div flex chain so tab content gets bounded height and grids can expand. - PipelineRentalAssetsTab:...
Resilient probes so cluster stays up when one node is offline
- Liveness: tcpSocket on 4222 (do not depend on JetStream meta leader) - Readiness: initialDelay 90s, period 15s, failureThreshold 10 so k0m1+k1m1 can form qu...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.