conduyt-mcp 4.105.6 → 4.105.7
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/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
MCP server for [Conduyt CRM](https://conduyt.app) — expose your CRM as AI-accessible tools. Covers the core CRM surface (contacts, deals, pipelines, custom fields, automations, messaging, and more); use `conduyt_api_catalog` to discover the full set of 600+ REST endpoints.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 393 Tools
|
|
6
6
|
|
|
7
7
|
### Discovery
|
|
8
8
|
| Tool | Description |
|
|
@@ -270,18 +270,19 @@ The Mailchimp OAuth connect and callback are browser-only: connect Mailchimp in
|
|
|
270
270
|
|
|
271
271
|
The thread view (#684): `conduyt_list_chat_messages` takes `topLevel: true` (top-level messages with their reply chip `thread`, and the replies shown in the channel with `threadReply` `{ reason: aiFirstAnswer | alsoInChannel, root }`; never with `afterSeq`) and `conduyt_reply_chat_message` takes `alsoInChannel: true` ("Also send to #channel" on a person's reply). Both are sent only when true. They and the two thread tools work only while the workspace's switch is on (`conduyt_list_chat_channels` then carries `teamChatThreads: true`); while it is off each answers an error result with `code: team_chat_threads_off` and the sentence "The thread view is not switched on for this workspace (account setting teamChatThreads)." Against a server that predates the thread view: the two thread tools answer a 404 error result that says so, `topLevel` is reported as not applied (an error result, never a page of every reply), and an `alsoInChannel` reply is posted in the thread only, with a note saying so (never re-sent).
|
|
272
272
|
|
|
273
|
-
AI teammate turns (#802, the app listener's #655 phase 1): a turn run through Codex (`conduyt agent listen --adapter codex`) carries the thread so far and, when the channel is linked, "This channel is linked to deal <id>" (read it with `conduyt_get_chat_linked_record`), and ends with exactly ONE of `conduyt_reply_chat_message` (with `idempotencyKey` + `claimToken`), `conduyt_react_chat_message` (with `claimToken`) or `conduyt_stay_silent`; a second, different one is refused 409 `turn_finished`. The inbox itself (`/chat/agents/me/*`: the event's `context.recent`, `channel.dealId` / `contactId` and the page's `budget`) is the listener's protocol and has no tool; `GET /chat/agents`
|
|
273
|
+
AI teammate turns (#802, the app listener's #655 phase 1): a turn run through Codex (`conduyt agent listen --adapter codex`) carries the thread so far and, when the channel is linked, "This channel is linked to deal <id>" (read it with `conduyt_get_chat_linked_record`), and ends with exactly ONE of `conduyt_reply_chat_message` (with `idempotencyKey` + `claimToken`), `conduyt_react_chat_message` (with `claimToken`) or `conduyt_stay_silent`; a second, different one is refused 409 `turn_finished`. The inbox itself (`/chat/agents/me/*`: the event's `context.recent`, `channel.dealId` / `contactId` and the page's `budget`) is the listener's protocol and has no tool; (#1153) `GET /chat/agents` answers an owner's or admin's key the teammate rows of `conduyt_list_ai_teammates` (no `turnsToday` / `dailyBudget`: those are the Settings session's): the daily budget is visible in Settings > AI and in the listener's log.
|
|
274
274
|
|
|
275
275
|
### A Grok Bot as an AI teammate (#1140)
|
|
276
276
|
| Tool | Description |
|
|
277
277
|
|------|-------------|
|
|
278
|
+
| `conduyt_list_ai_teammates` | (#1153) The workspace's AI teammates (`GET /chat/agents`, an owner's or admin's key, the read tier is enough): `[{ id, handle, name, provider, state, connected, connection, createdAt }]`, nothing secret. Name a teammate to the tools below by its id or its @handle |
|
|
278
279
|
| `conduyt_connect_ai_teammate` | Step 1 (`POST /chat/agents/{id}/connect`): the message to paste into Grok Bot and the teammate's token, returned ONCE (`{ token, tokenPrefix, message, toolsUrl, agent }`); the token goes into Grok Bot's masked connector field, never into a chat. Every call revokes the earlier tokens. The calling key needs the write tier and the chat and deals scopes |
|
|
279
280
|
| `conduyt_set_ai_teammate_webhook` | Step 3 (`PUT /chat/agents/{id}/webhook`): `paste` (the block Grok Bot shows) OR `address` + `key`; checked, stored (the key encrypted), tested at once: `{ stored, test, status }`. The key is write-only: never returned, and any returned text has it replaced by `[hidden]`. A test that was not accepted is an error result with its one sentence (`key_refused`, `routine_gone`, `unreachable`, `not_accepted`, `rate_limited`; `teammate_not_live` is a 409 before any test) |
|
|
280
281
|
| `conduyt_test_ai_teammate_webhook` | The card's Test button (`POST /chat/agents/{id}/webhook/test`): the hello again to the stored routine; `{ test, status }` |
|
|
281
282
|
| `conduyt_get_ai_teammate_webhook` | The status the card polls (`GET /chat/agents/{id}/webhook`): `state` not_connected / waiting_for_hello / listening / not_listening, `problem { code, message }`, the address masked; poll it after a test until listening |
|
|
282
283
|
| `conduyt_disconnect_ai_teammate` | `DELETE /chat/agents/{id}/webhook`: tokens revoked, the routine's key cleared, pending deliveries cancelled; the teammate and its messages stay; never blocked by billing |
|
|
283
284
|
|
|
284
|
-
Owners and admins, with a person's API key; an AI teammate's own key is refused. The teammate is named by its id (a UUID)
|
|
285
|
+
Owners and admins, with a person's API key; an AI teammate's own key is refused. The teammate is named by its id (a UUID) or its @handle (`conduyt_list_ai_teammates` lists both; the server resolves the handle). Against a server without these routes (an HTML 404) each tool answers "This Conduyt server does not have the Grok Bot connection yet (it predates it); connect the teammate in Settings > AI instead."
|
|
285
286
|
|
|
286
287
|
The remaining Team Chat mutations (edit/delete, pins, claim/handoff and typing/presence writes) are not wrapped yet; sends, thread replies, reactions and direct uploads are wrapped. `GET /chat/messages/{messageId}/location` is a UI deep-link helper and deliberately not wrapped. `GET /cron/team-chat-digest` is a CRON_SECRET-gated job and not key-callable.
|
|
287
288
|
|
package/dist/tool-annotations.js
CHANGED
|
@@ -192,6 +192,8 @@ export const TOOL_ANNOTATIONS = {
|
|
|
192
192
|
conduyt_get_chat_thread: update("Get Chat Thread"),
|
|
193
193
|
// (#1140 A3) the Grok Bot teammate connect tools: connect mints a token and revokes the earlier ones on every call; set stores the
|
|
194
194
|
// routine key (replacing the last) and sends a test each call; test sends one; disconnect revokes the tokens
|
|
195
|
+
// (#1153) the teammate list: a read
|
|
196
|
+
conduyt_list_ai_teammates: ro("List AI Teammates"),
|
|
195
197
|
conduyt_connect_ai_teammate: row("Connect AI Teammate", false, true, false),
|
|
196
198
|
conduyt_set_ai_teammate_webhook: row("Set AI Teammate Webhook", false, false, false),
|
|
197
199
|
conduyt_test_ai_teammate_webhook: create("Test AI Teammate Webhook"),
|
|
@@ -14,7 +14,9 @@ export { hide } from "./routine-key-redaction.js";
|
|
|
14
14
|
*/
|
|
15
15
|
export declare const OLDER_SERVER_SENTENCE = "This Conduyt server does not have the Grok Bot connection yet (it predates it); connect the teammate in Settings > AI instead.";
|
|
16
16
|
export declare const AI_OFF_SENTENCE = "AI teammates are switched off for this workspace; an owner or admin turns them on in Settings > AI.";
|
|
17
|
-
export declare const NOT_FOUND_SENTENCE = "There is no AI teammate with that id in this workspace (it may have been revoked).";
|
|
17
|
+
export declare const NOT_FOUND_SENTENCE = "There is no AI teammate with that id or handle in this workspace (it may have been revoked); conduyt_list_ai_teammates lists them.";
|
|
18
|
+
/** (#1153) GET /chat/agents on a server from before #1153 refuses every API key with its session-only sentence */
|
|
19
|
+
export declare const OLDER_LIST_SENTENCE = "This Conduyt server does not let an API key read the AI teammate list yet (it predates it); see the teammates in Settings > AI.";
|
|
18
20
|
export declare const TEAMMATE_KEY_SENTENCE = "This is an AI teammate's own key; connect a Grok Bot with a person's API key (an owner or admin).";
|
|
19
21
|
export declare const NO_CREDENTIALS_SENTENCE = "Give the routine's address and key: paste (the block Grok Bot shows), or address and key.";
|
|
20
22
|
/** the one sentence for a refused call, and its code when the API sent one */
|
|
@@ -16,7 +16,9 @@ export { hide } from "./routine-key-redaction.js";
|
|
|
16
16
|
*/
|
|
17
17
|
export const OLDER_SERVER_SENTENCE = "This Conduyt server does not have the Grok Bot connection yet (it predates it); connect the teammate in Settings > AI instead.";
|
|
18
18
|
export const AI_OFF_SENTENCE = "AI teammates are switched off for this workspace; an owner or admin turns them on in Settings > AI.";
|
|
19
|
-
export const NOT_FOUND_SENTENCE = "There is no AI teammate with that id in this workspace (it may have been revoked).";
|
|
19
|
+
export const NOT_FOUND_SENTENCE = "There is no AI teammate with that id or handle in this workspace (it may have been revoked); conduyt_list_ai_teammates lists them.";
|
|
20
|
+
/** (#1153) GET /chat/agents on a server from before #1153 refuses every API key with its session-only sentence */
|
|
21
|
+
export const OLDER_LIST_SENTENCE = "This Conduyt server does not let an API key read the AI teammate list yet (it predates it); see the teammates in Settings > AI.";
|
|
20
22
|
export const TEAMMATE_KEY_SENTENCE = "This is an AI teammate's own key; connect a Grok Bot with a person's API key (an owner or admin).";
|
|
21
23
|
export const NO_CREDENTIALS_SENTENCE = "Give the routine's address and key: paste (the block Grok Bot shows), or address and key.";
|
|
22
24
|
function errorDetailsOf(message) {
|
|
@@ -89,10 +91,34 @@ function testOutcome(secrets) {
|
|
|
89
91
|
return connectError(problem?.message ?? "Grok Bot did not accept the test.", secrets, { status: 200, ...(problem?.code ? { code: problem.code } : {}), answer: d });
|
|
90
92
|
};
|
|
91
93
|
}
|
|
92
|
-
const
|
|
94
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
95
|
+
/** the app's handle rule (lib/agent-auth.ts normalizeAgentHandle): a letter, then 1-31 letters, digits, _ or -, case-insensitive */
|
|
96
|
+
const HANDLE_RE = /^@[a-z][a-z0-9_-]{1,31}$/i;
|
|
97
|
+
/** (#1153) the teammate: its id (a UUID) or its @handle, lower-cased; the server resolves the handle (lib/agent-webhook-routes.ts
|
|
98
|
+
* parseTeammateRef, the one place for every surface), so nothing here looks it up */
|
|
99
|
+
const TEAMMATE_ID = z.string().trim().refine((v) => UUID_RE.test(v) || HANDLE_RE.test(v), { message: "teammateId must be the teammate's id (a UUID) or its @handle" })
|
|
100
|
+
.describe("The Grok Bot teammate: its id (a UUID) or its @handle, as conduyt_list_ai_teammates lists them (the agent.id of conduyt_connect_ai_teammate's answer and the senderId of its messages are the id too)");
|
|
101
|
+
/** the path segment of a teammate: trimmed and lower-cased (handles and ids are case-insensitive), an @handle travels as %40handle */
|
|
102
|
+
const seg = (teammateId) => encodeURIComponent(teammateId.trim().toLowerCase());
|
|
93
103
|
const WHO = "Owners and admins, with a person's API key (the chat scope); an AI teammate's own key is refused (403 agent_route_refused). The teammate must have the provider Grok Bot (409 agent_not_webhook_provider otherwise). Answers 404 ai_teammates_off while AI teammates are switched off and 402 plan_required when the workspace is not entitled. Against a server that predates these routes (an HTML 404) the error says so.";
|
|
94
104
|
export function registerAiTeammateConnectTools(server, client) {
|
|
95
|
-
|
|
105
|
+
// (#1153, tri-surface parity) the workspace's AI teammates, so an agent can find the one to connect by id or @handle
|
|
106
|
+
strictInput(server.tool("conduyt_list_ai_teammates", "List the workspace's live AI teammates (GET /api/v1/chat/agents; a removed teammate is not listed), oldest first: [{ id, handle, name, provider (claude_code, codex, grok), state (listening, replying, away), connected (a Grok Bot teammate: its connection is stored and live; any other: a listener runs now), connection (a Grok Bot teammate's not_connected, waiting_for_hello, listening or not_listening; null otherwise), createdAt }]. Nothing secret is listed. Name a teammate to the Grok Bot tools by its id or its @handle. Owners and admins, with a person's API key (the chat scope; reading is enough); a member's key is refused (403) and an AI teammate's own key too (403 agent_route_refused). Adding a teammate stays in Settings > AI. Answers 404 ai_teammates_off while AI teammates are switched off and 402 plan_required when the workspace is not entitled; a workspace with more than 200 live teammates is refused to an API key (413 agent_list_over_ceiling; Settings > AI lists them all).", {}, async () => {
|
|
107
|
+
try {
|
|
108
|
+
const res = await client.get("/api/v1/chat/agents");
|
|
109
|
+
return connectResult(unwrap(res), []);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
if (err instanceof ConduytApiError && err.code === "http") {
|
|
113
|
+
if (err.status === 403 && /interactive browser session/i.test(err.message))
|
|
114
|
+
return connectError(OLDER_LIST_SENTENCE, [], { status: 403 });
|
|
115
|
+
const r = refusalOf(err);
|
|
116
|
+
return connectError(r.sentence, [], { status: r.status, ...(r.code ? { code: r.code } : {}) });
|
|
117
|
+
}
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
}));
|
|
121
|
+
strictInput(server.tool("conduyt_connect_ai_teammate", `Step 1 of connecting a Grok Bot as an AI teammate (POST /api/v1/chat/agents/{id}/connect). Mints the teammate's token and returns it ONCE: { token, tokenPrefix, message, toolsUrl, agent }. Give the person the message to paste into Grok Bot and the token to paste into Grok Bot's masked connector field; NEVER post the token in Team Chat or any message, and never call this again just to read it: every call revokes the teammate's earlier tokens (the card's "Get a new token"). The calling key must hold the write tier and the chat and deals scopes (403 api_key_scope_insufficient otherwise). 409 agent_listener_webhook_conflict while the teammate's listener is running; 409 teammate_not_live when its owner lost access. Step 3 is conduyt_set_ai_teammate_webhook. ${WHO}`, { teammateId: TEAMMATE_ID }, async ({ teammateId }) => attempt([], () => client.post(`/api/v1/chat/agents/${seg(teammateId)}/connect`, {}), (res) => connectResult(unwrap(res), []))));
|
|
96
122
|
strictInput(server.tool("conduyt_set_ai_teammate_webhook", `Step 3 of connecting a Grok Bot (PUT /api/v1/chat/agents/{id}/webhook): the routine's address and key, as Grok Bot shows them. Send EITHER paste (the whole block the person copied: it must hold one https address and one key) OR address and key. Conduyt checks the address (https, a public host), stores both (the key encrypted), sends the test at once (10 s) and answers { stored, test: { ok, statusCode, runUuid, problem }, status }. The key is write-only: it is never returned, and any text this tool returns has it replaced by [hidden]. A test that was not accepted is an error result { ok: false, error: <its one sentence>, status: 200, code (key_refused, routine_gone, unreachable, not_accepted, rate_limited), answer: <the whole answer> }; an accepted test leaves status Waiting for Grok Bot to say hello: poll conduyt_get_ai_teammate_webhook (every few seconds, up to about 3 minutes) until state is listening or a problem is named. Refusals: 400 with the input codes (input_conflict, address_missing, address_invalid, address_ambiguous, key_missing, key_invalid, key_ambiguous), 422 address_invalid / unreachable, 409 agent_token_missing (run conduyt_connect_ai_teammate first), agent_listener_webhook_conflict, agent_webhook_contended, teammate_not_live, 429 after 20 tests per teammate in 10 minutes, 503 while a delivery is in flight. ${WHO}`, {
|
|
97
123
|
teammateId: TEAMMATE_ID,
|
|
98
124
|
paste: z.string().min(1).max(12_000).optional().describe("The block Grok Bot shows (address and key together); not with address or key"),
|
|
@@ -105,9 +131,9 @@ export function registerAiTeammateConnectTools(server, client) {
|
|
|
105
131
|
if (paste === undefined && address === undefined)
|
|
106
132
|
return connectError(NO_CREDENTIALS_SENTENCE, secrets, { status: null, code: "address_missing" });
|
|
107
133
|
// the body as ONE literal: the contract gate reads the request fields (paste, address, key) from it
|
|
108
|
-
return attempt(secrets, () => client.put(`/api/v1/chat/agents/${teammateId}/webhook`, { ...(paste !== undefined ? { paste } : {}), ...(address !== undefined ? { address } : {}), ...(key !== undefined ? { key } : {}) }), testOutcome(secrets));
|
|
134
|
+
return attempt(secrets, () => client.put(`/api/v1/chat/agents/${seg(teammateId)}/webhook`, { ...(paste !== undefined ? { paste } : {}), ...(address !== undefined ? { address } : {}), ...(key !== undefined ? { key } : {}) }), testOutcome(secrets));
|
|
109
135
|
}));
|
|
110
|
-
strictInput(server.tool("conduyt_test_ai_teammate_webhook", `The card's Test button (POST /api/v1/chat/agents/{id}/webhook/test): sends the hello again to the stored routine (nothing is pasted); an accepted test turns a stored connection live. Answers { test, status } like conduyt_set_ai_teammate_webhook (a test that was not accepted is an error result with its sentence); then poll conduyt_get_ai_teammate_webhook for the hello. 409 agent_webhook_not_connected when nothing is stored; 429 after 20 tests per teammate in 10 minutes. ${WHO}`, { teammateId: TEAMMATE_ID }, async ({ teammateId }) => attempt([], () => client.post(`/api/v1/chat/agents/${teammateId}/webhook/test`, {}), testOutcome([]))));
|
|
111
|
-
strictInput(server.tool("conduyt_get_ai_teammate_webhook", `The Grok Bot connection's status (GET /api/v1/chat/agents/{id}/webhook), what the Settings card polls: { state (not_connected | waiting_for_hello | listening | not_listening), label, problem: { code, message } | null (the sentence of what to fix), waitingUntil, connected, address (masked), lastAttempt, tokenUsedAt, lastMessageAt }. Never carries the key. ${WHO}`, { teammateId: TEAMMATE_ID }, async ({ teammateId }) => attempt([], () => client.get(`/api/v1/chat/agents/${teammateId}/webhook`), (res) => connectResult(unwrap(res), []))));
|
|
112
|
-
strictInput(server.tool("conduyt_disconnect_ai_teammate", `Disconnect a Grok Bot teammate (DELETE /api/v1/chat/agents/{id}/webhook; never blocked by billing): its tokens are revoked, the routine's key is cleared and pending deliveries are cancelled; the teammate and its messages stay. Answers { disconnected, revokedKeys, webhook, cancelledDeliveries }. Safe to repeat. Connect it again with conduyt_connect_ai_teammate then conduyt_set_ai_teammate_webhook. ${WHO.replace(" and 402 plan_required when the workspace is not entitled", "")}`, { teammateId: TEAMMATE_ID }, async ({ teammateId }) => attempt([], () => client.del(`/api/v1/chat/agents/${teammateId}/webhook`), (res) => connectResult(unwrap(res), []))));
|
|
136
|
+
strictInput(server.tool("conduyt_test_ai_teammate_webhook", `The card's Test button (POST /api/v1/chat/agents/{id}/webhook/test): sends the hello again to the stored routine (nothing is pasted); an accepted test turns a stored connection live. Answers { test, status } like conduyt_set_ai_teammate_webhook (a test that was not accepted is an error result with its sentence); then poll conduyt_get_ai_teammate_webhook for the hello. 409 agent_webhook_not_connected when nothing is stored; 429 after 20 tests per teammate in 10 minutes. ${WHO}`, { teammateId: TEAMMATE_ID }, async ({ teammateId }) => attempt([], () => client.post(`/api/v1/chat/agents/${seg(teammateId)}/webhook/test`, {}), testOutcome([]))));
|
|
137
|
+
strictInput(server.tool("conduyt_get_ai_teammate_webhook", `The Grok Bot connection's status (GET /api/v1/chat/agents/{id}/webhook), what the Settings card polls: { state (not_connected | waiting_for_hello | listening | not_listening), label, problem: { code, message } | null (the sentence of what to fix), waitingUntil, connected, address (masked), lastAttempt, tokenUsedAt, lastMessageAt }. Never carries the key. ${WHO}`, { teammateId: TEAMMATE_ID }, async ({ teammateId }) => attempt([], () => client.get(`/api/v1/chat/agents/${seg(teammateId)}/webhook`), (res) => connectResult(unwrap(res), []))));
|
|
138
|
+
strictInput(server.tool("conduyt_disconnect_ai_teammate", `Disconnect a Grok Bot teammate (DELETE /api/v1/chat/agents/{id}/webhook; never blocked by billing): its tokens are revoked, the routine's key is cleared and pending deliveries are cancelled; the teammate and its messages stay. Answers { disconnected, revokedKeys, webhook, cancelledDeliveries }. Safe to repeat. Connect it again with conduyt_connect_ai_teammate then conduyt_set_ai_teammate_webhook. ${WHO.replace(" and 402 plan_required when the workspace is not entitled", "")}`, { teammateId: TEAMMATE_ID }, async ({ teammateId }) => attempt([], () => client.del(`/api/v1/chat/agents/${seg(teammateId)}/webhook`), (res) => connectResult(unwrap(res), []))));
|
|
113
139
|
}
|
package/package.json
CHANGED
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
{
|
|
154
154
|
"match": "/api/v1/chat/agents",
|
|
155
155
|
"status": "excluded",
|
|
156
|
-
"reason": "(#599) session-only (assertSessionOnly): an admin manages
|
|
156
|
+
"reason": "(#599) creating, removing and pairing an AI teammate are session-only (assertSessionOnly): an admin manages them in Settings > AI; every API key is refused. (#1153) GET /chat/agents is covered by conduyt_list_ai_teammates and the Grok Bot connect routes by their five tools (a covered endpoint is never matched here)"
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
159
|
"match": "/api/v1/chat",
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-11-
|
|
3
|
-
"toolCount":
|
|
4
|
-
"totalEndpoints":
|
|
2
|
+
"generatedAt": "2026-11-06T22:13:20.826Z",
|
|
3
|
+
"toolCount": 393,
|
|
4
|
+
"totalEndpoints": 1162,
|
|
5
5
|
"counts": {
|
|
6
|
-
"covered":
|
|
7
|
-
"excluded":
|
|
8
|
-
"planned":
|
|
6
|
+
"covered": 347,
|
|
7
|
+
"excluded": 355,
|
|
8
|
+
"planned": 460,
|
|
9
9
|
"uncategorized": 0
|
|
10
10
|
},
|
|
11
11
|
"matrix": {
|
|
@@ -1312,20 +1312,22 @@
|
|
|
1312
1312
|
]
|
|
1313
1313
|
},
|
|
1314
1314
|
"GET /api/v1/chat/agents": {
|
|
1315
|
-
"status": "
|
|
1316
|
-
"
|
|
1315
|
+
"status": "covered",
|
|
1316
|
+
"tools": [
|
|
1317
|
+
"conduyt_list_ai_teammates"
|
|
1318
|
+
]
|
|
1317
1319
|
},
|
|
1318
1320
|
"POST /api/v1/chat/agents": {
|
|
1319
1321
|
"status": "excluded",
|
|
1320
|
-
"reason": "(#599) session-only (assertSessionOnly): an admin manages
|
|
1322
|
+
"reason": "(#599) creating, removing and pairing an AI teammate are session-only (assertSessionOnly): an admin manages them in Settings > AI; every API key is refused. (#1153) GET /chat/agents is covered by conduyt_list_ai_teammates and the Grok Bot connect routes by their five tools (a covered endpoint is never matched here)"
|
|
1321
1323
|
},
|
|
1322
1324
|
"PATCH /api/v1/chat/agents/:id": {
|
|
1323
1325
|
"status": "excluded",
|
|
1324
|
-
"reason": "(#599) session-only (assertSessionOnly): an admin manages
|
|
1326
|
+
"reason": "(#599) creating, removing and pairing an AI teammate are session-only (assertSessionOnly): an admin manages them in Settings > AI; every API key is refused. (#1153) GET /chat/agents is covered by conduyt_list_ai_teammates and the Grok Bot connect routes by their five tools (a covered endpoint is never matched here)"
|
|
1325
1327
|
},
|
|
1326
1328
|
"DELETE /api/v1/chat/agents/:id": {
|
|
1327
1329
|
"status": "excluded",
|
|
1328
|
-
"reason": "(#599) session-only (assertSessionOnly): an admin manages
|
|
1330
|
+
"reason": "(#599) creating, removing and pairing an AI teammate are session-only (assertSessionOnly): an admin manages them in Settings > AI; every API key is refused. (#1153) GET /chat/agents is covered by conduyt_list_ai_teammates and the Grok Bot connect routes by their five tools (a covered endpoint is never matched here)"
|
|
1329
1331
|
},
|
|
1330
1332
|
"POST /api/v1/chat/agents/:id/connect": {
|
|
1331
1333
|
"status": "covered",
|
|
@@ -1335,7 +1337,7 @@
|
|
|
1335
1337
|
},
|
|
1336
1338
|
"POST /api/v1/chat/agents/:id/pair-code": {
|
|
1337
1339
|
"status": "excluded",
|
|
1338
|
-
"reason": "(#599) session-only (assertSessionOnly): an admin manages
|
|
1340
|
+
"reason": "(#599) creating, removing and pairing an AI teammate are session-only (assertSessionOnly): an admin manages them in Settings > AI; every API key is refused. (#1153) GET /chat/agents is covered by conduyt_list_ai_teammates and the Grok Bot connect routes by their five tools (a covered endpoint is never matched here)"
|
|
1339
1341
|
},
|
|
1340
1342
|
"GET /api/v1/chat/agents/:id/webhook": {
|
|
1341
1343
|
"status": "covered",
|
|
@@ -1467,6 +1469,14 @@
|
|
|
1467
1469
|
"conduyt_list_chat_thread_files"
|
|
1468
1470
|
]
|
|
1469
1471
|
},
|
|
1472
|
+
"PUT /api/v1/chat/channels/:id/messages/:messageId/follow": {
|
|
1473
|
+
"status": "planned",
|
|
1474
|
+
"reason": "team chat read/post for agents"
|
|
1475
|
+
},
|
|
1476
|
+
"DELETE /api/v1/chat/channels/:id/messages/:messageId/follow": {
|
|
1477
|
+
"status": "planned",
|
|
1478
|
+
"reason": "team chat read/post for agents"
|
|
1479
|
+
},
|
|
1470
1480
|
"POST /api/v1/chat/channels/:id/messages/:messageId/handoff": {
|
|
1471
1481
|
"status": "planned",
|
|
1472
1482
|
"reason": "team chat read/post for agents"
|