@achieveai/hitl-mcp-server 1.2.0 → 2.0.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/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +131 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +54 -0
- package/dist/config.js.map +1 -0
- package/dist/git-context.d.ts +7 -0
- package/dist/git-context.d.ts.map +1 -0
- package/dist/git-context.js +29 -0
- package/dist/git-context.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/{index.js → mcp-server.js} +124 -113
- package/dist/mcp-server.js.map +1 -0
- package/dist/ntfy-transport.d.ts +41 -0
- package/dist/ntfy-transport.d.ts.map +1 -0
- package/dist/ntfy-transport.js +150 -0
- package/dist/ntfy-transport.js.map +1 -0
- package/dist/setup.d.ts +38 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +130 -0
- package/dist/setup.js.map +1 -0
- package/package.json +58 -63
- package/LICENSE +0 -20
- package/README.md +0 -422
- package/config/claude-desktop.json +0 -11
- package/config/cursor-mcp.json +0 -17
- package/config/vscode-mcp.json +0 -17
- package/dist/__tests__/dialog-manager.test.d.ts +0 -2
- package/dist/__tests__/dialog-manager.test.d.ts.map +0 -1
- package/dist/__tests__/dialog-manager.test.js +0 -140
- package/dist/__tests__/dialog-manager.test.js.map +0 -1
- package/dist/dialog-manager.d.ts +0 -37
- package/dist/dialog-manager.d.ts.map +0 -1
- package/dist/dialog-manager.js +0 -644
- package/dist/dialog-manager.js.map +0 -1
- package/dist/dialog-manager.test.d.ts +0 -2
- package/dist/dialog-manager.test.d.ts.map +0 -1
- package/dist/dialog-manager.test.js +0 -156
- package/dist/dialog-manager.test.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/test-client.d.ts +0 -3
- package/dist/test-client.d.ts.map +0 -1
- package/dist/test-client.js +0 -125
- package/dist/test-client.js.map +0 -1
- package/dist/test-dialog-manager.d.ts +0 -2
- package/dist/test-dialog-manager.d.ts.map +0 -1
- package/dist/test-dialog-manager.js +0 -156
- package/dist/test-dialog-manager.js.map +0 -1
- package/example-usage.md +0 -223
- package/mcp.json +0 -152
- package/sounds/notification.wav +0 -0
package/dist/dialog-manager.js
DELETED
|
@@ -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
|
-
'&': '&',
|
|
531
|
-
'<': '<',
|
|
532
|
-
'>': '>',
|
|
533
|
-
'"': '"',
|
|
534
|
-
"'": '''
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dialog-manager.test.d.ts","sourceRoot":"","sources":["../src/dialog-manager.test.ts"],"names":[],"mappings":""}
|