1232 Commits
Author SHA1 Message Date
Hoan Luu Huu f35b694877 update speech utils v1.0.10 (#1574) 2026-07-29 07:15:51 -04:00
Dave Horton 389c65e2d8 0.9.8 v0.9.8 2026-07-20 08:34:52 -04:00
Hoan Luu HuuandClaude Opus 4.8 cdc9070488 feat: support srtpEncryption on dial verb for sip URI targets (#1568)
* feat: support srtpEncryption on dial verb for sip URI targets

Reads the new dial.srtpEncryption option and, for sip: URI targets,
forwards it to sbc-outbound as an X-Jambonz-SRTP header so the outbound
leg negotiates encrypted media (SRTP) — e.g. to a sips:/TLS endpoint
such as LiveKit. No behavior change when the option is unset.

Requires @jambonz/verb-specifications with the srtpEncryption spec
(dependency bump to follow once published) and sbc-outbound honoring
the X-Jambonz-SRTP header.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* update verb specification

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 07:23:48 -04:00
Joe Heung 9973670a6c feat: surface in-dialog hold/un-hold to the application (#1564)
Applications currently have no way to observe a mid-call hold/un-hold.
The feature-server handles the in-dialog re-INVITE internally (re-modifies
the endpoint, returns 200) but never notifies the app, so a transcription
or agent-assist app can't pause/resume when a caller is held or retrieved.

This detects the hold state transition on a re-INVITE and delivers it over
the existing sipRequestWithinDialogHook channel as a verb:hook, plus emits
a local 'hold'/'unhold' event so in-process tasks (e.g. transcribe) can react.

- call-session.js: ordinary calls — reuse isOnhold() (a=sendonly/a=inactive).
- siprec-call-session.js: SIPREC overrides _onReinvite, so a separate handler
  is required. SIPREC recording streams are sendonly by nature, so a stream
  flipping to a=inactive is treated as the hold signal; the full multipart
  body (SDP + rs-metadata) is always forwarded. Fires on transition only;
  other re-INVITEs are delivered as event:"reinvite".

Delivery uses requestor.request('verb:hook', ...) — the same channel
_handleRefer uses — rather than a task-bound performHook, so events are not
dropped if the current task has ended. Enable per call with:
  {"verb":"config","sipRequestWithinDialogHook":"/hold-events"}

Confirmed live against Cisco CUBE (Cisco-SIPGateway/IOS-17.12.7b) over SIPREC:
both recording streams flip sendonly<->inactive on hold/resume, each
transition emitted correctly.

The whole feature is opt-in behind the JAMBONES_HOLD_UNHOLD_EVENTS env var;
when it is unset, _notifyHoldState / _notifySipRecReinvite are no-ops (neither
the local event nor the hook fires).

Reinstates the feature previously reverted in #1563. The revert was due to the
unit test failing in the full suite: lib/config.js captures the env var once at
load time, and earlier suite files require config/session modules (flag unset)
before this test could set it, so the enabled-path assertions saw a disabled
feature. The test now force-reloads config + the session modules with the flag
set (and restores the module cache afterward), so it is robust to suite load order.
2026-07-14 20:22:34 -04:00
Sam Machin fa93259683 kill s2s sessions (#1566)
* kill s2s sessions

* undo
2026-07-14 09:18:25 -04:00
Dave Horton 5fe73b0051 Revert "feat: surface in-dialog hold/un-hold to the application (#1560)" (#1563)
This reverts commit edc6d6b208.
2026-07-09 09:44:06 -04:00
Joe Heung edc6d6b208 feat: surface in-dialog hold/un-hold to the application (#1560)
Applications currently have no way to observe a mid-call hold/un-hold.
The feature-server handles the in-dialog re-INVITE internally (re-modifies
the endpoint, returns 200) but never notifies the app, so a transcription
or agent-assist app can't pause/resume when a caller is held or retrieved.

This detects the hold state transition on a re-INVITE and delivers it over
the existing sipRequestWithinDialogHook channel as a verb:hook, plus emits
a local 'hold'/'unhold' event so in-process tasks (e.g. transcribe) can react.

- call-session.js: ordinary calls — reuse isOnhold() (a=sendonly/a=inactive).
- siprec-call-session.js: SIPREC overrides _onReinvite, so a separate handler
  is required. SIPREC recording streams are sendonly by nature, so a stream
  flipping to a=inactive is treated as the hold signal; the full multipart
  body (SDP + rs-metadata) is always forwarded. Fires on transition only;
  other re-INVITEs are delivered as event:"reinvite".

Delivery uses requestor.request('verb:hook', ...) — the same channel
_handleRefer uses — rather than a task-bound performHook, so events are not
dropped if the current task has ended. Enable per call with:
  {"verb":"config","sipRequestWithinDialogHook":"/hold-events"}

Confirmed live against Cisco CUBE (Cisco-SIPGateway/IOS-17.12.7b) over SIPREC:
both recording streams flip sendonly<->inactive on hold/resume, each
transition emitted correctly.

The whole feature is opt-in behind the JAMBONES_HOLD_UNHOLD_EVENTS env var;
when it is unset, _notifyHoldState / _notifySipRecReinvite are no-ops (neither
the local event nor the hook fires).
2026-07-09 09:29:19 -04:00
Dave HortonandClaude Opus 4.8 01827ff955 fix(deps): drop conflicting utf-8-validate/bufferutil optionalDependencies
The optionalDependencies pinned utf-8-validate ^6.0.3, but ws@8 only
accepts ^5.0.2 as its optional peer and ibm-watson's websocket dep
hard-requires ^5.0.2. That 5.x-vs-6.x split forced a dual-version tree
that npm 10 and npm 11 lay out differently, so a lockfile generated with
npm 11 (local) failed 'npm ci' under npm 10 (CI, node 20) with
'Missing: utf-8-validate@5.0.10 from lock file'. The 6.x pin never
accelerated ws anyway. Removing it collapses to a single utf-8-validate
5.0.10 that both npm majors resolve identically.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
v0.9.7
2026-07-09 08:06:44 -04:00
Dave Horton e17f559a08 bump version 2026-07-09 07:34:30 -04:00
Sam Machin 521a89e5f3 Update gather.js (#1557)
* Update gather.js

* use spread
2026-06-23 07:38:20 -04:00
Hoan Luu Huu 81601a290d update realtimedb-helper (#1555)
* update realtimedb-helper

* update realtimedb-helper
2026-06-15 21:24:29 -04:00
Hoan Luu Huu 44fbd91053 fixed listern verb terminated due to background task listen failure,teardown wrong handler as well (#1554) 2026-06-05 07:48:44 -04:00
Sam Machin d84690dfb1 add custom nye headers to completed hook (#1552) 2026-05-21 10:02:28 -04:00
Hoan Luu Huu c1a7f1146a sync google s2s from jambonz version 10 (#1551) 2026-05-20 20:50:15 -04:00
Hoan Luu Huu cb581f9be7 support recognizer.googleOptions.parentPath (#1546)
* support recognizer.googleOptions.parentPath

* update vẻb specification

* wip
2026-05-13 08:33:51 -04:00
Hoan Luu Huu 423c070900 fixed HTTP llm.toolHook does not support openAI (#1547) 2026-05-06 08:47:04 -07:00
Hoan Luu Huu 4b8fc65cdb support houndify ws (#1540) 0.9.7-rc1 v0.9.7-rc1 2026-04-23 07:19:39 -04:00
Hoan Luu Huu 570641fe07 update drachtio srf 5.0.21 (#1537) 2026-04-13 21:52:14 -04:00
Dave Horton 4f373d2fbc bump version v0.9.6 2026-03-31 07:43:27 -04:00
Sam MachinandDave Horton 24d9740618 add x-reason to sip-decline (#1518)
* add x-ver to sip-decline

* lint

* Update sip_decline.js

---------

Co-authored-by: Dave Horton <daveh@beachdognet.com>
0.9.6
2026-03-29 16:19:15 -04:00
39746598b5 add null check for eventHook (#1534)
* add null check for eventHook

* move guard to superclass, remove logging that adds no value

---------

Co-authored-by: rhonda hollis <rhonda@jambonz.org>
Co-authored-by: Dave Horton <daveh@beachdognet.com>
2026-03-29 16:13:35 -04:00
Sam MachinandDave Horton 315eb98d86 add sp_sid to alerts (#1533)
* add sp_sid to alerts

* bump time-series

---------

Co-authored-by: Dave Horton <daveh@beachdognet.com>
2026-03-29 16:07:08 -04:00
Dave Horton df30496dac fix uncaught exception referencing this.ep in freeswitch hangup scenario (#1532) 2026-03-27 08:31:32 -04:00
Sam Machin 5d6751782a Fix/hangup call (#1530)
* Update error.js

* Update error.js
2026-03-26 08:20:28 -04:00
rhondahollisandrhonda hollis 6147ec3f6a ensure sbcCallId is added to callInfo (#1529)
Co-authored-by: rhonda hollis <rhonda@jambonz.org>
2026-03-25 17:00:05 -04:00
Ed Robbins 18a13971ca respond to re-INVITE during race condition. (#1527) v0.9.6-rc6 2026-03-20 10:41:07 -04:00
Dave Horton 5bd1c53f7d fixed faulty commit https://github.com/jambonz/jambonz-feature-server/pull/1528 2026-03-20 09:17:00 -04:00
Anton Voylenko 5a759791f9 chore: bump node (#1528) 2026-03-20 08:57:16 -04:00
Sam Machin 1f5fa8d49e Update gather.js (#1526) 2026-03-19 15:29:03 -04:00
Anton Voylenko cf0b392c99 Append sip realm for rest dial (#1525)
* feat: append sip realm for rest dial

* fix: check account sip realm
2026-03-17 07:30:21 -04:00
Anton Voylenko 68339ced0b fix: conference mute and mute status (#1218) v0.9.6-rc5 2026-03-12 07:55:49 -04:00
Ed Robbins 1560efaf03 remove sensitive data from log statement (#1522) v0.9.6-rc4 2026-03-05 10:04:20 -05:00
Dave Horton 782ce8154e update drachtio-srf (#1521) 2026-03-05 09:33:59 -05:00
Dave Horton 0267acf9e1 anchor media on dial if we are recording (#1520) 2026-02-23 18:13:25 -05:00
rhondahollisandrhonda hollis 9090006703 update drachtio-srf to v5.0.19 (#1519)
Co-authored-by: rhonda hollis <rhonda@jambonz.org>
2026-02-20 16:19:28 -05:00
Hoan Luu HuuandDave Horton d7beaa1b7b Feat/dialogflow cx (#7) (#1516)
* wip

* wip

* wip

* wip

* logging

* wip

* wip

* wip

* update docker env to latest freeswitch

* wip

* lint

* wip

* support dialogflowcx

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

---------

Co-authored-by: Dave Horton <daveh@beachdognet.com>
v0.9.6-rc3
2026-02-12 07:46:36 -05:00
Dave Horton 45d0ca87af update drachtio-srf (#1515) v0.9.6-rc2 2026-02-09 10:31:43 -05:00
Sam Machin bd435dfff9 add deep copy (#1511)
* escape tag data in listen

* deep copy call data for listen
2026-02-03 10:44:26 -05:00
Sam Machin b598cd94ae escape tag data in listen (#1510) 2026-02-03 07:35:15 -05:00
Matt HertogsandClaude Sonnet 4.5 ceb9a7a3bd Fix boostAudioSignal parameter in Update Call REST API (#1490)
Corrects the parameter passed to _lccBoostAudioSignal to use
opts.boostAudioSignal instead of the entire opts object, ensuring
the boostAudioSignal option works correctly.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
v0.9.6-rc1
2026-01-29 13:58:14 -05:00
Dave Horton ff5f9acaf8 on dial do not reinvite A leg on answer if already answered and we are anchoring media (#1508) 2026-01-29 13:47:53 -05:00
Sam Machin 96cdc2936b invert default (#1507) 2026-01-29 09:22:00 -05:00
Hoan Luu Huu 6120dcbe96 support openai transcribe turn_detection.eagerness (#1496) v0.9.5-11 2026-01-28 08:09:01 -05:00
Hoan Luu Huu 96d72216e2 support google s2s host, version, sessionResumption (#1498) 2026-01-28 08:01:53 -05:00
Hoan Luu Huu faee30278b support mod_google_tts_streaming (#1409)
* support mod_google_tts_streaming

* wip

* wip
2026-01-27 08:18:47 -05:00
Hoan Luu Huu 325af42946 speechmatics support end_of_utterance_silence_trigger (#1499)
* speechmatics support end_of_utterance_silence_trigger

* wip
2026-01-23 10:11:58 -05:00
Hoan Luu Huu 9848152d5b support google gemini tts (#1491)
* support google gemini tts

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* update speech utils version

* wip
2026-01-22 10:12:06 -05:00
Sam Machin 2468557aef add statusHook to redirect verb (#1500)
* add statusHook to redirect

* fix url import

* Update redirect.js

* logging

* constructor statusHook

* lint n logging

* debug

* update call_status_hook

* use notifier to test url

* remove require url as its global since node 10

* update verb specs dep

* update verb specs
2026-01-21 09:20:47 -05:00
Dave Horton 3c3dfa81d3 fix issue where call hangs up and actionhook delay triggered (#1497) 2026-01-19 16:42:43 -05:00
Vinod Dharashive 961c2589ac freeswitch capture sip error and propagate the same error (#1489)
* fix: propagate SIP 488 error to SBC on endpoint allocation failure

When FreeSWITCH returns a SIP 488 'Not Acceptable Here' error during
endpoint allocation (e.g., codec incompatibility), this error was not
being propagated back to the SBC/client. Instead, the call would wait
indefinitely for websocket commands or return a generic 603 response.

Implementation:
- In _evalEndpointPrecondition(), detect SipError by checking
  err.type === 'SipError' or err.name === 'SipError'
- Extract the SIP status code (e.g., 488), reason, and the Reason
  header from the error response (e.g., Q.850;cause=88;text=INCOMPATIBLE_DESTINATION)
- Send the SIP error response immediately to the SBC with:
  - X-Reason header: endpoint allocation failure details
  - Reason header: original Q.850 cause from FreeSWITCH
- Notify call status change as Failed with proper SIP status
- Release the call immediately instead of waiting for commands

Also added fallback handling in InboundCallSession._onTasksDone() to
propagate the stored error if immediate send was not possible.

* wip

* Simplify SipError check to only use err.name
v0.9.5-10
2026-01-13 08:58:37 -05:00