aicodeman 1.1.17 → 1.2.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 (136) hide show
  1. package/dist/config/dependency-registry.d.ts.map +1 -1
  2. package/dist/config/dependency-registry.js +8 -0
  3. package/dist/config/dependency-registry.js.map +1 -1
  4. package/dist/mux-interface.d.ts +3 -1
  5. package/dist/mux-interface.d.ts.map +1 -1
  6. package/dist/ralph-tracker.d.ts +19 -1
  7. package/dist/ralph-tracker.d.ts.map +1 -1
  8. package/dist/ralph-tracker.js +44 -3
  9. package/dist/ralph-tracker.js.map +1 -1
  10. package/dist/search-service.d.ts +78 -0
  11. package/dist/search-service.d.ts.map +1 -0
  12. package/dist/search-service.js +155 -0
  13. package/dist/search-service.js.map +1 -0
  14. package/dist/session.d.ts +12 -6
  15. package/dist/session.d.ts.map +1 -1
  16. package/dist/session.js +36 -8
  17. package/dist/session.js.map +1 -1
  18. package/dist/tmux-manager.d.ts +4 -0
  19. package/dist/tmux-manager.d.ts.map +1 -1
  20. package/dist/tmux-manager.js +92 -5
  21. package/dist/tmux-manager.js.map +1 -1
  22. package/dist/types/index.d.ts +1 -0
  23. package/dist/types/index.d.ts.map +1 -1
  24. package/dist/types/index.js +1 -0
  25. package/dist/types/index.js.map +1 -1
  26. package/dist/types/ralph.d.ts +4 -0
  27. package/dist/types/ralph.d.ts.map +1 -1
  28. package/dist/types/ralph.js.map +1 -1
  29. package/dist/types/search.d.ts +73 -0
  30. package/dist/types/search.d.ts.map +1 -0
  31. package/dist/types/search.js +20 -0
  32. package/dist/types/search.js.map +1 -0
  33. package/dist/types/session.d.ts +15 -2
  34. package/dist/types/session.d.ts.map +1 -1
  35. package/dist/types/session.js +3 -1
  36. package/dist/types/session.js.map +1 -1
  37. package/dist/utils/gemini-cli-resolver.d.ts +20 -0
  38. package/dist/utils/gemini-cli-resolver.d.ts.map +1 -0
  39. package/dist/utils/gemini-cli-resolver.js +62 -0
  40. package/dist/utils/gemini-cli-resolver.js.map +1 -0
  41. package/dist/utils/index.d.ts +1 -0
  42. package/dist/utils/index.d.ts.map +1 -1
  43. package/dist/utils/index.js +1 -0
  44. package/dist/utils/index.js.map +1 -1
  45. package/dist/web/away-digest.d.ts +91 -0
  46. package/dist/web/away-digest.d.ts.map +1 -0
  47. package/dist/web/away-digest.js +244 -0
  48. package/dist/web/away-digest.js.map +1 -0
  49. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  50. package/dist/web/public/{app.d42616c5.js → app.d6f72a0b.js} +2 -2
  51. package/dist/web/public/{app.d42616c5.js.br → app.d6f72a0b.js.br} +0 -0
  52. package/dist/web/public/{app.d42616c5.js.gz → app.d6f72a0b.js.gz} +0 -0
  53. package/dist/web/public/constants.1c779517.js.gz +0 -0
  54. package/dist/web/public/image-input.ee16ad88.js.gz +0 -0
  55. package/dist/web/public/index.html +93 -8
  56. package/dist/web/public/index.html.br +0 -0
  57. package/dist/web/public/index.html.gz +0 -0
  58. package/dist/web/public/input-cjk.4e950e0a.js.gz +0 -0
  59. package/dist/web/public/keyboard-accessory.3f91acef.js.gz +0 -0
  60. package/dist/web/public/mobile-handlers.b5a667ef.js.gz +0 -0
  61. package/dist/web/public/mobile.8a9aff7a.css +1 -0
  62. package/dist/web/public/mobile.8a9aff7a.css.br +0 -0
  63. package/dist/web/public/mobile.8a9aff7a.css.gz +0 -0
  64. package/dist/web/public/notification-manager.ca9dc40d.js.gz +0 -0
  65. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  66. package/dist/web/public/{panels-ui.aedcf302.js → panels-ui.772e92c9.js} +131 -86
  67. package/dist/web/public/panels-ui.772e92c9.js.br +0 -0
  68. package/dist/web/public/panels-ui.772e92c9.js.gz +0 -0
  69. package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
  70. package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
  71. package/dist/web/public/respawn-ui.2d249da9.js.gz +0 -0
  72. package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
  73. package/dist/web/public/session-ui.da3e53f2.js +36 -0
  74. package/dist/web/public/session-ui.da3e53f2.js.br +0 -0
  75. package/dist/web/public/session-ui.da3e53f2.js.gz +0 -0
  76. package/dist/web/public/settings-ui.38feb956.js.gz +0 -0
  77. package/dist/web/public/styles.1b3e6147.css +1 -0
  78. package/dist/web/public/styles.1b3e6147.css.br +0 -0
  79. package/dist/web/public/styles.1b3e6147.css.gz +0 -0
  80. package/dist/web/public/subagent-windows.69b60c35.js.gz +0 -0
  81. package/dist/web/public/sw.js.gz +0 -0
  82. package/dist/web/public/terminal-ui.865f21f6.js +3 -0
  83. package/dist/web/public/terminal-ui.865f21f6.js.br +0 -0
  84. package/dist/web/public/terminal-ui.865f21f6.js.gz +0 -0
  85. package/dist/web/public/ultracode-panel.js.gz +0 -0
  86. package/dist/web/public/ultracode-windows.js.gz +0 -0
  87. package/dist/web/public/upload.html.gz +0 -0
  88. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  89. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  90. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  91. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  92. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  93. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  94. package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
  95. package/dist/web/public/vendor/xterm.css.gz +0 -0
  96. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  97. package/dist/web/public/voice-input.085e9e73.js.gz +0 -0
  98. package/dist/web/routes/index.d.ts +1 -0
  99. package/dist/web/routes/index.d.ts.map +1 -1
  100. package/dist/web/routes/index.js +1 -0
  101. package/dist/web/routes/index.js.map +1 -1
  102. package/dist/web/routes/ralph-routes.d.ts.map +1 -1
  103. package/dist/web/routes/ralph-routes.js +7 -1
  104. package/dist/web/routes/ralph-routes.js.map +1 -1
  105. package/dist/web/routes/search-routes.d.ts +27 -0
  106. package/dist/web/routes/search-routes.d.ts.map +1 -0
  107. package/dist/web/routes/search-routes.js +123 -0
  108. package/dist/web/routes/search-routes.js.map +1 -0
  109. package/dist/web/routes/session-routes.d.ts.map +1 -1
  110. package/dist/web/routes/session-routes.js +41 -13
  111. package/dist/web/routes/session-routes.js.map +1 -1
  112. package/dist/web/routes/system-routes.d.ts.map +1 -1
  113. package/dist/web/routes/system-routes.js +56 -1
  114. package/dist/web/routes/system-routes.js.map +1 -1
  115. package/dist/web/schemas.d.ts +39 -0
  116. package/dist/web/schemas.d.ts.map +1 -1
  117. package/dist/web/schemas.js +49 -4
  118. package/dist/web/schemas.js.map +1 -1
  119. package/dist/web/server.d.ts.map +1 -1
  120. package/dist/web/server.js +5 -1
  121. package/dist/web/server.js.map +1 -1
  122. package/package.json +1 -1
  123. package/dist/web/public/mobile.38346326.css +0 -1
  124. package/dist/web/public/mobile.38346326.css.br +0 -0
  125. package/dist/web/public/mobile.38346326.css.gz +0 -0
  126. package/dist/web/public/panels-ui.aedcf302.js.br +0 -0
  127. package/dist/web/public/panels-ui.aedcf302.js.gz +0 -0
  128. package/dist/web/public/session-ui.0ee6c334.js +0 -36
  129. package/dist/web/public/session-ui.0ee6c334.js.br +0 -0
  130. package/dist/web/public/session-ui.0ee6c334.js.gz +0 -0
  131. package/dist/web/public/styles.4d2984bd.css +0 -1
  132. package/dist/web/public/styles.4d2984bd.css.br +0 -0
  133. package/dist/web/public/styles.4d2984bd.css.gz +0 -0
  134. package/dist/web/public/terminal-ui.f4f3b686.js +0 -3
  135. package/dist/web/public/terminal-ui.f4f3b686.js.br +0 -0
  136. package/dist/web/public/terminal-ui.f4f3b686.js.gz +0 -0
