EAPI=8 inherit cmake DESCRIPTION="Attendant in C++ (0.6.1: signed SMS webhook): attendant (web and control), attendantd (AudioSocket) and attendant-text" # USE=speech adds attendant-speech, the local speech engines (Parakeet speech to text, Kokoro # text to speech) attendantd can use instead of whisper-server and Cartesia. HOMEPAGE="https://trunkmasters.com/attendant" SRC_URI="https://www.hedronfire.com/distfiles/${P}.tar.gz" # The application carries no grant of an open-source license. LICENSE="all-rights-reserved" SLOT="0" KEYWORDS="~amd64" IUSE="speech" RESTRICT="mirror bindist" DEPEND=" =dev-libs/boost-1.91.0* =dev-libs/openssl-3.6.5* =dev-db/postgresql-18.6* =dev-cpp/nlohmann_json-3.12.0* sys-libs/libxcrypt speech? ( =sci-libs/onnxruntime-1.29.0* =app-accessibility/espeak-ng-1.52.0* ) " # They run as the existing `attendant` account; attendant-rs mails the owner through sendmail and # calls Anthropic's API, attendantd calls Cartesia and Deepgram, over HTTPS with the system trust # store. RDEPEND="${DEPEND} virtual/mta app-misc/ca-certificates speech? ( net-misc/curl sci-ml/kokoro-82m-onnx sci-ml/parakeet-tdt-v2-onnx ) " BDEPEND=" =dev-cpp/catch-3.15.3* " src_configure() { # The project refuses in-source builds and requires an absolute build root. export ATTENDANT_BUILD_ROOT="${WORKDIR}/build" local mycmakeargs=( -DATTENDANT_SANITIZER=none -DATTENDANT_SPEECH=$(usex speech) ) cmake_src_configure } src_test() { # The parity suites need root, PostgreSQL and the Rust reference binaries; they run outside # the Portage sandbox (README, "Build and test"). cmake_src_test -R "^(unit|attendantd_unit$(usev speech '|speech_unit'))\$" } src_install() { cmake_src_install newinitd "${ED}"/usr/share/attendant/openrc/attendant.initd attendant newconfd "${ED}"/usr/share/attendant/openrc/attendant.confd attendant newinitd "${ED}"/usr/share/attendant/openrc/attendantd.initd attendantd newconfd "${ED}"/usr/share/attendant/openrc/attendantd.confd attendantd if use speech; then newinitd "${ED}"/usr/share/attendant/openrc/attendant-speech.initd attendant-speech newconfd "${ED}"/usr/share/attendant/openrc/attendant-speech.confd attendant-speech fi } pkg_postinst() { elog "attendant (attendant-rs until 0.3.0) runs as attendant on /run/attendant/http.socket and" elog "serves its pages from /srv/attendant/public (the source repository). Its settings are" elog "/etc/conf.d/attendant, with the ATTENDANT_RS_* names of attendant-rs's conf.d renamed" elog "ATTENDANT_* (the old names are still read when the new ones are unset)." elog "attendantd runs as attendant on 127.0.0.1:9093 and needs attendant. An existing" elog "/etc/init.d/attendantd and the conf.d files are kept (CONFIG_PROTECT)." if use speech; then elog "attendant-speech (USE=speech) serves Parakeet and Kokoro on 127.0.0.1:8125; it is not" elog "started or added to a runlevel by the package. attendantd uses it when a claim names" elog "the tts provider \"local\", or an stt provider whisper with the url http://127.0.0.1:8125." fi elog "0.4.1: the whisper provider's stt_config keys barge_in_frames and barge_in_resume (unset," elog "attendantd stops a reply at the caller's first sound, as before) make the caller's speech" elog "hold a reply, and only words stop it; Kokoro says phone numbers and codes digit by digit." elog "0.4.2: a transfer asks Asterisk for the phone's DEVICE_STATE first (AMI Getvar, the AMI user" elog "needs call or reporting write); UNAVAILABLE, INVALID or BUSY keep the caller with the AI." elog "0.4.3: a transfer is said before the call moves: AMI Setvar of AI_TRANSFER_TO on the channel," elog "attendantd hangs up after the answer, and [ai-switchboard] must go on to [ai-transfer] when" elog "AI_TRANSFER_TO is set (the dialplan before attendant 0.4.3; attendantd before attendant)." elog "0.4.4: no built-in ATTENDANT_OWNER_DID_DEFAULT (the number texts go from when a tenant has" elog "none). Set it in /etc/conf.d/attendant and /etc/conf.d/attendantd before restarting." elog "0.6.1: /api/v1/webhook/sms accepts only requests Telnyx signed. Set ATTENDANT_TELNYX_PUBLIC_KEY" elog "(the Texting app's TELNYX_PUBLIC_KEY) in /etc/conf.d/attendant; without it the webhook answers 503." }