claude-pager 0.3.20 → 0.3.24

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 (39) hide show
  1. package/dist/channels/ntfy/provider.d.ts.map +1 -1
  2. package/dist/channels/ntfy/provider.js +11 -2
  3. package/dist/channels/ntfy/provider.js.map +1 -1
  4. package/dist/channels/telegram/provider.d.ts.map +1 -1
  5. package/dist/channels/telegram/provider.js +35 -10
  6. package/dist/channels/telegram/provider.js.map +1 -1
  7. package/dist/daemon/__tests__/server.test.js +27 -1
  8. package/dist/daemon/__tests__/server.test.js.map +1 -1
  9. package/dist/daemon/index.d.ts.map +1 -1
  10. package/dist/daemon/index.js +3 -0
  11. package/dist/daemon/index.js.map +1 -1
  12. package/dist/daemon/server.d.ts.map +1 -1
  13. package/dist/daemon/server.js +24 -4
  14. package/dist/daemon/server.js.map +1 -1
  15. package/dist/daemon/terminal.d.ts +2 -0
  16. package/dist/daemon/terminal.d.ts.map +1 -1
  17. package/dist/daemon/terminal.js +22 -0
  18. package/dist/daemon/terminal.js.map +1 -1
  19. package/dist/dashboard/html.d.ts +1 -1
  20. package/dist/dashboard/html.d.ts.map +1 -1
  21. package/dist/dashboard/html.js +269 -22
  22. package/dist/dashboard/html.js.map +1 -1
  23. package/dist/sessions/__tests__/events.test.js +24 -0
  24. package/dist/sessions/__tests__/events.test.js.map +1 -1
  25. package/dist/sessions/events.d.ts +2 -0
  26. package/dist/sessions/events.d.ts.map +1 -1
  27. package/dist/sessions/events.js +14 -2
  28. package/dist/sessions/events.js.map +1 -1
  29. package/dist/types.d.ts +1 -0
  30. package/dist/types.d.ts.map +1 -1
  31. package/dist/utils/__tests__/ask-user-question.test.d.ts +2 -0
  32. package/dist/utils/__tests__/ask-user-question.test.d.ts.map +1 -0
  33. package/dist/utils/__tests__/ask-user-question.test.js +75 -0
  34. package/dist/utils/__tests__/ask-user-question.test.js.map +1 -0
  35. package/dist/utils/ask-user-question.d.ts +13 -0
  36. package/dist/utils/ask-user-question.d.ts.map +1 -0
  37. package/dist/utils/ask-user-question.js +65 -0
  38. package/dist/utils/ask-user-question.js.map +1 -0
  39. package/package.json +1 -1
@@ -131,6 +131,19 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
131
131
 
