@codegame.dev/careerflow-mcp 1.1.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.
- package/LICENSE +21 -0
- package/README.md +398 -0
- package/dist/client.js +110 -0
- package/dist/client.js.map +1 -0
- package/dist/config.js +37 -0
- package/dist/config.js.map +1 -0
- package/dist/helpers.js +192 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.js +194 -0
- package/dist/index.js.map +1 -0
- package/dist/setup.js +296 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/admin.js +232 -0
- package/dist/tools/admin.js.map +1 -0
- package/dist/tools/benefit-funds.js +243 -0
- package/dist/tools/benefit-funds.js.map +1 -0
- package/dist/tools/chat-extra.js +172 -0
- package/dist/tools/chat-extra.js.map +1 -0
- package/dist/tools/chat.js +125 -0
- package/dist/tools/chat.js.map +1 -0
- package/dist/tools/cms.js +145 -0
- package/dist/tools/cms.js.map +1 -0
- package/dist/tools/crm-admin.js +269 -0
- package/dist/tools/crm-admin.js.map +1 -0
- package/dist/tools/crm.js +632 -0
- package/dist/tools/crm.js.map +1 -0
- package/dist/tools/dev-tickets.js +94 -0
- package/dist/tools/dev-tickets.js.map +1 -0
- package/dist/tools/forms.js +105 -0
- package/dist/tools/forms.js.map +1 -0
- package/dist/tools/hr.js +517 -0
- package/dist/tools/hr.js.map +1 -0
- package/dist/tools/kanban-extra.js +403 -0
- package/dist/tools/kanban-extra.js.map +1 -0
- package/dist/tools/misc.js +159 -0
- package/dist/tools/misc.js.map +1 -0
- package/dist/tools/projects.js +138 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/tasks.js +342 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/time.js +129 -0
- package/dist/tools/time.js.map +1 -0
- package/dist/tools/workplace.js +110 -0
- package/dist/tools/workplace.js.map +1 -0
- package/dist/tools/workspace.js +199 -0
- package/dist/tools/workspace.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { companyIdSchema, resolveCompanyId, safeHandler, textResult } from "../helpers.js";
|
|
3
|
+
/**
|
|
4
|
+
* Benefit fund tools: an employee loan and lottery fund. Money moves here —
|
|
5
|
+
* loan creation, status changes, and installment payments have real financial
|
|
6
|
+
* effect, so the write tools stay close to what the API itself allows
|
|
7
|
+
* self-service (registering for a lottery, accepting/declining a win,
|
|
8
|
+
* requesting membership) and what HR explicitly approves (updating loan
|
|
9
|
+
* status, paying an installment).
|
|
10
|
+
*/
|
|
11
|
+
export function registerBenefitFundTools(server, client) {
|
|
12
|
+
server.registerTool("benefit_fund_my_dashboard", {
|
|
13
|
+
title: "My benefit fund dashboard",
|
|
14
|
+
description: "The authenticated user's benefit fund summary: membership, active loans, loan types, and any open lottery win.",
|
|
15
|
+
inputSchema: { company_id: companyIdSchema }
|
|
16
|
+
}, safeHandler(async (args) => {
|
|
17
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
18
|
+
const response = await client.get("benefit-funds/dashboard/employee", {
|
|
19
|
+
company_id: companyId
|
|
20
|
+
});
|
|
21
|
+
return textResult(response.data);
|
|
22
|
+
}));
|
|
23
|
+
server.registerTool("benefit_fund_hr_dashboard", {
|
|
24
|
+
title: "HR benefit fund dashboard",
|
|
25
|
+
description: "Fund-wide stats: members, balances, active loans, pending requests, and open lotteries.",
|
|
26
|
+
inputSchema: { company_id: companyIdSchema }
|
|
27
|
+
}, safeHandler(async (args) => {
|
|
28
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
29
|
+
const response = await client.get("benefit-funds/dashboard/hr", {
|
|
30
|
+
company_id: companyId
|
|
31
|
+
});
|
|
32
|
+
return textResult(response.data);
|
|
33
|
+
}));
|
|
34
|
+
server.registerTool("list_benefit_fund_loan_types", {
|
|
35
|
+
title: "List benefit fund loan types",
|
|
36
|
+
description: "List the loan types a fund offers, with their limits and eligibility rules.",
|
|
37
|
+
inputSchema: { company_id: companyIdSchema, is_active: z.boolean().optional() }
|
|
38
|
+
}, safeHandler(async (args) => {
|
|
39
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
40
|
+
const response = await client.get("benefit-funds/loan-types/search", {
|
|
41
|
+
company_id: companyId,
|
|
42
|
+
is_active: args.is_active
|
|
43
|
+
});
|
|
44
|
+
return textResult(response.data);
|
|
45
|
+
}));
|
|
46
|
+
server.registerTool("list_benefit_fund_loans", {
|
|
47
|
+
title: "List benefit fund loans",
|
|
48
|
+
description: "List loans. Non-HR callers see only their own.",
|
|
49
|
+
inputSchema: {
|
|
50
|
+
company_id: companyIdSchema,
|
|
51
|
+
status: z.enum(["pending", "active", "completed", "cancelled"]).optional(),
|
|
52
|
+
loan_type_id: z.number().int().optional(),
|
|
53
|
+
user_id: z.number().int().optional().describe("HR only."),
|
|
54
|
+
limit: z.number().int().min(1).max(100).optional().default(20),
|
|
55
|
+
page: z.number().int().min(1).optional().default(1)
|
|
56
|
+
}
|
|
57
|
+
}, safeHandler(async (args) => {
|
|
58
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
59
|
+
const response = await client.get("benefit-funds/loans/search", {
|
|
60
|
+
company_id: companyId,
|
|
61
|
+
status: args.status,
|
|
62
|
+
loan_type_id: args.loan_type_id,
|
|
63
|
+
user_id: args.user_id,
|
|
64
|
+
limit: args.limit,
|
|
65
|
+
page: args.page
|
|
66
|
+
});
|
|
67
|
+
const data = response.data ?? {};
|
|
68
|
+
const { loans, total, ...rest } = data;
|
|
69
|
+
return textResult({ count: total ?? (loans ?? []).length, loans: loans ?? [], ...rest });
|
|
70
|
+
}));
|
|
71
|
+
server.registerTool("request_benefit_fund_loan", {
|
|
72
|
+
title: "Request a benefit fund loan",
|
|
73
|
+
description: "Request a loan against a loan type. Self-requested loans start 'pending' and need HR to " +
|
|
74
|
+
"activate them; an HR caller passing user_id creates an already-'active' loan directly.",
|
|
75
|
+
inputSchema: {
|
|
76
|
+
company_id: companyIdSchema,
|
|
77
|
+
loan_type_id: z.number().int(),
|
|
78
|
+
installment_count: z.number().int().min(1),
|
|
79
|
+
amount: z.number().int().min(1),
|
|
80
|
+
user_id: z.number().int().optional().describe("HR only: whose loan this is. Defaults to the caller."),
|
|
81
|
+
start_date: z.string().optional(),
|
|
82
|
+
notes: z.string().optional()
|
|
83
|
+
}
|
|
84
|
+
}, safeHandler(async (args) => {
|
|
85
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
86
|
+
const response = await client.post("benefit-funds/loans/create", {
|
|
87
|
+
company_id: companyId,
|
|
88
|
+
loan_type_id: args.loan_type_id,
|
|
89
|
+
installment_count: args.installment_count,
|
|
90
|
+
amount: args.amount,
|
|
91
|
+
user_id: args.user_id,
|
|
92
|
+
start_date: args.start_date,
|
|
93
|
+
notes: args.notes
|
|
94
|
+
});
|
|
95
|
+
return textResult({ created: true, loan: response.data });
|
|
96
|
+
}));
|
|
97
|
+
server.registerTool("update_benefit_fund_loan_status", {
|
|
98
|
+
title: "Update a benefit fund loan's status",
|
|
99
|
+
description: "HR: activate or cancel a loan. A non-HR caller may only cancel their own pending loan. This " +
|
|
100
|
+
"changes a real financial commitment — confirm with the caller first.",
|
|
101
|
+
inputSchema: {
|
|
102
|
+
company_id: companyIdSchema,
|
|
103
|
+
loan_id: z.number().int(),
|
|
104
|
+
status: z.enum(["active", "cancelled"])
|
|
105
|
+
}
|
|
106
|
+
}, safeHandler(async (args) => {
|
|
107
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
108
|
+
const response = await client.post("benefit-funds/loans/update-status", {
|
|
109
|
+
company_id: companyId,
|
|
110
|
+
id: args.loan_id,
|
|
111
|
+
status: args.status
|
|
112
|
+
});
|
|
113
|
+
return textResult({ updated: true, loan: response.data });
|
|
114
|
+
}));
|
|
115
|
+
server.registerTool("pay_benefit_fund_loan_installment", {
|
|
116
|
+
title: "Pay a benefit fund loan installment",
|
|
117
|
+
description: "HR: record one installment payment on an active loan. The loan completes automatically " +
|
|
118
|
+
"once all installments are paid. This records a real payment — confirm before calling.",
|
|
119
|
+
inputSchema: { company_id: companyIdSchema, loan_id: z.number().int() }
|
|
120
|
+
}, safeHandler(async (args) => {
|
|
121
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
122
|
+
const response = await client.post("benefit-funds/loans/pay-installment", {
|
|
123
|
+
company_id: companyId,
|
|
124
|
+
id: args.loan_id
|
|
125
|
+
});
|
|
126
|
+
return textResult({ paid: true, loan: response.data });
|
|
127
|
+
}));
|
|
128
|
+
server.registerTool("list_benefit_fund_lotteries", {
|
|
129
|
+
title: "List benefit fund lotteries",
|
|
130
|
+
description: "List loan lotteries. A non-HR caller sees only open lotteries, their own past entries, and " +
|
|
131
|
+
"any pending win awaiting their response.",
|
|
132
|
+
inputSchema: {
|
|
133
|
+
company_id: companyIdSchema,
|
|
134
|
+
status: z.enum(["draft", "open", "closed", "drawn", "completed", "cancelled"]).optional(),
|
|
135
|
+
limit: z.number().int().min(1).max(50).optional().default(20),
|
|
136
|
+
page: z.number().int().min(1).optional().default(1)
|
|
137
|
+
}
|
|
138
|
+
}, safeHandler(async (args) => {
|
|
139
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
140
|
+
const response = await client.get("benefit-funds/lotteries/search", {
|
|
141
|
+
company_id: companyId,
|
|
142
|
+
status: args.status,
|
|
143
|
+
limit: args.limit,
|
|
144
|
+
page: args.page
|
|
145
|
+
});
|
|
146
|
+
const data = response.data ?? {};
|
|
147
|
+
const { lotteries, total, ...rest } = data;
|
|
148
|
+
return textResult({ count: total ?? (lotteries ?? []).length, lotteries: lotteries ?? [], ...rest });
|
|
149
|
+
}));
|
|
150
|
+
server.registerTool("register_for_lottery", {
|
|
151
|
+
title: "Register or unregister for a lottery",
|
|
152
|
+
description: "Enter or withdraw the authenticated user from an open loan lottery.",
|
|
153
|
+
inputSchema: {
|
|
154
|
+
company_id: companyIdSchema,
|
|
155
|
+
lottery_id: z.number().int(),
|
|
156
|
+
register: z.boolean().optional().default(true)
|
|
157
|
+
}
|
|
158
|
+
}, safeHandler(async (args) => {
|
|
159
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
160
|
+
const path = (args.register ?? true) ? "benefit-funds/lotteries/register" : "benefit-funds/lotteries/unregister";
|
|
161
|
+
await client.post(path, { company_id: companyId, lottery_id: args.lottery_id });
|
|
162
|
+
return textResult({ lottery_id: args.lottery_id, registered: args.register ?? true });
|
|
163
|
+
}));
|
|
164
|
+
server.registerTool("respond_to_lottery_win", {
|
|
165
|
+
title: "Accept or decline a lottery win",
|
|
166
|
+
description: "Accept (creating a pending loan for the win amount) or decline a lottery the caller won. " +
|
|
167
|
+
"Only available within the loan type's acceptance window after the draw.",
|
|
168
|
+
inputSchema: {
|
|
169
|
+
company_id: companyIdSchema,
|
|
170
|
+
lottery_id: z.number().int(),
|
|
171
|
+
accept: z.boolean(),
|
|
172
|
+
installment_count: z.number().int().min(1).optional().describe("Required when accepting.")
|
|
173
|
+
}
|
|
174
|
+
}, safeHandler(async (args) => {
|
|
175
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
176
|
+
if (args.accept) {
|
|
177
|
+
const response = await client.post("benefit-funds/lotteries/accept-win", {
|
|
178
|
+
company_id: companyId,
|
|
179
|
+
lottery_id: args.lottery_id,
|
|
180
|
+
installment_count: args.installment_count
|
|
181
|
+
});
|
|
182
|
+
return textResult({ accepted: true, result: response.data });
|
|
183
|
+
}
|
|
184
|
+
const response = await client.post("benefit-funds/lotteries/decline-win", {
|
|
185
|
+
company_id: companyId,
|
|
186
|
+
lottery_id: args.lottery_id
|
|
187
|
+
});
|
|
188
|
+
return textResult({ accepted: false, lottery: response.data });
|
|
189
|
+
}));
|
|
190
|
+
server.registerTool("benefit_fund_settings", {
|
|
191
|
+
title: "Get benefit fund settings",
|
|
192
|
+
description: "Get the fund's configuration: auto-enroll, deposit amount, and lottery cycle.",
|
|
193
|
+
inputSchema: { company_id: companyIdSchema }
|
|
194
|
+
}, safeHandler(async (args) => {
|
|
195
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
196
|
+
const response = await client.get("benefit-funds/settings", { company_id: companyId });
|
|
197
|
+
return textResult(response.data);
|
|
198
|
+
}));
|
|
199
|
+
server.registerTool("list_benefit_fund_membership_requests", {
|
|
200
|
+
title: "List benefit fund membership requests",
|
|
201
|
+
description: "List requests to join the benefit fund. Non-HR callers see only their own.",
|
|
202
|
+
inputSchema: {
|
|
203
|
+
company_id: companyIdSchema,
|
|
204
|
+
status: z.enum(["pending", "approved", "rejected"]).optional()
|
|
205
|
+
}
|
|
206
|
+
}, safeHandler(async (args) => {
|
|
207
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
208
|
+
const response = await client.get("benefit-funds/membership-requests/search", {
|
|
209
|
+
company_id: companyId,
|
|
210
|
+
status: args.status
|
|
211
|
+
});
|
|
212
|
+
return textResult(response.data);
|
|
213
|
+
}));
|
|
214
|
+
server.registerTool("request_benefit_fund_membership", {
|
|
215
|
+
title: "Request benefit fund membership",
|
|
216
|
+
description: "Ask to join the company's benefit fund. HR approval creates the membership.",
|
|
217
|
+
inputSchema: { company_id: companyIdSchema }
|
|
218
|
+
}, safeHandler(async (args) => {
|
|
219
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
220
|
+
const response = await client.post("benefit-funds/membership-requests/create", {
|
|
221
|
+
company_id: companyId
|
|
222
|
+
});
|
|
223
|
+
return textResult({ created: true, request: response.data });
|
|
224
|
+
}));
|
|
225
|
+
server.registerTool("review_benefit_fund_membership_request", {
|
|
226
|
+
title: "Approve or reject a benefit fund membership request",
|
|
227
|
+
description: "HR: approve (creating a member) or reject a pending membership request.",
|
|
228
|
+
inputSchema: {
|
|
229
|
+
company_id: companyIdSchema,
|
|
230
|
+
request_id: z.number().int(),
|
|
231
|
+
approve: z.boolean(),
|
|
232
|
+
notes: z.string().optional().describe("Used when rejecting.")
|
|
233
|
+
}
|
|
234
|
+
}, safeHandler(async (args) => {
|
|
235
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
236
|
+
const path = args.approve
|
|
237
|
+
? `benefit-funds/membership-requests/approve/${args.request_id}`
|
|
238
|
+
: `benefit-funds/membership-requests/reject/${args.request_id}`;
|
|
239
|
+
const response = await client.post(path, { company_id: companyId, notes: args.notes });
|
|
240
|
+
return textResult({ approved: args.approve, result: response.data });
|
|
241
|
+
}));
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=benefit-funds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benefit-funds.js","sourceRoot":"","sources":["../../src/tools/benefit-funds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { companyIdSchema, extractList, resolveCompanyId, safeHandler, textResult } from "../helpers.js";
|
|
3
|
+
/**
|
|
4
|
+
* Chat group management and message lifecycle tools beyond send/read in
|
|
5
|
+
* tools/chat.ts.
|
|
6
|
+
*/
|
|
7
|
+
export function registerChatExtraTools(server, client) {
|
|
8
|
+
server.registerTool("create_chat_group", {
|
|
9
|
+
title: "Create a chat group",
|
|
10
|
+
description: "Create a group chat with the given members. The caller becomes the group's owner.",
|
|
11
|
+
inputSchema: {
|
|
12
|
+
company_id: companyIdSchema,
|
|
13
|
+
title: z.string().min(1).max(255),
|
|
14
|
+
description: z.string().max(2000).optional(),
|
|
15
|
+
member_ids: z.array(z.number().int()).optional(),
|
|
16
|
+
only_admins_can_send: z.boolean().optional().default(false)
|
|
17
|
+
}
|
|
18
|
+
}, safeHandler(async (args) => {
|
|
19
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
20
|
+
const response = await client.post("chats/groups/create", {
|
|
21
|
+
company_id: companyId,
|
|
22
|
+
title: args.title,
|
|
23
|
+
description: args.description,
|
|
24
|
+
member_ids: args.member_ids?.join(","),
|
|
25
|
+
only_admins_can_send: args.only_admins_can_send
|
|
26
|
+
});
|
|
27
|
+
return textResult({ created: true, chat: response.data });
|
|
28
|
+
}));
|
|
29
|
+
server.registerTool("edit_chat_group", {
|
|
30
|
+
title: "Edit a chat group",
|
|
31
|
+
description: "Change a group's title, description, or posting permissions.",
|
|
32
|
+
inputSchema: {
|
|
33
|
+
company_id: companyIdSchema,
|
|
34
|
+
chat_id: z.number().int(),
|
|
35
|
+
title: z.string().max(255).optional(),
|
|
36
|
+
description: z.string().max(2000).optional(),
|
|
37
|
+
only_admins_can_send: z.boolean().optional(),
|
|
38
|
+
join_enabled: z.boolean().optional()
|
|
39
|
+
}
|
|
40
|
+
}, safeHandler(async (args) => {
|
|
41
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
42
|
+
const response = await client.post("chats/groups/edit", {
|
|
43
|
+
company_id: companyId,
|
|
44
|
+
chat_id: args.chat_id,
|
|
45
|
+
title: args.title,
|
|
46
|
+
description: args.description,
|
|
47
|
+
only_admins_can_send: args.only_admins_can_send,
|
|
48
|
+
join_enabled: args.join_enabled
|
|
49
|
+
});
|
|
50
|
+
return textResult({ updated: true, chat: response.data });
|
|
51
|
+
}));
|
|
52
|
+
server.registerTool("manage_chat_group_members", {
|
|
53
|
+
title: "Add, edit, or remove chat group members",
|
|
54
|
+
description: "Add members to a group, change a member's role or send permission, or remove a member. " +
|
|
55
|
+
"An owner cannot be removed directly — transfer ownership first by promoting someone else.",
|
|
56
|
+
inputSchema: {
|
|
57
|
+
company_id: companyIdSchema,
|
|
58
|
+
chat_id: z.number().int(),
|
|
59
|
+
action: z.enum(["add", "edit", "remove"]),
|
|
60
|
+
member_ids: z.array(z.number().int()).optional().describe("Required for action 'add'."),
|
|
61
|
+
user_id: z.number().int().optional().describe("Required for action 'edit' or 'remove'."),
|
|
62
|
+
role: z.enum(["owner", "admin", "member"]).optional(),
|
|
63
|
+
can_send: z.boolean().optional()
|
|
64
|
+
}
|
|
65
|
+
}, safeHandler(async (args) => {
|
|
66
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
67
|
+
if (args.action === "add") {
|
|
68
|
+
const response = await client.post("chats/groups/members/add", {
|
|
69
|
+
company_id: companyId,
|
|
70
|
+
chat_id: args.chat_id,
|
|
71
|
+
member_ids: args.member_ids?.join(",")
|
|
72
|
+
});
|
|
73
|
+
return textResult({ action: "add", result: response.data });
|
|
74
|
+
}
|
|
75
|
+
if (args.action === "edit") {
|
|
76
|
+
const response = await client.post("chats/groups/members/edit", {
|
|
77
|
+
company_id: companyId,
|
|
78
|
+
chat_id: args.chat_id,
|
|
79
|
+
user_id: args.user_id,
|
|
80
|
+
role: args.role,
|
|
81
|
+
can_send: args.can_send
|
|
82
|
+
});
|
|
83
|
+
return textResult({ action: "edit", member: response.data });
|
|
84
|
+
}
|
|
85
|
+
const response = await client.post("chats/groups/members/remove", {
|
|
86
|
+
company_id: companyId,
|
|
87
|
+
chat_id: args.chat_id,
|
|
88
|
+
user_id: args.user_id
|
|
89
|
+
});
|
|
90
|
+
return textResult({ action: "remove", member: response.data });
|
|
91
|
+
}));
|
|
92
|
+
server.registerTool("list_chat_group_members", {
|
|
93
|
+
title: "List chat group members",
|
|
94
|
+
description: "List the members of a group chat.",
|
|
95
|
+
inputSchema: {
|
|
96
|
+
company_id: companyIdSchema,
|
|
97
|
+
chat_id: z.number().int(),
|
|
98
|
+
search: z.string().optional(),
|
|
99
|
+
limit: z.number().int().min(1).max(50).optional().default(30),
|
|
100
|
+
page: z.number().int().min(1).optional().default(1)
|
|
101
|
+
}
|
|
102
|
+
}, safeHandler(async (args) => {
|
|
103
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
104
|
+
const response = await client.get("chats/groups/members/search", {
|
|
105
|
+
company_id: companyId,
|
|
106
|
+
chat_id: args.chat_id,
|
|
107
|
+
search: args.search,
|
|
108
|
+
limit: args.limit,
|
|
109
|
+
page: args.page
|
|
110
|
+
});
|
|
111
|
+
const { items, total } = extractList(response.data, "members");
|
|
112
|
+
return textResult({ count: total ?? items.length, members: items });
|
|
113
|
+
}));
|
|
114
|
+
server.registerTool("leave_chat_group", {
|
|
115
|
+
title: "Leave a chat group",
|
|
116
|
+
description: "Leave a group chat. If the caller is the owner, ownership transfers automatically.",
|
|
117
|
+
inputSchema: { company_id: companyIdSchema, chat_id: z.number().int() }
|
|
118
|
+
}, safeHandler(async (args) => {
|
|
119
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
120
|
+
await client.post("chats/groups/leave", { company_id: companyId, chat_id: args.chat_id });
|
|
121
|
+
return textResult({ left: true, chat_id: args.chat_id });
|
|
122
|
+
}));
|
|
123
|
+
server.registerTool("mute_chat", {
|
|
124
|
+
title: "Mute or unmute a chat",
|
|
125
|
+
description: "Mute a chat for a number of minutes (0 mutes indefinitely), or unmute it by omitting minutes.",
|
|
126
|
+
inputSchema: {
|
|
127
|
+
company_id: companyIdSchema,
|
|
128
|
+
chat_id: z.number().int(),
|
|
129
|
+
minutes: z.number().int().min(0).optional().describe("Omit to unmute.")
|
|
130
|
+
}
|
|
131
|
+
}, safeHandler(async (args) => {
|
|
132
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
133
|
+
const response = await client.post("chats/mute", {
|
|
134
|
+
company_id: companyId,
|
|
135
|
+
chat_id: args.chat_id,
|
|
136
|
+
minutes: args.minutes
|
|
137
|
+
});
|
|
138
|
+
return textResult(response.data);
|
|
139
|
+
}));
|
|
140
|
+
server.registerTool("edit_chat_message", {
|
|
141
|
+
title: "Edit a chat message",
|
|
142
|
+
description: "Edit one of your own messages. Blocked once the message has been read by its recipient.",
|
|
143
|
+
inputSchema: { company_id: companyIdSchema, message_id: z.number().int(), content: z.string().min(1) }
|
|
144
|
+
}, safeHandler(async (args) => {
|
|
145
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
146
|
+
const response = await client.post("chats/messages/edit", {
|
|
147
|
+
company_id: companyId,
|
|
148
|
+
message_id: args.message_id,
|
|
149
|
+
content: args.content
|
|
150
|
+
});
|
|
151
|
+
return textResult({ updated: true, message: response.data });
|
|
152
|
+
}));
|
|
153
|
+
server.registerTool("delete_chat_message", {
|
|
154
|
+
title: "Delete a chat message",
|
|
155
|
+
description: "Delete one of your own messages.",
|
|
156
|
+
inputSchema: { company_id: companyIdSchema, message_id: z.number().int() }
|
|
157
|
+
}, safeHandler(async (args) => {
|
|
158
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
159
|
+
await client.post("chats/messages/delete", { company_id: companyId, message_id: args.message_id });
|
|
160
|
+
return textResult({ deleted: true, message_id: args.message_id });
|
|
161
|
+
}));
|
|
162
|
+
server.registerTool("mark_message_seen", {
|
|
163
|
+
title: "Mark a message as seen",
|
|
164
|
+
description: "Mark another person's message as read.",
|
|
165
|
+
inputSchema: { company_id: companyIdSchema, message_id: z.number().int() }
|
|
166
|
+
}, safeHandler(async (args) => {
|
|
167
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
168
|
+
await client.post("chats/messages/seen", { company_id: companyId, message_id: args.message_id });
|
|
169
|
+
return textResult({ seen: true, message_id: args.message_id });
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=chat-extra.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-extra.js","sourceRoot":"","sources":["../../src/tools/chat-extra.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { companyIdSchema, extractList, currentUserId, resolveCompanyId, safeHandler, textResult } from "../helpers.js";
|
|
3
|
+
/**
|
|
4
|
+
* Chat tools.
|
|
5
|
+
*
|
|
6
|
+
* `send_message` delivers a real message to real colleagues and cannot be
|
|
7
|
+
* recalled, so its description tells the model to confirm recipient and wording
|
|
8
|
+
* with the user first. The API still enforces who the caller may message.
|
|
9
|
+
*/
|
|
10
|
+
export function registerChatTools(server, client) {
|
|
11
|
+
server.registerTool("list_chats", {
|
|
12
|
+
title: "List conversations",
|
|
13
|
+
description: "List the user's chats and groups, most recent first.",
|
|
14
|
+
inputSchema: {
|
|
15
|
+
company_id: companyIdSchema,
|
|
16
|
+
search: z.string().optional().describe("Match on the other participant or group name."),
|
|
17
|
+
limit: z.number().int().min(1).max(50).optional().default(20),
|
|
18
|
+
page: z.number().int().min(1).optional().default(1)
|
|
19
|
+
}
|
|
20
|
+
}, safeHandler(async (args) => {
|
|
21
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
22
|
+
// the endpoint refuses an unscoped listing; scoping to the caller is
|
|
23
|
+
// what "my conversations" means
|
|
24
|
+
const response = await client.get("chats/search", {
|
|
25
|
+
company_id: companyId,
|
|
26
|
+
user_id: await currentUserId(client),
|
|
27
|
+
search: args.search,
|
|
28
|
+
limit: args.limit,
|
|
29
|
+
page: args.page
|
|
30
|
+
});
|
|
31
|
+
const { items: chats, total } = extractList(response.data, "chats");
|
|
32
|
+
return textResult({
|
|
33
|
+
count: total ?? chats.length,
|
|
34
|
+
chats: chats.map((c) => ({
|
|
35
|
+
id: c.id,
|
|
36
|
+
type: c.type,
|
|
37
|
+
title: c.title || c.name || undefined,
|
|
38
|
+
receiver_id: c.receiver_id ?? undefined,
|
|
39
|
+
// direct chats name the other side here; groups use title
|
|
40
|
+
receiver_name: [c.receiver_firstname, c.receiver_lastname].filter(Boolean).join(" ") || undefined,
|
|
41
|
+
members_count: c.members_count ?? undefined,
|
|
42
|
+
unread_count: c.unread_count ?? undefined,
|
|
43
|
+
last_message: c.last_message_content || undefined,
|
|
44
|
+
last_message_at: c.last_message_created || undefined,
|
|
45
|
+
updated: c.updated
|
|
46
|
+
}))
|
|
47
|
+
});
|
|
48
|
+
}));
|
|
49
|
+
server.registerTool("read_messages", {
|
|
50
|
+
title: "Read messages",
|
|
51
|
+
description: "Read messages from one conversation. Address it either by chat_id (a group or existing " +
|
|
52
|
+
"chat) or by user_id (the colleague on the other side).",
|
|
53
|
+
inputSchema: {
|
|
54
|
+
company_id: companyIdSchema,
|
|
55
|
+
chat_id: z.number().int().optional().describe("The conversation id."),
|
|
56
|
+
user_id: z.number().int().optional().describe("The other participant's user id, for a direct chat."),
|
|
57
|
+
search: z.string().optional(),
|
|
58
|
+
limit: z.number().int().min(1).max(50).optional().default(30),
|
|
59
|
+
page: z.number().int().min(1).optional().default(1),
|
|
60
|
+
direction: z.enum(["asc", "desc"]).optional().default("desc")
|
|
61
|
+
}
|
|
62
|
+
}, safeHandler(async (args) => {
|
|
63
|
+
if (!args.chat_id && !args.user_id) {
|
|
64
|
+
throw new Error("Pass either chat_id or user_id to say which conversation to read.");
|
|
65
|
+
}
|
|
66
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
67
|
+
const response = await client.get("chats/messages/search", {
|
|
68
|
+
company_id: companyId,
|
|
69
|
+
chat_id: args.chat_id,
|
|
70
|
+
user_id: args.user_id,
|
|
71
|
+
search: args.search,
|
|
72
|
+
limit: args.limit,
|
|
73
|
+
page: args.page,
|
|
74
|
+
order_by: "created",
|
|
75
|
+
direction: args.direction
|
|
76
|
+
});
|
|
77
|
+
const { items: messages, total } = extractList(response.data, "messages");
|
|
78
|
+
return textResult({
|
|
79
|
+
count: total ?? messages.length,
|
|
80
|
+
messages: messages.map((m) => ({
|
|
81
|
+
id: m.id,
|
|
82
|
+
content: m.content,
|
|
83
|
+
sender_id: m.user_id ?? m.sender_id,
|
|
84
|
+
sender: [m.firstname, m.lastname].filter(Boolean).join(" ") || undefined,
|
|
85
|
+
created: m.created,
|
|
86
|
+
has_attachments: Array.isArray(m.attachments) && m.attachments.length > 0
|
|
87
|
+
}))
|
|
88
|
+
});
|
|
89
|
+
}));
|
|
90
|
+
server.registerTool("send_message", {
|
|
91
|
+
title: "Send a chat message",
|
|
92
|
+
description: "Send a message to a colleague or group. This delivers immediately to real people and " +
|
|
93
|
+
"cannot be unsent — confirm the recipient and the wording with the user before calling it. " +
|
|
94
|
+
"Address it by receiver_id (a person) or chat_id (a group).",
|
|
95
|
+
inputSchema: {
|
|
96
|
+
company_id: companyIdSchema,
|
|
97
|
+
receiver_id: z
|
|
98
|
+
.number()
|
|
99
|
+
.int()
|
|
100
|
+
.optional()
|
|
101
|
+
.describe("User id of the person to message. Use find_user to resolve a name."),
|
|
102
|
+
chat_id: z.number().int().optional().describe("Group or existing chat id."),
|
|
103
|
+
content: z.string().min(1).describe("The message text.")
|
|
104
|
+
}
|
|
105
|
+
}, safeHandler(async (args) => {
|
|
106
|
+
if (!args.receiver_id && !args.chat_id) {
|
|
107
|
+
throw new Error("Pass either receiver_id or chat_id to say where the message goes.");
|
|
108
|
+
}
|
|
109
|
+
const companyId = resolveCompanyId(client, args.company_id);
|
|
110
|
+
const response = await client.post("chats/messages/create", {
|
|
111
|
+
company_id: companyId,
|
|
112
|
+
receiver_id: args.receiver_id,
|
|
113
|
+
chat_id: args.chat_id,
|
|
114
|
+
content: args.content
|
|
115
|
+
});
|
|
116
|
+
const message = response.data?.message;
|
|
117
|
+
return textResult({
|
|
118
|
+
sent: true,
|
|
119
|
+
message_id: message?.id,
|
|
120
|
+
chat_id: message?.chat_id ?? args.chat_id,
|
|
121
|
+
receiver_id: args.receiver_id
|
|
122
|
+
});
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/tools/chat.ts"],"names":[],"mappings":"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"}
|