From 8e91057e3740be743929dabc8a84496656befff2 Mon Sep 17 00:00:00 2001 From: rob Date: Mon, 5 Jan 2026 19:43:44 -0400 Subject: [PATCH] Update documentation 2026-01-05 --- 404.html | 2 +- README.md | 1 - assets/js/1db64337.35ccadc7.js | 1 + assets/js/1db64337.37a4470b.js | 1 - ...d0090.245dd135.js => d79d0090.bc07c42e.js} | 2 +- ...n.cff2f97c.js => runtime~main.35cf1027.js} | 2 +- docs | 1 - index.html | 80 ++++++++++++++----- 8 files changed, 62 insertions(+), 28 deletions(-) delete mode 100644 README.md create mode 100644 assets/js/1db64337.35ccadc7.js delete mode 100644 assets/js/1db64337.37a4470b.js rename assets/js/{d79d0090.245dd135.js => d79d0090.bc07c42e.js} (88%) rename assets/js/{runtime~main.cff2f97c.js => runtime~main.35cf1027.js} (69%) delete mode 120000 docs diff --git a/404.html b/404.html index 21101ac..7c0ee4a 100644 --- a/404.html +++ b/404.html @@ -4,7 +4,7 @@ Live Two-Way Chat - + diff --git a/README.md b/README.md deleted file mode 100644 index 922465b..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# Live Two-Way Chat Documentation diff --git a/assets/js/1db64337.35ccadc7.js b/assets/js/1db64337.35ccadc7.js new file mode 100644 index 0000000..05b05a5 --- /dev/null +++ b/assets/js/1db64337.35ccadc7.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[413],{6785(e,n,i){i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"overview","title":"Live Two-Way Chat","description":"Real-time conversational AI with natural speech flow - moving beyond forum-style turn-taking.","source":"@site/docs/overview.md","sourceDirName":".","slug":"/","permalink":"/rob/live-two-way-chat/","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"slug":"/","sidebar_position":1},"sidebar":"docs"}');var s=i(4848),r=i(8453);const l={slug:"/",sidebar_position:1},o="Live Two-Way Chat",a={},c=[{value:"Vision",id:"vision",level:2},{value:"The Problem",id:"the-problem",level:3},{value:"The Solution",id:"the-solution",level:3},{value:"Shared Context Window",id:"shared-context-window",level:2},{value:"Technical Challenges",id:"technical-challenges",level:2},{value:"Potential Architecture",id:"potential-architecture",level:2},{value:"Inspiration",id:"inspiration",level:2},{value:"Related Projects",id:"related-projects",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"live-two-way-chat",children:"Live Two-Way Chat"})}),"\n",(0,s.jsx)(n.p,{children:"Real-time conversational AI with natural speech flow - moving beyond forum-style turn-taking."}),"\n",(0,s.jsx)(n.h2,{id:"vision",children:"Vision"}),"\n",(0,s.jsxs)(n.p,{children:["Current chatbot conversations are essentially forums with near-instant replies. Humans don't listen to someone speak, stop, think about the context, then respond with an entire paragraph. ",(0,s.jsx)(n.strong,{children:"Live Two-Way Chat"})," simulates natural human conversation:"]}),"\n",(0,s.jsx)(n.h3,{id:"the-problem",children:"The Problem"}),"\n",(0,s.jsx)(n.p,{children:"Traditional chat interfaces:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Wait for complete user input before processing"}),"\n",(0,s.jsx)(n.li,{children:"Generate entire responses at once"}),"\n",(0,s.jsx)(n.li,{children:"Can't be interrupted or course-corrected mid-thought"}),"\n",(0,s.jsx)(n.li,{children:"Feel robotic and turn-based"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"the-solution",children:"The Solution"}),"\n",(0,s.jsx)(n.p,{children:"A real-time bidirectional conversation where:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Continuous transcription"})," - Human voice is transcribed in small constant chunks in the background"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Predictive response preparation"})," - AI analyzes context and pre-prepares replies, modifying them as new context arrives"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Natural interruption"})," - AI decides when to speak:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Sometimes interrupting if an important point needs to be made"}),"\n",(0,s.jsx)(n.li,{children:"Sometimes waiting for a question to be asked"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Bidirectional listening"})," - The chatbot listens even while speaking, taking into account what it was saying when interrupted"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Shared context window"})," - A visual workspace for files and artifacts"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"shared-context-window",children:"Shared Context Window"}),"\n",(0,s.jsx)(n.p,{children:"A drag-and-drop workspace visible to both human and AI:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Content Type"}),(0,s.jsx)(n.th,{children:"Behavior"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Images"})}),(0,s.jsx)(n.td,{children:"Displayed for user, visible to AI for analysis"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Code"})}),(0,s.jsx)(n.td,{children:"Displayed and editable by user, AI can view and modify"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Documents"})}),(0,s.jsx)(n.td,{children:"Shared context for conversation"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Split view"})}),(0,s.jsx)(n.td,{children:"Window can split to show 2+ files simultaneously"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"The AI can:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"View what's in the window"}),"\n",(0,s.jsx)(n.li,{children:"Edit code or text files"}),"\n",(0,s.jsx)(n.li,{children:"Reference images in conversation"}),"\n",(0,s.jsx)(n.li,{children:"Suggest changes visually"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"technical-challenges",children:"Technical Challenges"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Streaming ASR"})," - Real-time speech-to-text with low latency"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Incremental response generation"})," - Partial responses that can be updated"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Turn-taking model"})," - When to speak, when to wait, when to interrupt"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Context threading"})," - Tracking what was said/being-said when interruptions occur"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Audio ducking"})," - Managing simultaneous speech gracefully"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"potential-architecture",children:"Potential Architecture"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Microphone \u2502\u2500\u2500\u2500\u2500\u25b6\u2502 Streaming ASR \u2502\n\u2502 (continuous) \u2502 \u2502 (Whisper/etc) \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 text chunks\n \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Speaker \u2502\u25c0\u2500\u2500\u2500\u2500\u2502 Response Engine \u2502\n\u2502 (TTS) \u2502 \u2502 (predictive) \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 Context Window \u2502\n \u2502 (shared state) \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.h2,{id:"inspiration",children:"Inspiration"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Natural human conversations (overlapping speech, interruptions, backchanneling)"}),"\n",(0,s.jsx)(n.li,{children:"Real-time collaborative editors (Google Docs)"}),"\n",(0,s.jsx)(n.li,{children:"Voice assistants that feel less robotic"}),"\n",(0,s.jsx)(n.li,{children:"Pair programming conversations"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"related-projects",children:"Related Projects"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"../ramble/overview",children:"Ramble"})," - Voice transcription (could provide ASR component)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"../artifact-editor/overview",children:"Artifact Editor"})," - Could power the shared context window"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453(e,n,i){i.d(n,{R:()=>l,x:()=>o});var t=i(6540);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1db64337.37a4470b.js b/assets/js/1db64337.37a4470b.js deleted file mode 100644 index d200292..0000000 --- a/assets/js/1db64337.37a4470b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[413],{6785(e,t,r){r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"overview","title":"Live Two-Way Chat","description":"Real-time conversational AI with natural speech flow","source":"@site/docs/overview.md","sourceDirName":".","slug":"/","permalink":"/rob/live-two-way-chat/","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"slug":"/","sidebar_position":1},"sidebar":"docs"}');var s=r(4848),n=r(8453);const a={slug:"/",sidebar_position:1},c="Live Two-Way Chat",l={},o=[{value:"Overview",id:"overview",level:2},{value:"Features",id:"features",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Installation",id:"installation",level:3},{value:"Quick Start",id:"quick-start",level:3},{value:"Architecture",id:"architecture",level:2},{value:"Related Projects",id:"related-projects",level:2}];function d(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"live-two-way-chat",children:"Live Two-Way Chat"})}),"\n",(0,s.jsx)(t.p,{children:"Real-time conversational AI with natural speech flow"}),"\n",(0,s.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.em,{children:"TODO: Add project overview"})}),"\n",(0,s.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.em,{children:"TODO: List key features"})}),"\n",(0,s.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,s.jsx)(t.h3,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"pip install -e .\n"})}),"\n",(0,s.jsx)(t.h3,{id:"quick-start",children:"Quick Start"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.em,{children:"TODO: Add quick start guide"})}),"\n",(0,s.jsx)(t.h2,{id:"architecture",children:"Architecture"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.em,{children:"TODO: Describe architecture at a high level"})}),"\n",(0,s.jsx)(t.h2,{id:"related-projects",children:"Related Projects"}),"\n",(0,s.jsx)(t.p,{children:"This project is part of the development ecosystem:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://pages.brrd.tech/rob/CmdForge/",children:"CmdForge"})," - AI-powered CLI tool builder"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://pages.brrd.tech/rob/CascadingDev/",children:"CascadingDev"})," - Cascading Development Framework"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://pages.brrd.tech/rob/orchestrated-discussions/",children:"Orchestrated Discussions"})," - AI Discussion Framework"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://pages.brrd.tech/rob/artifact-editor/",children:"Artifact Editor"})," - Code Artifact Editor"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://pages.brrd.tech/rob/ramble/",children:"Ramble"})," - Voice Note Transcription"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453(e,t,r){r.d(t,{R:()=>a,x:()=>c});var i=r(6540);const s={},n=i.createContext(s);function a(e){const t=i.useContext(n);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d79d0090.245dd135.js b/assets/js/d79d0090.bc07c42e.js similarity index 88% rename from assets/js/d79d0090.245dd135.js rename to assets/js/d79d0090.bc07c42e.js index d56a11e..2d65e45 100644 --- a/assets/js/d79d0090.245dd135.js +++ b/assets/js/d79d0090.bc07c42e.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[600],{2686(e){e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","href":"/rob/live-two-way-chat/","label":"Live Two-Way Chat","docId":"overview","unlisted":false}]},"docs":{"overview":{"id":"overview","title":"Live Two-Way Chat","description":"Real-time conversational AI with natural speech flow","sidebar":"docs"}}}}')}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[600],{2686(e){e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","href":"/rob/live-two-way-chat/","label":"Live Two-Way Chat","docId":"overview","unlisted":false}]},"docs":{"overview":{"id":"overview","title":"Live Two-Way Chat","description":"Real-time conversational AI with natural speech flow - moving beyond forum-style turn-taking.","sidebar":"docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.cff2f97c.js b/assets/js/runtime~main.35cf1027.js similarity index 69% rename from assets/js/runtime~main.cff2f97c.js rename to assets/js/runtime~main.35cf1027.js index 5afd23f..490772d 100644 --- a/assets/js/runtime~main.cff2f97c.js +++ b/assets/js/runtime~main.35cf1027.js @@ -1 +1 @@ -(()=>{"use strict";var e,r,t,a,o,n={},i={};function l(e){var r=i[e];if(void 0!==r)return r.exports;var t=i[e]={id:e,loaded:!1,exports:{}};return n[e].call(t.exports,t,t.exports,l),t.loaded=!0,t.exports}l.m=n,l.c=i,e=[],l.O=(r,t,a,o)=>{if(!t){var n=1/0;for(u=0;u=o)&&Object.keys(l.O).every(e=>l.O[e](t[c]))?t.splice(c--,1):(i=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[t,a,o]},l.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return l.d(r,{a:r}),r},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,l.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);l.r(o);var n={};r=r||[null,t({}),t([]),t(t)];for(var i=2&a&&e;("object"==typeof i||"function"==typeof i)&&!~r.indexOf(i);i=t(i))Object.getOwnPropertyNames(i).forEach(r=>n[r]=()=>e[r]);return n.default=()=>e,l.d(o,n),o},l.d=(e,r)=>{for(var t in r)l.o(r,t)&&!l.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce((r,t)=>(l.f[t](e,r),r),[])),l.u=e=>"assets/js/"+({48:"a94703ab",98:"a7bd4aaa",401:"17896441",413:"1db64337",600:"d79d0090",647:"5e95c892",742:"aba21aa0"}[e]||e)+"."+{48:"b8c77466",98:"3ba34601",237:"447ba118",401:"a2525508",413:"37a4470b",600:"245dd135",647:"a3b66919",742:"4a552a5c"}[e]+".js",l.miniCssF=e=>{},l.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),a={},o="project-public-docs:",l.l=(e,r,t,n)=>{if(a[e])a[e].push(r);else{var i,c;if(void 0!==t)for(var d=document.getElementsByTagName("script"),u=0;u{i.onerror=i.onload=null,clearTimeout(p);var o=a[e];if(delete a[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach(e=>e(t)),r)return r(t)},p=setTimeout(f.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=f.bind(null,i.onerror),i.onload=f.bind(null,i.onload),c&&document.head.appendChild(i)}},l.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.p="/rob/live-two-way-chat/",l.gca=function(e){return e={17896441:"401",a94703ab:"48",a7bd4aaa:"98","1db64337":"413",d79d0090:"600","5e95c892":"647",aba21aa0:"742"}[e]||e,l.p+l.u(e)},(()=>{var e={354:0,869:0};l.f.j=(r,t)=>{var a=l.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else if(/^(354|869)$/.test(r))e[r]=0;else{var o=new Promise((t,o)=>a=e[r]=[t,o]);t.push(a[2]=o);var n=l.p+l.u(r),i=new Error;l.l(n,t=>{if(l.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var o=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+o+": "+n+")",i.name="ChunkLoadError",i.type=o,i.request=n,a[1](i)}},"chunk-"+r,r)}},l.O.j=r=>0===e[r];var r=(r,t)=>{var a,o,[n,i,c]=t,d=0;if(n.some(r=>0!==e[r])){for(a in i)l.o(i,a)&&(l.m[a]=i[a]);if(c)var u=c(l)}for(r&&r(t);d{"use strict";var e,r,t,a,o,n={},i={};function l(e){var r=i[e];if(void 0!==r)return r.exports;var t=i[e]={id:e,loaded:!1,exports:{}};return n[e].call(t.exports,t,t.exports,l),t.loaded=!0,t.exports}l.m=n,l.c=i,e=[],l.O=(r,t,a,o)=>{if(!t){var n=1/0;for(u=0;u=o)&&Object.keys(l.O).every(e=>l.O[e](t[d]))?t.splice(d--,1):(i=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[t,a,o]},l.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return l.d(r,{a:r}),r},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,l.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);l.r(o);var n={};r=r||[null,t({}),t([]),t(t)];for(var i=2&a&&e;("object"==typeof i||"function"==typeof i)&&!~r.indexOf(i);i=t(i))Object.getOwnPropertyNames(i).forEach(r=>n[r]=()=>e[r]);return n.default=()=>e,l.d(o,n),o},l.d=(e,r)=>{for(var t in r)l.o(r,t)&&!l.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce((r,t)=>(l.f[t](e,r),r),[])),l.u=e=>"assets/js/"+({48:"a94703ab",98:"a7bd4aaa",401:"17896441",413:"1db64337",600:"d79d0090",647:"5e95c892",742:"aba21aa0"}[e]||e)+"."+{48:"b8c77466",98:"3ba34601",237:"447ba118",401:"a2525508",413:"35ccadc7",600:"bc07c42e",647:"a3b66919",742:"4a552a5c"}[e]+".js",l.miniCssF=e=>{},l.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),a={},o="project-public-docs:",l.l=(e,r,t,n)=>{if(a[e])a[e].push(r);else{var i,d;if(void 0!==t)for(var c=document.getElementsByTagName("script"),u=0;u{i.onerror=i.onload=null,clearTimeout(p);var o=a[e];if(delete a[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach(e=>e(t)),r)return r(t)},p=setTimeout(s.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=s.bind(null,i.onerror),i.onload=s.bind(null,i.onload),d&&document.head.appendChild(i)}},l.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.p="/rob/live-two-way-chat/",l.gca=function(e){return e={17896441:"401",a94703ab:"48",a7bd4aaa:"98","1db64337":"413",d79d0090:"600","5e95c892":"647",aba21aa0:"742"}[e]||e,l.p+l.u(e)},(()=>{var e={354:0,869:0};l.f.j=(r,t)=>{var a=l.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else if(/^(354|869)$/.test(r))e[r]=0;else{var o=new Promise((t,o)=>a=e[r]=[t,o]);t.push(a[2]=o);var n=l.p+l.u(r),i=new Error;l.l(n,t=>{if(l.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var o=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+o+": "+n+")",i.name="ChunkLoadError",i.type=o,i.request=n,a[1](i)}},"chunk-"+r,r)}},l.O.j=r=>0===e[r];var r=(r,t)=>{var a,o,[n,i,d]=t,c=0;if(n.some(r=>0!==e[r])){for(a in i)l.o(i,a)&&(l.m[a]=i[a]);if(d)var u=d(l)}for(r&&r(t);c -Live Two-Way Chat - +Live Two-Way Chat + @@ -12,26 +12,62 @@