132
132
  .dismiss-btn:hover { opacity: 0.8; color: #f85149; }
133
133
 
134
+ .sound-btn {
135
+ background: none;
136
+ border: none;
137
+ cursor: pointer;
138
+ font-size: 16px;
139
+ opacity: 0.7;
140
+ transition: opacity 0.2s, transform 0.1s;
141
+ padding: 2px 6px;
142
+ }
143
+ .sound-btn:hover { opacity: 1; }
144
+ .sound-btn:active { transform: scale(0.92); }
145
+ .sound-btn.muted { opacity: 0.35; }
146
+
134
147
  .ci-row {
135
148
  display: flex;
136
149
  gap: 12px;
@@ -310,6 +323,31 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
310
323
  float: right;
311
324
  }
312
325
 
326
+ .aq-warning {
327
+ background: #2a1810;
328
+ border: 1px solid #5a2a02;
329
+ border-radius: 4px;
330
+ color: #f0883e;
331
+ font-size: 11px;
332
+ padding: 6px 8px;
333
+ margin: 6px 0 8px;
334
+ }
335
+
336
+ .aq-list { font-size: 12px; color: #c9d1d9; max-height: 260px; overflow-y: auto; }
337
+ .aq-question { margin: 6px 0; padding: 6px 8px; background: #0d1117; border-radius: 4px; }
338
+ .aq-header { color: #58a6ff; font-weight: 600; font-size: 11px; text-transform: uppercase; letter-spacing: 0.4px; margin-bottom: 3px; }
339
+ .aq-q { color: #f0f6fc; font-weight: 600; margin-bottom: 4px; }
340
+ .aq-options { list-style: none; padding: 0; margin: 0; }
341
+ .aq-options li { padding: 2px 0; }
342
+ .aq-opt-label { color: #c9d1d9; font-weight: 600; }
343
+ .aq-opt-desc { color: #8b949e; }
344
+
345
+ .action-btn.aq-allow {
346
+ background: #0d419d;
347
+ color: #cbe2ff;
348
+ }
349
+ .action-btn.aq-allow:hover { background: #1158c7; }
350
+
313
351
  .action-row {
314
352
  display: flex;
315
353
  gap: 8px;
@@ -573,6 +611,30 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
573
611
  .term-body { flex: 1; min-height: 0; padding: 8px; }
574
612
  .term-body .xterm { height: 100%; }
575
613
 
614
+ .term-keys-row {
615
+ display: flex;
616
+ gap: 6px;
617
+ padding: 8px 14px;
618
+ border-top: 1px solid #21262d;
619
+ flex-wrap: wrap;
620
+ }
621
+
622
+ .term-key-btn {
623
+ background: #161b22;
624
+ border: 1px solid #30363d;
625
+ border-radius: 4px;
626
+ color: #c9d1d9;
627
+ font-family: 'JetBrains Mono', monospace;
628
+ font-size: 11px;
629
+ padding: 3px 8px;
630
+ cursor: pointer;
631
+ min-width: 28px;
632
+ transition: background 0.15s, border-color 0.15s;
633
+ }
634
+
635
+ .term-key-btn:hover { background: #21262d; border-color: #58a6ff; }
636
+ .term-key-btn:active { background: #0d419d; }
637
+
576
638
  .term-input-row {
577
639
  display: flex;
578
640
  gap: 8px;
@@ -755,6 +817,7 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
755
817
  </div>
756
818
  <div class="meta">
757
819
  <button class="action-btn allow-all" id="allowAllBtn" style="display:none" onclick="allowAll()">Allow All</button>
820
+ <button class="sound-btn" id="soundBtn" onclick="toggleSound()" title="Toggle notification sound">🔔</button>
758
821
  <span class="status-dot connected" id="statusDot"></span>
759
822
  <span id="lastUpdate">connecting...</span>
760
823
  </div>
@@ -851,6 +914,65 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
851
914
  return '<pre style="font-size:10px;color:#8b949e;word-break:break-all;white-space:pre-wrap;margin:4px 0;max-height:200px;overflow-y:auto">' + escapeHtml(input.slice(0, 3000)) + '</pre>';
852
915
  }
853
916
 
917
+ function parseAskUserQuestion(toolInput) {
918
+ try {
919
+ const obj = typeof toolInput === 'string' ? JSON.parse(toolInput) : toolInput;
920
+ if (!obj || !Array.isArray(obj.questions)) return null;
921
+ return obj.questions.map(q => ({
922
+ header: q.header || '',
923
+ question: q.question || '',
924
+ options: Array.isArray(q.options)
925
+ ? q.options.map(o => ({ label: o.label || '', description: o.description || '' }))
926
+ : [],
927
+ }));
928
+ } catch { return null; }
929
+ }
930
+
931
+ function renderAskUser(questions) {
932
+ return '<div class="aq-list">' + questions.map((q, i) => {
933
+ const head = q.header ? '<div class="aq-header">' + escapeHtml(q.header) + '</div>' : '';
934
+ const opts = q.options.map((o, j) =>
935
+ '<li><span class="aq-opt-label">' + escapeHtml(o.label) + '</span>'
936
+ + (o.description ? '<span class="aq-opt-desc"> — ' + escapeHtml(o.description.slice(0, 200)) + (o.description.length > 200 ? '…' : '') + '</span>' : '')
937
+ + '</li>'
938
+ ).join('');
939
+ return '<div class="aq-question">'
940
+ + head
941
+ + '<div class="aq-q">' + escapeHtml(q.question) + '</div>'
942
+ + (opts ? '<ul class="aq-options">' + opts + '</ul>' : '')
943
+ + '</div>';
944
+ }).join('') + '</div>';
945
+ }
946
+
947
+ async function openAskUserPicker(eventId, sessionId, pane, btn) {
948
+ if (btn) btn.disabled = true;
949
+ try {
950
+ showToast(btn, 'Allow envoyé…', false);
951
+ // Allow the AskUserQuestion tool so Claude renders the picker in tmux.
952
+ // We tell the user *exactly* this happened so the action is never
953
+ // mistaken for picking an option.
954
+ const res = await fetch('/api/v1/respond-to', {
955
+ method: 'POST',
956
+ headers: { 'Content-Type': 'application/json' },
957
+ body: JSON.stringify({ eventId, response: 'allow' }),
958
+ });
959
+ if (!res.ok) {
960
+ let msg = 'Allow failed';
961
+ try { msg = (await res.json()).error || msg; } catch {}
962
+ showToast(btn, msg, true);
963
+ if (btn) btn.disabled = false;
964
+ return;
965
+ }
966
+ // Give the picker a moment to render, then open the terminal modal so
967
+ // the user can navigate with the arrow keys + Enter.
968
+ setTimeout(() => openTerminal(sessionId, pane), 400);
969
+ } catch (e) {
970
+ console.error('openAskUserPicker error:', e);
971
+ showToast(btn, 'Allow error: ' + e, true);
972
+ }
973
+ if (btn) btn.disabled = false;
974
+ }
975
+
854
976
  function stateLabel(state) {
855
977
  const labels = {
856
978
  working: 'Working',
@@ -876,28 +998,52 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
876
998
  const contextInfo = q.context
877
999
  ? '<div style="font-size:11px;color:#c9d1d9;margin-bottom:6px;white-space:pre-wrap">' + escapeHtml(q.context.slice(-300)) + '</div>'
878
1000
  : '';
879
- const toolInfo = q.toolName
880
- ? contextInfo + '<span class="tool">' + escapeHtml(q.toolName) + '</span>' +
881
- (q.toolInput ? '<br>' + formatToolInput(q.toolInput) : '')
882
- : '<div class="prompt-msg" style="font-size:12px;color:#c9d1d9;white-space:pre-wrap;max-height:240px;overflow-y:auto">' + escapeHtml(q.message) + '</div>';
883
-
884
- const actions = isPermission
885
- ? \`<div class="action-row">
886
- <button class="action-btn allow" onclick="respondTo('\${q.eventId}', 'allow', this)">✓ Allow</button>
887
- <button class="action-btn deny" onclick="respondTo('\${q.eventId}', 'deny', this)">✗ Deny</button>
888
- </div>\`
889
- : \`<div class="action-row" style="align-items:center">
890
- <input type="text" class="reply-input" id="reply-\${q.eventId}" placeholder="Type a reply..." onkeydown="if(event.key==='Enter')respondTo('\${q.eventId}',this.value,this)">
891
- <button class="action-btn allow" onclick="respondTo('\${q.eventId}',document.getElementById('reply-\${q.eventId}').value,this)">Send</button>
892
- </div>\`;
893
-
894
- pending = \`
895
- <div class="pending-box">
896
- <span class="ago">\${timeAgo(Date.now() - q.agoSeconds * 1000)}</span>
897
- \${toolInfo}
898
- \${actions}
899
- </div>
900
- \`;
1001
+
1002
+ // Special-case AskUserQuestion: this Claude Code tool opens an
1003
+ // interactive multi-question picker in the terminal. Allow only
1004
+ // *opens* the picker (does NOT pick an option) clicking what looks
1005
+ // like an answer button would mislead the user. Render the questions
1006
+ // for context and route the user to the terminal modal to navigate.
1007
+ const askUser = (q.toolName === 'AskUserQuestion' && q.toolInput)
1008
+ ? parseAskUserQuestion(q.toolInput) : null;
1009
+
1010
+ if (askUser && s.tmuxPane) {
1011
+ pending = \`
1012
+ <div class="pending-box">
1013
+ <span class="ago">\${timeAgo(Date.now() - q.agoSeconds * 1000)}</span>
1014
+ \${contextInfo}
1015
+ <div class="aq-warning">⚠ Question interactive — Allow ouvre le picker mais ne répond pas. Utilise le terminal pour naviguer.</div>
1016
+ \${renderAskUser(askUser)}
1017
+ <div class="action-row">
1018
+ <button class="action-btn aq-allow" onclick="openAskUserPicker('\${q.eventId}','\${s.sessionId}','\${s.tmuxPane}', this)" title="Autorise le tool AskUserQuestion, puis ouvre la modal terminal pour naviguer le picker">📟 Allow + ouvrir le terminal</button>
1019
+ <button class="action-btn deny" onclick="respondTo('\${q.eventId}', 'deny', this)">✗ Deny</button>
1020
+ </div>
1021
+ </div>
1022
+ \`;
1023
+ } else {
1024
+ const toolInfo = q.toolName
1025
+ ? contextInfo + '<span class="tool">' + escapeHtml(q.toolName) + '</span>' +
1026
+ (q.toolInput ? '<br>' + formatToolInput(q.toolInput) : '')
1027
+ : '<div class="prompt-msg" style="font-size:12px;color:#c9d1d9;white-space:pre-wrap;max-height:240px;overflow-y:auto">' + escapeHtml(q.message) + '</div>';
1028
+
1029
+ const actions = isPermission
1030
+ ? \`<div class="action-row">
1031
+ <button class="action-btn allow" onclick="respondTo('\${q.eventId}', 'allow', this)">✓ Allow</button>
1032
+ <button class="action-btn deny" onclick="respondTo('\${q.eventId}', 'deny', this)">✗ Deny</button>
1033
+ </div>\`
1034
+ : \`<div class="action-row" style="align-items:center">
1035
+ <input type="text" class="reply-input" id="reply-\${q.eventId}" placeholder="Type a reply..." onkeydown="if(event.key==='Enter')respondTo('\${q.eventId}',this.value,this)">
1036
+ <button class="action-btn allow" onclick="respondTo('\${q.eventId}',document.getElementById('reply-\${q.eventId}').value,this)">Send</button>
1037
+ </div>\`;
1038
+
1039
+ pending = \`
1040
+ <div class="pending-box">
1041
+ <span class="ago">\${timeAgo(Date.now() - q.agoSeconds * 1000)}</span>
1042
+ \${toolInfo}
1043
+ \${actions}
1044
+ </div>
1045
+ \`;
1046
+ }
901
1047
  }
902
1048
 
903
1049
  const hasGit = s.git.branch !== 'unknown';
@@ -1064,6 +1210,7 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
1064
1210
  }
1065
1211
 
1066
1212
  function render(data) {
1213
+ detectNewPending(data);
1067
1214
  const container = document.getElementById('projects');
1068
1215
  if (!data.projects || data.projects.length === 0) {
1069
1216
  container.innerHTML = \`
@@ -1404,6 +1551,77 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
1404
1551
  fetchDashboard();
1405
1552
  }
1406
1553
 
1554
+ // --- Notification sound ---
1555
+ // Tracks pending event ids we already showed; new ones trigger the ding.
1556
+ // First render seeds the set without sounding so a page reload doesn't
1557
+ // beep for prompts that were already pending.
1558
+ let soundEnabled = localStorage.getItem('soundEnabled') !== 'false';
1559
+ let audioCtx = null;
1560
+ let seenEventIds = new Set();
1561
+ let firstSoundCheck = true;
1562
+
1563
+ function updateSoundBtn() {
1564
+ const btn = document.getElementById('soundBtn');
1565
+ if (!btn) return;
1566
+ btn.textContent = soundEnabled ? '🔔' : '🔕';
1567
+ btn.classList.toggle('muted', !soundEnabled);
1568
+ }
1569
+
1570
+ function initAudio() {
1571
+ if (audioCtx) return;
1572
+ try { audioCtx = new (window.AudioContext || window.webkitAudioContext)(); } catch {}
1573
+ }
1574
+
1575
+ function playNotificationSound() {
1576
+ if (!soundEnabled) return;
1577
+ initAudio();
1578
+ if (!audioCtx) return;
1579
+ if (audioCtx.state === 'suspended') audioCtx.resume();
1580
+ const t0 = audioCtx.currentTime;
1581
+ // Two-note ding: E5 then C5, sine wave with a soft attack + decay so
1582
+ // it doesn't pop. Quiet (peak 0.18) — meant to be noticed, not jarring.
1583
+ [659.25, 523.25].forEach((freq, i) => {
1584
+ const start = t0 + i * 0.13;
1585
+ const osc = audioCtx.createOscillator();
1586
+ const gain = audioCtx.createGain();
1587
+ osc.type = 'sine';
1588
+ osc.frequency.value = freq;
1589
+ gain.gain.setValueAtTime(0.0001, start);
1590
+ gain.gain.exponentialRampToValueAtTime(0.18, start + 0.02);
1591
+ gain.gain.exponentialRampToValueAtTime(0.0001, start + 0.22);
1592
+ osc.connect(gain);
1593
+ gain.connect(audioCtx.destination);
1594
+ osc.start(start);
1595
+ osc.stop(start + 0.25);
1596
+ });
1597
+ }
1598
+
1599
+ function toggleSound() {
1600
+ initAudio();
1601
+ soundEnabled = !soundEnabled;
1602
+ localStorage.setItem('soundEnabled', String(soundEnabled));
1603
+ updateSoundBtn();
1604
+ if (soundEnabled) playNotificationSound(); // sample so the user hears what they enabled
1605
+ }
1606
+
1607
+ function detectNewPending(data) {
1608
+ const current = new Set();
1609
+ if (data && Array.isArray(data.projects)) {
1610
+ for (const p of data.projects) {
1611
+ for (const s of (p.sessions || [])) {
1612
+ if (s.pendingQuestion && s.pendingQuestion.eventId) current.add(s.pendingQuestion.eventId);
1613
+ }
1614
+ }
1615
+ }
1616
+ if (!firstSoundCheck) {
1617
+ for (const id of current) {
1618
+ if (!seenEventIds.has(id)) { playNotificationSound(); break; }
1619
+ }
1620
+ }
1621
+ seenEventIds = current;
1622
+ firstSoundCheck = false;
1623
+ }
1624
+
1407
1625
  // --- Terminal view ---
1408
1626
  let termState = null; // { overlay, term, sessionId, pollTimer }
1409
1627
 
@@ -1412,6 +1630,8 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
1412
1630
 
1413
1631
  const overlay = document.createElement('div');
1414
1632
  overlay.className = 'term-overlay';
1633
+ const keyBtn = (label, k) =>
1634
+ '<button class="term-key-btn" data-key="' + k + '" title="Send ' + k + '">' + label + '</button>';
1415
1635
  overlay.innerHTML =
1416
1636
  '<div class="term-modal">'
1417
1637
  + '<div class="term-head">'
@@ -1420,6 +1640,11 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
1420
1640
  + '<button class="term-close" title="Close">✕</button>'
1421
1641
  + '</div>'
1422
1642
  + '<div class="term-body"><div class="term-xterm"></div></div>'
1643
+ + '<div class="term-keys-row">'
1644
+ + keyBtn('↑', 'Up') + keyBtn('↓', 'Down') + keyBtn('←', 'Left') + keyBtn('→', 'Right')
1645
+ + keyBtn('⏎', 'Enter') + keyBtn('Esc', 'Escape') + keyBtn('Tab', 'Tab')
1646
+ + keyBtn('⌫', 'BSpace') + keyBtn('^C', 'C-c')
1647
+ + '</div>'
1423
1648
  + '<div class="term-input-row">'
1424
1649
  + '<input type="text" class="term-send" placeholder="Type and press Enter to send to the session...">'
1425
1650
  + '</div>'
@@ -1452,6 +1677,14 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
1452
1677
  };
1453
1678
  sendInput.focus();
1454
1679
 
1680
+ overlay.querySelectorAll('.term-key-btn').forEach(btn => {
1681
+ btn.onclick = (e) => {
1682
+ e.preventDefault();
1683
+ sendTerminalSpecialKey(sessionId, btn.dataset.key);
1684
+ sendInput.focus();
1685
+ };
1686
+ });
1687
+
1455
1688
  await refreshTerminal();
1456
1689
  termState.pollTimer = setInterval(refreshTerminal, 2000);
1457
1690
  }
@@ -1495,6 +1728,19 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
1495
1728
  }
1496
1729
  }
1497
1730
 
1731
+ async function sendTerminalSpecialKey(sessionId, key) {
1732
+ try {
1733
+ await fetch('/api/v1/session/' + sessionId + '/keys', {
1734
+ method: 'POST',
1735
+ headers: { 'Content-Type': 'application/json' },
1736
+ body: JSON.stringify({ key }),
1737
+ });
1738
+ setTimeout(refreshTerminal, 150);
1739
+ } catch (e) {
1740
+ console.error('terminal special-key error:', e);
1741
+ }
1742
+ }
1743
+
1498
1744
  async function fetchDashboard() {
1499
1745
  try {
1500
1746
  const res = await fetch('/api/v1/dashboard');
@@ -1508,6 +1754,7 @@ exports.DASHBOARD_HTML = `<!DOCTYPE html>
1508
1754
  }
1509
1755
  }
1510
1756
 
1757
+ updateSoundBtn();
1511
1758
  fetchDashboard();
1512
1759
 
1513
1760
  // SSE for instant push — polling as fallback
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/dashboard/html.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAw/CtB,CAAC"}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/dashboard/html.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA+uDtB,CAAC"}
@@ -99,5 +99,29 @@ function makeEvent(id, overrides) {
99
99
  strict_1.default.equal(result.question.event.id, 'evt-2');
100
100
  });
101
101
  });
102
+ (0, node_test_1.describe)('pending TTL configuration', () => {
103
+ (0, node_test_1.it)('defaults to 12 hours', () => {
104
+ // Default is 12h, but a previous test may have overridden it. Reset
105
+ // and assert the documented default.
106
+ (0, events_js_1.setPendingTtlMs)(12 * 60 * 60 * 1000);
107
+ strict_1.default.equal((0, events_js_1.getPendingTtlMs)(), 12 * 60 * 60 * 1000);
108
+ });
109
+ (0, node_test_1.it)('expires pending entries after the configured TTL', async () => {
110
+ (0, events_js_1.setPendingTtlMs)(50);
111
+ (0, events_js_1.addPending)(makeEvent('evt-ttl'));
112
+ strict_1.default.equal((0, events_js_1.listPending)().length, 1);
113
+ await new Promise(r => setTimeout(r, 120));
114
+ strict_1.default.equal((0, events_js_1.listPending)().length, 0, 'entry should have expired');
115
+ // Restore default so it does not leak to other tests.
116
+ (0, events_js_1.setPendingTtlMs)(12 * 60 * 60 * 1000);
117
+ });
118
+ (0, node_test_1.it)('ignores non-positive values', () => {
119
+ (0, events_js_1.setPendingTtlMs)(5000);
120
+ (0, events_js_1.setPendingTtlMs)(0);
121
+ (0, events_js_1.setPendingTtlMs)(-1);
122
+ strict_1.default.equal((0, events_js_1.getPendingTtlMs)(), 5000, 'invalid values should not clobber the current TTL');
123
+ (0, events_js_1.setPendingTtlMs)(12 * 60 * 60 * 1000);
124
+ });
125
+ });
102
126
  });
103
127
  //# sourceMappingURL=events.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.test.js","sourceRoot":"","sources":["../../../src/sessions/__tests__/events.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.test.js","sourceRoot":"","sources":["../../../src/sessions/__tests__/events.test.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ export declare function addPending(event: RelayEvent, channelMessageId?: string)
3
3
  export declare function getPending(eventId: string): PendingQuestion | undefined;
4
4
  export declare function removePending(eventId: string): void;
5
5
  export declare function isResolved(eventId: string): boolean;
6
+ export declare function setPendingTtlMs(ms: number): void;
7
+ export declare function getPendingTtlMs(): number;
6
8
  export declare function listPending(): PendingQuestion[];
7
9
  export interface ResolvedResponse {
8
10
  question: PendingQuestion;
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/sessions/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ/D,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAU/E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEvE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQnD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnD;AAKD,wBAAgB,WAAW,IAAI,eAAe,EAAE,CAS/C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAsCxE"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/sessions/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ/D,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAU/E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEvE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQnD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnD;AAQD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,WAAW,IAAI,eAAe,EAAE,CAS/C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAsCxE"}
@@ -4,6 +4,8 @@ exports.addPending = addPending;
4
4
  exports.getPending = getPending;
5
5
  exports.removePending = removePending;
6
6
  exports.isResolved = isResolved;
7
+ exports.setPendingTtlMs = setPendingTtlMs;
8
+ exports.getPendingTtlMs = getPendingTtlMs;
7
9
  exports.listPending = listPending;
8
10
  exports.resolveResponse = resolveResponse;
9
11
  const pending = new Map();
@@ -38,12 +40,22 @@ function removePending(eventId) {
38
40
  function isResolved(eventId) {
39
41
  return resolved.has(eventId);
40
42
  }
41
- const PENDING_TTL_MS = 30 * 60 * 1000; // 30 minutes
43
+ // Default 12 hours so overnight prompts survive until morning. Configurable
44
+ // via RelayConfig.pendingTtlSeconds — the daemon calls setPendingTtlMs() at
45
+ // startup with the configured value.
46
+ let pendingTtlMs = 12 * 60 * 60 * 1000;
47
+ function setPendingTtlMs(ms) {
48
+ if (ms > 0)
49
+ pendingTtlMs = ms;
50
+ }
51
+ function getPendingTtlMs() {
52
+ return pendingTtlMs;
53
+ }
42
54
  function listPending() {
43
55
  // Expire old questions
44
56
  const now = Date.now();
45
57
  for (const [id, q] of pending) {
46
- if (now - q.notifiedAt > PENDING_TTL_MS) {
58
+ if (now - q.notifiedAt > pendingTtlMs) {
47
59
  pending.delete(id);
48
60
  }
49
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/sessions/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/sessions/events.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -15,6 +15,7 @@ export interface RelayConfig {
15
15
  dataDir: string;
16
16
  ci?: CIConfig;
17
17
  dashboard?: DashboardConfig;
18
+ pendingTtlSeconds?: number;
18
19
  }
19
20
  export interface DashboardConfig {
20
21
  bind?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAK9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAG/C,aAAa,CAAC,EAAE,OAAO,CAAC;IAIxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAIf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,SAAS,GAAG,mBAAmB,GAAG,aAAa,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd,SAAS,CAAC,EAAE,eAAe,CAAC;IAI5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAK9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAG/C,aAAa,CAAC,EAAE,OAAO,CAAC;IAIxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAIf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,SAAS,GAAG,mBAAmB,GAAG,aAAa,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ask-user-question.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user-question.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/ask-user-question.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const ask_user_question_js_1 = require("../ask-user-question.js");
9
+ const sample = JSON.stringify({
10
+ questions: [
11
+ {
12
+ header: 'Modèle de zone AAR',
13
+ question: 'Comment modéliser une zone de ravitaillement en base ?',
14
+ options: [
15
+ { label: 'Entité dédiée RefuelingZone', description: 'Nouvelle entité' },
16
+ { label: 'Étendre Zone existante', description: 'Ajout zoneType=AAR' },
17
+ ],
18
+ },
19
+ {
20
+ header: 'Propriété',
21
+ question: 'Qui possède la zone ?',
22
+ options: [
23
+ { label: 'Théâtre' },
24
+ { label: 'Mission' },
25
+ ],
26
+ },
27
+ ],
28
+ });
29
+ (0, node_test_1.describe)('AskUserQuestion utils', () => {
30
+ (0, node_test_1.it)('detects the tool name', () => {
31
+ strict_1.default.equal((0, ask_user_question_js_1.isAskUserQuestion)('AskUserQuestion'), true);
32
+ strict_1.default.equal((0, ask_user_question_js_1.isAskUserQuestion)('Bash'), false);
33
+ strict_1.default.equal((0, ask_user_question_js_1.isAskUserQuestion)(undefined), false);
34
+ });
35
+ (0, node_test_1.it)('parses well-formed input', () => {
36
+ const out = (0, ask_user_question_js_1.parseAskUserQuestion)(sample);
37
+ strict_1.default.ok(out);
38
+ strict_1.default.equal(out.length, 2);
39
+ strict_1.default.equal(out[0].header, 'Modèle de zone AAR');
40
+ strict_1.default.equal(out[0].options.length, 2);
41
+ strict_1.default.equal(out[0].options[0].label, 'Entité dédiée RefuelingZone');
42
+ strict_1.default.equal(out[1].options[0].description, undefined);
43
+ });
44
+ (0, node_test_1.it)('returns null on garbage', () => {
45
+ strict_1.default.equal((0, ask_user_question_js_1.parseAskUserQuestion)(undefined), null);
46
+ strict_1.default.equal((0, ask_user_question_js_1.parseAskUserQuestion)(''), null);
47
+ strict_1.default.equal((0, ask_user_question_js_1.parseAskUserQuestion)('not json'), null);
48
+ strict_1.default.equal((0, ask_user_question_js_1.parseAskUserQuestion)('{}'), null);
49
+ strict_1.default.equal((0, ask_user_question_js_1.parseAskUserQuestion)('{"questions": "nope"}'), null);
50
+ });
51
+ (0, node_test_1.it)('drops entries with no question text', () => {
52
+ const out = (0, ask_user_question_js_1.parseAskUserQuestion)(JSON.stringify({
53
+ questions: [{ options: [] }, { question: 'real one', options: [] }],
54
+ }));
55
+ strict_1.default.equal(out.length, 1);
56
+ strict_1.default.equal(out[0].question, 'real one');
57
+ });
58
+ (0, node_test_1.it)('formats text rendering with caps', () => {
59
+ const out = (0, ask_user_question_js_1.parseAskUserQuestion)(sample);
60
+ const text = (0, ask_user_question_js_1.formatAskUserQuestionText)(out, 1000);
61
+ strict_1.default.match(text, /Q1\. Comment/);
62
+ strict_1.default.match(text, /\[Modèle de zone AAR\]/);
63
+ strict_1.default.match(text, /1\) Entité dédiée/);
64
+ strict_1.default.match(text, /Q2\. Qui possède/);
65
+ });
66
+ (0, node_test_1.it)('truncates long descriptions', () => {
67
+ const long = 'A'.repeat(500);
68
+ const input = JSON.stringify({ questions: [{ question: 'q', options: [{ label: 'l', description: long }] }] });
69
+ const out = (0, ask_user_question_js_1.parseAskUserQuestion)(input);
70
+ const text = (0, ask_user_question_js_1.formatAskUserQuestionText)(out, 50);
71
+ strict_1.default.match(text, /AAAA…/);
72
+ strict_1.default.ok(!text.includes(long));
73
+ });
74
+ });
75
+ //# sourceMappingURL=ask-user-question.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user-question.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/ask-user-question.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface AskUserOption {
2
+ label: string;
3
+ description?: string;
4
+ }
5
+ export interface AskUserQuestion {
6
+ header?: string;
7
+ question: string;
8
+ options: AskUserOption[];
9
+ }
10
+ export declare function isAskUserQuestion(toolName: string | undefined): boolean;
11
+ export declare function parseAskUserQuestion(toolInput: string | undefined): AskUserQuestion[] | null;
12
+ export declare function formatAskUserQuestionText(questions: AskUserQuestion[], maxDescChars?: number): string;
13
+ //# sourceMappingURL=ask-user-question.d.ts.map