ワンクリックで
active-calls
Get a real-time snapshot of all active calls and queue activity via the Voicenter Active Calls API
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Get a real-time snapshot of all active calls and queue activity via the Voicenter Active Calls API
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Designs the structural skeleton of a Voicenter Bot via interview. Use this skill when the user wants to create, design, scope, or modify a Voicenter voice/chat bot — phrases like "design a bot", "create an agent spec", "build a Voicenter bot", "patch this bot", "add an intent", "change the bot's persona", "modify the flow graph", or any reference to the Agent Spec Designer / Skill 1 in the Voicenter bot generation pipeline. Produces an Agent Spec markdown file (sections 1-4, 4.5, section 5 stubs, section 6 initial, section 7 init). Two named entry modes — greenfield (no spec attached) and patch (spec attached). Does NOT author per-intent language content (validationPrompt, post-execution intentInstructions) — that's Skill 2 (Intent Detail Author). Does NOT emit wire-format JSON — that's Skill 3 (JSON Assembler).
Assembles a fully-detailed Voicenter Agent Spec into Bot JSON wire format — the final mechanical step in the three-skill pipeline. Use this skill when an Agent Spec exists with all section 5 entries marked `[detailed]` and the user wants the deployable JSON. Trigger phrases include "run Skill 3", "assemble the JSON", "emit the bot JSON", "publish the bot", "build the wire-format", "Skill 3 (JSON Assembler)", or any direct continuation from Skill 2's completion handoff. Produces a single `bot-<name>-<date>.json` file plus a banner identifying every fail-loud sentinel and any drift between spec section 6 and what Skill 3 regenerated. Refuses to assemble if any intent is still `[structural]` or `[detailed-revisit]`, or if the spec deviates from the strict template (Doc 2 §3.7). Runs the §15.4 cross-reference pass — 23 checks (8 §15.4 + 3 Compass + 3 botIntents-role + 1 duplicate-global-intent + 8 field-placement doctrine), checks 1–7, 11–13, 15, and 16–21 blocking. Does NOT author any text content (Skills 1 and
Authors the per-intent language content of a Voicenter Agent Spec — slot descriptions, validationPrompt, post-execution intentInstructions, and RT-specific Configuration text. Use this skill when an Agent Spec exists with section 5 entries marked `[structural]` or `[detailed-revisit]`, and the user wants to fill them in. Trigger phrases include "run Skill 2", "detail the intents", "fill in the per-intent fields", "Skill 2 (Intent Detail Author)", or any direct continuation from Skill 1's handoff hint. Walks intents in user-confirmed batches with a checkpoint after each batch. Reactivable — invoke as many times as needed; spec state is the resume point. Does NOT modify the structural skeleton (sections 1, 2, 3, 4, 4.5.1/.2/.4) — that's Skill 1 (Agent Spec Designer). Does NOT emit wire-format JSON — that's Skill 3 (JSON Assembler).
Pull call detail records (CDR) from Voicenter using the Call Log API
Receive and handle CDR push notifications from Voicenter after every call ends
Initiate or terminate outgoing calls using the Voicenter Click2Call API
| name | active-calls |
| description | Get a real-time snapshot of all active calls and queue activity via the Voicenter Active Calls API |
Language. Reply in the user's language: detect what they write — Hebrew→Hebrew, English→English — and mirror it, switching if they switch mid-conversation. This shapes your prose, your questions, and your
AskUserQuestionoption labels only. It does not change the artifacts you produce — identifiers, JSON keys, BCP-47 language codes, API field names, and other data stay exactly as specified.
Help the developer query live call state — who is on a call right now, what extensions are active, and how many callers are waiting in queues — using simple HTTP requests (no socket connection required).
Use this skill when the user wants to:
VOICENTER_API_CODE=your_api_token_here
| Method | URI |
|---|---|
| Active calls per extension | https://monapisec.voicenter.co.il/comet/API/GetExtensionsCalls |
| Callers waiting in queues | https://monapisec.voicenter.co.il/comet/API/GetQueuesCallers |
Both accept: GET or POST-JSON
Response: JSON
Authentication: code field in the request body.
Returns the current call state for all extensions (or one specific extension).
{
"code": "XXXXXXXXXXXXX",
"extension": "SIPSIP1"
}
Omit extension to get all extensions.
https://monapisec.voicenter.co.il/comet/API/GetExtensionsCalls?code=XXXXX&extension=SIPSIP1
{
"ERR": 0,
"DESC": "OK",
"EXTENSIONS": [
{
"name": "User 1",
"representative": "User 1",
"username": "SIPSIP1",
"extensionID": 875756567,
"userID": 6946792,
"onlineUserID": 0,
"onlineUserStatus": 2,
"calls": []
},
{
"name": "User 2",
"representative": "User 2",
"username": "SIPSIP2",
"extensionID": 97483478,
"userID": 46454322,
"onlineUserID": 46454322,
"onlineUserStatus": 1,
"calls": [
{
"callStarted": 1602465818,
"callAnswered": 1602465819,
"answered": 1,
"callername": "Voicenter",
"callerphone": "0722776772",
"callstatus": "Talking",
"customdata": {},
"direction": "Outgoing",
"ivrid": "2020101201cc7b38df",
"recording": { "Filename": "2020101201cc7b38df-aws-SIPSIP2-972722776772.mp3", "IsMuted": 0 },
"did": ""
}
]
}
]
}
| Field | Description |
|---|---|
username | SIP code of the extension |
name | User name assigned to the extension |
representative | Currently logged-in user name |
onlineUserID | User ID of currently logged-in user (0 if no one logged in) |
onlineUserStatus | Agent status: 1=Login, 2=Logout, 3=Lunch, 5=Admin, 7=Private, 9=Other, 11=Training, 12=Team meeting, 13=Brief |
calls | Array of active calls (empty if no active calls) |
| Field | Description |
|---|---|
callStarted | Call start time (Epoch) |
callAnswered | Call answer time (Epoch), 0 if not yet answered |
answered | 0 = ringing/dialing, 1 = answered |
callerphone | Caller's phone number |
callstatus | Ringing, Dialing, Talking, Hold |
direction | Incoming or Outgoing |
ivrid | Unique call ID |
recording.IsMuted | 0 = recording, 1 = muted |
did | DID dialed (incoming calls only) |
Returns the callers currently waiting in queues.
{
"code": "XXXXXXXXXXXXX",
"queue": "12345678"
}
Omit queue to get all queues.
{
"ERR": 0,
"DESC": "OK",
"QUEUES": [
{
"Name": "Sales Queue",
"ID": 12345678,
"Weight": 5,
"Callers": [
{
"Phone": "0722776772",
"CallID": "202010131430590714966",
"JoinTime": 1602599565,
"Duration": 21
}
]
},
{
"Name": "Support Queue",
"ID": 87654321,
"Weight": 0,
"Callers": []
}
]
}
| Field | Description |
|---|---|
Name | Queue name |
ID | Queue ID |
Weight | Queue priority weight |
Callers | Array of waiting callers |
Callers[].Phone | Caller's phone number |
Callers[].CallID | Unique call ID |
Callers[].JoinTime | When caller entered the queue (Epoch) |
Callers[].Duration | Seconds the caller has been waiting |
| ERR | DESC |
|---|---|
| 0 | OK |
| 1 | Invalid request format |
| 2 | Invalid parameters or internal error |
const ACTIVE_CALLS_BASE = 'https://monapisec.voicenter.co.il/comet/API';
const CODE = process.env.VOICENTER_API_CODE!;
interface ActiveCall {
callStarted: number;
callAnswered: number;
answered: 0 | 1;
callerphone: string;
callstatus: 'Ringing' | 'Dialing' | 'Talking' | 'Hold';
direction: 'Incoming' | 'Outgoing';
ivrid: string;
recording: { Filename: string; IsMuted: 0 | 1 };
did: string;
}
interface ExtensionCalls {
name: string;
representative: string;
username: string;
userID: number;
onlineUserStatus: number;
calls: ActiveCall[];
}
interface QueueCaller {
Phone: string;
CallID: string;
JoinTime: number;
Duration: number;
}
async function getExtensionCalls(extension?: string): Promise<ExtensionCalls[]> {
const res = await fetch(`${ACTIVE_CALLS_BASE}/GetExtensionsCalls`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code: CODE, ...(extension && { extension }) }),
});
const data = await res.json();
if (data.ERR !== 0) throw new Error(`Active Calls error: ${data.DESC}`);
return data.EXTENSIONS;
}
async function getQueueCallers(queue?: string) {
const res = await fetch(`${ACTIVE_CALLS_BASE}/GetQueuesCallers`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code: CODE, ...(queue && { queue }) }),
});
const data = await res.json();
if (data.ERR !== 0) throw new Error(`Queue Callers error: ${data.DESC}`);
return data.QUEUES;
}
// Wallboard: poll every 10 seconds
async function updateWallboard() {
const [extensions, queues] = await Promise.all([
getExtensionCalls(),
getQueueCallers(),
]);
const activeCalls = extensions.filter(e => e.calls.length > 0);
const totalWaiting = queues.reduce((sum: number, q: any) => sum + q.Callers.length, 0);
console.log(`Active calls: ${activeCalls.length} | Waiting in queues: ${totalWaiting}`);
return { extensions, queues };
}
setInterval(updateWallboard, 10_000);
// CRM: check if agent is currently on a call when they open a customer record
async function checkAgentCurrentCall(extensionSip: string) {
const [ext] = await getExtensionCalls(extensionSip);
if (ext?.calls.length > 0) {
const call = ext.calls[0];
return {
active: true,
caller: call.callerphone,
ivrid: call.ivrid,
duration: Date.now() / 1000 - call.callStarted,
};
}
return { active: false };
}
onlineUserStatus: 2 (Logout) is the default for extensions with no logged-in user.Callers[].Duration to detect long-waiting callers and trigger supervisor alerts.recording.IsMuted: 1 combined with the Mute Recording API lets you toggle recording from a CRM button.ivrid field links this call to CDR Notification, Call Log, and Pop-Up Screen events.ivrid from this APIivrid