@achieveai/hitl-mcp-server 1.2.0 → 2.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.
Files changed (58) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +131 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/config.d.ts +19 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +54 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/git-context.d.ts +7 -0
  10. package/dist/git-context.d.ts.map +1 -0
  11. package/dist/git-context.js +29 -0
  12. package/dist/git-context.js.map +1 -0
  13. package/dist/mcp-server.d.ts +3 -0
  14. package/dist/mcp-server.d.ts.map +1 -0
  15. package/dist/mcp-server.js +237 -0
  16. package/dist/mcp-server.js.map +1 -0
  17. package/dist/ntfy-transport.d.ts +41 -0
  18. package/dist/ntfy-transport.d.ts.map +1 -0
  19. package/dist/ntfy-transport.js +150 -0
  20. package/dist/ntfy-transport.js.map +1 -0
  21. package/dist/setup.d.ts +43 -0
  22. package/dist/setup.d.ts.map +1 -0
  23. package/dist/setup.js +184 -0
  24. package/dist/setup.js.map +1 -0
  25. package/package.json +61 -63
  26. package/scripts/postinstall.js +33 -0
  27. package/LICENSE +0 -20
  28. package/README.md +0 -422
  29. package/config/claude-desktop.json +0 -11
  30. package/config/cursor-mcp.json +0 -17
  31. package/config/vscode-mcp.json +0 -17
  32. package/dist/__tests__/dialog-manager.test.d.ts +0 -2
  33. package/dist/__tests__/dialog-manager.test.d.ts.map +0 -1
  34. package/dist/__tests__/dialog-manager.test.js +0 -140
  35. package/dist/__tests__/dialog-manager.test.js.map +0 -1
  36. package/dist/dialog-manager.d.ts +0 -37
  37. package/dist/dialog-manager.d.ts.map +0 -1
  38. package/dist/dialog-manager.js +0 -644
  39. package/dist/dialog-manager.js.map +0 -1
  40. package/dist/dialog-manager.test.d.ts +0 -2
  41. package/dist/dialog-manager.test.d.ts.map +0 -1
  42. package/dist/dialog-manager.test.js +0 -156
  43. package/dist/dialog-manager.test.js.map +0 -1
  44. package/dist/index.d.ts +0 -3
  45. package/dist/index.d.ts.map +0 -1
  46. package/dist/index.js +0 -222
  47. package/dist/index.js.map +0 -1
  48. package/dist/test-client.d.ts +0 -3
  49. package/dist/test-client.d.ts.map +0 -1
  50. package/dist/test-client.js +0 -125
  51. package/dist/test-client.js.map +0 -1
  52. package/dist/test-dialog-manager.d.ts +0 -2
  53. package/dist/test-dialog-manager.d.ts.map +0 -1
  54. package/dist/test-dialog-manager.js +0 -156
  55. package/dist/test-dialog-manager.js.map +0 -1
  56. package/example-usage.md +0 -223
  57. package/mcp.json +0 -152
  58. package/sounds/notification.wav +0 -0