Live Two-Way Chat

-

Real-time conversational AI with natural speech flow

-

Overview

-

TODO: Add project overview

-

Features

-

TODO: List key features

-

Getting Started

-

Installation

-
pip install -e .
-

Quick Start

-

TODO: Add quick start guide

-

Architecture

-

TODO: Describe architecture at a high level

- -

This project is part of the development ecosystem:

+

Real-time conversational AI with natural speech flow - moving beyond forum-style turn-taking.

+

Vision

+

Current chatbot conversations are essentially forums with near-instant replies. Humans don't listen to someone speak, stop, think about the context, then respond with an entire paragraph. Live Two-Way Chat simulates natural human conversation:

+

The Problem

+

Traditional chat interfaces:

+
  • Wait for complete user input before processing
  • +
  • Generate entire responses at once
  • +
  • Can't be interrupted or course-corrected mid-thought
  • +
  • Feel robotic and turn-based
  • + +

    The Solution

    +

    A real-time bidirectional conversation where:

    +
      +
    1. Continuous transcription - Human voice is transcribed in small constant chunks in the background
    2. +
    3. Predictive response preparation - AI analyzes context and pre-prepares replies, modifying them as new context arrives
    4. +
    5. Natural interruption - AI decides when to speak: +
        +
      • Sometimes interrupting if an important point needs to be made
      • +
      • Sometimes waiting for a question to be asked
      • +
      +
    6. +
    7. Bidirectional listening - The chatbot listens even while speaking, taking into account what it was saying when interrupted
    8. +
    9. Shared context window - A visual workspace for files and artifacts
    10. +
    +

    Shared Context Window

    +

    A drag-and-drop workspace visible to both human and AI:

    +
    Content TypeBehavior
    ImagesDisplayed for user, visible to AI for analysis
    CodeDisplayed and editable by user, AI can view and modify
    DocumentsShared context for conversation
    Split viewWindow can split to show 2+ files simultaneously
    +

    The AI can:

    +
      +
    • View what's in the window
    • +
    • Edit code or text files
    • +
    • Reference images in conversation
    • +
    • Suggest changes visually
    • +
    +

    Technical Challenges

    +
      +
    1. Streaming ASR - Real-time speech-to-text with low latency
    2. +
    3. Incremental response generation - Partial responses that can be updated
    4. +
    5. Turn-taking model - When to speak, when to wait, when to interrupt
    6. +
    7. Context threading - Tracking what was said/being-said when interruptions occur
    8. +
    9. Audio ducking - Managing simultaneous speech gracefully
    10. +
    +

    Potential Architecture

    +
    ┌─────────────────┐     ┌──────────────────┐
    │ Microphone │────▶│ Streaming ASR │
    │ (continuous) │ │ (Whisper/etc) │
    └─────────────────┘ └────────┬─────────┘
    │ text chunks

    ┌─────────────────┐ ┌──────────────────┐
    │ Speaker │◀────│ Response Engine │
    │ (TTS) │ │ (predictive) │
    └─────────────────┘ └────────┬─────────┘

    ┌────────▼─────────┐
    │ Context Window │
    │ (shared state) │
    └──────────────────┘
    +

    Inspiration

    +
      +
    • Natural human conversations (overlapping speech, interruptions, backchanneling)
    • +
    • Real-time collaborative editors (Google Docs)
    • +
    • Voice assistants that feel less robotic
    • +
    • Pair programming conversations
    • +
    + +
      +
    • Ramble - Voice transcription (could provide ASR component)
    • +
    • Artifact Editor - Could power the shared context window
    • +
    \ No newline at end of file