@k-system/tickr-mcp 1.28.0 → 1.29.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/dist/channel.d.ts +1 -0
- package/dist/channel.js +64 -7
- package/dist/server.js +1 -1
- package/package.json +1 -1
package/dist/channel.d.ts
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* TICKR_TOKEN_ID — Guid tokenId (fallback)
|
|
19
19
|
* TICKR_AGENT_NAME — Název agenta pro session lookup (default: z config)
|
|
20
20
|
* TICKR_TENANT_ID — Tenant ID pro device grant
|
|
21
|
+
* TICKR_PROJECT — Project slug filtr (volitelný, pokud chybí = bez filtru)
|
|
21
22
|
* TICKR_NO_SIGNALR — "1" pro HTTP-only mode (bez SignalR)
|
|
22
23
|
*/
|
|
23
24
|
export {};
|
package/dist/channel.js
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* TICKR_TOKEN_ID — Guid tokenId (fallback)
|
|
19
19
|
* TICKR_AGENT_NAME — Název agenta pro session lookup (default: z config)
|
|
20
20
|
* TICKR_TENANT_ID — Tenant ID pro device grant
|
|
21
|
+
* TICKR_PROJECT — Project slug filtr (volitelný, pokud chybí = bez filtru)
|
|
21
22
|
* TICKR_NO_SIGNALR — "1" pro HTTP-only mode (bez SignalR)
|
|
22
23
|
*/
|
|
23
24
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -28,6 +29,7 @@ import { getDeviceGrantToken, loadSession, extractJwtClaim, } from "./device-gra
|
|
|
28
29
|
// --- Config ---
|
|
29
30
|
const config = loadConfig();
|
|
30
31
|
const NO_SIGNALR = process.env.TICKR_NO_SIGNALR === "1";
|
|
32
|
+
const PROJECT_FILTER = process.env.TICKR_PROJECT || null;
|
|
31
33
|
// --- MCP Channel Server ---
|
|
32
34
|
const mcp = new Server({ name: "tickr-devqueue", version: "1.0.0" }, {
|
|
33
35
|
capabilities: {
|
|
@@ -151,19 +153,74 @@ if (!NO_SIGNALR) {
|
|
|
151
153
|
});
|
|
152
154
|
// Nový ticket v queue
|
|
153
155
|
connection.on("DevTaskQueued", async (data) => {
|
|
156
|
+
// Filtruj podle projektu (pokud je TICKR_PROJECT nastaven)
|
|
157
|
+
if (PROJECT_FILTER && data.projectSlug && data.projectSlug !== PROJECT_FILTER)
|
|
158
|
+
return;
|
|
154
159
|
await sendChannelNotification(`Novy ticket ve fronte: ${data.ticketDisplayNumber ?? "unknown"}`, { event: "task_queued" });
|
|
155
160
|
});
|
|
156
161
|
// Pipeline handoff — cílená notifikace
|
|
162
|
+
// Auto-poll: channel server sám zavolá poll_dev_queue a pošle agentovi strukturovaná data
|
|
157
163
|
connection.on("PipelineHandoff", async (data) => {
|
|
158
164
|
if (!data.assignedTokenId || data.assignedTokenId !== tokenId)
|
|
159
165
|
return;
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
166
|
+
// Filtruj podle projektu (pokud je TICKR_PROJECT nastaven)
|
|
167
|
+
if (PROJECT_FILTER && data.projectSlug && data.projectSlug !== PROJECT_FILTER)
|
|
168
|
+
return;
|
|
169
|
+
let pollResult = null;
|
|
170
|
+
try {
|
|
171
|
+
// Timeout 10s — zabrání zaseknutí handleru pokud API neodpovídá
|
|
172
|
+
const abortController = new AbortController();
|
|
173
|
+
const timeout = setTimeout(() => abortController.abort(), 10_000);
|
|
174
|
+
const token = await accessTokenFactory();
|
|
175
|
+
const pollResponse = await fetch(`${config.apiUrl}/api/dev-queue/poll`, {
|
|
176
|
+
method: "GET",
|
|
177
|
+
headers: {
|
|
178
|
+
Authorization: `Bearer ${token}`,
|
|
179
|
+
Accept: "application/json",
|
|
180
|
+
},
|
|
181
|
+
signal: abortController.signal,
|
|
182
|
+
});
|
|
183
|
+
clearTimeout(timeout);
|
|
184
|
+
if (pollResponse.ok) {
|
|
185
|
+
const body = (await pollResponse.json());
|
|
186
|
+
pollResult = body?.data ?? null;
|
|
187
|
+
console.error(`[tickr-channel] Auto-poll success for ${data.ticketDisplayNumber}: assignmentId=${pollResult?.assignmentId ?? "none"}`);
|
|
188
|
+
}
|
|
189
|
+
else if (pollResponse.status === 204) {
|
|
190
|
+
console.error("[tickr-channel] Auto-poll: no tasks in queue (204)");
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
console.error(`[tickr-channel] Auto-poll failed: HTTP ${pollResponse.status}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
console.error("[tickr-channel] Auto-poll error:", err);
|
|
198
|
+
}
|
|
199
|
+
const ticket = pollResult?.ticket;
|
|
200
|
+
if (pollResult?.assignmentId && ticket) {
|
|
201
|
+
// Strukturovaná notifikace s daty ticketu — agent může rovnou začít pracovat
|
|
202
|
+
await sendChannelNotification(`Pipeline handoff: ${ticket.displayNumber ?? data.ticketDisplayNumber} "${ticket.title ?? data.ticketTitle}" [${ticket.priority ?? data.priority}] — ukol prirazen (assignmentId: ${pollResult.assignmentId}). Zavolej /check-queue pro zahajeni prace.`, {
|
|
203
|
+
event: "pipeline_handoff",
|
|
204
|
+
ticket: ticket.displayNumber ?? data.ticketDisplayNumber,
|
|
205
|
+
title: ticket.title ?? data.ticketTitle,
|
|
206
|
+
priority: ticket.priority ?? data.priority,
|
|
207
|
+
assignment_id: pollResult.assignmentId,
|
|
208
|
+
from_status: data.fromStatus,
|
|
209
|
+
to_status: data.toStatus,
|
|
210
|
+
auto_polled: true,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// Fallback: poll selhal nebo prázdná fronta — pošli původní textovou notifikaci
|
|
215
|
+
await sendChannelNotification(`Pipeline handoff: ${data.ticketDisplayNumber} "${data.ticketTitle}" [${data.priority}] — status: ${data.fromStatus} → ${data.toStatus}. Zavolej poll_dev_queue pro prijeti ukolu.`, {
|
|
216
|
+
event: "pipeline_handoff",
|
|
217
|
+
ticket: data.ticketDisplayNumber,
|
|
218
|
+
priority: data.priority,
|
|
219
|
+
from_status: data.fromStatus,
|
|
220
|
+
to_status: data.toStatus,
|
|
221
|
+
auto_polled: false,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
167
224
|
});
|
|
168
225
|
connection.onreconnecting(() => {
|
|
169
226
|
console.error("[tickr-channel] SignalR reconnecting...");
|
package/dist/server.js
CHANGED
|
@@ -112,7 +112,7 @@ export async function startServer() {
|
|
|
112
112
|
}
|
|
113
113
|
const server = new McpServer({
|
|
114
114
|
name: "tickr",
|
|
115
|
-
version: "1.
|
|
115
|
+
version: "1.29.0",
|
|
116
116
|
});
|
|
117
117
|
// Debug logging wrapper (dedup odstraněn — nefunkční cross-process, řeší se na API straně: TKR-ADR-0043)
|
|
118
118
|
{
|