Materials and the social timeline take rights, not just ownership
MANAGE_MATERIALS and MANAGE_SOCIAL_MEDIA counted as enforced in the audit and every site was a .tsx file. Behind them 29 endpoints checked ownership and no righ...
The meeting reminder is a notification, not a popup of its own
The sweep published a bespoke event on /topic/meet/reminder/{memberId} that a dedicated Snackbar drew in the corner of the screen. That popup was the entire rem...
The ticket list survives a broken indicator
The unread read threw and took the whole ticket list with it — the page came back empty, which is a far worse outcome than a page with no markers on it. It is g...
The ticket list marks the same items the badge counts
countForMember sized a set it built privately, so the list had no way to ask which tickets were in it and approximated instead — it flagged unread chat messages...
A ticket can never be answered by the member who raised it
A support conversation has two sides — someone asking and someone answering — and nothing enforced that they were different people. A member holding ACCEPT_SUPP...
Send an outbound attachment to the endpoint its type belongs to
Every social attachment went out through the adapter's sendImage, which on Telegram is /sendPhoto. A PDF or a zip posted there is rejected by the provider, and ...
Declare the object-storage secret the ConfigMap no longer carries
The MinIO key was moved out of the ConfigMap into the minio-app-credentials secret, but the envFrom that supplies it was only ever applied to the live deploymen...
Stop shipping a shared credential as a config default
The platform's shared password was baked in as the fallback for DB_PASSWORD and MINIO_ROOT_PASSWORD, so it lived in this repo and in the built image as well as ...
Assigning by hand must not consume the PRE_TICKET status
assignToAgent and reassignAgent set ASSIGNED unconditionally, which quietly made a chat request impossible to convert afterwards — convertPreTicket accepts noth...
Validate who a ticket may be handed to by hand
assignToAgent and reassignAgent checked only that the id resolved to a member. Assignment adds that member to the ticket's chat session, so an id from another o...
Auto Assignment offers the ticket, it does not allocate it
Auto Assignment pages every available support agent and goes to the first one who accepts. It was implemented as "silently pick the least-busy agent who is onli...
Run the topic's strategy for widget chats too
A chat opened in the web widget is the same unit of work as one filed inside the app, but this path skipped the topic's assignment strategy entirely — the only ...
Put the session type on the activity frame too
The unread/ACTIVITY broadcast is published for every session type and carried no indication of which. The chats list, having nothing to go on, typed an unseen s...
Tell the client which kind of conversation a message arrived in
Every member of a media session receives the incoming-message notification, and assigning a support ticket makes the agent a member of that ticket's session. Th...
A live chat is claimed through the popup, never allocated
Routing chat requests through round-robin was the wrong model and it broke the thing it was meant to fix. An assigned ticket leaves the claimable queue (Support...
Stop assignment failures destroying the ticket that triggered them
Routing a new ticket ran inside the creation transaction, so anything it hit rolled the ticket back with it and the member asking for help got "Failed to create...
Route a chat request through the topic's assignment strategy
A support chat request is filed as a PRE_TICKET, and createTicket skipped assignment for those outright. The guard was written for the web-chat widget, where a ...
Stop renewing the shared *** TTL for idle users
This service keeps its own copy of KSessionService, and it slid the TTL on every read. Gating SecurityService alone therefore fixed nothing: kamo-internal point...
Fail a dead upload in minutes instead of holding it for an hour
connectionUploadTimeout is the tolerated SILENCE between reads, not a budget for the whole transfer. Setting it to an hour to 'match Traefik' confused the two: ...
Stop Tomcat's 60s connection timeout killing a long upload
A 2 GiB chat attachment failed after nearly four minutes of successful transfer with MultipartException wrapping a bare SocketTimeoutException, and the member w...
Catch OptimisticLockException, the type 40001 actually wraps as
Round 3 review fix: hibernate-core's **************** tests LockAcquisitionException (what SQLState 40001 converts to) against four specific types in order, non...
Catch the exception type the claim conflict actually throws
Round 2 review fix: the statement-level 40001 (the common case, detected inside executeUpdate() rather than at commit) surfaces as **************** via Hibernat...
Return 409 on every lost claim race, add manager claim path
Round 1 review fixes for the accept-popup claim endpoint: - an ordinary lost race (loser's isClaimableBy already false post-commit) now raises TicketAlreadyCl...
Scan the email repositories DepartmentService now needs
MediaService CrashLooped on every pod since shared-lib 1.5.0: DepartmentService is a @Service, so the wildcard @ComponentScan("com.kamo") builds it here whether...
Accept the timeline provider filter as repeated params
The web client sent ?providers=facebook,x as one CSV value. A comma in a query VALUE has to travel as %2C, and a hop that re-encodes turns that into %252C; we d...
Send missed-message emails to the user account, not the org mailbox
The notice existed to say "you have a message waiting, sign in and read it", and it was being delivered to the mailbox this organization assigned the member — w...
Kutoa kila wakala kuishi badge badala ya mmiliki mmoja kuhesabu
The nav badge and /support?tab=tickets answered different questions. The page lists every ticket in the org; the badge counted unread chat messages belonging to...
Drop client SENDs to guarded topics, and repair the build at HEAD
TWO THINGS, both of which stop MediaService main from shipping. 1. main does not compile. MediaController:1361 calls **************** which does not exist: ...
Announce a message once, when it is whole
Both callers that finish building a message after the row is saved now tell createMessage not to announce it: MediaController attaches the images and publishes ...
Store attachments through the dedup pipeline instead of one object per upload
Attachments wrote their own "<imgId>/<fileName>" object on every upload, bypassing the content-addressed store entirely — the same logo-draft.png attached three...
Scan the shared MFA repositories
MfaEnrollmentService is a @Service in kamo-shared-library, so the wildcard @ComponentScan("com.kamo") in this application constructs it whether or not this serv...
Harden the kubectl download against flaky egress [skip ci]
dl.k8s.io over the runner's egress intermittently drops mid-transfer: curl: (56) OpenSSL SSL_read: decryption failed or bad record mac which fails the deploy ...
Mount the live per-host cert instead of the expired wildcard secret
Chombo cha ndani cha cert-converter kilijenga ghala lake la msingi la PKCS12 kutoka kwenye ghala lake. wildcard-kamocrm-com, urithi wa siri ya multi-SAN ambayo ...
Kukataa mawakala wa mauzo ya msalaba-org; Widen bootstrap cache busting
salesAgentId was persisted from the request body unchecked, so a cross-org or dangling agent id could be stored on a WebChatIntegration. It failed safe only bec...
Exclude non-ACTIVE members from chat participation & routing
A non-ACTIVE **************** member must not appear as, or be targeted as, a live chat participant. Gate every chat path on the shared-lib **************** pre...
Make WebChatIntegration create() @Transactional (no orphaned key on integration-save failure)
Resolve public-chat system member per-org (drop hardcoded snadjafinia alias)
createSupportSession, createPublicTicket, and the owner notification helpers all resolved the org's "system member" via a hardcoded usernameAlias="snadjafinia" ...
Stop putting message content into missed-message emails
Remove messagePreview computation, the ledger PREVIEW write, and the messagePreview template variable; drop the includePreview preference. Emails now carry send...
Endelea bendera zilizopangwa za kidole kupitia update iliyopangwa
Same detached-entity orphanRemoval issue as the conversion pipeline: the headless sweep held a detached ImgDat and save()/merge() cascaded into the images colle...
Wrap recording upload so MediaService compiles
MinIOStorageService.upload throws a checked Exception that ingest() neither caught nor declared — build break on top of the isGuest fix. Wrap it and rethrow as ...
MeetingParticipant.isGuest() (was getGuest, won't compile); repoint transcribe to generic endpoint
MeetingParticipant exposes isGuest() (primitive boolean getter), not getGuest(). Also point the summary transcribe call at the shared /api/conversion/transcribe...
Persist invited participants, enforce MANAGE_MEET_SETTINGS, drop double-invite path
- createMeeting: invited members are numeric snowflake IDs, not UUID strings — route them through longToUUID like the creator. Previously UUID.fromString th...
Use cluster MinIO service DNS; drop deprecated WireGuard/CGNAT IPs and retired k2m1/k0m1
Publish NATS CREATE event after transaction commit to fix image attachment race
The NATS message was published inside the @Transactional body, which meant recipients could receive the CREATE event and request the image via /imaging/proxy/{o...
Serialize attachments in WS relay and message history; allow attachment-only sends
Three bugs fixed: 1. ChatSessionSubscriptionManager was building the STOMP messageMap manually and omitting attachments, sourceLanguageId, readMemberId, msg...
Fix NPE in getChatSessions from Map.of() rejecting null nextcoder
java.util.Map.of() throws NullPointerException when nextcoder is null (no more pages). Replace with HashMap that accepts null values. Also wrap entire handler i...
Fix upload 500 (missing EmbRecordState) and empty chats tab (Timestamp cast)
Defect A: ChatAttachmentService.upload omitted **************** causing a NOT NULL violation on imgs.is_active. Added the default recordState. Also hardened Cha...
Prefer usernameAlias over User.name in memberDisplayName
Switches display name priority to: Member.usernameAlias → User.name → User.alias → User.username. Also includes the paged query dispatch fix from the previous c...
Use split First/After queries for chat sessions paged endpoint
Addresses empty Chats tab by dispatching to ****************
Je, unaona nini kuhusu usafiri?
Kila moja ya hizi updates ardhi katika nafasi yako ya kazi moja kwa moja. Kuanza bure na kuangalia kukua wiki baada ya wiki.