aicodeman 0.8.2 → 0.9.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 (59) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +8 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/tmux-manager.d.ts.map +1 -1
  5. package/dist/tmux-manager.js +12 -5
  6. package/dist/tmux-manager.js.map +1 -1
  7. package/dist/web/middleware/auth.d.ts +1 -1
  8. package/dist/web/middleware/auth.d.ts.map +1 -1
  9. package/dist/web/middleware/auth.js +12 -6
  10. package/dist/web/middleware/auth.js.map +1 -1
  11. package/dist/web/network-auth-policy.d.ts +3 -0
  12. package/dist/web/network-auth-policy.d.ts.map +1 -0
  13. package/dist/web/network-auth-policy.js +19 -0
  14. package/dist/web/network-auth-policy.js.map +1 -0
  15. package/dist/web/public/api-client.3adebdc2.js.gz +0 -0
  16. package/dist/web/public/{app.cc861c96.js → app.c860ea08.js} +1 -1
  17. package/dist/web/public/app.c860ea08.js.br +0 -0
  18. package/dist/web/public/app.c860ea08.js.gz +0 -0
  19. package/dist/web/public/constants.cb6426c4.js.gz +0 -0
  20. package/dist/web/public/image-input.7cade6a8.js.gz +0 -0
  21. package/dist/web/public/index.html +2 -2
  22. package/dist/web/public/index.html.br +0 -0
  23. package/dist/web/public/index.html.gz +0 -0
  24. package/dist/web/public/input-cjk.88082175.js.gz +0 -0
  25. package/dist/web/public/keyboard-accessory.cdfd8c04.js.gz +0 -0
  26. package/dist/web/public/mobile-handlers.1e2a8ef8.js.gz +0 -0
  27. package/dist/web/public/mobile.26dc30d6.css.gz +0 -0
  28. package/dist/web/public/notification-manager.9c984ac2.js.gz +0 -0
  29. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  30. package/dist/web/public/panels-ui.3e304caf.js.gz +0 -0
  31. package/dist/web/public/ralph-panel.61076370.js.gz +0 -0
  32. package/dist/web/public/ralph-wizard.52d533d2.js.gz +0 -0
  33. package/dist/web/public/respawn-ui.5377f958.js.gz +0 -0
  34. package/dist/web/public/session-ui.3e0cf024.js.gz +0 -0
  35. package/dist/web/public/settings-ui.c06be9c3.js.gz +0 -0
  36. package/dist/web/public/styles.84a35202.css.gz +0 -0
  37. package/dist/web/public/subagent-windows.a366a4ad.js.gz +0 -0
  38. package/dist/web/public/sw.js.gz +0 -0
  39. package/dist/web/public/terminal-ui.37caa926.js.gz +0 -0
  40. package/dist/web/public/upload.html.gz +0 -0
  41. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  42. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  43. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  44. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  45. package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
  46. package/dist/web/public/vendor/xterm.css.gz +0 -0
  47. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  48. package/dist/web/public/voice-input.085e9e73.js.gz +0 -0
  49. package/dist/web/routes/file-routes.d.ts.map +1 -1
  50. package/dist/web/routes/file-routes.js +98 -7
  51. package/dist/web/routes/file-routes.js.map +1 -1
  52. package/dist/web/server.d.ts +7 -5
  53. package/dist/web/server.d.ts.map +1 -1
  54. package/dist/web/server.js +38 -14
  55. package/dist/web/server.js.map +1 -1
  56. package/package.json +26 -11
  57. package/scripts/postinstall.js +13 -0
  58. package/dist/web/public/app.cc861c96.js.br +0 -0
  59. package/dist/web/public/app.cc861c96.js.gz +0 -0
@@ -11,7 +11,7 @@
11
11
  `).replace(/[ \t]+$/gm,"").replace(/\n{4,}/g,`
12
12
 
13
13
 
