@happ-ai/platform-mcp 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/cli.js +64 -0
  2. package/dist/cli.js.map +1 -0
  3. package/dist/config.js +7 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/credentials.js +48 -0
  6. package/dist/credentials.js.map +1 -0
  7. package/dist/http.js +90 -0
  8. package/dist/http.js.map +1 -0
  9. package/dist/index.js +59 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/login.js +76 -0
  12. package/dist/login.js.map +1 -0
  13. package/dist/tools/activity.tools.js +34 -0
  14. package/dist/tools/activity.tools.js.map +1 -0
  15. package/dist/tools/analytics.tools.js +162 -0
  16. package/dist/tools/analytics.tools.js.map +1 -0
  17. package/dist/tools/assistant-tools.tools.js +86 -0
  18. package/dist/tools/assistant-tools.tools.js.map +1 -0
  19. package/dist/tools/assistants.tools.js +179 -0
  20. package/dist/tools/assistants.tools.js.map +1 -0
  21. package/dist/tools/auth.tools.js +44 -0
  22. package/dist/tools/auth.tools.js.map +1 -0
  23. package/dist/tools/calls.tools.js +99 -0
  24. package/dist/tools/calls.tools.js.map +1 -0
  25. package/dist/tools/channels.tools.js +158 -0
  26. package/dist/tools/channels.tools.js.map +1 -0
  27. package/dist/tools/chats.tools.js +171 -0
  28. package/dist/tools/chats.tools.js.map +1 -0
  29. package/dist/tools/companies.tools.js +180 -0
  30. package/dist/tools/companies.tools.js.map +1 -0
  31. package/dist/tools/folders.tools.js +71 -0
  32. package/dist/tools/folders.tools.js.map +1 -0
  33. package/dist/tools/knowledge.tools.js +71 -0
  34. package/dist/tools/knowledge.tools.js.map +1 -0
  35. package/dist/tools/phones.tools.js +92 -0
  36. package/dist/tools/phones.tools.js.map +1 -0
  37. package/dist/tools/result.js +7 -0
  38. package/dist/tools/result.js.map +1 -0
  39. package/package.json +40 -0
