herm-tui 1.11.0-dev.15 → 1.11.0-dev.17
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.
- package/index.js +16 -16
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -3669,11 +3669,11 @@ Please report this to https://github.com/markedjs/marked.`,e){let r="<p>An error
|
|
|
3669
3669
|
`)}onResize(width,height){this.invalidateLayoutAndRaster(!1),super.onResize(width,height)}renderSelf(buffer){if(!this.visible||this.isDestroyed)return;if(this._layoutDirty)this.rebuildLayoutForCurrentWidth();if(!this._rasterDirty)return;if(buffer.clear(this._backgroundColor),this._rowCount===0||this._columnCount===0){this._rasterDirty=!1;return}this.drawBorders(buffer),this.drawCells(buffer),this._rasterDirty=!1}destroySelf(){this.destroyCells(),super.destroySelf()}setupMeasureFunc(){let measureFunc=(width,widthMode,_height,_heightMode)=>{let rawWidthConstraint=widthMode!==0&&Number.isFinite(width)?Math.max(1,Math.floor(width)):void 0,widthConstraint=this.resolveLayoutWidthConstraint(rawWidthConstraint),measuredLayout=this.computeLayout(widthConstraint);this._cachedMeasureLayout=measuredLayout,this._cachedMeasureWidth=widthConstraint;let measuredWidth=measuredLayout.tableWidth>0?measuredLayout.tableWidth:1,measuredHeight=measuredLayout.tableHeight>0?measuredLayout.tableHeight:1;if(widthMode===2&&rawWidthConstraint!==void 0&&this._positionType!=="absolute")measuredWidth=Math.min(rawWidthConstraint,measuredWidth);return{width:measuredWidth,height:measuredHeight}};this.yogaNode.setMeasureFunc(measureFunc)}rebuildCells(){let newRowCount=this._content.length,newColumnCount=this._content.reduce((max,row)=>Math.max(max,row.length),0);if(this._cells.length===0){this._rowCount=newRowCount,this._columnCount=newColumnCount,this._cells=[],this._prevCellContent=[];for(let rowIdx=0;rowIdx<newRowCount;rowIdx++){let row=this._content[rowIdx]??[],rowCells=[],rowRefs=[];for(let colIdx=0;colIdx<newColumnCount;colIdx++){let cellContent=row[colIdx];rowCells.push(this.createCell(cellContent)),rowRefs.push(cellContent)}this._cells.push(rowCells),this._prevCellContent.push(rowRefs)}this.invalidateLayoutAndRaster();return}this.updateCellsDiff(newRowCount,newColumnCount),this.invalidateLayoutAndRaster()}updateCellsDiff(newRowCount,newColumnCount){let oldRowCount=this._rowCount,oldColumnCount=this._columnCount,keepRows=Math.min(oldRowCount,newRowCount),keepCols=Math.min(oldColumnCount,newColumnCount);for(let rowIdx=0;rowIdx<keepRows;rowIdx++){let newRow=this._content[rowIdx]??[],cellRow=this._cells[rowIdx],refRow=this._prevCellContent[rowIdx];for(let colIdx=0;colIdx<keepCols;colIdx++){let cellContent=newRow[colIdx];if(cellContent===refRow[colIdx])continue;let oldCell=cellRow[colIdx];oldCell.textBufferView.destroy(),oldCell.textBuffer.destroy(),oldCell.syntaxStyle.destroy(),cellRow[colIdx]=this.createCell(cellContent),refRow[colIdx]=cellContent}if(newColumnCount>oldColumnCount)for(let colIdx=oldColumnCount;colIdx<newColumnCount;colIdx++){let cellContent=newRow[colIdx];cellRow.push(this.createCell(cellContent)),refRow.push(cellContent)}else if(newColumnCount<oldColumnCount){for(let colIdx=newColumnCount;colIdx<oldColumnCount;colIdx++){let cell=cellRow[colIdx];cell.textBufferView.destroy(),cell.textBuffer.destroy(),cell.syntaxStyle.destroy()}cellRow.length=newColumnCount,refRow.length=newColumnCount}}if(newRowCount>oldRowCount)for(let rowIdx=oldRowCount;rowIdx<newRowCount;rowIdx++){let newRow=this._content[rowIdx]??[],rowCells=[],rowRefs=[];for(let colIdx=0;colIdx<newColumnCount;colIdx++){let cellContent=newRow[colIdx];rowCells.push(this.createCell(cellContent)),rowRefs.push(cellContent)}this._cells.push(rowCells),this._prevCellContent.push(rowRefs)}else if(newRowCount<oldRowCount){for(let rowIdx=newRowCount;rowIdx<oldRowCount;rowIdx++){let row=this._cells[rowIdx];for(let cell of row)cell.textBufferView.destroy(),cell.textBuffer.destroy(),cell.syntaxStyle.destroy()}this._cells.length=newRowCount,this._prevCellContent.length=newRowCount}this._rowCount=newRowCount,this._columnCount=newColumnCount}createCell(content){let styledText=this.toStyledText(content),textBuffer=TextBuffer.create(this._ctx.widthMethod),syntaxStyle=SyntaxStyle.create();textBuffer.setDefaultFg(this._defaultFg),textBuffer.setDefaultBg(this._defaultBg),textBuffer.setDefaultAttributes(this._defaultAttributes),textBuffer.setSyntaxStyle(syntaxStyle),textBuffer.setStyledText(styledText);let textBufferView=TextBufferView.create(textBuffer);return textBufferView.setWrapMode(this._wrapMode),{textBuffer,textBufferView,syntaxStyle}}toStyledText(content){if(Array.isArray(content))return new StyledText(content);if(content===null||content===void 0)return stringToStyledText("");return stringToStyledText(String(content))}destroyCells(){for(let row of this._cells)for(let cell of row)cell.textBufferView.destroy(),cell.textBuffer.destroy(),cell.syntaxStyle.destroy();this._cells=[],this._prevCellContent=[],this._rowCount=0,this._columnCount=0,this._layout=this.createEmptyLayout()}rebuildLayoutForCurrentWidth(){let maxTableWidth=this.resolveLayoutWidthConstraint(this.width),layout;if(this._cachedMeasureLayout!==null&&this._cachedMeasureWidth===maxTableWidth)layout=this._cachedMeasureLayout;else layout=this.computeLayout(maxTableWidth);if(this._cachedMeasureLayout=null,this._cachedMeasureWidth=void 0,this._layout=layout,this.applyLayoutToViews(layout),this._layoutDirty=!1,this._lastLocalSelection?.isActive)this.applySelectionToCells(this._lastLocalSelection,!0)}computeLayout(maxTableWidth){if(this._rowCount===0||this._columnCount===0)return this.createEmptyLayout();let borderLayout=this.resolveBorderLayout(),columnWidths=this.computeColumnWidths(maxTableWidth,borderLayout),rowHeights=this.computeRowHeights(columnWidths),columnOffsets=this.computeOffsets(columnWidths,borderLayout.left,borderLayout.right,borderLayout.innerVertical,this.getInterColumnGap(borderLayout)),rowOffsets=this.computeOffsets(rowHeights,borderLayout.top,borderLayout.bottom,borderLayout.innerHorizontal);return{columnWidths,rowHeights,columnOffsets,rowOffsets,columnOffsetsI32:new Int32Array(columnOffsets),rowOffsetsI32:new Int32Array(rowOffsets),tableWidth:(columnOffsets[columnOffsets.length-1]??0)+1,tableHeight:(rowOffsets[rowOffsets.length-1]??0)+1}}isFullWidthMode(){return this._columnWidthMode==="full"}computeColumnWidths(maxTableWidth,borderLayout){let horizontalPadding=this.getHorizontalCellPadding(),intrinsicWidths=Array(this._columnCount).fill(1+horizontalPadding);for(let rowIdx=0;rowIdx<this._rowCount;rowIdx++)for(let colIdx=0;colIdx<this._columnCount;colIdx++){let cell=this._cells[rowIdx]?.[colIdx];if(!cell)continue;let measure=cell.textBufferView.measureForDimensions(0,MEASURE_HEIGHT),measuredWidth=Math.max(1,measure?.widthColsMax??0)+horizontalPadding;intrinsicWidths[colIdx]=Math.max(intrinsicWidths[colIdx],measuredWidth)}if(maxTableWidth===void 0||!Number.isFinite(maxTableWidth)||maxTableWidth<=0)return intrinsicWidths;let maxContentWidth=Math.max(1,Math.floor(maxTableWidth)-this.getVerticalBorderCount(borderLayout)-this.getTotalInterColumnGap(borderLayout)),currentWidth=intrinsicWidths.reduce((sum,width)=>sum+width,0);if(currentWidth===maxContentWidth)return intrinsicWidths;if(currentWidth<maxContentWidth){if(this.isFullWidthMode())return this.expandColumnWidths(intrinsicWidths,maxContentWidth);return intrinsicWidths}if(this._wrapMode==="none")return intrinsicWidths;return this.fitColumnWidths(intrinsicWidths,maxContentWidth)}expandColumnWidths(widths,targetContentWidth){let baseWidths=widths.map((width)=>Math.max(1,Math.floor(width))),totalBaseWidth=baseWidths.reduce((sum,width)=>sum+width,0);if(totalBaseWidth>=targetContentWidth)return baseWidths;let expanded=[...baseWidths],columns=expanded.length,extraWidth=targetContentWidth-totalBaseWidth,sharedWidth=Math.floor(extraWidth/columns),remainder=extraWidth%columns;for(let idx=0;idx<columns;idx++)if(expanded[idx]+=sharedWidth,idx<remainder)expanded[idx]+=1;return expanded}fitColumnWidths(widths,targetContentWidth){if(this._columnFitter==="balanced")return this.fitColumnWidthsBalanced(widths,targetContentWidth);return this.fitColumnWidthsProportional(widths,targetContentWidth)}fitColumnWidthsProportional(widths,targetContentWidth){let minWidth=1+this.getHorizontalCellPadding(),hardMinWidths=Array(widths.length).fill(minWidth),baseWidths=widths.map((width)=>Math.max(1,Math.floor(width))),preferredMinWidths=baseWidths.map((width)=>Math.min(width,minWidth+1)),floorWidths=preferredMinWidths.reduce((sum,width)=>sum+width,0)<=targetContentWidth?preferredMinWidths:hardMinWidths,floorTotal=floorWidths.reduce((sum,width)=>sum+width,0),clampedTarget=Math.max(floorTotal,targetContentWidth),totalBaseWidth=baseWidths.reduce((sum,width)=>sum+width,0);if(totalBaseWidth<=clampedTarget)return baseWidths;let shrinkable=baseWidths.map((width,idx)=>width-floorWidths[idx]),totalShrinkable=shrinkable.reduce((sum,value)=>sum+value,0);if(totalShrinkable<=0)return[...floorWidths];let targetShrink=totalBaseWidth-clampedTarget,integerShrink=Array(baseWidths.length).fill(0),fractions=Array(baseWidths.length).fill(0),usedShrink=0;for(let idx=0;idx<baseWidths.length;idx++){if(shrinkable[idx]<=0)continue;let exact=shrinkable[idx]/totalShrinkable*targetShrink,whole=Math.min(shrinkable[idx],Math.floor(exact));integerShrink[idx]=whole,fractions[idx]=exact-whole,usedShrink+=whole}let remainingShrink=targetShrink-usedShrink;while(remainingShrink>0){let bestIdx=-1,bestFraction=-1;for(let idx=0;idx<baseWidths.length;idx++){if(shrinkable[idx]-integerShrink[idx]<=0)continue;if(fractions[idx]>bestFraction)bestFraction=fractions[idx],bestIdx=idx}if(bestIdx===-1)break;integerShrink[bestIdx]+=1,fractions[bestIdx]=0,remainingShrink-=1}return baseWidths.map((width,idx)=>Math.max(floorWidths[idx],width-integerShrink[idx]))}fitColumnWidthsBalanced(widths,targetContentWidth){let minWidth=1+this.getHorizontalCellPadding(),hardMinWidths=Array(widths.length).fill(minWidth),baseWidths=widths.map((width)=>Math.max(1,Math.floor(width))),totalBaseWidth=baseWidths.reduce((sum,width)=>sum+width,0),columns=baseWidths.length;if(columns===0||totalBaseWidth<=targetContentWidth)return baseWidths;let evenShare=Math.max(minWidth,Math.floor(targetContentWidth/columns)),preferredMinWidths=baseWidths.map((width)=>Math.min(width,evenShare)),floorWidths=preferredMinWidths.reduce((sum,width)=>sum+width,0)<=targetContentWidth?preferredMinWidths:hardMinWidths,floorTotal=floorWidths.reduce((sum,width)=>sum+width,0),clampedTarget=Math.max(floorTotal,targetContentWidth);if(totalBaseWidth<=clampedTarget)return baseWidths;let shrinkable=baseWidths.map((width,idx)=>width-floorWidths[idx]);if(shrinkable.reduce((sum,value)=>sum+value,0)<=0)return[...floorWidths];let targetShrink=totalBaseWidth-clampedTarget,shrink=this.allocateShrinkByWeight(shrinkable,targetShrink,"sqrt");return baseWidths.map((width,idx)=>Math.max(floorWidths[idx],width-shrink[idx]))}allocateShrinkByWeight(shrinkable,targetShrink,mode){let shrink=Array(shrinkable.length).fill(0);if(targetShrink<=0)return shrink;let weights=shrinkable.map((value)=>{if(value<=0)return 0;return mode==="sqrt"?Math.sqrt(value):value}),totalWeight=weights.reduce((sum,value)=>sum+value,0);if(totalWeight<=0)return shrink;let fractions=Array(shrinkable.length).fill(0),usedShrink=0;for(let idx=0;idx<shrinkable.length;idx++){if(shrinkable[idx]<=0||weights[idx]<=0)continue;let exact=weights[idx]/totalWeight*targetShrink,whole=Math.min(shrinkable[idx],Math.floor(exact));shrink[idx]=whole,fractions[idx]=exact-whole,usedShrink+=whole}let remainingShrink=targetShrink-usedShrink;while(remainingShrink>0){let bestIdx=-1,bestFraction=-1;for(let idx=0;idx<shrinkable.length;idx++){if(shrinkable[idx]-shrink[idx]<=0)continue;if(bestIdx===-1||fractions[idx]>bestFraction||fractions[idx]===bestFraction&&shrinkable[idx]>shrinkable[bestIdx])bestIdx=idx,bestFraction=fractions[idx]}if(bestIdx===-1)break;shrink[bestIdx]+=1,fractions[bestIdx]=0,remainingShrink-=1}return shrink}computeRowHeights(columnWidths){let horizontalPadding=this.getHorizontalCellPadding(),verticalPadding=this.getVerticalCellPadding(),rowHeights=Array(this._rowCount).fill(1+verticalPadding);for(let rowIdx=0;rowIdx<this._rowCount;rowIdx++)for(let colIdx=0;colIdx<this._columnCount;colIdx++){let cell=this._cells[rowIdx]?.[colIdx];if(!cell)continue;let width=Math.max(1,(columnWidths[colIdx]??1)-horizontalPadding),measure=cell.textBufferView.measureForDimensions(width,MEASURE_HEIGHT),lineCount=Math.max(1,measure?.lineCount??1);rowHeights[rowIdx]=Math.max(rowHeights[rowIdx],lineCount+verticalPadding)}return rowHeights}computeOffsets(parts,startBoundary,endBoundary,includeInnerBoundaries,innerGap=0){let offsets=[startBoundary?0:-1],cursor=offsets[0]??0;for(let idx=0;idx<parts.length;idx++){let size=parts[idx]??1,separatorAfter=idx<parts.length-1?includeInnerBoundaries?1:innerGap:endBoundary?1:0;cursor+=size+separatorAfter,offsets.push(cursor)}return offsets}getInterColumnGap(borderLayout){if(borderLayout.innerVertical)return 0;return this._columnGap}getTotalInterColumnGap(borderLayout){return Math.max(0,this._columnCount-1)*this.getInterColumnGap(borderLayout)}applyLayoutToViews(layout){let horizontalPadding=this.getHorizontalCellPadding(),verticalPadding=this.getVerticalCellPadding();for(let rowIdx=0;rowIdx<this._rowCount;rowIdx++)for(let colIdx=0;colIdx<this._columnCount;colIdx++){let cell=this._cells[rowIdx]?.[colIdx];if(!cell)continue;let colWidth=layout.columnWidths[colIdx]??1,rowHeight=layout.rowHeights[rowIdx]??1,contentWidth=Math.max(1,colWidth-horizontalPadding),contentHeight=Math.max(1,rowHeight-verticalPadding);if(this._wrapMode==="none")cell.textBufferView.setWrapWidth(null);else cell.textBufferView.setWrapWidth(contentWidth);cell.textBufferView.setViewport(0,0,contentWidth,contentHeight)}}resolveBorderLayout(){return{left:this._outerBorder,right:this._outerBorder,top:this._outerBorder,bottom:this._outerBorder,innerVertical:this._border&&this._columnCount>1,innerHorizontal:this._border&&this._rowCount>1}}getVerticalBorderCount(borderLayout){return(borderLayout.left?1:0)+(borderLayout.right?1:0)+(borderLayout.innerVertical?Math.max(0,this._columnCount-1):0)}getHorizontalBorderCount(borderLayout){return(borderLayout.top?1:0)+(borderLayout.bottom?1:0)+(borderLayout.innerHorizontal?Math.max(0,this._rowCount-1):0)}drawBorders(buffer){if(!this._showBorders)return;let borderLayout=this.resolveBorderLayout();if(this.getVerticalBorderCount(borderLayout)===0&&this.getHorizontalBorderCount(borderLayout)===0)return;buffer.drawGrid({borderChars:BorderCharArrays[this._borderStyle],borderFg:this._borderColor,borderBg:this._borderBackgroundColor,columnOffsets:this._layout.columnOffsetsI32,rowOffsets:this._layout.rowOffsetsI32,drawInner:this._border,drawOuter:this._outerBorder})}drawCells(buffer){this.drawCellRange(buffer,0,this._rowCount-1)}drawCellRange(buffer,firstRow,lastRow){let colOffsets=this._layout.columnOffsets,rowOffsets=this._layout.rowOffsets,cellPaddingX=this._cellPaddingX,cellPaddingY=this._cellPaddingY;for(let rowIdx=firstRow;rowIdx<=lastRow;rowIdx++){let cellY=(rowOffsets[rowIdx]??0)+1+cellPaddingY;for(let colIdx=0;colIdx<this._columnCount;colIdx++){let cell=this._cells[rowIdx]?.[colIdx];if(!cell)continue;buffer.drawTextBuffer(cell.textBufferView,(colOffsets[colIdx]??0)+1+cellPaddingX,cellY)}}}redrawSelectionRows(firstRow,lastRow){if(firstRow>lastRow)return;if(this._backgroundColor.a<1){this.invalidateRasterOnly();return}let buffer=this.frameBuffer;if(!buffer)return;this.clearCellRange(buffer,firstRow,lastRow),this.drawCellRange(buffer,firstRow,lastRow),this.requestRender()}clearCellRange(buffer,firstRow,lastRow){let colWidths=this._layout.columnWidths,rowHeights=this._layout.rowHeights,colOffsets=this._layout.columnOffsets,rowOffsets=this._layout.rowOffsets;for(let rowIdx=firstRow;rowIdx<=lastRow;rowIdx++){let cellY=(rowOffsets[rowIdx]??0)+1,rowHeight=rowHeights[rowIdx]??1;for(let colIdx=0;colIdx<this._columnCount;colIdx++){let cellX=(colOffsets[colIdx]??0)+1,colWidth=colWidths[colIdx]??1;if(this._backgroundColor.a<1)for(let y2=cellY;y2<cellY+rowHeight;y2++)for(let x2=cellX;x2<cellX+colWidth;x2++)buffer.setCell(x2,y2," ",this._defaultFg,this._backgroundColor,this._defaultAttributes);else buffer.fillRect(cellX,cellY,colWidth,rowHeight,this._backgroundColor)}}}ensureLayoutReady(){if(!this._layoutDirty)return;this.rebuildLayoutForCurrentWidth()}getCellAtLocalPosition(localX,localY){if(this._rowCount===0||this._columnCount===0)return null;if(localX<0||localY<0||localX>=this._layout.tableWidth||localY>=this._layout.tableHeight)return null;let rowIdx=-1;for(let idx=0;idx<this._rowCount;idx++){let top=(this._layout.rowOffsets[idx]??0)+1,bottom=top+(this._layout.rowHeights[idx]??1)-1;if(localY>=top&&localY<=bottom){rowIdx=idx;break}}if(rowIdx<0)return null;let colIdx=-1;for(let idx=0;idx<this._columnCount;idx++){let left=(this._layout.columnOffsets[idx]??0)+1,right=left+(this._layout.columnWidths[idx]??1)-1;if(localX>=left&&localX<=right){colIdx=idx;break}}if(colIdx<0)return null;return{rowIdx,colIdx}}applySelectionToCells(localSelection,isStart){if(localSelection.anchorX===localSelection.focusX&&localSelection.anchorY===localSelection.focusY){this.resetCellSelections(),this._lastSelectionMode=null;return}let minSelY=Math.min(localSelection.anchorY,localSelection.focusY),maxSelY=Math.max(localSelection.anchorY,localSelection.focusY),firstRow=this.findRowForLocalY(minSelY),lastRow=this.findRowForLocalY(maxSelY),selection=this.resolveSelectionResolution(localSelection),modeChanged=this._lastSelectionMode!==selection.mode;this._lastSelectionMode=selection.mode;let lockToAnchorColumn=selection.mode==="column-locked"&&selection.anchorColumn!==null;for(let rowIdx=0;rowIdx<this._rowCount;rowIdx++){if(rowIdx<firstRow||rowIdx>lastRow){this.resetRowSelection(rowIdx);continue}let cellTop=(this._layout.rowOffsets[rowIdx]??0)+1+this._cellPaddingY;for(let colIdx=0;colIdx<this._columnCount;colIdx++){let cell=this._cells[rowIdx]?.[colIdx];if(!cell)continue;if(lockToAnchorColumn&&colIdx!==selection.anchorColumn){cell.textBufferView.resetLocalSelection();continue}let cellLeft=(this._layout.columnOffsets[colIdx]??0)+1+this._cellPaddingX,coords={anchorX:localSelection.anchorX-cellLeft,anchorY:localSelection.anchorY-cellTop,focusX:localSelection.focusX-cellLeft,focusY:localSelection.focusY-cellTop},isAnchorCell=selection.anchorCell!==null&&selection.anchorCell.rowIdx===rowIdx&&selection.anchorCell.colIdx===colIdx;if(selection.mode==="single-cell"&&!isAnchorCell){cell.textBufferView.resetLocalSelection();continue}let forceSet=isAnchorCell&&selection.mode!=="single-cell";if(forceSet)coords=this.getFullCellSelectionCoords(rowIdx,colIdx);if(isStart||modeChanged||forceSet)cell.textBufferView.setLocalSelection(coords.anchorX,coords.anchorY,coords.focusX,coords.focusY,this._selectionBg,this._selectionFg);else cell.textBufferView.updateLocalSelection(coords.anchorX,coords.anchorY,coords.focusX,coords.focusY,this._selectionBg,this._selectionFg)}}}resolveSelectionResolution(localSelection){let anchorCell=this.getCellAtLocalPosition(localSelection.anchorX,localSelection.anchorY),focusCell=this.getCellAtLocalPosition(localSelection.focusX,localSelection.focusY),anchorColumn=anchorCell?.colIdx??this.getColumnAtLocalX(localSelection.anchorX);if(anchorCell!==null&&focusCell!==null&&anchorCell.rowIdx===focusCell.rowIdx&&anchorCell.colIdx===focusCell.colIdx)return{mode:"single-cell",anchorCell,anchorColumn};let focusColumn=this.getColumnAtLocalX(localSelection.focusX);if(anchorColumn!==null&&focusColumn===anchorColumn)return{mode:"column-locked",anchorCell,anchorColumn};return{mode:"grid",anchorCell,anchorColumn}}getColumnAtLocalX(localX){if(this._columnCount===0)return null;if(localX<0||localX>=this._layout.tableWidth)return null;for(let colIdx=0;colIdx<this._columnCount;colIdx++){let colStart=(this._layout.columnOffsets[colIdx]??0)+1,colEnd=colStart+(this._layout.columnWidths[colIdx]??1)-1;if(localX>=colStart&&localX<=colEnd)return colIdx}return null}getFullCellSelectionCoords(rowIdx,colIdx){let colWidth=this._layout.columnWidths[colIdx]??1,rowHeight=this._layout.rowHeights[rowIdx]??1,contentWidth=Math.max(1,colWidth-this.getHorizontalCellPadding()),contentHeight=Math.max(1,rowHeight-this.getVerticalCellPadding());return{anchorX:-1,anchorY:0,focusX:contentWidth,focusY:contentHeight}}findRowForLocalY(localY){if(this._rowCount===0)return 0;if(localY<0)return 0;for(let rowIdx=0;rowIdx<this._rowCount;rowIdx++){let rowEnd=(this._layout.rowOffsets[rowIdx]??0)+1+(this._layout.rowHeights[rowIdx]??1)-1;if(localY<=rowEnd)return rowIdx}return this._rowCount-1}getSelectionRowRange(selection){if(!selection?.isActive||this._rowCount===0)return null;let minSelY=Math.min(selection.anchorY,selection.focusY),maxSelY=Math.max(selection.anchorY,selection.focusY);return{firstRow:this.findRowForLocalY(minSelY),lastRow:this.findRowForLocalY(maxSelY)}}getDirtySelectionRowRange(previousSelection,currentSelection){let previousRange=this.getSelectionRowRange(previousSelection),currentRange=this.getSelectionRowRange(currentSelection);if(previousRange===null)return currentRange;if(currentRange===null)return previousRange;return{firstRow:Math.min(previousRange.firstRow,currentRange.firstRow),lastRow:Math.max(previousRange.lastRow,currentRange.lastRow)}}resetRowSelection(rowIdx){let row=this._cells[rowIdx];if(!row)return;for(let cell of row)cell.textBufferView.resetLocalSelection()}resetCellSelections(){for(let rowIdx=0;rowIdx<this._rowCount;rowIdx++)this.resetRowSelection(rowIdx)}createEmptyLayout(){return{columnWidths:[],rowHeights:[],columnOffsets:[0],rowOffsets:[0],columnOffsetsI32:new Int32Array([0]),rowOffsetsI32:new Int32Array([0]),tableWidth:0,tableHeight:0}}resolveLayoutWidthConstraint(width){if(width===void 0||!Number.isFinite(width)||width<=0)return;if(this._wrapMode!=="none"||this.isFullWidthMode())return Math.max(1,Math.floor(width));return}getHorizontalCellPadding(){return this._cellPaddingX*2}getVerticalCellPadding(){return this._cellPaddingY*2}resolveColumnFitter(value){if(value===void 0)return this._defaultOptions.columnFitter;return value==="balanced"?"balanced":"proportional"}resolveCellPadding(value){if(value===void 0||!Number.isFinite(value))return this._defaultOptions.cellPadding;return Math.max(0,Math.floor(value))}resolveColumnGap(value){if(value===void 0||!Number.isFinite(value))return this._defaultOptions.columnGap;return Math.max(0,Math.floor(value))}invalidateLayoutAndRaster(markYogaDirty=!0){if(this._layoutDirty=!0,this._rasterDirty=!0,this._cachedMeasureLayout=null,this._cachedMeasureWidth=void 0,markYogaDirty)this.yogaNode.markDirty();this.requestRender()}invalidateRasterOnly(){this._rasterDirty=!0,this.requestRender()}}function parseMarkdownIncremental(newContent,prevState,trailingUnstable=2){if(!prevState||prevState.tokens.length===0)try{let tokens=x.lex(newContent,{gfm:!0});return{content:newContent,tokens,stableTokenCount:Math.max(0,tokens.length-trailingUnstable)}}catch{return{content:newContent,tokens:[],stableTokenCount:0}}let offset=0,reuseCount=0;for(let token of prevState.tokens){let tokenLength=token.raw.length;if(offset+tokenLength<=newContent.length&&newContent.startsWith(token.raw,offset))reuseCount++,offset+=tokenLength;else break}reuseCount=Math.max(0,reuseCount-trailingUnstable),offset=0;for(let i=0;i<reuseCount;i++)offset+=prevState.tokens[i].raw.length;let stableTokens=prevState.tokens.slice(0,reuseCount),remainingContent=newContent.slice(offset);if(!remainingContent)return{content:newContent,tokens:stableTokens,stableTokenCount:stableTokens.length};try{let newTokens=x.lex(remainingContent,{gfm:!0});return{content:newContent,tokens:[...stableTokens,...newTokens],stableTokenCount:trailingUnstable===0?stableTokens.length+newTokens.length:stableTokens.length}}catch{try{let fullTokens=x.lex(newContent,{gfm:!0});return{content:newContent,tokens:fullTokens,stableTokenCount:0}}catch{return{content:newContent,tokens:[],stableTokenCount:0}}}}var TRAILING_MARKDOWN_BLOCK_BREAKS_RE=/(?:\r?\n){2,}$/,TRAILING_MARKDOWN_BLOCK_NEWLINES_RE=/(?:\r?\n)+$/;function colorsEqual(left,right){if(!left||!right)return left===right;return left.equals(right)}class MarkdownRenderable extends Renderable{_content="";_syntaxStyle;_fg;_bg;_conceal;_concealCode;_treeSitterClient;_tableOptions;_renderNode;_internalBlockMode;_parseState=null;_streaming=!1;_blockStates=[];_stableBlockCount=0;_styleDirty=!1;_linkifyMarkdownChunks=(chunks,context)=>detectLinks(chunks,{content:context.content,highlights:context.highlights});_contentDefaultOptions={content:"",conceal:!0,concealCode:!1,streaming:!1,internalBlockMode:"coalesced"};constructor(ctx,options){super(ctx,{...options,flexDirection:"column",flexShrink:options.flexShrink??0});this._syntaxStyle=options.syntaxStyle,this._fg=options.fg?parseColor(options.fg):void 0,this._bg=options.bg?parseColor(options.bg):void 0,this._conceal=options.conceal??this._contentDefaultOptions.conceal,this._concealCode=options.concealCode??this._contentDefaultOptions.concealCode,this._content=options.content??this._contentDefaultOptions.content,this._treeSitterClient=options.treeSitterClient,this._tableOptions=options.tableOptions,this._renderNode=options.renderNode,this._streaming=options.streaming??this._contentDefaultOptions.streaming,this._internalBlockMode=options.internalBlockMode??this._contentDefaultOptions.internalBlockMode,this.updateBlocks()}get content(){return this._content}set content(value){if(this.isDestroyed)return;if(this._content!==value)this._content=value,this.updateBlocks(),this.requestRender()}get syntaxStyle(){return this._syntaxStyle}set syntaxStyle(value){if(this._syntaxStyle!==value)this._syntaxStyle=value,this._styleDirty=!0}get fg(){return this._fg}set fg(value){let next=value?parseColor(value):void 0;if(!colorsEqual(this._fg,next))this._fg=next,this._styleDirty=!0}get bg(){return this._bg}set bg(value){let next=value?parseColor(value):void 0;if(!colorsEqual(this._bg,next))this._bg=next,this._styleDirty=!0}get conceal(){return this._conceal}set conceal(value){if(this._conceal!==value)this._conceal=value,this._styleDirty=!0}get concealCode(){return this._concealCode}set concealCode(value){if(this._concealCode!==value)this._concealCode=value,this._styleDirty=!0}get streaming(){return this._streaming}set streaming(value){if(this.isDestroyed)return;if(this._streaming!==value)this._streaming=value,this.updateBlocks(!0)}get tableOptions(){return this._tableOptions}set tableOptions(value){this._tableOptions=value,this.applyTableOptionsToBlocks()}get renderNode(){return this._renderNode}set renderNode(value){if(this._renderNode===value)return;this._renderNode=value,this.clearBlockStates(),this._parseState=null,this.updateBlocks(!0),this.requestRender()}get internalBlockMode(){return this._internalBlockMode}set internalBlockMode(value){if(this._internalBlockMode===value)return;this._internalBlockMode=value,this.updateBlocks(!0),this.requestRender()}getStyle(group){if(!this._syntaxStyle)return;let style=this._syntaxStyle.getStyle(group);if(!style&&group.includes(".")){let baseName=group.split(".")[0];style=this._syntaxStyle.getStyle(baseName)}return style}createChunk(text,group,link2){let style=this.getStyle(group)||this.getStyle("default");return{__isChunk:!0,text,fg:style?.fg,bg:style?.bg,attributes:style?createTextAttributes({bold:style.bold,italic:style.italic,underline:style.underline,dim:style.dim}):0,link:link2}}createDefaultChunk(text){return this.createChunk(text,"default")}createInitialStyledText(token){if(!this._streaming)return;let chunks=[];if("tokens"in token&&Array.isArray(token.tokens))this.renderInlineContent(token.tokens,chunks);if(chunks.length===0&&"text"in token&&typeof token.text==="string")this.renderInlineContent(x.lexInline(token.text),chunks);return chunks.length>0?new StyledText(chunks):void 0}renderInlineContent(tokens,chunks){for(let token of tokens)this.renderInlineToken(token,chunks)}renderInlineToken(token,chunks){switch(token.type){case"text":chunks.push(this.createDefaultChunk(token.text));break;case"escape":chunks.push(this.createDefaultChunk(token.text));break;case"codespan":if(this._conceal)chunks.push(this.createChunk(token.text,"markup.raw"));else chunks.push(this.createChunk("`","markup.raw")),chunks.push(this.createChunk(token.text,"markup.raw")),chunks.push(this.createChunk("`","markup.raw"));break;case"strong":if(!this._conceal)chunks.push(this.createChunk("**","markup.strong"));for(let child of token.tokens)this.renderInlineTokenWithStyle(child,chunks,"markup.strong");if(!this._conceal)chunks.push(this.createChunk("**","markup.strong"));break;case"em":if(!this._conceal)chunks.push(this.createChunk("*","markup.italic"));for(let child of token.tokens)this.renderInlineTokenWithStyle(child,chunks,"markup.italic");if(!this._conceal)chunks.push(this.createChunk("*","markup.italic"));break;case"del":if(!this._conceal)chunks.push(this.createChunk("~~","markup.strikethrough"));for(let child of token.tokens)this.renderInlineTokenWithStyle(child,chunks,"markup.strikethrough");if(!this._conceal)chunks.push(this.createChunk("~~","markup.strikethrough"));break;case"link":{let linkHref={url:token.href};if(this._conceal){for(let child of token.tokens)this.renderInlineTokenWithStyle(child,chunks,"markup.link.label",linkHref);chunks.push(this.createChunk(" (","markup.link",linkHref)),chunks.push(this.createChunk(token.href,"markup.link.url",linkHref)),chunks.push(this.createChunk(")","markup.link",linkHref))}else{chunks.push(this.createChunk("[","markup.link",linkHref));for(let child of token.tokens)this.renderInlineTokenWithStyle(child,chunks,"markup.link.label",linkHref);chunks.push(this.createChunk("](","markup.link",linkHref)),chunks.push(this.createChunk(token.href,"markup.link.url",linkHref)),chunks.push(this.createChunk(")","markup.link",linkHref))}break}case"image":{let imageHref={url:token.href};if(this._conceal)chunks.push(this.createChunk(token.text||"image","markup.link.label",imageHref));else chunks.push(this.createChunk("),chunks.push(this.createChunk(token.href,"markup.link.url",imageHref)),chunks.push(this.createChunk(")","markup.link",imageHref));break}case"br":chunks.push(this.createDefaultChunk(`
|
|
3670
3670
|
`));break;default:if("tokens"in token&&Array.isArray(token.tokens))this.renderInlineContent(token.tokens,chunks);else if("text"in token&&typeof token.text==="string")chunks.push(this.createDefaultChunk(token.text));break}}renderInlineTokenWithStyle(token,chunks,styleGroup,link2){switch(token.type){case"text":chunks.push(this.createChunk(token.text,styleGroup,link2));break;case"escape":chunks.push(this.createChunk(token.text,styleGroup,link2));break;case"codespan":if(this._conceal)chunks.push(this.createChunk(token.text,"markup.raw",link2));else chunks.push(this.createChunk("`","markup.raw",link2)),chunks.push(this.createChunk(token.text,"markup.raw",link2)),chunks.push(this.createChunk("`","markup.raw",link2));break;default:this.renderInlineToken(token,chunks);break}}applyMargins(renderable,marginTop,marginBottom){renderable.marginTop=marginTop,renderable.marginBottom=marginBottom}createMarkdownCodeRenderable(content,id,marginBottom=0,onChunks=this._linkifyMarkdownChunks,baseHighlight,initialStyledText){return new CodeRenderable(this.ctx,{id,content,filetype:"markdown",syntaxStyle:this._syntaxStyle,fg:this._fg,bg:this._bg,conceal:this._conceal,drawUnstyledText:initialStyledText!==void 0,streaming:!0,initialStyledText,baseHighlight,onChunks,treeSitterClient:this._treeSitterClient,width:"100%",marginBottom})}getBlockquoteContent(token){return"text"in token&&typeof token.text==="string"&&token.text?token.text:" "}getBlockquoteBorderColor(){return this.getStyle("conceal")?.fg??this.getStyle("default")?.fg??this._fg??"#FFFFFF"}createBlockquoteRenderable(token,id,marginBottom=0){let renderable=new BoxRenderable(this.ctx,{id,width:"100%",border:["left"],borderColor:this.getBlockquoteBorderColor(),paddingLeft:1,flexShrink:0,marginBottom});return renderable.add(this.createMarkdownCodeRenderable(this.getBlockquoteContent(token),`${id}-content`,0,this._linkifyMarkdownChunks,"markup.quote")),renderable}createListRenderable(token,id,marginBottom=0){let list=new BoxRenderable(this.ctx,{id,width:"100%",flexDirection:"column",flexShrink:0,marginBottom});for(let item of this.getListItemInputs(token,id))list.add(this.createListItemRenderable(item));return list}getListItemInputs(token,id){let items=token.items??[],start=token.start===""||token.start===void 0||token.start===null?1:Number(token.start),markerWidth=Math.max(1,...items.map((_2,index)=>(token.ordered?`${start+index}.`:"-").length));return items.map((item,index)=>({item,marker:token.ordered?`${start+index}.`:"-",markerWidth,id:`${id}-item-${index}`}))}applyListRenderable(renderable,token,previousToken,id,marginBottom=0){if(!(renderable instanceof BoxRenderable))return!1;renderable.marginBottom=marginBottom;let inputs=this.getListItemInputs(token,id),previousItems=previousToken?.items??[],rows=renderable.getChildren();for(let index=0;index<inputs.length;index+=1){let input=inputs[index],existing=rows[index];if(existing instanceof BoxRenderable&&this.applyListItemRenderable(existing,input,previousItems[index]))continue;existing?.destroyRecursively(),renderable.add(this.createListItemRenderable(input),index)}for(let index=rows.length-1;index>=inputs.length;index-=1)rows[index]?.destroyRecursively();return!0}createListItemRenderable(input){let row=new BoxRenderable(this.ctx,{id:input.id,width:"100%",flexDirection:"row",flexShrink:0,marginBottom:/\n[ \t]*\n$/.test(input.item.raw)?1:0});row.add(new TextRenderable(this.ctx,{id:`${input.id}-marker`,content:new StyledText([this.createChunk(input.marker.padStart(input.markerWidth)+" ","markup.list")]),width:input.markerWidth+1,flexShrink:0}));let content=new BoxRenderable(this.ctx,{id:`${input.id}-content`,flexDirection:"column",flexGrow:1,flexShrink:1});row.add(content);let pendingMarginTop=0;for(let index=0;index<input.item.tokens.length;index+=1){let child=input.item.tokens[index];if(!child)continue;if(child.type==="checkbox")continue;if(child.type==="space"){pendingMarginTop=Math.max(pendingMarginTop,1);continue}let renderable=this.createListChildRenderable(child,`${input.id}-child-${index}`);if(!renderable)continue;renderable.marginTop=child.type==="list"?0:pendingMarginTop,pendingMarginTop=0,content.add(renderable)}return row}applyListItemRenderable(row,input,previousItem){this.applyListItemMarker(row,input);let content=row.getChildren()[1];if(!(content instanceof BoxRenderable))return!1;if(previousItem&&previousItem.raw===input.item.raw)return!0;return this.applyListItemChildren(content,input.item,previousItem,input.id)}applyListItemChildren(content,item,previousItem,id){let previousTokens=previousItem?this.getRenderableListItemTokens(previousItem):[],children=content.getChildren(),childIndex=0,pendingMarginTop=0;for(let tokenIndex=0;tokenIndex<item.tokens.length;tokenIndex+=1){let token=item.tokens[tokenIndex];if(!token)continue;if(token.type==="checkbox")continue;if(token.type==="space"){pendingMarginTop=Math.max(pendingMarginTop,1);continue}let existing=children[childIndex],childId=`${id}-child-${tokenIndex}`,marginTop=token.type==="list"?0:pendingMarginTop;if(pendingMarginTop=0,!existing){let renderable=this.createListChildRenderable(token,childId);if(!renderable)return!1;renderable.marginTop=marginTop,content.add(renderable,childIndex),childIndex+=1;continue}if(!this.applyListChildRenderable(existing,token,previousTokens[childIndex],childId))return!1;existing.marginTop=marginTop,childIndex+=1}return this.destroyListItemChildrenAfter(content,childIndex),!0}getRenderableListItemTokens(item){let tokens=[];for(let token of item.tokens){if(token.type==="checkbox"||token.type==="space")continue;tokens.push(token)}return tokens}applyListChildRenderable(renderable,token,previousToken,id){if((token.type==="text"||token.type==="paragraph")&&renderable instanceof CodeRenderable)return this.applyMarkdownCodeRenderable(renderable,this.normalizeScrollbackMarkdownBlockRaw(token.raw),0),!0;if(token.type==="list"&&renderable instanceof BoxRenderable)return this.applyListRenderable(renderable,token,previousToken,id);if(token.type==="code"&&renderable instanceof CodeRenderable)return this.applyCodeBlockRenderable(renderable,token,0),!0;return previousToken?.raw===token.raw}destroyListItemChildrenAfter(content,index){let children=content.getChildren();for(let i=children.length-1;i>=index;i-=1)children[i]?.destroyRecursively()}applyListItemMarker(row,input){let marker=row.getChildren()[0];if(!(marker instanceof TextRenderable))return;let marginBottom=/\n[ \t]*\n$/.test(input.item.raw)?1:0,markerWidth=input.markerWidth+1,markerText=input.marker.padStart(input.markerWidth)+" ";if(row.marginBottom!==marginBottom)row.marginBottom=marginBottom;if(marker.width!==markerWidth)marker.width=markerWidth;if(marker.chunks[0]?.text!==markerText)marker.content=new StyledText([this.createChunk(markerText,"markup.list")])}createListChildRenderable(token,id){if(token.type==="text"||token.type==="paragraph")return this.createMarkdownCodeRenderable(this.normalizeScrollbackMarkdownBlockRaw(token.raw),id,0,this._linkifyMarkdownChunks,void 0,this.createInitialStyledText(token));if(token.type==="list")return this.createListRenderable(token,id);if(token.type==="code")return this.createCodeRenderable(token,id);if(token.type==="blockquote")return this.createBlockquoteRenderable(token,id);if(token.type==="hr")return this.createHorizontalRuleRenderable(id);if(token.type==="table")return this.createTableBlock(token,id).renderable;return token.raw?this.createMarkdownCodeRenderable(token.raw,id,0,this._linkifyMarkdownChunks,void 0,this.createInitialStyledText(token)):null}createHorizontalRuleRenderable(id,marginBottom=0){return new BoxRenderable(this.ctx,{id,width:"100%",height:1,border:["top"],borderColor:this.getStyle("conceal")?.fg??this._fg??"#888888",flexShrink:0,marginBottom})}createCodeRenderable(token,id,marginBottom=0){return new CodeRenderable(this.ctx,{id,content:token.text,filetype:infoStringToFiletype(token.lang??""),syntaxStyle:this._syntaxStyle,fg:this._fg,bg:this._bg,conceal:this._concealCode,drawUnstyledText:!this._streaming,streaming:this._streaming,treeSitterClient:this._treeSitterClient,width:"100%",marginBottom})}applyMarkdownCodeRenderable(renderable,content,marginBottom,baseHighlight,initialStyledText){renderable.initialStyledText=initialStyledText,renderable.filetype="markdown",renderable.syntaxStyle=this._syntaxStyle,renderable.fg=this._fg,renderable.bg=this._bg,renderable.conceal=this._conceal,renderable.drawUnstyledText=initialStyledText!==void 0,renderable.streaming=!0,renderable.baseHighlight=baseHighlight,renderable.content=content,renderable.marginBottom=marginBottom}applyBlockquoteRenderable(renderable,token,marginBottom){if(!(renderable instanceof BoxRenderable))return;renderable.borderColor=this.getBlockquoteBorderColor(),renderable.marginBottom=marginBottom;let child=renderable.getChildren()[0];if(child instanceof CodeRenderable){this.applyMarkdownCodeRenderable(child,this.getBlockquoteContent(token),0,"markup.quote");return}for(let existing of renderable.getChildren())existing.destroyRecursively();renderable.add(this.createMarkdownCodeRenderable(this.getBlockquoteContent(token),`${renderable.id}-content`,0,this._linkifyMarkdownChunks,"markup.quote"))}applyCodeBlockRenderable(renderable,token,marginBottom){if(!(renderable instanceof CodeRenderable))return;renderable.filetype=infoStringToFiletype(token.lang??""),renderable.syntaxStyle=this._syntaxStyle,renderable.fg=this._fg,renderable.bg=this._bg,renderable.conceal=this._concealCode,renderable.drawUnstyledText=!this._streaming,renderable.streaming=this._streaming,renderable.content=token.text,renderable.marginBottom=marginBottom}shouldRenderSeparately(token){return token.type==="code"||token.type==="table"||token.type==="blockquote"||token.type==="hr"}getInterBlockMargin(token,nextToken){if(!nextToken)return 0;if(this.shouldRenderSeparately(token))return 1;if(!this.shouldRenderSeparately(nextToken))return 0;return TRAILING_MARKDOWN_BLOCK_NEWLINES_RE.test(token.raw)?0:1}applyInterBlockMargin(state,token,nextToken){if(state.tracksInterBlockMargin===!1)return;state.renderable.marginBottom=this.getInterBlockMargin(token,nextToken)}createMarkdownBlockToken(raw){return{type:"paragraph",raw,text:raw,tokens:[]}}normalizeMarkdownBlockRaw(raw){return raw.replace(TRAILING_MARKDOWN_BLOCK_BREAKS_RE,`
|
|
3671
3671
|
`)}normalizeScrollbackMarkdownBlockRaw(raw){return raw.replace(TRAILING_MARKDOWN_BLOCK_NEWLINES_RE,"")}isCodeBlockOnlyRenderer(){return this._renderNode?.codeBlockOnly===!0}buildRenderableTokens(tokens){if(this._renderNode&&!this.isCodeBlockOnlyRenderer())return tokens.filter((token)=>token.type!=="space");let renderTokens=[],markdownRaw="",flushMarkdownRaw=()=>{if(markdownRaw.length===0)return;let normalizedRaw=this.normalizeMarkdownBlockRaw(markdownRaw);if(normalizedRaw.length>0)renderTokens.push(this.createMarkdownBlockToken(normalizedRaw));markdownRaw=""};for(let i=0;i<tokens.length;i+=1){let token=tokens[i];if(token.type==="space"){if(markdownRaw.length===0)continue;let nextIndex=i+1;while(nextIndex<tokens.length&&tokens[nextIndex].type==="space")nextIndex+=1;let nextToken=tokens[nextIndex];if(nextToken&&!this.shouldRenderSeparately(nextToken))markdownRaw+=token.raw;continue}if(this.shouldRenderSeparately(token)){flushMarkdownRaw(),renderTokens.push(token);continue}markdownRaw+=token.raw}return flushMarkdownRaw(),renderTokens}buildTopLevelRenderBlocks(tokens){let blocks=[],gapBefore="";for(let i=0;i<tokens.length;i+=1){let token=tokens[i];if(token.type==="space"){gapBefore+=token.raw;continue}let prev=blocks[blocks.length-1],marginTop=prev&&this.shouldAddTopLevelMargin(prev.token,token,gapBefore)?1:0;blocks.push({token,sourceTokenEnd:i+1,marginTop}),gapBefore=""}return blocks}shouldAddTopLevelMargin(prev,current,gapBefore){if(this.isSeparatedTopLevelBlock(prev)||this.isSeparatedTopLevelBlock(current))return!0;if(prev.type!=="paragraph"||current.type!=="paragraph")return!1;return TRAILING_MARKDOWN_BLOCK_BREAKS_RE.test(prev.raw+gapBefore)}isSeparatedTopLevelBlock(token){return token.type==="heading"||token.type==="list"||this.shouldRenderSeparately(token)}getTableRowsToRender(table){return table.rows}hashString(value,seed){let hash=seed>>>0;for(let i=0;i<value.length;i+=1)hash^=value.charCodeAt(i),hash=Math.imul(hash,16777619);return hash>>>0}hashTableToken(token,seed,depth=0){let hash=this.hashString(token.type,seed);if("raw"in token&&typeof token.raw==="string")return this.hashString(token.raw,hash);if("text"in token&&typeof token.text==="string")hash=this.hashString(token.text,hash);if(depth<2&&"tokens"in token&&Array.isArray(token.tokens))for(let child of token.tokens)hash=this.hashTableToken(child,hash,depth+1);return hash>>>0}getTableCellKey(cell,isHeader){let seed=isHeader?2902232141:1371922141;if(!cell)return seed;if(typeof cell.text==="string")return this.hashString(cell.text,seed);if(Array.isArray(cell.tokens)&&cell.tokens.length>0){let hash=seed^cell.tokens.length;for(let token of cell.tokens)hash=this.hashTableToken(token,hash);return hash>>>0}return(seed^2654435769)>>>0}createTableDataCellChunks(cell){let chunks=[];if(cell)this.renderInlineContent(cell.tokens,chunks);return chunks.length>0?chunks:[this.createDefaultChunk(" ")]}createTableHeaderCellChunks(cell){let chunks=[];this.renderInlineContent(cell.tokens,chunks);let baseChunks=chunks.length>0?chunks:[this.createDefaultChunk(" ")],headingStyle=this.getStyle("markup.heading")||this.getStyle("default");if(!headingStyle)return baseChunks;let headingAttributes=createTextAttributes({bold:headingStyle.bold,italic:headingStyle.italic,underline:headingStyle.underline,dim:headingStyle.dim});return baseChunks.map((chunk)=>({...chunk,fg:headingStyle.fg??chunk.fg,bg:headingStyle.bg??chunk.bg,attributes:headingAttributes}))}buildTableContentCache(table,previous,forceRegenerate=!1){let colCount=table.header.length,rowsToRender=this.getTableRowsToRender(table);if(colCount===0||rowsToRender.length===0)return{cache:null,changed:previous!==void 0};let content=[],cellKeys=[],totalRows=rowsToRender.length+1,changed=forceRegenerate||!previous;for(let rowIndex=0;rowIndex<totalRows;rowIndex+=1){let rowContent=[],rowKeys=new Uint32Array(colCount);for(let colIndex=0;colIndex<colCount;colIndex+=1){let isHeader=rowIndex===0,cell=isHeader?table.header[colIndex]:rowsToRender[rowIndex-1]?.[colIndex],cellKey=this.getTableCellKey(cell,isHeader);rowKeys[colIndex]=cellKey;let previousCellKey=previous?.cellKeys[rowIndex]?.[colIndex],previousCellContent=previous?.content[rowIndex]?.[colIndex];if(!forceRegenerate&&previousCellKey===cellKey&&Array.isArray(previousCellContent)){rowContent.push(previousCellContent);continue}changed=!0,rowContent.push(isHeader?this.createTableHeaderCellChunks(table.header[colIndex]):this.createTableDataCellChunks(cell))}content.push(rowContent),cellKeys.push(rowKeys)}if(previous&&!changed){if(previous.content.length!==content.length)changed=!0;else for(let rowIndex=0;rowIndex<content.length;rowIndex+=1)if((previous.content[rowIndex]?.length??0)!==content[rowIndex].length){changed=!0;break}}return{cache:{content,cellKeys},changed}}resolveTableStyle(options=this._tableOptions){if(options?.style==="columns")return"columns";if(options?.style==="grid")return"grid";return this._internalBlockMode==="top-level"?"columns":"grid"}usesBorderlessColumnSpacing(options=this._tableOptions){let style=this.resolveTableStyle(options),borders=options?.borders??style==="grid";return style==="columns"&&!borders}resolveTableRenderableOptions(){let style=this.resolveTableStyle(),borders=this._tableOptions?.borders??style==="grid";return{columnWidthMode:this._tableOptions?.widthMode??(style==="columns"?"content":"full"),columnFitter:this._tableOptions?.columnFitter??"proportional",wrapMode:this._tableOptions?.wrapMode??"word",cellPadding:this._tableOptions?.cellPadding??0,cellPaddingX:this._tableOptions?.cellPaddingX??this._tableOptions?.cellPadding??0,cellPaddingY:this._tableOptions?.cellPaddingY??this._tableOptions?.cellPadding??0,columnGap:this.usesBorderlessColumnSpacing()?2:0,border:borders,outerBorder:this._tableOptions?.outerBorder??borders,showBorders:borders,borderStyle:this._tableOptions?.borderStyle??"single",borderColor:this._tableOptions?.borderColor??this.getStyle("conceal")?.fg??"#888888",selectable:this._tableOptions?.selectable??!0}}applyTableRenderableOptions(tableRenderable,options){tableRenderable.columnWidthMode=options.columnWidthMode,tableRenderable.columnFitter=options.columnFitter,tableRenderable.wrapMode=options.wrapMode,tableRenderable.cellPaddingX=options.cellPaddingX,tableRenderable.cellPaddingY=options.cellPaddingY,tableRenderable.columnGap=options.columnGap,tableRenderable.border=options.border,tableRenderable.outerBorder=options.outerBorder,tableRenderable.showBorders=options.showBorders,tableRenderable.borderStyle=options.borderStyle,tableRenderable.borderColor=options.borderColor,tableRenderable.selectable=options.selectable}applyTableOptionsToBlocks(){let options=this.resolveTableRenderableOptions(),updated=!1;for(let state of this._blockStates)if(state.renderable instanceof TextTableRenderable)this.applyTableRenderableOptions(state.renderable,options),updated=!0;if(updated)this.requestRender()}createTextTableRenderable(content,id,marginBottom=0){let options=this.resolveTableRenderableOptions();return new TextTableRenderable(this.ctx,{id,content,width:"100%",marginBottom,columnWidthMode:options.columnWidthMode,columnFitter:options.columnFitter,wrapMode:options.wrapMode,cellPadding:options.cellPadding,cellPaddingX:options.cellPaddingX,cellPaddingY:options.cellPaddingY,columnGap:options.columnGap,border:options.border,outerBorder:options.outerBorder,showBorders:options.showBorders,borderStyle:options.borderStyle,borderColor:options.borderColor,selectable:options.selectable})}createTableBlock(table,id,marginBottom=0,previousCache,forceRegenerate=!1){let{cache}=this.buildTableContentCache(table,previousCache,forceRegenerate);if(!cache)return{renderable:this.createMarkdownCodeRenderable(table.raw,id,marginBottom)};return{renderable:this.createTextTableRenderable(cache.content,id,marginBottom),tableContentCache:cache}}getStableBlockCount(blocks,stableTokenCount){if(this._internalBlockMode!=="top-level")return 0;let stableBlockCount=0;for(let block of blocks){if(block.sourceTokenEnd<=stableTokenCount){stableBlockCount+=1;continue}break}return stableBlockCount}syncTopLevelBlockState(state,block,tableContentCache=state.tableContentCache){state.token=block.token,state.tokenRaw=block.token.raw,state.marginTop=block.marginTop,state.tableContentCache=tableContentCache}getTopLevelBlockRaw(token){if(!token.raw)return;return this.shouldRenderSeparately(token)?token.raw:this.normalizeScrollbackMarkdownBlockRaw(token.raw)}createTopLevelDefaultRenderable(block,index){let{token,marginTop}=block,id=`${this.id}-block-${index}`;if(token.type==="code"){let renderable2=this.createCodeRenderable(token,id);return renderable2.marginTop=marginTop,{renderable:renderable2,canUpdateInPlace:!0}}if(token.type==="table"){let next=this.createTableBlock(token,id);return next.renderable.marginTop=marginTop,{...next,canUpdateInPlace:!0}}if(token.type==="blockquote"){let renderable2=this.createBlockquoteRenderable(token,id);return renderable2.marginTop=marginTop,{renderable:renderable2,canUpdateInPlace:!0}}if(token.type==="list"){let renderable2=this.createListRenderable(token,id);return renderable2.marginTop=marginTop,{renderable:renderable2,canUpdateInPlace:!0}}if(token.type==="hr"){let renderable2=this.createHorizontalRuleRenderable(id);return renderable2.marginTop=marginTop,{renderable:renderable2,canUpdateInPlace:!0}}let markdownRaw=this.getTopLevelBlockRaw(token);if(!markdownRaw)return{renderable:void 0,canUpdateInPlace:!0};let renderable=this.createMarkdownCodeRenderable(markdownRaw,id,0,this._linkifyMarkdownChunks,void 0,this.createInitialStyledText(token));return renderable.marginTop=marginTop,{renderable,canUpdateInPlace:!0}}createTopLevelRenderable(block,index){if(!this._renderNode)return this.createTopLevelDefaultRenderable(block,index);let custom=this.createTopLevelCustomRenderable(block,index);if(!custom.renderable)return this.createTopLevelDefaultRenderable(block,index);let marginTop=typeof custom.renderable.marginTop==="number"?Math.max(custom.renderable.marginTop,block.marginTop):block.marginTop;return this.applyMargins(custom.renderable,marginTop,0),{renderable:custom.renderable,tableContentCache:custom.tableContentCache,canUpdateInPlace:custom.canUpdateInPlace}}createDefaultRenderable(token,index,nextToken){let id=`${this.id}-block-${index}`,marginBottom=this.getInterBlockMargin(token,nextToken);if(token.type==="code")return this.createCodeRenderable(token,id,marginBottom);if(token.type==="blockquote")return this.createBlockquoteRenderable(token,id,marginBottom);if(token.type==="list")return this.createListRenderable(token,id,marginBottom);if(token.type==="hr")return this.createHorizontalRuleRenderable(id,marginBottom);if(token.type==="table")return this.createTableBlock(token,id,marginBottom).renderable;if(token.type==="space")return null;if(!token.raw)return null;return this.createMarkdownCodeRenderable(token.raw,id,marginBottom,this._linkifyMarkdownChunks,void 0,this.createInitialStyledText(token))}createCustomRenderable(token,index,nextToken){let custom=this.renderCustomNode(token,()=>{return{renderable:this.createDefaultRenderable(token,index,nextToken)}});if(!custom.renderable)return{tracksInterBlockMargin:!0,canUpdateInPlace:!0};let canUpdateInPlace=custom.renderable===custom.defaultResult?.renderable;return{renderable:custom.renderable,tracksInterBlockMargin:canUpdateInPlace,canUpdateInPlace}}createTopLevelCustomRenderable(block,index){let custom=this.renderCustomNode(block.token,()=>{return this.createTopLevelDefaultRenderable(block,index)});if(!custom.renderable)return{tracksInterBlockMargin:!0,canUpdateInPlace:!0};let canUpdateInPlace=custom.renderable===custom.defaultResult?.renderable;return{renderable:custom.renderable,tableContentCache:canUpdateInPlace?custom.defaultResult?.tableContentCache:void 0,tracksInterBlockMargin:canUpdateInPlace,canUpdateInPlace}}renderCustomNode(token,createDefault){if(!this._renderNode)return{};let defaultResult,custom=this._renderNode(token,{syntaxStyle:this._syntaxStyle,conceal:this._conceal,concealCode:this._concealCode,treeSitterClient:this._treeSitterClient,defaultRender:()=>{return defaultResult=createDefault(),defaultResult.renderable??null}});return this.destroyUnusedDefaultRenderable(defaultResult?.renderable,custom??void 0),custom?{renderable:custom,defaultResult}:{}}destroyUnusedDefaultRenderable(renderable,usedRenderable){if(!renderable||renderable===usedRenderable||renderable.parent)return;renderable.destroyRecursively()}updateBlockRenderable(state,token,index,nextToken,forceListRefresh=!1){let marginBottom=this.getInterBlockMargin(token,nextToken);if(token.type==="code"){this.applyCodeBlockRenderable(state.renderable,token,marginBottom);return}if(token.type==="blockquote"){this.applyBlockquoteRenderable(state.renderable,token,marginBottom);return}if(token.type==="list"){if(!this.applyListRenderable(state.renderable,token,forceListRefresh?void 0:state.token,`${this.id}-block-${index}`,marginBottom))state.renderable.destroyRecursively(),state.renderable=this.createListRenderable(token,`${this.id}-block-${index}`,marginBottom),this.add(state.renderable,index);return}if(token.type==="hr"){state.renderable.marginBottom=marginBottom;return}if(token.type==="table"){let tableToken=token,{cache,changed}=this.buildTableContentCache(tableToken,state.tableContentCache);if(!cache){if(state.renderable instanceof CodeRenderable){this.applyMarkdownCodeRenderable(state.renderable,tableToken.raw,marginBottom),state.tableContentCache=void 0;return}state.renderable.destroyRecursively();let fallbackRenderable=this.createMarkdownCodeRenderable(tableToken.raw,`${this.id}-block-${index}`,marginBottom);this.add(fallbackRenderable,index),state.renderable=fallbackRenderable,state.tableContentCache=void 0;return}if(state.renderable instanceof TextTableRenderable){if(changed)state.renderable.content=cache.content;this.applyTableRenderableOptions(state.renderable,this.resolveTableRenderableOptions()),state.renderable.marginBottom=marginBottom,state.tableContentCache=cache;return}state.renderable.destroyRecursively();let tableRenderable=this.createTextTableRenderable(cache.content,`${this.id}-block-${index}`,marginBottom);this.add(tableRenderable,index),state.renderable=tableRenderable,state.tableContentCache=cache;return}if(state.renderable instanceof CodeRenderable){this.applyMarkdownCodeRenderable(state.renderable,this.getTopLevelBlockRaw(token)??token.raw,marginBottom,void 0,this.createInitialStyledText(token));return}state.renderable.destroyRecursively();let markdownRenderable=this.createMarkdownCodeRenderable(this.getTopLevelBlockRaw(token)??token.raw,`${this.id}-block-${index}`,marginBottom,this._linkifyMarkdownChunks,void 0,this.createInitialStyledText(token));this.add(markdownRenderable,index),state.renderable=markdownRenderable}updateTopLevelBlocks(tokens,forceTableRefresh){let blocks=this.buildTopLevelRenderBlocks(tokens);this._stableBlockCount=this.getStableBlockCount(blocks,this._parseState?.stableTokenCount??0);let blockIndex=0;for(let i=0;i<blocks.length;i+=1){let block=blocks[i],existing=this._blockStates[blockIndex];if(existing&&existing.token===block.token&&!forceTableRefresh){if(existing.marginTop!==block.marginTop)this.applyMargins(existing.renderable,block.marginTop,0);this.syncTopLevelBlockState(existing,block),blockIndex++;continue}if(existing&&existing.tokenRaw===block.token.raw&&existing.token.type===block.token.type&&!forceTableRefresh){if(existing.marginTop!==block.marginTop)this.applyMargins(existing.renderable,block.marginTop,0);this.syncTopLevelBlockState(existing,block),blockIndex++;continue}if(existing&&!forceTableRefresh&&existing.canUpdateInPlace&&existing.token.type===block.token.type&&this.canUpdateBlockRenderable(existing.renderable,block.token)){if(this._renderNode){let custom=this.createTopLevelCustomRenderable(block,blockIndex);if(custom.renderable&&!custom.canUpdateInPlace){let marginTop=typeof custom.renderable.marginTop==="number"?Math.max(custom.renderable.marginTop,block.marginTop):block.marginTop;if(this.applyMargins(custom.renderable,marginTop,0),custom.renderable!==existing.renderable)existing.renderable.destroyRecursively(),this.add(custom.renderable,blockIndex);this._blockStates[blockIndex]={token:block.token,tokenRaw:block.token.raw,marginTop:block.marginTop,renderable:custom.renderable,tableContentCache:custom.tableContentCache,canUpdateInPlace:custom.canUpdateInPlace},blockIndex++;continue}this.destroyUnusedDefaultRenderable(custom.renderable)}if(this.updateBlockRenderable(existing,block.token,blockIndex,blocks[i+1]?.token),existing.renderable.marginBottom=0,existing.marginTop!==block.marginTop)this.applyMargins(existing.renderable,block.marginTop,0);this.syncTopLevelBlockState(existing,block),blockIndex++;continue}if(existing)existing.renderable.destroyRecursively();let next=this.createTopLevelRenderable(block,blockIndex);if(next.renderable)this.add(next.renderable,blockIndex),this._blockStates[blockIndex]={token:block.token,tokenRaw:block.token.raw,marginTop:block.marginTop,renderable:next.renderable,tableContentCache:next.tableContentCache,canUpdateInPlace:next.canUpdateInPlace};blockIndex++}while(this._blockStates.length>blockIndex)this._blockStates.pop().renderable.destroyRecursively()}canUpdateBlockRenderable(renderable,token){if(token.type==="code")return renderable instanceof CodeRenderable;if(token.type==="table")return renderable instanceof TextTableRenderable;if(token.type==="blockquote")return renderable instanceof BoxRenderable;if(token.type==="list")return renderable instanceof BoxRenderable;if(token.type==="hr")return renderable instanceof BoxRenderable;return renderable instanceof CodeRenderable}updateBlocks(forceTableRefresh=!1){if(this.isDestroyed)return;if(!this._content){this.clearBlockStates(),this._parseState=null,this._stableBlockCount=0;return}let trailingUnstable=this._streaming?2:0;this._parseState=parseMarkdownIncremental(this._content,this._parseState,trailingUnstable);let tokens=this._parseState.tokens;if(tokens.length===0&&this._content.length>0){this.clearBlockStates(),this._stableBlockCount=0;let fallback=this.createMarkdownCodeRenderable(this._content,`${this.id}-fallback`);this.add(fallback),this._blockStates=[{token:{type:"text",raw:this._content,text:this._content},tokenRaw:this._content,marginTop:0,renderable:fallback,tracksInterBlockMargin:!0,canUpdateInPlace:!0}];return}if(this._internalBlockMode==="top-level"){this.updateTopLevelBlocks(tokens,forceTableRefresh);return}this._stableBlockCount=0;let blockTokens=this.buildRenderableTokens(tokens),blockIndex=0;for(let i=0;i<blockTokens.length;i++){let token=blockTokens[i],nextToken=blockTokens[i+1],existing=this._blockStates[blockIndex],shouldForceRefresh=forceTableRefresh;if(existing&&existing.token===token){if(shouldForceRefresh)this.updateBlockRenderable(existing,token,blockIndex,nextToken),existing.tokenRaw=token.raw;else this.applyInterBlockMargin(existing,token,nextToken);blockIndex++;continue}if(existing&&existing.tokenRaw===token.raw&&existing.token.type===token.type){if(existing.token=token,shouldForceRefresh)this.updateBlockRenderable(existing,token,blockIndex,nextToken),existing.tokenRaw=token.raw;else this.applyInterBlockMargin(existing,token,nextToken);blockIndex++;continue}if(existing&&existing.canUpdateInPlace&&existing.token.type===token.type){let custom2=this.createCustomRenderable(token,blockIndex,nextToken);if(custom2.renderable&&!custom2.canUpdateInPlace){if(custom2.renderable!==existing.renderable)existing.renderable.destroyRecursively(),this.add(custom2.renderable,blockIndex);this._blockStates[blockIndex]={token,tokenRaw:token.raw,renderable:custom2.renderable,tracksInterBlockMargin:custom2.tracksInterBlockMargin,canUpdateInPlace:custom2.canUpdateInPlace},blockIndex++;continue}this.destroyUnusedDefaultRenderable(custom2.renderable),this.updateBlockRenderable(existing,token,blockIndex,nextToken),existing.token=token,existing.tokenRaw=token.raw,existing.tracksInterBlockMargin=!0,blockIndex++;continue}if(existing)existing.renderable.destroyRecursively();let renderable,tableContentCache,tracksInterBlockMargin=!0,canUpdateInPlace=!0,custom=this.createCustomRenderable(token,blockIndex,nextToken);if(custom.renderable)renderable=custom.renderable,tracksInterBlockMargin=custom.tracksInterBlockMargin,canUpdateInPlace=custom.canUpdateInPlace;if(!renderable)if(token.type==="table"){let tableBlock=this.createTableBlock(token,`${this.id}-block-${blockIndex}`,this.getInterBlockMargin(token,nextToken));renderable=tableBlock.renderable,tableContentCache=tableBlock.tableContentCache}else renderable=this.createDefaultRenderable(token,blockIndex,nextToken)??void 0;if(token.type==="table"&&!tableContentCache&&renderable instanceof TextTableRenderable){let{cache}=this.buildTableContentCache(token);tableContentCache=cache??void 0}if(renderable)this.add(renderable,blockIndex),this._blockStates[blockIndex]={token,tokenRaw:token.raw,renderable,tableContentCache,tracksInterBlockMargin,canUpdateInPlace};blockIndex++}while(this._blockStates.length>blockIndex)this._blockStates.pop().renderable.destroyRecursively()}clearBlockStates(){for(let state of this._blockStates)state.renderable.destroyRecursively();this._blockStates=[],this._stableBlockCount=0}rerenderBlocks(){if(this._internalBlockMode==="top-level"){this.updateBlocks(!0);return}for(let i=0;i<this._blockStates.length;i++){let state=this._blockStates[i],marginBottom=this.getInterBlockMargin(state.token,this._blockStates[i+1]?.token);if(state.token.type==="code"){this.applyCodeBlockRenderable(state.renderable,state.token,marginBottom);continue}if(state.token.type==="blockquote"){this.applyBlockquoteRenderable(state.renderable,state.token,marginBottom);continue}if(state.token.type==="list"){this.updateBlockRenderable(state,state.token,i,this._blockStates[i+1]?.token,!0);continue}if(state.token.type==="hr"){state.renderable.marginBottom=marginBottom;continue}if(state.token.type==="table"){let tableToken=state.token,{cache}=this.buildTableContentCache(tableToken,state.tableContentCache,!0);if(!cache){if(state.renderable instanceof CodeRenderable)this.applyMarkdownCodeRenderable(state.renderable,tableToken.raw,marginBottom);else{state.renderable.destroyRecursively();let fallbackRenderable=this.createMarkdownCodeRenderable(tableToken.raw,`${this.id}-block-${i}`,marginBottom);this.add(fallbackRenderable,i),state.renderable=fallbackRenderable}state.tableContentCache=void 0;continue}if(state.renderable instanceof TextTableRenderable){state.renderable.content=cache.content,this.applyTableRenderableOptions(state.renderable,this.resolveTableRenderableOptions()),state.renderable.marginBottom=marginBottom,state.tableContentCache=cache;continue}state.renderable.destroyRecursively();let tableRenderable=this.createTextTableRenderable(cache.content,`${this.id}-block-${i}`,marginBottom);this.add(tableRenderable,i),state.renderable=tableRenderable,state.tableContentCache=cache;continue}if(state.renderable instanceof CodeRenderable){this.applyMarkdownCodeRenderable(state.renderable,this.getTopLevelBlockRaw(state.token)??state.token.raw,marginBottom,void 0,this.createInitialStyledText(state.token));continue}state.renderable.destroyRecursively();let markdownRenderable=this.createMarkdownCodeRenderable(this.getTopLevelBlockRaw(state.token)??state.token.raw,`${this.id}-block-${i}`,marginBottom,this._linkifyMarkdownChunks,void 0,this.createInitialStyledText(state.token));this.add(markdownRenderable,i),state.renderable=markdownRenderable}}clearCache(){this._parseState=null,this.clearBlockStates(),this.updateBlocks(),this.requestRender()}refreshStyles(){this._styleDirty=!1,this.rerenderBlocks(),this.requestRender()}renderSelf(buffer,deltaTime){if(this._styleDirty)this._styleDirty=!1,this.rerenderBlocks();super.renderSelf(buffer,deltaTime)}}var defaultThumbBackgroundColor=RGBA.fromHex("#9a9ea3"),defaultTrackBackgroundColor=RGBA.fromHex("#252527");class SliderRenderable extends Renderable{orientation;_value;_min;_max;_viewPortSize;_backgroundColor;_foregroundColor;_onChange;constructor(ctx,options){super(ctx,{flexShrink:0,...options});this.orientation=options.orientation,this._min=options.min??0,this._max=options.max??100,this._value=options.value??this._min,this._viewPortSize=options.viewPortSize??Math.max(1,(this._max-this._min)*0.1),this._onChange=options.onChange,this._backgroundColor=options.backgroundColor?parseColor(options.backgroundColor):defaultTrackBackgroundColor,this._foregroundColor=options.foregroundColor?parseColor(options.foregroundColor):defaultThumbBackgroundColor,this.setupMouseHandling()}get value(){return this._value}set value(newValue){let clamped=Math.max(this._min,Math.min(this._max,newValue));if(clamped!==this._value)this._value=clamped,this._onChange?.(clamped),this.emit("change",{value:clamped}),this.requestRender()}get min(){return this._min}set min(newMin){if(newMin!==this._min){if(this._min=newMin,this._value<newMin)this.value=newMin;this.requestRender()}}get max(){return this._max}set max(newMax){if(newMax!==this._max){if(this._max=newMax,this._value>newMax)this.value=newMax;this.requestRender()}}set viewPortSize(size){let clampedSize=Math.max(0.01,Math.min(size,this._max-this._min));if(clampedSize!==this._viewPortSize)this._viewPortSize=clampedSize,this.requestRender()}get viewPortSize(){return this._viewPortSize}get backgroundColor(){return this._backgroundColor}set backgroundColor(value){this._backgroundColor=parseColor(value),this.requestRender()}get foregroundColor(){return this._foregroundColor}set foregroundColor(value){this._foregroundColor=parseColor(value),this.requestRender()}calculateDragOffsetVirtual(event){let trackStart=this.orientation==="vertical"?this.y:this.x,mousePos=(this.orientation==="vertical"?event.y:event.x)-trackStart,virtualMousePos=Math.max(0,Math.min((this.orientation==="vertical"?this.height:this.width)*2,mousePos*2)),virtualThumbStart=this.getVirtualThumbStart(),virtualThumbSize=this.getVirtualThumbSize();return Math.max(0,Math.min(virtualThumbSize,virtualMousePos-virtualThumbStart))}setupMouseHandling(){let isDragging=!1,dragOffsetVirtual=0;this.onMouseDown=(event)=>{event.stopPropagation(),event.preventDefault();let thumb=this.getThumbRect();if(event.x>=thumb.x&&event.x<thumb.x+thumb.width&&event.y>=thumb.y&&event.y<thumb.y+thumb.height)isDragging=!0,dragOffsetVirtual=this.calculateDragOffsetVirtual(event);else this.updateValueFromMouseDirect(event),isDragging=!0,dragOffsetVirtual=this.calculateDragOffsetVirtual(event)},this.onMouseDrag=(event)=>{if(!isDragging)return;event.stopPropagation(),this.updateValueFromMouseWithOffset(event,dragOffsetVirtual)},this.onMouseUp=(event)=>{if(isDragging)this.updateValueFromMouseWithOffset(event,dragOffsetVirtual);isDragging=!1}}updateValueFromMouseDirect(event){let trackStart=this.orientation==="vertical"?this.y:this.x,trackSize=this.orientation==="vertical"?this.height:this.width,relativeMousePos=(this.orientation==="vertical"?event.y:event.x)-trackStart,clampedMousePos=Math.max(0,Math.min(trackSize,relativeMousePos)),ratio=trackSize===0?0:clampedMousePos/trackSize,range=this._max-this._min,newValue=this._min+ratio*range;this.value=newValue}updateValueFromMouseWithOffset(event,offsetVirtual){let trackStart=this.orientation==="vertical"?this.y:this.x,trackSize=this.orientation==="vertical"?this.height:this.width,mousePos=this.orientation==="vertical"?event.y:event.x,virtualTrackSize=trackSize*2,relativeMousePos=mousePos-trackStart,virtualMousePos=Math.max(0,Math.min(trackSize,relativeMousePos))*2,virtualThumbSize=this.getVirtualThumbSize(),maxThumbStart=Math.max(0,virtualTrackSize-virtualThumbSize),desiredThumbStart=virtualMousePos-offsetVirtual;desiredThumbStart=Math.max(0,Math.min(maxThumbStart,desiredThumbStart));let ratio=maxThumbStart===0?0:desiredThumbStart/maxThumbStart,range=this._max-this._min,newValue=this._min+ratio*range;this.value=newValue}getThumbRect(){let virtualThumbSize=this.getVirtualThumbSize(),virtualThumbStart=this.getVirtualThumbStart(),realThumbStart=Math.floor(virtualThumbStart/2),realThumbSize=Math.ceil((virtualThumbStart+virtualThumbSize)/2)-realThumbStart;if(this.orientation==="vertical")return{x:this.x,y:this.y+realThumbStart,width:this.width,height:Math.max(1,realThumbSize)};else return{x:this.x+realThumbStart,y:this.y,width:Math.max(1,realThumbSize),height:this.height}}renderSelf(buffer){if(this.orientation==="horizontal")this.renderHorizontal(buffer);else this.renderVertical(buffer)}renderHorizontal(buffer){let virtualThumbSize=this.getVirtualThumbSize(),virtualThumbStart=this.getVirtualThumbStart(),virtualThumbEnd=virtualThumbStart+virtualThumbSize;buffer.fillRect(this.x,this.y,this.width,this.height,this._backgroundColor);let realStartCell=Math.floor(virtualThumbStart/2),realEndCell=Math.ceil(virtualThumbEnd/2)-1,startX=Math.max(0,realStartCell),endX=Math.min(this.width-1,realEndCell);for(let realX=startX;realX<=endX;realX++){let virtualCellStart=realX*2,virtualCellEnd=virtualCellStart+2,thumbStartInCell=Math.max(virtualThumbStart,virtualCellStart),coverage=Math.min(virtualThumbEnd,virtualCellEnd)-thumbStartInCell,char=" ";if(coverage>=2)char="\u2588";else if(thumbStartInCell===virtualCellStart)char="\u258C";else char="\u2590";for(let y2=0;y2<this.height;y2++)buffer.setCellWithAlphaBlending(this.x+realX,this.y+y2,char,this._foregroundColor,this._backgroundColor)}}renderVertical(buffer){let virtualThumbSize=this.getVirtualThumbSize(),virtualThumbStart=this.getVirtualThumbStart(),virtualThumbEnd=virtualThumbStart+virtualThumbSize;buffer.fillRect(this.x,this.y,this.width,this.height,this._backgroundColor);let realStartCell=Math.floor(virtualThumbStart/2),realEndCell=Math.ceil(virtualThumbEnd/2)-1,startY=Math.max(0,realStartCell),endY=Math.min(this.height-1,realEndCell);for(let realY=startY;realY<=endY;realY++){let virtualCellStart=realY*2,virtualCellEnd=virtualCellStart+2,thumbStartInCell=Math.max(virtualThumbStart,virtualCellStart),coverage=Math.min(virtualThumbEnd,virtualCellEnd)-thumbStartInCell,char=" ";if(coverage>=2)char="\u2588";else if(coverage>0)if(thumbStartInCell-virtualCellStart===0)char="\u2580";else char="\u2584";for(let x2=0;x2<this.width;x2++)buffer.setCellWithAlphaBlending(this.x+x2,this.y+realY,char,this._foregroundColor,this._backgroundColor)}}getVirtualThumbSize(){let virtualTrackSize=this.orientation==="vertical"?this.height*2:this.width*2,range=this._max-this._min;if(range===0)return virtualTrackSize;let viewportSize=Math.max(1,this._viewPortSize),contentSize=range+viewportSize;if(contentSize<=viewportSize)return virtualTrackSize;let thumbRatio=viewportSize/contentSize,calculatedSize=Math.floor(virtualTrackSize*thumbRatio);return Math.max(1,Math.min(calculatedSize,virtualTrackSize))}getVirtualThumbStart(){let virtualTrackSize=this.orientation==="vertical"?this.height*2:this.width*2,range=this._max-this._min;if(range===0)return 0;let valueRatio=(this._value-this._min)/range,virtualThumbSize=this.getVirtualThumbSize();return Math.round(valueRatio*(virtualTrackSize-virtualThumbSize))}}class ScrollBarRenderable extends Renderable{slider;startArrow;endArrow;orientation;_focusable=!0;_scrollSize=0;_scrollPosition=0;_viewportSize=0;_showArrows=!1;_manualVisibility=!1;_onChange;scrollStep=null;get visible(){return super.visible}set visible(value){this._manualVisibility=!0,super.visible=value}resetVisibilityControl(){this._manualVisibility=!1,this.recalculateVisibility()}get scrollSize(){return this._scrollSize}get scrollPosition(){return this._scrollPosition}get viewportSize(){return this._viewportSize}set scrollSize(value){if(value===this.scrollSize)return;this._scrollSize=value,this.recalculateVisibility(),this.updateSliderFromScrollState(),this.scrollPosition=this.scrollPosition}set scrollPosition(value){let newPosition=Math.round(Math.min(Math.max(0,value),this.scrollSize-this.viewportSize));if(newPosition!==this._scrollPosition)this._scrollPosition=newPosition,this.updateSliderFromScrollState()}set viewportSize(value){if(value===this.viewportSize)return;this._viewportSize=value,this.slider.viewPortSize=Math.max(1,this._viewportSize),this.recalculateVisibility(),this.updateSliderFromScrollState(),this.scrollPosition=this.scrollPosition}get showArrows(){return this._showArrows}set showArrows(value){if(value===this._showArrows)return;this._showArrows=value,this.startArrow.visible=value,this.endArrow.visible=value}constructor(ctx,{trackOptions,arrowOptions,orientation,showArrows=!1,...options}){super(ctx,{flexDirection:orientation==="vertical"?"column":"row",alignSelf:"stretch",alignItems:"stretch",...options});this._onChange=options.onChange,this.orientation=orientation,this._showArrows=showArrows;let scrollRange=Math.max(0,this._scrollSize-this._viewportSize),defaultStepSize=Math.max(1,this._viewportSize),stepSize=trackOptions?.viewPortSize??defaultStepSize;this.slider=new SliderRenderable(ctx,{orientation,min:0,max:scrollRange,value:this._scrollPosition,viewPortSize:stepSize,onChange:(value)=>{this._scrollPosition=Math.round(value),this._onChange?.(this._scrollPosition),this.emit("change",{position:this._scrollPosition})},...orientation==="vertical"?{width:Math.max(1,Math.min(2,this.width)),height:"100%",marginLeft:"auto"}:{width:"100%",height:1,marginTop:"auto"},flexGrow:1,flexShrink:1,...trackOptions}),this.updateSliderFromScrollState();let arrowOpts=arrowOptions?{foregroundColor:arrowOptions.backgroundColor,backgroundColor:arrowOptions.backgroundColor,attributes:arrowOptions.attributes,...arrowOptions}:{};this.startArrow=new ArrowRenderable(ctx,{alignSelf:"center",visible:this.showArrows,direction:this.orientation==="vertical"?"up":"left",height:this.orientation==="vertical"?1:1,...arrowOpts}),this.endArrow=new ArrowRenderable(ctx,{alignSelf:"center",visible:this.showArrows,direction:this.orientation==="vertical"?"down":"right",height:this.orientation==="vertical"?1:1,...arrowOpts}),this.add(this.startArrow),this.add(this.slider),this.add(this.endArrow);let startArrowMouseTimeout=void 0,endArrowMouseTimeout=void 0;this.startArrow.onMouseDown=(event)=>{event.stopPropagation(),event.preventDefault(),this.scrollBy(-0.5,"viewport"),startArrowMouseTimeout=setTimeout(()=>{this.scrollBy(-0.5,"viewport"),startArrowMouseTimeout=setInterval(()=>{this.scrollBy(-0.2,"viewport")},200)},500)},this.startArrow.onMouseUp=(event)=>{event.stopPropagation(),clearInterval(startArrowMouseTimeout)},this.endArrow.onMouseDown=(event)=>{event.stopPropagation(),event.preventDefault(),this.scrollBy(0.5,"viewport"),endArrowMouseTimeout=setTimeout(()=>{this.scrollBy(0.5,"viewport"),endArrowMouseTimeout=setInterval(()=>{this.scrollBy(0.2,"viewport")},200)},500)},this.endArrow.onMouseUp=(event)=>{event.stopPropagation(),clearInterval(endArrowMouseTimeout)}}set arrowOptions(options){Object.assign(this.startArrow,options),Object.assign(this.endArrow,options),this.requestRender()}set trackOptions(options){Object.assign(this.slider,options),this.requestRender()}updateSliderFromScrollState(){let scrollRange=Math.max(0,this._scrollSize-this._viewportSize);this.slider.min=0,this.slider.max=scrollRange,this.slider.value=Math.min(this._scrollPosition,scrollRange)}scrollBy(delta,unit="absolute"){let resolvedDelta=(unit==="viewport"?this.viewportSize:unit==="content"?this.scrollSize:unit==="step"?this.scrollStep??1:1)*delta;this.scrollPosition+=resolvedDelta}recalculateVisibility(){if(!this._manualVisibility){let sizeRatio=this.scrollSize<=this.viewportSize?1:this.viewportSize/this.scrollSize;super.visible=sizeRatio<1}}handleKeyPress(key){switch(key.name){case"left":case"h":if(this.orientation!=="horizontal")return!1;return this.scrollBy(-0.2,"viewport"),!0;case"right":case"l":if(this.orientation!=="horizontal")return!1;return this.scrollBy(0.2,"viewport"),!0;case"up":case"k":if(this.orientation!=="vertical")return!1;return this.scrollBy(-0.2,"viewport"),!0;case"down":case"j":if(this.orientation!=="vertical")return!1;return this.scrollBy(0.2,"viewport"),!0;case"pageup":return this.scrollBy(-0.5,"viewport"),!0;case"pagedown":return this.scrollBy(0.5,"viewport"),!0;case"home":return this.scrollBy(-1,"content"),!0;case"end":return this.scrollBy(1,"content"),!0}return!1}}class ArrowRenderable extends Renderable{_direction;_foregroundColor;_backgroundColor;_attributes;_arrowChars;constructor(ctx,options){super(ctx,options);if(this._direction=options.direction,this._foregroundColor=options.foregroundColor?parseColor(options.foregroundColor):RGBA.fromValues(1,1,1,1),this._backgroundColor=options.backgroundColor?parseColor(options.backgroundColor):RGBA.fromValues(0,0,0,0),this._attributes=options.attributes??0,this._arrowChars={up:"\u25B2",down:"\u25BC",left:"\u25C0",right:"\u25B6",...options.arrowChars},!options.width)this.width=stringWidth2(this.getArrowChar())}get direction(){return this._direction}set direction(value){if(this._direction!==value)this._direction=value,this.requestRender()}get foregroundColor(){return this._foregroundColor}set foregroundColor(value){if(this._foregroundColor!==value)this._foregroundColor=parseColor(value),this.requestRender()}get backgroundColor(){return this._backgroundColor}set backgroundColor(value){if(this._backgroundColor!==value)this._backgroundColor=parseColor(value),this.requestRender()}get attributes(){return this._attributes}set attributes(value){if(this._attributes!==value)this._attributes=value,this.requestRender()}set arrowChars(value){this._arrowChars={...this._arrowChars,...value},this.requestRender()}renderSelf(buffer){let char=this.getArrowChar();buffer.drawText(char,this.x,this.y,this._foregroundColor,this._backgroundColor,this._attributes)}getArrowChar(){switch(this._direction){case"up":return this._arrowChars.up;case"down":return this._arrowChars.down;case"left":return this._arrowChars.left;case"right":return this._arrowChars.right;default:return"?"}}}class ContentRenderable extends BoxRenderable{viewport;_viewportCulling;constructor(ctx,viewport,viewportCulling,options){super(ctx,options);this.viewport=viewport,this._viewportCulling=viewportCulling}get viewportCulling(){return this._viewportCulling}set viewportCulling(value){this._viewportCulling=value}_hasVisibleChildFilter(){return this._viewportCulling}_getVisibleChildren(){if(this._viewportCulling)return getObjectsInViewport({x:this.viewport.screenX,y:this.viewport.screenY,width:this.viewport.width,height:this.viewport.height},this.getChildrenSortedByPrimaryAxis(),this.primaryAxis,0).map((child)=>child.num);return super._getVisibleChildren()}}var SCROLLBOX_PADDING_KEYS=["padding","paddingX","paddingY","paddingTop","paddingRight","paddingBottom","paddingLeft"];function pickScrollBoxPadding(options){if(!options)return{};let picked={};for(let key of SCROLLBOX_PADDING_KEYS){let value=options[key];if(value!==void 0)picked[key]=value}return picked}function stripScrollBoxPadding(options){let sanitized={...options};for(let key of SCROLLBOX_PADDING_KEYS)delete sanitized[key];return sanitized}class ScrollBoxRenderable extends BoxRenderable{static idCounter=0;internalId=0;wrapper;viewport;content;horizontalScrollBar;verticalScrollBar;_focusable=!0;selectionListener;autoScrollMouseX=0;autoScrollMouseY=0;autoScrollThresholdVertical=3;autoScrollThresholdHorizontal=3;autoScrollSpeedSlow=6;autoScrollSpeedMedium=36;autoScrollSpeedFast=72;isAutoScrolling=!1;cachedAutoScrollSpeed=3;autoScrollAccumulatorX=0;autoScrollAccumulatorY=0;scrollAccumulatorX=0;scrollAccumulatorY=0;_stickyScroll;_stickyScrollTop=!1;_stickyScrollBottom=!1;_stickyScrollLeft=!1;_stickyScrollRight=!1;_stickyStart;_hasManualScroll=!1;_isApplyingStickyScroll=!1;scrollAccel;get stickyScroll(){return this._stickyScroll}set stickyScroll(value){this._stickyScroll=value,this.updateStickyState()}get stickyStart(){return this._stickyStart}set stickyStart(value){this._stickyStart=value,this.updateStickyState()}get scrollTop(){return this.verticalScrollBar.scrollPosition}set scrollTop(value){this.verticalScrollBar.scrollPosition=value,this.updateStickyState()}get scrollLeft(){return this.horizontalScrollBar.scrollPosition}set scrollLeft(value){this.horizontalScrollBar.scrollPosition=value,this.updateStickyState()}get scrollWidth(){return this.horizontalScrollBar.scrollSize}get scrollHeight(){return this.verticalScrollBar.scrollSize}updateStickyState(){if(!this._stickyScroll){this.syncManualScrollState();return}let maxScrollTop=Math.max(0,this.scrollHeight-this.viewport.height),maxScrollLeft=Math.max(0,this.scrollWidth-this.viewport.width);if(this.scrollTop<=0)this._stickyScrollTop=!0,this._stickyScrollBottom=!1;else if(this.scrollTop>=maxScrollTop)this._stickyScrollTop=!1,this._stickyScrollBottom=!0;else this._stickyScrollTop=!1,this._stickyScrollBottom=!1;if(this.scrollLeft<=0)this._stickyScrollLeft=!0,this._stickyScrollRight=!1;else if(this.scrollLeft>=maxScrollLeft)this._stickyScrollLeft=!1,this._stickyScrollRight=!0;else this._stickyScrollLeft=!1,this._stickyScrollRight=!1;this.syncManualScrollState()}syncManualScrollState(){if(!this._stickyScroll){this._hasManualScroll=!1;return}let maxScrollTop=Math.max(0,this.scrollHeight-this.viewport.height),maxScrollLeft=Math.max(0,this.scrollWidth-this.viewport.width),hasScrollableContent=maxScrollTop>1||maxScrollLeft>1;if(this._isApplyingStickyScroll){if(this._hasManualScroll&&hasScrollableContent&&this.isAtStickyPosition())this._hasManualScroll=!1;return}this._hasManualScroll=hasScrollableContent&&!this.isAtStickyPosition()}applyStickyStart(stickyStart){let wasApplyingStickyScroll=this._isApplyingStickyScroll;this._isApplyingStickyScroll=!0;try{switch(stickyStart){case"top":this._stickyScrollTop=!0,this._stickyScrollBottom=!1,this.verticalScrollBar.scrollPosition=0;break;case"bottom":this._stickyScrollTop=!1,this._stickyScrollBottom=!0,this.verticalScrollBar.scrollPosition=Math.max(0,this.scrollHeight-this.viewport.height);break;case"left":this._stickyScrollLeft=!0,this._stickyScrollRight=!1,this.horizontalScrollBar.scrollPosition=0;break;case"right":this._stickyScrollLeft=!1,this._stickyScrollRight=!0,this.horizontalScrollBar.scrollPosition=Math.max(0,this.scrollWidth-this.viewport.width);break}}finally{this._isApplyingStickyScroll=wasApplyingStickyScroll}}constructor(ctx,options){let{wrapperOptions,viewportOptions,contentOptions,rootOptions,scrollbarOptions,verticalScrollbarOptions,horizontalScrollbarOptions,stickyScroll=!1,stickyStart,scrollX=!1,scrollY=!0,scrollAcceleration,viewportCulling=!0,...rootBoxOptions}=options,forwardedContentPadding={...pickScrollBoxPadding(rootBoxOptions),...pickScrollBoxPadding(rootOptions)},sanitizedRootBoxOptions=stripScrollBoxPadding(rootBoxOptions),sanitizedRootOptions=rootOptions?stripScrollBoxPadding(rootOptions):void 0,mergedContentOptions={...forwardedContentPadding,...contentOptions};super(ctx,{flexDirection:"row",alignItems:"stretch",...sanitizedRootBoxOptions,...sanitizedRootOptions});if(this.internalId=ScrollBoxRenderable.idCounter++,this._stickyScroll=stickyScroll,this._stickyStart=stickyStart,this.scrollAccel=scrollAcceleration??new LinearScrollAccel,this.wrapper=new BoxRenderable(ctx,{flexDirection:"column",flexGrow:1,...wrapperOptions,id:`scroll-box-wrapper-${this.internalId}`}),super.add(this.wrapper),this.viewport=new BoxRenderable(ctx,{flexDirection:"column",flexGrow:1,overflow:"hidden",onSizeChange:()=>{this.recalculateBarProps()},...viewportOptions,id:`scroll-box-viewport-${this.internalId}`}),this.wrapper.add(this.viewport),this.content=new ContentRenderable(ctx,this.viewport,viewportCulling,{alignSelf:"flex-start",flexShrink:0,...scrollX?{minWidth:"100%"}:{minWidth:"100%",maxWidth:"100%"},...scrollY?{minHeight:"100%"}:{minHeight:"100%",maxHeight:"100%"},onSizeChange:()=>{this.recalculateBarProps()},...mergedContentOptions,id:`scroll-box-content-${this.internalId}`}),this.viewport.add(this.content),this.verticalScrollBar=new ScrollBarRenderable(ctx,{...scrollbarOptions,...verticalScrollbarOptions,arrowOptions:{...scrollbarOptions?.arrowOptions,...verticalScrollbarOptions?.arrowOptions},id:`scroll-box-vertical-scrollbar-${this.internalId}`,orientation:"vertical",onChange:(position)=>{this.content.translateY=-position,this.updateStickyState()}}),super.add(this.verticalScrollBar),this.horizontalScrollBar=new ScrollBarRenderable(ctx,{...scrollbarOptions,...horizontalScrollbarOptions,arrowOptions:{...scrollbarOptions?.arrowOptions,...horizontalScrollbarOptions?.arrowOptions},id:`scroll-box-horizontal-scrollbar-${this.internalId}`,orientation:"horizontal",onChange:(position)=>{this.content.translateX=-position,this.updateStickyState()}}),this.wrapper.add(this.horizontalScrollBar),this.recalculateBarProps(),stickyStart&&stickyScroll)this.applyStickyStart(stickyStart);this.selectionListener=()=>{let selection=this._ctx.getSelection();if(!selection||!selection.isDragging)this.stopAutoScroll()},this._ctx.on("selection",this.selectionListener)}onUpdate(deltaTime){this.handleAutoScroll(deltaTime)}scrollBy(delta,unit="absolute"){if(typeof delta==="number")this.verticalScrollBar.scrollBy(delta,unit);else this.verticalScrollBar.scrollBy(delta.y,unit),this.horizontalScrollBar.scrollBy(delta.x,unit)}scrollChildIntoView(childId){let child=this.content.findDescendantById(childId);if(!child)return;let getNearestDelta=(elementStart,elementEnd,viewportStart,viewportEnd)=>{let elementSize=elementEnd-elementStart,viewportSize=viewportEnd-viewportStart,elementStartOutside=elementStart<viewportStart,elementEndOutside=elementEnd>viewportEnd;if(elementStartOutside&&elementEndOutside)return 0;if(elementStartOutside&&elementSize<viewportSize||elementEndOutside&&elementSize>viewportSize)return elementStart-viewportStart;if(elementStartOutside&&elementSize>viewportSize||elementEndOutside&&elementSize<viewportSize)return elementEnd-viewportEnd;return 0},childTop=child.y,childBottom=child.y+child.height,viewportTop=this.viewport.y,viewportBottom=this.viewport.y+this.viewport.height,dy=getNearestDelta(childTop,childBottom,viewportTop,viewportBottom),childLeft=child.x,childRight=child.x+child.width,viewportLeft=this.viewport.x,viewportRight=this.viewport.x+this.viewport.width,dx=getNearestDelta(childLeft,childRight,viewportLeft,viewportRight);if(dx!==0||dy!==0)this.scrollBy({x:dx,y:dy})}scrollTo(position){if(typeof position==="number")this.scrollTop=position;else this.scrollTop=position.y,this.scrollLeft=position.x}isAtStickyPosition(){if(!this._stickyScroll||!this._stickyStart)return!1;let maxScrollTop=Math.max(0,this.scrollHeight-this.viewport.height),maxScrollLeft=Math.max(0,this.scrollWidth-this.viewport.width);switch(this._stickyStart){case"top":return this.scrollTop===0;case"bottom":return this.scrollTop>=maxScrollTop;case"left":return this.scrollLeft===0;case"right":return this.scrollLeft>=maxScrollLeft;default:return!1}}isAtStickyReengagePoint(stickyStart,maxScrollTop,maxScrollLeft){switch(stickyStart){case"top":return maxScrollTop>0&&this.scrollTop<=0;case"bottom":return maxScrollTop>0&&this.scrollTop>=maxScrollTop-1;case"left":return maxScrollLeft>0&&this.scrollLeft<=0;case"right":return maxScrollLeft>0&&this.scrollLeft>=maxScrollLeft-1}}add(obj,index){return this.content.add(obj,index)}insertBefore(obj,anchor){return this.content.insertBefore(obj,anchor)}remove(child){if(child.parent===this){super.remove(child);return}this.content.remove(child)}getChildren(){return this.content.getChildren()}getRenderable(id){return this.content.getRenderable(id)}onMouseEvent(event){if(event.type==="scroll"){let dir=event.scroll?.direction;if(event.modifiers.shift)dir=dir==="up"?"left":dir==="down"?"right":dir==="right"?"down":"up";let baseDelta=event.scroll?.delta??0,now=Date.now(),multiplier=this.scrollAccel.tick(now),scrollAmount=baseDelta*multiplier;if(dir==="up"){this.scrollAccumulatorY-=scrollAmount;let integerScroll=Math.trunc(this.scrollAccumulatorY);if(integerScroll!==0)this.scrollTop+=integerScroll,this.scrollAccumulatorY-=integerScroll}else if(dir==="down"){this.scrollAccumulatorY+=scrollAmount;let integerScroll=Math.trunc(this.scrollAccumulatorY);if(integerScroll!==0)this.scrollTop+=integerScroll,this.scrollAccumulatorY-=integerScroll}else if(dir==="left"){this.scrollAccumulatorX-=scrollAmount;let integerScroll=Math.trunc(this.scrollAccumulatorX);if(integerScroll!==0)this.scrollLeft+=integerScroll,this.scrollAccumulatorX-=integerScroll}else if(dir==="right"){this.scrollAccumulatorX+=scrollAmount;let integerScroll=Math.trunc(this.scrollAccumulatorX);if(integerScroll!==0)this.scrollLeft+=integerScroll,this.scrollAccumulatorX-=integerScroll}this.syncManualScrollState()}if(event.type==="drag"&&event.isDragging)this.updateAutoScroll(event.x,event.y);else if(event.type==="up")this.stopAutoScroll()}handleKeyPress(key){if(this.verticalScrollBar.handleKeyPress(key))return this.scrollAccel.reset(),this.resetScrollAccumulators(),this.syncManualScrollState(),!0;if(this.horizontalScrollBar.handleKeyPress(key))return this.scrollAccel.reset(),this.resetScrollAccumulators(),this.syncManualScrollState(),!0;return!1}resetScrollAccumulators(){this.scrollAccumulatorX=0,this.scrollAccumulatorY=0}startAutoScroll(mouseX,mouseY){if(this.stopAutoScroll(),this.autoScrollMouseX=mouseX,this.autoScrollMouseY=mouseY,this.cachedAutoScrollSpeed=this.getAutoScrollSpeed(mouseX,mouseY),this.isAutoScrolling=!0,!this.live)this.live=!0}updateAutoScroll(mouseX,mouseY){this.autoScrollMouseX=mouseX,this.autoScrollMouseY=mouseY,this.cachedAutoScrollSpeed=this.getAutoScrollSpeed(mouseX,mouseY);let scrollX=this.getAutoScrollDirectionX(mouseX),scrollY=this.getAutoScrollDirectionY(mouseY);if(scrollX===0&&scrollY===0)this.stopAutoScroll();else if(!this.isAutoScrolling)this.startAutoScroll(mouseX,mouseY)}stopAutoScroll(){let wasAutoScrolling=this.isAutoScrolling;if(this.isAutoScrolling=!1,this.autoScrollAccumulatorX=0,this.autoScrollAccumulatorY=0,wasAutoScrolling&&!this.hasOtherLiveReasons())this.live=!1}hasOtherLiveReasons(){return!1}handleAutoScroll(deltaTime){if(!this.isAutoScrolling)return;let scrollX=this.getAutoScrollDirectionX(this.autoScrollMouseX),scrollY=this.getAutoScrollDirectionY(this.autoScrollMouseY),scrollAmount=this.cachedAutoScrollSpeed*(deltaTime/1000),scrolled=!1;if(scrollX!==0){this.autoScrollAccumulatorX+=scrollX*scrollAmount;let integerScrollX=Math.trunc(this.autoScrollAccumulatorX);if(integerScrollX!==0)this.scrollLeft+=integerScrollX,this.autoScrollAccumulatorX-=integerScrollX,scrolled=!0}if(scrollY!==0){this.autoScrollAccumulatorY+=scrollY*scrollAmount;let integerScrollY=Math.trunc(this.autoScrollAccumulatorY);if(integerScrollY!==0)this.scrollTop+=integerScrollY,this.autoScrollAccumulatorY-=integerScrollY,scrolled=!0}if(scrolled)this._ctx.requestSelectionUpdate();if(scrollX===0&&scrollY===0)this.stopAutoScroll()}getAutoScrollDirectionX(mouseX){let relativeX=mouseX-this.x,distToLeft=relativeX,distToRight=this.width-relativeX;if(distToLeft<=this.autoScrollThresholdHorizontal)return this.scrollLeft>0?-1:0;else if(distToRight<=this.autoScrollThresholdHorizontal){let maxScrollLeft=this.scrollWidth-this.viewport.width;return this.scrollLeft<maxScrollLeft?1:0}return 0}getAutoScrollDirectionY(mouseY){let relativeY=mouseY-this.y,distToTop=relativeY,distToBottom=this.height-relativeY;if(distToTop<=this.autoScrollThresholdVertical)return this.scrollTop>0?-1:0;else if(distToBottom<=this.autoScrollThresholdVertical){let maxScrollTop=this.scrollHeight-this.viewport.height;return this.scrollTop<maxScrollTop?1:0}return 0}getAutoScrollSpeed(mouseX,mouseY){let relativeX=mouseX-this.x,relativeY=mouseY-this.y,distToLeft=relativeX,distToRight=this.width-relativeX,distToTop=relativeY,distToBottom=this.height-relativeY,minDistance=Math.min(distToLeft,distToRight,distToTop,distToBottom);if(minDistance<=1)return this.autoScrollSpeedFast;else if(minDistance<=2)return this.autoScrollSpeedMedium;else return this.autoScrollSpeedSlow}recalculateBarProps(){let wasApplyingStickyScroll=this._isApplyingStickyScroll;this._isApplyingStickyScroll=!0;try{if(this.verticalScrollBar.scrollSize=this.content.height,this.verticalScrollBar.viewportSize=this.viewport.height,this.horizontalScrollBar.scrollSize=this.content.width,this.horizontalScrollBar.viewportSize=this.viewport.width,this._stickyScroll){let newMaxScrollTop=Math.max(0,this.scrollHeight-this.viewport.height),newMaxScrollLeft=Math.max(0,this.scrollWidth-this.viewport.width),stickyStart=this._stickyStart;if(stickyStart&&!this._hasManualScroll)this.applyStickyStart(stickyStart);else if(stickyStart&&this._hasManualScroll&&this.isAtStickyReengagePoint(stickyStart,newMaxScrollTop,newMaxScrollLeft))this._hasManualScroll=!1,this.applyStickyStart(stickyStart);else if(!this._hasManualScroll){if(this._stickyScrollTop)this.scrollTop=0;else if(this._stickyScrollBottom&&newMaxScrollTop>0)this.scrollTop=newMaxScrollTop;if(this._stickyScrollLeft)this.scrollLeft=0;else if(this._stickyScrollRight&&newMaxScrollLeft>0)this.scrollLeft=newMaxScrollLeft}}}finally{this._isApplyingStickyScroll=wasApplyingStickyScroll}process.nextTick(()=>{this.requestRender()})}set padding(value){this.content.padding=value,this.requestRender()}set paddingX(value){this.content.paddingX=value,this.requestRender()}set paddingY(value){this.content.paddingY=value,this.requestRender()}set paddingTop(value){this.content.paddingTop=value,this.requestRender()}set paddingRight(value){this.content.paddingRight=value,this.requestRender()}set paddingBottom(value){this.content.paddingBottom=value,this.requestRender()}set paddingLeft(value){this.content.paddingLeft=value,this.requestRender()}set rootOptions(options){Object.assign(this,options),this.requestRender()}set wrapperOptions(options){Object.assign(this.wrapper,options),this.requestRender()}set viewportOptions(options){Object.assign(this.viewport,options),this.requestRender()}set contentOptions(options){Object.assign(this.content,options),this.requestRender()}set scrollbarOptions(options){Object.assign(this.verticalScrollBar,options),Object.assign(this.horizontalScrollBar,options),this.requestRender()}set verticalScrollbarOptions(options){Object.assign(this.verticalScrollBar,options),this.requestRender()}set horizontalScrollbarOptions(options){Object.assign(this.horizontalScrollBar,options),this.requestRender()}get scrollAcceleration(){return this.scrollAccel}set scrollAcceleration(value){this.scrollAccel=value}get viewportCulling(){return this.content.viewportCulling}set viewportCulling(value){this.content.viewportCulling=value,this.requestRender()}destroySelf(){if(this.selectionListener)this._ctx.off("selection",this.selectionListener),this.selectionListener=void 0;super.destroySelf()}}var defaultSelectKeybindings=[{name:"up",action:"move-up"},{name:"k",action:"move-up"},{name:"down",action:"move-down"},{name:"j",action:"move-down"},{name:"up",shift:!0,action:"move-up-fast"},{name:"down",shift:!0,action:"move-down-fast"},{name:"return",action:"select-current"},{name:"linefeed",action:"select-current"}],SelectRenderableEvents;((SelectRenderableEvents2)=>{SelectRenderableEvents2.SELECTION_CHANGED="selectionChanged",SelectRenderableEvents2.ITEM_SELECTED="itemSelected"})(SelectRenderableEvents||={});class SelectRenderable extends Renderable{_focusable=!0;_options=[];_selectedIndex=0;scrollOffset=0;maxVisibleItems;_backgroundColor;_textColor;_focusedBackgroundColor;_focusedTextColor;_selectedBackgroundColor;_selectedTextColor;_descriptionColor;_selectedDescriptionColor;_showScrollIndicator;_wrapSelection;_showDescription;_showSelectionIndicator;_font;_itemSpacing;linesPerItem;fontHeight;_fastScrollStep;_keyBindingsMap;_keyAliasMap;_keyBindings;_defaultOptions={backgroundColor:"transparent",textColor:"#FFFFFF",focusedBackgroundColor:"#1a1a1a",focusedTextColor:"#FFFFFF",selectedBackgroundColor:"#334455",selectedTextColor:"#FFFF00",selectedIndex:0,descriptionColor:"#888888",selectedDescriptionColor:"#CCCCCC",showScrollIndicator:!1,wrapSelection:!1,showDescription:!0,showSelectionIndicator:!0,itemSpacing:0,fastScrollStep:5};constructor(ctx,options){super(ctx,{...options,buffered:!0});this._options=options.options||[];let requestedIndex=options.selectedIndex??this._defaultOptions.selectedIndex;this._selectedIndex=this._options.length>0?Math.min(requestedIndex,this._options.length-1):0,this._backgroundColor=parseColor(options.backgroundColor||this._defaultOptions.backgroundColor),this._textColor=parseColor(options.textColor||this._defaultOptions.textColor),this._focusedBackgroundColor=parseColor(options.focusedBackgroundColor||this._defaultOptions.focusedBackgroundColor),this._focusedTextColor=parseColor(options.focusedTextColor||this._defaultOptions.focusedTextColor),this._showScrollIndicator=options.showScrollIndicator??this._defaultOptions.showScrollIndicator,this._wrapSelection=options.wrapSelection??this._defaultOptions.wrapSelection,this._showDescription=options.showDescription??this._defaultOptions.showDescription,this._showSelectionIndicator=options.showSelectionIndicator??this._defaultOptions.showSelectionIndicator,this._font=options.font,this._itemSpacing=options.itemSpacing||this._defaultOptions.itemSpacing,this.fontHeight=this._font?measureText({text:"A",font:this._font}).height:1,this.linesPerItem=this._showDescription?this._font?this.fontHeight+1:2:this._font?this.fontHeight:1,this.linesPerItem+=this._itemSpacing,this.maxVisibleItems=Math.max(1,Math.floor(this.height/this.linesPerItem)),this._selectedBackgroundColor=parseColor(options.selectedBackgroundColor||this._defaultOptions.selectedBackgroundColor),this._selectedTextColor=parseColor(options.selectedTextColor||this._defaultOptions.selectedTextColor),this._descriptionColor=parseColor(options.descriptionColor||this._defaultOptions.descriptionColor),this._selectedDescriptionColor=parseColor(options.selectedDescriptionColor||this._defaultOptions.selectedDescriptionColor),this._fastScrollStep=options.fastScrollStep||this._defaultOptions.fastScrollStep,this._keyAliasMap=mergeKeyAliases(defaultKeyAliases,options.keyAliasMap||{}),this._keyBindings=options.keyBindings||[];let mergedBindings=mergeKeyBindings(defaultSelectKeybindings,this._keyBindings);this._keyBindingsMap=buildKeyBindingsMap(mergedBindings,this._keyAliasMap),this.updateScrollOffset(),this.requestRender()}renderSelf(buffer,deltaTime){if(!this.visible||!this.frameBuffer)return;if(this.isDirty)this.refreshFrameBuffer()}refreshFrameBuffer(){if(!this.frameBuffer)return;let bgColor=this._focused?this._focusedBackgroundColor:this._backgroundColor;if(this.frameBuffer.clear(bgColor),this._options.length===0)return;let contentX=0,contentY=0,contentWidth=this.width,contentHeight=this.height,visibleOptions=this._options.slice(this.scrollOffset,this.scrollOffset+this.maxVisibleItems);for(let i=0;i<visibleOptions.length;i++){let actualIndex=this.scrollOffset+i,option=visibleOptions[i],isSelected=actualIndex===this._selectedIndex,itemY=contentY+i*this.linesPerItem;if(itemY+this.linesPerItem-1>=contentY+contentHeight)break;if(isSelected){let contentHeight2=this.linesPerItem-this._itemSpacing;this.frameBuffer.fillRect(contentX,itemY,contentWidth,contentHeight2,this._selectedBackgroundColor)}let indicator=this._showSelectionIndicator?isSelected?"\u25B6 ":" ":"",indicatorWidth=this._showSelectionIndicator?2:0,nameContent=`${indicator}${option.name}`,baseTextColor=this._focused?this._focusedTextColor:this._textColor,nameColor=isSelected?this._selectedTextColor:baseTextColor,textX=contentX+1+indicatorWidth;if(this._font){if(indicator)this.frameBuffer.drawText(indicator,contentX+1,itemY,nameColor);renderFontToFrameBuffer(this.frameBuffer,{text:option.name,x:textX,y:itemY,color:nameColor,backgroundColor:isSelected?this._selectedBackgroundColor:bgColor,font:this._font})}else this.frameBuffer.drawText(nameContent,contentX+1,itemY,nameColor);if(this._showDescription&&itemY+this.fontHeight<contentY+contentHeight){let descColor=isSelected?this._selectedDescriptionColor:this._descriptionColor;this.frameBuffer.drawText(option.description,textX,itemY+this.fontHeight,descColor)}}if(this._showScrollIndicator&&this._options.length>this.maxVisibleItems)this.renderScrollIndicatorToFrameBuffer(contentX,contentY,contentWidth,contentHeight)}renderScrollIndicatorToFrameBuffer(contentX,contentY,contentWidth,contentHeight){if(!this.frameBuffer)return;let maxScrollOffset=this._options.length-this.maxVisibleItems,scrollPercent=this.scrollOffset/maxScrollOffset,indicatorHeight=Math.max(1,contentHeight-2),indicatorY=contentY+1+Math.floor(scrollPercent*indicatorHeight),indicatorX=contentX+contentWidth-1;this.frameBuffer.drawText("\u2588",indicatorX,indicatorY,parseColor("#666666"))}get options(){return this._options}set options(options){this._options=options,this._selectedIndex=Math.min(this._selectedIndex,Math.max(0,options.length-1)),this.updateScrollOffset(),this.requestRender()}getSelectedOption(){return this._options[this._selectedIndex]||null}getSelectedIndex(){return this._selectedIndex}moveUp(steps=1){let newIndex=this._selectedIndex-steps;if(newIndex>=0)this._selectedIndex=newIndex;else if(this._wrapSelection&&this._options.length>0)this._selectedIndex=this._options.length-1;else this._selectedIndex=0;this.updateScrollOffset(),this.requestRender(),this.emit("selectionChanged",this._selectedIndex,this.getSelectedOption())}moveDown(steps=1){let newIndex=this._selectedIndex+steps;if(newIndex<this._options.length)this._selectedIndex=newIndex;else if(this._wrapSelection&&this._options.length>0)this._selectedIndex=0;else this._selectedIndex=this._options.length-1;this.updateScrollOffset(),this.requestRender(),this.emit("selectionChanged",this._selectedIndex,this.getSelectedOption())}selectCurrent(){let selected=this.getSelectedOption();if(selected)this.emit("itemSelected",this._selectedIndex,selected)}setSelectedIndex(index){if(index>=0&&index<this._options.length)this._selectedIndex=index,this.updateScrollOffset(),this.requestRender(),this.emit("selectionChanged",this._selectedIndex,this.getSelectedOption())}updateScrollOffset(){if(!this._options)return;let halfVisible=Math.floor(this.maxVisibleItems/2),newScrollOffset=Math.max(0,Math.min(this._selectedIndex-halfVisible,this._options.length-this.maxVisibleItems));if(newScrollOffset!==this.scrollOffset)this.scrollOffset=newScrollOffset,this.requestRender()}onResize(width,height){this.maxVisibleItems=Math.max(1,Math.floor(height/this.linesPerItem)),this.updateScrollOffset(),this.requestRender()}handleKeyPress(key){let action=getKeyBindingAction(this._keyBindingsMap,key);if(action)switch(action){case"move-up":return this.moveUp(1),!0;case"move-down":return this.moveDown(1),!0;case"move-up-fast":return this.moveUp(this._fastScrollStep),!0;case"move-down-fast":return this.moveDown(this._fastScrollStep),!0;case"select-current":return this.selectCurrent(),!0}return!1}get showScrollIndicator(){return this._showScrollIndicator}set showScrollIndicator(show){this._showScrollIndicator=show,this.requestRender()}get showDescription(){return this._showDescription}set showDescription(show){if(this._showDescription!==show)this._showDescription=show,this.linesPerItem=this._showDescription?this._font?this.fontHeight+1:2:this._font?this.fontHeight:1,this.linesPerItem+=this._itemSpacing,this.maxVisibleItems=Math.max(1,Math.floor(this.height/this.linesPerItem)),this.updateScrollOffset(),this.requestRender()}get showSelectionIndicator(){return this._showSelectionIndicator}set showSelectionIndicator(show){let next=show??this._defaultOptions.showSelectionIndicator;if(this._showSelectionIndicator!==next)this._showSelectionIndicator=next,this.requestRender()}get wrapSelection(){return this._wrapSelection}set wrapSelection(wrap){this._wrapSelection=wrap}set backgroundColor(value){let newColor=parseColor(value??this._defaultOptions.backgroundColor);if(this._backgroundColor!==newColor)this._backgroundColor=newColor,this.requestRender()}set textColor(value){let newColor=parseColor(value??this._defaultOptions.textColor);if(this._textColor!==newColor)this._textColor=newColor,this.requestRender()}set focusedBackgroundColor(value){let newColor=parseColor(value??this._defaultOptions.focusedBackgroundColor);if(this._focusedBackgroundColor!==newColor)this._focusedBackgroundColor=newColor,this.requestRender()}set focusedTextColor(value){let newColor=parseColor(value??this._defaultOptions.focusedTextColor);if(this._focusedTextColor!==newColor)this._focusedTextColor=newColor,this.requestRender()}set selectedBackgroundColor(value){let newColor=parseColor(value??this._defaultOptions.selectedBackgroundColor);if(this._selectedBackgroundColor!==newColor)this._selectedBackgroundColor=newColor,this.requestRender()}set selectedTextColor(value){let newColor=parseColor(value??this._defaultOptions.selectedTextColor);if(this._selectedTextColor!==newColor)this._selectedTextColor=newColor,this.requestRender()}set descriptionColor(value){let newColor=parseColor(value??this._defaultOptions.descriptionColor);if(this._descriptionColor!==newColor)this._descriptionColor=newColor,this.requestRender()}set selectedDescriptionColor(value){let newColor=parseColor(value??this._defaultOptions.selectedDescriptionColor);if(this._selectedDescriptionColor!==newColor)this._selectedDescriptionColor=newColor,this.requestRender()}set font(font){this._font=font,this.fontHeight=measureText({text:"A",font:this._font}).height,this.linesPerItem=this._showDescription?this._font?this.fontHeight+1:2:this._font?this.fontHeight:1,this.linesPerItem+=this._itemSpacing,this.maxVisibleItems=Math.max(1,Math.floor(this.height/this.linesPerItem)),this.updateScrollOffset(),this.requestRender()}set itemSpacing(spacing){this._itemSpacing=spacing,this.linesPerItem=this._showDescription?this._font?this.fontHeight+1:2:this._font?this.fontHeight:1,this.linesPerItem+=this._itemSpacing,this.maxVisibleItems=Math.max(1,Math.floor(this.height/this.linesPerItem)),this.updateScrollOffset(),this.requestRender()}set fastScrollStep(step){this._fastScrollStep=step}set keyBindings(bindings){this._keyBindings=bindings;let mergedBindings=mergeKeyBindings(defaultSelectKeybindings,bindings);this._keyBindingsMap=buildKeyBindingsMap(mergedBindings,this._keyAliasMap)}set keyAliasMap(aliases){this._keyAliasMap=mergeKeyAliases(defaultKeyAliases,aliases);let mergedBindings=mergeKeyBindings(defaultSelectKeybindings,this._keyBindings);this._keyBindingsMap=buildKeyBindingsMap(mergedBindings,this._keyAliasMap)}set selectedIndex(value){let newIndex=value??this._defaultOptions.selectedIndex,clampedIndex=this._options.length>0?Math.min(Math.max(0,newIndex),this._options.length-1):0;if(this._selectedIndex!==clampedIndex)this._selectedIndex=clampedIndex,this.updateScrollOffset(),this.requestRender()}}var defaultTabSelectKeybindings=[{name:"left",action:"move-left"},{name:"[",action:"move-left"},{name:"right",action:"move-right"},{name:"]",action:"move-right"},{name:"return",action:"select-current"},{name:"linefeed",action:"select-current"}],TabSelectRenderableEvents;((TabSelectRenderableEvents2)=>{TabSelectRenderableEvents2.SELECTION_CHANGED="selectionChanged",TabSelectRenderableEvents2.ITEM_SELECTED="itemSelected"})(TabSelectRenderableEvents||={});function calculateDynamicHeight(showUnderline,showDescription){let height=1;if(showUnderline)height+=1;if(showDescription)height+=1;return height}class TabSelectRenderable extends Renderable{_focusable=!0;_options=[];selectedIndex=0;scrollOffset=0;_tabWidth;maxVisibleTabs;_backgroundColor;_textColor;_focusedBackgroundColor;_focusedTextColor;_selectedBackgroundColor;_selectedTextColor;_selectedDescriptionColor;_showScrollArrows;_showDescription;_showUnderline;_wrapSelection;_keyBindingsMap;_keyAliasMap;_keyBindings;constructor(ctx,options){let calculatedHeight=calculateDynamicHeight(options.showUnderline??!0,options.showDescription??!0);super(ctx,{...options,height:calculatedHeight,buffered:!0});this._backgroundColor=parseColor(options.backgroundColor||"transparent"),this._textColor=parseColor(options.textColor||"#FFFFFF"),this._focusedBackgroundColor=parseColor(options.focusedBackgroundColor||options.backgroundColor||"#1a1a1a"),this._focusedTextColor=parseColor(options.focusedTextColor||options.textColor||"#FFFFFF"),this._options=options.options||[],this._tabWidth=options.tabWidth||20,this._showDescription=options.showDescription??!0,this._showUnderline=options.showUnderline??!0,this._showScrollArrows=options.showScrollArrows??!0,this._wrapSelection=options.wrapSelection??!1,this.maxVisibleTabs=Math.max(1,Math.floor(this.width/this._tabWidth)),this._selectedBackgroundColor=parseColor(options.selectedBackgroundColor||"#334455"),this._selectedTextColor=parseColor(options.selectedTextColor||"#FFFF00"),this._selectedDescriptionColor=parseColor(options.selectedDescriptionColor||"#CCCCCC"),this._keyAliasMap=mergeKeyAliases(defaultKeyAliases,options.keyAliasMap||{}),this._keyBindings=options.keyBindings||[];let mergedBindings=mergeKeyBindings(defaultTabSelectKeybindings,this._keyBindings);this._keyBindingsMap=buildKeyBindingsMap(mergedBindings,this._keyAliasMap)}calculateDynamicHeight(){return calculateDynamicHeight(this._showUnderline,this._showDescription)}renderSelf(buffer,deltaTime){if(!this.visible||!this.frameBuffer)return;if(this.isDirty)this.refreshFrameBuffer()}refreshFrameBuffer(){if(!this.frameBuffer)return;let bgColor=this._focused?this._focusedBackgroundColor:this._backgroundColor;if(this.frameBuffer.clear(bgColor),this._options.length===0)return;let contentX=0,contentY=0,contentWidth=this.width,contentHeight=this.height,visibleOptions=this._options.slice(this.scrollOffset,this.scrollOffset+this.maxVisibleTabs);for(let i=0;i<visibleOptions.length;i++){let actualIndex=this.scrollOffset+i,option=visibleOptions[i],isSelected=actualIndex===this.selectedIndex,tabX=contentX+i*this._tabWidth;if(tabX>=contentX+contentWidth)break;let actualTabWidth=Math.min(this._tabWidth,contentWidth-i*this._tabWidth);if(isSelected)this.frameBuffer.fillRect(tabX,contentY,actualTabWidth,1,this._selectedBackgroundColor);let baseTextColor=this._focused?this._focusedTextColor:this._textColor,nameColor=isSelected?this._selectedTextColor:baseTextColor,nameContent=this.truncateText(option.name,actualTabWidth-2);if(this.frameBuffer.drawText(nameContent,tabX+1,contentY,nameColor),isSelected&&this._showUnderline&&contentHeight>=2){let underlineY=contentY+1,underlineBg=isSelected?this._selectedBackgroundColor:bgColor;this.frameBuffer.drawText("\u25AC".repeat(actualTabWidth),tabX,underlineY,nameColor,underlineBg)}}if(this._showDescription&&contentHeight>=(this._showUnderline?3:2)){let selectedOption=this.getSelectedOption();if(selectedOption){let descriptionY=contentY+(this._showUnderline?2:1),descColor=this._selectedDescriptionColor,descContent=this.truncateText(selectedOption.description,contentWidth-2);this.frameBuffer.drawText(descContent,contentX+1,descriptionY,descColor)}}if(this._showScrollArrows&&this._options.length>this.maxVisibleTabs)this.renderScrollArrowsToFrameBuffer(contentX,contentY,contentWidth,contentHeight)}truncateText(text,maxWidth){if(text.length<=maxWidth)return text;return text.substring(0,Math.max(0,maxWidth-1))+"\u2026"}renderScrollArrowsToFrameBuffer(contentX,contentY,contentWidth,contentHeight){if(!this.frameBuffer)return;let hasMoreLeft=this.scrollOffset>0,hasMoreRight=this.scrollOffset+this.maxVisibleTabs<this._options.length;if(hasMoreLeft)this.frameBuffer.drawText("\u2039",contentX,contentY,parseColor("#AAAAAA"));if(hasMoreRight)this.frameBuffer.drawText("\u203A",contentX+contentWidth-1,contentY,parseColor("#AAAAAA"))}setOptions(options){this._options=options,this.selectedIndex=Math.min(this.selectedIndex,Math.max(0,options.length-1)),this.updateScrollOffset(),this.requestRender()}getSelectedOption(){return this._options[this.selectedIndex]||null}getSelectedIndex(){return this.selectedIndex}moveLeft(){if(this.selectedIndex>0)this.selectedIndex--;else if(this._wrapSelection&&this._options.length>0)this.selectedIndex=this._options.length-1;else return;this.updateScrollOffset(),this.requestRender(),this.emit("selectionChanged",this.selectedIndex,this.getSelectedOption())}moveRight(){if(this.selectedIndex<this._options.length-1)this.selectedIndex++;else if(this._wrapSelection&&this._options.length>0)this.selectedIndex=0;else return;this.updateScrollOffset(),this.requestRender(),this.emit("selectionChanged",this.selectedIndex,this.getSelectedOption())}selectCurrent(){let selected=this.getSelectedOption();if(selected)this.emit("itemSelected",this.selectedIndex,selected)}setSelectedIndex(index){if(index>=0&&index<this._options.length)this.selectedIndex=index,this.updateScrollOffset(),this.requestRender(),this.emit("selectionChanged",this.selectedIndex,this.getSelectedOption())}updateScrollOffset(){let halfVisible=Math.floor(this.maxVisibleTabs/2),newScrollOffset=Math.max(0,Math.min(this.selectedIndex-halfVisible,this._options.length-this.maxVisibleTabs));if(newScrollOffset!==this.scrollOffset)this.scrollOffset=newScrollOffset,this.requestRender()}onResize(width,height){this.maxVisibleTabs=Math.max(1,Math.floor(width/this._tabWidth)),this.updateScrollOffset(),this.requestRender()}setTabWidth(tabWidth){if(this._tabWidth===tabWidth)return;this._tabWidth=tabWidth,this.maxVisibleTabs=Math.max(1,Math.floor(this.width/this._tabWidth)),this.updateScrollOffset(),this.requestRender()}getTabWidth(){return this._tabWidth}handleKeyPress(key){let action=getKeyBindingAction(this._keyBindingsMap,key);if(action)switch(action){case"move-left":return this.moveLeft(),!0;case"move-right":return this.moveRight(),!0;case"select-current":return this.selectCurrent(),!0}return!1}get options(){return this._options}set options(options){this._options=options,this.selectedIndex=Math.min(this.selectedIndex,Math.max(0,options.length-1)),this.updateScrollOffset(),this.requestRender()}set backgroundColor(color){this._backgroundColor=parseColor(color),this.requestRender()}set textColor(color){this._textColor=parseColor(color),this.requestRender()}set focusedBackgroundColor(color){this._focusedBackgroundColor=parseColor(color),this.requestRender()}set focusedTextColor(color){this._focusedTextColor=parseColor(color),this.requestRender()}set selectedBackgroundColor(color){this._selectedBackgroundColor=parseColor(color),this.requestRender()}set selectedTextColor(color){this._selectedTextColor=parseColor(color),this.requestRender()}set selectedDescriptionColor(color){this._selectedDescriptionColor=parseColor(color),this.requestRender()}get showDescription(){return this._showDescription}set showDescription(show){if(this._showDescription!==show){this._showDescription=show;let newHeight=this.calculateDynamicHeight();this.height=newHeight,this.requestRender()}}get showUnderline(){return this._showUnderline}set showUnderline(show){if(this._showUnderline!==show){this._showUnderline=show;let newHeight=this.calculateDynamicHeight();this.height=newHeight,this.requestRender()}}get showScrollArrows(){return this._showScrollArrows}set showScrollArrows(show){if(this._showScrollArrows!==show)this._showScrollArrows=show,this.requestRender()}get wrapSelection(){return this._wrapSelection}set wrapSelection(wrap){this._wrapSelection=wrap}get tabWidth(){return this._tabWidth}set tabWidth(tabWidth){if(this._tabWidth===tabWidth)return;this._tabWidth=tabWidth,this.maxVisibleTabs=Math.max(1,Math.floor(this.width/this._tabWidth)),this.updateScrollOffset(),this.requestRender()}set keyBindings(bindings){this._keyBindings=bindings;let mergedBindings=mergeKeyBindings(defaultTabSelectKeybindings,bindings);this._keyBindingsMap=buildKeyBindingsMap(mergedBindings,this._keyAliasMap)}set keyAliasMap(aliases){this._keyAliasMap=mergeKeyAliases(defaultKeyAliases,aliases);let mergedBindings=mergeKeyBindings(defaultTabSelectKeybindings,this._keyBindings);this._keyBindingsMap=buildKeyBindingsMap(mergedBindings,this._keyAliasMap)}}class TimeToFirstDrawRenderable extends Renderable{_runtimeMs=null;textColor;label;precision;constructor(ctx,options={}){super(ctx,{width:"100%",height:1,flexShrink:0,alignSelf:"center",...options});this.textColor=parseColor(options.fg??"#AAAAAA"),this.label=options.label??"Time to first draw",this.precision=this.normalizePrecision(options.precision??2)}get runtimeMs(){return this._runtimeMs}set fg(value){this.textColor=parseColor(value),this.requestRender()}set color(value){this.fg=value}set textLabel(value){if(value===this.label)return;this.label=value,this.requestRender()}set decimals(value){let nextPrecision=this.normalizePrecision(value);if(nextPrecision===this.precision)return;this.precision=nextPrecision,this.requestRender()}reset(){this._runtimeMs=null,this.requestRender()}renderSelf(buffer){if(this._runtimeMs===null)this._runtimeMs=performance.now();let content=`${this.label}: ${this._runtimeMs.toFixed(this.precision)}ms`,maxWidth=Math.max(this.width,1),visibleContent=content.length>maxWidth?content.slice(0,maxWidth):content,centeredX=this.x+Math.max(0,Math.floor((maxWidth-visibleContent.length)/2));buffer.drawText(visibleContent,centeredX,this.y,this.textColor)}normalizePrecision(value){if(!Number.isFinite(value))return 2;return Math.max(0,Math.floor(value))}}var import_react=__toESM(require_react_production(),1);var import_react2=__toESM(require_react_production(),1),import_react3=__toESM(require_react_production(),1);var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");function jsxProd(type,config,maybeKey){var key=null;if(maybeKey!==void 0&&(key=""+maybeKey),config.key!==void 0&&(key=""+config.key),"key"in config){maybeKey={};for(var propName in config)propName!=="key"&&(maybeKey[propName]=config[propName])}else maybeKey=config;return config=maybeKey.ref,{$$typeof:REACT_ELEMENT_TYPE,type,key,ref:config!==void 0?config:null,props:maybeKey}}var $Fragment=REACT_FRAGMENT_TYPE,$jsx=jsxProd,$jsxs=jsxProd;var jsxDEV=$jsx;var import_react_reconciler=__toESM(require_react_reconciler_production(),1);var $ConcurrentRoot=1;var $DefaultEventPriority=32;var $NoEventPriority=0;var import_react4=__toESM(require_react_production(),1);var textNodeKeys=["span","b","strong","i","em","u","br","a"];class SpanRenderable extends TextNodeRenderable{ctx;constructor(ctx,options){super(options);this.ctx=ctx}}class TextModifierRenderable extends SpanRenderable{constructor(options,modifier){super(null,options);if(modifier==="b"||modifier==="strong")this.attributes=(this.attributes||0)|TextAttributes.BOLD;else if(modifier==="i"||modifier==="em")this.attributes=(this.attributes||0)|TextAttributes.ITALIC;else if(modifier==="u")this.attributes=(this.attributes||0)|TextAttributes.UNDERLINE}}class BoldSpanRenderable extends TextModifierRenderable{constructor(_ctx,options){super(options,"b")}}class ItalicSpanRenderable extends TextModifierRenderable{constructor(_ctx,options){super(options,"i")}}class UnderlineSpanRenderable extends TextModifierRenderable{constructor(_ctx,options){super(options,"u")}}class LineBreakRenderable extends SpanRenderable{constructor(_ctx,options){super(null,options);this.add()}add(){return super.add(`
|
|
3672
|
-
`)}}class LinkRenderable extends SpanRenderable{constructor(_ctx,options){let linkOptions={...options,link:{url:options.href}};super(null,linkOptions)}}var baseComponents={box:BoxRenderable,text:TextRenderable,code:CodeRenderable,diff:DiffRenderable,markdown:MarkdownRenderable,input:InputRenderable,select:SelectRenderable,textarea:TextareaRenderable,scrollbox:ScrollBoxRenderable,"ascii-font":ASCIIFontRenderable,"tab-select":TabSelectRenderable,"line-number":LineNumberRenderable,span:SpanRenderable,br:LineBreakRenderable,b:BoldSpanRenderable,strong:BoldSpanRenderable,i:ItalicSpanRenderable,em:ItalicSpanRenderable,u:UnderlineSpanRenderable,a:LinkRenderable},componentCatalogue={...baseComponents};function extend(objects){Object.assign(componentCatalogue,objects)}function getComponentCatalogue(){return componentCatalogue}var AppContext=import_react.createContext({keyHandler:null,renderer:null}),useAppContext=()=>{return import_react.useContext(AppContext)};class ErrorBoundary extends import_react3.default.Component{constructor(props){super(props);this.state={hasError:!1,error:null}}static getDerivedStateFromError(error){return{hasError:!0,error}}render(){if(this.state.hasError&&this.state.error)return jsxDEV("box",{style:{flexDirection:"column",padding:2},children:jsxDEV("text",{fg:"red",children:this.state.error.stack||this.state.error.message},void 0,!1,void 0,this)},void 0,!1,void 0,this);return this.props.children}}var package_default={name:"@opentui/react",version:"0.4.3",description:"React renderer for building terminal user interfaces using OpenTUI core",license:"MIT",repository:{type:"git",url:"https://github.com/anomalyco/opentui",directory:"packages/react"},module:"src/index.ts",type:"module",private:!0,main:"src/index.ts",exports:{".":{import:"./src/index.ts",types:"./src/index.ts"},"./test-utils":{import:"./src/test-utils.ts",types:"./src/test-utils.d.ts"},"./runtime-plugin-support":{import:"./scripts/runtime-plugin-support.ts",types:"./scripts/runtime-plugin-support.ts"},"./runtime-plugin-support/configure":{import:"./scripts/runtime-plugin-support-configure.ts",types:"./scripts/runtime-plugin-support-configure.ts"},"./jsx-runtime":{import:"./jsx-runtime.js",types:"./jsx-runtime.d.ts"},"./jsx-dev-runtime":{import:"./jsx-dev-runtime.js",types:"./jsx-dev-runtime.d.ts"}},scripts:{build:"bun run scripts/build.ts","build:examples":"bun examples/build.ts","build:dev":"bun run scripts/build.ts --dev",publish:"bun run scripts/publish.ts",test:"bun test"},devDependencies:{"@opentui/keymap":"workspace:*","@types/bun":"latest","@types/node":"^24.0.0","@types/react":"^19.2.0","@types/react-reconciler":"^0.33.0","@types/ws":"^8.18.1",react:">=19.2.0","react-devtools-core":"^7.0.1",typescript:"^5",ws:"^8.18.0"},peerDependencies:{react:">=19.2.0","react-devtools-core":"^7.0.1",ws:"^8.18.0"},peerDependenciesMeta:{"react-devtools-core":{optional:!0},ws:{optional:!0}},dependencies:{"@opentui/core":"workspace:*","react-reconciler":"^0.33.0"}},idCounter=new Map;function getNextId(type){if(!idCounter.has(type))idCounter.set(type,0);let value=idCounter.get(type)+1;return idCounter.set(type,value),`${type}-${value}`}function initEventListeners(instance,eventName,listener,previousListener){if(previousListener)instance.off(eventName,previousListener);if(listener)instance.on(eventName,listener)}function setStyle(instance,styles,oldStyles){if(oldStyles!=null&&typeof oldStyles==="object"){for(let styleName in oldStyles)if(oldStyles.hasOwnProperty(styleName)){if(styles==null||!styles.hasOwnProperty(styleName))instance[styleName]=null}}if(styles!=null&&typeof styles==="object"){for(let styleName in styles)if(styles.hasOwnProperty(styleName)){let value=styles[styleName],oldValue=oldStyles?.[styleName];if(value!==oldValue)instance[styleName]=value}}}function setProperty(instance,type,propKey,propValue,oldPropValue){switch(propKey){case"onChange":if(instance instanceof InputRenderable)initEventListeners(instance,InputRenderableEvents.CHANGE,propValue,oldPropValue);else if(instance instanceof SelectRenderable)initEventListeners(instance,SelectRenderableEvents.SELECTION_CHANGED,propValue,oldPropValue);else if(instance instanceof TabSelectRenderable)initEventListeners(instance,TabSelectRenderableEvents.SELECTION_CHANGED,propValue,oldPropValue);break;case"onInput":if(instance instanceof InputRenderable)initEventListeners(instance,InputRenderableEvents.INPUT,propValue,oldPropValue);break;case"onSubmit":if(instance instanceof InputRenderable)initEventListeners(instance,InputRenderableEvents.ENTER,propValue,oldPropValue);else if(instance instanceof TextareaRenderable)instance.onSubmit=propValue;break;case"onSelect":if(instance instanceof SelectRenderable)initEventListeners(instance,SelectRenderableEvents.ITEM_SELECTED,propValue,oldPropValue);else if(instance instanceof TabSelectRenderable)initEventListeners(instance,TabSelectRenderableEvents.ITEM_SELECTED,propValue,oldPropValue);break;case"focused":if(isRenderable(instance))if(propValue)instance.focus();else instance.blur();break;case"style":setStyle(instance,propValue,oldPropValue);break;case"children":break;default:instance[propKey]=propValue}}function setInitialProperties(instance,type,props){for(let propKey in props){if(!props.hasOwnProperty(propKey))continue;let propValue=props[propKey];if(propValue==null)continue;setProperty(instance,type,propKey,propValue)}}function updateProperties(instance,type,oldProps,newProps){for(let propKey in oldProps){let oldProp=oldProps[propKey];if(oldProps.hasOwnProperty(propKey)&&oldProp!=null&&!newProps.hasOwnProperty(propKey))setProperty(instance,type,propKey,null,oldProp)}for(let propKey in newProps){let newProp=newProps[propKey],oldProp=oldProps[propKey];if(newProps.hasOwnProperty(propKey)&&newProp!==oldProp&&(newProp!=null||oldProp!=null))setProperty(instance,type,propKey,newProp,oldProp)}}var currentUpdatePriority=$NoEventPriority,hostConfig={supportsMutation:!0,supportsPersistence:!1,supportsHydration:!1,supportsMicrotasks:!0,scheduleMicrotask:queueMicrotask,createInstance(type,props,rootContainerInstance,hostContext){if(textNodeKeys.includes(type)&&!hostContext.isInsideText)throw Error(`Component of type "${type}" must be created inside of a text node`);let id=getNextId(type),components=getComponentCatalogue();if(!components[type])throw Error(`Unknown component type: ${type}`);return new components[type](rootContainerInstance.ctx,{id,...props})},appendChild(parent,child){parent.add(child)},removeChild(parent,child){if(!child.parent)return;parent.remove(child)},insertBefore(parent,child,beforeChild){parent.insertBefore(child,beforeChild)},insertInContainerBefore(parent,child,beforeChild){parent.insertBefore(child,beforeChild)},removeChildFromContainer(parent,child){if(!child.parent)return;parent.remove(child)},prepareForCommit(containerInfo){return null},resetAfterCommit(containerInfo){containerInfo.requestRender()},getRootHostContext(rootContainerInstance){return{isInsideText:!1}},getChildHostContext(parentHostContext,type,rootContainerInstance){let isInsideText=["text",...textNodeKeys].includes(type);return{...parentHostContext,isInsideText}},shouldSetTextContent(type,props){return!1},createTextInstance(text,rootContainerInstance,hostContext){if(!hostContext.isInsideText)throw Error("Text must be created inside of a text node");return TextNodeRenderable.fromString(text)},scheduleTimeout:setTimeout,cancelTimeout:clearTimeout,noTimeout:-1,shouldAttemptEagerTransition(){return!0},finalizeInitialChildren(instance,type,props,rootContainerInstance,hostContext){return setInitialProperties(instance,type,props),!1},commitMount(instance,type,props,internalInstanceHandle){},commitUpdate(instance,type,oldProps,newProps,internalInstanceHandle){updateProperties(instance,type,oldProps,newProps)},commitTextUpdate(textInstance,oldText,newText){textInstance.children=[newText]},appendChildToContainer(container,child){container.add(child)},appendInitialChild(parent,child){parent.add(child)},hideInstance(instance){instance.visible=!1},unhideInstance(instance,props){instance.visible=!0},hideTextInstance(textInstance){textInstance.visible=!1},unhideTextInstance(textInstance,text){textInstance.visible=!0},clearContainer(container){container.getChildren().forEach((child)=>container.remove(child))},setCurrentUpdatePriority(newPriority){currentUpdatePriority=newPriority},getCurrentUpdatePriority:()=>currentUpdatePriority,resolveUpdatePriority(){if(currentUpdatePriority!==$NoEventPriority)return currentUpdatePriority;return $DefaultEventPriority},maySuspendCommit(){return!1},maySuspendCommitOnUpdate(){return!1},maySuspendCommitInSyncRender(){return!1},NotPendingTransition:null,HostTransitionContext:import_react4.createContext(null),resetFormInstance(){},requestPostPaintCallback(){},trackSchedulerEvent(){},resolveEventType(){return null},resolveEventTimeStamp(){return-1.1},preloadInstance(){return!0},startSuspendingCommit(){},suspendInstance(){},waitForCommitToBeReady(){return null},detachDeletedInstance(instance){if(!instance.parent)instance.destroyRecursively()},getPublicInstance(instance){return instance},preparePortalMount(containerInfo){},isPrimaryRenderer:!0,getInstanceFromNode(){return null},beforeActiveInstanceBlur(){},afterActiveInstanceBlur(){},prepareScopeUpdate(){},getInstanceFromScope(){return null},rendererPackageName:"@opentui/react",rendererVersion:package_default.version},reconciler=import_react_reconciler.default(hostConfig);reconciler.injectIntoDevTools();function _render(element,root){let container=reconciler.createContainer(root,$ConcurrentRoot,null,!1,null,"",console.error,console.error,console.error,()=>{});return reconciler.updateContainer(element,container,null,()=>{}),container}var _r=reconciler,flushSync=_r.flushSyncFromReconciler??_r.flushSync;function createRoot(renderer){let container=null,cleanup=()=>{if(container)reconciler.updateContainer(null,container,null,()=>{}),reconciler.flushSyncWork(),container=null};return renderer.once(CliRenderEvents.DESTROY,cleanup),{render:(node)=>{engine.attach(renderer),container=_render(import_react2.default.createElement(AppContext.Provider,{value:{keyHandler:renderer.keyInput,renderer}},import_react2.default.createElement(ErrorBoundary,null,node)),renderer.root)},unmount:cleanup}}var import_react5=__toESM(require_react_production(),1),import_react6=__toESM(require_react_production(),1),import_react7=__toESM(require_react_production(),1),import_react8=__toESM(require_react_production(),1),import_react9=__toESM(require_react_production(),1),import_react10=__toESM(require_react_production(),1),import_react11=__toESM(require_react_production(),1),import_react12=__toESM(require_react_production(),1);var import_react13=__toESM(require_react_production(),1);var import_react14=__toESM(require_react_production(),1);var import_react15=__toESM(require_react_production(),1),import_react16=__toESM(require_react_production(),1);function useEffectEvent(handler){let handlerRef=import_react6.useRef(handler);return import_react6.useLayoutEffect(()=>{handlerRef.current=handler}),import_react6.useCallback((...args)=>{let fn=handlerRef.current;return fn(...args)},[])}var useRenderer=()=>{let{renderer}=useAppContext();if(!renderer)throw Error("Renderer not found.");return renderer};var useKeyboard=(handler,options={release:!1})=>{let{keyHandler}=useAppContext(),stableHandler=useEffectEvent(handler);import_react8.useEffect(()=>{if(keyHandler?.on("keypress",stableHandler),options?.release)keyHandler?.on("keyrelease",stableHandler);return()=>{if(keyHandler?.off("keypress",stableHandler),options?.release)keyHandler?.off("keyrelease",stableHandler)}},[keyHandler,options.release])};var useOnResize=(callback)=>{let renderer=useRenderer(),stableCallback=useEffectEvent(callback);return import_react10.useEffect(()=>{return renderer.on("resize",stableCallback),()=>{renderer.off("resize",stableCallback)}},[renderer]),renderer};var useTerminalDimensions=()=>{let renderer=useRenderer(),[dimensions,setDimensions]=import_react12.useState({width:renderer.width,height:renderer.height});return useOnResize((width,height)=>{setDimensions({width,height})}),dimensions};function createReactSlotRegistry(renderer,context,options={}){return createSlotRegistry(renderer,"react:slot-registry",context,options)}function renderPluginFailurePlaceholder(registry,pluginFailurePlaceholder,failure,pluginId,slot){if(!pluginFailurePlaceholder)return null;try{return pluginFailurePlaceholder(failure)}catch(error){return registry.reportPluginError({pluginId,slot,phase:"error_placeholder",source:"react",error}),null}}class PluginErrorBoundary extends import_react14.default.Component{constructor(props){super(props);this.state={failure:null}}componentDidCatch(error){let failure=this.props.registry.reportPluginError({pluginId:this.props.pluginId,slot:this.props.slotName,phase:"render",source:"react",error});this.setState({failure})}componentDidUpdate(previousProps){if(previousProps.resetToken!==this.props.resetToken&&this.state.failure)this.setState({failure:null})}render(){if(this.state.failure){let placeholder=renderPluginFailurePlaceholder(this.props.registry,this.props.pluginFailurePlaceholder,this.state.failure,this.props.pluginId,this.props.slotName);if(placeholder===null||placeholder===void 0||placeholder===!1)return this.props.fallbackOnFailure??null;return placeholder}return this.props.children}}function getSlotProps(props){let{children:_children,mode:_mode,name:_name,registry:_registry,pluginFailurePlaceholder:_pluginFailurePlaceholder,...slotProps}=props;return slotProps}function createSlot(registry,options={}){return function(props){return jsxDEV(Slot,{...props,registry,pluginFailurePlaceholder:options.pluginFailurePlaceholder},void 0,!1,void 0,this)}}function Slot(props){let[version,setVersion]=import_react14.useState(0),registry=props.registry,slotName=String(props.name),renderFailuresByPluginRef=import_react14.useRef(new Map),pendingRenderReportsRef=import_react14.useRef(new Map);import_react14.useEffect(()=>{return registry.subscribe(()=>{setVersion((current)=>current+1)})},[registry]),import_react14.useEffect(()=>{if(pendingRenderReportsRef.current.size===0)return;let pendingReports=[...pendingRenderReportsRef.current.values()];pendingRenderReportsRef.current.clear();for(let report of pendingReports){let failure=registry.reportPluginError({pluginId:report.pluginId,slot:report.slot,phase:"render",source:"react",error:report.error});renderFailuresByPluginRef.current.set(`${report.slot}:${report.pluginId}:render`,failure)}});let entries=import_react14.useMemo(()=>registry.resolveEntries(props.name),[registry,props.name,version]),slotProps=getSlotProps(props),renderEntry=(entry,fallbackOnFailure)=>{let key=`${slotName}:${entry.id}`,failureKey=`${slotName}:${entry.id}:render`;try{let rendered=entry.renderer(registry.context,slotProps);return renderFailuresByPluginRef.current.delete(failureKey),pendingRenderReportsRef.current.delete(failureKey),jsxDEV(PluginErrorBoundary,{registry,pluginFailurePlaceholder:props.pluginFailurePlaceholder,pluginId:entry.id,slotName,resetToken:version,fallbackOnFailure,children:rendered},key,!1,void 0,this)}catch(error){let normalizedError=error instanceof Error?error:typeof error==="string"?Error(error):Error(String(error)),lastFailure=renderFailuresByPluginRef.current.get(failureKey),isSameFailure=lastFailure&&lastFailure.error.message===normalizedError.message;if(!isSameFailure){let queued=pendingRenderReportsRef.current.get(failureKey);if(!queued||queued.error.message!==normalizedError.message)pendingRenderReportsRef.current.set(failureKey,{pluginId:entry.id,slot:slotName,error:normalizedError})}let failure=isSameFailure&&lastFailure?lastFailure:{pluginId:entry.id,slot:slotName,phase:"render",source:"react",error:normalizedError,timestamp:Date.now()};renderFailuresByPluginRef.current.set(failureKey,failure);let placeholder=renderPluginFailurePlaceholder(registry,props.pluginFailurePlaceholder,failure,entry.id,slotName);if(placeholder===null||placeholder===void 0||placeholder===!1)return fallbackOnFailure??null;return jsxDEV(import_react14.Fragment,{children:placeholder},key,!1,void 0,this)}};if(entries.length===0)return jsxDEV($Fragment,{children:props.children},void 0,!1,void 0,this);if(props.mode==="single_winner"){let winner=entries[0];if(!winner)return jsxDEV($Fragment,{children:props.children},void 0,!1,void 0,this);let rendered=renderEntry(winner,props.children);if(rendered===null||rendered===void 0||rendered===!1)return jsxDEV($Fragment,{children:props.children},void 0,!1,void 0,this);return jsxDEV($Fragment,{children:rendered},void 0,!1,void 0,this)}if(props.mode==="replace"){if(entries.length===1){let rendered=renderEntry(entries[0],props.children);if(rendered===null||rendered===void 0||rendered===!1)return jsxDEV($Fragment,{children:props.children},void 0,!1,void 0,this);return jsxDEV($Fragment,{children:rendered},void 0,!1,void 0,this)}let renderedEntries=entries.map((entry)=>renderEntry(entry));if(!renderedEntries.some((node)=>node!==null&&node!==void 0&&node!==!1))return jsxDEV($Fragment,{children:props.children},void 0,!1,void 0,this);return jsxDEV($Fragment,{children:renderedEntries},void 0,!1,void 0,this)}return jsxDEV($Fragment,{children:[props.children,entries.map((entry)=>renderEntry(entry))]},void 0,!0,void 0,this)}extend({"time-to-first-draw":TimeToFirstDrawRenderable});init_perf();var import_react165=__toESM(require_react_production(),1);var INTERP_RE=/\{!(.+?)\}/g,hasInterp=(s)=>/\{!.+?\}/.test(s);async function interpolate(gw,text){let hits=[...text.matchAll(INTERP_RE)];if(hits.length===0)return text;let outs=await Promise.all(hits.map((m2)=>gw.request("shell.exec",{command:m2[1]}).then((r)=>[r.stdout,r.stderr].filter(Boolean).join(`
|
|
3672
|
+
`)}}class LinkRenderable extends SpanRenderable{constructor(_ctx,options){let linkOptions={...options,link:{url:options.href}};super(null,linkOptions)}}var baseComponents={box:BoxRenderable,text:TextRenderable,code:CodeRenderable,diff:DiffRenderable,markdown:MarkdownRenderable,input:InputRenderable,select:SelectRenderable,textarea:TextareaRenderable,scrollbox:ScrollBoxRenderable,"ascii-font":ASCIIFontRenderable,"tab-select":TabSelectRenderable,"line-number":LineNumberRenderable,span:SpanRenderable,br:LineBreakRenderable,b:BoldSpanRenderable,strong:BoldSpanRenderable,i:ItalicSpanRenderable,em:ItalicSpanRenderable,u:UnderlineSpanRenderable,a:LinkRenderable},componentCatalogue={...baseComponents};function extend(objects){Object.assign(componentCatalogue,objects)}function getComponentCatalogue(){return componentCatalogue}var AppContext=import_react.createContext({keyHandler:null,renderer:null}),useAppContext=()=>{return import_react.useContext(AppContext)};class ErrorBoundary extends import_react3.default.Component{constructor(props){super(props);this.state={hasError:!1,error:null}}static getDerivedStateFromError(error){return{hasError:!0,error}}render(){if(this.state.hasError&&this.state.error)return jsxDEV("box",{style:{flexDirection:"column",padding:2},children:jsxDEV("text",{fg:"red",children:this.state.error.stack||this.state.error.message},void 0,!1,void 0,this)},void 0,!1,void 0,this);return this.props.children}}var package_default={name:"@opentui/react",version:"0.4.3",description:"React renderer for building terminal user interfaces using OpenTUI core",license:"MIT",repository:{type:"git",url:"https://github.com/anomalyco/opentui",directory:"packages/react"},module:"src/index.ts",type:"module",private:!0,main:"src/index.ts",exports:{".":{import:"./src/index.ts",types:"./src/index.ts"},"./test-utils":{import:"./src/test-utils.ts",types:"./src/test-utils.d.ts"},"./runtime-plugin-support":{import:"./scripts/runtime-plugin-support.ts",types:"./scripts/runtime-plugin-support.ts"},"./runtime-plugin-support/configure":{import:"./scripts/runtime-plugin-support-configure.ts",types:"./scripts/runtime-plugin-support-configure.ts"},"./jsx-runtime":{import:"./jsx-runtime.js",types:"./jsx-runtime.d.ts"},"./jsx-dev-runtime":{import:"./jsx-dev-runtime.js",types:"./jsx-dev-runtime.d.ts"}},scripts:{build:"bun run scripts/build.ts","build:examples":"bun examples/build.ts","build:dev":"bun run scripts/build.ts --dev",publish:"bun run scripts/publish.ts",test:"bun test"},devDependencies:{"@opentui/keymap":"workspace:*","@types/bun":"latest","@types/node":"^24.0.0","@types/react":"^19.2.0","@types/react-reconciler":"^0.33.0","@types/ws":"^8.18.1",react:">=19.2.0","react-devtools-core":"^7.0.1",typescript:"^5",ws:"^8.18.0"},peerDependencies:{react:">=19.2.0","react-devtools-core":"^7.0.1",ws:"^8.18.0"},peerDependenciesMeta:{"react-devtools-core":{optional:!0},ws:{optional:!0}},dependencies:{"@opentui/core":"workspace:*","react-reconciler":"^0.33.0"}},idCounter=new Map;function getNextId(type){if(!idCounter.has(type))idCounter.set(type,0);let value=idCounter.get(type)+1;return idCounter.set(type,value),`${type}-${value}`}function initEventListeners(instance,eventName,listener,previousListener){if(previousListener)instance.off(eventName,previousListener);if(listener)instance.on(eventName,listener)}function setStyle(instance,styles,oldStyles){if(oldStyles!=null&&typeof oldStyles==="object"){for(let styleName in oldStyles)if(oldStyles.hasOwnProperty(styleName)){if(styles==null||!styles.hasOwnProperty(styleName))instance[styleName]=null}}if(styles!=null&&typeof styles==="object"){for(let styleName in styles)if(styles.hasOwnProperty(styleName)){let value=styles[styleName],oldValue=oldStyles?.[styleName];if(value!==oldValue)instance[styleName]=value}}}function setProperty(instance,type,propKey,propValue,oldPropValue){switch(propKey){case"onChange":if(instance instanceof InputRenderable)initEventListeners(instance,InputRenderableEvents.CHANGE,propValue,oldPropValue);else if(instance instanceof SelectRenderable)initEventListeners(instance,SelectRenderableEvents.SELECTION_CHANGED,propValue,oldPropValue);else if(instance instanceof TabSelectRenderable)initEventListeners(instance,TabSelectRenderableEvents.SELECTION_CHANGED,propValue,oldPropValue);break;case"onInput":if(instance instanceof InputRenderable)initEventListeners(instance,InputRenderableEvents.INPUT,propValue,oldPropValue);break;case"onSubmit":if(instance instanceof InputRenderable)initEventListeners(instance,InputRenderableEvents.ENTER,propValue,oldPropValue);else if(instance instanceof TextareaRenderable)instance.onSubmit=propValue;break;case"onSelect":if(instance instanceof SelectRenderable)initEventListeners(instance,SelectRenderableEvents.ITEM_SELECTED,propValue,oldPropValue);else if(instance instanceof TabSelectRenderable)initEventListeners(instance,TabSelectRenderableEvents.ITEM_SELECTED,propValue,oldPropValue);break;case"focused":if(isRenderable(instance))if(propValue)instance.focus();else instance.blur();break;case"style":setStyle(instance,propValue,oldPropValue);break;case"children":break;default:instance[propKey]=propValue}}function setInitialProperties(instance,type,props){for(let propKey in props){if(!props.hasOwnProperty(propKey))continue;let propValue=props[propKey];if(propValue==null)continue;setProperty(instance,type,propKey,propValue)}}function updateProperties(instance,type,oldProps,newProps){for(let propKey in oldProps){let oldProp=oldProps[propKey];if(oldProps.hasOwnProperty(propKey)&&oldProp!=null&&!newProps.hasOwnProperty(propKey))setProperty(instance,type,propKey,null,oldProp)}for(let propKey in newProps){let newProp=newProps[propKey],oldProp=oldProps[propKey];if(newProps.hasOwnProperty(propKey)&&newProp!==oldProp&&(newProp!=null||oldProp!=null))setProperty(instance,type,propKey,newProp,oldProp)}}var currentUpdatePriority=$NoEventPriority,hostConfig={supportsMutation:!0,supportsPersistence:!1,supportsHydration:!1,supportsMicrotasks:!0,scheduleMicrotask:queueMicrotask,createInstance(type,props,rootContainerInstance,hostContext){if(textNodeKeys.includes(type)&&!hostContext.isInsideText)throw Error(`Component of type "${type}" must be created inside of a text node`);let id=getNextId(type),components=getComponentCatalogue();if(!components[type])throw Error(`Unknown component type: ${type}`);return new components[type](rootContainerInstance.ctx,{id,...props})},appendChild(parent,child){parent.add(child)},removeChild(parent,child){if(!child.parent)return;parent.remove(child)},insertBefore(parent,child,beforeChild){parent.insertBefore(child,beforeChild)},insertInContainerBefore(parent,child,beforeChild){parent.insertBefore(child,beforeChild)},removeChildFromContainer(parent,child){if(!child.parent)return;parent.remove(child)},prepareForCommit(containerInfo){return null},resetAfterCommit(containerInfo){containerInfo.requestRender()},getRootHostContext(rootContainerInstance){return{isInsideText:!1}},getChildHostContext(parentHostContext,type,rootContainerInstance){let isInsideText=["text",...textNodeKeys].includes(type);return{...parentHostContext,isInsideText}},shouldSetTextContent(type,props){return!1},createTextInstance(text,rootContainerInstance,hostContext){if(!hostContext.isInsideText)throw Error("Text must be created inside of a text node");return TextNodeRenderable.fromString(text)},scheduleTimeout:setTimeout,cancelTimeout:clearTimeout,noTimeout:-1,shouldAttemptEagerTransition(){return!0},finalizeInitialChildren(instance,type,props,rootContainerInstance,hostContext){return setInitialProperties(instance,type,props),!1},commitMount(instance,type,props,internalInstanceHandle){},commitUpdate(instance,type,oldProps,newProps,internalInstanceHandle){updateProperties(instance,type,oldProps,newProps)},commitTextUpdate(textInstance,oldText,newText){textInstance.children=[newText]},appendChildToContainer(container,child){container.add(child)},appendInitialChild(parent,child){parent.add(child)},hideInstance(instance){instance.visible=!1},unhideInstance(instance,props){instance.visible=!0},hideTextInstance(textInstance){textInstance.visible=!1},unhideTextInstance(textInstance,text){textInstance.visible=!0},clearContainer(container){container.getChildren().forEach((child)=>container.remove(child))},setCurrentUpdatePriority(newPriority){currentUpdatePriority=newPriority},getCurrentUpdatePriority:()=>currentUpdatePriority,resolveUpdatePriority(){if(currentUpdatePriority!==$NoEventPriority)return currentUpdatePriority;return $DefaultEventPriority},maySuspendCommit(){return!1},maySuspendCommitOnUpdate(){return!1},maySuspendCommitInSyncRender(){return!1},NotPendingTransition:null,HostTransitionContext:import_react4.createContext(null),resetFormInstance(){},requestPostPaintCallback(){},trackSchedulerEvent(){},resolveEventType(){return null},resolveEventTimeStamp(){return-1.1},preloadInstance(){return!0},startSuspendingCommit(){},suspendInstance(){},waitForCommitToBeReady(){return null},detachDeletedInstance(instance){if(!instance.parent)instance.destroyRecursively()},getPublicInstance(instance){return instance},preparePortalMount(containerInfo){},isPrimaryRenderer:!0,getInstanceFromNode(){return null},beforeActiveInstanceBlur(){},afterActiveInstanceBlur(){},prepareScopeUpdate(){},getInstanceFromScope(){return null},rendererPackageName:"@opentui/react",rendererVersion:package_default.version},reconciler=import_react_reconciler.default(hostConfig);reconciler.injectIntoDevTools();function _render(element,root){let container=reconciler.createContainer(root,$ConcurrentRoot,null,!1,null,"",console.error,console.error,console.error,()=>{});return reconciler.updateContainer(element,container,null,()=>{}),container}var _r=reconciler,flushSync=_r.flushSyncFromReconciler??_r.flushSync;function createRoot(renderer){let container=null,cleanup=()=>{if(container)reconciler.updateContainer(null,container,null,()=>{}),reconciler.flushSyncWork(),container=null};return renderer.once(CliRenderEvents.DESTROY,cleanup),{render:(node)=>{engine.attach(renderer),container=_render(import_react2.default.createElement(AppContext.Provider,{value:{keyHandler:renderer.keyInput,renderer}},import_react2.default.createElement(ErrorBoundary,null,node)),renderer.root)},unmount:cleanup}}var import_react5=__toESM(require_react_production(),1),import_react6=__toESM(require_react_production(),1),import_react7=__toESM(require_react_production(),1),import_react8=__toESM(require_react_production(),1),import_react9=__toESM(require_react_production(),1),import_react10=__toESM(require_react_production(),1),import_react11=__toESM(require_react_production(),1),import_react12=__toESM(require_react_production(),1);var import_react13=__toESM(require_react_production(),1);var import_react14=__toESM(require_react_production(),1);var import_react15=__toESM(require_react_production(),1),import_react16=__toESM(require_react_production(),1);function useEffectEvent(handler){let handlerRef=import_react6.useRef(handler);return import_react6.useLayoutEffect(()=>{handlerRef.current=handler}),import_react6.useCallback((...args)=>{let fn=handlerRef.current;return fn(...args)},[])}var useRenderer=()=>{let{renderer}=useAppContext();if(!renderer)throw Error("Renderer not found.");return renderer};var useKeyboard=(handler,options={release:!1})=>{let{keyHandler}=useAppContext(),stableHandler=useEffectEvent(handler);import_react8.useEffect(()=>{if(keyHandler?.on("keypress",stableHandler),options?.release)keyHandler?.on("keyrelease",stableHandler);return()=>{if(keyHandler?.off("keypress",stableHandler),options?.release)keyHandler?.off("keyrelease",stableHandler)}},[keyHandler,options.release])};var useOnResize=(callback)=>{let renderer=useRenderer(),stableCallback=useEffectEvent(callback);return import_react10.useEffect(()=>{return renderer.on("resize",stableCallback),()=>{renderer.off("resize",stableCallback)}},[renderer]),renderer};var useTerminalDimensions=()=>{let renderer=useRenderer(),[dimensions,setDimensions]=import_react12.useState({width:renderer.width,height:renderer.height});return useOnResize((width,height)=>{setDimensions({width,height})}),dimensions};function createReactSlotRegistry(renderer,context,options={}){return createSlotRegistry(renderer,"react:slot-registry",context,options)}function renderPluginFailurePlaceholder(registry,pluginFailurePlaceholder,failure,pluginId,slot){if(!pluginFailurePlaceholder)return null;try{return pluginFailurePlaceholder(failure)}catch(error){return registry.reportPluginError({pluginId,slot,phase:"error_placeholder",source:"react",error}),null}}class PluginErrorBoundary extends import_react14.default.Component{constructor(props){super(props);this.state={failure:null}}componentDidCatch(error){let failure=this.props.registry.reportPluginError({pluginId:this.props.pluginId,slot:this.props.slotName,phase:"render",source:"react",error});this.setState({failure})}componentDidUpdate(previousProps){if(previousProps.resetToken!==this.props.resetToken&&this.state.failure)this.setState({failure:null})}render(){if(this.state.failure){let placeholder=renderPluginFailurePlaceholder(this.props.registry,this.props.pluginFailurePlaceholder,this.state.failure,this.props.pluginId,this.props.slotName);if(placeholder===null||placeholder===void 0||placeholder===!1)return this.props.fallbackOnFailure??null;return placeholder}return this.props.children}}function getSlotProps(props){let{children:_children,mode:_mode,name:_name,registry:_registry,pluginFailurePlaceholder:_pluginFailurePlaceholder,...slotProps}=props;return slotProps}function createSlot(registry,options={}){return function(props){return jsxDEV(Slot,{...props,registry,pluginFailurePlaceholder:options.pluginFailurePlaceholder},void 0,!1,void 0,this)}}function Slot(props){let[version,setVersion]=import_react14.useState(0),registry=props.registry,slotName=String(props.name),renderFailuresByPluginRef=import_react14.useRef(new Map),pendingRenderReportsRef=import_react14.useRef(new Map);import_react14.useEffect(()=>{return registry.subscribe(()=>{setVersion((current)=>current+1)})},[registry]),import_react14.useEffect(()=>{if(pendingRenderReportsRef.current.size===0)return;let pendingReports=[...pendingRenderReportsRef.current.values()];pendingRenderReportsRef.current.clear();for(let report of pendingReports){let failure=registry.reportPluginError({pluginId:report.pluginId,slot:report.slot,phase:"render",source:"react",error:report.error});renderFailuresByPluginRef.current.set(`${report.slot}:${report.pluginId}:render`,failure)}});let entries=import_react14.useMemo(()=>registry.resolveEntries(props.name),[registry,props.name,version]),slotProps=getSlotProps(props),renderEntry=(entry,fallbackOnFailure)=>{let key=`${slotName}:${entry.id}`,failureKey=`${slotName}:${entry.id}:render`;try{let rendered=entry.renderer(registry.context,slotProps);return renderFailuresByPluginRef.current.delete(failureKey),pendingRenderReportsRef.current.delete(failureKey),jsxDEV(PluginErrorBoundary,{registry,pluginFailurePlaceholder:props.pluginFailurePlaceholder,pluginId:entry.id,slotName,resetToken:version,fallbackOnFailure,children:rendered},key,!1,void 0,this)}catch(error){let normalizedError=error instanceof Error?error:typeof error==="string"?Error(error):Error(String(error)),lastFailure=renderFailuresByPluginRef.current.get(failureKey),isSameFailure=lastFailure&&lastFailure.error.message===normalizedError.message;if(!isSameFailure){let queued=pendingRenderReportsRef.current.get(failureKey);if(!queued||queued.error.message!==normalizedError.message)pendingRenderReportsRef.current.set(failureKey,{pluginId:entry.id,slot:slotName,error:normalizedError})}let failure=isSameFailure&&lastFailure?lastFailure:{pluginId:entry.id,slot:slotName,phase:"render",source:"react",error:normalizedError,timestamp:Date.now()};renderFailuresByPluginRef.current.set(failureKey,failure);let placeholder=renderPluginFailurePlaceholder(registry,props.pluginFailurePlaceholder,failure,entry.id,slotName);if(placeholder===null||placeholder===void 0||placeholder===!1)return fallbackOnFailure??null;return jsxDEV(import_react14.Fragment,{children:placeholder},key,!1,void 0,this)}};if(entries.length===0)return jsxDEV($Fragment,{children:props.children},void 0,!1,void 0,this);if(props.mode==="single_winner"){let winner=entries[0];if(!winner)return jsxDEV($Fragment,{children:props.children},void 0,!1,void 0,this);let rendered=renderEntry(winner,props.children);if(rendered===null||rendered===void 0||rendered===!1)return jsxDEV($Fragment,{children:props.children},void 0,!1,void 0,this);return jsxDEV($Fragment,{children:rendered},void 0,!1,void 0,this)}if(props.mode==="replace"){if(entries.length===1){let rendered=renderEntry(entries[0],props.children);if(rendered===null||rendered===void 0||rendered===!1)return jsxDEV($Fragment,{children:props.children},void 0,!1,void 0,this);return jsxDEV($Fragment,{children:rendered},void 0,!1,void 0,this)}let renderedEntries=entries.map((entry)=>renderEntry(entry));if(!renderedEntries.some((node)=>node!==null&&node!==void 0&&node!==!1))return jsxDEV($Fragment,{children:props.children},void 0,!1,void 0,this);return jsxDEV($Fragment,{children:renderedEntries},void 0,!1,void 0,this)}return jsxDEV($Fragment,{children:[props.children,entries.map((entry)=>renderEntry(entry))]},void 0,!0,void 0,this)}extend({"time-to-first-draw":TimeToFirstDrawRenderable});init_perf();var import_react165=__toESM(require_react_production(),1);import{homedir as homedir11}from"os";import{join as join30}from"path";var INTERP_RE=/\{!(.+?)\}/g,hasInterp=(s)=>/\{!.+?\}/.test(s);async function interpolate(gw,text){let hits=[...text.matchAll(INTERP_RE)];if(hits.length===0)return text;let outs=await Promise.all(hits.map((m2)=>gw.request("shell.exec",{command:m2[1]}).then((r)=>[r.stdout,r.stderr].filter(Boolean).join(`
|
|
3673
3673
|
`).trim()).catch(()=>"(error)"))),out=text;for(let i=hits.length-1;i>=0;i--){let m2=hits[i];out=out.slice(0,m2.index)+outs[i]+out.slice(m2.index+m2[0].length)}return out}var import_react17=__toESM(require_react_production(),1);import{EventEmitter as EventEmitter7}from"events";import{homedir}from"os";import{resolve as resolve3,delimiter}from"path";import{existsSync as existsSync4}from"fs";var GATEWAY_EVENT_TYPES=["gateway.ready","gateway.stderr","gateway.start_timeout","gateway.protocol_error","session.info","session.title","skin.changed","message.start","message.delta","message.complete","thinking.delta","reasoning.delta","reasoning.available","moa.reference","moa.aggregating","status.update","notification.show","notification.clear","tool.start","tool.progress","tool.generating","tool.complete","clarify.request","approval.request","sudo.request","secret.request","background.complete","review.summary","btw.complete","browser.progress","voice.status","voice.transcript","subagent.start","subagent.thinking","subagent.tool","subagent.progress","subagent.complete","error"],EVENT_TYPES=new Set(GATEWAY_EVENT_TYPES);function knownGatewayEvent(type){return EVENT_TYPES.has(type)}var exports_backend_contract={};__export(exports_backend_contract,{mutates:()=>mutates,contractMessage:()=>contractMessage,contractError:()=>contractError,backendContract:()=>backendContract,backend:()=>exports_backend_contract,MIN_BACKEND_CONTRACT:()=>MIN_BACKEND_CONTRACT,MAX_BACKEND_CONTRACT:()=>MAX_BACKEND_CONTRACT});var MIN_BACKEND_CONTRACT=4,MAX_BACKEND_CONTRACT=5,BOOT=new Set(["session.create","session.resume","session.activate"]),READ=new Set(["agents.list","commands.catalog","complete.path","complete.slash","config.get","context.list","delegation.status","input.detect_drop","learning.detail","learning.frames","model.options","paste.collapse","rollback.diff","rollback.list","session.active_list","session.context_breakdown","session.history","session.list","session.title","session.usage","skills.manage","spawn_tree.list","spawn_tree.load","toolsets.list"]);function obj(raw){if(raw&&typeof raw==="object"&&!Array.isArray(raw))return raw;return null}function text(raw){if(typeof raw!=="string")return;return raw.trim()||void 0}function revision(raw){return text(raw.source_revision)??text(raw.source_rev)??text(raw.revision)??text(raw.commit)??text(raw.git_sha)}function backendContract(raw){let r=obj(raw),n=r?.desktop_contract,version=text(r?.version),releaseDate=text(r?.release_date),updateCommand=text(r?.update_command),updateBehind=typeof r?.update_behind==="number"||r?.update_behind===null?r.update_behind:void 0,base={minContract:4,maxContract:5,sourceRevision:r?revision(r):void 0,version,releaseDate,updateBehind,updateCommand};if(!r||n===void 0||n===null)return{...base,supported:!1,reason:"missing"};if(typeof n!=="number"||!Number.isFinite(n)||!Number.isInteger(n))return{...base,supported:!1,reason:"malformed"};if(n<4)return{...base,observedContract:n,supported:!1,reason:"older"};if(n>5)return{...base,observedContract:n,supported:!1,reason:"newer"};return{...base,observedContract:n,supported:!0,reason:"supported"}}function contractMessage(state){let seen=state.observedContract===void 0?state.reason:String(state.observedContract),rev=state.sourceRevision?` \xB7 rev ${state.sourceRevision}`:"",update=state.updateCommand?` Update with: ${state.updateCommand}`:"";if(state.reason==="newer")return`Hermes backend contract ${seen} is newer than Herm supports (${state.minContract}-${state.maxContract})${rev}. Update Herm before sending mutating commands.`;if(state.reason==="older")return`Hermes backend contract ${seen} is older than Herm requires (${state.minContract})${rev}.${update}`;if(state.reason==="malformed")return`Hermes backend contract payload is malformed; Herm requires ${state.minContract}-${state.maxContract} before mutating commands.${update}`;return`Hermes backend contract is missing; Herm requires ${state.minContract}-${state.maxContract} before mutating commands.${update}`}function mutates(method,params={}){if(BOOT.has(method))return!1;if(method==="session.title")return"title"in params;if(method==="skills.manage")return params.action!=="list"&¶ms.action!=="search";if(method==="cron.manage")return params.action!=="list";if(READ.has(method))return!1;return!0}function contractError(method,state,params={}){if(!mutates(method,params))return null;if(state.supported)return null;return Error(`${contractMessage(state)} Blocked ${method}.`)}var BAD=/[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDFFF]/g;function scalar(s){let count2=0;return{text:s.replace(BAD,(m2)=>{if(m2.length===2)return m2;return count2+=1,"\uFFFD"}),count:count2}}function encode(v2){let paths=new WeakMap,issues=[];return{text:JSON.stringify(v2,function(key,value){let holder=this&&typeof this==="object"?paths.get(this):void 0,path4=key?`${holder??"$"}.${key}`:"$";if(value&&typeof value==="object")paths.set(value,path4);if(typeof value!=="string")return value;let next=scalar(value);if(next.count>0)issues.push({path:path4,count:next.count});return next.text})??"null",issues}}var LOG_MAX=200,LOG_PREVIEW=240,STARTUP_MS=15000,REQUEST_MS=120000,WS_CONNECTING=0,WS_OPEN=1,WS_CLOSING=2,WS_CLOSED=3,decoder2=new TextDecoder;function hermesAgentRoot(){if(process.env.HERMES_AGENT_ROOT)return process.env.HERMES_AGENT_ROOT;let homePath=`${process.env.HOME||homedir()}/.hermes/hermes-agent`;if(existsSync4(homePath))return homePath;let fhs="/usr/local/lib/hermes-agent";if(existsSync4(fhs))return fhs;return homePath}function gatewayUrl(){return process.env.HERM_GATEWAY_URL?.trim()||process.env.HERMES_TUI_GATEWAY_URL?.trim()||null}function websocketUrl(raw){let url=new URL(raw);if(url.protocol==="http:")url.protocol="ws:";else if(url.protocol==="https:")url.protocol="wss:";else if(url.protocol!=="ws:"&&url.protocol!=="wss:")throw Error(`unsupported gateway URL protocol: ${url.protocol}`);let prefix=url.pathname.replace(/\/+$/,"");if(!prefix.endsWith("/api/ws"))url.pathname=`${prefix}/api/ws`;return url.toString()}function redact(raw){try{let url=new URL(raw);if(url.username||url.password)url.username="***",url.password="";if(url.search)url.search="?***";return url.toString()}catch{return"invalid gateway URL"}}function python(root,platform=process.platform){let env2=process.env.HERMES_PYTHON?.trim();if(env2)return env2;let venv=process.env.VIRTUAL_ENV?.trim();return(platform==="win32"?[venv&&resolve3(venv,"Scripts","python.exe"),resolve3(root,"venv","Scripts","python.exe"),resolve3(root,".venv","Scripts","python.exe")]:[venv&&resolve3(venv,"bin","python"),venv&&resolve3(venv,"bin","python3"),resolve3(root,"venv","bin","python"),resolve3(root,"venv","bin","python3"),resolve3(root,".venv","bin","python"),resolve3(root,".venv","bin","python3")]).find((p)=>p&&existsSync4(p))||(platform==="win32"?"python":"python3")}function asEvent(v2){if(v2&&typeof v2==="object"&&!Array.isArray(v2)&&typeof v2.type==="string")return v2;return null}function text2(raw){if(typeof raw==="string")return raw;if(raw instanceof ArrayBuffer)return decoder2.decode(raw);if(ArrayBuffer.isView(raw))return decoder2.decode(raw);return null}function rec(v2){if(v2&&typeof v2==="object"&&!Array.isArray(v2))return v2;return null}function crop(s){return s.length>LOG_PREVIEW?`${s.slice(0,LOG_PREVIEW)}\u2026`:s}function clean(v2,depth,seen){if(v2===null||typeof v2==="number"||typeof v2==="boolean")return v2;if(typeof v2==="string")return crop(v2);if(v2===void 0)return"[undefined]";if(typeof v2!=="object")return`[${typeof v2}]`;if(seen.has(v2))return"[circular]";if(depth>=3)return"[depth]";if(seen.add(v2),Array.isArray(v2)){let vals=v2.slice(0,6).map((x2)=>clean(x2,depth+1,seen));return v2.length>vals.length?[...vals,`\u2026+${v2.length-vals.length}`]:vals}let out={};for(let[key,val]of Object.entries(v2).slice(0,12))out[key]=/token|secret|password|credential|authorization|api[_-]?key|cookie|private[_-]?key/i.test(key)?"[redacted]":clean(val,depth+1,seen);let extra=Object.keys(v2).length-Object.keys(out).length;if(extra>0)out["\u2026"]=`+${extra}`;return out}function payload(ev){let obj2=rec(ev);if(!obj2||!("payload"in obj2))return"(none)";try{return crop(JSON.stringify(clean(obj2.payload,0,new WeakSet)))}catch{return"[unserializable]"}}function contract(ev){let obj2=rec(ev),body=rec(obj2?.payload),raw=obj2?.contract_version??obj2?.contractVersion??body?.contract_version??body?.contractVersion??rec(body?.contract)?.version;return raw===void 0||raw===null?"unknown":crop(String(raw))}async function lines(stream,cb){let reader=stream.getReader(),decoder3=new TextDecoder,buf="";try{while(!0){let{done,value}=await reader.read();if(done)break;buf+=decoder3.decode(value,{stream:!0});let parts=buf.split(`
|
|
3674
3674
|
`);buf=parts.pop()||"";for(let line of parts)if(line)cb(line)}if(buf.trim())cb(buf)}catch{}}class GatewayClient extends EventEmitter7{proc=null;ws=null;link=null;target=null;id=0;logs=[];unknown=new Map;pending=new Map;buf=[];contract=exports_backend_contract.backendContract(null);exit;ok=!1;timer=null;sub=!1;root(){return hermesAgentRoot()}push(ev,source="internal"){if(this.diagnose(ev,source),ev.type==="gateway.ready"){if(this.ok=!0,this.timer)clearTimeout(this.timer),this.timer=null}if(this.sub)return void this.emit("event",ev);this.buf.push(ev)}log(line){if(this.logs.push(line)>LOG_MAX){let cut=this.logs.length-LOG_MAX;this.logs.splice(0,cut);for(let d2 of this.unknown.values())d2.index-=cut}return this.logs.length-1}diagnose(ev,source="control"){try{if(knownGatewayEvent(ev.type))return;let version=contract(ev),key=`${source}\x00${version}\x00${ev.type}`,old=this.unknown.get(key);if(old&&old.index>=0&&old.index<this.logs.length){old.count++,this.logs[old.index]=old.line(old.count);return}let summary=payload(ev),line=(count2)=>`[event unknown] type=${ev.type} source=${source} contract=${version} count=${count2} payload=${summary}`;this.unknown.set(key,{count:1,index:this.log(line(1)),line})}catch(err){let text3=err instanceof Error?err.message:String(err);this.log(`[event diagnostic_failed] source=${source} error=${crop(text3)}`)}}observe(raw){let next=exports_backend_contract.backendContract(raw);this.contract=next.reason==="missing"&&this.contract.supported?this.contract:next}dispatch(msg,source="stdio"){let id=msg.id,p=id?this.pending.get(id):void 0;if(p){this.pending.delete(id);let res=msg.result,info=res&&typeof res==="object"&&!Array.isArray(res)?res.info:void 0;if(info)this.observe(info);if(msg.error){let err=msg.error;p.reject(Error(typeof err?.message==="string"?err.message:"request failed"))}else p.resolve(res);return}if(msg.method==="event"){let ev=asEvent(msg.params);if(ev){if(ev.type==="session.info")this.observe(ev.payload);this.push(ev,source)}}}fail(err){for(let p of this.pending.values())p.reject(err);this.pending.clear()}connect(raw){let cwd=process.env.HERMES_CWD||process.cwd(),url;try{url=websocketUrl(raw)}catch(err){let message=err instanceof Error?err.message:String(err);if(this.log(`[startup] websocket failed: ${message}`),this.push({type:"gateway.stderr",payload:{line:message}}),this.sub)this.emit("exit",null);else this.exit=null;return}let safe=redact(url),ws;try{ws=new WebSocket(url)}catch(err){let message=err instanceof Error?err.message:String(err);if(this.log(`[startup] websocket failed (${safe}): ${message}`),this.push({type:"gateway.stderr",payload:{line:message}}),this.sub)this.emit("exit",null);else this.exit=null;return}this.target=raw,this.ws=ws;let settled=!1;this.link=new Promise((resolve4,reject)=>{ws.addEventListener("open",()=>{if(settled)return;settled=!0,resolve4()},{once:!0}),ws.addEventListener("error",()=>{if(settled)return;settled=!0,reject(Error("gateway websocket connection failed"));try{ws.close()}catch{}},{once:!0}),ws.addEventListener("close",(event)=>{if(settled)return;settled=!0,reject(Error(`gateway websocket closed (${event.code}) during connect`))},{once:!0})}),this.link.catch(()=>{}),this.timer=setTimeout(()=>{if(this.ok||this.ws!==ws)return;this.log(`[startup] timed out (websocket=${safe}, cwd=${cwd})`),this.push({type:"gateway.start_timeout",payload:{cwd,python:"websocket"}}),this.ws=null,this.link=null,this.fail(Error("gateway websocket startup timeout"));try{ws.close()}catch{}if(this.sub)this.emit("exit",null);else this.exit=null},STARTUP_MS),ws.addEventListener("message",(event)=>{if(this.ws!==ws)return;let raw2=text2(event.data);if(!raw2)return;try{this.dispatch(JSON.parse(raw2),"websocket")}catch{let preview=raw2.trim().slice(0,LOG_PREVIEW)||"(empty)";this.log(`[protocol] malformed websocket: ${preview}`),this.push({type:"gateway.protocol_error",payload:{preview}})}}),ws.addEventListener("error",()=>{if(this.ws!==ws)return;let line=`websocket transport error (${safe})`;this.log(`[gateway] ${line}`),this.push({type:"gateway.stderr",payload:{line}})}),ws.addEventListener("close",(event)=>{if(this.ws!==ws)return;if(this.timer)clearTimeout(this.timer),this.timer=null;if(this.ws=null,this.link=null,this.fail(Error(`gateway websocket closed${event.code?` (${event.code})`:""}`)),this.sub)this.emit("exit",event.code);else this.exit=event.code})}start(){let raw=gatewayUrl(),root=this.root(),bin=python(root),cwd=process.env.HERMES_CWD||process.cwd(),env2={...process.env};if(!env2.TERMINAL_CWD)env2.TERMINAL_CWD=cwd;let pp=env2.PYTHONPATH?.trim();env2.PYTHONPATH=pp?`${root}${delimiter}${pp}`:root,env2.HERMES_PYTHON_SRC_ROOT=root,this.ok=!1,this.buf=[],this.contract=exports_backend_contract.backendContract(null),this.exit=void 0;let restarted=!1,previous=this.proc;if(previous){this.proc=null,this.fail(Error("gateway restarted")),restarted=!0;try{previous.kill()}catch{}}let socket=this.ws;if(socket){if(this.ws=null,this.link=null,this.target=null,!restarted)this.fail(Error("gateway restarted"));try{socket.close()}catch{}}if(this.timer)clearTimeout(this.timer);if(raw){this.connect(raw);return}this.timer=setTimeout(()=>{if(this.ok)return;this.log(`[startup] timed out (python=${bin}, cwd=${cwd})`),this.push({type:"gateway.start_timeout",payload:{cwd,python:bin}});let proc2=this.proc;if(!proc2||proc2.exitCode!==null)return;try{proc2.kill()}catch(err){this.proc=null;let failure=Error(`gateway startup timeout: ${err instanceof Error?err.message:String(err)}`);if(this.fail(failure),this.sub)this.emit("exit",null);else this.exit=null}},STARTUP_MS);let proc=(()=>{try{return Bun.spawn([bin,"-u","-m","tui_gateway.entry"],{cwd,env:env2,stdin:"pipe",stdout:"pipe",stderr:"pipe"})}catch(err){if(this.timer)clearTimeout(this.timer),this.timer=null;this.proc=null;let message=err instanceof Error?err.message:String(err);if(this.log(`[startup] spawn failed: ${message}`),this.push({type:"gateway.stderr",payload:{line:message}}),this.sub)this.emit("exit",null);else this.exit=null;return null}})();if(!proc)return;if(this.proc=proc,proc.stdout)lines(proc.stdout,(raw2)=>{if(this.proc!==proc)return;try{this.dispatch(JSON.parse(raw2),"stdio")}catch{let preview=raw2.trim().slice(0,LOG_PREVIEW)||"(empty)";this.log(`[protocol] malformed: ${preview}`),this.push({type:"gateway.protocol_error",payload:{preview}})}});if(proc.stderr)lines(proc.stderr,(raw2)=>{if(this.proc!==proc)return;let line=raw2.trim();if(!line)return;this.log(line),this.push({type:"gateway.stderr",payload:{line}})});proc.exited.then((code)=>{if(this.proc!==proc)return;if(this.timer)clearTimeout(this.timer),this.timer=null;if(this.fail(Error(`gateway exited${code===null?"":` (${code})`}`)),this.sub)this.emit("exit",code);else this.exit=code})}drain(){if(this.sub)return;this.sub=!0;for(let ev of this.buf.splice(0))this.emit("event",ev);if(this.exit!==void 0){let code=this.exit;this.exit=void 0,this.emit("exit",code)}}tail(n=20){return this.logs.slice(-Math.max(1,n)).join(`
|
|
3675
3675
|
`)}sid="";setSession(sid){this.sid=sid}request(method,params={}){let blocked=exports_backend_contract.contractError(method,this.contract,params);if(blocked)return Promise.reject(blocked);let raw=gatewayUrl();if(raw)return this.remote(raw,method,params);if(!this.proc||this.proc.exitCode!==null)this.start();let stdin=this.proc?.stdin;if(!stdin||typeof stdin==="number")return Promise.reject(Error("gateway not running"));let rid=`r${++this.id}`,writer=stdin,merged=this.sid&¶ms.session_id===void 0?{session_id:this.sid,...params}:params;return new Promise((resolve4,reject)=>{let timeout=setTimeout(()=>{if(this.pending.delete(rid))reject(Error(`timeout: ${method}`))},REQUEST_MS);this.pending.set(rid,{reject:(e)=>{clearTimeout(timeout),reject(e)},resolve:(v2)=>{clearTimeout(timeout),resolve4(v2)}});try{let frame=encode({jsonrpc:"2.0",id:rid,method,params:merged});if(frame.issues.length){let detail=frame.issues.map((x2)=>`${x2.path}:${x2.count}`).join(", ");this.log(`[wire] sanitized invalid unicode for ${method}: ${detail}`)}writer.write(frame.text+`
|
|
3676
|
-
`)}catch(e){clearTimeout(timeout),this.pending.delete(rid),reject(e instanceof Error?e:Error(String(e)))}})}remote(raw,method,params){let blocked=exports_backend_contract.contractError(method,this.contract,params);if(blocked)return Promise.reject(blocked);try{websocketUrl(raw)}catch(err){return Promise.reject(err instanceof Error?err:Error(String(err)))}if(this.target!==raw||!this.ws||this.ws.readyState===WS_CLOSING||this.ws.readyState===WS_CLOSED)this.start();let rid=`r${++this.id}`,merged=this.sid&¶ms.session_id===void 0?{session_id:this.sid,...params}:params;return new Promise((resolve4,reject)=>{let timeout=setTimeout(()=>{if(this.pending.delete(rid))reject(Error(`timeout: ${method}`))},REQUEST_MS);this.pending.set(rid,{reject:(e)=>{clearTimeout(timeout),reject(e)},resolve:(value)=>{clearTimeout(timeout),resolve4(value)}}),(async()=>{try{if(this.ws?.readyState===WS_CONNECTING)await this.link;if(!this.pending.has(rid))return;if(!this.ws||this.ws.readyState!==WS_OPEN)throw Error(`gateway not connected: ${method}`);let frame=encode({jsonrpc:"2.0",id:rid,method,params:merged});if(frame.issues.length){let detail=frame.issues.map((x2)=>`${x2.path}:${x2.count}`).join(", ");this.log(`[wire] sanitized invalid unicode for ${method}: ${detail}`)}this.ws.send(frame.text)}catch(err){if(clearTimeout(timeout),this.pending.delete(rid))reject(err instanceof Error?err:Error(String(err)))}})()})}kill(){this.proc?.kill();let ws=this.ws;if(!ws)return;if(this.ws=null,this.link=null,this.target=null,this.timer)clearTimeout(this.timer),this.timer=null;this.fail(Error("gateway websocket closed"));try{ws.close()}catch{}}get ready(){return this.ok}}var Gw=import_react17.createContext(null),GatewayProvider=({client,children})=>{let ref=import_react17.useRef(null);if(!ref.current)ref.current=client??new GatewayClient;let[ready,setReady]=import_react17.useState(ref.current.ready),retry=import_react17.useRef({attempts:0});import_react17.useEffect(()=>{let c=ref.current,onEvent=(ev)=>{if(ev.type==="gateway.ready"||ev.type==="session.info")setReady(!0);if(ev.type==="session.info"){if(retry.current.timer)clearTimeout(retry.current.timer);retry.current={attempts:0}}},onExit=()=>{if(setReady(!1),retry.current.timer)clearTimeout(retry.current.timer);if(retry.current.attempts>=3)return;let delay=250*2**retry.current.attempts++;retry.current.timer=setTimeout(()=>c.start(),delay)};return c.on("event",onEvent),c.on("exit",onExit),c.start(),c.drain(),()=>{if(c.off("event",onEvent),c.off("exit",onExit),retry.current.timer)clearTimeout(retry.current.timer);c.removeAllListeners(),c.kill()}},[]);let restart=import_react17.useCallback((mode="resume")=>{if(retry.current.timer)clearTimeout(retry.current.timer);retry.current={attempts:0},setReady(!1),ref.current.emit("restart",mode),ref.current.start()},[]),value=import_react17.useMemo(()=>({client:ref.current,ready,restart}),[ready,restart]);return $jsx(Gw.Provider,{value,children})};function useGateway(){let ctx=import_react17.useContext(Gw);if(!ctx)throw Error("useGateway() must be inside <GatewayProvider>");return ctx.client}function useGatewayEvent(handler){let ctx=import_react17.useContext(Gw);if(!ctx)throw Error("useGatewayEvent() must be inside <GatewayProvider>");let ref=import_react17.useRef(handler);ref.current=handler,import_react17.useEffect(()=>{let c=ctx.client,fn=(ev)=>ref.current(ev);return c.on("event",fn),c.drain(),()=>{c.off("event",fn)}},[ctx.client])}function useGatewayReady(){let ctx=import_react17.useContext(Gw);if(!ctx)throw Error("useGatewayReady() must be inside <GatewayProvider>");return ctx.ready}function useGatewayRestart(){let ctx=import_react17.useContext(Gw);if(!ctx)throw Error("useGatewayRestart() must be inside <GatewayProvider>");return ctx.restart}function text3(msg){return msg.parts.filter((p)=>p.type==="text").map((p)=>p.content).join("")}function mid(){return`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var pn=0;function pid(){return`p${++pn}`}var import_react26=__toESM(require_react_production(),1);var import_react25=__toESM(require_react_production(),1);var import_react21=__toESM(require_react_production(),1);var import_react20=__toESM(require_react_production(),1);var import_react18=__toESM(require_react_production(),1);function makeUse(ctx,name){return()=>{let v2=import_react18.useContext(ctx);if(v2===null)throw Error(`${name}() must be used inside its provider`);return v2}}function resolveTheme(theme,mode){let defs=theme.defs??{};function resolve4(c,chain=[]){if(c instanceof RGBA)return c;if(typeof c==="string"){if(c==="transparent"||c==="none")return RGBA.fromInts(0,0,0,0);if(c.startsWith("#"))return RGBA.fromHex(c);if(chain.includes(c))throw Error(`Circular color reference: ${[...chain,c].join(" -> ")}`);let next=defs[c]??theme.theme[c];if(next===void 0)throw Error(`Color reference "${c}" not found in defs or theme`);return resolve4(next,[...chain,c])}if(typeof c==="number")return ansiToRgba(c);return resolve4(c[mode],chain)}let resolved=Object.fromEntries(Object.entries(theme.theme).filter(([key])=>key!=="selectedListItemText"&&key!=="backgroundMenu"&&key!=="thinkingOpacity").map(([key,value])=>[key,resolve4(value)])),hasList=theme.theme.selectedListItemText!==void 0;resolved.selectedListItemText=hasList?resolve4(theme.theme.selectedListItemText):resolved.background,resolved.backgroundMenu=theme.theme.backgroundMenu!==void 0?resolve4(theme.theme.backgroundMenu):resolved.backgroundElement;let base={...resolved,_hasSelectedListItemText:hasList,thinkingOpacity:theme.theme.thinkingOpacity??0.6},herm=resolveHermTokens(resolved.accent);return{...base,...herm}}function resolveHermTokens(accent){return{hermAvatar:accent}}function ansiToRgba(code){if(code<16){let colors=["#000000","#800000","#008000","#808000","#000080","#800080","#008080","#c0c0c0","#808080","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff"];return RGBA.fromHex(colors[code]??"#000000")}if(code<232){let idx=code-16,val=(x2)=>x2===0?0:x2*40+55;return RGBA.fromInts(val(Math.floor(idx/36)),val(Math.floor(idx/6)%6),val(idx%6))}if(code<256){let gray=(code-232)*10+8;return RGBA.fromInts(gray,gray,gray)}return RGBA.fromInts(0,0,0)}var PREVIEW={ares:{primary:"#C7A96B",accent:"#DD4A3A",background:"#2A1212"},aura:{primary:"#a277ff",accent:"#a277ff",background:"#0f0f0f"},ayu:{primary:"#59C2FF",accent:"#E6B450",background:"#0B0E14"},carbonfox:{primary:"#33b1ff",accent:"#ff7eb6",background:"#161616"},"catppuccin-frappe":{primary:"#8da4e2",accent:"#f4b8e4",background:"#303446"},"catppuccin-macchiato":{primary:"#8aadf4",accent:"#f5bde6",background:"#24273a"},catppuccin:{primary:"#89b4fa",accent:"#f5c2e7",background:"#1e1e2e"},charizard:{primary:"#FFD39A",accent:"#F29C38",background:"#2B160E"},cobalt2:{primary:"#0088ff",accent:"#2affdf",background:"#193549"},cursor:{primary:"#88c0d0",accent:"#88c0d0",background:"#181818"},daylight:{primary:"#233662",accent:"#597FE9",background:"#101014"},default:{primary:"#FFD700",accent:"#FFBF00",background:"#1a1a2e"},dracula:{primary:"#bd93f9",accent:"#8be9fd",background:"#282a36"},everforest:{primary:"#a7c080",accent:"#d699b6",background:"#2d353b"},flexoki:{primary:"#DA702C",accent:"#8B7EC8",background:"#100F0F"},github:{primary:"#58a6ff",accent:"#39c5cf",background:"#0d1117"},gruvbox:{primary:"#83a598",accent:"#8ec07c",background:"#282828"},kanagawa:{primary:"#7E9CD8",accent:"#D27E99",background:"#1F1F28"},"lucent-orng":{primary:"#EC5B2B",accent:"#FFF7F1",background:"transparent"},material:{primary:"#82aaff",accent:"#89ddff",background:"#263238"},matrix:{primary:"#2eff6a",accent:"#c770ff",background:"#0a0e0a"},mercury:{primary:"#8da4f5",accent:"#8da4f5",background:"#171721"},mono:{primary:"#e6edf3",accent:"#aaaaaa",background:"#1F1F1F"},monokai:{primary:"#66d9ef",accent:"#a6e22e",background:"#272822"},nightowl:{primary:"#82AAFF",accent:"#c792ea",background:"#011627"},nord:{primary:"#88C0D0",accent:"#8FBCBB",background:"#2E3440"},"one-dark":{primary:"#61afef",accent:"#56b6c2",background:"#282c34"},opencode:{primary:"#fab283",accent:"#9d7cd8",background:"#0a0a0a"},orng:{primary:"#EC5B2B",accent:"#FFF7F1",background:"#0a0a0a"},"osaka-jade":{primary:"#2DD5B7",accent:"#549e6a",background:"#111c18"},palenight:{primary:"#82aaff",accent:"#89ddff",background:"#292d3e"},poseidon:{primary:"#A9DFFF",accent:"#5DB8F5",background:"#0F2440"},rosepine:{primary:"#9ccfd8",accent:"#ebbcba",background:"#191724"},sisyphus:{primary:"#F5F5F5",accent:"#E7E7E7",background:"#202020"},slate:{primary:"#7eb8f6",accent:"#8EA8FF",background:"#151C2F"},solarized:{primary:"#268bd2",accent:"#2aa198",background:"#002b36"},synthwave84:{primary:"#36f9f6",accent:"#b084eb",background:"#262335"},tokyonight:{primary:"#82aaff",accent:"#ff966c",background:"#1a1b26"},vercel:{primary:"#0070F3",accent:"#8E4EC6",background:"#000000"},vesper:{primary:"#FFC799",accent:"#FFC799",background:"#101010"},"warm-lightmode":{primary:"#9D681D",accent:"#CE661C",background:"#101014"},zenburn:{primary:"#8cd0d3",accent:"#93e0e3",background:"#3f3f3f"}},NAMES=Object.keys(PREVIEW).sort();var DEFAULT_THEME="tokyonight",THEME_NAMES=NAMES;var cache=new Map,pending=new Map;async function load(name){let hit=cache.get(name);if(hit)return hit;let inflight=pending.get(name);if(inflight)return inflight;if(!PREVIEW[name])throw Error(`Unknown theme: ${name}`);let p=import(`./themes/${name}.json`).then((m2)=>{let json=m2.default??m2;return cache.set(name,json),pending.delete(name),json});return pending.set(name,p),p}function get(name){return cache.get(name)}async function prime(name){await load(name).catch(()=>{return})}function syntax(theme){return SyntaxStyle.fromTheme(rules(theme))}function rules(theme){return[{scope:["default"],style:{foreground:theme.text}},{scope:["comment","comment.documentation"],style:{foreground:theme.syntaxComment,italic:!0}},{scope:["string","symbol"],style:{foreground:theme.syntaxString}},{scope:["number","boolean"],style:{foreground:theme.syntaxNumber}},{scope:["keyword"],style:{foreground:theme.syntaxKeyword,italic:!0}},{scope:["keyword.return","keyword.conditional","keyword.repeat"],style:{foreground:theme.syntaxKeyword,italic:!0}},{scope:["keyword.type"],style:{foreground:theme.syntaxType,bold:!0}},{scope:["keyword.function","function.method"],style:{foreground:theme.syntaxFunction}},{scope:["function","function.call"],style:{foreground:theme.syntaxFunction}},{scope:["variable","variable.parameter"],style:{foreground:theme.syntaxVariable}},{scope:["type"],style:{foreground:theme.syntaxType}},{scope:["operator"],style:{foreground:theme.syntaxOperator}},{scope:["punctuation","punctuation.bracket","punctuation.delimiter"],style:{foreground:theme.syntaxPunctuation}},{scope:["markup.heading"],style:{foreground:theme.markdownHeading,bold:!0}},{scope:["markup.strong"],style:{foreground:theme.markdownStrong,bold:!0}},{scope:["markup.italic"],style:{foreground:theme.markdownEmph,italic:!0}},{scope:["markup.link"],style:{foreground:theme.markdownLink,underline:!0}},{scope:["markup.raw"],style:{foreground:theme.markdownCode}},{scope:["markup.list"],style:{foreground:theme.markdownListItem}}]}import{existsSync as existsSync7,readFileSync,readdirSync as readdirSync2}from"fs";import{basename as basename2,extname,join as join3}from"path";import{homedir as homedir2}from"os";import{join as join2}from"path";import{existsSync as existsSync6,mkdirSync,readdirSync,renameSync}from"fs";var HOME=()=>process.env.HOME||homedir2(),HERMES_HOME=()=>process.env.HERMES_HOME||join2(HOME(),".hermes"),migrated=!1;function configDir(){let dir=process.env.HERM_CONFIG_DIR||join2(HERMES_HOME(),"herm");if(!migrated)migrated=!0,maybeMigrateLegacy(dir);return dir}function maybeMigrateLegacy(target){if(process.env.HERM_CONFIG_DIR)return;let legacy=join2(HOME(),".config","herm");if(!existsSync6(legacy)||legacy===target)return;try{if(existsSync6(target)&&readdirSync(target).length>0)return;mkdirSync(target,{recursive:!0});for(let name of readdirSync(legacy)){let src=join2(legacy,name),dst=join2(target,name);if(existsSync6(dst))continue;try{renameSync(src,dst)}catch{}}}catch{}}var read=(path4)=>{try{let raw=JSON.parse(readFileSync(path4,"utf8"));if(!raw||typeof raw!=="object")return null;if(!raw.theme||typeof raw.theme!=="object")return null;return[basename2(path4,extname(path4)),raw]}catch{return null}};function userThemes(){let dir=join3(configDir(),"themes");if(!existsSync7(dir))return{};return Object.fromEntries(readdirSync2(dir,{withFileTypes:!0}).filter((e)=>e.isFile()&&e.name.endsWith(".json")).map((e)=>read(join3(dir,e.name))).filter((e)=>e!==null))}var exports_preferences={};__export(exports_preferences,{useRev:()=>useRev,usePref:()=>usePref,set:()=>set,reset:()=>reset,reload:()=>reload,prefs:()=>exports_preferences,load:()=>load2,get:()=>get2});var import_react19=__toESM(require_react_production(),1);import{join as join4}from"path";import{existsSync as existsSync8,mkdirSync as mkdirSync2,readFileSync as readFileSync2,writeFileSync as writeFileSync2}from"fs";var DEFAULTS={mouse:!0,targetFps:30};function configFile(){return join4(configDir(),"tui.json")}var cached=null,rev=0;function reset(){cached=null}function reload(){cached=null,rev++;for(let l of listeners)l()}function load2(){if(cached)return cached;let CONFIG_FILE=configFile();try{if(!existsSync8(CONFIG_FILE)){let prefs2={...DEFAULTS};return cached=prefs2,prefs2}let raw=JSON.parse(readFileSync2(CONFIG_FILE,"utf-8"));if(raw.eikonPath&&!raw.eikon)raw.eikon=raw.eikonPath.split("/").pop()?.replace(/\.eikon$/,""),delete raw.eikonPath;let prefs={...DEFAULTS,...raw};return cached=prefs,prefs}catch{let prefs={...DEFAULTS};return cached=prefs,prefs}}function save(partial){let current=load2();if(partial)Object.assign(current,partial);cached=current;try{let CONFIG_DIR=configDir();if(!existsSync8(CONFIG_DIR))mkdirSync2(CONFIG_DIR,{recursive:!0});let json=JSON.stringify(current,null,2)+`
|
|
3676
|
+
`)}catch(e){clearTimeout(timeout),this.pending.delete(rid),reject(e instanceof Error?e:Error(String(e)))}})}remote(raw,method,params){let blocked=exports_backend_contract.contractError(method,this.contract,params);if(blocked)return Promise.reject(blocked);try{websocketUrl(raw)}catch(err){return Promise.reject(err instanceof Error?err:Error(String(err)))}if(this.target!==raw||!this.ws||this.ws.readyState===WS_CLOSING||this.ws.readyState===WS_CLOSED)this.start();let rid=`r${++this.id}`,merged=this.sid&¶ms.session_id===void 0?{session_id:this.sid,...params}:params;return new Promise((resolve4,reject)=>{let timeout=setTimeout(()=>{if(this.pending.delete(rid))reject(Error(`timeout: ${method}`))},REQUEST_MS);this.pending.set(rid,{reject:(e)=>{clearTimeout(timeout),reject(e)},resolve:(value)=>{clearTimeout(timeout),resolve4(value)}}),(async()=>{try{if(this.ws?.readyState===WS_CONNECTING)await this.link;if(!this.pending.has(rid))return;if(!this.ws||this.ws.readyState!==WS_OPEN)throw Error(`gateway not connected: ${method}`);let frame=encode({jsonrpc:"2.0",id:rid,method,params:merged});if(frame.issues.length){let detail=frame.issues.map((x2)=>`${x2.path}:${x2.count}`).join(", ");this.log(`[wire] sanitized invalid unicode for ${method}: ${detail}`)}this.ws.send(frame.text)}catch(err){if(clearTimeout(timeout),this.pending.delete(rid))reject(err instanceof Error?err:Error(String(err)))}})()})}kill(){this.proc?.kill();let ws=this.ws;if(!ws)return;if(this.ws=null,this.link=null,this.target=null,this.timer)clearTimeout(this.timer),this.timer=null;this.fail(Error("gateway websocket closed"));try{ws.close()}catch{}}get ready(){return this.ok}}var Gw=import_react17.createContext(null),GatewayProvider=({client,children})=>{let ref=import_react17.useRef(null);if(!ref.current)ref.current=client??new GatewayClient;let[ready,setReady]=import_react17.useState(ref.current.ready),retry=import_react17.useRef({attempts:0});import_react17.useEffect(()=>{let c=ref.current,onEvent=(ev)=>{if(ev.type==="gateway.ready"||ev.type==="session.info")setReady(!0);if(ev.type==="session.info"){if(retry.current.timer)clearTimeout(retry.current.timer);retry.current={attempts:0}}},onExit=()=>{if(setReady(!1),retry.current.timer)clearTimeout(retry.current.timer);if(retry.current.attempts>=3)return;let delay=250*2**retry.current.attempts++;retry.current.timer=setTimeout(()=>c.start(),delay)};c.on("event",onEvent),c.on("exit",onExit);let dead=!1;return c.start(),queueMicrotask(()=>{if(!dead)c.drain()}),()=>{if(dead=!0,c.off("event",onEvent),c.off("exit",onExit),retry.current.timer)clearTimeout(retry.current.timer);c.removeAllListeners(),c.kill()}},[]);let restart=import_react17.useCallback((mode="resume")=>{if(retry.current.timer)clearTimeout(retry.current.timer);retry.current={attempts:0},setReady(!1),ref.current.emit("restart",mode),ref.current.start()},[]),value=import_react17.useMemo(()=>({client:ref.current,ready,restart}),[ready,restart]);return $jsx(Gw.Provider,{value,children})};function useGateway(){let ctx=import_react17.useContext(Gw);if(!ctx)throw Error("useGateway() must be inside <GatewayProvider>");return ctx.client}function useGatewayEvent(handler){let ctx=import_react17.useContext(Gw);if(!ctx)throw Error("useGatewayEvent() must be inside <GatewayProvider>");let ref=import_react17.useRef(handler);ref.current=handler,import_react17.useEffect(()=>{let c=ctx.client,fn=(ev)=>ref.current(ev);return c.on("event",fn),c.drain(),()=>{c.off("event",fn)}},[ctx.client])}function useGatewayReady(){let ctx=import_react17.useContext(Gw);if(!ctx)throw Error("useGatewayReady() must be inside <GatewayProvider>");return ctx.ready}function useGatewayRestart(){let ctx=import_react17.useContext(Gw);if(!ctx)throw Error("useGatewayRestart() must be inside <GatewayProvider>");return ctx.restart}function text3(msg){return msg.parts.filter((p)=>p.type==="text").map((p)=>p.content).join("")}function mid(){return`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var pn=0;function pid(){return`p${++pn}`}var import_react26=__toESM(require_react_production(),1);var import_react25=__toESM(require_react_production(),1);var import_react21=__toESM(require_react_production(),1);var import_react20=__toESM(require_react_production(),1);var import_react18=__toESM(require_react_production(),1);function makeUse(ctx,name){return()=>{let v2=import_react18.useContext(ctx);if(v2===null)throw Error(`${name}() must be used inside its provider`);return v2}}function resolveTheme(theme,mode){let defs=theme.defs??{};function resolve4(c,chain=[]){if(c instanceof RGBA)return c;if(typeof c==="string"){if(c==="transparent"||c==="none")return RGBA.fromInts(0,0,0,0);if(c.startsWith("#"))return RGBA.fromHex(c);if(chain.includes(c))throw Error(`Circular color reference: ${[...chain,c].join(" -> ")}`);let next=defs[c]??theme.theme[c];if(next===void 0)throw Error(`Color reference "${c}" not found in defs or theme`);return resolve4(next,[...chain,c])}if(typeof c==="number")return ansiToRgba(c);return resolve4(c[mode],chain)}let resolved=Object.fromEntries(Object.entries(theme.theme).filter(([key])=>key!=="selectedListItemText"&&key!=="backgroundMenu"&&key!=="thinkingOpacity").map(([key,value])=>[key,resolve4(value)])),hasList=theme.theme.selectedListItemText!==void 0;resolved.selectedListItemText=hasList?resolve4(theme.theme.selectedListItemText):resolved.background,resolved.backgroundMenu=theme.theme.backgroundMenu!==void 0?resolve4(theme.theme.backgroundMenu):resolved.backgroundElement;let base={...resolved,_hasSelectedListItemText:hasList,thinkingOpacity:theme.theme.thinkingOpacity??0.6},herm=resolveHermTokens(resolved.accent);return{...base,...herm}}function resolveHermTokens(accent){return{hermAvatar:accent}}function ansiToRgba(code){if(code<16){let colors=["#000000","#800000","#008000","#808000","#000080","#800080","#008080","#c0c0c0","#808080","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff"];return RGBA.fromHex(colors[code]??"#000000")}if(code<232){let idx=code-16,val=(x2)=>x2===0?0:x2*40+55;return RGBA.fromInts(val(Math.floor(idx/36)),val(Math.floor(idx/6)%6),val(idx%6))}if(code<256){let gray=(code-232)*10+8;return RGBA.fromInts(gray,gray,gray)}return RGBA.fromInts(0,0,0)}var PREVIEW={ares:{primary:"#C7A96B",accent:"#DD4A3A",background:"#2A1212"},aura:{primary:"#a277ff",accent:"#a277ff",background:"#0f0f0f"},ayu:{primary:"#59C2FF",accent:"#E6B450",background:"#0B0E14"},carbonfox:{primary:"#33b1ff",accent:"#ff7eb6",background:"#161616"},"catppuccin-frappe":{primary:"#8da4e2",accent:"#f4b8e4",background:"#303446"},"catppuccin-macchiato":{primary:"#8aadf4",accent:"#f5bde6",background:"#24273a"},catppuccin:{primary:"#89b4fa",accent:"#f5c2e7",background:"#1e1e2e"},charizard:{primary:"#FFD39A",accent:"#F29C38",background:"#2B160E"},cobalt2:{primary:"#0088ff",accent:"#2affdf",background:"#193549"},cursor:{primary:"#88c0d0",accent:"#88c0d0",background:"#181818"},daylight:{primary:"#233662",accent:"#597FE9",background:"#101014"},default:{primary:"#FFD700",accent:"#FFBF00",background:"#1a1a2e"},dracula:{primary:"#bd93f9",accent:"#8be9fd",background:"#282a36"},everforest:{primary:"#a7c080",accent:"#d699b6",background:"#2d353b"},flexoki:{primary:"#DA702C",accent:"#8B7EC8",background:"#100F0F"},github:{primary:"#58a6ff",accent:"#39c5cf",background:"#0d1117"},gruvbox:{primary:"#83a598",accent:"#8ec07c",background:"#282828"},kanagawa:{primary:"#7E9CD8",accent:"#D27E99",background:"#1F1F28"},"lucent-orng":{primary:"#EC5B2B",accent:"#FFF7F1",background:"transparent"},material:{primary:"#82aaff",accent:"#89ddff",background:"#263238"},matrix:{primary:"#2eff6a",accent:"#c770ff",background:"#0a0e0a"},mercury:{primary:"#8da4f5",accent:"#8da4f5",background:"#171721"},mono:{primary:"#e6edf3",accent:"#aaaaaa",background:"#1F1F1F"},monokai:{primary:"#66d9ef",accent:"#a6e22e",background:"#272822"},nightowl:{primary:"#82AAFF",accent:"#c792ea",background:"#011627"},nord:{primary:"#88C0D0",accent:"#8FBCBB",background:"#2E3440"},"one-dark":{primary:"#61afef",accent:"#56b6c2",background:"#282c34"},opencode:{primary:"#fab283",accent:"#9d7cd8",background:"#0a0a0a"},orng:{primary:"#EC5B2B",accent:"#FFF7F1",background:"#0a0a0a"},"osaka-jade":{primary:"#2DD5B7",accent:"#549e6a",background:"#111c18"},palenight:{primary:"#82aaff",accent:"#89ddff",background:"#292d3e"},poseidon:{primary:"#A9DFFF",accent:"#5DB8F5",background:"#0F2440"},rosepine:{primary:"#9ccfd8",accent:"#ebbcba",background:"#191724"},sisyphus:{primary:"#F5F5F5",accent:"#E7E7E7",background:"#202020"},slate:{primary:"#7eb8f6",accent:"#8EA8FF",background:"#151C2F"},solarized:{primary:"#268bd2",accent:"#2aa198",background:"#002b36"},synthwave84:{primary:"#36f9f6",accent:"#b084eb",background:"#262335"},tokyonight:{primary:"#82aaff",accent:"#ff966c",background:"#1a1b26"},vercel:{primary:"#0070F3",accent:"#8E4EC6",background:"#000000"},vesper:{primary:"#FFC799",accent:"#FFC799",background:"#101010"},"warm-lightmode":{primary:"#9D681D",accent:"#CE661C",background:"#101014"},zenburn:{primary:"#8cd0d3",accent:"#93e0e3",background:"#3f3f3f"}},NAMES=Object.keys(PREVIEW).sort();var DEFAULT_THEME="tokyonight",THEME_NAMES=NAMES;var cache=new Map,pending=new Map;async function load(name){let hit=cache.get(name);if(hit)return hit;let inflight=pending.get(name);if(inflight)return inflight;if(!PREVIEW[name])throw Error(`Unknown theme: ${name}`);let p=import(`./themes/${name}.json`).then((m2)=>{let json=m2.default??m2;return cache.set(name,json),pending.delete(name),json});return pending.set(name,p),p}function get(name){return cache.get(name)}async function prime(name){await load(name).catch(()=>{return})}function syntax(theme){return SyntaxStyle.fromTheme(rules(theme))}function rules(theme){return[{scope:["default"],style:{foreground:theme.text}},{scope:["comment","comment.documentation"],style:{foreground:theme.syntaxComment,italic:!0}},{scope:["string","symbol"],style:{foreground:theme.syntaxString}},{scope:["number","boolean"],style:{foreground:theme.syntaxNumber}},{scope:["keyword"],style:{foreground:theme.syntaxKeyword,italic:!0}},{scope:["keyword.return","keyword.conditional","keyword.repeat"],style:{foreground:theme.syntaxKeyword,italic:!0}},{scope:["keyword.type"],style:{foreground:theme.syntaxType,bold:!0}},{scope:["keyword.function","function.method"],style:{foreground:theme.syntaxFunction}},{scope:["function","function.call"],style:{foreground:theme.syntaxFunction}},{scope:["variable","variable.parameter"],style:{foreground:theme.syntaxVariable}},{scope:["type"],style:{foreground:theme.syntaxType}},{scope:["operator"],style:{foreground:theme.syntaxOperator}},{scope:["punctuation","punctuation.bracket","punctuation.delimiter"],style:{foreground:theme.syntaxPunctuation}},{scope:["markup.heading"],style:{foreground:theme.markdownHeading,bold:!0}},{scope:["markup.strong"],style:{foreground:theme.markdownStrong,bold:!0}},{scope:["markup.italic"],style:{foreground:theme.markdownEmph,italic:!0}},{scope:["markup.link"],style:{foreground:theme.markdownLink,underline:!0}},{scope:["markup.raw"],style:{foreground:theme.markdownCode}},{scope:["markup.list"],style:{foreground:theme.markdownListItem}}]}import{existsSync as existsSync7,readFileSync,readdirSync as readdirSync2}from"fs";import{basename as basename2,extname,join as join3}from"path";import{homedir as homedir2}from"os";import{join as join2}from"path";import{existsSync as existsSync6,mkdirSync,readdirSync,renameSync}from"fs";var HOME=()=>process.env.HOME||homedir2(),HERMES_HOME=()=>process.env.HERMES_HOME||join2(HOME(),".hermes"),migrated=!1;function configDir(){let dir=process.env.HERM_CONFIG_DIR||join2(HERMES_HOME(),"herm");if(!migrated)migrated=!0,maybeMigrateLegacy(dir);return dir}function maybeMigrateLegacy(target){if(process.env.HERM_CONFIG_DIR)return;let legacy=join2(HOME(),".config","herm");if(!existsSync6(legacy)||legacy===target)return;try{if(existsSync6(target)&&readdirSync(target).length>0)return;mkdirSync(target,{recursive:!0});for(let name of readdirSync(legacy)){let src=join2(legacy,name),dst=join2(target,name);if(existsSync6(dst))continue;try{renameSync(src,dst)}catch{}}}catch{}}var read=(path4)=>{try{let raw=JSON.parse(readFileSync(path4,"utf8"));if(!raw||typeof raw!=="object")return null;if(!raw.theme||typeof raw.theme!=="object")return null;return[basename2(path4,extname(path4)),raw]}catch{return null}};function userThemes(){let dir=join3(configDir(),"themes");if(!existsSync7(dir))return{};return Object.fromEntries(readdirSync2(dir,{withFileTypes:!0}).filter((e)=>e.isFile()&&e.name.endsWith(".json")).map((e)=>read(join3(dir,e.name))).filter((e)=>e!==null))}var exports_preferences={};__export(exports_preferences,{useRev:()=>useRev,usePref:()=>usePref,set:()=>set,reset:()=>reset,reload:()=>reload,prefs:()=>exports_preferences,load:()=>load2,get:()=>get2});var import_react19=__toESM(require_react_production(),1);import{join as join4}from"path";import{existsSync as existsSync8,mkdirSync as mkdirSync2,readFileSync as readFileSync2,writeFileSync as writeFileSync2}from"fs";var DEFAULTS={mouse:!0,targetFps:30};function configFile(){return join4(configDir(),"tui.json")}var cached=null,rev=0;function reset(){cached=null}function reload(){cached=null,rev++;for(let l of listeners)l()}function load2(){if(cached)return cached;let CONFIG_FILE=configFile();try{if(!existsSync8(CONFIG_FILE)){let prefs2={...DEFAULTS};return cached=prefs2,prefs2}let raw=JSON.parse(readFileSync2(CONFIG_FILE,"utf-8"));if(raw.eikonPath&&!raw.eikon)raw.eikon=raw.eikonPath.split("/").pop()?.replace(/\.eikon$/,""),delete raw.eikonPath;let prefs={...DEFAULTS,...raw};return cached=prefs,prefs}catch{let prefs={...DEFAULTS};return cached=prefs,prefs}}function save(partial){let current=load2();if(partial)Object.assign(current,partial);cached=current;try{let CONFIG_DIR=configDir();if(!existsSync8(CONFIG_DIR))mkdirSync2(CONFIG_DIR,{recursive:!0});let json=JSON.stringify(current,null,2)+`
|
|
3677
3677
|
`;writeFileSync2(configFile(),json,"utf-8")}catch(err){if(process.env.PERF)console.error("[preferences] failed to save:",err)}}function get2(key){return load2()[key]}function set(key,value){if(load2()[key]===value)return;save({[key]:value}),rev++;for(let l of listeners)l()}var listeners=new Set;function subscribe(l){return listeners.add(l),()=>listeners.delete(l)}function usePref(key){return import_react19.useSyncExternalStore(subscribe,()=>load2()[key])}function useRev(){return import_react19.useSyncExternalStore(subscribe,()=>rev)}var Ctx=import_react20.createContext(null),THEMES_SET=new Set(THEME_NAMES),ThemeProvider=({children,initial,mode:initialMode="dark"})=>{let pref=usePref("theme"),modePref=usePref("themeMode"),rev2=useRev(),users=import_react20.useMemo(()=>userThemes(),[pref,rev2]),names=import_react20.useMemo(()=>[...new Set([...THEME_NAMES,...Object.keys(users)])].sort(),[users]),hasName=import_react20.useCallback((name)=>THEMES_SET.has(name)||users[name]!==void 0,[users]),active=pref&&hasName(pref)?pref:initial&&hasName(initial)?initial:DEFAULT_THEME,mode=modePref==="light"||modePref==="dark"?modePref:initialMode,[tick,force]=import_react20.useState(0);import_react20.useEffect(()=>{if((users[active]||get(active))&&get(DEFAULT_THEME))return;let cancelled=!1,need=[active,DEFAULT_THEME].filter((n)=>!users[n]&&!get(n)&&THEMES_SET.has(n));return Promise.all(need.map((n)=>load(n).catch(()=>{return}))).then(()=>{if(!cancelled)force((n)=>n+1)}),()=>{cancelled=!0}},[active,users]);let resolved=import_react20.useMemo(()=>{let json=users[active]??get(active)??get(DEFAULT_THEME);if(!json)return null;try{return resolveTheme(json,mode)}catch{let fallback=get(DEFAULT_THEME);return fallback?resolveTheme(fallback,mode):null}},[active,mode,tick,users]),set2=import_react20.useCallback((name)=>{if(!hasName(name))return!1;if(set("theme",name),THEMES_SET.has(name)&&!get(name))load(name).catch(()=>{});return!0},[hasName]),setMode=import_react20.useCallback((mode2)=>{set("themeMode",mode2)},[]),has=hasName,syntaxStyle=import_react20.useMemo(()=>resolved?syntax(resolved):null,[resolved]),value=import_react20.useMemo(()=>{if(!resolved||!syntaxStyle)return null;return{theme:resolved,syntaxStyle,name:active,mode,set:set2,setMode,names,has}},[resolved,syntaxStyle,active,mode,set2,setMode,names,has]);if(!value)return null;return $jsx(Ctx.Provider,{value,children})},useTheme=makeUse(Ctx,"useTheme");var ANSI2=new RegExp(["\\x1B\\[[\\x30-\\x3F]*[\\x20-\\x2F]*[\\x40-\\x7E]","\\x1B\\[[\\x30-\\x3F]*[\\x20-\\x2F]*","\\x1B\\][^\\x07\\x1B]*(?:\\x07|\\x1B\\\\)?","\\x1B[PX^_][^\\x1B]*(?:\\x1B\\\\)?","\\x1B[\\x20-\\x7E]","\\x1B"].join("|"),"g"),CTRL=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/g;function sanitize(s){if(!s)return"";return s.replace(ANSI2,"").replace(CTRL,"")}function isDiff(s){if(!s)return!1;return/^--- a\//m.test(s)||/^@@ /m.test(s)||/^diff --git /m.test(s)}var CAP=80,WORD_CAP=40,tokens=(s)=>s.split(/(\s+)/).filter((t2)=>t2.length>0);function wordDiff(a,b2){let ta=tokens(a),tb=tokens(b2),p=0;while(p<ta.length&&p<tb.length&&ta[p]===tb[p])p++;let s=0;while(s<ta.length-p&&s<tb.length-p&&ta[ta.length-1-s]===tb[tb.length-1-s])s++;let seg=(t2)=>{let mid2=t2.slice(p,t2.length-s).join(""),out=[];if(p)out.push({text:t2.slice(0,p).join(""),hi:!1});if(mid2)out.push({text:mid2,hi:!0});if(s)out.push({text:t2.slice(t2.length-s).join(""),hi:!1});return out};return[seg(ta),seg(tb)]}function intraline(rows){let marks=rows.map(()=>null);if(rows.length>WORD_CAP)return marks;let del=(l)=>l.startsWith("-")&&!l.startsWith("---"),add=(l)=>l.startsWith("+")&&!l.startsWith("+++"),i=0;while(i<rows.length){if(!del(rows[i])){i++;continue}let j2=i;while(j2<rows.length&&del(rows[j2]))j2++;let k2=j2;while(k2<rows.length&&add(rows[k2]))k2++;let n=Math.min(j2-i,k2-j2);for(let d2=0;d2<n;d2++){let[rm,ad]=wordDiff(rows[i+d2].slice(1),rows[j2+d2].slice(1));marks[i+d2]=rm,marks[j2+d2]=ad}i=k2}return marks}var DiffBlock=import_react21.memo(({text:text4})=>{let theme=useTheme().theme,all=sanitize(text4).replace(/\n$/,"").split(`
|
|
3678
3678
|
`),rows=all.slice(0,CAP),more=all.length-rows.length,marks=intraline(rows),fg2=(l)=>l.startsWith("@@")?theme.accent:l.startsWith("+++")||l.startsWith("---")?theme.textMuted:l.startsWith("+")?theme.success:l.startsWith("-")?theme.error:theme.textMuted;return $jsxs("box",{flexDirection:"column",backgroundColor:theme.backgroundPanel,children:[rows.map((l,i)=>{let segs=marks[i],bg2=l.startsWith("+")?theme.diffAddedBg:theme.diffRemovedBg;return $jsx("box",{height:1,overflow:"hidden",minWidth:0,children:$jsx("text",{fg:fg2(l),children:segs?$jsxs($Fragment,{children:[l[0],segs.map((s,j2)=>s.hi?$jsx("span",{bg:bg2,children:s.text},j2):s.text)]}):l||" "})},i)}),more>0?$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:["\u2026 ",more," more lines"]})}):null]})});var import_react23=__toESM(require_react_production(),1);var import_react22=__toESM(require_react_production(),1);var FRAMES=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],MS=80,subs=new Set,tick=0,timer=null;function sub(fn){if(subs.add(fn),fn(tick),!timer)timer=setInterval(()=>{tick=(tick+1)%FRAMES.length;for(let s of Array.from(subs))s(tick)},MS);return()=>{if(subs.delete(fn),subs.size===0&&timer)clearInterval(timer),timer=null}}function useGlyph(active){let ref=import_react22.useRef(null);return import_react22.useEffect(()=>{if(!active)return;return sub((n)=>{let node=ref.current;if(node)node.children=[FRAMES[n]]})},[active]),ref}var Spinner=import_react22.memo((props)=>{let theme=useTheme().theme,color=props.color??theme.textMuted,on=exports_preferences.get("animations")!==!1,ref=useGlyph(on);return $jsxs("text",{children:[$jsx("span",{ref,fg:color,children:on?FRAMES[tick]:"\u22EF"}),props.label?$jsxs("span",{fg:color,children:[" ",props.label]}):null]})}),SpinGlyph=import_react22.memo((props)=>{let on=(props.active??!0)&&exports_preferences.get("animations")!==!1,ref=useGlyph(on);return $jsx("span",{ref,fg:props.fg,children:on?FRAMES[tick]:"\u22EF"})});function useSpinnerGlyph(active=!0){let on=exports_preferences.get("animations")!==!1&&active,[n,set2]=import_react22.useState(tick);return import_react22.useEffect(()=>on?sub(set2):void 0,[on]),on?FRAMES[n]:"\u22EF"}var SPEC={terminal:{icon:"$",verb:"",pending:"Writing command\u2026"},process:{icon:"\u229A",verb:"Process",pending:"Managing process\u2026"},execute_code:{icon:"\xBB",verb:"Exec",pending:"Writing script\u2026"},read_file:{icon:"\u2192",verb:"Read",pending:"Reading file\u2026"},write_file:{icon:"\u2190",verb:"Write",pending:"Preparing write\u2026"},patch:{icon:"\u2190",verb:"Edit",pending:"Preparing edit\u2026"},search_files:{icon:"\u2731",verb:"Search",pending:"Searching\u2026"},web_search:{icon:"\u25C8",verb:"Web",pending:"Searching web\u2026"},web_extract:{icon:"%",verb:"Fetch",pending:"Fetching page\u2026"},session_search:{icon:"\u21BA",verb:"Recall",pending:"Searching memory\u2026"},browser_navigate:{icon:"%",verb:"Navigate",pending:"Navigating\u2026"},browser_click:{icon:"\xB7",verb:"Click",pending:"Clicking\u2026"},browser_type:{icon:"\u2328",verb:"Type",pending:"Typing\u2026"},browser_snapshot:{icon:"\u2399",verb:"Snapshot",pending:"Capturing\u2026"},browser_vision:{icon:"\u25C9",verb:"Vision",pending:"Looking\u2026"},vision_analyze:{icon:"\u25C9",verb:"Vision",pending:"Analyzing image\u2026"},todo:{icon:"\u2630",verb:"Todo",pending:"Updating todos\u2026"},memory:{icon:"\u2691",verb:"Memory",pending:"Updating memory\u2026"},clarify:{icon:"?",verb:"Ask",pending:"Asking\u2026"},skill_view:{icon:"\u25C6",verb:"Skill",pending:"Loading skill\u2026"},skills_list:{icon:"\u25C6",verb:"Skills",pending:"Listing skills\u2026"},skill_manage:{icon:"\u25C6",verb:"Skill",pending:"Managing skill\u2026"},delegate_task:{icon:"\u2299",verb:"Delegate",pending:"Spawning agent\u2026"},cronjob:{icon:"\u25F7",verb:"Cron",pending:"Managing cron\u2026"},text_to_speech:{icon:"\u266A",verb:"TTS",pending:"Synthesizing\u2026"},image_generate:{icon:"\u2726",verb:"Image",pending:"Generating image\u2026"},video_generate:{icon:"\u2726",verb:"Video",pending:"Generating video\u2026"}},GENERIC={icon:"\u2699",verb:"",pending:"Running\u2026"};function spec(name){if(name.startsWith("subagent"))return{icon:"\u2299",verb:"Subagent",pending:"Running\u2026"};if(name.startsWith("mcp__")||name.startsWith("mcp:"))return{icon:"\u25C7",verb:"MCP",pending:"Calling\u2026"};return SPEC[name]??GENERIC}function ms(d2){if(d2==null)return"";if(d2<1000)return`${Math.round(d2)}ms`;if(d2<60000)return`${(d2/1000).toFixed(1)}s`;return`${Math.floor(d2/60000)}m${Math.round(d2%60000/1000)}s`}var lead=(branch)=>branch==="mid"?"\u251C\u2500 ":"\u2514\u2500 ",rail=(branch)=>branch==="mid"?"\u2502 ":" ",DetailRow=import_react23.memo((p)=>{let theme=useTheme().theme,fg2=p.detail.tone==="error"?theme.error:theme.textMuted,stem=rail(p.branch),fork=p.last?"\u2514\u2500 ":"\u251C\u2500 ",pad=p.last?" ":"\u2502 ",lines2=p.detail.text.replace(/\t/g," ").split(`
|
|
3679
3679
|
`);return $jsxs("box",{flexDirection:"column",children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsxs("span",{fg:theme.textMuted,children:[stem,fork]}),$jsx("span",{fg:fg2,children:p.detail.label})]})}),lines2.map((line,i)=>$jsx("box",{minHeight:1,children:$jsxs("text",{fg:fg2,wrapMode:"word",children:[stem,pad,line||" "]})},i))]})}),InlineTool=import_react23.memo((p)=>{let theme=useTheme().theme,[hover,setHover]=import_react23.useState(!1),s=spec(p.part.name),branch=p.branch??"last",running=p.part.status==="running",failed=p.part.status==="error",spin=useSpinnerGlyph(running),fg2=failed?theme.error:hover&&p.onClick?theme.text:running?theme.text:theme.textMuted;return $jsxs("box",{flexDirection:"column",onMouseOver:p.onClick?()=>setHover(!0):void 0,onMouseOut:p.onClick?()=>setHover(!1):void 0,onMouseDown:p.onClick,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:lead(branch)}),$jsxs("span",{fg:running?theme.warning:p.iconColor??fg2,children:[running?spin:"\u25CF"," "]}),p.complete??!0?$jsx("span",{fg:fg2,children:p.children}):$jsxs("span",{fg:fg2,children:["~ ",s.pending]}),p.part.duration!=null?$jsxs("span",{fg:theme.textMuted,children:[" ",ms(p.part.duration)]}):null]})}),p.details?.map((detail,i,list)=>$jsx(DetailRow,{branch,detail,last:i===list.length-1},detail.label))]})});var import_react24=__toESM(require_react_production(),1);function dur(d2){if(d2==null)return"";let s=d2/1000;return s<60?`${s.toFixed(1)}s`:`${Math.floor(s/60)}m${Math.round(s%60)}s`}var Subagent=import_react24.memo(({branch="last",tool})=>{let theme=useTheme().theme,[open,setOpen]=import_react24.useState(!1),running=tool.status==="running",failed=tool.status==="error",spin=useSpinnerGlyph(running),trail=tool.trail??[],last=trail[trail.length-1],stem=rail(branch),fg2=failed?theme.error:running?theme.text:theme.textMuted,goal=(tool.goal??tool.preview??"").replace(/\s+/g," ").trim(),sub2=running?last?`\u21B3 ${spec(last.name).verb||last.name} ${last.preview??""}`:trail.length?`\u21B3 ${trail.length} toolcalls`:"":`\u2514\u2500 ${trail.length} toolcall${trail.length===1?"":"s"}${tool.duration?` \xB7 ${dur(tool.duration)}`:""}`;return $jsxs("box",{flexDirection:"column",onMouseDown:trail.length?()=>setOpen((o)=>!o):void 0,children:[$jsx("box",{minHeight:1,children:$jsxs("text",{wrapMode:"word",children:[$jsx("span",{fg:theme.textMuted,children:lead(branch)}),$jsxs("span",{fg:running?theme.warning:fg2,children:[running?spin:"\u25CF"," "]}),$jsxs("span",{fg:fg2,children:["Task \u2014 ",goal||"delegating\u2026"]})]})}),open?$jsxs("box",{flexDirection:"column",children:[trail.map((c,i)=>{let s=spec(c.name),lbl=s.verb?`${s.verb} ${c.preview??""}`:c.preview??c.name;return $jsx("box",{height:1,children:$jsxs("text",{children:[$jsxs("span",{fg:theme.textMuted,children:[stem,i<trail.length-1?"\u251C\u2500 ":"\u2514\u2500 "]}),$jsxs("span",{fg:theme.textMuted,children:[s.icon," ",lbl]})]})},i)}),tool.result?$jsx("box",{minHeight:1,children:$jsxs("text",{fg:theme.textMuted,wrapMode:"word",children:[stem," ",tool.result]})}):null]}):sub2?$jsx("box",{minHeight:1,children:$jsxs("text",{fg:theme.textMuted,wrapMode:"word",children:[stem,sub2]})}):null]})});var CHARS=800,LINES=12,TRAIL=8;function short(s,n=120){if(!s)return"";let one=s.replace(/\s+/g," ").trim();return one.length>n?one.slice(0,n-1)+"\u2026":one}function cap(s){let raw=s.trim(),n=1;for(let i=0;i<raw.length;i++){if(i>=CHARS)return`${raw.slice(0,i).trimEnd()}
|
|
@@ -4103,7 +4103,7 @@ tell application "System Events" to get value of property list item "CFBundleNam
|
|
|
4103
4103
|
`).filter((l)=>!STRIPS.some((re2)=>re2.test(l))).join(`
|
|
4104
4104
|
`)}var base=(p)=>p.split(/[\\/]/).filter(Boolean).pop()??p,parent=(p)=>{let parts2=p.split(/[\\/]/).filter(Boolean);return parts2.length>=2?parts2[parts2.length-2]:""},trunc2=(s,n)=>s.length<=n?s:"\u2026"+s.slice(-(n-1));function buildTabs(tools){let raw=tools.flatMap((t2)=>{let rawDiff=t2.diff??(isDiff(t2.result)?t2.result:void 0);if(!rawDiff)return[];return[{tool:t2,path:pathFor(t2),diff:sanitizeDiff(rawDiff)}]}),counts=new Map;return raw.forEach((r)=>counts.set(base(r.path),(counts.get(base(r.path))??0)+1)),raw.map(({tool,path:path4,diff})=>{let b2=base(path4),dup=(counts.get(b2)??0)>1&&parent(path4),label=trunc2(dup?`${parent(path4)}/${b2}`:b2,24),lines3=diff.split(`
|
|
4105
4105
|
`),add=lines3.filter((l)=>/^\+(?!\+\+)/.test(l)).length,del=lines3.filter((l)=>/^-(?!--)/.test(l)).length;return{id:tool.id||`${tool.name}-${path4}`,label,diff,add,del}})}var DiffTabs=import_react44.memo(({tools})=>{let theme=useTheme().theme,tabs=import_react44.useMemo(()=>buildTabs(tools),[tools]),[active,setActive]=import_react44.useState(null);if(tabs.length===0)return null;let idx=active===null?null:Math.min(active,tabs.length-1),cur=idx===null?null:tabs[idx];return $jsxs("box",{flexDirection:"column",marginTop:1,border:["left"],borderColor:theme.border,customBorderChars:LEFT_BAR,backgroundColor:theme.backgroundPanel,paddingLeft:1,children:[$jsx("box",{flexDirection:"row",flexWrap:"wrap",backgroundColor:theme.backgroundElement,paddingX:1,children:tabs.map((t2,i)=>{let on=i===idx;return $jsx("box",{height:1,flexShrink:0,marginRight:1,paddingX:1,backgroundColor:on?theme.backgroundPanel:void 0,onMouseDown:(e)=>{e.stopPropagation(),setActive((n)=>{return(n===null?null:Math.min(n,tabs.length-1))===i?null:i})},children:$jsx("text",{fg:on?theme.primary:theme.textMuted,children:on?$jsx("strong",{children:t2.label}):t2.label})},t2.id)})}),cur?$jsxs($Fragment,{children:[$jsx("box",{height:1,paddingX:1,children:$jsxs("text",{children:[$jsxs("span",{fg:theme.success,children:["+",cur.add]}),$jsx("span",{fg:theme.textMuted,children:" / "}),$jsxs("span",{fg:theme.error,children:["-",cur.del]})]})}),$jsx("box",{paddingX:1,paddingBottom:1,children:$jsx(DiffBlock,{text:cur.diff})})]}):null]})});var import_react45=__toESM(require_react_production(),1);var group="approval";function question(req){return(req.description||"Shell command").trim()}function subject(req){if(req.pattern_keys?.length)return req.pattern_keys.join("|");return req.command.trim()}function mkApproval(req){return{...req,group,question:question(req),subject:subject(req)}}function shouldRemember(req){let cur=get2("neverPrompts")??[],p=mkApproval(req);return cur.some((x2)=>x2.group===p.group&&x2.question===p.question&&x2.subject===p.subject)}function remember(req){let cur=get2("neverPrompts")??[],p=mkApproval(req);if(cur.some((x2)=>x2.group===p.group&&x2.question===p.question&&x2.subject===p.subject))return;set("neverPrompts",[...cur,{group:p.group,question:p.question,subject:p.subject}])}var MaskInput=(props)=>{let theme=useTheme().theme;return $jsxs("box",{flexDirection:"row",height:1,position:"relative",children:[$jsx("text",{fg:theme.textMuted,children:"> "}),$jsx("input",{value:props.value,onInput:props.input,onSubmit:props.submit,focused:!0,flexGrow:1,textColor:theme.backgroundElement,cursorColor:theme.accent,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement}),$jsx("box",{position:"absolute",left:2,top:0,height:1,children:$jsx("text",{fg:theme.text,bg:theme.backgroundElement,children:"\u2022".repeat(props.value.length)})})]})};function digit(name){let n=parseInt(name,10);return Number.isFinite(n)?n:null}var Frame=(p)=>{let theme=useTheme().theme;return $jsx("box",{flexDirection:"column",border:["left"],borderColor:p.tint,customBorderChars:LEFT_BAR,backgroundColor:theme.backgroundPanel,marginBottom:1,children:p.children})},Pill=(p)=>{let theme=useTheme().theme;return $jsx("box",{height:1,paddingX:1,backgroundColor:p.on?theme.primary:void 0,onMouseDown:p.onPick,children:$jsxs("text",{children:[$jsxs("span",{fg:p.on?theme.background:theme.textMuted,children:[p.hot," "]}),$jsx("span",{fg:p.on?theme.background:theme.text,children:p.label})]})})},CHOICES=["once","session","never","deny"],LABELS={once:"Allow once",session:"Allow this session",never:"Never ask",deny:"Deny"},RESPOND={once:"once",session:"session",never:"always",deny:"deny"},Approval=import_react45.forwardRef((p,ref)=>{let theme=useTheme().theme,gw=useGateway(),[sel,setSel]=import_react45.useState(0),[steering,setSteering]=import_react45.useState(!1),[custom,setCustom]=import_react45.useState(""),[note,setNote]=import_react45.useState(""),done=import_react45.useRef(!1),prompt=mkApproval(p.req),send=(c)=>{if(done.current)return;done.current=!0,setNote(""),gw.request("approval.respond",{choice:RESPOND[c]}).then(()=>{if(c==="never")remember(prompt);p.onAnswer(LABELS[c],c!=="deny")}).catch((e)=>{done.current=!1,setNote(e.message)})},steer=(text5)=>{let body=text5.trim();if(!body){setSteering(!1);return}setCustom(""),setSteering(!1),setNote("steer sent \u2014 approval still pending"),gw.request("session.steer",{text:body}).catch(()=>setNote("steer failed \u2014 approval still pending"))};return import_react45.useImperativeHandle(ref,()=>({masked:steering,feed:(key3)=>{if(steering){if(key3.name==="escape")return setSteering(!1),!0;return!1}if(key3.name==="s")return setSteering(!0),setNote(""),!0;if(key3.name==="left"||key3.name==="h")return setSel((s)=>(s+CHOICES.length-1)%CHOICES.length),!0;if(key3.name==="right"||key3.name==="l")return setSel((s)=>(s+1)%CHOICES.length),!0;if(key3.name==="return")return send(CHOICES[sel]),!0;if(key3.name==="escape")return send("deny"),!0;let n=digit(key3.name);if(n!==null&&n>=1&&n<=CHOICES.length)return send(CHOICES[n-1]),!0;return!1}}),[sel,steering]),$jsxs(Frame,{tint:theme.warning,children:[$jsxs("box",{flexDirection:"column",gap:1,paddingLeft:1,paddingRight:2,paddingY:1,children:[$jsxs("box",{flexDirection:"row",gap:1,height:1,children:[$jsx("text",{fg:theme.warning,children:"\u25B3"}),$jsx("text",{fg:theme.text,children:"Permission required"}),$jsxs("text",{fg:theme.textMuted,children:["\xB7 ",prompt.question]})]}),$jsxs("box",{flexDirection:"row",gap:1,paddingLeft:2,minHeight:1,children:[$jsx("text",{fg:theme.textMuted,children:"#"}),$jsx("text",{fg:theme.text,wrapMode:"word",children:p.req.description||"Shell command"})]}),$jsx("box",{paddingLeft:2,minHeight:1,children:$jsxs("text",{fg:theme.text,wrapMode:"word",children:["$ ",p.req.command]})}),p.req.pattern_keys?.length?$jsx("box",{paddingLeft:2,minHeight:1,children:$jsxs("text",{fg:theme.textMuted,wrapMode:"word",children:["matched: ",p.req.pattern_keys.join(", ")]})}):null]}),steering?$jsxs("box",{flexDirection:"column",gap:1,flexShrink:0,paddingX:2,paddingY:1,backgroundColor:theme.backgroundElement,children:[$jsxs("box",{flexDirection:"row",height:1,children:[$jsx("text",{fg:theme.textMuted,children:"> "}),$jsx("input",{value:custom,onInput:setCustom,onSubmit:()=>steer(custom),focused:!0,flexGrow:1,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement})]}),$jsx("text",{fg:theme.textMuted,children:"Enter steer \xB7 Esc back to approval"})]}):$jsxs("box",{flexDirection:"row",gap:2,flexShrink:0,paddingX:2,paddingY:1,backgroundColor:theme.backgroundElement,children:[CHOICES.map((c,i)=>$jsx(Pill,{on:sel===i,hot:String(i+1),label:LABELS[c],onPick:()=>send(c)},c)),$jsx(Pill,{on:!1,hot:"s",label:"Steer",onPick:()=>{setSteering(!0),setNote("")}}),$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:["subject: ",prompt.subject]})}),$jsx("box",{flexGrow:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"\u2190/\u2192 \xB7 enter \xB7 s steer \xB7 esc deny"})})]}),note?$jsx("box",{paddingLeft:2,paddingBottom:1,backgroundColor:theme.backgroundElement,children:$jsx("text",{fg:theme.textMuted,children:note})}):null]})}),Clarify=import_react45.forwardRef((p,ref)=>{let theme=useTheme().theme,gw=useGateway(),choices=p.req.choices??[],[sel,setSel]=import_react45.useState(0),[typing,setTyping]=import_react45.useState(choices.length===0),[custom,setCustom]=import_react45.useState(""),[err,setErr]=import_react45.useState(""),done=import_react45.useRef(!1),send=(answer)=>{if(done.current)return;done.current=!0,setErr(""),gw.request("clarify.respond",{request_id:p.req.request_id,answer}).then(()=>p.onAnswer(answer||"(cancelled)",answer!=="")).catch((e)=>{done.current=!1,setErr(e.message)})};import_react45.useImperativeHandle(ref,()=>({masked:typing,feed:(key3)=>{if(typing){if(key3.name==="escape"){if(choices.length)return setTyping(!1),!0;return send(""),!0}return!1}if(key3.name==="escape")return send(""),!0;if(key3.name==="up")return setSel((s)=>Math.max(0,s-1)),!0;if(key3.name==="down")return setSel((s)=>Math.min(choices.length,s+1)),!0;if(key3.name==="return"){if(sel===choices.length)return setTyping(!0),!0;let c=choices[sel];if(c)send(c);return!0}let n=digit(key3.name);if(n!==null&&n>=1&&n<=choices.length)return send(choices[n-1]),!0;return!1}}),[typing,sel,choices]);let head=$jsx("box",{minHeight:1,children:$jsxs("text",{wrapMode:"word",children:[$jsx("span",{fg:theme.accent,children:$jsx("strong",{children:"ask "})}),$jsx("span",{fg:theme.text,children:$jsx("strong",{children:p.req.question})})]})});return $jsx(Frame,{tint:theme.accent,children:$jsxs("box",{flexDirection:"column",paddingLeft:1,paddingRight:2,paddingY:1,children:[head,$jsx("box",{height:1}),typing?$jsxs($Fragment,{children:[$jsxs("box",{flexDirection:"row",height:1,children:[$jsx("text",{fg:theme.textMuted,children:"> "}),$jsx("input",{value:custom,onInput:setCustom,onSubmit:()=>send(custom),focused:!0,flexGrow:1,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement})]}),$jsxs("text",{fg:theme.textMuted,children:["Enter send \xB7 Esc ",choices.length?"back":"cancel"]})]}):$jsxs($Fragment,{children:[[...choices,"Other (type your answer)"].map((c,i)=>$jsx("box",{height:1,onMouseDown:()=>i===choices.length?setTyping(!0):send(choices[i]),children:$jsxs("text",{fg:sel===i?theme.text:theme.textMuted,children:[sel===i?"\u25B8 ":" ",i+1,". ",c]})},i)),$jsx("box",{height:1}),$jsxs("text",{fg:theme.textMuted,children:["\u2191/\u2193 \xB7 Enter \xB7 1-",choices.length," \xB7 Esc cancel"]})]}),err?$jsx("text",{fg:theme.error,children:err}):null]})})}),Masked=import_react45.forwardRef((p,ref)=>{let theme=useTheme().theme,[value,setValue]=import_react45.useState(""),[err,setErr]=import_react45.useState(""),done=import_react45.useRef(!1),go=(v2)=>{if(done.current)return;done.current=!0,setErr(""),p.onSubmit(v2).then(()=>p.onAnswer(v2?"(provided)":"(cancelled)",v2!=="")).catch((e)=>{done.current=!1,setErr(e.message)})};return import_react45.useImperativeHandle(ref,()=>({masked:!0,feed:(key3)=>{if(key3.name==="escape")return go(""),!0;return!1}}),[]),$jsx(Frame,{tint:theme.warning,children:$jsxs("box",{flexDirection:"column",paddingLeft:1,paddingRight:2,paddingY:1,children:[$jsx("text",{fg:theme.warning,children:$jsx("strong",{children:p.title})}),$jsx("text",{fg:theme.text,children:p.note}),$jsx("box",{height:1}),$jsx(MaskInput,{value,input:setValue,submit:()=>go(value)}),err?$jsx("text",{fg:theme.error,children:err}):null,$jsx("text",{fg:theme.textMuted,children:"Enter submit \xB7 Esc cancel"})]})})});function same2(a,b2){return Boolean(a&&b2&&b2.toLowerCase().includes(a.toLowerCase()))}function cap3(s,n=160){return s.length<=n?s:s.slice(0,n-1)+"\u2026"}function question2(part){let a=part.answered?.question;if(a)return a;if(part.req.variant==="clarify")return part.req.question;if(part.req.variant==="approval")return mkApproval(part.req).question;if(part.req.variant==="sudo")return"Sudo required";return part.req.env_var?`Secret: ${part.req.env_var}`:"Secret required"}function outcome(part){let a=part.answered;if(part.variant==="clarify"){let q2=cap3(question2(part)),body=cap3(a.label);return same2(q2,a.label)?{head:body}:{head:q2,body}}if(part.variant==="approval"){let q2=cap3(question2(part),96);return{head:a.label,body:q2}}if(part.variant==="sudo")return{head:`sudo ${a.label}`};return{head:`${part.req.env_var??"secret"} ${a.label}`}}var Outcome=import_react45.memo(({part})=>{let theme=useTheme().theme,a=part.answered,glyph=a.ok?"\u2713":"\u2717",fg2=a.ok?theme.success:theme.error,text5=outcome(part);return $jsxs("box",{flexDirection:"row",paddingLeft:3,marginBottom:1,children:[$jsx("box",{width:2,flexShrink:0,children:$jsx("text",{fg:fg2,children:glyph})}),$jsxs("box",{flexDirection:"column",flexGrow:1,flexShrink:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:text5.head}),text5.body?$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:text5.body}):null]})]})}),PromptCard=import_react45.memo(import_react45.forwardRef((p,ref)=>{let gw=useGateway();if(p.part.answered)return $jsx(Outcome,{part:p.part});let answer=(label,ok)=>p.onAnswer(p.part.id,label,ok),req=p.part.req;if(req.variant==="approval")return $jsx(Approval,{ref,req,onAnswer:answer});if(req.variant==="clarify")return $jsx(Clarify,{ref,req,onAnswer:answer});if(req.variant==="sudo")return $jsx(Masked,{ref,title:"\uD83D\uDD12 Sudo required",note:"Enter your password to elevate privileges.",onSubmit:(v2)=>gw.request("sudo.respond",{request_id:req.request_id,password:v2}),onAnswer:answer});return $jsx(Masked,{ref,title:`\uD83D\uDD11 Secret: ${req.env_var}`,note:req.prompt,onSubmit:(v2)=>gw.request("secret.respond",{request_id:req.request_id,value:v2}),onAnswer:answer})}));function pending2(messages){for(let i=messages.length-1;i>=0;i--){let m2=messages[i];if(m2.role!=="assistant")continue;for(let j2=m2.parts.length-1;j2>=0;j2--){let part=m2.parts[j2];if(part.type==="prompt"&&!part.answered)return part}}return null}var import_react46=__toESM(require_react_production(),1);import{existsSync as existsSync13,statSync as statSync5}from"fs";function parseChafaLine(line){let out=[],fg2=null,bg2=null,reverse2=!1,i=0,N2=line.length;while(i<N2){if(line.charCodeAt(i)===27&&line.charCodeAt(i+1)===91){let end=line.indexOf("m",i+2);if(end<0){i=N2;break}let params=line.slice(i+2,end).split(";").map((x2)=>parseInt(x2,10)||0),p=0;while(p<params.length){let n=params[p];if(n===0){fg2=null,bg2=null,reverse2=!1,p++;continue}if(n===7){reverse2=!0,p++;continue}if(n===27){reverse2=!1,p++;continue}if(n===38&¶ms[p+1]===2){fg2={r:params[p+2]|0,g:params[p+3]|0,b:params[p+4]|0},p+=5;continue}if(n===48&¶ms[p+1]===2){bg2={r:params[p+2]|0,g:params[p+3]|0,b:params[p+4]|0},p+=5;continue}if(n===39){fg2=null,p++;continue}if(n===49){bg2=null,p++;continue}p++}i=end+1;continue}let cp=line.codePointAt(i),ch=String.fromCodePoint(cp);i+=ch.length;let efg=reverse2?bg2:fg2,ebg=reverse2?fg2:bg2;out.push({ch,fg:efg,bg:ebg})}return out}function parseChafa(text5){return text5.split(`
|
|
4106
|
-
`).filter((s)=>s.length>0).map(parseChafaLine)}function hex(c){if(!c)return;return`#${c.r.toString(16).padStart(2,"0")}${c.g.toString(16).padStart(2,"0")}${c.b.toString(16).padStart(2,"0")}`}var CHAFA_PATHS=["/usr/sbin/chafa","/usr/bin/chafa","/usr/local/bin/chafa","/opt/homebrew/bin/chafa","/home/linuxbrew/.linuxbrew/bin/chafa"],cachedBin=void 0;function chafaBin(){if(cachedBin!==void 0)return cachedBin;let bin=Bun.which?.("chafa")??null;if(bin)return cachedBin=bin,bin;for(let p of CHAFA_PATHS)if(existsSync13(p))return cachedBin=p,p;return cachedBin=null,null}function resolveImage(path4){let full=path4.startsWith("~")?(process.env.HOME??"")+path4.slice(1):path4;return existsSync13(full)?full:null}var CACHE=new Map,INFLIGHT=new Map,CACHE_CAP=50;function cacheGet(k2){let v2=CACHE.get(k2);if(!v2)return;return CACHE.delete(k2),CACHE.set(k2,v2),v2}function cachePut(k2,v2){if(CACHE.size>=CACHE_CAP)CACHE.delete(CACHE.keys().next().value);CACHE.set(k2,v2)}async function renderChafa(path4,width,height){let bin=chafaBin();if(!bin)return{err:"chafa not installed"};let full=resolveImage(path4);if(!full)return{err:`not found: ${path4}`};let mtime=0;try{mtime=statSync5(full).mtimeMs|0}catch{}let h2=height??Math.max(6,Math.round(width/3)),key3=`${full}:${mtime}:${width}x${h2}`,cached2=cacheGet(key3);if(cached2)return{rows:cached2};let hit=INFLIGHT.get(key3);if(hit)return hit;let task=(async()=>{try{let proc=Bun.spawn([bin,`--size=${width}x${h2}`,"--format=symbols","--symbols=block","--colors=full",full],{stdout:"pipe",stderr:"pipe"}),timeout=!1,timer2=setTimeout(()=>{timeout=!0,proc.kill()},5000),[code,stdout,stderr]=await Promise.all([proc.exited,new Response(proc.stdout).text(),new Response(proc.stderr).text()]).finally(()=>clearTimeout(timer2));if(timeout)return{err:"chafa timed out"};if(code!==0)return{err:(stderr||`chafa exit ${code}`).trim()};let rows2=parseChafa(stdout);return cachePut(key3,rows2),{rows:rows2}}catch(err){return{err:err instanceof Error?err.message:String(err)}}})();INFLIGHT.set(key3,task);let clear=()=>{if(INFLIGHT.get(key3)===task)INFLIGHT.delete(key3)};return task.then(clear,clear),task}var basename7=(p)=>p.split(/[/\\]/).pop()||p,ChafaImage=import_react46.memo(({path:path4,width,bare,chafa,load:load4=renderChafa})=>{let theme=useTheme().theme,[collapsed,setCollapsed]=import_react46.useState(!1),[result,setResult]=import_react46.useState(null),w2=Math.max(20,Math.min(80,width??60)),preview=strategy(path4,chafa??chafaBin()!==null);if(import_react46.useEffect(()=>{let live=!0;if(setResult(null),preview.kind!=="chafa")return()=>{live=!1};return load4(path4,w2).then((value)=>{if(live)setResult(value)},(err)=>{if(live)setResult({err:err instanceof Error?err.message:String(err)})}),()=>{live=!1}},[path4,w2,preview.kind,load4]),preview.kind!=="chafa"||!result||"err"in result)return $jsx(MediaChip,{path:path4,bare});if(collapsed)return $jsx(MediaChip,{path:path4,bare,onMouseDown:(e)=>{e.stopPropagation(),setCollapsed(!1)}});return $jsxs("box",{flexDirection:"column",marginTop:bare?0:1,children:[$jsx("box",{flexDirection:"column",onMouseDown:(e)=>{if(e.stopPropagation(),!bare)setCollapsed(!0)},children:result.rows.map((row3,i)=>$jsx("text",{children:row3.map((c,j2)=>$jsx("span",{fg:hex(c.fg),bg:hex(c.bg),children:c.ch},j2))},i))}),bare?null:$jsx("box",{height:1,onMouseDown:(e)=>{e.stopPropagation(),openFile(path4)},children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:" "}),$jsx("span",{fg:theme.accent,children:"\u25C9 "}),$jsx("span",{fg:theme.text,children:basename7(path4)}),$jsx("span",{fg:theme.textMuted,children:" click image to collapse \xB7 click name to open"})]})})]})});var import_react47=__toESM(require_react_production(),1);import{existsSync as existsSync14,readFileSync as readFileSync9,readdirSync as readdirSync7}from"fs";import{homedir as homedir3}from"os";import{join as join10}from"path";var composer=require_composer(),Document=require_Document(),Schema=require_Schema(),errors=require_errors(),Alias=require_Alias(),identity=require_identity(),Pair=require_Pair(),Scalar=require_Scalar(),YAMLMap=require_YAMLMap(),YAMLSeq=require_YAMLSeq(),cst=require_cst(),lexer=require_lexer(),lineCounter=require_line_counter(),parser=require_parser(),publicApi=require_public_api(),visit=require_visit();var $Composer=composer.Composer,$Document=Document.Document,$Schema=Schema.Schema,$YAMLError=errors.YAMLError,$YAMLParseError=errors.YAMLParseError,$YAMLWarning=errors.YAMLWarning,$Alias=Alias.Alias,$isAlias=identity.isAlias,$isCollection=identity.isCollection,$isDocument=identity.isDocument,$isMap=identity.isMap,$isNode=identity.isNode,$isPair=identity.isPair,$isScalar=identity.isScalar,$isSeq=identity.isSeq,$Pair=Pair.Pair,$Scalar=Scalar.Scalar,$YAMLMap=YAMLMap.YAMLMap,$YAMLSeq=YAMLSeq.YAMLSeq;var $Lexer=lexer.Lexer,$LineCounter=lineCounter.LineCounter,$Parser=parser.Parser,$parse=publicApi.parse,$parseAllDocuments=publicApi.parseAllDocuments,$parseDocument=publicApi.parseDocument,$stringify=publicApi.stringify,$visit=visit.visit,$visitAsync=visit.visitAsync;var SKINS=["default","ares","mono","slate","daylight","warm-lightmode","poseidon","sisyphus","charizard"],home=()=>process.env.HERMES_HOME||join10(process.env.HOME||homedir3(),".hermes"),skin=(path4)=>{try{let raw=$parse(readFileSync9(path4,"utf8"));if(raw&&typeof raw==="object"&&!Array.isArray(raw)){let name=raw.name;if(typeof name==="string"&&name.trim())return name.trim()}}catch{}return null};function skins(){let dir=join10(home(),"skins");if(!existsSync14(dir))return[...SKINS];let extra=readdirSync7(dir,{withFileTypes:!0}).filter((e)=>e.isFile()&&e.name.endsWith(".yaml")).map((e)=>skin(join10(dir,e.name))).filter((name)=>name!==null&&!SKINS.includes(name)).sort();return[...SKINS,...new Set(extra)]}function mode(name){let n=name.toLowerCase();if(n.includes("light")||n==="tango-adapted")return"light";if(n==="tokyo-storm")return"dark";return}var DEFAULT={agentName:"Hermes"},Ctx5=import_react47.createContext(DEFAULT);function deriveSkin(skin2){let name=skin2?.branding?.agent_name?.trim();return{skin:skin2??void 0,agentName:name||"Hermes"}}var SkinProvider=import_react47.memo(({value,children})=>$jsx(Ctx5.Provider,{value,children}));function useSkin(){return import_react47.useContext(Ctx5)}var SYMBOLS={"\\alpha":"\u03B1","\\beta":"\u03B2","\\gamma":"\u03B3","\\delta":"\u03B4","\\epsilon":"\u03B5","\\varepsilon":"\u03B5","\\zeta":"\u03B6","\\eta":"\u03B7","\\theta":"\u03B8","\\vartheta":"\u03D1","\\iota":"\u03B9","\\kappa":"\u03BA","\\lambda":"\u03BB","\\mu":"\u03BC","\\nu":"\u03BD","\\xi":"\u03BE","\\pi":"\u03C0","\\varpi":"\u03D6","\\rho":"\u03C1","\\varrho":"\u03F1","\\sigma":"\u03C3","\\varsigma":"\u03C2","\\tau":"\u03C4","\\upsilon":"\u03C5","\\phi":"\u03C6","\\varphi":"\u03C6","\\chi":"\u03C7","\\psi":"\u03C8","\\omega":"\u03C9","\\Gamma":"\u0393","\\Delta":"\u0394","\\Theta":"\u0398","\\Lambda":"\u039B","\\Xi":"\u039E","\\Pi":"\u03A0","\\Sigma":"\u03A3","\\Upsilon":"\u03A5","\\Phi":"\u03A6","\\Psi":"\u03A8","\\Omega":"\u03A9","\\sum":"\u2211","\\prod":"\u220F","\\coprod":"\u2210","\\int":"\u222B","\\iint":"\u222C","\\iiint":"\u222D","\\oint":"\u222E","\\bigcup":"\u22C3","\\bigcap":"\u22C2","\\bigvee":"\u22C1","\\bigwedge":"\u22C0","\\bigoplus":"\u2A01","\\bigotimes":"\u2A02","\\partial":"\u2202","\\nabla":"\u2207","\\sqrt":"\u221A","\\emptyset":"\u2205","\\varnothing":"\u2205","\\infty":"\u221E","\\in":"\u2208","\\notin":"\u2209","\\ni":"\u220B","\\subset":"\u2282","\\supset":"\u2283","\\subseteq":"\u2286","\\supseteq":"\u2287","\\subsetneq":"\u228A","\\supsetneq":"\u228B","\\cup":"\u222A","\\cap":"\u2229","\\setminus":"\u2216","\\complement":"\u2201","\\forall":"\u2200","\\exists":"\u2203","\\nexists":"\u2204","\\land":"\u2227","\\lor":"\u2228","\\lnot":"\xAC","\\neg":"\xAC","\\therefore":"\u2234","\\because":"\u2235","\\le":"\u2264","\\leq":"\u2264","\\ge":"\u2265","\\geq":"\u2265","\\ne":"\u2260","\\neq":"\u2260","\\ll":"\u226A","\\gg":"\u226B","\\approx":"\u2248","\\equiv":"\u2261","\\cong":"\u2245","\\sim":"\u223C","\\simeq":"\u2243","\\propto":"\u221D","\\perp":"\u22A5","\\parallel":"\u2225","\\models":"\u22A8","\\vdash":"\u22A2","\\mid":"\u2223","\\nmid":"\u2224","\\divides":"\u2223","\\blacksquare":"\u25A0","\\square":"\u25A1","\\Box":"\u25A1","\\qed":"\u220E","\\bigstar":"\u2605","\\bmod":"mod","\\mod":"mod","\\langle":"\u27E8","\\rangle":"\u27E9","\\lceil":"\u2308","\\rceil":"\u2309","\\lfloor":"\u230A","\\rfloor":"\u230B","\\|":"\u2016","\\to":"\u2192","\\rightarrow":"\u2192","\\leftarrow":"\u2190","\\leftrightarrow":"\u2194","\\Rightarrow":"\u21D2","\\Leftarrow":"\u21D0","\\Leftrightarrow":"\u21D4","\\implies":"\u27F9","\\impliedby":"\u27F8","\\iff":"\u27FA","\\mapsto":"\u21A6","\\hookrightarrow":"\u21AA","\\hookleftarrow":"\u21A9","\\uparrow":"\u2191","\\downarrow":"\u2193","\\updownarrow":"\u2195","\\cdot":"\u22C5","\\cdots":"\u22EF","\\ldots":"\u2026","\\dots":"\u2026","\\dotsb":"\u2026","\\dotsc":"\u2026","\\vdots":"\u22EE","\\ddots":"\u22F1","\\times":"\xD7","\\div":"\xF7","\\pm":"\xB1","\\mp":"\u2213","\\circ":"\u2218","\\bullet":"\u2022","\\star":"\u22C6","\\ast":"\u2217","\\oplus":"\u2295","\\ominus":"\u2296","\\otimes":"\u2297","\\odot":"\u2299","\\diamond":"\u22C4","\\angle":"\u2220","\\triangle":"\u25B3","\\,":" ","\\;":" ","\\:":" ","\\!":"","\\ ":" ","\\quad":" ","\\qquad":" ","\\sin":"sin","\\cos":"cos","\\tan":"tan","\\cot":"cot","\\sec":"sec","\\csc":"csc","\\arcsin":"arcsin","\\arccos":"arccos","\\arctan":"arctan","\\sinh":"sinh","\\cosh":"cosh","\\tanh":"tanh","\\log":"log","\\ln":"ln","\\exp":"exp","\\det":"det","\\dim":"dim","\\ker":"ker","\\lim":"lim","\\liminf":"liminf","\\limsup":"limsup","\\sup":"sup","\\inf":"inf","\\max":"max","\\min":"min","\\arg":"arg","\\gcd":"gcd","\\&":"&","\\%":"%","\\$":"$","\\#":"#","\\_":"_","\\{":"{","\\}":"}"},BB={A:"\uD835\uDD38",B:"\uD835\uDD39",C:"\u2102",D:"\uD835\uDD3B",E:"\uD835\uDD3C",F:"\uD835\uDD3D",G:"\uD835\uDD3E",H:"\u210D",I:"\uD835\uDD40",J:"\uD835\uDD41",K:"\uD835\uDD42",L:"\uD835\uDD43",M:"\uD835\uDD44",N:"\u2115",O:"\uD835\uDD46",P:"\u2119",Q:"\u211A",R:"\u211D",S:"\uD835\uDD4A",T:"\uD835\uDD4B",U:"\uD835\uDD4C",V:"\uD835\uDD4D",W:"\uD835\uDD4E",X:"\uD835\uDD4F",Y:"\uD835\uDD50",Z:"\u2124"},CAL={A:"\uD835\uDC9C",B:"\u212C",C:"\uD835\uDC9E",D:"\uD835\uDC9F",E:"\u2130",F:"\u2131",G:"\uD835\uDCA2",H:"\u210B",I:"\u2110",J:"\uD835\uDCA5",K:"\uD835\uDCA6",L:"\u2112",M:"\u2133",N:"\uD835\uDCA9",O:"\uD835\uDCAA",P:"\uD835\uDCAB",Q:"\uD835\uDCAC",R:"\u211B",S:"\uD835\uDCAE",T:"\uD835\uDCAF",U:"\uD835\uDCB0",V:"\uD835\uDCB1",W:"\uD835\uDCB2",X:"\uD835\uDCB3",Y:"\uD835\uDCB4",Z:"\uD835\uDCB5"},FRAK={A:"\uD835\uDD04",B:"\uD835\uDD05",C:"\u212D",D:"\uD835\uDD07",E:"\uD835\uDD08",F:"\uD835\uDD09",G:"\uD835\uDD0A",H:"\u210C",I:"\u2111",J:"\uD835\uDD0D",K:"\uD835\uDD0E",L:"\uD835\uDD0F",M:"\uD835\uDD10",N:"\uD835\uDD11",O:"\uD835\uDD12",P:"\uD835\uDD13",Q:"\uD835\uDD14",R:"\u211C",S:"\uD835\uDD16",T:"\uD835\uDD17",U:"\uD835\uDD18",V:"\uD835\uDD19",W:"\uD835\uDD1A",X:"\uD835\uDD1B",Y:"\uD835\uDD1C",Z:"\u2128"},SUPERSCRIPT={"0":"\u2070","1":"\xB9","2":"\xB2","3":"\xB3","4":"\u2074","5":"\u2075","6":"\u2076","7":"\u2077","8":"\u2078","9":"\u2079","+":"\u207A","-":"\u207B","=":"\u207C","(":"\u207D",")":"\u207E",a:"\u1D43",b:"\u1D47",c:"\u1D9C",d:"\u1D48",e:"\u1D49",f:"\u1DA0",g:"\u1D4D",h:"\u02B0",i:"\u2071",j:"\u02B2",k:"\u1D4F",l:"\u02E1",m:"\u1D50",n:"\u207F",o:"\u1D52",p:"\u1D56",r:"\u02B3",s:"\u02E2",t:"\u1D57",u:"\u1D58",v:"\u1D5B",w:"\u02B7",x:"\u02E3",y:"\u02B8",z:"\u1DBB"},SUBSCRIPT={"0":"\u2080","1":"\u2081","2":"\u2082","3":"\u2083","4":"\u2084","5":"\u2085","6":"\u2086","7":"\u2087","8":"\u2088","9":"\u2089","+":"\u208A","-":"\u208B","=":"\u208C","(":"\u208D",")":"\u208E",a:"\u2090",e:"\u2091",h:"\u2095",i:"\u1D62",j:"\u2C7C",k:"\u2096",l:"\u2097",m:"\u2098",n:"\u2099",o:"\u2092",p:"\u209A",r:"\u1D63",s:"\u209B",t:"\u209C",u:"\u1D64",v:"\u1D65",x:"\u2093"};var escapeRe=(s)=>s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),splitByEnding=(keys)=>{let letter=[],punct=[];for(let k2 of keys)if(/[A-Za-z]$/.test(k2))letter.push(k2);else punct.push(k2);return{letter,punct}},buildAlt=(cmds)=>cmds.sort((a,b2)=>b2.length-a.length).map(escapeRe).join("|"),{letter:LETTER_CMDS,punct:PUNCT_CMDS}=splitByEnding(Object.keys(SYMBOLS)),SYMBOL_LETTER_RE=new RegExp("(?:"+buildAlt(LETTER_CMDS)+")(?![A-Za-z])","g"),SYMBOL_PUNCT_RE=new RegExp("(?:"+buildAlt(PUNCT_CMDS)+")","g"),convertScript=(input,table,sigil)=>{let out="",allMapped=!0;for(let ch of input){let mapped=table[ch];if(!mapped){allMapped=!1;break}out+=mapped}if(allMapped)return out;let trimmed=input.trim();if([...trimmed].length===1)return`${sigil}${trimmed}`;return`${sigil}(${trimmed})`},readBraced=(s,start)=>{if(s[start]!=="{")return null;let depth=1,i=start+1;while(i<s.length&&depth>0){let c=s[i];if(c==="\\"&&i+1<s.length){i+=2;continue}if(c==="{")depth++;else if(c==="}")depth--;if(depth>0)i++}if(depth!==0)return null;return{content:s.slice(start+1,i),end:i+1}},replaceBracedCommand=(input,command,render)=>{let cmdLen=command.length,out="",i=0;while(i<input.length){let idx=input.indexOf(command,i);if(idx<0)return out+=input.slice(i),out;let after=input[idx+cmdLen];if(after&&/[A-Za-z]/.test(after)){out+=input.slice(i,idx+cmdLen),i=idx+cmdLen;continue}out+=input.slice(i,idx);let p=idx+cmdLen;while(input[p]===" "||input[p]==="\t")p++;let arg=readBraced(input,p);if(!arg){out+=input.slice(idx,p+1),i=p+1;continue}out+=render(replaceBracedCommand(arg.content,command,render)),i=arg.end}return out},replaceFracs=(input)=>{let out="",i=0;while(i<input.length){let idx=input.indexOf("\\frac",i);if(idx<0)return out+=input.slice(i),out;let after=input[idx+5];if(after&&/[A-Za-z]/.test(after)){out+=input.slice(i,idx+5),i=idx+5;continue}out+=input.slice(i,idx);let p=idx+5;while(input[p]===" "||input[p]==="\t")p++;let num2=readBraced(input,p);if(!num2){out+=input.slice(idx,p+1),i=p+1;continue}p=num2.end;while(input[p]===" "||input[p]==="\t")p++;let den=readBraced(input,p);if(!den){out+=input.slice(idx,p+1),i=p+1;continue}out+=`${wrapForFrac(replaceFracs(num2.content))}/${wrapForFrac(replaceFracs(den.content))}`,i=den.end}return out},wrapForFrac=(expr)=>{let trimmed=expr.trim();if(!trimmed)return trimmed;if(/^\(.*\)$/.test(trimmed))return trimmed;if(/[+\-/*]|\s/.test(trimmed))return`(${trimmed})`;return trimmed};function texToUnicode(input){let s=input;return s=s.replace(/\\mathbb\s*\{([A-Za-z])\}/g,(raw,c)=>BB[c]??raw),s=s.replace(/\\mathcal\s*\{([A-Za-z])\}/g,(raw,c)=>CAL[c]??raw),s=s.replace(/\\mathfrak\s*\{([A-Za-z])\}/g,(raw,c)=>FRAK[c]??raw),s=s.replace(/\\mathbf\s*\{([^{}]+)\}/g,(_2,c)=>c),s=s.replace(/\\mathit\s*\{([^{}]+)\}/g,(_2,c)=>c),s=s.replace(/\\mathrm\s*\{([^{}]+)\}/g,(_2,c)=>c),s=s.replace(/\\text\s*\{([^{}]+)\}/g,(_2,c)=>c),s=s.replace(/\\operatorname\s*\{([^{}]+)\}/g,(_2,c)=>c),s=s.replace(/\\overline\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0305`),s=s.replace(/\\hat\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0302`),s=s.replace(/\\bar\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0304`),s=s.replace(/\\tilde\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0303`),s=s.replace(/\\vec\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u20D7`),s=s.replace(/\\dot\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0307`),s=s.replace(/\\ddot\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0308`),s=replaceFracs(s),s=replaceBracedCommand(s,"\\boxed",(body)=>`**${body.trim()}**`),s=replaceBracedCommand(s,"\\fbox",(body)=>`**${body.trim()}**`),s=s.replace(/\\xrightarrow\s*\{([^{}]*)\}/g,(_2,label)=>`\u2500${label.trim()}\u2192`),s=s.replace(/\\xleftarrow\s*\{([^{}]*)\}/g,(_2,label)=>`\u2190${label.trim()}\u2500`),s=s.replace(/\\Longrightarrow/g,"\u27F9"),s=s.replace(/\\Longleftarrow/g,"\u27F8"),s=s.replace(/\\Longleftrightarrow/g,"\u27FA"),s=s.replace(/\s*\\pmod\s*\{([^{}]*)\}/g,(_2,p)=>` (mod ${p.trim()})`),s=s.replace(/\s*\\pod\s*\{([^{}]*)\}/g,(_2,p)=>` (${p.trim()})`),s=s.replace(/\s*\\tag\s*\{([^{}]*)\}/g,(_2,n)=>` (${n.trim()})`),s=s.replace(/\\(?:Bigg|bigg|Big|big)[lrm]?(?![A-Za-z])/g,""),s=s.replace(/\\(?:scriptscriptstyle|displaystyle|scriptstyle|textstyle|nolimits|limits)(?![A-Za-z])\s*/g,""),s=s.replace(/\\left(?![A-Za-z])\.?/g,""),s=s.replace(/\\right(?![A-Za-z])\.?/g,""),s=s.replace(SYMBOL_PUNCT_RE,(m2)=>SYMBOLS[m2]??m2),s=s.replace(SYMBOL_LETTER_RE,(m2)=>SYMBOLS[m2]??m2),s=s.replace(/\^\s*\{([^{}]+)\}/g,(_2,body)=>convertScript(body,SUPERSCRIPT,"^")),s=s.replace(/\^([A-Za-z0-9+\-=])/g,(raw,ch)=>SUPERSCRIPT[ch]??raw),s=s.replace(/_\s*\{([^{}]+)\}/g,(_2,body)=>convertScript(body,SUBSCRIPT,"_")),s=s.replace(/_([A-Za-z0-9+\-=])/g,(raw,ch)=>SUBSCRIPT[ch]??raw),s}var CODE_SPAN_RE=/(`{1,2})[^`\n]+?\1/g,MATH_SPAN_RE=new RegExp([String.raw`\$\$([^$]+?)\$\$`,String.raw`\\\[([\s\S]+?)\\\]`,String.raw`\\\(([^\n]+?)\\\)`,String.raw`(?<!\$)\$([^\s$](?:[^$\n]*?[^\s$])?)\$(?!\$)`].join("|"),"g");function mathify(md){if(!/[$\\]/.test(md))return md;let out="",i=0;CODE_SPAN_RE.lastIndex=0;for(let m2 of md.matchAll(CODE_SPAN_RE))out+=md.slice(i,m2.index).replace(MATH_SPAN_RE,(_2,a,b2,c,d2)=>texToUnicode(a??b2??c??d2)),out+=m2[0],i=m2.index+m2[0].length;return out+=md.slice(i).replace(MATH_SPAN_RE,(_2,a,b2,c,d2)=>texToUnicode(a??b2??c??d2)),out}function duration(ms2){if(ms2<1000)return`${ms2}ms`;let s=ms2/1000;if(s<60)return`${s.toFixed(1)}s`;return`${Math.floor(s/60)}m${Math.floor(s%60)}s`}function tokens2(n){if(n<1000)return String(n);if(n<1e6)return`${(n/1000).toFixed(1)}k`;return`${(n/1e6).toFixed(2)}M`}function extract(msg){return msg.parts.filter((p)=>p.type==="text").map((p)=>p.content).join("")}var trunc3=(s,max)=>s.length<=max?s:s.slice(0,max-1)+"\u2026";function mix(a,b2,n=0.5){return RGBA.fromValues(a.r+(b2.r-a.r)*n,a.g+(b2.g-a.g)*n,a.b+(b2.b-a.b)*n,a.a+(b2.a-a.a)*n)}function darken(c,n=0.95){return RGBA.fromValues(c.r*n,c.g*n,c.b*n,c.a)}function lighten(c,n=0.05){return RGBA.fromValues(c.r+(1-c.r)*n,c.g+(1-c.g)*n,c.b+(1-c.b)*n,c.a)}var TOP_RULE={topLeft:"\u2594",topRight:"\u2594",horizontal:"\u2594",bottomLeft:"",bottomRight:"",vertical:"",topT:"",bottomT:"",leftT:"",rightT:"",cross:""},BOTTOM_RULE={bottomLeft:"\u2581",bottomRight:"\u2581",horizontal:"\u2581",topLeft:"",topRight:"",vertical:"",topT:"",bottomT:"",leftT:"",rightT:"",cross:""},TABLE={style:"grid"};function useClick(fn){let at=import_react48.useRef(null);return{onMouseDown:(e)=>{at.current={x:e.x,y:e.y}},onMouseUp:(e)=>{let a=at.current;if(at.current=null,fn&&a&&a.x===e.x&&a.y===e.y)fn()}}}var MessageItem=import_react48.memo(({message,streaming,prompt,onRewind,onPick})=>{if(message.role==="system")return $jsx(SystemMessage,{message});if(message.role==="user")return $jsx(UserMessage,{message,onRewind});return $jsx(AssistantMessage,{message,streaming,prompt,onPick})}),SystemMessage=import_react48.memo(({message})=>{let theme=useTheme().theme;return $jsx("box",{marginBottom:1,minHeight:1,children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:extract(message)})})}),UserMessage=import_react48.memo(({message,onRewind})=>{let ctx=useTheme(),theme=ctx.theme,[hover,setHover]=import_react48.useState(!1),click=useClick(onRewind&&(()=>onRewind(message))),fill=import_react48.useMemo(()=>ctx.mode==="dark"?mix(theme.background,theme.backgroundElement):darken(theme.backgroundElement),[ctx.mode,theme.background,theme.backgroundElement]),edge=import_react48.useMemo(()=>ctx.mode==="dark"?darken(theme.background):darken(theme.backgroundElement),[ctx.mode,theme.background,theme.backgroundElement]),segs=import_react48.useMemo(()=>message.parts.map((p)=>p.type==="text"&&p.content?splitContent(p.content):null),[message.parts]);return $jsxs("box",{flexDirection:"column",marginBottom:1,children:[$jsx("box",{height:1,border:["bottom"],customBorderChars:BOTTOM_RULE,borderColor:edge}),$jsx("box",{backgroundColor:hover?fill:theme.backgroundElement,paddingLeft:1,paddingRight:1,paddingY:1,flexDirection:"column",minHeight:1,onMouseOver:()=>setHover(!0),onMouseOut:()=>setHover(!1),...click,children:message.parts.map((p,i)=>{let seg=segs[i];if(!seg)return null;let k2=p.key??i;return seg.map((s,j2)=>{if("media"in s)return classify(s.media)==="img"?$jsx("box",{children:$jsx(ChafaImage,{path:s.media})},`${k2}-m${j2}`):$jsx("box",{marginTop:1,children:$jsx(MediaChip,{path:s.media})},`${k2}-m${j2}`);if("code"in s)return $jsx(CodeBlock,{code:s.code,lang:s.lang},`${k2}-c${j2}`);return $jsx("text",{fg:theme.text,wrapMode:"word",children:s.md},`${k2}-${j2}`)})})}),$jsx("box",{height:1,border:["top"],customBorderChars:TOP_RULE,borderColor:edge})]})}),AssistantMessage=import_react48.memo(({message,streaming,prompt,onPick})=>{let ctx=useTheme(),theme=ctx.theme,{agentName}=useSkin(),[hover,setHover]=import_react48.useState(!1),click=useClick(onPick&&(()=>onPick(message))),rail2=import_react48.useMemo(()=>ctx.mode==="dark"?lighten(theme.background):darken(theme.backgroundElement),[ctx.mode,theme.background,theme.backgroundElement]),err=!!message.error,trail=message.parts.filter((p)=>p.type==="tool"||p.type==="prompt"),diffs=trail.filter((p)=>p.type==="tool"&&(!!p.diff||isDiff(p.result))),segs=import_react48.useMemo(()=>message.parts.map((p)=>p.type==="text"&&p.content?splitContent(p.content):null),[message.parts]),header=[message.speaker??agentName,message.usage?`${tokens2(message.usage.input)}\u2192${tokens2(message.usage.output)} tok`:null,message.duration?duration(message.duration):null].filter(Boolean).join(" \xB7 "),part=(p,i)=>{if(p.type==="prompt")return $jsx("box",{marginTop:1,onMouseDown:(e)=>e.stopPropagation(),children:$jsx(PromptCard,{part:p,ref:!p.answered?prompt?.ref:void 0,onAnswer:prompt?.onAnswer??(()=>{})})},`pr-${p.id}`);let seg=segs[i];if(!seg)return null;let k2=p.key??i,last=streaming&&p.streaming;return seg.map((s,j2)=>{let tail=last&&j2===seg.length-1;if("media"in s)return classify(s.media)==="img"?$jsx("box",{children:$jsx(ChafaImage,{path:s.media})},`${k2}-m${j2}`):$jsx("box",{marginTop:1,children:$jsx(MediaChip,{path:s.media})},`${k2}-m${j2}`);if("code"in s)return $jsx(CodeBlock,{code:s.code,lang:s.lang,streaming:tail},`${k2}-c${j2}`);return $jsx("box",{children:$jsx("markdown",{content:mathify(s.md),fg:theme.markdownText,syntaxStyle:ctx.syntaxStyle,streaming:tail,internalBlockMode:"top-level",tableOptions:TABLE})},`${k2}-${j2}`)})};return $jsxs("box",{flexDirection:"row",marginBottom:1,onMouseOver:()=>setHover(!0),onMouseOut:()=>setHover(!1),...click,children:[$jsxs("box",{flexDirection:"column",flexGrow:1,flexShrink:1,children:[$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{flexGrow:1,children:$jsx("text",{fg:theme.textMuted,children:header})}),trail.length?$jsx("box",{children:$jsx("text",{fg:theme.textMuted,children:trunc3(trail.map((p)=>p.type==="tool"?p.name:"?").join(" \xB7 "),40)})}):null]}),message.parts.map(part),diffs.length?$jsx(DiffTabs,{tools:diffs}):null,err?$jsx(ErrorBlock,{text:message.error}):null]}),$jsxs("box",{width:3,flexShrink:0,flexDirection:"row",children:[$jsx("box",{width:2}),$jsx("box",{width:1,backgroundColor:hover?rail2:void 0})]})]})});var MessageList=import_react49.memo(({messages,streaming,prompt,onRewind,onPick})=>{let theme=useTheme().theme,style=import_react49.useMemo(()=>({viewportOptions:{backgroundColor:theme.background},scrollbarOptions:{trackOptions:{foregroundColor:theme.borderSubtle,backgroundColor:theme.background}}}),[theme]);if(messages.length===0)return $jsx("box",{flexGrow:1});let last=messages[messages.length-1],lastStreaming=streaming&&last?.role==="assistant";return $jsx("scrollbox",{flexGrow:1,scrollY:!0,stickyScroll:!0,stickyStart:"bottom",style,children:$jsx("box",{flexDirection:"column",paddingBottom:1,children:messages.map((msg,i)=>$jsx("box",{flexDirection:"column",children:$jsx(MessageItem,{message:msg,streaming:lastStreaming&&i===messages.length-1,prompt,onRewind,onPick})},msg.id))})})});var Chat=import_react50.memo(({messages,streaming,prompt,cloud,cloudH,pick,onResize,onPick,onClose,onRewind})=>{let theme=useTheme().theme;return $jsxs("box",{flexGrow:1,flexDirection:"column",position:"relative",backgroundColor:theme.background,children:[$jsx(MessageList,{messages,streaming,prompt,onRewind,onPick}),cloud?$jsx("box",{position:"absolute",top:0,left:0,right:0,zIndex:1,children:$jsx(ThoughtCloud,{height:cloudH,messages,pick,onResize,onClose})}):null]})});var import_react69=__toESM(require_react_production(),1);var import_react58=__toESM(require_react_production(),1);init_sessions_db();import{existsSync as existsSync15}from"fs";import{homedir as homedir5}from"os";import{join as join11}from"path";var INLINE=process.env.HERM_IO_INLINE==="1",HOME2=()=>process.env.HERMES_HOME||join11(homedir5(),".hermes"),entry=()=>{let js=join11(import.meta.dirname,"db.worker.js");return new URL(existsSync15(js)?"./db.worker.js":"./db.worker.ts",import.meta.url)},state={w:null,seq:0,pending:new Map,inline:null},spawn2=()=>{if(state.w)return state.w;let w2=new Worker(entry());return w2.onmessage=(e)=>{let r=e.data;state.pending.get(r.id)?.(r),state.pending.delete(r.id)},w2.onerror=(ev)=>{let err=`io worker: ${ev.message}`;for(let res of state.pending.values())res({id:-1,ok:!1,err});if(state.pending.clear(),state.w===w2)state.w=null;w2.terminate()},state.w=w2},call=(fn,args)=>{if(INLINE)return state.inline??=Promise.resolve().then(() => (init_fns(),exports_fns)).then((m2)=>m2.FNS),state.inline.then((f)=>f[fn](...args));return new Promise((resolve4,reject)=>{let id=++state.seq;state.pending.set(id,(r)=>r.ok?resolve4(r.v):reject(Error(r.err))),spawn2().postMessage({id,home:HOME2(),fn,args})})},io=new Proxy({},{get:(_2,fn)=>(...args)=>call(fn,args)}),warm=()=>{if(!INLINE)call("roots",[0])};var TabShell=(props)=>{let theme=useTheme().theme;return $jsxs("box",{flexDirection:"column",flexGrow:props.grow??1,flexBasis:0,minWidth:0,minHeight:0,border:!0,borderColor:props.focus?theme.primary:theme.border,backgroundColor:theme.backgroundPanel,padding:1,children:[$jsxs("box",{height:1,overflow:"hidden",flexDirection:"row",children:[$jsx("box",{flexShrink:0,overflow:"hidden",children:$jsx("text",{fg:theme.primary,wrapMode:"none",children:$jsx("strong",{children:props.title})})}),props.titleRight?$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",justifyContent:"flex-end",children:props.titleRight}):null]}),props.error?$jsx("box",{height:1,children:$jsx("text",{fg:theme.error,children:`\u26A0 ${props.error}`})}):null,$jsx("box",{height:1}),$jsx("box",{flexDirection:"column",flexGrow:1,minWidth:0,minHeight:0,overflow:"hidden",children:props.children})]})};var import_react51=__toESM(require_react_production(),1);var HintBar=import_react51.memo((props)=>{let theme=useTheme().theme,text5=props.pairs?props.pairs.map((p)=>`[${p[0]}] ${p[1]}`).join(" ")+(props.suffix?` \xB7 ${props.suffix}`:""):props.raw??"";return $jsx("box",{height:1,flexShrink:0,paddingX:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:text5})})});var KV=(props)=>{let theme=useTheme().theme;return $jsxs("box",{minHeight:1,flexDirection:"row",children:[$jsx("box",{width:13,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:props.label})}),$jsx("box",{flexGrow:1,minWidth:0,height:props.wrap?void 0:1,overflow:props.wrap?void 0:"hidden",children:$jsx("text",{wrapMode:props.wrap?"word":void 0,fg:props.fg??theme.text,children:props.value})})]})},KVBlock=(props)=>props.rows.map(([k2,v2,fg2])=>v2===void 0?null:$jsx(KV,{label:k2,value:v2,fg:fg2},k2));var import_react52=__toESM(require_react_production(),1);var VBAR_W=1,VBAR={visible:!0},Col=(p)=>{let theme=useTheme().theme,fg2=p.fg??theme.text;return $jsx("box",{width:p.w,flexGrow:p.grow?1:0,flexShrink:p.grow?1:0,minWidth:p.grow?p.min??12:p.w,height:1,overflow:"hidden",onMouseDown:p.onClick,flexDirection:"row",justifyContent:p.right?"flex-end":"flex-start",children:$jsx("text",{children:p.bold?$jsx("span",{fg:fg2,children:$jsx("strong",{children:p.children})}):$jsx("span",{fg:fg2,children:p.children})})})},Hdr=(p)=>$jsx("box",{flexDirection:"row",height:1,paddingRight:VBAR_W,children:p.children}),Marquee=(p)=>{let theme=useTheme().theme,fg2=p.fg??theme.text,text5=p.children,box=import_react52.useRef(null),node=import_react52.useRef(null),animate=exports_preferences.get("animations")!==!1&&p.active,[wraps,setWraps]=import_react52.useState(!1);import_react52.useEffect(()=>{let tn=node.current;if(!tn)return;let w2=box.current?.width??0;if(setWraps(text5.length>w2),!animate){tn.scrollX=0;return}let id,period=text5.length+GAP.length,hold=setTimeout(()=>{id=setInterval(()=>{let cur=box.current?.width??0;if(text5.length<=cur){tn.scrollX=0;return}tn.scrollX=(tn.scrollX+1)%period},p.speed??180)},p.hold??600);return()=>{if(clearTimeout(hold),id)clearInterval(id);if(node.current)node.current.scrollX=0}},[animate,text5,p.speed,p.hold]);let body=wraps?text5+GAP+text5:text5;return $jsx("box",{ref:box,width:p.w,flexGrow:p.grow?1:0,flexShrink:p.grow?1:0,minWidth:p.grow?p.min??12:p.w,height:1,overflow:"hidden",children:$jsx("text",{ref:node,wrapMode:"none",children:p.bold?$jsx("span",{fg:fg2,attributes:p.underline?TextAttributes.UNDERLINE:TextAttributes.NONE,children:$jsx("strong",{children:body})}):$jsx("span",{fg:fg2,attributes:p.underline?TextAttributes.UNDERLINE:TextAttributes.NONE,children:body})})})},GAP=" ";var import_react53=__toESM(require_react_production(),1);var Ticker=(p)=>{let ref=import_react53.useRef(null),animate=exports_preferences.get("animations")!==!1&&p.active,speed=p.speed??180,hold=p.hold??600,endHold=p.endHold??3000;return import_react53.useEffect(()=>{let node=ref.current;if(!node)return;if(!animate){node.scrollX=0;return}let dir=1,tick2,wait,step=()=>{let max=node.maxScrollX;if(max<=0)return;if(node.scrollX=Math.max(0,Math.min(max,node.scrollX+dir)),!(dir>0?node.scrollX>=max:node.scrollX<=0))return;if(tick2)clearInterval(tick2),tick2=void 0;dir=-dir,wait=setTimeout(()=>{tick2=setInterval(step,speed)},endHold)};return wait=setTimeout(()=>{tick2=setInterval(step,speed)},hold),()=>{if(wait)clearTimeout(wait);if(tick2)clearInterval(tick2);if(ref.current)ref.current.scrollX=0}},[animate,speed,hold,endHold]),$jsx("box",{flexGrow:1,flexShrink:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("text",{ref,wrapMode:"none",fg:p.fg,children:p.children})})},RX=/(`[^`]+`)|(\*\*[^*]+\*\*)|(__[^_]+__)|((?<![\w*])\*[^*\s][^*]*\*(?![\w*]))|((?<!\w)_[^_\s][^_]*_(?!\w))/g,inline=(s)=>{let out=[],last=0;for(let m2 of s.matchAll(RX)){let at=m2.index??0;if(at>last)out.push({t:s.slice(last,at)});let hit=m2[0];if(hit.startsWith("`"))out.push({t:hit.slice(1,-1),c:!0});else if(hit.startsWith("**")||hit.startsWith("__"))out.push({t:hit.slice(2,-2),b:!0});else out.push({t:hit.slice(1,-1),i:!0});last=at+hit.length}if(last<s.length)out.push({t:s.slice(last)});return out.map((seg)=>seg.c?seg:{...seg,t:seg.t.replace(/^#{1,6}\s+/,"")})};var import_react54=__toESM(require_react_production(),1);var cycle=(t2)=>t2==="off"?"in":t2==="in"?"ex":"off",FilterChip=import_react54.memo((p)=>{let theme=useTheme().theme,color=p.color??theme.accent,text5=p.textColor??theme.text,bg2=p.state==="in"?color:p.state==="ex"?void 0:theme.backgroundElement,fg2=p.state==="in"?theme.background:p.state==="ex"?p.selected?color:theme.borderSubtle:p.selected?color:text5;return $jsx("box",{id:p.id,height:1,flexShrink:0,marginLeft:p.gap??1,paddingLeft:1,paddingRight:1,backgroundColor:bg2,onMouseDown:p.onMouseDown,children:$jsx("text",{fg:fg2,attributes:p.state==="ex"?TextAttributes.STRIKETHROUGH:TextAttributes.NONE,children:p.label})})});var Confirm=(props)=>{let theme=useTheme().theme,keys=useKeys();return useKeyboard((key3)=>{if(keys.match("dialog.confirm",key3)||keys.match("dialog.accept",key3))return props.onConfirm();if(keys.match("dialog.deny",key3))return props.onCancel()}),$jsxs("box",{flexDirection:"column",width:54,children:[$jsx("box",{height:1,children:$jsx("text",{fg:props.danger?theme.warning:theme.primary,children:$jsx("strong",{children:props.title})})}),$jsx("box",{height:1}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:props.body})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:`[${keys.print("dialog.confirm")}/${keys.print("dialog.accept")}] ${props.yes??"confirm"} [${keys.print("dialog.deny")}] ${props.no??"cancel"}`})})]})};function openConfirm(dialog,opts){return new Promise((resolve4)=>{let done=(v2)=>{resolve4(v2),dialog.clear()};dialog.replace($jsx(Confirm,{...opts,onConfirm:()=>done(!0),onCancel:()=>done(!1)}),()=>resolve4(!1))})}var SaveDiscard=(props)=>{let theme=useTheme().theme;return useKeyboard((key3)=>{if(key3.name==="s")return props.onPick("save");if(key3.name==="d")return props.onPick("discard");if(key3.name==="return")return props.onPick("save")}),$jsxs("box",{flexDirection:"column",width:54,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.warning,children:$jsx("strong",{children:props.title})})}),$jsx("box",{height:1}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:props.body})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"[S/Enter] save [D] discard [Esc] keep editing"})})]})};function openSaveDiscard(dialog,opts){return new Promise((resolve4)=>{let done=(v2)=>{resolve4(v2),dialog.clear()};dialog.replace($jsx(SaveDiscard,{...opts,onPick:done,onCancel:()=>done(null)}),()=>resolve4(null))})}var import_react56=__toESM(require_react_production(),1);var TextPrompt=(props)=>{let theme=useTheme().theme,[value,setValue]=import_react56.useState(props.initial??"");return $jsxs("box",{flexDirection:"column",width:60,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:props.title})})}),$jsx("box",{height:1}),props.label?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:props.label})}):null,$jsxs("box",{height:1,flexDirection:"row",overflow:"hidden",children:[$jsx("box",{flexShrink:0,children:$jsx("text",{fg:theme.accent,children:"\u2503 "})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("input",{value,onInput:setValue,onSubmit:()=>{let v2=value.trim();if(v2)props.onSubmit(v2)},focused:!0,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement})})]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:value.trim()?"Enter confirm \xB7 Esc cancel \xB7 Ctrl+U clear":"Esc cancel"})})]})};function openTextPrompt(dialog,opts){return new Promise((resolve4)=>{dialog.replace($jsx(TextPrompt,{title:opts.title,label:opts.label,initial:opts.initial,onSubmit:(v2)=>{resolve4(v2),dialog.clear()}}),()=>resolve4(null))})}var h12=()=>exports_preferences.get("timeFormat")==="12h",abs=()=>exports_preferences.get("timeStyle")==="absolute",trunc5=(s,max)=>s.length<=max?s:s.slice(0,max-1)+"\u2026",fmt=(n)=>n>=1e6?`${(n/1e6).toFixed(2)}M`:n>=1000?`${(n/1000).toFixed(1)}k`:String(n),cost2=(c)=>c==null?"\u2014":`$${c.toFixed(2)}`,clock=(d2)=>d2.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",hour12:h12()}),stamp=(ts)=>{let d2=new Date(ts*1000);return d2.toDateString()===new Date().toDateString()?clock(d2):d2.toLocaleDateString(void 0,{month:"short",day:"numeric"})},rel=(ts)=>{let s=Math.floor(Date.now()/1000-ts);if(s<60)return"just now";if(s<3600)return`${Math.floor(s/60)}m ago`;if(s<86400)return`${Math.floor(s/3600)}h ago`;return`${Math.floor(s/86400)}d ago`},ago=(ts)=>abs()?stamp(ts):rel(ts),until=(ts)=>{if(abs())return ts<=Date.now()/1000?"due":stamp(ts);let s=Math.floor(ts-Date.now()/1000);if(s<=0)return"due";if(s<60)return`in ${s}s`;if(s<3600)return`in ${Math.floor(s/60)}m`;if(s<86400)return`in ${Math.floor(s/3600)}h`;return`in ${Math.floor(s/86400)}d`},when=(ts)=>{let d2=new Date(ts*1000);return`${d2.toLocaleDateString()} ${clock(d2)}`},span=(start,end)=>{let s=Math.round(end-start);if(s<0)return"\u2014";if(s>=3600)return`${Math.floor(s/3600)}h ${Math.floor(s%3600/60)}m`;if(s>=60)return`${Math.floor(s/60)}m`;return`${s}s`},dur2=(s)=>s>=3600?`${Math.floor(s/3600)}h${Math.floor(s%3600/60)}m`:s>=60?`${Math.floor(s/60)}m${Math.floor(s%60)}s`:`${Math.floor(s)}s`;var import_react57=__toESM(require_react_production(),1);import{watch as watch2,existsSync as existsSync17,statSync as statSync6}from"fs";import{dirname as dirname7,basename as basename8}from"path";import{readdir,stat}from"fs/promises";import{openSync,readSync,closeSync,readdirSync as readdirSync8,readFileSync as readFileSync10,existsSync as existsSync16}from"fs";import{homedir as homedir6}from"os";init_sessions_db();var HOME3=process.env.HOME||homedir6(),home2={path:process.env.HERMES_HOME||`${HOME3}/.hermes`},setHome2=(h2)=>{home2.path=h2},hermesPath=(relative4)=>`${home2.path}/${relative4}`,managedSystem=async()=>{let env2=(process.env.HERMES_MANAGED??"").trim();if(env2){let norm=env2.toLowerCase();if(norm==="1"||norm==="true"||norm==="yes"||norm==="on")return"NixOS";return{homebrew:"Homebrew",nix:"NixOS",nixos:"NixOS"}[norm]??env2}return await Bun.file(hermesPath(".managed")).exists()?"NixOS":null},makeSource=(relative4,label)=>({file:hermesPath(relative4),relative:relative4,label:label??relative4.split("/").pop()??relative4});function readSkillFrontmatter(source){try{let fd=openSync(source.file,"r"),buf=Buffer.alloc(2048),n=readSync(fd,buf,0,2048,0);closeSync(fd);let head=buf.toString("utf-8",0,n);if(!head.startsWith("---"))return{description:"",tags:[]};let end=head.indexOf(`
|
|
4106
|
+
`).filter((s)=>s.length>0).map(parseChafaLine)}function hex(c){if(!c)return;return`#${c.r.toString(16).padStart(2,"0")}${c.g.toString(16).padStart(2,"0")}${c.b.toString(16).padStart(2,"0")}`}var CHAFA_PATHS=["/usr/sbin/chafa","/usr/bin/chafa","/usr/local/bin/chafa","/opt/homebrew/bin/chafa","/home/linuxbrew/.linuxbrew/bin/chafa"],cachedBin=void 0;function chafaBin(){if(cachedBin!==void 0)return cachedBin;let bin=Bun.which?.("chafa")??null;if(bin)return cachedBin=bin,bin;for(let p of CHAFA_PATHS)if(existsSync13(p))return cachedBin=p,p;return cachedBin=null,null}function resolveImage(path4){let full=path4.startsWith("~")?(process.env.HOME??"")+path4.slice(1):path4;return existsSync13(full)?full:null}var CACHE=new Map,INFLIGHT=new Map,CACHE_CAP=50;function cacheGet(k2){let v2=CACHE.get(k2);if(!v2)return;return CACHE.delete(k2),CACHE.set(k2,v2),v2}function cachePut(k2,v2){if(CACHE.size>=CACHE_CAP)CACHE.delete(CACHE.keys().next().value);CACHE.set(k2,v2)}async function renderChafa(path4,width,height){let bin=chafaBin();if(!bin)return{err:"chafa not installed"};let full=resolveImage(path4);if(!full)return{err:`not found: ${path4}`};let mtime=0;try{mtime=statSync5(full).mtimeMs|0}catch{}let h2=height??Math.max(6,Math.round(width/3)),key3=`${full}:${mtime}:${width}x${h2}`,cached2=cacheGet(key3);if(cached2)return{rows:cached2};let hit=INFLIGHT.get(key3);if(hit)return hit;let task=(async()=>{try{let proc=Bun.spawn([bin,`--size=${width}x${h2}`,"--format=symbols","--symbols=block","--colors=full",full],{stdout:"pipe",stderr:"pipe"}),timeout=!1,timer2=setTimeout(()=>{timeout=!0,proc.kill()},5000),[code,stdout,stderr]=await Promise.all([proc.exited,new Response(proc.stdout).text(),new Response(proc.stderr).text()]).finally(()=>clearTimeout(timer2));if(timeout)return{err:"chafa timed out"};if(code!==0)return{err:(stderr||`chafa exit ${code}`).trim()};let rows2=parseChafa(stdout);return cachePut(key3,rows2),{rows:rows2}}catch(err){return{err:err instanceof Error?err.message:String(err)}}})();INFLIGHT.set(key3,task);let clear=()=>{if(INFLIGHT.get(key3)===task)INFLIGHT.delete(key3)};return task.then(clear,clear),task}var basename7=(p)=>p.split(/[/\\]/).pop()||p,ChafaImage=import_react46.memo(({path:path4,width,bare,chafa,load:load4=renderChafa})=>{let theme=useTheme().theme,[collapsed,setCollapsed]=import_react46.useState(!1),[result,setResult]=import_react46.useState(null),w2=Math.max(20,Math.min(80,width??60)),preview=strategy(path4,chafa??chafaBin()!==null);if(import_react46.useEffect(()=>{let live=!0;if(setResult(null),preview.kind!=="chafa")return()=>{live=!1};return load4(path4,w2).then((value)=>{if(live)setResult(value)},(err)=>{if(live)setResult({err:err instanceof Error?err.message:String(err)})}),()=>{live=!1}},[path4,w2,preview.kind,load4]),preview.kind!=="chafa"||!result||"err"in result)return $jsx(MediaChip,{path:path4,bare});if(collapsed)return $jsx(MediaChip,{path:path4,bare,onMouseDown:(e)=>{e.stopPropagation(),setCollapsed(!1)}});return $jsxs("box",{flexDirection:"column",marginTop:bare?0:1,children:[$jsx("box",{flexDirection:"column",onMouseDown:(e)=>{if(e.stopPropagation(),!bare)setCollapsed(!0)},children:result.rows.map((row3,i)=>$jsx("text",{children:row3.map((c,j2)=>$jsx("span",{fg:hex(c.fg),bg:hex(c.bg),children:c.ch},j2))},i))}),bare?null:$jsx("box",{height:1,onMouseDown:(e)=>{e.stopPropagation(),openFile(path4)},children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:" "}),$jsx("span",{fg:theme.accent,children:"\u25C9 "}),$jsx("span",{fg:theme.text,children:basename7(path4)}),$jsx("span",{fg:theme.textMuted,children:" click image to collapse \xB7 click name to open"})]})})]})});var import_react47=__toESM(require_react_production(),1);import{existsSync as existsSync14,readFileSync as readFileSync9,readdirSync as readdirSync7}from"fs";import{homedir as homedir3}from"os";import{join as join10}from"path";var composer=require_composer(),Document=require_Document(),Schema=require_Schema(),errors=require_errors(),Alias=require_Alias(),identity=require_identity(),Pair=require_Pair(),Scalar=require_Scalar(),YAMLMap=require_YAMLMap(),YAMLSeq=require_YAMLSeq(),cst=require_cst(),lexer=require_lexer(),lineCounter=require_line_counter(),parser=require_parser(),publicApi=require_public_api(),visit=require_visit();var $Composer=composer.Composer,$Document=Document.Document,$Schema=Schema.Schema,$YAMLError=errors.YAMLError,$YAMLParseError=errors.YAMLParseError,$YAMLWarning=errors.YAMLWarning,$Alias=Alias.Alias,$isAlias=identity.isAlias,$isCollection=identity.isCollection,$isDocument=identity.isDocument,$isMap=identity.isMap,$isNode=identity.isNode,$isPair=identity.isPair,$isScalar=identity.isScalar,$isSeq=identity.isSeq,$Pair=Pair.Pair,$Scalar=Scalar.Scalar,$YAMLMap=YAMLMap.YAMLMap,$YAMLSeq=YAMLSeq.YAMLSeq;var $Lexer=lexer.Lexer,$LineCounter=lineCounter.LineCounter,$Parser=parser.Parser,$parse=publicApi.parse,$parseAllDocuments=publicApi.parseAllDocuments,$parseDocument=publicApi.parseDocument,$stringify=publicApi.stringify,$visit=visit.visit,$visitAsync=visit.visitAsync;var SKINS=["default","ares","mono","slate","daylight","warm-lightmode","poseidon","sisyphus","charizard"],home=()=>process.env.HERMES_HOME||join10(process.env.HOME||homedir3(),".hermes"),skin=(path4)=>{try{let raw=$parse(readFileSync9(path4,"utf8"));if(raw&&typeof raw==="object"&&!Array.isArray(raw)){let name=raw.name;if(typeof name==="string"&&name.trim())return name.trim()}}catch{}return null};function skins(){let dir=join10(home(),"skins");if(!existsSync14(dir))return[...SKINS];let extra=readdirSync7(dir,{withFileTypes:!0}).filter((e)=>e.isFile()&&e.name.endsWith(".yaml")).map((e)=>skin(join10(dir,e.name))).filter((name)=>name!==null&&!SKINS.includes(name)).sort();return[...SKINS,...new Set(extra)]}function mode(name){let n=name.toLowerCase();if(n.includes("light")||n==="tango-adapted")return"light";if(n==="tokyo-storm")return"dark";return}var DEFAULT={agentName:"Hermes"},Ctx5=import_react47.createContext(DEFAULT);function deriveSkin(skin2){let name=skin2?.branding?.agent_name?.trim();return{skin:skin2??void 0,agentName:name||"Hermes"}}var SkinProvider=import_react47.memo(({value,children})=>$jsx(Ctx5.Provider,{value,children}));function useSkin(){return import_react47.useContext(Ctx5)}var SYMBOLS={"\\alpha":"\u03B1","\\beta":"\u03B2","\\gamma":"\u03B3","\\delta":"\u03B4","\\epsilon":"\u03B5","\\varepsilon":"\u03B5","\\zeta":"\u03B6","\\eta":"\u03B7","\\theta":"\u03B8","\\vartheta":"\u03D1","\\iota":"\u03B9","\\kappa":"\u03BA","\\lambda":"\u03BB","\\mu":"\u03BC","\\nu":"\u03BD","\\xi":"\u03BE","\\pi":"\u03C0","\\varpi":"\u03D6","\\rho":"\u03C1","\\varrho":"\u03F1","\\sigma":"\u03C3","\\varsigma":"\u03C2","\\tau":"\u03C4","\\upsilon":"\u03C5","\\phi":"\u03C6","\\varphi":"\u03C6","\\chi":"\u03C7","\\psi":"\u03C8","\\omega":"\u03C9","\\Gamma":"\u0393","\\Delta":"\u0394","\\Theta":"\u0398","\\Lambda":"\u039B","\\Xi":"\u039E","\\Pi":"\u03A0","\\Sigma":"\u03A3","\\Upsilon":"\u03A5","\\Phi":"\u03A6","\\Psi":"\u03A8","\\Omega":"\u03A9","\\sum":"\u2211","\\prod":"\u220F","\\coprod":"\u2210","\\int":"\u222B","\\iint":"\u222C","\\iiint":"\u222D","\\oint":"\u222E","\\bigcup":"\u22C3","\\bigcap":"\u22C2","\\bigvee":"\u22C1","\\bigwedge":"\u22C0","\\bigoplus":"\u2A01","\\bigotimes":"\u2A02","\\partial":"\u2202","\\nabla":"\u2207","\\sqrt":"\u221A","\\emptyset":"\u2205","\\varnothing":"\u2205","\\infty":"\u221E","\\in":"\u2208","\\notin":"\u2209","\\ni":"\u220B","\\subset":"\u2282","\\supset":"\u2283","\\subseteq":"\u2286","\\supseteq":"\u2287","\\subsetneq":"\u228A","\\supsetneq":"\u228B","\\cup":"\u222A","\\cap":"\u2229","\\setminus":"\u2216","\\complement":"\u2201","\\forall":"\u2200","\\exists":"\u2203","\\nexists":"\u2204","\\land":"\u2227","\\lor":"\u2228","\\lnot":"\xAC","\\neg":"\xAC","\\therefore":"\u2234","\\because":"\u2235","\\le":"\u2264","\\leq":"\u2264","\\ge":"\u2265","\\geq":"\u2265","\\ne":"\u2260","\\neq":"\u2260","\\ll":"\u226A","\\gg":"\u226B","\\approx":"\u2248","\\equiv":"\u2261","\\cong":"\u2245","\\sim":"\u223C","\\simeq":"\u2243","\\propto":"\u221D","\\perp":"\u22A5","\\parallel":"\u2225","\\models":"\u22A8","\\vdash":"\u22A2","\\mid":"\u2223","\\nmid":"\u2224","\\divides":"\u2223","\\blacksquare":"\u25A0","\\square":"\u25A1","\\Box":"\u25A1","\\qed":"\u220E","\\bigstar":"\u2605","\\bmod":"mod","\\mod":"mod","\\langle":"\u27E8","\\rangle":"\u27E9","\\lceil":"\u2308","\\rceil":"\u2309","\\lfloor":"\u230A","\\rfloor":"\u230B","\\|":"\u2016","\\to":"\u2192","\\rightarrow":"\u2192","\\leftarrow":"\u2190","\\leftrightarrow":"\u2194","\\Rightarrow":"\u21D2","\\Leftarrow":"\u21D0","\\Leftrightarrow":"\u21D4","\\implies":"\u27F9","\\impliedby":"\u27F8","\\iff":"\u27FA","\\mapsto":"\u21A6","\\hookrightarrow":"\u21AA","\\hookleftarrow":"\u21A9","\\uparrow":"\u2191","\\downarrow":"\u2193","\\updownarrow":"\u2195","\\cdot":"\u22C5","\\cdots":"\u22EF","\\ldots":"\u2026","\\dots":"\u2026","\\dotsb":"\u2026","\\dotsc":"\u2026","\\vdots":"\u22EE","\\ddots":"\u22F1","\\times":"\xD7","\\div":"\xF7","\\pm":"\xB1","\\mp":"\u2213","\\circ":"\u2218","\\bullet":"\u2022","\\star":"\u22C6","\\ast":"\u2217","\\oplus":"\u2295","\\ominus":"\u2296","\\otimes":"\u2297","\\odot":"\u2299","\\diamond":"\u22C4","\\angle":"\u2220","\\triangle":"\u25B3","\\,":" ","\\;":" ","\\:":" ","\\!":"","\\ ":" ","\\quad":" ","\\qquad":" ","\\sin":"sin","\\cos":"cos","\\tan":"tan","\\cot":"cot","\\sec":"sec","\\csc":"csc","\\arcsin":"arcsin","\\arccos":"arccos","\\arctan":"arctan","\\sinh":"sinh","\\cosh":"cosh","\\tanh":"tanh","\\log":"log","\\ln":"ln","\\exp":"exp","\\det":"det","\\dim":"dim","\\ker":"ker","\\lim":"lim","\\liminf":"liminf","\\limsup":"limsup","\\sup":"sup","\\inf":"inf","\\max":"max","\\min":"min","\\arg":"arg","\\gcd":"gcd","\\&":"&","\\%":"%","\\$":"$","\\#":"#","\\_":"_","\\{":"{","\\}":"}"},BB={A:"\uD835\uDD38",B:"\uD835\uDD39",C:"\u2102",D:"\uD835\uDD3B",E:"\uD835\uDD3C",F:"\uD835\uDD3D",G:"\uD835\uDD3E",H:"\u210D",I:"\uD835\uDD40",J:"\uD835\uDD41",K:"\uD835\uDD42",L:"\uD835\uDD43",M:"\uD835\uDD44",N:"\u2115",O:"\uD835\uDD46",P:"\u2119",Q:"\u211A",R:"\u211D",S:"\uD835\uDD4A",T:"\uD835\uDD4B",U:"\uD835\uDD4C",V:"\uD835\uDD4D",W:"\uD835\uDD4E",X:"\uD835\uDD4F",Y:"\uD835\uDD50",Z:"\u2124"},CAL={A:"\uD835\uDC9C",B:"\u212C",C:"\uD835\uDC9E",D:"\uD835\uDC9F",E:"\u2130",F:"\u2131",G:"\uD835\uDCA2",H:"\u210B",I:"\u2110",J:"\uD835\uDCA5",K:"\uD835\uDCA6",L:"\u2112",M:"\u2133",N:"\uD835\uDCA9",O:"\uD835\uDCAA",P:"\uD835\uDCAB",Q:"\uD835\uDCAC",R:"\u211B",S:"\uD835\uDCAE",T:"\uD835\uDCAF",U:"\uD835\uDCB0",V:"\uD835\uDCB1",W:"\uD835\uDCB2",X:"\uD835\uDCB3",Y:"\uD835\uDCB4",Z:"\uD835\uDCB5"},FRAK={A:"\uD835\uDD04",B:"\uD835\uDD05",C:"\u212D",D:"\uD835\uDD07",E:"\uD835\uDD08",F:"\uD835\uDD09",G:"\uD835\uDD0A",H:"\u210C",I:"\u2111",J:"\uD835\uDD0D",K:"\uD835\uDD0E",L:"\uD835\uDD0F",M:"\uD835\uDD10",N:"\uD835\uDD11",O:"\uD835\uDD12",P:"\uD835\uDD13",Q:"\uD835\uDD14",R:"\u211C",S:"\uD835\uDD16",T:"\uD835\uDD17",U:"\uD835\uDD18",V:"\uD835\uDD19",W:"\uD835\uDD1A",X:"\uD835\uDD1B",Y:"\uD835\uDD1C",Z:"\u2128"},SUPERSCRIPT={"0":"\u2070","1":"\xB9","2":"\xB2","3":"\xB3","4":"\u2074","5":"\u2075","6":"\u2076","7":"\u2077","8":"\u2078","9":"\u2079","+":"\u207A","-":"\u207B","=":"\u207C","(":"\u207D",")":"\u207E",a:"\u1D43",b:"\u1D47",c:"\u1D9C",d:"\u1D48",e:"\u1D49",f:"\u1DA0",g:"\u1D4D",h:"\u02B0",i:"\u2071",j:"\u02B2",k:"\u1D4F",l:"\u02E1",m:"\u1D50",n:"\u207F",o:"\u1D52",p:"\u1D56",r:"\u02B3",s:"\u02E2",t:"\u1D57",u:"\u1D58",v:"\u1D5B",w:"\u02B7",x:"\u02E3",y:"\u02B8",z:"\u1DBB"},SUBSCRIPT={"0":"\u2080","1":"\u2081","2":"\u2082","3":"\u2083","4":"\u2084","5":"\u2085","6":"\u2086","7":"\u2087","8":"\u2088","9":"\u2089","+":"\u208A","-":"\u208B","=":"\u208C","(":"\u208D",")":"\u208E",a:"\u2090",e:"\u2091",h:"\u2095",i:"\u1D62",j:"\u2C7C",k:"\u2096",l:"\u2097",m:"\u2098",n:"\u2099",o:"\u2092",p:"\u209A",r:"\u1D63",s:"\u209B",t:"\u209C",u:"\u1D64",v:"\u1D65",x:"\u2093"};var escapeRe=(s)=>s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),splitByEnding=(keys)=>{let letter=[],punct=[];for(let k2 of keys)if(/[A-Za-z]$/.test(k2))letter.push(k2);else punct.push(k2);return{letter,punct}},buildAlt=(cmds)=>cmds.sort((a,b2)=>b2.length-a.length).map(escapeRe).join("|"),{letter:LETTER_CMDS,punct:PUNCT_CMDS}=splitByEnding(Object.keys(SYMBOLS)),SYMBOL_LETTER_RE=new RegExp("(?:"+buildAlt(LETTER_CMDS)+")(?![A-Za-z])","g"),SYMBOL_PUNCT_RE=new RegExp("(?:"+buildAlt(PUNCT_CMDS)+")","g"),convertScript=(input,table,sigil)=>{let out="",allMapped=!0;for(let ch of input){let mapped=table[ch];if(!mapped){allMapped=!1;break}out+=mapped}if(allMapped)return out;let trimmed=input.trim();if([...trimmed].length===1)return`${sigil}${trimmed}`;return`${sigil}(${trimmed})`},readBraced=(s,start)=>{if(s[start]!=="{")return null;let depth=1,i=start+1;while(i<s.length&&depth>0){let c=s[i];if(c==="\\"&&i+1<s.length){i+=2;continue}if(c==="{")depth++;else if(c==="}")depth--;if(depth>0)i++}if(depth!==0)return null;return{content:s.slice(start+1,i),end:i+1}},replaceBracedCommand=(input,command,render)=>{let cmdLen=command.length,out="",i=0;while(i<input.length){let idx=input.indexOf(command,i);if(idx<0)return out+=input.slice(i),out;let after=input[idx+cmdLen];if(after&&/[A-Za-z]/.test(after)){out+=input.slice(i,idx+cmdLen),i=idx+cmdLen;continue}out+=input.slice(i,idx);let p=idx+cmdLen;while(input[p]===" "||input[p]==="\t")p++;let arg=readBraced(input,p);if(!arg){out+=input.slice(idx,p+1),i=p+1;continue}out+=render(replaceBracedCommand(arg.content,command,render)),i=arg.end}return out},replaceFracs=(input)=>{let out="",i=0;while(i<input.length){let idx=input.indexOf("\\frac",i);if(idx<0)return out+=input.slice(i),out;let after=input[idx+5];if(after&&/[A-Za-z]/.test(after)){out+=input.slice(i,idx+5),i=idx+5;continue}out+=input.slice(i,idx);let p=idx+5;while(input[p]===" "||input[p]==="\t")p++;let num2=readBraced(input,p);if(!num2){out+=input.slice(idx,p+1),i=p+1;continue}p=num2.end;while(input[p]===" "||input[p]==="\t")p++;let den=readBraced(input,p);if(!den){out+=input.slice(idx,p+1),i=p+1;continue}out+=`${wrapForFrac(replaceFracs(num2.content))}/${wrapForFrac(replaceFracs(den.content))}`,i=den.end}return out},wrapForFrac=(expr)=>{let trimmed=expr.trim();if(!trimmed)return trimmed;if(/^\(.*\)$/.test(trimmed))return trimmed;if(/[+\-/*]|\s/.test(trimmed))return`(${trimmed})`;return trimmed};function texToUnicode(input){let s=input;return s=s.replace(/\\mathbb\s*\{([A-Za-z])\}/g,(raw,c)=>BB[c]??raw),s=s.replace(/\\mathcal\s*\{([A-Za-z])\}/g,(raw,c)=>CAL[c]??raw),s=s.replace(/\\mathfrak\s*\{([A-Za-z])\}/g,(raw,c)=>FRAK[c]??raw),s=s.replace(/\\mathbf\s*\{([^{}]+)\}/g,(_2,c)=>c),s=s.replace(/\\mathit\s*\{([^{}]+)\}/g,(_2,c)=>c),s=s.replace(/\\mathrm\s*\{([^{}]+)\}/g,(_2,c)=>c),s=s.replace(/\\text\s*\{([^{}]+)\}/g,(_2,c)=>c),s=s.replace(/\\operatorname\s*\{([^{}]+)\}/g,(_2,c)=>c),s=s.replace(/\\overline\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0305`),s=s.replace(/\\hat\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0302`),s=s.replace(/\\bar\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0304`),s=s.replace(/\\tilde\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0303`),s=s.replace(/\\vec\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u20D7`),s=s.replace(/\\dot\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0307`),s=s.replace(/\\ddot\s*\{([^{}]+)\}/g,(_2,c)=>`${c}\u0308`),s=replaceFracs(s),s=replaceBracedCommand(s,"\\boxed",(body)=>`**${body.trim()}**`),s=replaceBracedCommand(s,"\\fbox",(body)=>`**${body.trim()}**`),s=s.replace(/\\xrightarrow\s*\{([^{}]*)\}/g,(_2,label)=>`\u2500${label.trim()}\u2192`),s=s.replace(/\\xleftarrow\s*\{([^{}]*)\}/g,(_2,label)=>`\u2190${label.trim()}\u2500`),s=s.replace(/\\Longrightarrow/g,"\u27F9"),s=s.replace(/\\Longleftarrow/g,"\u27F8"),s=s.replace(/\\Longleftrightarrow/g,"\u27FA"),s=s.replace(/\s*\\pmod\s*\{([^{}]*)\}/g,(_2,p)=>` (mod ${p.trim()})`),s=s.replace(/\s*\\pod\s*\{([^{}]*)\}/g,(_2,p)=>` (${p.trim()})`),s=s.replace(/\s*\\tag\s*\{([^{}]*)\}/g,(_2,n)=>` (${n.trim()})`),s=s.replace(/\\(?:Bigg|bigg|Big|big)[lrm]?(?![A-Za-z])/g,""),s=s.replace(/\\(?:scriptscriptstyle|displaystyle|scriptstyle|textstyle|nolimits|limits)(?![A-Za-z])\s*/g,""),s=s.replace(/\\left(?![A-Za-z])\.?/g,""),s=s.replace(/\\right(?![A-Za-z])\.?/g,""),s=s.replace(SYMBOL_PUNCT_RE,(m2)=>SYMBOLS[m2]??m2),s=s.replace(SYMBOL_LETTER_RE,(m2)=>SYMBOLS[m2]??m2),s=s.replace(/\^\s*\{([^{}]+)\}/g,(_2,body)=>convertScript(body,SUPERSCRIPT,"^")),s=s.replace(/\^([A-Za-z0-9+\-=])/g,(raw,ch)=>SUPERSCRIPT[ch]??raw),s=s.replace(/_\s*\{([^{}]+)\}/g,(_2,body)=>convertScript(body,SUBSCRIPT,"_")),s=s.replace(/_([A-Za-z0-9+\-=])/g,(raw,ch)=>SUBSCRIPT[ch]??raw),s}var CODE_SPAN_RE=/(`{1,2})[^`\n]+?\1/g,MATH_SPAN_RE=new RegExp([String.raw`\$\$([^$]+?)\$\$`,String.raw`\\\[([\s\S]+?)\\\]`,String.raw`\\\(([^\n]+?)\\\)`,String.raw`(?<!\$)\$([^\s$](?:[^$\n]*?[^\s$])?)\$(?!\$)`].join("|"),"g");function mathify(md){if(!/[$\\]/.test(md))return md;let out="",i=0;CODE_SPAN_RE.lastIndex=0;for(let m2 of md.matchAll(CODE_SPAN_RE))out+=md.slice(i,m2.index).replace(MATH_SPAN_RE,(_2,a,b2,c,d2)=>texToUnicode(a??b2??c??d2)),out+=m2[0],i=m2.index+m2[0].length;return out+=md.slice(i).replace(MATH_SPAN_RE,(_2,a,b2,c,d2)=>texToUnicode(a??b2??c??d2)),out}function duration(ms2){if(ms2<1000)return`${ms2}ms`;let s=ms2/1000;if(s<60)return`${s.toFixed(1)}s`;return`${Math.floor(s/60)}m${Math.floor(s%60)}s`}function tokens2(n){if(n<1000)return String(n);if(n<1e6)return`${(n/1000).toFixed(1)}k`;return`${(n/1e6).toFixed(2)}M`}function extract(msg){return msg.parts.filter((p)=>p.type==="text").map((p)=>p.content).join("")}var trunc3=(s,max)=>s.length<=max?s:s.slice(0,max-1)+"\u2026";function mix(a,b2,n=0.5){return RGBA.fromValues(a.r+(b2.r-a.r)*n,a.g+(b2.g-a.g)*n,a.b+(b2.b-a.b)*n,a.a+(b2.a-a.a)*n)}function darken(c,n=0.95){return RGBA.fromValues(c.r*n,c.g*n,c.b*n,c.a)}function lighten(c,n=0.05){return RGBA.fromValues(c.r+(1-c.r)*n,c.g+(1-c.g)*n,c.b+(1-c.b)*n,c.a)}var TOP_RULE={topLeft:"\u2594",topRight:"\u2594",horizontal:"\u2594",bottomLeft:"",bottomRight:"",vertical:"",topT:"",bottomT:"",leftT:"",rightT:"",cross:""},BOTTOM_RULE={bottomLeft:"\u2581",bottomRight:"\u2581",horizontal:"\u2581",topLeft:"",topRight:"",vertical:"",topT:"",bottomT:"",leftT:"",rightT:"",cross:""},TABLE={style:"grid"};function useClick(fn){let at=import_react48.useRef(null);return{onMouseDown:(e)=>{at.current={x:e.x,y:e.y}},onMouseUp:(e)=>{let a=at.current;if(at.current=null,fn&&a&&a.x===e.x&&a.y===e.y)fn()}}}var MessageItem=import_react48.memo(({message,streaming,prompt,onRewind,onPick})=>{if(message.role==="system")return $jsx(SystemMessage,{message});if(message.role==="user")return $jsx(UserMessage,{message,onRewind});return $jsx(AssistantMessage,{message,streaming,prompt,onPick})}),SystemMessage=import_react48.memo(({message})=>{let theme=useTheme().theme;return $jsx("box",{marginBottom:1,minHeight:1,children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:extract(message)})})}),UserMessage=import_react48.memo(({message,onRewind})=>{let ctx=useTheme(),theme=ctx.theme,[hover,setHover]=import_react48.useState(!1),click=useClick(onRewind&&(()=>onRewind(message))),fill=import_react48.useMemo(()=>ctx.mode==="dark"?mix(theme.background,theme.backgroundElement):darken(theme.backgroundElement),[ctx.mode,theme.background,theme.backgroundElement]),edge=import_react48.useMemo(()=>ctx.mode==="dark"?darken(theme.background):darken(theme.backgroundElement),[ctx.mode,theme.background,theme.backgroundElement]),segs=import_react48.useMemo(()=>message.parts.map((p)=>p.type==="text"&&p.content?splitContent(p.content):null),[message.parts]);return $jsxs("box",{flexDirection:"column",marginBottom:1,children:[$jsx("box",{height:1,border:["bottom"],customBorderChars:BOTTOM_RULE,borderColor:edge}),$jsx("box",{backgroundColor:hover?fill:theme.backgroundElement,paddingLeft:1,paddingRight:1,paddingY:1,flexDirection:"column",minHeight:1,onMouseOver:()=>setHover(!0),onMouseOut:()=>setHover(!1),...click,children:message.parts.map((p,i)=>{let seg=segs[i];if(!seg)return null;let k2=p.key??i;return seg.map((s,j2)=>{if("media"in s)return classify(s.media)==="img"?$jsx("box",{children:$jsx(ChafaImage,{path:s.media})},`${k2}-m${j2}`):$jsx("box",{marginTop:1,children:$jsx(MediaChip,{path:s.media})},`${k2}-m${j2}`);if("code"in s)return $jsx(CodeBlock,{code:s.code,lang:s.lang},`${k2}-c${j2}`);return $jsx("text",{fg:theme.text,wrapMode:"word",children:s.md},`${k2}-${j2}`)})})}),$jsx("box",{height:1,border:["top"],customBorderChars:TOP_RULE,borderColor:edge})]})}),AssistantMessage=import_react48.memo(({message,streaming,prompt,onPick})=>{let ctx=useTheme(),theme=ctx.theme,{agentName}=useSkin(),[hover,setHover]=import_react48.useState(!1),click=useClick(onPick&&(()=>onPick(message))),rail2=import_react48.useMemo(()=>ctx.mode==="dark"?lighten(theme.background):darken(theme.backgroundElement),[ctx.mode,theme.background,theme.backgroundElement]),err=!!message.error,trail=message.parts.filter((p)=>p.type==="tool"||p.type==="prompt"),diffs=trail.filter((p)=>p.type==="tool"&&(!!p.diff||isDiff(p.result))),segs=import_react48.useMemo(()=>message.parts.map((p)=>p.type==="text"&&p.content?splitContent(p.content):null),[message.parts]),header=[message.speaker??agentName,message.usage?`${tokens2(message.usage.input)}\u2192${tokens2(message.usage.output)} tok`:null,message.duration?duration(message.duration):null].filter(Boolean).join(" \xB7 "),part=(p,i)=>{if(p.type==="prompt")return $jsx("box",{marginTop:1,onMouseDown:(e)=>e.stopPropagation(),children:$jsx(PromptCard,{part:p,ref:!p.answered?prompt?.ref:void 0,onAnswer:prompt?.onAnswer??(()=>{})})},`pr-${p.id}`);let seg=segs[i];if(!seg)return null;let k2=p.key??i,last=streaming&&p.streaming;return seg.map((s,j2)=>{let tail=last&&j2===seg.length-1;if("media"in s)return classify(s.media)==="img"?$jsx("box",{children:$jsx(ChafaImage,{path:s.media})},`${k2}-m${j2}`):$jsx("box",{marginTop:1,children:$jsx(MediaChip,{path:s.media})},`${k2}-m${j2}`);if("code"in s)return $jsx(CodeBlock,{code:s.code,lang:s.lang,streaming:tail},`${k2}-c${j2}`);return $jsx("box",{children:$jsx("markdown",{content:mathify(s.md),fg:theme.markdownText,syntaxStyle:ctx.syntaxStyle,streaming:tail,internalBlockMode:"top-level",tableOptions:TABLE})},`${k2}-${j2}`)})};return $jsxs("box",{flexDirection:"row",marginBottom:1,onMouseOver:()=>setHover(!0),onMouseOut:()=>setHover(!1),...click,children:[$jsxs("box",{flexDirection:"column",flexGrow:1,flexShrink:1,children:[$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{flexGrow:1,children:$jsx("text",{fg:theme.textMuted,children:header})}),trail.length?$jsx("box",{children:$jsx("text",{fg:theme.textMuted,children:trunc3(trail.map((p)=>p.type==="tool"?p.name:"?").join(" \xB7 "),40)})}):null]}),message.parts.map(part),diffs.length?$jsx(DiffTabs,{tools:diffs}):null,err?$jsx(ErrorBlock,{text:message.error}):null]}),$jsxs("box",{width:3,flexShrink:0,flexDirection:"row",children:[$jsx("box",{width:2}),$jsx("box",{width:1,backgroundColor:hover?rail2:void 0})]})]})});var MessageList=import_react49.memo(({messages,streaming,prompt,onRewind,onPick})=>{let theme=useTheme().theme,style=import_react49.useMemo(()=>({viewportOptions:{backgroundColor:theme.background},scrollbarOptions:{trackOptions:{foregroundColor:theme.borderSubtle,backgroundColor:theme.background}}}),[theme]);if(messages.length===0)return $jsx("box",{flexGrow:1});let last=messages[messages.length-1],lastStreaming=streaming&&last?.role==="assistant";return $jsx("scrollbox",{flexGrow:1,scrollY:!0,stickyScroll:!0,stickyStart:"bottom",style,children:$jsx("box",{flexDirection:"column",paddingBottom:1,children:messages.map((msg,i)=>$jsx("box",{flexDirection:"column",children:$jsx(MessageItem,{message:msg,streaming:lastStreaming&&i===messages.length-1,prompt,onRewind,onPick})},msg.id))})})});var Chat=import_react50.memo(({messages,streaming,prompt,cloud,cloudH,pick,onResize,onPick,onClose,onRewind})=>{let theme=useTheme().theme;return $jsxs("box",{flexGrow:1,flexDirection:"column",position:"relative",backgroundColor:theme.background,children:[$jsx(MessageList,{messages,streaming,prompt,onRewind,onPick}),cloud?$jsx("box",{position:"absolute",top:0,left:0,right:0,zIndex:1,children:$jsx(ThoughtCloud,{height:cloudH,messages,pick,onResize,onClose})}):null]})});var import_react69=__toESM(require_react_production(),1);var import_react58=__toESM(require_react_production(),1);init_sessions_db();import{existsSync as existsSync15}from"fs";import{homedir as homedir5}from"os";import{join as join11}from"path";var INLINE=process.env.HERM_IO_INLINE==="1",HOME2=()=>process.env.HERMES_HOME||join11(homedir5(),".hermes"),entry=()=>{let js=join11(import.meta.dirname,"db.worker.js");return new URL(existsSync15(js)?"./db.worker.js":"./db.worker.ts",import.meta.url)},state={w:null,seq:0,pending:new Map,inline:null},spawn2=()=>{if(state.w)return state.w;let w2=new Worker(entry());return w2.onmessage=(e)=>{let r=e.data;state.pending.get(r.id)?.(r),state.pending.delete(r.id)},w2.onerror=(ev)=>{let err=`io worker: ${ev.message}`;for(let res of state.pending.values())res({id:-1,ok:!1,err});if(state.pending.clear(),state.w===w2)state.w=null;w2.terminate()},state.w=w2},call=(fn,args)=>{if(INLINE)return state.inline??=Promise.resolve().then(() => (init_fns(),exports_fns)).then((m2)=>m2.FNS),state.inline.then((f)=>f[fn](...args));return new Promise((resolve4,reject)=>{let id=++state.seq;state.pending.set(id,(r)=>r.ok?resolve4(r.v):reject(Error(r.err))),spawn2().postMessage({id,home:HOME2(),fn,args})})},io=new Proxy({},{get:(_2,fn)=>(...args)=>call(fn,args)}),warm=()=>{if(!INLINE)call("roots",[0])},close=()=>{state.w?.terminate(),state.w=null;for(let res of state.pending.values())res({id:-1,ok:!1,err:"io: closed"});state.pending.clear()};var TabShell=(props)=>{let theme=useTheme().theme;return $jsxs("box",{flexDirection:"column",flexGrow:props.grow??1,flexBasis:0,minWidth:0,minHeight:0,border:!0,borderColor:props.focus?theme.primary:theme.border,backgroundColor:theme.backgroundPanel,padding:1,children:[$jsxs("box",{height:1,overflow:"hidden",flexDirection:"row",children:[$jsx("box",{flexShrink:0,overflow:"hidden",children:$jsx("text",{fg:theme.primary,wrapMode:"none",children:$jsx("strong",{children:props.title})})}),props.titleRight?$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",justifyContent:"flex-end",children:props.titleRight}):null]}),props.error?$jsx("box",{height:1,children:$jsx("text",{fg:theme.error,children:`\u26A0 ${props.error}`})}):null,$jsx("box",{height:1}),$jsx("box",{flexDirection:"column",flexGrow:1,minWidth:0,minHeight:0,overflow:"hidden",children:props.children})]})};var import_react51=__toESM(require_react_production(),1);var HintBar=import_react51.memo((props)=>{let theme=useTheme().theme,text5=props.pairs?props.pairs.map((p)=>`[${p[0]}] ${p[1]}`).join(" ")+(props.suffix?` \xB7 ${props.suffix}`:""):props.raw??"";return $jsx("box",{height:1,flexShrink:0,paddingX:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:text5})})});var KV=(props)=>{let theme=useTheme().theme;return $jsxs("box",{minHeight:1,flexDirection:"row",children:[$jsx("box",{width:13,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:props.label})}),$jsx("box",{flexGrow:1,minWidth:0,height:props.wrap?void 0:1,overflow:props.wrap?void 0:"hidden",children:$jsx("text",{wrapMode:props.wrap?"word":void 0,fg:props.fg??theme.text,children:props.value})})]})},KVBlock=(props)=>props.rows.map(([k2,v2,fg2])=>v2===void 0?null:$jsx(KV,{label:k2,value:v2,fg:fg2},k2));var import_react52=__toESM(require_react_production(),1);var VBAR_W=1,VBAR={visible:!0},Col=(p)=>{let theme=useTheme().theme,fg2=p.fg??theme.text;return $jsx("box",{width:p.w,flexGrow:p.grow?1:0,flexShrink:p.grow?1:0,minWidth:p.grow?p.min??12:p.w,height:1,overflow:"hidden",onMouseDown:p.onClick,flexDirection:"row",justifyContent:p.right?"flex-end":"flex-start",children:$jsx("text",{children:p.bold?$jsx("span",{fg:fg2,children:$jsx("strong",{children:p.children})}):$jsx("span",{fg:fg2,children:p.children})})})},Hdr=(p)=>$jsx("box",{flexDirection:"row",height:1,paddingRight:VBAR_W,children:p.children}),Marquee=(p)=>{let theme=useTheme().theme,fg2=p.fg??theme.text,text5=p.children,box=import_react52.useRef(null),node=import_react52.useRef(null),animate=exports_preferences.get("animations")!==!1&&p.active,[wraps,setWraps]=import_react52.useState(!1);import_react52.useEffect(()=>{let tn=node.current;if(!tn)return;let w2=box.current?.width??0;if(setWraps(text5.length>w2),!animate){tn.scrollX=0;return}let id,period=text5.length+GAP.length,hold=setTimeout(()=>{id=setInterval(()=>{let cur=box.current?.width??0;if(text5.length<=cur){tn.scrollX=0;return}tn.scrollX=(tn.scrollX+1)%period},p.speed??180)},p.hold??600);return()=>{if(clearTimeout(hold),id)clearInterval(id);if(node.current)node.current.scrollX=0}},[animate,text5,p.speed,p.hold]);let body=wraps?text5+GAP+text5:text5;return $jsx("box",{ref:box,width:p.w,flexGrow:p.grow?1:0,flexShrink:p.grow?1:0,minWidth:p.grow?p.min??12:p.w,height:1,overflow:"hidden",children:$jsx("text",{ref:node,wrapMode:"none",children:p.bold?$jsx("span",{fg:fg2,attributes:p.underline?TextAttributes.UNDERLINE:TextAttributes.NONE,children:$jsx("strong",{children:body})}):$jsx("span",{fg:fg2,attributes:p.underline?TextAttributes.UNDERLINE:TextAttributes.NONE,children:body})})})},GAP=" ";var import_react53=__toESM(require_react_production(),1);var Ticker=(p)=>{let ref=import_react53.useRef(null),animate=exports_preferences.get("animations")!==!1&&p.active,speed=p.speed??180,hold=p.hold??600,endHold=p.endHold??3000;return import_react53.useEffect(()=>{let node=ref.current;if(!node)return;if(!animate){node.scrollX=0;return}let dir=1,tick2,wait,step=()=>{let max=node.maxScrollX;if(max<=0)return;if(node.scrollX=Math.max(0,Math.min(max,node.scrollX+dir)),!(dir>0?node.scrollX>=max:node.scrollX<=0))return;if(tick2)clearInterval(tick2),tick2=void 0;dir=-dir,wait=setTimeout(()=>{tick2=setInterval(step,speed)},endHold)};return wait=setTimeout(()=>{tick2=setInterval(step,speed)},hold),()=>{if(wait)clearTimeout(wait);if(tick2)clearInterval(tick2);if(ref.current)ref.current.scrollX=0}},[animate,speed,hold,endHold]),$jsx("box",{flexGrow:1,flexShrink:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("text",{ref,wrapMode:"none",fg:p.fg,children:p.children})})},RX=/(`[^`]+`)|(\*\*[^*]+\*\*)|(__[^_]+__)|((?<![\w*])\*[^*\s][^*]*\*(?![\w*]))|((?<!\w)_[^_\s][^_]*_(?!\w))/g,inline=(s)=>{let out=[],last=0;for(let m2 of s.matchAll(RX)){let at=m2.index??0;if(at>last)out.push({t:s.slice(last,at)});let hit=m2[0];if(hit.startsWith("`"))out.push({t:hit.slice(1,-1),c:!0});else if(hit.startsWith("**")||hit.startsWith("__"))out.push({t:hit.slice(2,-2),b:!0});else out.push({t:hit.slice(1,-1),i:!0});last=at+hit.length}if(last<s.length)out.push({t:s.slice(last)});return out.map((seg)=>seg.c?seg:{...seg,t:seg.t.replace(/^#{1,6}\s+/,"")})};var import_react54=__toESM(require_react_production(),1);var cycle=(t2)=>t2==="off"?"in":t2==="in"?"ex":"off",FilterChip=import_react54.memo((p)=>{let theme=useTheme().theme,color=p.color??theme.accent,text5=p.textColor??theme.text,bg2=p.state==="in"?color:p.state==="ex"?void 0:theme.backgroundElement,fg2=p.state==="in"?theme.background:p.state==="ex"?p.selected?color:theme.borderSubtle:p.selected?color:text5;return $jsx("box",{id:p.id,height:1,flexShrink:0,marginLeft:p.gap??1,paddingLeft:1,paddingRight:1,backgroundColor:bg2,onMouseDown:p.onMouseDown,children:$jsx("text",{fg:fg2,attributes:p.state==="ex"?TextAttributes.STRIKETHROUGH:TextAttributes.NONE,children:p.label})})});var Confirm=(props)=>{let theme=useTheme().theme,keys=useKeys();return useKeyboard((key3)=>{if(keys.match("dialog.confirm",key3)||keys.match("dialog.accept",key3))return props.onConfirm();if(keys.match("dialog.deny",key3))return props.onCancel()}),$jsxs("box",{flexDirection:"column",width:54,children:[$jsx("box",{height:1,children:$jsx("text",{fg:props.danger?theme.warning:theme.primary,children:$jsx("strong",{children:props.title})})}),$jsx("box",{height:1}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:props.body})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:`[${keys.print("dialog.confirm")}/${keys.print("dialog.accept")}] ${props.yes??"confirm"} [${keys.print("dialog.deny")}] ${props.no??"cancel"}`})})]})};function openConfirm(dialog,opts){return new Promise((resolve4)=>{let done=(v2)=>{resolve4(v2),dialog.clear()};dialog.replace($jsx(Confirm,{...opts,onConfirm:()=>done(!0),onCancel:()=>done(!1)}),()=>resolve4(!1))})}var SaveDiscard=(props)=>{let theme=useTheme().theme;return useKeyboard((key3)=>{if(key3.name==="s")return props.onPick("save");if(key3.name==="d")return props.onPick("discard");if(key3.name==="return")return props.onPick("save")}),$jsxs("box",{flexDirection:"column",width:54,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.warning,children:$jsx("strong",{children:props.title})})}),$jsx("box",{height:1}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:props.body})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"[S/Enter] save [D] discard [Esc] keep editing"})})]})};function openSaveDiscard(dialog,opts){return new Promise((resolve4)=>{let done=(v2)=>{resolve4(v2),dialog.clear()};dialog.replace($jsx(SaveDiscard,{...opts,onPick:done,onCancel:()=>done(null)}),()=>resolve4(null))})}var import_react56=__toESM(require_react_production(),1);var TextPrompt=(props)=>{let theme=useTheme().theme,[value,setValue]=import_react56.useState(props.initial??"");return $jsxs("box",{flexDirection:"column",width:60,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:props.title})})}),$jsx("box",{height:1}),props.label?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:props.label})}):null,$jsxs("box",{height:1,flexDirection:"row",overflow:"hidden",children:[$jsx("box",{flexShrink:0,children:$jsx("text",{fg:theme.accent,children:"\u2503 "})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("input",{value,onInput:setValue,onSubmit:()=>{let v2=value.trim();if(v2)props.onSubmit(v2)},focused:!0,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement})})]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:value.trim()?"Enter confirm \xB7 Esc cancel \xB7 Ctrl+U clear":"Esc cancel"})})]})};function openTextPrompt(dialog,opts){return new Promise((resolve4)=>{dialog.replace($jsx(TextPrompt,{title:opts.title,label:opts.label,initial:opts.initial,onSubmit:(v2)=>{resolve4(v2),dialog.clear()}}),()=>resolve4(null))})}var h12=()=>exports_preferences.get("timeFormat")==="12h",abs=()=>exports_preferences.get("timeStyle")==="absolute",trunc5=(s,max)=>s.length<=max?s:s.slice(0,max-1)+"\u2026",fmt=(n)=>n>=1e6?`${(n/1e6).toFixed(2)}M`:n>=1000?`${(n/1000).toFixed(1)}k`:String(n),cost2=(c)=>c==null?"\u2014":`$${c.toFixed(2)}`,clock=(d2)=>d2.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",hour12:h12()}),stamp=(ts)=>{let d2=new Date(ts*1000);return d2.toDateString()===new Date().toDateString()?clock(d2):d2.toLocaleDateString(void 0,{month:"short",day:"numeric"})},rel=(ts)=>{let s=Math.floor(Date.now()/1000-ts);if(s<60)return"just now";if(s<3600)return`${Math.floor(s/60)}m ago`;if(s<86400)return`${Math.floor(s/3600)}h ago`;return`${Math.floor(s/86400)}d ago`},ago=(ts)=>abs()?stamp(ts):rel(ts),until=(ts)=>{if(abs())return ts<=Date.now()/1000?"due":stamp(ts);let s=Math.floor(ts-Date.now()/1000);if(s<=0)return"due";if(s<60)return`in ${s}s`;if(s<3600)return`in ${Math.floor(s/60)}m`;if(s<86400)return`in ${Math.floor(s/3600)}h`;return`in ${Math.floor(s/86400)}d`},when=(ts)=>{let d2=new Date(ts*1000);return`${d2.toLocaleDateString()} ${clock(d2)}`},span=(start,end)=>{let s=Math.round(end-start);if(s<0)return"\u2014";if(s>=3600)return`${Math.floor(s/3600)}h ${Math.floor(s%3600/60)}m`;if(s>=60)return`${Math.floor(s/60)}m`;return`${s}s`},dur2=(s)=>s>=3600?`${Math.floor(s/3600)}h${Math.floor(s%3600/60)}m`:s>=60?`${Math.floor(s/60)}m${Math.floor(s%60)}s`:`${Math.floor(s)}s`;var import_react57=__toESM(require_react_production(),1);import{watch as watch2,existsSync as existsSync17,statSync as statSync6}from"fs";import{dirname as dirname7,basename as basename8}from"path";import{readdir,stat}from"fs/promises";import{openSync,readSync,closeSync,readdirSync as readdirSync8,readFileSync as readFileSync10,existsSync as existsSync16}from"fs";import{homedir as homedir6}from"os";init_sessions_db();var HOME3=process.env.HOME||homedir6(),home2={path:process.env.HERMES_HOME||`${HOME3}/.hermes`},setHome2=(h2)=>{home2.path=h2},hermesPath=(relative4)=>`${home2.path}/${relative4}`,managedSystem=async()=>{let env2=(process.env.HERMES_MANAGED??"").trim();if(env2){let norm=env2.toLowerCase();if(norm==="1"||norm==="true"||norm==="yes"||norm==="on")return"NixOS";return{homebrew:"Homebrew",nix:"NixOS",nixos:"NixOS"}[norm]??env2}return await Bun.file(hermesPath(".managed")).exists()?"NixOS":null},makeSource=(relative4,label)=>({file:hermesPath(relative4),relative:relative4,label:label??relative4.split("/").pop()??relative4});function readSkillFrontmatter(source){try{let fd=openSync(source.file,"r"),buf=Buffer.alloc(2048),n=readSync(fd,buf,0,2048,0);closeSync(fd);let head=buf.toString("utf-8",0,n);if(!head.startsWith("---"))return{description:"",tags:[]};let end=head.indexOf(`
|
|
4107
4107
|
---`,3);if(end<0)return{description:"",tags:[]};let fm=$parse(head.slice(3,end)),tags=Array.isArray(fm.tags)?fm.tags.map(String):[];return{description:String(fm.description??""),tags}}catch{return{description:"",tags:[]}}}async function readSkillUsage(){try{let f=Bun.file(hermesPath("skills/.usage.json"));if(!await f.exists())return{};let raw=await f.json(),out={};for(let[k2,v2]of Object.entries(raw??{}))out[k2]={use_count:Number(v2.use_count??0),view_count:Number(v2.view_count??0),patch_count:Number(v2.patch_count??0),last_used_at:v2.last_used_at??null,last_viewed_at:v2.last_viewed_at??null,last_patched_at:v2.last_patched_at??null,created_at:v2.created_at??null,archived_at:v2.archived_at??null,state:v2.state??"active",pinned:Boolean(v2.pinned)};return out}catch{return{}}}async function readCuratorState(){try{let f=Bun.file(hermesPath("skills/.curator_state"));if(!await f.exists())return null;let raw=await f.json();return{last_run_at:raw.last_run_at??null,last_run_duration_seconds:raw.last_run_duration_seconds??null,last_run_summary:raw.last_run_summary??null,paused:Boolean(raw.paused),run_count:Number(raw.run_count??0)}}catch{return null}}async function readLatestCuratorReport(){try{let base2=hermesPath("logs/curator"),entries2=readdirSync8(base2,{withFileTypes:!0}).filter((e)=>e.isDirectory());if(entries2.length===0)return null;entries2.sort((a,b2)=>b2.name.localeCompare(a.name));let runId=entries2[0].name,rel2=`logs/curator/${runId}/REPORT.md`,source=makeSource(rel2),body=await Bun.file(source.file).text();return{source,content:body.trim(),runId}}catch{return null}}function listCuratorRuns(){try{let base2=hermesPath("logs/curator");return readdirSync8(base2,{withFileTypes:!0}).filter((e)=>e.isDirectory()).sort((a,b2)=>b2.name.localeCompare(a.name)).flatMap((e)=>{try{let fd=openSync(`${base2}/${e.name}/run.json`,"r"),buf=Buffer.alloc(8192),n=readSync(fd,buf);closeSync(fd);let j2=JSON.parse(buf.toString("utf8",0,n)),c=j2.counts??{};return[{id:e.name,at:Date.parse(j2.started_at??"")/1000||0,archived:c.archived_this_run??0,consolidated:c.consolidated_this_run??0,added:c.added_this_run??0,before:c.before??0,after:c.after??0}]}catch{return[]}})}catch{return[]}}async function readCuratorReport(id){try{return(await Bun.file(hermesPath(`logs/curator/${id}/REPORT.md`)).text()).trim()}catch{return""}}function indexCuratorLineage(){let out=new Map,push2=(name,ev)=>{let a=out.get(name)??[];a.push(ev),out.set(name,a)};try{let base2=hermesPath("logs/curator");for(let e of readdirSync8(base2,{withFileTypes:!0})){if(!e.isDirectory())continue;try{let j2=JSON.parse(readFileSync10(`${base2}/${e.name}/run.json`,"utf8")),at=Date.parse(j2.started_at??"")/1000||0,run=e.name,into=new Map;for(let c of j2.consolidated??[])push2(c.name,{kind:"merged",run,at,into:c.into,reason:c.reason}),into.set(c.into,[...into.get(c.into)??[],c.name]);for(let[tgt,srcs]of into)push2(tgt,{kind:"absorbed",run,at,sources:srcs});for(let t2 of j2.state_transitions??[])push2(t2.name,{kind:"transition",run,at,from:t2.from,to:t2.to});for(let p of j2.pruned??[])push2(p.name,{kind:"pruned",run,at,reason:p.reason});for(let n of j2.added??[])push2(n,{kind:"added",run,at})}catch{}}}catch{}for(let a of out.values())a.sort((x2,y2)=>y2.at-x2.at);return out}function readChangelog(){try{let source=makeSource("herm/changelog.md"),fd=openSync(source.file,"r"),buf=Buffer.alloc(4096),n=readSync(fd,buf);closeSync(fd);let body=buf.toString("utf8",0,n).trim(),line=body.split(`
|
|
4108
4108
|
`).find((l)=>/^[-*\u00B7]/.test(l.trim()));return{source,headline:line?.replace(/^[-*\u00B7]\s*/,"").trim()??"",body}}catch{return null}}async function readConfig(){try{let text5=await Bun.file(hermesPath("config.yaml")).text(),raw=$parse(text5);return{source:makeSource("config.yaml","config.yaml"),model:{default:raw?.model?.default??"unknown",provider:raw?.model?.provider??"auto",base_url:raw?.model?.base_url??"",context_length:raw?.model?.context_length},agent:{max_turns:raw?.agent?.max_turns??60,reasoning_effort:raw?.agent?.reasoning_effort??"medium"},compression:{enabled:raw?.compression?.enabled??!0,threshold:raw?.compression?.threshold??0.5,target_ratio:raw?.compression?.target_ratio??0.2,protect_last_n:raw?.compression?.protect_last_n??20,summary_model:raw?.compression?.summary_model??""},memory:{memory_enabled:raw?.memory?.memory_enabled??!0,user_profile_enabled:raw?.memory?.user_profile_enabled??!0,memory_char_limit:raw?.memory?.memory_char_limit??2200,user_char_limit:raw?.memory?.user_char_limit??1375,provider:raw?.memory?.provider??"",nudge_interval:raw?.memory?.nudge_interval??10,flush_min_turns:raw?.memory?.flush_min_turns??6},display:{personality:raw?.display?.personality??"default",skin:raw?.display?.skin??"default",show_cost:raw?.display?.show_cost??!1},curator:{enabled:raw?.curator?.enabled??!0,interval_hours:raw?.curator?.interval_hours??168,stale_after_days:raw?.curator?.stale_after_days??30,archive_after_days:raw?.curator?.archive_after_days??90},approvals:{destructive_slash_confirm:raw?.approvals?.destructive_slash_confirm??!0},gateway:{platforms:{api_server:raw?.gateway?.platforms?.api_server??void 0}}}}catch{return null}}async function readMemoryFile(filename,charLimit){try{let relative4=`memories/${filename}`,content=await Bun.file(hermesPath(relative4)).text(),entryCount=content.split("\xA7").filter((s)=>s.trim()).length;return{source:makeSource(relative4,filename),content,charCount:content.length,charLimit,usagePercent:charLimit>0?Math.round(content.length/charLimit*100):0,entryCount}}catch{return null}}async function readLiveSessions(){try{let file=Bun.file(hermesPath("sessions/sessions.json"));if(!await file.exists())return{};let text5=await file.text();return JSON.parse(text5)}catch{return{}}}var MEMORY_CFG_FILES={mem0:["mem0.json"],honcho:["honcho.json"],hindsight:["hindsight/config.json"],supermemory:["supermemory.json"],holographic:["holographic.db"]};function discoverMemoryProviders(){let names=new Set(["builtin"]);try{for(let e of readdirSync8(hermesPath("hermes-agent/plugins/memory"),{withFileTypes:!0}))if(e.isDirectory()&&!e.name.startsWith("_"))names.add(e.name)}catch{}return[...names]}async function readMemoryProviders(activeProvider){let out=[];for(let name of discoverMemoryProviders()){if(name==="builtin"){out.push({name,active:!0,config:{}});continue}let cfg2={};for(let f of MEMORY_CFG_FILES[name]??[])try{let file=Bun.file(hermesPath(f));if(f.endsWith(".json")){let raw=await file.json();for(let[k2,v2]of Object.entries(raw))if(typeof v2==="string"||typeof v2==="number"||typeof v2==="boolean"){let lower=k2.toLowerCase();if(lower.includes("key")||lower.includes("token")||lower.includes("secret"))cfg2[k2]=typeof v2==="string"?`${v2.slice(0,4)}...`:v2;else cfg2[k2]=v2}}else{let st=await file.stat();if(st)cfg2.db_size=`${Math.round(st.size/1024)}KB`}}catch{}out.push({name,active:name===activeProvider,config:cfg2})}return out}async function readSoul(){try{let text5=await Bun.file(hermesPath("SOUL.md")).text();return{source:makeSource("SOUL.md"),charCount:text5.length,tokenEstimate:count2(text5),content:text5}}catch{return null}}async function readToolsFromLatestSession(){try{let dir=hermesPath("sessions");if(!existsSync16(dir))return null;let glob=new Bun.Glob("session_*.json"),latestPath="",latestTime=0;for await(let path4 of glob.scan({cwd:dir})){let stat2=await Bun.file(hermesPath(`sessions/${path4}`)).stat();if(stat2&&stat2.mtimeMs>latestTime)latestTime=stat2.mtimeMs,latestPath=path4}if(!latestPath)return null;let relative4=`sessions/${latestPath}`,tools=((await Bun.file(hermesPath(relative4)).json()).tools||[]).map((t2)=>({name:t2?.function?.name??"unknown",descriptionLength:(t2?.function?.description??"").length,paramsLength:JSON.stringify(t2?.function?.parameters??{}).length}));return{source:makeSource(relative4,latestPath),tools}}catch{return null}}async function readCronOutput(jobId,tailLines=40){let dir=hermesPath(`cron/output/${jobId}`),entries2;try{entries2=await readdir(dir)}catch{return null}let md=entries2.filter((f)=>f.endsWith(".md")).sort().reverse();if(md.length===0)return null;let path4=`${dir}/${md[0]}`,full=await Bun.file(path4).text(),lines3=full.trimEnd().split(`
|
|
4109
4109
|
`),text5=lines3.length>tailLines?`\u2026(${lines3.length-tailLines} earlier lines)
|
|
@@ -4113,7 +4113,7 @@ tell application "System Events" to get value of property list item "CFBundleNam
|
|
|
4113
4113
|
`),found=!1,updated=lines3.map((line)=>{let eq2=line.trim().indexOf("=");if(eq2>=1&&envKey(line.trim().slice(0,eq2))===key3)return found=!0,`${key3}=${value}`;return line});if(!found)updated.push(`${key3}=${value}`);await Bun.write(envPath(),updated.join(`
|
|
4114
4114
|
`))}async function removeEnvVar(key3){let text5="";try{text5=await Bun.file(envPath()).text()}catch{return}let lines3=text5.split(`
|
|
4115
4115
|
`).filter((line)=>{let eq2=line.trim().indexOf("=");return eq2<1||envKey(line.trim().slice(0,eq2))!==key3});await Bun.write(envPath(),lines3.join(`
|
|
4116
|
-
`))}var ENV_CATALOG=[{category:"LLM Providers",keys:["ANTHROPIC_API_KEY","ARCEEAI_API_KEY","DEEPSEEK_API_KEY","FIREWORKS_API_KEY","GEMINI_API_KEY","GLM_API_KEY","GMI_API_KEY","GOOGLE_API_KEY","GROQ_API_KEY","KIMI_API_KEY","LM_API_KEY","MINIMAX_API_KEY","MISTRAL_API_KEY","NOUS_API_KEY","NVIDIA_API_KEY","OPENAI_API_KEY","OPENROUTER_API_KEY","STEPFUN_API_KEY","TOGETHER_API_KEY","VERTEX_CREDENTIALS_PATH","XAI_API_KEY","ZAI_API_KEY","Z_AI_API_KEY"]},{category:"Tool API Keys",keys:["AGENT_BROWSER_ENGINE","BRAVE_SEARCH_API_KEY","BROWSERBASE_API_KEY","BROWSERBASE_PROJECT_ID","BROWSER_USE_API_KEY","CAMOFOX_API_KEY","CAMOFOX_URL","ELEVENLABS_API_KEY","EXA_API_KEY","FAL_KEY","FIRECRAWL_API_KEY","FIRECRAWL_API_URL","FIRECRAWL_BROWSER_TTL","KREA_API_KEY","OPENVIKING_API_KEY","OPENVIKING_ENDPOINT","SEARXNG_URL","TAVILY_API_KEY","TOOL_GATEWAY_DOMAIN","TOOL_GATEWAY_SCHEME","TOOL_GATEWAY_USER_TOKEN"]},{category:"Messaging",keys:["DISCORD_ALLOWED_USERS","DISCORD_BOT_TOKEN","DISCORD_REPLY_TO_MODE","SLACK_ALLOWED_USERS","SLACK_APP_TOKEN","SLACK_BOT_TOKEN","TELEGRAM_ALLOWED_USERS","TELEGRAM_BOT_TOKEN","TELEGRAM_PROXY"]},{category:"Agent",keys:["API_SERVER_KEY","BRV_API_KEY","HERMES_LANGFUSE_BASE_URL","HERMES_LANGFUSE_PUBLIC_KEY","HERMES_LANGFUSE_SECRET_KEY","HINDSIGHT_API_KEY","HINDSIGHT_API_URL","MEM0_API_KEY","RETAINDB_API_KEY","RETAINDB_BASE_URL","SUPERMEMORY_API_KEY"]}];var SLICES={config:{read:()=>readConfig(),watch:()=>[hermesPath("config.yaml")]},memory:{read:(d2)=>readMemoryFile("MEMORY.md",d2.config?.memory?.memory_char_limit??2200),deps:["config"],watch:()=>[hermesPath("memories/MEMORY.md")]},userProfile:{read:(d2)=>readMemoryFile("USER.md",d2.config?.memory?.user_char_limit??1375),deps:["config"],watch:()=>[hermesPath("memories/USER.md")]},memoryProviders:{read:(d2)=>readMemoryProviders(d2.config?.memory?.provider??""),deps:["config"]},memoryActivity:{read:()=>io.memoryActivity()},env:{read:()=>readEnvFile(),watch:()=>[hermesPath(".env")]},soul:{read:()=>readSoul(),watch:()=>[hermesPath("SOUL.md")]},liveSessions:{read:()=>readLiveSessions(),watch:()=>[hermesPath("sessions/sessions.json")]},recentSessions:{read:()=>io.roots(30)},systemPrompt:{read:()=>io.systemPrompt().then((r)=>r&&{source:makeSource("state.db"),sessionId:r.id,text:r.text,totalChars:r.text.length,tokenEstimate:count2(r.text)}).catch(()=>null)},toolsInfo:{read:()=>readToolsFromLatestSession(),watch:()=>[hermesPath("sessions")]},skillUsage:{read:()=>readSkillUsage(),watch:()=>[hermesPath("skills/.usage.json")]},curatorState:{read:()=>readCuratorState(),watch:()=>[hermesPath("skills/.curator_state")]}},DEPENDENTS=(()=>{let m2=new Map;for(let[k2,s]of Object.entries(SLICES))for(let d2 of s.deps??[]){let arr=m2.get(d2)??[];arr.push(k2),m2.set(d2,arr)}return m2})(),DEBOUNCE_MS=50,watchfs=(path4,cb)=>watch2(path4,{persistent:!1},(_ev,file)=>cb(file));class HomeStore{watcher;data={};subs=new Map;inflight=new Map;watchers=new Map;debounce=new Map;rev=new Map;gen=0;constructor(watcher=watchfs){this.watcher=watcher}get(k2){return this.data[k2]}subscribe(k2,cb){let set2=this.subs.get(k2);if(!set2)this.subs.set(k2,set2=new Set);return set2.add(cb),()=>set2.delete(cb)}ensure(k2){if(k2 in this.data)return Promise.resolve(this.data[k2]);let hit=this.inflight.get(k2);if(hit)return hit;let slice=SLICES[k2],gen=this.gen,rev2=this.rev.get(k2)??0,p=(async()=>{let deps={};for(let d2 of slice.deps??[])deps[d2]=await this.ensure(d2);let v2=await slice.read(deps);if(gen!==this.gen||rev2!==(this.rev.get(k2)??0))return v2;return this.data[k2]=v2,this.startWatch(k2,slice.watch),this.notify(k2),v2})();this.inflight.set(k2,p);let clear=()=>{if(this.inflight.get(k2)===p)this.inflight.delete(k2)};return p.then(clear,clear),p}invalidate(k2){if(!(k2 in this.data)&&!this.inflight.has(k2))return;if(this.rev.set(k2,(this.rev.get(k2)??0)+1),delete this.data[k2],this.inflight.delete(k2),this.subs.get(k2)?.size)this.ensure(k2);for(let dep of DEPENDENTS.get(k2)??[])this.invalidate(dep)}update(k2,fn){if(!(k2 in this.data))return;this.data[k2]=fn(this.data[k2]),this.notify(k2);for(let dep of DEPENDENTS.get(k2)??[])this.invalidate(dep)}close(){this.gen++;for(let ws of this.watchers.values())for(let w2 of ws)w2.close();for(let t2 of this.debounce.values())clearTimeout(t2);this.watchers.clear(),this.debounce.clear(),this.subs.clear(),this.inflight.clear(),this.rev.clear(),this.data={}}reset(){this.gen++;for(let ws of this.watchers.values())for(let w2 of ws)w2.close();for(let t2 of this.debounce.values())clearTimeout(t2);this.watchers.clear(),this.debounce.clear(),this.inflight.clear(),this.rev.clear(),this.data={};for(let k2 of this.subs.keys())if(this.subs.get(k2)?.size)this.ensure(k2)}notify(k2){let set2=this.subs.get(k2);if(set2)for(let cb of set2)cb()}startWatch(k2,watchFn){if(!watchFn||this.watchers.has(k2))return;let paths=watchFn(),ws=[],fire=()=>{let prev=this.debounce.get(k2);if(prev)clearTimeout(prev);this.debounce.set(k2,setTimeout(()=>this.invalidate(k2),DEBOUNCE_MS))};for(let p of paths){let dir=dirname7(p),name=basename8(p);try{if(existsSync17(p)&&statSync6(p).isDirectory())dir=p,name=null}catch{}if(!existsSync17(dir))continue;try{ws.push(this.watcher(dir,(file)=>{if(name===null||file?.toString()===name)fire()}))}catch{}}this.watchers.set(k2,ws)}}var home3=new HomeStore;function useHome(k2){let v2=import_react57.useSyncExternalStore((cb)=>home3.subscribe(k2,cb),()=>home3.get(k2));return import_react57.useEffect(()=>{home3.ensure(k2)},[k2]),v2}var cmp=(s)=>{let k2=(r)=>s==="started"?r.started_at:r.detail?.last_active??r.started_at;return(a,b2)=>k2(b2)-k2(a)},WORD={api:"API",cli:"CLI",tui:"TUI",whatsapp:"WhatsApp"},badge=(s)=>s.split(/[_-]+/).filter(Boolean).map((w2)=>WORD[w2.toLowerCase()]??(w2[0]?.toUpperCase()??"")+w2.slice(1)).join(" ")||"\u2014",label=(r)=>r.title.trim()||(r.live?"-":"Untitled"),src=(r)=>r.detail?.sessionSource||r.source||"",fallback=(msg)=>{let s=msg.trim();if(/\b(?:timeout|timed out)\b/i.test(s))return!1;return/^(method not found|unknown method(?::|\b)|gateway not running\b|gateway exited(?:\s*\(|$))/i.test(s)},HOME4="conversations",HBAR={visible:!1},ROW={flexDirection:"row"},sid=(s)=>`source:${s}`,chip=(id)=>`sessions-source-${id.replace(/[^a-z0-9_-]/gi,"_")}`,tick2=(r)=>r.detail?.last_active??r.started_at,FilterRow=import_react58.memo((p)=>{let theme=useTheme().theme,ref=import_react58.useRef(null),renderer=useRenderer();return import_react58.useEffect(()=>{let move=()=>{let node=ref.current,idx=p.views.findIndex((v2)=>v2.id===p.view);if(!node||idx<0)return;let left=p.views.slice(0,idx).reduce((n,v2,i)=>n+(i===0?0:1)+`${v2.label} ${v2.count}`.length+2,0),w2=`${p.views[idx].label} ${p.views[idx].count}`.length+2,port2=Math.max(1,node.viewport.width-4),pos=node.scrollLeft;node.scrollLeft=Math.max(0,left<pos?left:left+w2>pos+port2?left+w2-port2:pos)};move();let frames=0,frame=async()=>{if(move(),++frames>=2)renderer.removeFrameCallback(frame)};return renderer.setFrameCallback(frame),()=>renderer.removeFrameCallback(frame)},[p.view,p.views,renderer]),$jsx("scrollbox",{ref,scrollX:!0,height:1,paddingLeft:2,horizontalScrollbarOptions:HBAR,contentOptions:ROW,children:p.views.map((v2,i)=>$jsx(FilterChip,{id:chip(v2.id),label:`${v2.label} ${v2.count}`,state:p.view===v2.id?"in":"off",gap:i===0?0:1,color:theme.primary,textColor:theme.primary,onMouseDown:()=>p.setView(v2.id)},v2.id))})}),line=(s)=>(s??"").replace(/\s+/g," ").trim(),fold=(msgs)=>{let turns=[],tools=0;for(let m2 of msgs){if(m2.role==="tool"){tools++;continue}if(m2.role!=="user"&&m2.role!=="assistant")continue;let text5=line(m2.content);if(!text5)continue;turns.push({role:m2.role,text:text5})}return{turns,tools}},PeekRow=import_react58.memo((props)=>{let theme=useTheme().theme,[hot,setHot]=import_react58.useState(!1),left=props.row.role==="user",color=left?theme.primary:theme.accent,fg2=left?theme.text:theme.markdownText,bar=(side)=>$jsx("box",{width:2,flexShrink:0,height:1,border:[side],borderColor:color,customBorderChars:SIDE_PIPE});return $jsxs("box",{height:1,flexDirection:"row",backgroundColor:hot?theme.backgroundElement:void 0,onMouseOver:()=>setHot(!0),onMouseOut:()=>setHot(!1),children:[left?bar("left"):null,$jsx(Ticker,{active:hot,speed:35,hold:150,fg:fg2,children:inline(props.row.text).map((s,i)=>s.c?$jsx("span",{fg:theme.warning,children:s.t},i):s.b?$jsx("span",{fg:fg2,children:$jsx("strong",{children:s.t})},i):s.i?$jsx("span",{fg:fg2,children:$jsx("u",{children:s.t})},i):$jsx("span",{fg:fg2,children:s.t},i))}),left?null:bar("right")]})}),Peek=import_react58.memo((props)=>{let theme=useTheme().theme,[data2,setData]=import_react58.useState(null),[err,setErr]=import_react58.useState(""),sb=import_react58.useRef(null),gen=import_react58.useRef(0);if(import_react58.useEffect(()=>{let current=++gen.current;return setData(null),setErr(""),Promise.resolve(props.peek(props.sid)).then((m2)=>{if(gen.current===current)setData(fold(m2))}).catch((e)=>{if(gen.current===current)setErr(e instanceof Error?e.message:String(e))}),()=>{gen.current++}},[props.sid,props.peek]),import_react58.useEffect(()=>{if(data2&&sb.current)sb.current.scrollTop=sb.current.scrollHeight},[data2]),err)return $jsx("box",{height:1,children:$jsx("text",{fg:theme.error,children:err})});if(data2===null)return null;if(data2.turns.length===0&&data2.tools===0)return $jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"(no local transcript)"})});let gap=props.total>4;return $jsxs("box",{flexDirection:"column",flexGrow:1,minHeight:5,border:!0,borderStyle:"single",borderColor:theme.border,title:` Transcript${gap?" \xB7 first 2 / last 2":""} `,titleAlignment:"left",children:[$jsx("scrollbox",{ref:sb,scrollY:!0,flexGrow:1,minHeight:3,children:$jsx("box",{flexDirection:"column",width:"100%",children:data2.turns.map((r,i)=>$jsxs(import_react58.Fragment,{children:[$jsx(PeekRow,{row:r}),gap&&i===1?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:" \u2026"})}):null]},i))})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:`${data2.turns.length} turn${data2.turns.length===1?"":"s"} \xB7 ${data2.tools} tool call${data2.tools===1?"":"s"}`})})]})}),Detail=import_react58.memo((props)=>{let theme=useTheme().theme,r=props.row,d2=r.detail,lastActive=d2?.last_active??d2?.ended_at??null,subs2=d2?.subagent_count??0,[info,setInfo]=import_react58.useState({}),[lineageErr,setLineageErr]=import_react58.useState(""),lineageGen=import_react58.useRef(0);import_react58.useEffect(()=>{let current=++lineageGen.current;return setInfo({}),setLineageErr(""),Promise.resolve(props.lineage(r.id)).then((next2)=>{if(lineageGen.current===current)setInfo(next2)}).catch((e)=>{if(lineageGen.current===current)setLineageErr(e instanceof Error?e.message:String(e))}),()=>{lineageGen.current++}},[r.id,props.lineage]);let hasLineage=info.continuesFrom||info.compressedTo||subs2>0,go=(sid2)=>()=>props.onSwitch?.(sid2);return $jsx(TabShell,{title:"Session Detail",grow:2,children:$jsxs("box",{flexDirection:"column",width:"100%",flexGrow:1,overflow:"hidden",children:[$jsxs("box",{flexDirection:"column",flexShrink:0,children:[$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:$jsx("span",{fg:theme.accent,children:$jsx("strong",{children:label(r)})})})}),$jsx("box",{height:1}),$jsx(KVBlock,{rows:[["ID",r.id],["Source",badge(src(r))],["Model",d2?.model??"\u2014"],["Started",when(r.started_at)],["Last active",lastActive?`${when(lastActive)} (${ago(lastActive)})`:"\u2014"],["Duration",lastActive?span(r.started_at,lastActive):"\u2014"],["Ended",d2?.ended_at?`${when(d2.ended_at)} \xB7 ${d2.end_reason??"\u2014"}`:void 0]]}),$jsx("box",{height:1}),$jsx(KVBlock,{rows:[["Messages",String(r.message_count)],["Tool calls",d2?String(d2.tool_call_count):void 0],["Input",d2?`${fmt(d2.input_tokens)} tok`:void 0],["Output",d2?`${fmt(d2.output_tokens)} tok`:void 0],["Cache",d2?`${fmt(d2.cache_read_tokens)} r / ${fmt(d2.cache_write_tokens)} w`:void 0],["Reasoning",d2?`${fmt(d2.reasoning_tokens)} tok`:void 0],["Cost",d2?cost2(d2.estimated_cost_usd):void 0,theme.success]]}),hasLineage?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{minHeight:1,children:$jsx("text",{fg:theme.textMuted,children:"Lineage"})}),info.continuesFrom?$jsx("box",{height:1,onMouseDown:go(info.continuesFrom.id),children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:" \u2190 continues from "}),$jsx("span",{fg:theme.accent,children:info.continuesFrom.title||info.continuesFrom.id})]})}):null,info.compressedTo?$jsx("box",{height:1,onMouseDown:go(info.compressedTo.id),children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:" \u2192 compressed to "}),$jsx("span",{fg:theme.accent,children:info.compressedTo.title||info.compressedTo.id})]})}):null,subs2>0?$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:" \u2387 spawned "}),$jsx("span",{fg:theme.text,children:String(subs2)}),$jsx("span",{fg:theme.textMuted,children:` subagent${subs2===1?"":"s"}`})]})}):null]}):null,lineageErr?$jsx("box",{height:1,children:$jsx("text",{fg:theme.error,children:lineageErr})}):null,!d2?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"(no local detail \u2014 state.db mismatch)"})})]}):null,$jsx("box",{height:1})]}),$jsx(Peek,{sid:r.id,total:r.message_count,peek:props.peek})]})})}),SearchDetail=import_react58.memo((props)=>{let theme=useTheme().theme,r=props.result,parts2=[],rest=r.snippet;while(rest.length){let start=rest.indexOf(">>>");if(start<0){parts2.push({text:rest,hi:!1});break}if(start>0)parts2.push({text:rest.slice(0,start),hi:!1});let end=rest.indexOf("<<<",start+3);if(end<0){parts2.push({text:rest.slice(start+3),hi:!0});break}parts2.push({text:rest.slice(start+3,end),hi:!0}),rest=rest.slice(end+3)}return $jsx(TabShell,{title:"Search Match",grow:2,children:$jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsxs("box",{flexDirection:"column",width:"100%",children:[$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:$jsx("span",{fg:theme.accent,children:$jsx("strong",{children:r.title??"Untitled"})})})}),$jsx("box",{height:1}),$jsx(KVBlock,{rows:[["Source",badge(r.source)],["Model",r.model??"\u2014"],["Time",when(r.started_at)]]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Snippet"})}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:parts2.map((p,i)=>p.hi?$jsx("span",{fg:theme.accent,children:$jsx("strong",{children:p.text})},i):$jsx("span",{fg:theme.text,children:p.text},i))})})]})})})}),HeaderRow=import_react58.memo((props)=>{let theme=useTheme().theme,fg2=theme.textMuted,on=theme.accent,by=props.sort;return $jsxs(Hdr,{children:[$jsx(Col,{w:2,fg:fg2,children:" "}),$jsx(Col,{grow:!0,fg:fg2,bold:!0,children:"Title"}),$jsx(Col,{w:9,fg:fg2,bold:!0,children:"Source"}),$jsx(Col,{w:8,fg:by==="started"?on:fg2,bold:!0,onClick:()=>props.onSort("started"),children:by==="started"?"Start \u25BE":"Start"}),$jsx(Col,{w:10,fg:by==="active"?on:fg2,bold:!0,right:!0,onClick:()=>props.onSort("active"),children:by==="active"?"Active \u25BE":"Active"}),$jsx(Col,{w:7,fg:fg2,bold:!0,right:!0,children:"Msgs"}),$jsx("box",{width:3})]})}),Item=import_react58.memo((props)=>{let theme=useTheme().theme,{row:r,idx:i}=props,[x2,setX]=import_react58.useState(!1),active2=r.detail?.last_active??r.detail?.ended_at??null,locked=props.locked||props.indent||Boolean(r.live),subs2=!props.indent&&(r.detail?.subagent_count??0)>0,leader=props.indent?"\u2514\u2500":props.selected?"\u25B8 ":" ",muted=props.indent&&!props.selected?theme.textMuted:void 0;return $jsxs("box",{id:props.id,flexDirection:"row",height:1,backgroundColor:props.selected?theme.backgroundElement:void 0,onMouseDown:()=>props.onActivate(i),onMouseMove:()=>props.onHover(i),children:[$jsx(Col,{w:2,fg:props.selected?theme.primary:muted??theme.text,children:leader}),$jsx(Marquee,{grow:!0,active:props.selected,fg:props.selected?theme.accent:muted??theme.text,bold:props.selected,underline:props.selected&&subs2,children:label(r)}),$jsx(Col,{w:9,fg:muted??theme.info,children:badge(src(r))}),$jsx(Col,{w:8,fg:theme.textMuted,children:stamp(r.started_at)}),$jsx(Col,{w:10,fg:theme.textMuted,right:!0,children:active2?ago(active2):"\u2014"}),$jsx(Col,{w:7,fg:theme.textMuted,right:!0,children:subs2?`${r.detail?.subagent_count} subs`:String(r.message_count)}),locked?$jsx("box",{width:3}):$jsx("box",{width:3,onMouseDown:(e)=>{e.stopPropagation(),props.onDelete(i)},onMouseOver:()=>setX(!0),onMouseOut:()=>setX(!1),children:$jsx("text",{children:$jsx("span",{fg:x2?theme.error:theme.textMuted,children:" \u2715"})})})]})}),SearchHeaderRow=import_react58.memo(()=>{let fg2=useTheme().theme.textMuted;return $jsxs(Hdr,{children:[$jsx(Col,{w:2,fg:fg2,children:" "}),$jsx(Col,{grow:!0,fg:fg2,bold:!0,children:"Title"}),$jsx(Col,{w:9,fg:fg2,bold:!0,children:"Source"}),$jsx(Col,{w:10,fg:fg2,bold:!0,children:"When"}),$jsx(Col,{w:20,fg:fg2,bold:!0,children:"Model"})]})}),SearchItem=import_react58.memo((props)=>{let theme=useTheme().theme,{result:r,idx:i}=props;return $jsxs("box",{id:props.id,flexDirection:"row",height:1,backgroundColor:props.selected?theme.backgroundElement:void 0,onMouseDown:()=>props.onActivate(i),onMouseMove:()=>props.onHover(i),children:[$jsx(Col,{w:2,fg:props.selected?theme.primary:theme.text,children:props.selected?"\u25B8 ":" "}),$jsx(Col,{grow:!0,fg:props.selected?theme.accent:theme.text,bold:props.selected,children:r.title??"Untitled"}),$jsx(Col,{w:9,fg:theme.info,children:badge(r.source)}),$jsx(Col,{w:10,fg:theme.textMuted,children:ago(r.started_at)}),$jsx(Col,{w:20,fg:theme.textMuted,children:r.model??"\u2014"})]})}),last={rows:[],kids:new Map},Sessions=import_react58.memo((props)=>{let theme=useTheme().theme,gw=useGateway(),dialog=useDialog(),toast=useToast(),dims=useTerminalDimensions(),cached2=props.io==null,io2=import_react58.useMemo(()=>({list:props.io?.list??io.roots,search:props.io?.search??io.search,subagents:props.io?.subagents??io.children,lineage:props.io?.lineage??io.lineage,peek:props.io?.peek??io.peek,remove:props.io?.remove??exports_sessions_db.remove,rename:props.io?.rename??exports_sessions_db.rename}),[props.io]),[rows2,setRows]=import_react58.useState(cached2?last.rows:[]),[liveRows,setLiveRows]=import_react58.useState([]),[warn,setWarn]=import_react58.useState(""),[searchErr,setSearchErr]=import_react58.useState(""),[pending3,setPending]=import_react58.useState(rows2.length===0),sort=exports_preferences.usePref("sessions")?.sort??"active",setSort=import_react58.useCallback((s)=>exports_preferences.set("sessions",{sort:s}),[]),[view,setView]=import_react58.useState(HOME4),active2=import_react58.useMemo(()=>[...liveRows].sort((a,b2)=>Number(Boolean(b2.live?.current))-Number(Boolean(a.live?.current))||(b2.live?.last_active??b2.started_at)-(a.live?.last_active??a.started_at)),[liveRows]),ids=import_react58.useMemo(()=>new Set(active2.flatMap((r)=>[r.id,r.live?.session_key].filter((x2)=>Boolean(x2)))),[active2]),sorted=import_react58.useMemo(()=>rows2.filter((r)=>!ids.has(r.id)).sort(cmp(sort)),[rows2,ids,sort]),views=import_react58.useMemo(()=>{let stats=sorted.reduce((m2,r)=>{let s=src(r);if(!s)return m2;let prev=m2.get(s);return m2.set(s,{count:(prev?.count??0)+1,last:Math.max(prev?.last??0,tick2(r))}),m2},new Map),conv=sorted.filter((r)=>src(r)!=="cron").length;return[...conv>0?[{id:HOME4,label:"Conversations",count:conv,aggregate:"conversations"}]:[],...[...stats.entries()].sort((a,b2)=>b2[1].last-a[1].last||badge(a[0]).localeCompare(badge(b2[0]))).map(([source,stat2])=>({id:sid(source),label:badge(source),count:stat2.count,source}))]},[sorted]),cur=views.find((v2)=>v2.id===view)??views[0],chosen=cur?.id??view,hist=import_react58.useMemo(()=>{if(!cur)return[];if(cur.aggregate===HOME4)return sorted.filter((r)=>src(r)!=="cron");return sorted.filter((r)=>src(r)===cur.source)},[sorted,cur]),listed=import_react58.useMemo(()=>[...active2,...hist],[active2,hist]);import_react58.useEffect(()=>{if(views.length>0&&!views.some((v2)=>v2.id===view))setView(views[0].id)},[views,view]);let[anchor,setAnchor]=import_react58.useState(null),[open2,setOpen]=import_react58.useState(null),[searching,setSearching]=import_react58.useState(!1),[query,setQuery]=import_react58.useState(""),[results,setResults]=import_react58.useState([]),[searchSel,setSearchSel]=import_react58.useState(0),[kids,setKids]=import_react58.useState(cached2?last.kids:new Map),debounce=import_react58.useRef(null),searchGen=import_react58.useRef(0),vscroll=import_react58.useRef(null),seen=import_react58.useRef(!1),gen=import_react58.useRef(0),anchored=anchor&&listed.find((r)=>r.id===anchor.id),branch3=open2?listed.find((r)=>r.id===open2):void 0,owner=branch3&&(anchor?.indent?kids.get(branch3.id)?.some((c)=>c.id===anchor.id):anchored?.id===branch3.id)?branch3:void 0,showDetailPanel=dims.width>=120,visible2=listed.flatMap((r,i)=>r.id===owner?.id?[{row:r,indent:!1,parentIdx:i},...(kids.get(r.id)??[]).map((c)=>({row:c,indent:!0,parentIdx:i}))]:[{row:r,indent:!1,parentIdx:i}]),sel=anchor?Math.max(0,visible2.findIndex((v2)=>v2.row.id===anchor.id&&v2.indent===anchor.indent)):0,live=import_react58.useRef({rows:listed,visible:visible2,anchor,results,searching,onSwitch:props.onSwitch,onActivateLive:props.onActivateLive,currentId:props.currentId});live.current={rows:listed,visible:visible2,anchor,results,searching,onSwitch:props.onSwitch,onActivateLive:props.onActivateLive,currentId:props.currentId};let setSel=import_react58.useCallback((arg)=>{let cur2=live.current,prev=cur2.visible.findIndex((v3)=>v3.row.id===cur2.anchor?.id&&v3.indent===cur2.anchor.indent),n=typeof arg==="function"?arg(Math.max(0,prev)):arg,v2=cur2.visible[Math.max(0,Math.min(cur2.visible.length-1,n))];if(v2)setAnchor({id:v2.row.id,indent:v2.indent})},[]),LIMIT=2000,keep=(d2)=>d2.message_count>0||d2.lineage_root_id!=null,toRow2=(d2)=>({id:d2.id,title:d2.title??"",preview:d2.lastMessage??"",message_count:d2.message_count,started_at:d2.started_at,source:d2.sessionSource,detail:d2}),toLiveRow=(s,d2,r)=>({id:s.id,title:s.title?.trim()||d2?.title||"",preview:s.preview??"",message_count:s.message_count??d2?.message_count??r?.message_count??0,started_at:s.started_at??d2?.started_at??r?.started_at??s.last_active??0,source:d2?.sessionSource??r?.source??s.source??"",detail:d2,live:s}),pick=(m2,s)=>m2.get(s.id)??m2.get(s.session_key??""),patchTitle=import_react58.useCallback((id,title)=>{if(!id||title===void 0)return;home3.update("recentSessions",(rows3)=>rows3.map((r)=>r.id===id?{...r,title}:r)),setRows((prev)=>prev.map((row3)=>row3.id===id?{...row3,title,detail:row3.detail?{...row3.detail,title}:row3.detail}:row3)),setLiveRows((prev)=>prev.map((row3)=>row3.id===id||row3.live?.session_key===id?{...row3,title,live:row3.live?{...row3.live,title}:row3.live}:row3))},[]);useGatewayEvent((ev)=>{if(ev.type==="session.title")patchTitle(ev.payload.session_id,ev.payload.title)});let load4=import_react58.useCallback(async()=>{let current=++gen.current;setPending(!0);let rpc=gw.request("session.list",{limit:LIMIT}).then((r2)=>({ok:!0,v:r2})).catch((e)=>({ok:!1,e})),active3=gw.request("session.active_list",{current_session_id:props.currentId}).then((r2)=>({ok:!0,v:r2})).catch((e)=>({ok:!1,e})),disk=await Promise.resolve(io2.list(LIMIT)).catch(()=>[]);if(gen.current!==current)return;let local=new Map(disk.map((r2)=>[r2.id,r2])),diskRows=disk.filter(keep).map(toRow2);if(setRows(diskRows),cached2)last.rows=diskRows;let[a,r]=await Promise.all([active3,rpc]);if(gen.current!==current)return;let live2=a.ok?a.v.sessions??[]:[];if(a.ok)setLiveRows(live2.map((s)=>toLiveRow(s,pick(local,s))));let final=diskRows;if(r.ok&&r.v.sessions?.length){let seen2=new Set(diskRows.map((s)=>s.id)),merged=[...diskRows,...r.v.sessions.filter((s)=>(s.message_count??0)>0&&!seen2.has(s.id)).map((s)=>({...s,detail:local.get(s.id)}))];if(final=merged,setRows(merged),cached2)last.rows=merged;let found=new Map(merged.map((s)=>[s.id,s]));if(live2.length)setLiveRows(live2.map((s)=>toLiveRow(s,pick(local,s),pick(found,s))))}let kidsError="";try{let parents=final.filter((row3)=>(row3.detail?.subagent_count??0)>0),children2=[];for(let i=0;i<parents.length;i+=8)if(children2.push(...await Promise.all(parents.slice(i,i+8).map((row3)=>io2.subagents(row3.id)))),gen.current!==current)return;if(gen.current!==current)return;let next2=new Map(parents.map((row3,i)=>[row3.id,children2[i].map(toRow2)]));if(setKids(next2),cached2)last.kids=next2}catch(err){kidsError=err instanceof Error?err.message:String(err)}if(gen.current!==current)return;setPending(!1);let listError=!r.ok?local.size?`gateway session.list failed (${r.e.message}) \u2014 listing state.db directly; rows may not resume`:r.e.message:"";setWarn([listError,kidsError].filter(Boolean).join(" \xB7 "))},[gw,props.currentId,io2,cached2]);import_react58.useEffect(()=>{load4()},[load4]),import_react58.useEffect(()=>()=>{gen.current++},[]),import_react58.useEffect(()=>{let on=active2.length>0,fresh=on&&!seen.current;if(!listed.length){seen.current=on;return}if(!anchor||!visible2.some((v2)=>v2.row.id===anchor.id&&v2.indent===anchor.indent)){setAnchor({id:listed[0].id,indent:!1}),seen.current=on;return}if(fresh&&active2[0]&&hist[0]?.id===anchor.id&&!anchor.indent)setAnchor({id:active2[0].id,indent:!1});seen.current=on},[listed,active2,hist,anchor]),import_react58.useEffect(()=>{let current=++searchGen.current;if(setSearchErr(""),!searching||!query.trim()){setResults([]);return}return setResults([]),setSearchSel(0),debounce.current=setTimeout(()=>{Promise.resolve(io2.search(query,30)).then((r)=>{if(searchGen.current!==current)return;setResults(r),setSearchSel(0),setSearchErr("")}).catch((err)=>{if(searchGen.current===current)setSearchErr(err instanceof Error?err.message:String(err))})},150),()=>{if(debounce.current)clearTimeout(debounce.current)}},[query,searching,io2]);let rowHover=import_react58.useCallback((i)=>{live.current.searching?setSearchSel(i):setSel(i)},[setSel]),rowActivate=import_react58.useCallback((i)=>{let l=live.current;l.searching?setSearchSel(i):setSel(i);let hit=l.searching?l.results[i]:l.visible[i]?.row,id=l.searching?hit?.session_id:hit?.id;if(!id)return;if(!l.searching&&hit?.live){if(l.onActivateLive)return l.onActivateLive(id);return l.onSwitch?.(id)}if(!l.onSwitch)return;if(id===l.currentId)return l.onSwitch(id);let title=hit?.title||"Untitled",n=l.searching?void 0:hit.message_count;openConfirm(dialog,{title:"Load session?",body:`${trunc5(title,60)}${n!=null?` \xB7 ${n} msg${n===1?"":"s"}`:""}
|
|
4116
|
+
`))}var ENV_CATALOG=[{category:"LLM Providers",keys:["ANTHROPIC_API_KEY","ARCEEAI_API_KEY","DEEPSEEK_API_KEY","FIREWORKS_API_KEY","GEMINI_API_KEY","GLM_API_KEY","GMI_API_KEY","GOOGLE_API_KEY","GROQ_API_KEY","KIMI_API_KEY","LM_API_KEY","MINIMAX_API_KEY","MISTRAL_API_KEY","NOUS_API_KEY","NVIDIA_API_KEY","OPENAI_API_KEY","OPENROUTER_API_KEY","STEPFUN_API_KEY","TOGETHER_API_KEY","VERTEX_CREDENTIALS_PATH","XAI_API_KEY","ZAI_API_KEY","Z_AI_API_KEY"]},{category:"Tool API Keys",keys:["AGENT_BROWSER_ENGINE","BRAVE_SEARCH_API_KEY","BROWSERBASE_API_KEY","BROWSERBASE_PROJECT_ID","BROWSER_USE_API_KEY","CAMOFOX_API_KEY","CAMOFOX_URL","ELEVENLABS_API_KEY","EXA_API_KEY","FAL_KEY","FIRECRAWL_API_KEY","FIRECRAWL_API_URL","FIRECRAWL_BROWSER_TTL","KREA_API_KEY","OPENVIKING_API_KEY","OPENVIKING_ENDPOINT","SEARXNG_URL","TAVILY_API_KEY","TOOL_GATEWAY_DOMAIN","TOOL_GATEWAY_SCHEME","TOOL_GATEWAY_USER_TOKEN"]},{category:"Messaging",keys:["DISCORD_ALLOWED_USERS","DISCORD_BOT_TOKEN","DISCORD_REPLY_TO_MODE","SLACK_ALLOWED_USERS","SLACK_APP_TOKEN","SLACK_BOT_TOKEN","TELEGRAM_ALLOWED_USERS","TELEGRAM_BOT_TOKEN","TELEGRAM_PROXY"]},{category:"Agent",keys:["API_SERVER_KEY","BRV_API_KEY","HERMES_LANGFUSE_BASE_URL","HERMES_LANGFUSE_PUBLIC_KEY","HERMES_LANGFUSE_SECRET_KEY","HINDSIGHT_API_KEY","HINDSIGHT_API_URL","MEM0_API_KEY","RETAINDB_API_KEY","RETAINDB_BASE_URL","SUPERMEMORY_API_KEY"]}];var SLICES={config:{read:()=>readConfig(),watch:()=>[hermesPath("config.yaml")]},memory:{read:(d2)=>readMemoryFile("MEMORY.md",d2.config?.memory?.memory_char_limit??2200),deps:["config"],watch:()=>[hermesPath("memories/MEMORY.md")]},userProfile:{read:(d2)=>readMemoryFile("USER.md",d2.config?.memory?.user_char_limit??1375),deps:["config"],watch:()=>[hermesPath("memories/USER.md")]},memoryProviders:{read:(d2)=>readMemoryProviders(d2.config?.memory?.provider??""),deps:["config"]},memoryActivity:{read:()=>io.memoryActivity()},env:{read:()=>readEnvFile(),watch:()=>[hermesPath(".env")]},soul:{read:()=>readSoul(),watch:()=>[hermesPath("SOUL.md")]},liveSessions:{read:()=>readLiveSessions(),watch:()=>[hermesPath("sessions/sessions.json")]},recentSessions:{read:()=>io.roots(30)},systemPrompt:{read:()=>io.systemPrompt().then((r)=>r&&{source:makeSource("state.db"),sessionId:r.id,text:r.text,totalChars:r.text.length,tokenEstimate:count2(r.text)}).catch(()=>null)},toolsInfo:{read:()=>readToolsFromLatestSession(),watch:()=>[hermesPath("sessions")]},skillUsage:{read:()=>readSkillUsage(),watch:()=>[hermesPath("skills/.usage.json")]},curatorState:{read:()=>readCuratorState(),watch:()=>[hermesPath("skills/.curator_state")]}},DEPENDENTS=(()=>{let m2=new Map;for(let[k2,s]of Object.entries(SLICES))for(let d2 of s.deps??[]){let arr=m2.get(d2)??[];arr.push(k2),m2.set(d2,arr)}return m2})(),DEBOUNCE_MS=50,watchfs=(path4,cb)=>watch2(path4,{persistent:!1},(_ev,file)=>cb(file));class HomeStore{watcher;data={};subs=new Map;inflight=new Map;watchers=new Map;debounce=new Map;rev=new Map;gen=0;constructor(watcher=watchfs){this.watcher=watcher}get(k2){return this.data[k2]}subscribe(k2,cb){let set2=this.subs.get(k2);if(!set2)this.subs.set(k2,set2=new Set);return set2.add(cb),()=>set2.delete(cb)}ensure(k2){if(k2 in this.data)return Promise.resolve(this.data[k2]);let hit=this.inflight.get(k2);if(hit)return hit;let slice=SLICES[k2],gen=this.gen,rev2=this.rev.get(k2)??0,p=(async()=>{let deps={};for(let d2 of slice.deps??[])deps[d2]=await this.ensure(d2);let v2=await slice.read(deps);if(gen!==this.gen||rev2!==(this.rev.get(k2)??0))return v2;return this.data[k2]=v2,this.startWatch(k2,slice.watch),this.notify(k2),v2})();this.inflight.set(k2,p);let clear=()=>{if(this.inflight.get(k2)===p)this.inflight.delete(k2)};return p.then(clear,clear),p}invalidate(k2){if(!(k2 in this.data)&&!this.inflight.has(k2))return;if(this.rev.set(k2,(this.rev.get(k2)??0)+1),delete this.data[k2],this.inflight.delete(k2),this.subs.get(k2)?.size)this.ensure(k2);for(let dep of DEPENDENTS.get(k2)??[])this.invalidate(dep)}update(k2,fn){if(!(k2 in this.data))return;this.data[k2]=fn(this.data[k2]),this.notify(k2);for(let dep of DEPENDENTS.get(k2)??[])this.invalidate(dep)}close(){this.gen++;for(let ws of this.watchers.values())for(let w2 of ws)w2.close();for(let t2 of this.debounce.values())clearTimeout(t2);this.watchers.clear(),this.debounce.clear(),this.subs.clear(),this.inflight.clear(),this.rev.clear(),this.data={}}reset(){this.gen++;for(let ws of this.watchers.values())for(let w2 of ws)w2.close();for(let t2 of this.debounce.values())clearTimeout(t2);this.watchers.clear(),this.debounce.clear(),this.inflight.clear(),this.rev.clear(),this.data={};for(let k2 of this.subs.keys())if(this.subs.get(k2)?.size)this.ensure(k2)}notify(k2){let set2=this.subs.get(k2);if(set2)for(let cb of set2)cb()}startWatch(k2,watchFn){if(!watchFn||this.watchers.has(k2))return;let paths=watchFn(),ws=[],fire=()=>{let prev=this.debounce.get(k2);if(prev)clearTimeout(prev);this.debounce.set(k2,setTimeout(()=>this.invalidate(k2),DEBOUNCE_MS))};for(let p of paths){let dir=dirname7(p),name=basename8(p);try{if(existsSync17(p)&&statSync6(p).isDirectory())dir=p,name=null}catch{}if(!existsSync17(dir))continue;try{ws.push(this.watcher(dir,(file)=>{if(name===null||file?.toString()===name)fire()}))}catch{}}this.watchers.set(k2,ws)}}var home3=new HomeStore;function useHome(k2){let v2=import_react57.useSyncExternalStore((cb)=>home3.subscribe(k2,cb),()=>home3.get(k2));return import_react57.useEffect(()=>{home3.ensure(k2)},[k2]),v2}var cmp=(s)=>{let k2=(r)=>s==="started"?r.started_at:r.detail?.last_active??r.started_at;return(a,b2)=>k2(b2)-k2(a)},WORD={api:"API",cli:"CLI",tui:"TUI",whatsapp:"WhatsApp"},badge=(s)=>s.split(/[_-]+/).filter(Boolean).map((w2)=>WORD[w2.toLowerCase()]??(w2[0]?.toUpperCase()??"")+w2.slice(1)).join(" ")||"\u2014",label=(r)=>r.title.trim()||(r.live?"-":"Untitled"),src=(r)=>r.detail?.sessionSource||r.source||"",fallback=(msg)=>{let s=msg.trim();if(/\b(?:timeout|timed out)\b/i.test(s))return!1;return/^(method not found|unknown method(?::|\b)|gateway not running\b|gateway exited(?:\s*\(|$))/i.test(s)},HOME4="conversations",HBAR={visible:!1},ROW={flexDirection:"row"},sid=(s)=>`source:${s}`,chip=(id)=>`sessions-source-${id.replace(/[^a-z0-9_-]/gi,"_")}`,tick2=(r)=>r.detail?.last_active??r.started_at,FilterRow=import_react58.memo((p)=>{let theme=useTheme().theme,ref=import_react58.useRef(null),renderer=useRenderer();return import_react58.useEffect(()=>{let move=()=>{let node=ref.current,idx=p.views.findIndex((v2)=>v2.id===p.view);if(!node||idx<0)return;let left=p.views.slice(0,idx).reduce((n,v2,i)=>n+(i===0?0:1)+`${v2.label} ${v2.count}`.length+2,0),w2=`${p.views[idx].label} ${p.views[idx].count}`.length+2,port2=Math.max(1,node.viewport.width-4),pos=node.scrollLeft;node.scrollLeft=Math.max(0,left<pos?left:left+w2>pos+port2?left+w2-port2:pos)};move();let frames=0,frame=async()=>{if(move(),++frames>=2)renderer.removeFrameCallback(frame)};return renderer.setFrameCallback(frame),()=>renderer.removeFrameCallback(frame)},[p.view,p.views,renderer]),$jsx("scrollbox",{ref,scrollX:!0,height:1,paddingLeft:2,horizontalScrollbarOptions:HBAR,contentOptions:ROW,children:p.views.map((v2,i)=>$jsx(FilterChip,{id:chip(v2.id),label:`${v2.label} ${v2.count}`,state:p.view===v2.id?"in":"off",gap:i===0?0:1,color:theme.primary,textColor:theme.primary,onMouseDown:()=>p.setView(v2.id)},v2.id))})}),line=(s)=>(s??"").replace(/\s+/g," ").trim(),fold=(msgs)=>{let turns=[],tools=0;for(let m2 of msgs){if(m2.role==="tool"){tools++;continue}if(m2.role!=="user"&&m2.role!=="assistant")continue;let text5=line(m2.content);if(!text5)continue;turns.push({role:m2.role,text:text5})}return{turns,tools}},PeekRow=import_react58.memo((props)=>{let theme=useTheme().theme,[hot,setHot]=import_react58.useState(!1),left=props.row.role==="user",color=left?theme.primary:theme.accent,fg2=left?theme.text:theme.markdownText,bar=(side)=>$jsx("box",{width:2,flexShrink:0,height:1,border:[side],borderColor:color,customBorderChars:SIDE_PIPE});return $jsxs("box",{height:1,flexDirection:"row",backgroundColor:hot?theme.backgroundElement:void 0,onMouseOver:()=>setHot(!0),onMouseOut:()=>setHot(!1),children:[left?bar("left"):null,$jsx(Ticker,{active:hot,speed:35,hold:150,fg:fg2,children:inline(props.row.text).map((s,i)=>s.c?$jsx("span",{fg:theme.warning,children:s.t},i):s.b?$jsx("span",{fg:fg2,children:$jsx("strong",{children:s.t})},i):s.i?$jsx("span",{fg:fg2,children:$jsx("u",{children:s.t})},i):$jsx("span",{fg:fg2,children:s.t},i))}),left?null:bar("right")]})}),Peek=import_react58.memo((props)=>{let theme=useTheme().theme,[data2,setData]=import_react58.useState(null),[err,setErr]=import_react58.useState(""),sb=import_react58.useRef(null),gen=import_react58.useRef(0);if(import_react58.useEffect(()=>{let current=++gen.current;return setData(null),setErr(""),Promise.resolve(props.peek(props.sid)).then((m2)=>{if(gen.current===current)setData(fold(m2))}).catch((e)=>{if(gen.current===current)setErr(e instanceof Error?e.message:String(e))}),()=>{gen.current++}},[props.sid,props.peek]),import_react58.useEffect(()=>{if(data2&&sb.current)sb.current.scrollTop=sb.current.scrollHeight},[data2]),err)return $jsx("box",{height:1,children:$jsx("text",{fg:theme.error,children:err})});if(data2===null)return null;if(data2.turns.length===0&&data2.tools===0)return $jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"(no local transcript)"})});let gap=props.total>4;return $jsxs("box",{flexDirection:"column",flexGrow:1,minHeight:5,border:!0,borderStyle:"single",borderColor:theme.border,title:` Transcript${gap?" \xB7 first 2 / last 2":""} `,titleAlignment:"left",children:[$jsx("scrollbox",{ref:sb,scrollY:!0,flexGrow:1,minHeight:3,children:$jsx("box",{flexDirection:"column",width:"100%",children:data2.turns.map((r,i)=>$jsxs(import_react58.Fragment,{children:[$jsx(PeekRow,{row:r}),gap&&i===1?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:" \u2026"})}):null]},i))})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:`${data2.turns.length} turn${data2.turns.length===1?"":"s"} \xB7 ${data2.tools} tool call${data2.tools===1?"":"s"}`})})]})}),Detail=import_react58.memo((props)=>{let theme=useTheme().theme,r=props.row,d2=r.detail,lastActive=d2?.last_active??d2?.ended_at??null,subs2=d2?.subagent_count??0,[info,setInfo]=import_react58.useState({}),[lineageErr,setLineageErr]=import_react58.useState(""),lineageGen=import_react58.useRef(0);import_react58.useEffect(()=>{let current=++lineageGen.current;return setInfo({}),setLineageErr(""),Promise.resolve(props.lineage(r.id)).then((next2)=>{if(lineageGen.current===current)setInfo(next2)}).catch((e)=>{if(lineageGen.current===current)setLineageErr(e instanceof Error?e.message:String(e))}),()=>{lineageGen.current++}},[r.id,props.lineage]);let hasLineage=info.continuesFrom||info.compressedTo||subs2>0,go=(sid2)=>()=>props.onSwitch?.(sid2);return $jsx(TabShell,{title:"Session Detail",grow:2,children:$jsxs("box",{flexDirection:"column",width:"100%",flexGrow:1,overflow:"hidden",children:[$jsxs("box",{flexDirection:"column",flexShrink:0,children:[$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:$jsx("span",{fg:theme.accent,children:$jsx("strong",{children:label(r)})})})}),$jsx("box",{height:1}),$jsx(KVBlock,{rows:[["ID",r.id],["Source",badge(src(r))],["Model",d2?.model??"\u2014"],["Started",when(r.started_at)],["Last active",lastActive?`${when(lastActive)} (${ago(lastActive)})`:"\u2014"],["Duration",lastActive?span(r.started_at,lastActive):"\u2014"],["Ended",d2?.ended_at?`${when(d2.ended_at)} \xB7 ${d2.end_reason??"\u2014"}`:void 0]]}),$jsx("box",{height:1}),$jsx(KVBlock,{rows:[["Messages",String(r.message_count)],["Tool calls",d2?String(d2.tool_call_count):void 0],["Input",d2?`${fmt(d2.input_tokens)} tok`:void 0],["Output",d2?`${fmt(d2.output_tokens)} tok`:void 0],["Cache",d2?`${fmt(d2.cache_read_tokens)} r / ${fmt(d2.cache_write_tokens)} w`:void 0],["Reasoning",d2?`${fmt(d2.reasoning_tokens)} tok`:void 0],["Cost",d2?cost2(d2.estimated_cost_usd):void 0,theme.success]]}),hasLineage?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{minHeight:1,children:$jsx("text",{fg:theme.textMuted,children:"Lineage"})}),info.continuesFrom?$jsx("box",{height:1,onMouseDown:go(info.continuesFrom.id),children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:" \u2190 continues from "}),$jsx("span",{fg:theme.accent,children:info.continuesFrom.title||info.continuesFrom.id})]})}):null,info.compressedTo?$jsx("box",{height:1,onMouseDown:go(info.compressedTo.id),children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:" \u2192 compressed to "}),$jsx("span",{fg:theme.accent,children:info.compressedTo.title||info.compressedTo.id})]})}):null,subs2>0?$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:" \u2387 spawned "}),$jsx("span",{fg:theme.text,children:String(subs2)}),$jsx("span",{fg:theme.textMuted,children:` subagent${subs2===1?"":"s"}`})]})}):null]}):null,lineageErr?$jsx("box",{height:1,children:$jsx("text",{fg:theme.error,children:lineageErr})}):null,!d2?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"(no local detail \u2014 state.db mismatch)"})})]}):null,$jsx("box",{height:1})]}),$jsx(Peek,{sid:r.id,total:r.message_count,peek:props.peek})]})})}),SearchDetail=import_react58.memo((props)=>{let theme=useTheme().theme,r=props.result,parts2=[],rest=r.snippet;while(rest.length){let start=rest.indexOf(">>>");if(start<0){parts2.push({text:rest,hi:!1});break}if(start>0)parts2.push({text:rest.slice(0,start),hi:!1});let end=rest.indexOf("<<<",start+3);if(end<0){parts2.push({text:rest.slice(start+3),hi:!0});break}parts2.push({text:rest.slice(start+3,end),hi:!0}),rest=rest.slice(end+3)}return $jsx(TabShell,{title:"Search Match",grow:2,children:$jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsxs("box",{flexDirection:"column",width:"100%",children:[$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:$jsx("span",{fg:theme.accent,children:$jsx("strong",{children:r.title??"Untitled"})})})}),$jsx("box",{height:1}),$jsx(KVBlock,{rows:[["Source",badge(r.source)],["Model",r.model??"\u2014"],["Time",when(r.started_at)]]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Snippet"})}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:parts2.map((p,i)=>p.hi?$jsx("span",{fg:theme.accent,children:$jsx("strong",{children:p.text})},i):$jsx("span",{fg:theme.text,children:p.text},i))})})]})})})}),HeaderRow=import_react58.memo((props)=>{let theme=useTheme().theme,fg2=theme.textMuted,on=theme.accent,by=props.sort;return $jsxs(Hdr,{children:[$jsx(Col,{w:2,fg:fg2,children:" "}),$jsx(Col,{grow:!0,fg:fg2,bold:!0,children:"Title"}),$jsx(Col,{w:9,fg:fg2,bold:!0,children:"Source"}),$jsx(Col,{w:8,fg:by==="started"?on:fg2,bold:!0,onClick:()=>props.onSort("started"),children:by==="started"?"Start \u25BE":"Start"}),$jsx(Col,{w:10,fg:by==="active"?on:fg2,bold:!0,right:!0,onClick:()=>props.onSort("active"),children:by==="active"?"Active \u25BE":"Active"}),$jsx(Col,{w:7,fg:fg2,bold:!0,right:!0,children:"Msgs"}),$jsx("box",{width:3})]})}),Item=import_react58.memo((props)=>{let theme=useTheme().theme,{row:r,idx:i}=props,[x2,setX]=import_react58.useState(!1),active2=r.detail?.last_active??r.detail?.ended_at??null,locked=props.locked||props.indent||Boolean(r.live),subs2=!props.indent&&(r.detail?.subagent_count??0)>0,leader=props.indent?"\u2514\u2500":props.selected?"\u25B8 ":" ",muted=props.indent&&!props.selected?theme.textMuted:void 0;return $jsxs("box",{id:props.id,flexDirection:"row",height:1,backgroundColor:props.selected?theme.backgroundElement:void 0,onMouseDown:()=>props.onActivate(i),onMouseMove:()=>props.onHover(i),children:[$jsx(Col,{w:2,fg:props.selected?theme.primary:muted??theme.text,children:leader}),$jsx(Marquee,{grow:!0,active:props.selected,fg:props.selected?theme.accent:muted??theme.text,bold:props.selected,underline:props.selected&&subs2,children:label(r)}),$jsx(Col,{w:9,fg:muted??theme.info,children:badge(src(r))}),$jsx(Col,{w:8,fg:theme.textMuted,children:stamp(r.started_at)}),$jsx(Col,{w:10,fg:theme.textMuted,right:!0,children:active2?ago(active2):"\u2014"}),$jsx(Col,{w:7,fg:theme.textMuted,right:!0,children:subs2?`${r.detail?.subagent_count} subs`:String(r.message_count)}),locked?$jsx("box",{width:3}):$jsx("box",{width:3,onMouseDown:(e)=>{e.stopPropagation(),props.onDelete(i)},onMouseOver:()=>setX(!0),onMouseOut:()=>setX(!1),children:$jsx("text",{children:$jsx("span",{fg:x2?theme.error:theme.textMuted,children:" \u2715"})})})]})}),SearchHeaderRow=import_react58.memo(()=>{let fg2=useTheme().theme.textMuted;return $jsxs(Hdr,{children:[$jsx(Col,{w:2,fg:fg2,children:" "}),$jsx(Col,{grow:!0,fg:fg2,bold:!0,children:"Title"}),$jsx(Col,{w:9,fg:fg2,bold:!0,children:"Source"}),$jsx(Col,{w:10,fg:fg2,bold:!0,children:"When"}),$jsx(Col,{w:20,fg:fg2,bold:!0,children:"Model"})]})}),SearchItem=import_react58.memo((props)=>{let theme=useTheme().theme,{result:r,idx:i}=props;return $jsxs("box",{id:props.id,flexDirection:"row",height:1,backgroundColor:props.selected?theme.backgroundElement:void 0,onMouseDown:()=>props.onActivate(i),onMouseMove:()=>props.onHover(i),children:[$jsx(Col,{w:2,fg:props.selected?theme.primary:theme.text,children:props.selected?"\u25B8 ":" "}),$jsx(Col,{grow:!0,fg:props.selected?theme.accent:theme.text,bold:props.selected,children:r.title??"Untitled"}),$jsx(Col,{w:9,fg:theme.info,children:badge(r.source)}),$jsx(Col,{w:10,fg:theme.textMuted,children:ago(r.started_at)}),$jsx(Col,{w:20,fg:theme.textMuted,children:r.model??"\u2014"})]})}),cacheHome=()=>process.env.HERMES_HOME??"",last={home:"",rows:[],kids:new Map},Sessions=import_react58.memo((props)=>{let theme=useTheme().theme,gw=useGateway(),dialog=useDialog(),toast=useToast(),dims=useTerminalDimensions(),cached2=props.io==null,io2=import_react58.useMemo(()=>({list:props.io?.list??io.roots,search:props.io?.search??io.search,subagents:props.io?.subagents??io.children,lineage:props.io?.lineage??io.lineage,peek:props.io?.peek??io.peek,remove:props.io?.remove??exports_sessions_db.remove,rename:props.io?.rename??exports_sessions_db.rename}),[props.io]),fresh=cached2&&last.home===cacheHome(),[rows2,setRows]=import_react58.useState(fresh?last.rows:[]),[liveRows,setLiveRows]=import_react58.useState([]),[warn,setWarn]=import_react58.useState(""),[searchErr,setSearchErr]=import_react58.useState(""),[pending3,setPending]=import_react58.useState(rows2.length===0),sort=exports_preferences.usePref("sessions")?.sort??"active",setSort=import_react58.useCallback((s)=>exports_preferences.set("sessions",{sort:s}),[]),[view,setView]=import_react58.useState(HOME4),active2=import_react58.useMemo(()=>[...liveRows].sort((a,b2)=>Number(Boolean(b2.live?.current))-Number(Boolean(a.live?.current))||(b2.live?.last_active??b2.started_at)-(a.live?.last_active??a.started_at)),[liveRows]),ids=import_react58.useMemo(()=>new Set(active2.flatMap((r)=>[r.id,r.live?.session_key].filter((x2)=>Boolean(x2)))),[active2]),sorted=import_react58.useMemo(()=>rows2.filter((r)=>!ids.has(r.id)).sort(cmp(sort)),[rows2,ids,sort]),views=import_react58.useMemo(()=>{let stats=sorted.reduce((m2,r)=>{let s=src(r);if(!s)return m2;let prev=m2.get(s);return m2.set(s,{count:(prev?.count??0)+1,last:Math.max(prev?.last??0,tick2(r))}),m2},new Map),conv=sorted.filter((r)=>src(r)!=="cron").length;return[...conv>0?[{id:HOME4,label:"Conversations",count:conv,aggregate:"conversations"}]:[],...[...stats.entries()].sort((a,b2)=>b2[1].last-a[1].last||badge(a[0]).localeCompare(badge(b2[0]))).map(([source,stat2])=>({id:sid(source),label:badge(source),count:stat2.count,source}))]},[sorted]),cur=views.find((v2)=>v2.id===view)??views[0],chosen=cur?.id??view,hist=import_react58.useMemo(()=>{if(!cur)return[];if(cur.aggregate===HOME4)return sorted.filter((r)=>src(r)!=="cron");return sorted.filter((r)=>src(r)===cur.source)},[sorted,cur]),listed=import_react58.useMemo(()=>[...active2,...hist],[active2,hist]);import_react58.useEffect(()=>{if(views.length>0&&!views.some((v2)=>v2.id===view))setView(views[0].id)},[views,view]);let[anchor,setAnchor]=import_react58.useState(null),[open2,setOpen]=import_react58.useState(null),[searching,setSearching]=import_react58.useState(!1),[query,setQuery]=import_react58.useState(""),[results,setResults]=import_react58.useState([]),[searchSel,setSearchSel]=import_react58.useState(0),[kids,setKids]=import_react58.useState(cached2?last.kids:new Map),debounce=import_react58.useRef(null),searchGen=import_react58.useRef(0),vscroll=import_react58.useRef(null),seen=import_react58.useRef(!1),gen=import_react58.useRef(0),anchored=anchor&&listed.find((r)=>r.id===anchor.id),branch3=open2?listed.find((r)=>r.id===open2):void 0,owner=branch3&&(anchor?.indent?kids.get(branch3.id)?.some((c)=>c.id===anchor.id):anchored?.id===branch3.id)?branch3:void 0,showDetailPanel=dims.width>=120,visible2=listed.flatMap((r,i)=>r.id===owner?.id?[{row:r,indent:!1,parentIdx:i},...(kids.get(r.id)??[]).map((c)=>({row:c,indent:!0,parentIdx:i}))]:[{row:r,indent:!1,parentIdx:i}]),sel=anchor?Math.max(0,visible2.findIndex((v2)=>v2.row.id===anchor.id&&v2.indent===anchor.indent)):0,live=import_react58.useRef({rows:listed,visible:visible2,anchor,results,searching,onSwitch:props.onSwitch,onActivateLive:props.onActivateLive,currentId:props.currentId});live.current={rows:listed,visible:visible2,anchor,results,searching,onSwitch:props.onSwitch,onActivateLive:props.onActivateLive,currentId:props.currentId};let setSel=import_react58.useCallback((arg)=>{let cur2=live.current,prev=cur2.visible.findIndex((v3)=>v3.row.id===cur2.anchor?.id&&v3.indent===cur2.anchor.indent),n=typeof arg==="function"?arg(Math.max(0,prev)):arg,v2=cur2.visible[Math.max(0,Math.min(cur2.visible.length-1,n))];if(v2)setAnchor({id:v2.row.id,indent:v2.indent})},[]),LIMIT=2000,keep=(d2)=>d2.message_count>0||d2.lineage_root_id!=null,toRow2=(d2)=>({id:d2.id,title:d2.title??"",preview:d2.lastMessage??"",message_count:d2.message_count,started_at:d2.started_at,source:d2.sessionSource,detail:d2}),toLiveRow=(s,d2,r)=>({id:s.id,title:s.title?.trim()||d2?.title||"",preview:s.preview??"",message_count:s.message_count??d2?.message_count??r?.message_count??0,started_at:s.started_at??d2?.started_at??r?.started_at??s.last_active??0,source:d2?.sessionSource??r?.source??s.source??"",detail:d2,live:s}),pick=(m2,s)=>m2.get(s.id)??m2.get(s.session_key??""),patchTitle=import_react58.useCallback((id,title)=>{if(!id||title===void 0)return;home3.update("recentSessions",(rows3)=>rows3.map((r)=>r.id===id?{...r,title}:r)),setRows((prev)=>prev.map((row3)=>row3.id===id?{...row3,title,detail:row3.detail?{...row3.detail,title}:row3.detail}:row3)),setLiveRows((prev)=>prev.map((row3)=>row3.id===id||row3.live?.session_key===id?{...row3,title,live:row3.live?{...row3.live,title}:row3.live}:row3))},[]);useGatewayEvent((ev)=>{if(ev.type==="session.title")patchTitle(ev.payload.session_id,ev.payload.title)});let load4=import_react58.useCallback(async()=>{let current=++gen.current;setPending(!0);let rpc=gw.request("session.list",{limit:LIMIT}).then((r2)=>({ok:!0,v:r2})).catch((e)=>({ok:!1,e})),active3=gw.request("session.active_list",{current_session_id:props.currentId}).then((r2)=>({ok:!0,v:r2})).catch((e)=>({ok:!1,e})),disk=await Promise.resolve(io2.list(LIMIT)).catch(()=>[]);if(gen.current!==current)return;let local=new Map(disk.map((r2)=>[r2.id,r2])),diskRows=disk.filter(keep).map(toRow2);if(setRows(diskRows),cached2)last.home=cacheHome(),last.rows=diskRows;let[a,r]=await Promise.all([active3,rpc]);if(gen.current!==current)return;let live2=a.ok?a.v.sessions??[]:[];if(a.ok)setLiveRows(live2.map((s)=>toLiveRow(s,pick(local,s))));let final=diskRows;if(r.ok&&r.v.sessions?.length){let seen2=new Set(diskRows.map((s)=>s.id)),merged=[...diskRows,...r.v.sessions.filter((s)=>(s.message_count??0)>0&&!seen2.has(s.id)).map((s)=>({...s,detail:local.get(s.id)}))];if(final=merged,setRows(merged),cached2)last.home=cacheHome(),last.rows=merged;let found=new Map(merged.map((s)=>[s.id,s]));if(live2.length)setLiveRows(live2.map((s)=>toLiveRow(s,pick(local,s),pick(found,s))))}let kidsError="";try{let parents=final.filter((row3)=>(row3.detail?.subagent_count??0)>0),children2=[];for(let i=0;i<parents.length;i+=8)if(children2.push(...await Promise.all(parents.slice(i,i+8).map((row3)=>io2.subagents(row3.id)))),gen.current!==current)return;if(gen.current!==current)return;let next2=new Map(parents.map((row3,i)=>[row3.id,children2[i].map(toRow2)]));if(setKids(next2),cached2)last.home=cacheHome(),last.kids=next2}catch(err){kidsError=err instanceof Error?err.message:String(err)}if(gen.current!==current)return;setPending(!1);let listError=!r.ok?local.size?`gateway session.list failed (${r.e.message}) \u2014 listing state.db directly; rows may not resume`:r.e.message:"";setWarn([listError,kidsError].filter(Boolean).join(" \xB7 "))},[gw,props.currentId,io2,cached2]);import_react58.useEffect(()=>{load4()},[load4]),import_react58.useEffect(()=>()=>{gen.current++},[]),import_react58.useEffect(()=>{let on=active2.length>0,fresh2=on&&!seen.current;if(!listed.length){seen.current=on;return}if(!anchor||!visible2.some((v2)=>v2.row.id===anchor.id&&v2.indent===anchor.indent)){setAnchor({id:listed[0].id,indent:!1}),seen.current=on;return}if(fresh2&&active2[0]&&hist[0]?.id===anchor.id&&!anchor.indent)setAnchor({id:active2[0].id,indent:!1});seen.current=on},[listed,active2,hist,anchor]),import_react58.useEffect(()=>{let current=++searchGen.current;if(setSearchErr(""),!searching||!query.trim()){setResults([]);return}return setResults([]),setSearchSel(0),debounce.current=setTimeout(()=>{Promise.resolve(io2.search(query,30)).then((r)=>{if(searchGen.current!==current)return;setResults(r),setSearchSel(0),setSearchErr("")}).catch((err)=>{if(searchGen.current===current)setSearchErr(err instanceof Error?err.message:String(err))})},150),()=>{if(debounce.current)clearTimeout(debounce.current)}},[query,searching,io2]);let rowHover=import_react58.useCallback((i)=>{live.current.searching?setSearchSel(i):setSel(i)},[setSel]),rowActivate=import_react58.useCallback((i)=>{let l=live.current;l.searching?setSearchSel(i):setSel(i);let hit=l.searching?l.results[i]:l.visible[i]?.row,id=l.searching?hit?.session_id:hit?.id;if(!id)return;if(!l.searching&&hit?.live){if(l.onActivateLive)return l.onActivateLive(id);return l.onSwitch?.(id)}if(!l.onSwitch)return;if(id===l.currentId)return l.onSwitch(id);let title=hit?.title||"Untitled",n=l.searching?void 0:hit.message_count;openConfirm(dialog,{title:"Load session?",body:`${trunc5(title,60)}${n!=null?` \xB7 ${n} msg${n===1?"":"s"}`:""}
|
|
4117
4117
|
|
|
4118
4118
|
Current chat will be replaced.`,yes:"load"}).then((ok)=>{if(ok)l.onSwitch?.(id)})},[dialog]),rowDelete=import_react58.useCallback((i)=>{let v2=live.current.visible[i];if(v2&&!v2.indent&&!v2.row.live&&v2.row.id!==live.current.currentId)confirmDeleteRef.current(v2.row)},[]),lineageSwitch=import_react58.useCallback((sid2)=>{let l=live.current;if(!l.onSwitch)return;if(sid2===l.currentId)return l.onSwitch(sid2);openConfirm(dialog,{title:"Load session?",body:`Switch to ${trunc5(sid2,24)}?
|
|
4119
4119
|
|
|
@@ -4126,7 +4126,7 @@ Current chat will be replaced.`,yes:"load"}).then((ok)=>{if(ok)l.onSwitch?.(sid2
|
|
|
4126
4126
|
`,nl+1)).trim().startsWith("#")){end=nl;break}}end=nl}mark2(skH,end+1,"skills","Skills Catalog",makeSource("skills","skills/"))}let proj=text5.indexOf("# Project Context");if(proj>=0){let conv2=text5.indexOf("Conversation started:");mark2(proj,conv2>proj?conv2:text5.length,"project","Project Context",makeSource("AGENTS.md"))}let conv=text5.indexOf("Conversation started:");if(conv>=0)mark2(conv,text5.length,"meta","Session Metadata");let start=-1;for(let i=0;i<=text5.length;i++)if(i<text5.length&&!used[i]){if(start<0)start=i}else if(start>=0){let slice=text5.slice(start,i);if(slice.trim().length>0)sections.push({id:"other",label:"Other",chars:slice.length,tokens:count2(slice),text:slice});start=-1}return sections.sort((a,b2)=>text5.indexOf(a.text)-text5.indexOf(b2.text))}function classifyTools(tools){let system=[],mcp=[];for(let t2 of tools)if(t2.name.startsWith("mcp_"))mcp.push(t2);else system.push(t2);return{system,mcp}}function toolTokens(tool){return Math.ceil((tool.descriptionLength+tool.paramsLength)/CPT)}function build(opts){let pct=(t2)=>opts.contextLength>0?t2/opts.contextLength*100:0,result=[],byId2=new Map;for(let s of opts.sections)byId2.set(s.id,s);let promptChildren=opts.sections.filter((sec)=>SYSTEM_PROMPT_IDS.has(sec.id)&&sec.tokens>0).map((sec)=>({id:sec.id,label:sec.label,tokens:sec.tokens,percent:pct(sec.tokens),section:sec})),promptTok=promptChildren.reduce((s,c)=>s+c.tokens,0);if(promptTok>0)result.push({id:"system_prompt",label:"System Prompt",tokens:promptTok,percent:pct(promptTok),children:promptChildren});let{system:sysTools,mcp:mcpTools}=classifyTools(opts.tools),sysToolsTok=sysTools.reduce((s,t2)=>s+toolTokens(t2),0);if(sysToolsTok>0)result.push({id:"system_tools",label:"System Tools",tokens:sysToolsTok,percent:pct(sysToolsTok)});let mcpToolsTok=mcpTools.reduce((s,t2)=>s+toolTokens(t2),0);if(mcpToolsTok>0)result.push({id:"mcp_tools",label:"MCP Tools",tokens:mcpToolsTok,percent:pct(mcpToolsTok)});let memChildren=opts.sections.filter((sec)=>MEMORY_IDS.has(sec.id)&&sec.tokens>0).map((sec)=>({id:sec.id,label:sec.label,tokens:sec.tokens,percent:pct(sec.tokens),section:sec})),memTok=memChildren.reduce((s,c)=>s+c.tokens,0);if(memTok>0)result.push({id:"memory",label:"Memory",tokens:memTok,percent:pct(memTok),children:memChildren});let skillsSec=byId2.get("skills"),skillsTok=skillsSec?.tokens??opts.skillsTokens??0;if(skillsTok>0)result.push({id:"skills",label:"Skills",tokens:skillsTok,percent:pct(skillsTok),section:skillsSec});if(opts.conversationTokens>0){let ct=opts.conversationTokens;result.push({id:"conversation",label:"~Conversation",tokens:ct,percent:pct(ct)})}let taken=result.reduce((s,g)=>s+g.tokens,0),used=opts.usedTokens;if(typeof used!=="number"){let unknown2=Math.max(0,opts.contextLength-taken);if(unknown2>0)result.push({id:"unknown",label:"Unknown (live unavailable)",tokens:unknown2,percent:pct(unknown2)});return result}let unknown=Math.max(0,used-taken);if(unknown>0)result.push({id:"unknown",label:"Unknown / Provider Overhead",tokens:unknown,percent:pct(unknown)});let overage=Math.max(0,taken-used);if(overage>0)result.push({id:"overage",label:"Estimate Overage",tokens:overage,percent:pct(overage)});let free=Math.max(0,opts.contextLength-used);return result.push({id:"free",label:"Free",tokens:free,percent:pct(free)}),result}function drill(group2){if(!group2.children||group2.children.length===0)return[];let total=group2.tokens;return group2.children.map((c)=>({...c,percent:total>0?c.tokens/total*100:0}))}function cells(segments,fallback2="free"){let filled=segments.flatMap((seg)=>Array.from({length:Math.round(seg.percent/100*GRID)},()=>({id:seg.id}))),pad=Array.from({length:Math.max(0,GRID-filled.length)},()=>({id:fallback2}));return[...filled,...pad].slice(0,GRID)}var import_react60=__toESM(require_react_production(),1);var FileLink=import_react60.memo(({source,children:children2})=>{let theme=useTheme().theme,[hovered,setHovered]=import_react60.useState(!1);return $jsx("box",{height:1,onMouseDown:()=>openFile(source.file),onMouseOver:()=>setHovered(!0),onMouseOut:()=>setHovered(!1),children:$jsx("text",{fg:theme.info,attributes:hovered?TextAttributes.UNDERLINE:TextAttributes.NONE,children:children2??source.label})})}),KVLink=(props)=>{let theme=useTheme().theme;return $jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:13,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:props.label})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx(FileLink,{source:props.source,children:props.text??props.source.label})})]})};var GOLDEN_ANGLE=137.50776405003785;function luminance(c){return 0.299*c.r+0.587*c.g+0.114*c.b}function rgbaToHsl(c){let{r,g,b:b2}=c,max=Math.max(r,g,b2),min=Math.min(r,g,b2),l=(max+min)/2,d2=max-min;if(d2===0)return[0,0,l];let s=l>0.5?d2/(2-max-min):d2/(max+min),h2;switch(max){case r:h2=(g-b2)/d2+(g<b2?6:0);break;case g:h2=(b2-r)/d2+2;break;default:h2=(r-g)/d2+4}return[h2*60,s,l]}function hslToRgba(h2,s,l){if(h2=(h2%360+360)%360/360,s===0)return RGBA.fromValues(l,l,l,1);let q3=l<0.5?l*(1+s):l+s-l*s,p=2*l-q3,ch=(t2)=>{if(t2<0)t2+=1;if(t2>1)t2-=1;if(t2<0.16666666666666666)return p+(q3-p)*6*t2;if(t2<0.5)return q3;if(t2<0.6666666666666666)return p+(q3-p)*(0.6666666666666666-t2)*6;return p};return RGBA.fromValues(ch(h2+0.3333333333333333),ch(h2),ch(h2-0.3333333333333333),1)}function categorical(seed,bg2,n){let[h0]=rgbaToHsl(seed),dark=luminance(bg2)<0.5,s=dark?0.6:0.7,l=dark?0.62:0.42,out=[];for(let i=0;i<n;i++)out.push(hslToRgba(h0+i*GOLDEN_ANGLE,s,l));return out}var DEFAULT_CTX=128000,COLS2=16,SLOTS2=["system_prompt","system_tools","mcp_tools","memory","skills","conversation","soul","mem0","user","project","meta","other","unknown","overage"],SLOT=Object.fromEntries(SLOTS2.map((id,i)=>[id,i])),REMOTE={tool_definitions:"system_tools",mcp:"mcp_tools",rules:"system_prompt",subagent_definitions:"system_tools"},ORDER2=["system_prompt","system_tools","mcp_tools","memory","skills","conversation"],LABEL2={system_prompt:"System Prompt",system_tools:"System Tools",mcp_tools:"MCP Tools",memory:"Memory",skills:"Skills",conversation:"Conversation"},rampCache=new WeakMap;function ramp2(theme){let r=rampCache.get(theme);if(!r)rampCache.set(theme,r=categorical(theme.primary,theme.background,SLOTS2.length));return r}function clr(id,theme){if(id==="free")return theme.borderSubtle;return ramp2(theme)[SLOT[id]??SLOT.other]}var fmt2=(n)=>{if(n>=1e6)return`${(n/1e6).toFixed(1)}M`;if(n>=1e4)return`${Math.round(n/1000)}k`;if(n>=1000)return`${(n/1000).toFixed(1)}k`;return String(n)},est=(s)=>s?count2(s):0,bar=(pct,w2=20)=>{let f=Math.round(Math.max(0,Math.min(100,pct))/100*w2);return`[${"\u2588".repeat(f)}${"\u2591".repeat(Math.max(0,w2-f))}]`},SectionPanel=import_react61.memo(({seg,theme})=>{let{syntaxStyle}=useTheme(),sec=seg.section;if(!sec)return null;return $jsxs("scrollbox",{borderStyle:"single",padding:1,flexGrow:1,scrollY:!0,children:[$jsx("text",{children:$jsxs("strong",{children:[$jsx("span",{fg:clr(seg.id,theme),children:"\u25FC"})," ",seg.label," \u2014 ",fmt2(seg.tokens)," tokens (",seg.percent.toFixed(1),"%)"]})}),$jsxs("text",{children:[sec.chars.toLocaleString()," chars \xB7 ~",fmt2(sec.tokens)," tokens"]}),sec.source?$jsxs("box",{flexDirection:"row",height:1,children:[$jsx("text",{children:"Source: "}),$jsx(FileLink,{source:sec.source})]}):null,$jsx("text",{children:" "}),$jsx("markdown",{content:sec.text,fg:theme.markdownText,syntaxStyle})]})}),MemoryPanel=import_react61.memo(({seg,theme,label:label2,chars,limit,pct,entries:entries2,source})=>$jsxs("scrollbox",{borderStyle:"single",padding:1,flexGrow:1,scrollY:!0,children:[$jsx("text",{children:$jsxs("strong",{children:[$jsx("span",{fg:clr(seg.id,theme),children:"\u25FC"})," ",seg.label," \u2014 ",fmt2(seg.tokens)," tokens (",seg.percent.toFixed(1),"%)"]})}),$jsx("text",{children:" "}),$jsxs("box",{flexDirection:"row",height:1,children:[$jsx("text",{children:$jsx("strong",{children:label2})}),source?$jsxs($Fragment,{children:[$jsx("text",{children:" ("}),$jsx(FileLink,{source}),$jsx("text",{children:")"})]}):null]}),$jsxs("text",{children:[chars.toLocaleString()," / ",limit.toLocaleString()," chars (",pct,"%)"]}),$jsxs("text",{children:[bar(pct,25),pct>=95?" \u26A0 near limit":""]}),$jsx("text",{children:" "}),$jsxs("text",{children:[entries2.length," entries:"]}),entries2.map((e,i)=>$jsxs("text",{fg:theme.text,children:["\xB7 ",e]},i))]})),SkillsPanel=import_react61.memo(({seg,theme})=>{let sec=seg.section;if(!sec)return null;let cats={};for(let line2 of sec.text.split(`
|
|
4127
4127
|
`)){if(line2.match(/^\s{2}(\S[\w-]*(?:\/\S+)?):\s/)){let cat=line2.match(/^\s{2}(\S[\w-]*(?:\/\S+)?):\s/)[1];if(!cats[cat])cats[cat]=0}if(line2.match(/^\s{4}- \S+:/)){let last2=Object.keys(cats).pop();if(last2)cats[last2]++}}let sorted=Object.entries(cats).sort((a,b2)=>b2[1]-a[1]),total=sorted.reduce((s,[,n])=>s+n,0);return $jsxs("scrollbox",{borderStyle:"single",padding:1,flexGrow:1,scrollY:!0,children:[$jsx("text",{children:$jsxs("strong",{children:[$jsx("span",{fg:clr("skills",theme),children:"\u25FC"})," Skills Catalog \u2014 ",fmt2(seg.tokens)," tokens (",seg.percent.toFixed(1),"%)"]})}),sec.source?$jsxs("box",{flexDirection:"row",height:1,children:[$jsx("text",{children:"Source: "}),$jsx(FileLink,{source:sec.source})]}):null,$jsx("text",{children:" "}),$jsxs("text",{children:[total," skills in ",sorted.length," categories \xB7 ",sec.chars.toLocaleString()," chars"]}),$jsx("text",{fg:theme.textMuted,children:"Largest context section \u2014 skill names + descriptions injected every turn."}),$jsx("text",{children:" "}),sorted.map(([cat,n])=>$jsxs("text",{fg:theme.text,children:["\xB7 ",cat," (",n,")"]},cat))]})}),ToolsPanel=import_react61.memo(({seg,theme,tools,kind:kind2})=>{let sorted=[...tools].sort((a,b2)=>b2.descriptionLength+b2.paramsLength-(a.descriptionLength+a.paramsLength)),label2=kind2==="mcp_tools"?"MCP Tools":"System Tools",blurb=kind2==="mcp_tools"?"MCP-loaded tools \u2014 schemas injected via mcp_ prefix.":"Built-in tool schemas sent with every API call.";return $jsxs("scrollbox",{borderStyle:"single",padding:1,flexGrow:1,scrollY:!0,children:[$jsx("text",{children:$jsxs("strong",{children:[$jsx("span",{fg:clr(kind2,theme),children:"\u25FC"})," ",label2," \u2014 ",fmt2(seg.tokens)," tokens (",seg.percent.toFixed(1),"%)"]})}),$jsx("text",{children:" "}),$jsxs("text",{children:[tools.length," tools \u2014 ",blurb]}),$jsx("text",{children:" "}),sorted.map((t2)=>$jsxs("text",{fg:theme.text,children:["\xB7 ",t2.name," (",fmt2(toolTokens(t2))," tok)"]},t2.name))]})}),ConvPanel=import_react61.memo(({seg,theme,messages,output})=>{let user=messages.filter((m2)=>m2.role==="user"),asst=messages.filter((m2)=>m2.role==="assistant"),non=messages.filter((m2)=>m2.role!=="system");return $jsxs("scrollbox",{borderStyle:"single",padding:1,flexGrow:1,scrollY:!0,children:[$jsx("text",{children:$jsxs("strong",{children:[$jsx("span",{fg:clr("conversation",theme),children:"\u25FC"})," Conversation \u2014 ",fmt2(seg.tokens)," tokens (",seg.percent.toFixed(1),"%)"]})}),$jsx("text",{children:" "}),$jsxs("text",{children:["User: ",user.length," msgs (~",fmt2(est(user.map((m2)=>text3(m2)).join("")))," tok)"]}),$jsxs("text",{children:["Agent: ",asst.length," msgs (~",fmt2(est(asst.map((m2)=>text3(m2)).join("")))," tok)"]}),output>0?$jsxs("text",{children:["Output generated: ",fmt2(output)," tokens"]}):null,$jsx("text",{children:" "}),non.length>0?$jsxs($Fragment,{children:[$jsx("text",{fg:theme.info,children:"Messages:"}),$jsx("text",{children:" "}),non.map((m2,i)=>$jsxs("text",{children:[$jsx("span",{fg:m2.role==="user"?theme.info:theme.success,children:m2.role==="user"?"\u25B8 You":"\u25C2 Agent"})," ","(",fmt2(est(text3(m2))),") ",text3(m2).replace(/\n/g," ")]},i))]}):$jsx("text",{fg:theme.warning,children:"No messages yet"})]})}),FreePanel=import_react61.memo(({seg,theme,ctxLen,comp,onEditThreshold})=>{let used=ctxLen-seg.tokens,threshold=Math.round(ctxLen*(comp?.threshold??0.5)),pct=threshold>0?Math.min(100,Math.round(used/threshold*100)):0;return $jsxs("scrollbox",{borderStyle:"single",padding:1,flexGrow:1,scrollY:!0,children:[$jsx("text",{children:$jsxs("strong",{children:[$jsx("span",{fg:clr("free",theme),children:"\u25FB"})," Free Space \u2014 ",fmt2(seg.tokens)," tokens"]})}),$jsx("text",{children:" "}),$jsxs("text",{children:["Context window: ",fmt2(ctxLen)]}),$jsxs("text",{children:["Used: ",fmt2(used)," (",Math.round(used/ctxLen*100),"%)"]}),$jsxs("text",{children:["Available: ",fmt2(seg.tokens)," (",seg.percent.toFixed(1),"%)"]}),$jsx("text",{children:" "}),comp?$jsxs($Fragment,{children:[$jsx("text",{children:$jsx("strong",{children:"Compression"})}),$jsxs("box",{height:1,flexDirection:"row",children:[$jsxs("text",{children:[comp.enabled?"\u2713 Enabled":"\u2717 Disabled"," \xB7 threshold "]}),$jsx("box",{flexShrink:0,onMouseDown:onEditThreshold,children:$jsx("text",{fg:theme.info,children:$jsxs("u",{children:[Math.round(comp.threshold*100),"%"]})})}),$jsxs("text",{children:[" (",fmt2(threshold),")"]})]}),$jsxs("text",{children:[bar(pct)," ",pct,"%"]}),$jsxs("text",{children:["Protect last ",comp.protect_last_n," messages \xB7 target ratio ",Math.round(comp.target_ratio*100),"%"]}),comp.summary_model?$jsxs("text",{children:["Summary model: ",comp.summary_model]}):null]}):null]})}),NO_MESSAGES=Object.freeze([]),toolsFromInfo=(info)=>{if(!info||info.tools===void 0)return null;let tools=Object.entries(info.tools).flatMap(([group2,names])=>names.map((name)=>({name,descriptionLength:0,paramsLength:group2.length})));return{source:makeSource("state.db","session.info"),tools}},configuredContextLength=(config)=>{let n=config?.model?.context_length;return typeof n==="number"&&n>0?n:void 0},contextMeter=(usage,info,config)=>({max:usage?.context_max??info?.usage?.context_max??info?.context_max??configuredContextLength(config)??DEFAULT_CTX,used:usage?.context_used??info?.usage?.context_used??info?.context_used}),contextBreakdown=(data2)=>{if(!data2||typeof data2!=="object")return null;let raw=data2,max=Number(raw.context_max),used=Number(raw.context_used);if(!Number.isFinite(max)||max<=0||!Number.isFinite(used)||used<0)return null;if(!Array.isArray(raw.categories))return null;return{categories:raw.categories.flatMap((cat)=>{if(!cat||typeof cat!=="object")return[];let id=typeof cat.id==="string"?cat.id.trim():"",label2=typeof cat.label==="string"?cat.label.trim():"",tokens3=Number(cat.tokens);if(!id||!label2||!Number.isFinite(tokens3)||tokens3<0)return[];return[{id,label:label2,tokens:tokens3,color:typeof cat.color==="string"?cat.color:void 0}]}),context_max:max,context_used:Math.min(used,max),estimated_total:Number.isFinite(Number(raw.estimated_total))?Math.max(0,Number(raw.estimated_total)):0,model:typeof raw.model==="string"?raw.model:void 0}},remoteSegments=(data2,local)=>{let byId2=new Map(local.map((seg)=>[seg.id,seg])),bucket=new Map;for(let cat of data2.categories){let id=REMOTE[cat.id]??cat.id,prev=bucket.get(id);bucket.set(id,{label:byId2.get(id)?.label??prev?.label??cat.label,tokens:(prev?.tokens??0)+cat.tokens})}let pct=(n)=>data2.context_max>0?n/data2.context_max*100:0,segs=[...ORDER2,...bucket.keys().filter((id)=>!ORDER2.includes(id))].flatMap((id)=>{let cat=bucket.get(id);if(!cat||cat.tokens<=0)return[];let seg=byId2.get(id);return[{...seg??{},id,label:seg?.label??LABEL2[id]??cat.label,tokens:cat.tokens,percent:pct(cat.tokens)}]}),taken=segs.reduce((sum,seg)=>sum+seg.tokens,0),unknown=Math.max(0,data2.context_used-taken);if(unknown>0)segs.push({id:"unknown",label:"Unknown / Provider Overhead",tokens:unknown,percent:pct(unknown)});let free=Math.max(0,data2.context_max-data2.context_used);return segs.push({id:"free",label:"Free",tokens:free,percent:pct(free)}),segs},Context=import_react61.memo(({messages=NO_MESSAGES,info,usage,focused})=>{let config=useHome("config"),memory=useHome("memory"),userProfile=useHome("userProfile"),gw=useGateway(),dialog=useDialog(),toast=useToast(),systemPrompt2=useHome("systemPrompt"),toolsInfo=useHome("toolsInfo"),soul=useHome("soul"),[wire,setWire]=import_react61.useState({input:0,output:0,total:0,calls:0}),wireRef=import_react61.useRef(wire),theme=useTheme().theme,[hovered,setHovered]=import_react61.useState(null),[selected,setSelected]=import_react61.useState(null),[drilled,setDrilled]=import_react61.useState(null),[remote2,setRemote]=import_react61.useState(null);import_react61.useEffect(()=>{let input=0,output2=0,total=0,calls=0;for(let m2 of messages)if(m2.usage)input+=m2.usage.input,output2+=m2.usage.output,total+=m2.usage.total,calls++;let next2={input,output:output2,total,calls};wireRef.current=next2,setWire(next2)},[messages]);let rev2=usage?.context_used??info?.usage?.context_used??info?.context_used;import_react61.useEffect(()=>{let sid2=info?.session_id;if(!sid2){setRemote(null);return}let done=!1,timer2=setTimeout(()=>{gw.request("session.context_breakdown",{session_id:sid2}).then((data2)=>{if(!done)setRemote(contextBreakdown(data2))}).catch(()=>{if(!done)setRemote(null)})},300);return()=>{done=!0,clearTimeout(timer2)}},[gw,info?.session_id,info?.usage?.compressions,messages.length,rev2]);let localMeter=contextMeter(usage,info,config??null),meter=remote2?{max:remote2.context_max,used:remote2.context_used}:localMeter,ctxLen=meter.max,used=meter.used,reliable=typeof used==="number",output=wire.output,pct=reliable&&ctxLen>0?Math.round(used/ctxLen*100):0,thresholdPct=config?.compression?.threshold??0.5,thresholdIdx=Math.min(COLS2*COLS2,Math.max(0,Math.round(thresholdPct*COLS2*COLS2))),compressions=info?.usage?.compressions??0,promptText=info?.system_prompt??systemPrompt2?.text??"",sections=import_react61.useMemo(()=>parse4(promptText),[promptText]),convTok=import_react61.useMemo(()=>est(messages.filter((m2)=>m2.role!=="system").map((m2)=>text3(m2)).join("")),[messages]),currentTools=import_react61.useMemo(()=>{let liveTools=toolsFromInfo(info);if(liveTools)return liveTools;if(info?.tools!==void 0)return liveTools;return toolsInfo},[info,toolsInfo]),local=import_react61.useMemo(()=>build({contextLength:ctxLen,usedTokens:used,sections,conversationTokens:convTok,tools:currentTools?.tools??[]}),[ctxLen,used,sections,convTok,currentTools]),top2=import_react61.useMemo(()=>remote2?remoteSegments(remote2,local):local,[remote2,local]),drilledGroup=drilled?top2.find((s)=>s.id===drilled):null,view=drilledGroup?drill(drilledGroup):top2,grid=import_react61.useMemo(()=>cells(view,drilledGroup?drilledGroup.children?.[0]?.id??"other":reliable?"free":"unknown"),[view,drilledGroup,reliable]),findSeg=(id)=>{if(drilledGroup)return view.find((s)=>s.id===id);return top2.find((s)=>s.id===id)},memEntries=import_react61.useMemo(()=>(memory?.content??"").split("\xA7").map((s)=>s.trim()).filter(Boolean),[memory?.content]),userEntries=import_react61.useMemo(()=>(userProfile?.content??"").split("\xA7").map((s)=>s.trim()).filter(Boolean),[userProfile?.content]),click=(id)=>{if(drilled){setSelected(selected===id?null:id);return}let seg=top2.find((s)=>s.id===id);if(seg?.children&&seg.children.length>0){setDrilled(id),setSelected(null);return}setSelected(selected===id?null:id)},lastEsc=import_react61.useRef(0),segs=view.filter((s)=>s.tokens>0),idx=selected?segs.findIndex((s)=>s.id===selected):-1,setSel=(v2)=>{let n=Math.max(0,Math.min(segs.length-1,typeof v2==="function"?v2(idx):v2));setSelected(segs[n]?.id??null)},keys=useKeys();useKeyboard((key3)=>{if(!focused||dialog.open())return;if(handleListKey(keys,key3,{count:segs.length,setSel,onActivate:()=>{if(drilled||!selected)return;if(top2.find((s)=>s.id===selected)?.children?.length)setDrilled(selected),setSelected(null)}}))return;if(key3.name==="right")return setSel((p)=>p+1);if(key3.name==="left")return setSel((p)=>p-1);if(key3.name!=="escape")return;let now=Date.now();if(now-lastEsc.current<400){setSelected(null),setDrilled(null),lastEsc.current=0;return}if(lastEsc.current=now,selected)return setSelected(null);if(drilled)return setDrilled(null)});let editThreshold=async()=>{let cur=Math.round((config?.compression?.threshold??0.5)*100),v2=await openTextPrompt(dialog,{title:"Compression threshold",label:"Percent (10\u201395)",initial:String(cur)});if(v2===null)return;let n=Math.max(10,Math.min(95,Number(v2)||cur)),{writeConfig:writeConfig2}=await Promise.resolve().then(() => (init_lane(),exports_lane)),r=await writeConfig2(gw,[{key:"compression.threshold",to:n/100}]);if(r.failed.length)return toast.show({variant:"error",message:r.failed[0].err});home3.invalidate("config"),toast.show({variant:"success",message:`Threshold \u2192 ${n}%`})},detail=()=>{if(!selected)return null;let seg=findSeg(selected);if(!seg)return null;if(selected==="memory"&&drilled==="memory"&&memory)return $jsx(MemoryPanel,{seg,theme,label:"Agent Notes",chars:memory.charCount,limit:memory.charLimit,pct:memory.usagePercent,entries:memEntries,source:memory.source});if(selected==="user"&&userProfile)return $jsx(MemoryPanel,{seg,theme,label:"User Profile",chars:userProfile.charCount,limit:userProfile.charLimit,pct:userProfile.usagePercent,entries:userEntries,source:userProfile.source});if(selected==="skills")return $jsx(SkillsPanel,{seg,theme});if(selected==="system_tools"&¤tTools){let{system}=classifyTools(currentTools.tools);return $jsx(ToolsPanel,{seg,theme,tools:system,kind:"system_tools"})}if(selected==="mcp_tools"&¤tTools){let{mcp}=classifyTools(currentTools.tools);return $jsx(ToolsPanel,{seg,theme,tools:mcp,kind:"mcp_tools"})}if(selected==="soul"&&soul){let soulSeg={...seg,section:{id:"soul",label:"SOUL.md",chars:soul.charCount,tokens:soul.tokenEstimate,text:soul.content,source:soul.source}};return $jsx(SectionPanel,{seg:soulSeg,theme})}if(selected==="conversation")return $jsx(ConvPanel,{seg,theme,messages,output});if(selected==="free")return $jsx(FreePanel,{seg,theme,ctxLen,comp:config?.compression,onEditThreshold:editThreshold});return $jsx(SectionPanel,{seg,theme})},breakdown=()=>$jsxs("box",{flexDirection:"column",marginBottom:1,children:[$jsxs("text",{children:[$jsx("strong",{children:"Breakdown"}),drilledGroup?$jsxs("span",{fg:theme.info,children:[" \xB7 ",drilledGroup.label," (",fmt2(drilledGroup.tokens)," tok)"]}):reliable?$jsx("span",{fg:theme.info,children:" (click group to expand)"}):$jsxs("span",{fg:theme.warning,children:[" \xB7 live usage unavailable \xB7 limit ",fmt2(ctxLen)]})]}),view.filter((s)=>s.tokens>0).map((s)=>$jsxs("text",{children:[$jsx("span",{fg:clr(s.id,theme),children:s.id==="free"?"\u25FB":"\u25FC"})," ",s.label," \u2014 ",fmt2(s.tokens)," (",s.percent.toFixed(1),"%)",s.children?$jsx("span",{fg:theme.textMuted,children:" \u25B8"}):null]},s.id)),output>0&&!drilled?$jsxs("text",{children:[$jsx("span",{fg:theme.success,children:"\u25FC"})," Output \u2014 ",fmt2(output)," tokens"]}):null,reliable&&!drilled?$jsx("text",{children:$jsxs("span",{fg:theme.textMuted,children:["\u25FC Beyond compression threshold (",Math.round(thresholdPct*100),"%)"]})}):null]}),crumb=drilled?`${drilledGroup?.label}${selected?` \xB7 ${findSeg(selected)?.label}`:""}`:reliable?"\u2191\u2193 nav \xB7 click a group to drill in":"live usage unavailable \xB7 estimates shown with ~",escHint=selected||drilled?" \xB7 Esc back":"",focus=selected||hovered,focusSeg=focus?findSeg(focus):null;return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsxs(TabShell,{title:reliable?`Context \xB7 ${fmt2(used)} / ${fmt2(ctxLen)} (${pct}%)`:`Context \xB7 live usage unavailable \xB7 limit ${fmt2(ctxLen)}`,children:[$jsx("box",{height:1,children:focusSeg?$jsxs("text",{fg:clr(focusSeg.id,theme),children:["\u25FC ",focusSeg.label," \u2014 ",fmt2(focusSeg.tokens)," tok (",focusSeg.percent.toFixed(1),"%)"]}):$jsx("text",{children:" "})}),$jsx("box",{height:1}),$jsxs("box",{flexDirection:"row",flexGrow:1,children:[$jsxs("box",{flexDirection:"column",marginRight:2,flexShrink:0,children:[!drilled&&compressions>0?$jsx("box",{height:1,marginBottom:1,children:$jsxs("text",{fg:theme.warning,children:["\xD7",compressions," compressed"]})}):null,$jsx("box",{border:!0,customBorderChars:CORNERS,borderColor:theme.border,children:[...Array(COLS2)].map((_2,row3)=>$jsx("box",{flexDirection:"row",height:1,children:[...Array(COLS2)].map((_3,col)=>{let cell=grid[row3*COLS2+col],hl=selected?selected===cell.id:hovered===cell.id,past=!drilled&&row3*COLS2+col>=thresholdIdx,glyph=!past&&cell.id==="free"?"\u25FB":"\u25FC";return $jsx("box",{height:1,width:2,backgroundColor:hl?clr(cell.id,theme):void 0,onMouseOver:()=>setHovered(cell.id),onMouseOut:()=>setHovered(null),onMouseDown:()=>click(cell.id),children:$jsx("text",{fg:past?theme.textMuted:clr(cell.id,theme),children:glyph})},col)})},row3))})]}),$jsx("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:selected?detail():breakdown()})]})]}),$jsx(HintBar,{raw:crumb+escHint})]})});var import_react64=__toESM(require_react_production(),1);init_hermes_analytics();var import_react63=__toESM(require_react_production(),1);init_hermes_analytics();var query=(days,opts)=>Promise.resolve(io.analytics(days,opts));function useAnalyticsData(days,tick3,load4=query){let[data2,setData]=import_react63.useState(()=>cache3.get(days)??null),[tools,setTools]=import_react63.useState(()=>cache3.get(days)?.byTool??null),[error,setError]=import_react63.useState(""),gen=import_react63.useRef(0);return import_react63.useEffect(()=>{let hit=cache3.get(days);setData(hit??null),setTools(hit?.byTool??null),setError("");let current=++gen.current;return load4(days,{tools:!1}).then((fast)=>{if(gen.current!==current)return;return setData(fast),load4(days).then((full)=>{if(gen.current!==current)return;cache3.set(days,full),setData(full),setTools(full.byTool)})}).catch((err)=>{if(gen.current===current)setError(err instanceof Error?err.message:String(err))}),()=>{gen.current++}},[days,tick3,load4]),{data:data2,tools,error}}var BLOCKS=" \u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",rows2=(vals,h2)=>{let peak=Math.max(1,...vals),ticks=vals.map((v2)=>Math.round(h2*8*v2/peak));return Array.from({length:h2},(_2,r)=>{let floor=(h2-1-r)*8;return ticks.map((t2)=>BLOCKS[Math.max(0,Math.min(8,t2-floor))]).join("")})},Chart=import_react64.memo((p)=>{let theme=useTheme().theme,days=p.data.byDay,vals=days.map((d2)=>d2.cost),peak=Math.max(...vals,0.01),axis=(v2)=>cost2(v2).padStart(7),md=(s)=>s.slice(5);return $jsxs("box",{flexDirection:"column",children:[rows2(vals,p.h).map((line2,i)=>$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:8,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:i===0?axis(peak):i===p.h-1?axis(0):""})}),$jsx("text",{fg:theme.primary,children:line2})]},i)),$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:8,flexShrink:0}),$jsx("text",{fg:theme.textMuted,children:days.length>0?`${md(days[0].date)}${" ".repeat(Math.max(0,days.length-10))}${md(days[days.length-1].date)}`:""})]})]})}),Rank=import_react64.memo((p)=>{let theme=useTheme().theme;if(p.rows===null)return $jsxs("box",{flexDirection:"column",flexGrow:1,flexBasis:0,minWidth:0,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:p.title})}),$jsx("box",{height:1,children:$jsx(Spinner,{label:"aggregating\u2026"})})]});let top2=p.rows.slice(0,p.n??10),peak=Math.max(1,...top2.map((r)=>r.n)),total=p.rows.reduce((a,r)=>a+r.n,0);return $jsxs("box",{flexDirection:"column",flexGrow:1,flexBasis:0,minWidth:0,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:p.title})}),top2.length===0?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"\u2014"})}):top2.map((r)=>$jsxs("box",{height:1,flexDirection:"row",children:[$jsx(Col,{w:18,children:trunc5(r.name,17)}),$jsx(Col,{w:12,fg:p.fg,children:"\u2587".repeat(Math.max(1,Math.round(10*r.n/peak)))}),$jsx(Col,{w:7,right:!0,children:fmt(r.n)}),$jsx(Col,{w:6,right:!0,fg:theme.textMuted,children:total?`${Math.round(100*r.n/total)}%`:""})]},r.name))]})}),Analytics=import_react64.memo((props)=>{let theme=useTheme().theme,dialog=useDialog(),dims=useTerminalDimensions(),[days,setDays]=import_react64.useState(7),[tick3,setTick]=import_react64.useState(0),{data:data2,tools,error}=useAnalyticsData(days,tick3,props.load),keys=useKeys();useKeyboard((key3)=>{if(!props.focused||dialog.open())return;if(keys.match("list.refresh",key3))return cache3.delete(days),setTick((n)=>n+1);if(key3.raw==="1")return setDays(1);if(key3.raw==="7")return setDays(7);if(key3.raw==="3")return setDays(30);if(key3.raw==="9")return setDays(90)});let t2=data2?.total,tok=(t2?.input??0)+(t2?.output??0),title=import_react64.useMemo(()=>!t2?`Analytics \xB7 ${days}d`:`Analytics \xB7 ${days}d \xB7 ${t2.sessions} sess \xB7 ${fmt(tok)} tok \xB7 ${cost2(t2.cost)}`,[days,t2,tok]),wide=dims.width>=110,chartH=dims.height>=40?8:6;if(!data2)return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsx(TabShell,{title,children:$jsx("box",{height:1,children:error?$jsx("text",{fg:theme.error,children:error}):$jsx(Spinner,{label:`aggregating ${days}d\u2026`})})}),$jsx(HintBar,{pairs:[["1/7/3/9","period"],[keys.print("list.refresh"),"reload"]]})]});let nTools=8,nSrc=6,ranksH=wide?Math.max(nTools,nSrc)+1:nTools+nSrc+3;return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsx(TabShell,{title,children:$jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,overflow:"hidden",children:[error?$jsx("box",{height:1,children:$jsx("text",{fg:theme.error,children:error})}):null,$jsxs("box",{flexShrink:0,flexDirection:"column",children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:`Cost per day \xB7 ${fmt(t2.input)} in \xB7 ${fmt(t2.output)} out \xB7 ${fmt(t2.cache)} cache \xB7 ${fmt(t2.calls)} tool calls`})}),$jsx(Chart,{data:data2,h:chartH})]}),$jsx("box",{height:1,flexShrink:0}),$jsx("box",{flexShrink:0,children:$jsxs(Hdr,{children:[$jsx(Col,{grow:!0,min:18,fg:theme.textMuted,children:"Model"}),$jsx(Col,{w:6,right:!0,fg:theme.textMuted,children:"sess"}),$jsx(Col,{w:9,right:!0,fg:theme.textMuted,children:"in"}),$jsx(Col,{w:9,right:!0,fg:theme.textMuted,children:"out"}),$jsx(Col,{w:9,right:!0,fg:theme.textMuted,children:"cache"}),$jsx(Col,{w:9,right:!0,fg:theme.textMuted,children:"cost"})]})}),$jsx("scrollbox",{scrollY:!0,flexGrow:1,flexShrink:1,minHeight:1,children:$jsx("box",{flexDirection:"column",width:"100%",children:data2.byModel.length===0?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"no sessions in range"})}):data2.byModel.map((m2)=>$jsxs("box",{height:1,flexDirection:"row",children:[$jsx(Col,{grow:!0,min:18,children:trunc5(m2.model,40)}),$jsx(Col,{w:6,right:!0,fg:theme.textMuted,children:String(m2.sessions)}),$jsx(Col,{w:9,right:!0,children:fmt(m2.input)}),$jsx(Col,{w:9,right:!0,children:fmt(m2.output)}),$jsx(Col,{w:9,right:!0,fg:theme.textMuted,children:fmt(m2.cache)}),$jsx(Col,{w:9,right:!0,fg:theme.accent,children:cost2(m2.cost)})]},m2.model))})}),$jsx("box",{height:1,flexShrink:0}),$jsxs("box",{flexShrink:0,height:ranksH,flexDirection:wide?"row":"column",gap:wide?2:1,children:[$jsx(Rank,{title:"Tools",rows:tools,fg:theme.success,n:nTools}),$jsx(Rank,{title:"Sources",rows:data2.bySource,fg:theme.info,n:nSrc})]})]})}),$jsx(HintBar,{pairs:[["1/7/3/9","period"],[keys.print("list.refresh"),"reload"]]})]})});var import_react66=__toESM(require_react_production(),1);import{tmpdir as tmpdir3}from"os";import{join as join12}from"path";import{rm}from"fs/promises";async function editInEditor(renderer,seed,suffix2=".md"){let cmd=process.env.VISUAL||process.env.EDITOR;if(!cmd)return;let path4=join12(tmpdir3(),`herm-${Date.now()}${suffix2}`);await Bun.write(path4,seed);let suspended=!1;try{renderer.suspend(),suspended=!0,renderer.currentRenderBuffer.clear();let argv=process.platform==="win32"?["cmd.exe","/d","/s","/c",`${cmd} "${path4.replaceAll('"','""')}"`]:["/bin/sh","-c",`exec ${cmd} "$1"`,"herm-editor",path4],code=await Bun.spawn(argv,{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited;if(code!==0)throw Error(`editor exited ${code}`);return(await Bun.file(path4).text().catch(()=>"")).trim()||void 0}finally{if(await rm(path4,{force:!0}).catch(()=>{}),suspended&&!renderer.isDestroyed)try{renderer.currentRenderBuffer.clear()}finally{renderer.resume(),renderer.requestRender()}}}function buildJourneyRows(buckets){return buckets.flatMap((bucket,b2)=>[...b2>0?[{kind:"gap"}]:[],{kind:"slice",bucket},...bucket.nodes.map((node,i)=>({kind:"node",bucket,node,last:i===bucket.nodes.length-1}))])}var style=(theme,key3,hex2)=>{if(hex2&&/^#[0-9a-fA-F]{6}([0-9a-fA-F]{2})?$/.test(hex2))return RGBA.fromHex(hex2);if(key3==="skill")return theme.primary;if(key3==="memory")return theme.accent;if(key3==="label")return theme.text;if(key3==="dim")return theme.textMuted;if(key3==="bg")return theme.borderSubtle;return theme.textMuted},last2=(data2)=>data2?.frames.at(-1)?.grid??[],latest2=(rows3)=>{let i=[...rows3].reverse().findIndex((r)=>r.kind==="node");return i>=0?rows3.length-1-i:Math.max(0,rows3.length-1)},snap=(rows3,i,dir=1)=>{if(rows3.length===0)return 0;let at=Math.max(0,Math.min(rows3.length-1,i));if(rows3[at]?.kind!=="gap")return at;let rev2=[...rows3].reverse().findIndex((r,n)=>rows3.length-1-n<at&&r.kind!=="gap");if(dir<0&&rev2>=0)return rows3.length-1-rev2;let fwd=rows3.findIndex((r,n)=>n>at&&r.kind!=="gap");if(fwd>=0)return fwd;return rev2>=0?rows3.length-1-rev2:at},message=(err)=>err instanceof Error?err.message:String(err),rid=(r,i)=>{if(!r)return`empty-${i}`;if(r.kind==="slice")return`slice-${r.bucket.index}-${r.bucket.date??r.bucket.label}`;if(r.kind==="node")return`node-${r.bucket.index}-${r.node.id}`;return`gap-${i}`},Journey=import_react66.memo((props)=>{let gw=useGateway(),theme=useTheme().theme,dialog=useDialog(),toast=useToast(),renderer=useRenderer(),dims=useTerminalDimensions(),keys=useKeys(),[data2,setData]=import_react66.useState(null),[err,setErr]=import_react66.useState(null),[sel,setSel]=import_react66.useState(0),[detail,setDetail]=import_react66.useState(null),[pane,setPane]=import_react66.useState("list"),[busy,setBusy]=import_react66.useState(!1),[tick3,setTick]=import_react66.useState(0),rows3=import_react66.useMemo(()=>buildJourneyRows(data2?.buckets??[]),[data2]),row3=rows3[Math.min(sel,Math.max(0,rows3.length-1))],node=row3?.kind==="node"?row3.node:void 0,chart=last2(data2),h2=Math.max(5,Math.min(8,Math.floor(dims.height*0.2))),cols=Math.max(40,dims.width-8),follow=useFollow("journey",(i)=>rid(rows3[i],i)),scroll=import_react66.useRef(null),seq=import_react66.useRef(0),jump=import_react66.useCallback((i)=>{let n=snap(rows3,i);setSel(n),follow.opts.scrollTo(n)},[rows3]),setListSel=import_react66.useCallback((next2)=>{setSel((prev)=>{let target=typeof next2==="function"?next2(prev):next2,n=snap(rows3,target,target-prev);return follow.opts.scrollTo(n),n})},[rows3]);import_react66.useEffect(()=>{let n=0,cb=async()=>{if(n++,n<2)return;follow.opts.scrollTo(sel),renderer.removeFrameCallback(cb)};return renderer.setFrameCallback(cb),()=>renderer.removeFrameCallback(cb)},[renderer,rows3,sel]),import_react66.useEffect(()=>{let n=++seq.current;setErr(null),setBusy(!0);let timer2=setTimeout(()=>{gw.request("learning.frames",{cols,rows:h2,frames:2}).then((r)=>{if(n!==seq.current)return;setData(r);let tree=buildJourneyRows(r.buckets??[]);setSel(latest2(tree)),setDetail(null),setPane("list")}).catch((e)=>{if(n===seq.current)setErr(message(e))}).finally(()=>{if(n===seq.current)setBusy(!1)})},120);return()=>{clearTimeout(timer2),seq.current++}},[gw,cols,h2,tick3]);let open2=import_react66.useCallback(async(target)=>{setBusy(!0),setErr(null);try{let r=await gw.request("learning.detail",{id:target.id});if(setDetail(r),setPane("detail"),!r.ok)toast.show({variant:"warning",message:r.message})}catch(e){setErr(message(e))}finally{setBusy(!1)}},[gw,toast]),edit=import_react66.useCallback(async()=>{if(!node)return;setBusy(!0),setErr(null);try{let info=await gw.request("learning.detail",{id:node.id});if(!info.ok){toast.show({variant:"warning",message:info.message});return}let text5=await editInEditor(renderer,info.content,info.kind==="skill"?".md":".txt");if(text5===void 0||text5.trim()===info.content.trim()){toast.show({variant:"info",message:"no changes"});return}let req={id:node.id,content:text5},r=await gw.request("learning.edit",req);if(toast.show({variant:r.ok?"success":"warning",message:r.message}),r.ok||/stale|refresh/i.test(r.message))setTick((n)=>n+1)}catch(e){setErr(message(e))}finally{setBusy(!1)}},[gw,node,renderer,toast]),del=import_react66.useCallback(async()=>{if(!node)return;if(!await openConfirm(dialog,{title:`Delete ${node.label}?`,body:`${node.fullLabel||node.label}
|
|
4128
4128
|
|
|
4129
|
-
This mutates the learning source through learning.delete.`,yes:"delete",danger:!0}))return;setBusy(!0),setErr(null);try{let req={id:node.id},r=await gw.request("learning.delete",req);if(toast.show({variant:r.ok?"success":"warning",message:r.message}),r.ok||/stale|refresh/i.test(r.message))setTick((n)=>n+1)}catch(e){setErr(message(e))}finally{setBusy(!1)}},[dialog,gw,node,toast]);useKeyboard((key3)=>{if(!props.focused||dialog.open()||busy)return;if(detail&&(key3.name==="tab"||keys.match("focus.cycle",key3))){setPane((p)=>p==="list"?"detail":"list");return}if(detail&&pane==="detail"){let page=Math.max(1,(scroll.current?.viewport.height??10)-1);if(key3.name==="escape"){setPane("list");return}if(key3.name==="up"||key3.name==="k"||key3.raw==="k"){scroll.current?.scrollBy(-1);return}if(key3.name==="down"||key3.name==="j"||key3.raw==="j"){scroll.current?.scrollBy(1);return}if(key3.name==="pageup"){scroll.current?.scrollBy(-page);return}if(key3.name==="pagedown"){scroll.current?.scrollBy(page);return}if(key3.name==="home"||key3.name==="g"){scroll.current?.scrollTo(0);return}if(key3.name==="end"||key3.raw==="G"||key3.name==="g"&&key3.shift){scroll.current?.scrollTo(scroll.current.scrollHeight);return}return}if(key3.name==="escape"&&detail){setDetail(null),setPane("list");return}if(handleListKey(keys,key3,{count:rows3.length,setSel:setListSel,...follow.opts,onActivate:()=>{if(node)open2(node)},onToggle:()=>{if(node)open2(node)},onRefresh:()=>setTick((n)=>n+1),onDelete:()=>void del()}))return;if(key3.name==="e"||key3.raw==="e"){edit();return}});let rowPick=import_react66.useCallback((i)=>jump(i),[jump]),rowOpen=import_react66.useCallback((i)=>{jump(i);let r=rows3[i];if(r?.kind==="node")open2(r.node)},[jump,open2,rows3]),hint=detail&&pane==="detail"?`\u2191\u2193/jk scroll ${keys.print("list.pageUp")}/${keys.print("list.pageDown")} page Tab list Esc list`:`${keys.print("list.activate")} detail ${keys.print("list.toggle")} detail e edit ${keys.print("list.delete")} delete ${keys.print("list.refresh")} reload${detail?" Tab detail Esc close":""}`;return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsxs("box",{flexDirection:"row",flexGrow:1,minWidth:0,children:[$jsxs(TabShell,{title:data2?`Journey \xB7 ${data2.count} learned item${data2.count===1?"":"s"}`:"Journey",error:err,focus:pane==="list",grow:detail?2:1,children:[!data2&&!err?$jsx(Loading,{}):null,!data2&&err?$jsx(ErrorState,{err}):null,data2&&data2.count===0?$jsx(Empty,{}):null,data2&&data2.count>0?$jsxs("box",{flexDirection:"column",flexGrow:1,minHeight:0,children:[$jsx(Legend,{data:data2}),$jsx(Chart2,{rows:chart,theme}),$jsx("box",{height:1}),$jsx("scrollbox",{ref:follow.ref,scrollY:!0,flexGrow:1,children:$jsx("box",{flexDirection:"column",children:rows3.map((r,i)=>$jsx(Row2,{id:follow.id(i),row:r,index:i,active:i===sel,theme,pick:rowPick,open:rowOpen},rid(r,i)))})})]}):null]}),detail?$jsx(Detail2,{detail,box:scroll,focus:pane==="detail",theme}):null]}),$jsx(HintBar,{raw:busy?"loading\u2026":hint})]})}),Loading=()=>{let theme=useTheme().theme;return $jsx("box",{flexGrow:1,justifyContent:"center",alignItems:"center",children:$jsx("text",{fg:theme.textMuted,children:"assembling learning map\u2026"})})},Empty=()=>{let theme=useTheme().theme;return $jsx("box",{flexGrow:1,justifyContent:"center",alignItems:"center",children:$jsx("text",{fg:theme.textMuted,children:"No learning yet \u2014 skills and memories will appear here."})})},ErrorState=({err})=>{let theme=useTheme().theme;return $jsx("box",{flexGrow:1,justifyContent:"center",alignItems:"center",children:$jsx("text",{fg:theme.error,wrapMode:"word",children:err})})},Legend=({data:data2})=>{let theme=useTheme().theme,text5=[...data2.legend??[],...data2.categories??[]].map((i)=>`${i.glyph} ${i.label}`).join(" ")||data2.summary.join(" ");return $jsx("box",{height:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:text5})})},Chart2=({rows:rows3,theme})=>$jsx("box",{flexDirection:"column",flexShrink:0,children:rows3.map((row3,i)=>$jsx("box",{height:1,overflow:"hidden",children:$jsx("text",{wrapMode:"none",children:row3.map((run,n)=>$jsx("span",{fg:style(theme,run[1],run[3]),children:run[0]},n))})},i))}),Row2=import_react66.memo((props)=>{let bg2=props.active?props.theme.backgroundElement:void 0,caret=props.active?"\u25B8 ":" ";if(props.row.kind==="gap")return $jsx("box",{id:props.id,height:1});if(props.row.kind==="slice")return $jsx("box",{id:props.id,height:1,backgroundColor:bg2,onMouseMove:()=>props.pick(props.index),onMouseDown:()=>props.open(props.index),overflow:"hidden",children:$jsxs("text",{wrapMode:"none",children:[$jsx("span",{fg:props.theme.textMuted,children:caret}),$jsx("span",{fg:props.active?props.theme.accent:props.theme.primary,children:props.row.bucket.label}),$jsx("span",{fg:props.theme.textMuted,children:` ${props.row.bucket.total} total \xB7 ${props.row.bucket.memories} memories \xB7 ${props.row.bucket.skills} skills`})]})});return $jsx("box",{id:props.id,height:1,backgroundColor:bg2,onMouseMove:()=>props.pick(props.index),onMouseDown:()=>props.open(props.index),overflow:"hidden",children:$jsxs("text",{wrapMode:"none",children:[$jsx("span",{fg:props.theme.textMuted,children:caret}),$jsx("span",{fg:props.theme.textMuted,children:props.row.last?" \u2514\u2500 ":" \u251C\u2500 "}),$jsx("span",{fg:props.active?props.theme.accent:style(props.theme,props.row.node.style),children:`${props.row.node.glyph} ${trunc5(props.row.node.fullLabel||props.row.node.label,54)}`}),$jsx("span",{fg:props.theme.textMuted,children:props.row.node.meta?` ${props.row.node.meta}`:""})]})})}),Detail2=(props)=>$jsx(TabShell,{title:props.detail.ok?`${props.detail.kind} \xB7 ${props.detail.label}`:"Detail",focus:props.focus,grow:1,children:props.detail.ok?$jsx("scrollbox",{ref:props.box,scrollY:!0,flexGrow:1,children:$jsx("box",{flexDirection:"column",width:"100%",children:props.detail.content.split(/\r?\n/).map((line2,i)=>$jsx("box",{minHeight:1,children:$jsx("text",{fg:props.theme.text,wrapMode:"word",children:line2||" "})},i))})}):$jsx("text",{fg:props.theme.warning,wrapMode:"word",children:props.detail.message})});var import_react68=__toESM(require_react_production(),1);var SubTabBar=import_react68.memo((props)=>$jsx(TabStrip,{...props}));var TABS=[{name:"Chat",description:"Main chat interface"},{name:"Sessions",description:"Sessions, context, analytics"},{name:"Profiles & Automation",description:"Profiles, cron jobs, kanban boards"},{name:"Config",description:"Config, env, skills, toolsets, memory"},{name:"Eikon",description:"Avatar studio & library"}],TAB_MAX=TABS.length-1,CHAT_TAB=0,SESSIONS_TAB=1,AUTOMATION_TAB=2,CONFIG_TAB=3,EIKON_TAB=4,SUB_TABS={[1]:["List","Context","Analytics","Journey"],[2]:["Kanban","Profiles","Cron"],[3]:["Config","Skills","Toolsets","Env","Memory"],[4]:["Library","Catalog","Studio"]},TAB_SLASH={chat:{tab:0,sub:0},sessions:{tab:1,sub:0},context:{tab:1,sub:1},analytics:{tab:1,sub:2},insights:{tab:1,sub:2},journey:{tab:1,sub:3},learning:{tab:1,sub:3},"memory-graph":{tab:1,sub:3},kanban:{tab:2,sub:0},automation:{tab:2,sub:0},profiles:{tab:2,sub:1},agents:{tab:2,sub:1},cron:{tab:2,sub:2},config:{tab:3,sub:0},skills:{tab:3,sub:1},toolsets:{tab:3,sub:2},env:{tab:3,sub:3},memory:{tab:3,sub:4},library:{tab:4,sub:0},catalog:{tab:4,sub:1},studio:{tab:4,sub:2}};var SessionsGroup=import_react69.memo((props)=>{let labels=SUB_TABS[SESSIONS_TAB];import_react69.useEffect(()=>{if(props.sub>=labels.length)props.setSub(0)},[props.sub,labels.length]);let hint="shift+\u2190/\u2192 sub";return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsx(SubTabBar,{tabs:labels,active:props.sub,onChange:props.setSub,hint}),$jsxs("box",{flexGrow:1,minWidth:0,flexDirection:"column",children:[$jsx(Pane,{visible:props.sub===0,children:$jsx(Sessions,{focused:!!props.focused&&props.sub===0,onSwitch:props.onSwitch,onActivateLive:props.onActivateLive,currentId:props.currentId})}),$jsx(Pane,{visible:props.sub===1,children:$jsx(Context,{focused:!!props.focused&&props.sub===1,messages:props.messages,sessionStart:props.sessionStart,info:props.info,usage:props.usage})}),$jsx(Pane,{visible:props.sub===2,children:$jsx(Analytics,{focused:!!props.focused&&props.sub===2})}),$jsx(Pane,{visible:props.sub===3,children:$jsx(Journey,{focused:!!props.focused&&props.sub===3})})]})]})}),Pane=({visible:visible2,children:children2})=>visible2?$jsx("box",{flexGrow:1,minWidth:0,minHeight:0,flexDirection:"column",children:children2}):null;var import_react94=__toESM(require_react_production(),1);var import_react83=__toESM(require_react_production(),1);var acc=new Map;function record(ev,p){let id=p.subagent_id;if(!id)return;let now=Date.now()/1000;if(ev==="start"){acc.set(id,{subagent_id:id,parent_id:p.parent_id??null,depth:p.depth??0,goal:p.goal,model:p.model,started_at:now,tool_count:0,status:"running",trail:[]});return}let r=acc.get(id);if(!r)return;if(ev==="tool"&&p.tool_name){r.tool_count++,r.trail=[...r.trail??[],{name:p.tool_name,preview:p.tool_preview}].slice(-20);return}if(ev==="complete")r.status=p.status??"completed",r.finished_at=now,r.input_tokens=p.input_tokens,r.output_tokens=p.output_tokens,r.cost_usd=p.cost_usd}function trail(id){return acc.get(id)?.trail??[]}function flush(gw,sessionId){if(acc.size===0)return;let subagents=[...acc.values()];acc.clear();let label2=(subagents.filter((s)=>s.parent_id==null).slice(0,2).map((s)=>s.goal).join(" \xB7 ")||`${subagents.length} subagents`).slice(0,120),started=Math.min(...subagents.map((s)=>s.started_at));gw.request("spawn_tree.save",{session_id:sessionId,label:label2,started_at:started,finished_at:Date.now()/1000,subagents}).catch(()=>{})}var import_react72=__toESM(require_react_production(),1);var import_react70=__toESM(require_react_production(),1);var DialogSelect=(props)=>{let filterable=props.filterable??!0,[filter,setFilter]=import_react70.useState(""),[cursor,setCursor]=import_react70.useState(0),mode2=import_react70.useRef("kb"),moved=import_react70.useRef(!1),sb=import_react70.useRef(null),theme=useTheme().theme,opts=import_react70.useMemo(()=>props.options.map((o)=>({name:`${props.current==null?"":o.value===props.current?"\u25CF ":" "}${o.title}`,description:o.hint?[o.description,o.hint].filter(Boolean).join(" \u2014 "):o.description??"",value:o.value})),[props.current,props.options]),sel=props.current==null?0:Math.max(0,props.options.findIndex((o)=>o.value===props.current)),desc=props.options.some((o)=>!!o.description||!!o.hint),filtered=import_react70.useMemo(()=>{let lower=filter.toLowerCase();return props.options.filter((o)=>o.title.toLowerCase().includes(lower)||(o.description??"").toLowerCase().includes(lower))},[filter,props.options]),groups=import_react70.useMemo(()=>{let map=new Map;return filtered.forEach((o)=>{let cat=o.category??"",arr=map.get(cat)??[];arr.push(o),map.set(cat,arr)}),map},[filtered]),rowId=(i)=>`ds-row-${i}`,scrollTo=(i)=>sb.current?.scrollChildIntoView(rowId(i));import_react70.useEffect(()=>{if(cursor>=filtered.length)setCursor(Math.max(0,filtered.length-1))},[filtered.length,cursor]),import_react70.useEffect(()=>{if(!props.current){setCursor(0);return}let i=filtered.findIndex((o)=>o.value===props.current),n=Math.max(0,i);setCursor(n),scrollTo(n)},[props.current,filtered]),import_react70.useEffect(()=>{if(!moved.current)return;moved.current=!1;let item=filtered[cursor];if(item&&props.onMove)props.onMove(item)},[cursor,filtered,props.onMove]);let keys=useKeys();useKeyboard((key3)=>{if(!filterable)return;if(handleListKey(keys,key3,{count:filtered.length,setSel:(fn)=>{mode2.current="kb",moved.current=!0,setCursor(fn)},scrollTo,page:Math.max(1,(sb.current?.viewport.height??10)-1),onActivate:()=>{let item=filtered[cursor];if(item)props.onSelect(item)}}))return;if(props.onKey?.(key3))return});let idx=0,entries2=Array.from(groups.entries());if(!filterable)return $jsxs("box",{flexDirection:"column",width:60,children:[$jsx("text",{fg:theme.text,children:$jsx("strong",{children:props.title})}),$jsx("box",{height:1}),$jsx("select",{focused:!0,width:58,height:Math.min(16,Math.max(1,props.options.length*(desc?2:1))),options:opts,selectedIndex:sel,showDescription:desc,showScrollIndicator:props.options.length>8,backgroundColor:theme.backgroundPanel,focusedBackgroundColor:theme.backgroundPanel,textColor:theme.textMuted,focusedTextColor:theme.text,selectedBackgroundColor:theme.backgroundElement,selectedTextColor:theme.text,descriptionColor:theme.textMuted,selectedDescriptionColor:theme.textMuted,fastScrollStep:Math.max(1,props.options.length),keyBindings:[{name:"home",action:"move-up-fast"},{name:"end",action:"move-down-fast"},{name:"pageup",action:"move-up-fast"},{name:"pagedown",action:"move-down-fast"},{name:"space",action:"select-current"},{name:" ",action:"select-current"}],onChange:(i)=>{let item=props.options[i];if(item&&props.onMove)props.onMove(item)},onSelect:(i)=>{let item=props.options[i];if(item)props.onSelect(item)}}),props.footer!=null?$jsx("box",{paddingTop:1,children:props.footer}):null]});return $jsxs("box",{flexDirection:"column",width:60,children:[$jsx("text",{fg:theme.text,children:$jsx("strong",{children:props.title})}),$jsx("box",{height:1}),filterable?$jsxs($Fragment,{children:[$jsx("input",{value:filter,onInput:(v2)=>{mode2.current="kb",setFilter(v2)},placeholder:props.placeholder??"Type to filter...",focused:!0,textColor:theme.text,placeholderColor:theme.textMuted,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement}),$jsx("box",{height:1})]}):null,$jsxs("scrollbox",{ref:sb,scrollY:!0,maxHeight:16,focused:!filterable,contentOptions:{flexDirection:"column"},paddingRight:1,children:[filtered.length===0?$jsx("text",{fg:theme.textMuted,children:"No results found"}):null,entries2.map(([cat,items])=>{let elements=[];if(cat)elements.push($jsx("text",{fg:theme.textMuted,children:$jsx("strong",{children:cat})},`cat-${cat}`));return items.forEach((item)=>{let i=idx++,active2=i===cursor,current=item.value===props.current;elements.push($jsxs("box",{id:rowId(i),flexDirection:"row",backgroundColor:active2?theme.backgroundElement:void 0,onMouseMove:()=>{mode2.current="mouse",moved.current=!0,setCursor((c)=>c===i?c:i)},onMouseOver:()=>{if(mode2.current==="mouse")moved.current=!0,setCursor(i)},onMouseDown:()=>props.onSelect(item),paddingLeft:1,paddingRight:1,children:[$jsx("box",{flexGrow:1,height:1,overflow:"hidden",children:$jsxs("text",{fg:active2?theme.text:theme.textMuted,children:[current?"\u25CF ":" ",item.title,item.description?` \u2014 ${item.description}`:""]})}),item.hint?$jsx("box",{flexShrink:0,height:1,children:$jsx("text",{fg:theme.textMuted,children:item.hint})}):null]},item.value))}),elements}).flat()]}),props.footer!=null?$jsx("box",{paddingTop:1,children:props.footer}):null]})};var Ctx6=import_react72.createContext(null),CommandProvider=({children:children2})=>{let registry=import_react72.useRef(new Map),enabled2=import_react72.useRef(!0),dialog=useDialog(),keys=useKeys(),all=import_react72.useCallback(()=>{let out=[];return registry.current.forEach((cmds)=>cmds.forEach((c)=>out.push(c))),out},[]),register=import_react72.useCallback((cmds)=>{let id=String(Date.now())+Math.random();return registry.current.set(id,cmds),()=>{registry.current.delete(id)}},[]),setEnabled=import_react72.useCallback((val)=>{enabled2.current=val},[]),open2=import_react72.useCallback(()=>{let cmds=all(),options=cmds.map((c)=>({title:c.title,value:c.value,description:c.description,hint:c.action?keys.print(c.action):void 0,category:c.category}));dialog.replace($jsx(DialogSelect,{title:"Command Palette",options,onSelect:(opt)=>{dialog.clear();let found=cmds.find((c)=>c.value===opt.value);if(found)found.onSelect()},placeholder:"Search commands..."}))},[all,dialog,keys]);useKeyboard((key3)=>{if(!enabled2.current||dialog.open())return;if(keys.match("palette.open",key3))return open2();for(let c of all())if(c.action&&keys.match(c.action,key3))return c.onSelect()});let value=import_react72.useMemo(()=>({register,setEnabled}),[register,setEnabled]);return $jsx(Ctx6.Provider,{value,children:children2})},useCommand=makeUse(Ctx6,"useCommand");var import_react74=__toESM(require_react_production(),1);function openAlert(dialog,title,body){dialog.replace($jsx(Alert,{title,body,onClose:()=>dialog.clear()}))}var Alert=(props)=>{let theme=useTheme().theme,keys=useKeys(),[copied2,setCopied]=import_react74.useState(!1),doCopy=()=>{copy2(props.body),setCopied(!0),setTimeout(()=>setCopied(!1),900)};return useKeyboard((key3)=>{if(keys.match("dialog.cancel",key3)||keys.match("dialog.accept",key3))props.onClose();if(keys.match("dialog.copy",key3))doCopy()}),$jsxs("box",{flexDirection:"column",width:84,maxHeight:28,border:["left"],borderColor:theme.info,customBorderChars:LEFT_BAR,backgroundColor:theme.backgroundPanel,paddingLeft:2,paddingRight:2,paddingY:1,gap:1,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.info,children:"\u25C8 "}),$jsx("span",{fg:theme.text,children:props.title})]})}),$jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsx("text",{fg:theme.text,wrapMode:"word",children:props.body})}),$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:`${keys.print("dialog.cancel")} close \xB7 ${keys.print("dialog.copy")} `})}),$jsx("box",{flexShrink:0,onMouseDown:(e)=>{e.stopPropagation(),doCopy()},children:$jsx("text",{fg:copied2?theme.success:theme.textMuted,children:$jsx("u",{children:copied2?"copied":"copy"})})})]})]})};var Status=({s})=>{let theme=useTheme().theme,fg2=s==="completed"?theme.success:s==="failed"?theme.error:s==="error"?theme.error:s==="timeout"?theme.error:s==="interrupted"?theme.warning:theme.textMuted;return $jsx("span",{fg:fg2,children:s})},SnapshotView=(props)=>{let theme=useTheme().theme,subs2=props.snap.subagents??[],tok=subs2.reduce((n,s)=>n+(s.input_tokens??0)+(s.output_tokens??0),0),span2=props.snap.started_at&&props.snap.finished_at?dur2(props.snap.finished_at-props.snap.started_at):"\u2014";return $jsxs("box",{flexDirection:"column",width:80,children:[$jsx("text",{fg:theme.text,children:$jsx("strong",{children:props.entry.label||`${subs2.length} subagents`})}),$jsxs("text",{fg:theme.textMuted,children:[when(props.entry.finished_at)," \xB7 ",span2," \xB7 ",subs2.length," agents \xB7 ",fmt(tok)," tok"]}),$jsx("box",{height:1}),$jsx("scrollbox",{scrollY:!0,maxHeight:20,contentOptions:{flexDirection:"column"},children:subs2.map((s)=>$jsxs("box",{flexDirection:"column",marginBottom:1,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:"\u2503 "+"\xB7 ".repeat(s.depth)}),$jsx("span",{fg:theme.text,children:trunc5(s.goal.replace(/\s+/g," "),60)})]})}),$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:["\u2503 "+" ".repeat(2*s.depth+2),$jsx(Status,{s:s.status}),` \xB7 ${s.tool_count}t`,s.finished_at?` \xB7 ${dur2(s.finished_at-s.started_at)}`:"",s.model?` \xB7 ${s.model}`:""]})})]},s.subagent_id))})]})};function openSpawnHistory(dialog,gw,sessionId){dialog.replace($jsx("box",{width:40,height:3,children:$jsx("text",{children:"Loading spawn history\u2026"})}));let listToken=dialog.version();gw.request("spawn_tree.list",{session_id:sessionId,limit:50}).then((r)=>{if(dialog.version()!==listToken)return;let entries2=r.entries??[];dialog.replace($jsx(DialogSelect,{title:"Spawn history",placeholder:entries2.length?"filter\u2026":"no saved spawn trees",options:entries2.map((e)=>({value:e.path,title:`${e.count.toString().padStart(2)}\xD7 ${trunc5(e.label||"(unlabeled)",40)}`,description:when(e.finished_at),category:e.session_id===sessionId?"This session":e.session_id})),onSelect:(opt)=>{let entry2=entries2.find((e)=>e.path===opt.value);dialog.replace($jsx("box",{width:40,height:3,children:$jsx("text",{children:"Loading spawn tree\u2026"})}));let token=dialog.version();gw.request("spawn_tree.load",{path:entry2.path}).then((snap2)=>{if(dialog.version()===token)dialog.replace($jsx(SnapshotView,{entry:entry2,snap:snap2}))}).catch((e)=>{if(dialog.version()===token)openAlert(dialog,"Spawn history",e instanceof Error?e.message:String(e))})}}))}).catch((e)=>{if(dialog.version()===listToken)openAlert(dialog,"Spawn history",e instanceof Error?e.message:String(e))})}var import_react77=__toESM(require_react_production(),1);var Dialog=(props)=>{let theme=useTheme().theme,keys=useKeys();useKeyboard((key3)=>{if(keys.match("dialog.cancel",key3)||keys.match("dialog.accept",key3))return props.onClose()});let d2=props.d,req=d2.env_requires.filter((e)=>e.required),opt=d2.env_requires.filter((e)=>!e.required),link2=d2.source?{file:d2.source,relative:d2.source,label:d2.source}:props.yaml,when2=d2.installed_at?Date.parse(d2.installed_at):NaN;return $jsxs("box",{flexDirection:"column",minWidth:62,gap:1,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:`Distribution \xB7 ${props.profile}`})})}),$jsxs("box",{flexDirection:"column",children:[$jsx(KVBlock,{rows:[["Name",d2.name],["Version",`v${d2.version}`],["Requires",d2.hermes_requires?`Hermes ${d2.hermes_requires}`:void 0],["Author",d2.author||void 0],["License",d2.license||void 0],["Description",d2.description||void 0]]}),$jsx(KVLink,{label:"Source",source:link2,text:d2.source||props.yaml.label}),$jsx(KVBlock,{rows:[["Installed",Number.isFinite(when2)?ago(when2/1000):void 0],["Owned",d2.distribution_owned.length?d2.distribution_owned.join(", "):void 0]]})]}),d2.env_requires.length?$jsxs("box",{flexDirection:"column",children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.info,children:$jsx("strong",{children:"Environment variables"})})}),req.length?$jsxs($Fragment,{children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Required"})}),req.map((e)=>$jsx(EnvRow,{name:e.name,desc:e.description,fallback:e.default},e.name))]}):null,opt.length?$jsxs($Fragment,{children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Optional"})}),opt.map((e)=>$jsx(EnvRow,{name:e.name,desc:e.description,fallback:e.default},e.name))]}):null]}):null,$jsx("box",{height:1,children:$jsx("text",{fg:theme.borderSubtle,children:`[${keys.print("dialog.cancel")}] close`})})]})},EnvRow=(props)=>{let theme=useTheme().theme,tail=[props.desc,props.fallback?`default: ${props.fallback}`:""].filter(Boolean).join(" \xB7 ");return $jsxs("box",{flexDirection:"row",minHeight:1,children:[$jsx("box",{width:2,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:" "})}),$jsx("box",{width:22,flexShrink:0,children:$jsx("text",{fg:theme.accent,children:props.name})}),$jsx("box",{flexGrow:1,minWidth:0,children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:tail})})]})};function openDistributionInfo(dialog,opts){dialog.replace($jsx(Dialog,{profile:opts.profile,d:opts.d,yaml:opts.yaml,onClose:()=>dialog.clear()}))}function openProfileMenu(dialog,p,ops){let opts=[...ops.switch&&!p.is_active?[{category:"Switch",value:"switch",title:`Switch to '${p.name}'`,description:"restart gateway under this HERMES_HOME \u2014 ends current session"}]:[],{category:"Open",value:"soul",title:"SOUL.md",description:"edit persona/system prompt"},{category:"Open",value:"config",title:"config.yaml",description:"model, provider, toolsets"},...p.has_env?[{category:"Open",value:"env",title:".env",description:"API keys + secrets"}]:[],{category:"Open",value:"dir",title:"Directory",description:p.path},...p.distribution?[{category:"Distribution",value:"dist-info",title:"Info",description:`v${p.distribution.version}${p.distribution.source?` \xB7 ${p.distribution.source}`:""}`},{category:"Distribution",value:"dist-update",title:"Update",description:`hermes profile update ${p.name}${p.is_active?" \xB7 ends current session":""}`}]:[],...p.is_sticky?[{category:"Default",value:"unsticky",title:"Clear sticky default",description:"hermes profile use --clear"}]:[{category:"Default",value:"sticky",title:"Set as sticky default",description:`hermes profile use ${p.name}`}],{category:"Manage",value:"export",title:"Export",description:`hermes profile export ${p.name}`},...p.is_default||p.is_active?[]:[{category:"Manage",value:"delete",title:"Delete",description:"irreversible \u2014 removes config, env, memory, sessions"}]];dialog.replace($jsx(DialogSelect,{title:`Profile \xB7 ${p.name}${p.is_active?" (active)":""}`,options:opts,onSelect:(o)=>{if(o.value==="dist-info"){if(!p.distribution)return dialog.clear();return openDistributionInfo(dialog,{profile:p.name,d:p.distribution,yaml:p.sources.distribution})}if(o.value==="dist-update"){if(!p.distribution)return dialog.clear();return openUpdateDistribution(dialog,p,(force)=>ops.update(p,force))}if(dialog.clear(),o.value==="switch")return ops.switch?.();if(o.value==="soul")return openFile(p.sources.soul.file);if(o.value==="config")return openFile(p.sources.config.file);if(o.value==="env")return openFile(p.sources.env.file);if(o.value==="dir")return openFile(p.path);if(o.value==="sticky")return ops.sticky(p);if(o.value==="unsticky")return ops.unsticky();if(o.value==="export")return ops.export(p);if(o.value==="delete")return ops.remove(p)}}))}var UpdateForm=(props)=>{let theme=useTheme().theme,keys=useKeys(),[force,setForce]=import_react77.useState(!1);useKeyboard((key3)=>{if(keys.match("dialog.cancel",key3)||keys.match("dialog.deny",key3))return props.done(null);if(keys.match("dialog.confirm",key3)||keys.match("dialog.accept",key3))return props.done(force);if(key3.name==="space"||key3.name===" ")return setForce((f)=>!f)});let d2=props.p.distribution;return $jsxs("box",{flexDirection:"column",width:62,gap:1,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.warning,children:$jsx("strong",{children:"Update distribution?"})})}),$jsxs("box",{flexDirection:"column",children:[$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:`'${props.p.name}' \xB7 v${d2.version}${d2.source?` \xB7 ${d2.source}`:""}`})}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",fg:theme.textMuted,children:"Re-pulls from source; distribution-owned files are overwritten."})}),props.p.is_active?$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",fg:theme.warning,children:"\u26A0 This is the active profile. The gateway will re-spawn "+"and the current session will end."})}):null]}),$jsx("box",{height:1,children:$jsx("text",{fg:force?theme.warning:theme.textMuted,children:`${force?"[x]":"[ ]"} --force-config \xB7 also overwrite config.yaml`})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:`[${keys.print("dialog.confirm")}] update [Space] toggle force [${keys.print("dialog.cancel")}] cancel`})})]})};function openUpdateDistribution(dialog,p,onConfirm){dialog.replace($jsx(UpdateForm,{p,done:(force)=>{if(dialog.clear(),force!==null)onConfirm(force)}}))}var import_react79=__toESM(require_react_production(),1);import{existsSync as existsSync18,readFileSync as readFileSync11}from"fs";import{readdir as readdir2}from"fs/promises";import{homedir as homedir7}from"os";import{join as join13,basename as basename9,dirname as dirname8}from"path";import{Database as Database2}from"bun:sqlite";var home4=()=>process.env.HOME||homedir7(),hermesHome=()=>process.env.HERMES_HOME||join13(home4(),".hermes");function root2(){let hh=hermesHome(),parent2=dirname8(hh);return basename9(parent2)==="profiles"?dirname8(parent2):hh}function profileNameFrom(hh){let parent2=dirname8(hh);return basename9(parent2)==="profiles"?basename9(hh):"default"}function activeProfileName(){return profileNameFrom(hermesHome())}function stickyDefault(){try{return readFileSync11(join13(root2(),"active_profile"),"utf-8").trim()||null}catch{return null}}var ID_RE=/^[a-z0-9][a-z0-9_-]{0,63}$/;function resolveProfileHome(name){if(name==="default")return root2();if(!ID_RE.test(name))return null;let dir=join13(root2(),"profiles",name);return existsSync18(dir)?dir:null}function readModel(dir){try{let raw=readFileSync11(join13(dir,"config.yaml"),"utf-8"),block=raw.split(/^model:\s*$/m)[1]?.split(/^\S/m)[0]??"",m2=block.match(/^\s+(?:default|model):\s*(.+)$/m)?.[1]?.trim()??raw.match(/^model:\s*(\S.+)$/m)?.[1]?.trim(),p=block.match(/^\s+provider:\s*(.+)$/m)?.[1]?.trim(),clean5=(s)=>s?.replace(/^["']|["']$/g,"")??null;return[clean5(m2),clean5(p)]}catch{return[null,null]}}async function countSkills(dir){let glob=new Bun.Glob("**/SKILL.md"),n=0;try{for await(let _2 of glob.scan({cwd:join13(dir,"skills"),onlyFiles:!0}))n++}catch{}return n}function gatewayRunning(dir){try{let raw=readFileSync11(join13(dir,"gateway.pid"),"utf-8").trim(),pid2=raw.startsWith("{")?Number(JSON.parse(raw).pid):Number(raw);if(!Number.isFinite(pid2)||pid2<=0)return!1;return process.kill(pid2,0),!0}catch{return!1}}function soul(dir){try{return readFileSync11(join13(dir,"SOUL.md"),"utf-8").replace(/^#[^\n]*\n+/,"").replace(/^\s+/,"").slice(0,400)}catch{return""}}function readDistributionManifest(dir){let path4=join13(dir,"distribution.yaml");if(!existsSync18(path4))return null;let data2=(()=>{try{return $parse(readFileSync11(path4,"utf-8"))}catch{return null}})();if(!data2||typeof data2!=="object"||Array.isArray(data2))return null;let d2=data2,name=typeof d2.name==="string"?d2.name.trim():"";if(!name)return null;let envs=(Array.isArray(d2.env_requires)?d2.env_requires:[]).flatMap((e)=>{if(!e||typeof e!=="object")return[];let r=e,n=typeof r.name==="string"?r.name.trim():"";if(!n)return[];return[{name:n,description:typeof r.description==="string"?r.description:"",required:r.required===void 0?!0:Boolean(r.required),default:typeof r.default==="string"?r.default:null}]}),owned=(Array.isArray(d2.distribution_owned)?d2.distribution_owned:[]).map((p)=>typeof p==="string"?p.trim().replace(/\/+$/,""):"").filter((p)=>p.length>0);return{name,version:typeof d2.version==="string"?d2.version:"0.1.0",description:typeof d2.description==="string"?d2.description:"",hermes_requires:typeof d2.hermes_requires==="string"?d2.hermes_requires:"",author:typeof d2.author==="string"?d2.author:"",license:typeof d2.license==="string"?d2.license:"",env_requires:envs,distribution_owned:owned,source:typeof d2.source==="string"?d2.source:"",installed_at:typeof d2.installed_at==="string"?d2.installed_at:""}}var src2=(file,label2)=>({file,relative:file.replace(home4()+"/","~/"),label:label2});async function info(name,dir,active2,sticky){let[model,provider]=readModel(dir),alias=join13(home4(),".local","bin",name);return{name,path:dir,is_default:name==="default",is_active:name===active2,is_sticky:name===sticky,gateway_running:gatewayRunning(dir),model,provider,has_env:existsSync18(join13(dir,".env")),skill_count:await countSkills(dir),has_alias:name!=="default"&&existsSync18(alias),soul_preview:soul(dir),distribution:readDistributionManifest(dir),sources:{dir:src2(dir,dir.replace(home4()+"/","~/")),config:src2(join13(dir,"config.yaml"),"config.yaml"),soul:src2(join13(dir,"SOUL.md"),"SOUL.md"),env:src2(join13(dir,".env"),".env"),distribution:src2(join13(dir,"distribution.yaml"),"distribution.yaml")}}}async function listProfiles(activeHome){let r=root2(),active2=profileNameFrom(activeHome??hermesHome()),sticky=stickyDefault(),jobs=[];if(existsSync18(r))jobs.push(info("default",r,active2,sticky));let pr=join13(r,"profiles");if(existsSync18(pr))for(let e of await readdir2(pr,{withFileTypes:!0})){if(!e.isDirectory()||!ID_RE.test(e.name))continue;jobs.push(info(e.name,join13(pr,e.name),active2,sticky))}return Promise.all(jobs)}function validateName(name,existing){if(!ID_RE.test(name))return"must match [a-z0-9][a-z0-9_-]{0,63}";if(existing.includes(name))return"already exists";if(["hermes","default","test","tmp","root","sudo"].includes(name))return"reserved name";return null}function readPrefs(dir){try{let raw=JSON.parse(readFileSync11(join13(dir,"herm","tui.json"),"utf-8"));return{theme:raw.theme,eikon:raw.eikon??(raw.eikonPath?basename9(raw.eikonPath,".eikon"):void 0),keys:raw.keys?Object.keys(raw.keys).length:0}}catch{return null}}async function profileStats(dir){let sessions=null,messages=null,dbPath=join13(dir,"state.db");if(existsSync18(dbPath))try{let db=new Database2(dbPath,{readwrite:!0,create:!1}),r=db.query("SELECT COUNT(*) AS s FROM sessions WHERE message_count > 0").get(),m2=db.query("SELECT COALESCE(SUM(message_count), 0) AS m FROM sessions").get();sessions=r.s,messages=m2.m,db.close()}catch{}let crons=null;try{let jobs=await Bun.file(join13(dir,"cron","jobs.json")).json();crons=Array.isArray(jobs)?jobs.length:jobs&&typeof jobs==="object"&&Array.isArray(jobs.jobs)?jobs.jobs.length:0}catch{crons=existsSync18(join13(dir,"cron"))?0:null}return{sessions,messages,crons,prefs:readPrefs(dir)}}var ORDER3=["name","clone","alias"];function openCreateProfile(dialog,opts){return new Promise((resolve4)=>{let done=(r)=>{dialog.clear(),resolve4(r)};dialog.replace($jsx(Form,{existing:opts.existing,done}))})}var Form=({existing,done})=>{let theme=useTheme().theme,[name,setName]=import_react79.useState(""),[cloneIdx,setCloneIdx]=import_react79.useState(0),[alias,setAlias]=import_react79.useState(!0),[field,setField]=import_react79.useState("name"),options=["(fresh)",...existing],err=name?validateName(name,existing):null,valid=!!name&&!err,submit2=()=>{if(!valid)return;done({name,cloneFrom:cloneIdx===0?null:options[cloneIdx],alias})},moveField=(dir)=>{let i=ORDER3.indexOf(field);setField(ORDER3[(i+dir+ORDER3.length)%ORDER3.length])};useKeyboard((key3)=>{if(key3.name==="escape")return done(null);if(key3.name==="tab")return moveField(key3.shift?-1:1);if(key3.name==="return")return submit2();if(field==="name"){if(key3.name==="backspace")return setName((n)=>n.slice(0,-1));if(key3.raw&&key3.raw.length===1&&/[a-z0-9_-]/.test(key3.raw))return setName((n)=>n+key3.raw);return}if(field==="clone"){if(key3.name==="up")return setCloneIdx((i)=>Math.max(0,i-1));if(key3.name==="down")return setCloneIdx((i)=>Math.min(options.length-1,i+1));return}if(field==="alias"){if(key3.name==="space"||key3.name===" ")return setAlias((a)=>!a)}});let focusBg=(f)=>field===f?theme.backgroundElement:void 0;return $jsxs("box",{flexDirection:"column",width:54,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"New Profile"})})}),$jsx("box",{height:1}),$jsxs("box",{height:1,flexDirection:"row",backgroundColor:focusBg("name"),children:[$jsx("box",{width:11,children:$jsx("text",{fg:theme.textMuted,children:"Name"})}),$jsxs("text",{children:[$jsx("span",{fg:valid||!name?theme.text:theme.error,children:name}),field==="name"?$jsx("span",{fg:theme.accent,children:"\u2588"}):null]})]}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:" a-z 0-9 _ - \xB7 lowercase"})}),$jsx("box",{height:1}),$jsx("box",{height:1,backgroundColor:focusBg("clone"),children:$jsx("text",{fg:theme.textMuted,children:"Clone from (\u2191\u2193)"})}),options.map((o,i)=>$jsx("box",{height:1,backgroundColor:focusBg("clone"),children:$jsxs("text",{fg:i===cloneIdx?theme.accent:theme.text,children:[i===cloneIdx?"\u25B8 ":" ",o]})},o)),$jsx("box",{height:1}),$jsxs("box",{height:1,flexDirection:"row",backgroundColor:focusBg("alias"),children:[$jsx("box",{width:11,children:$jsx("text",{fg:theme.textMuted,children:"Alias"})}),$jsx("text",{fg:alias?theme.accent:theme.textMuted,children:alias?"[x] shell alias":"[ ] shell alias"})]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:valid?"Enter create \xB7 Tab next field \xB7 Space toggle \xB7 Esc cancel":err??"type a name"})})]})};var import_react81=__toESM(require_react_production(),1);import{rmSync as rmSync3,mkdtempSync as mkdtempSync4}from"fs";import{join as join14}from"path";import{tmpdir as tmpdir4}from"os";var shq=(s)=>`'${s.replace(/'/g,"'\\''")}'`;function openInstallDistribution(dialog,gw){return new Promise((resolve4)=>{askSource(dialog,gw,(r)=>{dialog.clear(),resolve4(r)})})}function askSource(dialog,gw,done){dialog.replace($jsx(Step1,{onSubmit:(source)=>preview(dialog,gw,source,done),onCancel:()=>done(null)}))}async function preview(dialog,gw,source,done){let tmp=mkdtempSync4(join14(tmpdir4(),"herm-dist-preview-")),cleanup=()=>{try{rmSync3(tmp,{recursive:!0,force:!0})}catch{}},state2={cancelled:!1},cancel=()=>{state2.cancelled=!0,cleanup(),done(null)};dialog.replace($jsx(Loading2,{label:`Cloning ${source}\u2026`,onCancel:cancel}),void 0,{ownCancel:!0});let cmd=`git clone --depth 1 --quiet ${shq(source)} ${shq(tmp)} 2>&1`,r=await gw.request("shell.exec",{command:cmd}).catch((e)=>({stdout:"",stderr:e.message,code:-1}));if(state2.cancelled)return;if(r.code!==0){cleanup(),dialog.replace($jsx(ErrorBox,{title:"Clone failed",body:(r.stderr||r.stdout||`exit ${r.code}`).trim(),onClose:()=>done(null)}));return}let manifest3=readDistributionManifest(tmp);if(!manifest3){cleanup(),dialog.replace($jsx(ErrorBox,{title:"Not a distribution",body:`No valid distribution.yaml at the root of ${source}. A manifest must declare at minimum a 'name:' key.`,onClose:()=>done(null)}));return}dialog.replace($jsx(ConfirmStep,{source,manifest:manifest3,onConfirm:(r2)=>{cleanup(),done(r2)},onCancel:()=>{cleanup(),done(null)}}),void 0,{ownCancel:!0})}var Step1=(p)=>{let theme=useTheme().theme,[value,setValue]=import_react81.useState("");return useKeyboard((key3)=>{if(key3.name==="escape")return p.onCancel()}),$jsxs("box",{flexDirection:"column",width:64,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"Install Distribution"})})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Source \u2014 git URL, github.com/owner/repo, or local directory"})}),$jsxs("box",{height:1,flexDirection:"row",overflow:"hidden",children:[$jsx("box",{flexShrink:0,children:$jsx("text",{fg:theme.accent,children:"\u2503 "})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("input",{value,onInput:setValue,onSubmit:()=>{let v2=value.trim();if(v2)p.onSubmit(v2)},focused:!0,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement})})]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:value.trim()?"Enter preview \xB7 Esc cancel":"Esc cancel"})})]})},Loading2=(p)=>{let theme=useTheme().theme;return useKeyboard((key3)=>{if(key3.name==="escape")return p.onCancel()}),$jsxs("box",{flexDirection:"column",width:54,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"Install Distribution"})})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx(Spinner,{color:theme.accent,label:p.label})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Esc to cancel"})})]})},ErrorBox=(p)=>{let theme=useTheme().theme,keys=useKeys();return useKeyboard((key3)=>{if(keys.match("dialog.accept",key3)||keys.match("dialog.cancel",key3))return p.onClose()}),$jsxs("box",{flexDirection:"column",width:68,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.error,children:$jsx("strong",{children:p.title})})}),$jsx("box",{height:1}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",fg:theme.text,children:p.body})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Enter / Esc to close"})})]})},ORDER4=["name","alias"],ConfirmStep=(p)=>{let theme=useTheme().theme,keys=useKeys(),[name,setName]=import_react81.useState(""),[alias,setAlias]=import_react81.useState(!1),[field,setField]=import_react81.useState("name"),fire=()=>p.onConfirm({source:p.source,manifest:p.manifest,name:name.trim()||null,alias}),move=(dir)=>{let i=ORDER4.indexOf(field);setField(ORDER4[(i+dir+ORDER4.length)%ORDER4.length])};useKeyboard((key3)=>{if(key3.name==="escape")return p.onCancel();if(key3.name==="tab")return move(key3.shift?-1:1);if(field!=="name"&&keys.match("dialog.accept",key3))return fire();if(field==="alias"&&(key3.name==="space"||key3.name===" "))return setAlias((a)=>!a)});let m2=p.manifest,reqEnv=m2.env_requires.filter((e)=>e.required),optEnv=m2.env_requires.filter((e)=>!e.required),focusBg=(f)=>field===f?theme.backgroundElement:void 0;return $jsxs("box",{flexDirection:"column",width:72,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"Install Distribution"})})}),$jsx("box",{height:1}),$jsx(KV2,{label:"Name",value:`${m2.name}${m2.version?` v${m2.version}`:""}`,theme}),m2.description?$jsx(KV2,{label:"About",value:m2.description,theme,wrap:!0}):null,m2.author?$jsx(KV2,{label:"Author",value:m2.author,theme}):null,m2.license?$jsx(KV2,{label:"License",value:m2.license,theme}):null,m2.hermes_requires?$jsx(KV2,{label:"Requires",value:`hermes ${m2.hermes_requires}`,theme}):null,$jsx(KV2,{label:"Source",value:p.source,theme}),m2.distribution_owned.length>0?$jsx(KV2,{label:"Owns",value:m2.distribution_owned.join(", "),theme,wrap:!0}):null,m2.env_requires.length>0?$jsx(KV2,{label:"Env",value:envSummary(reqEnv,optEnv),theme}):null,$jsx("box",{height:1}),$jsxs("box",{height:1,flexDirection:"row",backgroundColor:focusBg("name"),children:[$jsx("box",{width:11,children:$jsx("text",{fg:theme.textMuted,children:"Name as"})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:field==="name"?$jsx("input",{value:name,onInput:setName,onSubmit:fire,focused:!0,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement}):$jsx("text",{fg:name?theme.text:theme.textMuted,children:name||`(${m2.name})`})})]}),$jsxs("box",{height:1,flexDirection:"row",backgroundColor:focusBg("alias"),children:[$jsx("box",{width:11,children:$jsx("text",{fg:theme.textMuted,children:"Alias"})}),$jsx("text",{fg:alias?theme.accent:theme.textMuted,children:alias?"[x] create shell wrapper":"[ ] create shell wrapper"})]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Enter install \xB7 Tab next field \xB7 Space toggle \xB7 Esc cancel"})})]})},KV2=(p)=>$jsxs("box",{flexDirection:"row",minHeight:1,children:[$jsx("box",{width:11,flexShrink:0,children:$jsx("text",{fg:p.theme.textMuted,children:p.label})}),$jsx("box",{flexGrow:1,minWidth:0,children:$jsx("text",{fg:p.theme.text,wrapMode:p.wrap?"word":"none",children:p.value})})]});function envSummary(req,opt){return[req.length>0?`${req.length} required (${req.map((e)=>e.name).join(", ")})`:"",opt.length>0?`${opt.length} optional`:""].filter(Boolean).join(" \xB7 ")}var running=(s)=>!s||s==="running"||s==="queued";function tree(recs,live,now){let ids=new Set(recs.map((r)=>r.subagent_id)),by=new Map;for(let r of recs){let k2=r.parent_id&&ids.has(r.parent_id)?r.parent_id:"";(by.get(k2)??by.set(k2,[]).get(k2)).push(r)}let build2=(r)=>{let kids=(by.get(r.subagent_id)??[]).map(build2),lv=live.get(r.subagent_id)??{},dur3=r.started_at!=null?Math.max(0,now-r.started_at):0,a={agents:1,tools:lv.tool_count??r.tool_count??0,dur:dur3,tok:(lv.input_tokens??0)+(lv.output_tokens??0),cost:lv.cost_usd??0,active:running(lv.status??r.status)?1:0,depth:0,hot:0};for(let k2 of kids)a={agents:a.agents+k2.agg.agents,tools:a.tools+k2.agg.tools,dur:a.dur+k2.agg.dur,tok:a.tok+k2.agg.tok,cost:a.cost+k2.agg.cost,active:a.active+k2.agg.active,depth:Math.max(a.depth,k2.agg.depth+1),hot:0};return a.hot=a.dur>0?a.tools/a.dur:0,{rec:r,agg:a,kids}};return(by.get("")??[]).map(build2)}function totals(nodes){let z2={agents:0,tools:0,dur:0,tok:0,cost:0,active:0,depth:0,hot:0};for(let n of nodes)z2.agents+=n.agg.agents,z2.tools+=n.agg.tools,z2.dur+=n.agg.dur,z2.tok+=n.agg.tok,z2.cost+=n.agg.cost,z2.active+=n.agg.active,z2.depth=Math.max(z2.depth,n.agg.depth+1);return z2.hot=z2.dur>0?z2.tools/z2.dur:0,z2}var SPARK=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"];function spark(nodes){let w2=[],walk2=(ns,d2)=>{if(ns.length===0)return;w2[d2]=(w2[d2]??0)+ns.length;for(let n of ns)walk2(n.kids,d2+1)};if(walk2(nodes,0),w2.length===0)return"";let max=Math.max(...w2);return w2.map((v2)=>v2<=0?" ":SPARK[Math.min(7,Math.ceil(v2/max*7))]).join("")}var tk=(n)=>n<1000?String(Math.round(n)):n<1e4?`${(n/1000).toFixed(1)}k`:`${Math.round(n/1000)}k`,$$=(n)=>n<=0?"":n<0.01?"<$0.01":n<10?`$${n.toFixed(2)}`:`$${n.toFixed(1)}`,sec=(s)=>{if(s<60)return`${Math.round(s)}s`;let m2=Math.floor(s/60),r=Math.round(s-m2*60);return r===0?`${m2}m`:`${m2}m${r}s`};function summary(a){let p=[`d${a.depth}`,`${a.agents} agent${a.agents===1?"":"s"}`];if(a.tools>0)p.push(`${a.tools} tools`);if(a.dur>0)p.push(sec(a.dur));if(a.tok>0)p.push(`${tk(a.tok)} tok`);if(a.cost>0)p.push($$(a.cost));if(a.active>0)p.push(`\u26A1${a.active}`);return p.join(" \xB7 ")}function heat(hot,peak,buckets){if(hot<=0||peak<=0||buckets<=1)return 0;return Math.min(buckets-1,Math.round(Math.min(1,hot/peak)*(buckets-1)))}function peak(nodes){let p=0,walk2=(ns)=>{for(let n of ns)p=Math.max(p,n.agg.hot),walk2(n.kids)};return walk2(nodes),p}var ProfileRow=import_react83.memo((props)=>{let theme=useTheme().theme,{p,idx:i}=props,[x2,setX]=import_react83.useState(!1);return $jsxs("box",{id:props.id,flexDirection:"row",height:1,backgroundColor:props.selected?theme.backgroundElement:void 0,onMouseOver:()=>props.onHover(i),onMouseDown:()=>props.onEnter(i),children:[$jsx("box",{width:2,children:$jsx("text",{fg:props.selected?theme.primary:theme.text,children:props.selected?"\u25B8 ":" "})}),$jsx("box",{flexGrow:1,minWidth:8,height:1,overflow:"hidden",children:$jsxs("text",{children:[$jsx("span",{fg:p.is_active?theme.accent:theme.text,children:p.is_active?$jsx("strong",{children:p.name}):p.name}),p.is_sticky?$jsx("span",{fg:theme.warning,children:" \u2605"}):null,p.distribution?$jsx("span",{fg:theme.info,children:" \u2B22"}):null,p.gateway_running?$jsx("span",{fg:theme.success,children:" \u25CF"}):null]})}),$jsx("box",{width:4,height:1,children:$jsx("text",{fg:theme.textMuted,children:p.is_active?" you":""})}),p.is_default||p.is_active?$jsx("box",{width:3}):$jsx("box",{width:3,onMouseDown:(e)=>{e.stopPropagation(),props.onDelete(i)},onMouseOver:()=>setX(!0),onMouseOut:()=>setX(!1),children:$jsx("text",{fg:x2?theme.error:theme.textMuted,children:" \u2715"})})]})}),DistBlock=import_react83.memo((props)=>{let theme=useTheme().theme,d2=props.d,req=d2.env_requires.filter((e)=>e.required).length,opt=d2.env_requires.length-req,link2=d2.source?{file:d2.source,relative:d2.source,label:d2.source}:props.yaml,when2=d2.installed_at?Date.parse(d2.installed_at):NaN;return $jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.info,children:$jsx("strong",{children:"Distribution"})})}),$jsx(KVBlock,{rows:[["Name",d2.name],["Version",`v${d2.version}`],["Requires",d2.hermes_requires?`Hermes ${d2.hermes_requires}`:void 0]]}),$jsx(KVLink,{label:"Source",source:link2,text:d2.source||props.yaml.label}),$jsx(KVBlock,{rows:[["Installed at",Number.isFinite(when2)?ago(when2/1000):void 0],["Env vars",d2.env_requires.length?`${req} required, ${opt} optional`:void 0]]})]})}),ProfileDetail=import_react83.memo((props)=>{let{theme,syntaxStyle}=useTheme(),p=props.p,s=props.stats;return $jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsxs("box",{flexDirection:"column",width:"100%",children:[$jsx("box",{height:1,children:$jsxs("text",{fg:theme.accent,children:[$jsx("strong",{children:p.name}),p.is_sticky?$jsx("span",{fg:theme.warning,children:" \u2605 sticky default"}):null]})}),$jsx("box",{height:1}),$jsx(KVLink,{label:"Path",source:p.sources.dir,text:p.sources.dir.relative}),$jsx(KV,{label:"Active",value:p.is_active?"yes (this session)":"no",fg:p.is_active?theme.accent:theme.textMuted}),$jsx(KV,{label:"Model",value:p.model??"\u2014"}),$jsx(KV,{label:"Provider",value:p.provider??"\u2014"}),$jsx(KV,{label:"Skills",value:String(p.skill_count)}),$jsx(KV,{label:"Sessions",value:s?s.sessions==null?"\u2014":`${fmt(s.sessions)} (${fmt(s.messages??0)} msgs)`:"\u2026"}),$jsx(KV,{label:"Cron jobs",value:s?s.crons==null?"\u2014":String(s.crons):"\u2026"}),$jsx(KV,{label:"Theme",value:s?s.prefs?.theme??"\u2014":"\u2026"}),$jsx(KV,{label:"Avatar",value:s?s.prefs?.eikon??"\u2014":"\u2026"}),s?.prefs?.keys?$jsx(KV,{label:"Keybinds",value:`${s.prefs.keys} overrides`}):null,$jsx(KV,{label:"Gateway",value:p.gateway_running?"running":"stopped",fg:p.gateway_running?theme.success:theme.textMuted}),p.has_alias?$jsx(KV,{label:"Alias",value:`${p.name} (shell)`}):null,p.distribution?$jsx(DistBlock,{d:p.distribution,yaml:p.sources.distribution}):null,$jsx("box",{height:1}),$jsx(KVLink,{label:"Config",source:p.sources.config}),$jsx(KVLink,{label:"Soul",source:p.sources.soul}),p.has_env?$jsx(KVLink,{label:"Env",source:p.sources.env}):$jsx(KV,{label:"Env",value:"\u2014"}),p.soul_preview?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"SOUL.md"})}),$jsx("markdown",{content:p.soul_preview,fg:theme.markdownText,syntaxStyle})]}):null]})})}),HOT=["\u2800","\u2801","\u2803","\u2807","\u280F","\u281F","\u283F","\u287F","\u28FF"],DelegRow=import_react83.memo((props)=>{let theme=useTheme().theme,{r,idx:i,now}=props,[x2,setX]=import_react83.useState(!1),up=r.started_at?dur2(now-r.started_at):"\u2014",hotFg=[theme.textMuted,theme.textMuted,theme.text,theme.info,theme.info,theme.accent,theme.accent,theme.warning,theme.error][props.hot]??theme.textMuted;return $jsxs("box",{id:props.id,flexDirection:"row",height:1,backgroundColor:props.selected?theme.backgroundElement:void 0,onMouseOver:()=>props.onHover(i),children:[$jsx("box",{width:2,children:$jsx("text",{fg:props.selected?theme.primary:theme.text,children:props.selected?"\u25B8 ":" "})}),$jsx("box",{width:2,children:$jsxs("text",{fg:hotFg,children:[HOT[props.hot]," "]})}),$jsx("box",{flexGrow:1,minWidth:8,height:1,overflow:"hidden",children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:"\xB7 ".repeat(r.depth)}),$jsx("span",{fg:theme.text,children:r.goal.replace(/\s+/g," ")})]})}),$jsx("box",{width:14,height:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:trunc5(r.model??"",13)})}),$jsx("box",{width:5,height:1,flexDirection:"row",justifyContent:"flex-end",children:$jsx("text",{fg:theme.textMuted,children:String(r.tool_count??0)})}),$jsx("box",{width:8,height:1,flexDirection:"row",justifyContent:"flex-end",children:$jsx("text",{fg:theme.textMuted,children:up})}),$jsx("box",{width:3,onMouseDown:(e)=>{e.stopPropagation(),props.onKill(i)},onMouseOver:()=>setX(!0),onMouseOut:()=>setX(!1),children:$jsx("text",{fg:x2?theme.error:theme.textMuted,children:" \u2715"})})]})});function preorder(recs){let byParent=new Map;for(let r of recs){let k2=r.parent_id??null;(byParent.get(k2)??byParent.set(k2,[]).get(k2)).push(r)}let out=[],seen=new Set,walk2=(k2)=>{for(let r of byParent.get(k2)??[]){if(seen.has(r.subagent_id))continue;seen.add(r.subagent_id),out.push(r),walk2(r.subagent_id)}};walk2(null);for(let r of recs)if(!seen.has(r.subagent_id))out.push(r);return out}var DelegDetail=import_react83.memo((props)=>{let theme=useTheme().theme,{r,live,agg,now}=props,tc=live?.tool_count??r.tool_count??0,tr=trail(r.subagent_id);return $jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsxs("box",{flexDirection:"column",width:"100%",children:[$jsx("box",{minHeight:1,children:$jsx("text",{fg:theme.accent,wrapMode:"word",children:$jsx("strong",{children:r.goal})})}),agg&&agg.agents>1?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:summary(agg)})}):null,$jsx("box",{height:1}),$jsx(KVBlock,{rows:[["Status",live?.status??r.status??"running"],["Model",r.model??"\u2014"],["Depth",String(r.depth)],["Parent",r.parent_id??"(root)"],["Uptime",r.started_at?dur2(now-r.started_at):"\u2014"],["Tools",String(tc)],["Tokens",live?`${fmt(live.input_tokens??0)} in / ${fmt(live.output_tokens??0)} out`:void 0],["Cost",live?.cost_usd!=null?`$${live.cost_usd.toFixed(4)}`:void 0]]}),live?.thinking?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"thinking"})}),$jsx("box",{minHeight:1,children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:trunc5(live.thinking,200)})})]}):null,tr.length>0?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"recent tools"})}),tr.slice(-8).map((t2,i)=>$jsx("box",{height:1,overflow:"hidden",children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:"\u2503 "}),$jsx("span",{fg:theme.text,children:t2.name.padEnd(14)}),$jsx("span",{fg:theme.textMuted,children:t2.preview?trunc5(t2.preview.replace(/\s+/g," "),40):""})]})},i))]}):null]})})}),Agents=import_react83.memo((props)=>{let theme=useTheme().theme,gw=useGateway(),dialog=useDialog(),toast=useToast(),cmd=useCommand(),[pane,setPane]=import_react83.useState("profiles"),[pView,setPView]=import_react83.useState("list"),[profiles,setProfiles]=import_react83.useState([]),[deleg,setDeleg]=import_react83.useState(null),[liveMap,setLiveMap]=import_react83.useState(()=>new Map),[now,setNow]=import_react83.useState(()=>Date.now()/1000),[pSel,setPSel]=import_react83.useState(0),[dSel,setDSel]=import_react83.useState(0),[err,setErr]=import_react83.useState(""),[delegErr,setDelegErr]=import_react83.useState(""),delegGen=import_react83.useRef(0),active2=preorder(deleg?.active??[]),nodes=tree(deleg?.active??[],liveMap,now),all=totals(nodes),hotPeak=peak(nodes),aggOf=new Map;{let walk2=(ns)=>{for(let n of ns)aggOf.set(n.rec.subagent_id,n.agg),walk2(n.kids)};walk2(nodes)}let live=import_react83.useRef({profiles,active:active2});live.current={profiles,active:active2};let gwHome=import_react83.useRef(void 0),[stats,setStats]=import_react83.useState(()=>new Map),[sticky,setSticky]=import_react83.useState(stickyDefault),loadProfiles=import_react83.useCallback(()=>{setStats(new Map),setSticky(stickyDefault()),listProfiles(gwHome.current).then((ps)=>{setProfiles(ps),setErr("")}).catch((e)=>setErr(`profiles: ${e.message}`))},[]);import_react83.useEffect(()=>{gw.request("config.get",{key:"profile"}).then((r)=>{gwHome.current=r.home}).catch(()=>{}).finally(loadProfiles)},[gw,loadProfiles]);let loadDeleg=import_react83.useCallback(()=>{let current=++delegGen.current;gw.request("delegation.status").then((r)=>{if(delegGen.current!==current)return;setDeleg(r),setNow(Date.now()/1000),setDelegErr("")}).catch((e)=>{if(delegGen.current===current)setDelegErr(e instanceof Error?e.message:String(e))})},[gw]);import_react83.useEffect(loadDeleg,[loadDeleg]),import_react83.useEffect(()=>()=>{delegGen.current++},[]),import_react83.useEffect(()=>{if(!props.focused)return;let ms2=(deleg?.active.length??0)>0?1500:5000,t2=setInterval(loadDeleg,ms2);return()=>clearInterval(t2)},[props.focused,deleg?.active.length,loadDeleg]),useGatewayEvent((ev)=>{if(!ev.type.startsWith("subagent."))return;let p=ev.payload,id=p.subagent_id;if(!id)return;if(setLiveMap((prev)=>{let next2=new Map(prev),cur=next2.get(id)??{tool_count:0};switch(ev.type){case"subagent.start":next2.set(id,{tool_count:0});break;case"subagent.tool":next2.set(id,{...cur,tool_count:cur.tool_count+1,last_tool:p.tool_name,last_preview:p.tool_preview});break;case"subagent.thinking":next2.set(id,{...cur,thinking:p.text});break;case"subagent.complete":next2.set(id,{...cur,status:p.status,input_tokens:p.input_tokens,output_tokens:p.output_tokens,cost_usd:p.cost_usd});break}return next2}),ev.type==="subagent.start"||ev.type==="subagent.complete")loadDeleg()});let sh=import_react83.useCallback((cmd2)=>gw.request("shell.exec",{command:cmd2}).then((r)=>{if(r.code!==0)throw Error((r.stderr||r.stdout||"exit "+r.code).trim());return r.stdout}),[gw]),pHover=import_react83.useCallback((i)=>setPSel(i),[]),dHover=import_react83.useCallback((i)=>setDSel(i),[]),pDelete=import_react83.useCallback(async(i)=>{let p=live.current.profiles[i];if(!p||p.is_default||p.is_active)return;let warn=p.gateway_running?`
|
|
4129
|
+
This mutates the learning source through learning.delete.`,yes:"delete",danger:!0}))return;setBusy(!0),setErr(null);try{let req={id:node.id},r=await gw.request("learning.delete",req);if(toast.show({variant:r.ok?"success":"warning",message:r.message}),r.ok||/stale|refresh/i.test(r.message))setTick((n)=>n+1)}catch(e){setErr(message(e))}finally{setBusy(!1)}},[dialog,gw,node,toast]);useKeyboard((key3)=>{if(!props.focused||dialog.open()||busy)return;if(detail&&(key3.name==="tab"||keys.match("focus.cycle",key3))){setPane((p)=>p==="list"?"detail":"list");return}if(detail&&pane==="detail"){let page=Math.max(1,(scroll.current?.viewport.height??10)-1);if(key3.name==="escape"){setPane("list");return}if(key3.name==="up"||key3.name==="k"||key3.raw==="k"){scroll.current?.scrollBy(-1);return}if(key3.name==="down"||key3.name==="j"||key3.raw==="j"){scroll.current?.scrollBy(1);return}if(key3.name==="pageup"){scroll.current?.scrollBy(-page);return}if(key3.name==="pagedown"){scroll.current?.scrollBy(page);return}if(key3.name==="home"||key3.name==="g"){scroll.current?.scrollTo(0);return}if(key3.name==="end"||key3.raw==="G"||key3.name==="g"&&key3.shift){scroll.current?.scrollTo(scroll.current.scrollHeight);return}return}if(key3.name==="escape"&&detail){setDetail(null),setPane("list");return}if(handleListKey(keys,key3,{count:rows3.length,setSel:setListSel,...follow.opts,onActivate:()=>{if(node)open2(node)},onToggle:()=>{if(node)open2(node)},onRefresh:()=>setTick((n)=>n+1),onDelete:()=>void del()}))return;if(key3.name==="e"||key3.raw==="e"){edit();return}});let rowPick=import_react66.useCallback((i)=>jump(i),[jump]),rowOpen=import_react66.useCallback((i)=>{jump(i);let r=rows3[i];if(r?.kind==="node")open2(r.node)},[jump,open2,rows3]),hint=detail&&pane==="detail"?`\u2191\u2193/jk scroll ${keys.print("list.pageUp")}/${keys.print("list.pageDown")} page Tab list Esc list`:`${keys.print("list.activate")} detail ${keys.print("list.toggle")} detail e edit ${keys.print("list.delete")} delete ${keys.print("list.refresh")} reload${detail?" Tab detail Esc close":""}`;return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsxs("box",{flexDirection:"row",flexGrow:1,minWidth:0,children:[$jsxs(TabShell,{title:data2?`Journey \xB7 ${data2.count} learned item${data2.count===1?"":"s"}`:"Journey",error:err,focus:pane==="list",grow:detail?2:1,children:[!data2&&!err?$jsx(Loading,{}):null,!data2&&err?$jsx(ErrorState,{err}):null,data2&&data2.count===0?$jsx(Empty,{}):null,data2&&data2.count>0?$jsxs("box",{flexDirection:"column",flexGrow:1,minHeight:0,children:[$jsx(Legend,{data:data2}),$jsx(Chart2,{rows:chart,theme}),$jsx("box",{height:1}),$jsx("scrollbox",{ref:follow.ref,scrollY:!0,flexGrow:1,children:$jsx("box",{flexDirection:"column",children:rows3.map((r,i)=>$jsx(Row2,{id:follow.id(i),row:r,index:i,active:i===sel,theme,pick:rowPick,open:rowOpen},rid(r,i)))})})]}):null]}),detail?$jsx(Detail2,{detail,box:scroll,focus:pane==="detail",theme}):null]}),$jsx(HintBar,{raw:busy?"loading\u2026":hint})]})}),Loading=()=>{let theme=useTheme().theme;return $jsx("box",{flexGrow:1,justifyContent:"center",alignItems:"center",children:$jsx("text",{fg:theme.textMuted,children:"assembling learning map\u2026"})})},Empty=()=>{let theme=useTheme().theme;return $jsx("box",{flexGrow:1,justifyContent:"center",alignItems:"center",children:$jsx("text",{fg:theme.textMuted,children:"No learning yet \u2014 skills and memories will appear here."})})},ErrorState=({err})=>{let theme=useTheme().theme;return $jsx("box",{flexGrow:1,justifyContent:"center",alignItems:"center",children:$jsx("text",{fg:theme.error,wrapMode:"word",children:err})})},Legend=({data:data2})=>{let theme=useTheme().theme,text5=[...data2.legend??[],...data2.categories??[]].map((i)=>`${i.glyph} ${i.label}`).join(" ")||data2.summary.join(" ");return $jsx("box",{height:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:text5})})},Chart2=({rows:rows3,theme})=>$jsx("box",{flexDirection:"column",flexShrink:0,children:rows3.map((row3,i)=>$jsx("box",{height:1,overflow:"hidden",children:$jsx("text",{wrapMode:"none",children:row3.map((run,n)=>$jsx("span",{fg:style(theme,run[1],run[3]),children:run[0]},n))})},i))}),Row2=import_react66.memo((props)=>{let bg2=props.active?props.theme.backgroundElement:void 0,caret=props.active?"\u25B8 ":" ";if(props.row.kind==="gap")return $jsx("box",{id:props.id,height:1});if(props.row.kind==="slice")return $jsx("box",{id:props.id,height:1,backgroundColor:bg2,onMouseMove:()=>props.pick(props.index),onMouseDown:()=>props.open(props.index),overflow:"hidden",children:$jsxs("text",{wrapMode:"none",children:[$jsx("span",{fg:props.theme.textMuted,children:caret}),$jsx("span",{fg:props.active?props.theme.accent:props.theme.primary,children:props.row.bucket.label}),$jsx("span",{fg:props.theme.textMuted,children:` ${props.row.bucket.total} total \xB7 ${props.row.bucket.memories} memories \xB7 ${props.row.bucket.skills} skills`})]})});return $jsx("box",{id:props.id,height:1,backgroundColor:bg2,onMouseMove:()=>props.pick(props.index),onMouseDown:()=>props.open(props.index),overflow:"hidden",children:$jsxs("text",{wrapMode:"none",children:[$jsx("span",{fg:props.theme.textMuted,children:caret}),$jsx("span",{fg:props.theme.textMuted,children:props.row.last?" \u2514\u2500 ":" \u251C\u2500 "}),$jsx("span",{fg:props.active?props.theme.accent:style(props.theme,props.row.node.style),children:`${props.row.node.glyph} ${trunc5(props.row.node.fullLabel||props.row.node.label,54)}`}),$jsx("span",{fg:props.theme.textMuted,children:props.row.node.meta?` ${props.row.node.meta}`:""})]})})}),Detail2=(props)=>$jsx(TabShell,{title:props.detail.ok?`${props.detail.kind} \xB7 ${props.detail.label}`:"Detail",focus:props.focus,grow:1,children:props.detail.ok?$jsx("scrollbox",{ref:props.box,scrollY:!0,flexGrow:1,children:$jsx("box",{flexDirection:"column",width:"100%",children:props.detail.content.split(/\r?\n/).map((line2,i)=>$jsx("box",{minHeight:1,children:$jsx("text",{fg:props.theme.text,wrapMode:"word",children:line2||" "})},i))})}):$jsx("text",{fg:props.theme.warning,wrapMode:"word",children:props.detail.message})});var import_react68=__toESM(require_react_production(),1);var SubTabBar=import_react68.memo((props)=>$jsx(TabStrip,{...props}));var TABS=[{name:"Chat",description:"Main chat interface"},{name:"Sessions",description:"Sessions, context, analytics"},{name:"Profiles & Automation",description:"Profiles, cron jobs, kanban boards"},{name:"Config",description:"Config, env, skills, toolsets, memory"},{name:"Eikon",description:"Avatar studio & library"}],TAB_MAX=TABS.length-1,CHAT_TAB=0,SESSIONS_TAB=1,AUTOMATION_TAB=2,CONFIG_TAB=3,EIKON_TAB=4,SUB_TABS={[1]:["List","Context","Analytics","Journey"],[2]:["Kanban","Profiles","Cron"],[3]:["Config","Skills","Toolsets","Env","Memory"],[4]:["Library","Catalog","Studio"]},TAB_SLASH={chat:{tab:0,sub:0},sessions:{tab:1,sub:0},context:{tab:1,sub:1},analytics:{tab:1,sub:2},insights:{tab:1,sub:2},journey:{tab:1,sub:3},learning:{tab:1,sub:3},"memory-graph":{tab:1,sub:3},kanban:{tab:2,sub:0},automation:{tab:2,sub:0},profiles:{tab:2,sub:1},agents:{tab:2,sub:1},cron:{tab:2,sub:2},config:{tab:3,sub:0},skills:{tab:3,sub:1},toolsets:{tab:3,sub:2},env:{tab:3,sub:3},memory:{tab:3,sub:4},library:{tab:4,sub:0},catalog:{tab:4,sub:1},studio:{tab:4,sub:2}};var SessionsGroup=import_react69.memo((props)=>{let labels=SUB_TABS[SESSIONS_TAB];import_react69.useEffect(()=>{if(props.sub>=labels.length)props.setSub(0)},[props.sub,labels.length]);let hint="shift+\u2190/\u2192 sub";return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsx(SubTabBar,{tabs:labels,active:props.sub,onChange:props.setSub,hint}),$jsxs("box",{flexGrow:1,minWidth:0,flexDirection:"column",children:[$jsx(Pane,{visible:props.sub===0,children:$jsx(Sessions,{focused:!!props.focused&&props.sub===0,onSwitch:props.onSwitch,onActivateLive:props.onActivateLive,currentId:props.currentId})}),$jsx(Pane,{visible:props.sub===1,children:$jsx(Context,{focused:!!props.focused&&props.sub===1,messages:props.messages,sessionStart:props.sessionStart,info:props.info,usage:props.usage})}),$jsx(Pane,{visible:props.sub===2,children:$jsx(Analytics,{focused:!!props.focused&&props.sub===2})}),$jsx(Pane,{visible:props.sub===3,children:$jsx(Journey,{focused:!!props.focused&&props.sub===3})})]})]})}),Pane=({visible:visible2,children:children2})=>visible2?$jsx("box",{flexGrow:1,minWidth:0,minHeight:0,flexDirection:"column",children:children2}):null;var import_react94=__toESM(require_react_production(),1);var import_react83=__toESM(require_react_production(),1);var acc=new Map;function record(ev,p){let id=p.subagent_id;if(!id)return;let now=Date.now()/1000;if(ev==="start"){acc.set(id,{subagent_id:id,parent_id:p.parent_id??null,depth:p.depth??0,goal:p.goal,model:p.model,started_at:now,tool_count:0,status:"running",trail:[]});return}let r=acc.get(id);if(!r)return;if(ev==="tool"&&p.tool_name){r.tool_count++,r.trail=[...r.trail??[],{name:p.tool_name,preview:p.tool_preview}].slice(-20);return}if(ev==="complete")r.status=p.status??"completed",r.finished_at=now,r.input_tokens=p.input_tokens,r.output_tokens=p.output_tokens,r.cost_usd=p.cost_usd}function trail(id){return acc.get(id)?.trail??[]}function clear(){acc.clear()}function flush(gw,sessionId){if(acc.size===0)return;let subagents=[...acc.values()];acc.clear();let label2=(subagents.filter((s)=>s.parent_id==null).slice(0,2).map((s)=>s.goal).join(" \xB7 ")||`${subagents.length} subagents`).slice(0,120),started=Math.min(...subagents.map((s)=>s.started_at));gw.request("spawn_tree.save",{session_id:sessionId,label:label2,started_at:started,finished_at:Date.now()/1000,subagents}).catch(()=>{})}var import_react72=__toESM(require_react_production(),1);var import_react70=__toESM(require_react_production(),1);var DialogSelect=(props)=>{let filterable=props.filterable??!0,[filter,setFilter]=import_react70.useState(""),[cursor,setCursor]=import_react70.useState(0),mode2=import_react70.useRef("kb"),moved=import_react70.useRef(!1),sb=import_react70.useRef(null),theme=useTheme().theme,opts=import_react70.useMemo(()=>props.options.map((o)=>({name:`${props.current==null?"":o.value===props.current?"\u25CF ":" "}${o.title}`,description:o.hint?[o.description,o.hint].filter(Boolean).join(" \u2014 "):o.description??"",value:o.value})),[props.current,props.options]),sel=props.current==null?0:Math.max(0,props.options.findIndex((o)=>o.value===props.current)),desc=props.options.some((o)=>!!o.description||!!o.hint),filtered=import_react70.useMemo(()=>{let lower=filter.toLowerCase();return props.options.filter((o)=>o.title.toLowerCase().includes(lower)||(o.description??"").toLowerCase().includes(lower))},[filter,props.options]),groups=import_react70.useMemo(()=>{let map=new Map;return filtered.forEach((o)=>{let cat=o.category??"",arr=map.get(cat)??[];arr.push(o),map.set(cat,arr)}),map},[filtered]),rowId=(i)=>`ds-row-${i}`,scrollTo=(i)=>sb.current?.scrollChildIntoView(rowId(i));import_react70.useEffect(()=>{if(cursor>=filtered.length)setCursor(Math.max(0,filtered.length-1))},[filtered.length,cursor]),import_react70.useEffect(()=>{if(!props.current){setCursor(0);return}let i=filtered.findIndex((o)=>o.value===props.current),n=Math.max(0,i);setCursor(n),scrollTo(n)},[props.current,filtered]),import_react70.useEffect(()=>{if(!moved.current)return;moved.current=!1;let item=filtered[cursor];if(item&&props.onMove)props.onMove(item)},[cursor,filtered,props.onMove]);let keys=useKeys();useKeyboard((key3)=>{if(!filterable)return;if(handleListKey(keys,key3,{count:filtered.length,setSel:(fn)=>{mode2.current="kb",moved.current=!0,setCursor(fn)},scrollTo,page:Math.max(1,(sb.current?.viewport.height??10)-1),onActivate:()=>{let item=filtered[cursor];if(item)props.onSelect(item)}}))return;if(props.onKey?.(key3))return});let idx=0,entries2=Array.from(groups.entries());if(!filterable)return $jsxs("box",{flexDirection:"column",width:60,children:[$jsx("text",{fg:theme.text,children:$jsx("strong",{children:props.title})}),$jsx("box",{height:1}),$jsx("select",{focused:!0,width:58,height:Math.min(16,Math.max(1,props.options.length*(desc?2:1))),options:opts,selectedIndex:sel,showDescription:desc,showScrollIndicator:props.options.length>8,backgroundColor:theme.backgroundPanel,focusedBackgroundColor:theme.backgroundPanel,textColor:theme.textMuted,focusedTextColor:theme.text,selectedBackgroundColor:theme.backgroundElement,selectedTextColor:theme.text,descriptionColor:theme.textMuted,selectedDescriptionColor:theme.textMuted,fastScrollStep:Math.max(1,props.options.length),keyBindings:[{name:"home",action:"move-up-fast"},{name:"end",action:"move-down-fast"},{name:"pageup",action:"move-up-fast"},{name:"pagedown",action:"move-down-fast"},{name:"space",action:"select-current"},{name:" ",action:"select-current"}],onChange:(i)=>{let item=props.options[i];if(item&&props.onMove)props.onMove(item)},onSelect:(i)=>{let item=props.options[i];if(item)props.onSelect(item)}}),props.footer!=null?$jsx("box",{paddingTop:1,children:props.footer}):null]});return $jsxs("box",{flexDirection:"column",width:60,children:[$jsx("text",{fg:theme.text,children:$jsx("strong",{children:props.title})}),$jsx("box",{height:1}),filterable?$jsxs($Fragment,{children:[$jsx("input",{value:filter,onInput:(v2)=>{mode2.current="kb",setFilter(v2)},placeholder:props.placeholder??"Type to filter...",focused:!0,textColor:theme.text,placeholderColor:theme.textMuted,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement}),$jsx("box",{height:1})]}):null,$jsxs("scrollbox",{ref:sb,scrollY:!0,maxHeight:16,focused:!filterable,contentOptions:{flexDirection:"column"},paddingRight:1,children:[filtered.length===0?$jsx("text",{fg:theme.textMuted,children:"No results found"}):null,entries2.map(([cat,items])=>{let elements=[];if(cat)elements.push($jsx("text",{fg:theme.textMuted,children:$jsx("strong",{children:cat})},`cat-${cat}`));return items.forEach((item)=>{let i=idx++,active2=i===cursor,current=item.value===props.current;elements.push($jsxs("box",{id:rowId(i),flexDirection:"row",backgroundColor:active2?theme.backgroundElement:void 0,onMouseMove:()=>{mode2.current="mouse",moved.current=!0,setCursor((c)=>c===i?c:i)},onMouseOver:()=>{if(mode2.current==="mouse")moved.current=!0,setCursor(i)},onMouseDown:()=>props.onSelect(item),paddingLeft:1,paddingRight:1,children:[$jsx("box",{flexGrow:1,height:1,overflow:"hidden",children:$jsxs("text",{fg:active2?theme.text:theme.textMuted,children:[current?"\u25CF ":" ",item.title,item.description?` \u2014 ${item.description}`:""]})}),item.hint?$jsx("box",{flexShrink:0,height:1,children:$jsx("text",{fg:theme.textMuted,children:item.hint})}):null]},item.value))}),elements}).flat()]}),props.footer!=null?$jsx("box",{paddingTop:1,children:props.footer}):null]})};var Ctx6=import_react72.createContext(null),CommandProvider=({children:children2})=>{let registry=import_react72.useRef(new Map),enabled2=import_react72.useRef(!0),dialog=useDialog(),keys=useKeys(),all=import_react72.useCallback(()=>{let out=[];return registry.current.forEach((cmds)=>cmds.forEach((c)=>out.push(c))),out},[]),register=import_react72.useCallback((cmds)=>{let id=String(Date.now())+Math.random();return registry.current.set(id,cmds),()=>{registry.current.delete(id)}},[]),setEnabled=import_react72.useCallback((val)=>{enabled2.current=val},[]),open2=import_react72.useCallback(()=>{let cmds=all(),options=cmds.map((c)=>({title:c.title,value:c.value,description:c.description,hint:c.action?keys.print(c.action):void 0,category:c.category}));dialog.replace($jsx(DialogSelect,{title:"Command Palette",options,onSelect:(opt)=>{dialog.clear();let found=cmds.find((c)=>c.value===opt.value);if(found)found.onSelect()},placeholder:"Search commands..."}))},[all,dialog,keys]);useKeyboard((key3)=>{if(!enabled2.current||dialog.open())return;if(keys.match("palette.open",key3))return open2();for(let c of all())if(c.action&&keys.match(c.action,key3))return c.onSelect()});let value=import_react72.useMemo(()=>({register,setEnabled}),[register,setEnabled]);return $jsx(Ctx6.Provider,{value,children:children2})},useCommand=makeUse(Ctx6,"useCommand");var import_react74=__toESM(require_react_production(),1);function openAlert(dialog,title,body){dialog.replace($jsx(Alert,{title,body,onClose:()=>dialog.clear()}))}var Alert=(props)=>{let theme=useTheme().theme,keys=useKeys(),[copied2,setCopied]=import_react74.useState(!1),doCopy=()=>{copy2(props.body),setCopied(!0),setTimeout(()=>setCopied(!1),900)};return useKeyboard((key3)=>{if(keys.match("dialog.cancel",key3)||keys.match("dialog.accept",key3))props.onClose();if(keys.match("dialog.copy",key3))doCopy()}),$jsxs("box",{flexDirection:"column",width:84,maxHeight:28,border:["left"],borderColor:theme.info,customBorderChars:LEFT_BAR,backgroundColor:theme.backgroundPanel,paddingLeft:2,paddingRight:2,paddingY:1,gap:1,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.info,children:"\u25C8 "}),$jsx("span",{fg:theme.text,children:props.title})]})}),$jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsx("text",{fg:theme.text,wrapMode:"word",children:props.body})}),$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:`${keys.print("dialog.cancel")} close \xB7 ${keys.print("dialog.copy")} `})}),$jsx("box",{flexShrink:0,onMouseDown:(e)=>{e.stopPropagation(),doCopy()},children:$jsx("text",{fg:copied2?theme.success:theme.textMuted,children:$jsx("u",{children:copied2?"copied":"copy"})})})]})]})};var Status=({s})=>{let theme=useTheme().theme,fg2=s==="completed"?theme.success:s==="failed"?theme.error:s==="error"?theme.error:s==="timeout"?theme.error:s==="interrupted"?theme.warning:theme.textMuted;return $jsx("span",{fg:fg2,children:s})},SnapshotView=(props)=>{let theme=useTheme().theme,subs2=props.snap.subagents??[],tok=subs2.reduce((n,s)=>n+(s.input_tokens??0)+(s.output_tokens??0),0),span2=props.snap.started_at&&props.snap.finished_at?dur2(props.snap.finished_at-props.snap.started_at):"\u2014";return $jsxs("box",{flexDirection:"column",width:80,children:[$jsx("text",{fg:theme.text,children:$jsx("strong",{children:props.entry.label||`${subs2.length} subagents`})}),$jsxs("text",{fg:theme.textMuted,children:[when(props.entry.finished_at)," \xB7 ",span2," \xB7 ",subs2.length," agents \xB7 ",fmt(tok)," tok"]}),$jsx("box",{height:1}),$jsx("scrollbox",{scrollY:!0,maxHeight:20,contentOptions:{flexDirection:"column"},children:subs2.map((s)=>$jsxs("box",{flexDirection:"column",marginBottom:1,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:"\u2503 "+"\xB7 ".repeat(s.depth)}),$jsx("span",{fg:theme.text,children:trunc5(s.goal.replace(/\s+/g," "),60)})]})}),$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:["\u2503 "+" ".repeat(2*s.depth+2),$jsx(Status,{s:s.status}),` \xB7 ${s.tool_count}t`,s.finished_at?` \xB7 ${dur2(s.finished_at-s.started_at)}`:"",s.model?` \xB7 ${s.model}`:""]})})]},s.subagent_id))})]})};function openSpawnHistory(dialog,gw,sessionId){dialog.replace($jsx("box",{width:40,height:3,children:$jsx("text",{children:"Loading spawn history\u2026"})}));let listToken=dialog.version();gw.request("spawn_tree.list",{session_id:sessionId,limit:50}).then((r)=>{if(dialog.version()!==listToken)return;let entries2=r.entries??[];dialog.replace($jsx(DialogSelect,{title:"Spawn history",placeholder:entries2.length?"filter\u2026":"no saved spawn trees",options:entries2.map((e)=>({value:e.path,title:`${e.count.toString().padStart(2)}\xD7 ${trunc5(e.label||"(unlabeled)",40)}`,description:when(e.finished_at),category:e.session_id===sessionId?"This session":e.session_id})),onSelect:(opt)=>{let entry2=entries2.find((e)=>e.path===opt.value);dialog.replace($jsx("box",{width:40,height:3,children:$jsx("text",{children:"Loading spawn tree\u2026"})}));let token=dialog.version();gw.request("spawn_tree.load",{path:entry2.path}).then((snap2)=>{if(dialog.version()===token)dialog.replace($jsx(SnapshotView,{entry:entry2,snap:snap2}))}).catch((e)=>{if(dialog.version()===token)openAlert(dialog,"Spawn history",e instanceof Error?e.message:String(e))})}}))}).catch((e)=>{if(dialog.version()===listToken)openAlert(dialog,"Spawn history",e instanceof Error?e.message:String(e))})}var import_react77=__toESM(require_react_production(),1);var Dialog=(props)=>{let theme=useTheme().theme,keys=useKeys();useKeyboard((key3)=>{if(keys.match("dialog.cancel",key3)||keys.match("dialog.accept",key3))return props.onClose()});let d2=props.d,req=d2.env_requires.filter((e)=>e.required),opt=d2.env_requires.filter((e)=>!e.required),link2=d2.source?{file:d2.source,relative:d2.source,label:d2.source}:props.yaml,when2=d2.installed_at?Date.parse(d2.installed_at):NaN;return $jsxs("box",{flexDirection:"column",minWidth:62,gap:1,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:`Distribution \xB7 ${props.profile}`})})}),$jsxs("box",{flexDirection:"column",children:[$jsx(KVBlock,{rows:[["Name",d2.name],["Version",`v${d2.version}`],["Requires",d2.hermes_requires?`Hermes ${d2.hermes_requires}`:void 0],["Author",d2.author||void 0],["License",d2.license||void 0],["Description",d2.description||void 0]]}),$jsx(KVLink,{label:"Source",source:link2,text:d2.source||props.yaml.label}),$jsx(KVBlock,{rows:[["Installed",Number.isFinite(when2)?ago(when2/1000):void 0],["Owned",d2.distribution_owned.length?d2.distribution_owned.join(", "):void 0]]})]}),d2.env_requires.length?$jsxs("box",{flexDirection:"column",children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.info,children:$jsx("strong",{children:"Environment variables"})})}),req.length?$jsxs($Fragment,{children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Required"})}),req.map((e)=>$jsx(EnvRow,{name:e.name,desc:e.description,fallback:e.default},e.name))]}):null,opt.length?$jsxs($Fragment,{children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Optional"})}),opt.map((e)=>$jsx(EnvRow,{name:e.name,desc:e.description,fallback:e.default},e.name))]}):null]}):null,$jsx("box",{height:1,children:$jsx("text",{fg:theme.borderSubtle,children:`[${keys.print("dialog.cancel")}] close`})})]})},EnvRow=(props)=>{let theme=useTheme().theme,tail=[props.desc,props.fallback?`default: ${props.fallback}`:""].filter(Boolean).join(" \xB7 ");return $jsxs("box",{flexDirection:"row",minHeight:1,children:[$jsx("box",{width:2,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:" "})}),$jsx("box",{width:22,flexShrink:0,children:$jsx("text",{fg:theme.accent,children:props.name})}),$jsx("box",{flexGrow:1,minWidth:0,children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:tail})})]})};function openDistributionInfo(dialog,opts){dialog.replace($jsx(Dialog,{profile:opts.profile,d:opts.d,yaml:opts.yaml,onClose:()=>dialog.clear()}))}function openProfileMenu(dialog,p,ops){let opts=[...ops.switch&&!p.is_active?[{category:"Switch",value:"switch",title:`Switch to '${p.name}'`,description:"restart gateway under this HERMES_HOME \u2014 ends current session"}]:[],{category:"Open",value:"soul",title:"SOUL.md",description:"edit persona/system prompt"},{category:"Open",value:"config",title:"config.yaml",description:"model, provider, toolsets"},...p.has_env?[{category:"Open",value:"env",title:".env",description:"API keys + secrets"}]:[],{category:"Open",value:"dir",title:"Directory",description:p.path},...p.distribution?[{category:"Distribution",value:"dist-info",title:"Info",description:`v${p.distribution.version}${p.distribution.source?` \xB7 ${p.distribution.source}`:""}`},{category:"Distribution",value:"dist-update",title:"Update",description:`hermes profile update ${p.name}${p.is_active?" \xB7 ends current session":""}`}]:[],...p.is_sticky?[{category:"Default",value:"unsticky",title:"Clear sticky default",description:"hermes profile use --clear"}]:[{category:"Default",value:"sticky",title:"Set as sticky default",description:`hermes profile use ${p.name}`}],{category:"Manage",value:"export",title:"Export",description:`hermes profile export ${p.name}`},...p.is_default||p.is_active?[]:[{category:"Manage",value:"delete",title:"Delete",description:"irreversible \u2014 removes config, env, memory, sessions"}]];dialog.replace($jsx(DialogSelect,{title:`Profile \xB7 ${p.name}${p.is_active?" (active)":""}`,options:opts,onSelect:(o)=>{if(o.value==="dist-info"){if(!p.distribution)return dialog.clear();return openDistributionInfo(dialog,{profile:p.name,d:p.distribution,yaml:p.sources.distribution})}if(o.value==="dist-update"){if(!p.distribution)return dialog.clear();return openUpdateDistribution(dialog,p,(force)=>ops.update(p,force))}if(dialog.clear(),o.value==="switch")return ops.switch?.();if(o.value==="soul")return openFile(p.sources.soul.file);if(o.value==="config")return openFile(p.sources.config.file);if(o.value==="env")return openFile(p.sources.env.file);if(o.value==="dir")return openFile(p.path);if(o.value==="sticky")return ops.sticky(p);if(o.value==="unsticky")return ops.unsticky();if(o.value==="export")return ops.export(p);if(o.value==="delete")return ops.remove(p)}}))}var UpdateForm=(props)=>{let theme=useTheme().theme,keys=useKeys(),[force,setForce]=import_react77.useState(!1);useKeyboard((key3)=>{if(keys.match("dialog.cancel",key3)||keys.match("dialog.deny",key3))return props.done(null);if(keys.match("dialog.confirm",key3)||keys.match("dialog.accept",key3))return props.done(force);if(key3.name==="space"||key3.name===" ")return setForce((f)=>!f)});let d2=props.p.distribution;return $jsxs("box",{flexDirection:"column",width:62,gap:1,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.warning,children:$jsx("strong",{children:"Update distribution?"})})}),$jsxs("box",{flexDirection:"column",children:[$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:`'${props.p.name}' \xB7 v${d2.version}${d2.source?` \xB7 ${d2.source}`:""}`})}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",fg:theme.textMuted,children:"Re-pulls from source; distribution-owned files are overwritten."})}),props.p.is_active?$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",fg:theme.warning,children:"\u26A0 This is the active profile. The gateway will re-spawn "+"and the current session will end."})}):null]}),$jsx("box",{height:1,children:$jsx("text",{fg:force?theme.warning:theme.textMuted,children:`${force?"[x]":"[ ]"} --force-config \xB7 also overwrite config.yaml`})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:`[${keys.print("dialog.confirm")}] update [Space] toggle force [${keys.print("dialog.cancel")}] cancel`})})]})};function openUpdateDistribution(dialog,p,onConfirm){dialog.replace($jsx(UpdateForm,{p,done:(force)=>{if(dialog.clear(),force!==null)onConfirm(force)}}))}var import_react79=__toESM(require_react_production(),1);import{existsSync as existsSync18,readFileSync as readFileSync11}from"fs";import{readdir as readdir2}from"fs/promises";import{homedir as homedir7}from"os";import{join as join13,basename as basename9,dirname as dirname8}from"path";import{Database as Database2}from"bun:sqlite";var home4=()=>process.env.HOME||homedir7(),hermesHome=()=>process.env.HERMES_HOME||join13(home4(),".hermes");function root2(){let hh=hermesHome(),parent2=dirname8(hh);return basename9(parent2)==="profiles"?dirname8(parent2):hh}function profileNameFrom(hh){let parent2=dirname8(hh);return basename9(parent2)==="profiles"?basename9(hh):"default"}function activeProfileName(){return profileNameFrom(hermesHome())}function stickyDefault(){try{return readFileSync11(join13(root2(),"active_profile"),"utf-8").trim()||null}catch{return null}}var ID_RE=/^[a-z0-9][a-z0-9_-]{0,63}$/;function resolveProfileHome(name){if(name==="default")return root2();if(!ID_RE.test(name))return null;let dir=join13(root2(),"profiles",name);return existsSync18(dir)?dir:null}function readModel(dir){try{let raw=readFileSync11(join13(dir,"config.yaml"),"utf-8"),block=raw.split(/^model:\s*$/m)[1]?.split(/^\S/m)[0]??"",m2=block.match(/^\s+(?:default|model):\s*(.+)$/m)?.[1]?.trim()??raw.match(/^model:\s*(\S.+)$/m)?.[1]?.trim(),p=block.match(/^\s+provider:\s*(.+)$/m)?.[1]?.trim(),clean5=(s)=>s?.replace(/^["']|["']$/g,"")??null;return[clean5(m2),clean5(p)]}catch{return[null,null]}}async function countSkills(dir){let glob=new Bun.Glob("**/SKILL.md"),n=0;try{for await(let _2 of glob.scan({cwd:join13(dir,"skills"),onlyFiles:!0}))n++}catch{}return n}function gatewayRunning(dir){try{let raw=readFileSync11(join13(dir,"gateway.pid"),"utf-8").trim(),pid2=raw.startsWith("{")?Number(JSON.parse(raw).pid):Number(raw);if(!Number.isFinite(pid2)||pid2<=0)return!1;return process.kill(pid2,0),!0}catch{return!1}}function soul(dir){try{return readFileSync11(join13(dir,"SOUL.md"),"utf-8").replace(/^#[^\n]*\n+/,"").replace(/^\s+/,"").slice(0,400)}catch{return""}}function readDistributionManifest(dir){let path4=join13(dir,"distribution.yaml");if(!existsSync18(path4))return null;let data2=(()=>{try{return $parse(readFileSync11(path4,"utf-8"))}catch{return null}})();if(!data2||typeof data2!=="object"||Array.isArray(data2))return null;let d2=data2,name=typeof d2.name==="string"?d2.name.trim():"";if(!name)return null;let envs=(Array.isArray(d2.env_requires)?d2.env_requires:[]).flatMap((e)=>{if(!e||typeof e!=="object")return[];let r=e,n=typeof r.name==="string"?r.name.trim():"";if(!n)return[];return[{name:n,description:typeof r.description==="string"?r.description:"",required:r.required===void 0?!0:Boolean(r.required),default:typeof r.default==="string"?r.default:null}]}),owned=(Array.isArray(d2.distribution_owned)?d2.distribution_owned:[]).map((p)=>typeof p==="string"?p.trim().replace(/\/+$/,""):"").filter((p)=>p.length>0);return{name,version:typeof d2.version==="string"?d2.version:"0.1.0",description:typeof d2.description==="string"?d2.description:"",hermes_requires:typeof d2.hermes_requires==="string"?d2.hermes_requires:"",author:typeof d2.author==="string"?d2.author:"",license:typeof d2.license==="string"?d2.license:"",env_requires:envs,distribution_owned:owned,source:typeof d2.source==="string"?d2.source:"",installed_at:typeof d2.installed_at==="string"?d2.installed_at:""}}var src2=(file,label2)=>({file,relative:file.replace(home4()+"/","~/"),label:label2});async function info(name,dir,active2,sticky){let[model,provider]=readModel(dir),alias=join13(home4(),".local","bin",name);return{name,path:dir,is_default:name==="default",is_active:name===active2,is_sticky:name===sticky,gateway_running:gatewayRunning(dir),model,provider,has_env:existsSync18(join13(dir,".env")),skill_count:await countSkills(dir),has_alias:name!=="default"&&existsSync18(alias),soul_preview:soul(dir),distribution:readDistributionManifest(dir),sources:{dir:src2(dir,dir.replace(home4()+"/","~/")),config:src2(join13(dir,"config.yaml"),"config.yaml"),soul:src2(join13(dir,"SOUL.md"),"SOUL.md"),env:src2(join13(dir,".env"),".env"),distribution:src2(join13(dir,"distribution.yaml"),"distribution.yaml")}}}async function listProfiles(activeHome){let r=root2(),active2=profileNameFrom(activeHome??hermesHome()),sticky=stickyDefault(),jobs=[];if(existsSync18(r))jobs.push(info("default",r,active2,sticky));let pr=join13(r,"profiles");if(existsSync18(pr))for(let e of await readdir2(pr,{withFileTypes:!0})){if(!e.isDirectory()||!ID_RE.test(e.name))continue;jobs.push(info(e.name,join13(pr,e.name),active2,sticky))}return Promise.all(jobs)}function validateName(name,existing){if(!ID_RE.test(name))return"must match [a-z0-9][a-z0-9_-]{0,63}";if(existing.includes(name))return"already exists";if(["hermes","default","test","tmp","root","sudo"].includes(name))return"reserved name";return null}function readPrefs(dir){try{let raw=JSON.parse(readFileSync11(join13(dir,"herm","tui.json"),"utf-8"));return{theme:raw.theme,eikon:raw.eikon??(raw.eikonPath?basename9(raw.eikonPath,".eikon"):void 0),keys:raw.keys?Object.keys(raw.keys).length:0}}catch{return null}}async function profileStats(dir){let sessions=null,messages=null,dbPath=join13(dir,"state.db");if(existsSync18(dbPath))try{let db=new Database2(dbPath,{readwrite:!0,create:!1}),r=db.query("SELECT COUNT(*) AS s FROM sessions WHERE message_count > 0").get(),m2=db.query("SELECT COALESCE(SUM(message_count), 0) AS m FROM sessions").get();sessions=r.s,messages=m2.m,db.close()}catch{}let crons=null;try{let jobs=await Bun.file(join13(dir,"cron","jobs.json")).json();crons=Array.isArray(jobs)?jobs.length:jobs&&typeof jobs==="object"&&Array.isArray(jobs.jobs)?jobs.jobs.length:0}catch{crons=existsSync18(join13(dir,"cron"))?0:null}return{sessions,messages,crons,prefs:readPrefs(dir)}}var ORDER3=["name","clone","alias"];function openCreateProfile(dialog,opts){return new Promise((resolve4)=>{let done=(r)=>{dialog.clear(),resolve4(r)};dialog.replace($jsx(Form,{existing:opts.existing,done}))})}var Form=({existing,done})=>{let theme=useTheme().theme,[name,setName]=import_react79.useState(""),[cloneIdx,setCloneIdx]=import_react79.useState(0),[alias,setAlias]=import_react79.useState(!0),[field,setField]=import_react79.useState("name"),options=["(fresh)",...existing],err=name?validateName(name,existing):null,valid=!!name&&!err,submit2=()=>{if(!valid)return;done({name,cloneFrom:cloneIdx===0?null:options[cloneIdx],alias})},moveField=(dir)=>{let i=ORDER3.indexOf(field);setField(ORDER3[(i+dir+ORDER3.length)%ORDER3.length])};useKeyboard((key3)=>{if(key3.name==="escape")return done(null);if(key3.name==="tab")return moveField(key3.shift?-1:1);if(key3.name==="return")return submit2();if(field==="name"){if(key3.name==="backspace")return setName((n)=>n.slice(0,-1));if(key3.raw&&key3.raw.length===1&&/[a-z0-9_-]/.test(key3.raw))return setName((n)=>n+key3.raw);return}if(field==="clone"){if(key3.name==="up")return setCloneIdx((i)=>Math.max(0,i-1));if(key3.name==="down")return setCloneIdx((i)=>Math.min(options.length-1,i+1));return}if(field==="alias"){if(key3.name==="space"||key3.name===" ")return setAlias((a)=>!a)}});let focusBg=(f)=>field===f?theme.backgroundElement:void 0;return $jsxs("box",{flexDirection:"column",width:54,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"New Profile"})})}),$jsx("box",{height:1}),$jsxs("box",{height:1,flexDirection:"row",backgroundColor:focusBg("name"),children:[$jsx("box",{width:11,children:$jsx("text",{fg:theme.textMuted,children:"Name"})}),$jsxs("text",{children:[$jsx("span",{fg:valid||!name?theme.text:theme.error,children:name}),field==="name"?$jsx("span",{fg:theme.accent,children:"\u2588"}):null]})]}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:" a-z 0-9 _ - \xB7 lowercase"})}),$jsx("box",{height:1}),$jsx("box",{height:1,backgroundColor:focusBg("clone"),children:$jsx("text",{fg:theme.textMuted,children:"Clone from (\u2191\u2193)"})}),options.map((o,i)=>$jsx("box",{height:1,backgroundColor:focusBg("clone"),children:$jsxs("text",{fg:i===cloneIdx?theme.accent:theme.text,children:[i===cloneIdx?"\u25B8 ":" ",o]})},o)),$jsx("box",{height:1}),$jsxs("box",{height:1,flexDirection:"row",backgroundColor:focusBg("alias"),children:[$jsx("box",{width:11,children:$jsx("text",{fg:theme.textMuted,children:"Alias"})}),$jsx("text",{fg:alias?theme.accent:theme.textMuted,children:alias?"[x] shell alias":"[ ] shell alias"})]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:valid?"Enter create \xB7 Tab next field \xB7 Space toggle \xB7 Esc cancel":err??"type a name"})})]})};var import_react81=__toESM(require_react_production(),1);import{rmSync as rmSync3,mkdtempSync as mkdtempSync4}from"fs";import{join as join14}from"path";import{tmpdir as tmpdir4}from"os";var shq=(s)=>`'${s.replace(/'/g,"'\\''")}'`;function openInstallDistribution(dialog,gw){return new Promise((resolve4)=>{askSource(dialog,gw,(r)=>{dialog.clear(),resolve4(r)})})}function askSource(dialog,gw,done){dialog.replace($jsx(Step1,{onSubmit:(source)=>preview(dialog,gw,source,done),onCancel:()=>done(null)}))}async function preview(dialog,gw,source,done){let tmp=mkdtempSync4(join14(tmpdir4(),"herm-dist-preview-")),cleanup=()=>{try{rmSync3(tmp,{recursive:!0,force:!0})}catch{}},state2={cancelled:!1},cancel=()=>{state2.cancelled=!0,cleanup(),done(null)};dialog.replace($jsx(Loading2,{label:`Cloning ${source}\u2026`,onCancel:cancel}),void 0,{ownCancel:!0});let cmd=`git clone --depth 1 --quiet ${shq(source)} ${shq(tmp)} 2>&1`,r=await gw.request("shell.exec",{command:cmd}).catch((e)=>({stdout:"",stderr:e.message,code:-1}));if(state2.cancelled)return;if(r.code!==0){cleanup(),dialog.replace($jsx(ErrorBox,{title:"Clone failed",body:(r.stderr||r.stdout||`exit ${r.code}`).trim(),onClose:()=>done(null)}));return}let manifest3=readDistributionManifest(tmp);if(!manifest3){cleanup(),dialog.replace($jsx(ErrorBox,{title:"Not a distribution",body:`No valid distribution.yaml at the root of ${source}. A manifest must declare at minimum a 'name:' key.`,onClose:()=>done(null)}));return}dialog.replace($jsx(ConfirmStep,{source,manifest:manifest3,onConfirm:(r2)=>{cleanup(),done(r2)},onCancel:()=>{cleanup(),done(null)}}),void 0,{ownCancel:!0})}var Step1=(p)=>{let theme=useTheme().theme,[value,setValue]=import_react81.useState("");return useKeyboard((key3)=>{if(key3.name==="escape")return p.onCancel()}),$jsxs("box",{flexDirection:"column",width:64,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"Install Distribution"})})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Source \u2014 git URL, github.com/owner/repo, or local directory"})}),$jsxs("box",{height:1,flexDirection:"row",overflow:"hidden",children:[$jsx("box",{flexShrink:0,children:$jsx("text",{fg:theme.accent,children:"\u2503 "})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("input",{value,onInput:setValue,onSubmit:()=>{let v2=value.trim();if(v2)p.onSubmit(v2)},focused:!0,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement})})]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:value.trim()?"Enter preview \xB7 Esc cancel":"Esc cancel"})})]})},Loading2=(p)=>{let theme=useTheme().theme;return useKeyboard((key3)=>{if(key3.name==="escape")return p.onCancel()}),$jsxs("box",{flexDirection:"column",width:54,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"Install Distribution"})})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx(Spinner,{color:theme.accent,label:p.label})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Esc to cancel"})})]})},ErrorBox=(p)=>{let theme=useTheme().theme,keys=useKeys();return useKeyboard((key3)=>{if(keys.match("dialog.accept",key3)||keys.match("dialog.cancel",key3))return p.onClose()}),$jsxs("box",{flexDirection:"column",width:68,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.error,children:$jsx("strong",{children:p.title})})}),$jsx("box",{height:1}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",fg:theme.text,children:p.body})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Enter / Esc to close"})})]})},ORDER4=["name","alias"],ConfirmStep=(p)=>{let theme=useTheme().theme,keys=useKeys(),[name,setName]=import_react81.useState(""),[alias,setAlias]=import_react81.useState(!1),[field,setField]=import_react81.useState("name"),fire=()=>p.onConfirm({source:p.source,manifest:p.manifest,name:name.trim()||null,alias}),move=(dir)=>{let i=ORDER4.indexOf(field);setField(ORDER4[(i+dir+ORDER4.length)%ORDER4.length])};useKeyboard((key3)=>{if(key3.name==="escape")return p.onCancel();if(key3.name==="tab")return move(key3.shift?-1:1);if(field!=="name"&&keys.match("dialog.accept",key3))return fire();if(field==="alias"&&(key3.name==="space"||key3.name===" "))return setAlias((a)=>!a)});let m2=p.manifest,reqEnv=m2.env_requires.filter((e)=>e.required),optEnv=m2.env_requires.filter((e)=>!e.required),focusBg=(f)=>field===f?theme.backgroundElement:void 0;return $jsxs("box",{flexDirection:"column",width:72,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"Install Distribution"})})}),$jsx("box",{height:1}),$jsx(KV2,{label:"Name",value:`${m2.name}${m2.version?` v${m2.version}`:""}`,theme}),m2.description?$jsx(KV2,{label:"About",value:m2.description,theme,wrap:!0}):null,m2.author?$jsx(KV2,{label:"Author",value:m2.author,theme}):null,m2.license?$jsx(KV2,{label:"License",value:m2.license,theme}):null,m2.hermes_requires?$jsx(KV2,{label:"Requires",value:`hermes ${m2.hermes_requires}`,theme}):null,$jsx(KV2,{label:"Source",value:p.source,theme}),m2.distribution_owned.length>0?$jsx(KV2,{label:"Owns",value:m2.distribution_owned.join(", "),theme,wrap:!0}):null,m2.env_requires.length>0?$jsx(KV2,{label:"Env",value:envSummary(reqEnv,optEnv),theme}):null,$jsx("box",{height:1}),$jsxs("box",{height:1,flexDirection:"row",backgroundColor:focusBg("name"),children:[$jsx("box",{width:11,children:$jsx("text",{fg:theme.textMuted,children:"Name as"})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:field==="name"?$jsx("input",{value:name,onInput:setName,onSubmit:fire,focused:!0,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement}):$jsx("text",{fg:name?theme.text:theme.textMuted,children:name||`(${m2.name})`})})]}),$jsxs("box",{height:1,flexDirection:"row",backgroundColor:focusBg("alias"),children:[$jsx("box",{width:11,children:$jsx("text",{fg:theme.textMuted,children:"Alias"})}),$jsx("text",{fg:alias?theme.accent:theme.textMuted,children:alias?"[x] create shell wrapper":"[ ] create shell wrapper"})]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Enter install \xB7 Tab next field \xB7 Space toggle \xB7 Esc cancel"})})]})},KV2=(p)=>$jsxs("box",{flexDirection:"row",minHeight:1,children:[$jsx("box",{width:11,flexShrink:0,children:$jsx("text",{fg:p.theme.textMuted,children:p.label})}),$jsx("box",{flexGrow:1,minWidth:0,children:$jsx("text",{fg:p.theme.text,wrapMode:p.wrap?"word":"none",children:p.value})})]});function envSummary(req,opt){return[req.length>0?`${req.length} required (${req.map((e)=>e.name).join(", ")})`:"",opt.length>0?`${opt.length} optional`:""].filter(Boolean).join(" \xB7 ")}var running=(s)=>!s||s==="running"||s==="queued";function tree(recs,live,now){let ids=new Set(recs.map((r)=>r.subagent_id)),by=new Map;for(let r of recs){let k2=r.parent_id&&ids.has(r.parent_id)?r.parent_id:"";(by.get(k2)??by.set(k2,[]).get(k2)).push(r)}let build2=(r)=>{let kids=(by.get(r.subagent_id)??[]).map(build2),lv=live.get(r.subagent_id)??{},dur3=r.started_at!=null?Math.max(0,now-r.started_at):0,a={agents:1,tools:lv.tool_count??r.tool_count??0,dur:dur3,tok:(lv.input_tokens??0)+(lv.output_tokens??0),cost:lv.cost_usd??0,active:running(lv.status??r.status)?1:0,depth:0,hot:0};for(let k2 of kids)a={agents:a.agents+k2.agg.agents,tools:a.tools+k2.agg.tools,dur:a.dur+k2.agg.dur,tok:a.tok+k2.agg.tok,cost:a.cost+k2.agg.cost,active:a.active+k2.agg.active,depth:Math.max(a.depth,k2.agg.depth+1),hot:0};return a.hot=a.dur>0?a.tools/a.dur:0,{rec:r,agg:a,kids}};return(by.get("")??[]).map(build2)}function totals(nodes){let z2={agents:0,tools:0,dur:0,tok:0,cost:0,active:0,depth:0,hot:0};for(let n of nodes)z2.agents+=n.agg.agents,z2.tools+=n.agg.tools,z2.dur+=n.agg.dur,z2.tok+=n.agg.tok,z2.cost+=n.agg.cost,z2.active+=n.agg.active,z2.depth=Math.max(z2.depth,n.agg.depth+1);return z2.hot=z2.dur>0?z2.tools/z2.dur:0,z2}var SPARK=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"];function spark(nodes){let w2=[],walk2=(ns,d2)=>{if(ns.length===0)return;w2[d2]=(w2[d2]??0)+ns.length;for(let n of ns)walk2(n.kids,d2+1)};if(walk2(nodes,0),w2.length===0)return"";let max=Math.max(...w2);return w2.map((v2)=>v2<=0?" ":SPARK[Math.min(7,Math.ceil(v2/max*7))]).join("")}var tk=(n)=>n<1000?String(Math.round(n)):n<1e4?`${(n/1000).toFixed(1)}k`:`${Math.round(n/1000)}k`,$$=(n)=>n<=0?"":n<0.01?"<$0.01":n<10?`$${n.toFixed(2)}`:`$${n.toFixed(1)}`,sec=(s)=>{if(s<60)return`${Math.round(s)}s`;let m2=Math.floor(s/60),r=Math.round(s-m2*60);return r===0?`${m2}m`:`${m2}m${r}s`};function summary(a){let p=[`d${a.depth}`,`${a.agents} agent${a.agents===1?"":"s"}`];if(a.tools>0)p.push(`${a.tools} tools`);if(a.dur>0)p.push(sec(a.dur));if(a.tok>0)p.push(`${tk(a.tok)} tok`);if(a.cost>0)p.push($$(a.cost));if(a.active>0)p.push(`\u26A1${a.active}`);return p.join(" \xB7 ")}function heat(hot,peak,buckets){if(hot<=0||peak<=0||buckets<=1)return 0;return Math.min(buckets-1,Math.round(Math.min(1,hot/peak)*(buckets-1)))}function peak(nodes){let p=0,walk2=(ns)=>{for(let n of ns)p=Math.max(p,n.agg.hot),walk2(n.kids)};return walk2(nodes),p}var ProfileRow=import_react83.memo((props)=>{let theme=useTheme().theme,{p,idx:i}=props,[x2,setX]=import_react83.useState(!1);return $jsxs("box",{id:props.id,flexDirection:"row",height:1,backgroundColor:props.selected?theme.backgroundElement:void 0,onMouseOver:()=>props.onHover(i),onMouseDown:()=>props.onEnter(i),children:[$jsx("box",{width:2,children:$jsx("text",{fg:props.selected?theme.primary:theme.text,children:props.selected?"\u25B8 ":" "})}),$jsx("box",{flexGrow:1,minWidth:8,height:1,overflow:"hidden",children:$jsxs("text",{children:[$jsx("span",{fg:p.is_active?theme.accent:theme.text,children:p.is_active?$jsx("strong",{children:p.name}):p.name}),p.is_sticky?$jsx("span",{fg:theme.warning,children:" \u2605"}):null,p.distribution?$jsx("span",{fg:theme.info,children:" \u2B22"}):null,p.gateway_running?$jsx("span",{fg:theme.success,children:" \u25CF"}):null]})}),$jsx("box",{width:4,height:1,children:$jsx("text",{fg:theme.textMuted,children:p.is_active?" you":""})}),p.is_default||p.is_active?$jsx("box",{width:3}):$jsx("box",{width:3,onMouseDown:(e)=>{e.stopPropagation(),props.onDelete(i)},onMouseOver:()=>setX(!0),onMouseOut:()=>setX(!1),children:$jsx("text",{fg:x2?theme.error:theme.textMuted,children:" \u2715"})})]})}),DistBlock=import_react83.memo((props)=>{let theme=useTheme().theme,d2=props.d,req=d2.env_requires.filter((e)=>e.required).length,opt=d2.env_requires.length-req,link2=d2.source?{file:d2.source,relative:d2.source,label:d2.source}:props.yaml,when2=d2.installed_at?Date.parse(d2.installed_at):NaN;return $jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.info,children:$jsx("strong",{children:"Distribution"})})}),$jsx(KVBlock,{rows:[["Name",d2.name],["Version",`v${d2.version}`],["Requires",d2.hermes_requires?`Hermes ${d2.hermes_requires}`:void 0]]}),$jsx(KVLink,{label:"Source",source:link2,text:d2.source||props.yaml.label}),$jsx(KVBlock,{rows:[["Installed at",Number.isFinite(when2)?ago(when2/1000):void 0],["Env vars",d2.env_requires.length?`${req} required, ${opt} optional`:void 0]]})]})}),ProfileDetail=import_react83.memo((props)=>{let{theme,syntaxStyle}=useTheme(),p=props.p,s=props.stats;return $jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsxs("box",{flexDirection:"column",width:"100%",children:[$jsx("box",{height:1,children:$jsxs("text",{fg:theme.accent,children:[$jsx("strong",{children:p.name}),p.is_sticky?$jsx("span",{fg:theme.warning,children:" \u2605 sticky default"}):null]})}),$jsx("box",{height:1}),$jsx(KVLink,{label:"Path",source:p.sources.dir,text:p.sources.dir.relative}),$jsx(KV,{label:"Active",value:p.is_active?"yes (this session)":"no",fg:p.is_active?theme.accent:theme.textMuted}),$jsx(KV,{label:"Model",value:p.model??"\u2014"}),$jsx(KV,{label:"Provider",value:p.provider??"\u2014"}),$jsx(KV,{label:"Skills",value:String(p.skill_count)}),$jsx(KV,{label:"Sessions",value:s?s.sessions==null?"\u2014":`${fmt(s.sessions)} (${fmt(s.messages??0)} msgs)`:"\u2026"}),$jsx(KV,{label:"Cron jobs",value:s?s.crons==null?"\u2014":String(s.crons):"\u2026"}),$jsx(KV,{label:"Theme",value:s?s.prefs?.theme??"\u2014":"\u2026"}),$jsx(KV,{label:"Avatar",value:s?s.prefs?.eikon??"\u2014":"\u2026"}),s?.prefs?.keys?$jsx(KV,{label:"Keybinds",value:`${s.prefs.keys} overrides`}):null,$jsx(KV,{label:"Gateway",value:p.gateway_running?"running":"stopped",fg:p.gateway_running?theme.success:theme.textMuted}),p.has_alias?$jsx(KV,{label:"Alias",value:`${p.name} (shell)`}):null,p.distribution?$jsx(DistBlock,{d:p.distribution,yaml:p.sources.distribution}):null,$jsx("box",{height:1}),$jsx(KVLink,{label:"Config",source:p.sources.config}),$jsx(KVLink,{label:"Soul",source:p.sources.soul}),p.has_env?$jsx(KVLink,{label:"Env",source:p.sources.env}):$jsx(KV,{label:"Env",value:"\u2014"}),p.soul_preview?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"SOUL.md"})}),$jsx("markdown",{content:p.soul_preview,fg:theme.markdownText,syntaxStyle})]}):null]})})}),HOT=["\u2800","\u2801","\u2803","\u2807","\u280F","\u281F","\u283F","\u287F","\u28FF"],DelegRow=import_react83.memo((props)=>{let theme=useTheme().theme,{r,idx:i,now}=props,[x2,setX]=import_react83.useState(!1),up=r.started_at?dur2(now-r.started_at):"\u2014",hotFg=[theme.textMuted,theme.textMuted,theme.text,theme.info,theme.info,theme.accent,theme.accent,theme.warning,theme.error][props.hot]??theme.textMuted;return $jsxs("box",{id:props.id,flexDirection:"row",height:1,backgroundColor:props.selected?theme.backgroundElement:void 0,onMouseOver:()=>props.onHover(i),children:[$jsx("box",{width:2,children:$jsx("text",{fg:props.selected?theme.primary:theme.text,children:props.selected?"\u25B8 ":" "})}),$jsx("box",{width:2,children:$jsxs("text",{fg:hotFg,children:[HOT[props.hot]," "]})}),$jsx("box",{flexGrow:1,minWidth:8,height:1,overflow:"hidden",children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:"\xB7 ".repeat(r.depth)}),$jsx("span",{fg:theme.text,children:r.goal.replace(/\s+/g," ")})]})}),$jsx("box",{width:14,height:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:trunc5(r.model??"",13)})}),$jsx("box",{width:5,height:1,flexDirection:"row",justifyContent:"flex-end",children:$jsx("text",{fg:theme.textMuted,children:String(r.tool_count??0)})}),$jsx("box",{width:8,height:1,flexDirection:"row",justifyContent:"flex-end",children:$jsx("text",{fg:theme.textMuted,children:up})}),$jsx("box",{width:3,onMouseDown:(e)=>{e.stopPropagation(),props.onKill(i)},onMouseOver:()=>setX(!0),onMouseOut:()=>setX(!1),children:$jsx("text",{fg:x2?theme.error:theme.textMuted,children:" \u2715"})})]})});function preorder(recs){let byParent=new Map;for(let r of recs){let k2=r.parent_id??null;(byParent.get(k2)??byParent.set(k2,[]).get(k2)).push(r)}let out=[],seen=new Set,walk2=(k2)=>{for(let r of byParent.get(k2)??[]){if(seen.has(r.subagent_id))continue;seen.add(r.subagent_id),out.push(r),walk2(r.subagent_id)}};walk2(null);for(let r of recs)if(!seen.has(r.subagent_id))out.push(r);return out}var DelegDetail=import_react83.memo((props)=>{let theme=useTheme().theme,{r,live,agg,now}=props,tc=live?.tool_count??r.tool_count??0,tr=trail(r.subagent_id);return $jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsxs("box",{flexDirection:"column",width:"100%",children:[$jsx("box",{minHeight:1,children:$jsx("text",{fg:theme.accent,wrapMode:"word",children:$jsx("strong",{children:r.goal})})}),agg&&agg.agents>1?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:summary(agg)})}):null,$jsx("box",{height:1}),$jsx(KVBlock,{rows:[["Status",live?.status??r.status??"running"],["Model",r.model??"\u2014"],["Depth",String(r.depth)],["Parent",r.parent_id??"(root)"],["Uptime",r.started_at?dur2(now-r.started_at):"\u2014"],["Tools",String(tc)],["Tokens",live?`${fmt(live.input_tokens??0)} in / ${fmt(live.output_tokens??0)} out`:void 0],["Cost",live?.cost_usd!=null?`$${live.cost_usd.toFixed(4)}`:void 0]]}),live?.thinking?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"thinking"})}),$jsx("box",{minHeight:1,children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:trunc5(live.thinking,200)})})]}):null,tr.length>0?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"recent tools"})}),tr.slice(-8).map((t2,i)=>$jsx("box",{height:1,overflow:"hidden",children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:"\u2503 "}),$jsx("span",{fg:theme.text,children:t2.name.padEnd(14)}),$jsx("span",{fg:theme.textMuted,children:t2.preview?trunc5(t2.preview.replace(/\s+/g," "),40):""})]})},i))]}):null]})})}),Agents=import_react83.memo((props)=>{let theme=useTheme().theme,gw=useGateway(),dialog=useDialog(),toast=useToast(),cmd=useCommand(),[pane,setPane]=import_react83.useState("profiles"),[pView,setPView]=import_react83.useState("list"),[profiles,setProfiles]=import_react83.useState([]),[deleg,setDeleg]=import_react83.useState(null),[liveMap,setLiveMap]=import_react83.useState(()=>new Map),[now,setNow]=import_react83.useState(()=>Date.now()/1000),[pSel,setPSel]=import_react83.useState(0),[dSel,setDSel]=import_react83.useState(0),[err,setErr]=import_react83.useState(""),[delegErr,setDelegErr]=import_react83.useState(""),delegGen=import_react83.useRef(0),active2=preorder(deleg?.active??[]),nodes=tree(deleg?.active??[],liveMap,now),all=totals(nodes),hotPeak=peak(nodes),aggOf=new Map;{let walk2=(ns)=>{for(let n of ns)aggOf.set(n.rec.subagent_id,n.agg),walk2(n.kids)};walk2(nodes)}let live=import_react83.useRef({profiles,active:active2});live.current={profiles,active:active2};let gwHome=import_react83.useRef(void 0),[stats,setStats]=import_react83.useState(()=>new Map),[sticky,setSticky]=import_react83.useState(stickyDefault),loadProfiles=import_react83.useCallback(()=>{setStats(new Map),setSticky(stickyDefault()),listProfiles(gwHome.current).then((ps)=>{setProfiles(ps),setErr("")}).catch((e)=>setErr(`profiles: ${e.message}`))},[]);import_react83.useEffect(()=>{gw.request("config.get",{key:"profile"}).then((r)=>{gwHome.current=r.home}).catch(()=>{}).finally(loadProfiles)},[gw,loadProfiles]);let loadDeleg=import_react83.useCallback(()=>{let current=++delegGen.current;gw.request("delegation.status").then((r)=>{if(delegGen.current!==current)return;setDeleg(r),setNow(Date.now()/1000),setDelegErr("")}).catch((e)=>{if(delegGen.current===current)setDelegErr(e instanceof Error?e.message:String(e))})},[gw]);import_react83.useEffect(loadDeleg,[loadDeleg]),import_react83.useEffect(()=>()=>{delegGen.current++},[]),import_react83.useEffect(()=>{if(!props.focused)return;let ms2=(deleg?.active.length??0)>0?1500:5000,t2=setInterval(loadDeleg,ms2);return()=>clearInterval(t2)},[props.focused,deleg?.active.length,loadDeleg]),useGatewayEvent((ev)=>{if(!ev.type.startsWith("subagent."))return;let p=ev.payload,id=p.subagent_id;if(!id)return;if(setLiveMap((prev)=>{let next2=new Map(prev),cur=next2.get(id)??{tool_count:0};switch(ev.type){case"subagent.start":next2.set(id,{tool_count:0});break;case"subagent.tool":next2.set(id,{...cur,tool_count:cur.tool_count+1,last_tool:p.tool_name,last_preview:p.tool_preview});break;case"subagent.thinking":next2.set(id,{...cur,thinking:p.text});break;case"subagent.complete":next2.set(id,{...cur,status:p.status,input_tokens:p.input_tokens,output_tokens:p.output_tokens,cost_usd:p.cost_usd});break}return next2}),ev.type==="subagent.start"||ev.type==="subagent.complete")loadDeleg()});let sh=import_react83.useCallback((cmd2)=>gw.request("shell.exec",{command:cmd2}).then((r)=>{if(r.code!==0)throw Error((r.stderr||r.stdout||"exit "+r.code).trim());return r.stdout}),[gw]),pHover=import_react83.useCallback((i)=>setPSel(i),[]),dHover=import_react83.useCallback((i)=>setDSel(i),[]),pDelete=import_react83.useCallback(async(i)=>{let p=live.current.profiles[i];if(!p||p.is_default||p.is_active)return;let warn=p.gateway_running?`
|
|
4130
4130
|
|
|
4131
4131
|
Its gateway is running and will be stopped first (may take up to ~10s).`:"";if(!await openConfirm(dialog,{title:"Delete Profile?",body:`'${p.name}' \u2014 config, env, memory, skills, and sessions will be removed. This cannot be undone.${warn}`,yes:"delete",danger:!0}))return;sh(`hermes profile delete ${p.name} -y`).then(()=>{toast.show({variant:"success",message:`Deleted '${p.name}'`}),loadProfiles()}).catch((e)=>toast.show({variant:"error",message:e.message}))},[sh,dialog,toast,loadProfiles]),pSwitch=import_react83.useCallback(async(i)=>{let p=live.current.profiles[i];if(!p||p.is_active||!props.onSwitchProfile)return;if(await openConfirm(dialog,{title:`Switch to '${p.name}'?`,body:"The gateway restarts under this profile's HERMES_HOME. The current session ends (it stays in the outgoing profile's history).",yes:"switch"}))props.onSwitchProfile(p.path,p.name)},[dialog,props.onSwitchProfile]),pUpdate=import_react83.useCallback(async(p,force)=>{let cmd2=`hermes profile update ${p.name} -y${force?" --force-config":""}`;toast.show({variant:"info",message:`Updating '${p.name}'\u2026`});try{await sh(cmd2),toast.show({variant:"success",message:`Updated '${p.name}'`})}catch(err2){let error=err2 instanceof Error?err2:Error(String(err2));if(!p.is_active||!props.onSwitchProfile||!/gateway (?:exited|restarted)/i.test(error.message)){toast.show({variant:"error",message:error.message});return}}if(p.is_active&&props.onSwitchProfile){props.onSwitchProfile(p.path,p.name);return}loadProfiles()},[sh,toast,loadProfiles,props.onSwitchProfile]),pEnter=import_react83.useCallback((i)=>{setPSel(i);let p=live.current.profiles[i];if(!p)return;openProfileMenu(dialog,p,{switch:props.onSwitchProfile?()=>pSwitch(i):void 0,sticky:(pp)=>sh(`hermes profile use ${pp.name}`).then(()=>{toast.show({variant:"success",message:`Sticky default \u2192 '${pp.name}'`}),loadProfiles()}).catch((e)=>toast.show({variant:"error",message:e.message})),unsticky:()=>sh("hermes profile use --clear").then(()=>{toast.show({variant:"info",message:"Cleared sticky default"}),loadProfiles()}).catch((e)=>toast.show({variant:"error",message:e.message})),export:(pp)=>sh(`hermes profile export ${pp.name}`).then((out)=>toast.show({variant:"success",message:trunc5(out.trim()||`Exported '${pp.name}'`,80)})).catch((e)=>toast.show({variant:"error",message:e.message})),remove:()=>pDelete(i),update:(pp,force)=>pUpdate(pp,force)})},[sh,dialog,toast,loadProfiles,pDelete,pSwitch,pUpdate,props.onSwitchProfile]),dKill=import_react83.useCallback(async(i)=>{let r=live.current.active[i];if(!r)return;if(!await openConfirm(dialog,{title:"Interrupt subagent?",body:`${trunc5(r.goal,120)}
|
|
4132
4132
|
|
|
@@ -4140,14 +4140,14 @@ The child returns whatever partial result it has so far.`,yes:"interrupt",danger
|
|
|
4140
4140
|
FROM task_attachments WHERE task_id = ? ORDER BY created_at ASC, id ASC`).all(id).map((r)=>toAttachment(s,r))}catch{return[]}},latestSummary=(conn2,id)=>{try{return conn2.query(`SELECT summary FROM task_runs
|
|
4141
4141
|
WHERE task_id = ? AND summary IS NOT NULL AND summary != ''
|
|
4142
4142
|
ORDER BY id DESC LIMIT 1`).get(id)?.summary??null}catch{return null}};function tailLogOf(s,id,bytes=16384){let path4=`${logsDir(s)}/${id}.log`;if(!existsSync19(path4))return null;try{let size=statSync8(path4).size,want=Math.min(size,bytes),fd=openSync3(path4,"r"),buf=Buffer.alloc(want);readSync3(fd,buf,0,want,size-want),closeSync3(fd);let out=buf.toString("utf-8");if(size>bytes){let nl=out.indexOf(`
|
|
4143
|
-
`);if(nl>=0&&nl<out.length-1)out=out.slice(nl+1)}return out}catch{return null}}function assignees(s=slug){let seen=new Set,dir=kp("profiles");if(existsSync19(dir)){for(let e of readdirSync9(dir,{withFileTypes:!0}))if(e.isDirectory())seen.add(e.name)}let conn2=dbOf(s);if(conn2)try{for(let r of conn2.query("SELECT DISTINCT assignee FROM tasks WHERE assignee IS NOT NULL AND status != 'archived'").all())seen.add(r.assignee)}catch{}return[...seen].sort()}var q3=(s)=>/^[A-Za-z0-9._\/:+=-]+$/.test(s)?s:`'${s.replace(/'/g,"'\\''")}'`;import{existsSync as existsSync20}from"fs";import{join as join15}from"path";var INLINE2=process.env.HERM_IO_INLINE==="1",entry2=()=>{let js=join15(import.meta.dirname,"kanban.worker.js");return new URL(existsSync20(js)?"./kanban.worker.js":"./kanban.worker.ts",import.meta.url)},state2={worker:null,seq:0,pending:new Map},spawn3=()=>{if(state2.worker)return state2.worker;let worker=new Worker(entry2());return worker.onmessage=(e)=>{state2.pending.get(e.data.id)?.(e.data),state2.pending.delete(e.data.id)},worker.onerror=(e)=>{let err=`kanban worker: ${e.message}`;for(let resolve4 of state2.pending.values())resolve4({id:-1,ok:!1,err});if(state2.pending.clear(),state2.worker===worker)state2.worker=null;worker.terminate()},state2.worker=worker};async function patch(board,task,value2){let root3=kanbanRoot();if(INLINE2)return patchAt(root3,board,task,value2);return new Promise((resolve4,reject)=>{let id=++state2.seq;state2.pending.set(id,(res)=>res.ok?resolve4(res.v):reject(Error(res.err))),spawn3().postMessage({id,root:root3,board,task,patch:value2})})}function close(){state2.worker?.terminate(),state2.worker=null;for(let resolve4 of state2.pending.values())resolve4({id:-1,ok:!1,err:"kanban worker: closed"});state2.pending.clear()}var import_react89=__toESM(require_react_production(),1);function openCreateTask(dialog,opts){return new Promise((resolve4)=>{let done=(r)=>{dialog.clear(),resolve4(r)};dialog.replace($jsx(Form2,{pool:opts.assignees,parent:opts.parent,done}),void 0,{ownCancel:!0})})}var CORE=["title","body","assignee","priority","triage","more"],MORE=["tenant","project","workspace","maxRuntime","skills"],SELECTY=new Set(["assignee","priority","workspace"]),MAX_RUNTIME_RE=/^\d+[smhd]?$/,SKILL_MATCHES_MAX=6,wsLabel=(w2)=>w2.kind==="scratch"?"scratch":w2.kind==="worktree"?"worktree":`dir @ ${w2.path}`,Form2=(p)=>{let theme=useTheme().theme,gw=useGateway(),body=import_react89.useRef(null),[bodyText,setBodyText]=import_react89.useState(""),[field,setField]=import_react89.useState("title"),[more,setMore]=import_react89.useState(!1),[picker,setPicker]=import_react89.useState(null),[title,setTitle]=import_react89.useState(""),[assignee,setAssignee]=import_react89.useState(null),[priority,setPriority]=import_react89.useState(0),[triage,setTriage]=import_react89.useState(!1),[tenant,setTenant]=import_react89.useState(""),[project,setProject]=import_react89.useState(""),[workspace,setWorkspace]=import_react89.useState({kind:"scratch"}),[maxRuntime,setMaxRuntime]=import_react89.useState(""),[catalog3,setCatalog]=import_react89.useState([]),[skills,setSkills]=import_react89.useState([]),[filter,setFilter]=import_react89.useState(""),[matchIdx,setMatchIdx]=import_react89.useState(0);import_react89.useEffect(()=>{let live=!0;return gw.request("skills.manage",{action:"list"}).then((r)=>{if(!live)return;let raw=r.skills??{},out=[];for(let cat of Object.keys(raw))for(let name of raw[cat]??[])out.push({cat,name});out.sort((a,b2)=>a.name.localeCompare(b2.name)),setCatalog(out)}).catch(()=>{}),()=>{live=!1}},[gw]);let matches=import_react89.useMemo(()=>{if(!filter.trim())return[];let q4=filter.trim().toLowerCase(),picked=new Set(skills),hits=[];for(let s of catalog3){if(picked.has(s.name))continue;if(s.name.toLowerCase().includes(q4)||s.cat.toLowerCase().includes(q4))hits.push(s);if(hits.length>=SKILL_MATCHES_MAX)break}return hits},[catalog3,filter,skills]);import_react89.useEffect(()=>{if(matchIdx>0&&matchIdx>=matches.length)setMatchIdx(Math.max(0,matches.length-1))},[matches.length,matchIdx]);let order2=()=>more?[...CORE,...MORE]:CORE,titleOk=title.trim().length>0,runtimeOk=maxRuntime.trim()===""||MAX_RUNTIME_RE.test(maxRuntime.trim()),valid=titleOk&&runtimeOk,submit2=()=>{if(!valid)return;p.done({title:title.trim(),body:(body.current?.plainText??bodyText).trim(),assignee,priority,parent:p.parent?.id??null,triage,tenant:tenant.trim()||null,project:project.trim()||null,workspace,maxRuntime:maxRuntime.trim()||null,skills})},moveField=(dir)=>{let o=order2(),i=o.indexOf(field),next3=o[(i+dir+o.length)%o.length];setField(next3)},openPicker=()=>{if(field==="assignee")return setPicker({kind:"assignee"});if(field==="priority")return setPicker({kind:"priority"});if(field==="workspace")return setPicker({kind:"workspace"})},commitMatch=()=>{let hit=matches[matchIdx];if(!hit)return!1;return setSkills((s)=>s.includes(hit.name)?s:[...s,hit.name]),setFilter(""),setMatchIdx(0),!0},popSkill=()=>setSkills((s)=>s.slice(0,-1));if(useKeyboard((key3)=>{if(picker){if(key3.name==="escape")setPicker(picker.kind==="dirPath"?{kind:"workspace"}:null);return}if(key3.name==="escape")return p.done(null);if(key3.name==="return"){if(key3.ctrl)return submit2();if(field!=="body")return submit2();return}if(field==="skills"){if(key3.name==="tab"){if(!key3.shift&&commitMatch())return;return moveField(key3.shift?-1:1)}if(key3.name==="backspace"){if(filter.length>0)return setFilter((f)=>f.slice(0,-1));return popSkill()}if(key3.name==="up"){if(matches.length>0)return setMatchIdx((i)=>Math.max(0,i-1));return moveField(-1)}if(key3.name==="down"){if(matches.length>0)return setMatchIdx((i)=>Math.min(matches.length-1,i+1));return moveField(1)}if(key3.raw&&key3.raw.length===1&&/[A-Za-z0-9_\-/ ]/.test(key3.raw))setFilter((f)=>f+key3.raw),setMatchIdx(0);return}if(key3.name==="tab")return moveField(key3.shift?-1:1);if(key3.name==="up"){if(field==="body"){if((body.current?.logicalCursor.row??0)>0)return}return moveField(-1)}if(key3.name==="down"){if(field==="body"){let row3=body.current?.logicalCursor.row??0,last4=(body.current?.lineCount??1)-1;if(row3<last4)return}return moveField(1)}if(field==="more"){if(key3.name==="return"||key3.name==="space")return setMore((m2)=>!m2);return}if(field==="triage"&&key3.name==="space")return setTriage((t2)=>!t2);if(SELECTY.has(field)&&key3.name==="space")return openPicker()}),picker?.kind==="assignee"){let opts=[{title:"(unassigned)",value:""},...p.pool.map((n)=>({title:n,value:n}))];return $jsx(DialogSelect,{title:"Assignee",options:opts,placeholder:"Search profiles\u2026",current:assignee??"",onSelect:(o)=>{setAssignee(o.value||null),setPicker(null)}})}if(picker?.kind==="priority"){let opts=Array.from({length:10},(_2,n)=>({title:n===0?"P0 (none)":`P${n}`,value:String(n),description:n===0?"default":n<=2?"normal":n<=5?"elevated":"high"}));return $jsx(DialogSelect,{title:"Priority",options:opts,filterable:!1,current:String(priority),onSelect:(o)=>{setPriority(Number(o.value)),setPicker(null)}})}if(picker?.kind==="workspace")return $jsx(DialogSelect,{title:"Workspace",options:[{title:"scratch",value:"scratch",description:"isolated temp dir under the board root (default)"},{title:"worktree",value:"worktree",description:"git worktree at .worktrees/<task-id> \u2014 worker runs `git worktree add`"},{title:"dir:\u2026",value:"dir",description:"an exact absolute path (prompts next)"}],filterable:!1,current:workspace.kind,onSelect:(o)=>{if(o.value==="scratch")return setWorkspace({kind:"scratch"}),setPicker(null);if(o.value==="worktree")return setWorkspace({kind:"worktree"}),setPicker(null);return setPicker({kind:"dirPath",value:workspace.kind==="dir"?workspace.path:""})}});if(picker?.kind==="dirPath"){let val=picker.value,ok=val.trim().length>0&&val.trim().startsWith("/");return $jsxs("box",{flexDirection:"column",width:64,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"Directory path"})})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"absolute path (required)"})}),$jsxs("box",{height:1,flexDirection:"row",overflow:"hidden",children:[$jsx("box",{flexShrink:0,children:$jsx("text",{fg:theme.accent,children:"\u2503 "})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("input",{value:val,onInput:(v2)=>setPicker({kind:"dirPath",value:v2}),onSubmit:()=>{if(!ok)return;setWorkspace({kind:"dir",path:val.trim()}),setPicker(null)},focused:!0,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement},"dirpath")})]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:ok?"Enter confirm \xB7 Esc back":"absolute path required \xB7 Esc back"})})]})}let lbl=(f,text5)=>$jsx("box",{width:13,flexShrink:0,children:$jsxs("text",{fg:field===f?theme.accent:theme.textMuted,children:[field===f?"\u25B8 ":" ",text5]})}),textRow=(f,label2,value2,set3,placeholder)=>$jsxs("box",{height:1,flexDirection:"row",children:[lbl(f,label2),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("input",{value:value2,onInput:set3,onSubmit:submit2,focused:field===f,placeholder,textColor:theme.text,placeholderColor:theme.textMuted,backgroundColor:field===f?theme.backgroundElement:void 0,focusedBackgroundColor:theme.backgroundElement},`field-${f}`)})]}),valRow=(f,label2,value2,hint)=>$jsxs("box",{height:1,flexDirection:"row",children:[lbl(f,label2),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("text",{fg:theme.text,children:value2})}),field===f?$jsx("box",{flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:hint})}):null]}),skillsRows=()=>{let focused=field==="skills",empty=skills.length===0&&!focused;return $jsxs($Fragment,{children:[$jsxs("box",{height:1,flexDirection:"row",children:[lbl("skills","Skills"),$jsxs("box",{flexGrow:1,minWidth:0,height:1,flexDirection:"row",overflow:"hidden",children:[skills.map((n)=>$jsx(FilterChip,{label:n,state:"in",gap:0},n)),empty?$jsx("text",{fg:theme.textMuted,children:"(none \u2014 focus field to pick)"}):$jsxs("box",{flexDirection:"row",marginLeft:skills.length>0?1:0,children:[$jsx("text",{fg:theme.text,children:filter}),focused?$jsx("text",{fg:theme.accent,children:"\u2588"}):null]})]})]}),focused&&matches.length>0?$jsx("box",{flexDirection:"column",children:matches.map((s,i)=>$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:13,flexShrink:0,children:$jsx("text",{fg:i===matchIdx?theme.accent:theme.textMuted,children:i===matchIdx?" \u25B8 ":" "})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsxs("text",{children:[$jsx("span",{fg:i===matchIdx?theme.accent:theme.text,children:s.name}),$jsx("span",{fg:theme.textMuted,children:` ${s.cat}`})]})})]},`${s.cat}/${s.name}`))}):null]})},footer=!valid?!titleOk?"type a title":"fix runtime (e.g. 30m, 2h, 1800)":field==="body"?"Ctrl+Enter create \xB7 Tab leave \xB7 \u2191\u2193 cursor \xB7 Esc cancel":field==="more"?`Space ${more?"collapse":"expand"} \xB7 Ctrl+Enter create \xB7 \u2191\u2193/Tab \xB7 Esc`:field==="skills"?(()=>{if(matches.length>0)return"Tab add \xB7 \u2191\u2193 pick \xB7 Bksp remove \xB7 Enter create \xB7 Esc";if(skills.length>0)return"type to filter \xB7 Bksp remove last \xB7 Enter create \xB7 \u2191\u2193/Tab \xB7 Esc";return"type to filter \xB7 Enter create \xB7 \u2191\u2193/Tab field \xB7 Esc cancel"})():SELECTY.has(field)?"Space pick \xB7 Enter create \xB7 \u2191\u2193/Tab field \xB7 Esc cancel":field==="triage"?"Space toggle \xB7 Enter create \xB7 \u2191\u2193/Tab field \xB7 Esc":"Enter create \xB7 \u2191\u2193/Tab field \xB7 Esc cancel";return $jsxs("box",{flexDirection:"column",width:66,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:p.parent?`New Task \xB7 child of ${p.parent.id}`:"New Task"})})}),p.parent?$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:[" ",p.parent.title]})}):null,$jsx("box",{height:1}),textRow("title","Title",title,setTitle,"one-line summary"),$jsxs("box",{flexDirection:"row",children:[lbl("body","Body"),$jsx("box",{flexGrow:1,minWidth:0,children:$jsx("textarea",{ref:body,initialValue:bodyText,onContentChange:()=>{if(body.current)setBodyText(body.current.plainText)},focused:field==="body",placeholder:"longer spec \u2014 markdown ok (Enter for newline)",textColor:theme.text,placeholderColor:theme.textMuted,backgroundColor:field==="body"?theme.backgroundElement:void 0,focusedBackgroundColor:theme.backgroundElement,minHeight:5,maxHeight:5},"field-body")})]}),valRow("assignee","Assignee",assignee??"(unassigned)","Space pick \u25BE"),valRow("priority","Priority",priority?`P${priority}`:"P0 (none)","Space pick \u25BE"),valRow("triage","Triage",triage?"yes \u2014 park for a specifier":"no","Space toggle"),$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:13,flexShrink:0,children:$jsxs("text",{fg:field==="more"?theme.accent:theme.textMuted,children:[field==="more"?"\u25B8 ":" ",more?"More \u25BE":"More \u25B8"]})}),!more?$jsx("box",{flexGrow:1,height:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:"tenant \xB7 project \xB7 workspace \xB7 runtime \xB7 skills"})}):null]}),more?textRow("tenant","Tenant",tenant,setTenant,"namespace (optional)"):null,more?textRow("project","Project",project,setProject,"id/slug (optional)"):null,more?valRow("workspace","Workspace",wsLabel(workspace),"Space pick \u25BE"):null,more?textRow("maxRuntime","Runtime",maxRuntime,setMaxRuntime,"e.g. 30m, 2h, 1800 (optional)"):null,more?skillsRows():null,$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:footer})})]})};var arr2=(v2)=>Array.isArray(v2)?v2:[],str2=(v2)=>typeof v2==="string"?v2:"",num3=(v2)=>typeof v2==="number"&&Number.isFinite(v2)?v2:0,ids=(v2)=>arr2(v2).map(str2).filter(Boolean),spawned=(v2)=>arr2(v2).flatMap((x2)=>{if(!x2||typeof x2!=="object")return[];let r=x2,task_id=str2(r.task_id);if(!task_id)return[];return[{task_id,assignee:str2(r.assignee),workspace:str2(r.workspace)}]}),capped=(v2)=>arr2(v2).flatMap((x2)=>{if(!x2||typeof x2!=="object")return[];let r=x2,task_id=str2(r.task_id);if(!task_id)return[];return[{task_id,assignee:str2(r.assignee),current:num3(r.current)}]}),guarded=(v2)=>arr2(v2).flatMap((x2)=>{if(Array.isArray(x2)){let task_id2=str2(x2[0]);if(!task_id2)return[];return[{task_id:task_id2,reason:str2(x2[1])}]}if(!x2||typeof x2!=="object")return[];let r=x2,task_id=str2(r.task_id);if(!task_id)return[];return[{task_id,reason:str2(r.reason)}]}),parseDispatchResult=(out)=>{let raw=JSON.parse(out);return{reclaimed:num3(raw.reclaimed),promoted:num3(raw.promoted),spawned:spawned(raw.spawned),skipped_unassigned:ids(raw.skipped_unassigned),skipped_nonspawnable:ids(raw.skipped_nonspawnable),skipped_per_profile_capped:capped(raw.skipped_per_profile_capped),auto_assigned_default:ids(raw.auto_assigned_default),crashed:ids(raw.crashed),auto_blocked:ids(raw.auto_blocked),timed_out:ids(raw.timed_out),stale:ids(raw.stale),respawn_guarded:guarded(raw.respawn_guarded)}},dispatchFailures=(r)=>[...r.crashed,...r.auto_blocked,...r.timed_out,...r.stale],dispatchGuarded=(r)=>r.respawn_guarded.map((x2)=>x2.task_id),dispatchVariant=(r)=>{let failed=dispatchFailures(r).length,guarded2=dispatchGuarded(r).length,unassigned=r.skipped_unassigned.length,benign=r.skipped_per_profile_capped.length+r.skipped_nonspawnable.length;if(r.spawned.length===0&&(failed>0||unassigned>0))return"error";if(failed>0||guarded2>0||unassigned>0)return"warning";if(benign>0)return"info";return"success"},line2=(label2,xs)=>xs.length?[`${label2}: ${xs.join(", ")}`]:[],caps2=(r)=>{let map=r.skipped_per_profile_capped.reduce((m2,x2)=>{let key3=x2.assignee||"unassigned";return m2.set(key3,[...m2.get(key3)??[],x2]),m2},new Map);if(map.size===0)return[];return["Deferred at per-profile cap:",...[...map.entries()].map(([k2,xs])=>` ${k2} (${Math.max(...xs.map((x2)=>x2.current))} running): ${xs.map((x2)=>x2.task_id).join(", ")}`)]},dispatchDetails=(r)=>[...line2("Defaulted to kanban.default_assignee",r.auto_assigned_default),...caps2(r),...line2("Unassigned",r.skipped_unassigned),...line2("Non-spawnable lanes",r.skipped_nonspawnable),...line2("Failed/reclaimed \xB7 crashed",r.crashed),...line2("Failed/reclaimed \xB7 auto-blocked",r.auto_blocked),...line2("Failed/reclaimed \xB7 timed out",r.timed_out),...line2("Failed/reclaimed \xB7 stale",r.stale),...line2("Respawn guarded",r.respawn_guarded.map((x2)=>`${x2.task_id}${x2.reason?` (${x2.reason})`:""}`))].join(`
|
|
4143
|
+
`);if(nl>=0&&nl<out.length-1)out=out.slice(nl+1)}return out}catch{return null}}function assignees(s=slug){let seen=new Set,dir=kp("profiles");if(existsSync19(dir)){for(let e of readdirSync9(dir,{withFileTypes:!0}))if(e.isDirectory())seen.add(e.name)}let conn2=dbOf(s);if(conn2)try{for(let r of conn2.query("SELECT DISTINCT assignee FROM tasks WHERE assignee IS NOT NULL AND status != 'archived'").all())seen.add(r.assignee)}catch{}return[...seen].sort()}var q3=(s)=>/^[A-Za-z0-9._\/:+=-]+$/.test(s)?s:`'${s.replace(/'/g,"'\\''")}'`;import{existsSync as existsSync20}from"fs";import{join as join15}from"path";var INLINE2=process.env.HERM_IO_INLINE==="1",entry2=()=>{let js=join15(import.meta.dirname,"kanban.worker.js");return new URL(existsSync20(js)?"./kanban.worker.js":"./kanban.worker.ts",import.meta.url)},state2={worker:null,seq:0,pending:new Map},spawn3=()=>{if(state2.worker)return state2.worker;let worker=new Worker(entry2());return worker.onmessage=(e)=>{state2.pending.get(e.data.id)?.(e.data),state2.pending.delete(e.data.id)},worker.onerror=(e)=>{let err=`kanban worker: ${e.message}`;for(let resolve4 of state2.pending.values())resolve4({id:-1,ok:!1,err});if(state2.pending.clear(),state2.worker===worker)state2.worker=null;worker.terminate()},state2.worker=worker};async function patch(board,task,value2){let root3=kanbanRoot();if(INLINE2)return patchAt(root3,board,task,value2);return new Promise((resolve4,reject)=>{let id=++state2.seq;state2.pending.set(id,(res)=>res.ok?resolve4(res.v):reject(Error(res.err))),spawn3().postMessage({id,root:root3,board,task,patch:value2})})}function close2(){state2.worker?.terminate(),state2.worker=null;for(let resolve4 of state2.pending.values())resolve4({id:-1,ok:!1,err:"kanban worker: closed"});state2.pending.clear()}var import_react89=__toESM(require_react_production(),1);function openCreateTask(dialog,opts){return new Promise((resolve4)=>{let done=(r)=>{dialog.clear(),resolve4(r)};dialog.replace($jsx(Form2,{pool:opts.assignees,parent:opts.parent,done}),void 0,{ownCancel:!0})})}var CORE=["title","body","assignee","priority","triage","more"],MORE=["tenant","project","workspace","maxRuntime","skills"],SELECTY=new Set(["assignee","priority","workspace"]),MAX_RUNTIME_RE=/^\d+[smhd]?$/,SKILL_MATCHES_MAX=6,wsLabel=(w2)=>w2.kind==="scratch"?"scratch":w2.kind==="worktree"?"worktree":`dir @ ${w2.path}`,Form2=(p)=>{let theme=useTheme().theme,gw=useGateway(),body=import_react89.useRef(null),[bodyText,setBodyText]=import_react89.useState(""),[field,setField]=import_react89.useState("title"),[more,setMore]=import_react89.useState(!1),[picker,setPicker]=import_react89.useState(null),[title,setTitle]=import_react89.useState(""),[assignee,setAssignee]=import_react89.useState(null),[priority,setPriority]=import_react89.useState(0),[triage,setTriage]=import_react89.useState(!1),[tenant,setTenant]=import_react89.useState(""),[project,setProject]=import_react89.useState(""),[workspace,setWorkspace]=import_react89.useState({kind:"scratch"}),[maxRuntime,setMaxRuntime]=import_react89.useState(""),[catalog3,setCatalog]=import_react89.useState([]),[skills,setSkills]=import_react89.useState([]),[filter,setFilter]=import_react89.useState(""),[matchIdx,setMatchIdx]=import_react89.useState(0);import_react89.useEffect(()=>{let live=!0;return gw.request("skills.manage",{action:"list"}).then((r)=>{if(!live)return;let raw=r.skills??{},out=[];for(let cat of Object.keys(raw))for(let name of raw[cat]??[])out.push({cat,name});out.sort((a,b2)=>a.name.localeCompare(b2.name)),setCatalog(out)}).catch(()=>{}),()=>{live=!1}},[gw]);let matches=import_react89.useMemo(()=>{if(!filter.trim())return[];let q4=filter.trim().toLowerCase(),picked=new Set(skills),hits=[];for(let s of catalog3){if(picked.has(s.name))continue;if(s.name.toLowerCase().includes(q4)||s.cat.toLowerCase().includes(q4))hits.push(s);if(hits.length>=SKILL_MATCHES_MAX)break}return hits},[catalog3,filter,skills]);import_react89.useEffect(()=>{if(matchIdx>0&&matchIdx>=matches.length)setMatchIdx(Math.max(0,matches.length-1))},[matches.length,matchIdx]);let order2=()=>more?[...CORE,...MORE]:CORE,titleOk=title.trim().length>0,runtimeOk=maxRuntime.trim()===""||MAX_RUNTIME_RE.test(maxRuntime.trim()),valid=titleOk&&runtimeOk,submit2=()=>{if(!valid)return;p.done({title:title.trim(),body:(body.current?.plainText??bodyText).trim(),assignee,priority,parent:p.parent?.id??null,triage,tenant:tenant.trim()||null,project:project.trim()||null,workspace,maxRuntime:maxRuntime.trim()||null,skills})},moveField=(dir)=>{let o=order2(),i=o.indexOf(field),next3=o[(i+dir+o.length)%o.length];setField(next3)},openPicker=()=>{if(field==="assignee")return setPicker({kind:"assignee"});if(field==="priority")return setPicker({kind:"priority"});if(field==="workspace")return setPicker({kind:"workspace"})},commitMatch=()=>{let hit=matches[matchIdx];if(!hit)return!1;return setSkills((s)=>s.includes(hit.name)?s:[...s,hit.name]),setFilter(""),setMatchIdx(0),!0},popSkill=()=>setSkills((s)=>s.slice(0,-1));if(useKeyboard((key3)=>{if(picker){if(key3.name==="escape")setPicker(picker.kind==="dirPath"?{kind:"workspace"}:null);return}if(key3.name==="escape")return p.done(null);if(key3.name==="return"){if(key3.ctrl)return submit2();if(field!=="body")return submit2();return}if(field==="skills"){if(key3.name==="tab"){if(!key3.shift&&commitMatch())return;return moveField(key3.shift?-1:1)}if(key3.name==="backspace"){if(filter.length>0)return setFilter((f)=>f.slice(0,-1));return popSkill()}if(key3.name==="up"){if(matches.length>0)return setMatchIdx((i)=>Math.max(0,i-1));return moveField(-1)}if(key3.name==="down"){if(matches.length>0)return setMatchIdx((i)=>Math.min(matches.length-1,i+1));return moveField(1)}if(key3.raw&&key3.raw.length===1&&/[A-Za-z0-9_\-/ ]/.test(key3.raw))setFilter((f)=>f+key3.raw),setMatchIdx(0);return}if(key3.name==="tab")return moveField(key3.shift?-1:1);if(key3.name==="up"){if(field==="body"){if((body.current?.logicalCursor.row??0)>0)return}return moveField(-1)}if(key3.name==="down"){if(field==="body"){let row3=body.current?.logicalCursor.row??0,last4=(body.current?.lineCount??1)-1;if(row3<last4)return}return moveField(1)}if(field==="more"){if(key3.name==="return"||key3.name==="space")return setMore((m2)=>!m2);return}if(field==="triage"&&key3.name==="space")return setTriage((t2)=>!t2);if(SELECTY.has(field)&&key3.name==="space")return openPicker()}),picker?.kind==="assignee"){let opts=[{title:"(unassigned)",value:""},...p.pool.map((n)=>({title:n,value:n}))];return $jsx(DialogSelect,{title:"Assignee",options:opts,placeholder:"Search profiles\u2026",current:assignee??"",onSelect:(o)=>{setAssignee(o.value||null),setPicker(null)}})}if(picker?.kind==="priority"){let opts=Array.from({length:10},(_2,n)=>({title:n===0?"P0 (none)":`P${n}`,value:String(n),description:n===0?"default":n<=2?"normal":n<=5?"elevated":"high"}));return $jsx(DialogSelect,{title:"Priority",options:opts,filterable:!1,current:String(priority),onSelect:(o)=>{setPriority(Number(o.value)),setPicker(null)}})}if(picker?.kind==="workspace")return $jsx(DialogSelect,{title:"Workspace",options:[{title:"scratch",value:"scratch",description:"isolated temp dir under the board root (default)"},{title:"worktree",value:"worktree",description:"git worktree at .worktrees/<task-id> \u2014 worker runs `git worktree add`"},{title:"dir:\u2026",value:"dir",description:"an exact absolute path (prompts next)"}],filterable:!1,current:workspace.kind,onSelect:(o)=>{if(o.value==="scratch")return setWorkspace({kind:"scratch"}),setPicker(null);if(o.value==="worktree")return setWorkspace({kind:"worktree"}),setPicker(null);return setPicker({kind:"dirPath",value:workspace.kind==="dir"?workspace.path:""})}});if(picker?.kind==="dirPath"){let val=picker.value,ok=val.trim().length>0&&val.trim().startsWith("/");return $jsxs("box",{flexDirection:"column",width:64,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"Directory path"})})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"absolute path (required)"})}),$jsxs("box",{height:1,flexDirection:"row",overflow:"hidden",children:[$jsx("box",{flexShrink:0,children:$jsx("text",{fg:theme.accent,children:"\u2503 "})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("input",{value:val,onInput:(v2)=>setPicker({kind:"dirPath",value:v2}),onSubmit:()=>{if(!ok)return;setWorkspace({kind:"dir",path:val.trim()}),setPicker(null)},focused:!0,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement},"dirpath")})]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:ok?"Enter confirm \xB7 Esc back":"absolute path required \xB7 Esc back"})})]})}let lbl=(f,text5)=>$jsx("box",{width:13,flexShrink:0,children:$jsxs("text",{fg:field===f?theme.accent:theme.textMuted,children:[field===f?"\u25B8 ":" ",text5]})}),textRow=(f,label2,value2,set3,placeholder)=>$jsxs("box",{height:1,flexDirection:"row",children:[lbl(f,label2),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("input",{value:value2,onInput:set3,onSubmit:submit2,focused:field===f,placeholder,textColor:theme.text,placeholderColor:theme.textMuted,backgroundColor:field===f?theme.backgroundElement:void 0,focusedBackgroundColor:theme.backgroundElement},`field-${f}`)})]}),valRow=(f,label2,value2,hint)=>$jsxs("box",{height:1,flexDirection:"row",children:[lbl(f,label2),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("text",{fg:theme.text,children:value2})}),field===f?$jsx("box",{flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:hint})}):null]}),skillsRows=()=>{let focused=field==="skills",empty=skills.length===0&&!focused;return $jsxs($Fragment,{children:[$jsxs("box",{height:1,flexDirection:"row",children:[lbl("skills","Skills"),$jsxs("box",{flexGrow:1,minWidth:0,height:1,flexDirection:"row",overflow:"hidden",children:[skills.map((n)=>$jsx(FilterChip,{label:n,state:"in",gap:0},n)),empty?$jsx("text",{fg:theme.textMuted,children:"(none \u2014 focus field to pick)"}):$jsxs("box",{flexDirection:"row",marginLeft:skills.length>0?1:0,children:[$jsx("text",{fg:theme.text,children:filter}),focused?$jsx("text",{fg:theme.accent,children:"\u2588"}):null]})]})]}),focused&&matches.length>0?$jsx("box",{flexDirection:"column",children:matches.map((s,i)=>$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:13,flexShrink:0,children:$jsx("text",{fg:i===matchIdx?theme.accent:theme.textMuted,children:i===matchIdx?" \u25B8 ":" "})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsxs("text",{children:[$jsx("span",{fg:i===matchIdx?theme.accent:theme.text,children:s.name}),$jsx("span",{fg:theme.textMuted,children:` ${s.cat}`})]})})]},`${s.cat}/${s.name}`))}):null]})},footer=!valid?!titleOk?"type a title":"fix runtime (e.g. 30m, 2h, 1800)":field==="body"?"Ctrl+Enter create \xB7 Tab leave \xB7 \u2191\u2193 cursor \xB7 Esc cancel":field==="more"?`Space ${more?"collapse":"expand"} \xB7 Ctrl+Enter create \xB7 \u2191\u2193/Tab \xB7 Esc`:field==="skills"?(()=>{if(matches.length>0)return"Tab add \xB7 \u2191\u2193 pick \xB7 Bksp remove \xB7 Enter create \xB7 Esc";if(skills.length>0)return"type to filter \xB7 Bksp remove last \xB7 Enter create \xB7 \u2191\u2193/Tab \xB7 Esc";return"type to filter \xB7 Enter create \xB7 \u2191\u2193/Tab field \xB7 Esc cancel"})():SELECTY.has(field)?"Space pick \xB7 Enter create \xB7 \u2191\u2193/Tab field \xB7 Esc cancel":field==="triage"?"Space toggle \xB7 Enter create \xB7 \u2191\u2193/Tab field \xB7 Esc":"Enter create \xB7 \u2191\u2193/Tab field \xB7 Esc cancel";return $jsxs("box",{flexDirection:"column",width:66,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:p.parent?`New Task \xB7 child of ${p.parent.id}`:"New Task"})})}),p.parent?$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:[" ",p.parent.title]})}):null,$jsx("box",{height:1}),textRow("title","Title",title,setTitle,"one-line summary"),$jsxs("box",{flexDirection:"row",children:[lbl("body","Body"),$jsx("box",{flexGrow:1,minWidth:0,children:$jsx("textarea",{ref:body,initialValue:bodyText,onContentChange:()=>{if(body.current)setBodyText(body.current.plainText)},focused:field==="body",placeholder:"longer spec \u2014 markdown ok (Enter for newline)",textColor:theme.text,placeholderColor:theme.textMuted,backgroundColor:field==="body"?theme.backgroundElement:void 0,focusedBackgroundColor:theme.backgroundElement,minHeight:5,maxHeight:5},"field-body")})]}),valRow("assignee","Assignee",assignee??"(unassigned)","Space pick \u25BE"),valRow("priority","Priority",priority?`P${priority}`:"P0 (none)","Space pick \u25BE"),valRow("triage","Triage",triage?"yes \u2014 park for a specifier":"no","Space toggle"),$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:13,flexShrink:0,children:$jsxs("text",{fg:field==="more"?theme.accent:theme.textMuted,children:[field==="more"?"\u25B8 ":" ",more?"More \u25BE":"More \u25B8"]})}),!more?$jsx("box",{flexGrow:1,height:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:"tenant \xB7 project \xB7 workspace \xB7 runtime \xB7 skills"})}):null]}),more?textRow("tenant","Tenant",tenant,setTenant,"namespace (optional)"):null,more?textRow("project","Project",project,setProject,"id/slug (optional)"):null,more?valRow("workspace","Workspace",wsLabel(workspace),"Space pick \u25BE"):null,more?textRow("maxRuntime","Runtime",maxRuntime,setMaxRuntime,"e.g. 30m, 2h, 1800 (optional)"):null,more?skillsRows():null,$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:footer})})]})};var arr2=(v2)=>Array.isArray(v2)?v2:[],str2=(v2)=>typeof v2==="string"?v2:"",num3=(v2)=>typeof v2==="number"&&Number.isFinite(v2)?v2:0,ids=(v2)=>arr2(v2).map(str2).filter(Boolean),spawned=(v2)=>arr2(v2).flatMap((x2)=>{if(!x2||typeof x2!=="object")return[];let r=x2,task_id=str2(r.task_id);if(!task_id)return[];return[{task_id,assignee:str2(r.assignee),workspace:str2(r.workspace)}]}),capped=(v2)=>arr2(v2).flatMap((x2)=>{if(!x2||typeof x2!=="object")return[];let r=x2,task_id=str2(r.task_id);if(!task_id)return[];return[{task_id,assignee:str2(r.assignee),current:num3(r.current)}]}),guarded=(v2)=>arr2(v2).flatMap((x2)=>{if(Array.isArray(x2)){let task_id2=str2(x2[0]);if(!task_id2)return[];return[{task_id:task_id2,reason:str2(x2[1])}]}if(!x2||typeof x2!=="object")return[];let r=x2,task_id=str2(r.task_id);if(!task_id)return[];return[{task_id,reason:str2(r.reason)}]}),parseDispatchResult=(out)=>{let raw=JSON.parse(out);return{reclaimed:num3(raw.reclaimed),promoted:num3(raw.promoted),spawned:spawned(raw.spawned),skipped_unassigned:ids(raw.skipped_unassigned),skipped_nonspawnable:ids(raw.skipped_nonspawnable),skipped_per_profile_capped:capped(raw.skipped_per_profile_capped),auto_assigned_default:ids(raw.auto_assigned_default),crashed:ids(raw.crashed),auto_blocked:ids(raw.auto_blocked),timed_out:ids(raw.timed_out),stale:ids(raw.stale),respawn_guarded:guarded(raw.respawn_guarded)}},dispatchFailures=(r)=>[...r.crashed,...r.auto_blocked,...r.timed_out,...r.stale],dispatchGuarded=(r)=>r.respawn_guarded.map((x2)=>x2.task_id),dispatchVariant=(r)=>{let failed=dispatchFailures(r).length,guarded2=dispatchGuarded(r).length,unassigned=r.skipped_unassigned.length,benign=r.skipped_per_profile_capped.length+r.skipped_nonspawnable.length;if(r.spawned.length===0&&(failed>0||unassigned>0))return"error";if(failed>0||guarded2>0||unassigned>0)return"warning";if(benign>0)return"info";return"success"},line2=(label2,xs)=>xs.length?[`${label2}: ${xs.join(", ")}`]:[],caps2=(r)=>{let map=r.skipped_per_profile_capped.reduce((m2,x2)=>{let key3=x2.assignee||"unassigned";return m2.set(key3,[...m2.get(key3)??[],x2]),m2},new Map);if(map.size===0)return[];return["Deferred at per-profile cap:",...[...map.entries()].map(([k2,xs])=>` ${k2} (${Math.max(...xs.map((x2)=>x2.current))} running): ${xs.map((x2)=>x2.task_id).join(", ")}`)]},dispatchDetails=(r)=>[...line2("Defaulted to kanban.default_assignee",r.auto_assigned_default),...caps2(r),...line2("Unassigned",r.skipped_unassigned),...line2("Non-spawnable lanes",r.skipped_nonspawnable),...line2("Failed/reclaimed \xB7 crashed",r.crashed),...line2("Failed/reclaimed \xB7 auto-blocked",r.auto_blocked),...line2("Failed/reclaimed \xB7 timed out",r.timed_out),...line2("Failed/reclaimed \xB7 stale",r.stale),...line2("Respawn guarded",r.respawn_guarded.map((x2)=>`${x2.task_id}${x2.reason?` (${x2.reason})`:""}`))].join(`
|
|
4144
4144
|
`);var import_react91=__toESM(require_react_production(),1);var index2=(rows3)=>{let out=new Map;for(let row3 of rows3)if(row3.diagnostics.length)out.set(row3.task_id,sortDiags(row3.diagnostics));return out};function useKanbanDiagnostics(gw){let[data2,setData]=import_react91.useState(()=>new Map),state3=import_react91.useRef({busy:!1,pending:null,gen:0}),refresh=import_react91.useCallback(async(next3)=>{let run=state3.current;if(run.gen++,run.busy){run.pending=next3;return}run.busy=!0;let boards=next3;while(boards){let current=boards,gen=run.gen;run.pending=null;let pairs=await Promise.all(current.map(async(board)=>{let rows3=await gw.request("shell.exec",{command:`hermes kanban --board ${q3(board.slug)} diagnostics --json`}).then((res)=>res.code===0?index2(parseDiagnostics(res.stdout)):null).catch(()=>null);return[board.slug,rows3]}));if(run.gen===gen)setData((prev)=>{let active2=new Set(current.map((board)=>board.slug)),out=new Map([...prev].filter(([slug2])=>active2.has(slug2)));for(let[slug2,rows3]of pairs)if(rows3)out.set(slug2,rows3);return out});boards=run.pending}run.busy=!1},[gw]);return import_react91.useEffect(()=>()=>{state3.current.gen++,state3.current.pending=null},[]),{data:data2,refresh}}var NOBAR={visible:!1},RULE=["bottom"],HEAD={triage:"triage",todo:"todo",scheduled:"scheduled",ready:"ready",running:"running",blocked:"blocked",done:"done"},EMPTY2={who:new Map,pri:new Map,status:new Map},EMPTY_DIAG=new Map,EMPTY_DIAGS=[],chipId=(c)=>c.kind==="who"?`who:${c.v}`:c.kind==="pri"?`pri:${c.v}`:`st:${c.v}`,chipLabel=(c)=>c.kind==="who"?c.v:c.kind==="pri"?`P${c.v}`:HEAD[c.v],triOf=(c,m2)=>c.kind==="who"?m2.who.get(c.v)??"off":c.kind==="pri"?m2.pri.get(c.v)??"off":m2.status.get(c.v)??"off",recOf=(v2)=>v2&&typeof v2==="object"&&!Array.isArray(v2)?v2:null,assignedByDefault=(d2)=>d2.events.some((e)=>e.kind==="assigned"&&recOf(e.payload)?.source==="kanban.default_assignee");function admits(g,v2){let t2=g.get(v2);if(t2==="ex")return!1;if(t2==="in")return!0;for(let s of g.values())if(s==="in")return!1;return!0}var pass=(t2,m2)=>admits(m2.who,t2.assignee??null)&&admits(m2.pri,t2.priority),maskFromPrefs=(raw)=>{let out=new Map;if(!raw)return out;for(let slug2 of Object.keys(raw)){let g=raw[slug2];out.set(slug2,{who:new Map(g.who??[]),pri:new Map(g.pri??[]),status:new Map(g.status??[])})}return out},maskToPrefs=(masks)=>{let out={};for(let[slug2,m2]of masks){let filt=(xs)=>xs.filter(([,t2])=>t2==="in"||t2==="ex"),who=filt([...m2.who]),pri=filt([...m2.pri]),status2=filt([...m2.status]);if(who.length||pri.length||status2.length)out[slug2]={who,pri,status:status2}}return out},persist=(masks,open3)=>{let cur=load2().kanban??{};set("kanban",{...cur,open:[...open3],masks:maskToPrefs(masks)})},SEV_GLYPH={warning:"\u26A0",error:"!!",critical:"\u203C"},sevColor=(sev,theme)=>sev==="warning"?theme.warning:theme.error,KIND={dependency:"dependency-wait",needs_input:"needs-input",capability:"capability",transient:"transient"},MARK={dependency:"dep",needs_input:"input",capability:"cap",transient:"tmp"},blockText=(t2)=>{let kind2=t2.block_kind?KIND[t2.block_kind]:"",loop=t2.block_recurrences>1?`loop\xD7${t2.block_recurrences}`:"";if(kind2&&loop)return`${kind2} \xB7 ${loop}`;return kind2||loop},cardMark=(t2)=>{if(t2.block_kind)return`[${MARK[t2.block_kind]}${t2.block_recurrences>1?`\xD7${t2.block_recurrences}`:""}]`;return t2.block_recurrences>1?`[loop\xD7${t2.block_recurrences}]`:""},statusText=(t2)=>{let block=blockText(t2);return block?`${t2.status} \xB7 ${block}`:t2.status},supportsKind=(r)=>r.code===0&&/--kind\b/.test(r.stdout),unsupportedKind=(r)=>{let s=`${r.stderr}
|
|
4145
4145
|
${r.stdout}`.toLowerCase();return r.code!==0&&s.includes("--kind")&&(s.includes("unrecognized")||s.includes("no such option")||s.includes("unknown option")||s.includes("invalid option"))},Card=import_react92.memo((p)=>{let theme=useTheme().theme,mark2=cardMark(p.t);return $jsx("box",{id:p.id,height:2,flexDirection:"row",paddingLeft:1,border:RULE,borderStyle:"single",borderColor:theme.borderSubtle,backgroundColor:p.on?theme.backgroundElement:void 0,onMouseDown:p.onPick,onMouseMove:p.onHover,children:$jsxs(Ticker,{active:p.on||p.hov,fg:p.on?theme.accent:theme.text,children:[mark2?$jsxs($Fragment,{children:[$jsx("span",{fg:theme.warning,children:mark2})," "]}):null,p.sev?$jsxs($Fragment,{children:[$jsx("span",{fg:sevColor(p.sev,theme),children:SEV_GLYPH[p.sev]})," "]}):null,p.t.title]})})}),Column=import_react92.memo((p)=>{let theme=useTheme().theme,box=import_react92.useRef(null),[hov,setHov]=import_react92.useState(-1),id=(i)=>`kb-${p.slug}-${p.status}-${i}`;import_react92.useEffect(()=>{if(p.on&&p.tasks.length>0)box.current?.scrollChildIntoView(id(p.sel))},[p.on,p.sel,p.tasks.length]);let tint=p.status==="blocked"?theme.warning:p.status==="running"?theme.success:p.status==="scheduled"?theme.textMuted:p.status==="done"?theme.textMuted:theme.primary;return $jsxs("box",{flexDirection:"column",flexGrow:1,flexBasis:0,minWidth:18,border:!0,borderColor:p.on?theme.primary:theme.border,onMouseOut:()=>setHov(-1),children:[$jsx("box",{height:1,paddingLeft:1,children:$jsxs("text",{children:[$jsx("span",{fg:tint,children:$jsx("strong",{children:HEAD[p.status]})}),$jsx("span",{fg:theme.textMuted,children:` ${p.tasks.length}`})]})}),$jsx("scrollbox",{id:`kb-col-${p.slug}-${p.status}`,ref:box,scrollY:!0,flexGrow:1,verticalScrollbarOptions:NOBAR,onMouseScroll:(e)=>e.stopPropagation(),children:$jsx("box",{flexDirection:"column",width:"100%",children:p.tasks.map((t2,i)=>$jsx(Card,{id:id(i),t:t2,on:p.on&&i===p.sel,hov:i===hov,sev:maxSeverity(p.diags.get(t2.id)??[]),onHover:()=>{if(hov!==i)setHov(i)},onPick:()=>p.onPick(i)},t2.id))})})]})}),ErrorBanner=import_react92.memo((p)=>{let theme=useTheme().theme;return $jsxs("box",{flexDirection:"column",marginLeft:2,marginBottom:1,paddingLeft:1,border:!0,borderColor:theme.error,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.error,children:$jsxs("strong",{children:["Kanban DB ",p.error.kind]})}),$jsx("span",{fg:theme.textMuted,children:` ${p.error.path}`})]})}),$jsx("text",{wrapMode:"word",fg:theme.textMuted,children:p.error.message}),p.backups.length>0?$jsx("text",{wrapMode:"word",fg:theme.warning,children:`quarantine backup${p.backups.length===1?"":"s"}: ${p.backups.join(", ")}`}):null]})}),FilterBar=import_react92.memo((p)=>{let theme=useTheme().theme;return $jsx("box",{height:1,flexDirection:"row",flexWrap:"no-wrap",overflow:"hidden",marginBottom:1,children:p.chips.flatMap((c,i)=>{let chip2=$jsx(FilterChip,{label:chipLabel(c),state:triOf(c,p.mask),selected:p.on&&i===p.sel,onMouseDown:()=>p.onPick(i)},chipId(c));if(i===0||p.chips[i-1].kind===c.kind)return[chip2];return[$jsx("box",{height:1,flexShrink:0,marginLeft:1,children:$jsx("text",{fg:theme.borderSubtle,children:"|"})},`sep:${chipId(c)}`),chip2]})})}),FIELDS3=["title","body","assignee","priority","status","parents","result","comment"],fieldsFor=(t2)=>FIELDS3.filter((f)=>{if(f==="result")return t2.status==="done";return!0}),SidePane=import_react92.memo((p)=>{let{theme,syntaxStyle}=useTheme();if(p.pane.kind==="log"||p.pane.kind==="dispatch")return $jsxs("box",{flexDirection:"column",padding:1,border:!0,borderColor:theme.border,backgroundColor:theme.backgroundPanel,width:"50%",children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.primary,children:$jsx("strong",{children:p.pane.kind==="log"?p.pane.id:"Dispatch"})}),$jsx("span",{fg:theme.textMuted,children:` \xB7 ${p.pane.slug} \xB7 ${p.pane.kind==="log"?"worker log (tail)":"details"}`})]})}),$jsx("box",{height:1}),$jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsx("text",{wrapMode:"word",fg:theme.textMuted,children:p.pane.text||"(empty)"})})]});let d2=p.pane.d,fields=fieldsFor(d2),cur=p.on?fields[Math.min(p.sel,fields.length-1)]:null,srow=(f,label2,value2,hint)=>{let active2=cur===f;return $jsxs("box",{height:1,flexDirection:"row",paddingLeft:1,backgroundColor:active2?theme.backgroundElement:void 0,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:active2?theme.accent:theme.textMuted,children:label2})}),$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:active2?theme.text:theme.textMuted,children:value2})}),hint?$jsx("box",{flexShrink:0,paddingLeft:1,children:$jsx("text",{fg:theme.textMuted,children:hint})}):null]},f)},mrow=(f,label2,content,hint)=>{let active2=cur===f;return $jsxs("box",{flexDirection:"column",paddingLeft:1,backgroundColor:active2?theme.backgroundElement:void 0,children:[$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:active2?theme.accent:theme.textMuted,children:label2})}),hint?$jsx("box",{flexGrow:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:hint})}):null]}),$jsx("box",{paddingLeft:10,flexShrink:0,children:content})]},f)},resultText=d2.result||d2.latest_summary||"",sizeText=(n)=>n===null?"size unknown":n<1024?`${n} B`:n<1048576?`${(n/1024).toFixed(0)} KB`:`${(n/1048576).toFixed(1)} MB`;return $jsxs("box",{flexDirection:"column",padding:1,border:!0,borderColor:theme.border,backgroundColor:theme.backgroundPanel,width:"50%",children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.primary,children:$jsx("strong",{children:d2.id})}),$jsx("span",{fg:theme.textMuted,children:` \xB7 ${p.pane.slug} \xB7 ${statusText(d2)} \xB7 ${ago(d2.updated_at)}`})]})}),$jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsxs("box",{flexDirection:"column",width:"100%",children:[srow("title","Title",d2.title,p.on&&cur==="title"?"Enter edit":void 0),mrow("body","Body",d2.body?cur==="body"?$jsx("text",{wrapMode:"word",fg:theme.text,children:d2.body}):$jsx("markdown",{content:d2.body,fg:theme.markdownText,syntaxStyle}):$jsx("text",{fg:theme.textMuted,children:"\u2014"}),p.on&&cur==="body"?"Enter edit (raw)":void 0),srow("assignee","Assignee",d2.assignee?assignedByDefault(d2)?`${d2.assignee} (default)`:d2.assignee:"\u2014",p.on&&cur==="assignee"?"Enter pick":void 0),srow("priority","Priority",d2.priority?`P${d2.priority}`:"\u2014",p.on&&cur==="priority"?"Enter select":void 0),srow("status","Status",statusText(d2),p.on&&cur==="status"?"Enter change":void 0),srow("parents","Parents",d2.parents.length?d2.parents.join(", "):"\u2014",p.on&&cur==="parents"?"Enter add/remove":void 0),d2.children.length?$jsxs("box",{height:1,flexDirection:"row",paddingLeft:1,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:"Children"})}),$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:d2.children.join(", ")})})]}):null,d2.project_id?$jsxs("box",{height:1,flexDirection:"row",paddingLeft:1,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:"Project"})}),$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:d2.project_id})})]}):null,d2.workspace_kind?$jsxs("box",{height:1,flexDirection:"row",paddingLeft:1,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:"Workspace"})}),$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",children:$jsxs("text",{fg:theme.textMuted,children:[d2.workspace_kind,d2.workspace_path?` @ ${d2.workspace_path}`:""]})})]}):null,d2.branch_name?$jsxs("box",{height:1,flexDirection:"row",paddingLeft:1,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:"Branch"})}),$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:d2.branch_name})})]}):null,d2.skills.length?$jsxs("box",{height:1,flexDirection:"row",paddingLeft:1,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:"Skills"})}),$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:d2.skills.join(", ")})})]}):null,d2.model_override?$jsxs("box",{height:1,flexDirection:"row",paddingLeft:1,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:"Model"})}),$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:d2.model_override})})]}):null,d2.max_retries!==null?$jsxs("box",{height:1,flexDirection:"row",paddingLeft:1,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:"Retries"})}),$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:String(d2.max_retries)})})]}):null,d2.pid?$jsxs("box",{height:1,flexDirection:"row",paddingLeft:1,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:"PID"})}),$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:String(d2.pid)})})]}):null,d2.last_heartbeat_at&&d2.status==="running"?$jsxs("box",{height:1,flexDirection:"row",paddingLeft:1,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:"Heartbeat"})}),$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:ago(d2.last_heartbeat_at)})})]}):null,d2.session_id?$jsxs("box",{height:1,flexDirection:"row",paddingLeft:1,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:"Session"})}),$jsx("box",{flexGrow:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:d2.session_id})})]}):null,d2.attachments.length>0?$jsxs($Fragment,{children:[$jsx("box",{height:1,marginTop:1,children:$jsx("text",{fg:theme.textMuted,children:`Attachments (${d2.attachments.length})`})}),d2.attachments.map((a)=>{let source=a.path?{file:a.path,relative:a.relative_path??a.path,label:a.name}:null;return $jsxs("box",{flexDirection:"column",paddingLeft:1,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.primary,children:`#${a.id} `}),$jsx("span",{fg:theme.text,children:a.name}),$jsx("span",{fg:theme.textMuted,children:` ${sizeText(a.size)} ${ago(a.created_at)}`})]})}),source?$jsx("box",{height:1,overflow:"hidden",children:$jsx(FileLink,{source,children:source.relative})}):$jsx("text",{wrapMode:"word",fg:theme.error,children:`unsafe path omitted: ${a.stored_path}`})]},a.id)})]}):null,d2.error?$jsxs("box",{flexDirection:"column",paddingLeft:1,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.error,children:"Error"})}),$jsx("box",{paddingLeft:2,children:$jsx("text",{fg:theme.error,wrapMode:"word",children:d2.error})})]}):null,d2.status==="done"?mrow("result","Result",resultText?cur==="result"?$jsx("text",{wrapMode:"word",fg:theme.text,children:resultText}):$jsx("markdown",{content:resultText,fg:theme.markdownText,syntaxStyle}):$jsx("text",{fg:theme.textMuted,children:"\u2014"}),p.on&&cur==="result"?"Enter edit":void 0):null,p.diags.length>0?$jsxs($Fragment,{children:[$jsx("box",{height:1,marginTop:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:"Diagnostics "}),$jsx("span",{fg:sevColor(p.diags[0].severity,theme),children:`(${p.diags.length})`})]})}),p.diags.map((dx,i)=>$jsxs("box",{flexDirection:"column",marginTop:i===0?0:1,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:sevColor(dx.severity,theme),children:SEV_GLYPH[dx.severity]}),$jsx("span",{fg:theme.text,children:` [${dx.severity}] ${dx.kind}`}),dx.count>1?$jsx("span",{fg:theme.textMuted,children:` \xD7${dx.count}`}):null]})}),$jsxs("box",{paddingLeft:2,flexDirection:"column",children:[$jsx("text",{wrapMode:"word",fg:theme.text,children:dx.title}),dx.detail?$jsx("text",{wrapMode:"word",fg:theme.textMuted,children:dx.detail}):null,dx.actions.map((a,j2)=>$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:a.suggested?theme.accent:theme.textMuted,children:a.suggested?"\u2192 ":"\xB7 "}),$jsx("span",{fg:a.suggested?theme.text:theme.textMuted,children:a.label})]})},j2))]})]},`${dx.kind}-${i}`))]}):null,d2.runs.length>0?$jsxs($Fragment,{children:[$jsx("box",{height:1,marginTop:1,children:$jsx("text",{fg:theme.textMuted,children:`Runs (${d2.runs.length})`})}),d2.runs.map((r)=>{let outcome2=r.outcome||r.status||(r.ended_at?"ended":"active"),elapsed=r.ended_at?`${Math.max(0,r.ended_at-r.started_at)}s`:"active";return $jsxs("box",{flexDirection:"column",children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.primary,children:`#${r.id} `}),$jsx("span",{fg:theme.text,children:outcome2}),$jsx("span",{fg:theme.textMuted,children:` @${r.profile??"-"} ${elapsed} ${ago(r.started_at)}`})]})}),r.summary?$jsx("text",{wrapMode:"word",fg:theme.textMuted,children:` \u2192 ${r.summary.split(`
|
|
4146
4146
|
`)[0].slice(0,200)}`}):null,r.error?$jsx("text",{wrapMode:"word",fg:theme.error,children:` \u2716 ${r.error.split(`
|
|
4147
4147
|
`)[0].slice(0,200)}`}):null]},r.id)})]}):null,d2.events.length>0?$jsxs($Fragment,{children:[$jsx("box",{height:1,marginTop:1,children:$jsx("text",{fg:theme.textMuted,children:`Events (${d2.events.length})`})}),d2.events.map((e)=>$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:`${ago(e.created_at).padEnd(10)} `}),$jsx("span",{fg:theme.text,children:e.kind}),e.payload?$jsx("span",{fg:theme.textMuted,children:` ${JSON.stringify(e.payload)}`}):null]})},e.id))]}):null,d2.comments.length>0?$jsxs($Fragment,{children:[$jsx("box",{height:1,marginTop:1,children:$jsx("text",{fg:theme.textMuted,children:`Comments (${d2.comments.length})`})}),d2.comments.map((c,i)=>$jsxs("box",{flexDirection:"column",children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:`${c.author} \xB7 ${ago(c.at)}`})}),$jsx("text",{wrapMode:"word",children:c.body})]},i))]}):null,p.on&&cur==="comment"?$jsx("box",{height:1,marginTop:1,children:$jsx("text",{fg:theme.accent,children:"Enter add comment"})}):null]})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:p.on?"Tab/\u2191\u2193 field Enter edit Esc grid a assign c comment l log":"Tab into pane a assign c comment u unblock d archive l log N child"})})]})}),Kanban=import_react92.memo((props)=>{let theme=useTheme().theme,gw=useGateway(),dialog=useDialog(),toast=useToast(),dims=useTerminalDimensions(),keys=useKeys(),[boards,setBoards]=import_react92.useState(listBoards),[data2,setData]=import_react92.useState(()=>new Map(boards.map((b2)=>[b2.slug,boardStateOf(b2.slug)]))),diagnostics=useKanbanDiagnostics(gw),diags=diagnostics.data,[masks,setMasks]=import_react92.useState(()=>maskFromPrefs(load2().kanban?.masks)),[open3,setOpen]=import_react92.useState(()=>{let saved=load2().kanban?.open;if(saved)return new Set(saved);let init=currentBoard();return new Set(listBoards().filter((b2)=>{let state3=boardStateOf(b2.slug);return b2.slug===init||[...state3.columns.values()].some((v2)=>v2.length>0)||!!state3.error}).map((b2)=>b2.slug))}),[at,setAt]=import_react92.useState(currentBoard),[tier,setTier]=import_react92.useState("grid"),[col,setCol]=import_react92.useState(0),[row3,setRow]=import_react92.useState(0),[chip2,setChip]=import_react92.useState(0),[paneSel,setPaneSel]=import_react92.useState(0),[pane,setPane]=import_react92.useState(null),[blocks,setBlocks]=import_react92.useState(()=>new Map),outer=import_react92.useRef(null),load4=import_react92.useCallback(()=>{let bs=listBoards();setBoards(bs),setData(new Map(bs.map((b2)=>[b2.slug,boardStateOf(b2.slug)]))),setPane((p)=>p?.kind==="detail"?((d2)=>d2?{...p,d:d2}:null)(detailOf(p.slug,p.d.id)):p),diagnostics.refresh(bs)},[diagnostics.refresh]);import_react92.useEffect(load4,[load4]),import_react92.useEffect(()=>{persist(masks,open3)},[masks,open3]);let maskOf=(s)=>masks.get(s)??EMPTY2,wide=dims.width>=160,maxH=Math.max(8,dims.height-16),sections=import_react92.useMemo(()=>{let built=boards.map((b2)=>{let state3=data2.get(b2.slug)??boardStateOf(b2.slug),d2=state3.columns,flat=STATUSES.flatMap((s)=>d2.get(s)??[]),total=flat.length,who=[...new Set(flat.map((t2)=>t2.assignee).filter((v2)=>!!v2))].sort(),pri=[...new Set(flat.map((t2)=>t2.priority).filter((n)=>n>0))].sort((a,z2)=>z2-a),chips=[...who.map((v2)=>({kind:"who",v:v2})),...pri.map((v2)=>({kind:"pri",v:v2})),...STATUSES.map((v2)=>({kind:"status",v:v2}))],m2=maskOf(b2.slug),cols3=STATUSES.filter((s)=>admits(m2.status,s)).map((s)=>({status:s,tasks:(d2.get(s)??[]).filter((t2)=>pass(t2,m2))})).filter((c)=>wide||c.tasks.length>0),shown=cols3.reduce((a,c)=>a+c.tasks.length,0),tall=cols3.reduce((a,c)=>Math.max(a,c.tasks.length),0);return{board:b2,cols:cols3,chips,total,shown,running:d2.get("running")?.length??0,cap:Math.min(maxH,Math.max(5,3+2*tall)),error:state3.error,corruptBackups:state3.corruptBackups}});return[...built.filter((s)=>s.total>0),...built.filter((s)=>s.total===0)]},[boards,data2,masks,wide,maxH]),idx=sections.findIndex((s)=>s.board.slug===at),sec3=sections[idx]??sections[0],cols2=sec3?.cols??[],clampCol=Math.min(col,Math.max(0,cols2.length-1)),cur=cols2[clampCol],task=tier==="grid"||tier==="pane"?cur?.tasks[Math.min(row3,Math.max(0,(cur?.tasks.length??1)-1))]:void 0,grand=sections.reduce((a,s)=>a+s.total,0),running2=sections.reduce((a,s)=>a+s.running,0);import_react92.useEffect(()=>{if(pane?.kind!=="detail")return;if(tier!=="grid"&&tier!=="pane"){setPane(null);return}if(!task){setPane(null);return}if(pane.slug===at&&pane.d.id===task.id)return;let d2=detailOf(at,task.id);setPane(d2?{kind:"detail",slug:at,d:d2}:null),setPaneSel(0)},[task?.id,at,tier]),import_react92.useEffect(()=>{if(!props.focused||running2===0)return;let t2=setInterval(load4,3000);return()=>clearInterval(t2)},[props.focused,running2,load4]),import_react92.useEffect(()=>{outer.current?.scrollChildIntoView(`kb-sec-${at}`)},[at,open3]);let sh=import_react92.useCallback((argv,ok)=>gw.request("shell.exec",{command:`hermes kanban --board ${q3(at)} ${argv}`}).then((r)=>{if(r.code!==0)throw Error((r.stderr||r.stdout||`exit ${r.code}`).trim());if(ok)toast.show({variant:"success",message:ok});return resetKanban(),load4(),r.stdout}).catch((e)=>void toast.show({variant:"error",message:trunc5(e.message,120)})),[gw,toast,load4,at]),blockSupport=import_react92.useCallback(async(s)=>{let cur2=blocks.get(s);if(cur2==="yes"||cur2==="no")return cur2;let next3=await gw.request("shell.exec",{command:`hermes kanban --board ${q3(s)} block --help`}).then((r)=>supportsKind(r)?"yes":"no").catch(()=>"no");return setBlocks((m2)=>{let out=new Map(m2);return out.set(s,next3),out}),next3},[blocks,gw]),runBlock=import_react92.useCallback((t2,reason,kind2)=>{let slug2=live.current.at,arg=reason?` ${q3(reason)}`:"",suffix2=kind2?` --kind ${q3(kind2)}`:"",ok=kind2==="dependency"?`Dependency-wait ${t2.id}`:`Blocked ${t2.id}`;return gw.request("shell.exec",{command:`hermes kanban --board ${q3(slug2)} block ${q3(t2.id)}${arg}${suffix2}`}).then((r)=>{if(unsupportedKind(r)&&kind2)throw setBlocks((m2)=>{let out=new Map(m2);return out.set(slug2,"no"),out}),Error("active Hermes CLI does not support typed block kinds; choose generic block");if(r.code!==0)throw Error((r.stderr||r.stdout||`exit ${r.code}`).trim());return toast.show({variant:"success",message:ok}),resetKanban(),load4(),r.stdout}).catch((e)=>void toast.show({variant:"error",message:trunc5(e.message,120)}))},[gw,toast,load4]),writes=import_react92.useRef(Promise.resolve()),patchDirect=import_react92.useCallback((id,p,ok)=>{let board=at;writes.current=writes.current.then(async()=>{if(!await patch(board,id,p))throw Error(`no such task: ${id}`);toast.show({variant:"success",message:ok}),load4()}).catch((e)=>{toast.show({variant:"error",message:trunc5(e.message,120)})})},[at,toast,load4]),enterTop=(s)=>{setAt(s.board.slug),setTier("head"),setChip(0),setRow(0)},enterBottom=(s)=>{if(setAt(s.board.slug),setChip(Math.max(0,s.chips.length-1)),open3.has(s.board.slug)&&s.shown>0){let nc=Math.min(col,Math.max(0,s.cols.length-1));setTier("grid"),setCol(nc),setRow(Math.max(0,(s.cols[nc]?.tasks.length??1)-1));return}if(open3.has(s.board.slug)){setTier("filter");return}setTier("head")},stepBoard=(d2)=>{let n=idx+d2;return n<0||n>=sections.length?null:sections[n]},goBoard=import_react92.useCallback((d2)=>{let n=(idx+d2+sections.length)%sections.length,s=sections[n];setAt(s.board.slug),setTier("head"),setCol(0),setRow(0),setChip(0),setOpen((o)=>o.has(s.board.slug)?o:new Set(o).add(s.board.slug))},[idx,sections]),flip=import_react92.useCallback((c)=>setMasks((m2)=>{let cur2=m2.get(at)??EMPTY2,who=new Map(cur2.who),pri=new Map(cur2.pri),status2=new Map(cur2.status),g=c.kind==="who"?who:c.kind==="pri"?pri:status2,next3=cycle(g.get(c.v)??"off");next3==="off"?g.delete(c.v):g.set(c.v,next3);let out=new Map(m2);return out.set(at,{who,pri,status:status2}),setRow(0),out}),[at]),toggle=import_react92.useCallback((s)=>setOpen((o)=>{let n=new Set(o);return n.has(s)?n.delete(s):n.add(s),n}),[]),newBoard=import_react92.useCallback(()=>openTextPrompt(dialog,{title:"New board",label:"Slug (a-z, 0-9, -_)"}).then((v2)=>{if(!v2)return;return gw.request("shell.exec",{command:`hermes kanban boards create ${q3(v2)}`}).then((r)=>r.code===0?(toast.show({variant:"success",message:`Board '${v2}' created`}),resetKanban(),load4(),setAt(v2),setTier("head")):Promise.reject(Error((r.stderr||r.stdout).trim()))).catch((e)=>toast.show({variant:"error",message:trunc5(e.message,120)}))}),[dialog,gw,toast,load4]),live=import_react92.useRef({task,at,sec:sec3});live.current={task,at,sec:sec3};let create=import_react92.useCallback((parent2)=>openCreateTask(dialog,{assignees:assignees(live.current.at),parent:parent2?{id:parent2.id,title:parent2.title}:void 0}).then((d2)=>{if(!d2)return;let ws=d2.workspace.kind==="scratch"?"":d2.workspace.kind==="worktree"?"--workspace worktree":`--workspace ${q3(`dir:${d2.workspace.path}`)}`,flags=[d2.assignee?`--assignee ${q3(d2.assignee)}`:"",d2.body?`--body ${q3(d2.body)}`:"",d2.priority?`--priority ${d2.priority}`:"",d2.parent?`--parent ${q3(d2.parent)}`:"",d2.triage?"--triage":"",d2.tenant?`--tenant ${q3(d2.tenant)}`:"",d2.project?`--project ${q3(d2.project)}`:"",ws,d2.maxRuntime?`--max-runtime ${q3(d2.maxRuntime)}`:"",...d2.skills.map((s)=>`--skill ${q3(s)}`)].filter(Boolean).join(" ");return sh(`create ${q3(d2.title)} ${flags}`.trim(),`Created${d2.triage?" (triage)":""}${d2.assignee?` \u2192 ${d2.assignee}`:""}`)}),[dialog,sh]),assign=import_react92.useCallback((t2)=>{let opts=[{title:"(unassigned)",value:"none"},...assignees(live.current.at).map((n)=>({title:n,value:n}))];dialog.replace($jsx(DialogSelect,{title:`Assign ${t2.id}`,options:opts,current:t2.assignee??"none",placeholder:"Search profiles\u2026",onSelect:(o)=>{dialog.clear(),sh(`assign ${q3(t2.id)} ${q3(o.value)}`,o.value==="none"?`Unassigned ${t2.id}`:`${t2.id} \u2192 ${o.value}`)}}))},[dialog,sh]),comment=import_react92.useCallback((t2)=>openTextPrompt(dialog,{title:`Comment on ${t2.id}`,label:t2.title}).then((v2)=>v2&&sh(`comment ${q3(t2.id)} ${q3(v2)} --author user`,"Comment added")),[dialog,sh]),unblock=import_react92.useCallback((t2)=>{if(t2.status!=="blocked"&&t2.status!=="scheduled")return void toast.show({variant:"info",message:`${t2.id} is ${t2.status}, not blocked/scheduled`});if(t2.status==="scheduled")return void sh(`unblock ${q3(t2.id)}`,`Released ${t2.id}`);return openTextPrompt(dialog,{title:`Unblock ${t2.id}`,label:"Answer (posted as comment, then task \u2192 ready)"}).then((v2)=>{if(v2)return sh(`comment ${q3(t2.id)} ${q3(v2)} --author user`)}).then(()=>sh(`unblock ${q3(t2.id)}`,`Unblocked ${t2.id}`))},[dialog,sh,toast]),archive=import_react92.useCallback((t2)=>openConfirm(dialog,{title:"Archive task?",danger:!0,yes:"archive",body:`${t2.id} \xB7 ${trunc5(t2.title,60)}
|
|
4148
4148
|
|
|
4149
4149
|
Moves to 'archived' and ends any open run. Children stay; their dependency on this task is treated as satisfied.`}).then((ok)=>{if(ok)sh(`archive ${q3(t2.id)}`,`Archived ${t2.id}`)}),[dialog,sh]),parseSpecify=(out)=>out.split(`
|
|
4150
|
-
`).flatMap((l)=>l.trim()?[JSON.parse(l)]:[]),specify=import_react92.useCallback((t2)=>{if(t2.status!=="triage")return void toast.show({variant:"info",message:`${t2.id} is ${t2.status}, not triage`});return sh(`specify ${q3(t2.id)} --json`).then((out)=>{if(out==null)return;let r=parseSpecify(out)[0];if(!r)return;if(!r.ok)return void toast.show({variant:"error",message:`specify ${r.task_id}: ${trunc5(r.reason??"failed",100)}`});toast.show({variant:"success",message:r.new_title?`Specified ${r.task_id} \u2192 ${trunc5(r.new_title,60)}`:`Specified ${r.task_id} \u2192 todo`})})},[sh,toast]),specifyAll=import_react92.useCallback(()=>{let triage=live.current.sec?.cols.find((c)=>c.status==="triage")?.tasks.length??0;if(triage===0)return void toast.show({variant:"info",message:`No 'triage' tasks on ${live.current.at}`});return openConfirm(dialog,{title:`Specify all \xB7 ${live.current.at}`,body:`${triage} task${triage===1?"":"s"} in 'triage'. Auxiliary LLM expands each body and promotes to todo.`,yes:"specify"}).then((go)=>{if(!go)return;return sh("specify --all --json").then((out)=>{if(out==null)return;let rows3=parseSpecify(out),ok=rows3.filter((r)=>r.ok).length,bad=rows3.length-ok;toast.show({variant:ok===0&&bad>0?"error":"success",message:`Specified ${ok}/${rows3.length}${bad?` (${bad} failed)`:""}`})})})},[dialog,sh,toast]),dispatch=import_react92.useCallback(()=>{let ready=live.current.sec?.cols.find((c)=>c.status==="ready")?.tasks.length??0;if(ready===0)return void toast.show({variant:"info",message:`No 'ready' tasks on ${live.current.at}`});return openConfirm(dialog,{title:`Dispatch \xB7 ${live.current.at}`,body:`${ready} task${ready===1?"":"s"} in 'ready'. Spawns one worker per task (one pass).`,yes:"dispatch"}).then((ok)=>{if(!ok)return;sh("dispatch --json").then((out)=>{if(out==null)return;let r=parseDispatchResult(out),spawned2=r.spawned.length,deferred=r.skipped_per_profile_capped.length,defaults=r.auto_assigned_default.length,unassigned=r.skipped_unassigned.length,nonspawnable=r.skipped_nonspawnable.length,failed=dispatchFailures(r).length,guarded2=dispatchGuarded(r).length,parts2=[`${spawned2} spawned`];if(defaults)parts2.push(`${defaults} defaulted`);if(deferred)parts2.push(`${deferred} deferred`);if(unassigned)parts2.push(`${unassigned} unassigned`);if(nonspawnable)parts2.push(`${nonspawnable} non-spawnable`);if(failed)parts2.push(`${failed} failed`);if(guarded2)parts2.push(`${guarded2} guarded`);let more=dispatchDetails(r);toast.show({variant:dispatchVariant(r),message:`Dispatch: ${parts2.join(" \xB7 ")}`,action:more?{label:"details",run:()=>setPane({kind:"dispatch",slug:live.current.at,text:more})}:void 0})}).catch((e)=>void toast.show({variant:"error",message:trunc5(e.message,120)}))})},[dialog,sh,toast]),showLog=import_react92.useCallback((t2)=>{let s=live.current.at,text5=tailLogOf(s,t2.id);if(text5==null)return void toast.show({variant:"info",message:`No worker log for ${t2.id}`});setPane({kind:"log",slug:s,id:t2.id,text:text5})},[toast]),editTitle=import_react92.useCallback((t2)=>openTextPrompt(dialog,{title:"Edit title",label:t2.id,initial:t2.title}).then((v2)=>v2!==null&&v2!==void 0&&patchDirect(t2.id,{title:v2},`Updated ${t2.id}`)),[dialog,patchDirect]),editBody=import_react92.useCallback((t2)=>openTextPrompt(dialog,{title:"Edit body",label:t2.id,initial:t2.body??""}).then((v2)=>{if(v2===null||v2===void 0)return;patchDirect(t2.id,{body:v2},`Updated ${t2.id}`)}),[dialog,patchDirect]),editPriority=import_react92.useCallback((t2)=>{let opts=Array.from({length:10},(_2,i)=>({title:i===0?"P0 (none)":`P${i}`,value:String(i)}));dialog.replace($jsx(DialogSelect,{title:`Priority for ${t2.id}`,options:opts,current:String(t2.priority),filterable:!1,onSelect:(o)=>{dialog.clear(),patchDirect(t2.id,{priority:Number(o.value)},`${t2.id} \u2192 P${o.value}`)}}))},[dialog,patchDirect]),editResult=import_react92.useCallback((t2)=>{if(t2.status!=="done")return void toast.show({variant:"info",message:`${t2.id} is not done`});return openTextPrompt(dialog,{title:"Edit result",label:t2.id,initial:t2.result??""}).then((v2)=>{if(v2==null)return;sh(`edit ${q3(t2.id)} --result ${q3(v2)}`,`Updated ${t2.id} result`)})},[dialog,sh,toast]),block=import_react92.useCallback((t2)=>{blockSupport(live.current.at).then((support)=>{if(support==="no")return openTextPrompt(dialog,{title:`Block ${t2.id}`,label:"Reason (optional; generic block \u2014 active CLI has no --kind)"}).then((r)=>{if(r!==null)runBlock(t2,r,"")});let opts=[{title:"generic",value:"",description:"legacy block without --kind"},{title:"needs input",value:"needs_input",description:"human answer required"},{title:"dependency",value:"dependency",description:"wait in todo until parents finish"},{title:"capability",value:"capability",description:"missing tool, credential, or profile capability"},{title:"transient",value:"transient",description:"temporary/flaky condition"}];dialog.replace($jsx(DialogSelect,{title:`Block kind for ${t2.id}`,options:opts,current:t2.block_kind??"",filterable:!1,onSelect:async(o)=>{dialog.clear();let r=await openTextPrompt(dialog,{title:`Block ${t2.id}`,label:"Reason (optional, posted as comment)"});if(r!==null)runBlock(t2,r,o.value)}}))})},[dialog,blockSupport,runBlock]),editStatus=import_react92.useCallback((t2)=>{let opts=[];if(t2.status!=="done")opts.push({title:"done",value:"complete",description:"mark complete (prompts for result)"});if(t2.status!=="blocked")opts.push({title:"blocked",value:"block",description:"mark blocked (choose kind, prompts for reason)"});if(t2.status!=="scheduled")opts.push({title:"scheduled",value:"schedule",description:"park until externally unblocked (prompts for reason)"});if(t2.status==="blocked"||t2.status==="scheduled")opts.push({title:"ready",value:"unblock",description:t2.status==="scheduled"?"release back to ready":"return to ready"});opts.push({title:"archived",value:"archive",description:"archive (terminal)"}),dialog.replace($jsx(DialogSelect,{title:`Status for ${t2.id}`,options:opts,current:t2.status,filterable:!1,onSelect:async(o)=>{if(dialog.clear(),o.value==="complete"){let res=await openTextPrompt(dialog,{title:`Complete ${t2.id}`,label:"Result (optional)",initial:t2.result??""}),flag=res?` --result ${q3(res)}`:"";sh(`complete ${q3(t2.id)}${flag}`,`Completed ${t2.id}`);return}if(o.value==="block")return block(t2);if(o.value==="schedule"){let r=await openTextPrompt(dialog,{title:`Schedule ${t2.id}`,label:"Reason (optional, posted as comment)"}),arg=r?` ${q3(r)}`:"";sh(`schedule ${q3(t2.id)}${arg}`,`Scheduled ${t2.id}`);return}if(o.value==="unblock")return void sh(`unblock ${q3(t2.id)}`,`Unblocked ${t2.id}`);if(o.value==="archive")return void archive(t2)}}))},[dialog,sh,archive,block]),editParents=import_react92.useCallback((t2)=>{let cur2=(pane?.kind==="detail"&&pane.d.id===t2.id?pane.d:detailOf(at,t2.id))?.parents??[],d2=(data2.get(at)??boardStateOf(at)).columns,opts=STATUSES.flatMap((s)=>d2.get(s)??[]).filter((x2)=>x2.id!==t2.id).map((x2)=>({title:x2.id,description:trunc5(x2.title,50),value:x2.id,category:cur2.includes(x2.id)?"linked":"available"}));dialog.replace($jsx(DialogSelect,{title:`Parents for ${t2.id}`,options:opts,placeholder:"Select to toggle link\u2026",onSelect:(o)=>{if(dialog.clear(),cur2.includes(o.value))sh(`unlink ${q3(o.value)} ${q3(t2.id)}`,`Unlinked ${o.value}`);else sh(`link ${q3(o.value)} ${q3(t2.id)}`,`Linked ${o.value}`)}}))},[dialog,sh,data2,at,pane]),openField=import_react92.useCallback((f,t2)=>{if(f==="title")return void editTitle(t2);if(f==="body")return void editBody(t2);if(f==="assignee")return assign(t2);if(f==="priority")return editPriority(t2);if(f==="status")return editStatus(t2);if(f==="parents")return editParents(t2);if(f==="result")return void editResult(t2);if(f==="comment")return void comment(t2)},[editTitle,editBody,assign,editPriority,editStatus,editParents,editResult,comment]),ACTS=import_react92.useMemo(()=>[{key:"n",title:"New task",when:()=>!0,run:()=>void create()},{key:"N",title:"New child",when:(t2)=>!!t2,run:(t2)=>void create(t2)},{key:"a",title:"Assign",when:(t2)=>!!t2,run:(t2)=>void assign(t2)},{key:"c",title:"Comment",when:(t2)=>!!t2,run:(t2)=>void comment(t2)},{key:"s",title:"Specify",when:(t2)=>t2?.status==="triage",run:(t2)=>void specify(t2)},{key:"S",title:"Specify all",when:()=>!0,run:()=>void specifyAll()},{key:"u",title:"Unblock",when:(t2)=>t2?.status==="blocked"||t2?.status==="scheduled",run:(t2)=>void unblock(t2)},{key:"d",title:"Archive",when:(t2)=>!!t2,run:(t2)=>void archive(t2)},{key:"l",title:"Worker log",when:(t2)=>!!t2,run:(t2)=>showLog(t2)},{key:"b",title:"New board",when:()=>!0,run:()=>void newBoard()},{key:"D",title:"Dispatch",when:()=>!0,run:()=>void dispatch()}],[create,assign,comment,specify,specifyAll,unblock,archive,showLog,newBoard,dispatch]),isOpen=open3.has(at),paneOpen=pane?.kind==="detail",paneFields=paneOpen?fieldsFor(pane.d):[];useKeyboard((key3)=>{if(!props.focused||dialog.open())return;if(key3.name==="escape"&&pane){if(tier==="pane"){setTier("grid");return}return setPane(null)}if(keys.match("list.refresh",key3))return load4();if(key3.name==="tab"){if(paneOpen&&tier!=="pane"){setTier("pane"),setPaneSel(0);return}if(tier==="pane"){let n=paneFields.length;if(n===0)return;let d2=key3.shift?-1:1;setPaneSel((s)=>(s+d2+n)%n);return}return goBoard(key3.shift?-1:1)}if(tier==="pane"){let t3=live.current.task;if(!t3||!paneOpen)return;let f=paneFields[Math.min(paneSel,paneFields.length-1)];if(key3.name==="up"){let n=paneFields.length;if(n===0)return;return setPaneSel((s)=>(s-1+n)%n)}if(key3.name==="down"){let n=paneFields.length;if(n===0)return;return setPaneSel((s)=>(s+1)%n)}if(key3.name==="return")return openField(f,t3);let hit2=ACTS.find((a)=>a.key===key3.raw&&a.when(t3));if(hit2)return hit2.run(t3);return}if(key3.name==="space"||key3.name===" "){if(tier==="head")return toggle(at);if(tier==="filter"&&sec3?.chips[chip2])return flip(sec3.chips[chip2]);return}if(key3.name==="down"){if(tier==="head"){if(isOpen)return setTier("filter");let n2=stepBoard(1);return n2?enterTop(n2):void 0}if(tier==="filter"){if(sec3&&sec3.shown>0){setTier("grid"),setRow(0);return}let n2=stepBoard(1);return n2?enterTop(n2):void 0}if(row3<(cur?.tasks.length??1)-1)return setRow((r)=>r+1);let n=stepBoard(1);return n?enterTop(n):void 0}if(key3.name==="up"){if(tier==="head"){let p=stepBoard(-1);return p?enterBottom(p):void 0}if(tier==="filter")return setTier("head");if(row3>0)return setRow((r)=>r-1);return setTier("filter")}if(key3.name==="left"){if(tier==="filter")return setChip((c)=>Math.max(0,c-1));if(tier==="grid")return setCol((c)=>{let n=Math.max(0,c-1);return setRow(0),n});return}if(key3.name==="right"){if(tier==="filter")return setChip((c)=>Math.min((sec3?.chips.length??1)-1,c+1));if(tier==="grid")return setCol((c)=>{let n=Math.min(cols2.length-1,c+1);return setRow(0),n});return}if(key3.name==="return"){if(tier==="head")return toggle(at);if(tier==="filter"&&sec3?.chips[chip2])return flip(sec3.chips[chip2]);if(task)return setPane((p)=>p?.kind==="detail"&&p.d.id===task.id?null:((d2)=>d2?{kind:"detail",slug:at,d:d2}:null)(detailOf(at,task.id)));return}let t2=live.current.task,hit=ACTS.find((a)=>a.key===key3.raw&&a.when(t2));if(hit)return hit.run(t2)});let hint=import_react92.useMemo(()=>{let t2=task;return[tier==="pane"?"Esc grid":"Tab board",tier==="head"?"\u2191\u2193 nav Space fold":tier==="filter"?"\u2190\u2192 chip Space toggle":tier==="pane"?"Tab/\u2191\u2193 field Enter edit Esc grid":"\u2190\u2192\u2191\u2193 nav Enter detail",...ACTS.filter((a)=>a.when(t2)).map((a)=>`${a.key} ${a.title.toLowerCase()}`),`${keys.print("list.refresh")} reload`].join(" ")},[ACTS,keys,task,tier]),onHead=import_react92.useCallback((s)=>{setAt(s),setTier("head"),toggle(s)},[toggle]),onChip=import_react92.useCallback((s,i,c)=>{setAt(s),setTier("filter"),setChip(i),flip(c)},[flip]),onPick=import_react92.useCallback((s,ci,ri,id)=>{setAt(s),setTier("grid"),setCol(ci),setRow(ri),setOpen((o)=>o.has(s)?o:new Set(o).add(s));let d2=detailOf(s,id);if(d2)setPane({kind:"detail",slug:s,d:d2})},[]);return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsxs("box",{flexDirection:"row",flexGrow:1,children:[$jsx(TabShell,{title:`Kanban \xB7 ${sections.length} board${sections.length===1?"":"s"} \xB7 ${grand} task${grand===1?"":"s"}${running2?` \xB7 ${running2} running`:""}`,children:$jsx("scrollbox",{id:"kb-board-scroll",ref:outer,scrollY:!0,flexGrow:1,verticalScrollbarOptions:NOBAR,children:$jsx("box",{flexDirection:"column",width:"100%",children:sections.map((s)=>{let on=s.board.slug===at,secOpen=open3.has(s.board.slug),m2=maskOf(s.board.slug),filt=m2.who.size+m2.pri.size+m2.status.size,dg=diags.get(s.board.slug)??EMPTY_DIAG;return $jsxs("box",{id:`kb-sec-${s.board.slug}`,flexDirection:"column",flexShrink:0,marginBottom:1,children:[$jsx("box",{height:1,onMouseDown:()=>onHead(s.board.slug),backgroundColor:on&&tier==="head"?theme.backgroundElement:void 0,children:$jsxs("text",{children:[$jsx("span",{fg:on?theme.accent:theme.textMuted,children:secOpen?"\u25BE ":"\u25B8 "}),$jsx("span",{fg:on?theme.primary:theme.text,children:$jsx("strong",{children:s.board.name})}),$jsx("span",{fg:theme.textMuted,children:s.error?` \xB7 ${s.error.kind}`:s.corruptBackups.length>0?` \xB7 ${s.corruptBackups.length} corrupt backup${s.corruptBackups.length===1?"":"s"}`:s.total===0?" \xB7 empty":` \xB7 ${filt?`${s.shown}/`:""}${s.total} task${s.total===1?"":"s"}${s.running?` \xB7 ${s.running} running`:""}`})]})}),secOpen?s.error?$jsx(ErrorBanner,{error:s.error,backups:s.corruptBackups}):s.corruptBackups.length>0&&s.total===0?$jsx("box",{height:1,marginLeft:2,children:$jsx("text",{fg:theme.warning,children:`corrupt backup found: ${s.corruptBackups[0]}`})}):s.total===0?$jsx("box",{height:1,marginLeft:2,children:$jsxs("text",{fg:theme.textMuted,children:["no tasks \u2014 ",$jsx("span",{fg:theme.accent,children:"n"})," to create one here"]})}):$jsxs($Fragment,{children:[$jsx(FilterBar,{chips:s.chips,mask:m2,on:on&&tier==="filter",sel:on?Math.min(chip2,s.chips.length-1):-1,onPick:(i)=>onChip(s.board.slug,i,s.chips[i])}),s.cols.length>0?$jsx("box",{flexDirection:"row",height:s.cap,gap:1,children:s.cols.map((c,ci)=>$jsx(Column,{slug:s.board.slug,status:c.status,tasks:c.tasks,diags:dg,on:on&&(tier==="grid"||tier==="pane")&&ci===clampCol,sel:on?row3:0,onPick:(ri)=>onPick(s.board.slug,ci,ri,c.tasks[ri].id)},c.status))}):$jsx("box",{height:1,marginLeft:2,children:$jsx("text",{fg:theme.textMuted,children:"all columns hidden"})})]}):null]},s.board.slug)})})})}),pane?$jsx(SidePane,{pane,on:tier==="pane",sel:paneSel,diags:pane.kind==="detail"?diags.get(pane.slug)?.get(pane.d.id)??EMPTY_DIAGS:EMPTY_DIAGS}):null]}),$jsx(HintBar,{raw:hint})]})});var Automation=import_react94.memo((props)=>{let labels=SUB_TABS[AUTOMATION_TAB];import_react94.useEffect(()=>{if(props.sub>=labels.length)props.setSub(0)},[props.sub,labels.length]);let hint="shift+\u2190/\u2192 sub";return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsx(SubTabBar,{tabs:labels,active:props.sub,onChange:props.setSub,hint}),$jsxs("box",{flexGrow:1,minWidth:0,flexDirection:"column",children:[$jsx(Pane2,{visible:props.sub===0,children:$jsx(Kanban,{focused:!!props.focused&&props.sub===0})}),$jsx(Pane2,{visible:props.sub===1,children:$jsx(Agents,{focused:!!props.focused&&props.sub===1,sessionId:props.sessionId,onSwitchProfile:props.onSwitchProfile})}),$jsx(Pane2,{visible:props.sub===2,children:$jsx(Cron,{focused:!!props.focused&&props.sub===2})})]})]})}),Pane2=({visible:visible2,children:children2})=>visible2?$jsx("box",{flexGrow:1,minWidth:0,minHeight:0,flexDirection:"column",children:children2}):null;var import_react107=__toESM(require_react_production(),1);var import_react97=__toESM(require_react_production(),1);init_lane();init_lane();init_schema();var int=(lo,hi,what=`${lo}\u2013${hi}`)=>(raw)=>{let n=Number(raw);if(!Number.isInteger(n))return`expected integer ${what}`;if(n<lo||n>hi)return`expected ${what}`;return null},intMin=(lo,what=`\u2265 ${lo}`)=>(raw)=>{let n=Number(raw);if(!Number.isInteger(n))return`expected integer ${what}`;if(n<lo)return`expected ${what}`;return null},integer=(raw)=>Number.isInteger(Number(raw))?null:"expected integer",float=(lo,hi)=>(raw)=>{let n=Number(raw);if(!Number.isFinite(n))return`expected number ${lo}\u2013${hi}`;if(n<lo||n>hi)return`expected ${lo}\u2013${hi}`;return null},oneOf=(...opts)=>(raw)=>opts.includes(raw)?null:`expected one of: ${opts.join(" | ")}`,nonNeg=(raw)=>{let n=Number(raw);return Number.isFinite(n)&&n>=0?null:"expected \u2265 0"},RULES={"compression.threshold":float(0.1,0.95),"compression.target_ratio":float(0.05,0.9),"prompt_caching.cache_ttl":(raw)=>/^\d+[smhd]$/.test(raw.trim())?null:"expected duration e.g. 5m, 1h","agent.max_turns":int(1,1e4),"agent.max_verify_nudges":int(0,100),"delegation.max_iterations":int(1,1e4),"delegation.max_concurrent_children":int(1,64),"delegation.max_spawn_depth":int(1,3),"delegation.max_summary_chars":intMin(0),"agent.gateway_timeout":nonNeg,"agent.gateway_timeout_warning":nonNeg,"agent.gateway_notify_interval":nonNeg,"agent.restart_drain_timeout":nonNeg,"gateway.platform_connect_timeout":integer,"delegation.child_timeout_seconds":nonNeg,"browser.command_timeout":int(1,600),"approvals.timeout":int(1,3600),"security.tirith_timeout":int(1,120),"agent.api_max_retries":int(0,20),"tool_output.max_bytes":int(1024,1e7),"tool_output.max_lines":int(10,1e5),"tools.tool_search.max_search_limit":int(1,50),"tools.tool_search.search_default_limit":int(1,50),"tools.tool_search.threshold_pct":int(0,100),"sessions.retention_days":int(1,3650),"sessions.min_interval_hours":int(1,720),"agent.service_tier":oneOf("","fast","standard"),"agent.verify_on_stop":oneOf("auto","true","false"),"display.busy_input_mode":oneOf("queue","steer","interrupt"),"display.details_mode":oneOf("hidden","collapsed","expanded"),"display.thinking_mode":oneOf("collapsed","truncated","full"),"display.tool_progress":oneOf(...TOOL_PROGRESS),"display.final_response_markdown":oneOf("render","strip","raw"),"logging.level":oneOf("DEBUG","INFO","WARNING","ERROR"),"approvals.mode":oneOf(...APPROVAL_MODES),"code_execution.mode":oneOf("project","strict"),"onboarding.profile_build":oneOf("ask","off"),"streaming.transport":oneOf("auto","draft","edit","off"),"tools.tool_search.enabled":oneOf("auto","on","off"),"updates.non_interactive_local_changes":oneOf("stash","discard")},check2=(key3,raw)=>RULES[key3]?.(raw)??null;init_schema();init_lane();var SELECTS={"terminal.backend":["local","docker","ssh","modal","daytona","singularity","vercel_sandbox"],"tts.provider":["edge","elevenlabs","openai","neutts","xai","mistral"],"logging.level":["DEBUG","INFO","WARNING","ERROR"],"agent.reasoning_effort":["","none","minimal","low","medium","high","xhigh"],"agent.verify_on_stop":["auto","true","false"],"display.busy_input_mode":["queue","steer","interrupt"],"display.details_mode":["hidden","collapsed","expanded"],"display.thinking_mode":["collapsed","truncated","full"],"display.tool_progress":[...TOOL_PROGRESS],"approvals.mode":[...APPROVAL_MODES],"onboarding.profile_build":["ask","off"],"streaming.transport":["auto","draft","edit","off"],"tools.tool_search.enabled":["auto","on","off"],"updates.non_interactive_local_changes":["stash","discard"]},get4=(obj2,path4)=>{let cur=obj2;for(let p of path4.split("."))if(cur&&typeof cur==="object"&&!Array.isArray(cur))cur=cur[p];else return;return cur},classify2=(key3,t2)=>{if(route(key3).via==="readonly")return"readonly";if(SELECTS[key3]||key3==="display.skin")return"select";if(t2==="bool")return"boolean";if(t2==="int"||t2==="float")return"number";return"string"},labelOf=(key3)=>{let raw=SCHEMA[key3]?.group??key3.split(".")[0];return key3.startsWith(`${raw}.`)?key3.slice(raw.length+1):key3},buildFields=(user)=>{let seen=new Set,out=[];for(let key3 of SCHEMA_KEYS){let s=SCHEMA[key3],uv=get4(user,key3),set3=uv!==void 0;out.push({key:key3,label:labelOf(key3),type:classify2(key3,s.type),value:set3?uv:s.default,set:set3,doc:s.doc,effect:s.effect,options:key3==="display.skin"?skins():SELECTS[key3]}),seen.add(key3)}let walk2=(obj2,prefix="")=>{for(let[k2,v2]of Object.entries(obj2)){let key3=prefix?`${prefix}.${k2}`:k2;if(v2&&typeof v2==="object"&&!Array.isArray(v2)){if(SCHEMA[key3]?.type==="dict"){seen.add(key3);continue}walk2(v2,key3);continue}if(seen.has(key3))continue;out.push({key:key3,label:labelOf(key3),type:Array.isArray(v2)?"readonly":typeof v2==="boolean"?"boolean":typeof v2==="number"?"number":"string",value:v2,set:!0,doc:"",effect:"live"})}};return walk2(user),out},MERGE={approvals:"security",privacy:"security",secrets:"security",checkpoints:"agent",context:"agent",cron:"agent",network:"agent",model_catalog:"general",onboarding:"general",human_delay:"display",dashboard:"display",gateway:"display",desktop:"display",voice:"display",tool_output:"agent",prompt_caching:"compression",code_execution:"terminal",computer_use:"agent",goals:"agent",lsp:"agent",tool_loop_guardrails:"agent",web:"agent",x_search:"agent",tools:"agent",streaming:"display",vertex:"general",slack:"platforms",telegram:"platforms",mattermost:"platforms",discord:"platforms",whatsapp:"platforms",matrix:"platforms"},rawGroupOf=(key3)=>SCHEMA[key3]?.group??(key3.includes(".")?key3.split(".")[0]:"general"),groupOf=(key3)=>{let raw=rawGroupOf(key3);return MERGE[raw]??raw},sections=(group2,fields)=>{let by=new Map;for(let f of fields){let r=rawGroupOf(f.key);if(!by.has(r))by.set(r,[]);by.get(r).push(f)}if(by.size<=1)return[{head:null,items:fields}];return[...by.keys()].sort((a,b2)=>a===group2?-1:b2===group2?1:a.localeCompare(b2)).map((r)=>({head:r,items:by.get(r)}))},GROUPS=(()=>{let g=new Set(["general"]);for(let k2 of SCHEMA_KEYS)g.add(groupOf(k2));return[...g]})(),EFFECT_GLYPH={live:"",session:"\u21BB",restart:"\u27F3"};init_lane();var AUX_TASKS=[{key:"vision",label:"Vision",hint:"Image analysis"},{key:"web_extract",label:"Web Extract",hint:"Page summarization"},{key:"compression",label:"Compression",hint:"Context compaction"},{key:"session_search",label:"Session Search",hint:"Recall queries"},{key:"skills_hub",label:"Skills Hub",hint:"Skill search"},{key:"approval",label:"Approval",hint:"Smart auto-approve"},{key:"mcp",label:"MCP",hint:"MCP tool routing"},{key:"title_generation",label:"Title Gen",hint:"Session titles"},{key:"triage_specifier",label:"Triage Specifier",hint:"Kanban spec fleshing"},{key:"kanban_decomposer",label:"Kanban Decomposer",hint:"Task decomposition"},{key:"profile_describer",label:"Profile Describer",hint:"Auto profile descriptions"},{key:"curator",label:"Curator",hint:"Skill-usage review"}],dig=(o,...path4)=>path4.reduce((c,p)=>c&&typeof c==="object"?c[p]:void 0,o),str3=(v2)=>typeof v2==="string"?v2:"",readSlots=(raw)=>{let main={kind:"main",key:"main",label:"Main model",hint:"Primary agent model",provider:str3(dig(raw,"model","provider")),model:str3(dig(raw,"model","default"))||str3(dig(raw,"model","name")),auto:!1},aux=AUX_TASKS.map((t2)=>{let p=str3(dig(raw,"auxiliary",t2.key,"provider"));return{kind:"aux",key:t2.key,label:t2.label,hint:t2.hint,provider:p,model:str3(dig(raw,"auxiliary",t2.key,"model")),auto:p===""||p==="auto"}});return[main,...aux]},staleAuxForMain=(slots,provider)=>slots.filter((s)=>s.kind==="aux"&&!s.auto&&s.provider!==""&&s.provider!=="auto"&&s.provider!==provider),assign=async(gw,slot,provider,model)=>{if(slot==="main"){let r=await gw.request("config.set",{key:"model",value:`${model} --provider ${provider} --global`,session_id:void 0});return{ok:["model.default","model.provider"],failed:[],warnings:[],warning:r.warning}}return writeConfig(gw,[{key:`auxiliary.${slot}.provider`,to:provider},{key:`auxiliary.${slot}.model`,to:model}])},resetAux=(gw,slot)=>{let keys=slot==="all"?AUX_TASKS.map((t2)=>t2.key):[slot];return writeConfig(gw,keys.flatMap((k2)=>[{key:`auxiliary.${k2}.provider`,to:"auto"},{key:`auxiliary.${k2}.model`,to:""}]))};var import_react96=__toESM(require_react_production(),1);var import_react95=__toESM(require_react_production(),1);var SecretPrompt=(props)=>{let theme=useTheme().theme,[value2,setValue]=import_react95.useState("");return $jsxs("box",{flexDirection:"column",width:60,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.warning,children:$jsx("strong",{children:props.title})})}),$jsx("box",{height:1}),props.label?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:props.label})}):null,$jsx(MaskInput,{value:value2,input:setValue,submit:()=>{let v2=value2.trim();if(v2)props.onSubmit(v2)}}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:value2.trim()?"Enter confirm \xB7 Esc cancel":"Esc cancel"})})]})};var REFRESH="__refresh__",configured=(p)=>(p.models?.length??0)>0,setupDescription=(p)=>{if(p.warning)return p.warning;if(p.auth_type==="api_key"&&p.key_env)return`paste ${p.key_env} to activate`;if(p.auth_type==="vertex")return p.key_env?`set ${p.key_env} to your service-account JSON path`:"configure Vertex credentials with hermes model";if(p.key_env)return`set ${p.key_env} before using this provider`;if(p.auth_type)return`run hermes model to configure (${p.auth_type})`;return},providerDescription=(p)=>{if(p.authenticated===!1)return setupDescription(p);return p.total_models?`${p.total_models} models`:void 0},replaceProvider=(data2,slug2,next3)=>({...data2,providers:(data2.providers??[]).map((p)=>p.slug===slug2?next3:p)}),ModelPickerDialog=(props)=>{let dialog=useDialog(),toast=useToast(),keys=useKeys(),theme=useTheme().theme,[data2,setData]=import_react96.useState(null),[step,setStep]=import_react96.useState("provider"),[provider,setProvider]=import_react96.useState(null),[setupProvider,setSetupProvider]=import_react96.useState(null),[global2,setGlobal]=import_react96.useState(!1),seq=import_react96.useRef(0),load4=import_react96.useCallback(async(force=!1,quiet=!1)=>{let id=++seq.current;try{let next3=await props.gw.request("model.options",force?{refresh:!0,include_unconfigured:!0}:{include_unconfigured:!0});if(seq.current!==id)return null;return setData((d2)=>force||!d2?next3:d2),next3}catch(e){if(seq.current!==id)return null;if(!quiet)toast.show({variant:"error",message:e instanceof Error?e.message:String(e)});let empty={providers:[]};return setData((d2)=>d2??empty),null}},[props.gw,toast]),refresh=import_react96.useCallback(()=>{toast.show({variant:"info",message:"Refreshing model catalog; custom-provider probes may be slower\u2026"}),load4(!0)},[load4,toast]);import_react96.useEffect(()=>{return load4(Boolean(props.refresh)),()=>{seq.current++}},[load4,props.refresh]);let apply=import_react96.useCallback((model,prov)=>{if(props.onApply)return void props.onApply(prov,model).catch((e)=>toast.show({variant:"error",message:e.message}));let value2=`${model} --provider ${prov}${global2?" --global":""}`;props.gw.request("config.set",global2?{key:"model",value:value2,session_id:void 0}:{key:"model",value:value2}).then((r)=>{if(toast.show({variant:"success",message:`model \u2192 ${r.value??model}${global2?" (global)":""}`}),r.warning)toast.show({variant:"warning",message:r.warning})}).catch((e)=>toast.show({variant:"error",message:e.message}))},[props.gw,props.onApply,global2,toast]),submitKey=import_react96.useCallback(async(p2,key3)=>{try{let r=await props.gw.request("model.save_key",{slug:p2.slug,api_key:key3});if(r.warning)toast.show({variant:"warning",message:r.warning});let direct=r.provider&&configured(r.provider)?r.provider:null,hit=(direct?null:await load4(!0,!0))?.providers?.find((pp)=>pp.slug===p2.slug),next3=direct??(hit&&configured(hit)?hit:r.provider??hit);if(!next3){toast.show({variant:"warning",message:"Provider saved; refresh model options to continue"});return}if(setData((d2)=>d2?replaceProvider(d2,p2.slug,next3):d2),configured(next3)){setSetupProvider(null),setProvider(next3.slug),setStep("model"),toast.show({variant:"success",message:`${next3.name} activated`});return}toast.show({variant:"warning",message:next3.warning??"Provider saved but no models were returned"})}catch(e){toast.show({variant:"error",message:e instanceof Error?e.message:String(e)})}},[props.gw,load4,toast]),setup=import_react96.useCallback((p2)=>{let msg=setupDescription(p2);if(p2.auth_type!=="api_key"||!p2.key_env){toast.show({variant:"warning",message:msg??"Run hermes model to configure this provider"});return}setSetupProvider(p2),setStep("setup")},[toast]),onKey=import_react96.useCallback((k2)=>{if(k2.name==="f5"||keys.match("list.refresh",k2))return refresh(),!0;if(k2.name==="tab"&&!props.onApply)return setGlobal((g)=>!g),!0;if(k2.name==="left"&&step!=="provider")return setStep("provider"),!0;return!1},[keys,props.onApply,refresh,step]),hint=`${keys.print("list.refresh")} refresh`,footer=props.onApply?$jsx("text",{fg:theme.textMuted,children:step==="model"?`${hint} \xB7 \u2190 providers`:hint}):$jsxs("text",{fg:theme.textMuted,children:[$jsx("span",{children:"Scope: "}),$jsx("span",{fg:global2?theme.warning:theme.accent,children:global2?"global (persists to config)":"this session"}),$jsx("span",{children:` \xB7 Tab toggle \xB7 ${hint}${step==="model"?" \xB7 \u2190 providers":""}`})]});if(!data2)return $jsx("box",{width:50,padding:1,children:$jsx("text",{children:"Loading models\u2026"})});if(step==="setup"&&setupProvider?.key_env)return $jsx(SecretPrompt,{title:`Paste ${setupProvider.key_env}`,label:setupDescription(setupProvider)??`API key for ${setupProvider.name}`,onSubmit:(key3)=>{submitKey(setupProvider,key3)}});if(step==="provider"){let options2=[...(data2.providers??[]).toSorted((a,b2)=>Number(Boolean(b2.is_current))-Number(Boolean(a.is_current))).map((p2)=>({title:p2.name,value:p2.slug,description:providerDescription(p2),category:p2.is_current?"Current":p2.authenticated===!1?"Setup required":"Available"})),{title:"Refresh model options",value:REFRESH,description:"force reload from gateway",hint:void 0,category:"Actions"}];return $jsx(DialogSelect,{title:props.title??"Switch Provider",options:options2,current:data2.provider,onSelect:(o)=>{if(o.value===REFRESH)return refresh();let p2=data2.providers?.find((pp)=>pp.slug===o.value);if(p2?.authenticated===!1||p2&&!configured(p2))return void setup(p2);setProvider(o.value),setStep("model")},onKey,placeholder:"Search providers...",footer})}let p=data2.providers?.find((pp)=>pp.slug===provider),options=[...(p?.models??[]).map((m2)=>{let caps3=p?.capabilities?.[m2],badges=[caps3?.fast?"fast":"",caps3?.reasoning?"reasoning":""].filter(Boolean);return{title:m2,value:m2,hint:badges.length>0?badges.join(" \xB7 "):void 0}}),{title:"Refresh model options",value:REFRESH,description:"force reload from gateway",hint:void 0,category:"Actions"}];return $jsx(DialogSelect,{title:props.title?`${props.title} \xB7 ${p?.name??provider}`:`Switch Model (${p?.name??provider})`,options,current:provider===data2.provider?data2.model:void 0,onSelect:(o)=>{if(o.value===REFRESH)return refresh();if(dialog.clear(),provider)apply(o.value,provider)},onKey,placeholder:"Search models...",footer})},openModelPicker=(dialog,gw,opts)=>{dialog.replace($jsx(ModelPickerDialog,{gw,title:opts?.title,onApply:opts?.onApply,refresh:opts?.refresh}))};var flatten=(obj2,prefix="")=>Object.entries(obj2).flatMap(([k2,v2])=>{let key3=prefix?`${prefix}.${k2}`:k2;if(v2&&typeof v2==="object"&&!Array.isArray(v2))return flatten(v2,key3);return[[key3,v2]]}),setNested=(obj2,path4,val)=>{let parts2=path4.split("."),cur=obj2;for(let i=0;i<parts2.length-1;i++){if(!cur[parts2[i]]||typeof cur[parts2[i]]!=="object")cur[parts2[i]]={};cur=cur[parts2[i]]}cur[parts2[parts2.length-1]]=val},getNested=(obj2,path4)=>{let parts2=path4.split("."),cur=obj2;for(let p of parts2)if(cur&&typeof cur==="object"&&!Array.isArray(cur))cur=cur[p];else return;return cur},FieldRow2=import_react97.memo((props)=>{let theme=useTheme().theme,f=props.field,bg2=props.active?theme.backgroundElement:void 0,indicator=props.active?"\u25B8 ":" ",mark2=props.changed?"\u25CF ":f.set?"\xB7":" ",markFg=props.changed?theme.warning:theme.textMuted,display2=()=>{if(props.editing)return props.buf+"\u2588";if(f.type==="readonly"){let n=Array.isArray(f.value)?f.value.length:f.value&&typeof f.value==="object"?Object.keys(f.value).length:0;return n===0?"\u2014":`${n} item${n===1?"":"s"}`}if(f.type==="boolean")return f.value?"\u2713 ON":"\u2717 OFF";return String(f.value??"")},hint=()=>{if(props.readonly||f.type==="readonly")return"\uD83D\uDD12";if(f.type==="boolean")return"[space]";if(f.type==="select")return"[h/l]";return"[enter]"},ro=props.readonly||f.type==="readonly",valFg=ro||!f.set?theme.textMuted:f.type==="boolean"?f.value?theme.success:theme.error:theme.text,labelFg=ro?theme.textMuted:props.active?theme.accent:theme.text,lead2=4+(props.badge!==void 0?12:0),glyph=props.active?EFFECT_GLYPH[f.effect]:"";return $jsxs("box",{id:props.id,flexDirection:"column",backgroundColor:bg2,children:[$jsxs("box",{flexDirection:"row",height:1,children:[$jsx(Col,{w:2,fg:markFg,children:mark2}),$jsx(Col,{w:2,fg:props.active?theme.primary:theme.text,children:indicator}),props.badge!==void 0?$jsx(Col,{w:12,fg:theme.textMuted,children:props.badge}):null,$jsx(Col,{w:40,fg:labelFg,children:f.label}),$jsx(Col,{grow:!0,min:6,fg:valFg,children:display2()}),$jsx(Col,{w:2,fg:theme.textMuted,children:glyph}),$jsx(Col,{w:9,fg:theme.textMuted,right:!0,children:props.active?hint():""})]}),props.error?$jsxs("box",{flexDirection:"row",height:1,children:[$jsx(Col,{w:lead2+40,fg:theme.textMuted,children:""}),$jsx(Col,{grow:!0,min:6,fg:theme.error,children:`\u2717 ${props.error}`})]}):props.active&&f.doc?$jsxs("box",{flexDirection:"row",minHeight:1,children:[$jsx("box",{width:lead2,flexShrink:0}),$jsx("box",{width:40,flexShrink:0,minHeight:1,children:$jsx("text",{wrapMode:"word",fg:theme.textMuted,children:f.doc})})]}):null]})}),SlotRow=import_react97.memo((p)=>{let theme=useTheme().theme,main=p.s.kind==="main",val=main?`${p.s.provider||"(unset)"} \xB7 ${p.s.model||"(unset)"}`:p.s.auto?"auto (use main model)":`${p.s.provider} \xB7 ${p.s.model||"(provider default)"}`;return $jsxs("box",{id:p.id,flexDirection:"row",height:1,backgroundColor:p.on?theme.backgroundElement:void 0,children:[$jsx(Col,{w:2,fg:p.on?theme.primary:theme.text,children:p.on?"\u25B8 ":" "}),$jsx(Col,{w:2,fg:main?theme.primary:theme.textMuted,children:main?"\u2605":" "}),$jsx(Col,{w:16,fg:p.on?theme.accent:theme.text,children:p.s.label}),$jsx(Col,{w:22,fg:theme.textMuted,children:p.s.hint}),$jsx(Col,{grow:!0,min:10,fg:p.s.auto?theme.textMuted:theme.text,children:val}),$jsx(Col,{w:14,fg:theme.textMuted,right:!0,children:p.on?main?"[enter]":"[enter] [x]":""})]})}),Config2=import_react97.memo((props)=>{let theme=useTheme().theme,gw=useGateway(),restartGateway=useGatewayRestart(),toast=useToast(),dialog=useDialog(),[raw,setRaw]=import_react97.useState({}),rawRef=import_react97.useRef(raw);rawRef.current=raw;let[original,setOriginal]=import_react97.useState({}),[yaml,setYaml]=import_react97.useState(""),[mode2,setMode]=import_react97.useState("form"),[cat,setCat]=import_react97.useState(0),[cursor,setCursor]=import_react97.useState(0),[editing,setEditing]=import_react97.useState(!1),[buf,setBuf]=import_react97.useState(""),[err,setErr]=import_react97.useState({}),[searching,setSearching]=import_react97.useState(!1),[query2,setQuery]=import_react97.useState(""),[focus,setFocus]=import_react97.useState("categories"),[managed,setManaged]=import_react97.useState(null),[loadErr,setLoadErr]=import_react97.useState(null),loads=import_react97.useRef(0);import_react97.useEffect(()=>{managedSystem().then(setManaged)},[]);let load4=import_react97.useCallback(()=>{let gen=++loads.current;gw.request("config.get",{key:"full"}).then((res)=>{if(loads.current!==gen)return;let parsed=res.config??{};rawRef.current=structuredClone(parsed),setRaw(rawRef.current),setOriginal(structuredClone(parsed)),setYaml($stringify(parsed)),setErr({}),setLoadErr(null)}).catch((e)=>{if(loads.current===gen)setLoadErr(e instanceof Error?e.message:String(e))})},[gw]);import_react97.useEffect(()=>{return load4(),()=>{loads.current++}},[load4]);let all=buildFields(raw),grouped=all.reduce((map,f)=>{let g=groupOf(f.key);if(!map.has(g))map.set(g,[]);return map.get(g).push(f),map},new Map(GROUPS.map((g)=>[g,[]]))),groups=[...grouped.keys()];groups.splice(1,0,"models");let active2=groups[cat]??groups[0],onSlots=active2==="models"&&!searching,slots=readSlots(raw),secs=searching&&query2.trim()?[{head:null,items:all.filter((f)=>f.key.toLowerCase().includes(query2.toLowerCase()))}]:sections(active2,grouped.get(active2)??[]),fields=secs.flatMap((s)=>s.items),count3=onSlots?slots.length:fields.length,follow=useFollow("cfg"),catFollow=useFollow("cfg-cat"),changed=(key3)=>JSON.stringify(getNested(raw,key3))!==JSON.stringify(getNested(original,key3)),nChanged=all.reduce((n,f)=>n+(changed(f.key)?1:0),0),update=(key3,val)=>{loads.current++;let next3=structuredClone(rawRef.current);setNested(next3,key3,val),rawRef.current=next3,setRaw(next3),setYaml($stringify(next3))},fmt3=(v2)=>v2===void 0?"\u2014":Array.isArray(v2)?v2.join(", "):String(v2),save2=async()=>{if(managed){toast.show({variant:"error",message:`Managed by ${managed} \u2014 edit configuration.nix`});return}let nErr=Object.keys(err).length;if(nErr>0){toast.show({variant:"error",message:`${nErr} invalid field${nErr===1?"":"s"}`});return}let target=mode2==="yaml"?$parse(yaml)??{}:rawRef.current,diffs=flatten(target).filter(([key3])=>JSON.stringify(getNested(target,key3))!==JSON.stringify(getNested(original,key3))).map(([key3,val])=>({key:key3,from:getNested(original,key3),to:val}));if(diffs.length===0){toast.show({variant:"info",message:"No changes"});return}let body=diffs.map((d2)=>`${d2.key}: ${fmt3(d2.from)} \u2192 ${fmt3(d2.to)}`).join(`
|
|
4150
|
+
`).flatMap((l)=>l.trim()?[JSON.parse(l)]:[]),specify=import_react92.useCallback((t2)=>{if(t2.status!=="triage")return void toast.show({variant:"info",message:`${t2.id} is ${t2.status}, not triage`});return sh(`specify ${q3(t2.id)} --json`).then((out)=>{if(out==null)return;let r=parseSpecify(out)[0];if(!r)return;if(!r.ok)return void toast.show({variant:"error",message:`specify ${r.task_id}: ${trunc5(r.reason??"failed",100)}`});toast.show({variant:"success",message:r.new_title?`Specified ${r.task_id} \u2192 ${trunc5(r.new_title,60)}`:`Specified ${r.task_id} \u2192 todo`})})},[sh,toast]),specifyAll=import_react92.useCallback(()=>{let triage=live.current.sec?.cols.find((c)=>c.status==="triage")?.tasks.length??0;if(triage===0)return void toast.show({variant:"info",message:`No 'triage' tasks on ${live.current.at}`});return openConfirm(dialog,{title:`Specify all \xB7 ${live.current.at}`,body:`${triage} task${triage===1?"":"s"} in 'triage'. Auxiliary LLM expands each body and promotes to todo.`,yes:"specify"}).then((go)=>{if(!go)return;return sh("specify --all --json").then((out)=>{if(out==null)return;let rows3=parseSpecify(out),ok=rows3.filter((r)=>r.ok).length,bad=rows3.length-ok;toast.show({variant:ok===0&&bad>0?"error":"success",message:`Specified ${ok}/${rows3.length}${bad?` (${bad} failed)`:""}`})})})},[dialog,sh,toast]),dispatch=import_react92.useCallback(()=>{let ready=live.current.sec?.cols.find((c)=>c.status==="ready")?.tasks.length??0;if(ready===0)return void toast.show({variant:"info",message:`No 'ready' tasks on ${live.current.at}`});return openConfirm(dialog,{title:`Dispatch \xB7 ${live.current.at}`,body:`${ready} task${ready===1?"":"s"} in 'ready'. Spawns one worker per task (one pass).`,yes:"dispatch"}).then((ok)=>{if(!ok)return;sh("dispatch --json").then((out)=>{if(out==null)return;let r=parseDispatchResult(out),spawned2=r.spawned.length,deferred=r.skipped_per_profile_capped.length,defaults=r.auto_assigned_default.length,unassigned=r.skipped_unassigned.length,nonspawnable=r.skipped_nonspawnable.length,failed=dispatchFailures(r).length,guarded2=dispatchGuarded(r).length,parts2=[`${spawned2} spawned`];if(defaults)parts2.push(`${defaults} defaulted`);if(deferred)parts2.push(`${deferred} deferred`);if(unassigned)parts2.push(`${unassigned} unassigned`);if(nonspawnable)parts2.push(`${nonspawnable} non-spawnable`);if(failed)parts2.push(`${failed} failed`);if(guarded2)parts2.push(`${guarded2} guarded`);let more=dispatchDetails(r);toast.show({variant:dispatchVariant(r),message:`Dispatch: ${parts2.join(" \xB7 ")}`,action:more?{label:"details",run:()=>setPane({kind:"dispatch",slug:live.current.at,text:more})}:void 0})}).catch((e)=>void toast.show({variant:"error",message:trunc5(e.message,120)}))})},[dialog,sh,toast]),showLog=import_react92.useCallback((t2)=>{let s=live.current.at,text5=tailLogOf(s,t2.id);if(text5==null)return void toast.show({variant:"info",message:`No worker log for ${t2.id}`});setPane({kind:"log",slug:s,id:t2.id,text:text5})},[toast]),editTitle=import_react92.useCallback((t2)=>openTextPrompt(dialog,{title:"Edit title",label:t2.id,initial:t2.title}).then((v2)=>v2!==null&&v2!==void 0&&patchDirect(t2.id,{title:v2},`Updated ${t2.id}`)),[dialog,patchDirect]),editBody=import_react92.useCallback((t2)=>openTextPrompt(dialog,{title:"Edit body",label:t2.id,initial:t2.body??""}).then((v2)=>{if(v2===null||v2===void 0)return;patchDirect(t2.id,{body:v2},`Updated ${t2.id}`)}),[dialog,patchDirect]),editPriority=import_react92.useCallback((t2)=>{let opts=Array.from({length:10},(_2,i)=>({title:i===0?"P0 (none)":`P${i}`,value:String(i)}));dialog.replace($jsx(DialogSelect,{title:`Priority for ${t2.id}`,options:opts,current:String(t2.priority),filterable:!1,onSelect:(o)=>{dialog.clear(),patchDirect(t2.id,{priority:Number(o.value)},`${t2.id} \u2192 P${o.value}`)}}))},[dialog,patchDirect]),editResult=import_react92.useCallback((t2)=>{if(t2.status!=="done")return void toast.show({variant:"info",message:`${t2.id} is not done`});return openTextPrompt(dialog,{title:"Edit result",label:t2.id,initial:t2.result??""}).then((v2)=>{if(v2==null)return;sh(`edit ${q3(t2.id)} --result ${q3(v2)}`,`Updated ${t2.id} result`)})},[dialog,sh,toast]),block=import_react92.useCallback((t2)=>{blockSupport(live.current.at).then((support)=>{if(support==="no")return openTextPrompt(dialog,{title:`Block ${t2.id}`,label:"Reason (optional; generic block \u2014 active CLI has no --kind)"}).then((r)=>{if(r!==null)runBlock(t2,r,"")});let opts=[{title:"generic",value:"",description:"legacy block without --kind"},{title:"needs input",value:"needs_input",description:"human answer required"},{title:"dependency",value:"dependency",description:"wait in todo until parents finish"},{title:"capability",value:"capability",description:"missing tool, credential, or profile capability"},{title:"transient",value:"transient",description:"temporary/flaky condition"}];dialog.replace($jsx(DialogSelect,{title:`Block kind for ${t2.id}`,options:opts,current:t2.block_kind??"",filterable:!1,onSelect:async(o)=>{dialog.clear();let r=await openTextPrompt(dialog,{title:`Block ${t2.id}`,label:"Reason (optional, posted as comment)"});if(r!==null)runBlock(t2,r,o.value)}}))})},[dialog,blockSupport,runBlock]),editStatus=import_react92.useCallback((t2)=>{let opts=[];if(t2.status!=="done")opts.push({title:"done",value:"complete",description:"mark complete (prompts for result)"});if(t2.status!=="blocked")opts.push({title:"blocked",value:"block",description:"mark blocked (choose kind, prompts for reason)"});if(t2.status!=="scheduled")opts.push({title:"scheduled",value:"schedule",description:"park until externally unblocked (prompts for reason)"});if(t2.status==="blocked"||t2.status==="scheduled")opts.push({title:"ready",value:"unblock",description:t2.status==="scheduled"?"release back to ready":"return to ready"});opts.push({title:"archived",value:"archive",description:"archive (terminal)"}),dialog.replace($jsx(DialogSelect,{title:`Status for ${t2.id}`,options:opts,current:t2.status,filterable:!1,onSelect:async(o)=>{if(dialog.clear(),o.value==="complete"){let res=await openTextPrompt(dialog,{title:`Complete ${t2.id}`,label:"Result (optional)",initial:t2.result??""}),flag=res?` --result ${q3(res)}`:"";sh(`complete ${q3(t2.id)}${flag}`,`Completed ${t2.id}`);return}if(o.value==="block")return block(t2);if(o.value==="schedule"){let r=await openTextPrompt(dialog,{title:`Schedule ${t2.id}`,label:"Reason (optional, posted as comment)"}),arg=r?` ${q3(r)}`:"";sh(`schedule ${q3(t2.id)}${arg}`,`Scheduled ${t2.id}`);return}if(o.value==="unblock")return void sh(`unblock ${q3(t2.id)}`,`Unblocked ${t2.id}`);if(o.value==="archive")return void archive(t2)}}))},[dialog,sh,archive,block]),editParents=import_react92.useCallback((t2)=>{let cur2=(pane?.kind==="detail"&&pane.d.id===t2.id?pane.d:detailOf(at,t2.id))?.parents??[],d2=(data2.get(at)??boardStateOf(at)).columns,opts=STATUSES.flatMap((s)=>d2.get(s)??[]).filter((x2)=>x2.id!==t2.id).map((x2)=>({title:x2.id,description:trunc5(x2.title,50),value:x2.id,category:cur2.includes(x2.id)?"linked":"available"}));dialog.replace($jsx(DialogSelect,{title:`Parents for ${t2.id}`,options:opts,placeholder:"Select to toggle link\u2026",onSelect:(o)=>{if(dialog.clear(),cur2.includes(o.value))sh(`unlink ${q3(o.value)} ${q3(t2.id)}`,`Unlinked ${o.value}`);else sh(`link ${q3(o.value)} ${q3(t2.id)}`,`Linked ${o.value}`)}}))},[dialog,sh,data2,at,pane]),openField=import_react92.useCallback((f,t2)=>{if(f==="title")return void editTitle(t2);if(f==="body")return void editBody(t2);if(f==="assignee")return assign(t2);if(f==="priority")return editPriority(t2);if(f==="status")return editStatus(t2);if(f==="parents")return editParents(t2);if(f==="result")return void editResult(t2);if(f==="comment")return void comment(t2)},[editTitle,editBody,assign,editPriority,editStatus,editParents,editResult,comment]),ACTS=import_react92.useMemo(()=>[{key:"n",title:"New task",when:()=>!0,run:()=>void create()},{key:"N",title:"New child",when:(t2)=>!!t2,run:(t2)=>void create(t2)},{key:"a",title:"Assign",when:(t2)=>!!t2,run:(t2)=>void assign(t2)},{key:"c",title:"Comment",when:(t2)=>!!t2,run:(t2)=>void comment(t2)},{key:"s",title:"Specify",when:(t2)=>t2?.status==="triage",run:(t2)=>void specify(t2)},{key:"S",title:"Specify all",when:()=>!0,run:()=>void specifyAll()},{key:"u",title:"Unblock",when:(t2)=>t2?.status==="blocked"||t2?.status==="scheduled",run:(t2)=>void unblock(t2)},{key:"d",title:"Archive",when:(t2)=>!!t2,run:(t2)=>void archive(t2)},{key:"l",title:"Worker log",when:(t2)=>!!t2,run:(t2)=>showLog(t2)},{key:"b",title:"New board",when:()=>!0,run:()=>void newBoard()},{key:"D",title:"Dispatch",when:()=>!0,run:()=>void dispatch()}],[create,assign,comment,specify,specifyAll,unblock,archive,showLog,newBoard,dispatch]),isOpen=open3.has(at),paneOpen=pane?.kind==="detail",paneFields=paneOpen?fieldsFor(pane.d):[];useKeyboard((key3)=>{if(!props.focused||dialog.open())return;if(key3.name==="escape"&&pane){if(tier==="pane"){setTier("grid");return}return setPane(null)}if(keys.match("list.refresh",key3))return load4();if(key3.name==="tab"){if(paneOpen&&tier!=="pane"){setTier("pane"),setPaneSel(0);return}if(tier==="pane"){let n=paneFields.length;if(n===0)return;let d2=key3.shift?-1:1;setPaneSel((s)=>(s+d2+n)%n);return}return goBoard(key3.shift?-1:1)}if(tier==="pane"){let t3=live.current.task;if(!t3||!paneOpen)return;let f=paneFields[Math.min(paneSel,paneFields.length-1)];if(key3.name==="up"){let n=paneFields.length;if(n===0)return;return setPaneSel((s)=>(s-1+n)%n)}if(key3.name==="down"){let n=paneFields.length;if(n===0)return;return setPaneSel((s)=>(s+1)%n)}if(key3.name==="return")return openField(f,t3);let hit2=ACTS.find((a)=>a.key===key3.raw&&a.when(t3));if(hit2)return hit2.run(t3);return}if(key3.name==="space"||key3.name===" "){if(tier==="head")return toggle(at);if(tier==="filter"&&sec3?.chips[chip2])return flip(sec3.chips[chip2]);return}if(key3.name==="down"){if(tier==="head"){if(isOpen)return setTier("filter");let n2=stepBoard(1);return n2?enterTop(n2):void 0}if(tier==="filter"){if(sec3&&sec3.shown>0){setTier("grid"),setRow(0);return}let n2=stepBoard(1);return n2?enterTop(n2):void 0}if(row3<(cur?.tasks.length??1)-1)return setRow((r)=>r+1);let n=stepBoard(1);return n?enterTop(n):void 0}if(key3.name==="up"){if(tier==="head"){let p=stepBoard(-1);return p?enterBottom(p):void 0}if(tier==="filter")return setTier("head");if(row3>0)return setRow((r)=>r-1);return setTier("filter")}if(key3.name==="left"){if(tier==="filter")return setChip((c)=>Math.max(0,c-1));if(tier==="grid")return setCol((c)=>{let n=Math.max(0,c-1);return setRow(0),n});return}if(key3.name==="right"){if(tier==="filter")return setChip((c)=>Math.min((sec3?.chips.length??1)-1,c+1));if(tier==="grid")return setCol((c)=>{let n=Math.min(cols2.length-1,c+1);return setRow(0),n});return}if(key3.name==="return"){if(tier==="head")return toggle(at);if(tier==="filter"&&sec3?.chips[chip2])return flip(sec3.chips[chip2]);if(task)return setPane((p)=>p?.kind==="detail"&&p.d.id===task.id?null:((d2)=>d2?{kind:"detail",slug:at,d:d2}:null)(detailOf(at,task.id)));return}let t2=live.current.task,hit=ACTS.find((a)=>a.key===key3.raw&&a.when(t2));if(hit)return hit.run(t2)});let hint=import_react92.useMemo(()=>{let t2=task;return[tier==="pane"?"Esc grid":"Tab board",tier==="head"?"\u2191\u2193 nav Space fold":tier==="filter"?"\u2190\u2192 chip Space toggle":tier==="pane"?"Tab/\u2191\u2193 field Enter edit Esc grid":"\u2190\u2192\u2191\u2193 nav Enter detail",...ACTS.filter((a)=>a.when(t2)).map((a)=>`${a.key} ${a.title.toLowerCase()}`),`${keys.print("list.refresh")} reload`].join(" ")},[ACTS,keys,task,tier]),onHead=import_react92.useCallback((s)=>{setAt(s),setTier("head"),toggle(s)},[toggle]),onChip=import_react92.useCallback((s,i,c)=>{setAt(s),setTier("filter"),setChip(i),flip(c)},[flip]),onPick=import_react92.useCallback((s,ci,ri,id)=>{setAt(s),setTier("grid"),setCol(ci),setRow(ri),setOpen((o)=>o.has(s)?o:new Set(o).add(s));let d2=detailOf(s,id);if(d2)setPane({kind:"detail",slug:s,d:d2})},[]);return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsxs("box",{flexDirection:"row",flexGrow:1,children:[$jsx(TabShell,{title:`Kanban \xB7 ${sections.length} board${sections.length===1?"":"s"} \xB7 ${grand} task${grand===1?"":"s"}${running2?` \xB7 ${running2} running`:""}`,children:$jsx("scrollbox",{id:"kb-board-scroll",ref:outer,scrollY:!0,flexGrow:1,verticalScrollbarOptions:NOBAR,children:$jsx("box",{flexDirection:"column",width:"100%",children:sections.map((s)=>{let on=s.board.slug===at,secOpen=open3.has(s.board.slug),m2=maskOf(s.board.slug),filt=m2.who.size+m2.pri.size+m2.status.size,dg=diags.get(s.board.slug)??EMPTY_DIAG;return $jsxs("box",{id:`kb-sec-${s.board.slug}`,flexDirection:"column",flexShrink:0,marginBottom:1,children:[$jsx("box",{height:1,onMouseDown:()=>onHead(s.board.slug),backgroundColor:on&&tier==="head"?theme.backgroundElement:void 0,children:$jsxs("text",{children:[$jsx("span",{fg:on?theme.accent:theme.textMuted,children:secOpen?"\u25BE ":"\u25B8 "}),$jsx("span",{fg:on?theme.primary:theme.text,children:$jsx("strong",{children:s.board.name})}),$jsx("span",{fg:theme.textMuted,children:s.error?` \xB7 ${s.error.kind}`:s.corruptBackups.length>0?` \xB7 ${s.corruptBackups.length} corrupt backup${s.corruptBackups.length===1?"":"s"}`:s.total===0?" \xB7 empty":` \xB7 ${filt?`${s.shown}/`:""}${s.total} task${s.total===1?"":"s"}${s.running?` \xB7 ${s.running} running`:""}`})]})}),secOpen?s.error?$jsx(ErrorBanner,{error:s.error,backups:s.corruptBackups}):s.corruptBackups.length>0&&s.total===0?$jsx("box",{height:1,marginLeft:2,children:$jsx("text",{fg:theme.warning,children:`corrupt backup found: ${s.corruptBackups[0]}`})}):s.total===0?$jsx("box",{height:1,marginLeft:2,children:$jsxs("text",{fg:theme.textMuted,children:["no tasks \u2014 ",$jsx("span",{fg:theme.accent,children:"n"})," to create one here"]})}):$jsxs($Fragment,{children:[$jsx(FilterBar,{chips:s.chips,mask:m2,on:on&&tier==="filter",sel:on?Math.min(chip2,s.chips.length-1):-1,onPick:(i)=>onChip(s.board.slug,i,s.chips[i])}),s.cols.length>0?$jsx("box",{flexDirection:"row",height:s.cap,gap:1,children:s.cols.map((c,ci)=>$jsx(Column,{slug:s.board.slug,status:c.status,tasks:c.tasks,diags:dg,on:on&&(tier==="grid"||tier==="pane")&&ci===clampCol,sel:on?row3:0,onPick:(ri)=>onPick(s.board.slug,ci,ri,c.tasks[ri].id)},c.status))}):$jsx("box",{height:1,marginLeft:2,children:$jsx("text",{fg:theme.textMuted,children:"all columns hidden"})})]}):null]},s.board.slug)})})})}),pane?$jsx(SidePane,{pane,on:tier==="pane",sel:paneSel,diags:pane.kind==="detail"?diags.get(pane.slug)?.get(pane.d.id)??EMPTY_DIAGS:EMPTY_DIAGS}):null]}),$jsx(HintBar,{raw:hint})]})});var Automation=import_react94.memo((props)=>{let labels=SUB_TABS[AUTOMATION_TAB];import_react94.useEffect(()=>{if(props.sub>=labels.length)props.setSub(0)},[props.sub,labels.length]);let hint="shift+\u2190/\u2192 sub";return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsx(SubTabBar,{tabs:labels,active:props.sub,onChange:props.setSub,hint}),$jsxs("box",{flexGrow:1,minWidth:0,flexDirection:"column",children:[$jsx(Pane2,{visible:props.sub===0,children:$jsx(Kanban,{focused:!!props.focused&&props.sub===0})}),$jsx(Pane2,{visible:props.sub===1,children:$jsx(Agents,{focused:!!props.focused&&props.sub===1,sessionId:props.sessionId,onSwitchProfile:props.onSwitchProfile})}),$jsx(Pane2,{visible:props.sub===2,children:$jsx(Cron,{focused:!!props.focused&&props.sub===2})})]})]})}),Pane2=({visible:visible2,children:children2})=>visible2?$jsx("box",{flexGrow:1,minWidth:0,minHeight:0,flexDirection:"column",children:children2}):null;var import_react107=__toESM(require_react_production(),1);var import_react97=__toESM(require_react_production(),1);init_lane();init_lane();init_lane();init_schema();var SELECTS={"terminal.backend":["local","docker","ssh","modal","daytona","singularity","vercel_sandbox"],"tts.provider":["edge","elevenlabs","openai","neutts","xai","mistral"],"logging.level":["DEBUG","INFO","WARNING","ERROR"],"agent.reasoning_effort":["","none","minimal","low","medium","high","xhigh"],"agent.verify_on_stop":["auto","true","false"],"display.busy_input_mode":["queue","steer","interrupt"],"display.details_mode":["hidden","collapsed","expanded"],"display.thinking_mode":["collapsed","truncated","full"],"display.tool_progress":[...TOOL_PROGRESS],"approvals.mode":[...APPROVAL_MODES],"onboarding.profile_build":["ask","off"],"streaming.transport":["auto","draft","edit","off"],"tools.tool_search.enabled":["auto","on","off"],"updates.non_interactive_local_changes":["stash","discard"]},MERGE={approvals:"security",privacy:"security",secrets:"security",checkpoints:"agent",context:"agent",cron:"agent",network:"agent",model_catalog:"general",onboarding:"general",human_delay:"display",dashboard:"display",gateway:"display",desktop:"display",voice:"display",tool_output:"agent",prompt_caching:"compression",code_execution:"terminal",computer_use:"agent",goals:"agent",lsp:"agent",tool_loop_guardrails:"agent",web:"agent",x_search:"agent",tools:"agent",streaming:"display",vertex:"general",slack:"platforms",telegram:"platforms",mattermost:"platforms",discord:"platforms",whatsapp:"platforms",matrix:"platforms"};var int=(lo,hi,what=`${lo}\u2013${hi}`)=>(raw)=>{let n=Number(raw);if(!Number.isInteger(n))return`expected integer ${what}`;if(n<lo||n>hi)return`expected ${what}`;return null},intMin=(lo,what=`\u2265 ${lo}`)=>(raw)=>{let n=Number(raw);if(!Number.isInteger(n))return`expected integer ${what}`;if(n<lo)return`expected ${what}`;return null},integer=(raw)=>Number.isInteger(Number(raw))?null:"expected integer",float=(lo,hi)=>(raw)=>{let n=Number(raw);if(!Number.isFinite(n))return`expected number ${lo}\u2013${hi}`;if(n<lo||n>hi)return`expected ${lo}\u2013${hi}`;return null},oneOf=(...opts)=>(raw)=>opts.includes(raw)?null:`expected one of: ${opts.join(" | ")}`,nonNeg=(raw)=>{let n=Number(raw);return Number.isFinite(n)&&n>=0?null:"expected \u2265 0"},RULES={"compression.threshold":float(0.1,0.95),"compression.target_ratio":float(0.05,0.9),"prompt_caching.cache_ttl":(raw)=>/^\d+[smhd]$/.test(raw.trim())?null:"expected duration e.g. 5m, 1h","agent.max_turns":int(1,1e4),"agent.max_verify_nudges":int(0,100),"delegation.max_iterations":int(1,1e4),"delegation.max_concurrent_children":int(1,64),"delegation.max_spawn_depth":int(1,3),"delegation.max_summary_chars":intMin(0),"agent.gateway_timeout":nonNeg,"agent.gateway_timeout_warning":nonNeg,"agent.gateway_notify_interval":nonNeg,"agent.restart_drain_timeout":nonNeg,"gateway.platform_connect_timeout":integer,"delegation.child_timeout_seconds":nonNeg,"browser.command_timeout":int(1,600),"approvals.timeout":int(1,3600),"security.tirith_timeout":int(1,120),"agent.api_max_retries":int(0,20),"tool_output.max_bytes":int(1024,1e7),"tool_output.max_lines":int(10,1e5),"tools.tool_search.max_search_limit":int(1,50),"tools.tool_search.search_default_limit":int(1,50),"tools.tool_search.threshold_pct":int(0,100),"sessions.retention_days":int(1,3650),"sessions.min_interval_hours":int(1,720),"agent.service_tier":oneOf("","fast","standard"),"agent.verify_on_stop":oneOf("auto","true","false"),"display.busy_input_mode":oneOf("queue","steer","interrupt"),"display.details_mode":oneOf("hidden","collapsed","expanded"),"display.thinking_mode":oneOf("collapsed","truncated","full"),"display.tool_progress":oneOf(...TOOL_PROGRESS),"display.final_response_markdown":oneOf("render","strip","raw"),"logging.level":oneOf("DEBUG","INFO","WARNING","ERROR"),"approvals.mode":oneOf(...SELECTS["approvals.mode"]),"code_execution.mode":oneOf("project","strict"),"onboarding.profile_build":oneOf("ask","off"),"streaming.transport":oneOf("auto","draft","edit","off"),"tools.tool_search.enabled":oneOf("auto","on","off"),"updates.non_interactive_local_changes":oneOf("stash","discard")},check2=(key3,raw)=>RULES[key3]?.(raw)??null;init_schema();init_lane();var get4=(obj2,path4)=>{let cur=obj2;for(let p of path4.split("."))if(cur&&typeof cur==="object"&&!Array.isArray(cur))cur=cur[p];else return;return cur},classify2=(key3,t2)=>{if(route(key3).via==="readonly")return"readonly";if(SELECTS[key3]||key3==="display.skin")return"select";if(t2==="bool")return"boolean";if(t2==="int"||t2==="float")return"number";return"string"},labelOf=(key3)=>{let raw=SCHEMA[key3]?.group??key3.split(".")[0];return key3.startsWith(`${raw}.`)?key3.slice(raw.length+1):key3},buildFields=(user)=>{let seen=new Set,out=[];for(let key3 of SCHEMA_KEYS){let s=SCHEMA[key3],uv=get4(user,key3),set3=uv!==void 0;out.push({key:key3,label:labelOf(key3),type:classify2(key3,s.type),value:set3?uv:s.default,set:set3,doc:s.doc,effect:s.effect,options:key3==="display.skin"?skins():SELECTS[key3]}),seen.add(key3)}let walk2=(obj2,prefix="")=>{for(let[k2,v2]of Object.entries(obj2)){let key3=prefix?`${prefix}.${k2}`:k2;if(v2&&typeof v2==="object"&&!Array.isArray(v2)){if(SCHEMA[key3]?.type==="dict"){seen.add(key3);continue}walk2(v2,key3);continue}if(seen.has(key3))continue;out.push({key:key3,label:labelOf(key3),type:Array.isArray(v2)?"readonly":typeof v2==="boolean"?"boolean":typeof v2==="number"?"number":"string",value:v2,set:!0,doc:"",effect:"live"})}};return walk2(user),out},rawGroupOf=(key3)=>SCHEMA[key3]?.group??(key3.includes(".")?key3.split(".")[0]:"general"),groupOf=(key3)=>{let raw=rawGroupOf(key3);return MERGE[raw]??raw},sections=(group2,fields)=>{let by=new Map;for(let f of fields){let r=rawGroupOf(f.key);if(!by.has(r))by.set(r,[]);by.get(r).push(f)}if(by.size<=1)return[{head:null,items:fields}];return[...by.keys()].sort((a,b2)=>a===group2?-1:b2===group2?1:a.localeCompare(b2)).map((r)=>({head:r,items:by.get(r)}))},GROUPS=(()=>{let g=new Set(["general"]);for(let k2 of SCHEMA_KEYS)g.add(groupOf(k2));return[...g]})(),EFFECT_GLYPH={live:"",session:"\u21BB",restart:"\u27F3"};init_lane();var AUX_TASKS=[{key:"vision",label:"Vision",hint:"Image analysis"},{key:"web_extract",label:"Web Extract",hint:"Page summarization"},{key:"compression",label:"Compression",hint:"Context compaction"},{key:"session_search",label:"Session Search",hint:"Recall queries"},{key:"skills_hub",label:"Skills Hub",hint:"Skill search"},{key:"approval",label:"Approval",hint:"Smart auto-approve"},{key:"mcp",label:"MCP",hint:"MCP tool routing"},{key:"title_generation",label:"Title Gen",hint:"Session titles"},{key:"triage_specifier",label:"Triage Specifier",hint:"Kanban spec fleshing"},{key:"kanban_decomposer",label:"Kanban Decomposer",hint:"Task decomposition"},{key:"profile_describer",label:"Profile Describer",hint:"Auto profile descriptions"},{key:"curator",label:"Curator",hint:"Skill-usage review"}],dig=(o,...path4)=>path4.reduce((c,p)=>c&&typeof c==="object"?c[p]:void 0,o),str3=(v2)=>typeof v2==="string"?v2:"",readSlots=(raw)=>{let main={kind:"main",key:"main",label:"Main model",hint:"Primary agent model",provider:str3(dig(raw,"model","provider")),model:str3(dig(raw,"model","default"))||str3(dig(raw,"model","name")),auto:!1},aux=AUX_TASKS.map((t2)=>{let p=str3(dig(raw,"auxiliary",t2.key,"provider"));return{kind:"aux",key:t2.key,label:t2.label,hint:t2.hint,provider:p,model:str3(dig(raw,"auxiliary",t2.key,"model")),auto:p===""||p==="auto"}});return[main,...aux]},staleAuxForMain=(slots,provider)=>slots.filter((s)=>s.kind==="aux"&&!s.auto&&s.provider!==""&&s.provider!=="auto"&&s.provider!==provider),assign=async(gw,slot,provider,model)=>{if(slot==="main"){let r=await gw.request("config.set",{key:"model",value:`${model} --provider ${provider} --global`,session_id:void 0});return{ok:["model.default","model.provider"],failed:[],warnings:[],warning:r.warning}}return writeConfig(gw,[{key:`auxiliary.${slot}.provider`,to:provider},{key:`auxiliary.${slot}.model`,to:model}])},resetAux=(gw,slot)=>{let keys=slot==="all"?AUX_TASKS.map((t2)=>t2.key):[slot];return writeConfig(gw,keys.flatMap((k2)=>[{key:`auxiliary.${k2}.provider`,to:"auto"},{key:`auxiliary.${k2}.model`,to:""}]))};var import_react96=__toESM(require_react_production(),1);var import_react95=__toESM(require_react_production(),1);var SecretPrompt=(props)=>{let theme=useTheme().theme,[value2,setValue]=import_react95.useState("");return $jsxs("box",{flexDirection:"column",width:60,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.warning,children:$jsx("strong",{children:props.title})})}),$jsx("box",{height:1}),props.label?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:props.label})}):null,$jsx(MaskInput,{value:value2,input:setValue,submit:()=>{let v2=value2.trim();if(v2)props.onSubmit(v2)}}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:value2.trim()?"Enter confirm \xB7 Esc cancel":"Esc cancel"})})]})};var REFRESH="__refresh__",configured=(p)=>(p.models?.length??0)>0,setupDescription=(p)=>{if(p.warning)return p.warning;if(p.auth_type==="api_key"&&p.key_env)return`paste ${p.key_env} to activate`;if(p.auth_type==="vertex")return p.key_env?`set ${p.key_env} to your service-account JSON path`:"configure Vertex credentials with hermes model";if(p.key_env)return`set ${p.key_env} before using this provider`;if(p.auth_type)return`run hermes model to configure (${p.auth_type})`;return},providerDescription=(p)=>{if(p.authenticated===!1)return setupDescription(p);return p.total_models?`${p.total_models} models`:void 0},replaceProvider=(data2,slug2,next3)=>({...data2,providers:(data2.providers??[]).map((p)=>p.slug===slug2?next3:p)}),ModelPickerDialog=(props)=>{let dialog=useDialog(),toast=useToast(),keys=useKeys(),theme=useTheme().theme,[data2,setData]=import_react96.useState(null),[step,setStep]=import_react96.useState("provider"),[provider,setProvider]=import_react96.useState(null),[setupProvider,setSetupProvider]=import_react96.useState(null),[global2,setGlobal]=import_react96.useState(!1),seq=import_react96.useRef(0),load4=import_react96.useCallback(async(force=!1,quiet=!1)=>{let id=++seq.current;try{let next3=await props.gw.request("model.options",force?{refresh:!0,include_unconfigured:!0}:{include_unconfigured:!0});if(seq.current!==id)return null;return setData((d2)=>force||!d2?next3:d2),next3}catch(e){if(seq.current!==id)return null;if(!quiet)toast.show({variant:"error",message:e instanceof Error?e.message:String(e)});let empty={providers:[]};return setData((d2)=>d2??empty),null}},[props.gw,toast]),refresh=import_react96.useCallback(()=>{toast.show({variant:"info",message:"Refreshing model catalog; custom-provider probes may be slower\u2026"}),load4(!0)},[load4,toast]);import_react96.useEffect(()=>{return load4(Boolean(props.refresh)),()=>{seq.current++}},[load4,props.refresh]);let apply=import_react96.useCallback((model,prov)=>{if(props.onApply)return void props.onApply(prov,model).catch((e)=>toast.show({variant:"error",message:e.message}));let value2=`${model} --provider ${prov}${global2?" --global":""}`;props.gw.request("config.set",global2?{key:"model",value:value2,session_id:void 0}:{key:"model",value:value2}).then((r)=>{if(toast.show({variant:"success",message:`model \u2192 ${r.value??model}${global2?" (global)":""}`}),r.warning)toast.show({variant:"warning",message:r.warning})}).catch((e)=>toast.show({variant:"error",message:e.message}))},[props.gw,props.onApply,global2,toast]),submitKey=import_react96.useCallback(async(p2,key3)=>{try{let r=await props.gw.request("model.save_key",{slug:p2.slug,api_key:key3});if(r.warning)toast.show({variant:"warning",message:r.warning});let direct=r.provider&&configured(r.provider)?r.provider:null,hit=(direct?null:await load4(!0,!0))?.providers?.find((pp)=>pp.slug===p2.slug),next3=direct??(hit&&configured(hit)?hit:r.provider??hit);if(!next3){toast.show({variant:"warning",message:"Provider saved; refresh model options to continue"});return}if(setData((d2)=>d2?replaceProvider(d2,p2.slug,next3):d2),configured(next3)){setSetupProvider(null),setProvider(next3.slug),setStep("model"),toast.show({variant:"success",message:`${next3.name} activated`});return}toast.show({variant:"warning",message:next3.warning??"Provider saved but no models were returned"})}catch(e){toast.show({variant:"error",message:e instanceof Error?e.message:String(e)})}},[props.gw,load4,toast]),setup=import_react96.useCallback((p2)=>{let msg=setupDescription(p2);if(p2.auth_type!=="api_key"||!p2.key_env){toast.show({variant:"warning",message:msg??"Run hermes model to configure this provider"});return}setSetupProvider(p2),setStep("setup")},[toast]),onKey=import_react96.useCallback((k2)=>{if(k2.name==="f5"||keys.match("list.refresh",k2))return refresh(),!0;if(k2.name==="tab"&&!props.onApply)return setGlobal((g)=>!g),!0;if(k2.name==="left"&&step!=="provider")return setStep("provider"),!0;return!1},[keys,props.onApply,refresh,step]),hint=`${keys.print("list.refresh")} refresh`,footer=props.onApply?$jsx("text",{fg:theme.textMuted,children:step==="model"?`${hint} \xB7 \u2190 providers`:hint}):$jsxs("text",{fg:theme.textMuted,children:[$jsx("span",{children:"Scope: "}),$jsx("span",{fg:global2?theme.warning:theme.accent,children:global2?"global (persists to config)":"this session"}),$jsx("span",{children:` \xB7 Tab toggle \xB7 ${hint}${step==="model"?" \xB7 \u2190 providers":""}`})]});if(!data2)return $jsx("box",{width:50,padding:1,children:$jsx("text",{children:"Loading models\u2026"})});if(step==="setup"&&setupProvider?.key_env)return $jsx(SecretPrompt,{title:`Paste ${setupProvider.key_env}`,label:setupDescription(setupProvider)??`API key for ${setupProvider.name}`,onSubmit:(key3)=>{submitKey(setupProvider,key3)}});if(step==="provider"){let options2=[...(data2.providers??[]).toSorted((a,b2)=>Number(Boolean(b2.is_current))-Number(Boolean(a.is_current))).map((p2)=>({title:p2.name,value:p2.slug,description:providerDescription(p2),category:p2.is_current?"Current":p2.authenticated===!1?"Setup required":"Available"})),{title:"Refresh model options",value:REFRESH,description:"force reload from gateway",hint:void 0,category:"Actions"}];return $jsx(DialogSelect,{title:props.title??"Switch Provider",options:options2,current:data2.provider,onSelect:(o)=>{if(o.value===REFRESH)return refresh();let p2=data2.providers?.find((pp)=>pp.slug===o.value);if(p2?.authenticated===!1||p2&&!configured(p2))return void setup(p2);setProvider(o.value),setStep("model")},onKey,placeholder:"Search providers...",footer})}let p=data2.providers?.find((pp)=>pp.slug===provider),options=[...(p?.models??[]).map((m2)=>{let caps3=p?.capabilities?.[m2],badges=[caps3?.fast?"fast":"",caps3?.reasoning?"reasoning":""].filter(Boolean);return{title:m2,value:m2,hint:badges.length>0?badges.join(" \xB7 "):void 0}}),{title:"Refresh model options",value:REFRESH,description:"force reload from gateway",hint:void 0,category:"Actions"}];return $jsx(DialogSelect,{title:props.title?`${props.title} \xB7 ${p?.name??provider}`:`Switch Model (${p?.name??provider})`,options,current:provider===data2.provider?data2.model:void 0,onSelect:(o)=>{if(o.value===REFRESH)return refresh();if(dialog.clear(),provider)apply(o.value,provider)},onKey,placeholder:"Search models...",footer})},openModelPicker=(dialog,gw,opts)=>{dialog.replace($jsx(ModelPickerDialog,{gw,title:opts?.title,onApply:opts?.onApply,refresh:opts?.refresh}))};var flatten=(obj2,prefix="")=>Object.entries(obj2).flatMap(([k2,v2])=>{let key3=prefix?`${prefix}.${k2}`:k2;if(v2&&typeof v2==="object"&&!Array.isArray(v2))return flatten(v2,key3);return[[key3,v2]]}),setNested=(obj2,path4,val)=>{let parts2=path4.split("."),cur=obj2;for(let i=0;i<parts2.length-1;i++){if(!cur[parts2[i]]||typeof cur[parts2[i]]!=="object")cur[parts2[i]]={};cur=cur[parts2[i]]}cur[parts2[parts2.length-1]]=val},getNested=(obj2,path4)=>{let parts2=path4.split("."),cur=obj2;for(let p of parts2)if(cur&&typeof cur==="object"&&!Array.isArray(cur))cur=cur[p];else return;return cur},FieldRow2=import_react97.memo((props)=>{let theme=useTheme().theme,f=props.field,bg2=props.active?theme.backgroundElement:void 0,indicator=props.active?"\u25B8 ":" ",mark2=props.changed?"\u25CF ":f.set?"\xB7":" ",markFg=props.changed?theme.warning:theme.textMuted,display2=()=>{if(props.editing)return props.buf+"\u2588";if(f.type==="readonly"){let n=Array.isArray(f.value)?f.value.length:f.value&&typeof f.value==="object"?Object.keys(f.value).length:0;return n===0?"\u2014":`${n} item${n===1?"":"s"}`}if(f.type==="boolean")return f.value?"\u2713 ON":"\u2717 OFF";return String(f.value??"")},hint=()=>{if(props.readonly||f.type==="readonly")return"\uD83D\uDD12";if(f.type==="boolean")return"[space]";if(f.type==="select")return"[h/l]";return"[enter]"},ro=props.readonly||f.type==="readonly",valFg=ro||!f.set?theme.textMuted:f.type==="boolean"?f.value?theme.success:theme.error:theme.text,labelFg=ro?theme.textMuted:props.active?theme.accent:theme.text,lead2=4+(props.badge!==void 0?12:0),glyph=props.active?EFFECT_GLYPH[f.effect]:"";return $jsxs("box",{id:props.id,flexDirection:"column",backgroundColor:bg2,children:[$jsxs("box",{flexDirection:"row",height:1,children:[$jsx(Col,{w:2,fg:markFg,children:mark2}),$jsx(Col,{w:2,fg:props.active?theme.primary:theme.text,children:indicator}),props.badge!==void 0?$jsx(Col,{w:12,fg:theme.textMuted,children:props.badge}):null,$jsx(Col,{w:40,fg:labelFg,children:f.label}),$jsx(Col,{grow:!0,min:6,fg:valFg,children:display2()}),$jsx(Col,{w:2,fg:theme.textMuted,children:glyph}),$jsx(Col,{w:9,fg:theme.textMuted,right:!0,children:props.active?hint():""})]}),props.error?$jsxs("box",{flexDirection:"row",height:1,children:[$jsx(Col,{w:lead2+40,fg:theme.textMuted,children:""}),$jsx(Col,{grow:!0,min:6,fg:theme.error,children:`\u2717 ${props.error}`})]}):props.active&&f.doc?$jsxs("box",{flexDirection:"row",minHeight:1,children:[$jsx("box",{width:lead2,flexShrink:0}),$jsx("box",{width:40,flexShrink:0,minHeight:1,children:$jsx("text",{wrapMode:"word",fg:theme.textMuted,children:f.doc})})]}):null]})}),SlotRow=import_react97.memo((p)=>{let theme=useTheme().theme,main=p.s.kind==="main",val=main?`${p.s.provider||"(unset)"} \xB7 ${p.s.model||"(unset)"}`:p.s.auto?"auto (use main model)":`${p.s.provider} \xB7 ${p.s.model||"(provider default)"}`;return $jsxs("box",{id:p.id,flexDirection:"row",height:1,backgroundColor:p.on?theme.backgroundElement:void 0,children:[$jsx(Col,{w:2,fg:p.on?theme.primary:theme.text,children:p.on?"\u25B8 ":" "}),$jsx(Col,{w:2,fg:main?theme.primary:theme.textMuted,children:main?"\u2605":" "}),$jsx(Col,{w:16,fg:p.on?theme.accent:theme.text,children:p.s.label}),$jsx(Col,{w:22,fg:theme.textMuted,children:p.s.hint}),$jsx(Col,{grow:!0,min:10,fg:p.s.auto?theme.textMuted:theme.text,children:val}),$jsx(Col,{w:14,fg:theme.textMuted,right:!0,children:p.on?main?"[enter]":"[enter] [x]":""})]})}),Config2=import_react97.memo((props)=>{let theme=useTheme().theme,gw=useGateway(),restartGateway=useGatewayRestart(),toast=useToast(),dialog=useDialog(),[raw,setRaw]=import_react97.useState({}),rawRef=import_react97.useRef(raw);rawRef.current=raw;let[original,setOriginal]=import_react97.useState({}),[yaml,setYaml]=import_react97.useState(""),[mode2,setMode]=import_react97.useState("form"),[cat,setCat]=import_react97.useState(0),[cursor,setCursor]=import_react97.useState(0),[editing,setEditing]=import_react97.useState(!1),[buf,setBuf]=import_react97.useState(""),[err,setErr]=import_react97.useState({}),[searching,setSearching]=import_react97.useState(!1),[query2,setQuery]=import_react97.useState(""),[focus,setFocus]=import_react97.useState("categories"),[managed,setManaged]=import_react97.useState(null),[loadErr,setLoadErr]=import_react97.useState(null),loads=import_react97.useRef(0);import_react97.useEffect(()=>{managedSystem().then(setManaged)},[]);let load4=import_react97.useCallback(()=>{let gen=++loads.current;gw.request("config.get",{key:"full"}).then((res)=>{if(loads.current!==gen)return;let parsed=res.config??{};rawRef.current=structuredClone(parsed),setRaw(rawRef.current),setOriginal(structuredClone(parsed)),setYaml($stringify(parsed)),setErr({}),setLoadErr(null)}).catch((e)=>{if(loads.current===gen)setLoadErr(e instanceof Error?e.message:String(e))})},[gw]);import_react97.useEffect(()=>{return load4(),()=>{loads.current++}},[load4]);let all=buildFields(raw),grouped=all.reduce((map,f)=>{let g=groupOf(f.key);if(!map.has(g))map.set(g,[]);return map.get(g).push(f),map},new Map(GROUPS.map((g)=>[g,[]]))),groups=[...grouped.keys()];groups.splice(1,0,"models");let active2=groups[cat]??groups[0],onSlots=active2==="models"&&!searching,slots=readSlots(raw),secs=searching&&query2.trim()?[{head:null,items:all.filter((f)=>f.key.toLowerCase().includes(query2.toLowerCase()))}]:sections(active2,grouped.get(active2)??[]),fields=secs.flatMap((s)=>s.items),count3=onSlots?slots.length:fields.length,follow=useFollow("cfg"),catFollow=useFollow("cfg-cat"),changed=(key3)=>JSON.stringify(getNested(raw,key3))!==JSON.stringify(getNested(original,key3)),nChanged=all.reduce((n,f)=>n+(changed(f.key)?1:0),0),update=(key3,val)=>{loads.current++;let next3=structuredClone(rawRef.current);setNested(next3,key3,val),rawRef.current=next3,setRaw(next3),setYaml($stringify(next3))},fmt3=(v2)=>v2===void 0?"\u2014":Array.isArray(v2)?v2.join(", "):String(v2),save2=async()=>{if(managed){toast.show({variant:"error",message:`Managed by ${managed} \u2014 edit configuration.nix`});return}let nErr=Object.keys(err).length;if(nErr>0){toast.show({variant:"error",message:`${nErr} invalid field${nErr===1?"":"s"}`});return}let target=mode2==="yaml"?$parse(yaml)??{}:rawRef.current,diffs=flatten(target).filter(([key3])=>JSON.stringify(getNested(target,key3))!==JSON.stringify(getNested(original,key3))).map(([key3,val])=>({key:key3,from:getNested(original,key3),to:val}));if(diffs.length===0){toast.show({variant:"info",message:"No changes"});return}let body=diffs.map((d2)=>`${d2.key}: ${fmt3(d2.from)} \u2192 ${fmt3(d2.to)}`).join(`
|
|
4151
4151
|
`);if(!await openConfirm(dialog,{title:`Write ${diffs.length} change${diffs.length===1?"":"s"} to config.yaml?`,body,yes:"save"}))return;let res=await writeConfig(gw,diffs.map((d2)=>({key:d2.key,to:d2.to})));for(let w2 of res.warnings)toast.show({variant:"info",message:`${w2.key}: ${w2.msg}`});if(res.failed.length>0){load4(),toast.show({variant:"error",message:`${res.failed.length} failed: ${res.failed.map((f)=>f.key).join(", ")}`});return}let landed=diffs.filter((d2)=>res.ok.includes(d2.key)),miss=await verifyWrite(gw,landed.map((d2)=>({key:d2.key,to:d2.to}))).catch((e)=>{return toast.show({variant:"error",message:e instanceof Error?e.message:String(e)}),null});if(!miss)return;if(miss.length>0){toast.show({variant:"error",message:`Write didn't land: ${miss.join(", ")}`});return}load4();let tier=maxEffect(res.ok);if(tier==="restart"){if(await openConfirm(dialog,{title:`Saved \u2014 ${res.ok.length} setting${res.ok.length===1?"":"s"} need a gateway restart`,body:"Restart now? This interrupts any running turn.",yes:"restart now",no:"later",danger:!0}))restartGateway("resume"),toast.show({variant:"info",message:"Gateway restarting\u2026"});return}toast.show({variant:"success",message:tier==="live"?"Saved":"Saved \u2014 new sessions pick this up"})},pick=import_react97.useCallback((s)=>{if(managed)return toast.show({variant:"error",message:`Managed by ${managed}`});let warnStaleAux=async(prov)=>{let stale=staleAuxForMain(readSlots(raw),prov);if(stale.length===0)return;let names=stale.map((x2)=>x2.label).join(", ");if(!await openConfirm(dialog,{title:"Auxiliary models still pinned to another provider",body:`${names}
|
|
4152
4152
|
|
|
4153
4153
|
Reset these slots to auto so they follow the main model?`,yes:"reset stale",no:"keep"})){toast.show({variant:"warning",message:`Aux still pinned to another provider: ${names}. Press X to reset all to auto.`});return}for(let slot of stale){let r=await resetAux(gw,slot.key);if(r.failed.length){toast.show({variant:"error",message:`${slot.label}: ${r.failed.map((f)=>f.err).join("; ")}`});return}}toast.show({variant:"success",message:`Reset ${stale.length} aux slot${stale.length===1?"":"s"} \u2192 auto`}),load4()};openModelPicker(dialog,gw,{title:s.kind==="main"?"Set main model":`Set auxiliary \xB7 ${s.label}`,onApply:async(prov,model)=>{let token=dialog.version(),r=await assign(gw,s.key,prov,model);if(r.failed.length)return toast.show({variant:"error",message:r.failed.map((f)=>f.err).join("; ")});if(toast.show({variant:"success",message:s.kind==="main"?`main \u2192 ${prov} \xB7 ${model}`:`${s.key} \u2192 ${prov} \xB7 ${model}`}),r.warning)toast.show({variant:"warning",message:r.warning});if(load4(),s.kind==="main"&&dialog.version()===token)await warnStaleAux(prov)}})},[gw,dialog,toast,load4,managed,raw]),unset=import_react97.useCallback((s)=>{if(managed||s.kind!=="aux"||s.auto)return;resetAux(gw,s.key).then((r)=>{if(r.failed.length)return toast.show({variant:"error",message:r.failed.map((f)=>f.err).join("; ")});toast.show({variant:"success",message:`${s.key} \u2192 auto`}),load4()})},[gw,toast,load4,managed]),unsetAll=import_react97.useCallback(()=>openConfirm(dialog,{title:"Reset all auxiliary slots to auto?",body:`${AUX_TASKS.length} slots. Each falls back to the main model.`,yes:"reset",danger:!0}).then((ok)=>{if(!ok)return;resetAux(gw,"all").then((r)=>{if(r.failed.length)return toast.show({variant:"error",message:`${r.failed.length} failed`});toast.show({variant:"success",message:"All auxiliary slots \u2192 auto"}),load4()})}),[gw,dialog,toast,load4]),keys=useKeys();if(useKeyboard((key3)=>{if(!props.focused||dialog.open())return;if(keys.match("config.mode",key3)&&!editing&&!searching){setMode((m2)=>m2==="form"?"yaml":"form");return}if(keys.match("config.save",key3))return void save2();if(mode2==="yaml"){if(key3.name==="backspace"){loads.current++,setYaml((prev)=>prev.slice(0,-1));return}if(key3.name==="return"){loads.current++,setYaml((prev)=>prev+`
|
|
@@ -4162,7 +4162,7 @@ high contrast, light subject on dark, black background`,BINDS=[{name:"return",ac
|
|
|
4162
4162
|
`)}async function defaults2(input){let bundle;try{bundle=await previewSubmitBundle({path:input.path})}catch{}let meta2=bundle?.meta,name=typeof meta2?.name==="string"?meta2.name:basename11(input.path).replace(/\.eikon$/i,""),author=authorName(meta2?.author)??await ghUser()??process.env.USER??"unknown",glyph=typeof meta2?.glyph==="string"&&meta2.glyph.trim()?meta2.glyph.trim():"\u25C6";return{title:typeof meta2?.title==="string"&&meta2.title.trim()?meta2.title.trim():name,author,description:"Monochrome terminal avatar.",glyph}}async function prepare(input){let meta2=sanitize2(input.meta??await defaults2(input)),target=repo(input.target??DEFAULT_REPO),bundle=await previewSubmitBundle({path:input.path,display:meta2}),want=`${bundle.meta.name}.eikon`;if(basename11(input.path)!==want)throw Error(`runtime filename must match eikon name: expected ${want}`);scan(bundle);let req=request(bundle,meta2,target);return{path:input.path,name:bundle.meta.name,files:bundle.files.map((f)=>({path:f.path,bytes:f.bytes})),meta:meta2,target,source:bundle.files.some((f)=>/\/source\/|\/states\//.test(f.path)),bundleDir:bundle.root,bundleSource:source(bundle.root),title:req.title,body:req.body,url:fallbackUrl(target,bundle.meta.name),steps:steps(target,bundle.meta.name),lint:bundle.lint,bundle,request:req,snapshot:snap2(bundle)}}async function submit2(input,backend3){if(snap2(input.bundle)!==input.snapshot)return{kind:"validation-failed",failures:[{code:"invalid-eikon",message:"staged submission changed after preview; review the bundle again"}]};try{scan(input.bundle)}catch(err){return{kind:"validation-failed",failures:[{code:"invalid-eikon",message:err instanceof Error?err.message:String(err)}]}}let be2=backend3??githubSubmitBackend(input.target),setup=await be2.check();if(!setup.ok)return{kind:"setup-needed",failures:[{code:"missing-auth",message:redact2(setup.reason)}]};try{return await be2.create(request(input.bundle,input.meta,input.target))}catch(err){return{kind:"backend-failed",failures:[{code:"backend-failed",message:redact2(err instanceof Error?err.message:String(err))}]}}}function scan(bundle){let errs=bundle.files.flatMap((file2)=>{let text5=publicText(file2.abs,file2.path);if(text5===void 0)return[];if(secretLike(text5))return[`${file2.path} looks secret-like`];if(unsafeUrl(text5))return[`${file2.path} contains private or unsafe URL`];return[]});if(errs.length)throw Error(errs.join(`
|
|
4163
4163
|
`))}function publicText(abs2,rel2){if(/\.eikon$/i.test(rel2))return decodeRuntimeFile(abs2);if(/\.(json|md|txt|ya?ml)$/i.test(rel2))return readFileSync15(abs2,"utf8");return}function request(bundle,meta2,target){let title=`eikons: submit ${bundle.meta.name}`,body=[`Submits \`${bundle.meta.name}\` for official registry review.`,"",`Title: ${meta2.title}`,`Author: ${meta2.author}`,`Description: ${meta2.description}`,`Glyph: ${meta2.glyph}`,`Target: ${target}`,"","Registry preflight:",...bundle.lint].join(`
|
|
4164
4164
|
`);return{bundle,title,body}}function sanitize2(meta2){let next3={title:clean5(meta2.title),author:clean5(meta2.author),description:clean5(meta2.description),glyph:clean5(meta2.glyph)},errs=Object.entries(next3).flatMap(([key3,value2])=>{if(!value2)return[`${key3} required`];if(CTRL2.test(value2))return[`${key3} contains control characters`];if(secretLike(value2))return[`${key3} looks secret-like`];if(unsafeUrl(value2))return[`${key3} contains private or unsafe URL`];return[]});if(Array.from(next3.glyph).length>2)errs.push("glyph must be one or two characters");if(errs.length)throw Error(errs.join(`
|
|
4165
|
-
`));return next3}function secretLike(value2){return TOKEN.lastIndex=0,TOKEN.test(value2)||SECRET2.test(value2)}function clean5(value2){return value2.trim().replace(/\s+/g," ")}function authorName(value2){if(typeof value2==="string"&&value2.trim())return value2.trim();if(value2&&typeof value2==="object"&&!Array.isArray(value2)){let name=value2.name;if(typeof name==="string"&&name.trim())return name.trim()}return}function repo(value2){let clean6=value2.trim();if(!REPO.test(clean6))throw Error(`invalid submit repo: ${value2}`);return clean6}function unsafeUrl(value2){return(value2.match(/\b(?:https?|file|data|javascript):[^\s]+/gi)??[]).some((raw2)=>{let url2;try{url2=new URL(raw2)}catch{return!1}if(url2.protocol!=="http:"&&url2.protocol!=="https:")return!0;return privateHost2(url2.hostname)})}function privateHost2(host){let h2=host.toLowerCase().replace(/^\[|\]$/g,"");if(!h2||h2==="::"||h2==="localhost"||h2.endsWith(".localhost"))return!0;let ipv4=h2.match(/^(\d+)\.(\d+)\./);if(ipv4&&privateIpv42(Number(ipv4[1]),Number(ipv4[2])))return!0;if(h2.startsWith("fe80:")||/^f[cd][0-9a-f]{2}:/.test(h2))return!0;let mapped=h2.match(/^::ffff:(?:(\d+)\.(\d+)\.|([0-9a-f]{1,4}):([0-9a-f]{1,4}))/);if(mapped?.[1]&&privateIpv42(Number(mapped[1]),Number(mapped[2])))return!0;if(mapped?.[3]&&mapped?.[4]){let n=Number.parseInt(mapped[3],16)*65536+Number.parseInt(mapped[4],16);return privateIpv42(Math.floor(n/16777216),Math.floor(n/65536)&255)}return isIP(h2)!==0&&(h2==="0.0.0.0"||h2==="::1")}function privateIpv42(a,b2){if(a===10||a===127)return!0;if(a===169&&b2===254)return!0;if(a===192&&b2===168)return!0;return a===172&&b2>=16&&b2<=31}function fallbackUrl(target,name){return`https://github.com/${target}/compare/main...submit%2F${encodeURIComponent(name)}`}function steps(target,name){return[`Open ${target} on GitHub.`,`Create a submit/${name} branch with the prepared files.`,"Open a pull request using the Eikon submission template."]}function snap2(bundle){let hash2=createHash6("sha256");for(let file2 of bundle.files)hash2.update(file2.path),hash2.update("\x00"),hash2.update(String(file2.bytes)),hash2.update("\x00"),hash2.update(readFileSync15(file2.abs)),hash2.update("\x00");return hash2.digest("hex")}function source(path4){return{file:path4,relative:path4,label:basename11(path4)}}async function ghUser(){try{let p=Bun.spawn(["gh","api","user","-q",".login"],{stdout:"pipe",stderr:"pipe"}),[out,code]=await Promise.all([new Response(p.stdout).text(),p.exited]);return code===0&&out.trim()?out.trim():void 0}catch{return}}function cleanup(input){if(dirname11(input.bundleDir)!==tmpdir5()||!basename11(input.bundleDir).startsWith("eikon-submit-"))return;rmSync5(input.bundleDir,{recursive:!0,force:!0})}var FIELDS4=["title","author","description","glyph"];function openEikonSubmit(dialog,opts){return new Promise((resolve4)=>{dialog.replace($jsx(Form3,{...opts,done:()=>{dialog.clear(),resolve4()}}),()=>resolve4())})}var Form3=(props)=>{let theme=useTheme().theme,touched=import_react112.useRef({}),flight=import_react112.useRef(!1),[busy2,setBusy]=import_react112.useState(!1),[status2,setStatus]=import_react112.useState(""),[result,setResult]=import_react112.useState(null),[prepared,setPrepared]=import_react112.useState(null),[field,setField]=import_react112.useState("title"),[meta2,setMeta]=import_react112.useState({title:props.name,author:"unknown",description:"Monochrome terminal avatar.",glyph:"\u25C6"});import_react112.useEffect(()=>{let dead=!1;return touched.current={},defaults2({path:props.path}).then((next3)=>{if(dead)return;setMeta((prev)=>({title:touched.current.title?prev.title:next3.title,author:touched.current.author?prev.author:next3.author,description:touched.current.description?prev.description:next3.description,glyph:touched.current.glyph?prev.glyph:next3.glyph}))}).catch((e)=>setStatus(`Defaults failed: ${redact2(e instanceof Error?e.message:String(e))}`)),()=>{dead=!0}},[props.path]);let close2=()=>{if(prepared&&!status2.includes("fallback"))cleanup(prepared);props.done()},edit2=(key3,value2)=>{if(touched.current[key3]=!0,setMeta((m2)=>({...m2,[key3]:value2})),prepared)cleanup(prepared);setPrepared(null),setResult(null)},prep=async()=>{if(flight.current)return;flight.current=!0,setBusy(!0),setResult(null);try{if(setStatus("Running registry preflight\u2026"),prepared)cleanup(prepared);let next3=await prepare({path:props.path,meta:meta2,includeSource:!1});setPrepared(next3),setStatus(`This will create a PR in ${next3.target} for review. Press Enter to submit.`)}catch(e){setStatus(`Submit failed: ${redact2(e instanceof Error?e.message:String(e))}`)}finally{flight.current=!1,setBusy(!1)}},send=async()=>{if(flight.current)return;if(!prepared)return prep();flight.current=!0,setBusy(!0),setResult(null);try{setStatus("Submitting\u2026");let next3=await props.submit(prepared);if(setResult(next3),next3.kind==="submitted")cleanup(prepared),setStatus("Your Eikon has been submitted and is being reviewed.");else if(next3.kind==="setup-needed")setStatus(`GitHub CLI unavailable. Follow the manual PR instructions below. ${failureText(next3.failures)}`);else setStatus(`Submit failed. Follow the manual PR instructions below. ${failureText(next3.failures)}`)}catch(e){setStatus(`Submit failed. Follow the manual PR instructions below. ${redact2(e instanceof Error?e.message:String(e))}`)}finally{flight.current=!1,setBusy(!1)}},open3=()=>{if(!prepared)return;let ok=openUrl(prepared.url);setStatus(ok?"Opened GitHub compare page":`Open failed; copy ${prepared.url}`)},move=(by)=>{let i=FIELDS4.indexOf(field);setField(FIELDS4[(i+by+FIELDS4.length)%FIELDS4.length])};useKeyboard((key3)=>{if(key3.name==="escape")return close2();if(busy2)return;if(!prepared&&key3.name==="up")return move(-1);if(!prepared&&key3.name==="down")return move(1);if(key3.name==="o"&&prepared)return open3();if(key3.name==="return")return void send()});let bad=status2.startsWith("Submit failed"),warn=status2.startsWith("GitHub")||status2.includes("fallback")||status2.includes("consent");return $jsxs("box",{flexDirection:"column",width:84,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"Submit eikon"})})}),$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:[props.name," \xB7 official registry PR"]})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:targetRepo()})}),$jsx("box",{height:1}),!prepared?$jsx(Meta,{meta:meta2,field,setField,setMeta:edit2}):$jsx(Preview,{prepared,result}),$jsx("box",{height:1}),$jsx("text",{fg:bad?theme.error:warn?theme.warning:theme.textMuted,wrapMode:"word",children:status2||(prepared?"Enter submit \xB7 o open GitHub compare \xB7 Esc cancel":"\u2191\u2193 field \xB7 Enter continue \xB7 Esc cancel")})]})};function Meta(props){return $jsxs("box",{flexDirection:"column",children:[$jsx("text",{fg:"gray",children:"Public metadata"}),$jsx(Input,{label:"title",value:props.meta.title,on:props.field==="title",setOn:()=>props.setField("title"),set:(v2)=>props.setMeta("title",v2)}),$jsx(Input,{label:"author",value:props.meta.author,on:props.field==="author",setOn:()=>props.setField("author"),set:(v2)=>props.setMeta("author",v2)}),$jsx(Input,{label:"description",value:props.meta.description,on:props.field==="description",setOn:()=>props.setField("description"),set:(v2)=>props.setMeta("description",v2)}),$jsx(Input,{label:"glyph",value:props.meta.glyph,on:props.field==="glyph",setOn:()=>props.setField("glyph"),set:(v2)=>props.setMeta("glyph",v2)})]})}function Input(props){let theme=useTheme().theme;return $jsxs("box",{height:1,flexDirection:"row",onMouseDown:props.setOn,children:[$jsx("box",{width:13,children:$jsxs("text",{fg:props.on?theme.primary:theme.textMuted,children:[props.on?"\u25B8 ":" ",props.label]})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("input",{value:props.value,onInput:props.set,focused:props.on,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement})})]})}function Preview(props){let theme=useTheme().theme,manual=props.result?.kind==="setup-needed"||props.result?.kind==="backend-failed";return $jsxs("box",{flexDirection:"column",children:[$jsx("text",{fg:theme.textMuted,children:"Registry preflight"}),props.prepared.lint.map((line4)=>$jsx("text",{fg:theme.accent,children:line4},line4)),$jsx("box",{height:1}),$jsx("text",{fg:theme.textMuted,children:"Package"}),$jsxs("text",{fg:theme.text,children:[props.prepared.files.length," files prepared for registry review"]}),$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:8,children:$jsx("text",{fg:theme.textMuted,children:"Bundle:"})}),$jsx(FileLink,{source:props.prepared.bundleSource,children:props.prepared.bundleDir})]}),$jsx("box",{height:1}),$jsx("text",{fg:theme.textMuted,children:"Metadata"}),$jsxs("text",{fg:theme.textMuted,children:["Title: ",props.prepared.meta.title]}),$jsxs("text",{fg:theme.textMuted,children:["Author: ",props.prepared.meta.author]}),$jsxs("text",{fg:theme.textMuted,wrapMode:"word",children:["Description: ",props.prepared.meta.description]}),$jsxs("text",{fg:theme.textMuted,children:["Glyph: ",props.prepared.meta.glyph]}),manual?$jsxs("box",{flexDirection:"column",children:[$jsx("box",{height:1}),$jsx("text",{fg:theme.warning,children:"Manual PR"}),props.prepared.steps.map((step2)=>$jsxs("text",{fg:theme.textMuted,wrapMode:"word",children:["\u2022 ",step2]},step2)),$jsxs("text",{fg:theme.textMuted,children:["Compare: ",props.prepared.url]})]}):null]})}var exports_eikon_gen={};__export(exports_eikon_gen,{setProbe:()=>setProbe,setImpl:()=>setImpl,probeCached:()=>probeCached,probe:()=>probe2,generate:()=>generate,gen:()=>exports_eikon_gen,current:()=>current});import{existsSync as existsSync24,readFileSync as readFileSync16}from"fs";import{tmpdir as tmpdir6}from"os";import{join as join19}from"path";var ROOT2=()=>hermesPath("hermes-agent"),WIN=process.platform==="win32",PY=()=>{for(let v2 of["venv",".venv"]){let bin=WIN?`${ROOT2()}/${v2}/Scripts/python.exe`:`${ROOT2()}/${v2}/bin/python`;if(existsSync24(bin))return bin}return WIN?"python":"python3"},spawn4=(args)=>{try{return Bun.spawn([PY(),...args],{cwd:ROOT2(),env:env2(),stdout:"pipe",stderr:"pipe"})}catch(e){return e instanceof Error?e:Error(String(e))}};function dotenv(){let out={},path4=hermesPath(".env");if(!existsSync24(path4))return out;for(let raw2 of readFileSync16(path4,"utf8").split(`
|
|
4165
|
+
`));return next3}function secretLike(value2){return TOKEN.lastIndex=0,TOKEN.test(value2)||SECRET2.test(value2)}function clean5(value2){return value2.trim().replace(/\s+/g," ")}function authorName(value2){if(typeof value2==="string"&&value2.trim())return value2.trim();if(value2&&typeof value2==="object"&&!Array.isArray(value2)){let name=value2.name;if(typeof name==="string"&&name.trim())return name.trim()}return}function repo(value2){let clean6=value2.trim();if(!REPO.test(clean6))throw Error(`invalid submit repo: ${value2}`);return clean6}function unsafeUrl(value2){return(value2.match(/\b(?:https?|file|data|javascript):[^\s]+/gi)??[]).some((raw2)=>{let url2;try{url2=new URL(raw2)}catch{return!1}if(url2.protocol!=="http:"&&url2.protocol!=="https:")return!0;return privateHost2(url2.hostname)})}function privateHost2(host){let h2=host.toLowerCase().replace(/^\[|\]$/g,"");if(!h2||h2==="::"||h2==="localhost"||h2.endsWith(".localhost"))return!0;let ipv4=h2.match(/^(\d+)\.(\d+)\./);if(ipv4&&privateIpv42(Number(ipv4[1]),Number(ipv4[2])))return!0;if(h2.startsWith("fe80:")||/^f[cd][0-9a-f]{2}:/.test(h2))return!0;let mapped=h2.match(/^::ffff:(?:(\d+)\.(\d+)\.|([0-9a-f]{1,4}):([0-9a-f]{1,4}))/);if(mapped?.[1]&&privateIpv42(Number(mapped[1]),Number(mapped[2])))return!0;if(mapped?.[3]&&mapped?.[4]){let n=Number.parseInt(mapped[3],16)*65536+Number.parseInt(mapped[4],16);return privateIpv42(Math.floor(n/16777216),Math.floor(n/65536)&255)}return isIP(h2)!==0&&(h2==="0.0.0.0"||h2==="::1")}function privateIpv42(a,b2){if(a===10||a===127)return!0;if(a===169&&b2===254)return!0;if(a===192&&b2===168)return!0;return a===172&&b2>=16&&b2<=31}function fallbackUrl(target,name){return`https://github.com/${target}/compare/main...submit%2F${encodeURIComponent(name)}`}function steps(target,name){return[`Open ${target} on GitHub.`,`Create a submit/${name} branch with the prepared files.`,"Open a pull request using the Eikon submission template."]}function snap2(bundle){let hash2=createHash6("sha256");for(let file2 of bundle.files)hash2.update(file2.path),hash2.update("\x00"),hash2.update(String(file2.bytes)),hash2.update("\x00"),hash2.update(readFileSync15(file2.abs)),hash2.update("\x00");return hash2.digest("hex")}function source(path4){return{file:path4,relative:path4,label:basename11(path4)}}async function ghUser(){try{let p=Bun.spawn(["gh","api","user","-q",".login"],{stdout:"pipe",stderr:"pipe"}),[out,code]=await Promise.all([new Response(p.stdout).text(),p.exited]);return code===0&&out.trim()?out.trim():void 0}catch{return}}function cleanup(input){if(dirname11(input.bundleDir)!==tmpdir5()||!basename11(input.bundleDir).startsWith("eikon-submit-"))return;rmSync5(input.bundleDir,{recursive:!0,force:!0})}var FIELDS4=["title","author","description","glyph"];function openEikonSubmit(dialog,opts){return new Promise((resolve4)=>{dialog.replace($jsx(Form3,{...opts,done:()=>{dialog.clear(),resolve4()}}),()=>resolve4())})}var Form3=(props)=>{let theme=useTheme().theme,touched=import_react112.useRef({}),flight=import_react112.useRef(!1),[busy2,setBusy]=import_react112.useState(!1),[status2,setStatus]=import_react112.useState(""),[result,setResult]=import_react112.useState(null),[prepared,setPrepared]=import_react112.useState(null),[field,setField]=import_react112.useState("title"),[meta2,setMeta]=import_react112.useState({title:props.name,author:"unknown",description:"Monochrome terminal avatar.",glyph:"\u25C6"});import_react112.useEffect(()=>{let dead=!1;return touched.current={},defaults2({path:props.path}).then((next3)=>{if(dead)return;setMeta((prev)=>({title:touched.current.title?prev.title:next3.title,author:touched.current.author?prev.author:next3.author,description:touched.current.description?prev.description:next3.description,glyph:touched.current.glyph?prev.glyph:next3.glyph}))}).catch((e)=>setStatus(`Defaults failed: ${redact2(e instanceof Error?e.message:String(e))}`)),()=>{dead=!0}},[props.path]);let close3=()=>{if(prepared&&!status2.includes("fallback"))cleanup(prepared);props.done()},edit2=(key3,value2)=>{if(touched.current[key3]=!0,setMeta((m2)=>({...m2,[key3]:value2})),prepared)cleanup(prepared);setPrepared(null),setResult(null)},prep=async()=>{if(flight.current)return;flight.current=!0,setBusy(!0),setResult(null);try{if(setStatus("Running registry preflight\u2026"),prepared)cleanup(prepared);let next3=await prepare({path:props.path,meta:meta2,includeSource:!1});setPrepared(next3),setStatus(`This will create a PR in ${next3.target} for review. Press Enter to submit.`)}catch(e){setStatus(`Submit failed: ${redact2(e instanceof Error?e.message:String(e))}`)}finally{flight.current=!1,setBusy(!1)}},send=async()=>{if(flight.current)return;if(!prepared)return prep();flight.current=!0,setBusy(!0),setResult(null);try{setStatus("Submitting\u2026");let next3=await props.submit(prepared);if(setResult(next3),next3.kind==="submitted")cleanup(prepared),setStatus("Your Eikon has been submitted and is being reviewed.");else if(next3.kind==="setup-needed")setStatus(`GitHub CLI unavailable. Follow the manual PR instructions below. ${failureText(next3.failures)}`);else setStatus(`Submit failed. Follow the manual PR instructions below. ${failureText(next3.failures)}`)}catch(e){setStatus(`Submit failed. Follow the manual PR instructions below. ${redact2(e instanceof Error?e.message:String(e))}`)}finally{flight.current=!1,setBusy(!1)}},open3=()=>{if(!prepared)return;let ok=openUrl(prepared.url);setStatus(ok?"Opened GitHub compare page":`Open failed; copy ${prepared.url}`)},move=(by)=>{let i=FIELDS4.indexOf(field);setField(FIELDS4[(i+by+FIELDS4.length)%FIELDS4.length])};useKeyboard((key3)=>{if(key3.name==="escape")return close3();if(busy2)return;if(!prepared&&key3.name==="up")return move(-1);if(!prepared&&key3.name==="down")return move(1);if(key3.name==="o"&&prepared)return open3();if(key3.name==="return")return void send()});let bad=status2.startsWith("Submit failed"),warn=status2.startsWith("GitHub")||status2.includes("fallback")||status2.includes("consent");return $jsxs("box",{flexDirection:"column",width:84,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"Submit eikon"})})}),$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:[props.name," \xB7 official registry PR"]})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:targetRepo()})}),$jsx("box",{height:1}),!prepared?$jsx(Meta,{meta:meta2,field,setField,setMeta:edit2}):$jsx(Preview,{prepared,result}),$jsx("box",{height:1}),$jsx("text",{fg:bad?theme.error:warn?theme.warning:theme.textMuted,wrapMode:"word",children:status2||(prepared?"Enter submit \xB7 o open GitHub compare \xB7 Esc cancel":"\u2191\u2193 field \xB7 Enter continue \xB7 Esc cancel")})]})};function Meta(props){return $jsxs("box",{flexDirection:"column",children:[$jsx("text",{fg:"gray",children:"Public metadata"}),$jsx(Input,{label:"title",value:props.meta.title,on:props.field==="title",setOn:()=>props.setField("title"),set:(v2)=>props.setMeta("title",v2)}),$jsx(Input,{label:"author",value:props.meta.author,on:props.field==="author",setOn:()=>props.setField("author"),set:(v2)=>props.setMeta("author",v2)}),$jsx(Input,{label:"description",value:props.meta.description,on:props.field==="description",setOn:()=>props.setField("description"),set:(v2)=>props.setMeta("description",v2)}),$jsx(Input,{label:"glyph",value:props.meta.glyph,on:props.field==="glyph",setOn:()=>props.setField("glyph"),set:(v2)=>props.setMeta("glyph",v2)})]})}function Input(props){let theme=useTheme().theme;return $jsxs("box",{height:1,flexDirection:"row",onMouseDown:props.setOn,children:[$jsx("box",{width:13,children:$jsxs("text",{fg:props.on?theme.primary:theme.textMuted,children:[props.on?"\u25B8 ":" ",props.label]})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("input",{value:props.value,onInput:props.set,focused:props.on,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement})})]})}function Preview(props){let theme=useTheme().theme,manual=props.result?.kind==="setup-needed"||props.result?.kind==="backend-failed";return $jsxs("box",{flexDirection:"column",children:[$jsx("text",{fg:theme.textMuted,children:"Registry preflight"}),props.prepared.lint.map((line4)=>$jsx("text",{fg:theme.accent,children:line4},line4)),$jsx("box",{height:1}),$jsx("text",{fg:theme.textMuted,children:"Package"}),$jsxs("text",{fg:theme.text,children:[props.prepared.files.length," files prepared for registry review"]}),$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:8,children:$jsx("text",{fg:theme.textMuted,children:"Bundle:"})}),$jsx(FileLink,{source:props.prepared.bundleSource,children:props.prepared.bundleDir})]}),$jsx("box",{height:1}),$jsx("text",{fg:theme.textMuted,children:"Metadata"}),$jsxs("text",{fg:theme.textMuted,children:["Title: ",props.prepared.meta.title]}),$jsxs("text",{fg:theme.textMuted,children:["Author: ",props.prepared.meta.author]}),$jsxs("text",{fg:theme.textMuted,wrapMode:"word",children:["Description: ",props.prepared.meta.description]}),$jsxs("text",{fg:theme.textMuted,children:["Glyph: ",props.prepared.meta.glyph]}),manual?$jsxs("box",{flexDirection:"column",children:[$jsx("box",{height:1}),$jsx("text",{fg:theme.warning,children:"Manual PR"}),props.prepared.steps.map((step2)=>$jsxs("text",{fg:theme.textMuted,wrapMode:"word",children:["\u2022 ",step2]},step2)),$jsxs("text",{fg:theme.textMuted,children:["Compare: ",props.prepared.url]})]}):null]})}var exports_eikon_gen={};__export(exports_eikon_gen,{setProbe:()=>setProbe,setImpl:()=>setImpl,probeCached:()=>probeCached,probe:()=>probe2,generate:()=>generate,gen:()=>exports_eikon_gen,current:()=>current});import{existsSync as existsSync24,readFileSync as readFileSync16}from"fs";import{tmpdir as tmpdir6}from"os";import{join as join19}from"path";var ROOT2=()=>hermesPath("hermes-agent"),WIN=process.platform==="win32",PY=()=>{for(let v2 of["venv",".venv"]){let bin=WIN?`${ROOT2()}/${v2}/Scripts/python.exe`:`${ROOT2()}/${v2}/bin/python`;if(existsSync24(bin))return bin}return WIN?"python":"python3"},spawn4=(args)=>{try{return Bun.spawn([PY(),...args],{cwd:ROOT2(),env:env2(),stdout:"pipe",stderr:"pipe"})}catch(e){return e instanceof Error?e:Error(String(e))}};function dotenv(){let out={},path4=hermesPath(".env");if(!existsSync24(path4))return out;for(let raw2 of readFileSync16(path4,"utf8").split(`
|
|
4166
4166
|
`)){let ln=raw2.trim();if(!ln||ln.startsWith("#"))continue;let eq3=ln.indexOf("=");if(eq3<1)continue;let k2=ln.slice(0,eq3).replace(/^export\s+/,"").trim(),v2=ln.slice(eq3+1).trim();if(v2.startsWith('"')&&v2.endsWith('"')||v2.startsWith("'")&&v2.endsWith("'"))v2=v2.slice(1,-1);out[k2]=v2}return out}var env2=()=>{let base3=dotenv();for(let[k2,v2]of Object.entries(process.env))if(v2!==void 0)base3[k2]=v2;return base3},q4=(s)=>JSON.stringify(s);function code(kind2,prompt,o){if(kind2==="image")return["from tools.image_generation_tool import _handle_image_generate as g",`print(g({"prompt": ${q4(prompt)}, "aspect_ratio": ${q4(o.aspect??"square")}}))`].join("; ");let args=[`"prompt":${q4(prompt)}`,`"aspect_ratio":${q4(o.aspect??"1:1")}`];if(o.seconds)args.push(`"duration":${o.seconds}`);if(o.seed)args.push(`"image_url":${q4(o.seed)}`);return["from tools.video_generation_tool import _handle_video_generate as g",`print(g({${args.join(",")}}))`].join("; ")}async function probe2(){let root3=ROOT2();if(!existsSync24(root3))return{image:!1,video:!1};let src3=["import json","from tools.image_generation_tool import check_image_generation_requirements as ci","from tools.video_generation_tool import check_video_generation_requirements as cv","print(json.dumps({'image': bool(ci()), 'video': bool(cv())}))"].join("; "),r=spawn4(["-c",src3]);if(r instanceof Error)return{image:!1,video:!1};let out=await new Response(r.stdout).text();if(await r.exited!==0)return{image:!1,video:!1};let last4=out.trim().split(`
|
|
4167
4167
|
`).pop();try{return JSON.parse(last4)}catch{return{image:!1,video:!1}}}async function fetchTo(url2,ext){let tmp=join19(tmpdir6(),`eikon-gen-${Date.now()}${ext}`),res=await fetch(url2);if(!res.ok)throw Error(`download ${res.status}`);return await Bun.write(tmp,await res.arrayBuffer()),tmp}var generate=async(kind2,prompt,opts)=>{let r=spawn4(["-c",code(kind2,prompt,opts)]);if(r instanceof Error)return{err:r.message};let[out,err,exit]=await Promise.all([new Response(r.stdout).text(),new Response(r.stderr).text(),r.exited]);if(exit!==0)return{err:(err||out).trim().split(`
|
|
4168
4168
|
`).slice(-3).join(" ")||`python exited ${exit}`};let last4=out.trim().split(`
|
|
@@ -4199,7 +4199,7 @@ ${r.skipped.slice(0,8).join(", ")}${r.skipped.length>8?", \u2026":""}`:""}`,yes:
|
|
|
4199
4199
|
`).filter(Boolean).map((l)=>JSON.parse(l)).slice(-MAX)}function save3(list3){mkdirSync7(configDir(),{recursive:!0}),writeFileSync9(file2(),list3.map((e)=>JSON.stringify(e)).join(`
|
|
4200
4200
|
`)+`
|
|
4201
4201
|
`,"utf-8")}function push2(text6){let list3=load5(),at=Math.max(Date.now(),(list3[list3.length-1]?.at??0)+1);if(list3.push({text:text6,at}),list3.length>MAX)list3.shift();return save3(list3),list3.length}function pop2(){let list3=load5(),e=list3.pop();if(!e)return null;return save3(list3),e}function all(){return load5().reverse()}function drop(at){save3(load5().filter((e)=>e.at!==at))}var import_react139=__toESM(require_react_production(),1);var ctx=import_react139.createContext(null),BackgroundProvider=({children:children2})=>{let[jobs,setJobs]=import_react139.useState(()=>new Map),register2=import_react139.useCallback((id,title="")=>{if(!id)return;setJobs((prev)=>{if(prev.get(id)===title)return prev;let next3=new Map(prev);return next3.set(id,title),next3})},[]),unregister=import_react139.useCallback((id)=>{setJobs((prev)=>{if(!prev.has(id))return prev;let next3=new Map(prev);return next3.delete(id),next3})},[]),label2=import_react139.useCallback((id)=>jobs.get(id)?.trim()||void 0,[jobs]),ids3=import_react139.useMemo(()=>Array.from(jobs.keys()),[jobs]),value2=import_react139.useMemo(()=>({count:ids3.length,ids:ids3,register:register2,unregister,label:label2}),[ids3,register2,unregister,label2]);return $jsx(ctx.Provider,{value:value2,children:children2})},useBackground=makeUse(ctx,"useBackground");var initialTurn={messages:[],streaming:!1,hasContent:!1,toolActive:!1};function turnReducer(state3,a){switch(a.kind){case"reset":return initialTurn;case"load":return{...initialTurn,messages:a.messages};case"load.live":return{...initialTurn,messages:a.messages,streaming:a.streaming,hasContent:a.streaming&&Boolean(joinText(a.messages.at(-1)?.parts??[]))};case"push":return{...state3,messages:[...state3.messages,a.message]};case"user":return{...state3,messages:[...state3.messages,userMessage(a.text)]};case"system":return{...state3,messages:[...state3.messages,systemMessage(sanitize(a.text))]};case"background":return{...state3,messages:[...state3.messages,backgroundMessage(a.id,a.title,a.text)]};case"message.start":return{...state3,streaming:!0,hasContent:!1,toolActive:!1};case"message.delta":{let chunk=sanitize(a.chunk);if(!chunk)return state3;return{...state3,hasContent:!0,toolActive:!1,messages:appendText(state3.messages,chunk)}}case"message.complete":return{...state3,streaming:!1,hasContent:!1,toolActive:!1,messages:finalize(state3.messages,a.text!=null?sanitize(a.text):void 0,a.usage)};case"reference":{let text6=sanitize(a.text);if(!text6)return state3;return{...state3,hasContent:!0,toolActive:!1,messages:appendPart(state3.messages,{type:"text",key:pid(),content:text6,streaming:!1},!0)}}case"tool.start":{let preview2=sanitize(a.preview),args=sanitize(a.args),raw2=args||preview2,json2=raw2&&/^\s*\{/.test(raw2),part={type:"tool",id:a.id,name:a.name,args:json2?raw2:"",status:"running",startedAt:Date.now(),preview:preview2||void 0,verboseArgs:args||void 0};return{...state3,toolActive:!0,hasContent:!1,messages:appendPart(state3.messages,part,!0)}}case"tool.progress":return{...state3,messages:updateRunningTool(state3.messages,a.name,(p)=>({...p,preview:sanitize(a.preview)||p.preview}))};case"tool.generating":return{...state3,messages:updateRunningTool(state3.messages,a.name,(p)=>({...p,preview:p.preview??"generating\u2026"}))};case"tool.complete":{let summary2=sanitize(a.summary),error=sanitize(a.error),diff=sanitize(a.inline_diff),result=sanitize(a.result);return{...state3,toolActive:!1,messages:updateToolById(state3.messages,a.id,(p)=>({...p,status:a.error?"error":"done",duration:a.duration??(p.startedAt?Date.now()-p.startedAt:void 0),preview:summary2||diff||p.preview,result:error||summary2||void 0,verboseResult:result||void 0,diff:diff||void 0}))}}case"thinking":return{...state3,messages:upsertThinking(state3.messages,sanitize(a.text),a.final,a.verbose)};case"subagent":return{...state3,messages:renderSubagent(state3.messages,a.event,a.payload)};case"prompt":{let part={type:"prompt",id:a.id,variant:a.req.variant,req:a.req};return{...state3,messages:appendPart(state3.messages,part,!0)}}case"prompt.answered":return{...state3,messages:updatePrompt(state3.messages,a.id,(p)=>({...p,answered:{label:a.label,ok:a.ok,at:Date.now(),question:promptQuestion(p.req)}}))};case"error":{let msg=systemMessage(`Error: ${sanitize(a.text)}`);if(a.fatal===!1)return{...state3,messages:[...state3.messages,msg]};return{...state3,streaming:!1,hasContent:!1,toolActive:!1,messages:[...state3.messages,msg]}}case"interrupt.notice":{let clean7=sanitize(a.text),last4=state3.messages[state3.messages.length-1];if(last4?.role==="system"&&last4.parts[0]?.type==="text"&&last4.parts[0].content.includes(clean7))return state3;return{...state3,messages:[...state3.messages,systemMessage(clean7)]}}}}function userMessage(text6){return{id:mid(),role:"user",parts:[{type:"text",content:text6,streaming:!1}],timestamp:Date.now()/1000}}function systemMessage(text6){return{id:mid(),role:"system",parts:[{type:"text",content:text6,streaming:!1}],timestamp:Date.now()/1000}}function clip2(text6,max){return text6.length<=max?text6:text6.slice(0,max-1)+"\u2026"}function label2(text6,max){return clip2(sanitize(text6).replace(/\s+/g," ").trim(),max)}function backgroundMessage(id,title,text6){let tid=label2(id,32)||"?",name=label2(title,80);return{id:mid(),role:"assistant",speaker:`[bg ${tid}]${name?` ${name}`:""}`,parts:[{type:"text",content:sanitize(text6),streaming:!1}],timestamp:Date.now()/1000}}function flatten3(text6){if(typeof text6==="string")return text6;if(!Array.isArray(text6))return"";let out=[];for(let p of text6)if(p&&typeof p==="object"&&"type"in p&&p.type==="text"&&"text"in p&&typeof p.text==="string")out.push(p.text);return out.join(`
|
|
4202
|
-
`)}function transcriptToMessages(rows3){return rows3.filter((r)=>r.role==="user"||r.role==="assistant").map((r)=>({role:r.role,content:sanitize(flatten3(r.text))})).filter((r)=>r.content).map((r)=>({id:mid(),role:r.role,parts:[{type:"text",content:r.content,streaming:!1}],timestamp:Date.now()/1000}))}function assistant(parts2){return{id:mid(),role:"assistant",parts:parts2,timestamp:Date.now()/1000}}function withLastAssistant(messages,fn,otherwise){let last4=messages[messages.length-1];if(last4?.role==="assistant")return[...messages.slice(0,-1),fn(last4)];return[...messages,otherwise()]}function seal(parts2){let last4=parts2[parts2.length-1];if(last4?.type==="text"&&last4.streaming)return[...parts2.slice(0,-1),{...last4,streaming:!1}];return parts2}function appendText(messages,chunk){return withLastAssistant(messages,(m2)=>{let last4=m2.parts[m2.parts.length-1];if(last4?.type==="text"&&last4.streaming){let part={...last4,content:last4.content+chunk};return{...m2,parts:[...m2.parts.slice(0,-1),part]}}return{...m2,parts:[...m2.parts,{type:"text",key:pid(),content:chunk,streaming:!0}]}},()=>assistant([{type:"text",key:pid(),content:chunk,streaming:!0}]))}function appendPart(messages,part,
|
|
4202
|
+
`)}function transcriptToMessages(rows3){return rows3.filter((r)=>r.role==="user"||r.role==="assistant").map((r)=>({role:r.role,content:sanitize(flatten3(r.text))})).filter((r)=>r.content).map((r)=>({id:mid(),role:r.role,parts:[{type:"text",content:r.content,streaming:!1}],timestamp:Date.now()/1000}))}function assistant(parts2){return{id:mid(),role:"assistant",parts:parts2,timestamp:Date.now()/1000}}function withLastAssistant(messages,fn,otherwise){let last4=messages[messages.length-1];if(last4?.role==="assistant")return[...messages.slice(0,-1),fn(last4)];return[...messages,otherwise()]}function seal(parts2){let last4=parts2[parts2.length-1];if(last4?.type==="text"&&last4.streaming)return[...parts2.slice(0,-1),{...last4,streaming:!1}];return parts2}function appendText(messages,chunk){return withLastAssistant(messages,(m2)=>{let last4=m2.parts[m2.parts.length-1];if(last4?.type==="text"&&last4.streaming){let part={...last4,content:last4.content+chunk};return{...m2,parts:[...m2.parts.slice(0,-1),part]}}return{...m2,parts:[...m2.parts,{type:"text",key:pid(),content:chunk,streaming:!0}]}},()=>assistant([{type:"text",key:pid(),content:chunk,streaming:!0}]))}function appendPart(messages,part,close3){return withLastAssistant(messages,(m2)=>({...m2,parts:[...close3?seal(m2.parts):m2.parts,part]}),()=>assistant([part]))}function finalize(messages,final,usage){let last4=messages[messages.length-1];if(last4?.role==="assistant"){let tail=last4.parts[last4.parts.length-1],dup=final&&last4.parts.some((p)=>p.type==="text"&&sameText(p.content,final)),text6=tail?.type==="text"&&final&&sameText(tail.content,final)?tail.content:final,parts2=tail?.type==="text"&&tail.streaming?[...last4.parts.slice(0,-1),{...tail,content:text6||tail.content,streaming:!1}]:final&&!dup&&!sameText(joinText(last4.parts),final)?[...last4.parts,{type:"text",content:final,streaming:!1}]:seal(last4.parts);return expirePrompts([...messages.slice(0,-1),{...last4,parts:parts2,usage}])}let next3=final?[...messages,{...assistant([{type:"text",content:final,streaming:!1}]),usage}]:messages;return expirePrompts(next3)}function expirePrompts(messages){let at=Date.now();return messages.map((m2)=>m2.role==="assistant"?{...m2,parts:m2.parts.map((p)=>p.type==="prompt"&&!p.answered?{...p,answered:{label:"Timed out",ok:!1,at,question:promptQuestion(p.req)}}:p)}:m2)}function joinText(parts2){return parts2.filter((p)=>p.type==="text").map((p)=>p.content).join("")}function sameText(a,b2){return a.trim()===b2.trim()}function updateRunningTool(messages,name,fn){let last4=messages[messages.length-1];if(!last4||last4.role!=="assistant")return messages;for(let i=last4.parts.length-1;i>=0;i--){let p=last4.parts[i];if(p.type!=="tool"||p.status!=="running")continue;if(name&&p.name!==name)continue;let parts2=[...last4.parts];return parts2[i]=fn(p),[...messages.slice(0,-1),{...last4,parts:parts2}]}return messages}function updateToolById(messages,id,fn){let last4=messages[messages.length-1];if(!last4||last4.role!=="assistant")return messages;let parts2=last4.parts.map((p)=>p.type==="tool"&&p.id===id?fn(p):p);return[...messages.slice(0,-1),{...last4,parts:parts2}]}function updatePrompt(messages,id,fn){return messages.map((m2)=>{if(m2.role!=="assistant")return m2;if(!m2.parts.some((p)=>p.type==="prompt"&&p.id===id))return m2;return{...m2,parts:m2.parts.map((p)=>p.type==="prompt"&&p.id===id?fn(p):p)}})}function promptQuestion(req){if(req.variant==="clarify")return req.question;if(req.variant==="approval")return req.description||"Shell command";if(req.variant==="sudo")return"Sudo required";return req.env_var?`Secret: ${req.env_var}`:"Secret required"}function upsertThinking(messages,text6,final,verbose2){return withLastAssistant(messages,(m2)=>{let idx=m2.parts.findIndex((p)=>p.type==="thinking");if(idx>=0){let prev=m2.parts[idx],content=final?prev.content.trim()||text6:prev.content+text6,parts2=[...m2.parts];return parts2[idx]={...prev,content,streaming:!final,verbose:prev.verbose||verbose2||void 0},{...m2,parts:parts2}}return{...m2,parts:[{type:"thinking",key:pid(),content:text6,streaming:!final,verbose:verbose2},...m2.parts]}},()=>assistant([{type:"thinking",key:pid(),content:text6,streaming:!final,verbose:verbose2}]))}function renderSubagent(messages,event,p){let id=p.subagent_id?`sub-${p.subagent_id}`:`sub-${p.task_index}`;if(event==="start"){let goal=sanitize(p.goal),part={type:"tool",id,name:"delegate_task",args:"",status:"running",startedAt:Date.now(),preview:goal||void 0,goal:goal||void 0,depth:p.depth??0,trail:[]};return appendPart(messages,part,!0)}if(event==="tool"&&p.tool_name){let tname=sanitize(p.tool_name),tprev=sanitize(p.tool_preview);return updateToolById(messages,id,(t2)=>({...t2,trail:[...t2.trail??[],{name:tname,preview:tprev||void 0}],preview:tprev?`${tname}: ${tprev}`:tname}))}if(event==="complete"){let tokens3=(p.input_tokens??0)+(p.output_tokens??0),extra=tokens3?` \xB7 ${(tokens3/1000).toFixed(1)}k tok`:"",summary2=sanitize(p.summary);return updateToolById(messages,id,(t2)=>({...t2,status:p.status==="failed"||p.status==="error"||p.status==="timeout"||p.status==="interrupted"?"error":"done",duration:p.duration_seconds?p.duration_seconds*1000:t2.startedAt?Date.now()-t2.startedAt:void 0,result:summary2?summary2+extra:void 0,preview:t2.goal??t2.preview}))}return updateToolById(messages,id,(t2)=>({...t2,preview:sanitize(p.text)||t2.preview}))}var AGGRESSIVE="--aggressive is not supported; use '/compress here [N]' to keep only recent exchanges, or /undo to drop turns.";function flags(arg){let kept=[],preview2={on:!1,aggressive:!1};for(let tok of arg.split(/\s+/).filter(Boolean)){let low=tok.toLowerCase();if(low==="--preview"||low==="--dry-run"||low==="--dryrun")preview2.on=!0;else if(low==="--aggressive")preview2.aggressive=!0;else kept.push(tok)}return{arg:kept.join(" "),preview:preview2.on,aggressive:preview2.aggressive}}function partial(arg){let text6=arg.trim();if(!text6)return{on:!1,keep:2,focus:""};let bits=(text6.toLowerCase().startsWith("up to here")?text6.slice(6).trim():text6).toLowerCase().split(/\s+/),keep=(v2)=>Math.min(Math.max(parseInt(v2??"",10)||2,1),100);if(bits[0]==="here")return{on:!0,keep:keep(bits[1]),focus:""};if((bits[0]==="--keep"||bits[0]==="-k")&&bits[1])return{on:!0,keep:keep(bits[1]),focus:""};if(bits[0]?.startsWith("--keep="))return{on:!0,keep:keep(bits[0].split("=",2)[1]),focus:""};return{on:!1,keep:2,focus:text6}}function compressPreview(arg,msgs){let f=flags(arg);if(f.aggressive&&!f.preview)return[AGGRESSIVE];if(!f.preview)return null;let p=partial(f.arg),at=p.on?[...msgs].reverse().reduce((acc2,m2,i)=>{if(acc2.length<p.keep&&m2.role==="user")return[...acc2,msgs.length-1-i];return acc2},[]).at(-1):void 0,head=at===void 0||at===0?msgs:msgs.slice(0,at),tail=at===void 0||at===0?[]:msgs.slice(at),lines3=["Preview \u2014 no changes made.",`Would compress ${head.length} of ${msgs.length} message(s) (~${Math.ceil(msgs.map(text3).join(`
|
|
4203
4203
|
|
|
4204
4204
|
`).length/4).toLocaleString()} tokens currently in context).`];if(p.on&&tail.length)lines3.push(`Boundary: keeping the last ${p.keep} exchange(s) (${tail.length} message(s)) verbatim.`);else if(p.on)lines3.push("Boundary: 'here' split would keep everything \u2014 falling back to full compression.");if(p.focus)lines3.push(`Focus topic: "${p.focus}"`);if(lines3.push("Run the command again without --preview to apply."),f.aggressive)lines3.push(AGGRESSIVE);return lines3}function useSlash(c){let gw=useGateway(),dialog=useDialog(),toast=useToast(),themeCtx=useTheme(),cmd=useCommand(),renderer=useRenderer(),cfg2=useHome("config"),bg2=useBackground(),ctx2=import_react140.useRef(c);ctx2.current=c;let gate=import_react140.useRef(cfg2);gate.current=cfg2;let destructive=import_react140.useCallback((arg,opts,action)=>{let a=arg.trim().toLowerCase(),skip=a==="now"||a==="once"||a==="approve"||a==="yes"||a==="always",bypass=!(gate.current?.approvals?.destructive_slash_confirm??!0)||process.env.HERMES_TUI_NO_CONFIRM==="1",persist2=a==="always",fire=()=>{if(persist2)Promise.resolve().then(() => (init_lane(),exports_lane)).then(({writeConfig:writeConfig2})=>writeConfig2(gw,[{key:"approvals.destructive_slash_confirm",to:!1}]).then((r)=>{if(r.failed.length){toast.show({variant:"warning",message:`couldn't persist: ${r.failed[0].err}`});return}home3.invalidate("config"),toast.show({variant:"success",message:`${opts.yes} \xB7 future runs silent`})}).catch((e)=>toast.show({variant:"error",message:e.message})));action()};if(skip||bypass)return fire();openConfirm(dialog,{title:opts.title,body:opts.body,yes:opts.yes,danger:!0}).then((ok)=>{if(ok)fire()})},[gw,dialog,toast]),pickEikon=import_react140.useCallback(()=>openEikonPicker(dialog,(n)=>set("eikon",n)),[dialog]),applyTitle=import_react140.useCallback((t2)=>{gw.request("session.title",{title:t2}).then((r)=>{ctx2.current.setTitle(r.title),ctx2.current.dispatch({kind:"system",text:`Title: ${r.title}`})}).catch((e)=>toast.show({variant:"error",message:e.message}))},[gw,toast]),runCompress=import_react140.useCallback(async(arg="")=>{let raw2=arg.trim(),pv=compressPreview(raw2,ctx2.current.turnRef.current.messages);if(pv){ctx2.current.dispatch({kind:"system",text:pv.join(`
|
|
4205
4205
|
`)}),toast.show({variant:pv.length===1?"warning":"info",message:pv.length===1?"compress unsupported":"Preview \u2014 no changes made"});return}toast.show({variant:"info",message:"Compressing session\u2026"});let r=await ctx2.current.session.compress(raw2).catch((err)=>{return toast.show({variant:"error",message:err.message}),null});if(!r)return;if(r.info)ctx2.current.setInfo(r.info);let out=r.lines?.length?r.lines:r.message?[r.message]:[];if(r.status==="preview"||r.status==="unsupported"||out.length){if(out.length)ctx2.current.dispatch({kind:"system",text:out.join(`
|
|
@@ -4208,7 +4208,7 @@ ${r.skipped.slice(0,8).join(", ")}${r.skipped.length>8?", \u2026":""}`:""}`,yes:
|
|
|
4208
4208
|
${list3.join(" ")}`});return}if(!list3.includes(name)){toast.show({variant:"error",message:`unknown skin: ${name}`});return}gw.request("config.set",{key:"skin",value:name}).then((r)=>{if(r.warning)toast.show({variant:"warning",message:r.warning});if(themeCtx.has(name)){themeCtx.set(name);let m2=mode(name);if(m2)themeCtx.setMode(m2)}set("eikon",void 0),set("eikonPath",void 0),x2.dispatch({kind:"system",text:`skin \u2192 ${name}`})}).catch((e)=>toast.show({variant:"error",message:e.message}));return}case"resume":if(arg){x2.switchSession(arg);return}x2.goTo(TAB_SLASH.sessions.tab,TAB_SLASH.sessions.sub);return;case"branch":branch3(arg);return;case"compress":runCompress(arg);return;case"undo":destructive(arg,{title:"Undo last turn?",body:"Pops the last user + assistant pair from the transcript. /redo in this session to restore.",yes:"undo"},()=>{let msgs=x2.turnRef.current.messages,at=msgs.map((m2)=>m2.role).lastIndexOf("user"),tail=at>=0?msgs.slice(at):[];x2.session.undo().then(()=>{if(tail.length)x2.undone.current.push(tail);return gw.request("session.history")}).then((r)=>x2.dispatch({kind:"load",messages:transcriptToMessages(r.messages??[])})).catch((err)=>toast.show({variant:"error",message:err.message}))});return;case"redo":{let head=x2.undone.current.pop()?.find((m2)=>m2.role==="user");if(!head){toast.show({variant:"info",message:"nothing to redo"});return}x2.sendRef.current(text3(head));return}case"retry":{let last4=[...x2.turnRef.current.messages].reverse().find((m2)=>m2.role==="user");if(!last4){toast.show({variant:"info",message:"nothing to retry"});return}x2.rewind(last4).then((ok)=>{if(ok)x2.sendRef.current(text3(last4))});return}case"model":if(!arg){openModelPicker(dialog,gw);return}if(arg.trim()==="--refresh"){openModelPicker(dialog,gw,{refresh:!0});return}gw.request("config.set",{key:"model",value:arg}).then((r)=>{if(r.warning)toast.show({variant:"warning",message:r.warning});x2.dispatch({kind:"system",text:`model \u2192 ${r.value??arg}`})}).catch((e)=>toast.show({variant:"error",message:e.message}));return;case"yolo":gw.request("config.set",{key:"yolo"}).then((r)=>{if(r.info)x2.setInfo(r.info),x2.setUsage(r.info.usage);else x2.setInfo({...x2.info??{},yolo:!x2.info?.yolo});if(toast.show({variant:"success",message:`yolo ${r.value??"toggled"}`}),r.warning)toast.show({variant:"warning",message:r.warning})}).catch((e)=>toast.show({variant:"error",message:e.message}));return;case"quit":quit(renderer,x2.resumeId||x2.sid,x2.title,gw);return;case"queue":if(!arg){x2.dispatch({kind:"system",text:`${x2.queueRef.current.length} queued`});return}x2.setQueue((q5)=>[...q5,arg]);return;case"stash":{let comp=x2.composer.current;if(arg==="pop"){let e=exports_stash.pop();if(!e)return toast.show({variant:"info",message:"stash empty"});comp?.set(e.text),x2.setFocusRegion("input");return}if(arg==="list"){let list3=exports_stash.all();if(list3.length===0)return toast.show({variant:"info",message:"stash empty"});dialog.replace($jsx(DialogSelect,{title:"Stashed prompts",filterable:list3.length>6,options:list3.map((e)=>({title:trunc5(e.text.replace(/\n/g," \u23CE "),50),value:String(e.at),hint:ago(e.at)})),onSelect:(o)=>{let e=list3.find((s)=>String(s.at)===o.value);if(e)exports_stash.drop(e.at),comp?.set(e.text),x2.setFocusRegion("input");dialog.clear()}}));return}let text6=arg||comp?.value().trim()||"";if(!text6)return toast.show({variant:"info",message:"nothing to stash \u2014 /stash list"});let n=exports_stash.push(text6);if(!arg)comp?.set("");toast.show({variant:"info",message:`stashed (${n}) \u2014 /stash pop to restore`});return}case"copy":{let all2=x2.turnRef.current.messages.filter((m3)=>m3.role==="assistant"),n=arg?Math.min(Math.max(1,parseInt(arg,10)||0),all2.length):all2.length,m2=all2[n-1];if(!m2){toast.show({variant:"info",message:"nothing to copy"});return}let body2=text3(m2);copyText(body2,toast,`copied ${body2.length} chars`);return}case"paste":x2.attachClipboard();return;case"image":if(!arg){toast.show({variant:"info",message:"usage: /image <path>"});return}gw.request("image.attach",{path:arg}).then((r)=>r.attached?x2.setAttachments((a)=>[...a,r]):toast.show({variant:"warning",message:r.message??"attach failed"})).catch((e)=>toast.show({variant:"error",message:e.message}));return;case"background":if(!arg){x2.dispatch({kind:"system",text:"/background <prompt>"});return}gw.request("prompt.background",x2.sid?{session_id:x2.sid,text:arg}:{text:arg}).then((r)=>{if(!r.task_id){toast.show({variant:"error",message:"background start failed"});return}bg2.register(r.task_id,arg),x2.dispatch({kind:"system",text:`bg ${r.task_id} started`})}).catch((e)=>toast.show({variant:"error",message:e.message}));return;case"voice":x2.voiceToggle((arg||"status").toLowerCase(),x2.sid).catch((e)=>toast.show({variant:"error",message:e.message}));return;case"mouse":{let want=arg==="on"?!0:arg==="off"?!1:!renderer.useMouse;renderer.useMouse=want,set("mouse",want),toast.show({variant:"info",message:`mouse ${want?"on":"off"}`});return}case"redraw":redraw(renderer);return;case"browser":{let parts2=arg.trim().split(/\s+/),sub3=parts2[0]?.toLowerCase()||"connect",url2=parts2[1];if(!["connect","disconnect","status"].includes(sub3)){toast.show({variant:"error",message:"usage: /browser [connect|disconnect|status] [url]"});return}let payload3={action:sub3};if(sub3==="connect"&&url2)payload3.url=url2;gw.request("browser.manage",payload3).then((r)=>{for(let m2 of r.messages??[])x2.dispatch({kind:"system",text:m2});if(r.connected)x2.dispatch({kind:"system",text:`Browser connected${r.url?` \u2192 ${r.url}`:""}`});else if(sub3==="disconnect")x2.dispatch({kind:"system",text:"Browser disconnected"});else if(sub3==="status")x2.dispatch({kind:"system",text:r.url??"No browser connected"})}).catch((e)=>toast.show({variant:"error",message:`browser: ${e.message}`}));return}case"setup":x2.dispatch({kind:"system",text:`/${c2.name} is an Ink-TUI command and has no effect in herm`});return;case"steer":{let fire=(text6)=>gw.request("session.steer",{text:text6}).then((r)=>toast.show(r.status==="queued"?{variant:"success",message:"Queued \u2014 lands on next tool result"}:{variant:"info",message:"No turn running; send as a normal message"})).catch((e)=>toast.show({variant:"error",message:e.message}));if(arg){fire(arg);return}openTextPrompt(dialog,{title:"Steer",label:"Note to inject on next tool result"}).then((text6)=>{if(text6)fire(text6)});return}case"reload-mcp":{let a=arg.trim().toLowerCase(),skip=a==="now"||a==="once"||a==="approve"||a==="yes"||a==="always",fire=(always)=>gw.request("reload.mcp",{confirm:!0,always}).then((r)=>r.status==="confirm_required"?toast.show({variant:"warning",message:r.message??"reload requires confirmation"}):toast.show({variant:"success",message:always?"MCP servers reloaded \xB7 future /reload-mcp runs silently":"MCP servers reloaded"})).catch((e)=>toast.show({variant:"error",message:e.message}));if(skip){fire(a==="always");return}openConfirm(dialog,{title:"Reload MCP servers?",body:"Rebuilds the MCP tool set. Invalidates the prompt cache, so the next message re-sends full input tokens.",yes:"reload",danger:!0}).then((ok)=>{if(ok)fire(!1)});return}case"reload":gw.request("reload.env",{}).then((r)=>{let n=Number(r.updated??0);toast.show({variant:"success",message:`Reloaded .env (${n} var${n===1?"":"s"} updated) \xB7 /new to apply`})}).catch((e)=>toast.show({variant:"error",message:e.message}));return;case"reload-skills":gw.request("skills.reload",{}).then((r)=>{x2.dispatch({kind:"system",text:r.output});let n=Number(r.result?.total??0);toast.show({variant:"success",message:`Skills reloaded (${n} available)`})}).catch((e)=>toast.show({variant:"error",message:e.message}));return;case"save":gw.request("session.save").then((r)=>toast.show({variant:"success",message:`Saved \u2192 ${r.file}`})).catch((e)=>toast.show({variant:"error",message:e.message}));return}if(c2.target!=="gateway")return;if(!x2.capabilities.canDispatchGatewayCommand){let msg=x2.capabilities.contractMessage;if(!msg)return;let text6=`${msg} Blocked slash.exec.`;x2.dispatch({kind:"system",text:`error: ${text6}`}),toast.show({variant:"error",message:text6});return}let jump=TAB_SLASH[c2.name];if(jump!==void 0&&!arg){x2.goTo(jump.tab,jump.sub);return}let full=`/${c2.name}${arg?" "+arg:""}`;if(x2.turnRef.current.streaming){x2.setQueue((q5)=>[...q5,full]);return}x2.dispatch({kind:"user",text:full}),gw.request("slash.exec",{command:full}).then((res)=>{if(res?.warning)x2.dispatch({kind:"system",text:`\u26A0 ${res.warning}`});if(res?.output)x2.dispatch({kind:"system",text:res.output})}).catch(()=>{gw.request("command.dispatch",{name:c2.name,arg}).then((d2)=>{if(d2.notice)x2.dispatch({kind:"system",text:d2.notice});if(d2.type==="exec"||d2.type==="plugin")return x2.dispatch({kind:"system",text:d2.output||"(no output)"});if(d2.type==="alias"&&d2.target)return void x2.sendRef.current(`/${d2.target}${arg?" "+arg:""}`);if((d2.type==="skill"||d2.type==="send")&&d2.message){if(d2.type==="skill")x2.dispatch({kind:"system",text:`\u26A1 loading skill: ${d2.name??c2.name}`});return void x2.sendRef.current(d2.message)}x2.dispatch({kind:"system",text:`/${c2.name}: unknown`})}).catch((e)=>x2.dispatch({kind:"system",text:`error: ${e.message}`}))})},[gw,dialog,toast,themeCtx,renderer,destructive,applyTitle,runCompress,branch3]);return import_react140.useEffect(()=>cmd.register([{title:"Help",value:"help",action:"help.open",category:"General",onSelect:()=>dialog.replace($jsx(HelpDialog,{}))},{title:"Keybindings",value:"keys",description:"View & rebind shortcuts",category:"General",onSelect:()=>openKeys(dialog)},{title:"Gateway Logs",value:"logs",description:"Show gateway stderr",category:"General",onSelect:()=>openLogs(dialog)},{title:"Switch Theme",value:"theme",action:"theme.pick",category:"General",onSelect:()=>openThemePicker(dialog,themeCtx)},{title:"Switch Model",value:"model",action:"model.pick",category:"General",onSelect:()=>openModelPicker(dialog,gw)},{title:"Pick Avatar",value:"eikon",description:"Choose sidebar .eikon avatar",category:"General",onSelect:()=>pickEikon()},{title:"Rollback",value:"rollback",description:"Browse & restore checkpoints",category:"Session",onSelect:()=>openRollback(dialog,gw,toast)},{title:"History",value:"history",action:"session.timeline",category:"Session",onSelect:()=>openHistory(dialog,gw)},{title:"Status",value:"status",action:"status.open",category:"Info",onSelect:()=>openStatus(dialog,ctx2.current.info,ctx2.current.sid)},{title:"Usage",value:"usage",description:"Tokens \xB7 context \xB7 cost",category:"Info",onSelect:()=>openUsage(dialog,gw)},{title:"Profile",value:"profile",description:"Active profile details",category:"Info",onSelect:()=>openProfile(dialog)},{title:"New Session",value:"new-session",action:"session.new",category:"Session",onSelect:()=>destructive("",{title:"Start a new session?",body:"Ends the current session and starts a fresh one. The existing session remains saved and resumable.",yes:"new session"},()=>{ctx2.current.newSession()})},{title:"Compress Session",value:"compress",action:"session.compress",category:"Session",onSelect:()=>runCompress()},{title:"Undo Last Turn",value:"undo",description:"Pop last user+assistant pair",category:"Session",onSelect:()=>run({name:"undo",target:"local"})},{title:"Redo",value:"redo",action:"session.redo",category:"Session",onSelect:()=>run({name:"redo",target:"local"})},{title:"Branch Session",value:"branch",description:"Fork the current conversation",category:"Session",onSelect:()=>branch3()}]),[cmd,dialog,themeCtx,gw,toast,destructive,pickEikon,runCompress,branch3,run]),run}var import_react142=__toESM(require_react_production(),1);init_perf();function variant(level2){switch(level2){case"error":return"error";case"warning":case"warn":return"warning";case"success":return"success";default:return"info"}}function duration2(p){if(p.kind==="sticky")return null;if(typeof p.ttl_ms==="number")return p.ttl_ms;if(typeof p.duration_ms==="number")return p.duration_ms;return}function showNotification(toast,p){let text6=String(p?.text??"").trim();if(!text6)return;toast.show({key:p?.key,variant:variant(p?.level),message:text6,duration:duration2(p??{text:text6})})}function clearNotification(toast,p){let key5=String(p?.key??"").trim();if(!key5)return;toast.clear(key5)}function count3(o){return o?Object.values(o).reduce((n,v2)=>n+v2.length,0):0}function reference(label3,text6,index4,count4){let head=index4&&count4?`\u25C7 Reference ${index4}/${count4} \u2014 ${label3}`:`\u25C7 Reference \u2014 ${label3}`,body2=text6.trim();return body2?`${head}
|
|
4209
4209
|
${body2}`:head}function formatProcessNotification(text6){let body2=text6.replace(/^\[IMPORTANT: /,"").replace(/\]$/,""),done2=body2.match(/^Background process (\S+) completed \(exit code (\S+)\)\.\nCommand: (.+?)(?:\n|$)/);if(done2)return`${done2[1]} exited ${done2[2]} \xB7 ${done2[3]}`;let hit2=body2.match(/^Background process (\S+) matched watch pattern "([^"]+)"\.\nCommand: (.+?)(?:\n|$)/);if(hit2)return`${hit2[1]} matched "${hit2[2]}" \xB7 ${hit2[3]}`;return body2.slice(0,100)}function mapEvent(ev,side){switch(ev.type){case"gateway.ready":if(side.onReady?.(),ev.payload?.skin)side.onSkin?.(ev.payload.skin);return null;case"session.info":{let si=ev.payload;side.onSessionInfo?.(si);let label3=si.model?`Connected \u2014 ${si.model} \xB7 ${count3(si.tools)} tools \xB7 ${count3(si.skills)} skills`:"Connected to Hermes";if(si.credential_warning)side.onStatus?.(si.credential_warning);return{kind:"system",text:label3}}case"session.title":return side.onSessionTitle?.(ev.payload.session_id,ev.payload.title),null;case"message.start":return count("stream:start"),mem("stream-start"),{kind:"message.start"};case"message.delta":{let chunk=ev.payload?.text??"";if(!chunk)return null;return count("stream:chunk"),{kind:"message.delta",chunk}}case"message.complete":{count("stream:done"),mem("stream-done");let p=ev.payload;if(p?.usage)side.onUsage?.(p.usage);if(side.onTurnComplete?.(),p?.status==="error")return{kind:"error",text:p.text||"request failed \u2014 see messages above"};if(p?.status==="interrupted")return{kind:"message.complete",text:(p.text||"")+`
|
|
4210
4210
|
|
|
4211
|
-
*[interrupted]*`,usage:p?.usage};return{kind:"message.complete",text:p?.text??void 0,usage:p?.usage}}case"tool.start":return{kind:"tool.start",id:ev.payload.tool_id,name:ev.payload.name??"unknown",preview:ev.payload.context,args:ev.payload.args_text};case"tool.progress":return{kind:"tool.progress",name:ev.payload.name,preview:ev.payload.preview};case"tool.generating":return{kind:"tool.generating",name:ev.payload.name};case"tool.complete":return{kind:"tool.complete",id:ev.payload.tool_id,summary:ev.payload.summary,error:ev.payload.error,inline_diff:ev.payload.inline_diff,duration:typeof ev.payload.duration_s==="number"?ev.payload.duration_s*1000:void 0,result:ev.payload.result_text};case"thinking.delta":return side.onStatus?.(ev.payload?.text??""),null;case"reasoning.delta":case"reasoning.available":{let text6=ev.payload?.text;if(!text6)return null;return{kind:"thinking",text:text6,final:ev.type==="reasoning.available",verbose:ev.payload?.verbose}}case"moa.reference":return{kind:"reference",text:reference(ev.payload?.label??"reference",ev.payload?.text??"",ev.payload?.index,ev.payload?.count)};case"moa.aggregating":{let agg=ev.payload?.aggregator;return side.onStatus?.(agg?`aggregating with ${agg}\u2026`:"aggregating\u2026"),null}case"subagent.start":case"subagent.thinking":case"subagent.tool":case"subagent.progress":case"subagent.complete":{let sub3=ev.type.slice(9);return record(sub3,ev.payload),{kind:"subagent",event:sub3,payload:ev.payload}}case"error":return{kind:"error",text:ev.payload?.message??"Unknown error"};case"clarify.request":return{kind:"prompt",id:ev.payload.request_id,req:{variant:"clarify",...ev.payload}};case"approval.request":{let req={variant:"approval",...ev.payload},fallback2={kind:"prompt",id:`approval-${pid()}`,req};if(shouldRemember(req))return side.onApprovalRemembered?.(fallback2),null;return fallback2}case"sudo.request":return{kind:"prompt",id:ev.payload.request_id,req:{variant:"sudo",...ev.payload}};case"secret.request":return{kind:"prompt",id:ev.payload.request_id,req:{variant:"secret",...ev.payload}};case"background.complete":return side.onBackground?.(ev.payload.task_id,ev.payload.text),null;case"review.summary":{let text6=String(ev.payload?.text??"").trim();if(!text6)return null;return{kind:"system",text:text6}}case"btw.complete":return side.onBtw?.(ev.payload.text),null;case"gateway.stderr":{let line4=ev.payload.line;if(/error|fail|traceback|exception|\b[45]\d\d\b|refused|denied|unauthori/i.test(line4))return{kind:"error",text:line4,fatal:!1};return null}case"skin.changed":return side.onSkin?.(ev.payload),null;case"gateway.start_timeout":return{kind:"error",text:`gateway startup timed out (${ev.payload?.python??"python"} @ ${ev.payload?.cwd??"?"})`};case"gateway.protocol_error":return{kind:"system",text:`protocol error: ${ev.payload?.preview??"?"}`};case"browser.progress":{let text6=ev.payload?.message??"";if(!text6)return null;return ev.payload?.level==="error"?{kind:"error",text:text6}:{kind:"system",text:`\xB7 ${text6}`}}case"status.update":{let kind2=ev.payload?.kind,text6=ev.payload?.text??"";if(kind2==="process")return side.onStatus?.(formatProcessNotification(text6)),null;if(side.onStatus?.(text6),!kind2||kind2==="status")return null;return{kind:"system",text:text6}}case"notification.show":if(side.notices)showNotification(side.notices,ev.payload);return null;case"notification.clear":if(side.notices)clearNotification(side.notices,ev.payload);return null;case"voice.status":{let state3=String(ev.payload?.state??"");return side.onVoiceStatus?.(state3),null}case"voice.transcript":{if(ev.payload?.no_speech_limit===!0)return side.onVoiceTranscript?.("",!0),null;let text6=String(ev.payload?.text??"").trim();if(!text6)return null;return side.onVoiceTranscript?.(text6,!1),null}}return null}var STREAM_EVENTS=new Set(["message.start","message.delta","reasoning.delta","reasoning.available","thinking.delta","moa.reference","moa.aggregating","tool.start","tool.progress","tool.generating"]),TITLE_DELAYS=[1200,5000,15000,30000];function useStream(c){let gw=useGateway(),dialog=useDialog(),toast=useToast(),bg2=useBackground(),ctx2=import_react142.useRef(c);ctx2.current=c;let timers=import_react142.useRef([]);import_react142.useEffect(()=>()=>{timers.current.forEach(clearTimeout),timers.current=[]},[]);let interrupted=import_react142.useRef(!1),info3=import_react142.useRef(!1),deltas=import_react142.useRef({text:"",think:"",timer:null}),store=import_react142.useCallback((key5,id)=>{let sid2=key5??id;if(!sid2)return;ctx2.current.setDurable(sid2),ctx2.current.launchRef.current={mode:"resume",sid:sid2,splash:!1},set("lastSessionId",sid2)},[]),flush2=import_react142.useCallback(()=>{let d2=deltas.current;if(d2.timer)clearTimeout(d2.timer),d2.timer=null;if(d2.think)ctx2.current.dispatch({kind:"thinking",text:d2.think,final:!1}),d2.think="";if(d2.text)ctx2.current.dispatch({kind:"message.delta",chunk:d2.text}),d2.text=""},[]),sync=import_react142.useCallback((ms2=0)=>{let sid2=ctx2.current.sidRef.current;if(!sid2)return;let run=()=>gw.request("session.title",{session_id:sid2}).then((r)=>{if(ctx2.current.sidRef.current!==sid2)return;ctx2.current.setTitle(r.title??""),store(r.session_key)}).catch(()=>{});if(ms2<=0)return run();let id=setTimeout(()=>{timers.current=timers.current.filter((t2)=>t2!==id),run()},ms2);timers.current.push(id)},[gw]),retitle=import_react142.useCallback((sid2,title)=>{if(!sid2||title===void 0)return;if(sid2===ctx2.current.sidRef.current)ctx2.current.setTitle(title);home3.update("recentSessions",(rows3)=>rows3.map((r)=>r.id===sid2?{...r,title}:r))},[]),handle=import_react142.useCallback((ev)=>{let x2=ctx2.current;if(ev.type==="gateway.ready")info3.current=!1;if(ev.type==="message.start")x2.start();if(ev.type==="background.complete"&&ev.session_id&&x2.sidRef.current&&ev.session_id!==x2.sidRef.current){bg2.unregister(ev.payload.task_id);return}let shared=ev.type==="background.complete"&&!ev.session_id;if(ev.session_id&&x2.sidRef.current&&ev.session_id!==x2.sidRef.current&&!ev.type.startsWith("gateway.")&&!shared)return;if(interrupted.current){if(STREAM_EVENTS.has(ev.type))return;if(ev.type==="status.update"&&ev.payload?.kind==="lifecycle")return}let action=mapEvent(ev,{onReady:()=>{x2.session.boot(x2.launchRef.current).then((r)=>{if(x2.setSid(r.id),store(r.key,r.id),r.info)x2.setInfo(r.info),x2.setUsage(r.info.usage);if(x2.sessionStart.current=Date.now(),r.messages.length)x2.dispatch({kind:"load",messages:r.messages});if(r.note)toast.show({variant:"info",message:r.note})}).catch((err)=>{let msg=err instanceof Error?err.message:String(err);x2.setReady(!1),x2.setStarting(!1),x2.setStatus(`session boot failed: ${msg}`),x2.setErrorPulse(!0),x2.dispatch({kind:"system",text:`Failed to start session: ${msg}`})})},onSessionInfo:(si)=>{if(x2.setInfo(si),si.usage)x2.setUsage(si.usage);if(x2.setReady(!0),si.running===!1)x2.start(),x2.setStarting(!1),x2.setStatus("");if(si.session_id)x2.setSid(si.session_id);if(si.stored_session_id)store(si.stored_session_id,si.session_id??ev.session_id);if(x2.settle(),si.title!==void 0)x2.setTitle(si.title);let bad=(si.mcp_servers??[]).filter((s)=>!s.connected);if(bad.length)x2.dispatch({kind:"system",text:`MCP: ${bad.length} server(s) failed to connect \u2014 ${bad.map((s)=>s.name+(s.error?` (${s.error})`:"")).join(", ")}`});gw.request("config.get",{key:"busy"}).then((r)=>{let m2=r.value;if(m2==="queue"||m2==="steer"||m2==="interrupt")x2.setBusy(m2)}).catch(()=>{})},onUsage:(u3)=>x2.setUsage(u3),onTurnComplete:()=>{x2.setStarting(!1),x2.setStatus(""),flush(gw,x2.sidRef.current),x2.goalHook.check(x2.sidRef.current),TITLE_DELAYS.forEach(sync)},onBackground:(tid,text6)=>{let title=bg2.label(tid);bg2.unregister(tid),x2.dispatch({kind:"background",id:tid,title,text:text6})},onBtw:(text6)=>{let head=text6.split(`
|
|
4211
|
+
*[interrupted]*`,usage:p?.usage};return{kind:"message.complete",text:p?.text??void 0,usage:p?.usage}}case"tool.start":return{kind:"tool.start",id:ev.payload.tool_id,name:ev.payload.name??"unknown",preview:ev.payload.context,args:ev.payload.args_text};case"tool.progress":return{kind:"tool.progress",name:ev.payload.name,preview:ev.payload.preview};case"tool.generating":return{kind:"tool.generating",name:ev.payload.name};case"tool.complete":return{kind:"tool.complete",id:ev.payload.tool_id,summary:ev.payload.summary,error:ev.payload.error,inline_diff:ev.payload.inline_diff,duration:typeof ev.payload.duration_s==="number"?ev.payload.duration_s*1000:void 0,result:ev.payload.result_text};case"thinking.delta":return side.onStatus?.(ev.payload?.text??""),null;case"reasoning.delta":case"reasoning.available":{let text6=ev.payload?.text;if(!text6)return null;return{kind:"thinking",text:text6,final:ev.type==="reasoning.available",verbose:ev.payload?.verbose}}case"moa.reference":return{kind:"reference",text:reference(ev.payload?.label??"reference",ev.payload?.text??"",ev.payload?.index,ev.payload?.count)};case"moa.aggregating":{let agg=ev.payload?.aggregator;return side.onStatus?.(agg?`aggregating with ${agg}\u2026`:"aggregating\u2026"),null}case"subagent.start":case"subagent.thinking":case"subagent.tool":case"subagent.progress":case"subagent.complete":{let sub3=ev.type.slice(9);return record(sub3,ev.payload),{kind:"subagent",event:sub3,payload:ev.payload}}case"error":return{kind:"error",text:ev.payload?.message??"Unknown error"};case"clarify.request":return{kind:"prompt",id:ev.payload.request_id,req:{variant:"clarify",...ev.payload}};case"approval.request":{let req={variant:"approval",...ev.payload},fallback2={kind:"prompt",id:`approval-${pid()}`,req};if(shouldRemember(req))return side.onApprovalRemembered?.(fallback2),null;return fallback2}case"sudo.request":return{kind:"prompt",id:ev.payload.request_id,req:{variant:"sudo",...ev.payload}};case"secret.request":return{kind:"prompt",id:ev.payload.request_id,req:{variant:"secret",...ev.payload}};case"background.complete":return side.onBackground?.(ev.payload.task_id,ev.payload.text),null;case"review.summary":{let text6=String(ev.payload?.text??"").trim();if(!text6)return null;return{kind:"system",text:text6}}case"btw.complete":return side.onBtw?.(ev.payload.text),null;case"gateway.stderr":{let line4=ev.payload.line;if(/error|fail|traceback|exception|\b[45]\d\d\b|refused|denied|unauthori/i.test(line4))return{kind:"error",text:line4,fatal:!1};return null}case"skin.changed":return side.onSkin?.(ev.payload),null;case"gateway.start_timeout":return{kind:"error",text:`gateway startup timed out (${ev.payload?.python??"python"} @ ${ev.payload?.cwd??"?"})`};case"gateway.protocol_error":return{kind:"system",text:`protocol error: ${ev.payload?.preview??"?"}`};case"browser.progress":{let text6=ev.payload?.message??"";if(!text6)return null;return ev.payload?.level==="error"?{kind:"error",text:text6}:{kind:"system",text:`\xB7 ${text6}`}}case"status.update":{let kind2=ev.payload?.kind,text6=ev.payload?.text??"";if(kind2==="process")return side.onStatus?.(formatProcessNotification(text6)),null;if(side.onStatus?.(text6),!kind2||kind2==="status")return null;return{kind:"system",text:text6}}case"notification.show":if(side.notices)showNotification(side.notices,ev.payload);return null;case"notification.clear":if(side.notices)clearNotification(side.notices,ev.payload);return null;case"voice.status":{let state3=String(ev.payload?.state??"");return side.onVoiceStatus?.(state3),null}case"voice.transcript":{if(ev.payload?.no_speech_limit===!0)return side.onVoiceTranscript?.("",!0),null;let text6=String(ev.payload?.text??"").trim();if(!text6)return null;return side.onVoiceTranscript?.(text6,!1),null}}return null}var STREAM_EVENTS=new Set(["message.start","message.delta","reasoning.delta","reasoning.available","thinking.delta","moa.reference","moa.aggregating","tool.start","tool.progress","tool.generating"]),TITLE_DELAYS=[1200,5000,15000,30000];function useStream(c){let gw=useGateway(),dialog=useDialog(),toast=useToast(),bg2=useBackground(),ctx2=import_react142.useRef(c);ctx2.current=c;let timers=import_react142.useRef([]);import_react142.useEffect(()=>()=>{timers.current.forEach(clearTimeout),timers.current=[]},[]);let interrupted=import_react142.useRef(!1),info3=import_react142.useRef(!1),deltas=import_react142.useRef({text:"",think:"",timer:null}),store=import_react142.useCallback((key5,id)=>{let sid2=key5??id;if(!sid2)return;ctx2.current.setDurable(sid2),ctx2.current.launchRef.current={mode:"resume",sid:sid2,splash:!1},set("lastSessionId",sid2)},[]),flush2=import_react142.useCallback(()=>{let d2=deltas.current;if(d2.timer)clearTimeout(d2.timer),d2.timer=null;if(d2.think)ctx2.current.dispatch({kind:"thinking",text:d2.think,final:!1}),d2.think="";if(d2.text)ctx2.current.dispatch({kind:"message.delta",chunk:d2.text}),d2.text=""},[]),sync=import_react142.useCallback((ms2=0)=>{let sid2=ctx2.current.sidRef.current;if(!sid2)return;let run=()=>gw.request("session.title",{session_id:sid2}).then((r)=>{if(ctx2.current.sidRef.current!==sid2)return;ctx2.current.setTitle(r.title??""),store(r.session_key)}).catch(()=>{});if(ms2<=0)return run();let id=setTimeout(()=>{timers.current=timers.current.filter((t2)=>t2!==id),run()},ms2);timers.current.push(id)},[gw]),retitle=import_react142.useCallback((sid2,title)=>{if(!sid2||title===void 0)return;if(sid2===ctx2.current.sidRef.current)ctx2.current.setTitle(title);home3.update("recentSessions",(rows3)=>rows3.map((r)=>r.id===sid2?{...r,title}:r))},[]),handle=import_react142.useCallback((ev)=>{let x2=ctx2.current;if(ev.type==="gateway.ready")info3.current=!1;if(ev.type==="message.start")x2.start();if(ev.type==="background.complete"&&ev.session_id&&x2.sidRef.current&&ev.session_id!==x2.sidRef.current){bg2.unregister(ev.payload.task_id);return}let shared=ev.type==="background.complete"&&!ev.session_id;if(ev.session_id&&x2.sidRef.current&&ev.session_id!==x2.sidRef.current&&!ev.type.startsWith("gateway.")&&!shared)return;if(interrupted.current){if(STREAM_EVENTS.has(ev.type))return;if(ev.type==="status.update"&&ev.payload?.kind==="lifecycle")return}let action=mapEvent(ev,{onReady:()=>{x2.session.boot(x2.launchRef.current).then((r)=>{if(x2.setSid(r.id),store(r.key,r.id),r.info)x2.setInfo(r.info),x2.setUsage(r.info.usage);if(x2.sessionStart.current=Date.now(),r.messages.length)x2.dispatch({kind:"load",messages:r.messages});if(r.note)toast.show({variant:"info",message:r.note})}).catch((err)=>{let msg=err instanceof Error?err.message:String(err);gw.setSession(""),x2.setSid(""),x2.setReady(!1),x2.setStarting(!1),x2.setSplash(!1),x2.setStatus(`session boot failed: ${msg}`),x2.setErrorPulse(!0),x2.dispatch({kind:"system",text:`Failed to start session: ${msg}`})})},onSessionInfo:(si)=>{if(x2.setInfo(si),si.usage)x2.setUsage(si.usage);if(x2.setReady(!0),si.running===!1)x2.start(),x2.setStarting(!1),x2.setStatus("");if(si.session_id)x2.setSid(si.session_id);if(si.stored_session_id)store(si.stored_session_id,si.session_id??ev.session_id);if(x2.settle(),si.title!==void 0)x2.setTitle(si.title);let bad=(si.mcp_servers??[]).filter((s)=>!s.connected);if(bad.length)x2.dispatch({kind:"system",text:`MCP: ${bad.length} server(s) failed to connect \u2014 ${bad.map((s)=>s.name+(s.error?` (${s.error})`:"")).join(", ")}`});gw.request("config.get",{key:"busy"}).then((r)=>{let m2=r.value;if(m2==="queue"||m2==="steer"||m2==="interrupt")x2.setBusy(m2)}).catch(()=>{})},onUsage:(u3)=>x2.setUsage(u3),onTurnComplete:()=>{x2.setStarting(!1),x2.setStatus(""),flush(gw,x2.sidRef.current),x2.goalHook.check(x2.sidRef.current),TITLE_DELAYS.forEach(sync)},onBackground:(tid,text6)=>{let title=bg2.label(tid);bg2.unregister(tid),x2.dispatch({kind:"background",id:tid,title,text:text6})},onBtw:(text6)=>{let head=text6.split(`
|
|
4212
4212
|
`)[0].slice(0,80);x2.dispatch({kind:"system",text:`\u25C8 btw \u2014 ${head}`}),toast.show({variant:"info",title:"btw",message:head,duration:8000,action:{label:"view",run:()=>openAlert(dialog,"btw",text6)}})},onStatus:(text6)=>x2.setStatus(text6),onSessionTitle:retitle,onApprovalRemembered:(fallback2)=>{let sid2=x2.sidRef.current;gw.request("approval.respond",{choice:"always"}).catch((err)=>{if(ctx2.current.sidRef.current!==sid2)return;x2.dispatch(fallback2),toast.show({variant:"error",message:err.message})})},onSkin:(s)=>x2.setSkin(deriveSkin(s)),onVoiceStatus:x2.onVoiceStatus,onVoiceTranscript:x2.onVoiceTranscript,notices:toast});if(!action)return;if(ev.type==="session.info"){if(info3.current)return;info3.current=!0}let d2=deltas.current;if(action.kind==="message.delta"){if(d2.think)flush2();d2.text+=action.chunk,d2.timer??=setTimeout(flush2,16);return}if(action.kind==="thinking"&&!action.final){if(d2.text)flush2();d2.think+=action.text,d2.timer??=setTimeout(flush2,16);return}if(flush2(),action.kind==="message.start")x2.setStarting(!1),x2.setStatus("");if(action.kind==="error")x2.setStarting(!1);if(action.kind==="error")x2.setErrorPulse(!0);x2.dispatch(action)},[gw,dialog,toast,flush2,bg2,retitle]);useGatewayEvent(handle);let doInterrupt=import_react142.useCallback(()=>{interrupted.current=!0;let d2=deltas.current;if(d2.timer)clearTimeout(d2.timer),d2.timer=null;d2.text="",d2.think="",ctx2.current.session.interrupt().catch((err)=>{interrupted.current=!1,toast.show({variant:"error",message:err.message})})},[toast]);return{interrupted,doInterrupt}}var import_react148=__toESM(require_react_production(),1);init_perf();var PORT=Number(process.env.CONTROL_PORT)||7777,BIND=process.env.CONTROL_BIND||"127.0.0.1",enabled2=process.env.CONTROL==="1",LOOPBACK=new Set(["127.0.0.1","::1","localhost"]);function isLoopback(host){return LOOPBACK.has(host)}function warningFor(on,bind,port2){if(!on)return null;if(isLoopback(bind))return null;return{host:bind,port:port2,message:`CONTROL server bound to ${bind}:${port2} \u2014 reachable from the network. Set CONTROL_BIND=127.0.0.1 to restrict to loopback.`}}function warning(){return warningFor(enabled2,BIND,PORT)}var TAB_NAMES=TABS.map((t2)=>t2.name),bridge=null,pendingTab=null,pendingSend=!1;function setBridge(b2){bridge=b2}function currentTab(){if(pendingTab!==null)return pendingTab;return bridge?.tab()??0}var json2=(data2,status2=200)=>new Response(JSON.stringify(data2),{status:status2,headers:{"Content-Type":"application/json"}}),idx=(name)=>{let n=TAB_NAMES.indexOf(name);if(n<0)throw Error(`control.ts DANGEROUS: tab '${name}' missing from TAB_NAMES`);return n},DANGEROUS={[idx("Chat")]:new Set(["return"]),[idx("Sessions")]:new Set(["d","delete","return"]),[idx("Profiles & Automation")]:new Set(["return","space","d","delete","k"]),[idx("Config")]:new Set(["space","return","h","l","]","[","ctrl+s","d","delete"]),[idx("Eikon")]:new Set(["return","n","d","delete","s","u","ctrl+s","ctrl+u"])};function isDangerous(tab,keyName2,ctrl){let set3=DANGEROUS[tab];if(!set3)return!1;let id=ctrl?`ctrl+${keyName2}`:keyName2;return set3.has(id)}function makeKey(opts){return{name:opts.name,ctrl:opts.ctrl??!1,meta:opts.meta??!1,shift:opts.shift??!1,option:!1,sequence:opts.raw??opts.name,number:!1,raw:opts.raw??opts.name,eventType:"press",source:"raw"}}function injectKey(renderer,key5){let r=renderer;if(!r?.keyInput?.processParsedKey)return!1;return r.keyInput.processParsedKey(key5)}function getNodeChildren(n){if(n.getChildren)return n.getChildren();if(n._childrenInLayoutOrder)return[...n._childrenInLayoutOrder];return[]}function getNodeType(n){return n._type||n.tagName||n.constructor?.name||"unknown"}function buildFocusTree(node,depth=0){if(!node||typeof node!=="object")return null;let n=node,type=getNodeType(n),focused=n.focused??!1,focusable=n.focusable??!1,children2=[];if(depth<20)for(let child of getNodeChildren(n)){let c=buildFocusTree(child,depth+1);if(c)children2.push(c)}if(!(focusable||children2.some((c)=>c.focusable||c.focused||c.children.length>0))&&!focused&&depth>0)return null;let text6=n.value||n.textContent||n.text||void 0;return{type,focused,focusable,children:children2,text:text6}}function findFocused(node){if(!node||typeof node!=="object")return null;let n=node;if(n.focused)return getNodeType(n);for(let child of getNodeChildren(n)){let found2=findFocused(child);if(found2)return found2}return null}function countNodes(node){let result={total:0,focusable:0,focused:0};function walk2(n){if(!n||typeof n!=="object")return;let nd=n;if(result.total++,nd.focusable)result.focusable++;if(nd.focused)result.focused++;for(let child of getNodeChildren(nd))walk2(child)}return walk2(node),result}async function handle(req){let url2=new URL(req.url),path4=url2.pathname;if(!bridge)return json2({error:"bridge not ready"},503);if(path4==="/status"){let m2=process.memoryUsage(),tab=currentTab();return pendingTab=null,json2({tab,tabName:TAB_NAMES[tab]??"unknown",ready:bridge.ready(),streaming:bridge.streaming(),messages:bridge.messages(),session:bridge.session(),input:bridge.input(),focusRegion:bridge.focusRegion(),rss:Math.round(m2.rss/1024/1024),heap:Math.round(m2.heapUsed/1024/1024)})}let tabMatch=path4.match(/^\/tab\/(\d+)$/);if(tabMatch){let n=Number(tabMatch[1]);if(n<0||n>TAB_MAX)return json2({error:`tab 0-${TAB_MAX}`},400);let renderer=bridge.renderer();if(renderer){let cur=bridge.tab(),diff=n-cur,key5=makeKey({name:diff>0?"right":"left",meta:!0});for(let i=Math.abs(diff);i>0;i--)injectKey(renderer,key5)}else bridge.setTab(n);return pendingTab=n,json2({tab:n,tabName:TAB_NAMES[n]})}if(path4==="/send"&&req.method==="POST"){let body2=await req.json();if(!body2.message)return json2({error:"message required"},400);if(!bridge.ready())return json2({error:"not connected"},503);if(bridge.streaming())return json2({error:"already streaming"},409);if(pendingSend)return json2({error:"send already pending"},409);pendingSend=!0;try{await bridge.send(body2.message)}catch(err){return json2({error:err instanceof Error?err.message:String(err)},502)}finally{pendingSend=!1}return json2({sent:!0,message:body2.message})}if(path4==="/key"&&req.method==="POST"){let body2=await req.json();if(!body2.name)return json2({error:"name required"},400);let renderer=bridge.renderer();if(!renderer)return json2({error:"renderer not available"},503);let safe2=body2.safe!==!1,tab=currentTab();if(safe2&&isDangerous(tab,body2.name,!!body2.ctrl))return json2({error:"blocked",reason:`Key "${body2.ctrl?"ctrl+":""}${body2.name}" is dangerous on tab ${TAB_NAMES[tab]} (index ${tab}). Pass safe=false to override.`,tab,tabName:TAB_NAMES[tab]},403);let key5=makeKey({name:body2.name,ctrl:body2.ctrl,shift:body2.shift,meta:body2.meta,raw:body2.raw??(body2.name.length===1?body2.name:"")}),handled=injectKey(renderer,key5);return json2({injected:!0,handled,key:body2.name,tab,tabName:TAB_NAMES[tab]})}if(path4==="/keys"&&req.method==="POST"){let body2=await req.json();if(!body2.keys?.length)return json2({error:"keys array required"},400);let renderer=bridge.renderer();if(!renderer)return json2({error:"renderer not available"},503);let safe2=body2.safe!==!1,tab=currentTab(),delay=body2.delay??0,results=[];for(let k2 of body2.keys){if(safe2&&isDangerous(currentTab(),k2.name,!!k2.ctrl)){results.push({key:k2.name,injected:!1,handled:!1,blocked:!0});continue}let key5=makeKey({name:k2.name,ctrl:k2.ctrl,shift:k2.shift,meta:k2.meta,raw:k2.raw??(k2.name.length===1?k2.name:"")}),handled=injectKey(renderer,key5);if(results.push({key:k2.name,injected:!0,handled}),delay>0)await new Promise((r)=>setTimeout(r,delay))}return json2({results,tab,tabName:TAB_NAMES[tab]})}if(path4==="/type"&&req.method==="POST"){let body2=await req.json();if(!body2.text)return json2({error:"text required"},400);let renderer=bridge.renderer();if(!renderer)return json2({error:"renderer not available"},503);let safe2=body2.safe!==!1,tab=currentTab(),delay=body2.delay??0,count4=0;for(let ch of body2.text){if(safe2&&isDangerous(tab,ch,!1))continue;let key5=makeKey({name:ch,raw:ch});if(injectKey(renderer,key5),count4++,delay>0)await new Promise((r)=>setTimeout(r,delay))}return json2({typed:count4,total:body2.text.length,tab,tabName:TAB_NAMES[tab]})}if(path4==="/input"&&req.method==="POST"){let body2=await req.json();return bridge.setInput(body2.text??""),json2({ok:!0,text:body2.text??""})}if(path4==="/quit"){let renderer=bridge.renderer();try{renderer?.setTerminalTitle?.("")}catch{}return setTimeout(()=>process.exit(0),10),json2({ok:!0})}if(path4==="/focus"){let r=bridge.renderer();if(!r?.root)return json2({error:"no renderer root"},503);let counts=countNodes(r.root),tree3=buildFocusTree(r.root),focused=findFocused(r.root),currentFocus=r.currentFocusedRenderable?getNodeType(r.currentFocusedRenderable):null;return json2({focused,currentFocus,counts,tree:tree3})}if(path4==="/frame"){let r=bridge.renderer();if(!r?.currentRenderBuffer)return json2({error:"no render buffer"},503);let frame2=new TextDecoder().decode(r.currentRenderBuffer.getRealCharBytes(!0)),grep=url2.searchParams.get("grep"),body2=grep?frame2.split(`
|
|
4213
4213
|
`).filter((l)=>l.includes(grep)).join(`
|
|
4214
4214
|
`):frame2;if(url2.searchParams.get("json")==="1")return json2({frame:body2,match:grep?frame2.includes(grep):void 0,lines:frame2.split(`
|
|
@@ -4222,22 +4222,22 @@ ${body2}`:head}function formatProcessNotification(text6){let body2=text6.replace
|
|
|
4222
4222
|
`,"utf-8");return Object.fromEntries(kept.map((e)=>[e.path,e]))}function ensure2(){return data2??=load6()}function score2(p){let e=ensure2()[p];if(!e)return 0;let days=(Date.now()-e.at)/86400000;return e.n/(1+days)}function bump2(p){let d2=ensure2(),prev=d2[p],e={path:p,n:(prev?.n??0)+1,at:Date.now()};if(d2[p]=e,mkdirSync8(configDir(),{recursive:!0}),appendFileSync(file3(),JSON.stringify(e)+`
|
|
4223
4223
|
`,"utf-8"),Object.keys(d2).length>MAX2){let kept=Object.values(d2).sort((a,b2)=>b2.at-a.at).slice(0,MAX2);data2=Object.fromEntries(kept.map((x2)=>[x2.path,x2])),writeFileSync10(file3(),kept.map((x2)=>JSON.stringify(x2)).join(`
|
|
4224
4224
|
`)+`
|
|
4225
|
-
`,"utf-8")}}function _reset(){data2=null}var KEYWORDS=[{text:"@diff",display:"@diff",meta:"working-tree diff"},{text:"@staged",display:"@staged",meta:"staged changes"},{text:"@git:1",display:"@git:1",meta:"last 1 commit"},{text:"@git:3",display:"@git:3",meta:"last 3 commits"},{text:"@git:5",display:"@git:5",meta:"last 5 commits"},{text:"@url:",display:"@url:<\u2026>",meta:"fetch a URL"},{text:"@folder:",display:"@folder:<path>",meta:"recurse directory"}];function match3(word){let q5=word.toLowerCase();return KEYWORDS.filter((k2)=>k2.text.toLowerCase().startsWith(q5)&&k2.text!==word)}function atWordAt(input,cursor=input.length){if(input.startsWith("/"))return null;let i=cursor;while(i>0&&!/\s/.test(input[i-1]))i--;if(input[i]!=="@")return null;let j2=cursor;while(j2<input.length&&!/\s/.test(input[j2]))j2++;return{word:input.slice(i,j2),start:i}}function useAtRefPopover(input,cursor){let gw=useGateway(),ready=useGatewayReady(),[items,setItems]=import_react151.useState([]),[sel,setCursor]=import_react151.useState(0),seq=import_react151.useRef(0),dismissed=import_react151.useRef(null),spot=atWordAt(input,cursor);return import_react151.useEffect(()=>{if(!spot||!ready){setItems([]),setCursor(0);return}if(dismissed.current===spot.word)return;dismissed.current=null;let me2=++seq.current,fixed=match3(spot.word),t2=setTimeout(()=>{gw.request("complete.path",{word:spot.word}).then((r)=>{if(seq.current!==me2)return;let seen=new Set(fixed.map((k2)=>k2.text)),ranked=(r.items??[]).filter((i)=>!seen.has(i.text)).map((i)=>({i,s:exports_frecency.score(i.text)})).sort((a,b2)=>b2.s-a.s).map((x2)=>x2.i);setItems([...fixed,...ranked]),setCursor(0)}).catch(()=>{if(seq.current===me2)setItems(fixed),setCursor(0)})},120);return()=>clearTimeout(t2)},[spot?.word,ready,gw]),{open:spot!==null&&items.length>0,items,cursor:sel,setCursor,accept:(src3,idx2=sel,off)=>{let at=atWordAt(src3,off),it=items[idx2];if(!at||!it)return null;if(it.text.includes(":")&&!it.text.endsWith(":"))exports_frecency.bump(it.text);let trail2=it.text.endsWith(":")||it.text.endsWith("/")?"":" ";return src3.slice(0,at.start)+it.text+trail2+src3.slice(at.start+at.word.length)},dismiss:()=>{seq.current++,dismissed.current=spot?.word??null,setItems([])}}}var import_react152=__toESM(require_react_production(),1);var TAB_PATH_RE=/((?:["']?(?:[A-Za-z]:[\\/]|\.{1,2}\/|~\/|\/|@|[^"'`\s]+\/))[^\s]*)$/;function
|
|
4225
|
+
`,"utf-8")}}function _reset(){data2=null}var KEYWORDS=[{text:"@diff",display:"@diff",meta:"working-tree diff"},{text:"@staged",display:"@staged",meta:"staged changes"},{text:"@git:1",display:"@git:1",meta:"last 1 commit"},{text:"@git:3",display:"@git:3",meta:"last 3 commits"},{text:"@git:5",display:"@git:5",meta:"last 5 commits"},{text:"@url:",display:"@url:<\u2026>",meta:"fetch a URL"},{text:"@folder:",display:"@folder:<path>",meta:"recurse directory"}];function match3(word){let q5=word.toLowerCase();return KEYWORDS.filter((k2)=>k2.text.toLowerCase().startsWith(q5)&&k2.text!==word)}function atWordAt(input,cursor=input.length){if(input.startsWith("/"))return null;let i=cursor;while(i>0&&!/\s/.test(input[i-1]))i--;if(input[i]!=="@")return null;let j2=cursor;while(j2<input.length&&!/\s/.test(input[j2]))j2++;return{word:input.slice(i,j2),start:i}}function useAtRefPopover(input,cursor){let gw=useGateway(),ready=useGatewayReady(),[items,setItems]=import_react151.useState([]),[sel,setCursor]=import_react151.useState(0),seq=import_react151.useRef(0),dismissed=import_react151.useRef(null),spot=atWordAt(input,cursor);return import_react151.useEffect(()=>{if(!spot||!ready){setItems([]),setCursor(0);return}if(dismissed.current===spot.word)return;dismissed.current=null;let me2=++seq.current,fixed=match3(spot.word),t2=setTimeout(()=>{gw.request("complete.path",{word:spot.word}).then((r)=>{if(seq.current!==me2)return;let seen=new Set(fixed.map((k2)=>k2.text)),ranked=(r.items??[]).filter((i)=>!seen.has(i.text)).map((i)=>({i,s:exports_frecency.score(i.text)})).sort((a,b2)=>b2.s-a.s).map((x2)=>x2.i);setItems([...fixed,...ranked]),setCursor(0)}).catch(()=>{if(seq.current===me2)setItems(fixed),setCursor(0)})},120);return()=>clearTimeout(t2)},[spot?.word,ready,gw]),{open:spot!==null&&items.length>0,items,cursor:sel,setCursor,accept:(src3,idx2=sel,off)=>{let at=atWordAt(src3,off),it=items[idx2];if(!at||!it)return null;if(it.text.includes(":")&&!it.text.endsWith(":"))exports_frecency.bump(it.text);let trail2=it.text.endsWith(":")||it.text.endsWith("/")?"":" ";return src3.slice(0,at.start)+it.text+trail2+src3.slice(at.start+at.word.length)},dismiss:()=>{seq.current++,dismissed.current=spot?.word??null,setItems([])}}}var import_react152=__toESM(require_react_production(),1);var TAB_PATH_RE=/((?:["']?(?:[A-Za-z]:[\\/]|\.{1,2}\/|~\/|\/|@|[^"'`\s]+\/))[^\s]*)$/;function clear2(setItems,setCursor,setReplace,setEnd){setItems([]),setCursor(0),setReplace(0),setEnd(0)}function completionRequest(input){if(/^\/[A-Za-z0-9_-]+$/.test(input))return null;let word=input.match(TAB_PATH_RE)?.[1]??null;if(!word)return null;return{method:"complete.path",params:{word},replaceFrom:input.length-word.length,replaceTo:input.length}}function acceptCompletion(input,item,replaceFrom,replaceTo=input.length){let replace=item.text.startsWith("/")&&input[replaceFrom-1]==="/"?replaceFrom-1:item.text.startsWith("/")&&input.startsWith("/")?0:replaceFrom,left=input.slice(0,replace),right=input.slice(replaceTo);if(item.text.includes(":"))exports_frecency.bump(item.text);let space=item.text.endsWith("/")||/\s$/.test(item.text)||/^\s/.test(right)?"":" ";return left+item.text+space+right}function useCompletion(input,blocked,gw,req){let[items,setItems]=import_react152.useState([]),[cursor,setCursor]=import_react152.useState(0),[replaceFrom,setReplace]=import_react152.useState(0),[replaceTo,setEnd]=import_react152.useState(0),seq=import_react152.useRef(0),dismissed=import_react152.useRef(null),reqKey=req?JSON.stringify(req):"";return import_react152.useEffect(()=>{if(blocked){seq.current++,dismissed.current=null,clear2(setItems,setCursor,setReplace,setEnd);return}let next3=req??completionRequest(input);if(!next3){seq.current++,dismissed.current=null,clear2(setItems,setCursor,setReplace,setEnd);return}if(dismissed.current===input)return;dismissed.current=null;let me2=++seq.current,t2=setTimeout(()=>{gw.request(next3.method,next3.params).then((r)=>{if(seq.current!==me2)return;let ranked=(r.items??[]).map((i)=>({i,s:exports_frecency.score(i.text)})).sort((a,b2)=>b2.s-a.s).map((x2)=>x2.i);setItems(ranked),setCursor(0),setReplace(next3.method==="complete.slash"?next3.replaceFrom+((r.replace_from??1)-1):next3.replaceFrom),setEnd(next3.replaceTo)}).catch((e)=>{if(seq.current!==me2)return;setItems([{text:"",display:"completion unavailable",meta:e instanceof Error&&e.message?e.message:"unavailable"}]),setCursor(0),setReplace(next3.replaceFrom),setEnd(next3.replaceTo)})},60);return()=>clearTimeout(t2)},[blocked,gw,input,reqKey]),{open:items.length>0,items,cursor,setCursor,replaceFrom,replaceTo,dismiss:()=>{seq.current++,dismissed.current=input,clear2(setItems,setCursor,setReplace,setEnd)}}}var import_react153=__toESM(require_react_production(),1);import{join as join29}from"path";import{existsSync as existsSync33,mkdirSync as mkdirSync9,readFileSync as readFileSync24,appendFileSync as appendFileSync2,writeFileSync as writeFileSync11}from"fs";var MAX3=500,file4=()=>join29(configDir(),"history");function parse5(line4){if(line4[0]==="{"){let j2=safe2(line4);if(j2&&typeof j2.input==="string")return{input:j2.input,parts:Array.isArray(j2.parts)?j2.parts:[]}}return{input:line4.replace(/\0/g,`
|
|
4226
4226
|
`),parts:[]}}function safe2(s){try{return JSON.parse(s)}catch{return null}}function load7(){let FILE=file4();if(!existsSync33(FILE))return[];return readFileSync24(FILE,"utf-8").split(`
|
|
4227
4227
|
`).filter(Boolean).map(parse5).slice(-MAX3).reverse()}function enc3(e){if(e.parts.length===0)return JSON.stringify({input:e.input});return JSON.stringify({input:e.input,parts:e.parts})}function useInputHistory(input,restore){let hist=import_react153.useRef(null);if(hist.current===null)hist.current=load7();let[,bump3]=import_react153.useState(0),idx2=import_react153.useRef(-1),stash=import_react153.useRef({input:"",parts:[]}),push3=import_react153.useCallback((entry3)=>{idx2.current=-1,stash.current={input:"",parts:[]};let e=typeof entry3==="string"?{input:entry3,parts:[]}:entry3;if(!e.input&&e.parts.length===0)return;let h2=hist.current,top2=h2[0];if(top2&&top2.input===e.input&&sameParts(top2.parts,e.parts))return;h2.unshift(e);let DIR=configDir(),FILE=file4();if(!existsSync33(DIR))mkdirSync9(DIR,{recursive:!0});if(h2.length>MAX3)h2.length=MAX3,writeFileSync11(FILE,[...h2].reverse().map(enc3).join(`
|
|
4228
4228
|
`)+`
|
|
4229
4229
|
`,"utf-8");else appendFileSync2(FILE,enc3(e)+`
|
|
4230
4230
|
`,"utf-8");bump3((n)=>n+1)},[]),up=import_react153.useCallback(()=>{let h2=hist.current;if(h2.length===0)return;if(idx2.current===-1)stash.current={input,parts:[]};let next3=Math.min(idx2.current+1,h2.length-1);idx2.current=next3,restore(h2[next3])},[input,restore]),down=import_react153.useCallback(()=>{if(idx2.current===-1)return;let next3=idx2.current-1;idx2.current=next3,restore(next3===-1?stash.current:hist.current[next3])},[restore]);return{push:push3,up,down}}function sameParts(a,b2){if(a.length!==b2.length)return!1;for(let i=0;i<a.length;i++)if(a[i]?.type!==b2[i]?.type)return!1;return!0}var STYLE={file:"extmark.file",agent:"extmark.agent",paste:"extmark.paste"};function styles(syntax2,theme){let ensure3=(name,def2)=>{let id=syntax2.getStyleId(name);if(id!==null)return id;return syntax2.registerStyle(name,def2)};return{file:ensure3(STYLE.file,{fg:theme.accent}),agent:ensure3(STYLE.agent,{fg:theme.primary,italic:!0}),paste:ensure3(STYLE.paste,{fg:theme.textMuted})}}class PartsBuffer{ta;ex;typeId;style;list=[];map=new Map;constructor(ta,style2){this.ta=ta,this.ex=ta.extmarks,this.style=style2,this.typeId=this.ex.registerType("prompt-part")}text(){return this.ta.plainText}alive(){return!this.ta.isDestroyed}insertText(str4){if(!this.alive())return;this.ta.insertText(str4)}insertPart(part,virtualText){if(!this.alive())return;let start2=this.ta.visualCursor.offset,end=start2+visualLen(virtualText);this.ta.insertText(virtualText+" ");let id=this.ex.create({start:start2,end,virtual:!0,styleId:styleFor(part.type,this.style),typeId:this.typeId}),idx2=this.list.length;this.list.push(withSource(part,start2,end,virtualText)),this.map.set(id,idx2)}sync(){if(!this.alive())return;let alive=this.ex.getAllForTypeId(this.typeId),next3=[],nextMap=new Map;for(let m2 of alive){let idx2=this.map.get(m2.id);if(idx2===void 0)continue;let p=this.list[idx2];if(!p)continue;nextMap.set(m2.id,next3.length),next3.push(rangeTo(p,m2.start,m2.end))}this.list=next3,this.map=nextMap}parts(){return this.sync(),this.list}toSnapshot(){return{v:1,input:this.text(),parts:[...this.parts()]}}fromSnapshot(snap3){if(!this.alive())return;this.ta.setText(snap3.input),this.ex.clear(),this.list=[],this.map=new Map;for(let p of snap3.parts){let r=rangeOf(p);if(!r)continue;let id=this.ex.create({start:r.start,end:r.end,virtual:!0,styleId:styleFor(p.type,this.style),typeId:this.typeId});this.map.set(id,this.list.length),this.list.push(p)}this.ta.gotoBufferEnd()}clear(){if(this.list=[],this.map=new Map,!this.alive())return;this.ta.setText(""),this.ex.clear()}expand(){if(!this.alive())return{text:"",parts:[]};this.sync();let text6=this.text(),marks=this.ex.getAllForTypeId(this.typeId).sort((a,b2)=>b2.start-a.start);for(let m2 of marks){let idx2=this.map.get(m2.id);if(idx2===void 0)continue;let p=this.list[idx2];if(p?.type!=="text")continue;text6=text6.slice(0,m2.start)+p.text+text6.slice(m2.end)}return{text:text6,parts:this.list.filter((p)=>p.type!=="text")}}}function visualLen(s){let B3=globalThis.Bun;return B3?.stringWidth?B3.stringWidth(s):s.length}function styleFor(k2,s){if(k2==="file")return s.file;if(k2==="agent")return s.agent;return s.paste}function withSource(p,start2,end,value2){if(p.type==="file")return{...p,source:p.source??{type:"file",path:"",text:{start:start2,end,value:value2}}};if(p.type==="agent")return{...p,source:{start:start2,end,value:value2}};return{...p,source:{text:{start:start2,end,value:value2}}}}function rangeTo(p,start2,end){if(p.type==="file"){let src4=p.source??{type:"file",path:"",text:{start:start2,end,value:""}};return{...p,source:{...src4,text:{...src4.text,start:start2,end}}}}if(p.type==="agent"){let src4=p.source??{start:start2,end,value:""};return{...p,source:{...src4,start:start2,end}}}let src3=p.source??{text:{start:start2,end,value:""}};return{...p,source:{text:{...src3.text,start:start2,end}}}}function rangeOf(p){if(p.type==="file")return p.source?.text;if(p.type==="agent")return p.source;return p.source?.text}var import_react154=__toESM(require_react_production(),1);var MAX_VISIBLE=10;function badge2(source2,theme){if(source2==="skill")return theme.success;if(source2==="plugin")return theme.info;if(source2==="mcp")return theme.warning;return null}var SlashPopover=import_react154.memo(({commands:cmds,cursor,onCursor,onSelect})=>{let theme=useTheme().theme;if(cmds.length===0)return $jsx("box",{border:!0,borderStyle:"single",borderColor:theme.border,backgroundColor:theme.backgroundPanel,paddingX:1,height:3,children:$jsx("text",{fg:theme.textMuted,children:"No matching commands"})});let rows3=import_react154.useMemo(()=>{let start3=Math.max(0,Math.min(cursor-2,cmds.length-MAX_VISIBLE)),items=cmds.slice(start3,start3+MAX_VISIBLE);return[{type:"header",cat:cmds[cursor]?.category??items[0]?.category??"Command"},...items.map((cmd,i)=>({type:"cmd",cmd,idx:start3+i}))]},[cmds,cursor]),start2=rows3.find((r)=>r.type==="cmd")?.idx??0,clipped=cmds.length>MAX_VISIBLE,above=clipped&&start2>0,below=clipped&&start2+MAX_VISIBLE<cmds.length,height2=rows3.length+2+(above?1:0)+(below?1:0);return $jsxs("box",{flexDirection:"column",border:!0,borderStyle:"single",borderColor:theme.border,backgroundColor:theme.backgroundPanel,paddingX:1,height:height2,children:[above?$jsx("box",{height:1,paddingLeft:1,children:$jsx("text",{fg:theme.textMuted,children:"\u2191 more"})}):null,rows3.map((row4)=>{if(row4.type==="header")return $jsx("box",{height:1,paddingLeft:1,children:$jsx("text",{children:$jsx("span",{fg:theme.textMuted,children:$jsx("strong",{children:row4.cat})})})},`h-${row4.cat}`);let active2=row4.idx===cursor,color=badge2(row4.cmd.source,theme);return $jsxs("box",{height:1,flexDirection:"row",backgroundColor:active2?theme.backgroundElement:void 0,onMouseOver:()=>onCursor(row4.idx),onMouseDown:()=>onSelect(row4.cmd),paddingLeft:2,paddingRight:1,children:[$jsx("box",{flexGrow:1,height:1,children:$jsxs("text",{children:[$jsxs("span",{fg:active2?theme.primary:theme.text,children:["/",row4.cmd.name]}),row4.cmd.argsHint?$jsxs("span",{fg:theme.textMuted,children:[" ",row4.cmd.argsHint]}):null,$jsxs("span",{fg:theme.textMuted,children:[" ",row4.cmd.description]})]})}),$jsxs("box",{height:1,flexDirection:"row",children:[color?$jsx("text",{children:$jsxs("span",{fg:color,children:[" ",row4.cmd.source]})}):null,row4.cmd.keybind?$jsx("text",{children:$jsxs("span",{fg:theme.textMuted,children:[" ",row4.cmd.keybind]})}):null]})]},`c-${row4.idx}-${row4.cmd.name}`)}),below?$jsx("box",{height:1,paddingLeft:1,children:$jsx("text",{fg:theme.textMuted,children:"\u2193 more"})}):null]})});var import_react155=__toESM(require_react_production(),1);var MAX_VISIBLE2=10,AtRefPopover=import_react155.memo(({items,cursor,onCursor,onSelect})=>{let theme=useTheme().theme,start2=Math.max(0,Math.min(cursor-2,items.length-MAX_VISIBLE2)),visible2=items.slice(start2,start2+MAX_VISIBLE2),above=start2>0,below=start2+MAX_VISIBLE2<items.length,height2=visible2.length+2+(above?1:0)+(below?1:0);return $jsxs("box",{flexDirection:"column",border:!0,borderStyle:"single",borderColor:theme.border,backgroundColor:theme.backgroundPanel,paddingX:1,height:height2,children:[above?$jsx("box",{height:1,paddingLeft:1,children:$jsx("text",{fg:theme.textMuted,children:"\u2191 more"})}):null,visible2.map((it,j2)=>{let i=start2+j2,active2=i===cursor;return $jsxs("box",{height:1,flexDirection:"row",backgroundColor:active2?theme.backgroundElement:void 0,onMouseOver:()=>onCursor(i),onMouseDown:()=>onSelect(i),paddingLeft:2,paddingRight:1,children:[$jsx("box",{flexGrow:1,height:1,overflow:"hidden",children:$jsxs("text",{children:[$jsx("span",{fg:active2?theme.primary:theme.text,children:it.display}),it.text!==it.display?$jsx("span",{fg:theme.textMuted,children:` ${it.text}`}):null]})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:it.meta})})]},it.text)}),below?$jsx("box",{height:1,paddingLeft:1,children:$jsx("text",{fg:theme.textMuted,children:"\u2193 more"})}):null]})});var resumeHint=(subagents,streaming)=>{let count4=typeof subagents==="number"?subagents:0;if(count4<1||streaming)return;return count4===1?"\u21A9 resumes when subagent finishes":`\u21A9 resumes when ${count4} subagents finish`},MAX_ROWS=6,MAX_PREVIEWS=2;function fmt5(n){if(n<1000)return String(n);if(n<1e6)return`${(n/1000).toFixed(1)}k`;return`${(n/1e6).toFixed(2)}M`}var Composer=import_react156.memo(import_react156.forwardRef((props,ref)=>{let theme=useTheme().theme,syntaxStyle=useTheme().syntaxStyle,gw=useGateway(),keys=useKeys(),bg2=useBackground(),ta=import_react156.useRef(null),buf=import_react156.useRef(null),sids=import_react156.useMemo(()=>styles(syntaxStyle,theme),[syntaxStyle,theme]),[input,setInput]=import_react156.useState(""),[caret,setCaret]=import_react156.useState(0),[mode2,setMode]=import_react156.useState("normal"),modeRef=import_react156.useRef(mode2);modeRef.current=mode2;let pop3=useSlashPopover(mode2==="normal"?input:"",props.cmds,caret),atSpot=mode2==="normal"?atWordAt(input,caret):null,at=useAtRefPopover(mode2==="normal"?input:"",caret),slashReq=pop3.spot&&!pop3.open&&pop3.spot.query?{method:"complete.slash",params:{text:pop3.spot.text},replaceFrom:pop3.spot.start+1,replaceTo:pop3.spot.end}:null,comp=useCompletion(mode2==="normal"&&!atSpot?input:"",mode2!=="normal"||pop3.open,gw,slashReq),write=import_react156.useCallback((v2)=>{if(buf.current?.clear(),v2)ta.current?.setText(v2);ta.current?.gotoBufferEnd(),setInput(v2)},[]),restore=import_react156.useCallback((e)=>{if(e.parts.length===0){write(e.input);return}buf.current?.fromSnapshot({v:1,input:e.input,parts:[...e.parts]}),setInput(e.input)},[write]),hist=useInputHistory(input,restore),bindings=import_react156.useMemo(()=>[...toBindings(keys.chord("input.submit"),"submit"),...toBindings(keys.chord("input.newline"),"newline")],[keys]),live=import_react156.useRef({pop:pop3,at,comp,props,input});live.current={pop:pop3,at,comp,props,input};let wasDirty=import_react156.useRef(!1);import_react156.useEffect(()=>{let dirty2=input.trim().length>0;if(dirty2===wasDirty.current)return;wasDirty.current=dirty2,live.current.props.onDirty?.(dirty2)},[input]);let select2=(c)=>{let spot=live.current.pop.spot;if(spot&&!spot.whole){write(replaceSlashToken(live.current.input,spot,c));return}if(c.name.includes(" ")){write(`/${c.name} `);return}write(""),live.current.props.onSlash(c)},fill=(c)=>{let p=live.current.pop;if(!p.spot)return;let next3=replaceSlashToken(live.current.input,p.spot,c);p.dismiss(next3),write(next3)},atAccept=(idx2)=>{let off=ta.current?.cursorOffset,src3=live.current.input,which=idx2??live.current.at.cursor,it=live.current.at.items[which];if(!it)return;let a=atWordAt(src3,off),trail2=it.text.endsWith(":")||it.text.endsWith("/"),b2=buf.current;if(trail2||!b2||!ta.current||!a){let next3=live.current.at.accept(src3,idx2,off);if(next3!==null)write(next3);return}if(it.text.includes(":"))exports_frecency.bump(it.text);let eb=ta.current.editBuffer,s=eb.offsetToPosition(a.start),e=eb.offsetToPosition(a.start+a.word.length);if(!s||!e)return;ta.current.deleteRange(s.row,s.col,e.row,e.col),ta.current.cursorOffset=a.start;let part={type:"file",mime:"text/uri-list",filename:it.text,source:{type:"file",path:it.text,text:{start:a.start,end:a.start+it.text.length,value:it.text}}};b2.insertPart(part,it.text),setInput(ta.current.plainText)},paste=import_react156.useCallback((e)=>{e.preventDefault();let raw2=decodePasteBytes(e.bytes).replace(/\r\n?/g,`
|
|
4231
4231
|
`),text6=/[^\n]/.test(raw2)?raw2.replace(/\n+$/,""):raw2;if(!text6){live.current.props.onAttachClipboard?.();return}let verbatim=()=>ta.current?.insertText(text6);if(looksLikePath(text6)){gw.request("input.detect_drop",{text:text6}).then((r)=>{if(!r.matched)return verbatim();if(r.is_image){let{path:path4,count:count4,name,width,height:height2,token_estimate}=r;if(live.current.props.onAttach?.({attached:!0,path:path4,count:count4,name,width,height:height2,token_estimate}),!r.text.startsWith("[User attached"))ta.current?.insertText(r.text+" ");return}live.current.props.onAttach?.({attached:!0,path:r.path,name:r.name}),ta.current?.insertText(r.text+" ")}).catch(verbatim);return}if(text6.split(`
|
|
4232
|
-
`).length<5)return verbatim();gw.request("paste.collapse",{text:text6}).then((r)=>ta.current?.insertText(r.placeholder+" ")).catch(verbatim)},[gw]),submit4=()=>{if(live.current.at.open)return atAccept();let cc=live.current.comp;if(cc.open){let it=cc.items[cc.cursor];if(!it||!it.text)return;write(acceptCompletion(live.current.input,it,cc.replaceFrom,cc.replaceTo));return}let p=live.current.pop;if(p.open&&!(p.spot?.whole&&p.spot.query.includes(" "))){let c=p.popover?.[p.cursor];if(c)fill(c);return}let exp=buf.current?.expand()??{text:live.current.input,parts:[]};if(modeRef.current==="shell"){let cmd=exp.text.trim();if(!cmd)return;hist.push({input:cmd,parts:exp.parts}),write(""),setMode("normal"),live.current.props.onShell?.(cmd);return}let text6=exp.text.trim();if(live.current.props.streaming){if(!text6)return;if(!live.current.props.canSubmitPrompt){live.current.props.onSubmitBlocked?.();return}if(hist.push({input:text6,parts:exp.parts}),write(""),text6.startsWith("/"))return void live.current.props.onSend(text6,exp.parts);live.current.props.onEnqueue?.(text6);return}let hasAtt=(live.current.props.attachments?.length??0)>0;if(!text6&&!hasAtt){live.current.props.onEmptyEnter?.();return}if(!live.current.props.canSubmitPrompt){live.current.props.onSubmitBlocked?.();return}if(text6)hist.push({input:text6,parts:exp.parts});write(""),live.current.props.onSend(text6,exp.parts)};import_react156.useImperativeHandle(ref,()=>({value:()=>live.current.input,set:write,insert:(text6)=>ta.current?.insertText(text6),remember:hist.push,lines:()=>ta.current?.lineCount??1,isEmpty:()=>live.current.input.trim().length===0,mode:()=>modeRef.current,setMode,caret:()=>ta.current?.cursorOffset??0,popOpen:()=>live.current.pop.open||live.current.at.open||live.current.comp.open,popNav:(d2)=>{let a=live.current.at;if(a.open)return a.setCursor((c)=>Math.max(0,Math.min(a.items.length-1,c+d2)));let cc=live.current.comp;if(cc.open)return cc.setCursor((c)=>Math.max(0,Math.min(cc.items.length-1,c+d2)));let max=(live.current.pop.popover?.length??1)-1;pop3.setCursor((c)=>Math.max(0,Math.min(max,c+d2)))},popAccept:()=>{if(live.current.at.open)return atAccept();let cc=live.current.comp;if(cc.open){let it=cc.items[cc.cursor];if(it?.text)write(acceptCompletion(live.current.input,it,cc.replaceFrom,cc.replaceTo));return}let p=live.current.pop,c=p.popover?.[p.cursor];if(c)fill(c)},popCancel:()=>{let a=live.current.at;if(a.open)return a.dismiss();let cc=live.current.comp;if(cc.open)return cc.dismiss();let p=live.current.pop;if(p.open&&p.spot&&!p.spot.whole)return p.dismiss();write("")},historyUp:()=>{let t2=ta.current;if(!t2||modeRef.current==="shell")return!1;let buf2=live.current.input;if(t2.cursorOffset>0&&buf2.lastIndexOf(`
|
|
4232
|
+
`).length<5)return verbatim();gw.request("paste.collapse",{text:text6}).then((r)=>ta.current?.insertText(r.placeholder+" ")).catch(verbatim)},[gw]),submit4=()=>{if(live.current.at.open)return atAccept();let cc=live.current.comp;if(cc.open){let it=cc.items[cc.cursor];if(!it||!it.text)return;write(acceptCompletion(live.current.input,it,cc.replaceFrom,cc.replaceTo));return}let p=live.current.pop;if(p.open&&!(p.spot?.whole&&p.spot.query.includes(" "))){let c=p.popover?.[p.cursor];if(c)fill(c);return}let exp=buf.current?.expand()??{text:live.current.input,parts:[]};if(modeRef.current==="shell"){let cmd=exp.text.trim();if(!cmd)return;hist.push({input:cmd,parts:exp.parts}),write(""),setMode("normal"),live.current.props.onShell?.(cmd);return}let text6=exp.text.trim(),local=text6.startsWith("/")&&(()=>{let name=text6.match(/^\/(\S+)/)?.[1]??"",r=resolve9(live.current.props.cmds,name);return"hit"in r&&r.hit.target==="local"})();if(live.current.props.streaming){if(!text6)return;if(!live.current.props.canSubmitPrompt&&!local){live.current.props.onSubmitBlocked?.();return}if(hist.push({input:text6,parts:exp.parts}),write(""),text6.startsWith("/"))return void live.current.props.onSend(text6,exp.parts);live.current.props.onEnqueue?.(text6);return}let hasAtt=(live.current.props.attachments?.length??0)>0;if(!text6&&!hasAtt){live.current.props.onEmptyEnter?.();return}if(!live.current.props.canSubmitPrompt&&!local){live.current.props.onSubmitBlocked?.();return}if(text6)hist.push({input:text6,parts:exp.parts});write(""),live.current.props.onSend(text6,exp.parts)};import_react156.useImperativeHandle(ref,()=>({value:()=>live.current.input,set:write,insert:(text6)=>ta.current?.insertText(text6),remember:hist.push,lines:()=>ta.current?.lineCount??1,isEmpty:()=>live.current.input.trim().length===0,mode:()=>modeRef.current,setMode,caret:()=>ta.current?.cursorOffset??0,popOpen:()=>live.current.pop.open||live.current.at.open||live.current.comp.open,popNav:(d2)=>{let a=live.current.at;if(a.open)return a.setCursor((c)=>Math.max(0,Math.min(a.items.length-1,c+d2)));let cc=live.current.comp;if(cc.open)return cc.setCursor((c)=>Math.max(0,Math.min(cc.items.length-1,c+d2)));let max=(live.current.pop.popover?.length??1)-1;pop3.setCursor((c)=>Math.max(0,Math.min(max,c+d2)))},popAccept:()=>{if(live.current.at.open)return atAccept();let cc=live.current.comp;if(cc.open){let it=cc.items[cc.cursor];if(it?.text)write(acceptCompletion(live.current.input,it,cc.replaceFrom,cc.replaceTo));return}let p=live.current.pop,c=p.popover?.[p.cursor];if(c)fill(c)},popCancel:()=>{let a=live.current.at;if(a.open)return a.dismiss();let cc=live.current.comp;if(cc.open)return cc.dismiss();let p=live.current.pop;if(p.open&&p.spot&&!p.spot.whole)return p.dismiss();write("")},historyUp:()=>{let t2=ta.current;if(!t2||modeRef.current==="shell")return!1;let buf2=live.current.input;if(t2.cursorOffset>0&&buf2.lastIndexOf(`
|
|
4233
4233
|
`,t2.cursorOffset-1)>=0)return!1;if(buf2.includes(`
|
|
4234
4234
|
`)&&t2.cursorOffset!==0)return t2.cursorOffset=0,!0;return hist.up(),!0},historyDown:()=>{let t2=ta.current;if(!t2||modeRef.current==="shell")return!1;let buf2=live.current.input;if(buf2.indexOf(`
|
|
4235
4235
|
`,t2.cursorOffset)>=0)return!1;if(buf2.includes(`
|
|
4236
4236
|
`)&&t2.cursorOffset!==buf2.length)return t2.cursorOffset=buf2.length,!0;return hist.down(),!0}}),[hist.up,hist.down,pop3.setCursor,write]);let sidsRef=import_react156.useRef(sids);sidsRef.current=sids;let taRef=import_react156.useCallback((r)=>{if(ta.current=r,r&&!buf.current)buf.current=new PartsBuffer(r,sidsRef.current);if(!r)buf.current=null},[]),label3=!props.ready?"Connecting...":props.starting?props.status||"Starting agent...":props.streaming?props.status||"Generating...":"Ready",dot=props.ready?props.streaming?theme.warning:theme.success:theme.error,resume=resumeHint(props.subagents,props.streaming),rows3=Math.min(MAX_ROWS,Math.max(1,input.split(`
|
|
4237
|
-
`).length)),all2=props.attachments??[],previews=all2.filter((a)=>a.path&&classify(a.path)==="img").slice(0,MAX_PREVIEWS),chips=all2.filter((a)=>!previews.includes(a)).slice(0,MAX_PREVIEWS),shown=new Set([...previews,...chips]),attRows=all2.length>0?previews.length>0?2:1:0,lift=rows3+attRows+3,more=all2.filter((a)=>!shown.has(a)).length,bits=[props.hidden?.profile,props.hidden?.title,props.hidden?.place,props.hidden?.context].filter(Boolean);return $jsxs("box",{flexDirection:"column",position:"relative",children:[props.focused&&pop3.open?$jsx("box",{position:"absolute",bottom:lift,left:0,right:0,zIndex:2,children:$jsx(SlashPopover,{commands:pop3.popover,cursor:pop3.cursor,onCursor:pop3.setCursor,onSelect:select2})}):props.focused&&at.open?$jsx("box",{position:"absolute",bottom:lift,left:0,right:0,zIndex:2,children:$jsx(AtRefPopover,{items:at.items,cursor:at.cursor,onCursor:at.setCursor,onSelect:atAccept})}):props.focused&&comp.open?$jsx("box",{position:"absolute",bottom:lift,left:0,right:0,zIndex:2,children:$jsx(AtRefPopover,{items:comp.items,cursor:comp.cursor,onCursor:comp.setCursor,onSelect:(idx2)=>{let it=comp.items[idx2];if(it?.text)write(acceptCompletion(input,it,comp.replaceFrom,comp.replaceTo))}})}):null,(props.queue?.length??0)>0?$jsx("box",{flexDirection:"column",paddingX:1,paddingBottom:1,children:props.queue.map((q5,i)=>$jsx("box",{height:1,onMouseDown:()=>props.onDequeue?.(i),children:$jsxs("text",{children:[$jsxs("span",{fg:theme.borderSubtle,children:[i===0?"\u256D":"\u2502"," "]}),$jsxs("span",{fg:theme.textMuted,children:["\u23F8 ",i+1,". ",trunc5(q5,60)]})]})},i))}):null,$jsxs("box",{border:!0,borderStyle:"single",borderColor:mode2==="shell"?theme.primary:props.focused?theme.borderActive:theme.border,flexDirection:"column",position:"relative",children:[previews.length>0?$jsx("box",{flexDirection:"column",paddingX:1,maxHeight:MAX_PREVIEWS,overflow:"hidden",children:previews.map((a)=>$jsx(ChafaImage,{path:a.path,width:60,bare:!0},`p-${a.path}`))}):null,chips.length>0?$jsxs("box",{flexDirection:"row",flexWrap:"wrap",gap:1,paddingX:1,paddingTop:previews.length>0?0:1,paddingBottom:1,children:[chips.map((a,i)=>{if(a.path){let kind2=classify(a.path);return $jsxs("box",{flexDirection:"row",height:1,children:[$jsx(MediaChip,{path:a.path,bare:kind2==="img"}),kind2!=="img"&&a.token_estimate?$jsxs("text",{fg:theme.textMuted,children:[" ~",fmt5(a.token_estimate),"t"]}):null]},a.path)}return $jsxs("text",{children:[$jsx("span",{bg:theme.secondary,fg:theme.background,children:" file "}),$jsxs("span",{bg:theme.backgroundElement,fg:theme.textMuted,children:[" ",a.name??`file ${i+1}`," "]})]},a.name??i)}),more>0?$jsxs("text",{fg:theme.textMuted,children:["+",more]}):null]}):null,$jsxs("box",{flexDirection:"row",children:[$jsx("box",{width:1,children:$jsx("text",{fg:theme.primary,children:mode2==="shell"?"$":">"})}),$jsx("box",{width:1}),$jsx("textarea",{ref:taRef,syntaxStyle,onContentChange:()=>{let t2=ta.current;setInput(t2?.plainText??""),setCaret(t2?.cursorOffset??0)},onCursorChange:()=>{if(!live.current.input.includes("@")&&!live.current.input.includes("/"))return;let off=ta.current?.cursorOffset??0;setCaret((c)=>c===off?c:off)},onSubmit:submit4,onPaste:paste,keyBindings:bindings,wrapMode:"word",minHeight:1,maxHeight:MAX_ROWS,placeholder:mode2==="shell"?"Run a shell command (30s cap, cwd) \u2014 esc or \u232B to exit":props.streaming?"Type to queue... (Enter queues, click chip to edit)":"Message Hermes... (/ for commands, Shift+Enter for newline)",focused:props.focused,textColor:theme.text,focusedTextColor:theme.text,placeholderColor:theme.textMuted,cursorColor:theme.text,backgroundColor:"transparent",focusedBackgroundColor:"transparent",flexGrow:1})]}),pop3.ghost&&props.focused&&rows3===1&&pop3.spot?.whole?$jsx("box",{position:"absolute",top:attRows,left:2+input.length,height:1,children:$jsx("text",{fg:theme.textMuted,children:pop3.ghost})}):null]}),$jsxs("box",{height:1,flexDirection:"row",paddingX:1,children:[$jsxs("text",{children:[props.streaming?$jsx(SpinGlyph,{fg:dot}):$jsx("span",{fg:dot,children:"\u25CF"}),$jsxs("span",{fg:theme.textMuted,children:[" ",mode2==="shell"?"Shell":label3]}),mode2==="shell"?$jsx("span",{fg:theme.textMuted,children:" esc exit shell mode"}):props.starting&&props.escHint?$jsx("span",{fg:theme.warning,children:" esc again to cancel"}):props.starting?$jsx("span",{fg:theme.textMuted,children:" esc\xD72 cancel"}):props.streaming&&props.escHint?$jsx("span",{fg:theme.warning,children:" esc again to interrupt"}):props.streaming?$jsx("span",{fg:theme.textMuted,children:" esc\xD72 interrupt"}):null]}),$jsx("box",{flexGrow:1}),props.streaming&&(props.queue?.length??0)>0?$jsxs("text",{fg:theme.textMuted,children:[keys.print("queue.flush")," to send queued now "]}):null,bg2.count>0?$jsxs("text",{fg:theme.text,children:["\u25B6 ",bg2.count," "]}):null,resume?$jsxs("text",{fg:theme.textMuted,children:[resume," "]}):null,bits.length>0?$jsxs("text",{fg:theme.textMuted,children:[trunc5(bits.join(" \xB7 "),56)," "]}):null,props.model?$jsx("text",{fg:theme.textMuted,children:props.model}):null]})]})}));var import_react157=__toESM(require_react_production(),1);init_sessions_db();var normalize3=(sid2)=>sid2.trim().replace(/\.json$/i,"").replace(/^session_(?=\d{8}_)/,"");function useSession(){let gw=useGateway(),inflightMessages=(inflight)=>{let user2=String(inflight?.user??"").trim(),assistant2=String(inflight?.assistant??""),messages=[];if(user2)messages.push(...transcriptToMessages([{role:"user",text:user2}]));if(assistant2||inflight?.streaming)messages.push(...transcriptToMessages([{role:"assistant",text:assistant2}]));return messages},resume=import_react157.useCallback(async(sid2)=>{let target2=normalize3(sid2),res=await gw.request("session.resume",{session_id:target2}),id=res.session_id,key5=res.session_key??res.resumed??target2;gw.setSession(id),set("lastSessionId",key5);let messages=res.messages?.length?transcriptToMessages(res.messages):[];return{id,key:key5,messages,info:res.info}},[gw]),create=import_react157.useCallback(async()=>{let res=await gw.request("session.create",{}),key5=res.stored_session_id??res.session_id;return gw.setSession(res.session_id),set("lastSessionId",key5),{id:res.session_id,key:key5,info:res.info}},[gw]),activate=import_react157.useCallback(async(sid2)=>{let target2=normalize3(sid2),res=await gw.request("session.activate",{session_id:target2}),id=res.session_id,key5=res.session_key??id;gw.setSession(id),set("lastSessionId",key5);let history=res.messages?.length?transcriptToMessages(res.messages):[],running2=Boolean(res.running||res.status==="working"||res.status==="waiting");return{id,key:key5,info:res.info,messages:[...history,...inflightMessages(res.inflight)],running:running2,startedAt:res.started_at?res.started_at*1000:void 0,status:res.status}},[gw]),busy2=import_react157.useCallback(async()=>{try{return(await gw.request("agents.list")).processes?.some((p)=>p.status==="running")??!1}catch{return!0}},[gw]),close2=import_react157.useCallback(async(sid2,opts)=>{if(!sid2)return!1;if(opts?.preserveBackground&&await busy2())return!1;try{return await gw.request("session.close",{session_id:sid2}),!0}catch{return!1}},[gw,busy2]),boot2=import_react157.useCallback(async(launch)=>{let fresh2=async(note)=>({...await create(),messages:[],note});if(launch.mode==="resume"){let target2=launch.sid??exports_sessions_db.lastReal()?.id;if(!target2)return fresh2("no prior session to resume \u2014 starting fresh");try{return await resume(target2)}catch(e){let msg=e instanceof Error?e.message:String(e);return fresh2(`resume ${target2} failed: ${msg} \u2014 starting fresh`)}}let last4=get2("lastSessionId"),row4=last4?exports_sessions_db.byId(last4):null;if(row4?.message_count===0&&row4.parent_session_id==null)try{return await resume(row4.id)}catch{}return fresh2()},[create,resume]),interrupt=import_react157.useCallback(async()=>{await gw.request("session.interrupt")},[gw]),branch3=import_react157.useCallback(async(name)=>{return(await gw.request("session.branch",name?{name}:{})).session_id??null},[gw]),compress=import_react157.useCallback(async(arg="")=>{let raw2=arg.trim(),params=raw2?{raw_args:raw2,focus_topic:raw2}:{};return gw.request("session.compress",params)},[gw]),undo=import_react157.useCallback(async()=>{await gw.request("session.undo")},[gw]);return import_react157.useMemo(()=>({boot:boot2,create,resume,activate,close:close2,interrupt,branch:branch3,compress,undo}),[boot2,create,resume,activate,close2,interrupt,branch3,compress,undo])}var import_react158=__toESM(require_react_production(),1);function useTerminalTitle(active2,cwd){let renderer=useRenderer();import_react158.useEffect(()=>{let title=active2?"\u25CF Herm":"Herm",name=cwd?.split(/[\\/]/).filter(Boolean).at(-1);renderer.setTerminalTitle(name?`${title} \xB7 ${name}`:title)},[renderer,active2,cwd])}init_sessions_db();init_hermes_analytics();function rehome(newHome){process.env.HERMES_HOME=newHome,setHome2(newHome),setHome(newHome),cache3.clear(),resetKanban(),close(),exports_preferences.reload(),home3.reset()}var import_react160=__toESM(require_react_production(),1);var Countdown=(p)=>{let theme=useTheme().theme,[n,setN]=import_react160.useState(p.seconds);import_react160.useEffect(()=>{if(n<=0){p.onFire();return}let t2=setTimeout(()=>setN((v2)=>v2-1),1000);return()=>clearTimeout(t2)},[n,p.onFire]),useKeyboard(()=>p.onCancel());let bar3="\u2588".repeat(n)+"\u2591".repeat(Math.max(0,p.seconds-n));return $jsxs("box",{flexDirection:"column",width:58,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.warning,children:$jsx("strong",{children:p.title})})}),$jsx("box",{height:1}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:p.body})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsxs("text",{fg:theme.warning,children:[bar3," ",n,"s"]})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:p.action})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"press any key to cancel"})})]})};function openCountdown(dialog,opts){return new Promise((resolve4)=>{dialog.replace($jsx(Countdown,{...opts,onFire:()=>{dialog.clear(),resolve4(!0)},onCancel:()=>{dialog.clear(),resolve4(!1)}}),()=>resolve4(!1))})}var SECONDS=10,SUSPEND=process.platform==="darwin"?"pmset sleepnow":"systemctl suspend",run=(cmd)=>Bun.spawn(["sh","-c",cmd],{stdout:"ignore",stderr:"ignore"}),fired=new Map;function makeGoalHook(dialog,toast){let act=(goal,done2,total)=>{let pref=(exports_preferences.get("onGoalDone")??"toast").trim(),head=goal.length>60?goal.slice(0,57)+"\u2026":goal,n=total&&total>0?` ${done2}/${total} items`:"";if(toast.show({variant:"success",title:"Goal complete",message:head+n,duration:8000}),pref==="toast")return;let cmd=pref==="suspend"?SUSPEND:pref;openCountdown(dialog,{title:"Goal complete \u2014 "+(pref==="suspend"?"suspending":"running hook"),body:head,action:`\u2192 ${cmd}`,seconds:SECONDS}).then((ok)=>{if(ok)run(cmd)})};return{check:(sid2)=>{if(!sid2)return;io.goalState(sid2).then((s)=>{if(!s||s.status!=="done")return;if(fired.get(sid2)===s.goal)return;fired.set(sid2,s.goal);let list3=s.checklist??[],done2=list3.filter((i)=>i.status==="completed"||i.status==="impossible").length;act(s.goal,done2,list3.length)}).catch(()=>{})}}}var import_react162=__toESM(require_react_production(),1);function useVoice(gw,sys){let[enabled3,setEnabled]=import_react162.useState(!1),[recording,setRecording]=import_react162.useState(!1),[processing,setProcessing]=import_react162.useState(!1),[recordKeyRaw,setRecordKeyRaw]=import_react162.useState(),[tts,setTts]=import_react162.useState(!1),[onTranscript,setTranscript]=import_react162.useState(null),pending3=import_react162.useRef(0),recordGen=import_react162.useRef(0),toggleGen=import_react162.useRef(0),setOnTranscript=import_react162.useCallback((fn)=>setTranscript(fn?()=>fn:null),[]),reset4=import_react162.useCallback(()=>{toggleGen.current++,recordGen.current++,pending3.current=0,setEnabled(!1),setRecording(!1),setProcessing(!1),setTts(!1)},[]),recordKey=import_react162.useMemo(()=>parseVoiceRecordKey(recordKeyRaw),[recordKeyRaw]),keyLabel=import_react162.useMemo(()=>formatVoiceRecordKey(recordKey),[recordKey]),state3=import_react162.useMemo(()=>({enabled:enabled3,recording,processing,recordKey,tts}),[enabled3,recording,processing,recordKey,tts]),toggle=import_react162.useCallback(async(action,sid2)=>{let current2=++toggleGen.current;try{let r=await gw("voice.toggle",{action,session_id:sid2});if(toggleGen.current!==current2)return;if(r.enabled!==void 0){if(setEnabled(r.enabled),!r.enabled)recordGen.current++,setRecording(!1),setProcessing(!1)}if(r.tts!==void 0)setTts(r.tts);if(r.record_key)setRecordKeyRaw(r.record_key);let label3=formatVoiceRecordKey(parseVoiceRecordKey(r.record_key)),ttsMsg=r.tts?" \xB7 tts on":"",details2=action==="status"&&r.details?.trim()?` \xB7 ${r.details.trim()}`:"";sys(`voice ${r.enabled?"on":"off"}${ttsMsg} [${label3}]${details2}`)}catch(e){if(toggleGen.current!==current2)return;sys(`voice: ${e instanceof Error?e.message:"gateway error"}`)}},[gw,sys]),record2=import_react162.useCallback(async(sid2)=>{if(!enabled3){sys("voice: mode is off \u2014 enable with /voice on");return}if(pending3.current)return;let current2=++recordGen.current;pending3.current=current2;let starting=!recording,action=starting?"start":"stop";if(starting)setRecording(!0);else setRecording(!1),setProcessing(!1);try{let r=await gw("voice.record",{action,session_id:sid2});if(recordGen.current!==current2)return;if(starting&&r.status!=="recording"){if(setRecording(!1),r.status==="busy")setProcessing(!0),sys("voice: still transcribing; try again shortly")}}catch(e){if(recordGen.current!==current2)return;setRecording(!starting),sys(`voice error: ${e instanceof Error?e.message:"gateway error"}`)}finally{if(pending3.current===current2)pending3.current=0}},[enabled3,recording,gw,sys]);return{state:state3,toggle,record:record2,setEnabled,setRecording,setProcessing,setRecordKey:setRecordKeyRaw,reset:reset4,keyLabel,onTranscript,setOnTranscript}}function VoiceIndicator({voice,keyLabel}){let theme=useTheme().theme;if(!voice.enabled&&!voice.recording&&!voice.processing)return null;let text6,fg2=theme.text;if(voice.recording)text6="\u25CF recording",fg2=theme.error;else if(voice.processing)text6="\u25CC transcribing",fg2=theme.warning;else text6=`voice ready [${keyLabel}]`,fg2=theme.textMuted;return $jsx("text",{children:$jsxs("span",{fg:fg2,children:[text6," "]})})}function sessionCapabilities(input){let sessionConnected=Boolean(input.sid),metadataHydrated=input.ready,contract2=input.contract??exports_backend_contract.backendContract(null),ok=contract2.supported;return{sessionConnected,metadataHydrated,minContract:contract2.minContract,maxContract:contract2.maxContract,observedContract:contract2.observedContract,contractSupported:ok,contractReason:contract2.reason,contractMessage:ok?void 0:exports_backend_contract.contractMessage(contract2),canSubmitPrompt:sessionConnected&&ok,canDispatchGatewayCommand:sessionConnected&&ok,canDrainQueue:sessionConnected&&ok&&!input.streaming}}var import_react163=__toESM(require_react_production(),1);function openMessage(dialog,m2,ops){let text6=m2.parts.filter((p)=>p.type==="text").map((p)=>p.content).join("");dialog.replace($jsx(DialogSelect,{title:"Message Actions",options:[{title:"Copy",value:"copy",description:"message text to clipboard"},{title:"Rewind here",value:"rewind",description:"undo back to this turn (destructive)"},{title:"Fork here",value:"fork",description:"branch a new session at this point"}],onSelect:(o)=>{if(dialog.clear(),o.value==="copy")return void copyText(text6,ops.toast);if(o.value==="rewind")return ops.rewind(m2);if(o.value==="fork")return ops.fork(m2)}}))}async function undo(gw,count4,sid2){for(let i=0;i<count4;i++)await gw.request("session.undo",sid2?{session_id:sid2}:{})}var textOf=(message2)=>message2.parts.filter((part)=>part.type==="text").map((part)=>part.content).join("");function useMessageActions(args){let turns=import_react163.useCallback((message2)=>{let messages=args.turn.current.messages,at=messages.findIndex((item)=>item.id===message2.id);return at<0?0:messages.slice(at).filter((item)=>item.role==="user").length},[args.turn]),rewind=import_react163.useCallback(async(message2)=>{if(args.turn.current.streaming)return!1;let count4=turns(message2);if(!count4)return!1;try{await undo(args.gw,count4);let result=await args.gw.request("session.history");return args.dispatch({kind:"load",messages:transcriptToMessages(result.messages??[])}),args.composer.current?.set(textOf(message2)),args.focus("input"),!0}catch(err){return args.toast.show({variant:"error",message:err instanceof Error?err.message:String(err)}),!1}},[args.gw,args.toast,args.turn,args.dispatch,args.composer,args.focus,turns]),fork2=import_react163.useCallback(async(message2)=>{if(args.turn.current.streaming)return;let result=await args.gw.request("session.branch",{}).catch((err)=>{return args.toast.show({variant:"error",message:`branch failed: ${err.message}`}),null});if(!result?.session_id)return;try{if(await undo(args.gw,turns(message2),result.session_id),!await args.activate(result.session_id)){await args.session.close(result.session_id);return}args.composer.current?.set(textOf(message2)),args.focus("input"),args.toast.show({variant:"success",message:`forked \u2192 ${result.title??result.session_id}`})}catch(err){await args.session.close(result.session_id),args.toast.show({variant:"error",message:err instanceof Error?err.message:String(err)})}},[args.gw,args.toast,args.turn,args.activate,args.session,args.composer,args.focus,turns]),menu=import_react163.useCallback((message2)=>{if(args.turn.current.streaming)return;openMessage(args.dialog,message2,{rewind,fork:fork2,toast:args.toast})},[args.dialog,args.toast,args.turn,rewind,fork2]);return{rewind,fork:fork2,menu}}var BUSY_RE=/session busy|waiting for model response/i,App=(props)=>$jsx(ThemeProvider,{initial:props.initialTheme,children:$jsx(GatewayProvider,{client:props.gateway,children:$jsx(ToastProvider,{children:$jsx(KeysProvider,{overrides:props.keyOverrides,children:$jsx(DialogProvider,{children:$jsx(CommandProvider,{children:$jsx(PluginProvider,{plugins:props.plugins,children:$jsx(BackgroundProvider,{children:$jsx(AppInner,{launch:props.launch??{mode:"new"}})})})})})})})})}),AppInner=({launch:launch0})=>{let gw=useGateway(),gwRestart=useGatewayRestart(),dialog=useDialog(),dialogOpen=useDialogOpen(),themeCtx=useTheme(),toast=useToast(),renderer=useRenderer(),plugins=usePlugins(),session=useSession(),dims=useTerminalDimensions(),goalHook=import_react165.useMemo(()=>makeGoalHook(dialog,toast),[dialog,toast]),[turn,dispatch]=import_react165.useReducer(turnReducer,initialTurn),[ready,setReady]=import_react165.useState(!1),[sid2,setSid]=import_react165.useState(""),sidRef=import_react165.useRef(sid2);sidRef.current=sid2;let[durable,setDurable]=import_react165.useState(""),durableRef=import_react165.useRef(durable);durableRef.current=durable;let[starting,setStarting]=import_react165.useState(!1),startRef=import_react165.useRef(starting);startRef.current=starting;let active2=turn.streaming||starting,[tab,setTab]=import_react165.useState(CHAT_TAB),[subTabs,setSubTabs]=import_react165.useState(()=>({[SESSIONS_TAB]:0,[AUTOMATION_TAB]:0,[CONFIG_TAB]:0,[EIKON_TAB]:0})),setSub=import_react165.useCallback((tabIdx,sub3)=>setSubTabs((prev)=>prev[tabIdx]===sub3?prev:{...prev,[tabIdx]:sub3}),[]),sessSub=import_react165.useCallback((i)=>setSub(SESSIONS_TAB,i),[setSub]),autoSub=import_react165.useCallback((i)=>setSub(AUTOMATION_TAB,i),[setSub]),cfgSub=import_react165.useCallback((i)=>setSub(CONFIG_TAB,i),[setSub]),eikSub=import_react165.useCallback((i)=>setSub(EIKON_TAB,i),[setSub]),[hideSidebar,setHideSidebar]=import_react165.useState(!1),[usage,setUsage]=import_react165.useState(void 0),[info3,setInfo]=import_react165.useState(null),[contract2,setContract]=import_react165.useState(()=>exports_backend_contract.backendContract(null)),recordInfo=import_react165.useCallback((next3)=>{setInfo(next3),setContract((prev)=>{let state3=exports_backend_contract.backendContract(next3);return state3.reason==="missing"&&prev.supported?prev:state3})},[]),capabilities=sessionCapabilities({sid:sid2,ready,streaming:active2,contract:contract2}),[title,setTitle]=import_react165.useState(""),caption=title.trim(),titleRef=import_react165.useRef(caption);titleRef.current=caption,import_react165.useEffect(()=>{process.removeAllListeners("SIGINT"),process.on("SIGINT",()=>quit(renderer,durableRef.current||sidRef.current,titleRef.current,gw))},[renderer,gw]),import_react165.useEffect(()=>{let w2=warning();if(!w2)return;toast.show({variant:"warning",title:"control server exposed",message:w2.message,duration:15000})},[toast]);let[focusRegion,setFocusRegion]=import_react165.useState("input"),goToTab=import_react165.useCallback((t2)=>{setTab(t2),setFocusRegion(t2===CHAT_TAB?"input":"content")},[]),goTo=import_react165.useCallback((t2,sub3)=>{setTab(t2),setSubTabs((prev)=>prev[t2]===sub3?prev:{...prev,[t2]:sub3}),setFocusRegion(t2===CHAT_TAB?"input":"content")},[]),[status2,setStatus]=import_react165.useState(""),[escHint,setEscHint]=import_react165.useState(!1),[eikon,setEikon]=import_react165.useState(void 0),[queue,setQueue]=import_react165.useState([]),[busy2,setBusy]=import_react165.useState("queue"),turnRef=import_react165.useRef(turn);turnRef.current=turn;let queueRef=import_react165.useRef(queue);queueRef.current=queue;let launchRef=import_react165.useRef(launch0),launch=launchRef.current,[splash,setSplash]=import_react165.useState(launch.splash!==!1),[switching,setSwitching]=import_react165.useState(!1),summoned=import_react165.useRef(!1),creating=import_react165.useRef(!1),[composing,setComposing]=import_react165.useState(!1),splashLast=import_react165.useMemo(()=>launch0.mode==="new"?lastReal():void 0,[launch0.mode]),splashInfo=import_react165.useMemo(()=>info3?{agentVersion:info3.version,behind:info3.update_behind,model:info3.model}:void 0,[info3?.version,info3?.update_behind,info3?.model]),splashLastProp=import_react165.useMemo(()=>splashLast?{id:splashLast.id,title:splashLast.title}:void 0,[splashLast]),news=import_react165.useMemo(()=>readChangelog()?.headline,[]),[attachments,setAttachments]=import_react165.useState([]),attachmentsRef=import_react165.useRef(attachments);attachmentsRef.current=attachments;let[cloudH,setCloudH]=import_react165.useState(CLOUD_MIN),[pick2,setPick]=import_react165.useState(void 0),[skin2,setSkin]=import_react165.useState(()=>deriveSkin(void 0)),inflight=import_react165.useRef(!1),hold=import_react165.useRef(!1),pending3=import_react165.useRef(!1),detaching=import_react165.useRef(0),[pulse,setPulse]=import_react165.useState(0),start2=import_react165.useCallback(()=>{inflight.current=!1,pending3.current=!1,setPulse((n)=>n+1)},[]),settle=import_react165.useCallback(()=>{if(!hold.current)return;hold.current=!1,setPulse((n)=>n+1)},[]),undone=import_react165.useRef([]),sessionStart=import_react165.useRef(Date.now()),composer2=import_react165.useRef(null),promptRef=import_react165.useRef(null),{cmds}=useSlashCommands(),cmdsRef=import_react165.useRef(cmds);cmdsRef.current=cmds;let sys=import_react165.useCallback((text6)=>dispatch({kind:"system",text:text6}),[]),voice=useVoice(gw.request.bind(gw),sys);import_react165.useEffect(()=>{voice.setOnTranscript((text6)=>{let c=composer2.current;if(!c)return;c.set(""),setTimeout(()=>sendRef.current(text6),0)})},[]),useTerminalTitle(active2,info3?.cwd);let[errorPulse,setErrorPulse]=import_react165.useState(!1);import_react165.useEffect(()=>{let restart=(mode2="resume")=>{let sid3=durableRef.current||sidRef.current;if(mode2==="resume"&&sid3)launchRef.current={mode:"resume",sid:sid3,splash:!1};gw.setSession(""),setReady(!1),setStarting(!1),setStatus("gateway restarting"),voice.reset()},exit=(code2)=>{let text6=`gateway exited${code2===null?"":` (${code2})`}`,sid3=durableRef.current||sidRef.current;if(sid3)launchRef.current={mode:"resume",sid:sid3,splash:!1};gw.setSession(""),setReady(!1),setStarting(!1),setStatus(text6),setErrorPulse(!0),voice.reset(),dispatch({kind:"system",text:text6})};return gw.on("restart",restart),gw.on("exit",exit),()=>{gw.off("restart",restart),gw.off("exit",exit)}},[gw]);let agentState=errorPulse?"error":turn.toolActive?"working":turn.streaming&&turn.hasContent?"speaking":active2?"thinking":composing?"listening":"idle",onAvatarHold=import_react165.useCallback((s)=>{if(s==="error")setErrorPulse(!1)},[]),prompt=import_react165.useMemo(()=>pending2(turn.messages),[turn.messages]),cloudAuto=turn.streaming&&!turn.hasContent&&!prompt,[force,setForce]=import_react165.useState(void 0),cloud=!prompt&&(force??cloudAuto),prevStream=import_react165.useRef(turn.streaming);import_react165.useEffect(()=>{if(!prevStream.current&&turn.streaming)setForce(void 0),setPick(void 0);prevStream.current=turn.streaming},[turn.streaming]);let onPick=import_react165.useCallback((m2)=>{setPick((p)=>{if(m2&&p&&m2.id===p.id){setForce(!1);return}return setForce(!!m2),m2})},[]),onAvatar=import_react165.useCallback(()=>{let next3=!cloud;if(!next3)setPick(void 0);setForce(next3)},[cloud]),closeCloud=import_react165.useCallback(()=>{setForce(!1),setPick(void 0)},[]),intr=import_react165.useRef(()=>{}),steer=import_react165.useCallback((text6)=>{let v2=text6.trim();if(!v2)return;gw.request("session.steer",{text:v2}).then((r)=>toast.show(r.status==="queued"?{variant:"success",message:"Queued \u2014 lands on next tool result"}:{variant:"info",message:"No turn running; send as a normal message"})).catch((e)=>toast.show({variant:"error",message:e.message}))},[gw,toast]),openSteer=import_react165.useCallback(()=>{openTextPrompt(dialog,{title:"Steer active turn",label:"Soft nudge for the running session"}).then((v2)=>{if(v2)steer(v2)})},[dialog,steer]),onEnqueue=import_react165.useCallback((t2)=>{if(busy2==="steer"){let v2=t2.trim();if(!v2)return;gw.request("session.steer",{text:v2}).then((r)=>{if(r.status==="queued")return toast.show({variant:"success",message:"Queued \u2014 lands on next tool result"});setQueue((q5)=>[...q5,t2]),toast.show({variant:"info",message:"steer rejected \u2014 queued for next turn"})}).catch(()=>setQueue((q5)=>[...q5,t2]));return}if(busy2==="interrupt"){hold.current=!0,setQueue((q5)=>[t2,...q5]),intr.current();return}setQueue((q5)=>[...q5,t2])},[busy2,gw,toast]),updateAttachments=import_react165.useCallback((next3)=>{let value2=typeof next3==="function"?next3(attachmentsRef.current):next3;attachmentsRef.current=value2,setAttachments(value2)},[]),onAttach=import_react165.useCallback((r)=>updateAttachments((a)=>[...a,r]),[updateAttachments]),stream=useStream({dispatch,session,launchRef,sidRef,sessionStart,goalHook,setSid,setDurable,setInfo:recordInfo,setReady,setTitle,setBusy,setStarting,setUsage,setStatus,setSkin,setErrorPulse,settle,onVoiceStatus:(state3)=>{voice.setRecording(state3==="listening"||state3==="recording"),voice.setProcessing(state3==="transcribing"||state3==="processing")},onVoiceTranscript:(text6,noSpeechLimit)=>{if(voice.setRecording(!1),voice.setProcessing(!1),noSpeechLimit){voice.setEnabled(!1),sys("voice: disabled after repeated silence");return}voice.onTranscript?.(text6)},start:start2}),interrupt=import_react165.useCallback(()=>{if(startRef.current&&!turnRef.current.streaming)hold.current=!0;stream.doInterrupt()},[stream.doInterrupt]);intr.current=interrupt;let reset4=import_react165.useCallback(()=>{stream.interrupted.current=!1,hold.current=!1,pending3.current=!1,setQueue([]),toast.clear("credits.depleted"),undone.current=[],dispatch({kind:"reset"}),setUsage(void 0),setReady(!1),setStarting(!1),setStatus(""),setTitle(""),updateAttachments([])},[toast,updateAttachments]),newSession=import_react165.useCallback(async()=>{if(creating.current)return;creating.current=!0,setSwitching(!0);let prev=sidRef.current;summoned.current=!0,setSplash(!0),setReady(!1),gw.setSession("");try{let r=await session.create();if(reset4(),setSid(r.id),setDurable(r.key),launchRef.current={mode:"resume",sid:r.key,splash:!1},r.info)recordInfo(r.info),setUsage(r.info.usage);if(setReady(!0),setStarting(!1),setStatus(""),sessionStart.current=Date.now(),prev)session.close(prev,{preserveBackground:!0})}catch(err){if(prev)gw.setSession(prev),setReady(!0);setSplash(!1),summoned.current=!1,dispatch({kind:"system",text:`Failed to create session: ${err instanceof Error?err.message:String(err)}`})}finally{creating.current=!1,setSwitching(!1)}},[reset4,session,gw]),switchSession=import_react165.useCallback(async(target2)=>{let prev=sidRef.current,old=durableRef.current;summoned.current=!0,setSplash(!0),setSwitching(!0),gw.setSession(""),setSid(""),goToTab(CHAT_TAB);try{let res=await session.resume(target2);if(reset4(),setSid(res.id),setDurable(res.key),launchRef.current={mode:"resume",sid:res.key,splash:!1},res.info)recordInfo(res.info),setUsage(res.info.usage);if(setReady(!0),sessionStart.current=Date.now(),res.messages.length)dispatch({kind:"load",messages:res.messages});if(prev&&prev!==res.id)session.close(prev,{preserveBackground:!0});setSplash(!1),summoned.current=!1}catch(err){if(prev)gw.setSession(prev),setSid(prev),setDurable(old),setReady(!0);dispatch({kind:"system",text:`Failed to resume: ${err instanceof Error?err.message:String(err)}`}),setSplash(!1),summoned.current=!1}finally{setSwitching(!1)}},[reset4,session,goToTab,gw]),liveStatus=(state3,running2=!1)=>{if(state3==="waiting")return"waiting for input\u2026";if(state3==="starting")return"starting agent\u2026";return running2||state3==="working"?"running\u2026":"ready"},activateSession=import_react165.useCallback(async(target2)=>{let prev=sidRef.current,old=durableRef.current;summoned.current=!0,setSplash(!0),setSwitching(!0),gw.setSession(""),setSid(""),goToTab(CHAT_TAB);try{let res=await session.activate(target2);if(reset4(),setSid(res.id),setDurable(res.key),launchRef.current={mode:"resume",sid:res.key,splash:!1},res.info)recordInfo(res.info),setUsage(res.info.usage);if(sessionStart.current=res.startedAt??Date.now(),dispatch({kind:"load.live",messages:res.messages,streaming:res.running}),setStatus(liveStatus(res.status,res.running)),setReady(!0),setSplash(!1),summoned.current=!1,prev&&prev!==res.id)toast.show({variant:"info",message:"switched live session"});return!0}catch(err){if(prev)gw.setSession(prev),setSid(prev),setDurable(old),setReady(!0);return dispatch({kind:"system",text:`Failed to activate: ${err instanceof Error?err.message:String(err)}`}),setSplash(!1),summoned.current=!1,!1}finally{setSwitching(!1)}},[reset4,session,goToTab,toast,gw]),switchProfile=import_react165.useCallback((newHome,name)=>{voice.reset(),rehome(newHome),reset4(),gw.setSession(""),setSid(""),setDurable(""),recordInfo(null),setSkin(deriveSkin(void 0)),summoned.current=!0,setSplash(!0),launchRef.current={mode:"new",splash:!0},toast.show({variant:"info",message:`Switching to '${name}'\u2026`}),goToTab(CHAT_TAB),gwRestart("new")},[reset4,goToTab,gwRestart,toast,gw]),loadEikon=import_react165.useCallback((path4)=>{try{setEikon(parseEikonFile(path4))}catch{setEikon(void 0)}},[]),eikonName=usePref("eikon"),eikonRev=import_react165.useSyncExternalStore(exports_eikon.onRevision,exports_eikon.revision);import_react165.useEffect(()=>{let p=eikonName&&exports_eikon.baked(eikonName)||bundledEikonPath(skin2.skin?.name);if(p)loadEikon(p);else setEikon(void 0)},[eikonName,eikonRev,skin2.skin?.name,loadEikon]);let messageActions=useMessageActions({gw,dialog,toast,session,activate:activateSession,composer:composer2,turn:turnRef,dispatch,focus:setFocusRegion}),rewind=messageActions.rewind,msgMenu=messageActions.menu,attachClipboard=import_react165.useCallback(()=>{gw.request("clipboard.paste").then((r)=>r.attached?updateAttachments((a)=>[...a,r]):toast.show({variant:"info",message:r.message??"No image in clipboard"})).catch((e)=>toast.show({variant:"error",message:e.message}))},[gw,toast,updateAttachments]),sendRef=import_react165.useRef(()=>{}),slash3=useSlash({dispatch,session,turnRef,queueRef,sendRef,composer:composer2,summoned,undone,capabilities,info:info3,sid:sid2,resumeId:durable||sid2,title:caption,skin:skin2,setQueue,setFocusRegion,setSplash,setAttachments:updateAttachments,setInfo:recordInfo,setUsage,setTitle,newSession,switchSession,activateSession,rewind,goTo,attachClipboard,voiceToggle:voice.toggle}),send=import_react165.useCallback(async(raw2)=>{if(creating.current)return;if(["exit","quit",":q",":q!",":wq"].includes(raw2.trim()))return quit(renderer,durableRef.current||sidRef.current,titleRef.current,gw);if(detaching.current>0){if(raw2.trim())composer2.current?.set(raw2);setStatus("detaching image\u2026");return}let m2=raw2.match(/^\/(\S+)(?:\s+([\s\S]*))?$/);if(m2){let[,name,arg=""]=m2,r=resolve9(cmdsRef.current,name);if("hit"in r)return slash3(r.hit,arg.trim());if("ambiguous"in r){let head=r.ambiguous.slice(0,6).join(", ");return dispatch({kind:"system",text:`ambiguous: /${name} \u2192 ${head}${r.ambiguous.length>6?", \u2026":""}`})}}let text6=raw2;if(hasInterp(raw2))setStatus("interpolating\u2026"),text6=await interpolate(gw,raw2),setStatus("");stream.interrupted.current=!1;let att=attachmentsRef.current,withMedia=att.length?[...att.flatMap((a)=>a.path?[`MEDIA:${a.path}`]:[]),text6].filter(Boolean).join(`
|
|
4237
|
+
`).length)),all2=props.attachments??[],previews=all2.filter((a)=>a.path&&classify(a.path)==="img").slice(0,MAX_PREVIEWS),chips=all2.filter((a)=>!previews.includes(a)).slice(0,MAX_PREVIEWS),shown=new Set([...previews,...chips]),attRows=all2.length>0?previews.length>0?2:1:0,lift=rows3+attRows+3,more=all2.filter((a)=>!shown.has(a)).length,bits=[props.hidden?.profile,props.hidden?.title,props.hidden?.place,props.hidden?.context].filter(Boolean);return $jsxs("box",{flexDirection:"column",position:"relative",children:[props.focused&&pop3.open?$jsx("box",{position:"absolute",bottom:lift,left:0,right:0,zIndex:2,children:$jsx(SlashPopover,{commands:pop3.popover,cursor:pop3.cursor,onCursor:pop3.setCursor,onSelect:select2})}):props.focused&&at.open?$jsx("box",{position:"absolute",bottom:lift,left:0,right:0,zIndex:2,children:$jsx(AtRefPopover,{items:at.items,cursor:at.cursor,onCursor:at.setCursor,onSelect:atAccept})}):props.focused&&comp.open?$jsx("box",{position:"absolute",bottom:lift,left:0,right:0,zIndex:2,children:$jsx(AtRefPopover,{items:comp.items,cursor:comp.cursor,onCursor:comp.setCursor,onSelect:(idx2)=>{let it=comp.items[idx2];if(it?.text)write(acceptCompletion(input,it,comp.replaceFrom,comp.replaceTo))}})}):null,(props.queue?.length??0)>0?$jsx("box",{flexDirection:"column",paddingX:1,paddingBottom:1,children:props.queue.map((q5,i)=>$jsx("box",{height:1,onMouseDown:()=>props.onDequeue?.(i),children:$jsxs("text",{children:[$jsxs("span",{fg:theme.borderSubtle,children:[i===0?"\u256D":"\u2502"," "]}),$jsxs("span",{fg:theme.textMuted,children:["\u23F8 ",i+1,". ",trunc5(q5,60)]})]})},i))}):null,$jsxs("box",{border:!0,borderStyle:"single",borderColor:mode2==="shell"?theme.primary:props.focused?theme.borderActive:theme.border,flexDirection:"column",position:"relative",children:[previews.length>0?$jsx("box",{flexDirection:"column",paddingX:1,maxHeight:MAX_PREVIEWS,overflow:"hidden",children:previews.map((a)=>$jsx(ChafaImage,{path:a.path,width:60,bare:!0},`p-${a.path}`))}):null,chips.length>0?$jsxs("box",{flexDirection:"row",flexWrap:"wrap",gap:1,paddingX:1,paddingTop:previews.length>0?0:1,paddingBottom:1,children:[chips.map((a,i)=>{if(a.path){let kind2=classify(a.path);return $jsxs("box",{flexDirection:"row",height:1,children:[$jsx(MediaChip,{path:a.path,bare:kind2==="img"}),kind2!=="img"&&a.token_estimate?$jsxs("text",{fg:theme.textMuted,children:[" ~",fmt5(a.token_estimate),"t"]}):null]},a.path)}return $jsxs("text",{children:[$jsx("span",{bg:theme.secondary,fg:theme.background,children:" file "}),$jsxs("span",{bg:theme.backgroundElement,fg:theme.textMuted,children:[" ",a.name??`file ${i+1}`," "]})]},a.name??i)}),more>0?$jsxs("text",{fg:theme.textMuted,children:["+",more]}):null]}):null,$jsxs("box",{flexDirection:"row",children:[$jsx("box",{width:1,children:$jsx("text",{fg:theme.primary,children:mode2==="shell"?"$":">"})}),$jsx("box",{width:1}),$jsx("textarea",{ref:taRef,syntaxStyle,onContentChange:()=>{let t2=ta.current;setInput(t2?.plainText??""),setCaret(t2?.cursorOffset??0)},onCursorChange:()=>{if(!live.current.input.includes("@")&&!live.current.input.includes("/"))return;let off=ta.current?.cursorOffset??0;setCaret((c)=>c===off?c:off)},onSubmit:submit4,onPaste:paste,keyBindings:bindings,wrapMode:"word",minHeight:1,maxHeight:MAX_ROWS,placeholder:mode2==="shell"?"Run a shell command (30s cap, cwd) \u2014 esc or \u232B to exit":props.streaming?"Type to queue... (Enter queues, click chip to edit)":"Message Hermes... (/ for commands, Shift+Enter for newline)",focused:props.focused,textColor:theme.text,focusedTextColor:theme.text,placeholderColor:theme.textMuted,cursorColor:theme.text,backgroundColor:"transparent",focusedBackgroundColor:"transparent",flexGrow:1})]}),pop3.ghost&&props.focused&&rows3===1&&pop3.spot?.whole?$jsx("box",{position:"absolute",top:attRows,left:2+input.length,height:1,children:$jsx("text",{fg:theme.textMuted,children:pop3.ghost})}):null]}),$jsxs("box",{height:1,flexDirection:"row",paddingX:1,children:[$jsxs("text",{children:[props.streaming?$jsx(SpinGlyph,{fg:dot}):$jsx("span",{fg:dot,children:"\u25CF"}),$jsxs("span",{fg:theme.textMuted,children:[" ",mode2==="shell"?"Shell":label3]}),mode2==="shell"?$jsx("span",{fg:theme.textMuted,children:" esc exit shell mode"}):props.starting&&props.escHint?$jsx("span",{fg:theme.warning,children:" esc again to cancel"}):props.starting?$jsx("span",{fg:theme.textMuted,children:" esc\xD72 cancel"}):props.streaming&&props.escHint?$jsx("span",{fg:theme.warning,children:" esc again to interrupt"}):props.streaming?$jsx("span",{fg:theme.textMuted,children:" esc\xD72 interrupt"}):null]}),$jsx("box",{flexGrow:1}),props.streaming&&(props.queue?.length??0)>0?$jsxs("text",{fg:theme.textMuted,children:[keys.print("queue.flush")," to send queued now "]}):null,bg2.count>0?$jsxs("text",{fg:theme.text,children:["\u25B6 ",bg2.count," "]}):null,resume?$jsxs("text",{fg:theme.textMuted,children:[resume," "]}):null,bits.length>0?$jsxs("text",{fg:theme.textMuted,children:[trunc5(bits.join(" \xB7 "),56)," "]}):null,props.model?$jsx("text",{fg:theme.textMuted,children:props.model}):null]})]})}));var import_react157=__toESM(require_react_production(),1);init_sessions_db();var normalize3=(sid2)=>sid2.trim().replace(/\.json$/i,"").replace(/^session_(?=\d{8}_)/,"");function useSession(){let gw=useGateway(),inflightMessages=(inflight)=>{let user2=String(inflight?.user??"").trim(),assistant2=String(inflight?.assistant??""),messages=[];if(user2)messages.push(...transcriptToMessages([{role:"user",text:user2}]));if(assistant2||inflight?.streaming)messages.push(...transcriptToMessages([{role:"assistant",text:assistant2}]));return messages},resume=import_react157.useCallback(async(sid2)=>{let target2=normalize3(sid2),res=await gw.request("session.resume",{session_id:target2}),id=res.session_id,key5=res.session_key??res.resumed??target2;gw.setSession(id),set("lastSessionId",key5);let messages=res.messages?.length?transcriptToMessages(res.messages):[];return{id,key:key5,messages,info:res.info}},[gw]),create=import_react157.useCallback(async()=>{let res=await gw.request("session.create",{}),key5=res.stored_session_id??res.session_id;return gw.setSession(res.session_id),set("lastSessionId",key5),{id:res.session_id,key:key5,info:res.info}},[gw]),activate=import_react157.useCallback(async(sid2)=>{let target2=normalize3(sid2),res=await gw.request("session.activate",{session_id:target2}),id=res.session_id,key5=res.session_key??id;gw.setSession(id),set("lastSessionId",key5);let history=res.messages?.length?transcriptToMessages(res.messages):[],running2=Boolean(res.running||res.status==="working"||res.status==="waiting");return{id,key:key5,info:res.info,messages:[...history,...inflightMessages(res.inflight)],running:running2,startedAt:res.started_at?res.started_at*1000:void 0,status:res.status}},[gw]),busy2=import_react157.useCallback(async()=>{try{return(await gw.request("agents.list")).processes?.some((p)=>p.status==="running")??!1}catch{return!0}},[gw]),close3=import_react157.useCallback(async(sid2,opts)=>{if(!sid2)return!1;if(opts?.preserveBackground&&await busy2())return!1;try{return await gw.request("session.close",{session_id:sid2}),!0}catch{return!1}},[gw,busy2]),boot2=import_react157.useCallback(async(launch)=>{let fresh2=async(note)=>({...await create(),messages:[],note});if(launch.mode==="resume"){let target2=launch.sid??exports_sessions_db.lastReal()?.id;if(!target2)return fresh2("no prior session to resume \u2014 starting fresh");try{return await resume(target2)}catch(e){let msg=e instanceof Error?e.message:String(e);return fresh2(`resume ${target2} failed: ${msg} \u2014 starting fresh`)}}let last4=get2("lastSessionId"),row4=last4?exports_sessions_db.byId(last4):null;if(row4?.message_count===0&&row4.parent_session_id==null)try{return await resume(row4.id)}catch{}return fresh2()},[create,resume]),interrupt=import_react157.useCallback(async()=>{await gw.request("session.interrupt")},[gw]),branch3=import_react157.useCallback(async(name)=>{return(await gw.request("session.branch",name?{name}:{})).session_id??null},[gw]),compress=import_react157.useCallback(async(arg="")=>{let raw2=arg.trim(),params=raw2?{raw_args:raw2,focus_topic:raw2}:{};return gw.request("session.compress",params)},[gw]),undo=import_react157.useCallback(async()=>{await gw.request("session.undo")},[gw]);return import_react157.useMemo(()=>({boot:boot2,create,resume,activate,close:close3,interrupt,branch:branch3,compress,undo}),[boot2,create,resume,activate,close3,interrupt,branch3,compress,undo])}var import_react158=__toESM(require_react_production(),1);function useTerminalTitle(active2,cwd){let renderer=useRenderer();import_react158.useEffect(()=>{let title=active2?"\u25CF Herm":"Herm",name=cwd?.split(/[\\/]/).filter(Boolean).at(-1);renderer.setTerminalTitle(name?`${title} \xB7 ${name}`:title)},[renderer,active2,cwd])}init_sessions_db();init_hermes_analytics();function rehome(newHome){process.env.HERMES_HOME=newHome,setHome2(newHome),setHome(newHome),cache3.clear(),close(),clear(),resetKanban(),close2(),exports_preferences.reload(),home3.reset()}var import_react160=__toESM(require_react_production(),1);var Countdown=(p)=>{let theme=useTheme().theme,[n,setN]=import_react160.useState(p.seconds);import_react160.useEffect(()=>{if(n<=0){p.onFire();return}let t2=setTimeout(()=>setN((v2)=>v2-1),1000);return()=>clearTimeout(t2)},[n,p.onFire]),useKeyboard(()=>p.onCancel());let bar3="\u2588".repeat(n)+"\u2591".repeat(Math.max(0,p.seconds-n));return $jsxs("box",{flexDirection:"column",width:58,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.warning,children:$jsx("strong",{children:p.title})})}),$jsx("box",{height:1}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",children:p.body})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsxs("text",{fg:theme.warning,children:[bar3," ",n,"s"]})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:p.action})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"press any key to cancel"})})]})};function openCountdown(dialog,opts){return new Promise((resolve4)=>{dialog.replace($jsx(Countdown,{...opts,onFire:()=>{dialog.clear(),resolve4(!0)},onCancel:()=>{dialog.clear(),resolve4(!1)}}),()=>resolve4(!1))})}var SECONDS=10,SUSPEND=process.platform==="darwin"?"pmset sleepnow":"systemctl suspend",run=(cmd)=>Bun.spawn(["sh","-c",cmd],{stdout:"ignore",stderr:"ignore"}),fired=new Map;function makeGoalHook(dialog,toast){let act=(goal,done2,total)=>{let pref=(exports_preferences.get("onGoalDone")??"toast").trim(),head=goal.length>60?goal.slice(0,57)+"\u2026":goal,n=total&&total>0?` ${done2}/${total} items`:"";if(toast.show({variant:"success",title:"Goal complete",message:head+n,duration:8000}),pref==="toast")return;let cmd=pref==="suspend"?SUSPEND:pref;openCountdown(dialog,{title:"Goal complete \u2014 "+(pref==="suspend"?"suspending":"running hook"),body:head,action:`\u2192 ${cmd}`,seconds:SECONDS}).then((ok)=>{if(ok)run(cmd)})};return{check:(sid2)=>{if(!sid2)return;io.goalState(sid2).then((s)=>{if(!s||s.status!=="done")return;if(fired.get(sid2)===s.goal)return;fired.set(sid2,s.goal);let list3=s.checklist??[],done2=list3.filter((i)=>i.status==="completed"||i.status==="impossible").length;act(s.goal,done2,list3.length)}).catch(()=>{})}}}var import_react162=__toESM(require_react_production(),1);function useVoice(gw,sys){let[enabled3,setEnabled]=import_react162.useState(!1),[recording,setRecording]=import_react162.useState(!1),[processing,setProcessing]=import_react162.useState(!1),[recordKeyRaw,setRecordKeyRaw]=import_react162.useState(),[tts,setTts]=import_react162.useState(!1),[onTranscript,setTranscript]=import_react162.useState(null),pending3=import_react162.useRef(0),recordGen=import_react162.useRef(0),toggleGen=import_react162.useRef(0),setOnTranscript=import_react162.useCallback((fn)=>setTranscript(fn?()=>fn:null),[]),reset4=import_react162.useCallback(()=>{toggleGen.current++,recordGen.current++,pending3.current=0,setEnabled(!1),setRecording(!1),setProcessing(!1),setTts(!1)},[]),recordKey=import_react162.useMemo(()=>parseVoiceRecordKey(recordKeyRaw),[recordKeyRaw]),keyLabel=import_react162.useMemo(()=>formatVoiceRecordKey(recordKey),[recordKey]),state3=import_react162.useMemo(()=>({enabled:enabled3,recording,processing,recordKey,tts}),[enabled3,recording,processing,recordKey,tts]),toggle=import_react162.useCallback(async(action,sid2)=>{let current2=++toggleGen.current;try{let r=await gw("voice.toggle",{action,session_id:sid2});if(toggleGen.current!==current2)return;if(r.enabled!==void 0){if(setEnabled(r.enabled),!r.enabled)recordGen.current++,setRecording(!1),setProcessing(!1)}if(r.tts!==void 0)setTts(r.tts);if(r.record_key)setRecordKeyRaw(r.record_key);let label3=formatVoiceRecordKey(parseVoiceRecordKey(r.record_key)),ttsMsg=r.tts?" \xB7 tts on":"",details2=action==="status"&&r.details?.trim()?` \xB7 ${r.details.trim()}`:"";sys(`voice ${r.enabled?"on":"off"}${ttsMsg} [${label3}]${details2}`)}catch(e){if(toggleGen.current!==current2)return;sys(`voice: ${e instanceof Error?e.message:"gateway error"}`)}},[gw,sys]),record2=import_react162.useCallback(async(sid2)=>{if(!enabled3){sys("voice: mode is off \u2014 enable with /voice on");return}if(pending3.current)return;let current2=++recordGen.current;pending3.current=current2;let starting=!recording,action=starting?"start":"stop";if(starting)setRecording(!0);else setRecording(!1),setProcessing(!1);try{let r=await gw("voice.record",{action,session_id:sid2});if(recordGen.current!==current2)return;if(starting&&r.status!=="recording"){if(setRecording(!1),r.status==="busy")setProcessing(!0),sys("voice: still transcribing; try again shortly")}}catch(e){if(recordGen.current!==current2)return;setRecording(!starting),sys(`voice error: ${e instanceof Error?e.message:"gateway error"}`)}finally{if(pending3.current===current2)pending3.current=0}},[enabled3,recording,gw,sys]);return{state:state3,toggle,record:record2,setEnabled,setRecording,setProcessing,setRecordKey:setRecordKeyRaw,reset:reset4,keyLabel,onTranscript,setOnTranscript}}function VoiceIndicator({voice,keyLabel}){let theme=useTheme().theme;if(!voice.enabled&&!voice.recording&&!voice.processing)return null;let text6,fg2=theme.text;if(voice.recording)text6="\u25CF recording",fg2=theme.error;else if(voice.processing)text6="\u25CC transcribing",fg2=theme.warning;else text6=`voice ready [${keyLabel}]`,fg2=theme.textMuted;return $jsx("text",{children:$jsxs("span",{fg:fg2,children:[text6," "]})})}function sessionCapabilities(input){let sessionConnected=Boolean(input.sid),metadataHydrated=input.ready,contract2=input.contract??exports_backend_contract.backendContract(null),ok=contract2.supported;return{sessionConnected,metadataHydrated,minContract:contract2.minContract,maxContract:contract2.maxContract,observedContract:contract2.observedContract,contractSupported:ok,contractReason:contract2.reason,contractMessage:ok?void 0:exports_backend_contract.contractMessage(contract2),canSubmitPrompt:sessionConnected&&ok,canDispatchGatewayCommand:sessionConnected&&ok,canDrainQueue:sessionConnected&&ok&&!input.streaming}}var import_react163=__toESM(require_react_production(),1);function openMessage(dialog,m2,ops){let text6=m2.parts.filter((p)=>p.type==="text").map((p)=>p.content).join("");dialog.replace($jsx(DialogSelect,{title:"Message Actions",options:[{title:"Copy",value:"copy",description:"message text to clipboard"},{title:"Rewind here",value:"rewind",description:"undo back to this turn (destructive)"},{title:"Fork here",value:"fork",description:"branch a new session at this point"}],onSelect:(o)=>{if(dialog.clear(),o.value==="copy")return void copyText(text6,ops.toast);if(o.value==="rewind")return ops.rewind(m2);if(o.value==="fork")return ops.fork(m2)}}))}async function undo(gw,count4,sid2){for(let i=0;i<count4;i++)await gw.request("session.undo",sid2?{session_id:sid2}:{})}var textOf=(message2)=>message2.parts.filter((part)=>part.type==="text").map((part)=>part.content).join("");function useMessageActions(args){let turns=import_react163.useCallback((message2)=>{let messages=args.turn.current.messages,at=messages.findIndex((item)=>item.id===message2.id);return at<0?0:messages.slice(at).filter((item)=>item.role==="user").length},[args.turn]),rewind=import_react163.useCallback(async(message2)=>{if(args.turn.current.streaming)return!1;let count4=turns(message2);if(!count4)return!1;try{await undo(args.gw,count4);let result=await args.gw.request("session.history");return args.dispatch({kind:"load",messages:transcriptToMessages(result.messages??[])}),args.composer.current?.set(textOf(message2)),args.focus("input"),!0}catch(err){return args.toast.show({variant:"error",message:err instanceof Error?err.message:String(err)}),!1}},[args.gw,args.toast,args.turn,args.dispatch,args.composer,args.focus,turns]),fork2=import_react163.useCallback(async(message2)=>{if(args.turn.current.streaming)return;let result=await args.gw.request("session.branch",{}).catch((err)=>{return args.toast.show({variant:"error",message:`branch failed: ${err.message}`}),null});if(!result?.session_id)return;try{if(await undo(args.gw,turns(message2),result.session_id),!await args.activate(result.session_id)){await args.session.close(result.session_id);return}args.composer.current?.set(textOf(message2)),args.focus("input"),args.toast.show({variant:"success",message:`forked \u2192 ${result.title??result.session_id}`})}catch(err){await args.session.close(result.session_id),args.toast.show({variant:"error",message:err instanceof Error?err.message:String(err)})}},[args.gw,args.toast,args.turn,args.activate,args.session,args.composer,args.focus,turns]),menu=import_react163.useCallback((message2)=>{if(args.turn.current.streaming)return;openMessage(args.dialog,message2,{rewind,fork:fork2,toast:args.toast})},[args.dialog,args.toast,args.turn,rewind,fork2]);return{rewind,fork:fork2,menu}}var BUSY_RE=/session busy|waiting for model response/i,profileHome=()=>process.env.HERMES_HOME||join30(process.env.HOME||homedir11(),".hermes"),App=(props)=>$jsx(ThemeProvider,{initial:props.initialTheme,children:$jsx(ToastProvider,{children:$jsx(KeysProvider,{overrides:props.keyOverrides,children:$jsx(AppShell,{...props})})})}),AppShell=(props)=>{let toast=useToast(),[runtime,setRuntime]=import_react165.useState(()=>({home:profileHome(),seq:0,launch:props.launch??{mode:"new"}})),current2=import_react165.useRef(runtime.home);current2.current=runtime.home;let switchProfile=import_react165.useCallback((newHome,name)=>{let prev=current2.current;try{rehome(newHome)}catch(err){try{rehome(prev)}catch{}let msg=err instanceof Error?err.message:String(err);toast.show({variant:"error",message:`Profile switch failed: ${msg}`});return}current2.current=newHome,setRuntime((r)=>({home:newHome,seq:r.seq+1,launch:{mode:"new",splash:!0}})),toast.show({variant:"info",message:`Switching to '${name}'\u2026`})},[toast]);return $jsx(GatewayProvider,{client:props.gateway,children:$jsx(DialogProvider,{children:$jsx(CommandProvider,{children:$jsx(PluginProvider,{plugins:props.plugins,children:$jsx(BackgroundProvider,{children:$jsx(AppInner,{launch:runtime.launch,onSwitchProfile:switchProfile})})})})})},`${runtime.home}:${runtime.seq}`)},AppInner=({launch:launch0,onSwitchProfile})=>{let gw=useGateway(),dialog=useDialog(),dialogOpen=useDialogOpen(),themeCtx=useTheme(),toast=useToast(),renderer=useRenderer(),plugins=usePlugins(),session=useSession(),dims=useTerminalDimensions(),goalHook=import_react165.useMemo(()=>makeGoalHook(dialog,toast),[dialog,toast]),[turn,dispatch]=import_react165.useReducer(turnReducer,initialTurn),[ready,setReady]=import_react165.useState(!1),[sid2,setSid]=import_react165.useState(""),sidRef=import_react165.useRef(sid2);sidRef.current=sid2;let[durable,setDurable]=import_react165.useState(""),durableRef=import_react165.useRef(durable);durableRef.current=durable;let[starting,setStarting]=import_react165.useState(!1),startRef=import_react165.useRef(starting);startRef.current=starting;let active2=turn.streaming||starting,[tab,setTab]=import_react165.useState(CHAT_TAB),[subTabs,setSubTabs]=import_react165.useState(()=>({[SESSIONS_TAB]:0,[AUTOMATION_TAB]:0,[CONFIG_TAB]:0,[EIKON_TAB]:0})),setSub=import_react165.useCallback((tabIdx,sub3)=>setSubTabs((prev)=>prev[tabIdx]===sub3?prev:{...prev,[tabIdx]:sub3}),[]),sessSub=import_react165.useCallback((i)=>setSub(SESSIONS_TAB,i),[setSub]),autoSub=import_react165.useCallback((i)=>setSub(AUTOMATION_TAB,i),[setSub]),cfgSub=import_react165.useCallback((i)=>setSub(CONFIG_TAB,i),[setSub]),eikSub=import_react165.useCallback((i)=>setSub(EIKON_TAB,i),[setSub]),[hideSidebar,setHideSidebar]=import_react165.useState(!1),[usage,setUsage]=import_react165.useState(void 0),[info3,setInfo]=import_react165.useState(null),[contract2,setContract]=import_react165.useState(()=>exports_backend_contract.backendContract(null)),recordInfo=import_react165.useCallback((next3)=>{setInfo(next3),setContract((prev)=>{let state3=exports_backend_contract.backendContract(next3);return state3.reason==="missing"&&prev.supported?prev:state3})},[]),capabilities=sessionCapabilities({sid:sid2,ready,streaming:active2,contract:contract2}),[title,setTitle]=import_react165.useState(""),caption=title.trim(),titleRef=import_react165.useRef(caption);titleRef.current=caption,import_react165.useEffect(()=>{process.removeAllListeners("SIGINT"),process.on("SIGINT",()=>quit(renderer,durableRef.current||sidRef.current,titleRef.current,gw))},[renderer,gw]),import_react165.useEffect(()=>{let w2=warning();if(!w2)return;toast.show({variant:"warning",title:"control server exposed",message:w2.message,duration:15000})},[toast]);let[focusRegion,setFocusRegion]=import_react165.useState("input"),goToTab=import_react165.useCallback((t2)=>{setTab(t2),setFocusRegion(t2===CHAT_TAB?"input":"content")},[]),goTo=import_react165.useCallback((t2,sub3)=>{setTab(t2),setSubTabs((prev)=>prev[t2]===sub3?prev:{...prev,[t2]:sub3}),setFocusRegion(t2===CHAT_TAB?"input":"content")},[]),[status2,setStatus]=import_react165.useState(""),[escHint,setEscHint]=import_react165.useState(!1),[eikon,setEikon]=import_react165.useState(void 0),[queue,setQueue]=import_react165.useState([]),[busy2,setBusy]=import_react165.useState("queue"),turnRef=import_react165.useRef(turn);turnRef.current=turn;let queueRef=import_react165.useRef(queue);queueRef.current=queue;let launchRef=import_react165.useRef(launch0),launch=launchRef.current,[splash,setSplash]=import_react165.useState(launch.splash!==!1),[switching,setSwitching]=import_react165.useState(!1),summoned=import_react165.useRef(!1),creating=import_react165.useRef(!1),[composing,setComposing]=import_react165.useState(!1),splashLast=import_react165.useMemo(()=>launch0.mode==="new"?lastReal():void 0,[launch0.mode]),splashInfo=import_react165.useMemo(()=>info3?{agentVersion:info3.version,behind:info3.update_behind,model:info3.model}:void 0,[info3?.version,info3?.update_behind,info3?.model]),splashLastProp=import_react165.useMemo(()=>splashLast?{id:splashLast.id,title:splashLast.title}:void 0,[splashLast]),news=import_react165.useMemo(()=>readChangelog()?.headline,[]),[attachments,setAttachments]=import_react165.useState([]),attachmentsRef=import_react165.useRef(attachments);attachmentsRef.current=attachments;let[cloudH,setCloudH]=import_react165.useState(CLOUD_MIN),[pick2,setPick]=import_react165.useState(void 0),[skin2,setSkin]=import_react165.useState(()=>deriveSkin(void 0)),inflight=import_react165.useRef(!1),hold=import_react165.useRef(!1),pending3=import_react165.useRef(!1),detaching=import_react165.useRef(0),[pulse,setPulse]=import_react165.useState(0),start2=import_react165.useCallback(()=>{inflight.current=!1,pending3.current=!1,setPulse((n)=>n+1)},[]),settle=import_react165.useCallback(()=>{if(!hold.current)return;hold.current=!1,setPulse((n)=>n+1)},[]),undone=import_react165.useRef([]),sessionStart=import_react165.useRef(Date.now()),composer2=import_react165.useRef(null),promptRef=import_react165.useRef(null),{cmds}=useSlashCommands(),cmdsRef=import_react165.useRef(cmds);cmdsRef.current=cmds;let sys=import_react165.useCallback((text6)=>dispatch({kind:"system",text:text6}),[]),voice=useVoice(gw.request.bind(gw),sys);import_react165.useEffect(()=>{voice.setOnTranscript((text6)=>{let c=composer2.current;if(!c)return;c.set(""),setTimeout(()=>sendRef.current(text6),0)})},[]),useTerminalTitle(active2,info3?.cwd);let[errorPulse,setErrorPulse]=import_react165.useState(!1);import_react165.useEffect(()=>{let restart=(mode2="resume")=>{let sid3=durableRef.current||sidRef.current;if(mode2==="resume"&&sid3)launchRef.current={mode:"resume",sid:sid3,splash:!1};gw.setSession(""),setReady(!1),setStarting(!1),setStatus("gateway restarting"),voice.reset()},exit=(code2)=>{let text6=`gateway exited${code2===null?"":` (${code2})`}`,sid3=durableRef.current||sidRef.current;if(sid3)launchRef.current={mode:"resume",sid:sid3,splash:!1};gw.setSession(""),setReady(!1),setStarting(!1),setStatus(text6),setErrorPulse(!0),voice.reset(),dispatch({kind:"system",text:text6})};return gw.on("restart",restart),gw.on("exit",exit),()=>{gw.off("restart",restart),gw.off("exit",exit)}},[gw]);let agentState=errorPulse?"error":turn.toolActive?"working":turn.streaming&&turn.hasContent?"speaking":active2?"thinking":composing?"listening":"idle",onAvatarHold=import_react165.useCallback((s)=>{if(s==="error")setErrorPulse(!1)},[]),prompt=import_react165.useMemo(()=>pending2(turn.messages),[turn.messages]),cloudAuto=turn.streaming&&!turn.hasContent&&!prompt,[force,setForce]=import_react165.useState(void 0),cloud=!prompt&&(force??cloudAuto),prevStream=import_react165.useRef(turn.streaming);import_react165.useEffect(()=>{if(!prevStream.current&&turn.streaming)setForce(void 0),setPick(void 0);prevStream.current=turn.streaming},[turn.streaming]);let onPick=import_react165.useCallback((m2)=>{setPick((p)=>{if(m2&&p&&m2.id===p.id){setForce(!1);return}return setForce(!!m2),m2})},[]),onAvatar=import_react165.useCallback(()=>{let next3=!cloud;if(!next3)setPick(void 0);setForce(next3)},[cloud]),closeCloud=import_react165.useCallback(()=>{setForce(!1),setPick(void 0)},[]),intr=import_react165.useRef(()=>{}),steer=import_react165.useCallback((text6)=>{let v2=text6.trim();if(!v2)return;gw.request("session.steer",{text:v2}).then((r)=>toast.show(r.status==="queued"?{variant:"success",message:"Queued \u2014 lands on next tool result"}:{variant:"info",message:"No turn running; send as a normal message"})).catch((e)=>toast.show({variant:"error",message:e.message}))},[gw,toast]),openSteer=import_react165.useCallback(()=>{openTextPrompt(dialog,{title:"Steer active turn",label:"Soft nudge for the running session"}).then((v2)=>{if(v2)steer(v2)})},[dialog,steer]),onEnqueue=import_react165.useCallback((t2)=>{if(busy2==="steer"){let v2=t2.trim();if(!v2)return;gw.request("session.steer",{text:v2}).then((r)=>{if(r.status==="queued")return toast.show({variant:"success",message:"Queued \u2014 lands on next tool result"});setQueue((q5)=>[...q5,t2]),toast.show({variant:"info",message:"steer rejected \u2014 queued for next turn"})}).catch(()=>setQueue((q5)=>[...q5,t2]));return}if(busy2==="interrupt"){hold.current=!0,setQueue((q5)=>[t2,...q5]),intr.current();return}setQueue((q5)=>[...q5,t2])},[busy2,gw,toast]),updateAttachments=import_react165.useCallback((next3)=>{let value2=typeof next3==="function"?next3(attachmentsRef.current):next3;attachmentsRef.current=value2,setAttachments(value2)},[]),onAttach=import_react165.useCallback((r)=>updateAttachments((a)=>[...a,r]),[updateAttachments]),stream=useStream({dispatch,session,launchRef,sidRef,sessionStart,goalHook,setSid,setDurable,setInfo:recordInfo,setReady,setTitle,setBusy,setStarting,setUsage,setStatus,setSkin,setSplash,setErrorPulse,settle,onVoiceStatus:(state3)=>{voice.setRecording(state3==="listening"||state3==="recording"),voice.setProcessing(state3==="transcribing"||state3==="processing")},onVoiceTranscript:(text6,noSpeechLimit)=>{if(voice.setRecording(!1),voice.setProcessing(!1),noSpeechLimit){voice.setEnabled(!1),sys("voice: disabled after repeated silence");return}voice.onTranscript?.(text6)},start:start2}),interrupt=import_react165.useCallback(()=>{if(startRef.current&&!turnRef.current.streaming)hold.current=!0;stream.doInterrupt()},[stream.doInterrupt]);intr.current=interrupt;let reset4=import_react165.useCallback(()=>{stream.interrupted.current=!1,hold.current=!1,pending3.current=!1,setQueue([]),toast.clear("credits.depleted"),undone.current=[],dispatch({kind:"reset"}),setUsage(void 0),setReady(!1),setStarting(!1),setStatus(""),setTitle(""),updateAttachments([])},[toast,updateAttachments]),newSession=import_react165.useCallback(async()=>{if(creating.current)return;creating.current=!0,setSwitching(!0);let prev=sidRef.current;summoned.current=!0,setSplash(!0),setReady(!1),gw.setSession("");try{let r=await session.create();if(reset4(),setSid(r.id),setDurable(r.key),launchRef.current={mode:"resume",sid:r.key,splash:!1},r.info)recordInfo(r.info),setUsage(r.info.usage);if(setReady(!0),setStarting(!1),setStatus(""),sessionStart.current=Date.now(),prev)session.close(prev,{preserveBackground:!0})}catch(err){if(prev)gw.setSession(prev),setReady(!0);setSplash(!1),summoned.current=!1,dispatch({kind:"system",text:`Failed to create session: ${err instanceof Error?err.message:String(err)}`})}finally{creating.current=!1,setSwitching(!1)}},[reset4,session,gw]),switchSession=import_react165.useCallback(async(target2)=>{let prev=sidRef.current,old=durableRef.current;summoned.current=!0,setSplash(!0),setSwitching(!0),gw.setSession(""),setSid(""),goToTab(CHAT_TAB);try{let res=await session.resume(target2);if(reset4(),setSid(res.id),setDurable(res.key),launchRef.current={mode:"resume",sid:res.key,splash:!1},res.info)recordInfo(res.info),setUsage(res.info.usage);if(setReady(!0),sessionStart.current=Date.now(),res.messages.length)dispatch({kind:"load",messages:res.messages});if(prev&&prev!==res.id)session.close(prev,{preserveBackground:!0});setSplash(!1),summoned.current=!1}catch(err){if(prev)gw.setSession(prev),setSid(prev),setDurable(old),setReady(!0);dispatch({kind:"system",text:`Failed to resume: ${err instanceof Error?err.message:String(err)}`}),setSplash(!1),summoned.current=!1}finally{setSwitching(!1)}},[reset4,session,goToTab,gw]),liveStatus=(state3,running2=!1)=>{if(state3==="waiting")return"waiting for input\u2026";if(state3==="starting")return"starting agent\u2026";return running2||state3==="working"?"running\u2026":"ready"},activateSession=import_react165.useCallback(async(target2)=>{let prev=sidRef.current,old=durableRef.current;summoned.current=!0,setSplash(!0),setSwitching(!0),gw.setSession(""),setSid(""),goToTab(CHAT_TAB);try{let res=await session.activate(target2);if(reset4(),setSid(res.id),setDurable(res.key),launchRef.current={mode:"resume",sid:res.key,splash:!1},res.info)recordInfo(res.info),setUsage(res.info.usage);if(sessionStart.current=res.startedAt??Date.now(),dispatch({kind:"load.live",messages:res.messages,streaming:res.running}),setStatus(liveStatus(res.status,res.running)),setReady(!0),setSplash(!1),summoned.current=!1,prev&&prev!==res.id)toast.show({variant:"info",message:"switched live session"});return!0}catch(err){if(prev)gw.setSession(prev),setSid(prev),setDurable(old),setReady(!0);return dispatch({kind:"system",text:`Failed to activate: ${err instanceof Error?err.message:String(err)}`}),setSplash(!1),summoned.current=!1,!1}finally{setSwitching(!1)}},[reset4,session,goToTab,toast,gw]),loadEikon=import_react165.useCallback((path4)=>{try{setEikon(parseEikonFile(path4))}catch{setEikon(void 0)}},[]),eikonName=usePref("eikon"),eikonRev=import_react165.useSyncExternalStore(exports_eikon.onRevision,exports_eikon.revision);import_react165.useEffect(()=>{let p=eikonName&&exports_eikon.baked(eikonName)||bundledEikonPath(skin2.skin?.name);if(p)loadEikon(p);else setEikon(void 0)},[eikonName,eikonRev,skin2.skin?.name,loadEikon]);let messageActions=useMessageActions({gw,dialog,toast,session,activate:activateSession,composer:composer2,turn:turnRef,dispatch,focus:setFocusRegion}),rewind=messageActions.rewind,msgMenu=messageActions.menu,attachClipboard=import_react165.useCallback(()=>{gw.request("clipboard.paste").then((r)=>r.attached?updateAttachments((a)=>[...a,r]):toast.show({variant:"info",message:r.message??"No image in clipboard"})).catch((e)=>toast.show({variant:"error",message:e.message}))},[gw,toast,updateAttachments]),sendRef=import_react165.useRef(()=>{}),slash3=useSlash({dispatch,session,turnRef,queueRef,sendRef,composer:composer2,summoned,undone,capabilities,info:info3,sid:sid2,resumeId:durable||sid2,title:caption,skin:skin2,setQueue,setFocusRegion,setSplash,setAttachments:updateAttachments,setInfo:recordInfo,setUsage,setTitle,newSession,switchSession,activateSession,rewind,goTo,attachClipboard,voiceToggle:voice.toggle}),send=import_react165.useCallback(async(raw2)=>{if(creating.current)return;if(["exit","quit",":q",":q!",":wq"].includes(raw2.trim()))return quit(renderer,durableRef.current||sidRef.current,titleRef.current,gw);if(detaching.current>0){if(raw2.trim())composer2.current?.set(raw2);setStatus("detaching image\u2026");return}let m2=raw2.match(/^\/(\S+)(?:\s+([\s\S]*))?$/);if(m2){let[,name,arg=""]=m2,r=resolve9(cmdsRef.current,name);if("hit"in r)return slash3(r.hit,arg.trim());if("ambiguous"in r){let head=r.ambiguous.slice(0,6).join(", ");return dispatch({kind:"system",text:`ambiguous: /${name} \u2192 ${head}${r.ambiguous.length>6?", \u2026":""}`})}}let text6=raw2;if(hasInterp(raw2))setStatus("interpolating\u2026"),text6=await interpolate(gw,raw2),setStatus("");stream.interrupted.current=!1;let att=attachmentsRef.current,withMedia=att.length?[...att.flatMap((a)=>a.path?[`MEDIA:${a.path}`]:[]),text6].filter(Boolean).join(`
|
|
4238
4238
|
`):text6;if(pending3.current){setQueue((q5)=>[...q5,raw2]),setStatus("queued for next turn");return}pending3.current=!0,setPulse((n)=>n+1),gw.request("prompt.submit",{text:text6}).then((r)=>{if(dispatch({kind:"user",text:withMedia}),r.status==="streaming"&&!turnRef.current.streaming)setStarting(!0),setStatus("starting agent\u2026");updateAttachments([]),undone.current=[],setTab(CHAT_TAB)}).catch((e)=>{let msg=e instanceof Error?e.message:String(e);if(BUSY_RE.test(msg)){pending3.current=!1,setPulse((n)=>n+1),inflight.current=!0,setQueue((q5)=>[text6,...q5]),setStatus("queued for next turn"),toast.show({variant:"info",message:"queued for next turn"}),setTimeout(()=>{inflight.current=!1,setPulse((n)=>n+1)},400);return}pending3.current=!1,setPulse((n)=>n+1),inflight.current=!1,setStarting(!1),dispatch({kind:"system",text:`submit failed: ${msg}`}),toast.show({variant:"error",message:msg})})},[gw,slash3,toast,updateAttachments]);sendRef.current=send;let blocked=import_react165.useCallback(()=>{let msg=capabilities.contractMessage;if(!msg)return;let text6=`${msg} Blocked prompt.submit.`;dispatch({kind:"system",text:`submit failed: ${text6}`}),toast.show({variant:"error",message:text6})},[capabilities.contractMessage,toast]),onShell=import_react165.useCallback((command)=>{setSplash(!1),dispatch({kind:"system",text:`$ ${command}`}),setStatus("running\u2026"),gw.request("shell.exec",{command}).then((r)=>{let out=(r.stdout??"").trimEnd(),err=(r.stderr??"").trimEnd(),body2=[out,err&&`stderr:
|
|
4239
4239
|
${err}`].filter(Boolean).join(`
|
|
4240
|
-
`);if(dispatch({kind:"system",text:body2||`(exit ${r.code??0})`}),(r.code??0)!==0)toast.show({variant:"warning",message:`exit ${r.code}`})}).catch((e)=>dispatch({kind:"system",text:`error: ${e.message}`})).finally(()=>setStatus(""))},[gw,toast]),onSend=import_react165.useCallback((raw2)=>{return setSplash(!1),send(raw2)},[send]),onEmptyEnter=import_react165.useCallback(()=>{if(!splash||summoned.current||!splashLast||composing)return!1;return setSplash(!1),switchSession(splashLast.id),!0},[splash,splashLast,composing,switchSession]);import_react165.useEffect(()=>{if(turn.streaming)start2()},[turn.streaming,start2]),import_react165.useEffect(()=>{if(!capabilities.canDrainQueue||inflight.current||hold.current||pending3.current||queue.length===0)return;let[head,...rest]=queue;inflight.current=!0,setQueue(rest),send(head)},[capabilities.canDrainQueue,queue,send,pulse]);let dequeue=import_react165.useCallback((i)=>{let item=queueRef.current[i];if(item===void 0)return;setQueue((q5)=>q5.filter((_2,j2)=>j2!==i)),composer2.current?.set(item),setFocusRegion("input")},[]),extra=plugins.routes,all2=import_react165.useMemo(()=>[...TABS,...extra.map((r)=>({name:r.name,description:r.description??"Plugin"}))],[extra]),routeName=import_react165.useRef(void 0),routesRef=import_react165.useRef(extra),tabMax=all2.length-1;import_react165.useEffect(()=>{plugins.bind(goTo,()=>all2[tab]?.name)},[plugins,goTo,all2,tab]),import_react165.useEffect(()=>{let changed2=routesRef.current!==extra;if(routesRef.current=extra,changed2&&tab>=TABS.length){let next3=extra.findIndex((route2)=>route2.name===routeName.current);if(next3<0){goToTab(CHAT_TAB);return}let index4=TABS.length+next3;if(index4!==tab){goToTab(index4);return}}routeName.current=all2[tab]?.name},[extra,all2,tab,goToTab]);let subCount=SUB_TABS[tab]?.length??0,cycleSub=import_react165.useCallback((dir2)=>{let labels=SUB_TABS[tab];if(!labels||labels.length===0)return;setSubTabs((prev)=>{let cur=prev[tab]??0,next3=(cur+dir2+labels.length)%labels.length;return next3===cur?prev:{...prev,[tab]:next3}})},[tab]);useAppKeys({tab,tabMax,chatTab:CHAT_TAB,setTab,subCount,cycleSub,focusRegion,setFocusRegion,streaming:turn.streaming,starting,dialogOpen:dialog.open,composer:composer2,onPromptKey:(k2)=>promptRef.current?.feed(k2)??!1,onEscape:()=>{if(!splash||!summoned.current)return!1;return setSplash(!1),summoned.current=!1,!0},onInterrupt:interrupt,queued:queue.length,onFlushQueue:()=>{hold.current=!0,interrupt()},onQuit:()=>quit(renderer,durable||sid2,caption,gw),onQuitArm:(label3)=>toast.show({variant:"info",message:`${label3} again to quit`}),onInterruptNotice:()=>{setEscHint(!0),setTimeout(()=>setEscHint(!1),5000)},onCopyLast:()=>{let m2=[...turnRef.current.messages].reverse().find((x2)=>x2.role==="assistant"&&text3(x2));if(m2)copyText(text3(m2),toast)},onCopyToast:toast.show,onAttachClipboard:attachClipboard,onDetachLast:()=>{if(detaching.current>0)return setStatus("detaching image\u2026"),!0;let target2=attachmentsRef.current.at(-1);if(!target2?.path)return!1;return detaching.current+=1,setStatus("detaching image\u2026"),setPulse((n)=>n+1),gw.request("image.detach",{path:target2.path}).then(()=>updateAttachments((a)=>a.filter((x2)=>x2.path!==target2.path))).catch((e)=>toast.show({variant:"error",message:e.message})).finally(()=>{detaching.current=Math.max(0,detaching.current-1),setStatus(""),setPulse((n)=>n+1)}),!0},onNotice:(text6)=>dispatch({kind:"system",text:text6}),onToggleSidebar:()=>setHideSidebar((v2)=>!v2),onSteer:openSteer,onStash:()=>{let c=composer2.current,v2=c?.value().trim()??"";if(!v2){let e=exports_stash.pop();if(!e)return toast.show({variant:"info",message:"stash empty"});c?.set(e.text);return}let n=exports_stash.push(v2);c?.set(""),toast.show({variant:"info",message:`stashed (${n})`})},voiceRecordKey:voice.state.recordKey,voiceEnabled:voice.state.enabled,onVoiceRecord:()=>voice.record(sidRef.current)}),useBridge({tab,ready,streaming:active2,messages:turn.messages,sid:sid2,focusRegion,setTab,setFocusRegion,dispatch,composer:composer2});let contentFocused=focusRegion==="content"&&!active2&&!dialogOpen,promptAnswer=import_react165.useCallback((id,label3,ok)=>dispatch({kind:"prompt.answered",id,label:label3,ok}),[]),promptWire=import_react165.useMemo(()=>({ref:promptRef,onAnswer:promptAnswer}),[promptAnswer]);import_react165.useEffect(()=>{if(prompt&&tab!==CHAT_TAB)setTab(CHAT_TAB)},[prompt?.id]);let content=()=>{let inner=(()=>{switch(tab){case CHAT_TAB:return $jsx(Chat,{messages:turn.messages,streaming:turn.streaming,prompt:promptWire,cloud,cloudH,pick:pick2,onResize:setCloudH,onPick,onClose:closeCloud,onRewind:msgMenu});case SESSIONS_TAB:return $jsx(SessionsGroup,{focused:contentFocused,sub:subTabs[SESSIONS_TAB]??0,setSub:sessSub,onSwitch:switchSession,onActivateLive:activateSession,currentId:sid2,messages:turn.messages,sessionStart:sessionStart.current,info:info3??void 0,usage});case AUTOMATION_TAB:return $jsx(Automation,{focused:contentFocused,sub:subTabs[AUTOMATION_TAB]??0,setSub:autoSub,sessionId:sid2,onSwitchProfile
|
|
4240
|
+
`);if(dispatch({kind:"system",text:body2||`(exit ${r.code??0})`}),(r.code??0)!==0)toast.show({variant:"warning",message:`exit ${r.code}`})}).catch((e)=>dispatch({kind:"system",text:`error: ${e.message}`})).finally(()=>setStatus(""))},[gw,toast]),onSend=import_react165.useCallback((raw2)=>{return setSplash(!1),send(raw2)},[send]),onEmptyEnter=import_react165.useCallback(()=>{if(!splash||summoned.current||!splashLast||composing)return!1;return setSplash(!1),switchSession(splashLast.id),!0},[splash,splashLast,composing,switchSession]);import_react165.useEffect(()=>{if(turn.streaming)start2()},[turn.streaming,start2]),import_react165.useEffect(()=>{if(!capabilities.canDrainQueue||inflight.current||hold.current||pending3.current||queue.length===0)return;let[head,...rest]=queue;inflight.current=!0,setQueue(rest),send(head)},[capabilities.canDrainQueue,queue,send,pulse]);let dequeue=import_react165.useCallback((i)=>{let item=queueRef.current[i];if(item===void 0)return;setQueue((q5)=>q5.filter((_2,j2)=>j2!==i)),composer2.current?.set(item),setFocusRegion("input")},[]),extra=plugins.routes,all2=import_react165.useMemo(()=>[...TABS,...extra.map((r)=>({name:r.name,description:r.description??"Plugin"}))],[extra]),routeName=import_react165.useRef(void 0),routesRef=import_react165.useRef(extra),tabMax=all2.length-1;import_react165.useEffect(()=>{plugins.bind(goTo,()=>all2[tab]?.name)},[plugins,goTo,all2,tab]),import_react165.useEffect(()=>{let changed2=routesRef.current!==extra;if(routesRef.current=extra,changed2&&tab>=TABS.length){let next3=extra.findIndex((route2)=>route2.name===routeName.current);if(next3<0){goToTab(CHAT_TAB);return}let index4=TABS.length+next3;if(index4!==tab){goToTab(index4);return}}routeName.current=all2[tab]?.name},[extra,all2,tab,goToTab]);let subCount=SUB_TABS[tab]?.length??0,cycleSub=import_react165.useCallback((dir2)=>{let labels=SUB_TABS[tab];if(!labels||labels.length===0)return;setSubTabs((prev)=>{let cur=prev[tab]??0,next3=(cur+dir2+labels.length)%labels.length;return next3===cur?prev:{...prev,[tab]:next3}})},[tab]);useAppKeys({tab,tabMax,chatTab:CHAT_TAB,setTab,subCount,cycleSub,focusRegion,setFocusRegion,streaming:turn.streaming,starting,dialogOpen:dialog.open,composer:composer2,onPromptKey:(k2)=>promptRef.current?.feed(k2)??!1,onEscape:()=>{if(!splash||!summoned.current)return!1;return setSplash(!1),summoned.current=!1,!0},onInterrupt:interrupt,queued:queue.length,onFlushQueue:()=>{hold.current=!0,interrupt()},onQuit:()=>quit(renderer,durable||sid2,caption,gw),onQuitArm:(label3)=>toast.show({variant:"info",message:`${label3} again to quit`}),onInterruptNotice:()=>{setEscHint(!0),setTimeout(()=>setEscHint(!1),5000)},onCopyLast:()=>{let m2=[...turnRef.current.messages].reverse().find((x2)=>x2.role==="assistant"&&text3(x2));if(m2)copyText(text3(m2),toast)},onCopyToast:toast.show,onAttachClipboard:attachClipboard,onDetachLast:()=>{if(detaching.current>0)return setStatus("detaching image\u2026"),!0;let target2=attachmentsRef.current.at(-1);if(!target2?.path)return!1;return detaching.current+=1,setStatus("detaching image\u2026"),setPulse((n)=>n+1),gw.request("image.detach",{path:target2.path}).then(()=>updateAttachments((a)=>a.filter((x2)=>x2.path!==target2.path))).catch((e)=>toast.show({variant:"error",message:e.message})).finally(()=>{detaching.current=Math.max(0,detaching.current-1),setStatus(""),setPulse((n)=>n+1)}),!0},onNotice:(text6)=>dispatch({kind:"system",text:text6}),onToggleSidebar:()=>setHideSidebar((v2)=>!v2),onSteer:openSteer,onStash:()=>{let c=composer2.current,v2=c?.value().trim()??"";if(!v2){let e=exports_stash.pop();if(!e)return toast.show({variant:"info",message:"stash empty"});c?.set(e.text);return}let n=exports_stash.push(v2);c?.set(""),toast.show({variant:"info",message:`stashed (${n})`})},voiceRecordKey:voice.state.recordKey,voiceEnabled:voice.state.enabled,onVoiceRecord:()=>voice.record(sidRef.current)}),useBridge({tab,ready,streaming:active2,messages:turn.messages,sid:sid2,focusRegion,setTab,setFocusRegion,dispatch,composer:composer2});let contentFocused=focusRegion==="content"&&!active2&&!dialogOpen,promptAnswer=import_react165.useCallback((id,label3,ok)=>dispatch({kind:"prompt.answered",id,label:label3,ok}),[]),promptWire=import_react165.useMemo(()=>({ref:promptRef,onAnswer:promptAnswer}),[promptAnswer]);import_react165.useEffect(()=>{if(prompt&&tab!==CHAT_TAB)setTab(CHAT_TAB)},[prompt?.id]);let content=()=>{let inner=(()=>{switch(tab){case CHAT_TAB:return $jsx(Chat,{messages:turn.messages,streaming:turn.streaming,prompt:promptWire,cloud,cloudH,pick:pick2,onResize:setCloudH,onPick,onClose:closeCloud,onRewind:msgMenu});case SESSIONS_TAB:return $jsx(SessionsGroup,{focused:contentFocused,sub:subTabs[SESSIONS_TAB]??0,setSub:sessSub,onSwitch:switchSession,onActivateLive:activateSession,currentId:sid2,messages:turn.messages,sessionStart:sessionStart.current,info:info3??void 0,usage});case AUTOMATION_TAB:return $jsx(Automation,{focused:contentFocused,sub:subTabs[AUTOMATION_TAB]??0,setSub:autoSub,sessionId:sid2,onSwitchProfile});case CONFIG_TAB:return $jsx(ConfigGroup,{focused:contentFocused,sub:subTabs[CONFIG_TAB]??0,setSub:cfgSub});case EIKON_TAB:return $jsx(EikonGroup,{focused:contentFocused,sub:subTabs[EIKON_TAB]??0,setSub:eikSub});default:{let r=extra[tab-TABS.length];return r?r.render({focused:contentFocused}):null}}})(),name=all2[tab]?.name??"unknown";return $jsx(import_react165.Profiler,{id:`tab:${name}`,onRender,children:inner})},theme=themeCtx.theme,onMouseUp=import_react165.useCallback(()=>copySelection(renderer,toast),[renderer,toast]),inputFocused=focusRegion==="input"&&!prompt&&!dialogOpen,sidebarVisible=dims.width>=(tab===CHAT_TAB?120:140)&&!hideSidebar,branch3=useGitBranch(info3?.cwd),hidden3=!sidebarVisible?hidden2({info:info3,usage,profile:activeProfileName(),title:caption,branch:branch3}):void 0;return $jsx(import_react165.Profiler,{id:"shell",onRender,children:$jsx(SkinProvider,{value:skin2,children:$jsxs("box",{width:"100%",height:"100%",flexDirection:"column",backgroundColor:theme.background,onMouseUp,children:[$jsx(TabBar,{tabs:all2,activeTab:tab,onTabChange:goToTab}),$jsxs("box",{flexGrow:1,flexDirection:"row",children:[$jsxs("box",{flexGrow:1,flexDirection:"column",children:[$jsxs("box",{flexGrow:1,position:"relative",children:[content(),splash&&tab===CHAT_TAB?$jsx(Splash,{info:splashInfo,last:summoned.current?void 0:splashLastProp,composing,news,loading:switching||!info3}):null]}),$jsxs("box",{flexShrink:0,zIndex:1,children:[$jsx(VoiceIndicator,{voice:voice.state,keyLabel:voice.keyLabel}),$jsx(Composer,{ref:composer2,focused:inputFocused,canSubmitPrompt:capabilities.canSubmitPrompt&&detaching.current===0,ready,streaming:active2||pending3.current,starting,status:status2,model:info3?.model,subagents:usage?.active_subagents??info3?.usage?.active_subagents,hidden:hidden3,escHint,queue,attachments,cmds,onSend,onSlash:slash3,onShell,onAttach,onAttachClipboard:attachClipboard,onEnqueue,onDequeue:dequeue,onSubmitBlocked:blocked,onDirty:setComposing,onEmptyEnter})]})]}),sidebarVisible?$jsx(import_react165.Profiler,{id:"sidebar",onRender,children:$jsx(Sidebar,{agentState,info:info3,usage,eikon,profile:activeProfileName(),title:caption,cloud:tab===0&&cloud,pulse:active2,onAvatar,onAvatarHold})}):null]}),plugins.has("app_bottom")?$jsx("box",{height:1,flexShrink:0,paddingX:1,overflow:"hidden",children:$jsx(plugins.Slot,{name:"app_bottom",mode:"single_winner",sid:sid2,tab,streaming:active2})}):null]})})})};var EIKON_CLI_USAGE=`herm eikon \u2014 install and manage Herm avatars
|
|
4241
4241
|
|
|
4242
4242
|
Usage:
|
|
4243
4243
|
herm eikon search [query] [--json]
|
|
@@ -4263,6 +4263,6 @@ Run 'herm eikon use ${out.name}' to activate.`)}if(cmd==="search"||cmd==="browse
|
|
|
4263
4263
|
installed: ${out.installed}`)}if(cmd==="info"){let name=p.values[0];if(!name)return emitError(io2,"usage: herm eikon info <name>",p.json);if(!deps.has(name))return emitError(io2,`No installed eikon named '${name}'`,p.json);let out=deps.info(name);if(p.json)return emit(io2,JSON.stringify({ok:!0,...out}));return emit(io2,`${out.name}${out.version?` v${out.version}`:""}${out.active?" active":" installed"}
|
|
4264
4264
|
source: ${out.source.kind} ${out.source.identity??out.source.origin??"unknown"}
|
|
4265
4265
|
trust: ${out.trust}`)}if(cmd==="list"){let rows3=deps.list().map((e)=>({name:e.name,file:e.file,hasSource:e.hasSource,sourceUrl:e.sourceUrl,lifecycle:e.lifecycle})),active2=deps.getActive()??null;if(p.json)return emit(io2,JSON.stringify({ok:!0,active:active2,eikons:rows3}));return emit(io2,rows3.length?rows3.map((e)=>`${e.name}${e.name===active2?" *":""}`).join(`
|
|
4266
|
-
`):"No installed eikons")}if(cmd==="use"){let name=p.values[0];if(!name)return emitError(io2,"usage: herm eikon use <name>",p.json);if(!deps.has(name)&&!deps.baked(name))return emitError(io2,`No installed or bundled eikon named '${name}'`,p.json);if(deps.setActive(name),p.json)return emit(io2,JSON.stringify({ok:!0,active:name}));return emit(io2,`Avatar \u2192 ${name}`)}if(cmd==="remove"){let name=p.values[0];if(!name)return emitError(io2,"usage: herm eikon remove <name>",p.json);if(!deps.has(name))return emitError(io2,`No installed eikon named '${name}'`,p.json);let wasActive=deps.getActive()===name,result=deps.remove(name,{confirmActive:p.activeOk});if(result?.type==="active-consequence")return emitError(io2,activeMessage(result),p.json,{consequence:"active",action:result.action,name:result.name});if(p.json)return emit(io2,JSON.stringify({ok:!0,name,removed:!0,activeCleared:wasActive}));return emit(io2,`Removed '${name}'${wasActive?" and cleared active avatar":""}`)}if(cmd==="update"){let name=p.values[0];if(!name)return emitError(io2,"usage: herm eikon update <name>",p.json);let out=await deps.update(name,{confirmActive:p.activeOk});if(isActiveConsequence(out))return emitError(io2,activeMessage(out),p.json,{consequence:"active",action:out.action,name:out.name});let active2=deps.getActive()??null;if(p.json)return emit(io2,JSON.stringify({ok:!0,name:out.name,n:out.n,bytes:out.bytes,active:active2}));return emit(io2,`Updated '${out.name}' (${out.n} files)`)}return emitError(io2,`unknown eikon command '${cmd}'`,p.json)}catch(e){return emitError(io2,e instanceof Error?e.message:String(e),p.json)}}init_perf();var exports_bundled_skills={};__export(exports_bundled_skills,{sync:()=>sync,skills:()=>exports_bundled_skills});import{existsSync as existsSync34,mkdirSync as mkdirSync10,readdirSync as readdirSync13,cpSync as cpSync2}from"fs";import{dirname as dirname15,join as
|
|
4267
|
-
`),js=doc.toJS();if(!js||typeof js!=="object"||Array.isArray(js))doc.contents=doc.createNode({});let cfg2=obj3(doc.toJS()),plug=obj3(cfg2.plugins);if(arr3(plug.disabled).includes(name)||arr3(plug.enabled).includes(name))return!1;return doc.setIn(["plugins","enabled"],[...arr3(plug.enabled),name]),mkdirSync11(dirname16(path4),{recursive:!0}),writeFileSync12(path4,String(doc),"utf8"),!0}function sync2(){let src3=locate5();if(!src3)return[];let root3=hermesPath("plugins"),out=[];for(let e of readdirSync14(src3,{withFileTypes:!0})){if(!e.isDirectory())continue;try{let dst=
|
|
4266
|
+
`):"No installed eikons")}if(cmd==="use"){let name=p.values[0];if(!name)return emitError(io2,"usage: herm eikon use <name>",p.json);if(!deps.has(name)&&!deps.baked(name))return emitError(io2,`No installed or bundled eikon named '${name}'`,p.json);if(deps.setActive(name),p.json)return emit(io2,JSON.stringify({ok:!0,active:name}));return emit(io2,`Avatar \u2192 ${name}`)}if(cmd==="remove"){let name=p.values[0];if(!name)return emitError(io2,"usage: herm eikon remove <name>",p.json);if(!deps.has(name))return emitError(io2,`No installed eikon named '${name}'`,p.json);let wasActive=deps.getActive()===name,result=deps.remove(name,{confirmActive:p.activeOk});if(result?.type==="active-consequence")return emitError(io2,activeMessage(result),p.json,{consequence:"active",action:result.action,name:result.name});if(p.json)return emit(io2,JSON.stringify({ok:!0,name,removed:!0,activeCleared:wasActive}));return emit(io2,`Removed '${name}'${wasActive?" and cleared active avatar":""}`)}if(cmd==="update"){let name=p.values[0];if(!name)return emitError(io2,"usage: herm eikon update <name>",p.json);let out=await deps.update(name,{confirmActive:p.activeOk});if(isActiveConsequence(out))return emitError(io2,activeMessage(out),p.json,{consequence:"active",action:out.action,name:out.name});let active2=deps.getActive()??null;if(p.json)return emit(io2,JSON.stringify({ok:!0,name:out.name,n:out.n,bytes:out.bytes,active:active2}));return emit(io2,`Updated '${out.name}' (${out.n} files)`)}return emitError(io2,`unknown eikon command '${cmd}'`,p.json)}catch(e){return emitError(io2,e instanceof Error?e.message:String(e),p.json)}}init_perf();var exports_bundled_skills={};__export(exports_bundled_skills,{sync:()=>sync,skills:()=>exports_bundled_skills});import{existsSync as existsSync34,mkdirSync as mkdirSync10,readdirSync as readdirSync13,cpSync as cpSync2}from"fs";import{dirname as dirname15,join as join31}from"path";var locate4=()=>{let d2=import.meta.dir;for(let i=0;i<5;i++){let p=join31(d2,"assets/skills");if(existsSync34(p))return p;let up=dirname15(d2);if(up===d2)break;d2=up}return};function has2(root3,n){if(existsSync34(join31(root3,n,"SKILL.md")))return!0;if(!existsSync34(root3))return!1;return readdirSync13(root3,{withFileTypes:!0}).some((e)=>e.isDirectory()&&existsSync34(join31(root3,e.name,n,"SKILL.md")))}function sync(){let src3=locate4();if(!src3)return[];let root3=hermesPath("skills"),dst=join31(root3,"creative"),out=[];for(let e of readdirSync13(src3,{withFileTypes:!0})){if(!e.isDirectory())continue;if(has2(root3,e.name))continue;mkdirSync10(dst,{recursive:!0}),cpSync2(join31(src3,e.name),join31(dst,e.name),{recursive:!0}),out.push(e.name)}return out}var exports_bundled_plugins={};__export(exports_bundled_plugins,{sync:()=>sync2,plugins:()=>exports_bundled_plugins});import{cpSync as cpSync3,existsSync as existsSync35,mkdirSync as mkdirSync11,readFileSync as readFileSync25,readdirSync as readdirSync14,writeFileSync as writeFileSync12}from"fs";import{dirname as dirname16,join as join32}from"path";var locate5=()=>{let dir2=import.meta.dir;for(let i=0;i<5;i++){let path4=join32(dir2,"assets/plugins");if(existsSync35(path4))return path4;let up=dirname16(dir2);if(up===dir2)break;dir2=up}return},obj3=(v2)=>v2&&typeof v2==="object"&&!Array.isArray(v2)?v2:{},arr3=(v2)=>Array.isArray(v2)?v2.map(String):[];function ours(dir2){let path4=join32(dir2,"plugin.yaml");if(!existsSync35(path4))return!1;let raw2=readFileSync25(path4,"utf8");return raw2.includes("name: eikon")&&raw2.includes("eikon_install")}function enable(name){let path4=hermesPath("config.yaml"),raw2=existsSync35(path4)?readFileSync25(path4,"utf8"):"",doc=$parseDocument(raw2||`{}
|
|
4267
|
+
`),js=doc.toJS();if(!js||typeof js!=="object"||Array.isArray(js))doc.contents=doc.createNode({});let cfg2=obj3(doc.toJS()),plug=obj3(cfg2.plugins);if(arr3(plug.disabled).includes(name)||arr3(plug.enabled).includes(name))return!1;return doc.setIn(["plugins","enabled"],[...arr3(plug.enabled),name]),mkdirSync11(dirname16(path4),{recursive:!0}),writeFileSync12(path4,String(doc),"utf8"),!0}function sync2(){let src3=locate5();if(!src3)return[];let root3=hermesPath("plugins"),out=[];for(let e of readdirSync14(src3,{withFileTypes:!0})){if(!e.isDirectory())continue;try{let dst=join32(root3,e.name),fresh2=!existsSync35(dst);if(fresh2)mkdirSync11(root3,{recursive:!0}),cpSync3(join32(src3,e.name),dst,{recursive:!0}),out.push(e.name);if(fresh2||ours(dst))enable(e.name)}catch{}}return out}import{writeSync as writeSync2}from"fs";var TERMINAL_MODE_RESET="\x1B[0'z\x1B[0'{\x1B[?2029l\x1B[?1016l\x1B[?1015l\x1B[?1006l\x1B[?1005l\x1B[?1003l\x1B[?1002l\x1B[?1001l\x1B[?1000l\x1B[?9l\x1B[?1004l\x1B[?2004l\x1B[?1049l\x1B[<u\x1B[>4;0m\x1B[0m\x1B[?25h";function resetTerminalModes(stream=process.stdout){if(!stream.isTTY)return!1;let fd=typeof stream.fd==="number"?stream.fd:stream===process.stdout?1:void 0;if(fd!==void 0)try{return writeSync2(fd,TERMINAL_MODE_RESET),!0}catch{}try{return stream.write(TERMINAL_MODE_RESET),!0}catch{return!1}}var wired=!1;function installExitResetHooks(){if(wired)return;wired=!0,process.on("exit",()=>{resetTerminalModes()});let codes={SIGHUP:129,SIGINT:130,SIGTERM:143};for(let sig of["SIGINT","SIGTERM","SIGHUP"])process.on(sig,()=>{resetTerminalModes(),process.exit(codes[sig])});process.on("uncaughtException",(err)=>{resetTerminalModes(),console.error(err),process.exit(1)}),process.on("unhandledRejection",(reason)=>{resetTerminalModes(),console.error(reason),process.exit(1)})}var cfg2={columns:{fallback:80,max:500},rows:{fallback:24,max:200}};function sanitizeTerminalDimension(value2,dim2){if(typeof value2!=="number")return cfg2[dim2].fallback;if(!Number.isFinite(value2))return cfg2[dim2].fallback;let n=Math.floor(value2);if(n<2)return cfg2[dim2].fallback;return Math.min(n,cfg2[dim2].max)}function findDescriptor(stream,dim2){let cur=stream;while(cur){let desc=Object.getOwnPropertyDescriptor(cur,dim2);if(desc)return desc;cur=Object.getPrototypeOf(cur)}return}function patchDimension(stream,dim2){let desc=findDescriptor(stream,dim2);if(desc&&desc.configurable===!1)return!1;let raw2=desc&&"value"in desc?desc.value:void 0,read5=desc?.get,write=desc?.set;try{return Object.defineProperty(stream,dim2,{configurable:!0,enumerable:desc?.enumerable??!0,get(){let value2=read5?read5.call(stream):raw2;return sanitizeTerminalDimension(value2,dim2)},set(value2){if(write){write.call(stream,value2);return}raw2=value2}}),!0}catch{return!1}}function clampStdoutDimensions(stream=process.stdout){if(!stream||typeof stream!=="object")return!1;let columns=patchDimension(stream,"columns"),rows3=patchDimension(stream,"rows");return columns||rows3}function fatal(err){resetTerminalModes(),console.error(err),process.exit(1)}boot("import-graph",Bun.nanoseconds()/1e6);var argv=Bun.argv.slice(2);if(argv[0]==="eikon"&&argv[1]==="install")exports_bundled_plugins.sync();var eikonCliExit=await handleEikonCli(argv);if(eikonCliExit!==null)process.exit(eikonCliExit);if(argv.includes("--help")||argv.includes("-h"))process.stdout.write(HELP3),process.exit(0);if(argv.includes("--version")||argv.includes("-v"))process.stdout.write(VERSION+`
|
|
4268
4268
|
`),process.exit(0);var launch=parseLaunch(argv);if(launch.gateway)process.env.HERM_GATEWAY_URL=launch.gateway;if(launch.profile){let home5=resolveProfileHome(launch.profile);if(!home5)throw Error(`profile not found: ${launch.profile}`);rehome(home5)}var main2=async()=>{resetTerminalModes(),installExitResetHooks(),clampStdoutDimensions(),mem("pre-renderer");let prefs=load2(),end=mark("renderer-init"),renderer=await createCliRenderer({exitOnCtrlC:!1,useMouse:prefs.mouse??!0,targetFps:prefs.targetFps??30,gatherStats:!1});renderer.setMaxListeners(64),end();let bump3=()=>renderer.capabilities?.kitty_keyboard||process.stdout.isTTY&&process.stdout.write("\x1B[>4;2m");bump3(),renderer.on("focus",bump3),mem("post-renderer"),await prime(prefs.theme??DEFAULT_THEME);let root3=createRoot(renderer),endRender=mark("first-render");root3.render($jsx(App,{initialTheme:prefs.theme,launch})),endRender(),boot("first-render",Bun.nanoseconds()/1e6),warmup(),warm(),exports_bundled_skills.sync(),exports_bundled_plugins.sync(),mem("post-first-render"),monitor(15000),start()};main2().catch(fatal);
|