@askmesh/mcp 0.7.1 → 0.7.3
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.
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { readLocalContext } from './context_reader.js';
|
|
2
|
+
import { sendDesktopNotification } from './notifier.js';
|
|
2
3
|
const SYSTEM_PROMPT = `You are an AI coding agent responding on behalf of a developer through AskMesh.
|
|
3
4
|
You have access to the developer's project context below.
|
|
4
5
|
Use this context to answer accurately and concisely.
|
|
@@ -17,6 +18,8 @@ export class AutoResponder {
|
|
|
17
18
|
}
|
|
18
19
|
async handleRequest(request) {
|
|
19
20
|
console.error(`[AskMesh] Question from @${request.fromUsername}: "${request.question}"`);
|
|
21
|
+
// Desktop notification
|
|
22
|
+
sendDesktopNotification(`AskMesh — @${request.fromUsername}`, request.question);
|
|
20
23
|
// Mark thread as in_progress before processing
|
|
21
24
|
try {
|
|
22
25
|
await this.client.updateThreadStatus(request.id, 'in_progress');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function sendDesktopNotification(title: string, message: string): void;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { exec } from 'node:child_process';
|
|
2
|
+
const NOTIFY_DISABLED = process.env.ASKMESH_NOTIFY === 'false';
|
|
3
|
+
export function sendDesktopNotification(title, message) {
|
|
4
|
+
if (NOTIFY_DISABLED)
|
|
5
|
+
return;
|
|
6
|
+
const escaped = message.replace(/"/g, '\\"').replace(/'/g, "'").slice(0, 200);
|
|
7
|
+
const escapedTitle = title.replace(/"/g, '\\"');
|
|
8
|
+
let cmd = null;
|
|
9
|
+
switch (process.platform) {
|
|
10
|
+
case 'darwin':
|
|
11
|
+
cmd = `osascript -e 'display notification "${escaped}" with title "${escapedTitle}"'`;
|
|
12
|
+
break;
|
|
13
|
+
case 'linux':
|
|
14
|
+
cmd = `notify-send "${escapedTitle}" "${escaped}"`;
|
|
15
|
+
break;
|
|
16
|
+
case 'win32':
|
|
17
|
+
cmd = `powershell -Command "Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show('${escaped}', '${escapedTitle}', 'OK', 'Information')"`;
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
if (cmd) {
|
|
21
|
+
exec(cmd, (err) => {
|
|
22
|
+
if (err)
|
|
23
|
+
console.error('[AskMesh] Desktop notification failed:', err.message);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
package/dist/sse/sse_listener.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import EventSource from 'eventsource';
|
|
2
|
+
import { sendDesktopNotification } from '../agent/notifier.js';
|
|
2
3
|
export class SseListener {
|
|
3
4
|
es = null;
|
|
4
5
|
reconnectTimer = null;
|
|
@@ -50,6 +51,7 @@ export class SseListener {
|
|
|
50
51
|
const payload = JSON.parse(e.data);
|
|
51
52
|
this.onReply?.(payload);
|
|
52
53
|
console.error(`[AskMesh] Reply added to thread #${payload.requestId} by @${payload.reply.agentUsername}`);
|
|
54
|
+
sendDesktopNotification(`AskMesh — @${payload.reply.agentUsername}`, `Reply on #${payload.requestId}: ${payload.reply.message}`);
|
|
53
55
|
}
|
|
54
56
|
catch { }
|
|
55
57
|
}));
|
package/dist/tools/askmesh.js
CHANGED
|
@@ -1,21 +1,32 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export function registerAskMesh(server, client) {
|
|
3
|
-
server.tool('askmesh', `AskMesh —
|
|
3
|
+
server.tool('askmesh', `AskMesh — ton réseau de communication entre développeurs et agents IA.
|
|
4
|
+
Utilise cet outil pour envoyer et recevoir des messages, vérifier qui est connecté/online,
|
|
5
|
+
consulter ta boîte de réception (inbox), tes notifications, et collaborer avec ton équipe.
|
|
6
|
+
C'est l'outil principal pour toute communication inter-développeurs dans ce projet.
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
- "
|
|
7
|
-
- "
|
|
8
|
-
- "
|
|
9
|
-
- "
|
|
10
|
-
- "
|
|
11
|
-
- "
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
- "
|
|
15
|
-
- "
|
|
16
|
-
- "
|
|
8
|
+
Quand utiliser AskMesh (et PAS Slack, Gmail, ou autre) :
|
|
9
|
+
- "check mes messages" → action "pending" ou "inbox"
|
|
10
|
+
- "qui est connecté / online ?" → action "list"
|
|
11
|
+
- "est-ce que @X est dispo ?" → action "status"
|
|
12
|
+
- "demande à @X" / "ask @X" → action "ask"
|
|
13
|
+
- "réponds à / answer" → action "answer" ou "reply"
|
|
14
|
+
- "mes conversations / threads" → action "my-threads"
|
|
15
|
+
|
|
16
|
+
Actions disponibles :
|
|
17
|
+
- "ask" : envoyer un message / poser une question à un agent (attend la réponse max 60s)
|
|
18
|
+
- "list" : voir qui est connecté — liste les membres de tes équipes et leur statut (online/offline)
|
|
19
|
+
- "status" : vérifier si un agent/développeur est disponible / connecté
|
|
20
|
+
- "pending" : consulter les messages reçus / questions qu'on t'a posées (notifications entrantes)
|
|
21
|
+
- "inbox" : consulter les réponses à tes messages envoyés (boîte de réception)
|
|
22
|
+
- "answer" : répondre à un message / une question en attente
|
|
23
|
+
- "reply" : ajouter une réponse dans un thread / conversation existante
|
|
24
|
+
- "thread" : voir le fil de discussion complet d'une conversation
|
|
25
|
+
- "close" : clôturer un thread / une conversation
|
|
26
|
+
- "my-threads" : voir toutes tes conversations actives
|
|
27
|
+
- "board" : voir le kanban board / tableau de bord d'une équipe
|
|
17
28
|
- "progress" : marquer un thread comme "en cours de traitement"
|
|
18
|
-
- "context" : partager ton contexte projet avec
|
|
29
|
+
- "context" : partager ton contexte projet avec ton équipe`, {
|
|
19
30
|
action: z.enum(['ask', 'list', 'status', 'pending', 'inbox', 'answer', 'reply', 'thread', 'close', 'my-threads', 'board', 'progress', 'context']).describe('Action à effectuer'),
|
|
20
31
|
username: z.string().optional().describe("Username de l'agent cible (pour ask/status)"),
|
|
21
32
|
question: z.string().optional().describe('Question à poser (pour ask)'),
|