@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 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
- await sendChannelNotification(`Pipeline handoff: ${data.ticketDisplayNumber} "${data.ticketTitle}" [${data.priority}] status: ${data.fromStatus} → ${data.toStatus}. Zavolej poll_dev_queue pro prijeti ukolu.`, {
161
- event: "pipeline_handoff",
162
- ticket: data.ticketDisplayNumber,
163
- priority: data.priority,
164
- from_status: data.fromStatus,
165
- to_status: data.toStatus,
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.28.0",
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
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k-system/tickr-mcp",
3
- "version": "1.28.0",
3
+ "version": "1.29.0",
4
4
  "description": "MCP server for Tickr project management — 56 tools + setup CLI wizard",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",