@@ -1,644 +0,0 @@
1
- import express from 'express';
2
- import { v4 as uuidv4 } from 'uuid';
3
- import open from 'open';
4
- import { EventEmitter } from 'events';
5
- import { exec } from 'child_process';
6
- import path from 'path';
7
- import { fileURLToPath } from 'url';
8
- const __filename = fileURLToPath(import.meta.url);
9
- const __dirname = path.dirname(__filename);
10
- export class DialogManager extends EventEmitter {
11
- app;
12
- port;
13
- pendingDialogs;
14
- server;
15
- isInitialized = false;
16
- constructor(port = 0) {
17
- super();
18
- this.port = port;
19
- this.app = express();
20
- this.pendingDialogs = new Map();
21
- this.setupRoutes();
22
- }
23
- setupRoutes() {
24
- this.app.use(express.json());
25
- this.app.use(express.static('public'));
26
- this.app.get('/dialog/:id', (req, res) => {
27
- const dialogId = req.params.id;
28
- const dialog = this.pendingDialogs.get(dialogId);
29
- if (!dialog) {
30
- res.status(404).send('Dialog not found or expired');
31
- return;
32
- }
33
- const html = this.generateDialogHTML(dialog.request);
34
- res.send(html);
35
- });
36
- this.app.post('/dialog/:id/response', (req, res) => {
37
- const dialogId = req.params.id;
38
- const dialog = this.pendingDialogs.get(dialogId);
39
- if (!dialog) {
40
- res.status(404).json({ error: 'Dialog not found or expired' });
41
- return;
42
- }
43
- const response = {
44
- id: dialogId,
45
- selectedValues: req.body.selectedValues || [],
46
- otherText: req.body.otherText,
47
- timestamp: Date.now()
48
- };
49
- if (dialog.timeout) {
50
- clearTimeout(dialog.timeout);
51
- }
52
- dialog.resolve(response);
53
- this.pendingDialogs.delete(dialogId);
54
- res.json({ success: true });
55
- });
56
- this.app.get('/health', (_req, res) => {
57
- res.json({ status: 'healthy', pendingDialogs: this.pendingDialogs.size });
58
- });
59
- }
60
- generateDialogHTML(request) {
61
- return `<!DOCTYPE html>
62
- <html lang="en">
63
- <head>
64
- <meta charset="UTF-8">
65
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
66
- <title>Human In The Loop - Response Required</title>
67
- <script src="https://cdn.jsdelivr.net/npm/marked@11.1.1/lib/marked.umd.min.js"></script>
68
- <style>
69
- * {
70
- margin: 0;
71
- padding: 0;
72
- box-sizing: border-box;
73
- }
74
-
75
- body {
76
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
77
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
78
- height: 100vh;
79
- max-height: 100vh;
80
- overflow-y: auto;
81
- display: flex;
82
- justify-content: center;
83
- align-items: center;
84
- padding: 20px;
85
- }
86
-
87
- .dialog-container {
88
- background: white;
89
- border-radius: 12px;
90
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
91
- max-width: 600px;
92
- width: 100%;
93
- max-height: 90vh;
94
- overflow-y: auto;
95
- padding: 32px;
96
- animation: slideIn 0.3s ease-out;
97
- }
98
-
99
- @keyframes slideIn {
100
- from {
101
- opacity: 0;
102
- transform: translateY(-20px);
103
- }
104
- to {
105
- opacity: 1;
106
- transform: translateY(0);
107
- }
108
- }
109
-
110
- .header {
111
- margin-bottom: 24px;
112
- }
113
-
114
- .title {
115
- font-size: 24px;
116
- font-weight: 600;
117
- color: #1a202c;
118
- margin-bottom: 8px;
119
- }
120
-
121
- .subtitle {
122
- color: #718096;
123
- font-size: 14px;
124
- }
125
-
126
- .question {
127
- font-size: 18px;
128
- color: #2d3748;
129
- margin-bottom: 8px;
130
- font-weight: 500;
131
- }
132
-
133
- .context {
134
- background: #f7fafc;
135
- border-left: 4px solid #667eea;
136
- padding: 12px;
137
- margin-bottom: 24px;
138
- font-size: 14px;
139
- color: #4a5568;
140
- border-radius: 4px;
141
- max-height: 200px;
142
- overflow-y: auto;
143
- line-height: 1.6;
144
- }
145
-
146
- /* Markdown styling in context */
147
- .context strong {
148
- font-weight: 600;
149
- color: #2d3748;
150
- }
151
-
152
- .context code {
153
- background: #e2e8f0;
154
- padding: 2px 6px;
155
- border-radius: 3px;
156
- font-family: 'Courier New', monospace;
157
- font-size: 13px;
158
- }
159
-
160
- .context pre {
161
- background: #2d3748;
162
- color: #f7fafc;
163
- padding: 12px;
164
- border-radius: 6px;
165
- overflow-x: auto;
166
- margin: 8px 0;
167
- }
168
-
169
- .context pre code {
170
- background: transparent;
171
- color: inherit;
172
- padding: 0;
173
- }
174
-
175
- .context ul, .context ol {
176
- margin-left: 20px;
177
- margin-top: 8px;
178
- margin-bottom: 8px;
179
- }
180
-
181
- .context li {
182
- margin: 4px 0;
183
- }
184
-
185
- .context p {
186
- margin: 8px 0;
187
- }
188
-
189
- .context h1, .context h2, .context h3 {
190
- margin-top: 12px;
191
- margin-bottom: 8px;
192
- color: #2d3748;
193
- }
194
-
195
- .context a {
196
- color: #667eea;
197
- text-decoration: underline;
198
- }
199
-
200
- .context blockquote {
201
- border-left: 3px solid #cbd5e0;
202
- padding-left: 12px;
203
- margin: 8px 0;
204
- color: #718096;
205
- font-style: italic;
206
- }
207
-
208
- /* Custom scrollbar for context */
209
- .context::-webkit-scrollbar {
210
- width: 8px;
211
- }
212
-
213
- .context::-webkit-scrollbar-track {
214
- background: #e2e8f0;
215
- border-radius: 4px;
216
- }
217
-
218
- .context::-webkit-scrollbar-thumb {
219
- background: #cbd5e0;
220
- border-radius: 4px;
221
- }
222
-
223
- .context::-webkit-scrollbar-thumb:hover {
224
- background: #a0aec0;
225
- }
226
-
227
- .options-container {
228
- margin-bottom: 24px;
229
- }
230
-
231
- .option {
232
- display: flex;
233
- align-items: flex-start;
234
- margin-bottom: 16px;
235
- padding: 12px;
236
- border: 2px solid #e2e8f0;
237
- border-radius: 8px;
238
- cursor: pointer;
239
- transition: all 0.2s;
240
- }
241
-
242
- .option:hover {
243
- border-color: #667eea;
244
- background: #f7fafc;
245
- }
246
-
247
- .option.selected {
248
- border-color: #667eea;
249
- background: #edf2ff;
250
- }
251
-
252
- .option input {
253
- margin-right: 12px;
254
- margin-top: 2px;
255
- cursor: pointer;
256
- }
257
-
258
- .option-content {
259
- flex: 1;
260
- }
261
-
262
- .option-label {
263
- font-weight: 500;
264
- color: #2d3748;
265
- margin-bottom: 4px;
266
- }
267
-
268
- .option-description {
269
- font-size: 14px;
270
- color: #718096;
271
- }
272
-
273
- .other-section {
274
- margin-bottom: 24px;
275
- }
276
-
277
- .other-label {
278
- display: block;
279
- margin-bottom: 8px;
280
- font-weight: 500;
281
- color: #2d3748;
282
- }
283
-
284
- .other-input {
285
- width: 100%;
286
- padding: 12px;
287
- border: 2px solid #e2e8f0;
288
- border-radius: 8px;
289
- font-size: 16px;
290
- transition: border-color 0.2s;
291
- }
292
-
293
- .other-input:focus {
294
- outline: none;
295
- border-color: #667eea;
296
- }
297
-
298
- .button-container {
299
- display: flex;
300
- gap: 12px;
301
- }
302
-
303
- .button {
304
- flex: 1;
305
- padding: 12px 24px;
306
- border: none;
307
- border-radius: 8px;
308
- font-size: 16px;
309
- font-weight: 500;
310
- cursor: pointer;
311
- transition: all 0.2s;
312
- }
313
-
314
- .button-primary {
315
- background: #667eea;
316
- color: white;
317
- }
318
-
319
- .button-primary:hover {
320
- background: #5a67d8;
321
- }
322
-
323
- .button-secondary {
324
- background: #e2e8f0;
325
- color: #4a5568;
326
- }
327
-
328
- .button-secondary:hover {
329
- background: #cbd5e0;
330
- }
331
-
332
- .button:disabled {
333
- opacity: 0.5;
334
- cursor: not-allowed;
335
- }
336
-
337
- .error-message {
338
- color: #e53e3e;
339
- font-size: 14px;
340
- margin-top: 8px;
341
- display: none;
342
- }
343
- </style>
344
- </head>
345
- <body>
346
- <div class="dialog-container">
347
- <div class="header">
348
- <h1 class="title">Human Input Required</h1>
349
- <p class="subtitle">An AI agent needs your guidance to continue</p>
350
- </div>
351
-
352
- <div class="question">${this.escapeHtml(request.question)}</div>
353
-
354
- ${request.context ? `
355
- <div class="context">
356
- <strong>Context:</strong>
357
- <div id="context-content"></div>
358
- </div>
359
- ` : ''}
360
-
361
- <div class="options-container">
362
- ${request.options.map((option, index) => `
363
- <div class="option" onclick="toggleOption(${index})">
364
- <input type="${request.allowMultiple ? 'checkbox' : 'radio'}"
365
- name="options"
366
- id="option-${index}"
367
- value="${this.escapeHtml(option.value)}">
368
- <div class="option-content">
369
- <div class="option-label">${this.escapeHtml(option.label)}</div>
370
- ${option.description ? `
371
- <div class="option-description">${this.escapeHtml(option.description)}</div>
372
- ` : ''}
373
- </div>
374
- </div>
375
- `).join('')}
376
- </div>
377
-
378
- ${request.allowOther ? `
379
- <div class="other-section">
380
- <label class="other-label" for="other-input">Additional Context (optional):</label>
381
- <textarea class="other-input"
382
- id="other-input"
383
- rows="3"
384
- placeholder="Provide any additional context, clarifications, or notes to help guide the AI..."></textarea>
385
- </div>
386
- ` : ''}
387
-
388
- <div class="error-message" id="error-message"></div>
389
-
390
- <div class="button-container">
391
- <button class="button button-secondary" onclick="skipDialog()">Skip</button>
392
- <button class="button button-primary" onclick="submitResponse()">Submit Response</button>
393
- </div>
394
- </div>
395
-
396
- <script>
397
- const dialogId = '${request.id}';
398
- const allowMultiple = ${request.allowMultiple};
399
- const allowOther = ${request.allowOther};
400
- const contextMarkdown = ${request.context ? JSON.stringify(request.context) : 'null'};
401
-
402
- function toggleOption(index) {
403
- const option = document.getElementById('option-' + index);
404
- const optionDiv = option.closest('.option');
405
-
406
- if (!allowMultiple) {
407
- document.querySelectorAll('.option').forEach(el => {
408
- el.classList.remove('selected');
409
- });
410
- document.querySelectorAll('input[name="options"]').forEach(el => {
411
- el.checked = false;
412
- });
413
- }
414
-
415
- option.checked = !option.checked;
416
- if (option.checked) {
417
- optionDiv.classList.add('selected');
418
- } else {
419
- optionDiv.classList.remove('selected');
420
- }
421
- }
422
-
423
- function getSelectedValues() {
424
- const selected = [];
425
- document.querySelectorAll('input[name="options"]:checked').forEach(el => {
426
- selected.push(el.value);
427
- });
428
- return selected;
429
- }
430
-
431
- async function submitResponse() {
432
- const selectedValues = getSelectedValues();
433
- const otherText = allowOther ? document.getElementById('other-input').value.trim() : '';
434
-
435
- if (selectedValues.length === 0 && !otherText) {
436
- showError('Please select at least one option and/or provide additional context');
437
- return;
438
- }
439
-
440
- try {
441
- const response = await fetch(\`/dialog/\${dialogId}/response\`, {
442
- method: 'POST',
443
- headers: { 'Content-Type': 'application/json' },
444
- body: JSON.stringify({ selectedValues, otherText })
445
- });
446
-
447
- if (response.ok) {
448
- showSuccess();
449
- } else {
450
- showError('Failed to submit response. Please try again.');
451
- }
452
- } catch (error) {
453
- showError('Network error. Please check your connection.');
454
- }
455
- }
456
-
457
- async function skipDialog() {
458
- try {
459
- const response = await fetch(\`/dialog/\${dialogId}/response\`, {
460
- method: 'POST',
461
- headers: { 'Content-Type': 'application/json' },
462
- body: JSON.stringify({ selectedValues: [], otherText: 'SKIPPED' })
463
- });
464
-
465
- if (response.ok) {
466
- showSuccess('Response skipped');
467
- }
468
- } catch (error) {
469
- showError('Failed to skip. Please try again.');
470
- }
471
- }
472
-
473
- function showError(message) {
474
- const errorEl = document.getElementById('error-message');
475
- errorEl.textContent = message;
476
- errorEl.style.display = 'block';
477
- setTimeout(() => {
478
- errorEl.style.display = 'none';
479
- }, 5000);
480
- }
481
-
482
- function showSuccess(message = 'Response submitted successfully!') {
483
- document.querySelector('.dialog-container').innerHTML = \`
484
- <div style="text-align: center; padding: 48px;">
485
- <div style="font-size: 48px; margin-bottom: 16px;">✓</div>
486
- <h2 style="font-size: 24px; color: #2d3748; margin-bottom: 8px;">\${message}</h2>
487
- <p style="color: #718096;">You can close this window now.</p>
488
- </div>
489
- \`;
490
- setTimeout(() => {
491
- window.close();
492
- }, 2000);
493
- }
494
-
495
- // Allow Enter key to submit when other input is focused
496
- if (allowOther) {
497
- document.getElementById('other-input').addEventListener('keydown', (e) => {
498
- if (e.key === 'Enter' && e.ctrlKey) {
499
- submitResponse();
500
- }
501
- });
502
- }
503
-
504
- // Note: Sound notification is played from the server before opening the browser
505
- // No client-side sound needed
506
-
507
- // Render markdown in context
508
- if (contextMarkdown && typeof marked !== 'undefined') {
509
- const contextElement = document.getElementById('context-content');
510
- if (contextElement) {
511
- try {
512
- // Configure marked for safe HTML rendering
513
- marked.setOptions({
514
- breaks: true,
515
- gfm: true
516
- });
517
- contextElement.innerHTML = marked.parse(contextMarkdown);
518
- } catch (error) {
519
- // Fallback to plain text if markdown parsing fails
520
- contextElement.textContent = contextMarkdown;
521
- }
522
- }
523
- }
524
- </script>
525
- </body>
526
- </html>`;
527
- }
528
- escapeHtml(text) {
529
- const map = {
530
- '&': '&amp;',
531
- '<': '&lt;',
532
- '>': '&gt;',
533
- '"': '&quot;',
534
- "'": '&#039;'
535
- };
536
- return text.replace(/[&<>"']/g, m => map[m]);
537
- }
538
- async initialize() {
539
- if (this.isInitialized) {
540
- return this.port;
541
- }
542
- return new Promise((resolve, reject) => {
543
- this.server = this.app.listen(this.port, () => {
544
- const addr = this.server.address();
545
- this.port = typeof addr === 'object' && addr !== null ? addr.port : this.port;
546
- this.isInitialized = true;
547
- console.error(`Dialog server running on port ${this.port}`);
548
- resolve(this.port);
549
- });
550
- this.server.on('error', (error) => {
551
- reject(error);
552
- });
553
- });
554
- }
555
- async showDialog(request) {
556
- if (!this.isInitialized) {
557
- await this.initialize();
558
- }
559
- return new Promise((resolve, reject) => {
560
- const dialogId = request.id || uuidv4();
561
- const fullRequest = { ...request, id: dialogId };
562
- let timeout;
563
- if (request.timeout) {
564
- timeout = setTimeout(() => {
565
- this.pendingDialogs.delete(dialogId);
566
- reject(new Error('Dialog timeout'));
567
- }, request.timeout);
568
- }
569
- this.pendingDialogs.set(dialogId, {
570
- request: fullRequest,
571
- resolve,
572
- reject,
573
- timeout
574
- });
575
- const dialogUrl = `http://localhost:${this.port}/dialog/${dialogId}`;
576
- console.error(`Opening dialog: ${dialogUrl}`);
577
- // Play notification sound from server before opening browser
578
- this.playNotificationSound();
579
- open(dialogUrl).catch((err) => {
580
- console.error('Failed to open browser:', err);
581
- console.error(`Please manually open: ${dialogUrl}`);
582
- });
583
- });
584
- }
585
- playNotificationSound() {
586
- try {
587
- // Path to bundled notification sound (relative to dist folder) - used as fallback
588
- const bundledSound = path.join(__dirname, '..', 'sounds', 'notification.wav');
589
- if (process.platform === 'win32') {
590
- // Windows: Try system sound first, then fall back to bundled sound
591
- const systemSound = 'C:\\Windows\\Media\\Windows Notify Messaging.wav';
592
- const script = `(New-Object Media.SoundPlayer '${systemSound}').PlaySync()`;
593
- exec(`powershell -c "${script}"`, (error) => {
594
- if (error) {
595
- // Fallback to bundled custom sound
596
- const fallbackScript = `(New-Object Media.SoundPlayer '${bundledSound}').PlaySync()`;
597
- exec(`powershell -c "${fallbackScript}"`, (err2) => {
598
- if (err2) {
599
- // Final fallback to beeps
600
- const beepScript = '[console]::beep(659,150); [console]::beep(880,200)';
601
- exec(`powershell -c "${beepScript}"`, () => {
602
- process.stdout.write('\x07');
603
- });
604
- }
605
- });
606
- }
607
- });
608
- }
609
- else if (process.platform === 'darwin') {
610
- // macOS: Use system sound, fall back to bundled sound
611
- exec('afplay /System/Library/Sounds/Glass.aiff', (error) => {
612
- if (error) {
613
- exec(`afplay "${bundledSound}"`, () => {
614
- process.stdout.write('\x07');
615
- });
616
- }
617
- });
618
- }
619
- else {
620
- // Linux: Try system sound, fall back to bundled sound
621
- exec(`paplay /usr/share/sounds/freedesktop/stereo/message.oga 2>/dev/null || paplay "${bundledSound}" 2>/dev/null || beep || echo -en "\\a"`, (error) => {
622
- if (error) {
623
- process.stdout.write('\x07');
624
- }
625
- });
626
- }
627
- }
628
- catch (error) {
629
- // Ultimate fallback: ASCII bell character
630
- process.stdout.write('\x07');
631
- }
632
- }
633
- async close() {
634
- if (this.server) {
635
- return new Promise((resolve) => {
636
- this.server.close(() => {
637
- this.isInitialized = false;
638
- resolve();
639
- });
640
- });
641
- }
642
- }
643
- }
644
- //# sourceMappingURL=dialog-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialog-manager.js","sourceRoot":"","sources":["../src/dialog-manager.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=dialog-manager.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialog-manager.test.d.ts","sourceRoot":"","sources":["../src/dialog-manager.test.ts"],"names":[],"mappings":""}