@north-light/cli 0.3.523 → 0.3.525

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/api/command-manifest/result.d.ts +4 -2
  2. package/dist/api/command-manifest/result.js +1 -1
  3. package/dist/api/command-manifest/schema.js +1 -1
  4. package/dist/api/plugin-manifest-schema.d.ts +3 -0
  5. package/dist/builtin-memory/crouter-plugin/bundles-and-memory.md +2 -2
  6. package/dist/builtin-memory/crouter-plugin/commands.md +2 -2
  7. package/dist/builtin-memory/crouter-plugin/deploying.md +2 -2
  8. package/dist/builtin-memory/crouter-plugin/output.md +3 -1
  9. package/dist/clients/attach/chrome/roster.d.ts +1 -1
  10. package/dist/clients/attach/chrome/roster.js +4 -4
  11. package/dist/clients/attach/render/chat-view.d.ts +9 -0
  12. package/dist/clients/attach/render/chat-view.js +3 -3
  13. package/dist/clients/attach/render/page-block.d.ts +2 -0
  14. package/dist/clients/attach/render/page-block.js +1 -1
  15. package/dist/clients/attach/session/connection.d.ts +1 -1
  16. package/dist/clients/attach/session/context.d.ts +1 -1
  17. package/dist/clients/attach/session/profile-files.d.ts +3 -3
  18. package/dist/clients/attach/session/profile-files.js +1 -1
  19. package/dist/clients/attach/viewer.js +633 -756
  20. package/dist/commands/pkg/browse/command-view.js +1 -1
  21. package/dist/core/canvas/db.d.ts +28 -2
  22. package/dist/core/canvas/db.js +2 -2
  23. package/dist/core/canvas/nav-model.js +1 -1
  24. package/dist/core/canvas/recovery.js +1 -1
  25. package/dist/core/conversation-store/client.d.ts +2 -2
  26. package/dist/core/conversation-store/index.d.ts +30 -2
  27. package/dist/core/conversation-store/index.js +1 -1
  28. package/dist/core/conversation-store/patch.js +1 -1
  29. package/dist/core/graph/watches.d.ts +2 -0
  30. package/dist/core/graph/watches.js +9 -9
  31. package/dist/core/help.js +7 -7
  32. package/dist/core/llm/run.js +2 -2
  33. package/dist/core/runtime/broker/fault-retry.d.ts +9 -3
  34. package/dist/core/runtime/broker/fault-retry.js +1 -1
  35. package/dist/core/runtime/broker/rebind.d.ts +4 -0
  36. package/dist/core/runtime/broker/rebind.js +1 -1
  37. package/dist/core/runtime/broker/run-turn-queue.d.ts +2 -0
  38. package/dist/core/runtime/broker/run-turn-queue.js +1 -1
  39. package/dist/core/runtime/broker-persona-guidance.d.ts +1 -1
  40. package/dist/core/runtime/broker-persona-guidance.js +3 -3
  41. package/dist/core/runtime/broker.js +1 -1
  42. package/dist/core/runtime/close.d.ts +2 -2
  43. package/dist/core/runtime/close.js +1 -1
  44. package/dist/daemon/reconcilers/broker-supervision.js +4 -4
  45. package/dist/daemon/runs/observer.js +2 -2
  46. package/docs/plugin/bundles-and-memory.md +2 -2
  47. package/docs/plugin/commands.md +2 -2
  48. package/docs/plugin/deploying.md +2 -2
  49. package/docs/plugin/output.md +3 -1
  50. package/package.json +2 -2
  51. package/packages/crouter-identity/package.json +1 -1
  52. package/runtime.lock.json +12 -12