@@ -0,0 +1,3 @@
1
+ "use strict";(function(e){const t=/^\x1b\[[\?>=]?[\d;]*[cnR]$/,s=/^\x1b\][\d;]*[^\x07\x1b]*(?:\x07|\x1b\\)$/;function r(d){return t.test(d)||s.test(d)}function o(d){return r(d)}const l={og:{background:"#0d0d0d",foreground:"#e0e0e0",cursor:"#e0e0e0",cursorAccent:"#0d0d0d",selection:"rgba(255,255,255,0.3)",black:"#0d0d0d",red:"#ff6b6b",green:"#51cf66",yellow:"#ffd43b",blue:"#339af0",magenta:"#cc5de8",cyan:"#22b8cf",white:"#e0e0e0",brightBlack:"#495057",brightRed:"#ff8787",brightGreen:"#69db7c",brightYellow:"#ffe066",brightBlue:"#5c7cfa",brightMagenta:"#da77f2",brightCyan:"#66d9e8",brightWhite:"#ffffff"},"daylight-green":{background:"#161b23",foreground:"#dfe6ef",cursor:"#2fd3aa",cursorAccent:"#161b23",selection:"rgba(47,211,170,0.22)",black:"#161b23",red:"#ff8585",green:"#34d8a0",yellow:"#f0c25a",blue:"#5cc6e8",magenta:"#c79af2",cyan:"#2bcbbb",white:"#dfe6ef",brightBlack:"#5b6675",brightRed:"#ffa0a0",brightGreen:"#5fe6b8",brightYellow:"#ffd884",brightBlue:"#82d4ee",brightMagenta:"#d6b3f7",brightCyan:"#5ee0d4",brightWhite:"#f3f6fa"},"daylight-blue":{background:"#161b23",foreground:"#dfe6ef",cursor:"#38b6f0",cursorAccent:"#161b23",selection:"rgba(56,182,240,0.22)",black:"#161b23",red:"#ff8585",green:"#34d8a0",yellow:"#f0c25a",blue:"#5cc6e8",magenta:"#c79af2",cyan:"#2bcbbb",white:"#dfe6ef",brightBlack:"#5b6675",brightRed:"#ffa0a0",brightGreen:"#5fe6b8",brightYellow:"#ffd884",brightBlue:"#82d4ee",brightMagenta:"#d6b3f7",brightCyan:"#5ee0d4",brightWhite:"#f3f6fa"}};function f(){const d=typeof document<"u"&&document.documentElement.dataset.skin||"daylight-blue";return l[d]||l["daylight-blue"]}e.CodemanTerminalInput={isTerminalQueryResponse:r,shouldSuppressTerminalQueryResponse:o,USER_SCROLL_STICKY_SUPPRESS_MS:1500,TOUCH_COMPAT_MOUSE_SUPPRESS_MS:450},e.CODEMAN_XTERM_THEMES=l,e.codemanCurrentXtermTheme=f})(window),Object.assign(CodemanApp.prototype,{initTerminal(){const e=parseInt(localStorage.getItem("codeman-scrollback")),t=Number.isFinite(e)&&e>0?Math.max(e,DEFAULT_SCROLLBACK):DEFAULT_SCROLLBACK;if(this.terminal=new Terminal({theme:{...window.codemanCurrentXtermTheme()},fontFamily:'"Fira Code", "Cascadia Code", "JetBrains Mono", "SF Mono", Monaco, monospace',fontSize:MobileDetection.getDeviceType()==="mobile"?10:14,lineHeight:1.2,cursorBlink:!1,cursorStyle:"block",scrollback:t,allowTransparency:!0,allowProposedApi:!0}),this.fitAddon=new FitAddon.FitAddon,this.terminal.loadAddon(this.fitAddon),this._xtermSnapshots=new Map,typeof SerializeAddon<"u")try{this._serializeAddon=new SerializeAddon.SerializeAddon,this.terminal.loadAddon(this._serializeAddon)}catch{this._serializeAddon=null}if(typeof Unicode11Addon<"u")try{const n=new Unicode11Addon.Unicode11Addon;this.terminal.loadAddon(n),this.terminal.unicode.activeVersion="11"}catch{}const s=document.getElementById("terminalContainer");this.terminal.open(s),this._installMobileTapMouseGuard(),this.terminal.attachCustomKeyEventHandler(n=>{if(n.isComposing||n.keyCode===229||n.altKey&&!n.ctrlKey&&!n.shiftKey&&/^(Digit[1-9]|BracketLeft|BracketRight)$/.test(n.code||""))return!1;if((n.ctrlKey||n.metaKey)&&n.key==="v"&&n.type==="keydown")return this.activeSessionId&&this._handleImagePaste&&this._handleImagePaste(),!1;if(n.key==="Enter"&&(n.shiftKey||n.ctrlKey)&&n.type==="keydown"){if(this.activeSessionId)if(this._localEchoEnabled){const u=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),u&&(this._pendingInput+=u,c()),setTimeout(()=>{fetch(`/api/sessions/${this.activeSessionId}/send-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:n.ctrlKey?"C-Enter":"S-Enter"})})},u?80:0)}else fetch(`/api/sessions/${this.activeSessionId}/send-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:n.ctrlKey?"C-Enter":"S-Enter"})});return!1}return!0});{const n=s.querySelector(".xterm-helper-textarea");if(n&&MobileDetection.isTouchDevice()){let u=!1,p=0;n.addEventListener("compositionstart",()=>{u=!0}),n.addEventListener("compositionend",()=>{u=!1}),n.addEventListener("keydown",h=>{!h.isComposing&&h.keyCode!==229&&(p=Date.now())}),n.addEventListener("input",h=>{if(u||h.isComposing||h.inputType!=="insertText"||!h.data||Date.now()-p<50)return;const m=h.data,S=this._localEchoOverlay?.pendingText||"";Promise.resolve().then(()=>{if(this._lastTerminalData?.data===m&&performance.now()-this._lastTerminalData.time<100){n.value="";return}const _=this._localEchoOverlay?.pendingText||"";if(this._localEchoEnabled&&_.length>S.length&&_.endsWith(m)){n.value="";return}const y=n.value;!y||y.trim()===""&&m!==" "||(this.terminal._core.coreService.triggerDataEvent(m,!0),n.value="")})})}}this._webglAddon=null;const i=new URLSearchParams(location.search);if(i.get("webgl")==="force")try{localStorage.removeItem("codeman-webgl-disabled")}catch{}const a=(()=>{try{const n=localStorage.getItem("codeman-webgl-disabled");if(!n)return!1;const{at:u}=JSON.parse(n);return Date.now()-u>WEBGL_FALLBACK.STICKY_EXPIRY_MS?(localStorage.removeItem("codeman-webgl-disabled"),!1):!0}catch{return!1}})(),r=MobileDetection.getDeviceType()!=="desktop"||i.has("nowebgl")||a;if(a&&console.log("[CRASH-DIAG] WebGL sticky-disabled from prior stalls \u2014 DOM renderer in use. Re-enable: ?webgl=force"),!r)if(typeof WebglAddon<"u")this._initWebGL();else{const n=document.createElement("script");n.src="vendor/xterm-addon-webgl.min.js",n.onload=()=>this._initWebGL(),n.onerror=()=>console.warn("[CRASH-DIAG] Failed to load WebGL addon \u2014 using canvas renderer"),document.head.appendChild(n)}this._localEchoOverlay=new LocalEchoOverlay(this.terminal),MobileDetection.isTouchDevice()&&(this.terminal.onCursorMove(()=>this._syncMobileHelperTextareaToCursor()),this.terminal.onRender(()=>this._syncMobileHelperTextareaToCursor())),this._cjkInput=null,typeof CjkInput<"u"&&(this._cjkInput=CjkInput.init({send:n=>{this._handleCjkInput(n)}})),MobileDetection.getDeviceType()==="mobile"&&document.body.classList.contains("safari-browser")?requestAnimationFrame(()=>{this.fitAddon.fit(),requestAnimationFrame(()=>this.fitAddon.fit())}):this.fitAddon.fit(),this.registerFilePathLinkProvider(),s.addEventListener("wheel",n=>{n.preventDefault();const u=Math.round(n.deltaY/25)||(n.deltaY>0?1:-1);this._noteTerminalUserScroll(u),this.terminal.scrollLines(u)},{passive:!1});{const n=()=>this.terminal._core?._renderService?.dimensions?.css?.cell?.height||13;let u=0,p=0,h=0,m=null,S=!1;const _=b=>{const v=h?(b-h)/16.67:1;if(h=b,!S&&Math.abs(p)>.3){const T=Math.round(p/n());T!==0&&this.terminal.scrollLines(T),p*=.92,m=requestAnimationFrame(_)}else S?m=requestAnimationFrame(_):(m=null,p=0)};let y=0,g=!1,w=0;const I=8;s.addEventListener("touchstart",b=>{b.touches.length===1&&(u=b.touches[0].clientY,w=u,p=0,y=0,S=!0,g=!1,h=0,m&&(cancelAnimationFrame(m),m=null))},{passive:!0}),s.addEventListener("touchmove",b=>{if(b.touches.length===1&&S){const v=b.touches[0].clientY;if(!g&&Math.abs(v-w)>=I&&(g=!0),!g)return;b.preventDefault();const T=u-v;y+=T,p=T*1.2,u=v;const E=n(),C=Math.trunc(y/E);C!==0&&(this._noteTerminalUserScroll(C),this.terminal.scrollLines(C),y-=C*E)}},{passive:!1}),s.addEventListener("touchend",b=>{if(S=!1,!m&&Math.abs(p)>.3&&(m=requestAnimationFrame(_)),!g&&this.terminal){const v=b.changedTouches&&b.changedTouches[0],T=this.terminal.modes?.mouseTrackingMode,E=!!T&&T!=="none";v&&this._suppressTrustedTapMouseEvents(),v&&E&&this._dispatchSyntheticTerminalClick(v.clientX,v.clientY),this._syncMobileHelperTextareaToCursor();const C=document.getElementById("cjkInput");C?.classList.contains("cjk-input-visible")?C.focus():this.terminal.focus()}},{passive:!0}),s.addEventListener("touchcancel",()=>{S=!1,p=0,y=0},{passive:!0})}this.showWelcome(),this.initImageInput(),this._chunkedWriteGen=0,this._bufferLoadSeq=0,this._bufferLoadOwner=null,this._lastUserScrollUpAt=null,this._resizeTimeout=null,this._lastResizeDims=null;const l=40,f=10,d=()=>{this._resizeTimeout&&clearTimeout(this._resizeTimeout),this._resizeTimeout=setTimeout(()=>{this._resizeTimeout=null,this.fitAddon&&this.fitAddon.fit(),this.flickerFilterBuffer&&(this.flickerFilterTimeout&&(clearTimeout(this.flickerFilterTimeout),this.flickerFilterTimeout=null),this.flushFlickerBuffer());const n=typeof KeyboardHandler<"u"&&KeyboardHandler.keyboardVisible;if(this.activeSessionId&&!n){const u=this.fitAddon.proposeDimensions(),p=u?Math.max(u.cols,l):l,h=u?Math.max(u.rows,f):f;if(!this._lastResizeDims||p!==this._lastResizeDims.cols||h!==this._lastResizeDims.rows){const m=this.activeSessionId?this.sessions.get(this.activeSessionId):null;m&&m.mode!=="shell"&&this.terminal&&this.isTerminalAtBottom()&&this.terminal.write("\x1B[3J\x1B[H\x1B[2J"),this._lastResizeDims={cols:p,rows:h};const S=typeof MobileDetection<"u"&&MobileDetection.getDeviceType?MobileDetection.getDeviceType():"desktop";let _=!1;if(this._wsReady&&this._wsSessionId===this.activeSessionId)try{this._ws.send(JSON.stringify({t:"z",c:p,r:h,v:S})),_=!0}catch{}_||fetch(`/api/sessions/${this.activeSessionId}/resize`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cols:p,rows:h,viewportType:S})}).catch(()=>{})}}this.updateConnectionLines(),this._localEchoOverlay?.hasPending&&this._localEchoOverlay.rerender()},300)};window.addEventListener("resize",d),this.terminalResizeObserver&&this.terminalResizeObserver.disconnect(),this.terminalResizeObserver=new ResizeObserver(d),this.terminalResizeObserver.observe(s),this._pendingInput="",this._inputFlushTimeout=null,this._lastKeystrokeTime=0;const c=()=>{if(this._inputFlushTimeout=null,this._pendingInput&&this.activeSessionId){const n=this._pendingInput,u=this.activeSessionId;this._pendingInput="",this._sendInputAsync(u,n)}};this.terminal.onData(n=>{if(!(!/^\x1b\[<\d+;\d+;\d+[Mm]$/.test(n)&&(window.cjkActive||document.activeElement?.id==="cjkInput"))&&this.activeSessionId){if(window.CodemanTerminalInput?.shouldSuppressTerminalQueryResponse(n))return;if(this._lastTerminalData={data:n,time:performance.now()},this._localEchoEnabled){if(n==="\x7F"){if(this._localEchoOverlay?.removeChar()==="flushed"){const{count:m,text:S}=this._localEchoOverlay.getFlushed();this._flushedOffsets?.has(this.activeSessionId)&&(m===0?(this._flushedOffsets.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId)):(this._flushedOffsets.set(this.activeSessionId,m),this._flushedTexts?.set(this.activeSessionId,S))),this._pendingInput+=n,c()}return}if(/^[\r\n]+$/.test(n)){const h=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),h&&(this._pendingInput+=h,c()),setTimeout(()=>{this._pendingInput+="\r",c()},80);return}if(n.length>1&&n.charCodeAt(0)>=32){this._localEchoOverlay?.appendText(n);return}if(n.charCodeAt(0)<32){if(n.length>1&&n.charCodeAt(0)===27){this._pendingInput+=n,c();return}if(this._restoringFlushedState){this._pendingInput+=n,c();return}if(n===" "){const m=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),m&&(this._pendingInput+=m),this._pendingInput+=n,this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null);let S="";try{const y=this._localEchoOverlay?.findPrompt?.();if(y){const g=this.terminal.buffer.active,w=g.getLine(g.viewportY+y.row);w&&(S=w.translateToString(!0).slice(y.col+2).trimEnd())}}catch{}this._tabCompletionBaseText=S,c(),this._tabCompletionSessionId=this.activeSessionId,this._tabCompletionRetries=0,this._tabCompletionFallback&&clearTimeout(this._tabCompletionFallback);const _=this;this._tabCompletionFallback=setTimeout(()=>{if(_._tabCompletionFallback=null,!_._tabCompletionSessionId||_._tabCompletionSessionId!==_.activeSessionId)return;const y=_._localEchoOverlay;!y||y.pendingText||_.terminal.write("",()=>{if(!_._tabCompletionSessionId)return;y.resetBufferDetection();const g=y.detectBufferText();g&&g!==_._tabCompletionBaseText&&(_._tabCompletionSessionId=null,_._tabCompletionRetries=0,_._tabCompletionBaseText=null,y.rerender())})},300);return}const h=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),h&&(this._pendingInput+=h),this._pendingInput+=n,this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),c();return}if(n.length===1&&n.charCodeAt(0)>=32){this._localEchoOverlay?.addChar(n);return}}if(this._pendingInput+=n,n.charCodeAt(0)<32||n.length>1){this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),c();return}const p=performance.now();p-this._lastKeystrokeTime>50?(this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),this._lastKeystrokeTime=p,c()):(this._lastKeystrokeTime=p,this._inputFlushTimeout||(this._inputFlushTimeout=setTimeout(c,0)))}})},registerFilePathLinkProvider(){const e=this;let t=-1;this.terminal.registerLinkProvider({provideLinks(s,i){s!==t&&(t=s,console.debug("[LinkProvider] Checking line:",s));const r=e.terminal.buffer.active.getLine(s-1);if(!r){i(void 0);return}const o=r.translateToString(!0);if(!o||!o.includes("/")){i(void 0);return}const l=[],f=/https?:\/\/[^\s"'<>|;&)\]\x00-\x1f]+/g,d=(m,S)=>{const _=m.replace(/[.,;:!?)]+$/,""),y=o.indexOf(_,S);y!==-1&&(l.some(g=>g.range.start.x===y+1)||l.push({text:_,range:{start:{x:y+1,y:s},end:{x:y+_.length+1,y:s}},decorations:{pointerCursor:!0,underline:!0},activate(g,w){window.open(w,"_blank","noopener,noreferrer")}}))},c=/\b(tail|cat|head|less|grep|watch|vim|nano)\s+(?:[^\s\/]+\s+){0,4}(\/[^\s"'<>|;&\n\x00-\x1f]+)/g,n=/(\/(?:home|tmp|var|etc|opt)[^\s"'<>|;&\n\x00-\x1f]*\.(?:log|txt|json|md|yaml|yml|csv|xml|sh|py|ts|js))\b/g,u=/Bash\([^)]*?(\/(?:home|tmp|var|etc|opt)[^\s"'<>|;&\)\n\x00-\x1f]+)/g,p=(m,S)=>{const _=o.indexOf(m,S);_!==-1&&(l.some(y=>y.range.start.x===_+1)||l.push({text:m,range:{start:{x:_+1,y:s},end:{x:_+m.length+1,y:s}},decorations:{pointerCursor:!0,underline:!0},activate(y,g){e.openLogViewerWindow(g,e.activeSessionId)}}))};let h;for(f.lastIndex=0;(h=f.exec(o))!==null;)d(h[0],h.index);for(c.lastIndex=0;(h=c.exec(o))!==null;)p(h[2],h.index);for(n.lastIndex=0;(h=n.exec(o))!==null;)p(h[1],h.index);for(u.lastIndex=0;(h=u.exec(o))!==null;)p(h[1],h.index);l.length>0&&console.debug("[LinkProvider] Found links:",l.map(m=>m.text)),i(l.length>0?l:void 0)}}),console.log("[LinkProvider] File path link provider registered")},showWelcome(){const e=document.getElementById("welcomeOverlay");e&&(e.classList.add("visible"),this.loadTunnelStatus(),this.loadHistorySessions(),this.initSearchPanel()),this._updateCjkInputState?.()},hideWelcome(){const e=document.getElementById("welcomeOverlay");e&&e.classList.remove("visible");const t=document.getElementById("welcomeQr");t&&(clearTimeout(this._welcomeQrShrinkTimer),t.classList.remove("expanded")),this._updateCjkInputState?.()},async _fetchHistorySessions(){const s=(await(await fetch("/api/history/sessions")).json()).data?.sessions||[];if(s.length===0)return[];const i=new Map;for(const r of s){const o=r.projectKey||r.workingDir;i.has(o)||i.set(o,[]),i.get(o).push(r)}const a=[];for(const[,r]of i)a.push(...r.slice(0,3));return a.sort((r,o)=>new Date(o.lastModified)-new Date(r.lastModified)),a},_resolveCaseLabel(e,t){if(!e)return"";let s=null;for(const i of t||[])if(!(!i||!i.path)){if(e===i.path)return`#${i.name}`;if(e.startsWith(i.path+"/")){const a=i.path.length;(!s||a>s.len)&&(s={name:i.name,suffix:e.slice(a),len:a})}}return s?`#${s.name}${s.suffix}`:e.split("/").pop()||e},_shortenHomePath(e){return(e||"").replace(/^\/home\/[^/]+\//,"~/").replace(/^\/Users\/[^/]+\//,"~/")},_buildHistoryItem(e,t,s){const i=s?.showViewAll!==!1,a=e.sizeBytes<1024?`${e.sizeBytes}B`:e.sizeBytes<1048576?`${(e.sizeBytes/1024).toFixed(0)}K`:`${(e.sizeBytes/1048576).toFixed(1)}M`,r=new Date(e.lastModified),o=r.toLocaleDateString("en",{month:"short",day:"numeric"})+" "+r.toLocaleTimeString("en",{hour:"2-digit",minute:"2-digit",hour12:!1}),l=this._shortenHomePath(e.workingDir),f=this._resolveCaseLabel(e.workingDir,t),d=document.createElement("div");d.className="history-item",d.title=e.workingDir;const c=document.createElement("div");c.className="history-item-main",c.addEventListener("click",()=>this.resumeHistorySession(e.sessionId,e.workingDir));const n=document.createElement("div");n.className="history-item-text";const u=document.createElement("span");u.className="history-item-title",u.textContent=e.firstPrompt||l;const p=document.createElement("span");p.className="history-item-subtitle",f.startsWith("#")&&p.classList.add("is-case"),p.textContent=f,n.append(u,p);const h=document.createElement("span");h.className="history-item-meta",h.textContent=o;const m=document.createElement("button");m.className="history-item-expand",m.type="button",m.setAttribute("aria-label","Show details"),m.setAttribute("aria-expanded","false"),m.textContent="\u22EF",c.append(n,h,m);const S=document.createElement("div");S.className="history-item-detail",S.hidden=!0;const _=document.createElement("div");_.className="history-detail-row";const y=document.createElement("span");y.className="history-detail-label",y.textContent="Prompt";const g=document.createElement("span");g.className="history-detail-value history-detail-prompt",g.textContent=e.firstPrompt||"(no prompt captured)",_.append(y,g);const w=document.createElement("div");w.className="history-detail-row";const I=document.createElement("span");I.className="history-detail-label",I.textContent="Path";const b=document.createElement("span");b.className="history-detail-value history-detail-path",b.textContent=l,w.append(I,b);const v=document.createElement("div");if(v.className="history-detail-row history-detail-meta",v.textContent=`${o} \xB7 ${a} \xB7 ${e.sessionId.slice(0,8)}`,S.append(_,w,v),i&&e.projectKey){const T=document.createElement("div");T.className="history-detail-row history-detail-actions";const E=document.createElement("button");E.type="button",E.className="history-view-all-btn",E.textContent="View all in this folder",E.addEventListener("click",C=>{C.stopPropagation(),this.openFolderHistoryModal(e.projectKey,e.workingDir,t)}),T.appendChild(E),S.appendChild(T)}return m.addEventListener("click",T=>{T.stopPropagation();const E=d.classList.toggle("expanded");S.hidden=!E,m.setAttribute("aria-expanded",E?"true":"false")}),d.append(c,S),d},_HISTORY_INITIAL_COUNT:4,async loadHistorySessions(){const e=document.getElementById("historySessions"),t=document.getElementById("historyList");if(!(!e||!t))try{const s=Array.isArray(this.cases)&&this.cases.length>0?Promise.resolve(this.cases):fetch("/api/cases").then(o=>o.ok?o.json():null).then(o=>o?.data||[]).catch(()=>[]),[i,a]=await Promise.all([this._fetchHistorySessions(30),s]);if(i.length===0){e.style.display="none";return}t.replaceChildren();const r=this._HISTORY_INITIAL_COUNT;for(let o=0;o<Math.min(r,i.length);o++)t.appendChild(this._buildHistoryItem(i[o],a));if(i.length>r){const o=document.createElement("button");o.className="history-show-more",o.textContent=`Show ${i.length-r} more`,o.addEventListener("click",()=>{for(let l=r;l<i.length;l++)t.insertBefore(this._buildHistoryItem(i[l],a),o);o.remove()}),t.appendChild(o)}e.style.display=""}catch(s){console.error("[loadHistorySessions]",s),e.style.display="none"}},_FOLDER_HISTORY_PAGE_SIZE:20,openFolderHistoryModal(e,t,s){this._closeFolderHistoryModal();const i=document.createElement("div");i.className="modal active folder-history-modal",i.id="folderHistoryModal";const a=document.createElement("div");a.className="modal-backdrop",a.addEventListener("click",()=>this._closeFolderHistoryModal());const r=document.createElement("div");r.className="modal-content modal-lg";const o=document.createElement("div");o.className="modal-header";const l=document.createElement("h3");l.textContent="Folder History";const f=document.createElement("div");f.className="folder-history-subtitle",f.textContent=this._shortenHomePath(t);const d=document.createElement("button");d.className="modal-close",d.setAttribute("aria-label","Close"),d.innerHTML="&times;",d.addEventListener("click",()=>this._closeFolderHistoryModal()),o.append(l,d);const c=document.createElement("div");c.className="modal-body";const n=document.createElement("div");n.className="folder-history-list",n.setAttribute("data-loading","true"),n.textContent="Loading...",c.append(f,n),r.append(o,c),i.append(a,r),document.body.appendChild(i),this._folderHistoryState={projectKey:e,workingDir:t,cases:s||[],offset:0,total:null,list:n},this._folderHistoryEscHandler=u=>{u.key==="Escape"&&this._closeFolderHistoryModal()},document.addEventListener("keydown",this._folderHistoryEscHandler),this._loadFolderHistoryPage()},async _loadFolderHistoryPage(){const e=this._folderHistoryState;if(!e)return;const{projectKey:t,cases:s,list:i}=e,a=this._FOLDER_HISTORY_PAGE_SIZE,r=e.offset,o=i.querySelector(".folder-history-more");o&&o.remove(),r===0&&(i.replaceChildren(),i.removeAttribute("data-loading"));try{const l=`/api/history/sessions?projectKey=${encodeURIComponent(t)}&offset=${r}&limit=${a}`,d=await(await fetch(l)).json(),c=d.data?.sessions||[];if(e.total=typeof d.data?.total=="number"?d.data.total:c.length+r,r===0&&c.length===0){const n=document.createElement("div");n.className="folder-history-empty",n.textContent="No conversations found in this folder.",i.appendChild(n);return}for(const n of c)i.appendChild(this._buildHistoryItem(n,s,{showViewAll:!1}));if(e.offset=r+c.length,e.offset<e.total){const n=e.total-e.offset,u=document.createElement("button");u.className="history-show-more folder-history-more",u.textContent=`Show ${Math.min(a,n)} more (${n} remaining)`,u.addEventListener("click",()=>this._loadFolderHistoryPage()),i.appendChild(u)}}catch(l){console.error("[loadFolderHistoryPage]",l);const f=document.createElement("div");f.className="folder-history-empty",f.textContent="Failed to load folder history.",i.appendChild(f)}},_closeFolderHistoryModal(){const e=document.getElementById("folderHistoryModal");e&&e.remove(),this._folderHistoryEscHandler&&(document.removeEventListener("keydown",this._folderHistoryEscHandler),this._folderHistoryEscHandler=null),this._folderHistoryState=null},async resumeHistorySession(e,t){document.getElementById("runModeMenu")?.classList.remove("active"),this._closeFolderHistoryModal();try{this.terminal.clear(),this.terminal.writeln(`\x1B[1;32m Resuming conversation ${e.slice(0,8)}...\x1B[0m`);const s=t.split("/").pop()||"session";let i=1;for(const[,p]of this.sessions){const h=p.name&&p.name.match(/^w(\d+)-/);if(h){const m=parseInt(h[1]);m>=i&&(i=m+1)}}const a=`w${i}-${s}`,o=(this.cases||[]).find(p=>p.path===t)?.name||t.split("/").pop()||"",l=this.loadAppSettingsFromStorage(),f=this.buildEnvOverrides(this.getCaseSettings(o),l),d=this.getEffortSetting(l),n=await(await fetch("/api/sessions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({workingDir:t,name:a,resumeSessionId:e,...Object.keys(f).length>0?{envOverrides:f}:{},...d?{effort:d}:{}})})).json();if(!n.success)throw new Error(n.error);const u=n.data.session.id;await fetch(`/api/sessions/${u}/interactive`,{method:"POST"}),this.terminal.writeln(`\x1B[90m Session ${a} ready\x1B[0m`),await this.selectSession(u),this.terminal.focus()}catch(s){this.terminal.writeln(`\x1B[1;31m Error: ${s.message}\x1B[0m`)}},isTerminalAtBottom(){if(!this.terminal)return!0;const e=this.terminal.buffer.active;return e.viewportY>=e.baseY-2},_noteTerminalUserScroll(e){e<0?this._lastUserScrollUpAt=performance.now():this.isTerminalAtBottom()&&(this._lastUserScrollUpAt=null)},_hasRecentUserScrollUp(){return typeof this._lastUserScrollUpAt!="number"?!1:performance.now()-this._lastUserScrollUpAt<window.CodemanTerminalInput.USER_SCROLL_STICKY_SUPPRESS_MS},batchTerminalWrite(e){if(this._isLoadingBuffer){this._loadBufferQueue&&this._loadBufferQueue.push(e);return}if(this.writeFrameScheduled||(this._wasAtBottomBeforeWrite=this.isTerminalAtBottom()),(this.activeSessionId?this.sessions.get(this.activeSessionId):null)?.flickerFilterEnabled??!1){if(e.includes("\x1B[2J")||e.includes("\x1B[H\x1B[J")||e.includes("\x1B[H")&&e.includes("\x1B[?25l")){this.flickerFilterActive=!0,this.flickerFilterBuffer+=e,this.flickerFilterTimeout&&clearTimeout(this.flickerFilterTimeout),this.flickerFilterTimeout=setTimeout(()=>{this.flickerFilterTimeout=null,this.flushFlickerBuffer()},SYNC_WAIT_TIMEOUT_MS);return}if(this.flickerFilterActive){this.flickerFilterBuffer+=e;return}}this.pendingWrites.push(e),this.writeFrameScheduled||(this.writeFrameScheduled=!0,this._safeYield(()=>{this.flushPendingWrites(),this.writeFrameScheduled=!1}))},flushFlickerBuffer(){this.flickerFilterBuffer&&(this.pendingWrites.push(this.flickerFilterBuffer),this.flickerFilterBuffer="",this.flickerFilterActive=!1,this.writeFrameScheduled||(this.writeFrameScheduled=!0,this._safeYield(()=>{this.flushPendingWrites(),this.writeFrameScheduled=!1})))},_updateLocalEchoState(){const e=this.loadAppSettingsFromStorage(),t=this.activeSessionId?this.sessions.get(this.activeSessionId):null,i=!!((e.localEchoEnabled??MobileDetection.isTouchDevice())&&t);this._localEchoEnabled&&!i&&this._localEchoOverlay?.clear(),this._localEchoEnabled=i,this._localEchoOverlay&&t&&(t.mode==="opencode"?this._localEchoOverlay.setPrompt({type:"custom",offset:3,find:a=>{try{const r=a.buffer.active,o=r.cursorY,l=r.getLine(r.viewportY+o);if(!l)return null;const d=l.translateToString(!0).indexOf("\u2503");return d>=0?{row:o,col:d}:null}catch{return null}}}):t.mode==="shell"?(this._localEchoOverlay.clear(),this._localEchoEnabled=!1):this._localEchoOverlay.setPrompt({type:"custom",offset:0,find:a=>{try{const r=a.buffer.active;for(let o=a.rows-1;o>=0;o--){const l=r.getLine(r.viewportY+o);if(!l)continue;const d=l.translateToString(!0).lastIndexOf("\u276F");if(d>=0)return{row:o,col:d+2}}return{row:Math.max(0,Math.min(a.rows-1,r.cursorY)),col:Math.max(0,Math.min(a.cols-1,r.cursorX))}}catch{return null}}}))},_handleCjkInput(e){this.activeSessionId&&this._sendInputAsync(this.activeSessionId,e)},flushPendingWrites(){if(this.pendingWrites.length===0||!this.terminal)return;const e=performance.now(),t=this.pendingWrites.join("");this.pendingWrites=[];const s=t.length;s>16384&&_crashDiag.log(`FLUSH: ${(s/1024).toFixed(0)}KB`);const a=(this.activeSessionId&&this.sessions?this.sessions.get(this.activeSessionId):null)?.mode==="codex"?32768:65536;let r=!1;const o=this._hasRecentUserScrollUp()&&this.terminal.buffer?.active?this.terminal.buffer.active.viewportY:null;s<=a?this.terminal.write(t):(this.terminal.write(t.slice(0,a)),this.pendingWrites.push(t.slice(a)),r=!0,this.writeFrameScheduled||(this.writeFrameScheduled=!0,this._safeYield(()=>{this.flushPendingWrites(),this.writeFrameScheduled=!1}))),o!==null&&this.terminal.buffer?.active?.viewportY!==o&&typeof this.terminal.scrollToLine=="function"&&this.terminal.scrollToLine(o);const l=r?a:s,f=performance.now()-e;if((f>100||r)&&console.warn(`[CRASH-DIAG] flushPendingWrites: ${f.toFixed(0)}ms, ${(l/1024).toFixed(0)}KB written${r?", rest deferred":""} (total ${(s/1024).toFixed(0)}KB)`),this._wasAtBottomBeforeWrite&&!this._hasRecentUserScrollUp()&&this.terminal.scrollToBottom(),this._localEchoOverlay?.hasPending&&this._localEchoOverlay.rerender(),this._tabCompletionSessionId&&this._tabCompletionSessionId===this.activeSessionId&&this._localEchoOverlay&&!this._localEchoOverlay.pendingText){const d=this._localEchoOverlay,c=this;this.terminal.write("",()=>{if(!c._tabCompletionSessionId)return;d.resetBufferDetection();const n=d.detectBufferText();n?n===c._tabCompletionBaseText?(d.undoDetection(),c._tabCompletionRetries=(c._tabCompletionRetries||0)+1,c._tabCompletionRetries>60&&(c._tabCompletionSessionId=null,c._tabCompletionRetries=0)):(c._tabCompletionSessionId=null,c._tabCompletionRetries=0,c._tabCompletionBaseText=null,c._tabCompletionFallback&&(clearTimeout(c._tabCompletionFallback),c._tabCompletionFallback=null),d.rerender()):(c._tabCompletionRetries=(c._tabCompletionRetries||0)+1,c._tabCompletionRetries>60&&(c._tabCompletionSessionId=null,c._tabCompletionRetries=0))})}},_safeYield(e){let t=!1;const s=()=>{t||(t=!0,e())};requestAnimationFrame(s),setTimeout(s,50),this._workerYield(s)},_workerYield(e){try{if(this._yieldWorker===void 0){const t="onmessage=()=>setTimeout(()=>postMessage(0),0);",s=new Blob([t],{type:"application/javascript"}),i=URL.createObjectURL(s);this._yieldWorker=new Worker(i),URL.revokeObjectURL(i),this._yieldQueue=[],this._yieldWorker.onmessage=()=>{const a=this._yieldQueue.shift();a&&a()}}if(!this._yieldWorker)return;this._yieldQueue.push(e),this._yieldWorker.postMessage(0)}catch{this._yieldWorker=null}},scrollToLastNonEmptyLine(){if(!this.terminal?.buffer?.active){this.terminal?.scrollToBottom?.();return}const e=this.terminal.buffer.active,t=e.baseY+e.length;let s=-1;for(let i=t-1;i>=0;i--)if(e.getLine(i)?.translateToString(!0).trim()){s=i;break}if(s>=0&&typeof this.terminal.scrollToLine=="function"){let i=Math.max(0,s-this.terminal.rows+2);const a=Math.max(0,s);for(;i<a&&!e.getLine(i)?.translateToString(!0).trim();)i++;this.terminal.scrollToLine(i)}else this.terminal.scrollToBottom()},chunkedTerminalWrite(e,t=TERMINAL_CHUNK_SIZE,s){const i=++this._chunkedWriteGen,a=this._beginBufferLoad(s);return new Promise(r=>{if(!e||e.length===0){this._finishBufferLoad(a),r();return}const o=e.replace(DEC_SYNC_STRIP_RE,""),l=()=>{this._chunkedWriteGen===i&&this._finishBufferLoad(a),r()};if(o.length<=t){this.terminal.write(o,l);return}let f=0;const d=performance.now();let c=0;const n=()=>{if(this._chunkedWriteGen!==i){r();return}if(f>=o.length){const m=performance.now()-d;console.log(`[CRASH-DIAG] chunkedTerminalWrite complete: ${o.length} bytes in ${c} chunks, ${m.toFixed(0)}ms total`),this._safeYield(l);return}const u=performance.now(),p=o.slice(f,f+t);this.terminal.write(p);const h=performance.now()-u;c++,h>50&&console.warn(`[CRASH-DIAG] chunk #${c} write took ${h.toFixed(0)}ms (${p.length} bytes at offset ${f})`),f+=t,this._safeYield(n)};this._safeYield(n)})},_beginBufferLoad(e){this._bufferLoadSeq===void 0&&(this._bufferLoadSeq=0);const t=e===void 0?`buffer-${++this._bufferLoadSeq}`:e;return this._bufferLoadOwner=t,this._isLoadingBuffer=!0,this._loadBufferQueue=[],t},_finishBufferLoad(e){return e!==void 0&&this._bufferLoadOwner!==e?!1:(this._isLoadingBuffer=!1,this._loadBufferQueue=null,this._bufferLoadOwner=null,!0)},clearTerminal(){this.terminal.clear()},async restoreTerminalSize(){if(!this.activeSessionId){this.showToast("No active session","warning");return}const e=this.getTerminalDimensions();if(!e){this.showToast("Could not determine terminal size","error");return}try{await this.sendResize(this.activeSessionId,{force:!0}),this.showToast(`Terminal restored to ${e.cols}x${e.rows}`,"success")}catch(t){console.error("Failed to restore terminal size:",t),this.showToast("Failed to restore terminal size","error")}},sendPendingCtrlL(e){},async copyTerminal(){try{const e=this.terminal.buffer.active;let t="";for(let s=0;s<e.length;s++){const i=e.getLine(s);i&&(t+=i.translateToString(!0)+`
2
+ `)}await navigator.clipboard.writeText(t.replace(/\n+$/,`
3
+ `)),this.showToast("Copied to clipboard","success")}catch{this.showToast("Failed to copy","error")}},_syncMobileHelperTextareaToCursor(){if(!(!MobileDetection.isTouchDevice()||!this.terminal?.element))try{const e=this.terminal.element,t=this.terminal.element.querySelector(".xterm-cursor"),s=this.terminal.element.querySelector(".xterm-screen");if(!(e instanceof HTMLElement)||!(t instanceof HTMLElement)||!(s instanceof HTMLElement))return;const i=t.getBoundingClientRect(),a=s.getBoundingClientRect();if(!i.width&&!i.height)return;const r=Math.max(0,Math.round(i.left-a.left)),o=Math.max(0,Math.round(i.top-a.top));e.style.setProperty("--xterm-helper-left",`${r}px`),e.style.setProperty("--xterm-helper-top",`${o}px`)}catch{}},_dispatchSyntheticTerminalClick(e,t){const s=this.terminal?.element;if(!s||!Number.isFinite(e)||!Number.isFinite(t))return;const i={bubbles:!0,cancelable:!0,view:window,clientX:e,clientY:t,screenX:e,screenY:t,button:0,detail:1};try{s.dispatchEvent(new MouseEvent("mousedown",{...i,buttons:1})),s.dispatchEvent(new MouseEvent("mouseup",{...i,buttons:0}))}catch{}},_installMobileTapMouseGuard(){const e=this.terminal?.element;if(!e||e._codemanTapMouseGuardInstalled||typeof MobileDetection<"u"&&MobileDetection.isTouchDevice&&!MobileDetection.isTouchDevice())return;e._codemanTapMouseGuardInstalled=!0;const t=s=>{const i=this._trustedTapMouseSuppressUntil||0;!s.isTrusted||performance.now()>i||(s.preventDefault(),s.stopImmediatePropagation())};e.addEventListener("mousedown",t,!0),e.addEventListener("mouseup",t,!0)},_suppressTrustedTapMouseEvents(){const e=window.CodemanTerminalInput?.TOUCH_COMPAT_MOUSE_SUPPRESS_MS||450;this._trustedTapMouseSuppressUntil=performance.now()+e},increaseFontSize(){const e=this.terminal.options.fontSize||14;this.setFontSize(Math.min(e+2,24))},decreaseFontSize(){const e=this.terminal.options.fontSize||14;this.setFontSize(Math.max(e-2,10))},setFontSize(e){this.terminal.options.fontSize=e,document.getElementById("fontSizeDisplay").textContent=e,this.fitAddon.fit(),localStorage.setItem("codeman-font-size",e),this._localEchoOverlay?.refreshFont()},loadFontSize(){const e=localStorage.getItem("codeman-font-size");if(e){const t=parseInt(e,10);t>=10&&t<=24&&(this.terminal.options.fontSize=t,document.getElementById("fontSizeDisplay").textContent=t)}},getTerminalDimensions(){const s=this.fitAddon?.proposeDimensions();return s?{cols:Math.max(s.cols,40),rows:Math.max(s.rows,10)}:null},async sendResize(e,t={}){this.fitAddon&&this.fitAddon.fit();const s=this.getTerminalDimensions();if(!s)return!1;const i=this._lastResizeDims,a=!i||i.cols!==s.cols||i.rows!==s.rows;this._lastResizeDims={cols:s.cols,rows:s.rows};const r=typeof MobileDetection<"u"&&MobileDetection.getDeviceType?MobileDetection.getDeviceType():window.innerWidth<430?"mobile":window.innerWidth<768?"tablet":"desktop";if(!t.forceHttp&&this._wsReady&&this._wsSessionId===e)try{const l={t:"z",c:s.cols,r:s.rows,v:r};return t.force&&(l.f=!0),this._ws.send(JSON.stringify(l)),a}catch{}const o={...s,viewportType:r};return t.force&&(o.force=!0),await fetch(`/api/sessions/${e}/resize`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}),a},async sendInput(e){!this.activeSessionId||!e||this._sendInputAsync(this.activeSessionId,e,{useMux:!0})},toggleDirInput(){const e=document.querySelector("#dirDisplay").parentElement,t=document.getElementById("dirInput");t.classList.contains("hidden")&&(t.classList.remove("hidden"),e.style.display="none",t.focus())},hideDirInput(){const e=document.querySelector("#dirDisplay").parentElement,t=document.getElementById("dirInput");setTimeout(()=>{t.classList.add("hidden"),e.style.display="";const s=t.value.trim();document.getElementById("dirDisplay").textContent=s||"No directory"},100)},applyTerminalSkin(e){const t={...window.CODEMAN_XTERM_THEMES[e]||window.CODEMAN_XTERM_THEMES["daylight-blue"]};if(this.terminal){this.terminal.options.theme=t;try{this.terminal.refresh(0,this.terminal.rows-1)}catch{}}if(this.teammateTerminals){for(const[,s]of this.teammateTerminals)if(s&&s.terminal){s.terminal.options.theme={...t};try{s.terminal.refresh(0,s.terminal.rows-1)}catch{}}}}}),(function(e){const i={session:"Sessions",event:"Events",file:"Files"};function a(r){if(!Number.isFinite(r))return"";const o=new Date(r);return o.toLocaleDateString("en",{month:"short",day:"numeric"})+" "+o.toLocaleTimeString("en",{hour:"2-digit",minute:"2-digit",hour12:!1})}e.CodemanSearch={SEARCH_DEBOUNCE_MS:250,SEARCH_LIMIT:60,SOURCE_LABELS:i,formatSearchTime:a}})(window),Object.assign(CodemanApp.prototype,{initSearchPanel(){const e=document.getElementById("searchInput");if(!e||this._searchPanelWired){this._searchPanelWired&&this._populateSearchCaseFilter();return}this._searchPanelWired=!0,this._searchTypes=new Set(["session","event","file"]),this._searchSecondary={caseLabel:"",status:"",days:""},this._searchDebounceTimer=null,this._searchSeq=0,this._searchLastData=null;const t=document.getElementById("searchClearBtn"),s=document.getElementById("searchResults");e.addEventListener("input",()=>{t&&(t.hidden=e.value.length===0),this._scheduleSearch()}),e.addEventListener("keydown",o=>{o.key==="Escape"&&e.value&&(o.stopPropagation(),this._clearSearch())}),t&&t.addEventListener("click",()=>this._clearSearch()),document.querySelectorAll("#searchFilters .search-filter-chip").forEach(o=>{o.addEventListener("click",()=>{const l=o.dataset.typeFilter;this._searchTypes.has(l)&&this._searchTypes.size===1||(this._searchTypes.has(l)?(this._searchTypes.delete(l),o.classList.remove("active")):(this._searchTypes.add(l),o.classList.add("active")),this._runSearch())})});const i=document.getElementById("searchCaseFilter"),a=document.getElementById("searchStatusFilter"),r=document.getElementById("searchDateFilter");i&&i.addEventListener("change",()=>{this._searchSecondary.caseLabel=i.value,this._renderSearch(this._searchLastData)}),a&&a.addEventListener("change",()=>{this._searchSecondary.status=a.value,this._renderSearch(this._searchLastData)}),r&&r.addEventListener("change",()=>{this._searchSecondary.days=r.value,this._renderSearch(this._searchLastData)}),this._populateSearchCaseFilter(),s&&(s.hidden=!0)},_populateSearchCaseFilter(){const e=document.getElementById("searchCaseFilter");if(!e)return;const t=Array.isArray(this.cases)?this.cases:[],s=Array.from(new Set(t.map(r=>r&&r.name).filter(Boolean))).sort(),i=e.value;e.innerHTML="";const a=document.createElement("option");a.value="",a.textContent="All cases",e.appendChild(a);for(const r of s){const o=document.createElement("option");o.value=r,o.textContent="#"+r,e.appendChild(o)}i&&s.includes(i)&&(e.value=i)},_scheduleSearch(){clearTimeout(this._searchDebounceTimer),this._searchDebounceTimer=setTimeout(()=>this._runSearch(),window.CodemanSearch.SEARCH_DEBOUNCE_MS)},_clearSearch(){const e=document.getElementById("searchInput"),t=document.getElementById("searchClearBtn");e&&(e.value=""),t&&(t.hidden=!0),this._searchLastData=null,this._renderSearch(null)},async _runSearch(){const e=document.getElementById("searchInput");if(!e)return;const t=e.value.trim();if(t.length===0){this._searchLastData=null,this._renderSearch(null);return}const s=Array.from(this._searchTypes),i=new URLSearchParams;i.set("q",t.slice(0,200)),s.length>0&&s.length<3&&i.set("types",s.join(",")),i.set("limit",String(window.CodemanSearch.SEARCH_LIMIT));const a=++this._searchSeq,r=await this._apiJson("/api/search?"+i.toString());a===this._searchSeq&&(r?this._searchLastData=r:this._searchLastData={query:t,groups:[],totalResults:0,truncated:!1,_error:!0},this._renderSearch(this._searchLastData))},_applySecondaryFilters(e){const{caseLabel:t,status:s,days:i}=this._searchSecondary;let a=e;if(t){const r="#"+t;a=a.filter(o=>(o.sessionName||"").includes(r)||o.sessionName===t)}if(s){const r=new Set((this.sessionOrder||[]).concat(Object.keys(this.sessions||{})));a=a.filter(o=>{const l=r.has(o.sessionId);return s==="active"?l:!l})}if(i){const r=Date.now()-Number(i)*24*60*60*1e3;a=a.filter(o=>Number.isFinite(o.timestamp)&&o.timestamp>=r)}return a},_renderSearch(e){const t=document.getElementById("searchResults"),s=document.getElementById("historyTitle"),i=document.getElementById("historyList");if(!t)return;const a=!!e;if(s&&(s.style.display=a?"none":""),i&&(i.style.display=a?"none":""),t.innerHTML="",!e){t.hidden=!0;return}if(t.hidden=!1,e._error){const l=document.createElement("div");l.className="search-empty",l.textContent="Search unavailable \u2014 check the query and try again.",t.appendChild(l);return}const r=(e.groups||[]).map(l=>({type:l.type,results:this._applySecondaryFilters(l.results||[])})).filter(l=>l.results.length>0);if(r.reduce((l,f)=>l+f.results.length,0)===0){const l=document.createElement("div");l.className="search-empty",l.textContent='No results for "'+(e.query||"")+'"',t.appendChild(l);return}for(const l of r){const f=document.createElement("div");f.className="search-group-header";const d=document.createElement("span");d.className="search-group-label",d.textContent=window.CodemanSearch.SOURCE_LABELS[l.type]||l.type;const c=document.createElement("span");c.className="search-group-count",c.textContent=String(l.results.length),f.append(d,c),t.appendChild(f);for(const n of l.results)t.appendChild(this._buildSearchResultCard(n))}if(e.truncated){const l=document.createElement("div");l.className="search-truncated",l.textContent="Showing the top matches \u2014 refine your search to narrow results.",t.appendChild(l)}},_buildSearchResultCard(e){const t=document.createElement("div");t.className="search-result-card",t.dataset.type=e.type,t.tabIndex=0,t.setAttribute("role","button");const s=document.createElement("div");s.className="search-result-top";const i=document.createElement("span");i.className="search-result-badge search-badge-"+e.type,i.textContent=(window.CodemanSearch.SOURCE_LABELS[e.type]||e.type).replace(/s$/,"");const a=document.createElement("span");a.className="search-result-name",a.textContent=e.sessionName||e.sessionId||"(session)";const r=document.createElement("span");r.className="search-result-time",r.textContent=window.CodemanSearch.formatSearchTime(e.timestamp),s.append(i,a,r);const o=document.createElement("div");o.className="search-result-snippet",o.textContent=e.snippet||"",t.append(s,o);const l=()=>this._jumpToSearchResult(e);return t.addEventListener("click",l),t.addEventListener("keydown",f=>{(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),l())}),t},_jumpToSearchResult(e){const t=e&&e.jumpTo;if(t){typeof this.hideWelcome=="function"&&this.hideWelcome();try{t.kind==="run-summary"?this.openRunSummary(t.sessionId):t.kind==="file-preview"?this.openFilePreview(t.relativePath||"",t.sessionId,t.targetId||null):this.selectSession(t.sessionId)}catch(s){console.error("[search] jump failed",s)}}}});
Binary file
Binary file
@@ -16,5 +16,6 @@ export { registerRalphRoutes } from './ralph-routes.js';
16
16
  export { registerPlanRoutes } from './plan-routes.js';
17
17
  export { registerOrchestratorRoutes } from './orchestrator-routes.js';
18
18
  export { registerClipboardRoutes } from './clipboard-routes.js';
19
+ export { registerSearchRoutes } from './search-routes.js';
19
20
  export { registerWsRoutes } from './ws-routes.js';
20
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -16,5 +16,6 @@ export { registerRalphRoutes } from './ralph-routes.js';
16
16
  export { registerPlanRoutes } from './plan-routes.js';
17
17
  export { registerOrchestratorRoutes } from './orchestrator-routes.js';
18
18
  export { registerClipboardRoutes } from './clipboard-routes.js';
19
+ export { registerSearchRoutes } from './search-routes.js';
19
20
  export { registerWsRoutes } from './ws-routes.js';
20
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ralph-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/ralph-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAc1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGpG,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAClE,IAAI,CAsdN"}
1
+ {"version":3,"file":"ralph-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/ralph-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAc1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGpG,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAClE,IAAI,CA6dN"}
@@ -24,7 +24,7 @@ export function registerRalphRoutes(app, ctx) {
24
24
  // Configure Ralph tracker for a session
25
25
  app.post('/api/sessions/:id/ralph-config', async (req) => {
26
26
  const { id } = req.params;
27
- const { enabled, completionPhrase, maxIterations, reset, disableAutoEnable } = parseBody(RalphConfigSchema, req.body, 'Invalid request body');
27
+ const { enabled, completionPhrase, maxIterations, maxTodos, todoExpirationMinutes, reset, disableAutoEnable } = parseBody(RalphConfigSchema, req.body, 'Invalid request body');
28
28
  const session = findSessionOrFail(ctx, id);
29
29
  // Ralph tracker is not supported for external-CLI sessions (opencode/codex)
30
30
  if (isExternalCliMode(session.mode)) {
@@ -73,6 +73,12 @@ export function registerRalphRoutes(app, ctx) {
73
73
  if (maxIterations !== undefined) {
74
74
  session.ralphTracker.setMaxIterations(maxIterations || null);
75
75
  }
76
+ if (maxTodos !== undefined) {
77
+ session.ralphTracker.setMaxTodos(maxTodos);
78
+ }
79
+ if (todoExpirationMinutes !== undefined) {
80
+ session.ralphTracker.setTodoExpirationMinutes(todoExpirationMinutes);
81
+ }
76
82
  // Persist and broadcast the update
77
83
  ctx.persistSessionState(session);
78
84
  ctx.broadcast(SseEvent.SessionRalphLoopUpdate, {
@@ -1 +1 @@
1
- {"version":3,"file":"ralph-routes.js","sourceRoot":"","sources":["../../../src/web/routes/ralph-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ralph-routes.js","sourceRoot":"","sources":["../../../src/web/routes/ralph-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @fileoverview Cross-session federated search route (COD-9).
3
+ *
4
+ * Registers `GET /api/search?q=&types=&limit=` — a bounded, in-memory search
5
+ * across three v1 sources, returned in the standard ApiResponse envelope:
6
+ * 1. sessions/cases — name, working directory, session id
7
+ * 2. run-summary events — event title/details (from the live run-summary trackers)
8
+ * 3. file paths — per-session attachment history (workspace-relative paths only)
9
+ *
10
+ * This route is a THIN wrapper: it harvests the source arrays from the live
11
+ * server stores (held on the route context) in a bounded way, then delegates
12
+ * grouping/ranking/capping to the pure `searchSources()` core in
13
+ * `src/search-service.ts`. Terminal-buffer scanning and any persisted index are
14
+ * out of scope for v1.
15
+ *
16
+ * Safety: query input is Zod-validated (length-bounded `q`, allowlisted `types`,
17
+ * numeric `limit`); only workspace-relative file paths are ever exposed (the
18
+ * server-private `externalPath` on attachment history is never read here); and
19
+ * the pure core enforces a per-group and total result cap so a broad query
20
+ * cannot return an unbounded payload. No terminal output is read.
21
+ *
22
+ * Endpoints: GET /api/search
23
+ */
24
+ import { FastifyInstance } from 'fastify';
25
+ import type { SessionPort, InfraPort } from '../ports/index.js';
26
+ export declare function registerSearchRoutes(app: FastifyInstance, ctx: SessionPort & InfraPort): void;
27
+ //# sourceMappingURL=search-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/search-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAW1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAmFhE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CA2C7F"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @fileoverview Cross-session federated search route (COD-9).
3
+ *
4
+ * Registers `GET /api/search?q=&types=&limit=` — a bounded, in-memory search
5
+ * across three v1 sources, returned in the standard ApiResponse envelope:
6
+ * 1. sessions/cases — name, working directory, session id
7
+ * 2. run-summary events — event title/details (from the live run-summary trackers)
8
+ * 3. file paths — per-session attachment history (workspace-relative paths only)
9
+ *
10
+ * This route is a THIN wrapper: it harvests the source arrays from the live
11
+ * server stores (held on the route context) in a bounded way, then delegates
12
+ * grouping/ranking/capping to the pure `searchSources()` core in
13
+ * `src/search-service.ts`. Terminal-buffer scanning and any persisted index are
14
+ * out of scope for v1.
15
+ *
16
+ * Safety: query input is Zod-validated (length-bounded `q`, allowlisted `types`,
17
+ * numeric `limit`); only workspace-relative file paths are ever exposed (the
18
+ * server-private `externalPath` on attachment history is never read here); and
19
+ * the pure core enforces a per-group and total result cap so a broad query
20
+ * cannot return an unbounded payload. No terminal output is read.
21
+ *
22
+ * Endpoints: GET /api/search
23
+ */
24
+ import { parseBody } from '../route-helpers.js';
25
+ import { SearchQuerySchema } from '../schemas.js';
26
+ import { searchSources, } from '../../search-service.js';
27
+ /**
28
+ * Per-source harvest caps. These bound how much in-memory data we hand to the
29
+ * pure core BEFORE it applies its own result caps — they keep the harvest itself
30
+ * cheap on large deployments (e.g. 50 sessions × many events). They are
31
+ * deliberately well above the result caps so ranking still sees enough candidates.
32
+ */
33
+ const MAX_EVENTS_PER_SESSION = 500;
34
+ /**
35
+ * Harvest the three source arrays from the live in-memory stores. Reads only
36
+ * bounded, already-loaded data — no disk I/O, no terminal buffers.
37
+ */
38
+ function harvestSources(ctx) {
39
+ const sessions = [];
40
+ const events = [];
41
+ const files = [];
42
+ for (const raw of ctx.sessions.values()) {
43
+ const s = raw;
44
+ const sessionName = s.name ?? '';
45
+ const timestamp = s.lastActivityAt ?? s.createdAt ?? 0;
46
+ sessions.push({
47
+ sessionId: s.id,
48
+ sessionName,
49
+ workingDir: s.workingDir ?? '',
50
+ timestamp,
51
+ });
52
+ // Files: per-session attachment history. Only the workspace-relative path is
53
+ // surfaced; the server-private externalPath is intentionally never read.
54
+ const history = s.attachmentHistory ?? [];
55
+ for (const item of history) {
56
+ files.push({
57
+ sessionId: s.id,
58
+ sessionName,
59
+ fileName: item.fileName,
60
+ relativePath: item.relativePath,
61
+ timestamp: item.timestamp ?? item.mtimeMs ?? timestamp,
62
+ itemId: item.id,
63
+ });
64
+ }
65
+ }
66
+ // Events: from the live run-summary trackers, keyed by session id.
67
+ for (const [sessionId, tracker] of ctx.runSummaryTrackers) {
68
+ const session = ctx.sessions.get(sessionId);
69
+ const sessionName = session?.name ?? '';
70
+ const summary = tracker.getSummary();
71
+ // Newest events are most relevant; cap the per-session harvest.
72
+ const evts = summary.events.slice(-MAX_EVENTS_PER_SESSION);
73
+ for (const e of evts) {
74
+ events.push({
75
+ sessionId,
76
+ sessionName,
77
+ eventId: e.id,
78
+ title: e.title,
79
+ details: e.details ?? '',
80
+ timestamp: e.timestamp,
81
+ });
82
+ }
83
+ }
84
+ return { sessions, events, files };
85
+ }
86
+ export function registerSearchRoutes(app, ctx) {
87
+ app.get('/api/search', async (req) => {
88
+ // Zod-validate the query. parseBody throws a structured 400 on failure.
89
+ const { q, types, limit } = parseBody(SearchQuerySchema, req.query);
90
+ const allowed = types
91
+ ? new Set(types
92
+ .split(',')
93
+ .map((t) => t.trim())
94
+ .filter(Boolean))
95
+ : null;
96
+ const sources = harvestSources(ctx);
97
+ // Apply the optional source-type filter before searching so excluded
98
+ // sources never contribute to (or consume budget in) the result set.
99
+ const filtered = {
100
+ sessions: !allowed || allowed.has('session') ? sources.sessions : [],
101
+ events: !allowed || allowed.has('event') ? sources.events : [],
102
+ files: !allowed || allowed.has('file') ? sources.files : [],
103
+ };
104
+ const result = searchSources(q, filtered);
105
+ // Optional caller-supplied total cap (always on top of the core's hard caps).
106
+ if (limit !== undefined && result.totalResults > limit) {
107
+ let remaining = limit;
108
+ const cappedGroups = [];
109
+ for (const group of result.groups) {
110
+ if (remaining <= 0)
111
+ break;
112
+ const slice = group.results.slice(0, remaining);
113
+ remaining -= slice.length;
114
+ cappedGroups.push({ type: group.type, results: slice });
115
+ }
116
+ result.groups = cappedGroups;
117
+ result.totalResults = limit;
118
+ result.truncated = true;
119
+ }
120
+ return { success: true, data: result };
121
+ });
122
+ }
123
+ //# sourceMappingURL=search-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-routes.js","sourceRoot":"","sources":["../../../src/web/routes/search-routes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/session-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAmD1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA4CjG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0C1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CA0BvE;AAWD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAiBhF;AAGD,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAC/D,IAAI,CA0nDN"}
1
+ {"version":3,"file":"session-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/session-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAmD1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA4CjG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0C1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CA0BvE;AAWD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAiBhF;AAGD,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAC/D,IAAI,CAiqDN"}
@@ -226,11 +226,13 @@ export function registerSessionRoutes(app, ctx) {
226
226
  //
227
227
  // For keys the caller is actively setting, strip any stale disk entry a prior
228
228
  // Codeman version may have written. Scope limited to:
229
- // - Claude mode (OpenCode doesn't read .claude/settings.local.json)
229
+ // - Claude mode (OpenCode/Codex/Gemini don't read .claude/settings.local.json)
230
230
  // - workingDir inside CASES_DIR (Codeman's managed territory — we never mutate
231
231
  // .claude/settings.local.json in arbitrary user repos that POST /api/sessions
232
232
  // can target, because those may have hand-authored values).
233
233
  const canStripDisk = body.mode !== 'opencode' &&
234
+ body.mode !== 'codex' &&
235
+ body.mode !== 'gemini' &&
234
236
  body.envOverrides &&
235
237
  Object.keys(body.envOverrides).length > 0 &&
236
238
  workingDir.startsWith(CASES_DIR + '/');
@@ -275,6 +277,13 @@ export function registerSessionRoutes(app, ctx) {
275
277
  return createErrorResponse(ApiErrorCode.OPERATION_FAILED, 'Codex CLI not found. Install with: npm install -g @openai/codex');
276
278
  }
277
279
  }
280
+ // Check Gemini availability if requested
281
+ if (body.mode === 'gemini') {
282
+ const { isGeminiAvailable } = await import('../../utils/gemini-cli-resolver.js');
283
+ if (!isGeminiAvailable()) {
284
+ return createErrorResponse(ApiErrorCode.OPERATION_FAILED, 'Gemini CLI not found. Install with: npm install -g @google/gemini-cli');
285
+ }
286
+ }
278
287
  // Pre-validate resumeSessionId: check that the conversation file actually exists
279
288
  // in Claude's projects directory. If not, skip resume to avoid confusing
280
289
  // "No conversation found" errors from Claude CLI.
@@ -313,9 +322,11 @@ export function registerSessionRoutes(app, ctx) {
313
322
  ? body.openCodeConfig?.model
314
323
  : mode === 'codex'
315
324
  ? body.codexConfig?.model
316
- : mode !== 'shell'
317
- ? modelConfig?.defaultModel || undefined
318
- : undefined;
325
+ : mode === 'gemini'
326
+ ? body.geminiConfig?.model
327
+ : mode !== 'shell'
328
+ ? modelConfig?.defaultModel || undefined
329
+ : undefined;
319
330
  const claudeModeConfig = await ctx.getClaudeModeConfig();
320
331
  const session = new Session({
321
332
  workingDir,
@@ -329,6 +340,7 @@ export function registerSessionRoutes(app, ctx) {
329
340
  allowedTools: claudeModeConfig.allowedTools,
330
341
  openCodeConfig: mode === 'opencode' ? body.openCodeConfig : undefined,
331
342
  codexConfig: mode === 'codex' ? body.codexConfig : undefined,
343
+ geminiConfig: mode === 'gemini' ? body.geminiConfig : undefined,
332
344
  resumeSessionId: validatedResumeId,
333
345
  envOverrides: body.envOverrides,
334
346
  effort: body.effort,
@@ -482,8 +494,10 @@ export function registerSessionRoutes(app, ctx) {
482
494
  }
483
495
  try {
484
496
  // Auto-detect completion phrase from CLAUDE.md BEFORE starting (only if globally enabled and not explicitly disabled by user)
485
- // Ralph tracker is not supported for opencode sessions
497
+ // Ralph tracker is not supported for opencode / codex / gemini sessions
486
498
  if (session.mode !== 'opencode' &&
499
+ session.mode !== 'codex' &&
500
+ session.mode !== 'gemini' &&
487
501
  ctx.store.getConfig().ralphEnabled &&
488
502
  !session.ralphTracker.autoEnableDisabled) {
489
503
  autoConfigureRalph(session, session.workingDir, ctx);
@@ -1038,7 +1052,7 @@ export function registerSessionRoutes(app, ctx) {
1038
1052
  if (ctx.sessions.size >= MAX_CONCURRENT_SESSIONS) {
1039
1053
  return createErrorResponse(ApiErrorCode.SESSION_BUSY, `Maximum concurrent sessions (${MAX_CONCURRENT_SESSIONS}) reached.`);
1040
1054
  }
1041
- const { caseName = 'testcase', mode = 'claude', openCodeConfig, codexConfig, envOverrides, effort, } = parseBody(QuickStartSchema, req.body);
1055
+ const { caseName = 'testcase', mode = 'claude', openCodeConfig, codexConfig, geminiConfig, envOverrides, effort, } = parseBody(QuickStartSchema, req.body);
1042
1056
  // Check OpenCode availability if requested
1043
1057
  if (mode === 'opencode') {
1044
1058
  const { isOpenCodeAvailable } = await import('../../utils/opencode-cli-resolver.js');
@@ -1053,6 +1067,13 @@ export function registerSessionRoutes(app, ctx) {
1053
1067
  return createErrorResponse(ApiErrorCode.OPERATION_FAILED, 'Codex CLI not found. Install with: npm install -g @openai/codex');
1054
1068
  }
1055
1069
  }
1070
+ // Check Gemini availability if requested
1071
+ if (mode === 'gemini') {
1072
+ const { isGeminiAvailable } = await import('../../utils/gemini-cli-resolver.js');
1073
+ if (!isGeminiAvailable()) {
1074
+ return createErrorResponse(ApiErrorCode.OPERATION_FAILED, 'Gemini CLI not found. Install with: npm install -g @google/gemini-cli');
1075
+ }
1076
+ }
1056
1077
  // Resolve case path: check linked-cases registry first, then fall back to CASES_DIR.
1057
1078
  // This mirrors the behaviour of resolveCasePath() in case-routes so that linked
1058
1079
  // external project directories are honoured by quick-start just like regular case routes.
@@ -1079,8 +1100,8 @@ export function registerSessionRoutes(app, ctx) {
1079
1100
  const claudeMd = generateClaudeMd(caseName, '', templatePath);
1080
1101
  writeFileSync(join(casePath, 'CLAUDE.md'), claudeMd);
1081
1102
  // Write .claude/settings.local.json with hooks for desktop notifications
1082
- // (Claude-specific — OpenCode uses its own plugin system)
1083
- if (mode !== 'opencode') {
1103
+ // (Claude-specific — OpenCode, Codex, and Gemini use their own systems)
1104
+ if (mode !== 'opencode' && mode !== 'codex' && mode !== 'gemini') {
1084
1105
  await writeHooksConfig(casePath);
1085
1106
  }
1086
1107
  ctx.broadcast(SseEvent.CaseCreated, { name: caseName, path: casePath });
@@ -1097,7 +1118,11 @@ export function registerSessionRoutes(app, ctx) {
1097
1118
  }
1098
1119
  // Strip stale disk entries for keys this request is actively setting (Claude only —
1099
1120
  // see POST /api/sessions for full rationale).
1100
- if (mode !== 'opencode' && envOverrides && Object.keys(envOverrides).length > 0) {
1121
+ if (mode !== 'opencode' &&
1122
+ mode !== 'codex' &&
1123
+ mode !== 'gemini' &&
1124
+ envOverrides &&
1125
+ Object.keys(envOverrides).length > 0) {
1101
1126
  await stripCaseEnvKeys(casePath, Object.keys(envOverrides));
1102
1127
  }
1103
1128
  // Create a new session with the case as working directory
@@ -1108,9 +1133,11 @@ export function registerSessionRoutes(app, ctx) {
1108
1133
  ? openCodeConfig?.model
1109
1134
  : mode === 'codex'
1110
1135
  ? codexConfig?.model
1111
- : mode !== 'shell'
1112
- ? qsModelConfig?.defaultModel || undefined
1113
- : undefined;
1136
+ : mode === 'gemini'
1137
+ ? geminiConfig?.model
1138
+ : mode !== 'shell'
1139
+ ? qsModelConfig?.defaultModel || undefined
1140
+ : undefined;
1114
1141
  const qsClaudeModeConfig = await ctx.getClaudeModeConfig();
1115
1142
  const session = new Session({
1116
1143
  workingDir: casePath,
@@ -1123,6 +1150,7 @@ export function registerSessionRoutes(app, ctx) {
1123
1150
  allowedTools: qsClaudeModeConfig.allowedTools,
1124
1151
  openCodeConfig: mode === 'opencode' ? openCodeConfig : undefined,
1125
1152
  codexConfig: mode === 'codex' ? codexConfig : undefined,
1153
+ geminiConfig: mode === 'gemini' ? geminiConfig : undefined,
1126
1154
  envOverrides,
1127
1155
  effort,
1128
1156
  });
@@ -1159,7 +1187,7 @@ export function registerSessionRoutes(app, ctx) {
1159
1187
  ctx.broadcast(SseEvent.SessionInteractive, { id: session.id, mode: 'shell' });
1160
1188
  }
1161
1189
  else {
1162
- // Both 'claude' and 'opencode' modes use startInteractive()
1190
+ // 'claude', 'opencode', 'codex', and 'gemini' modes use startInteractive()
1163
1191
  await session.startInteractive();
1164
1192
  getLifecycleLog().log({
1165
1193
  event: 'started',