osborn 0.9.111 → 0.9.112

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 (2) hide show
  1. package/dist/index.js +12 -3
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1656,6 +1656,11 @@ async function main() {
1656
1656
  // REDIRECTED into the meeting canvas instead of suppressed — the regular
1657
1657
  // voice pipeline reused with the meeting as the sink (latency fix).
1658
1658
  let meetingAddressedUntil = 0;
1659
+ // Distinct human speakers seen in the current meeting. In a 1:1 (one human
1660
+ // + the bot) EVERY utterance is addressed to the bot — no name needed
1661
+ // (2026-08-01: "can you open carfax..." got observer-suppressed because
1662
+ // the fresh session's latch was never opened by the name).
1663
+ const meetingSpeakers = new Set();
1659
1664
  let activeMeetingPoller = null; // Transcript poller bound to that bot
1660
1665
  // LIVE meeting transcript → LLM (buffered webhook finals). See recall.on('transcript').
1661
1666
  const meetingTranscriptBuffer = [];
@@ -1747,6 +1752,7 @@ async function main() {
1747
1752
  }
1748
1753
  activeMeetingBotId = null;
1749
1754
  meetingAddressedUntil = 0;
1755
+ meetingSpeakers.clear();
1750
1756
  // leaveBot=false when Recall itself reported the meeting over (bot already gone).
1751
1757
  if (opts.leaveBot !== false) {
1752
1758
  const recall = getRecallClient();
@@ -1857,13 +1863,16 @@ async function main() {
1857
1863
  // the agent replies out loud into the meeting. This is the chat-mode path:
1858
1864
  // named/asked → prompt response. Un-addressed chunks stay in the silent
1859
1865
  // 20s batch for note-taking. That's the two-mode seam, mechanically.
1866
+ meetingSpeakers.add(speaker);
1860
1867
  // Fuzzy name match: meeting STT routinely mangles "Osborn" — observed
1861
1868
  // live 2026-08-01: "Osborn can you hear me" → "i was born can you hear
1862
1869
  // me" (name trigger missed, bot stayed silent). Accept common
1863
1870
  // mis-transcriptions; mild false-positive risk is acceptable in a
1864
- // room that invited the bot.
1865
- if (/\b(osborne?|oz\s?born|os\s?born|was born|is born|ozborn|osbourne?|austin\b.{0,8}(hear|there|can you))/i.test(text)) {
1866
- console.log('📓 Addressed by name (fuzzy) — immediate flush for a response');
1871
+ // room that invited the bot. AND: in a 1:1 meeting (one human + the
1872
+ // bot) every utterance is addressed — no name needed.
1873
+ const oneOnOne = meetingSpeakers.size <= 1;
1874
+ if (oneOnOne || /\b(osborne?|oz\s?born|os\s?born|was born|is born|ozborn|osbourne?|austin\b.{0,8}(hear|there|can you))/i.test(text)) {
1875
+ console.log(`📓 Addressed (${oneOnOne ? '1:1 meeting' : 'by name'}) — immediate flush for a response`);
1867
1876
  flushMeetingBuffer(botId, true);
1868
1877
  }
1869
1878
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "osborn",
3
- "version": "0.9.111",
3
+ "version": "0.9.112",
4
4
  "description": "Voice AI coding assistant - local agent that connects to Osborn frontend",
5
5
  "type": "module",
6
6
  "bin": {