Feat/inbound telephony (#113)

* feat: inbound telephony (twilio & vobiz)

* chore: add ruff and lint formatting

* fix: add missing cloudonix interface compliance implementation
This commit is contained in:
Sabiha Khan 2026-01-12 10:10:30 +05:30 committed by GitHub
parent b79bc4221d
commit 97fbd9b37b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
22 changed files with 1998 additions and 40 deletions

View file

@ -216,6 +216,7 @@ export function WorkflowExecutions({ workflowId, searchParams }: WorkflowExecuti
<TableHead className="font-semibold">ID</TableHead>
<TableHead className="font-semibold">Status</TableHead>
<TableHead className="font-semibold">Created At</TableHead>
<TableHead className="font-semibold">Call Type</TableHead>
<TableHead className="font-semibold">Duration</TableHead>
<TableHead className="font-semibold">Disposition</TableHead>
<TableHead className="font-semibold">Dograh Token</TableHead>
@ -236,6 +237,11 @@ export function WorkflowExecutions({ workflowId, searchParams }: WorkflowExecuti
</Badge>
</TableCell>
<TableCell className="text-sm">{formatDate(run.created_at)}</TableCell>
<TableCell>
<Badge variant={run.call_type === 'inbound' ? "secondary" : "default"}>
{run.call_type === 'inbound' ? 'Inbound' : 'Outbound'}
</Badge>
</TableCell>
<TableCell className="text-sm">
{typeof run.cost_info?.call_duration_seconds === 'number'
? `${run.cost_info.call_duration_seconds.toFixed(1)}s`

View file

@ -31,7 +31,7 @@ export default function CreateWorkflowPage() {
const [showSuccessModal, setShowSuccessModal] = useState(false);
const [workflowId, setWorkflowId] = useState<string | null>(null);
const [callType, setCallType] = useState<'INBOUND' | 'OUTBOUND'>('INBOUND');
const [callType, setCallType] = useState<'inbound' | 'outbound'>('inbound');
const [useCase, setUseCase] = useState('');
const [activityDescription, setActivityDescription] = useState('');
@ -128,15 +128,15 @@ export default function CreateWorkflowPage() {
<CardContent className="space-y-6">
<div className="space-y-2">
<Label htmlFor="call-type">Call Type</Label>
<Select value={callType} onValueChange={(value) => setCallType(value as 'INBOUND' | 'OUTBOUND')}>
<Select value={callType} onValueChange={(value) => setCallType(value as 'inbound' | 'outbound')}>
<SelectTrigger id="call-type">
<SelectValue placeholder="Select type" />
</SelectTrigger>
<SelectContent>
<SelectItem value="INBOUND">
<SelectItem value="inbound">
Inbound (Users call AI)
</SelectItem>
<SelectItem value="OUTBOUND">
<SelectItem value="outbound">
Outbound (AI calls users)
</SelectItem>
</SelectContent>