14
- `).trim()}_preprocessAsciiArt(e){const t=/[─-╿▀-▟]/,s=/```[\s\S]*?```/g,i=[];return e.replace(s,r=>(i.push(r),`\0FENCE${i.length-1}\0`)).split(/(\n{2,})/).map(r=>/^\n{2,}$/.test(r)||!r.trim()||r.includes("\0FENCE")?r:t.test(r)?"\n```\n"+r+"\n```\n":r).join("").replace(/FENCE(\d+)/g,(r,a)=>i[Number(a)])}_renderMarkdown(e){const t=e||"";if(typeof marked<"u"&&marked.parse)try{const i=this._preprocessAsciiArt(t);let n=this._sanitizeHtml(marked.parse(i,{breaks:!0,gfm:!0}));n=n.replace(/<table>/g,'<div class="rv-table-wrap"><table>').replace(/<\/table>/g,"</table></div>");const o=/[─-╿▀-▟]/,r=document.createElement("template");return r.innerHTML=n,r.content.querySelectorAll("pre > code").forEach(a=>{const c=a.parentElement,h=o.test(a.textContent||""),d=document.createElement("div");d.className=h?"rv-code-wrap rv-diagram-wrap":"rv-code-wrap";const u=document.createElement("div");u.className="rv-code-actions";const S=document.createElement("button");if(S.className="rv-copy-btn",S.type="button",S.setAttribute("aria-label","Copy code"),S.setAttribute("title","Copy code"),u.appendChild(S),h){c.classList.add("rv-diagram");const f=document.createElement("button");f.className="rv-wrap-toggle",f.type="button",f.setAttribute("aria-label","Toggle line wrapping"),f.setAttribute("title","Toggle line wrapping"),u.appendChild(f)}c.parentNode.insertBefore(d,c),d.appendChild(u),d.appendChild(c)}),r.innerHTML}catch{}return`<pre style="white-space:pre-wrap;word-break:break-word">${t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}</pre>`}_bindResponseViewerInteractions(e){!e||e.dataset.rvBound==="1"||(e.dataset.rvBound="1",e.addEventListener("click",async t=>{const s=t.target.closest(".rv-copy-btn");if(s){t.preventDefault(),t.stopPropagation();const a=s.closest(".rv-code-wrap")?.querySelector("pre code"),c=a?await this._copyText(a.textContent||""):!1;s.classList.remove("rv-copied","rv-copy-failed"),s.classList.add(c?"rv-copied":"rv-copy-failed"),clearTimeout(s._resetTimer),s._resetTimer=setTimeout(()=>{s.classList.remove("rv-copied","rv-copy-failed")},1500);return}const i=t.target.closest(".rv-wrap-toggle");if(!i)return;t.preventDefault(),t.stopPropagation();const n=i.closest(".rv-diagram-wrap"),o=n?.querySelector("pre.rv-diagram");if(!o||!n)return;const r=o.classList.toggle("rv-nowrap");n.classList.toggle("rv-wrap-nowrap",r)}))}async _copyText(e){if(!e)return!1;try{if(navigator.clipboard?.writeText)return await navigator.clipboard.writeText(e),!0}catch{}try{const t=document.createElement("textarea");t.value=e,t.setAttribute("readonly",""),t.style.cssText="position:fixed;top:0;left:0;opacity:0;pointer-events:none",document.body.appendChild(t),t.select();const s=document.execCommand("copy");return document.body.removeChild(t),s}catch{return!1}}async toggleResponseViewer(){const e=document.getElementById("responseViewer"),t=document.getElementById("responseViewerBackdrop");if(!e)return;if(e.classList.contains("visible")){e.classList.remove("visible"),t.classList.remove("visible");return}if(this.activeSessionId)try{let o=(await(await fetch(`/api/sessions/${this.activeSessionId}/last-response`)).json()).text||"";if(!o){const d=await(await fetch(`/api/sessions/${this.activeSessionId}/terminal`)).json();d.terminalBuffer&&(o=this._cleanTerminalBuffer(d.terminalBuffer))}const r=document.getElementById("responseViewerBody");r.innerHTML=this._renderMarkdown(o),this._bindResponseViewerInteractions(r);const a=document.getElementById("responseViewerTitle"),c=document.getElementById("responseViewerMore");a&&(a.textContent="Last Response"),c&&(c.style.display="",c.textContent="More"),e.classList.add("visible"),t.classList.add("visible"),r.scrollTop=0}catch(i){console.error("Failed to load response:",i)}}async loadFullContext(){if(!this.activeSessionId)return;const e=document.getElementById("responseViewerMore");e&&(e.textContent="...");try{const i=(await(await fetch(`/api/sessions/${this.activeSessionId}/last-response?context=full`)).json()).messages||[],n=document.getElementById("responseViewerBody"),o=document.getElementById("responseViewerTitle");if(!n)return;if(i.length===0){n.textContent="No conversation history available";return}n.innerHTML="";for(const r of i){const a=document.createElement("div"),c=r.role==="user";a.className="rv-message "+(c?"rv-msg-user":"rv-msg-assistant");const h=document.createElement("div");h.className="rv-role "+(c?"rv-role-user":"rv-role-assistant"),h.textContent=c?"You":"Claude",a.appendChild(h);const d=document.createElement("div");d.className="rv-text",d.innerHTML=this._renderMarkdown(r.text),a.appendChild(d),n.appendChild(a)}this._bindResponseViewerInteractions(n),o&&(o.textContent=`Conversation (${i.length} messages)`),e&&(e.style.display="none"),n.scrollTop=n.scrollHeight}catch(t){console.error("Failed to load context:",t)}finally{e&&(e.textContent="More")}}async _onSessionNeedsRefresh(){if(!(!this.activeSessionId||!this.terminal)&&!this._isLoadingBuffer)try{const t=await(await fetch(`/api/sessions/${this.activeSessionId}/terminal?tail=${TERMINAL_TAIL_SIZE}`)).json();t.terminalBuffer&&(this.terminal.clear(),this.terminal.reset(),await this.chunkedTerminalWrite(t.terminalBuffer),this.terminal.scrollToBottom(),this._localEchoOverlay?.rerender(),this.activeSessionId&&this.sendResize(this.activeSessionId))}catch(e){console.error("needsRefresh reload failed:",e)}}async _onSessionClearTerminal(e){if(e.id===this.activeSessionId){if(this._isLoadingBuffer)return;try{const s=await(await fetch(`/api/sessions/${e.id}/terminal`)).json();if(this.terminal.clear(),this.terminal.reset(),s.terminalBuffer){const i=s.terminalBuffer.replace(DEC_SYNC_STRIP_RE,"");await this.chunkedTerminalWrite(i)}this.sendResize(e.id),this._localEchoOverlay?.rerender()}catch(t){console.error("clearTerminal refresh failed:",t)}}}_onSessionCompletion(e){this.totalCost+=e.cost||0,this.updateCost(),e.id===this.activeSessionId&&(this.terminal.writeln(""),this.terminal.writeln(`\x1B[1;32m Done (Cost: $${(e.cost||0).toFixed(4)})\x1B[0m`))}_onSessionError(e){e.id===this.activeSessionId&&this.terminal.writeln(`\x1B[1;31m Error: ${e.error}\x1B[0m`),this._notifySession(e.id,"critical","session-error","Session Error",e.error||"Unknown error")}_onSessionExit(e){this._wsSessionId===e.id&&this._disconnectWs();const t=this.sessions.get(e.id);t&&(t.status="stopped",this.renderSessionTabs(),e.id===this.activeSessionId&&this._updateLocalEchoState()),e.code&&e.code!==0&&this._notifySession(e.id,"critical","session-crash","Session Crashed",`Exited with code ${e.code}`)}_onSessionIdle(e){const t=this.sessions.get(e.id);if(t&&(t.status="idle",this.renderSessionTabs(),this.sendPendingCtrlL(e.id),e.id===this.activeSessionId&&this._updateLocalEchoState()),!this.respawnStatus[e.id]?.enabled){const s=this.notificationManager?.preferences?.stuckThresholdMs||6e5;clearTimeout(this.idleTimers.get(e.id)),this.idleTimers.set(e.id,setTimeout(()=>{this._notifySession(e.id,"warning","session-stuck","Session Idle",`Idle for ${Math.round(s/6e4)}+ minutes`),this.idleTimers.delete(e.id)},s))}}_onSessionWorking(e){const t=this.sessions.get(e.id);t&&(t.status="busy",this.pendingHooks.has(e.id)||this.tabAlerts.delete(e.id),this.renderSessionTabs(),this.sendPendingCtrlL(e.id),e.id===this.activeSessionId&&this._updateLocalEchoState());const s=this.idleTimers.get(e.id);s&&(clearTimeout(s),this.idleTimers.delete(e.id))}_onSessionAutoClear(e){e.sessionId===this.activeSessionId&&(this.showToast(`Auto-cleared at ${e.tokens.toLocaleString()} tokens`,"info"),this.updateRespawnTokens(0)),this._notifySession(e.sessionId,"info","auto-clear","Auto-Cleared",`Context reset at ${(e.tokens||0).toLocaleString()} tokens`)}_onSessionCliInfo(e){const t=this.sessions.get(e.sessionId);t&&(e.version&&(t.cliVersion=e.version),e.model&&(t.cliModel=e.model),e.accountType&&(t.cliAccountType=e.accountType),e.latestVersion&&(t.cliLatestVersion=e.latestVersion)),e.sessionId===this.activeSessionId&&this.updateCliInfoDisplay()}_onScheduledCreated(e){this.currentRun=e,this.showTimer()}_onScheduledUpdated(e){this.currentRun=e,this.updateTimer()}_onScheduledCompleted(e){this.currentRun=e,this.hideTimer(),this.showToast("Scheduled run completed!","success")}_onScheduledStopped(){this.currentRun=null,this.hideTimer()}setConnectionStatus(e){this._connectionStatus=e,this._updateConnectionIndicator(),e==="connected"&&this._inputQueue.size>0&&this._drainInputQueues()}_connectWs(e){this._disconnectWs();const s=`${location.protocol==="https:"?"wss:":"ws:"}//${location.host}/ws/sessions/${e}/terminal`,i=new WebSocket(s);this._ws=i,this._wsSessionId=e,i.onopen=()=>{this._ws===i&&(this._wsReady=!0,this._wsReconnectAttempts=0)},i.onmessage=n=>{if(this._ws===i)try{const o=JSON.parse(n.data);o.t==="o"?this._onSessionTerminal({id:e,data:o.d}):o.t==="c"?this._onSessionClearTerminal({id:e}):o.t==="r"&&this._onSessionNeedsRefresh({id:e})}catch{}},i.onclose=n=>{if(this._ws===i&&(this._ws=null,this._wsSessionId=null,this._wsReady=!1,n.code<4004&&this.activeSessionId===e)){const o=Math.min(1e3*Math.pow(2,this._wsReconnectAttempts||0),1e4);this._wsReconnectAttempts=(this._wsReconnectAttempts||0)+1,this._wsReconnectTimer=setTimeout(()=>{this._wsReconnectTimer=null,this.activeSessionId===e&&this._connectWs(e)},o)}},i.onerror=()=>{}}_disconnectWs(){this._clearTimer("_wsReconnectTimer"),this._wsReconnectAttempts=0,this._ws&&(this._ws.onclose=null,this._ws.close(),this._ws=null,this._wsSessionId=null,this._wsReady=!1)}_sendInputAsync(e,t){if(!this.isOnline||this._connectionStatus==="disconnected"){this._enqueueInput(e,t);return}if(this._wsReady&&this._wsSessionId===e)try{this._ws.send(JSON.stringify({t:"i",d:t})),this.clearPendingHooks(e);return}catch{}this._inputSendChain=this._inputSendChain.then(()=>{fetch(`/api/sessions/${e}/input`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({input:t}),keepalive:t.length<65536}).then(i=>{i.ok?this.clearPendingHooks(e):this._enqueueInput(e,t)}).catch(()=>{this._enqueueInput(e,t)})})}_enqueueInput(e,t){let i=(this._inputQueue.get(e)||"")+t;i.length>this._inputQueueMaxBytes&&(i=i.slice(i.length-this._inputQueueMaxBytes)),this._inputQueue.set(e,i),this._updateConnectionIndicator()}async _drainInputQueues(){if(this._inputQueue.size===0)return;const e=new Map(this._inputQueue);this._inputQueue.clear(),this._updateConnectionIndicator();for(const[t,s]of e)(await this._apiPost(`/api/sessions/${t}/input`,{input:s}))?.ok||this._enqueueInput(t,s);this._updateConnectionIndicator()}_updateConnectionIndicator(){const e=this.$("connectionIndicator"),t=this.$("connectionDot"),s=this.$("connectionText");if(!e||!t||!s)return;let i=0;for(const a of this._inputQueue.values())i+=a.length;const n=this._connectionStatus,o=i>0;if((n==="connected"||n==="connecting")&&!o){e.style.display="none";return}e.style.display="flex",t.className="connection-dot";const r=a=>a<1024?`${a}B`:`${(a/1024).toFixed(1)}KB`;n==="connected"&&o?(t.classList.add("draining"),s.textContent=`Sending ${r(i)}...`):n==="reconnecting"?(t.classList.add("reconnecting"),s.textContent=o?`Reconnecting (${r(i)} queued)`:"Reconnecting..."):(t.classList.add("offline"),s.textContent=o?`Offline (${r(i)} queued)`:"Offline")}setupOnlineDetection(){window.addEventListener("online",()=>{this.isOnline=!0,this.reconnectAttempts=0,this.connectSSE()}),window.addEventListener("offline",()=>{this.isOnline=!1,this.setConnectionStatus("offline")})}_updateCjkInputState(){const e=document.getElementById("cjkInput");if(!e)return;const t=this.loadAppSettingsFromStorage(),s=this._serverCjkOverride||t.cjkInputEnabled||!1;e.style.display=s?"block":"none",s||(window.cjkActive=!1)}_resetAllAppState(){this.sessions.clear(),this.ralphStates.clear(),this.terminalBuffers.clear(),this.terminalBufferCache.clear(),this.projectInsights.clear(),this.teams.clear(),this.teamTasks.clear();for(const e of this.idleTimers.values())clearTimeout(e);if(this.idleTimers.clear(),this._clearTimer("flickerFilterTimeout"),this.flickerFilterBuffer="",this.flickerFilterActive=!1,this._clearTimer("syncWaitTimeout"),this.pendingWrites=[],this.writeFrameScheduled=!1,this._isLoadingBuffer=!1,this._loadBufferQueue=null,this._chunkedWriteGen=(this._chunkedWriteGen||0)+1,this._localEchoOverlay?.rerender(),this.pendingHooks.clear(),this._parentNameCache&&this._parentNameCache.clear(),this.subagentActivity.clear(),this.subagentToolResults.clear(),MobileDetection.cleanup(),KeyboardHandler.cleanup(),MobileDetection.init(),KeyboardHandler.init(),this.tabAlerts.clear(),this._shownCompletions&&this._shownCompletions.clear(),this.notificationManager?.titleFlashInterval&&(clearInterval(this.notificationManager.titleFlashInterval),this.notificationManager.titleFlashInterval=null),this.notificationManager?.groupingMap){for(const{timeout:e}of this.notificationManager.groupingMap.values())clearTimeout(e);this.notificationManager.groupingMap.clear()}this.terminalResizeObserver&&(this.terminalResizeObserver.disconnect(),this.terminalResizeObserver=null),this.planLoadingTimer&&(clearInterval(this.planLoadingTimer),this.planLoadingTimer=null),this.timerCountdownInterval&&(clearInterval(this.timerCountdownInterval),this.timerCountdownInterval=null),this.runSummaryAutoRefreshTimer&&(clearInterval(this.runSummaryAutoRefreshTimer),this.runSummaryAutoRefreshTimer=null)}handleInit(e){this._clearTimer("_initFallbackTimer");const t=++this._initGeneration;if(this._serverCjkOverride=e.inputCjkForm||!1,this._updateCjkInputState(),e.version){const n=this.$("versionDisplay"),o=this.$("headerVersion");n&&(n.textContent=`v${e.version}`,n.title=`Codeman v${e.version}`),o&&(o.textContent=`v${e.version}`,o.title=`Codeman v${e.version}`)}VoiceInput.cleanup(),this._resetAllAppState(),e.sessions.forEach(n=>{this.sessions.set(n.id,n),(n.ralphLoop||n.ralphTodos)&&!this.ralphClosedSessions.has(n.id)&&this.ralphStates.set(n.id,{loop:n.ralphLoop||null,todos:n.ralphTodos||[]})});try{localStorage.removeItem("codeman-tab-meta")}catch{}this.syncSessionOrder(),e.respawnStatus?this.respawnStatus=e.respawnStatus:this.respawnStatus={},this.respawnTimers={},this.respawnCountdownTimers={},this.respawnActionLogs={},e.globalStats&&(this.globalStats=e.globalStats),this.totalCost=e.sessions.reduce((n,o)=>n+(o.totalCost||0),0),this.totalCost+=e.scheduledRuns.reduce((n,o)=>n+(o.totalCost||0),0);const s=e.scheduledRuns.find(n=>n.status==="running");if(s&&(this.currentRun=s,this.showTimer()),this.updateCost(),this.renderSessionTabs(),this.sessions.size>0?this.startSystemStatsPolling():this.stopSystemStatsPolling(),this.cleanupAllFloatingWindows(),e.subagents&&(this.subagents.clear(),this.subagentActivity.clear(),this.subagentToolResults.clear(),e.subagents.forEach(n=>{this.subagents.set(n.agentId,n)}),this.renderSubagentPanel(),this.subagentParentMap.clear(),this.loadSubagentParentMap().then(()=>{for(const[n,o]of this.subagentParentMap){const r=this.subagents.get(n);if(r&&this.sessions.has(o)){r.parentSessionId=o;const a=this.sessions.get(o);a&&(r.parentSessionName=this.getSessionName(a)),this.subagents.set(n,r)}}for(const[n]of this.subagents)this.subagentParentMap.has(n)||this.findParentSessionForSubagent(n);this.restoreSubagentWindowStates()})),t!==this._initGeneration)return;if(this.isSoloWindow){this._applySoloMode();return}const i=this.activeSessionId;if(this.activeSessionId=null,this.sessionOrder.length>0){let n=i;if(!n||!this.sessions.has(n))try{n=localStorage.getItem("codeman-active-session")}catch{}n&&this.sessions.has(n)?this.selectSession(n):this.selectSession(this.sessionOrder[0])}}async loadState(){try{const t=await(await fetch("/api/status")).json();this.handleInit(t)}catch(e){console.error("Failed to load state:",e)}}_debouncedCall(e,t,s=100){this._debounceTimers[e]&&clearTimeout(this._debounceTimers[e]),this._debounceTimers[e]=setTimeout(()=>{this._debounceTimers[e]=null,t.call(this)},s)}renderSessionTabs(){this._activeRename||this._debouncedCall("sessionTabs",this._renderSessionTabsImmediate)}_updateActiveTabImmediate(e){const t=this.$("sessionTabs");if(!t)return;const s=t.querySelectorAll(".session-tab[data-id]");for(const i of s)i.dataset.id===e?i.classList.add("active"):i.classList.remove("active")}_renderSessionTabsImmediate(){const e=this.$("sessionTabs"),t=e.querySelectorAll(".session-tab[data-id]"),s=new Set([...t].map(o=>o.dataset.id)),i=new Set(this.sessions.keys());if(s.size===i.size&&[...s].every(o=>i.has(o)))for(const[o,r]of this.sessions){const a=e.querySelector(`.session-tab[data-id="${o}"]`);if(!a)continue;const c=o===this.activeSessionId,h=r.status||"idle",d=this.getSessionName(r),u=r.taskStats||{running:0,total:0},S=u.running>0;c&&!a.classList.contains("active")?a.classList.add("active"):!c&&a.classList.contains("active")&&a.classList.remove("active");const f=this.tabAlerts.get(o),_=f==="action",E=f==="idle",T=a.classList.contains("tab-alert-action"),w=a.classList.contains("tab-alert-idle");if(_&&!T?(a.classList.add("tab-alert-action"),a.classList.remove("tab-alert-idle")):E&&!w?(a.classList.add("tab-alert-idle"),a.classList.remove("tab-alert-action")):!f&&(T||w)&&a.classList.remove("tab-alert-action","tab-alert-idle"),!a.querySelector(".tab-number")){const p=this.sessionOrder.indexOf(o);if(p>=0&&p<9){const g=document.createElement("span");g.className="tab-number",g.textContent=String(p+1),a.insertBefore(g,a.firstChild)}}const b=a.querySelector(".tab-status");b&&!b.classList.contains(h)&&(b.className=`tab-status ${h}`);const y=a.querySelector(".tab-name");if(y&&y.textContent!==d){const p=parseSessionPrefix(d);p&&p.suffix?y.innerHTML='<span class="tab-prefix">'+escapeHtml(p.prefix)+'</span><span class="tab-suffix">: '+escapeHtml(p.suffix)+"</span>":y.textContent=d}const v=a.querySelector(".tab-badge");if(S)if(v)v.textContent!==String(u.running)&&(v.textContent=u.running);else{this._fullRenderSessionTabs();return}else if(v){this._fullRenderSessionTabs();return}const m=a.querySelector(".tab-subagent-badge"),A=this.minimizedSubagents.get(o),C=A?.size||0;if(C>0&&m){const p=m.querySelector(".subagent-label"),g=C===1?"AGENT":`AGENTS (${C})`;p&&p.textContent!==g&&(p.textContent=g);const O=m.querySelector(".subagent-dropdown");if(O){const I=this.renderSubagentTabBadge(o,A),R=document.createElement("div");R.innerHTML=I;const k=R.querySelector(".subagent-dropdown");k&&(O.innerHTML=k.innerHTML)}}else if(C>0&&!m){const p=this.renderSubagentTabBadge(o,A),g=a.querySelector(".tab-gear");g&&g.insertAdjacentHTML("beforebegin",p)}else C===0&&m&&m.remove()}else this._fullRenderSessionTabs()}_fullRenderSessionTabs(){if(this._activeRename)return;const e=this.$("sessionTabs");document.querySelectorAll("body > .subagent-dropdown").forEach(n=>n.remove()),this.cancelHideSubagentDropdown();const t=[];let s=this.sessionOrder;MobileDetection.getDeviceType()==="mobile"&&this.activeSessionId&&(s=[this.activeSessionId,...this.sessionOrder.filter(n=>n!==this.activeSessionId)]);let i=0;for(const n of s){const o=this.sessions.get(n);if(!o)continue;const r=n===this.activeSessionId,a=o.status||"idle",c=this.getSessionName(o),h=o.mode||"claude",d=o.color||"default",u=o.taskStats||{running:0,total:0},S=u.running>0,f=this.tabAlerts.get(n),_=f==="action"?" tab-alert-action":f==="idle"?" tab-alert-idle":"",E=this.minimizedSubagents.get(n),w=(E?.size||0)>0?this.renderSubagentTabBadge(n,E):"",b=o.workingDir&&o.workingDir.split("/").pop()||"",v=(this._tallTabsEnabled??!1)&&o.name&&b&&b!==c;t.push(`<div class="session-tab ${r?"active":""}${_}${this.detachedSessions.has(n)?" detached":""}" data-id="${n}" data-color="${d}" onclick="app.selectSession('${escapeHtml(n)}')" oncontextmenu="event.preventDefault(); app.startInlineRename('${escapeHtml(n)}')" tabindex="0" role="tab" aria-selected="${r?"true":"false"}" aria-label="${escapeHtml(c)} session" ${o.workingDir?`title="${escapeHtml(o.workingDir)}"`:""}>
14
+ `).trim()}_preprocessAsciiArt(e){const t=/[─-╿▀-▟]/,s=/```[\s\S]*?```/g,i=[];return e.replace(s,r=>(i.push(r),`__CODEMAN_FENCE_${i.length-1}__`)).split(/(\n{2,})/).map(r=>/^\n{2,}$/.test(r)||!r.trim()||r.includes("__CODEMAN_FENCE_")?r:t.test(r)?"\n```\n"+r+"\n```\n":r).join("").replace(/__CODEMAN_FENCE_(\d+)__/g,(r,a)=>i[Number(a)])}_renderMarkdown(e){const t=e||"";if(typeof marked<"u"&&marked.parse)try{const i=this._preprocessAsciiArt(t);let n=this._sanitizeHtml(marked.parse(i,{breaks:!0,gfm:!0}));n=n.replace(/<table>/g,'<div class="rv-table-wrap"><table>').replace(/<\/table>/g,"</table></div>");const o=/[─-╿▀-▟]/,r=document.createElement("template");return r.innerHTML=n,r.content.querySelectorAll("pre > code").forEach(a=>{const c=a.parentElement,h=o.test(a.textContent||""),d=document.createElement("div");d.className=h?"rv-code-wrap rv-diagram-wrap":"rv-code-wrap";const u=document.createElement("div");u.className="rv-code-actions";const S=document.createElement("button");if(S.className="rv-copy-btn",S.type="button",S.setAttribute("aria-label","Copy code"),S.setAttribute("title","Copy code"),u.appendChild(S),h){c.classList.add("rv-diagram");const f=document.createElement("button");f.className="rv-wrap-toggle",f.type="button",f.setAttribute("aria-label","Toggle line wrapping"),f.setAttribute("title","Toggle line wrapping"),u.appendChild(f)}c.parentNode.insertBefore(d,c),d.appendChild(u),d.appendChild(c)}),r.innerHTML}catch{}return`<pre style="white-space:pre-wrap;word-break:break-word">${t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}</pre>`}_bindResponseViewerInteractions(e){!e||e.dataset.rvBound==="1"||(e.dataset.rvBound="1",e.addEventListener("click",async t=>{const s=t.target.closest(".rv-copy-btn");if(s){t.preventDefault(),t.stopPropagation();const a=s.closest(".rv-code-wrap")?.querySelector("pre code"),c=a?await this._copyText(a.textContent||""):!1;s.classList.remove("rv-copied","rv-copy-failed"),s.classList.add(c?"rv-copied":"rv-copy-failed"),clearTimeout(s._resetTimer),s._resetTimer=setTimeout(()=>{s.classList.remove("rv-copied","rv-copy-failed")},1500);return}const i=t.target.closest(".rv-wrap-toggle");if(!i)return;t.preventDefault(),t.stopPropagation();const n=i.closest(".rv-diagram-wrap"),o=n?.querySelector("pre.rv-diagram");if(!o||!n)return;const r=o.classList.toggle("rv-nowrap");n.classList.toggle("rv-wrap-nowrap",r)}))}async _copyText(e){if(!e)return!1;try{if(navigator.clipboard?.writeText)return await navigator.clipboard.writeText(e),!0}catch{}try{const t=document.createElement("textarea");t.value=e,t.setAttribute("readonly",""),t.style.cssText="position:fixed;top:0;left:0;opacity:0;pointer-events:none",document.body.appendChild(t),t.select();const s=document.execCommand("copy");return document.body.removeChild(t),s}catch{return!1}}async toggleResponseViewer(){const e=document.getElementById("responseViewer"),t=document.getElementById("responseViewerBackdrop");if(!e)return;if(e.classList.contains("visible")){e.classList.remove("visible"),t.classList.remove("visible");return}if(this.activeSessionId)try{let o=(await(await fetch(`/api/sessions/${this.activeSessionId}/last-response`)).json()).text||"";if(!o){const d=await(await fetch(`/api/sessions/${this.activeSessionId}/terminal`)).json();d.terminalBuffer&&(o=this._cleanTerminalBuffer(d.terminalBuffer))}const r=document.getElementById("responseViewerBody");r.innerHTML=this._renderMarkdown(o),this._bindResponseViewerInteractions(r);const a=document.getElementById("responseViewerTitle"),c=document.getElementById("responseViewerMore");a&&(a.textContent="Last Response"),c&&(c.style.display="",c.textContent="More"),e.classList.add("visible"),t.classList.add("visible"),r.scrollTop=0}catch(i){console.error("Failed to load response:",i)}}async loadFullContext(){if(!this.activeSessionId)return;const e=document.getElementById("responseViewerMore");e&&(e.textContent="...");try{const i=(await(await fetch(`/api/sessions/${this.activeSessionId}/last-response?context=full`)).json()).messages||[],n=document.getElementById("responseViewerBody"),o=document.getElementById("responseViewerTitle");if(!n)return;if(i.length===0){n.textContent="No conversation history available";return}n.innerHTML="";for(const r of i){const a=document.createElement("div"),c=r.role==="user";a.className="rv-message "+(c?"rv-msg-user":"rv-msg-assistant");const h=document.createElement("div");h.className="rv-role "+(c?"rv-role-user":"rv-role-assistant"),h.textContent=c?"You":"Claude",a.appendChild(h);const d=document.createElement("div");d.className="rv-text",d.innerHTML=this._renderMarkdown(r.text),a.appendChild(d),n.appendChild(a)}this._bindResponseViewerInteractions(n),o&&(o.textContent=`Conversation (${i.length} messages)`),e&&(e.style.display="none"),n.scrollTop=n.scrollHeight}catch(t){console.error("Failed to load context:",t)}finally{e&&(e.textContent="More")}}async _onSessionNeedsRefresh(){if(!(!this.activeSessionId||!this.terminal)&&!this._isLoadingBuffer)try{const t=await(await fetch(`/api/sessions/${this.activeSessionId}/terminal?tail=${TERMINAL_TAIL_SIZE}`)).json();t.terminalBuffer&&(this.terminal.clear(),this.terminal.reset(),await this.chunkedTerminalWrite(t.terminalBuffer),this.terminal.scrollToBottom(),this._localEchoOverlay?.rerender(),this.activeSessionId&&this.sendResize(this.activeSessionId))}catch(e){console.error("needsRefresh reload failed:",e)}}async _onSessionClearTerminal(e){if(e.id===this.activeSessionId){if(this._isLoadingBuffer)return;try{const s=await(await fetch(`/api/sessions/${e.id}/terminal`)).json();if(this.terminal.clear(),this.terminal.reset(),s.terminalBuffer){const i=s.terminalBuffer.replace(DEC_SYNC_STRIP_RE,"");await this.chunkedTerminalWrite(i)}this.sendResize(e.id),this._localEchoOverlay?.rerender()}catch(t){console.error("clearTerminal refresh failed:",t)}}}_onSessionCompletion(e){this.totalCost+=e.cost||0,this.updateCost(),e.id===this.activeSessionId&&(this.terminal.writeln(""),this.terminal.writeln(`\x1B[1;32m Done (Cost: $${(e.cost||0).toFixed(4)})\x1B[0m`))}_onSessionError(e){e.id===this.activeSessionId&&this.terminal.writeln(`\x1B[1;31m Error: ${e.error}\x1B[0m`),this._notifySession(e.id,"critical","session-error","Session Error",e.error||"Unknown error")}_onSessionExit(e){this._wsSessionId===e.id&&this._disconnectWs();const t=this.sessions.get(e.id);t&&(t.status="stopped",this.renderSessionTabs(),e.id===this.activeSessionId&&this._updateLocalEchoState()),e.code&&e.code!==0&&this._notifySession(e.id,"critical","session-crash","Session Crashed",`Exited with code ${e.code}`)}_onSessionIdle(e){const t=this.sessions.get(e.id);if(t&&(t.status="idle",this.renderSessionTabs(),this.sendPendingCtrlL(e.id),e.id===this.activeSessionId&&this._updateLocalEchoState()),!this.respawnStatus[e.id]?.enabled){const s=this.notificationManager?.preferences?.stuckThresholdMs||6e5;clearTimeout(this.idleTimers.get(e.id)),this.idleTimers.set(e.id,setTimeout(()=>{this._notifySession(e.id,"warning","session-stuck","Session Idle",`Idle for ${Math.round(s/6e4)}+ minutes`),this.idleTimers.delete(e.id)},s))}}_onSessionWorking(e){const t=this.sessions.get(e.id);t&&(t.status="busy",this.pendingHooks.has(e.id)||this.tabAlerts.delete(e.id),this.renderSessionTabs(),this.sendPendingCtrlL(e.id),e.id===this.activeSessionId&&this._updateLocalEchoState());const s=this.idleTimers.get(e.id);s&&(clearTimeout(s),this.idleTimers.delete(e.id))}_onSessionAutoClear(e){e.sessionId===this.activeSessionId&&(this.showToast(`Auto-cleared at ${e.tokens.toLocaleString()} tokens`,"info"),this.updateRespawnTokens(0)),this._notifySession(e.sessionId,"info","auto-clear","Auto-Cleared",`Context reset at ${(e.tokens||0).toLocaleString()} tokens`)}_onSessionCliInfo(e){const t=this.sessions.get(e.sessionId);t&&(e.version&&(t.cliVersion=e.version),e.model&&(t.cliModel=e.model),e.accountType&&(t.cliAccountType=e.accountType),e.latestVersion&&(t.cliLatestVersion=e.latestVersion)),e.sessionId===this.activeSessionId&&this.updateCliInfoDisplay()}_onScheduledCreated(e){this.currentRun=e,this.showTimer()}_onScheduledUpdated(e){this.currentRun=e,this.updateTimer()}_onScheduledCompleted(e){this.currentRun=e,this.hideTimer(),this.showToast("Scheduled run completed!","success")}_onScheduledStopped(){this.currentRun=null,this.hideTimer()}setConnectionStatus(e){this._connectionStatus=e,this._updateConnectionIndicator(),e==="connected"&&this._inputQueue.size>0&&this._drainInputQueues()}_connectWs(e){this._disconnectWs();const s=`${location.protocol==="https:"?"wss:":"ws:"}//${location.host}/ws/sessions/${e}/terminal`,i=new WebSocket(s);this._ws=i,this._wsSessionId=e,i.onopen=()=>{this._ws===i&&(this._wsReady=!0,this._wsReconnectAttempts=0)},i.onmessage=n=>{if(this._ws===i)try{const o=JSON.parse(n.data);o.t==="o"?this._onSessionTerminal({id:e,data:o.d}):o.t==="c"?this._onSessionClearTerminal({id:e}):o.t==="r"&&this._onSessionNeedsRefresh({id:e})}catch{}},i.onclose=n=>{if(this._ws===i&&(this._ws=null,this._wsSessionId=null,this._wsReady=!1,n.code<4004&&this.activeSessionId===e)){const o=Math.min(1e3*Math.pow(2,this._wsReconnectAttempts||0),1e4);this._wsReconnectAttempts=(this._wsReconnectAttempts||0)+1,this._wsReconnectTimer=setTimeout(()=>{this._wsReconnectTimer=null,this.activeSessionId===e&&this._connectWs(e)},o)}},i.onerror=()=>{}}_disconnectWs(){this._clearTimer("_wsReconnectTimer"),this._wsReconnectAttempts=0,this._ws&&(this._ws.onclose=null,this._ws.close(),this._ws=null,this._wsSessionId=null,this._wsReady=!1)}_sendInputAsync(e,t){if(!this.isOnline||this._connectionStatus==="disconnected"){this._enqueueInput(e,t);return}if(this._wsReady&&this._wsSessionId===e)try{this._ws.send(JSON.stringify({t:"i",d:t})),this.clearPendingHooks(e);return}catch{}this._inputSendChain=this._inputSendChain.then(()=>{fetch(`/api/sessions/${e}/input`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({input:t}),keepalive:t.length<65536}).then(i=>{i.ok?this.clearPendingHooks(e):this._enqueueInput(e,t)}).catch(()=>{this._enqueueInput(e,t)})})}_enqueueInput(e,t){let i=(this._inputQueue.get(e)||"")+t;i.length>this._inputQueueMaxBytes&&(i=i.slice(i.length-this._inputQueueMaxBytes)),this._inputQueue.set(e,i),this._updateConnectionIndicator()}async _drainInputQueues(){if(this._inputQueue.size===0)return;const e=new Map(this._inputQueue);this._inputQueue.clear(),this._updateConnectionIndicator();for(const[t,s]of e)(await this._apiPost(`/api/sessions/${t}/input`,{input:s}))?.ok||this._enqueueInput(t,s);this._updateConnectionIndicator()}_updateConnectionIndicator(){const e=this.$("connectionIndicator"),t=this.$("connectionDot"),s=this.$("connectionText");if(!e||!t||!s)return;let i=0;for(const a of this._inputQueue.values())i+=a.length;const n=this._connectionStatus,o=i>0;if((n==="connected"||n==="connecting")&&!o){e.style.display="none";return}e.style.display="flex",t.className="connection-dot";const r=a=>a<1024?`${a}B`:`${(a/1024).toFixed(1)}KB`;n==="connected"&&o?(t.classList.add("draining"),s.textContent=`Sending ${r(i)}...`):n==="reconnecting"?(t.classList.add("reconnecting"),s.textContent=o?`Reconnecting (${r(i)} queued)`:"Reconnecting..."):(t.classList.add("offline"),s.textContent=o?`Offline (${r(i)} queued)`:"Offline")}setupOnlineDetection(){window.addEventListener("online",()=>{this.isOnline=!0,this.reconnectAttempts=0,this.connectSSE()}),window.addEventListener("offline",()=>{this.isOnline=!1,this.setConnectionStatus("offline")})}_updateCjkInputState(){const e=document.getElementById("cjkInput");if(!e)return;const t=this.loadAppSettingsFromStorage(),s=this._serverCjkOverride||t.cjkInputEnabled||!1;e.style.display=s?"block":"none",s||(window.cjkActive=!1)}_resetAllAppState(){this.sessions.clear(),this.ralphStates.clear(),this.terminalBuffers.clear(),this.terminalBufferCache.clear(),this.projectInsights.clear(),this.teams.clear(),this.teamTasks.clear();for(const e of this.idleTimers.values())clearTimeout(e);if(this.idleTimers.clear(),this._clearTimer("flickerFilterTimeout"),this.flickerFilterBuffer="",this.flickerFilterActive=!1,this._clearTimer("syncWaitTimeout"),this.pendingWrites=[],this.writeFrameScheduled=!1,this._isLoadingBuffer=!1,this._loadBufferQueue=null,this._chunkedWriteGen=(this._chunkedWriteGen||0)+1,this._localEchoOverlay?.rerender(),this.pendingHooks.clear(),this._parentNameCache&&this._parentNameCache.clear(),this.subagentActivity.clear(),this.subagentToolResults.clear(),MobileDetection.cleanup(),KeyboardHandler.cleanup(),MobileDetection.init(),KeyboardHandler.init(),this.tabAlerts.clear(),this._shownCompletions&&this._shownCompletions.clear(),this.notificationManager?.titleFlashInterval&&(clearInterval(this.notificationManager.titleFlashInterval),this.notificationManager.titleFlashInterval=null),this.notificationManager?.groupingMap){for(const{timeout:e}of this.notificationManager.groupingMap.values())clearTimeout(e);this.notificationManager.groupingMap.clear()}this.terminalResizeObserver&&(this.terminalResizeObserver.disconnect(),this.terminalResizeObserver=null),this.planLoadingTimer&&(clearInterval(this.planLoadingTimer),this.planLoadingTimer=null),this.timerCountdownInterval&&(clearInterval(this.timerCountdownInterval),this.timerCountdownInterval=null),this.runSummaryAutoRefreshTimer&&(clearInterval(this.runSummaryAutoRefreshTimer),this.runSummaryAutoRefreshTimer=null)}handleInit(e){this._clearTimer("_initFallbackTimer");const t=++this._initGeneration;if(this._serverCjkOverride=e.inputCjkForm||!1,this._updateCjkInputState(),e.version){const n=this.$("versionDisplay"),o=this.$("headerVersion");n&&(n.textContent=`v${e.version}`,n.title=`Codeman v${e.version}`),o&&(o.textContent=`v${e.version}`,o.title=`Codeman v${e.version}`)}VoiceInput.cleanup(),this._resetAllAppState(),e.sessions.forEach(n=>{this.sessions.set(n.id,n),(n.ralphLoop||n.ralphTodos)&&!this.ralphClosedSessions.has(n.id)&&this.ralphStates.set(n.id,{loop:n.ralphLoop||null,todos:n.ralphTodos||[]})});try{localStorage.removeItem("codeman-tab-meta")}catch{}this.syncSessionOrder(),e.respawnStatus?this.respawnStatus=e.respawnStatus:this.respawnStatus={},this.respawnTimers={},this.respawnCountdownTimers={},this.respawnActionLogs={},e.globalStats&&(this.globalStats=e.globalStats),this.totalCost=e.sessions.reduce((n,o)=>n+(o.totalCost||0),0),this.totalCost+=e.scheduledRuns.reduce((n,o)=>n+(o.totalCost||0),0);const s=e.scheduledRuns.find(n=>n.status==="running");if(s&&(this.currentRun=s,this.showTimer()),this.updateCost(),this.renderSessionTabs(),this.sessions.size>0?this.startSystemStatsPolling():this.stopSystemStatsPolling(),this.cleanupAllFloatingWindows(),e.subagents&&(this.subagents.clear(),this.subagentActivity.clear(),this.subagentToolResults.clear(),e.subagents.forEach(n=>{this.subagents.set(n.agentId,n)}),this.renderSubagentPanel(),this.subagentParentMap.clear(),this.loadSubagentParentMap().then(()=>{for(const[n,o]of this.subagentParentMap){const r=this.subagents.get(n);if(r&&this.sessions.has(o)){r.parentSessionId=o;const a=this.sessions.get(o);a&&(r.parentSessionName=this.getSessionName(a)),this.subagents.set(n,r)}}for(const[n]of this.subagents)this.subagentParentMap.has(n)||this.findParentSessionForSubagent(n);this.restoreSubagentWindowStates()})),t!==this._initGeneration)return;if(this.isSoloWindow){this._applySoloMode();return}const i=this.activeSessionId;if(this.activeSessionId=null,this.sessionOrder.length>0){let n=i;if(!n||!this.sessions.has(n))try{n=localStorage.getItem("codeman-active-session")}catch{}n&&this.sessions.has(n)?this.selectSession(n):this.selectSession(this.sessionOrder[0])}}async loadState(){try{const t=await(await fetch("/api/status")).json();this.handleInit(t)}catch(e){console.error("Failed to load state:",e)}}_debouncedCall(e,t,s=100){this._debounceTimers[e]&&clearTimeout(this._debounceTimers[e]),this._debounceTimers[e]=setTimeout(()=>{this._debounceTimers[e]=null,t.call(this)},s)}renderSessionTabs(){this._activeRename||this._debouncedCall("sessionTabs",this._renderSessionTabsImmediate)}_updateActiveTabImmediate(e){const t=this.$("sessionTabs");if(!t)return;const s=t.querySelectorAll(".session-tab[data-id]");for(const i of s)i.dataset.id===e?i.classList.add("active"):i.classList.remove("active")}_renderSessionTabsImmediate(){const e=this.$("sessionTabs"),t=e.querySelectorAll(".session-tab[data-id]"),s=new Set([...t].map(o=>o.dataset.id)),i=new Set(this.sessions.keys());if(s.size===i.size&&[...s].every(o=>i.has(o)))for(const[o,r]of this.sessions){const a=e.querySelector(`.session-tab[data-id="${o}"]`);if(!a)continue;const c=o===this.activeSessionId,h=r.status||"idle",d=this.getSessionName(r),u=r.taskStats||{running:0,total:0},S=u.running>0;c&&!a.classList.contains("active")?a.classList.add("active"):!c&&a.classList.contains("active")&&a.classList.remove("active");const f=this.tabAlerts.get(o),_=f==="action",E=f==="idle",T=a.classList.contains("tab-alert-action"),w=a.classList.contains("tab-alert-idle");if(_&&!T?(a.classList.add("tab-alert-action"),a.classList.remove("tab-alert-idle")):E&&!w?(a.classList.add("tab-alert-idle"),a.classList.remove("tab-alert-action")):!f&&(T||w)&&a.classList.remove("tab-alert-action","tab-alert-idle"),!a.querySelector(".tab-number")){const p=this.sessionOrder.indexOf(o);if(p>=0&&p<9){const g=document.createElement("span");g.className="tab-number",g.textContent=String(p+1),a.insertBefore(g,a.firstChild)}}const b=a.querySelector(".tab-status");b&&!b.classList.contains(h)&&(b.className=`tab-status ${h}`);const y=a.querySelector(".tab-name");if(y&&y.textContent!==d){const p=parseSessionPrefix(d);p&&p.suffix?y.innerHTML='<span class="tab-prefix">'+escapeHtml(p.prefix)+'</span><span class="tab-suffix">: '+escapeHtml(p.suffix)+"</span>":y.textContent=d}const v=a.querySelector(".tab-badge");if(S)if(v)v.textContent!==String(u.running)&&(v.textContent=u.running);else{this._fullRenderSessionTabs();return}else if(v){this._fullRenderSessionTabs();return}const m=a.querySelector(".tab-subagent-badge"),A=this.minimizedSubagents.get(o),C=A?.size||0;if(C>0&&m){const p=m.querySelector(".subagent-label"),g=C===1?"AGENT":`AGENTS (${C})`;p&&p.textContent!==g&&(p.textContent=g);const O=m.querySelector(".subagent-dropdown");if(O){const I=this.renderSubagentTabBadge(o,A),R=document.createElement("div");R.innerHTML=I;const k=R.querySelector(".subagent-dropdown");k&&(O.innerHTML=k.innerHTML)}}else if(C>0&&!m){const p=this.renderSubagentTabBadge(o,A),g=a.querySelector(".tab-gear");g&&g.insertAdjacentHTML("beforebegin",p)}else C===0&&m&&m.remove()}else this._fullRenderSessionTabs()}_fullRenderSessionTabs(){if(this._activeRename)return;const e=this.$("sessionTabs");document.querySelectorAll("body > .subagent-dropdown").forEach(n=>n.remove()),this.cancelHideSubagentDropdown();const t=[];let s=this.sessionOrder;MobileDetection.getDeviceType()==="mobile"&&this.activeSessionId&&(s=[this.activeSessionId,...this.sessionOrder.filter(n=>n!==this.activeSessionId)]);let i=0;for(const n of s){const o=this.sessions.get(n);if(!o)continue;const r=n===this.activeSessionId,a=o.status||"idle",c=this.getSessionName(o),h=o.mode||"claude",d=o.color||"default",u=o.taskStats||{running:0,total:0},S=u.running>0,f=this.tabAlerts.get(n),_=f==="action"?" tab-alert-action":f==="idle"?" tab-alert-idle":"",E=this.minimizedSubagents.get(n),w=(E?.size||0)>0?this.renderSubagentTabBadge(n,E):"",b=o.workingDir&&o.workingDir.split("/").pop()||"",v=(this._tallTabsEnabled??!1)&&o.name&&b&&b!==c;t.push(`<div class="session-tab ${r?"active":""}${_}${this.detachedSessions.has(n)?" detached":""}" data-id="${n}" data-color="${d}" onclick="app.selectSession('${escapeHtml(n)}')" oncontextmenu="event.preventDefault(); app.startInlineRename('${escapeHtml(n)}')" tabindex="0" role="tab" aria-selected="${r?"true":"false"}" aria-label="${escapeHtml(c)} session" ${o.workingDir?`title="${escapeHtml(o.workingDir)}"`:""}>
15
15
  ${i<9?'<span class="tab-number">'+(i+1)+"</span>":""}
16
16
  <span class="tab-status ${a}" aria-hidden="true"></span>
17
17
  <span class="tab-info">
@@ -25,7 +25,7 @@
25
25
  instead of waiting until <script> tags at bottom-of-body are reached. -->
26
26
  <link rel="preload" href="vendor/xterm.min.js" as="script">
27
27
  <link rel="preload" href="constants.cb6426c4.js" as="script">
28
- <link rel="preload" href="app.cc861c96.js" as="script">
28
+ <link rel="preload" href="app.c860ea08.js" as="script">
29
29
  <!-- Self-hosted xterm.js — eliminates CDN DNS/TLS latency (~100ms).
30
30
  'defer' preserves execution order (xterm loads before fit addon). -->
31
31
  <script defer src="vendor/xterm.min.js"></script>
@@ -1822,7 +1822,7 @@
1822
1822
  <script defer src="notification-manager.9c984ac2.js"></script>
1823
1823
  <script defer src="keyboard-accessory.cdfd8c04.js"></script>
1824
1824
  <script defer src="input-cjk.88082175.js"></script>
1825
- <script defer src="app.cc861c96.js"></script>
1825
+ <script defer src="app.c860ea08.js"></script>
1826
1826
  <script defer src="terminal-ui.37caa926.js"></script>
1827
1827
  <script defer src="respawn-ui.5377f958.js"></script>
1828
1828
  <script defer src="ralph-panel.61076370.js"></script>
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1 +1 @@
1
- {"version":3,"file":"file-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/file-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAiX/E"}
1
+ {"version":3,"file":"file-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/file-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAO1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA0d/E"}
@@ -2,7 +2,8 @@
2
2
  * @fileoverview File browser and streaming routes.
3
3
  * Provides directory listing, file content preview, raw file serving, and tail streaming.
4
4
  */
5
- import { join } from 'node:path';
5
+ import { basename as pathBasename, join } from 'node:path';
6
+ import { homedir } from 'node:os';
6
7
  import fs from 'node:fs/promises';
7
8
  import { ApiErrorCode, createErrorResponse, getErrorMessage } from '../../types.js';
8
9
  import { fileStreamManager } from '../../file-stream-manager.js';
@@ -237,7 +238,6 @@ export function registerFileRoutes(app, ctx) {
237
238
  jpeg: 'image/jpeg',
238
239
  gif: 'image/gif',
239
240
  webp: 'image/webp',
240
- svg: 'image/svg+xml',
241
241
  ico: 'image/x-icon',
242
242
  bmp: 'image/bmp',
243
243
  mp4: 'video/mp4',
@@ -250,19 +250,21 @@ export function registerFileRoutes(app, ctx) {
250
250
  json: 'application/json',
251
251
  };
252
252
  const content = await fs.readFile(resolvedPath);
253
- if (download === 'true') {
254
- const rawBasename = filePath.split('/').pop() || 'download';
255
- // Sanitize filename for Content-Disposition header (prevent header injection)
256
- const basename = rawBasename.replace(/["\\\r\n]/g, '_');
253
+ const rawBasename = filePath.split('/').pop() || 'download';
254
+ // Sanitize filename for Content-Disposition header (prevent header injection)
255
+ const basename = rawBasename.replace(/["\\\r\n]/g, '_');
256
+ if (download === 'true' || ext === 'svg') {
257
257
  reply.raw.writeHead(200, {
258
- 'Content-Type': mimeTypes[ext] || 'application/octet-stream',
258
+ 'Content-Type': ext === 'svg' ? 'application/octet-stream' : mimeTypes[ext] || 'application/octet-stream',
259
259
  'Content-Disposition': `attachment; filename="${basename}"`,
260
260
  'Content-Length': content.length,
261
+ 'X-Content-Type-Options': 'nosniff',
261
262
  });
262
263
  reply.raw.end(content);
263
264
  return;
264
265
  }
265
266
  reply.header('Content-Type', mimeTypes[ext] || 'application/octet-stream');
267
+ reply.header('X-Content-Type-Options', 'nosniff');
266
268
  reply.send(content);
267
269
  }
268
270
  catch (err) {
@@ -329,5 +331,94 @@ export function registerFileRoutes(app, ctx) {
329
331
  const closed = fileStreamManager.closeStream(streamId);
330
332
  return { success: closed };
331
333
  });
334
+ // Session-scoped file download.
335
+ // Uses the same realpath-based workspace boundary as file preview/raw routes;
336
+ // the sensitive-path blocklist remains defense-in-depth, not the primary boundary.
337
+ const SENSITIVE_PATTERNS = [
338
+ /^\/etc\/shadow$/,
339
+ /^\/etc\/gshadow$/,
340
+ /^\/etc\/master\.passwd$/,
341
+ new RegExp(`^${homedir().replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\/\\.ssh\\/`),
342
+ /\/\.env$/,
343
+ /\/\.env\./,
344
+ /\/credentials(\.json|\.yml|\.yaml|\.xml)?$/i,
345
+ /\/\.aws\/credentials$/,
346
+ /\/\.gcloud\/credentials\.db$/,
347
+ /\/\.docker\/config\.json$/,
348
+ ];
349
+ function isSensitivePath(absPath) {
350
+ return SENSITIVE_PATTERNS.some((pattern) => pattern.test(absPath));
351
+ }
352
+ app.get('/api/download', async (req, reply) => {
353
+ const { path: filePath, sessionId } = req.query;
354
+ if (!filePath) {
355
+ reply.code(400).send(createErrorResponse(ApiErrorCode.INVALID_INPUT, 'Missing path parameter'));
356
+ return;
357
+ }
358
+ if (!sessionId) {
359
+ reply.code(400).send(createErrorResponse(ApiErrorCode.INVALID_INPUT, 'Missing sessionId parameter'));
360
+ return;
361
+ }
362
+ const session = findSessionOrFail(ctx, sessionId);
363
+ const validated = validateSessionFilePath(session.workingDir, filePath);
364
+ if (!validated) {
365
+ reply.code(404).send(createErrorResponse(ApiErrorCode.NOT_FOUND, 'File not found'));
366
+ return;
367
+ }
368
+ const { resolvedPath } = validated;
369
+ // Check sensitive path blocklist
370
+ if (isSensitivePath(resolvedPath)) {
371
+ reply.code(403).send(createErrorResponse(ApiErrorCode.INVALID_INPUT, 'Access to this file is blocked'));
372
+ return;
373
+ }
374
+ try {
375
+ const stat = await fs.stat(resolvedPath);
376
+ if (!stat.isFile()) {
377
+ reply.code(400).send(createErrorResponse(ApiErrorCode.INVALID_INPUT, 'Path is not a file'));
378
+ return;
379
+ }
380
+ // 50MB size limit
381
+ const MAX_DOWNLOAD_SIZE = 50 * 1024 * 1024;
382
+ if (stat.size > MAX_DOWNLOAD_SIZE) {
383
+ reply
384
+ .code(400)
385
+ .send(createErrorResponse(ApiErrorCode.INVALID_INPUT, `File too large (${Math.round(stat.size / 1024 / 1024)}MB > 50MB limit)`));
386
+ return;
387
+ }
388
+ const ext = filePath.split('.').pop()?.toLowerCase() || '';
389
+ const mimeTypes = {
390
+ png: 'image/png',
391
+ jpg: 'image/jpeg',
392
+ jpeg: 'image/jpeg',
393
+ gif: 'image/gif',
394
+ webp: 'image/webp',
395
+ svg: 'image/svg+xml',
396
+ pdf: 'application/pdf',
397
+ json: 'application/json',
398
+ txt: 'text/plain',
399
+ md: 'text/markdown',
400
+ csv: 'text/csv',
401
+ xml: 'application/xml',
402
+ zip: 'application/zip',
403
+ gz: 'application/gzip',
404
+ tar: 'application/x-tar',
405
+ };
406
+ const filename = pathBasename(resolvedPath);
407
+ const content = await fs.readFile(resolvedPath);
408
+ // Bypass Fastify compression — write directly to raw response
409
+ reply.raw.writeHead(200, {
410
+ 'Content-Type': mimeTypes[ext] || 'application/octet-stream',
411
+ 'Content-Disposition': `attachment; filename="${filename}"`,
412
+ 'Content-Length': content.length,
413
+ });
414
+ reply.raw.end(content);
415
+ return;
416
+ }
417
+ catch (err) {
418
+ reply
419
+ .code(500)
420
+ .send(createErrorResponse(ApiErrorCode.OPERATION_FAILED, `Failed to read file: ${getErrorMessage(err)}`));
421
+ }
422
+ });
332
423
  }
333
424
  //# sourceMappingURL=file-routes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-routes.js","sourceRoot":"","sources":["../../../src/web/routes/file-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-routes.js","sourceRoot":"","sources":["../../../src/web/routes/file-routes.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,7 @@ export declare class WebServer extends EventEmitter {
39
39
  private sse;
40
40
  private store;
41
41
  private port;
42
+ private host;
42
43
  private https;
43
44
  private testMode;
44
45
  private mux;
@@ -60,13 +61,14 @@ export declare class WebServer extends EventEmitter {
60
61
  private pushStore;
61
62
  private teamWatcher;
62
63
  private _orchestratorLoop;
63
- private _pasteImageGcStop;
64
- private _eventLoopMonitor;
65
- private teamWatcherHandlers;
66
64
  private readonly titleHostname;
67
65
  private readonly windowTitle;
68
66
  private readonly indexHtmlTemplate;
69
- constructor(port?: number, https?: boolean, testMode?: boolean, titleHostname?: string);
67
+ private readonly allowUnauthenticatedNetwork;
68
+ private _pasteImageGcStop;
69
+ private _eventLoopMonitor;
70
+ private teamWatcherHandlers;
71
+ constructor(port?: number, https?: boolean, testMode?: boolean, host?: string, titleHostname?: string, allowUnauthenticatedNetwork?: boolean);
70
72
  /**
71
73
  * Set up event listeners for subagent watcher.
72
74
  * Broadcasts real-time subagent activity to SSE clients.
@@ -217,5 +219,5 @@ export declare class WebServer extends EventEmitter {
217
219
  private initOrchestratorLoop;
218
220
  stop(): Promise<void>;
219
221
  }
220
- export declare function startWebServer(port?: number, https?: boolean, testMode?: boolean, titleHostname?: string): Promise<WebServer>;
222
+ export declare function startWebServer(port?: number, https?: boolean, testMode?: boolean, host?: string, titleHostname?: string, allowUnauthenticatedNetwork?: boolean): Promise<WebServer>;
221
223
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
@@ -70,6 +70,7 @@ import { MAX_CONCURRENT_SESSIONS, MAX_SSE_CLIENTS } from '../config/map-limits.j
70
70
  import { SseEvent } from './sse-events.js';
71
71
  import { registerAuthMiddleware, registerSecurityHeaders } from './middleware/auth.js';
72
72
  import { installRouteErrorHandler } from './route-error-handler.js';
73
+ import { isExplicitlyEnabled, isLoopbackBindHost } from './network-auth-policy.js';
73
74
  import { registerPushRoutes, registerTeamRoutes, registerMuxRoutes, registerFileRoutes, registerScheduledRoutes, registerHookEventRoutes, registerSystemRoutes, registerCaseRoutes, registerSessionRoutes, registerRespawnRoutes, registerRalphRoutes, registerPlanRoutes, registerClipboardRoutes, registerOrchestratorRoutes, registerWsRoutes, } from './routes/index.js';
74
75
  const __dirname = dirname(fileURLToPath(import.meta.url));
75
76
  // Bounded, predictable shape for SSE client identifiers: alphanumerics, `_`, `-`.
@@ -120,6 +121,7 @@ export class WebServer extends EventEmitter {
120
121
  sse;
121
122
  store = getStore();
122
123
  port;
124
+ host;
123
125
  https;
124
126
  testMode;
125
127
  mux;
@@ -149,18 +151,22 @@ export class WebServer extends EventEmitter {
149
151
  pushStore = new PushSubscriptionStore();
150
152
  teamWatcher = new TeamWatcher();
151
153
  _orchestratorLoop = null;
152
- _pasteImageGcStop = null;
153
- _eventLoopMonitor = null;
154
- teamWatcherHandlers = null;
155
154
  titleHostname;
156
155
  windowTitle;
157
156
  indexHtmlTemplate;
158
- constructor(port = 3000, https = false, testMode = false, titleHostname) {
157
+ allowUnauthenticatedNetwork;
158
+ _pasteImageGcStop = null;
159
+ _eventLoopMonitor = null;
160
+ teamWatcherHandlers = null;
161
+ constructor(port = 3000, https = false, testMode = false, host = '127.0.0.1', titleHostname, allowUnauthenticatedNetwork = false) {
159
162
  super();
160
163
  this.setMaxListeners(0);
164
+ this.host = host;
161
165
  this.port = port;
162
166
  this.https = https;
163
167
  this.testMode = testMode;
168
+ this.allowUnauthenticatedNetwork =
169
+ allowUnauthenticatedNetwork || isExplicitlyEnabled(process.env.CODEMAN_ALLOW_UNAUTHENTICATED_NETWORK);
164
170
  this.titleHostname = titleHostname || getHostname();
165
171
  this.windowTitle = `codeman:${this.titleHostname}`;
166
172
  this.indexHtmlTemplate = readFileSync(join(__dirname, 'public', 'index.html'), 'utf-8');
@@ -1438,17 +1444,35 @@ export class WebServer extends EventEmitter {
1438
1444
  // incident leaves a quantified log line instead of vanishing silently.
1439
1445
  this._eventLoopMonitor = startEventLoopMonitor();
1440
1446
  }
1441
- await this.app.listen({ port: this.port, host: '0.0.0.0' });
1447
+ await this.app.listen({ port: this.port, host: this.host });
1442
1448
  const protocol = this.https ? 'https' : 'http';
1443
- console.log(`Codeman web interface running at ${protocol}://localhost:${this.port}`);
1444
- // Security warning: server binds to 0.0.0.0 (all interfaces) — warn if no auth configured
1445
- if (!process.env.CODEMAN_PASSWORD) {
1446
- console.warn('\n⚠ WARNING: No CODEMAN_PASSWORD set server is accessible without authentication.');
1447
- console.warn(' Anyone on your network can access and control Claude sessions.');
1448
- console.warn(' Set CODEMAN_PASSWORD environment variable to enable auth.\n');
1449
+ const displayHost = this.host === '0.0.0.0' ? 'localhost' : this.host;
1450
+ console.log(`Codeman web interface running at ${protocol}://${displayHost}:${this.port}`);
1451
+ // Codeman binds loopback (127.0.0.1) by default, which is safe out of the box.
1452
+ // If the user opts into a non-loopback bind (e.g. --host 0.0.0.0) WITHOUT a
1453
+ // password we no longer refuse to start that surprised people whose setups
1454
+ // "just worked" before. Instead we start and warn loudly, pointing at the ways
1455
+ // to secure it. --allow-unauthenticated-network just acknowledges the risk (a
1456
+ // terser note). See docs/security-architecture.md.
1457
+ if (!isLoopbackBindHost(this.host) && !process.env.CODEMAN_PASSWORD) {
1458
+ if (this.allowUnauthenticatedNetwork) {
1459
+ console.warn(`\n⚠ Codeman is reachable WITHOUT a password on ${displayHost}:${this.port} ` +
1460
+ '(explicitly allowed). Anyone who can reach it can control your Claude sessions.\n');
1461
+ }
1462
+ else {
1463
+ console.warn(`\n⚠ WARNING: Codeman is bound to a non-loopback host (${this.host}) with NO password.`);
1464
+ console.warn(` Anyone who can reach ${displayHost}:${this.port} can control your Claude sessions.`);
1465
+ console.warn(' Secure it with ONE of:');
1466
+ console.warn(' • set CODEMAN_PASSWORD=<password> (HTTP Basic auth), or');
1467
+ console.warn(' • bind loopback only: --host 127.0.0.1, then front it with an');
1468
+ console.warn(' authenticated tunnel (cloudflared) or `tailscale serve`, or');
1469
+ console.warn(' • keep this bind and accept the risk: --allow-unauthenticated-network');
1470
+ console.warn(' See docs/security-architecture.md for details.\n');
1471
+ }
1449
1472
  }
1450
1473
  // Set API URL for child processes (MCP server, spawned sessions)
1451
- process.env.CODEMAN_API_URL = `${protocol}://localhost:${this.port}`;
1474
+ const apiHost = this.host === '0.0.0.0' || this.host === 'localhost' || this.host === '::1' ? '127.0.0.1' : this.host;
1475
+ process.env.CODEMAN_API_URL = `${protocol}://${apiHost}:${this.port}`;
1452
1476
  // Start scheduled runs cleanup timer
1453
1477
  this.cleanup.setInterval(() => {
1454
1478
  this.cleanupScheduledRuns();
@@ -1859,8 +1883,8 @@ export class WebServer extends EventEmitter {
1859
1883
  await this.app.close();
1860
1884
  }
1861
1885
  }
1862
- export async function startWebServer(port = 3000, https = false, testMode = false, titleHostname) {
1863
- const server = new WebServer(port, https, testMode, titleHostname);
1886
+ export async function startWebServer(port = 3000, https = false, testMode = false, host = '127.0.0.1', titleHostname, allowUnauthenticatedNetwork = false) {
1887
+ const server = new WebServer(port, https, testMode, host, titleHostname, allowUnauthenticatedNetwork);
1864
1888
  await server.start();
1865
1889
  return server;
1866
1890
  }