Mabadiliko
Nini kipya.
Kila kuboresha jukwaa, kama ni meli.
· kamo-internal
Production-grade History + Voicemail tabs with media-player tool
History tab (SoftphoneHistoryTab.tsx): - Infinite scroll via IntersectionObserver inside the panel's scroll container - Filter chips: All / Inbound / Outbound / Missed / Recorded - Recording icon in row actions when the imaging side has a Recording row - Per-row overflow menu (Add to contacts) - Click-to-call back via existing dialpad Voicemail tab (SoftphoneVoicemailTab.tsx): - Infinite scroll, filter chips (All / Unread / Has audio) - Per-row Play / Call back / More actions - Auto-mark-read on play - Two-option delete dialog: Archive (soft-hide, all users) vs Permanently delete (gated by VOIP_VOICEMAIL_PERMANENT_DELETE right; falls back to disabled state for users without it) - Mark-all-read button with no-op-when-zero affordance MediaPlayer popup tool **************** - Audio: synthesized waveform-style scrubber, click-to-seek, Replay10/Forward10, playback rate (0.5x-2x), loop, volume + mute, output device honored from AV settings - Video: contained viewport, PiP, fullscreen, same scrubber + controls - Multi-track selector for call recordings (master + each per-channel leg) - Download - Two source modes: voipApi recording (call/VM) or imaging asset by imgId - Registered in tools/registry/registrations.ts as multi-instance Hook + plumbing: - useSoftphone exposes paginated history + voicemails (loadMore, hasMore, isLoading) and archive/permanent-delete actions - voipApi gains lookupRecordings, getRecordingMetadata, archiveVoicemail, paginated getVoicemails - /api/voip proxy passes audio/video/octet-stream bodies through with **************** intact (no buffering) so media elements scrub - New **************** forwards to DocsService's new streaming endpoint with Range - VOIP_VOICEMAIL_PERMANENT_DELETE added to the frontend RoleRightType registry so checkRight gates the delete UI
· InitializerService
Migration runner for Recording provider-lookup columns + VM archive columns
Adds RECORDINGS.provider_instance_id (UUID) and provider_external_id (VARCHAR(64)) plus the composite idx_recordings_provider_lookup index used by the softphone History tab's bulk lookup endpoint. Also adds PHONE_VOICEMAIL.is_archived + date_archived for the new soft-archive flow. Wipes any pre-existing RECORDINGS / RECORDING_EXTS rows in the same pass — naturally idempotent (the predicate only matches rows whose provider_external_id is still NULL, which won't happen once ConversionService is on the new code path). Order 35 — after **************** (30) so the recording tables exist before the ALTERs land.
· ConversionService
Persist providerInstanceId + providerExternalId on Recording at ingest
Threads asterisk-support's X-Phone-Server-Id and X-Asterisk-Unique-Id (already in UnprocessedRecording) onto the new RecordingMetadata fields so call/voicemail rows in the imaging system carry the join key back to the source provider row. For voicemails the helper sends the raw filename basename (e.g. msg0000); we strip the msg prefix and leading zeros so the stored key matches what FreePBX's voicemail REST API returns as the message id.
· DocsService
Add **************** with HTTP Range support
Generic streaming endpoint for audio/video imaging assets, used by the kamo-internal MediaPlayer tool. Reuses ImageService authorization (same as /download/...) but streams with Accept-Ranges + Content-Range so media elements can scrub without loading the full file.
· VOIPService
Recording playback, voicemail archive, paginated voicemail, history enrichment
- New RecordingController with bulk lookup, range-streamed audio for master + per-channel tracks, and metadata for the media-player tool window - CallController.getCallHistory / getVoicemails enrich each row with imaging recordingId via the new RecordingLookupService — single round trip, no N+1 - PhoneProvider.getVoicemails now takes (memberId, page, size); FreePBX paginates client-side from one fetch, RingCentral uses native paging, KamoPBX continues to throw NotSupported - Voicemail archive endpoint (soft-hide via PhoneVoicemail.isArchived) and permanent-delete gated by VOIP_VOICEMAIL_PERMANENT_DELETE — godActive bypass requires both GD eligibility AND active toggle - PhoneProvider gains getInstanceId() so controllers can resolve the join key for recording lookups without a second factory call
· kamo-shared-library
Provider lookup keys on Recording, voicemail archive, MinIO range streaming
- Recording: add providerInstanceId + providerExternalId for joining provider call-history / voicemail rows back to imaging assets - PhoneVoicemail: add isArchived + dateArchived for soft-hide from softphone listings - RoleRightType: add VOIP_VOICEMAIL_PERMANENT_DELETE (gates destructive delete; archive remains available to all) - MinIOStorageService: add openRange() + RangeStream so audio/video endpoints can honor HTTP Range - RecordingImagingService: thread provider id + external id through RecordingMetadata onto the Recording row at ingest
· kamo-internal
Add History tab — paginated audit timeline with search and filters
- LeadHistoryPanel: sticky filter toolbar with debounced search, **************** filters, MUI table with pagination, color-coded event chips, member-name resolution for assignment/account fields - leadsApi: getLeadHistory() and getLeadHistoryFilters() with full query-param support - LeadHistoryEntry, LeadHistoryActor, LeadHistoryFieldMeta, LeadHistoryPageResponse, LeadHistoryFiltersResponse types - Next.js proxy routes for **************** and /filters - LeadViewClient wired to render LeadHistoryPanel when History tab is active
· SecurityService
Add GET /{id}/history and /{id}/history/filters endpoints
Paginated, filterable, searchable lead-history endpoint with batch actor loading (no N+1). Filters endpoint returns distinct used fields, all registry fields, distinct actors, and all event types. All mutating endpoints now pass the calling member as actor to LeadHistoryService for attribution.
· kamo-shared-library
Add lead-history audit log — entity, registry, service, DTO, LeadService hooks
- LeadHistory entity (UUID PK, plain Long FKs — no FK constraints to allow lead deletion/conversion) - LeadHistoryEventType enum with human-readable labels - LeadHistoryFieldRegistry: single source of truth for ~55 tracked Lead fields; adding a field is one line - LeadFieldDescriptor record (key, label, category, extractor) - LeadHistoryService: snapshot/diff pipeline, **************** paginated+filtered findHistory, distinctFields/Actors for filter dropdowns - LeadHistoryDTO with nested ActorDTO; all Long IDs serialized as String for CockroachDB JS precision safety - LeadService: history hooks on create, update, delete, assignLead, assignLeadAccount, unassignLeadAccount
· SecurityService
Wire LeadHistoryService actor tracking into LeadController
· kamo-internal
Add lead-account assignment UI, currency system, assign/new account pages, settings currency field
· SecurityService
Add lead-account assignment endpoints, update AccountController for CurrencyType
· kamo-shared-library
Add CurrencyType enum, update CountryType with primary currency, add currency to Account/Organization, add lead-account assignment to LeadService
· kamo-internal
Dynamic member type label in My Account page title
Title now reads "My {Member|Team Member} Account" using the org-configured behavior labels, switching automatically once the member's type is loaded.
· kamo-internal
Move Create Document button into DocManager toolbar
The button was only available on /doc/manager via the actions prop. Moved all logic (state, handler, DOC_TYPES, menu) into DocManager so it appears on every embedded instance. Simplified page.tsx to just render DocManager with no actions prop.
· kamo-internal
Move Mailing Address into 3-column row with Lead Info and Primary Contact
· kamo-internal
International support — CountrySelect, LanguageSelect, SubdivisionField across all forms
- Add reusable CountrySelect (207 countries, flag icons), LanguageSelect (26 languages, flag icons), SubdivisionField (US state dropdown with flags; other countries show labeled text field) - Add country constants (countries.ts, languages.ts, usStates.ts, timezones.ts) - Lead view Details tab: per-card in-place editing with **************** fields - Lead create form: full country/subdivision/timezone dropdowns replacing limited inline lists - LabelManager settings: org default language in Section 8, CountrySelect+SubdivisionField in address - ContactInfoStep (network create wizard): CountrySelect+SubdivisionField replacing limited selects - MyAccountTab: CountrySelect+SubdivisionField replacing plain text fields - types/leads.ts: add country and subdivision fields
· kamo-shared-library
Add international support — Lead country/subdivision/timezone, Org language, CountryType isProvince
- CountryType: add PROVINCE_NAMES set, isProvince(), getSubdivisionLabel() - Organization: add language (LanguageType) field - Lead: add country (CountryType), subdivision (String), timezone (TimezoneType) fields - **************** add country, subdivision, timezone String fields - LeadService.createLead: handle new fields; default language+country from org settings - LeadService.updateLead: handle new fields - **************** add language touchedKey handler
· kamo-internal
ASSIGN_LEADS right, agent filter unassigned option, grid column cleanup
- Gate 'Unassigned Leads' agent filter option behind ASSIGN_LEADS right - 'All Leads' excludes unassigned leads for members without the right - Remove Street, Product, Source columns; remove Product/Source filter dropdowns - Remove Company column; Contact column shows company name, falls back to contact name - Vendor column shows tooltip with Product – Source detail - Date columns drop weekday prefix, shrink from 170px to 140px - DateTimeDisplay: add showWeekday prop (default false)
· kamo-shared-library
Add ASSIGN_LEADS right (ID 137) under CRM section
· kamo-internal
Add Assign To field to Market & Assignment section on /leads/new
- Fetches active team members from **************** on mount - Groups members by department with alphabetically sorted departments and members - Formats names as "Last, First"; first option is "Auto Assign / Unassigned" - Reorders section fields: Lead Market, Assign To, Best Time to Contact, Vendor, Product, Prospect Type (all lg=4) - Fixes leadsApi.ts to send assignedTeamMemberId instead of the dead assignedUser field - Adds assignedTeamMemberId to the Lead type
· kamo-asterisk-support
Emit recordedAt + per-file extension in upload manifest
- Watcher: every emitted Recording carries RecordedAt, derived from the EPOCH segment of our managed **************** filename, falling back to file mtime for voicemail / legacy files. - Grouper: CallBatch now tracks FileExtensions[] (one per file, parallel to Files[]) and the batch's overall RecordedAt (earliest leg start). Sort key for legs is RecordedAt with FinalizedAt as tiebreaker so the master leg is deterministic. - Uploader: manifest now includes top-level recordedAt and per-file extension. ConversionService consumes both to write the Recording (date_recorded, length from ffprobe) and per-leg RecordingExt rows.
· ConversionService
Pass Recording metadata to imaging — ffprobe length + manifest parsing
- **************** runs ffprobe -show_entries format=duration on the master Opus/WebM, returns ms. 0 = unknown (not fatal). - **************** now: * runs probeDurationMs on the master to get the recording length; * parses the manifest (sent by kamo-asterisk-support) for recordedAt and per-file extension/channel data, falling back to staging row dateCreated and channel-name parsing for older payloads; * passes a **************** dateRecorded, lengthMs, participatingExtensions) to RecordingImagingService so it can write the new Recording + RecordingExt rows.
· kamo-shared-library
Recording + RecordingExt entities, RecordingImagingService writes them
- New Recording entity (UUID id, IMG_ID, IS_MASTER, IS_VM, EXTENSION, MEMBER_ID, LENGTH, DATE_RECORDED, DATE_CREATED [DB-defaulted via @CreationTimestamp]). One row per finalized voicemail or call recording uploaded to imaging. - New RecordingExt entity (UUID id, RECORDING_ID, EXTENSION, MEMBER_ID, IS_MASTER). One row per channel that participated in the recording; the master leg is flagged IS_MASTER=true, every other leg false. - **************** now takes a RecordingMetadata bundle (phoneServerInstanceId, dateRecorded, lengthMs, participatingExtensions) and persists Recording + RecordingExt rows in the same transaction as the Img/ImgDat. memberId is resolved per leg via **************** on the originating VOIP instance (null when unassigned).
· kamo-internal
Update Platform Administration cards to match unified tab structure
Replace the two stale cards (Organizations standalone page + Configuration) with five cards matching the actual tabs: General, Organizations, VOIP & SMS, System User, and Advanced — each linking directly to the correct ?tab= param.
· kamo-internal
Full-width grid layout and move sync trigger from Advanced tab
- Redesign VOIP & SMS tab to use full content-area width: pipeline stats span the top row, Recording Processing and Global Sync Schedule sit side by side in a two-column grid at lg+ breakpoint - Pipeline stat cards show live counts with zero-state checkmarks and error color coding; auto-refresh every 30s noted in subtitle - Global Sync card consolidates schedule settings, last-sync timestamp row, and manual trigger into one panel; enabled/paused chip in header - Move "Force global VOIP sync" out of Advanced tab (duplicate of trigger already present on VOIP & SMS); Advanced tab now shows placeholder text
· kamo-internal
Merge Organizations into Configuration page with unified tab nav
- Add Organizations as a tab in **************** (General · Organizations · VOIP & SMS · System User · Advanced order) - Delete **************** standalone page - Update Platform Administration nav in SettingsStatusWindow to list all 5 tabs as sub-items pointing to configuration?tab=... - Fix layout across all tabs: consistent p: {xs:2, sm:3} padding so content no longer runs into card walls - Improve GeneralTab stat cards with icon backgrounds and tighter typography rhythm - Update SettingsView title/subtitle for the unified page
· kamo-marketing
Add Go logo to BUILT WITH banner
· kamo-internal
Surface PHONE_SERVER_ID on phone-instance overview tab
Operators configuring kamo-asterisk-support on a FreePBX host need to paste the matching VoipProviderInstance UUID into the helper's config file as PHONE_SERVER_ID. Until now they had to grub through the URL bar or the database. New "Phone Server ID" section on /settings/features/phone/{id} overview shows the UUID in a read-only monospace field with a one-click copy button (CopyableIdField helper, also reusable for future similar identifiers).
· kamo-internal
Clickable VOIP extension in Interaction Center opens softphone with number prefilled

Ulimwengu wako unasubiri.
Kuanza bure katika dakika. Ongeza bidhaa wakati wowote wewe ni tayari - hakuna uhamiaji, hakuna logins mpya.
Bure milele - hakuna kadi ya mkopo inahitajika