Nenda kwenye maudhui
KAMOUniverse

Mabadiliko

Nini kipya.

Kila kuboresha jukwaa, kama ni meli.

  1. · kamo-internal

    Clickable VOIP extension in Interaction Center opens softphone with number prefilled

  2. · VOIPService

    Sync TeamMember phoneWork extension on VOIP config save

  3. · SecurityService

    Backfill TeamMember phoneWork extension from MemberVoipConfig on startup

  4. · kamo-internal

    Wire call features settings end-to-end through provider abstraction

    - voipApi: add CallFeaturesDto type, getCallFeatures() and setCallFeatures() API calls - useSoftphone: add **************** state loaded from API on startup; setCallForward/setAutoAnswer actions persist via API; auto-answer and call-forward effects trigger on inbound calls when features are active - SoftphonePanel: remove local-only call feature state; wire Call Forward toggle and number input to softphone context; wire Auto Answer toggle to softphone context; rename nav button to 'Manage Extended A/V Settings' - Audio slider sync was already functional via useAVSettings event bus — no change needed

  5. · VOIPService

    Add call features API — call forward + auto-answer wired through provider abstraction

    - Add CallFeaturesDto and SetCallFeaturesRequest POJOs - Add callForward/autoAnswer flags to ProviderCapabilities - Add default getCallFeatures/setCallFeatures to PhoneProvider interface - RingCentral: implement via Answering Rules REST API (UnconditionalForwarding) - FreePBX: implement via GraphQL addCallforward mutation - CallFeaturesController: GET/PUT /api/voip/calls/features — DB primary, provider-native sync

  6. · kamo-shared-library

    Add MemberCallFeatures entity and repository for call forward and auto-answer preferences

  7. · kamo-asterisk-support

    Initial commit — FreePBX recording uploader (GO)

    Watches **************** for finished WAV recordings, groups multi-leg call legs by Asterisk UNIQUEID, and uploads each batch to APIService /api/voip/recordings/upload using a VOIP_RECORDING_UPLOADS-scoped API key. Files are deleted from disk only after the platform confirms storage. Bootstrap idempotently provisions an AMI user via manager_custom.conf and installs MixMonitor() per-channel hooks via extensions_custom.conf, then asks Asterisk to reload its dialplan/manager modules. Both managed blocks are surrounded by clearly marked banners so admin customizations survive. Includes Dockerfile, k8s manifests for k1m1 and k2m1 (Deployment + ConfigMap + Secret template), **************** mirroring the rest of the platform, and a non-technical README.txt for standalone FreePBX hosts.

  8. · kamo-internal

    VOIP_RECORDING_UPLOADS scope + recording pipeline counters/tunables

    - APIManager: new VOIP_RECORDING_UPLOADS scope option (used by kamo-asterisk-support on FreePBX hosts to upload voicemail and call recordings via APIService). - VoipSmsTab: new "Recording Pipeline" card with four counters (voicemails to process, calls to process, voicemails in error, calls in error) — refreshes every 30s, uses **************** New "Recording Processing" card with voipVmBatchSize / voipCallBatchSize / voipPollSeconds tunables. - systemConfigApi: extend update() to send the new tunables; add recordingStats(). - types/phone: SystemConfigurationDto gains the three new tunables; VoipRecordingStatsDto added.

  9. · SecurityService

    System-config recording stats + recording-processing tunables

    - GET **************** returns the four counters exposed on the kamo-internal Settings → Platform → Configuration → VoIP/SMS tab (vmPending, callPending, vmError, callError). - PUT /api/security/system-config now accepts voipVmBatchSize, voipCallBatchSize, voipPollSeconds for DaemonService recording-processor tunables. - toDto() includes the new fields so the frontend can read them back.

  10. · DaemonService

    RecordingProcessorJob + NATS shortcut for fresh uploads

    - New Quartz job RecordingProcessorJob ticks every minute, dispatches independent VM and call batches concurrently to ConversionService **************** using **************** voipCallBatchSize} as caps. - New RecordingReceivedConsumer subscribes to voip.recording.received NATS subject emitted by ConversionService on fresh uploads and triggers an immediate run, so a freshly-staged recording starts processing within seconds rather than waiting on the periodic poll. - Configmap exposes daemon.jobs.recordings.cron and the **************** it talks to.

  11. · ConversionService

    Recording ingest + FFmpeg processing pipeline

    - New **************** endpoint stages multipart uploads forwarded by APIService into MinIO bucket **************** and creates an UnprocessedRecording staging row. Idempotent on retries using (phoneServerId, asteriskUniqueId). - New **************** endpoint (called by DaemonService) drains rows: downloads staged WAVs, mixes call legs into a single Opus/WebM master via FFmpeg amix, transcodes per-channel WAVs as tracks alongside the master, and uploads through RecordingImagingService with VM_RECORDING (8) / CALL_RECORDING (9) ImageAssocType. - New FfmpegService wrapper (transcodeToOpusWebm / mixToOpusWebm) with timeout and tempfile cleanup. - NATS publisher emits voip.recording.received on every staged upload so DaemonService can short-cut its periodic poll. - Dockerfile installs ffmpeg in the runtime stage (alpine ffmpeg ships libopus by default). - ConfigMap exposes **************** (shared cross-service internal-call secret) so the new endpoints can authenticate APIService and DaemonService callers.

  12. · APIService

    VoipRecordingUploadController for kamo-asterisk-support uploads

    POST /api/voip/recordings/upload accepts multipart bodies from kamo-asterisk-support running on FreePBX hosts. Validates the X-Api-Key has the new VOIP_RECORDING_UPLOADS scope (re-using the **************** validation cache), then forwards the multipart payload + metadata headers (X-Phone-Server-Id, X-Asterisk-Unique-Id, X-Recording-Kind, X-Primary-Extension) to ConversionService ****************

  13. · kamo-shared-library

    UnprocessedRecording staging entity, ImgDat track tracks, recording imaging service

    - Fix ImageAssocType ID collision: VM_RECORDING=8, CALL_RECORDING=9 (were both duplicating MY_DOCS at 4). - Add **************** so a master recording can carry per-channel Opus/WebM tracks alongside the existing thumbnail concept. - Add ImageMimeType.AUDIO_WEBM (audio/webm) for the Opus-in-WebM containers produced by the conversion pipeline. - New UnprocessedRecording (UUID id, IS_VM, PHONE_SERVER_ID, EXTENSION, ASTERISK_UNIQUE_ID, IS_PROCESSED, IS_ERROR, ERROR_MESSAGE, RESULT_IMG_ID, DATE_CREATED, DATE_PROCESSED) staging entity + repository for the kamo-asterisk-support → ConversionService → DaemonService pipeline. - New RecordingImagingService that uploads a master Opus/WebM master to imaging with per-channel Opus/WebM tracks attached via ImgDat.trackCount. - SystemConfiguration: add voipVmBatchSize / voipCallBatchSize / voipPollSeconds for DaemonService recording-processor tunables.

  14. · kamo-asterisk-support

    Initial commit — FreePBX recording uploader (GO)

    Watches **************** for finished WAV recordings, groups multi-leg call legs by Asterisk UNIQUEID, and uploads each batch to APIService /api/voip/recordings/upload using a VOIP_RECORDING_UPLOADS-scoped API key. Files are deleted from disk only after the platform confirms storage. Bootstrap idempotently provisions an AMI user via manager_custom.conf and installs MixMonitor() per-channel hooks via extensions_custom.conf, then asks Asterisk to reload its dialplan/manager modules. Both managed blocks are surrounded by clearly marked banners so admin customizations survive. Includes Dockerfile, k8s manifests for k1m1 and k2m1 (Deployment + ConfigMap + Secret template), **************** mirroring the rest of the platform, and a non-technical README.txt for standalone FreePBX hosts.

  15. · kamo-internal

    Replace mock contacts tab with fully-featured SoftphoneContacts

    Extracts a new SoftphoneContacts component that wires the softphone contacts tab to the real contacts API via useContacts(). Replaces 4 hardcoded mock contacts with live data from all contact books. Features: - Book and group filter pills with dropdown selectors - Debounced search, sort by last/first/full name - Colour-coded avatar initials (deterministic hash), photo support - Contact list with hover-reveal quick-call button - Detail view (replaces list) showing phones, emails, org, notes - Inline edit mode for all fields (phones/emails multi-value with add/remove) - Delete contact with confirmation step - Empty and loading skeleton states - "New contact" navigates to /contacts?action=create Updates contacts/page.tsx to auto-open the create dialog when the ?action=create query param is present (used by the softphone "New" button).

  16. · kamo-internal

    Replace extension Chip with inline text next to role in Interaction Center

  17. · kamo-internal

    Remove manual phone extension field; write VOIP extension through to SecurityService on save

  18. · SecurityService

    Include phoneWork extension in by-department response; accept phoneWorkExtension on member PUT

  19. · kamo-shared-library

    Add **************** helpers to TeamMember

  20. · kamo-internal

    Wire VAD + push-to-talk; remove unimplementable settings

    - vadEnabled now passed as voiceActivityDetection in buildAudioConstraints so the browser honours the toggle when opening mic for a call - pushToTalk auto-mutes the mic at call accept and installs keydown/keyup listeners that unmute while the configured hotkey is held - Removed settings that had no functional wiring and cannot be implemented via standard browser WebRTC APIs: micGain (no GainNode in SIP pipeline), highPassFilter, noiseGate, vadThreshold, hdVoice, cameraBackgroundBlur (requires ML), cameraBrightness/cameraContrast (CSS preview only) - Cleaned up AVSettings interface and DEFAULT_AV_SETTINGS accordingly; rebalanced toggle grids after removals

  21. · kamo-internal

    Scrollable ringtone list with search filter

    Make the ringtone catalog panel match the right-column height and scroll vertically when the list overflows, so members can navigate as more tones are added. Adds a search field that filters by label or filename, with a clear button and an empty-state message.

  22. · kamo-internal

    Add seven more ringtones to the catalog

    Adds Battleship Horn, Demon Horn, Land Line, 1985 Ring, Office Phone, Ringing Old Phone, and Olé under /public/sounds/ringtones/ and wires them into RINGTONE_CATALOG so they appear alongside the existing Default / Sci-Fi / Buzzer / Silent options on the Ringtones subtab.

  23. · kamo-internal

    Add Sci-Fi and Buzzer ringtones to the catalog

    Drops two new ringtone assets under /public/sounds/ringtones/ and registers them in RINGTONE_CATALOG so they appear in the Ringtones subtab and can be set as the default-incoming softphone tone.

  24. · kamo-internal

    Three-column audio layout, drop saved-banner, fill width

    Lays the Audio subtab out as Microphone | Speaker | Advanced across the full row on lg+ screens (md still pairs them two-up, xs stacks). The Advanced card switches to a vertical stack inside its narrower column. Removes the trailing "Settings saved automatically" footer — the behaviour is implicit and the card was just taking space. Forces sectionCard panels to width: 100% and adds alignItems="stretch" to each subtab's Grid so cards always fill their column edge-to-edge.

  25. · kamo-internal

    Split AV settings into Audio/Video/Ringtones subtabs

    Reorganizes the Audio/Video tab into three internal subtabs and lays each one out horizontally so settings fit within the viewport without the wall of vertical scrolling we had before. Also fixes the ringtone catalogue to point at the real /sounds/ringtone.mp3 asset instead of phantom paths under /sounds/ringtones/, so previews and the always-on softphone session share a single canonical ringtone.

  26. · kamo-internal

    Add Audio / Video Settings tab and wire into softphone

    Adds a per-device AV preferences store (localStorage, machine-specific, not roaming) plus a fully-featured tab on /settings/member/<id> for configuring and testing microphone, speaker, ringer, and camera. The softphone tool window, ringtone playback, and SIP SDK adapters now honor these settings live: device routing via setSinkId, getUserMedia constraints (deviceId + EC/NS/AGC/sample rate), DTMF tone volume, ringer device + tone selection, mute-on-join, and desktop notifications.

  27. · kamo-internal

    Always-on SIP session with auto-popup + ringtone on inbound calls

    The softphone used to register only while the popup tool window was open — close it and inbound calls were silently missed. Lift the session into a SoftphoneProvider mounted at AuthenticatedToolWrapper, so SIP REGISTER is held continuously while the operator is signed in and any inbound INVITE gets the operator's attention. - app/hooks/useSoftphone.ts: rename the implementation hook to useSoftphoneSession to reinforce that it must be mounted exactly once per session (it owns the SIP credentials and the REGISTER). - **************** new SoftphoneProvider runs the session hook once, exposes the state via context, and reacts to hasIncomingCall transitions — pops the softphone tool window via a tool:open custom event (single-instance, so it just focuses if already open) with caller ID in the title, and plays /sounds/ringtone.mp3 on a loop until the user accepts/rejects/the remote hangs up. Public useSoftphone() hook reads from the context. - **************** switch import to the context. - **************** wrap the tool tree with SoftphoneProvider so the session lives as long as auth state. classic NA cadence (440Hz + 480Hz, 2s on, 4s silence) so audio.loop=true yields a natural ring/pause/ring pattern. ~72 KB. Browsers may block the initial play() until the user has gestured on the page; the operator has typically clicked at least once by the time a call arrives, so this is rarely an issue in practice.

  28. · KlusterServices

    Seed pbx.k1.kluster.kamocrm.com as a static domain

    The browser softphone needs SIP-over-WSS to land on a hostname with a real TLS cert. Add the FreePBX admin / WS hostname to STATIC_DOMAINS so the auto-cert seeder provisions a per-host Let's Encrypt cert for it unconditionally instead of relying on it appearing in Traefik access logs. Once the cert is issued, the temporary internal.kamocrm.com/voip-ws path (committed earlier as a workaround) can be retired and the softphone can use the canonical pbx.k1.kluster.kamocrm.com/ws URL.

  29. · kamo-register

    Use org short name and description in HTML head

    Replace org-API-based title logic with config.json siteNameShort so the title follows the same pattern as other sites: "Register - {siteNameShort}". Adds description meta tag from config.json. Removes unused useThemeConfig import.

  30. · kamo-login

    Use org short name and description in HTML head

    DynamicMetaLoader now sets document.title to "Login - {siteNameShort}" and writes the org description into the meta description tag. Static layout.tsx fallback updated; removed hardcoded KamoCRM OG/Twitter metadata.

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