@@ -1,5 +1,5 @@
1
- var N=Object.defineProperty;var l=(h,t)=>N(h,"name",{value:t,configurable:!0});import{Container as P,Loader as V,Spacer as u,Text as w}from"@earendil-works/pi-tui";import{AssistantMessageComponent as z,BashExecutionComponent as v,BranchSummaryMessageComponent as Y,CompactionSummaryMessageComponent as K,CustomMessageComponent as _,parseSkillBlock as J,SkillInvocationMessageComponent as X,ToolExecutionComponent as Q,UserMessageComponent as B}from"@earendil-works/pi-coding-agent";import{attachMarkdownTheme as f}from"../config.js";import{ContextMessageComponent as j}from"./context-message.js";import{presentationFor as Z}from"./card-presentation.js";import{detectInlinePageResult as tt,PageBlockComponent as et}from"./page-block.js";import{CRTR_OUTPUT_CUSTOM_TYPE as st,CrtrOutputMessageComponent as F,createCrtrBashToolDefinition as it}from"./crtr-output.js";import{CRTR_CYCLE_DIVIDER_CUSTOM_TYPE as ot,endedByAbort as G}from"../../../core/runtime/session-cycles.js";import{isHumanWordsEntry as H,parseCard as nt}from"../../../shared/generated-context.js";import{assistantVisibleText as c,isGroupBoundaryKind as rt,isTrueUserMessage as y}from"../../../shared/tool-groups.js";import{messageKey as S,normalizeTurnReplyRecord as at,START_TURN_KEY as M,turnReplyText as W}from"../../../shared/turn-replies.js";import{isCycleDivider as ht}from"./condensed-history.js";import{transformDiagramFences as lt}from"./diagram.js";import{styleAttachAgentMarkdown as pt,styleAttachMarkdownSource as L,styleAttachMessageMarkdown as dt,styleAttachSummaryMarkdown as $}from"./markdown-source.js";import{createCrtrEditToolDefinition as ct}from"./edit-diff.js";import{GroupActivityRecorder as ut}from"./group-activity.js";import{GroupRecapComponent as ft}from"./group-recap.js";import{FoldedToolCallController as mt,bashCallBackgroundHintLines as gt,createCrtrPlainBashToolDefinition as yt,createCrtrReadToolDefinition as Tt,createCrtrWriteToolDefinition as Ct}from"./tool-calls.js";import{ringCompletionBell as kt}from"../chrome/completion-bell.js";import{extractFilePaths as bt}from"#core/human/visible-paths";import{extractDocRefs as wt}from"./doc-links.js";import{keepWhenCondensed as xt,liveRegionStart as Rt}from"./condensed-history.js";import{ViewerAssistantMessageComponent as x}from"./assistant-message.js";import{CompositeViewportSource as St,MeasuredContainer as E}from"./measured-container.js";import{readConfig as T,updateRawConfigAtomically as At}from"../../../core/config.js";import{DEFAULT_CONDENSED_HISTORY as Bt,DEFAULT_LIVE_CYCLES as Gt}from"../../../types.js";import{applySnapshot as Mt,applyToolGroupSummary as Et,applyWorkingActivity as Ot,bashEnd as Dt,bashOutput as It,bashStart as Pt,initialConvState as vt,reduce as _t}from"../../conversation/projection.js";const q=l(h=>`\x1B[2m${h}\x1B[22m`,"defaultDimStyle"),O=50;function jt(){try{return T("user").live_cycles}catch{return Gt}}l(jt,"readLiveCycles");function Ft(){try{return T("user").condensed_history}catch{return Bt}}l(Ft,"readCondensedHistory");function Ht(){try{return T("user").fold_finished_tools}catch{return!1}}l(Ht,"readFoldFinishedTools");function Wt(){try{return T("user").summarize_tool_calls}catch{return!1}}l(Wt,"readSummarizeToolCalls");function Lt(){try{return T("user").detailed_tool_recaps}catch{return!0}}l(Lt,"readDetailedToolRecaps");function $t(){try{return T("user").consolidate_replies}catch{return!1}}l($t,"readConsolidateReplies");function qt(h){try{At("user",t=>({...t,fold_finished_tools:h}))}catch{}}l(qt,"persistFoldFinishedTools");function Ut(h){return typeof h=="object"&&h!==null&&"setExpanded"in h&&typeof h.setExpanded=="function"}l(Ut,"isExpandable");const Nt=/\x1b\[[0-9;]*m/g,Vt=/\x1b\[([0-9;]*)m/g;function zt(h){return h.replace(Vt,(t,e)=>{const s=e.split(";"),i=[];for(let o=0;o<s.length;o++){const r=Number(s[o]===""?0:s[o]);if(r===38||r===48||r===58){const n=Number(s[o+1]),a=o+(n===5?2:n===2?4:1);r!==48&&i.push(...s.slice(o,a+1)),o=a;continue}r>=40&&r<=47||r>=100&&r<=107||i.push(String(r))}return i.length>0?`\x1B[${i.join(";")}m`:""})}l(zt,"stripBackground");const Yt=/<from\b[^>]*>[\s\S]*?<\/from>/g;class D extends u{static{l(this,"FoldedToolSeparator")}folded=!1;separatesToolGroup=!1;setFolded(t){this.folded=t,this.refresh()}setSeparatesToolGroup(t){this.separatesToolGroup=t,this.refresh()}refresh(){this.setLines(this.folded&&this.separatesToolGroup?1:0)}}class Kt extends P{static{l(this,"WorkingRow")}label=new w("",1,0);constructor(){super(),this.addChild(new u(1)),this.addChild(this.label)}setLabel(t){this.label.setText(t)}}function I(h,t,e){return`${h} ${h===1?t:e}`}l(I,"plural");class A extends Q{static{l(this,"MinimizableToolComponent")}activityCallId;minimized=!1;expandedState=!1;foldController;resultObserver;setToolView(t,e){this.foldController=t,this.resultObserver=e}updateResult(...t){this.resultObserver?.(t[0],t[1]??!1);const e=t[0],s=e.content;Array.isArray(s)&&/^elapsed \d+(?:h \d+)?m \d+s(?:\n|$)/.test(s.at(-1)?.text??"")?super.updateResult({...e,content:s.slice(0,-1)},t[1]):super.updateResult(...t)}setExpanded(t){this.expandedState=t,super.setExpanded(t)}setMinimized(t){!this.foldController||this.minimized===t||(this.minimized=t,this.foldController.setFolded(t),super.setExpanded(this.expandedState))}render(t){if(!this.minimized)return[...super.render(t),...gt(this.foldController?.callComponent(),t)];const e=this.foldController?.callComponent();return e?e.render(t).filter(s=>s.replace(Nt,"").trim().length>0).map(s=>zt(s).trimEnd()):super.render(t)}}const Jt=l(h=>`\x1B[31m${h}\x1B[39m`,"defaultErrorStyle"),Xt={accent:l(h=>`\x1B[33m${h}\x1B[39m`,"accent"),active:l(h=>`\x1B[36m${h}\x1B[39m`,"active"),info:l(h=>`\x1B[34m${h}\x1B[39m`,"info"),muted:q,faint:q,border:l(h=>h,"border"),surface:l(h=>h,"surface"),bold:l(h=>`\x1B[1m${h}\x1B[22m`,"bold"),error:Jt,warning:l(h=>`\x1B[33m${h}\x1B[39m`,"warning"),diffAdded:l(h=>`\x1B[32m${h}\x1B[39m`,"diffAdded"),diffRemoved:l(h=>`\x1B[91m${h}\x1B[39m`,"diffRemoved"),bashMode:l(h=>`\x1B[32m${h}\x1B[39m`,"bashMode"),bashModeAlt:l(h=>`\x1B[92m${h}\x1B[39m`,"bashModeAlt")};class Ae{static{l(this,"ChatView")}tui;container;historyContainer=new E;statusContainer=new E;bannerContainer;transcript;appendTarget=this.historyContainer;pageBlocks=new Map;inlinePageBlocks;pageOpenHint;backgroundBashHint;liveCycles;condensedHistory;cwd;showImages;imageWidthCells;hideThinking;hiddenThinkingLabel;toolOutputExpanded;foldSettledTools=Ht();summarizeToolCalls=Wt();detailedToolRecaps=Lt();showGroupSummaries=this.summarizeToolCalls&&this.foldSettledTools;groups=[];openGroup;consolidateReplies=$t();showWorking=!1;turnReplies=new Map;turns=[];openReplyTurn;carriedTurn={key:M,prose:[]};outsideTurns=0;turnHidden=new Set;groupSummaries=new Map;nodeRoster=new Map;streamingWasGroupMember=!1;onFooterEvent;onActivityChange;spinnerStyle;dimStyle;errorStyle;recapPalette;labelStyle=l(t=>`\x1B[1m${t}\x1B[22m`,"labelStyle");markdownTransformers=[(t,{messageType:e,availableWidth:s})=>e==="assistant"?lt(t,s):t,(t,{messageType:e})=>e==="user"?L(t):pt(t)];streamingComponent;streamingToolSeparator;foldedToolSeparatorContents=new Map;pendingTools=new Map;bashComponent;activityLoader;projection=vt();workingActivity=this.projection.workingActivity;runActive=!1;applyingSnapshot=!1;snapshotGeneration=0;deferredFrames=[];lastAssistantText;transcriptFilePaths=[];transcriptDocRefs=[];copyBlockRecords=[];copyIndex=new Map;condensedCopyBlocks=new WeakMap;constructor(t,e,s={}){if(this.tui=t,this.container=e,this.cwd=s.cwd??process.cwd(),this.showImages=s.showImages??!0,this.imageWidthCells=s.imageWidthCells??60,this.hideThinking=s.hideThinking??!1,this.hiddenThinkingLabel=s.hiddenThinkingLabel??"Thinking...",this.toolOutputExpanded=s.toolOutputExpanded??!1,this.liveCycles=s.liveCycles??jt(),this.condensedHistory=s.condensedHistory??Ft(),this.onFooterEvent=s.onFooterEvent,this.onActivityChange=s.onActivityChange,this.inlinePageBlocks=s.inlinePageBlocks??!1,this.pageOpenHint=s.pageOpenHint??(()=>"crtr human list"),this.backgroundBashHint=s.backgroundBashHint??(()=>null),this.recapPalette=s.palette??Xt,this.spinnerStyle=this.recapPalette.active,this.dimStyle=this.recapPalette.muted,this.errorStyle=this.recapPalette.error,s.banner&&s.banner.length>0){const i=new E;i.addChild(new u(1));for(const o of s.banner)i.addChild(new w(o,1,0));i.addChild(new u(1)),this.bannerContainer=i,this.container.addChild(i)}this.container.addChild(this.historyContainer),this.onActivityChange||this.container.addChild(this.statusContainer),this.transcript=new St([...this.bannerContainer?[this.bannerContainer]:[],this.historyContainer,...this.onActivityChange?[]:[this.statusContainer]])}transcriptSource(){return this.transcript}async applySnapshot(t){const e=++this.snapshotGeneration;if(this.applyingSnapshot=!0,this.deferredFrames.length=0,this.resetChat(),this.projection=Mt(t,this.projection),this.workingActivity=this.projection.workingActivity,this.runActive=this.projection.isStreaming,this.seedToolGroupSummaries(this.projection.toolGroupSummaryDetails),this.turnReplies.clear(),this.consolidateReplies)for(const[n,a]of Object.entries(at(t.turnReplies)))this.turnReplies.set(n,a);const s=new Map,i=this.projection.messages,o=i.length-1,r=Rt(i,this.liveCycles);if(r>0){const n=await this.buildCondensedBlock(i.slice(0,r),e);if(e!==this.snapshotGeneration)return;n&&this.appendCondensedBlock(n)}for(let n=r;n<i.length;n++){if(!this.projection.isStreaming&&n>r&&(n-r)%O===0&&(await new Promise(p=>setImmediate(p)),e!==this.snapshotGeneration))return;const a=i[n];if(a.role==="assistant"){const p=c(a);p.trim()&&(this.lastAssistantText=p,this.pushTranscriptText(p));const d=n===o&&this.projection.isStreaming&&a.stopReason!=="aborted"&&a.stopReason!=="error",C=c(a).trim()!=="",U=this.assistantToolCalls(a),k=a.stopReason==="aborted"||a.stopReason==="error",b=G(a)?"Interrupted":a.errorMessage??"Error";if(k){for(const m of s.values()){const g={content:[{type:"text",text:b}],isError:!0};m.updateResult(g),this.registerCopyBlock(m,"tool",b),this.settleGroupTool(m,g,!0)}s.clear()}(C||k)&&this.closeOpenGroup();let R;d?(this.streamingComponent=new x(void 0,this.hideThinking,f(),this.hiddenThinkingLabel,this.markdownTransformers),this.appendAssistantPart(this.streamingComponent,!C),this.registerCopyBlock(this.streamingComponent,"assistant",""),this.streamingWasGroupMember=!C,this.streamingComponent.updateContent(a),this.registerCopyBlock(this.streamingComponent,"assistant",c(a)),R=this.streamingToolSeparator=this.appendAssistantSeparator(!C)):R=this.appendAssistantMessage(a,!C&&!k),R&&this.setAssistantSeparatorContent(R,a);for(const m of U){this.pushTranscriptValue(m.arguments);const g=this.appendToolComponent(m.name,m.id,m.arguments);a.stopReason==="aborted"||a.stopReason==="error"?(g.updateResult({content:[{type:"text",text:b}],isError:!0}),this.registerCopyBlock(g,"tool",b),this.settleGroupTool(g,{content:[{type:"text",text:b}],isError:!0},!0)):s.set(m.id,g)}k&&this.closeOpenGroup(),!d&&!k&&this.recordTurnProse(a,!1)}else if(a.role==="toolResult"){this.pushTranscriptText(this.userMessageText(a));const p=s.get(a.toolCallId);p&&(p.updateResult(a),this.registerCopyBlock(p,"tool",this.toolResultText(a)),this.historyContainer.markDirty(p),this.settleGroupTool(p,a,a.isError===!0),s.delete(a.toolCallId),this.maybeAppendPageBlock(a))}else this.addMessageToChat(a)}for(const[n,a]of s)this.pendingTools.set(n,a);for(const n of this.turns)this.refreshTurn(n);this.applyToolDisplay(),this.projection.isStreaming&&this.setActivity(this.makeLoader(this.workingActivity)),this.tui.requestRender(),this.applyingSnapshot=!1,this.replayDeferredFrames()}async buildCondensedBlock(t,e){const s=new P,i=this.appendTarget,o=[];this.appendTarget=s,this.condensedCopyBlocks.set(s,o);try{if(this.consolidateReplies)return await this.buildCondensedTurns(t,e)&&s.children.length>0?{component:s,copyBlocks:o}:void 0;let r=0;for(const n of t)if(xt(n,this.condensedHistory)){if(r>0&&r%O===0&&(await new Promise(a=>setImmediate(a)),e!==this.snapshotGeneration))return;r++,this.pushTranscriptText(this.userMessageText(n)),this.addMessageToChat(n)}}finally{this.appendTarget=i,this.condensedCopyBlocks.delete(s)}return s.children.length>0?{component:s,copyBlocks:o}:void 0}async buildCondensedTurns(t,e){const s=[{key:M,prose:[],dividers:[]}];for(const n of t){const a=s.at(-1);if(y(n))s.push({key:S(n)??`local-${s.length}`,user:n,prose:[],dividers:[]});else if(ht(n))a.dividers.push(n);else if(n.role==="assistant"&&n.stopReason!=="aborted"&&n.stopReason!=="error"){const p=c(n).trim(),d=S(n);p!==""&&d!==void 0&&a.prose.push({key:d,text:p})}}const i=s.pop();let o=0;const r=l(async(n,a)=>{if(o>0&&o%O===0&&(await new Promise(d=>setImmediate(d)),e!==this.snapshotGeneration))return!1;o++,n.user!==void 0&&(this.pushTranscriptText(this.userMessageText(n.user)),this.addMessageToChat(n.user));const p=a?W(n.prose,this.turnReplies.get(n.key)):"";if(p!==""){const d=new x(void 0,this.hideThinking,f(),this.hiddenThinkingLabel,this.markdownTransformers);d.updateContent(this.replyMessage(p)),this.append(d),this.registerCopyBlock(d,"assistant",p)}for(const d of n.dividers)this.addMessageToChat(d);return!0},"render");for(const n of s)if(!await r(n,!0))return!1;return await r(i,!1)?(this.carriedTurn={key:i.key,prose:i.prose},!0):!1}deferIfBuilding(t){return this.applyingSnapshot?(this.deferredFrames.push(t),!0):!1}replayDeferredFrames(){const t=this.deferredFrames.splice(0);for(const e of t)e()}setWorkingActivity(t){if(this.deferIfBuilding(()=>this.setWorkingActivity(t)))return;const e=this.projection.activity===this.workingActivity;this.projection=Ot(this.projection,t),this.workingActivity=this.projection.workingActivity,this.runActive&&e&&this.setActivity(this.makeLoader(this.workingActivity))}settleRun(){this.runActive=!1;for(const t of this.pendingTools.values())this.settleGroupTool(t);if(this.streamingComponent){this.historyContainer.removeChild(this.streamingComponent);for(const t of this.turns)t.members.delete(this.streamingComponent);this.turnHidden.delete(this.streamingComponent),this.unregisterCopyBlock(this.streamingComponent),this.streamingComponent=void 0}this.streamingToolSeparator=void 0,this.pendingTools.clear(),this.openReplyTurn&&this.refreshWorkingRow(this.openReplyTurn),this.applyToolDisplay(),this.setActivity(void 0),this.settleBashComponent()}dispose(){this.settleRun()}toggleToolsExpanded(){let t;return this.summarizeToolCalls&&this.foldSettledTools?(this.showGroupSummaries=!this.showGroupSummaries,this.toolOutputExpanded=!this.showGroupSummaries,t={kind:"summaries",shown:this.showGroupSummaries}):(this.toolOutputExpanded=!this.toolOutputExpanded,t={kind:"output",expanded:this.toolOutputExpanded}),this.applyToolDisplay(),t}toggleFoldSettledTools(){return this.foldSettledTools=!this.foldSettledTools,qt(this.foldSettledTools),this.summarizeToolCalls&&this.foldSettledTools&&(this.showGroupSummaries=!0),this.applyToolDisplay(),this.foldSettledTools}applyToolDisplay(){const t=new Set(this.pendingTools.values());for(const i of this.groups)for(const o of i.inFlight)t.add(o);for(const i of this.historyContainer.children)i instanceof A&&i.setMinimized(this.foldSettledTools&&!t.has(i)),Ut(i)&&i.setExpanded(this.toolOutputExpanded);const e=this.turnFoldedComponents(t),s=new Set;for(const i of this.groups){this.applyGroupDisplay(i,e),s.add(i.recap);for(const o of i.members)s.add(o)}for(const i of this.turnHidden)!e.has(i)&&!s.has(i)&&this.historyContainer.setHidden(i,!1);for(const i of e)!s.has(i)&&!this.historyContainer.hiddenChildren.has(i)&&this.historyContainer.setHidden(i,!0);this.turnHidden=e,this.updateFoldedToolSeparators(t),this.historyContainer.markDirty(),this.tui.requestRender()}toggleShowWorking(){if(!this.consolidateReplies)return null;this.showWorking=!this.showWorking;for(const t of this.turns)this.refreshWorkingRow(t);return this.applyToolDisplay(),this.showWorking}applyTurnReply(t,e){if(!this.deferIfBuilding(()=>this.applyTurnReply(t,e))&&this.consolidateReplies){this.turnReplies.set(t,e);for(const s of this.turns)s.key===t&&this.refreshTurn(s);this.tui.requestRender()}}turnFoldedComponents(t){const e=new Set;if(!this.consolidateReplies||this.showWorking)return e;for(const s of this.turns){const i=s===this.openReplyTurn;for(const o of s.members)i&&(o===this.streamingComponent||o===this.streamingToolSeparator||o===this.bashComponent||t.has(o))||e.add(o)}return e}beginTurn(t,e=[]){const s=new x(void 0,this.hideThinking,f(),this.hiddenThinkingLabel,this.markdownTransformers),i=new Kt;this.outsideTurns++;try{this.append(i),this.append(s)}finally{this.outsideTurns--}this.registerCopyBlock(s,"assistant","");const o={key:t,reply:s,working:i,members:new Set,prose:e};return this.turns.push(o),this.openReplyTurn=o,this.refreshTurn(o),o}consolidatingHere(){return this.consolidateReplies&&this.appendTarget===this.historyContainer}currentTurn(){return this.openReplyTurn??this.beginTurn(this.carriedTurn.key,[...this.carriedTurn.prose])}recordTurnProse(t,e){if(!this.consolidatingHere()||t.role!=="assistant"||t.stopReason==="aborted"||t.stopReason==="error")return;const s=c(t).trim(),i=S(t);if(s===""||i===void 0)return;const o=this.currentTurn();o.prose.some(r=>r.key===i)||(o.prose.push({key:i,text:s}),e&&this.refreshTurn(o))}refreshTurn(t){const e=W(t.prose,this.turnReplies.get(t.key));t.reply.updateContent(this.replyMessage(e)),this.historyContainer.setHidden(t.reply,e===""),this.historyContainer.markDirty(t.reply),this.registerCopyBlock(t.reply,"assistant",e),e!==""&&t===this.turns.at(-1)&&(this.lastAssistantText=e),this.refreshWorkingRow(t)}refreshWorkingRow(t){let e=0,s=0;for(const a of t.members)a instanceof A?e++:(a instanceof j||a instanceof _||a instanceof F)&&s++;const i=t.prose.length,o=e>0||s>0||i>1,r=[i>0?I(i,"message","messages"):void 0,e>0?I(e,"tool call","tool calls"):void 0,s>0?I(s,"card","cards"):void 0].filter(a=>a!==void 0),n=this.runActive&&t===this.openReplyTurn;t.working.setLabel(this.dimStyle(`${this.showWorking?"\u25BE":"\u25B8"} ${n?"working \u2014 ":""}${r.join(" \xB7 ")}`)),this.historyContainer.setHidden(t.working,!o),this.historyContainer.markDirty(t.working)}replyMessage(t){return{role:"assistant",content:t===""?[]:[{type:"text",text:t}],stopReason:"stop"}}toggleThinking(){this.hideThinking=!this.hideThinking;for(const t of this.historyContainer.children)t instanceof z&&t.setHideThinkingBlock(this.hideThinking);for(const[t,e]of this.foldedToolSeparatorContents)t.setSeparatesToolGroup(e.hasText||!this.hideThinking&&e.hasThinking);return this.historyContainer.markDirty(),this.tui.requestRender(),this.hideThinking}handleEvent(t){if(!this.deferIfBuilding(()=>this.handleEvent(t))){switch(this.projection=_t(this.projection,t),t.type){case"agent_start":{this.runActive=this.projection.isStreaming;for(const e of this.pendingTools.values())this.settleGroupTool(e);this.pendingTools.clear(),this.openReplyTurn&&this.refreshWorkingRow(this.openReplyTurn),this.setActivity(this.makeLoader(this.workingActivity));break}case"agent_end":{this.settleRun(),kt();break}case"agent_settled":{this.settleRun();break}case"message_start":{if(t.message.role==="custom"||t.message.role==="user")this.addMessageToChat(t.message),this.consolidateReplies&&(this.openReplyTurn&&this.refreshWorkingRow(this.openReplyTurn),this.applyToolDisplay());else if(t.message.role==="assistant"){const e=c(t.message).trim()!=="";e&&this.closeOpenGroup(),this.streamingComponent=new x(void 0,this.hideThinking,f(),this.hiddenThinkingLabel,this.markdownTransformers),this.streamingWasGroupMember=!e,this.appendAssistantPart(this.streamingComponent,!e),this.registerCopyBlock(this.streamingComponent,"assistant",""),this.streamingComponent.updateContent(t.message),this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),this.streamingToolSeparator=this.appendAssistantSeparator(!e),this.setAssistantSeparatorContent(this.streamingToolSeparator,t.message)}break}case"message_update":{if(this.streamingComponent&&t.message.role==="assistant"){this.promoteStreamingAssistantToBoundary(t.message),this.streamingComponent.updateContent(t.message),this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),this.historyContainer.markDirty(this.streamingComponent);const e=this.assistantToolCalls(t.message);this.streamingToolSeparator&&this.setAssistantSeparatorContent(this.streamingToolSeparator,t.message);for(const s of e){this.pushTranscriptValue(s.arguments);const i=this.pendingTools.get(s.id);if(i)i.updateArgs(s.arguments),this.noteGroupTool(i,s.name,s.arguments),this.historyContainer.markDirty(i);else{const o=this.appendToolComponent(s.name,s.id,s.arguments);this.pendingTools.set(s.id,o)}}}break}case"message_end":{if(t.message.role!=="assistant")break;const e=t.message.stopReason==="aborted"||t.message.stopReason==="error";if(this.promoteStreamingAssistantToBoundary(t.message,e),this.streamingComponent&&this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),t.message.stopReason!=="aborted"&&t.message.stopReason!=="error"){const s=c(t.message);s.trim()&&(this.lastAssistantText=s,this.pushTranscriptText(s))}if(this.streamingComponent){const s=t.message.stopReason;let i=t.message.errorMessage;if(G(t.message)&&(i="Interrupted",t.message.errorMessage=i,t.message.stopReason="aborted"),this.streamingComponent.updateContent(t.message),s==="aborted"||s==="error"){const o=i??"Error";for(const r of this.pendingTools.values())r.updateResult({content:[{type:"text",text:o}],isError:!0}),this.registerCopyBlock(r,"tool",o),this.settleGroupTool(r,{content:[{type:"text",text:o}],isError:!0},!0),this.historyContainer.markDirty(r);this.pendingTools.clear()}else for(const o of this.pendingTools.values())o.setArgsComplete(),this.historyContainer.markDirty(o);this.historyContainer.markDirty(this.streamingComponent),this.streamingComponent=void 0,this.streamingToolSeparator=void 0}e&&(this.closeOpenGroup(),this.applyToolDisplay()),this.consolidateReplies&&(this.recordTurnProse(t.message,!0),this.openReplyTurn&&this.refreshWorkingRow(this.openReplyTurn),this.applyToolDisplay());break}case"tool_execution_start":{this.pushTranscriptValue(t.args);let e=this.pendingTools.get(t.toolCallId);e?this.noteGroupTool(e,t.toolName,t.args):(e=this.appendToolComponent(t.toolName,t.toolCallId,t.args),this.pendingTools.set(t.toolCallId,e)),e.markExecutionStarted(),this.historyContainer.markDirty(e);break}case"tool_execution_update":{const e=this.projection.partialToolResults.get(t.toolCallId)??t.partialResult;this.pushTranscriptValue(e);const s=this.pendingTools.get(t.toolCallId);s&&(s.updateResult(e,!0),this.registerCopyBlock(s,"tool",this.toolResultText(e)),this.historyContainer.markDirty(s));break}case"tool_execution_end":{const e=this.projection.partialToolResults.get(t.toolCallId)??t.result;this.pushTranscriptValue(e);const s=this.pendingTools.get(t.toolCallId);s&&(s.updateResult(e),this.registerCopyBlock(s,"tool",this.toolResultText(e)),this.pendingTools.delete(t.toolCallId),this.settleGroupTool(s,e,t.isError),this.applyToolDisplay(),this.historyContainer.markDirty(s),this.maybeAppendPageBlock(e));break}case"compaction_start":{const e=t.reason==="manual"?"Compacting context...":"Auto-compacting...";this.setActivity(this.makeLoader(e));break}case"compaction_end":{this.setActivity(this.runActive?this.makeLoader(this.workingActivity):void 0),t.aborted?this.showStatus(t.reason==="manual"?"Compaction cancelled":"Auto-compaction cancelled"):t.result?this.addMessageToChat({role:"compactionSummary",summary:t.result.summary,tokensBefore:t.result.tokensBefore,timestamp:Date.now()}):t.errorMessage&&this.showError(t.errorMessage);break}case"auto_retry_start":{const e=Math.ceil(t.delayMs/1e3);this.setActivity(this.makeLoader(`Retrying (${t.attempt}/${t.maxAttempts}) in ${e}s...`));break}case"auto_retry_end":{this.setActivity(this.runActive?this.makeLoader(this.workingActivity):void 0),t.success||this.showError(`Retry failed after ${t.attempt} attempts: ${t.finalError??"Unknown error"}`);break}case"queue_update":case"session_info_changed":case"thinking_level_changed":this.onFooterEvent?.(t);break;default:break}this.tui.requestRender()}}bashStart(t,e){if(this.deferIfBuilding(()=>this.bashStart(t,e)))return;this.projection=Pt(this.projection,t,e),this.closeOpenGroup(),this.settleBashComponent();let s;s=new v(t,this.componentTui(()=>s),e),this.bashComponent=s,this.append(s),this.tui.requestRender()}bashOutput(t){this.deferIfBuilding(()=>this.bashOutput(t))||(this.projection=It(this.projection,t),this.pushTranscriptText(t),this.bashComponent&&(this.bashComponent.appendOutput(t),this.historyContainer.markDirty(this.bashComponent)),this.tui.requestRender())}bashEnd(t){this.deferIfBuilding(()=>this.bashEnd(t))||(this.projection=Dt(this.projection,t),this.settleBashComponent(t),this.tui.requestRender())}addMessageToChat(t){const e=nt(t);if(e!==null&&(t.role!=="custom"||t.display===!0)){this.pushTranscriptText(e.body);const s=e.senders.flatMap(o=>o.entries).filter(H).map(o=>o.body.trim()).filter(o=>o!=="");if(!(s.length>0&&e.body.replace(Yt,"").trim()===""&&e.senders.every(o=>o.entries.every(H)))){const o=Z(e.kind),r=new j(e,o,this.toolOutputExpanded,this.dimStyle,n=>this.spinnerStyle(this.labelStyle(n)));rt(e.kind)?(this.closeOpenGroup(),this.append(r)):this.appendGroupMember(r)?.activity.noteCard(e,o)}for(const o of s)this.appendHumanAnswer(o);return}switch(t.role){case"bashExecution":{this.closeOpenGroup(),this.pushTranscriptText(t.output??"");const s=new v(t.command,this.tui,t.excludeFromContext);t.output&&s.appendOutput(t.output),s.setComplete(t.exitCode,t.cancelled,t.truncated?{truncated:!0}:void 0,t.fullOutputPath),this.append(s);break}case"custom":{if(t.display){if(this.pushTranscriptText(this.userMessageText(t)),t.customType===st){this.appendGroupMember(new F(this.userMessageText(t),this.toolOutputExpanded,this.crtrOutputTheme()));break}if(t.customType===ot){this.closeOpenGroup(),this.append(new u(1)),this.append(new w(this.dimStyle(`\u2500\u2500 ${this.userMessageText(t)} \u2500\u2500`),1,0)),this.append(new u(1));break}const s=new _(dt(t),void 0,f());s.setExpanded(this.toolOutputExpanded),this.appendGroupMember(s)}break}case"compactionSummary":{this.closeOpenGroup(),this.append(new u(1));const s=new K($(t),f());s.setExpanded(this.toolOutputExpanded),this.append(s);break}case"branchSummary":{this.closeOpenGroup(),this.append(new u(1));const s=new Y($(t),f());s.setExpanded(this.toolOutputExpanded),this.append(s),this.registerCopyBlock(s,"assistant",t.summary);break}case"user":{if(y(t)&&this.closeOpenGroup(),y(t)&&this.consolidatingHere()){!this.openReplyTurn&&this.carriedTurn.prose.length>0&&this.currentTurn(),this.outsideTurns++;try{this.appendUserMessage(t)}finally{this.outsideTurns--}this.beginTurn(S(t)??`local-${this.turns.length}`);break}this.appendUserMessage(t);break}case"assistant":{const s=c(t).trim()!=="";s&&this.closeOpenGroup(),this.appendAssistantMessage(t,!s);break}default:break}}appendUserMessage(t){const e=this.userMessageText(t);if(!e)return;this.pushTranscriptText(e),this.chatChildCount()>0&&this.appendUserPart(new u(1),!y(t));const s=J(e);if(s){const i=new X({...s,content:L(s.content)},f());if(i.setExpanded(this.toolOutputExpanded),this.appendUserPart(i,!y(t)),this.registerCopyBlock(i,"user",e),s.userMessage){const o=new B(s.userMessage,f(),void 0,this.markdownTransformers);this.appendUserPart(o,!y(t)),this.registerCopyBlock(o,"user",s.userMessage)}}else{const i=new B(e,f(),void 0,this.markdownTransformers);this.appendUserPart(i,!y(t)),this.registerCopyBlock(i,"user",e)}}appendAssistantMessage(t,e=!1){const s=new x(void 0,this.hideThinking,f(),this.hiddenThinkingLabel,this.markdownTransformers),i=G(t)?{...t,stopReason:"aborted",errorMessage:"Interrupted"}:t;s.updateContent(i),this.appendAssistantPart(s,e),this.registerCopyBlock(s,"assistant",c(t));const o=this.appendAssistantSeparator(e);return this.setAssistantSeparatorContent(o,t),o}appendAssistantSeparator(t=!1){const e=new D;return t?this.appendGroupMember(e):this.append(e),e}appendAssistantPart(t,e){e?this.appendGroupMember(t):this.append(t)}appendUserPart(t,e){e?this.appendGroupMember(t):this.append(t)}appendHumanAnswer(t){this.outsideTurns++;try{this.appendHumanAnswerParts(t)}finally{this.outsideTurns--}}appendHumanAnswerParts(t){this.closeOpenGroup(),this.chatChildCount()>0&&this.append(new u(1));const e=new B(t,f(),void 0,this.markdownTransformers);this.append(e),this.registerCopyBlock(e,"user",t)}isLiveGroupRegion(){return this.appendTarget===this.historyContainer}ensureGroup(){if(!this.isLiveGroupRegion())return;if(this.openGroup)return this.openGroup;const t=new ft,e={members:[],recap:t,activity:new ut(this.cwd,this.nodeRoster),toolCount:0,inFlight:new Set};return this.append(t),this.historyContainer.setHidden(t,!0),this.groups.push(e),this.openGroup=e,e}closeOpenGroup(){this.openGroup=void 0}appendGroupMember(t){const e=this.ensureGroup();return this.append(t),e&&e.members.push(t),e}removeGroupMember(t){for(const e of this.groups){const s=e.members.indexOf(t);s!==-1&&e.members.splice(s,1)}this.historyContainer.setHidden(t,!1)}appendToolComponent(t,e,s){const i=this.isLiveGroupRegion()&&!this.openGroup&&this.historyContainer.children.at(-1)instanceof D?this.historyContainer.children.at(-1):void 0;i&&this.historyContainer.removeChild(i);const o=this.ensureGroup();i&&(this.append(i),o?.members.push(i));const r=this.makeToolComponent(t,e,s);return r.activityCallId=e,this.appendGroupMember(r),this.registerCopyBlock(r,"tool",""),o&&(o.key??=e,o.toolCount++,o.inFlight.add(r),o.activity.noteCall(e,t,s)),r}noteGroupTool(t,e,s){if(t.activityCallId)for(const i of this.groups)i.members.includes(t)&&i.activity.noteCall(t.activityCallId,e,s)}settleGroupTool(t,e,s=!1){for(const i of this.groups)i.inFlight.delete(t),!(!t.activityCallId||!i.members.includes(t))&&(e===void 0?i.activity.resolveWithoutResult(t.activityCallId):i.activity.settle(t.activityCallId,e,s))}promoteStreamingAssistantToBoundary(t,e=!1){!this.streamingWasGroupMember||!e&&c(t).trim()===""||(this.streamingComponent&&this.removeGroupMember(this.streamingComponent),this.streamingToolSeparator&&this.removeGroupMember(this.streamingToolSeparator),this.streamingWasGroupMember=!1,this.closeOpenGroup())}seedToolGroupSummaries(t){this.groupSummaries.clear();for(const[e,s]of Object.entries(t))this.groupSummaries.set(e,s)}applyToolGroupSummary(t,e){if(this.deferIfBuilding(()=>this.applyToolGroupSummary(t,e)))return;this.projection=Et(this.projection,t,e);const s=this.projection.toolGroupSummaryDetails[t];s!==void 0&&(this.groupSummaries.set(t,s),this.applyToolDisplay())}applyGroupDisplay(t,e){const s=t.key===void 0?void 0:this.groupSummaries.get(t.key),i=this.foldSettledTools&&this.showGroupSummaries&&t.toolCount>0&&t.inFlight.size===0&&s!==void 0;t.recap.setRecap(i?s:void 0,t.toolCount,t.activity.activity(),this.detailedToolRecaps,this.recapPalette),this.historyContainer.setHidden(t.recap,!i||e.has(t.recap));for(const o of t.members)this.historyContainer.setHidden(o,i||e.has(o))}updateFoldedToolSeparators(t=new Set(this.pendingTools.values())){const e=this.historyContainer.children;for(let s=0;s<e.length;s++){const i=e[s];if(!(i instanceof D))continue;const o=e[s+1];i.setFolded(this.foldSettledTools&&!this.historyContainer.hiddenChildren.has(i)&&o instanceof A&&!this.historyContainer.hiddenChildren.has(o)&&!t.has(o)),this.historyContainer.markDirty(i)}}setAssistantSeparatorContent(t,e){const s=e.content,i=Array.isArray(s)?s:[],o=i.some(n=>typeof n=="object"&&n!==null&&n.type==="text"&&typeof n.text=="string"&&n.text.trim()!==""),r=i.some(n=>typeof n=="object"&&n!==null&&n.type==="thinking"&&typeof n.thinking=="string"&&n.thinking.trim()!=="");this.foldedToolSeparatorContents.set(t,{hasText:o,hasThinking:r}),t.setSeparatesToolGroup(o||!this.hideThinking&&r)}makeToolComponent(t,e,s){const i=new mt;let o,r;if(t==="bash"){const a=it(s,i);a===void 0?r=yt(this.cwd,i,this.backgroundBashHint):r=a.definition}else if(t==="edit"){const a=ct(this.cwd,i);r=a.definition,o=a.observeResult}else t==="read"?r=Tt(this.cwd,i):t==="write"&&(r=Ct(this.cwd,i));let n;return n=new A(t,e,s,{showImages:this.showImages,imageWidthCells:this.imageWidthCells},r,this.componentTui(()=>n),this.cwd),n.setToolView(r===void 0?void 0:i,o),n.setExpanded(this.toolOutputExpanded),n}append(t){if(this.outsideTurns===0&&this.consolidatingHere()){const e=this.currentTurn();this.appendTarget.addChild(t),e.members.add(t);return}this.appendTarget.addChild(t)}chatChildCount(){return this.appendTarget.children.length}resetChat(){this.setActivity(void 0),this.settleBashComponent(),this.streamingComponent=void 0,this.streamingToolSeparator=void 0,this.streamingWasGroupMember=!1,this.foldedToolSeparatorContents.clear(),this.groups.length=0,this.openGroup=void 0,this.turns.length=0,this.openReplyTurn=void 0,this.carriedTurn={key:M,prose:[]},this.turnHidden=new Set,this.groupSummaries.clear(),this.nodeRoster.clear(),this.pendingTools.clear(),this.lastAssistantText=void 0,this.copyBlockRecords.length=0,this.copyIndex.clear(),this.transcriptFilePaths.length=0,this.transcriptDocRefs.length=0,this.pageBlocks.clear(),this.historyContainer.clear()}maybeAppendPageBlock(t){if(!this.inlinePageBlocks||this.appendTarget!==this.historyContainer)return;const e=tt(t);if(e===void 0||this.pageBlocks.has(e.pageId))return;const s=new et(e.pageId,this.pageOpenHint);this.pageBlocks.set(e.pageId,s),this.outsideTurns++;try{this.append(s)}finally{this.outsideTurns--}this.loadPageBlock(s)}async loadPageBlock(t){await t.refresh()&&(this.historyContainer.markDirty(t),this.tui.requestRender())}refreshInFlightTools(){if(this.pendingTools.size!==0){for(const t of this.pendingTools.values())this.historyContainer.markDirty(t);this.tui.requestRender()}}async refreshPageBlocks(){const t=[...this.pageBlocks.values()];(await Promise.all(t.map(async s=>{const i=await s.refresh();return i&&this.historyContainer.markDirty(s),i}))).some(Boolean)&&this.tui.requestRender()}makeLoader(t){let e;const s={requestRender:l(i=>{e&&!this.onActivityChange&&this.statusContainer.markDirty(e),this.tui.requestRender(i)},"requestRender"),terminal:this.tui.terminal};return e=new V(s,this.spinnerStyle,this.dimStyle,t),e}componentTui(t){return{requestRender:l(e=>{this.historyContainer.markDirty(t()),this.tui.requestRender(e)},"requestRender"),terminal:this.tui.terminal}}settleBashComponent(t){if(!this.bashComponent)return;const e=this.bashComponent;e.setComplete(t?.exitCode,t?.cancelled??!0,t?.truncated?{truncated:!0}:void 0,t?.fullOutputPath),this.historyContainer.markDirty(e),this.bashComponent=void 0}setActivity(t){if(this.activityLoader?.stop(),this.activityLoader=t,this.onActivityChange){this.onActivityChange(t);return}this.statusContainer.clear(),t&&this.statusContainer.addChild(t)}showStatus(t){this.closeOpenGroup(),this.append(new u(1)),this.append(new w(this.dimStyle(t),1,0))}showError(t){if(!this.deferIfBuilding(()=>this.showError(t))){this.closeOpenGroup(),this.outsideTurns++;try{this.append(new u(1)),this.append(new w(this.errorStyle(t),1,0))}finally{this.outsideTurns--}this.tui.requestRender()}}crtrOutputTheme(){return{fg:l((t,e)=>t==="error"?this.errorStyle(e):t==="warning"||t==="accent"||t==="toolTitle"||t==="success"?this.spinnerStyle(e):t==="muted"?this.dimStyle(e):e,"fg"),bg:l((t,e)=>e,"bg"),bold:l(t=>this.labelStyle(t),"bold")}}assistantToolCalls(t){const e=t.content;return Array.isArray(e)?e.filter(s=>typeof s=="object"&&s!==null&&s.type==="toolCall"):[]}getTranscriptFilePathsNewestFirst(){return[...this.transcriptFilePaths]}getTranscriptDocRefsNewestFirst(){return[...this.transcriptDocRefs]}refreshMarkdown(){this.historyContainer.invalidate(),this.tui.requestRender()}getLastAssistantText(){const t=this.lastAssistantText?.trim();return t||void 0}blockText(t){const e=this.copyIndex.get(t);return e===void 0?void 0:this.copyBlockRecords[e]?.text}copyBlocks(){return this.copyBlockRecords}getLastToolOutputText(){for(let t=this.copyBlockRecords.length-1;t>=0;t--){const e=this.copyBlockRecords[t];if(e.kind==="tool")return e.text.trim()===""?void 0:e.text}}getTranscriptPlainText(){return this.copyBlockRecords.map(t=>t.text).filter(t=>t.trim()!=="").join(`
1
+ var N=Object.defineProperty;var l=(h,t)=>N(h,"name",{value:t,configurable:!0});import{Container as v,Loader as V,Spacer as u,Text as w}from"@earendil-works/pi-tui";import{AssistantMessageComponent as z,BashExecutionComponent as P,BranchSummaryMessageComponent as Y,CompactionSummaryMessageComponent as K,CustomMessageComponent as _,parseSkillBlock as J,SkillInvocationMessageComponent as X,ToolExecutionComponent as Q,UserMessageComponent as B}from"@earendil-works/pi-coding-agent";import{attachMarkdownTheme as f}from"../config.js";import{ContextMessageComponent as j}from"./context-message.js";import{presentationFor as Z}from"./card-presentation.js";import{detectInlinePageResult as tt,PageBlockComponent as et}from"./page-block.js";import{CRTR_OUTPUT_CUSTOM_TYPE as st,CrtrOutputMessageComponent as F,createCrtrBashToolDefinition as it}from"./crtr-output.js";import{CRTR_CYCLE_DIVIDER_CUSTOM_TYPE as nt,endedByAbort as G}from"../../../core/runtime/session-cycles.js";import{isHumanWordsEntry as H,parseCard as ot}from"../../../shared/generated-context.js";import{assistantVisibleText as c,isGroupBoundaryKind as rt,isTrueUserMessage as y}from"../../../shared/tool-groups.js";import{messageKey as R,normalizeTurnReplyRecord as at,START_TURN_KEY as M,turnReplyText as W}from"../../../shared/turn-replies.js";import{isCycleDivider as ht}from"./condensed-history.js";import{transformDiagramFences as lt}from"./diagram.js";import{styleAttachAgentMarkdown as pt,styleAttachMarkdownSource as L,styleAttachMessageMarkdown as dt,styleAttachSummaryMarkdown as $}from"./markdown-source.js";import{createCrtrEditToolDefinition as ct}from"./edit-diff.js";import{GroupActivityRecorder as ut}from"./group-activity.js";import{GroupRecapComponent as ft}from"./group-recap.js";import{FoldedToolCallController as mt,bashCallBackgroundHintLines as gt,createCrtrPlainBashToolDefinition as yt,createCrtrReadToolDefinition as Tt,createCrtrWriteToolDefinition as Ct}from"./tool-calls.js";import{ringCompletionBell as kt}from"../chrome/completion-bell.js";import{extractFilePaths as bt}from"#core/human/visible-paths";import{extractDocRefs as wt}from"./doc-links.js";import{keepWhenCondensed as xt,liveRegionStart as St}from"./condensed-history.js";import{ViewerAssistantMessageComponent as x}from"./assistant-message.js";import{CompositeViewportSource as Rt,MeasuredContainer as E}from"./measured-container.js";import{readConfig as T,updateRawConfigAtomically as At}from"../../../core/config.js";import{DEFAULT_CONDENSED_HISTORY as Bt,DEFAULT_LIVE_CYCLES as Gt}from"../../../types.js";import{applySnapshot as Mt,applyToolGroupSummary as Et,applyWorkingActivity as It,bashEnd as Dt,bashOutput as Ot,bashStart as vt,initialConvState as Pt,reduce as _t}from"../../conversation/projection.js";const q=l(h=>`\x1B[2m${h}\x1B[22m`,"defaultDimStyle"),I=50;function jt(){try{return T("user").live_cycles}catch{return Gt}}l(jt,"readLiveCycles");function Ft(){try{return T("user").condensed_history}catch{return Bt}}l(Ft,"readCondensedHistory");function Ht(){try{return T("user").fold_finished_tools}catch{return!1}}l(Ht,"readFoldFinishedTools");function Wt(){try{return T("user").summarize_tool_calls}catch{return!1}}l(Wt,"readSummarizeToolCalls");function Lt(){try{return T("user").detailed_tool_recaps}catch{return!0}}l(Lt,"readDetailedToolRecaps");function $t(){try{return T("user").consolidate_replies}catch{return!1}}l($t,"readConsolidateReplies");function qt(h){try{At("user",t=>({...t,fold_finished_tools:h}))}catch{}}l(qt,"persistFoldFinishedTools");function Ut(h){return typeof h=="object"&&h!==null&&"setExpanded"in h&&typeof h.setExpanded=="function"}l(Ut,"isExpandable");const Nt=/\x1b\[[0-9;]*m/g,Vt=/\x1b\[([0-9;]*)m/g;function zt(h){return h.replace(Vt,(t,e)=>{const s=e.split(";"),i=[];for(let n=0;n<s.length;n++){const r=Number(s[n]===""?0:s[n]);if(r===38||r===48||r===58){const o=Number(s[n+1]),a=n+(o===5?2:o===2?4:1);r!==48&&i.push(...s.slice(n,a+1)),n=a;continue}r>=40&&r<=47||r>=100&&r<=107||i.push(String(r))}return i.length>0?`\x1B[${i.join(";")}m`:""})}l(zt,"stripBackground");const Yt=/<from\b[^>]*>[\s\S]*?<\/from>/g;class D extends u{static{l(this,"FoldedToolSeparator")}folded=!1;separatesToolGroup=!1;setFolded(t){this.folded=t,this.refresh()}setSeparatesToolGroup(t){this.separatesToolGroup=t,this.refresh()}refresh(){this.setLines(this.folded&&this.separatesToolGroup?1:0)}}class Kt extends v{static{l(this,"WorkingRow")}label=new w("",1,0);constructor(){super(),this.addChild(new u(1)),this.addChild(this.label)}setLabel(t){this.label.setText(t)}}function O(h,t,e){return`${h} ${h===1?t:e}`}l(O,"plural");class A extends Q{static{l(this,"MinimizableToolComponent")}activityCallId;minimized=!1;expandedState=!1;foldController;resultObserver;setToolView(t,e){this.foldController=t,this.resultObserver=e}updateResult(...t){this.resultObserver?.(t[0],t[1]??!1);const e=t[0],s=e.content;Array.isArray(s)&&/^elapsed \d+(?:h \d+)?m \d+s(?:\n|$)/.test(s.at(-1)?.text??"")?super.updateResult({...e,content:s.slice(0,-1)},t[1]):super.updateResult(...t)}setExpanded(t){this.expandedState=t,super.setExpanded(t)}setMinimized(t){!this.foldController||this.minimized===t||(this.minimized=t,this.foldController.setFolded(t),super.setExpanded(this.expandedState))}render(t){if(!this.minimized)return[...super.render(t),...gt(this.foldController?.callComponent(),t)];const e=this.foldController?.callComponent();return e?e.render(t).filter(s=>s.replace(Nt,"").trim().length>0).map(s=>zt(s).trimEnd()):super.render(t)}}const Jt=l(h=>`\x1B[31m${h}\x1B[39m`,"defaultErrorStyle"),Xt={accent:l(h=>`\x1B[33m${h}\x1B[39m`,"accent"),active:l(h=>`\x1B[36m${h}\x1B[39m`,"active"),info:l(h=>`\x1B[34m${h}\x1B[39m`,"info"),muted:q,faint:q,border:l(h=>h,"border"),surface:l(h=>h,"surface"),bold:l(h=>`\x1B[1m${h}\x1B[22m`,"bold"),error:Jt,warning:l(h=>`\x1B[33m${h}\x1B[39m`,"warning"),diffAdded:l(h=>`\x1B[32m${h}\x1B[39m`,"diffAdded"),diffRemoved:l(h=>`\x1B[91m${h}\x1B[39m`,"diffRemoved"),bashMode:l(h=>`\x1B[32m${h}\x1B[39m`,"bashMode"),bashModeAlt:l(h=>`\x1B[92m${h}\x1B[39m`,"bashModeAlt")};class Ae{static{l(this,"ChatView")}tui;container;historyContainer=new E;statusContainer=new E;bannerContainer;transcript;appendTarget=this.historyContainer;pageBlocks=new Map;inboxAnswers=new Set;inlinePageBlocks;pageOpenHint;backgroundBashHint;liveCycles;condensedHistory;cwd;showImages;imageWidthCells;hideThinking;hiddenThinkingLabel;toolOutputExpanded;foldSettledTools=Ht();summarizeToolCalls=Wt();detailedToolRecaps=Lt();showGroupSummaries=this.summarizeToolCalls&&this.foldSettledTools;groups=[];openGroup;consolidateReplies=$t();showWorking=!1;turnReplies=new Map;turns=[];openReplyTurn;carriedTurn={key:M,prose:[]};outsideTurns=0;turnHidden=new Set;groupSummaries=new Map;nodeRoster=new Map;streamingWasGroupMember=!1;onFooterEvent;onActivityChange;spinnerStyle;dimStyle;errorStyle;recapPalette;labelStyle=l(t=>`\x1B[1m${t}\x1B[22m`,"labelStyle");markdownTransformers=[(t,{messageType:e,availableWidth:s})=>e==="assistant"?lt(t,s):t,(t,{messageType:e})=>e==="user"?L(t):pt(t)];streamingComponent;streamingToolSeparator;foldedToolSeparatorContents=new Map;pendingTools=new Map;bashComponent;activityLoader;projection=Pt();workingActivity=this.projection.workingActivity;runActive=!1;applyingSnapshot=!1;snapshotGeneration=0;deferredFrames=[];lastAssistantText;transcriptFilePaths=[];transcriptDocRefs=[];copyBlockRecords=[];copyIndex=new Map;condensedCopyBlocks=new WeakMap;constructor(t,e,s={}){if(this.tui=t,this.container=e,this.cwd=s.cwd??process.cwd(),this.showImages=s.showImages??!0,this.imageWidthCells=s.imageWidthCells??60,this.hideThinking=s.hideThinking??!1,this.hiddenThinkingLabel=s.hiddenThinkingLabel??"Thinking...",this.toolOutputExpanded=s.toolOutputExpanded??!1,this.liveCycles=s.liveCycles??jt(),this.condensedHistory=s.condensedHistory??Ft(),this.onFooterEvent=s.onFooterEvent,this.onActivityChange=s.onActivityChange,this.inlinePageBlocks=s.inlinePageBlocks??!1,this.pageOpenHint=s.pageOpenHint??(()=>"crtr human list"),this.backgroundBashHint=s.backgroundBashHint??(()=>null),this.recapPalette=s.palette??Xt,this.spinnerStyle=this.recapPalette.active,this.dimStyle=this.recapPalette.muted,this.errorStyle=this.recapPalette.error,s.banner&&s.banner.length>0){const i=new E;i.addChild(new u(1));for(const n of s.banner)i.addChild(new w(n,1,0));i.addChild(new u(1)),this.bannerContainer=i,this.container.addChild(i)}this.container.addChild(this.historyContainer),this.onActivityChange||this.container.addChild(this.statusContainer),this.transcript=new Rt([...this.bannerContainer?[this.bannerContainer]:[],this.historyContainer,...this.onActivityChange?[]:[this.statusContainer]])}transcriptSource(){return this.transcript}async applySnapshot(t){const e=++this.snapshotGeneration;if(this.applyingSnapshot=!0,this.deferredFrames.length=0,this.resetChat(),this.projection=Mt(t,this.projection),this.workingActivity=this.projection.workingActivity,this.runActive=this.projection.isStreaming,this.seedToolGroupSummaries(this.projection.toolGroupSummaryDetails),this.turnReplies.clear(),this.consolidateReplies)for(const[o,a]of Object.entries(at(t.turnReplies)))this.turnReplies.set(o,a);const s=new Map,i=this.projection.messages,n=i.length-1,r=St(i,this.liveCycles);if(r>0){const o=await this.buildCondensedBlock(i.slice(0,r),e);if(e!==this.snapshotGeneration)return;o&&this.appendCondensedBlock(o)}for(let o=r;o<i.length;o++){if(!this.projection.isStreaming&&o>r&&(o-r)%I===0&&(await new Promise(p=>setImmediate(p)),e!==this.snapshotGeneration))return;const a=i[o];if(a.role==="assistant"){const p=c(a);p.trim()&&(this.lastAssistantText=p,this.pushTranscriptText(p));const d=o===n&&this.projection.isStreaming&&a.stopReason!=="aborted"&&a.stopReason!=="error",C=c(a).trim()!=="",U=this.assistantToolCalls(a),k=a.stopReason==="aborted"||a.stopReason==="error",b=G(a)?"Interrupted":a.errorMessage??"Error";if(k){for(const m of s.values()){const g={content:[{type:"text",text:b}],isError:!0};m.updateResult(g),this.registerCopyBlock(m,"tool",b),this.settleGroupTool(m,g,!0)}s.clear()}(C||k)&&this.closeOpenGroup();let S;d?(this.streamingComponent=new x(void 0,this.hideThinking,f(),this.hiddenThinkingLabel,this.markdownTransformers),this.appendAssistantPart(this.streamingComponent,!C),this.registerCopyBlock(this.streamingComponent,"assistant",""),this.streamingWasGroupMember=!C,this.streamingComponent.updateContent(a),this.registerCopyBlock(this.streamingComponent,"assistant",c(a)),S=this.streamingToolSeparator=this.appendAssistantSeparator(!C)):S=this.appendAssistantMessage(a,!C&&!k),S&&this.setAssistantSeparatorContent(S,a);for(const m of U){this.pushTranscriptValue(m.arguments);const g=this.appendToolComponent(m.name,m.id,m.arguments);a.stopReason==="aborted"||a.stopReason==="error"?(g.updateResult({content:[{type:"text",text:b}],isError:!0}),this.registerCopyBlock(g,"tool",b),this.settleGroupTool(g,{content:[{type:"text",text:b}],isError:!0},!0)):s.set(m.id,g)}k&&this.closeOpenGroup(),!d&&!k&&this.recordTurnProse(a,!1)}else if(a.role==="toolResult"){this.pushTranscriptText(this.userMessageText(a));const p=s.get(a.toolCallId);p&&(p.updateResult(a),this.registerCopyBlock(p,"tool",this.toolResultText(a)),this.historyContainer.markDirty(p),this.settleGroupTool(p,a,a.isError===!0),s.delete(a.toolCallId),this.maybeAppendPageBlock(a))}else this.addMessageToChat(a)}for(const[o,a]of s)this.pendingTools.set(o,a);for(const o of this.turns)this.refreshTurn(o);this.applyToolDisplay(),this.projection.isStreaming&&this.setActivity(this.makeLoader(this.workingActivity)),this.tui.requestRender(),this.applyingSnapshot=!1,this.replayDeferredFrames()}async buildCondensedBlock(t,e){const s=new v,i=this.appendTarget,n=[];this.appendTarget=s,this.condensedCopyBlocks.set(s,n);try{if(this.consolidateReplies)return await this.buildCondensedTurns(t,e)&&s.children.length>0?{component:s,copyBlocks:n}:void 0;let r=0;for(const o of t)if(xt(o,this.condensedHistory)){if(r>0&&r%I===0&&(await new Promise(a=>setImmediate(a)),e!==this.snapshotGeneration))return;r++,this.pushTranscriptText(this.userMessageText(o)),this.addMessageToChat(o)}}finally{this.appendTarget=i,this.condensedCopyBlocks.delete(s)}return s.children.length>0?{component:s,copyBlocks:n}:void 0}async buildCondensedTurns(t,e){const s=[{key:M,prose:[],dividers:[]}];for(const o of t){const a=s.at(-1);if(y(o))s.push({key:R(o)??`local-${s.length}`,user:o,prose:[],dividers:[]});else if(ht(o))a.dividers.push(o);else if(o.role==="assistant"&&o.stopReason!=="aborted"&&o.stopReason!=="error"){const p=c(o).trim(),d=R(o);p!==""&&d!==void 0&&a.prose.push({key:d,text:p})}}const i=s.pop();let n=0;const r=l(async(o,a)=>{if(n>0&&n%I===0&&(await new Promise(d=>setImmediate(d)),e!==this.snapshotGeneration))return!1;n++,o.user!==void 0&&(this.pushTranscriptText(this.userMessageText(o.user)),this.addMessageToChat(o.user));const p=a?W(o.prose,this.turnReplies.get(o.key)):"";if(p!==""){const d=new x(void 0,this.hideThinking,f(),this.hiddenThinkingLabel,this.markdownTransformers);d.updateContent(this.replyMessage(p)),this.append(d),this.registerCopyBlock(d,"assistant",p)}for(const d of o.dividers)this.addMessageToChat(d);return!0},"render");for(const o of s)if(!await r(o,!0))return!1;return await r(i,!1)?(this.carriedTurn={key:i.key,prose:i.prose},!0):!1}deferIfBuilding(t){return this.applyingSnapshot?(this.deferredFrames.push(t),!0):!1}replayDeferredFrames(){const t=this.deferredFrames.splice(0);for(const e of t)e()}setWorkingActivity(t){if(this.deferIfBuilding(()=>this.setWorkingActivity(t)))return;const e=this.projection.activity===this.workingActivity;this.projection=It(this.projection,t),this.workingActivity=this.projection.workingActivity,this.runActive&&e&&this.setActivity(this.makeLoader(this.workingActivity))}settleRun(){this.runActive=!1;for(const t of this.pendingTools.values())this.settleGroupTool(t);if(this.streamingComponent){this.historyContainer.removeChild(this.streamingComponent);for(const t of this.turns)t.members.delete(this.streamingComponent);this.turnHidden.delete(this.streamingComponent),this.unregisterCopyBlock(this.streamingComponent),this.streamingComponent=void 0}this.streamingToolSeparator=void 0,this.pendingTools.clear(),this.openReplyTurn&&this.refreshWorkingRow(this.openReplyTurn),this.applyToolDisplay(),this.setActivity(void 0),this.settleBashComponent()}dispose(){this.settleRun()}toggleToolsExpanded(){let t;return this.summarizeToolCalls&&this.foldSettledTools?(this.showGroupSummaries=!this.showGroupSummaries,this.toolOutputExpanded=!this.showGroupSummaries,t={kind:"summaries",shown:this.showGroupSummaries}):(this.toolOutputExpanded=!this.toolOutputExpanded,t={kind:"output",expanded:this.toolOutputExpanded}),this.applyToolDisplay(),t}toggleFoldSettledTools(){return this.foldSettledTools=!this.foldSettledTools,qt(this.foldSettledTools),this.summarizeToolCalls&&this.foldSettledTools&&(this.showGroupSummaries=!0),this.applyToolDisplay(),this.foldSettledTools}applyToolDisplay(){const t=new Set(this.pendingTools.values());for(const i of this.groups)for(const n of i.inFlight)t.add(n);for(const i of this.historyContainer.children)i instanceof A&&i.setMinimized(this.foldSettledTools&&!t.has(i)),Ut(i)&&i.setExpanded(this.toolOutputExpanded);const e=this.turnFoldedComponents(t),s=new Set;for(const i of this.groups){this.applyGroupDisplay(i,e),s.add(i.recap);for(const n of i.members)s.add(n)}for(const i of this.turnHidden)!e.has(i)&&!s.has(i)&&this.historyContainer.setHidden(i,!1);for(const i of e)!s.has(i)&&!this.historyContainer.hiddenChildren.has(i)&&this.historyContainer.setHidden(i,!0);this.turnHidden=e,this.applyInboxExchangeDisplay(),this.updateFoldedToolSeparators(t),this.historyContainer.markDirty(),this.tui.requestRender()}hidesInboxExchange(){return this.showGroupSummaries&&this.foldSettledTools}applyInboxExchangeDisplay(){const t=this.hidesInboxExchange();for(const e of this.inboxAnswers)this.historyContainer.setHidden(e,t);for(const e of this.pageBlocks.values())this.historyContainer.setHidden(e,t&&e.settled)}toggleShowWorking(){if(!this.consolidateReplies)return null;this.showWorking=!this.showWorking;for(const t of this.turns)this.refreshWorkingRow(t);return this.applyToolDisplay(),this.showWorking}applyTurnReply(t,e){if(!this.deferIfBuilding(()=>this.applyTurnReply(t,e))&&this.consolidateReplies){this.turnReplies.set(t,e);for(const s of this.turns)s.key===t&&this.refreshTurn(s);this.tui.requestRender()}}turnFoldedComponents(t){const e=new Set;if(!this.consolidateReplies||this.showWorking)return e;for(const s of this.turns){const i=s===this.openReplyTurn;for(const n of s.members)i&&(n===this.streamingComponent||n===this.streamingToolSeparator||n===this.bashComponent||t.has(n))||e.add(n)}return e}beginTurn(t,e=[]){const s=new x(void 0,this.hideThinking,f(),this.hiddenThinkingLabel,this.markdownTransformers),i=new Kt;this.outsideTurns++;try{this.append(i),this.append(s)}finally{this.outsideTurns--}this.registerCopyBlock(s,"assistant","");const n={key:t,reply:s,working:i,members:new Set,prose:e};return this.turns.push(n),this.openReplyTurn=n,this.refreshTurn(n),n}consolidatingHere(){return this.consolidateReplies&&this.appendTarget===this.historyContainer}currentTurn(){return this.openReplyTurn??this.beginTurn(this.carriedTurn.key,[...this.carriedTurn.prose])}recordTurnProse(t,e){if(!this.consolidatingHere()||t.role!=="assistant"||t.stopReason==="aborted"||t.stopReason==="error")return;const s=c(t).trim(),i=R(t);if(s===""||i===void 0)return;const n=this.currentTurn();n.prose.some(r=>r.key===i)||(n.prose.push({key:i,text:s}),e&&this.refreshTurn(n))}refreshTurn(t){const e=W(t.prose,this.turnReplies.get(t.key));t.reply.updateContent(this.replyMessage(e)),this.historyContainer.setHidden(t.reply,e===""),this.historyContainer.markDirty(t.reply),this.registerCopyBlock(t.reply,"assistant",e),e!==""&&t===this.turns.at(-1)&&(this.lastAssistantText=e),this.refreshWorkingRow(t)}refreshWorkingRow(t){let e=0,s=0;for(const a of t.members)a instanceof A?e++:(a instanceof j||a instanceof _||a instanceof F)&&s++;const i=t.prose.length,n=e>0||s>0||i>1,r=[i>0?O(i,"message","messages"):void 0,e>0?O(e,"tool call","tool calls"):void 0,s>0?O(s,"card","cards"):void 0].filter(a=>a!==void 0),o=this.runActive&&t===this.openReplyTurn;t.working.setLabel(this.dimStyle(`${this.showWorking?"\u25BE":"\u25B8"} ${o?"working \u2014 ":""}${r.join(" \xB7 ")}`)),this.historyContainer.setHidden(t.working,!n),this.historyContainer.markDirty(t.working)}replyMessage(t){return{role:"assistant",content:t===""?[]:[{type:"text",text:t}],stopReason:"stop"}}toggleThinking(){this.hideThinking=!this.hideThinking;for(const t of this.historyContainer.children)t instanceof z&&t.setHideThinkingBlock(this.hideThinking);for(const[t,e]of this.foldedToolSeparatorContents)t.setSeparatesToolGroup(e.hasText||!this.hideThinking&&e.hasThinking);return this.historyContainer.markDirty(),this.tui.requestRender(),this.hideThinking}handleEvent(t){if(!this.deferIfBuilding(()=>this.handleEvent(t))){switch(this.projection=_t(this.projection,t),t.type){case"agent_start":{this.runActive=this.projection.isStreaming;for(const e of this.pendingTools.values())this.settleGroupTool(e);this.pendingTools.clear(),this.openReplyTurn&&this.refreshWorkingRow(this.openReplyTurn),this.setActivity(this.makeLoader(this.workingActivity));break}case"agent_end":{this.settleRun(),kt();break}case"agent_settled":{this.settleRun();break}case"message_start":{if(t.message.role==="custom"||t.message.role==="user")this.addMessageToChat(t.message),this.consolidateReplies&&(this.openReplyTurn&&this.refreshWorkingRow(this.openReplyTurn),this.applyToolDisplay());else if(t.message.role==="assistant"){const e=c(t.message).trim()!=="";e&&this.closeOpenGroup(),this.streamingComponent=new x(void 0,this.hideThinking,f(),this.hiddenThinkingLabel,this.markdownTransformers),this.streamingWasGroupMember=!e,this.appendAssistantPart(this.streamingComponent,!e),this.registerCopyBlock(this.streamingComponent,"assistant",""),this.streamingComponent.updateContent(t.message),this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),this.streamingToolSeparator=this.appendAssistantSeparator(!e),this.setAssistantSeparatorContent(this.streamingToolSeparator,t.message)}break}case"message_update":{if(this.streamingComponent&&t.message.role==="assistant"){this.promoteStreamingAssistantToBoundary(t.message),this.streamingComponent.updateContent(t.message),this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),this.historyContainer.markDirty(this.streamingComponent);const e=this.assistantToolCalls(t.message);this.streamingToolSeparator&&this.setAssistantSeparatorContent(this.streamingToolSeparator,t.message);for(const s of e){this.pushTranscriptValue(s.arguments);const i=this.pendingTools.get(s.id);if(i)i.updateArgs(s.arguments),this.noteGroupTool(i,s.name,s.arguments),this.historyContainer.markDirty(i);else{const n=this.appendToolComponent(s.name,s.id,s.arguments);this.pendingTools.set(s.id,n)}}}break}case"message_end":{if(t.message.role!=="assistant")break;const e=t.message.stopReason==="aborted"||t.message.stopReason==="error";if(this.promoteStreamingAssistantToBoundary(t.message,e),this.streamingComponent&&this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),t.message.stopReason!=="aborted"&&t.message.stopReason!=="error"){const s=c(t.message);s.trim()&&(this.lastAssistantText=s,this.pushTranscriptText(s))}if(this.streamingComponent){const s=t.message.stopReason;let i=t.message.errorMessage;if(G(t.message)&&(i="Interrupted",t.message.errorMessage=i,t.message.stopReason="aborted"),this.streamingComponent.updateContent(t.message),s==="aborted"||s==="error"){const n=i??"Error";for(const r of this.pendingTools.values())r.updateResult({content:[{type:"text",text:n}],isError:!0}),this.registerCopyBlock(r,"tool",n),this.settleGroupTool(r,{content:[{type:"text",text:n}],isError:!0},!0),this.historyContainer.markDirty(r);this.pendingTools.clear()}else for(const n of this.pendingTools.values())n.setArgsComplete(),this.historyContainer.markDirty(n);this.historyContainer.markDirty(this.streamingComponent),this.streamingComponent=void 0,this.streamingToolSeparator=void 0}e&&(this.closeOpenGroup(),this.applyToolDisplay()),this.consolidateReplies&&(this.recordTurnProse(t.message,!0),this.openReplyTurn&&this.refreshWorkingRow(this.openReplyTurn),this.applyToolDisplay());break}case"tool_execution_start":{this.pushTranscriptValue(t.args);let e=this.pendingTools.get(t.toolCallId);e?this.noteGroupTool(e,t.toolName,t.args):(e=this.appendToolComponent(t.toolName,t.toolCallId,t.args),this.pendingTools.set(t.toolCallId,e)),e.markExecutionStarted(),this.historyContainer.markDirty(e);break}case"tool_execution_update":{const e=this.projection.partialToolResults.get(t.toolCallId)??t.partialResult;this.pushTranscriptValue(e);const s=this.pendingTools.get(t.toolCallId);s&&(s.updateResult(e,!0),this.registerCopyBlock(s,"tool",this.toolResultText(e)),this.historyContainer.markDirty(s));break}case"tool_execution_end":{const e=this.projection.partialToolResults.get(t.toolCallId)??t.result;this.pushTranscriptValue(e);const s=this.pendingTools.get(t.toolCallId);s&&(s.updateResult(e),this.registerCopyBlock(s,"tool",this.toolResultText(e)),this.pendingTools.delete(t.toolCallId),this.settleGroupTool(s,e,t.isError),this.applyToolDisplay(),this.historyContainer.markDirty(s),this.maybeAppendPageBlock(e));break}case"compaction_start":{const e=t.reason==="manual"?"Compacting context...":"Auto-compacting...";this.setActivity(this.makeLoader(e));break}case"compaction_end":{this.setActivity(this.runActive?this.makeLoader(this.workingActivity):void 0),t.aborted?this.showStatus(t.reason==="manual"?"Compaction cancelled":"Auto-compaction cancelled"):t.result?this.addMessageToChat({role:"compactionSummary",summary:t.result.summary,tokensBefore:t.result.tokensBefore,timestamp:Date.now()}):t.errorMessage&&this.showError(t.errorMessage);break}case"auto_retry_start":{const e=Math.ceil(t.delayMs/1e3);this.setActivity(this.makeLoader(`Retrying (${t.attempt}/${t.maxAttempts}) in ${e}s...`));break}case"auto_retry_end":{this.setActivity(this.runActive?this.makeLoader(this.workingActivity):void 0),t.success||this.showError(`Retry failed after ${t.attempt} attempts: ${t.finalError??"Unknown error"}`);break}case"queue_update":case"session_info_changed":case"thinking_level_changed":this.onFooterEvent?.(t);break;default:break}this.tui.requestRender()}}bashStart(t,e){if(this.deferIfBuilding(()=>this.bashStart(t,e)))return;this.projection=vt(this.projection,t,e),this.closeOpenGroup(),this.settleBashComponent();let s;s=new P(t,this.componentTui(()=>s),e),this.bashComponent=s,this.append(s),this.tui.requestRender()}bashOutput(t){this.deferIfBuilding(()=>this.bashOutput(t))||(this.projection=Ot(this.projection,t),this.pushTranscriptText(t),this.bashComponent&&(this.bashComponent.appendOutput(t),this.historyContainer.markDirty(this.bashComponent)),this.tui.requestRender())}bashEnd(t){this.deferIfBuilding(()=>this.bashEnd(t))||(this.projection=Dt(this.projection,t),this.settleBashComponent(t),this.tui.requestRender())}addMessageToChat(t){const e=ot(t);if(e!==null&&(t.role!=="custom"||t.display===!0)){this.pushTranscriptText(e.body);const s=e.senders.flatMap(n=>n.entries).filter(H).map(n=>n.body.trim()).filter(n=>n!=="");if(!(s.length>0&&e.body.replace(Yt,"").trim()===""&&e.senders.every(n=>n.entries.every(H)))){const n=Z(e.kind),r=new j(e,n,this.toolOutputExpanded,this.dimStyle,o=>this.spinnerStyle(this.labelStyle(o)));rt(e.kind)?(this.closeOpenGroup(),this.append(r)):this.appendGroupMember(r)?.activity.noteCard(e,n)}for(const n of s)this.appendHumanAnswer(n);return}switch(t.role){case"bashExecution":{this.closeOpenGroup(),this.pushTranscriptText(t.output??"");const s=new P(t.command,this.tui,t.excludeFromContext);t.output&&s.appendOutput(t.output),s.setComplete(t.exitCode,t.cancelled,t.truncated?{truncated:!0}:void 0,t.fullOutputPath),this.append(s);break}case"custom":{if(t.display){if(this.pushTranscriptText(this.userMessageText(t)),t.customType===st){this.appendGroupMember(new F(this.userMessageText(t),this.toolOutputExpanded,this.crtrOutputTheme()));break}if(t.customType===nt){this.closeOpenGroup(),this.append(new u(1)),this.append(new w(this.dimStyle(`\u2500\u2500 ${this.userMessageText(t)} \u2500\u2500`),1,0)),this.append(new u(1));break}const s=new _(dt(t),void 0,f());s.setExpanded(this.toolOutputExpanded),this.appendGroupMember(s)}break}case"compactionSummary":{this.closeOpenGroup(),this.append(new u(1));const s=new K($(t),f());s.setExpanded(this.toolOutputExpanded),this.append(s);break}case"branchSummary":{this.closeOpenGroup(),this.append(new u(1));const s=new Y($(t),f());s.setExpanded(this.toolOutputExpanded),this.append(s),this.registerCopyBlock(s,"assistant",t.summary);break}case"user":{if(y(t)&&this.closeOpenGroup(),y(t)&&this.consolidatingHere()){!this.openReplyTurn&&this.carriedTurn.prose.length>0&&this.currentTurn(),this.outsideTurns++;try{this.appendUserMessage(t)}finally{this.outsideTurns--}this.beginTurn(R(t)??`local-${this.turns.length}`);break}this.appendUserMessage(t);break}case"assistant":{const s=c(t).trim()!=="";s&&this.closeOpenGroup(),this.appendAssistantMessage(t,!s);break}default:break}}appendUserMessage(t){const e=this.userMessageText(t);if(!e)return;this.pushTranscriptText(e),this.chatChildCount()>0&&this.appendUserPart(new u(1),!y(t));const s=J(e);if(s){const i=new X({...s,content:L(s.content)},f());if(i.setExpanded(this.toolOutputExpanded),this.appendUserPart(i,!y(t)),this.registerCopyBlock(i,"user",e),s.userMessage){const n=new B(s.userMessage,f(),void 0,this.markdownTransformers);this.appendUserPart(n,!y(t)),this.registerCopyBlock(n,"user",s.userMessage)}}else{const i=new B(e,f(),void 0,this.markdownTransformers);this.appendUserPart(i,!y(t)),this.registerCopyBlock(i,"user",e)}}appendAssistantMessage(t,e=!1){const s=new x(void 0,this.hideThinking,f(),this.hiddenThinkingLabel,this.markdownTransformers),i=G(t)?{...t,stopReason:"aborted",errorMessage:"Interrupted"}:t;s.updateContent(i),this.appendAssistantPart(s,e),this.registerCopyBlock(s,"assistant",c(t));const n=this.appendAssistantSeparator(e);return this.setAssistantSeparatorContent(n,t),n}appendAssistantSeparator(t=!1){const e=new D;return t?this.appendGroupMember(e):this.append(e),e}appendAssistantPart(t,e){e?this.appendGroupMember(t):this.append(t)}appendUserPart(t,e){e?this.appendGroupMember(t):this.append(t)}appendHumanAnswer(t){this.outsideTurns++;try{this.appendHumanAnswerParts(t)}finally{this.outsideTurns--}}appendHumanAnswerParts(t){this.closeOpenGroup();const e=this.appendTarget===this.historyContainer;if(this.chatChildCount()>0){const i=new u(1);this.append(i),e&&this.trackInboxAnswer(i)}const s=new B(t,f(),void 0,this.markdownTransformers);this.append(s),e&&this.trackInboxAnswer(s),this.registerCopyBlock(s,"user",t)}trackInboxAnswer(t){this.inboxAnswers.add(t),this.hidesInboxExchange()&&this.historyContainer.setHidden(t,!0)}isLiveGroupRegion(){return this.appendTarget===this.historyContainer}ensureGroup(){if(!this.isLiveGroupRegion())return;if(this.openGroup)return this.openGroup;const t=new ft,e={members:[],recap:t,activity:new ut(this.cwd,this.nodeRoster),toolCount:0,inFlight:new Set};return this.append(t),this.historyContainer.setHidden(t,!0),this.groups.push(e),this.openGroup=e,e}closeOpenGroup(){this.openGroup=void 0}appendGroupMember(t){const e=this.ensureGroup();return this.append(t),e&&e.members.push(t),e}removeGroupMember(t){for(const e of this.groups){const s=e.members.indexOf(t);s!==-1&&e.members.splice(s,1)}this.historyContainer.setHidden(t,!1)}appendToolComponent(t,e,s){const i=this.isLiveGroupRegion()&&!this.openGroup&&this.historyContainer.children.at(-1)instanceof D?this.historyContainer.children.at(-1):void 0;i&&this.historyContainer.removeChild(i);const n=this.ensureGroup();i&&(this.append(i),n?.members.push(i));const r=this.makeToolComponent(t,e,s);return r.activityCallId=e,this.appendGroupMember(r),this.registerCopyBlock(r,"tool",""),n&&(n.key??=e,n.toolCount++,n.inFlight.add(r),n.activity.noteCall(e,t,s)),r}noteGroupTool(t,e,s){if(t.activityCallId)for(const i of this.groups)i.members.includes(t)&&i.activity.noteCall(t.activityCallId,e,s)}settleGroupTool(t,e,s=!1){for(const i of this.groups)i.inFlight.delete(t),!(!t.activityCallId||!i.members.includes(t))&&(e===void 0?i.activity.resolveWithoutResult(t.activityCallId):i.activity.settle(t.activityCallId,e,s))}promoteStreamingAssistantToBoundary(t,e=!1){!this.streamingWasGroupMember||!e&&c(t).trim()===""||(this.streamingComponent&&this.removeGroupMember(this.streamingComponent),this.streamingToolSeparator&&this.removeGroupMember(this.streamingToolSeparator),this.streamingWasGroupMember=!1,this.closeOpenGroup())}seedToolGroupSummaries(t){this.groupSummaries.clear();for(const[e,s]of Object.entries(t))this.groupSummaries.set(e,s)}applyToolGroupSummary(t,e){if(this.deferIfBuilding(()=>this.applyToolGroupSummary(t,e)))return;this.projection=Et(this.projection,t,e);const s=this.projection.toolGroupSummaryDetails[t];s!==void 0&&(this.groupSummaries.set(t,s),this.applyToolDisplay())}applyGroupDisplay(t,e){const s=t.key===void 0?void 0:this.groupSummaries.get(t.key),i=this.foldSettledTools&&this.showGroupSummaries&&t.toolCount>0&&t.inFlight.size===0&&s!==void 0;t.recap.setRecap(i?s:void 0,t.toolCount,t.activity.activity(),this.detailedToolRecaps,this.recapPalette),this.historyContainer.setHidden(t.recap,!i||e.has(t.recap));for(const n of t.members)this.historyContainer.setHidden(n,i||e.has(n))}updateFoldedToolSeparators(t=new Set(this.pendingTools.values())){const e=this.historyContainer.children;for(let s=0;s<e.length;s++){const i=e[s];if(!(i instanceof D))continue;const n=e[s+1];i.setFolded(this.foldSettledTools&&!this.historyContainer.hiddenChildren.has(i)&&n instanceof A&&!this.historyContainer.hiddenChildren.has(n)&&!t.has(n)),this.historyContainer.markDirty(i)}}setAssistantSeparatorContent(t,e){const s=e.content,i=Array.isArray(s)?s:[],n=i.some(o=>typeof o=="object"&&o!==null&&o.type==="text"&&typeof o.text=="string"&&o.text.trim()!==""),r=i.some(o=>typeof o=="object"&&o!==null&&o.type==="thinking"&&typeof o.thinking=="string"&&o.thinking.trim()!=="");this.foldedToolSeparatorContents.set(t,{hasText:n,hasThinking:r}),t.setSeparatesToolGroup(n||!this.hideThinking&&r)}makeToolComponent(t,e,s){const i=new mt;let n,r;if(t==="bash"){const a=it(s,i);a===void 0?r=yt(this.cwd,i,this.backgroundBashHint):r=a.definition}else if(t==="edit"){const a=ct(this.cwd,i);r=a.definition,n=a.observeResult}else t==="read"?r=Tt(this.cwd,i):t==="write"&&(r=Ct(this.cwd,i));let o;return o=new A(t,e,s,{showImages:this.showImages,imageWidthCells:this.imageWidthCells},r,this.componentTui(()=>o),this.cwd),o.setToolView(r===void 0?void 0:i,n),o.setExpanded(this.toolOutputExpanded),o}append(t){if(this.outsideTurns===0&&this.consolidatingHere()){const e=this.currentTurn();this.appendTarget.addChild(t),e.members.add(t);return}this.appendTarget.addChild(t)}chatChildCount(){return this.appendTarget.children.length}resetChat(){this.setActivity(void 0),this.settleBashComponent(),this.streamingComponent=void 0,this.streamingToolSeparator=void 0,this.streamingWasGroupMember=!1,this.foldedToolSeparatorContents.clear(),this.groups.length=0,this.openGroup=void 0,this.turns.length=0,this.openReplyTurn=void 0,this.carriedTurn={key:M,prose:[]},this.turnHidden=new Set,this.groupSummaries.clear(),this.nodeRoster.clear(),this.pendingTools.clear(),this.lastAssistantText=void 0,this.copyBlockRecords.length=0,this.copyIndex.clear(),this.transcriptFilePaths.length=0,this.transcriptDocRefs.length=0,this.pageBlocks.clear(),this.inboxAnswers.clear(),this.historyContainer.clear()}maybeAppendPageBlock(t){if(!this.inlinePageBlocks||this.appendTarget!==this.historyContainer)return;const e=tt(t);if(e===void 0||this.pageBlocks.has(e.pageId))return;const s=new et(e.pageId,this.pageOpenHint);this.pageBlocks.set(e.pageId,s),this.outsideTurns++;try{this.append(s)}finally{this.outsideTurns--}this.loadPageBlock(s)}async loadPageBlock(t){await t.refresh()&&(this.historyContainer.setHidden(t,this.hidesInboxExchange()&&t.settled),this.historyContainer.markDirty(t),this.tui.requestRender())}refreshInFlightTools(){if(this.pendingTools.size!==0){for(const t of this.pendingTools.values())this.historyContainer.markDirty(t);this.tui.requestRender()}}async refreshPageBlocks(){const t=[...this.pageBlocks.values()];(await Promise.all(t.map(async s=>{const i=await s.refresh();return i&&(this.historyContainer.setHidden(s,this.hidesInboxExchange()&&s.settled),this.historyContainer.markDirty(s)),i}))).some(Boolean)&&this.tui.requestRender()}makeLoader(t){let e;const s={requestRender:l(i=>{e&&!this.onActivityChange&&this.statusContainer.markDirty(e),this.tui.requestRender(i)},"requestRender"),terminal:this.tui.terminal};return e=new V(s,this.spinnerStyle,this.dimStyle,t),e}componentTui(t){return{requestRender:l(e=>{this.historyContainer.markDirty(t()),this.tui.requestRender(e)},"requestRender"),terminal:this.tui.terminal}}settleBashComponent(t){if(!this.bashComponent)return;const e=this.bashComponent;e.setComplete(t?.exitCode,t?.cancelled??!0,t?.truncated?{truncated:!0}:void 0,t?.fullOutputPath),this.historyContainer.markDirty(e),this.bashComponent=void 0}setActivity(t){if(this.activityLoader?.stop(),this.activityLoader=t,this.onActivityChange){this.onActivityChange(t);return}this.statusContainer.clear(),t&&this.statusContainer.addChild(t)}showStatus(t){this.closeOpenGroup(),this.append(new u(1)),this.append(new w(this.dimStyle(t),1,0))}showError(t){if(!this.deferIfBuilding(()=>this.showError(t))){this.closeOpenGroup(),this.outsideTurns++;try{this.append(new u(1)),this.append(new w(this.errorStyle(t),1,0))}finally{this.outsideTurns--}this.tui.requestRender()}}crtrOutputTheme(){return{fg:l((t,e)=>t==="error"?this.errorStyle(e):t==="warning"||t==="accent"||t==="toolTitle"||t==="success"?this.spinnerStyle(e):t==="muted"?this.dimStyle(e):e,"fg"),bg:l((t,e)=>e,"bg"),bold:l(t=>this.labelStyle(t),"bold")}}assistantToolCalls(t){const e=t.content;return Array.isArray(e)?e.filter(s=>typeof s=="object"&&s!==null&&s.type==="toolCall"):[]}getTranscriptFilePathsNewestFirst(){return[...this.transcriptFilePaths]}getTranscriptDocRefsNewestFirst(){return[...this.transcriptDocRefs]}refreshMarkdown(){this.historyContainer.invalidate(),this.tui.requestRender()}getLastAssistantText(){const t=this.lastAssistantText?.trim();return t||void 0}blockText(t){const e=this.copyIndex.get(t);return e===void 0?void 0:this.copyBlockRecords[e]?.text}copyBlocks(){return this.copyBlockRecords}getLastToolOutputText(){for(let t=this.copyBlockRecords.length-1;t>=0;t--){const e=this.copyBlockRecords[t];if(e.kind==="tool")return e.text.trim()===""?void 0:e.text}}getTranscriptPlainText(){return this.copyBlockRecords.map(t=>t.text).filter(t=>t.trim()!=="").join(`
2
2
 
3
- `)}registerCopyBlock(t,e,s){const i=this.condensedCopyBlocks.get(this.appendTarget);if(i){const r=i.findIndex(n=>n.block===t);r===-1?i.push({block:t,kind:e,text:s}):i[r].text=s;return}const o=this.copyIndex.get(t);o===void 0?(this.copyIndex.set(t,this.copyBlockRecords.length),this.copyBlockRecords.push({block:t,kind:e,text:s})):this.copyBlockRecords[o].text=s}unregisterCopyBlock(t){const e=this.condensedCopyBlocks.get(this.appendTarget);if(e){const i=e.findIndex(o=>o.block===t);i!==-1&&e.splice(i,1);return}const s=this.copyIndex.get(t);if(s!==void 0){this.copyBlockRecords.splice(s,1),this.copyIndex.delete(t);for(let i=s;i<this.copyBlockRecords.length;i++)this.copyIndex.set(this.copyBlockRecords[i].block,i)}}appendCondensedBlock({component:t,copyBlocks:e}){this.outsideTurns++;try{this.append(t)}finally{this.outsideTurns--}this.registerCopyBlock(t,"condensed",e.map(s=>s.text).filter(s=>s.trim()!=="").join(`
3
+ `)}registerCopyBlock(t,e,s){const i=this.condensedCopyBlocks.get(this.appendTarget);if(i){const r=i.findIndex(o=>o.block===t);r===-1?i.push({block:t,kind:e,text:s}):i[r].text=s;return}const n=this.copyIndex.get(t);n===void 0?(this.copyIndex.set(t,this.copyBlockRecords.length),this.copyBlockRecords.push({block:t,kind:e,text:s})):this.copyBlockRecords[n].text=s}unregisterCopyBlock(t){const e=this.condensedCopyBlocks.get(this.appendTarget);if(e){const i=e.findIndex(n=>n.block===t);i!==-1&&e.splice(i,1);return}const s=this.copyIndex.get(t);if(s!==void 0){this.copyBlockRecords.splice(s,1),this.copyIndex.delete(t);for(let i=s;i<this.copyBlockRecords.length;i++)this.copyIndex.set(this.copyBlockRecords[i].block,i)}}appendCondensedBlock({component:t,copyBlocks:e}){this.outsideTurns++;try{this.append(t)}finally{this.outsideTurns--}this.registerCopyBlock(t,"condensed",e.map(s=>s.text).filter(s=>s.trim()!=="").join(`
4
4
 
5
- `))}toolResultText(t){if(typeof t=="string")return t;if(typeof t=="object"&&t!==null&&"content"in t){const e=t.content;if(typeof e=="string")return e;if(Array.isArray(e))return e.filter(s=>typeof s=="object"&&s!==null&&s.type==="text"&&typeof s.text=="string").map(s=>s.text).join("")}try{const e=JSON.stringify(t);return typeof e=="string"?e:""}catch{return""}}pushTranscriptText(t){const e=t.trim();if(e==="")return;const s=[...new Set(wt(e).reverse())];if(s.length>0){const r=[...s,...this.transcriptDocRefs.filter(n=>!s.includes(n))].slice(0,50);this.transcriptDocRefs.splice(0,this.transcriptDocRefs.length,...r)}const i=bt([e],this.cwd);if(i.length===0)return;const o=[...i,...this.transcriptFilePaths.filter(r=>!i.includes(r))].slice(0,50);this.transcriptFilePaths.splice(0,this.transcriptFilePaths.length,...o)}pushTranscriptValue(t){try{const e=typeof t=="string"?t:JSON.stringify(t);typeof e=="string"&&this.pushTranscriptText(e)}catch{}}userMessageText(t){const e=t.content;return typeof e=="string"?e:Array.isArray(e)?e.filter(s=>typeof s=="object"&&s!==null&&s.type==="text").map(s=>s.text).join(""):""}}export{Ae as ChatView};
5
+ `))}toolResultText(t){if(typeof t=="string")return t;if(typeof t=="object"&&t!==null&&"content"in t){const e=t.content;if(typeof e=="string")return e;if(Array.isArray(e))return e.filter(s=>typeof s=="object"&&s!==null&&s.type==="text"&&typeof s.text=="string").map(s=>s.text).join("")}try{const e=JSON.stringify(t);return typeof e=="string"?e:""}catch{return""}}pushTranscriptText(t){const e=t.trim();if(e==="")return;const s=[...new Set(wt(e).reverse())];if(s.length>0){const r=[...s,...this.transcriptDocRefs.filter(o=>!s.includes(o))].slice(0,50);this.transcriptDocRefs.splice(0,this.transcriptDocRefs.length,...r)}const i=bt([e],this.cwd);if(i.length===0)return;const n=[...i,...this.transcriptFilePaths.filter(r=>!i.includes(r))].slice(0,50);this.transcriptFilePaths.splice(0,this.transcriptFilePaths.length,...n)}pushTranscriptValue(t){try{const e=typeof t=="string"?t:JSON.stringify(t);typeof e=="string"&&this.pushTranscriptText(e)}catch{}}userMessageText(t){const e=t.content;return typeof e=="string"?e:Array.isArray(e)?e.filter(s=>typeof s=="object"&&s!==null&&s.type==="text").map(s=>s.text).join(""):""}}export{Ae as ChatView};
@@ -24,6 +24,8 @@ export declare class PageBlockComponent implements Component {
24
24
  private status;
25
25
  private cache;
26
26
  constructor(pageId: string, openHint: () => string);
27
+ /** Answered or canceled: nothing on this page waits for the person. */
28
+ get settled(): boolean;
27
29
  /** Re-read the request. Resolves true when the rendered content changed, so
28
30
  * the caller knows whether to mark the transcript dirty. */
29
31
  refresh(): Promise<boolean>;
@@ -1 +1 @@
1
- var g=Object.defineProperty;var c=(i,e)=>g(i,"name",{value:e,configurable:!0});import{pageAwaitsResponse as $}from"../../../core/human/page-schema.js";import{projectPageDisplayMarkdown as w}from"../../../core/human/page-markdown.js";import{projectHtmlDocumentMarkdown as y}from"../../../core/human/page-html-markdown.js";import{cliClient as x}from"../../../commands/api-client.js";import{answerDigestOf as D}from"../../inbox/dto-adapt.js";import{pageBodyLines as b}from"../../inbox/tui/page-body.js";import{BOLD as v,CYAN as L,DIM as d,GREEN as l,RESET as a,YELLOW as M,sanitize as f,singleLine as E,truncate as p,wrap as j}from"../../inbox/tui/ansi.js";const h=16;function Y(i){if(i===null||typeof i!="object")return;const e=i.details;if(e===null||typeof e!="object")return;const t=e.crtrPreview;if(t===null||typeof t!="object")return;const n=t;if(n.path!=="human send")return;const s=n.result;if(s===null||typeof s!="object")return;const r=s,u=r.page_id;if(typeof u=="string"&&r.placement==="inline")return{pageId:u}}c(Y,"detectInlinePageResult");function I(i){return i.document_media_type==="text/html"?y(i.source_document):w(i.source_document,i.page)}c(I,"projectDisplay");class q{static{c(this,"PageBlockComponent")}pageId;openHint;expanded=!1;generation=0;stamp;snapshot;status="loading";cache;constructor(e,t){this.pageId=e,this.openHint=t}async refresh(){let e;try{e=(await x().getHumanRequest(this.pageId)).page}catch{e=void 0}if(e===void 0)return this.settle("unavailable",void 0,void 0);const t=`${e.revision}|${e.state}`;if(this.status==="ready"&&t===this.stamp)return!1;let n;try{n={manifest:e.page,displayMarkdown:I(e),state:e.state,...e.state==="resolved"?_(D(e)):{}}}catch{return this.settle("unavailable",void 0,t)}return this.settle("ready",n,t)}setExpanded(e){e!==this.expanded&&(this.expanded=e,this.cache=void 0)}render(e){const t=e>0?e:80,n=this.cache;if(n!==void 0&&n.width===t&&n.generation===this.generation&&n.expanded===this.expanded)return n.lines;const s=this.compose(t);return this.cache={width:t,generation:this.generation,expanded:this.expanded,lines:s},s}invalidate(){this.cache=void 0}settle(e,t,n){return e===this.status&&e==="unavailable"?!1:(this.status=e,this.snapshot=t,this.stamp=n,this.generation++,this.cache=void 0,!0)}compose(e){const t=this.snapshot;if(t===void 0){const o=this.status==="loading"?"[page] loading\u2026":"[page] no longer available";return["",` ${d}${o}${a}`,""]}const n=Math.min(Math.max(20,e-4),100),s=["",` ${v}${L}${p(f(E(t.manifest.title)),n)}${a}`];if(t.manifest.subtitle)for(const o of j(f(t.manifest.subtitle),n))s.push(` ${d}${o}${a}`);const r=b(t.manifest,t.displayMarkdown,n,Math.max(20,e-4));if(r.length>0){s.push("");const o=this.expanded||r.length<=h?r:r.slice(0,h);for(const m of o)s.push(` ${m}`);o.length<r.length&&s.push(` ${d}\u2026 +${r.length-o.length} lines \u2014 ctrl+o to expand${a}`)}const u=this.footerLine(t,n);return u!==void 0&&s.push("",` ${u}`),s.push(""),s}footerLine(e,t){switch(e.state){case"pending":return $(e.manifest)?`${M}\u25B8 awaiting your answer${a} ${d}\u2014 ${f(this.openHint())}${a}`:`${d}\u25E6 queued in your inbox \u2014 ${f(this.openHint())}${a}`;case"resolved":return e.answerDigest===void 0?`${l}\u2713 answered${a}`:`${l}\u2713 answered${a} ${d}\u2014 ${p(f(e.answerDigest),Math.max(10,t-12))}${a}`;case"canceled":return`${d}\u2298 canceled${a}`;case"passive":return}}}function _(i){return i===void 0?{}:{answerDigest:i}}c(_,"withDigest");export{q as PageBlockComponent,Y as detectInlinePageResult};
1
+ var g=Object.defineProperty;var c=(i,e)=>g(i,"name",{value:e,configurable:!0});import{pageAwaitsResponse as $}from"../../../core/human/page-schema.js";import{projectPageDisplayMarkdown as w}from"../../../core/human/page-markdown.js";import{projectHtmlDocumentMarkdown as y}from"../../../core/human/page-html-markdown.js";import{cliClient as x}from"../../../commands/api-client.js";import{answerDigestOf as D}from"../../inbox/dto-adapt.js";import{pageBodyLines as b}from"../../inbox/tui/page-body.js";import{BOLD as v,CYAN as L,DIM as d,GREEN as l,RESET as a,YELLOW as M,sanitize as f,singleLine as E,truncate as p,wrap as j}from"../../inbox/tui/ansi.js";const h=16;function Y(i){if(i===null||typeof i!="object")return;const e=i.details;if(e===null||typeof e!="object")return;const t=e.crtrPreview;if(t===null||typeof t!="object")return;const n=t;if(n.path!=="human send")return;const s=n.result;if(s===null||typeof s!="object")return;const r=s,u=r.page_id;if(typeof u=="string"&&r.placement==="inline")return{pageId:u}}c(Y,"detectInlinePageResult");function I(i){return i.document_media_type==="text/html"?y(i.source_document):w(i.source_document,i.page)}c(I,"projectDisplay");class q{static{c(this,"PageBlockComponent")}pageId;openHint;expanded=!1;generation=0;stamp;snapshot;status="loading";cache;constructor(e,t){this.pageId=e,this.openHint=t}get settled(){return this.snapshot?.state==="resolved"||this.snapshot?.state==="canceled"}async refresh(){let e;try{e=(await x().getHumanRequest(this.pageId)).page}catch{e=void 0}if(e===void 0)return this.settle("unavailable",void 0,void 0);const t=`${e.revision}|${e.state}`;if(this.status==="ready"&&t===this.stamp)return!1;let n;try{n={manifest:e.page,displayMarkdown:I(e),state:e.state,...e.state==="resolved"?_(D(e)):{}}}catch{return this.settle("unavailable",void 0,t)}return this.settle("ready",n,t)}setExpanded(e){e!==this.expanded&&(this.expanded=e,this.cache=void 0)}render(e){const t=e>0?e:80,n=this.cache;if(n!==void 0&&n.width===t&&n.generation===this.generation&&n.expanded===this.expanded)return n.lines;const s=this.compose(t);return this.cache={width:t,generation:this.generation,expanded:this.expanded,lines:s},s}invalidate(){this.cache=void 0}settle(e,t,n){return e===this.status&&e==="unavailable"?!1:(this.status=e,this.snapshot=t,this.stamp=n,this.generation++,this.cache=void 0,!0)}compose(e){const t=this.snapshot;if(t===void 0){const o=this.status==="loading"?"[page] loading\u2026":"[page] no longer available";return["",` ${d}${o}${a}`,""]}const n=Math.min(Math.max(20,e-4),100),s=["",` ${v}${L}${p(f(E(t.manifest.title)),n)}${a}`];if(t.manifest.subtitle)for(const o of j(f(t.manifest.subtitle),n))s.push(` ${d}${o}${a}`);const r=b(t.manifest,t.displayMarkdown,n,Math.max(20,e-4));if(r.length>0){s.push("");const o=this.expanded||r.length<=h?r:r.slice(0,h);for(const m of o)s.push(` ${m}`);o.length<r.length&&s.push(` ${d}\u2026 +${r.length-o.length} lines \u2014 ctrl+o to expand${a}`)}const u=this.footerLine(t,n);return u!==void 0&&s.push("",` ${u}`),s.push(""),s}footerLine(e,t){switch(e.state){case"pending":return $(e.manifest)?`${M}\u25B8 awaiting your answer${a} ${d}\u2014 ${f(this.openHint())}${a}`:`${d}\u25E6 queued in your inbox \u2014 ${f(this.openHint())}${a}`;case"resolved":return e.answerDigest===void 0?`${l}\u2713 answered${a}`:`${l}\u2713 answered${a} ${d}\u2014 ${p(f(e.answerDigest),Math.max(10,t-12))}${a}`;case"canceled":return`${d}\u2298 canceled${a}`;case"passive":return}}}function _(i){return i===void 0?{}:{answerDigest:i}}c(_,"withDigest");export{q as PageBlockComponent,Y as detectInlinePageResult};
@@ -27,7 +27,7 @@ export interface AttachConnection {
27
27
  readonly canvasSource: CanvasSource;
28
28
  /** Viewer-LOCAL concerns only — `cwd` drives theming and this pane's own git
29
29
  * status, and is the CLI's own cwd under `--canvas`. */
30
- readonly meta: Pick<NodeMeta, 'cwd' | 'profile_id'>;
30
+ readonly meta: Pick<NodeMeta, 'cwd' | 'profile_id' | 'grantee'>;
31
31
  /** The attached node's persona/lifecycle, when this canvas can tell us —
32
32
  * `undefined` for a remote attach until the viewer refetches it. */
33
33
  readonly nodeIdentity: Pick<NodeMeta, 'kind' | 'mode' | 'lifecycle' | 'icon'> | undefined;
@@ -46,7 +46,7 @@ export interface AttachSession {
46
46
  /** Viewer-LOCAL concerns only: `cwd` drives theming and this pane's own git
47
47
  * status, and is the CLI's own cwd for a remote attach — never the remote
48
48
  * node's directory. */
49
- readonly meta: Pick<NodeMeta, 'cwd' | 'profile_id'>;
49
+ readonly meta: Pick<NodeMeta, 'cwd' | 'profile_id' | 'grantee'>;
50
50
  /** Canvas read authority for chrome and the graph overlay: an API source
51
51
  * locally, a relayed source under `--canvas`. */
52
52
  readonly canvasSource: CanvasSource;
@@ -2,7 +2,7 @@ import type { NodeRow } from '../../../core/canvas/types.js';
2
2
  interface ProfileFileSearchOptions {
3
3
  cwd: string;
4
4
  nodeDirs: readonly string[];
5
- nodeIds: readonly string[];
5
+ nodes: readonly Pick<NodeRow, 'node_id' | 'grantee'>[];
6
6
  profileId: string | null;
7
7
  fdPath: string | null;
8
8
  onNotice: (message: string) => void;
@@ -11,7 +11,7 @@ interface ProfileFileSearchOptions {
11
11
  * descendant subtree. The `parent` hierarchy, rather than the subscription
12
12
  * graph, is the user-visible child/parent relationship. */
13
13
  export declare function relatedNodeIds(nodes: readonly Pick<NodeRow, 'node_id' | 'parent'>[], nodeId: string): string[];
14
- /** Return the working directories of the same node family. */
15
- export declare function relatedNodeDirs(nodes: readonly Pick<NodeRow, 'node_id' | 'cwd' | 'parent'>[], nodeId: string): string[];
14
+ /** Return the rows of the same node family. */
15
+ export declare function relatedNodes<T extends Pick<NodeRow, 'node_id' | 'parent'>>(nodes: readonly T[], nodeId: string): T[];
16
16
  export declare function launchProfileFileSearch(opts: ProfileFileSearchOptions): void;
17
17
  export {};
@@ -1 +1 @@
1
- var N=Object.defineProperty;var l=(e,t)=>N(e,"name",{value:t,configurable:!0});import{constants as _,accessSync as j,existsSync as P,mkdtempSync as k,readFileSync as E,rmSync as d,statSync as z}from"node:fs";import{tmpdir as C}from"node:os";import{delimiter as F,join as p,resolve as I,sep as $}from"node:path";import{execFile as v,spawnSync as T}from"node:child_process";import{loadProfileManifest as q,profileDir as O}from"../../../core/profiles/manifest.js";import{contextDir as A}from"../../../core/canvas/node-agent-paths.js";import{shellQuote as c}from"../../../core/runtime/placement-tmux.js";import{nvimShellCommand as H}from"../../../core/nvim-launch.js";import{surfaceTmuxStyleArgs as S}from"../../../core/runtime/surface-bg.js";function L(e,t){const n=new Map(e.map(o=>[o.node_id,o])),r=new Set([t]);for(let o=n.get(t);o?.parent!==null&&o?.parent!==void 0;){const f=o.parent;if(r.has(f))break;r.add(f),o=n.get(f)}const s=[t];for(;s.length>0;){const o=s.pop();for(const f of e)f.parent!==o||r.has(f.node_id)||(r.add(f.node_id),s.push(f.node_id))}return e.filter(o=>r.has(o.node_id)).map(o=>o.node_id)}l(L,"relatedNodeIds");function ce(e,t){const n=new Set(L(e,t));return e.filter(r=>n.has(r.node_id)).map(r=>r.cwd)}l(ce,"relatedNodeDirs");function M(e){const t=[];for(const n of e)try{t.push(A(n))}catch{continue}return y(t)}l(M,"familyDocumentDirs");function R(e){try{return z(e).isDirectory()}catch{return!1}}l(R,"isDirectory");function W(e,t){const n=[...t==null?[]:[t],...(process.env.PATH??"").split(F).filter(Boolean).map(r=>p(r,e))];return[...new Set(n)]}l(W,"executableCandidates");function h(e,t){for(const n of W(e,t)){try{j(n,_.X_OK)}catch{continue}if(T(n,["--version"],{stdio:"ignore"}).status===0)return n}return null}l(h,"workingExecutable");function B(e){if(e===null||e==="")return{projects:[],settings:null};try{const{profileId:t,manifest:n}=q(e);return{projects:n.projects.map(r=>r.path),settings:O(t)}}catch{return{projects:[],settings:null}}}l(B,"profileSearchRoots");function y(e){const t=new Set,n=[];for(const r of e){const s=I(r);t.has(s)||!R(s)||(t.add(s),n.push(s))}return n}l(y,"dedupeExistingDirs");function K(e){return e.filter(t=>!e.some(n=>n!==t&&t.startsWith(n+$)))}l(K,"outermostDirs");const Q=20;function X(e){try{const t=E(e);if(t.length===0)return null;const n=t[t.length-1]===0?t.length-1:t.length;return t.subarray(0,n).toString("utf8")||null}catch{return null}}l(X,"selectionPath");function se(e){const t=h("fd",e.fdPath);if(t===null){e.onNotice("fd is required for profile file search");return}const n=h("fzf");if(n===null){e.onNotice("fzf is required for profile file search");return}const r=h("nvim");if(r===null){e.onNotice("Neovim is required for profile file search");return}const s=B(e.profileId),o=y([e.cwd,...e.nodeDirs,...s.projects]);if(o.length===0){e.onNotice("No profile file-search directories exist");return}const f=K(o),w=y([...s.settings===null?[]:[s.settings]]),u=k(p(C(),"crtr-profile-files-")),g=p(u,"selection"),x=p(u,"candidates"),b=M(e.nodeIds).filter(i=>!f.some(a=>i===a||i.startsWith(a+$))),D=`{ ${[...f.map(i=>`${c(t)} --type f --hidden --exclude .git . ${c(i)}`),...b.map(i=>`${c(t)} --type f --hidden --exclude .git --exclude ${c("/jobs")} . ${c(i)}`),...w.map(i=>`${c(t)} --type f --hidden --exclude .git --no-ignore . ${c(i)}`)].map(i=>`${i} &`).join(" ")} wait; } > ${c(x)} && ${c(n)} --print0 --scheme=path --hscroll-off=${Q} --header ${c("fuzzy path \u2022 ctrl-y yank file path")} --bind ${c("ctrl-y:execute-silent(printf '%s' {} | { if command -v pbcopy >/dev/null 2>&1; then pbcopy; elif command -v wl-copy >/dev/null 2>&1; then wl-copy; elif command -v xclip >/dev/null 2>&1; then xclip -selection clipboard; else cat >/dev/null; fi; }; printf '%s' {} | tmux load-buffer -w -)+abort")} --preview ${c("head -100 -- {}")} < ${c(x)} > ${c(g)}`;try{v("tmux",["display-popup","-E","-T"," profile files ","-w","80%","-h","60%",...S(),D],()=>{const i=X(g);if(i===null||!P(i)){d(u,{recursive:!0,force:!0});return}const a=`exec ${H("edit",[i],r)}`;try{v("tmux",["display-popup","-E","-T"," profile file ","-w","90%","-h","90%",...S(),a],()=>d(u,{recursive:!0,force:!0}))}catch(m){d(u,{recursive:!0,force:!0}),e.onNotice(`Could not open profile file: ${m instanceof Error?m.message:String(m)}`)}})}catch(i){d(u,{recursive:!0,force:!0}),e.onNotice(`Could not open profile file search: ${i instanceof Error?i.message:String(i)}`)}}l(se,"launchProfileFileSearch");export{se as launchProfileFileSearch,ce as relatedNodeDirs,L as relatedNodeIds};
1
+ var N=Object.defineProperty;var l=(e,t)=>N(e,"name",{value:t,configurable:!0});import{constants as _,accessSync as j,existsSync as P,mkdtempSync as k,readFileSync as E,rmSync as d,statSync as z}from"node:fs";import{tmpdir as C}from"node:os";import{delimiter as F,join as p,resolve as T,sep as $}from"node:path";import{execFile as v,spawnSync as q}from"node:child_process";import{loadProfileManifest as I,profileDir as O}from"../../../core/profiles/manifest.js";import{contextDir as A}from"../../../core/canvas/paths.js";import{shellQuote as c}from"../../../core/runtime/placement-tmux.js";import{nvimShellCommand as H}from"../../../core/nvim-launch.js";import{surfaceTmuxStyleArgs as S}from"../../../core/runtime/surface-bg.js";function L(e,t){const n=new Map(e.map(i=>[i.node_id,i])),o=new Set([t]);for(let i=n.get(t);i?.parent!==null&&i?.parent!==void 0;){const f=i.parent;if(o.has(f))break;o.add(f),i=n.get(f)}const s=[t];for(;s.length>0;){const i=s.pop();for(const f of e)f.parent!==i||o.has(f.node_id)||(o.add(f.node_id),s.push(f.node_id))}return e.filter(i=>o.has(i.node_id)).map(i=>i.node_id)}l(L,"relatedNodeIds");function ce(e,t){const n=new Set(L(e,t));return e.filter(o=>n.has(o.node_id))}l(ce,"relatedNodes");function M(e){const t=[];for(const n of e)try{t.push(A(n.node_id,n.grantee))}catch{continue}return y(t)}l(M,"familyDocumentDirs");function R(e){try{return z(e).isDirectory()}catch{return!1}}l(R,"isDirectory");function W(e,t){const n=[...t==null?[]:[t],...(process.env.PATH??"").split(F).filter(Boolean).map(o=>p(o,e))];return[...new Set(n)]}l(W,"executableCandidates");function h(e,t){for(const n of W(e,t)){try{j(n,_.X_OK)}catch{continue}if(q(n,["--version"],{stdio:"ignore"}).status===0)return n}return null}l(h,"workingExecutable");function B(e){if(e===null||e==="")return{projects:[],settings:null};try{const{profileId:t,manifest:n}=I(e);return{projects:n.projects.map(o=>o.path),settings:O(t)}}catch{return{projects:[],settings:null}}}l(B,"profileSearchRoots");function y(e){const t=new Set,n=[];for(const o of e){const s=T(o);t.has(s)||!R(s)||(t.add(s),n.push(s))}return n}l(y,"dedupeExistingDirs");function K(e){return e.filter(t=>!e.some(n=>n!==t&&t.startsWith(n+$)))}l(K,"outermostDirs");const Q=20;function X(e){try{const t=E(e);if(t.length===0)return null;const n=t[t.length-1]===0?t.length-1:t.length;return t.subarray(0,n).toString("utf8")||null}catch{return null}}l(X,"selectionPath");function se(e){const t=h("fd",e.fdPath);if(t===null){e.onNotice("fd is required for profile file search");return}const n=h("fzf");if(n===null){e.onNotice("fzf is required for profile file search");return}const o=h("nvim");if(o===null){e.onNotice("Neovim is required for profile file search");return}const s=B(e.profileId),i=y([e.cwd,...e.nodeDirs,...s.projects]);if(i.length===0){e.onNotice("No profile file-search directories exist");return}const f=K(i),b=y([...s.settings===null?[]:[s.settings]]),u=k(p(C(),"crtr-profile-files-")),g=p(u,"selection"),x=p(u,"candidates"),w=M(e.nodes).filter(r=>!f.some(a=>r===a||r.startsWith(a+$))),D=`{ ${[...f.map(r=>`${c(t)} --type f --hidden --exclude .git . ${c(r)}`),...w.map(r=>`${c(t)} --type f --hidden --exclude .git --exclude ${c("/jobs")} . ${c(r)}`),...b.map(r=>`${c(t)} --type f --hidden --exclude .git --no-ignore . ${c(r)}`)].map(r=>`${r} &`).join(" ")} wait; } > ${c(x)} && ${c(n)} --print0 --scheme=path --hscroll-off=${Q} --header ${c("fuzzy path \u2022 ctrl-y yank file path")} --bind ${c("ctrl-y:execute-silent(printf '%s' {} | { if command -v pbcopy >/dev/null 2>&1; then pbcopy; elif command -v wl-copy >/dev/null 2>&1; then wl-copy; elif command -v xclip >/dev/null 2>&1; then xclip -selection clipboard; else cat >/dev/null; fi; }; printf '%s' {} | tmux load-buffer -w -)+abort")} --preview ${c("head -100 -- {}")} < ${c(x)} > ${c(g)}`;try{v("tmux",["display-popup","-E","-T"," profile files ","-w","80%","-h","60%",...S(),D],()=>{const r=X(g);if(r===null||!P(r)){d(u,{recursive:!0,force:!0});return}const a=`exec ${H("edit",[r],o)}`;try{v("tmux",["display-popup","-E","-T"," profile file ","-w","90%","-h","90%",...S(),a],()=>d(u,{recursive:!0,force:!0}))}catch(m){d(u,{recursive:!0,force:!0}),e.onNotice(`Could not open profile file: ${m instanceof Error?m.message:String(m)}`)}})}catch(r){d(u,{recursive:!0,force:!0}),e.onNotice(`Could not open profile file search: ${r instanceof Error?r.message:String(r)}`)}}l(se,"launchProfileFileSearch");export{se as launchProfileFileSearch,L as relatedNodeIds,ce as relatedNodes};