@@ -0,0 +1,86 @@
1
+ import { z } from "zod";
2
+ import { happRequest } from "../http.js";
3
+ import { jsonResult } from "./result.js";
4
+ const toolParamSchema = z
5
+ .object({
6
+ name: z.string().describe("Имя параметра"),
7
+ type: z.string().describe("Тип: string | number | boolean | object | array"),
8
+ isRequired: z.boolean().describe("Обязателен ли параметр"),
9
+ description: z.string().optional().describe("Что LLM должна положить в параметр"),
10
+ value_type: z.enum(["llm_prompt", "constant", "dynamic_variable"]).optional(),
11
+ constant_value: z.union([z.string(), z.number(), z.boolean()]).optional(),
12
+ dynamic_variable: z.string().optional()
13
+ })
14
+ .passthrough();
15
+ const toolConfigShape = {
16
+ description: z.string().optional().describe("Описание инструмента — LLM решает по нему, когда вызывать"),
17
+ type: z
18
+ .enum(["webhook_init", "webhook_action", "webhook_postcall", "webhook_client", "system"])
19
+ .optional()
20
+ .describe("Тип инструмента (по умолчанию webhook_action)"),
21
+ apiCallUrl: z.string().optional().describe("URL вебхука, который дергается при вызове"),
22
+ httpMethod: z.enum(["get", "post", "put", "delete", "patch"]).optional().describe("HTTP-метод вебхука"),
23
+ executionMode: z.enum(["immediate", "post_tool_speech", "async"]).optional().describe("Режим выполнения"),
24
+ disabled: z.boolean().optional().describe("Выключить инструмент"),
25
+ webhookSecret: z.string().optional().describe("Секрет для подписи вебхука"),
26
+ params: z.array(toolParamSchema).optional().describe("Параметры, которые LLM передаёт в инструмент")
27
+ };
28
+ export function registerAssistantToolsTools(server) {
29
+ server.registerTool("happ_tools_list", {
30
+ title: "Инструменты ассистента",
31
+ description: "Список инструментов (function-calling tools) ассистента (GET /assistant-tools-new).",
32
+ inputSchema: {
33
+ assistantId: z.string().uuid().optional().describe("Фильтр по ассистенту"),
34
+ search: z.string().optional().describe("Поиск по имени")
35
+ }
36
+ }, async ({ assistantId, search }) => {
37
+ const result = await happRequest("GET", "/assistant-tools-new", { params: { assistantId, search } });
38
+ return jsonResult(result);
39
+ });
40
+ server.registerTool("happ_tool_get", {
41
+ title: "Инструмент ассистента",
42
+ description: "Детали инструмента по id (GET /assistant-tools-new/:id): вебхук, параметры, режим выполнения.",
43
+ inputSchema: {
44
+ toolId: z.string().uuid().describe("ID инструмента")
45
+ }
46
+ }, async ({ toolId }) => {
47
+ const tool = await happRequest("GET", `/assistant-tools-new/${toolId}`);
48
+ return jsonResult(tool);
49
+ });
50
+ server.registerTool("happ_tool_create", {
51
+ title: "Создать инструмент",
52
+ description: "Создаёт инструмент (function-calling tool) для ассистента (POST /assistant-tools-new) — обычно вебхук, который ассистент вызывает во время диалога (запись на приём, проверка заказа и т.п.).",
53
+ inputSchema: {
54
+ assistantId: z.string().uuid().describe("ID ассистента"),
55
+ name: z.string().describe("Имя инструмента (латиницей, snake_case)"),
56
+ ...toolConfigShape
57
+ }
58
+ }, async (input) => {
59
+ const tool = await happRequest("POST", "/assistant-tools-new", { body: input });
60
+ return jsonResult(tool);
61
+ });
62
+ server.registerTool("happ_tool_update", {
63
+ title: "Обновить инструмент",
64
+ description: "Обновляет инструмент ассистента (PATCH /assistant-tools-new/:id).",
65
+ inputSchema: {
66
+ toolId: z.string().uuid().describe("ID инструмента"),
67
+ name: z.string().optional().describe("Новое имя"),
68
+ ...toolConfigShape
69
+ }
70
+ }, async ({ toolId, ...rest }) => {
71
+ const body = Object.fromEntries(Object.entries(rest).filter(([, v]) => v !== undefined));
72
+ const tool = await happRequest("PATCH", `/assistant-tools-new/${toolId}`, { body });
73
+ return jsonResult(tool);
74
+ });
75
+ server.registerTool("happ_tool_delete", {
76
+ title: "Удалить инструмент",
77
+ description: "Удаляет инструмент ассистента (DELETE /assistant-tools-new/:id).",
78
+ inputSchema: {
79
+ toolId: z.string().uuid().describe("ID инструмента")
80
+ }
81
+ }, async ({ toolId }) => {
82
+ const result = await happRequest("DELETE", `/assistant-tools-new/${toolId}`);
83
+ return jsonResult(result);
84
+ });
85
+ }
86
+ //# sourceMappingURL=assistant-tools.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant-tools.tools.js","sourceRoot":"","sources":["../../src/tools/assistant-tools.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ import { z } from "zod";
2
+ import { happRequest } from "../http.js";
3
+ import { jsonResult } from "./result.js";
4
+ const CATALOG_BASE = "/assistants-new/catalog";
5
+ const domainConfigShape = {
6
+ promptText: z.string().optional().describe("Системный промпт (инструкции) ассистента"),
7
+ firstMessage: z.string().optional().describe("Первое сообщение ассистента"),
8
+ language: z.string().optional().describe("Язык ассистента, например 'ru' или 'uk'")
9
+ };
10
+ const vaConfigShape = {
11
+ providerType: z
12
+ .string()
13
+ .optional()
14
+ .describe("Тип голосового провайдера из каталога (happ_voices_list/happ_llm_models_list), например 'elevenlabs' или 'gemini'"),
15
+ voiceLlmModelId: z
16
+ .string()
17
+ .optional()
18
+ .describe("ID голосовой модели из VA-каталога (happ_llm_models_list) — строка, не UUID"),
19
+ textLlmModelId: z.string().optional().describe("ID текстовой модели из VA-каталога"),
20
+ voiceId: z.string().optional().describe("ID голоса из VA-каталога (happ_voices_list)")
21
+ };
22
+ // Provider resolution mirrors the client's create dialog: pick the requested
23
+ // provider from the catalog (or the first one), then default voice/model to the
24
+ // first catalog entries for it.
25
+ async function resolveVaRegistration(input) {
26
+ const providers = (await happRequest("GET", `${CATALOG_BASE}/providers`));
27
+ const provider = (input.providerType && providers.find((p) => p.type === input.providerType)) ?? providers[0];
28
+ if (!provider) {
29
+ throw new Error("VA catalog returned no providers — cannot create assistant");
30
+ }
31
+ let voiceId = input.voiceId;
32
+ let voiceLlmModelId = input.voiceLlmModelId;
33
+ if (!voiceId) {
34
+ const voices = (await happRequest("GET", `${CATALOG_BASE}/providers/${provider.vaId}/voices`));
35
+ voiceId = voices[0]?.id;
36
+ }
37
+ if (!voiceLlmModelId) {
38
+ const models = (await happRequest("GET", `${CATALOG_BASE}/providers/${provider.vaId}/models`));
39
+ voiceLlmModelId = models[0]?.id;
40
+ }
41
+ return {
42
+ providerType: provider.type,
43
+ ...(voiceLlmModelId ? { voiceLlmModelId } : {}),
44
+ ...(input.textLlmModelId ? { textLlmModelId: input.textLlmModelId } : {}),
45
+ // vaId pins the exact provider instance (two providers can share a type).
46
+ providerConfig: { ...(voiceId ? { vaVoice: voiceId } : {}), vaId: provider.vaId }
47
+ };
48
+ }
49
+ export function registerAssistantsTools(server) {
50
+ server.registerTool("happ_assistants_list", {
51
+ title: "Ассистенты",
52
+ description: "Список ассистентов (GET /assistants-new). Можно фильтровать по компании, папке и искать по имени.",
53
+ inputSchema: {
54
+ companyId: z.string().uuid().optional().describe("ID компании"),
55
+ search: z.string().optional().describe("Поиск по имени"),
56
+ folderId: z.string().uuid().optional().describe("Фильтр по папке"),
57
+ skip: z.number().int().min(0).optional(),
58
+ take: z.number().int().min(1).max(100).optional().describe("Сколько вернуть (по умолчанию все)")
59
+ }
60
+ }, async ({ companyId, search, folderId, skip, take }) => {
61
+ const result = await happRequest("GET", "/assistants-new", {
62
+ params: { companyId, q: search, folderId, skip, take }
63
+ });
64
+ return jsonResult(result);
65
+ });
66
+ server.registerTool("happ_assistant_get", {
67
+ title: "Ассистент",
68
+ description: "Детали ассистента по id (GET /assistants-new/:id): промпт, настройки и VA-регистрация (провайдер, модель, голос, статус синка).",
69
+ inputSchema: {
70
+ assistantId: z.string().uuid().describe("ID ассистента")
71
+ }
72
+ }, async ({ assistantId }) => {
73
+ const assistant = await happRequest("GET", `/assistants-new/${assistantId}`);
74
+ return jsonResult(assistant);
75
+ });
76
+ server.registerTool("happ_assistant_create", {
77
+ title: "Создать ассистента",
78
+ description: "Создаёт AI-ассистента в компании (POST /assistants-new). Обязательны companyId и name. Провайдер/голос/модель берутся из VA-каталога; если не заданы — первый провайдер и его дефолтные голос/модель. Провижининг в VA идёт асинхронно — статус смотри в registration.syncStatus через happ_assistant_get.",
79
+ inputSchema: {
80
+ companyId: z.string().uuid().describe("ID компании"),
81
+ name: z.string().describe("Имя ассистента"),
82
+ ...domainConfigShape,
83
+ ...vaConfigShape
84
+ }
85
+ }, async ({ companyId, name, promptText, firstMessage, language, ...va }) => {
86
+ const vaRegistration = await resolveVaRegistration(va);
87
+ const result = await happRequest("POST", "/assistants-new", {
88
+ body: { companyId, name, promptText, firstMessage, language, vaRegistration }
89
+ });
90
+ return jsonResult(result);
91
+ });
92
+ server.registerTool("happ_assistant_update", {
93
+ title: "Настроить ассистента",
94
+ description: "Обновляет ассистента (PATCH /assistants-new/:id): имя, промпт, первое сообщение, язык; providerType/voiceLlmModelId/voiceId меняют провайдера/модель/голос (пере-синк в VA).",
95
+ inputSchema: {
96
+ assistantId: z.string().uuid().describe("ID ассистента"),
97
+ name: z.string().optional().describe("Новое имя ассистента"),
98
+ ...domainConfigShape,
99
+ ...vaConfigShape
100
+ }
101
+ }, async ({ assistantId, providerType, voiceLlmModelId, textLlmModelId, voiceId, ...rest }) => {
102
+ const body = Object.fromEntries(Object.entries(rest).filter(([, v]) => v !== undefined));
103
+ if (providerType || voiceLlmModelId || textLlmModelId || voiceId) {
104
+ body.vaRegistration = {
105
+ ...(providerType ? { providerType } : {}),
106
+ ...(voiceLlmModelId ? { voiceLlmModelId } : {}),
107
+ ...(textLlmModelId ? { textLlmModelId } : {}),
108
+ ...(voiceId ? { providerConfig: { vaVoice: voiceId } } : {})
109
+ };
110
+ }
111
+ const assistant = await happRequest("PATCH", `/assistants-new/${assistantId}`, { body });
112
+ return jsonResult(assistant);
113
+ });
114
+ server.registerTool("happ_assistant_delete", {
115
+ title: "Удалить ассистента",
116
+ description: "Удаляет ассистента (DELETE /assistants-new/:id). Если он уже запровижинен в VA — вернётся { terminating: true } и запись исчезнет после подтверждения VA; иначе удаляется сразу ({ deleted: true }).",
117
+ inputSchema: {
118
+ assistantId: z.string().uuid().describe("ID ассистента")
119
+ }
120
+ }, async ({ assistantId }) => {
121
+ const result = await happRequest("DELETE", `/assistants-new/${assistantId}`);
122
+ return jsonResult(result);
123
+ });
124
+ server.registerTool("happ_assistant_copy", {
125
+ title: "Копировать ассистента",
126
+ description: "Создаёт копию ассистента со всеми настройками, тулзами и знаниями (POST /assistants-new/:id/copy). providerType переключает провайдера копии.",
127
+ inputSchema: {
128
+ assistantId: z.string().uuid().describe("ID ассистента-оригинала"),
129
+ providerType: z.string().optional().describe("Тип провайдера для копии (по умолчанию как у оригинала)")
130
+ }
131
+ }, async ({ assistantId, providerType }) => {
132
+ const result = await happRequest("POST", `/assistants-new/${assistantId}/copy`, {
133
+ body: providerType ? { vaRegistration: { providerType } } : {}
134
+ });
135
+ return jsonResult(result);
136
+ });
137
+ server.registerTool("happ_assistant_transfer", {
138
+ title: "Перенести ассистента",
139
+ description: "Переносит ассистента в другую компанию (POST /assistants-new/:id/company/:companyId) — копия в целевой компании + безопасное удаление исходного.",
140
+ inputSchema: {
141
+ assistantId: z.string().uuid().describe("ID ассистента"),
142
+ targetCompanyId: z.string().uuid().describe("ID компании-получателя")
143
+ }
144
+ }, async ({ assistantId, targetCompanyId }) => {
145
+ const result = await happRequest("POST", `/assistants-new/${assistantId}/company/${targetCompanyId}`);
146
+ return jsonResult(result);
147
+ });
148
+ server.registerTool("happ_llm_models_list", {
149
+ title: "Каталог LLM-моделей",
150
+ description: "Модели из VA-каталога (GET /assistants-new/catalog/providers/:vaId/models) — их id идут в voiceLlmModelId. Без providerType вернёт модели всех провайдеров.",
151
+ inputSchema: {
152
+ providerType: z.string().optional().describe("Тип провайдера, например 'elevenlabs' или 'gemini'")
153
+ }
154
+ }, async ({ providerType }) => {
155
+ const providers = (await happRequest("GET", `${CATALOG_BASE}/providers`));
156
+ const selected = providerType ? providers.filter((p) => p.type === providerType) : providers;
157
+ const result = await Promise.all(selected.map(async (p) => ({
158
+ provider: p,
159
+ models: await happRequest("GET", `${CATALOG_BASE}/providers/${p.vaId}/models`)
160
+ })));
161
+ return jsonResult(result);
162
+ });
163
+ server.registerTool("happ_voices_list", {
164
+ title: "Каталог голосов",
165
+ description: "Голоса из VA-каталога (GET /assistants-new/catalog/providers/:vaId/voices) — их id идут в voiceId. Без providerType вернёт голоса всех провайдеров.",
166
+ inputSchema: {
167
+ providerType: z.string().optional().describe("Тип провайдера, например 'elevenlabs' или 'gemini'")
168
+ }
169
+ }, async ({ providerType }) => {
170
+ const providers = (await happRequest("GET", `${CATALOG_BASE}/providers`));
171
+ const selected = providerType ? providers.filter((p) => p.type === providerType) : providers;
172
+ const result = await Promise.all(selected.map(async (p) => ({
173
+ provider: p,
174
+ voices: await happRequest("GET", `${CATALOG_BASE}/providers/${p.vaId}/voices`)
175
+ })));
176
+ return jsonResult(result);
177
+ });
178
+ }
179
+ //# sourceMappingURL=assistants.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistants.tools.js","sourceRoot":"","sources":["../../src/tools/assistants.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { clearCredentials, loadCredentials } from "../credentials.js";
2
+ import { happRequest } from "../http.js";
3
+ import { startLogin } from "../login.js";
4
+ import { jsonResult, textResult } from "./result.js";
5
+ export function registerAuthTools(server) {
6
+ server.registerTool("happ_login", {
7
+ title: "Войти в Happ",
8
+ description: "Авторизация на платформе Happ через браузер. Открывает страницу входа, ждёт подтверждения пользователя и сохраняет токены локально. Вызывай, когда пользователь просит залогиниться или когда другие инструменты отвечают 'Не выполнен вход'.",
9
+ inputSchema: {}
10
+ }, async () => {
11
+ const { loginUrl, completion } = await startLogin();
12
+ try {
13
+ const { email } = await completion;
14
+ return textResult(`Вход выполнен${email ? ` как ${email}` : ""}. Токены сохранены в ~/.happ/credentials.json.`);
15
+ }
16
+ catch (error) {
17
+ return textResult(`Не удалось завершить вход: ${error.message}\nСсылка для входа (можно открыть вручную): ${loginUrl}`);
18
+ }
19
+ });
20
+ server.registerTool("happ_whoami", {
21
+ title: "Кто я",
22
+ description: "Показывает текущего авторизованного пользователя Happ (GET /auth/me).",
23
+ inputSchema: {}
24
+ }, async () => {
25
+ const me = await happRequest("GET", "/auth/me");
26
+ return jsonResult({
27
+ id: me.id,
28
+ email: me.email,
29
+ firstName: me.firstName,
30
+ lastName: me.lastName,
31
+ verificationStatus: me.verificationStatus
32
+ });
33
+ });
34
+ server.registerTool("happ_logout", {
35
+ title: "Выйти",
36
+ description: "Удаляет сохранённые токены Happ с этого компьютера.",
37
+ inputSchema: {}
38
+ }, async () => {
39
+ const had = loadCredentials() !== null;
40
+ clearCredentials();
41
+ return textResult(had ? "Токены удалены." : "Токенов и не было — вход не выполнялся.");
42
+ });
43
+ }
44
+ //# sourceMappingURL=auth.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.tools.js","sourceRoot":"","sources":["../../src/tools/auth.tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CAClB,YAAY,EACZ;QACC,KAAK,EAAE,cAAc;QACrB,WAAW,EACV,+OAA+O;QAChP,WAAW,EAAE,EAAE;KACf,EACD,KAAK,IAAI,EAAE;QACV,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;QACpD,IAAI,CAAC;YACJ,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,UAAU,CAAC;YACnC,OAAO,UAAU,CAAC,gBAAgB,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,gDAAgD,CAAC,CAAC;QACjH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,UAAU,CAChB,8BAA+B,KAAe,CAAC,OAAO,+CAA+C,QAAQ,EAAE,CAC/G,CAAC;QACH,CAAC;IACF,CAAC,CACD,CAAC;IAEF,MAAM,CAAC,YAAY,CAClB,aAAa,EACb;QACC,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,uEAAuE;QACpF,WAAW,EAAE,EAAE;KACf,EACD,KAAK,IAAI,EAAE;QACV,MAAM,EAAE,GAAG,MAAM,WAAW,CAA0B,KAAK,EAAE,UAAU,CAAC,CAAC;QACzE,OAAO,UAAU,CAAC;YACjB,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,SAAS,EAAE,EAAE,CAAC,SAAS;YACvB,QAAQ,EAAE,EAAE,CAAC,QAAQ;YACrB,kBAAkB,EAAE,EAAE,CAAC,kBAAkB;SACzC,CAAC,CAAC;IACJ,CAAC,CACD,CAAC;IAEF,MAAM,CAAC,YAAY,CAClB,aAAa,EACb;QACC,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE,EAAE;KACf,EACD,KAAK,IAAI,EAAE;QACV,MAAM,GAAG,GAAG,eAAe,EAAE,KAAK,IAAI,CAAC;QACvC,gBAAgB,EAAE,CAAC;QACnB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC;IACxF,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { z } from "zod";
2
+ import { happRequest } from "../http.js";
3
+ import { jsonResult } from "./result.js";
4
+ export function registerCallsTools(server) {
5
+ server.registerTool("happ_calls_list", {
6
+ title: "История звонков",
7
+ description: "История звонков компании (GET /calls-history), новые сверху.",
8
+ inputSchema: {
9
+ companyId: z.string().uuid().describe("ID компании (обязателен)"),
10
+ phone: z.string().optional().describe("Фильтр по номеру телефона"),
11
+ skip: z.number().int().min(0).optional(),
12
+ take: z.number().int().min(1).max(100).optional().describe("Сколько звонков вернуть")
13
+ }
14
+ }, async (params) => {
15
+ const result = await happRequest("GET", "/calls-history", { params });
16
+ return jsonResult(result);
17
+ });
18
+ server.registerTool("happ_call_get", {
19
+ title: "Звонок",
20
+ description: "Детали звонка по id (GET /calls-history/:id), включая транскрипт (replies).",
21
+ inputSchema: {
22
+ callId: z.string().uuid().describe("ID звонка")
23
+ }
24
+ }, async ({ callId }) => {
25
+ const call = await happRequest("GET", `/calls-history/${callId}`);
26
+ return jsonResult(call);
27
+ });
28
+ server.registerTool("happ_call_assign_manager", {
29
+ title: "Назначить менеджера на звонок",
30
+ description: "Назначает менеджера на звонок (PATCH /calls-history/:id/assign-manager).",
31
+ inputSchema: {
32
+ callId: z.string().uuid().describe("ID звонка"),
33
+ managerId: z.string().uuid().describe("ID пользователя-менеджера")
34
+ }
35
+ }, async ({ callId, managerId }) => {
36
+ const result = await happRequest("PATCH", `/calls-history/${callId}/assign-manager`, { body: { managerId } });
37
+ return jsonResult(result);
38
+ });
39
+ server.registerTool("happ_call_retranscribe", {
40
+ title: "Перетранскрибировать звонок",
41
+ description: "Запускает повторную транскрипцию записи звонка (POST /calls-history/:id/retranscribe).",
42
+ inputSchema: {
43
+ callId: z.string().uuid().describe("ID звонка")
44
+ }
45
+ }, async ({ callId }) => {
46
+ const result = await happRequest("POST", `/calls-history/${callId}/retranscribe`);
47
+ return jsonResult(result);
48
+ });
49
+ server.registerTool("happ_call_reply_update", {
50
+ title: "Править реплику транскрипта",
51
+ description: "Правит текст или спикера реплики транскрипта (PATCH /calls-history/:callId/replies/:replyId).",
52
+ inputSchema: {
53
+ callId: z.string().uuid().describe("ID звонка"),
54
+ replyId: z.string().uuid().describe("ID реплики"),
55
+ text: z.string().optional().describe("Новый текст"),
56
+ speaker: z.enum(["manager", "client"]).optional().describe("Кто говорит")
57
+ }
58
+ }, async ({ callId, replyId, text, speaker }) => {
59
+ const body = Object.fromEntries(Object.entries({ text, speaker }).filter(([, v]) => v !== undefined));
60
+ const result = await happRequest("PATCH", `/calls-history/${callId}/replies/${replyId}`, { body });
61
+ return jsonResult(result);
62
+ });
63
+ server.registerTool("happ_call_replies_swap_speakers", {
64
+ title: "Поменять спикеров местами",
65
+ description: "Меняет местами спикеров всего транскрипта (PATCH /calls-history/:callId/replies/swap-speakers) — когда транскрипция перепутала менеджера и клиента.",
66
+ inputSchema: {
67
+ callId: z.string().uuid().describe("ID звонка")
68
+ }
69
+ }, async ({ callId }) => {
70
+ const result = await happRequest("PATCH", `/calls-history/${callId}/replies/swap-speakers`);
71
+ return jsonResult(result);
72
+ });
73
+ server.registerTool("happ_call_reply_split", {
74
+ title: "Разбить реплику",
75
+ description: "Разбивает реплику транскрипта на две по позиции символа (POST /calls-history/:callId/replies/:replyId/split).",
76
+ inputSchema: {
77
+ callId: z.string().uuid().describe("ID звонка"),
78
+ replyId: z.string().uuid().describe("ID реплики"),
79
+ splitAtIndex: z.number().int().min(1).describe("Позиция символа, по которой разбить")
80
+ }
81
+ }, async ({ callId, replyId, splitAtIndex }) => {
82
+ const result = await happRequest("POST", `/calls-history/${callId}/replies/${replyId}/split`, {
83
+ body: { splitAtIndex }
84
+ });
85
+ return jsonResult(result);
86
+ });
87
+ server.registerTool("happ_call_reply_delete", {
88
+ title: "Удалить реплику",
89
+ description: "Удаляет реплику из транскрипта (DELETE /calls-history/:callId/replies/:replyId).",
90
+ inputSchema: {
91
+ callId: z.string().uuid().describe("ID звонка"),
92
+ replyId: z.string().uuid().describe("ID реплики")
93
+ }
94
+ }, async ({ callId, replyId }) => {
95
+ const result = await happRequest("DELETE", `/calls-history/${callId}/replies/${replyId}`);
96
+ return jsonResult(result);
97
+ });
98
+ }
99
+ //# sourceMappingURL=calls.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.tools.js","sourceRoot":"","sources":["../../src/tools/calls.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ import { z } from "zod";
2
+ import { happRequest } from "../http.js";
3
+ import { jsonResult } from "./result.js";
4
+ export function registerChannelsTools(server) {
5
+ server.registerTool("happ_integrations_list", {
6
+ title: "Подключённые каналы",
7
+ description: "Список подключённых интеграций/каналов компании (GET /integrations): telegram, telegram_bot, whatsapp_*, instagram, widget, телефония и т.д.",
8
+ inputSchema: {
9
+ companyId: z.string().uuid().optional().describe("ID компании"),
10
+ type: z.string().optional().describe("Тип интеграции, например telegram_bot"),
11
+ category: z.string().optional().describe("Категория: messengers | telephony | crm | webhooks | voice_assistant")
12
+ }
13
+ }, async ({ companyId, type, category }) => {
14
+ const integrations = await happRequest("GET", "/integrations", { params: { companyId, type, category } });
15
+ return jsonResult(integrations);
16
+ });
17
+ server.registerTool("happ_integration_update", {
18
+ title: "Обновить интеграцию",
19
+ description: "Обновляет интеграцию/канал (PATCH /integrations/:id): включить/выключить или поменять config.",
20
+ inputSchema: {
21
+ integrationId: z.string().uuid().describe("ID интеграции"),
22
+ isActive: z.boolean().optional().describe("Включена ли интеграция"),
23
+ config: z.record(z.unknown()).optional().describe("Конфигурация интеграции (объект, зависит от типа)")
24
+ }
25
+ }, async ({ integrationId, isActive, config }) => {
26
+ const body = Object.fromEntries(Object.entries({ isActive, config }).filter(([, v]) => v !== undefined));
27
+ const result = await happRequest("PATCH", `/integrations/${integrationId}`, { body });
28
+ return jsonResult(result);
29
+ });
30
+ server.registerTool("happ_integration_delete", {
31
+ title: "Удалить интеграцию",
32
+ description: "Полностью удаляет интеграцию/канал компании (DELETE /integrations/:id). Необратимо — для временного отключения используй happ_integration_update с isActive=false.",
33
+ inputSchema: {
34
+ integrationId: z.string().uuid().describe("ID интеграции")
35
+ }
36
+ }, async ({ integrationId }) => {
37
+ const result = await happRequest("DELETE", `/integrations/${integrationId}`);
38
+ return jsonResult(result);
39
+ });
40
+ server.registerTool("happ_telegram_bot_connect", {
41
+ title: "Подключить Telegram-бота",
42
+ description: "Подключает Telegram-бота как канал компании (POST /telegram-bot/:companyId/connect). Нужен токен бота от @BotFather.",
43
+ inputSchema: {
44
+ companyId: z.string().uuid().describe("ID компании"),
45
+ botToken: z.string().describe("Токен бота из @BotFather")
46
+ }
47
+ }, async ({ companyId, botToken }) => {
48
+ const result = await happRequest("POST", `/telegram-bot/${companyId}/connect`, { body: { botToken } });
49
+ return jsonResult(result);
50
+ });
51
+ server.registerTool("happ_widget_connect", {
52
+ title: "Подключить веб-виджет",
53
+ description: "Создаёт чат-виджет для сайта (POST /widget/:companyId/connect). allowedOrigins — домены, где виджет разрешён (пустой массив или ['*'] = везде).",
54
+ inputSchema: {
55
+ companyId: z.string().uuid().describe("ID компании"),
56
+ name: z.string().describe("Название виджета"),
57
+ description: z.string().optional().describe("Описание"),
58
+ allowedOrigins: z.array(z.string()).describe("Разрешённые домены, например ['https://example.com'] или ['*']")
59
+ }
60
+ }, async ({ companyId, ...body }) => {
61
+ const result = await happRequest("POST", `/widget/${companyId}/connect`, { body });
62
+ return jsonResult(result);
63
+ });
64
+ server.registerTool("happ_widget_update", {
65
+ title: "Обновить виджет",
66
+ description: "Обновляет настройки веб-виджета (PATCH /widget/:id).",
67
+ inputSchema: {
68
+ widgetId: z.string().uuid().describe("ID виджета (companyIntegrationId)"),
69
+ name: z.string().optional(),
70
+ description: z.string().optional(),
71
+ allowedOrigins: z.array(z.string()).optional().describe("Разрешённые домены")
72
+ }
73
+ }, async ({ widgetId, ...rest }) => {
74
+ const body = Object.fromEntries(Object.entries(rest).filter(([, v]) => v !== undefined));
75
+ const result = await happRequest("PATCH", `/widget/${widgetId}`, { body });
76
+ return jsonResult(result);
77
+ });
78
+ server.registerTool("happ_telephony_connect", {
79
+ title: "Подключить телефонию",
80
+ description: "Подключает провайдера телефонии (POST /integrations/<provider>/:companyId/connect). Ключи по провайдерам: binotel — key+secret; phonet — domain+apiKey; ringostat — authKey; unitalk — apiKey.",
81
+ inputSchema: {
82
+ companyId: z.string().uuid().describe("ID компании"),
83
+ provider: z.enum(["binotel", "phonet", "ringostat", "unitalk"]).describe("Провайдер телефонии"),
84
+ key: z.string().optional().describe("binotel: API key"),
85
+ secret: z.string().optional().describe("binotel: API secret"),
86
+ domain: z.string().optional().describe("phonet: домен"),
87
+ apiKey: z.string().optional().describe("phonet / unitalk: API-ключ"),
88
+ authKey: z.string().optional().describe("ringostat: auth key")
89
+ }
90
+ }, async ({ companyId, provider, ...creds }) => {
91
+ const bodyByProvider = {
92
+ binotel: { key: creds.key, secret: creds.secret },
93
+ phonet: { domain: creds.domain, apiKey: creds.apiKey },
94
+ ringostat: { authKey: creds.authKey },
95
+ unitalk: { apiKey: creds.apiKey }
96
+ };
97
+ const body = bodyByProvider[provider];
98
+ const missing = Object.entries(body).filter(([, v]) => !v);
99
+ if (missing.length > 0) {
100
+ return jsonResult({ error: `Для ${provider} не хватает полей: ${missing.map(([k]) => k).join(", ")}` });
101
+ }
102
+ const result = await happRequest("POST", `/integrations/${provider}/${companyId}/connect`, { body });
103
+ return jsonResult(result);
104
+ });
105
+ server.registerTool("happ_whatsapp_connect", {
106
+ title: "Подключить WhatsApp (Wasender)",
107
+ description: "Подключает WhatsApp по номеру телефона через Wasender (POST /whatsapp-wasender/:companyId/connect).",
108
+ inputSchema: {
109
+ companyId: z.string().uuid().describe("ID компании"),
110
+ phoneNumber: z.string().describe("Номер телефона WhatsApp")
111
+ }
112
+ }, async ({ companyId, phoneNumber }) => {
113
+ const result = await happRequest("POST", `/whatsapp-wasender/${companyId}/connect`, { body: { phoneNumber } });
114
+ return jsonResult(result);
115
+ });
116
+ server.registerTool("happ_assistant_integrations_list", {
117
+ title: "Привязки канал↔ассистент",
118
+ description: "Список привязок каналов к ассистентам (GET /assistant-integrations-new).",
119
+ inputSchema: {
120
+ assistantId: z.string().uuid().optional().describe("Фильтр по ассистенту"),
121
+ companyIntegrationId: z.string().uuid().optional().describe("Фильтр по интеграции")
122
+ }
123
+ }, async ({ assistantId, companyIntegrationId }) => {
124
+ // Бэкенд фильтрует только по assistantId (whitelist срезает прочие
125
+ // параметры молча) — по интеграции фильтруем на своей стороне.
126
+ const result = await happRequest("GET", "/assistant-integrations-new", {
127
+ params: { assistantId }
128
+ });
129
+ const filtered = companyIntegrationId
130
+ ? (Array.isArray(result) ? result : []).filter((link) => link.companyIntegrationId === companyIntegrationId)
131
+ : result;
132
+ return jsonResult(filtered);
133
+ });
134
+ server.registerTool("happ_assistant_integration_bind", {
135
+ title: "Привязать канал к ассистенту",
136
+ description: "Привязывает подключённый канал (companyIntegrationId из happ_integrations_list) к ассистенту (POST /assistant-integrations-new) — после этого ассистент отвечает в этом канале.",
137
+ inputSchema: {
138
+ assistantId: z.string().uuid().describe("ID ассистента"),
139
+ companyIntegrationId: z.string().uuid().describe("ID интеграции компании")
140
+ }
141
+ }, async ({ assistantId, companyIntegrationId }) => {
142
+ const result = await happRequest("POST", "/assistant-integrations-new", {
143
+ body: { assistantId, companyIntegrationId }
144
+ });
145
+ return jsonResult(result);
146
+ });
147
+ server.registerTool("happ_assistant_integration_unbind", {
148
+ title: "Отвязать канал от ассистента",
149
+ description: "Удаляет привязку канала к ассистенту (DELETE /assistant-integrations-new/:id).",
150
+ inputSchema: {
151
+ assistantIntegrationId: z.string().uuid().describe("ID привязки (из happ_assistant_integrations_list)")
152
+ }
153
+ }, async ({ assistantIntegrationId }) => {
154
+ const result = await happRequest("DELETE", `/assistant-integrations-new/${assistantIntegrationId}`);
155
+ return jsonResult(result);
156
+ });
157
+ }
158
+ //# sourceMappingURL=channels.tools.js.map