agent-log-viewer 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -21
- package/bin/cli.mjs +212 -12
- package/bin/server-runtime.mjs +51 -0
- package/bin/server-runtime.test.ts +190 -0
- package/dist/mcp-server.mjs +58 -25
- package/dist/runtime-host.mjs +40301 -0
- package/dist/standalone/.next/BUILD_ID +1 -1
- package/dist/standalone/.next/app-path-routes-manifest.json +13 -13
- package/dist/standalone/.next/build-manifest.json +2 -2
- package/dist/standalone/.next/prerender-manifest.json +3 -3
- package/dist/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/[id]/status/route.js +3 -3
- package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/input/route.js +3 -3
- package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/route.js +3 -3
- package/dist/standalone/.next/server/app/api/accounts/claude/terminal/route.js +3 -3
- package/dist/standalone/.next/server/app/api/accounts/codex/terminal/route.js +3 -3
- package/dist/standalone/.next/server/app/api/limits/history/route.js +3 -3
- package/dist/standalone/.next/server/app/api/limits/route.js +3 -3
- package/dist/standalone/.next/server/app/api/orchestrator/seat/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/deployments/[deploymentId]/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/deployments/capabilities/v1/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/deployments/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/operations/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/snapshot/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/stream/route.js +1 -1
- package/dist/standalone/.next/server/app/api/spawn/policy/route.js +3 -3
- package/dist/standalone/.next/server/app/api/tasks/route.js +2 -2
- package/dist/standalone/.next/server/app/index.html +1 -1
- package/dist/standalone/.next/server/app/index.rsc +2 -2
- package/dist/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/page.js +15 -12
- package/dist/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/standalone/.next/server/chunks/2338.js +4 -1
- package/dist/standalone/.next/server/chunks/2904.js +3 -3
- package/dist/standalone/.next/server/chunks/3740.js +7 -7
- package/dist/standalone/.next/server/chunks/4012.js +3 -3
- package/dist/standalone/.next/server/chunks/4972.js +1 -1
- package/dist/standalone/.next/server/chunks/5689.js +2 -2
- package/dist/standalone/.next/server/chunks/7471.js +6 -6
- package/dist/standalone/.next/server/chunks/7733.js +3 -3
- package/dist/standalone/.next/server/chunks/8797.js +1 -1
- package/dist/standalone/.next/server/chunks/8817.js +1 -1
- package/dist/standalone/.next/server/chunks/9364.js +11 -11
- package/dist/standalone/.next/server/chunks/9411.js +2 -2
- package/dist/standalone/.next/server/chunks/9733.js +3 -3
- package/dist/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/standalone/.next/server/pages/404.html +1 -1
- package/dist/standalone/.next/server/pages/500.html +1 -1
- package/dist/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/standalone/.next/static/chunks/app/{page-ac9463b910bf83fe.js → page-7ba2538fa87e3d62.js} +17 -14
- package/dist/standalone/package.json +1 -1
- package/package.json +1 -1
- /package/dist/standalone/.next/static/{kt9OPe8iwfpNcdOX9ygvb → 2ybXlxpylgBaGz43zp2fM}/_buildManifest.js +0 -0
- /package/dist/standalone/.next/static/{kt9OPe8iwfpNcdOX9ygvb → 2ybXlxpylgBaGz43zp2fM}/_ssgManifest.js +0 -0
|
@@ -5,7 +5,7 @@ ${i}`:n();continue}!(!i||d.test(a)||f.test(a)||g.test(a)||/^(findings?|summary|o
|
|
|
5
5
|
`)),h().fsyncSync(d)}finally{h().closeSync(d)}}filename(a){return j().join(this.directory,`${encodeURIComponent(a)}.jsonl`)}}let y=["PATH","HOME","USER","LOGNAME","SHELL","TMPDIR","TMP","TEMP","LANG","LC_ALL","LC_CTYPE","TERM","COLORTERM","NO_COLOR","XDG_CONFIG_HOME","XDG_CACHE_HOME","XDG_DATA_HOME","XDG_STATE_HOME","XDG_RUNTIME_DIR","DBUS_SESSION_BUS_ADDRESS","SSL_CERT_FILE","SSL_CERT_DIR","LLV_SPAWN_CAPABILITY"],z=`native-multi-agent-deny:${n.NATIVE_MULTI_AGENT_TOOLS.join(",")}`,A=u.u1+262144,B=[{pattern:/no conversation found with session id/i,reason:"the Claude CLI found no conversation with this session id"}];function C(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:null}function D(a,b){let c=C(a);return c&&"string"==typeof c[b]?c[b]:null}function E(a,b){let c=(0,s.h4)(a),d=(0,s.h4)(b);return c.id===d.id&&c.contentDigest===d.contentDigest&&c.expectedTurnId===d.expectedTurnId}function F(a){let b=C(a);if(b?.kind==="queued"){let a=C(b.entry);if("string"!=typeof a?.id||!a.id||"turn-started"!==b.disposition&&"queued-next-turn"!==b.disposition||"string"!=typeof b.queuedAt)return null;try{return{...b,entry:(0,s.h4)(a)}}catch{return null}}return b?.kind==="delivered"&&"string"==typeof b.entryId&&("string"==typeof b.engineMessageId||null===b.engineMessageId)&&"string"==typeof b.deliveredAt?b:null}let G=function(a){return(0,r.j)(a instanceof Error?a.message:String(a)).replace(/(["']?(?:cookie|set-cookie)["']?\s*[:=]\s*["']?)[^\s,"'}]+/gi,"$1[redacted]").slice(0,500)};function H(a,b,c,e){return new Promise((f,g)=>{let h=(0,d.spawn)(a,b,{cwd:c,env:e,stdio:["ignore","pipe","pipe"]}),i="";h.stdout.setEncoding("utf8"),h.stdout.on("data",a=>{i.length<1048576&&(i+=a)}),h.stderr.on("data",()=>{}),h.on("error",a=>g(Error(`Claude subscription authentication probe failed: ${G(a)}`))),h.on("close",a=>f({status:a,stdout:i}))})}async function I(a,b,c){let d=await H(a,["auth","status"],c,b);if(0!==d.status)throw Error("Claude subscription authentication check failed");let e=null;try{e=C(JSON.parse(d.stdout))}catch{}if(!e)throw Error("Claude subscription authentication status was invalid");let f=await H(a,["--version"],c,b),g=0===f.status?f.stdout.match(/\b\d+\.\d+\.\d+\b/)?.[0]??null:null;return{loggedIn:!0===e.loggedIn,authMethod:"string"==typeof e.authMethod?e.authMethod:null,subscriptionType:"string"==typeof e.subscriptionType?e.subscriptionType:null,version:g}}function J(a){return"string"==typeof a?a:Array.isArray(a)?a.map(a=>D(a,"text")??"").join(""):""}function K(a){return J(C(a.message)?.content)}function L(a){let b=C(a.message)?.content;if("string"==typeof b)return b.trim()?(0,w.rM)(b,[]):null;if(!Array.isArray(b))return null;let c=[],d="";for(let a of b){let b=C(a);if(b?.type==="text"&&"string"==typeof b.text){d+=b.text;continue}if(b?.type!=="image")continue;let e=C(b.source),g="string"==typeof e?.media_type?(0,w.CC)(e.media_type):null;if(e?.type!=="base64"||!g||"string"!=typeof e.data)return null;let h=Buffer.from(e.data,"base64");if(!h.length||h.toString("base64")!==e.data)return null;c.push({sha256:f().createHash("sha256").update(h).digest("hex"),mime:g,bytes:h.byteLength})}try{return(0,w.rM)(d,c)}catch{return null}}function M(a,b){return a.contentDigest===b.contentDigest||a.content.images.length>0&&b.imageCount===a.content.images.length&&b.text===a.content.text}class N{constructor(a,b,c,d){this.subscribers=new Set,this.events=[],this.deliveries=[],this.turnQueue=[],this.attentions=new Map,this.pendingControls=new Map,this.pendingAnswers=new Map,this.interruptedTurns=new Set,this.partialTurns=new Set,this.pendingDeliveries=new Map,this.stateListeners=new Set,this.stdoutDecoder=new k.StringDecoder("utf8"),this.stdoutBuffer="",this.stderrTail="",this.terminalExit=null,this.activeTurnId=null,this.releasing=!1,this.released=!1,this.dead=!1,this.reaped=!1,this.ledgerFailed=!1,this.writerFence=null,this.releasePromise=null,this.terminationTimer=null,this.terminationStarted=!1,this.child=a,this.identity=b,this.eventStore=d.eventStore??new t.mI,this.deliveryLedger=d.deliveryLedger??new x,this.readImage=d.readImage??(a=>(0,u.PF)().read(a)),this.requestTimeoutMs=d.requestTimeoutMs??3e4,this.shutdownGraceMs=d.shutdownGraceMs??1e3,this.onEventCursorRecovery=d.onEventCursorRecovery,this.signalProcess=d.signalProcess??process.kill,this.releaseCleanup=d.releaseCleanup??null,this.cursor=d.initialEventCursor??0,this.protocolVersion=c.version??null,this.account={type:c.authMethod,planType:c.subscriptionType},this.launchFlags=d.allowSubagents?[w.Zx]:[w.Zx,z],this.reapedPromise=new Promise(a=>{this.resolveReaped=a}),a.stdout.on("data",a=>{this.acceptStdout("string"==typeof a?a:this.stdoutDecoder.write(a))}),a.stdout.on("end",()=>{let a=this.stdoutDecoder.end();a&&this.acceptStdout(a)}),a.stderr.on("data",a=>{var b;this.stderrTail=(this.stderrTail+("string"==typeof a?a:a.toString("utf8"))).slice(-512),this.terminalExit??=(b=this.stderrTail,B.find(a=>a.pattern.test(b))?.reason??null),this.terminalExit&&(this.stderrTail="")}),a.stdin.on("error",a=>{this.releasing||this.released||this.fail(Error(`Claude stream stdin failed: ${G(a)}`))}),a.on("error",a=>this.fail(Error(`Claude child failed: ${G(a)}`))),a.on("close",()=>{this.reaped=!0,this.terminationTimer&&(clearTimeout(this.terminationTimer),this.terminationTimer=null),this.resolveReaped(),this.releasing?this.finishRelease():this.dead?this.notifyStateListeners():this.releasing||this.released||this.fail(Error("Claude child exited"))})}static async start(a){return this.open(a.sessionId??f().randomUUID(),!1,a)}static async adopt(a,b){if(!a)throw Error("Claude session id is required for adoption");return this.open(a,!0,b)}static async open(a,b,c){let e,g,i=c.binary??process.env.LLV_CLAUDE_BINARY??"claude",j=function(a,b,c=!1){let d={NODE_ENV:a.NODE_ENV};for(let b of y)void 0!==a[b]&&(d[b]=a[b]);return c&&void 0!==a.GH_CONFIG_DIR&&(d.GH_CONFIG_DIR=a.GH_CONFIG_DIR),b&&(d.CLAUDE_CONFIG_DIR=b),d}(c.env??process.env,c.claudeConfigDir,!0===c.forwardGitHubConfig);try{e=await (c.readAuthStatus?.()??I(i,j,c.cwd))}catch(a){throw c.releaseCleanup?.(),a}if(!e.loggedIn||"claude.ai"!==e.authMethod||!e.subscriptionType)throw c.releaseCleanup?.(),Error("Claude stream hosting requires a claude.ai subscription login");let k=["-p","--input-format","stream-json","--output-format","stream-json","--verbose","--include-partial-messages","--replay-user-messages","--permission-prompt-tool","stdio","--permission-mode",(0,m.A5)(c)],l=[...c.allowSubagents?[]:n.NATIVE_MULTI_AGENT_TOOLS,...c.readOnly?["Edit","Write","NotebookEdit"]:[]];if(l.length>0&&k.push("--disallowedTools",l.join(",")),c.claudeConfigDir){let b=`structured-${f().createHash("sha256").update(a).digest("hex").slice(0,24)}`,d=(0,n.applyClaudeSpawnPolicy)(c.claudeConfigDir,{allowSubagents:c.allowSubagents,baseSettingsPath:c.spawnPolicyBaseSettingsPath,profileId:b,cwd:c.cwd,mcpServers:c.mcpServers,mcpStatePath:c.mcpStatePath});k.push("--settings",d.settingsPath,"--strict-mcp-config","--mcp-config",d.mcpConfigPath)}else k.push("--strict-mcp-config");b?k.push("--resume",a):k.push("--session-id",a),c.model&&k.push("--model",c.model),c.effort&&k.push("--effort",c.effort),c.systemPrompt&&k.push("--system-prompt",c.systemPrompt),c.tools&&k.push("--tools",c.tools.join(","));let p=c.spawnProcess??((a,b,c)=>(0,d.spawn)(a,b,{...c,stdio:["pipe","pipe","pipe"]}));try{g=p(i,k,{cwd:c.cwd,env:(0,v.$)(j,c.mcpServers),detached:!0})}catch(a){throw c.releaseCleanup?.(),a}let q=new N(g,{sessionId:a},e,c);try{return q.restore(),q.reconcileTranscript(c.readTranscript?c.readTranscript(c.cwd,a):function(a,b,c){let d,e=(0,o.eV)(a,b,c);try{d=h().readFileSync(e,"utf8")}catch(a){if("ENOENT"===a.code)return[];throw a}let f=[];for(let a of d.split("\n")){if(!a)continue;let b=null;try{b=C(JSON.parse(a))}catch{continue}if(b?.type!=="user"||C(b.message)?.role!=="user")continue;let c=L(b);f.push({text:K(b),...c?{contentDigest:c.contentDigest}:{},...c?{imageCount:c.content.images.length}:{},uuid:D(b,"uuid"),timestamp:D(b,"timestamp")})}return f}(c.cwd,a,c.claudeProjectsDir)),q.emit({kind:"session-status",status:"idle"}),q}catch(a){try{await q.release()}catch(b){throw new s.EY(G(a),q,{cause:b})}throw Error(G(a))}}attach(a){if(!Number.isSafeInteger(a)||a<0)throw Error("afterSeq must be a non-negative integer");let b=this.events[0]?.seq;if(void 0!==b&&a+1<b)throw new s.AW(a,b);let c={afterSeq:a,queue:this.events.filter(b=>b.seq>a),wake:null,closed:!1};this.subscribers.add(c);let d=this.subscribers;return{async *[Symbol.asyncIterator](){try{for(;;){let a=c.queue.shift();if(a){a.seq>c.afterSeq&&(c.afterSeq=a.seq,yield a);continue}if(c.closed)break;await new Promise(a=>{c.wake=a}),c.wake=null}}finally{c.closed=!0,d.delete(c)}}}}async send(a){let b,c;if(this.unavailable())return{outcome:"rejected",reason:"dead-host"};if(!a.id)throw Error("queue entry id is required");let d=(0,s.h4)(a),e=this.deliveries.find(b=>b.entry.id===a.id);if(e&&!E(e.entry,d))throw Error("Claude queue entry id belongs to a different payload");if(!e&&void 0!==d.expectedTurnId&&d.expectedTurnId!==this.activeTurnId)return{outcome:"rejected",reason:"stale-turn"};if(e?.delivered)return{outcome:e.disposition,turnId:e.entry.id};let f=this.pendingDeliveries.get(a.id);if(f)return f.promise;let g=d.content.images.map(a=>({type:"image",source:{type:"base64",media_type:a.mime,data:this.readImage(a).toString("base64")}}));d.content.text&&g.push({type:"text",text:d.content.text});let h=e?.disposition??(this.activeTurnId?"queued-next-turn":"turn-started");try{this.deliveryLedger.recordQueued(this.identity.sessionId,d,h)}catch(a){throw this.failWithoutLedger(Error(`Claude delivery ledger failed: ${G(a)}`)),Error(`Claude delivery ledger failed: ${G(a)}`)}let i=e??{entry:structuredClone(d),disposition:h,delivered:!1};e||this.deliveries.push(i);let j=new Promise((a,d)=>{b=a,c=d}),k=setTimeout(()=>{this.pendingDeliveries.get(a.id)?.promise===j&&this.fail(Error("Claude delivery confirmation timed out; outcome is uncertain"))},this.requestTimeoutMs),l={promise:j,resolve:a=>b(a),reject:a=>c(a),timer:k};return this.pendingDeliveries.set(a.id,l),this.write({type:"user",session_id:this.identity.sessionId,message:{role:"user",content:g}}),this.turnQueue.push(a.id),this.activeTurnId?this.notifyStateListeners():(this.activeTurnId=a.id,this.emit({kind:"turn-started",turnId:a.id})),l.promise}async interrupt(a){if(this.unavailable())throw Error("Claude stream host is unavailable");if(!a||a!==this.activeTurnId)throw Error("active turn fence is stale");let b=f().randomUUID();await new Promise((c,d)=>{let e=setTimeout(()=>{this.pendingControls.delete(b);let a=Error("Claude interrupt timed out; outcome is uncertain");d(a),this.fail(a)},this.requestTimeoutMs);this.pendingControls.set(b,{resolve:c,reject:d,timer:e,interruptTurnId:a}),this.write({type:"control_request",request_id:b,request:{subtype:"interrupt"}})})}async answer(a,b){if(this.unavailable())throw Error("Claude stream host is unavailable");if(!this.attentions.has(a))throw Error("attention request is missing or already answered");let c=this.attentions.get(a),d=C(b),e=d?.behavior==="allow"?{...d,updatedInput:{...C(c.input)??{},...C(d.updatedInput)??{}}}:b??{};if(this.pendingAnswers.has(a))throw Error("attention answer is already awaiting confirmation");await new Promise((b,c)=>{let d=setTimeout(()=>{this.pendingAnswers.delete(a);let b=Error("Claude attention answer timed out; outcome is uncertain");c(b),this.fail(b)},this.requestTimeoutMs);this.pendingAnswers.set(a,{resolve:b,reject:c,timer:d}),this.write({type:"control_response",response:{subtype:"success",request_id:a,response:e}})})}async health(){return this.currentState()}terminalExitReason(){return this.terminalExit}onStateChange(a){return this.stateListeners.add(a),a(this.currentState()),()=>this.stateListeners.delete(a)}setWriterFence(a){this.writerFence=a}async release(){if(!this.released){if(!this.releasePromise){let a=this.releaseAndReap();this.releasePromise=a,a.catch(()=>{this.releasePromise===a&&(this.releasePromise=null)})}return this.releasePromise}}unavailable(){if(this.dead||this.releasing||this.released)return!0;try{return this.writerFence?.()===!1}catch{return!0}}currentState(){let a=this.reaped||this.released?null:this.child.pid??null;return{status:this.dead?"dead":this.released?"unhosted":this.attentions.size?"attention":this.activeTurnId?"active":"idle",sessionKey:this.identity.sessionId,endpoint:a?`stdio:${a}`:"stdio:released",pid:a,processStartIdentity:a?p.B.processIdentity(a):null,eventCursor:this.cursor,protocolVersion:this.protocolVersion,activeTurnRef:this.activeTurnId,pendingAttention:[...this.attentions.keys()],activeFlags:[...this.launchFlags],account:this.account}}restore(){let a=this.eventStore.load(this.identity.sessionId);this.events.push(...a),this.cursor=(0,t.dq)(this.identity.sessionId,a.at(-1)?.seq??0,this.cursor,this.onEventCursorRecovery),this.deliveries.push(...this.deliveryLedger.load(this.identity.sessionId).map(a=>({...a,entry:(0,s.h4)(a.entry)})));let b=null;for(let c of a)"turn-started"===c.kind&&(b=c.turnId),"turn-ended"===c.kind&&c.turnId===b&&(b=null),"attention"===c.kind&&this.attentions.set(c.id,C(c.attention)??{}),"attention-resolved"===c.kind&&this.attentions.delete(c.id),"session-status"===c.kind&&("dead"===c.status||"unhosted"===c.status)&&(b=null,this.attentions.clear());for(let a of(b&&this.emit({kind:"turn-ended",turnId:b,status:"error"}),this.attentions.keys()))this.emit({kind:"attention-resolved",id:a,resolution:"host-restarted"});this.attentions.clear()}reconcileTranscript(a){let b=[...a];for(let a of this.deliveries){if(a.delivered)continue;let c=a.queuedAt?Date.parse(a.queuedAt):-1/0,d=b.findIndex(b=>{let d=b.timestamp?Date.parse(b.timestamp):1/0,e=b.contentDigest??(b.text.trim()?(0,w.rM)(b.text,[]).contentDigest:null);return null!==e&&M(a.entry,{contentDigest:e,text:b.text,imageCount:b.imageCount??0})&&d>=c});if(d<0)continue;let[e]=b.splice(d,1);this.deliveryLedger.confirmDelivered(this.identity.sessionId,a.entry.id,e?.uuid??null),a.delivered=!0,a.engineMessageId=e?.uuid??null}}emit(a){let b;if(this.ledgerFailed)return;try{b=(0,t.RO)(this.cursor)}catch(a){this.ledgerFailed=!0,this.failWithoutLedger(Error(G(a)));return}this.cursor=b;let c={...a,seq:b};try{this.eventStore.append(this.identity.sessionId,c)}catch(a){this.cursor=this.events.at(-1)?.seq??Math.max(0,this.cursor-1),this.ledgerFailed=!0,this.failWithoutLedger(Error(`runtime event ledger failed: ${G(a)}`));return}for(let a of(this.events.push(c),this.subscribers))a.queue.push(c),a.wake?.();this.notifyStateListeners()}acceptStdout(a){if(this.dead||this.released)return;this.stdoutBuffer+=a;let b=this.stdoutBuffer.indexOf("\n");for(;b>=0;){let a=this.stdoutBuffer.slice(0,b);if(this.stdoutBuffer=this.stdoutBuffer.slice(b+1),Buffer.byteLength(a)>A)return this.fail(Error("Claude emitted an oversized JSONL frame"));if(a&&this.acceptMessage(a),this.dead)return;b=this.stdoutBuffer.indexOf("\n")}Buffer.byteLength(this.stdoutBuffer)>A&&this.fail(Error("Claude emitted an oversized JSONL frame"))}acceptMessage(a){let b=null;try{b=C(JSON.parse(a))}catch{}if(!b)return this.fail(Error("Claude emitted malformed stream JSON"));let c=D(b,"type"),d=D(b,"session_id");if(d&&d!==this.identity.sessionId)return this.fail(Error("Claude emitted a different session id"));if("system"===c&&"init"===b.subtype)return"none"!==b.apiKeySource?this.fail(Error("Claude stream process did not use subscription OAuth")):void 0;if("user"===c){let a=L(b),c="user"===D(b.message,"role")&&null!==a?this.deliveries.find(b=>!b.delivered&&M(b.entry,{contentDigest:a.contentDigest,text:a.content.text,imageCount:a.content.images.length})):void 0;if(c)try{this.deliveryLedger.confirmDelivered(this.identity.sessionId,c.entry.id,D(b,"uuid")),c.delivered=!0,c.engineMessageId=D(b,"uuid");let a=this.pendingDeliveries.get(c.entry.id);a&&(this.pendingDeliveries.delete(c.entry.id),clearTimeout(a.timer),a.resolve({outcome:c.disposition,turnId:c.entry.id}))}catch(a){return this.failWithoutLedger(Error(`Claude delivery ledger failed: ${G(a)}`))}this.emit({kind:"item",turnId:this.activeTurnId,item:function(a,b){let c=C(a.message)??{},d=b?b.content.images.map(a=>({type:"image",source:{type:"runtime_ref",sha256:a.sha256,media_type:a.mime,bytes:a.bytes}})):[],e=b?.content.text??K(a);e&&d.push({type:"text",text:e});let f=C(a.message)?.content;if(Array.isArray(f))for(let a of f){let b=C(a),c=D(b,"tool_use_id");b?.type==="tool_result"&&c&&d.push({type:"tool_result",tool_use_id:c,...!0===b.is_error?{is_error:!0}:{}})}return{...a,...b?{contentDigest:b.contentDigest}:{},message:{...c,content:d}}}(b,a),phase:"completed"});return}if("stream_event"===c){let a=C(b.event),c=D(C(a?.delta),"text");a?.type==="content_block_delta"&&null!==c&&(this.activeTurnId&&this.partialTurns.add(this.activeTurnId),this.emit({kind:"delta",turnId:this.activeTurnId??"unknown",text:c}));return}if("assistant"===c){let a=J(C(b.message)?.content);!a||this.activeTurnId&&this.partialTurns.has(this.activeTurnId)||this.emit({kind:"delta",turnId:this.activeTurnId??"unknown",text:a}),this.emit({kind:"item",turnId:this.activeTurnId,item:b,phase:"completed"});return}if("control_request"===c){let a=D(b,"request_id");if(!a)return this.fail(Error("Claude control request had no request id"));let c=C(b.request)??{};return this.attentions.set(a,c),void this.emit({kind:"attention",id:a,method:D(c,"subtype")??"control_request",attention:c})}if("control_cancel_request"===c){let a=D(b,"request_id");if(!a)return this.fail(Error("Claude control cancellation had no request id"));if(!this.attentions.has(a))return;let c=this.pendingAnswers.get(a);return c&&(clearTimeout(c.timer),this.pendingAnswers.delete(a),c.reject(Error("Claude attention was cancelled before answer confirmation"))),this.attentions.delete(a),void this.emit({kind:"attention-resolved",id:a,resolution:"server-resolved"})}if("control_response"===c){let a=C(b.response)??b,c=D(a,"request_id");if(!c)return;let d=this.pendingAnswers.get(c);if(d){clearTimeout(d.timer),this.pendingAnswers.delete(c),this.attentions.delete(c),"error"===a.subtype?(d.reject(Error("Claude attention answer failed")),this.emit({kind:"attention-resolved",id:c,resolution:"server-resolved"})):(d.resolve(),this.emit({kind:"attention-resolved",id:c,resolution:"answered"}));return}let e=this.pendingControls.get(c);if(!e)return;clearTimeout(e.timer),this.pendingControls.delete(c),"error"===a.subtype?e.reject(Error("Claude control request failed")):(e.interruptTurnId&&this.interruptedTurns.add(e.interruptTurnId),e.resolve());return}"result"===c&&this.acceptResult(b)}acceptResult(a){let b=this.turnQueue.shift()??this.activeTurnId;if(!b)return;this.partialTurns.delete(b);let c=this.interruptedTurns.delete(b)||"interrupted"===a.subtype?"interrupted":"success"===a.subtype?"completed":"error";for(let a of(this.emit({kind:"turn-ended",turnId:b,status:c}),this.attentions.keys())){let b=this.pendingAnswers.get(a);b&&(clearTimeout(b.timer),this.pendingAnswers.delete(a),b.reject(Error("Claude attention expired with its turn before answer confirmation"))),this.emit({kind:"attention-resolved",id:a,resolution:"turn-ended"})}this.attentions.clear(),this.activeTurnId=this.turnQueue[0]??null,this.activeTurnId?this.emit({kind:"turn-started",turnId:this.activeTurnId}):this.emit({kind:"session-status",status:"idle"})}write(a){try{this.child.stdin.write(`${JSON.stringify(a)}
|
|
6
6
|
`)}catch(b){let a=Error(`Claude stream stdin failed: ${G(b)}`);throw this.fail(a),a}}async releaseAndReap(){if(this.releasing=!0,this.rejectPending(Error("Claude stream host released")),this.startTermination(),!await this.waitForReap(2*this.shutdownGraceMs)&&((0,q.f)(this.child,"SIGKILL",this.signalProcess),!await this.waitForReap(this.shutdownGraceMs))){if(void 0!==this.child.pid&&(this.child.exitCode??null)===null&&(this.child.signalCode??null)===null)throw Error("Claude child could not be reaped");for(let a of[this.child.stdin,this.child.stdout,this.child.stderr])try{a?.destroy()}catch{}this.reaped=!0,this.terminationTimer&&(clearTimeout(this.terminationTimer),this.terminationTimer=null),this.resolveReaped()}this.finishRelease()}finishRelease(){if(this.released)return;this.released=!0,this.releasing=!1,this.activeTurnId=null,this.attentions.clear(),this.emit({kind:"session-status",status:"unhosted"}),this.ledgerFailed&&this.notifyStateListeners(),this.closeSubscribers();let a=this.releaseCleanup;this.releaseCleanup=null,a?.()}async waitForReap(a){let b;if(this.reaped)return!0;try{return await Promise.race([this.reapedPromise.then(()=>!0),new Promise(c=>{b=setTimeout(()=>c(!1),a)})])}finally{b&&clearTimeout(b)}}fail(a){this.dead||this.released||(this.dead=!0,this.activeTurnId=null,this.attentions.clear(),this.rejectPending(a),this.emit({kind:"session-status",status:"dead"}),this.closeSubscribers(),this.startTermination())}failWithoutLedger(a){if(this.released){this.notifyStateListeners(),this.closeSubscribers();return}this.dead?this.notifyStateListeners():(this.ledgerFailed=!0,this.dead=!0,this.activeTurnId=null,this.attentions.clear(),this.rejectPending(a),this.notifyStateListeners(),this.closeSubscribers(),this.startTermination())}startTermination(){if(!this.terminationStarted&&!this.reaped){this.terminationStarted=!0;try{this.child.stdin.end()}catch{}(0,q.f)(this.child,"SIGTERM",this.signalProcess),this.terminationTimer=setTimeout(()=>{this.terminationTimer=null,this.reaped||(0,q.f)(this.child,"SIGKILL",this.signalProcess)},this.shutdownGraceMs)}}rejectPending(a){for(let b of this.pendingDeliveries.values())clearTimeout(b.timer),b.reject(Error(G(a)));for(let b of(this.pendingDeliveries.clear(),this.pendingControls.values()))clearTimeout(b.timer),b.reject(Error(G(a)));for(let b of(this.pendingControls.clear(),this.pendingAnswers.values()))clearTimeout(b.timer),b.reject(Error(G(a)));this.pendingAnswers.clear()}closeSubscribers(){for(let a of this.subscribers)a.closed=!0,a.wake?.()}notifyStateListeners(){let a=this.currentState();for(let b of this.stateListeners)b(a)}}},26474:(a,b,c)=>{c.d(b,{A6:()=>q,N0:()=>p,OA:()=>s,_b:()=>r});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(91724),i=c(23921);c(29733),c(12770);let j=(0,h.BQ)("handoff-lineage.json"),k=null,l=null,m=null,n=!1;function o(){if(k&&l&&m)return{panes:k,children:l,conversationChildren:m};let a={};try{a=JSON.parse(e().readFileSync(j,"utf8"))}catch{}let b=function(a,b=i.pl){let c=new Map,d=new Map,e=new Map;for(let[d,e]of Object.entries(a.panes??{})){let a=Number(d);Number.isInteger(a)&&a>0&&"string"==typeof e&&b(a)&&c.set(a,e)}for(let[b,c]of Object.entries(a.children??{}))"string"==typeof c&&d.set(b,c);for(let[b,c]of Object.entries(a.conversationChildren??{}))b.startsWith("conversation_")&&c.startsWith("conversation_")&&e.set(b,c);let f=Object.keys(a.panes??{}).length+Object.keys(a.children??{}).length+Object.keys(a.conversationChildren??{}).length;return{panes:c,children:d,conversationChildren:e,dirty:c.size+d.size+e.size!==f}}(a);return k=b.panes,l=b.children,m=b.conversationChildren,b.dirty&&(n=!0),{panes:k,children:l,conversationChildren:m}}function p(a){return o().panes.get(a)??null}function q(a,b){let c=o();if(c.children.get(a)!==b){for(c.children.set(a,b);c.children.size>2e4;){let a=c.children.keys().next().value;if(void 0===a)break;c.children.delete(a)}n=!0}}function r(a){return o().children.get(a)??null}function s(){if(!n)return;n=!1;let a=o();try{e().mkdirSync(g().dirname(j),{recursive:!0}),e().writeFileSync(j,JSON.stringify({panes:Object.fromEntries([...a.panes].map(([a,b])=>[String(a),b])),children:Object.fromEntries(a.children),conversationChildren:Object.fromEntries(a.conversationChildren)}))}catch{}}},27471:(a,b,c)=>{c.d(b,{SS:()=>ad,Am:()=>aL,Do:()=>ah,yq:()=>ai,xs:()=>T,Fu:()=>B,IJ:()=>aK,HZ:()=>aA,XW:()=>aB,VT:()=>am,B$:()=>S,aI:()=>X,RZ:()=>az,r$:()=>av,m7:()=>U,zX:()=>ag,ZB:()=>aF,$o:()=>ay,Ni:()=>$,I6:()=>Z,u1:()=>V,e:()=>al,MA:()=>ax,EW:()=>af,V1:()=>aG,oF:()=>ac,Tk:()=>aI,jF:()=>aJ,WH:()=>E,xv:()=>H,a0:()=>F,lC:()=>at,PB:()=>P,WS:()=>aa});var d=c(31421),e=c(77598),f=c.n(e),g=c(73024),h=c.n(g),i=c(76760),j=c.n(i),k=c(14509),l=c(4012),m=c(29733),n=c(91724);let o=(0,n.BQ)("events.ndjson");function p(a,b){try{h().mkdirSync(j().dirname(o),{recursive:!0});try{h().statSync(o).size>4194304&&h().renameSync(o,o+".1")}catch{}let c={ts:new Date().toISOString(),action:a,...b};h().appendFileSync(o,JSON.stringify(c)+"\n","utf8")}catch{}}var q=c(99410),r=c(14289),s=c(59683),t=c(92806),u=c(93012),v=c(43384),w=c(5626),x=c(23921),y=c(27359);let z="agents",A=(0,n.BQ)("legacy-tmux-migration-complete"),B=u.p,C=null;function D(){var a;let b,c;return a={configuredTmpdir:process.env.TMUX_TMPDIR||"/tmp",externalFlag:process.env.LLV_LEGACY_TMUX_EXTERNAL,migrationComplete:h().existsSync(A),uid:process.getuid?.()??0},b=`/run/user/${a.uid}/agent-log-viewer`,c="1"===a.externalFlag,a.migrationComplete&&(!c||a.configuredTmpdir!==b)?{external:c,tmuxTmpdir:a.configuredTmpdir,health:{status:"degraded",code:"migration-marker-endpoint-mismatch",configuredTmpdir:a.configuredTmpdir,expectedTmpdir:b,message:`A migration completion marker exists while the Viewer is using ${a.configuredTmpdir}. Legacy tmux delivery remains active; remove the stale marker or complete the supervisor migration.`}}:c&&a.configuredTmpdir!==b?{external:c,tmuxTmpdir:a.configuredTmpdir,health:{status:"degraded",code:"external-endpoint-mismatch",configuredTmpdir:a.configuredTmpdir,expectedTmpdir:b,message:`External tmux mode is enabled with ${a.configuredTmpdir}. Set TMUX_TMPDIR=${b} and redeploy the Viewer.`}}:{external:c,tmuxTmpdir:a.configuredTmpdir,health:{status:"healthy"}}}function E(){return D().tmuxTmpdir}function F(){return D().health}function G(a,b){return{kind:"tmux-tmpdir",tmuxTmpdir:a,socketName:"default",socketPath:j().join(a,`tmux-${b}`,"default")}}function H(){return G(E(),process.getuid?.()??0)}function I(a,b,c=H()){return new Promise((e,f)=>{let g=(0,d.spawn)("tmux",a,{stdio:["pipe","pipe","pipe"],env:{...(0,t.Fd)(process.env),TMUX_TMPDIR:c.tmuxTmpdir}}),h="",i="";g.stdout.on("data",a=>h+=a.toString("utf8")),g.stderr.on("data",a=>i+=a.toString("utf8")),g.on("error",f),g.on("close",a=>e({code:a,stdout:h,stderr:i})),void 0!==b?g.stdin.end(b):g.stdin.end()})}async function J(a,b,c){let d=await c.runTmux(["display-message","-p","-t",a,"#{pid} #{pane_id} #{pane_pid} #{session_name}:#{window_index}.#{pane_index} #{window_name} #{pane_current_command}"],void 0,b).catch(()=>null);return d&&0===d.code?function(a,b){let[c="",d="",e="",f="",g="",h=""]=a.trim().split(" "),i=Number(c),j=Number(e);return Number.isInteger(i)&&!(i<=0)&&/^%\d+$/.test(d)&&Number.isInteger(j)&&!(j<=0)&&f?{serverPid:i,serverStartIdentity:b(i),paneId:d,panePid:j,paneStartIdentity:b(j),display:f,windowName:g,command:h}:null}(d.stdout,c.processIdentity):null}function K(a,b,c){return null!==a.startIdentity&&null!==c&&a.pid===b&&a.startIdentity===c}async function L(a,b,c={runTmux:I,processIdentity:a=>s.B.processIdentity(a)}){let d=await J(a.paneId,b,c);return d&&d.paneId===a.paneId&&K(a.server,d.serverPid,d.serverStartIdentity)&&K(a.panePid,d.panePid,d.paneStartIdentity)?d:null}async function M(a,b={runTmux:I,processIdentity:a=>s.B.processIdentity(a)}){let c=await b.runTmux(["set-environment","-gu",t.Cy],void 0,a.endpoint);if(0!==c.code)throw Error(c.stderr.trim()||"could not isolate tmux spawn environment");let d=await b.runTmux(["list-panes","-a","-F","#{pane_id}"],void 0,a.endpoint);if(0!==d.code)throw Error(d.stderr.trim()||"could not snapshot tmux panes before spawn");let e=new Set(d.stdout.split("\n").map(a=>a.trim()).filter(Boolean));if([...e].some(a=>!/^%\d+$/.test(a)))throw Error("tmux returned an invalid pre-spawn pane listing");let f=await b.runTmux(["new-window","-d","-P","-F","#{pane_id}","-t",a.session+":","-n",a.windowName,"-c",a.cwd],void 0,a.endpoint);if(0!==f.code)throw Error(f.stderr.trim()||"could not open tmux window");let g=f.stdout.split("\n").map(a=>a.trim()).filter(Boolean),h=1===g.length?g[0]:"";if(!/^%\d+$/.test(h))throw Error("tmux returned an invalid pane id");if(e.has(h))throw Error("tmux new-window returned a pre-existing pane id");let i=await J(h,a.endpoint,b);if(!i)throw Error("tmux could not verify the created pane");if(i.paneId!==h)throw Error("tmux created pane identity changed before verification");if(i.windowName!==a.windowName)throw Error("tmux created pane has an unexpected window name");if(!K(a.server,i.serverPid,i.serverStartIdentity))throw Error("tmux server changed while creating the spawn pane");if("linux"===s.B.name&&(null===i.serverStartIdentity||null===i.paneStartIdentity))throw Error("tmux process start identity is unavailable");return{endpoint:a.endpoint.tmuxTmpdir,server:{pid:i.serverPid,startIdentity:i.serverStartIdentity},paneId:h,panePid:{pid:i.panePid,startIdentity:i.paneStartIdentity},target:h,display:i.display}}function N(a){try{return h().realpathSync(a)}catch{return j().resolve(a)}}function O(a,b,c){let d=new Set,e=a;for(let a=0;null!==e&&a<64;a+=1){if(e===b)return a;if(d.has(e))break;d.add(e),e=c(e)}return null}async function P(a){if(null===a.server.startIdentity||null===a.panePid.startIdentity||null===a.agent.startIdentity)return!1;let b=G(a.endpoint,process.getuid?.()??0),c={endpoint:a.endpoint,server:a.server,paneId:a.paneId,panePid:a.panePid,target:a.paneId},d=await L(c,b);return!!d&&d.windowName===a.windowName&&!!(0,x.pl)(a.agent.pid)&&s.B.processIdentity(a.agent.pid)===a.agent.startIdentity&&!!Q((0,x.$U)(a.agent.pid),a.argv)&&null!==O(a.agent.pid,a.panePid.pid,x.Ib)}function Q(a,b){return a.length===b.length&&a.every((a,c)=>a===b[c])}function R(a,b){return!b.pidAlive(a.pid)||null!==a.startIdentity&&b.processIdentity(a.pid)!==a.startIdentity}async function S(a,b={}){if(null===a.server.startIdentity||null===a.panePid.startIdentity||null===a.agent.startIdentity)return!1;let c={runTmux:I,processIdentity:a=>s.B.processIdentity(a),pidAlive:x.pl,argv:x.$U,parentPid:x.Ib,sleep:a=>new Promise(b=>setTimeout(b,a)),maxVerifyAttempts:20,...b},d=G(a.endpoint,process.getuid?.()??0),e={endpoint:a.endpoint,server:a.server,paneId:a.paneId,panePid:a.panePid,target:a.paneId},g=await L(e,d,c);if(!g||g.windowName!==a.windowName||!c.pidAlive(a.agent.pid)||c.processIdentity(a.agent.pid)!==a.agent.startIdentity||!Q(c.argv(a.agent.pid),a.argv)||null===O(a.agent.pid,a.panePid.pid,c.parentPid))return!1;let h=`#{&&:#{==:#{pid},${a.server.pid}},#{&&:#{==:#{pane_id},${a.paneId}},#{==:#{pane_pid},${a.panePid.pid}}}}`,i=`llv-host-mismatch-${f().randomUUID()}`,j=await c.runTmux(["if-shell","-t",a.paneId,"-F",h,`kill-pane -t ${a.paneId}`,`display-message -p ${i}`],void 0,d);if(0!==j.code||j.stdout.includes(i))return!1;for(let b=0;b<c.maxVerifyAttempts;b+=1){if(null===await J(a.paneId,d,c)&&R(a.panePid,c)&&R(a.agent,c))return!0;b+1<c.maxVerifyAttempts&&await c.sleep(25)}return!1}async function T(a,b={}){let c=G(a.endpoint,process.getuid?.()??0),d=b.runTmux??I,e={tmuxServerPid:a.server.pid,tmuxServerStartIdentity:a.server.startIdentity,paneId:a.paneId,panePid:a.panePid.pid,paneStartIdentity:a.panePid.startIdentity},g=await al(e,c,b);if(!g.ok)return"tmux-unavailable"===g.reason?"unverifiable":"absent";let h=`#{&&:#{==:#{pid},${a.server.pid}},#{&&:#{==:#{pane_id},${a.paneId}},#{==:#{pane_pid},${a.panePid.pid}}}}`,i=`llv-host-mismatch-${f().randomUUID()}`,j=await d(["if-shell","-t",a.paneId,"-F",h,`kill-pane -t ${a.paneId}`,`display-message -p ${i}`],void 0,c).catch(()=>null);if(!j||0!==j.code)return"unverifiable";if(!j.stdout.includes(i))return"cancelled";let k=await al(e,c,b);return k.ok||"tmux-unavailable"===k.reason?"unverifiable":"absent"}async function U(a=!1){let b,c=Date.now();if(!a&&C&&c-C.at<12e3)return C.observation;let d=new Map;try{b=await I(["list-panes","-a","-F","#{session_name}:#{window_index}.#{pane_index} #{pane_id} #{pane_pid} #{window_name}"])}catch(a){return{kind:"failure",error:a instanceof Error?a.message:String(a)}}if(0!==b.code){let a=b.stderr.trim()||`tmux list-panes exited ${b.code??"without a status"}`;return/no server running on|failed to connect to server/i.test(a)?{kind:"no-server"}:{kind:"failure",error:a}}for(let a of b.stdout.split("\n")){let[b="",c="",e="",f=""]=a.split(" "),g=Number(e.trim());b.trim()&&c.startsWith("%")&&Number.isInteger(g)&&g>0&&d.set(g,{target:b.trim(),paneId:c.trim(),windowName:f.trim()})}let e={kind:"available",panes:d};return C={at:c,observation:e},e}async function V(a){if(!Number.isInteger(a)||a<=0)return null;let b=await U();if("available"!==b.kind)return null;let{panes:c}=b;if(0===c.size)return null;let d=new Set,e=a;for(let a=0;a<64&&null!==e&&e>1;a+=1){let a=c.get(e);if(a)return a.target;if(d.has(e)||(0,x.Vt)((0,x.$U)(e)))break;d.add(e),e=(0,x.Ib)(e)}return null}function W(a){let b=new Set;for(let c of a)null!==c.pid&&"running"===c.proc&&(0,x.pl)(c.pid)&&b.add(c.pid);return b}async function X(){return W(await (0,w.CS)())}async function Y(a,b){return(b?W(b):await X()).has(a)?V(a):"unknown"}async function Z(a,b){if(null!==a){let c=await Y(a,b);if("unknown"!==c&&null!==c)return c}return null}async function $(a,b){if(!Number.isInteger(a)||a<=0)return null;let c=b.replace(/\s+/g," ").trim().slice(0,80);if(!c)return null;let d=await Z(a);if(!d)return null;let e=await I(["rename-window","-t",d,c]).catch(()=>null);return e&&0===e.code?d:null}let _=new Map;async function aa(a,b){let c=(_.get(a)??Promise.resolve()).then(b,b);_.set(a,c.catch(()=>void 0));try{return await c}finally{_.get(a)!==c&&_.size>256&&_.clear()}}async function ab(a,b,c){await c();let d=await aE(a,b);if(null===d)throw Error("tmux pane is unavailable");if((0,y.g2)(d))throw p("gate",{target:a,result:"error",reason:"shell_prompt"}),Error("pane has no agent (plain shell) — message was not sent");for(let d=0;d<3;d+=1){await c();let d=await aF(a,b);if(null!==(0,y.fm)(d))throw p("gate",{target:a,result:"error",reason:"select_dialog"}),Error("agent is waiting for a choice in the pane — answer before sending a new message");let e=(0,y._1)(d);if(null!==e)throw p("gate",{target:a,result:"error",reason:e}),Error("rate_limit"===e?"agent hit a rate limit — message was not sent":"agent is waiting for confirmation in the pane — answer before sending a new message");let f=(0,y.ye)(d);if(null!==f){p("gate",{target:a,result:"ok",reason:f}),await c(),await I(["send-keys","-t",a,"Enter"],void 0,b),await aC(700);continue}return}}async function ac(a,b){let c=H(),d=await J(a,c,{runTmux:I,processIdentity:a=>s.B.processIdentity(a)});if(!d)throw Error("tmux pane is unavailable");let e={endpoint:c.tmuxTmpdir,server:{pid:d.serverPid,startIdentity:d.serverStartIdentity},paneId:d.paneId,panePid:{pid:d.panePid,startIdentity:d.paneStartIdentity},target:d.paneId,display:d.display},f=async()=>{if(!await L(e,c))throw Error("tmux server or pane identity changed during delivery")};await aa(d.paneId,async()=>{try{await ab(d.paneId,c,f),await ae(d.paneId,b,c,f),p("send",{target:d.paneId,result:"ok",meta:{bytes:b.length,display:d.display}})}catch(a){throw p("send",{target:d.paneId,result:"error",reason:a instanceof Error?a.message:String(a)}),a}})}class ad extends Error{constructor(a){super(a instanceof Error?a.message:String(a),{cause:a}),this.name="TmuxDeliveryUncertainError"}}async function ae(a,b,c,d){let e=`viewer-${Date.now()}-${Math.floor(1e6*Math.random())}`,f=!1;try{await d();let g=await I(["load-buffer","-b",e,"-"],Buffer.from(b,"utf8"),c);if(0!==g.code)throw Error(g.stderr.trim()||"could not load tmux buffer");await d();let h=await I(["paste-buffer","-d","-p","-b",e,"-t",a],void 0,c);if(0!==h.code)throw Error(h.stderr.trim()||"could not paste text into pane");f=!0,await aC(250),await d();let i=await I(["send-keys","-t",a,"Enter"],void 0,c);if(0!==i.code)throw Error(i.stderr.trim()||"could not press Enter");let j=b.split("\n").map(a=>a.trim()).find(Boolean)?.slice(0,32)??"";for(let b=0;b<4;b+=1){await aC(400),await d();let b=(0,y.dC)(await aF(a,c));if(!(""!==j&&b.includes(j)||b.includes("[Pasted text")))return;await d();let e=await I(["send-keys","-t",a,"Enter"],void 0,c);if(0!==e.code)throw Error(e.stderr.trim()||"could not press Enter")}}catch(a){if(f)throw new ad(a);throw a}}async function af(a){let b=await I(["send-keys","-t",a,"Escape"]);if(p("interrupt",{target:a,result:0===b.code?"ok":"error",reason:b.stderr.trim()||void 0}),0!==b.code)throw Error(b.stderr.trim()||"could not send Escape")}async function ag(a){let b=await I(["display-message","-p","-t",a,"#{pane_pid}"]).catch(()=>null),c=b&&0===b.code?Number(b.stdout.trim()):NaN;return Number.isInteger(c)&&c>0?c:null}function ah(a){return{...a,tmuxServerStartIdentity:s.B.processIdentity(a.tmuxServerPid),paneStartIdentity:s.B.processIdentity(a.panePid)}}function ai(a){let b=new Map,c=a=>"portable"===s.B.name?null:(b.has(a)||b.set(a,s.B.processIdentity(a)),b.get(a)??null);return new Map(a.map(a=>[a.paneId,{...a,tmuxServerStartIdentity:c(a.tmuxServerPid),paneStartIdentity:c(a.panePid)}]))}function aj(a){return/[\r\n\0]/.test(a)}function ak(a){return`'${a.replaceAll("'","'\\''")}'`}async function al(a,b=H(),c={}){var d;let e=c.runTmux??I,f=c.processIdentity??(a=>s.B.processIdentity(a)),g=await e(["display-message","-p","#{pid}"],void 0,b).catch(()=>null),h=g&&0===g.code?Number(g.stdout.trim()):NaN;if(!g||0!==g.code||!Number.isInteger(h)||h<=0)return{ok:!1,reason:"tmux-unavailable"};let i=f(h);if(h===a.tmuxServerPid&&null!==a.tmuxServerStartIdentity&&null===i)return{ok:!1,reason:"tmux-unavailable"};if(h!==a.tmuxServerPid||null!==a.tmuxServerStartIdentity&&i!==a.tmuxServerStartIdentity)return{ok:!1,reason:"server-restarted"};let j=await e(["display-message","-p","-t",a.paneId,"#{pid} #{pane_id} #{pane_pid} #{session_name}:#{window_index}.#{pane_index}"],void 0,b).catch(()=>null);if(!j)return{ok:!1,reason:"tmux-unavailable"};if(0!==j.code)return{ok:!1,reason:/can't find pane/i.test(`${j.stderr}
|
|
7
7
|
${j.stdout}`)?"stale-pane":"tmux-unavailable"};let[k="",l="",m="",n=""]=j.stdout.trim().split(" "),o=Number(k),p=Number(m);if(!Number.isInteger(o)||o<=0||!l||!Number.isInteger(p)||p<=0||!n)return{ok:!1,reason:"tmux-unavailable"};let q=f(p);if(l===a.paneId&&p===a.panePid&&null!==a.paneStartIdentity&&null===q)return{ok:!1,reason:"tmux-unavailable"};let r=(d={tmuxServerPid:o,tmuxServerStartIdentity:o===h?i:f(o),paneId:l,panePid:p,paneStartIdentity:q,target:n}).tmuxServerPid!==a.tmuxServerPid||null!==a.tmuxServerStartIdentity&&d.tmuxServerStartIdentity!==a.tmuxServerStartIdentity?"server-restarted":d.paneId!==a.paneId||d.panePid!==a.panePid||null!==a.paneStartIdentity&&d.paneStartIdentity!==a.paneStartIdentity?"stale-pane":"ok";if("ok"!==r)return{ok:!1,reason:r};try{return{ok:!0,target:n,endpoint:b,...function(a,b){if(aj(a.tmuxTmpdir)||aj(b))throw Error("tmux attach command contains an unsafe control character");let c=`TMUX_TMPDIR=${ak(a.tmuxTmpdir)} tmux attach-session`;return{command:`${c} -t ${ak(b)}`,readOnlyCommand:`${c} -r -t ${ak(b)}`}}(b,n)}}catch{return{ok:!1,reason:"tmux-unavailable"}}}async function am(a){let b=await I(["kill-pane","-t",a]);if(p("kill",{target:a,result:0===b.code?"ok":"error",reason:b.stderr.trim()||void 0}),0!==b.code)throw Error(b.stderr.trim()||"could not close tmux pane")}async function an(a=H()){if(D().external){let b=await I(["has-session","-t",z],void 0,a).catch(()=>null);if(!b||0!==b.code)throw Error("external legacy tmux supervisor is unavailable; refusing to create a container-owned server");return z}let b=await I(["list-clients","-F","#{client_activity} #{client_session}"],void 0,a).catch(()=>null),c=a=>{let b=null;for(let c of a.split("\n")){let a=c.indexOf(" ");if(a<0)continue;let d=Number(c.slice(0,a)),e=c.slice(a+1).trim();e&&Number.isFinite(d)&&(!b||d>b.at)&&(b={at:d,name:e})}return b?.name??null};if(b&&0===b.code){let a=c(b.stdout);if(a)return a}let d=await I(["list-sessions","-F","#{session_activity} #{session_name}"],void 0,a).catch(()=>null);if(d&&0===d.code){let a=c(d.stdout);if(a)return a}let e=await I(["new-session","-d","-x","220","-y","50","-s","agents"],void 0,a);if(0!==e.code&&!/duplicate session/.test(e.stderr))throw Error(e.stderr.trim()||"could not create tmux session");return"agents"}let ao=(0,n.BQ)("resume-panes.json"),ap=null,aq=null;function ar(){if(ap)return ap;ap=new Map,aq=null;try{var a;let b=(a=JSON.parse(h().readFileSync(ao,"utf8")))&&"object"==typeof a&&"panes"in a?{serverPid:"number"==typeof a.serverPid&&Number.isInteger(a.serverPid)?a.serverPid:null,panes:a.panes&&"object"==typeof a.panes?a.panes:{}}:{serverPid:null,panes:a&&"object"==typeof a?a:{}};for(let[a,c]of(aq=b.serverPid,Object.entries(b.panes)))c&&"string"==typeof c.paneId&&"string"==typeof c.windowName&&ap.set(a,c)}catch{}return ap}function as(){if(ap)try{h().mkdirSync(j().dirname(ao),{recursive:!0});let a={serverPid:aq,panes:Object.fromEntries(ap)};h().writeFileSync(ao,JSON.stringify(a))}catch{}}async function at(){let a=await I(["display-message","-p","#{pid}"]).catch(()=>null),b=a&&0===a.code?Number(a.stdout.trim()):NaN;return Number.isInteger(b)&&b>0?b:null}async function au(a){let b=await I(["display-message","-p","#{pid}"],void 0,a).catch(()=>null),c=b&&0===b.code?Number(b.stdout.trim()):NaN;if(!Number.isInteger(c)||c<=0)return null;let d=s.B.processIdentity(c);return"linux"===s.B.name&&null===d?null:{pid:c,startIdentity:d}}async function av(a){let b=await I(["show-options","-p","-v","-t",a,"@llv_launch_id"]).catch(()=>null),c=b&&0===b.code?b.stdout.trim():"";return/^[0-9a-f-]{36}$/i.test(c)?c:null}function aw(a){let b=ar();return aq!==a&&(b.clear(),aq=a,as()),b}async function ax(){let a=await at();return null===a?null:{serverPid:a,records:new Map(aw(a))}}async function ay(a,b,c){if(!c.panePid)return;let d=await at();null!==d&&(aw(d).set(a,{paneId:c.paneId,panePid:c.panePid,windowName:b.windowName,engine:b.engine}),as())}async function az(a){let b=await I(["display-message","-p","-t",a,"#{window_name} #{pane_current_command} #{session_name}:#{window_index}.#{pane_index}"]).catch(()=>null),c=b&&0===b.code?b.stdout.trim().split(" "):null;return c&&3===c.length?{windowName:c[0]??"",command:c[1]??"",display:c[2]??a}:null}function aA(a){ar().delete(a)&&as()}async function aB(a,b){let c=G(b.endpoint,process.getuid?.()??0),d=await au(c);if(!d||!K(b.server,d.pid,d.startIdentity))return;let e=aw(d.pid),f=e.get(a);f?.paneId===b.paneId&&f.panePid===b.panePid.pid&&(e.delete(a),as())}function aC(a){return new Promise(b=>setTimeout(b,a))}function aD(a){return`cd -- ${ak(a)}`}async function aE(a,b=H()){let c=await I(["display-message","-p","-t",a,"#{pane_current_command}"],void 0,b).catch(()=>null);return c&&0===c.code?c.stdout.trim():null}async function aF(a,b=H()){let c=await I(["capture-pane","-p","-t",a],void 0,b).catch(()=>null);return c&&0===c.code?c.stdout:""}async function aG(a,b){if(!b.length)return;let c=await I(["send-keys","-t",a,...b]);if(0!==c.code)throw Error(c.stderr.trim()||"could not send keys")}async function aH(a,b,c){var d,e,f,g;let h,i,j=H(),n=await an(j),o=await au(j);if(!o)throw Error("tmux server identity is unavailable before spawn");let q="pane-bound"===c.state||"host-verified"===c.state?c.pane:null,r=null!==q,t=r?null:(0,m.agentRegistry)().rotateSpawnCapabilityForReceipt(c.launchId),u=q||await M({session:n,cwd:a.cwd,windowName:a.windowName,endpoint:j,server:o}),v=u.paneId,w=u.display??u.paneId,z=u.panePid.pid,A=async a=>{if(!await L(u,j))throw Error("tmux server or created pane changed before spawn actuation");return I(a,void 0,j)};if(r){let a=await A(["show-options","-p","-v","-t",v,"@llv_launch_id"]);if(0!==a.code||a.stdout.trim()!==c.launchId)throw Error("spawn pane launch marker changed before recovery")}else{let a=await A(["set-option","-p","-t",v,"@llv_launch_id",c.launchId]);if(0!==a.code)throw Error(a.stderr.trim()||"could not bind launch marker to pane");if("conflicted"===(0,m.agentRegistry)().bindSpawnPane(c.launchId,u).state)throw Error("spawn pane binding conflict")}let B=await L(u,j);if(!B)throw Error("tmux server or created pane changed before spawn actuation");let C=!(0,y.g2)(B.command);if(!C){if(r){let a=await A(["send-keys","-t",v,"C-c"]);if(0!==a.code)throw Error(a.stderr.trim()||"could not reset pane before spawn recovery")}let b=t??(0,m.agentRegistry)().rotateSpawnCapabilityForReceipt(c.launchId),d=(0,k.in)(a,b),e=await A(["send-keys","-t",v,"-l",aD(a.cwd)]);if(0!==e.code)throw Error(e.stderr.trim()||"could not type cwd into pane");let f=await A(["send-keys","-t",v,"Enter"]);if(0!==f.code)throw Error(f.stderr.trim()||"could not enter cwd");let g=await A(["send-keys","-t",v,"-l",d.command]);if(0!==g.code)throw Error(g.stderr.trim()||"could not type command into pane");let h=await A(["send-keys","-t",v,"Enter"]);if(0!==h.code)throw Error(h.stderr.trim()||"could not start agent")}let D=Date.now()+18e4,E="";for(;Date.now()<D;){await aC(1e3);let b=await L(u,j);if(!b)throw Error("tmux server or created pane changed during agent launch");let c=b.command;if((0,y.g2)(c)){if(C)throw Error(`agent exited immediately after launch: ${(0,y.d3)(await aF(v,j))}`);continue}C=!0;let d=await aF(v,j),e=(0,y.ZW)(a.engine,d);if(e)throw Error(e.message);let f=d!==E?(0,y.ye)(d):null;if(null!==f){p("gate",{target:v,cwd:a.cwd,result:"ok",reason:f}),await A(["send-keys","-t",v,"Enter"]),E=d;continue}if((0,y.WM)(d))break}let F=await L(u,j);if(!F||(0,y.g2)(F.command))throw p("spawn",{target:v,cwd:a.cwd,result:"error",reason:"agent_exited_on_boot"}),Error(`agent did not start in the window: ${(0,y.d3)(await aF(v,j))}`);let G=await aF(v,j),J=(0,y.ZW)(a.engine,G);if(J)throw Error(J.message);if(!(0,y.WM)(G))throw Error(`agent never reached a launch-ready prompt: ${(0,y.d3)(G)}`);let K=(d=a.engine,e=a.cwd,f=(0,x.Bj)(!0),g=x.Ib,h=N(e),!(i=f.flatMap(a=>{if(a.engine!==d||N(a.cwd)!==h)return[];let b=O(a.pid,z,g);return null===b?[]:[{process:a,distance:b}]}).sort((a,b)=>a.distance-b.distance||a.process.pid-b.process.pid))[0]||i[1]&&i[1].distance===i[0].distance?null:i[0].process);if(!K)throw Error("booted agent process could not be verified beneath the created pane");let P=s.B.processIdentity(K.pid);if(!(0,x.pl)(K.pid)||"linux"===s.B.name&&null===P)throw Error("booted agent process identity is unavailable");let Q={kind:"tmux",endpoint:j.tmuxTmpdir,server:u.server,paneId:u.paneId,panePid:u.panePid,windowName:F.windowName,agent:{pid:K.pid,startIdentity:P},argv:[...K.argv]},R=(0,m.agentRegistry)().markSpawnHostVerified(c.launchId,Q);if("conflicted"===R.state)throw Error(R.error??"spawn host verification conflict");p("spawn",{target:v,cwd:a.cwd,...a.transcript?{path:a.transcript}:{},result:"ok",meta:{window:a.windowName,display:w}});let S=(0,l.fenceViewerSpawnPrompt)(a.engine,b);if(S){try{await ac(v,S)}catch(b){let a=b instanceof Error?b.message:String(b);throw(a.includes("pane is unavailable")||a.includes("pane identity changed during delivery"))&&(0,m.agentRegistry)().invalidateSpawnHost(c.launchId,"spawn_host_identity_conflict"),b}let b=!1,d="";for(let e=0;e<6;e+=1){d=await aF(v,j);let e=(0,y.ZW)(a.engine,d);if(e)throw(0,m.agentRegistry)().invalidateSpawnHost(c.launchId,e.message),Error(e.message);if((0,y.OK)(a.engine,d,S)){b=!0;break}await aC(400)}if(!b)throw Error(`launch prompt was not accepted by the agent: ${(0,y.d3)(d)}`)}if(!await L(u,j)||!(0,x.pl)(K.pid)||null!==P&&s.B.processIdentity(K.pid)!==P||null===O(K.pid,z,x.Ib))throw(0,m.agentRegistry)().invalidateSpawnHost(c.launchId,"spawn_host_identity_conflict"),Error("spawn host identity changed before launch confirmation");return(0,m.agentRegistry)().markSpawnPromptDelivered(c.launchId),{paneId:v,display:w,panePid:z,host:Q}}async function aI(a,b,c){let d=c??(0,m.agentRegistry)().beginSpawn(a.engine,a.cwd,a.launchProfile);try{let c=function(a,b=(0,v.l)()){return"claude"!==a.engine||"structured"!==b||a.printMode?null:"structured transport prohibits legacy tmux Claude launches; the pane-less claude-broker host owns this spawn — retry once the structured runtime host is available"}(a);if(c)throw Error(c);return{...await aH(a,b,d),receipt:d}}catch(a){throw(0,m.agentRegistry)().failSpawn(d.launchId,a instanceof Error?a.message:String(a)),a}}async function aJ(a){let b=H(),c=await an(b),d=await au(b);if(!d)throw Error("tmux server identity is unavailable before command spawn");let e=await M({session:c,...a,endpoint:b,server:d}),f=e.paneId;for(let[c,d]of[[["send-keys","-t",f,"-l",aD(a.cwd)],"could not type cwd into pane"],[["send-keys","-t",f,"Enter"],"could not enter cwd"],[["send-keys","-t",f,"-l",a.command],"could not type command into pane"],[["send-keys","-t",f,"Enter"],"could not start command"]]){if(!await L(e,b))throw Error("tmux server or created pane changed during command launch");let a=await I([...c],void 0,b);if(0!==a.code)throw Error(a.stderr.trim()||d)}return{paneId:f,display:e.display??f,panePid:e.panePid.pid}}function aK(a){for(let b of a)try{h().unlinkSync(b)}catch{}}function aL(a,b){let c=[];try{for(let a of b)c.push(function(a,b){let c=(0,q.PG)(b);if(null===c)throw Error("unsupported image type");let d=Buffer.from(a,"base64");if(0===d.length)throw Error("invalid image data");if(d.length>q.YP)throw Error("image is too large");h().mkdirSync(r.j,{recursive:!0});let e=j().join(r.j,`img-${Date.now()}-${f().randomUUID().slice(0,8)}.${c}`);return h().writeFileSync(e,d),{path:e}}(a.base64,a.mime).path)}catch(a){throw aK(c),a}return{payload:[a,...c].filter(Boolean).join("\n"),imagePaths:c}}},29861:(a,b,c)=>{c.d(b,{$:()=>e});var d=c(68032);function e(a,b){let c={...a};if(delete c[d.mq],!b?.includes("telegram"))return c;try{let a=(0,d.w0)()?.connectorToken;a&&(c[d.mq]=a)}catch{}return c}},32372:(a,b,c)=>{c.d(b,{DO:()=>n,G:()=>u,N2:()=>w,ON:()=>o,PF:()=>L,ki:()=>q,sP:()=>m,u1:()=>p});var d=c(77598),e=c.n(d),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(91724),k=c(59683),l=c(41022);let m=16,n=0xa00000,o=0x1200000,p=0x1800000;function q(a,b){return{supported:b,reason:b?null:"codex"===a?l.t6:l.gy,formats:[...l.in],maxImages:m,maxRawBytesPerImage:n,maxEncodedBytesPerRequest:p}}let r={"image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp"},s=new Int32Array(new SharedArrayBuffer(4));function t(a){Atomics.wait(s,0,0,a)}function u(a,b){if("image/png"===b)return a.length>=24&&a.subarray(0,8).equals(Buffer.from("89504e470d0a1a0a","hex"))&&"IHDR"===a.subarray(12,16).toString("ascii");if("image/jpeg"===b)return a.length>=4&&255===a[0]&&216===a[1]&&255===a[2]&&255===a.at(-2)&&217===a.at(-1);if("image/gif"===b){let b=a.subarray(0,6).toString("ascii");return a.length>=10&&("GIF87a"===b||"GIF89a"===b)}return a.length>=12&&"RIFF"===a.subarray(0,4).toString("ascii")&&"WEBP"===a.subarray(8,12).toString("ascii")}function v(a){let b=(0,l.CC)(a.mime);if(!b)throw Error("runtime image MIME is unsupported");let c=function(a){if(!a||a.length%4!=0||!/^[A-Za-z0-9+/]+={0,2}$/.test(a))throw Error("runtime image base64 is invalid");let b=Buffer.from(a,"base64");if(0===b.length||b.toString("base64")!==a)throw Error("runtime image base64 is invalid");return b}(a.base64);if(c.byteLength>n)throw Error("runtime image exceeds 10 MB");if(!u(c,b))throw Error("runtime image signature does not match MIME");return{data:c,mime:b}}function w(a){return a.map(a=>{let{data:b,mime:c}=v(a);return{sha256:e().createHash("sha256").update(b).digest("hex"),mime:c,bytes:b.byteLength}})}function x(a){let b=g().openSync(a,"r");try{g().fsyncSync(b)}finally{g().closeSync(b)}}let y=/^[a-f0-9]{64}$/,z=/^([a-f0-9]{64})\.(png|jpg|gif|webp)$/;function A(a,b,c){if(Array.isArray(a)){for(let d of a)A(d,b,c);return}if(!a||"object"!=typeof a)return;"string"==typeof a.sha256&&y.test(a.sha256)&&"string"==typeof a.mime&&(0,l.CC)(a.mime)&&Number.isSafeInteger(a.bytes)&&Number(a.bytes)>0&&b.add(a.sha256);let d=function(a){if("delivered"!==a.state||!Array.isArray(a.runtimeImages))return null;let b="string"==typeof a.deliveredAt?Date.parse(a.deliveredAt):"string"==typeof a.createdAt?Date.parse(a.createdAt):NaN;return Number.isFinite(b)?b:null}(a);for(let[e,f]of Object.entries(a))"runtimeImages"===e&&null!==d&&d<=c||A(f,b,c)}function B(a,b){let c=a.split("\n"),d=a.endsWith("\n"),e=[];for(let[a,f]of c.entries())if(f.trim())try{e.push(JSON.parse(f))}catch(e){if(a===c.length-1&&!d)break;throw Error(`${b} contains malformed JSON`,{cause:e})}return e}function C(a,b,c){let d;try{d=g().readFileSync(a,"utf8")}catch(a){if("ENOENT"===a.code)return;throw a}if(d.trim()){if(a.endsWith(".jsonl")||a.endsWith(".ndjson")){for(let e of B(d,a))A(e,b,c);return}A(JSON.parse(d),b,c)}}function D(a){let b=process.getBuiltinModule?.("bun:sqlite");if(!b)throw Error("runtime image reachability requires the Bun runtime");return new b.Database(a,{readonly:!0,strict:!0})}let E=new Set(["delivered","turn-started","steered"]);function F(a,b){let c;if("string"!=typeof a||!a.trim())return!1;try{c=JSON.parse(a)}catch{return!1}if(!c||"object"!=typeof c||Array.isArray(c))return!1;let d=c;if("string"!=typeof d.status||!E.has(d.status))return!1;let e="string"==typeof d.at?Date.parse(d.at):NaN;return Number.isFinite(e)&&e<=b}function G(a){let b;try{let c=g().openSync(a,g().constants.O_RDONLY|g().constants.O_NOFOLLOW);try{b=JSON.parse(g().readFileSync(c,"utf8"))}finally{g().closeSync(c)}}catch(a){if(["ENOENT","ELOOP"].includes(a.code??"")||a instanceof SyntaxError)return null;throw a}if(!b||"object"!=typeof b||Array.isArray(b))return null;let c=b;return Number.isSafeInteger(c.pid)&&!(c.pid<=0)&&(null===c.startIdentity||"string"==typeof c.startIdentity&&c.startIdentity)&&"string"==typeof c.token&&c.token?c:null}function H(a){return G(i().join(a,"owner.json"))}function I(a){return null!==a&&!!k.B.pidAlive(a.pid)&&(null===a.startIdentity||k.B.processIdentity(a.pid)===a.startIdentity)}class J{constructor(a=(0,j.BQ)("runtime-images"),b={}){this.root=a,this.maxBytes=b.maxBytes??function(){let a=process.env.LLV_RUNTIME_IMAGE_STORE_MAX_BYTES?.trim();if(!a)return 0x10000000;let b=Number(a);if(!Number.isSafeInteger(b)||b<=0)throw Error("runtime image storage quota is invalid");return b}(),this.fault=b.fault??(()=>{}),this.now=b.now??Date.now,this.abandonedPartialMaxAgeMs=b.abandonedPartialMaxAgeMs??36e5,this.gcGraceMs=b.gcGraceMs??36e5,this.reachableDigests=b.reachableDigests??(()=>(function(a=(0,j.Pn)(),b={}){let c=(b.now??Date.now())-(b.retiredGraceMs??864e5),d=new Set;return C(i().join(a,"agent-registry.json"),d,c),!function(a,b,c){if(!g().existsSync(a))return;let d=D(a);try{if(!d.query("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'registry_rows'").get())return;for(let a of d.query("SELECT value_json FROM registry_rows").all())A(JSON.parse(a.value_json),b,c)}finally{d.close()}}(i().join(a,"agent-registry.sqlite"),d,c),!function(a,b,c){let d;try{d=g().readdirSync(a,{withFileTypes:!0})}catch(a){if("ENOENT"===a.code)return;throw a}for(let e of d){let d;if(!e.isFile()||!e.name.endsWith(".jsonl"))continue;let f=i().join(a,e.name);try{d=g().readFileSync(f,"utf8")}catch(a){if("ENOENT"===a.code)continue;throw a}if(!d.trim())continue;let h=new Map,j=new Map;for(let a of B(d,f)){let d=a&&"object"==typeof a&&!Array.isArray(a)?a:null,e=d?.kind==="queued"&&d.entry&&"object"==typeof d.entry?d.entry:null;if(e&&"string"==typeof e.id){let a=h.get(e.id)??new Set;A(d,a,c),h.set(e.id,a);continue}if(d?.kind==="delivered"&&"string"==typeof d.entryId){let a="string"==typeof d.deliveredAt?Date.parse(d.deliveredAt):NaN;Number.isFinite(a)&&j.set(d.entryId,a);continue}A(a,b,c)}for(let[a,d]of h){let e=j.get(a);if(void 0===e||!(e<=c))for(let a of d)b.add(a)}}}(i().join(a,"claude-delivery-ledger"),d,c),!function(a,b,c){let d;try{d=g().readdirSync(a,{withFileTypes:!0})}catch(a){if("ENOENT"===a.code)return;throw a}for(let e of d)e.isFile()&&(e.name.endsWith(".json")||e.name.endsWith(".jsonl")||e.name.endsWith(".ndjson"))&&C(i().join(a,e.name),b,c)}(i().join(a,"structured-host-events"),d,c),!function(a,b,c){if(!g().existsSync(a))return;let d=D(a);try{let a=new Set(d.query("SELECT name FROM sqlite_master WHERE type = 'table'").all().map(a=>a.name));if(a.has("operations")){if(new Set(d.query("PRAGMA table_info(operations)").all().map(a=>a.name)).has("operation_id")){let a=d.query("SELECT operation_id, request_json, receipt_json FROM operations").all(),e=function(a,b){let c=new Map(a.map(a=>[a.operation_id,a])),d=new Map(a.map(a=>[a.operation_id,function(a){try{let b=JSON.parse(a);return b&&"object"==typeof b&&!Array.isArray(b)?b:null}catch{return null}}(a.receipt_json)])),e=new Set;for(let a of d.values())"string"==typeof a?.retryOfOperationId&&e.add(a.retryOfOperationId);let f=new Map;for(let a of c.keys()){let b=a,c=new Set;for(;!c.has(b);){c.add(b);let a=d.get(b)?.retryOfOperationId;if("string"!=typeof a)break;b=a}let e=f.get(b)??new Set;e.add(a),f.set(b,e)}let g=new Set;for(let a of f.values()){let d=[...a].filter(a=>!e.has(a));if(0!==d.length&&d.every(a=>F(c.get(a)?.receipt_json,b)))for(let b of a)g.add(b)}return g}(a,c);for(let d of a)if(!e.has(d.operation_id))for(let a of[d.request_json,d.receipt_json])a.trim()&&A(JSON.parse(a),b,c)}else for(let a of d.query("SELECT request_json, receipt_json FROM operations").all())if(!F(a.receipt_json,c))for(let d of[a.request_json,a.receipt_json])d.trim()&&A(JSON.parse(d),b,c)}for(let[e,f]of[["events",["payload_json"]],["projections",["state_json"]],["entities",["state_json"]],["outbox",["payload_json"]],["producer_receipts",["event_json"]]])if(a.has(e))for(let a of d.query(`SELECT ${f.join(", ")} FROM ${e}`).all())for(let d of f){let e=a[d];"string"==typeof e&&e.trim()&&A(JSON.parse(e),b,c)}}finally{d.close()}}(i().join(a,"runtime-events.sqlite"),d,c),d})(i().dirname(this.root),{now:this.now()})),this.afterRootOpen=b.afterRootOpen??(()=>{}),this.writerLockStaleMs=b.writerLockStaleMs??3e4,this.writerLockWaitMs=b.writerLockWaitMs??5e3,this.procSelfFdPaths=b.procSelfFdPaths??g().existsSync("/proc/self/fd"),this.ensurePrivateRoot(),this.withWriterLock("maintenance",a=>this.removeAgedPartials(a))}putMany(a){if(a.length>m)throw Error("too many images");if(a.reduce((a,b)=>a+Buffer.byteLength(b.base64),0)>p)throw Error("runtime image request encoding is too large");let b=a.map(a=>this.validateUpload(a));if(b.reduce((a,b)=>a+b.data.byteLength,0)>o)throw Error("runtime image request is too large");return this.withWriterLock("write",a=>{this.assertQuota(a,b);let c=[],d=[];try{for(let{data:e,mime:f}of b){let{ref:b,created:g}=this.put(a,e,f);g&&c.push(i().join(a.path,i().basename(this.pathFor(b)))),d.push(b)}}catch(b){for(let a of c)g().rmSync(a,{force:!0});throw c.length&&x(a.path),b}return d})}read(a){let b=this.openRoot("read");try{return this.readFromRoot(b,a)}finally{g().closeSync(b.fd)}}pathFor(a){let b=(0,l.CC)(a.mime);if(!b||!/^[a-f0-9]{64}$/.test(a.sha256)||!Number.isSafeInteger(a.bytes)||a.bytes<=0)throw Error("runtime image ref is invalid");return i().join(this.root,`${a.sha256}.${r[b]}`)}validateUpload(a){return v(a)}assertQuota(a,b){let c=this.storedBytes(a),d=()=>{let c=new Map;for(let{data:d,mime:f}of b){let b=e().createHash("sha256").update(d).digest("hex"),h=i().join(a.path,`${b}.${r[f]}`);g().existsSync(h)||c.set(h,d.byteLength)}return[...c.values()].reduce((a,b)=>a+b,0)},f=d();if(c+f>this.maxBytes){let g=new Set(this.reachableDigests());for(let{data:a}of b)g.add(e().createHash("sha256").update(a).digest("hex"));this.collectGarbage(a,g),c=this.storedBytes(a),f=d()}if(c+f>this.maxBytes)throw Error("runtime image storage quota exceeded")}withWriterLock(a,b){this.ensurePrivateRoot();let c=this.openRoot(a),d=i().join(c.path,".writer-lock"),f=this.now()+this.writerLockWaitMs,h={pid:process.pid,startIdentity:k.B.processIdentity(process.pid),token:e().randomUUID()},j=!1;try{for(;!j&&(this.withWriterAcquisitionGate(c,f,()=>{this.assertRootPinned(c);let a=!1;try{g().mkdirSync(d,{mode:448}),a=!0}catch(a){if("EEXIST"!==a.code)throw a}if(a)try{g().writeFileSync(i().join(d,"owner.json"),JSON.stringify(h),{flag:"wx",mode:384}),j=!0;return}catch(a){if("EEXIST"===a.code)return;throw g().rmSync(d,{recursive:!0,force:!0}),a}try{let a=g().lstatSync(d);if(!a.isDirectory()||a.isSymbolicLink())throw Error("runtime image writer lock is unsafe");this.now()-a.mtimeMs>this.writerLockStaleMs&&!I(H(d))&&this.reclaimStaleWriterLock(c,d,a)}catch(a){if("ENOENT"!==a.code)throw a}}),!j);){if(this.now()>=f)throw Error("runtime image writer lock timed out");t(5)}if(H(d)?.token!==h.token)throw Error("runtime image writer lock was lost before entry");return b(c)}finally{j&&H(d)?.token===h.token&&g().rmSync(d,{recursive:!0,force:!0}),g().closeSync(c.fd)}}withWriterAcquisitionGate(a,b,c){let d=i().join(a.path,".writer-lock-gate.queue"),f=i().join(a.path,".writer-lock-gate"),h={pid:process.pid,startIdentity:k.B.processIdentity(process.pid),token:e().randomUUID()};g().mkdirSync(d,{recursive:!0,mode:448});let j=i().join(d,`${String(this.now()).padStart(16,"0")}-${process.pid}-${e().randomUUID()}.json`);g().writeFileSync(j,JSON.stringify(h),{flag:"wx",mode:384});let l=!1;try{for(;!l;){this.assertRootPinned(a);let c=[];for(let a of g().readdirSync(d).filter(a=>a.endsWith(".json")).sort()){let b=i().join(d,a),e=G(b);if(!e||!I(e)){g().rmSync(b,{force:!0});continue}c.push(b)}if(c[0]===j)try{g().mkdirSync(f,{mode:448}),g().writeFileSync(i().join(f,"owner.json"),JSON.stringify(h),{flag:"wx",mode:384}),l=!0}catch(a){if("EEXIST"!==a.code)throw a;I(H(f))||g().rmSync(f,{recursive:!0,force:!0})}if(!l){if(this.now()>=b)throw Error("runtime image writer lock timed out");t(5)}}return c()}finally{l&&H(f)?.token===h.token&&g().rmSync(f,{recursive:!0,force:!0}),g().rmSync(j,{force:!0})}}reclaimStaleWriterLock(a,b,c){let d,f=i().join(a.path,`.writer-lock-reclaim.${e().randomUUID()}`);try{g().renameSync(b,f)}catch(a){if("ENOENT"===a.code)return;throw a}try{d=g().lstatSync(f)}catch{return}if(d.ino===c.ino&&d.dev===c.dev)return void g().rmSync(f,{recursive:!0,force:!0});try{g().renameSync(f,b)}catch(a){throw Error("runtime image writer lock reclamation raced",{cause:a})}}removeAgedPartials(a){for(let b of(this.assertRootPinned(a),g().readdirSync(a.path,{withFileTypes:!0}))){if(!b.isFile()||!b.name.endsWith(".partial"))continue;let c=i().join(a.path,b.name),d=g().lstatSync(c);d.isFile()&&!d.isSymbolicLink()&&this.now()-d.mtimeMs>=this.abandonedPartialMaxAgeMs&&g().rmSync(c,{force:!0})}}storedBytes(a){this.assertRootPinned(a);let b=0;for(let c of g().readdirSync(a.path,{withFileTypes:!0})){if(!c.isFile()||!z.test(c.name))continue;let d=g().lstatSync(i().join(a.path,c.name));d.isFile()&&!d.isSymbolicLink()&&(b+=d.size)}return b}collectGarbage(a,b){for(let c of(this.assertRootPinned(a),g().readdirSync(a.path,{withFileTypes:!0}))){let d=c.isFile()?z.exec(c.name):null;if(!d||b.has(d[1]))continue;let e=i().join(a.path,c.name),f=g().lstatSync(e);!f.isFile()||f.isSymbolicLink()||this.now()-f.mtimeMs<this.gcGraceMs||g().rmSync(e,{force:!0})}x(a.path)}ensurePrivateRoot(){let a;try{a=g().lstatSync(this.root)}catch(b){if("ENOENT"!==b.code)throw b;g().mkdirSync(this.root,{recursive:!0,mode:448}),a=g().lstatSync(this.root)}let b=process.geteuid?.();if(!a.isDirectory()||a.isSymbolicLink()||void 0===b||a.uid!==b||(511&a.mode)!=448)throw Error("runtime image root is unsafe")}openRoot(a){let b;try{b=g().openSync(this.root,g().constants.O_RDONLY|g().constants.O_DIRECTORY|g().constants.O_NOFOLLOW)}catch(a){throw Error("runtime image root is unsafe",{cause:a})}try{let c,d=g().fstatSync(b),e=process.geteuid?.();if(!d.isDirectory()||void 0===e||d.uid!==e||(511&d.mode)!=448)throw Error("runtime image root is unsafe");this.afterRootOpen(a);try{c=g().lstatSync(this.root)}catch(a){throw Error("runtime image root changed during operation",{cause:a})}if(!c.isDirectory()||c.isSymbolicLink()||c.dev!==d.dev||c.ino!==d.ino)throw Error("runtime image root changed during operation");return this.procSelfFdPaths?{fd:b,path:`/proc/self/fd/${b}`,pinned:!0}:{fd:b,path:this.root,pinned:!1}}catch(a){throw g().closeSync(b),a}}assertRootPinned(a){let b;if(a.pinned)return;let c=g().fstatSync(a.fd);try{b=g().lstatSync(this.root)}catch(a){throw Error("runtime image root changed during operation",{cause:a})}if(!b.isDirectory()||b.isSymbolicLink()||b.dev!==c.dev||b.ino!==c.ino)throw Error("runtime image root changed during operation")}readFromRoot(a,b){let c;this.assertRootPinned(a);let d=i().join(a.path,i().basename(this.pathFor(b)));try{c=g().openSync(d,g().constants.O_RDONLY|g().constants.O_NOFOLLOW)}catch(c){let a=c.code;if("ENOENT"===a)throw Error(`runtime image ${b.sha256.slice(0,12)} is missing`);if("ELOOP"===a)throw Error("runtime image ref is unsafe");throw c}try{if(!g().fstatSync(c).isFile())throw Error("runtime image ref is unsafe");let a=g().readFileSync(c);if(a.byteLength!==b.bytes||e().createHash("sha256").update(a).digest("hex")!==b.sha256)throw Error(`runtime image ${b.sha256.slice(0,12)} digest mismatch`);if(!u(a,b.mime))throw Error(`runtime image ${b.sha256.slice(0,12)} signature mismatch`);return a}finally{g().closeSync(c)}}put(a,b,c){this.assertRootPinned(a);let d=e().createHash("sha256").update(b).digest("hex"),f={sha256:d,mime:c,bytes:b.byteLength},h=i().join(a.path,i().basename(this.pathFor(f)));if(g().existsSync(h)){this.readFromRoot(a,f),g().chmodSync(h,384);let b=new Date(this.now());return g().utimesSync(h,b,b),{ref:f,created:!1}}let j=i().join(a.path,`.${d}.${e().randomUUID()}.partial`),k=!1;try{let c=g().openSync(j,"wx",384);try{this.fault("write"),g().writeFileSync(c,b),this.fault("fsync"),g().fsyncSync(c)}finally{g().closeSync(c)}this.fault("link"),g().linkSync(j,h),k=!0,g().chmodSync(h,384),this.fault("directory-fsync"),x(a.path)}catch(b){if("EEXIST"===b.code)return this.readFromRoot(a,f),{ref:f,created:!1};throw k&&(g().rmSync(h,{force:!0}),x(a.path)),b}finally{g().rmSync(j,{force:!0}),x(a.path)}return{ref:f,created:k}}}let K=null;function L(){return K??=new J}},37037:(a,b,c)=>{c.d(b,{RO:()=>r,dq:()=>s,mI:()=>u});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(57975),i=c(91724),j=c(77276);let k=globalThis;function l(){return k.__llvRuntimeEventLedgers??=new Map,k.__llvRuntimeEventLedgers}function m(a){return{dev:a.dev,ino:a.ino,size:a.size,mtimeMs:a.mtimeMs,ctimeMs:a.ctimeMs}}function n(a,b){return a.dev===b.dev&&a.ino===b.ino&&a.size===b.size&&a.mtimeMs===b.mtimeMs&&a.ctimeMs===b.ctimeMs}function o(a,b,c){let d=l();d.delete(a),d.set(a,{identity:b,events:c.slice()});let e=0;for(let a of d.values())e+=a.identity.size;for(;d.size>64||e>0x4000000;){let a=d.keys().next().value;if(void 0===a)break;let b=d.get(a);d.delete(a),e-=b?.identity.size??0}}function p(a){l().delete(a)}function q(a){console.warn("[structured host] runtime event cursor recovered",a)}function r(a){if(!Number.isSafeInteger(a)||a<0)throw Error("runtime event cursor is invalid");let b=a+1;if(!Number.isSafeInteger(b))throw Error("runtime event cursor cannot advance safely");return b}function s(a,b,c,d=q){if(!Number.isSafeInteger(b)||b<0)throw Error("runtime event durable tail sequence is invalid");if(!Number.isSafeInteger(c)||c<0)throw Error("runtime event registry cursor is invalid");let e=0===b&&c>0,f=e?c:b,g=r(f);if(c!==b)try{d({kind:"runtime-event-cursor-recovery",sessionId:a.slice(0,160),durableTailSeq:b,registryCursor:c,chosenNextSeq:g,action:e?"use-registry-cursor":"use-durable-tail",relation:e?"durable-ledger-empty":c<b?"registry-behind":"registry-ahead"})}catch{}return f}function t(a){if(!a||"object"!=typeof a||Array.isArray(a)||!Number.isSafeInteger(a.seq)||a.seq<=0)return!1;let b=a=>"string"==typeof a&&a.length>0;switch(a.kind){case"turn-started":return b(a.turnId);case"delta":return b(a.turnId)&&"string"==typeof a.text;case"item":return(b(a.turnId)||null===a.turnId)&&("started"===a.phase||"completed"===a.phase)&&Object.hasOwn(a,"item");case"voice-chunk":{if(!b(a.turnId))return!1;let c=(0,j.Im)([a.delivery])[0];return c?.ready===!0&&c.sourceTurnId===a.turnId&&void 0!==c.streamChunk&&(0,h.isDeepStrictEqual)(c,a.delivery)}case"turn-ended":return b(a.turnId)&&("completed"===a.status||"interrupted"===a.status||"error"===a.status);case"attention":return b(a.id)&&b(a.method)&&Object.hasOwn(a,"attention");case"attention-resolved":return b(a.id)&&("answered"===a.resolution||"host-restarted"===a.resolution||"server-resolved"===a.resolution||"turn-ended"===a.resolution);case"limits":return Object.hasOwn(a,"snapshot");case"realtime-delivery-progress":return b(a.deliveryId)&&b(a.digest)&&Number.isSafeInteger(a.responseIndex)&&a.responseIndex>=0&&Number.isSafeInteger(a.offset)&&a.offset>=0;case"realtime-delivery-acknowledged":return b(a.deliveryId)&&b(a.digest);case"session-status":return("active"===a.status||"idle"===a.status||"unhosted"===a.status||"dead"===a.status)&&(void 0===a.activeFlags||Array.isArray(a.activeFlags)&&a.activeFlags.every(b));default:return!1}}class u{constructor(a=(0,i.BQ)("structured-host-events")){this.directory=a,this.tails=new Map}load(a){let b,c,d,f,g=this.filename(a);try{b=e().statSync(g)}catch(a){if("ENOENT"===a.code)return p(g),[];throw a}let h=m(b),i=(f=(d=l()).get(g))&&n(f.identity,h)?(d.delete(g),d.set(g,f),f.events.slice()):null;if(i)return i;try{c=e().readFileSync(g,"utf8")}catch(a){if("ENOENT"===a.code)return[];throw a}let j=[],k=c.split("\n"),q=c.endsWith("\n");for(let[a,b]of k.entries()){let c;if(!b&&a===k.length-1&&q)continue;if(!b)throw Error("runtime event ledger contains an empty record");try{c=JSON.parse(b)}catch{if(a===k.length-1&&!q)break;throw Error("runtime event ledger contains malformed JSON")}if(!t(c)){if(a===k.length-1&&!q)break;throw Error("runtime event ledger contains an invalid event")}let d=j.at(-1);if(d&&c.seq!==d.seq+1)throw Error(`runtime event ledger sequence gap after ${d.seq}`);j.push(c)}try{let a=m(e().statSync(g));n(h,a)&&o(g,a,j)}catch{}return j}append(a,b){if(!t(b))throw Error("runtime event ledger append event is invalid");e().mkdirSync(this.directory,{recursive:!0,mode:448});let c=this.filename(a),d=e().openSync(c,"a+",384);try{(511&e().fstatSync(d).mode)!=384&&e().fchmodSync(d,384);let f=this.tails.get(a);if(f&&e().fstatSync(d).size===f.bytes||(f=this.reconcileTail(a,c,d)),f.lastSeq>0&&b.seq!==f.lastSeq+1)throw Error(`runtime event ledger sequence gap after ${f.lastSeq}`);let g=`${JSON.stringify(b)}
|
|
8
|
-
`;e().writeSync(d,g),e().fsyncSync(d);let h={lastSeq:b.seq,bytes:f.bytes+Buffer.byteLength(g)};this.tails.set(a,h);let i=l().get(c),j=e().fstatSync(d);i&&i.identity.size===f.bytes&&(i.events.at(-1)?.seq??0)===f.lastSeq?o(c,m(j),[...i.events,b]):p(c)}finally{e().closeSync(d)}}reconcileTail(a,b,c){if(0===e().fstatSync(c).size){let b={lastSeq:0,bytes:0};return this.tails.set(a,b),b}let d=this.load(a),f=e().fstatSync(c).size,g=Buffer.allocUnsafe(1);if(!(f>0&&1===e().readSync(c,g,0,1,f-1)&&10===g[0])){let a,d=e().readFileSync(b,"utf8"),f=d.lastIndexOf("\n")+1,g=d.slice(f);try{a=JSON.parse(g)}catch{a=null}t(a)?e().writeSync(c,"\n"):e().ftruncateSync(c,Buffer.byteLength(d.slice(0,f)))}let h=e().fstatSync(c),i={lastSeq:d.at(-1)?.seq??0,bytes:h.size};return this.tails.set(a,i),o(b,m(h),d),i}filename(a){return g().join(this.directory,`${encodeURIComponent(a)}.jsonl`)}}},38855:(a,b,c)=>{c.d(b,{l:()=>e});let d=process;function e(){return d.__llvStructuredDeliveryKick?.()}},41288:(a,b,c)=>{c.d(b,{o:()=>d,t:()=>e});let d=["deployer"],e=["start","update-draft","set-position","add-stage","remove-stage","reorder-stage","set-edge","pause","resume","retry-stage","skip-stage","override-stage","link-task","unlink-task","set-src","delete","close"]},42087:(a,b,c)=>{c.d(b,{s:()=>m});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(16089),i=c(66024),j=c(23921),k=c(89333);function l(a){return new Promise(b=>setTimeout(b,a))}async function m(a){if(a.knownTranscript)return a.knownTranscript;if("codex"!==a.engine)return null;let b=a.panePid;if("number"!=typeof b||!Number.isInteger(b)||b<=0)return null;let c=a.env??{},d=c.now??Date.now,f=c.sleep??l,m=c.candidatePaths??(b=>(function(a,b=k.GH["codex-sessions"]){let c=a-5e3,d=[],f=(a,b)=>{let h;if(!(b>6)){try{h=e().readdirSync(a,{withFileTypes:!0})}catch{return}for(let i of h){let h=g().join(a,i.name);if(i.isDirectory()){f(h,b+1);continue}if(i.isFile()&&i.name.endsWith(".jsonl"))try{let a=e().statSync(h);a.mtimeMs>=c&&d.push({path:h,mtimeMs:a.mtimeMs})}catch{continue}}}};return f(b,0),d.sort((a,b)=>b.mtimeMs-a.mtimeMs).slice(0,32).map(a=>a.path)})(b,a.codexSessionsDir??k.GH["codex-sessions"])),n=c.holderPidByPath??(a=>(0,j.SP)(a,!0)),o=c.parentPidOf??j.Ib,p=c.timeoutMs??2500,q=c.pollMs??150,r=d()+p;for(;;){let c=function(a,b,c,d){let f=d.holderPidByPath(a);for(let g of a){let a=f.get(g);if(void 0!==a&&function(a,b){let c=(0,h.tX)(a,{bytes:8192,maxLines:10});return null===c||c===b}(g,c)&&!function(a){try{let b=e().statSync(a);return(0,i.ET)(a,b.size)}catch{return!1}}(g)&&function(a,b,c){let d=new Set;for(let e=a;null!==e&&!d.has(e);e=c(e)){if(e===b)return!0;if(d.add(e),d.size>64)break}return!1}(a,b,d.parentPidOf))return g}return null}(m(a.startedAtMs),b,a.cwd,{holderPidByPath:n,parentPidOf:o});if(c)return c;if(d()>=r)return null;await f(q)}}},43384:(a,b,c)=>{c.d(b,{H:()=>h,l:()=>g});var d=c(4837),e=c(50201),f=c(41022);function g(a=process.env){let b=a.LLV_SPAWN_TRANSPORT?.trim();if(!b)return(0,e.cM)(a)&&(0,e.Zn)(a)&&(0,e.Ee)(a)?"structured":"tmux";if("tmux"!==b&&"structured"!==b)throw Error("LLV_SPAWN_TRANSPORT must be tmux or structured");return b}function h(a,b=process.env){return(0,e.cM)(b)?(0,e.ji)(b)?"structured spawn is rolled back by LLV_RUNTIME_EVENTS=0":(0,e.S0)(b)?(0,e.Ee)(b)?a.hasImages&&"codex"===a.engine&&!(0,d.JL)(a.model)?f.t6:"codex"===a.engine&&null!==a.fast?"structured Codex spawn does not support an explicit Codex service tier":null:"structured spawn requires the runtime UI (NEXT_PUBLIC_RUNTIME_UI=0 removes the viewer controls)":"structured spawn requires a runtime host socket (LLV_RUNTIME_HOST_SOCKET)":"structured spawn is rolled back by LLV_STRUCTURED_HOSTS=0"}},44836:(a,b,c)=>{c.d(b,{Gp:()=>k,mj:()=>j,po:()=>i});let d=/^conversation_[A-Za-z0-9_-]{1,180}$/,e=/^[A-Za-z0-9_.:-]{1,200}$/;function f(a,b){return null===b?{}:{[a]:b}}function g(a,b){if("string"!=typeof a)return null;let c=a.replace(/[\u0000-\u001f\u007f-\u009f]+/gu," ").trim();return c&&[...c].slice(0,b).join("").trim()||null}function h(a){return"string"==typeof a&&e.test(a)?a:null}function i(a){var b;let c;if(!a||"object"!=typeof a||Array.isArray(a)||1!==a.version)return null;let e=function(a){if("string"!=typeof a||a.length>40)return null;let b=Date.parse(a);return Number.isFinite(b)?new Date(b).toISOString():null}(a.capturedAt);if(!e)return null;let i={capturedAt:e,...f("project",g(a.project,200)),...f("viewSessionId",h(a.viewSessionId)),...f("deviceId",h(a.deviceId)),...f("revision","number"==typeof(b=a.revision)&&Number.isSafeInteger(b)&&b>=0?b:null)};if("none"===a.state)return{version:1,state:"none",...i};if("selected"!==a.state)return null;let j="string"==typeof a.conversationId&&d.test(a.conversationId)?a.conversationId:null;return j?{version:1,state:"selected",conversationId:j,...i,...f("path",(c=g(a.path,1025))&&c.length<=1024?c:null),...f("label",g(a.label,80))}:null}function j(a){let b=JSON.stringify(a),c=new TextEncoder().encode(b),d="";for(let a of c)d+=String.fromCharCode(a);return btoa(d).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function k(a){if(!a||!/^[A-Za-z0-9_-]+$/.test(a))return null;try{let b=a.replace(/-/g,"+").replace(/_/g,"/"),c=atob(b+"=".repeat((4-b.length%4)%4)),d=Uint8Array.from(c,a=>a.charCodeAt(0));return i(JSON.parse(new TextDecoder().decode(d)))}catch{return null}}},45442:(a,b,c)=>{c.d(b,{b:()=>ac,X:()=>O});var d=c(73024),e=c.n(d),f=c(51455),g=c(76760),h=c.n(g),i=c(77598),j=c.n(i),k=c(91724),l=c(26474),m=c(12770),n=c(52509),o=c(2451),p=c(66024),q=c(70107),r=c(28617),s=c(95544);let t=(0,n.E)("needle-v2"),u=(0,n.E)("needle-tail-v1"),v=(0,n.E)("needle-tail-uuid-v1"),w=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,x=/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;function y(a,b,c){let d=Buffer.allocUnsafe(c),f=0;for(;f<c;){let g=e().readSync(a,d,f,c-f,b+f);if(0===g)break;f+=g}return{bytes:f===d.length?d:Buffer.from(d.subarray(0,f)),complete:f===c}}function z(a,b){for(let c of b.toString("utf8").match(x)??[])a.add(c.toLowerCase())}function A(a){return(0,i.createHash)("sha256").update(a).digest("base64url")}function B(a,b,c){let d,f=t.get(a);f&&f.hits&&f.sizes||(f={hits:f?.hits??{},scanned:f?.scanned??{},sizes:f?.sizes??{},observations:f?.observations??{},boundaries:f?.boundaries??{}},t.set(a,f));let g=Buffer.from(a),h=Math.max(0,g.length-1);try{d=e().statSync(b)}catch{return!1}let i=d.size,j=f.scanned[b]??0,k=f.sizes[b],l=f.observations[b],m=f.boundaries[b],n=!!(j>0&&!l);if(l)if((n||=l.dev!==d.dev||l.ino!==d.ino)||!(i>l.size))n||(n||=i!==l.size||d.mtimeMs!==l.mtimeMs);else if(!m||m.offset+m.bytes!==j||j>l.size)n=!0;else{if(c&&c.remaining<m.bytes)return!1;let a=null;try{a=e().openSync(b,"r");let d=y(a,m.offset,m.bytes);c&&(c.remaining-=d.bytes.length),n=!d.complete||A(d.bytes)!==m.fingerprint}catch{return!1}finally{null!==a&&e().closeSync(a)}}if((n||void 0!==k&&i<k)&&(j=0,f.scanned[b]=0,delete f.hits[b],delete f.boundaries[b],m=void 0),f.sizes[b]=i,f.hits[b])return!0;if(i<=j)return!1;let o=void 0===c?1/0:Math.min(Math.max(0,c.remaining),1048576);if(o<=0)return!1;try{let a=e().openSync(b,"r");try{let k=Math.max(0,j-h),l=Buffer.alloc(0),m=Buffer.alloc(0),n=!1,p=0;for(;k<i&&p<o;){let b=Math.min(1048576,Math.ceil(o-p),i-k),c=Buffer.alloc(b),d=e().readSync(a,c,0,b,k);if(!d)break;p+=d;let f=Buffer.concat([l,c.subarray(0,d)]);if(m=Buffer.concat([m,c.subarray(0,d)]).subarray(-65536),f.includes(g)){n=!0;break}l=h?c.subarray(Math.max(0,d-h),d):Buffer.alloc(0),k+=d}if(void 0!==c&&Number.isFinite(p)&&(c.remaining-=p),f.scanned[b]=n||k>=i?i:k,f.observations[b]={dev:d.dev,ino:d.ino,size:i,mtimeMs:d.mtimeMs},!n){let a=Buffer.from(m);f.boundaries[b]={offset:f.scanned[b]-a.length,bytes:a.length,fingerprint:A(a)}}return n&&(f.hits[b]=!0),n}finally{e().closeSync(a)}}catch{return!1}}var C=c(23921),D=c(89333);let E=(0,n.E)("sid-slug"),F=(0,n.E)("bgcmd"),G=(0,n.E)("background-index-v1"),H=(0,n.E)("chain-uuid"),I=(0,n.E)("compact-links-v1"),J=(0,n.E)("lineage-store-state-v1"),K="bg-commands.json",L="compact-chains.json";function M(){let a=(0,k.BQ)(K),b=J.get(a);return b||(b={backgroundLoaded:!1,backgroundDirty:!1,compactLoaded:!1,compactDirty:!1},J.set(a,b)),b}function N(a,b){let c=null;try{return e().mkdirSync(h().dirname(a),{recursive:!0,mode:448}),e().chmodSync(h().dirname(a),448),c=h().join(h().dirname(a),`.${h().basename(a)}.${process.pid}.${j().randomUUID()}.tmp`),e().writeFileSync(c,JSON.stringify(b)+"\n",{encoding:"utf8",mode:384}),e().renameSync(c,a),!0}catch{if(c)try{e().unlinkSync(c)}catch{}return!1}}function O(a){for(let b of a){if(!0!==b.derivationComplete||"claude-tasks"!==b.root||!b.parent||!b.cmd&&!b.cmdDesc)continue;let a=(0,r.Y8)(D.GH["claude-tasks"],b.path),c=a?.[2];c&&S(F,c,{command:b.cmd??"",description:b.cmdDesc??"",source:b.parent})}}async function P(a){let b=new Map;await (0,m.pV)(a,a=>{if("claude-projects"!==a.root)return;let c=a.name.split(h().sep);if(2!==c.length)return;let d=c[0]??"";b.set(d,(b.get(d)??[]).concat(a))});let c=(a,b,c)=>{let d=new Map(c.map(a=>[a.path,a])),e=new Set;for(let c=a;c?.parent&&!e.has(c.path);c=d.get(c.parent))if(e.add(c.path),c.parent===b.path)return!0;return!1};await (0,m.pV)([...b.values()],async a=>{let b=[...a].sort((a,b)=>a.mtime-b.mtime);await (0,m.pV)(b,d=>{var f,g;let h=I.get(d.path),i=h?b.find(a=>a.path===h&&a!==d&&!a.parent):void 0;if(i&&!c(d,i,a)){i.parent=d.path;return}let j=function(a,b){let c=H.get(a);if(c&&(null!==c[1]||c[0]>=524288||c[0]>=b))return c[1];let d=null,f=0;try{let c=e().openSync(a,"r");try{let a=Buffer.alloc(Math.min(b,524288));for(let b of(f=e().readSync(c,a,0,a.length,0),a.toString("utf8",0,f).split("\n")))if(b.includes('"compact_boundary"')){d=b.match(/"logicalParentUuid"\s*:\s*"([0-9a-f-]{36})"/)?.[1]??null;break}}finally{e().closeSync(c)}}catch{return null}return H.set(a,[f,d]),d}(d.path,d.size);if(!j)return;let k=b.filter(a=>a!==d&&!a.parent).sort((a,b)=>b.mtime-a.mtime),l="live"===d.activity||"recent"===d.activity,m=k.find(a=>(function(a,b){let c;try{c=e().statSync(b)}catch{return!1}if(w.test(a))return function(a,b,c){let d=a.toLowerCase(),f=v.get(b);if(f?.dev===c.dev&&f.ino===c.ino&&f.size===c.size&&f.mtimeMs===c.mtimeMs){if(f.uuids.has(d))return!0;if(f.complete)return!1;let a=Math.min(c.size,1048576),g=a-Math.min(c.size,131072),h=null;try{h=e().openSync(b,"r");let i=y(h,c.size-a,g);return z(f.uuids,Buffer.concat([i.bytes,f.boundary])),i.complete&&(f.complete=!0,f.boundary=Buffer.alloc(0)),f.uuids.has(d)}catch{return!1}finally{null!==h&&e().closeSync(h)}}let g=new Set,h=Math.min(c.size,131072),i=null;try{i=e().openSync(b,"r");let a=y(i,c.size-h,h);z(g,a.bytes);let f=Math.min(c.size,1048576),j=f-h,k={dev:c.dev,ino:c.ino,size:c.size,mtimeMs:c.mtimeMs,uuids:g,complete:a.complete&&0===j,boundary:Buffer.from(a.bytes.subarray(0,Math.min(a.bytes.length,35)))};if(v.set(b,k),g.has(d)||k.complete)return g.has(d);let l=y(i,c.size-f,j);return z(g,Buffer.concat([l.bytes,k.boundary])),a.complete&&l.complete&&(k.complete=!0,k.boundary=Buffer.alloc(0)),g.has(d)}catch{return!1}finally{null!==i&&e().closeSync(i)}}(a,b,c);let d=`${a}\u0000${b}`,f=u.get(d);if(f?.hit)return!0;if(f?.size===c.size&&f.mtimeMs===c.mtimeMs)return!1;let g=Buffer.from(a),h=Math.min(c.size,131072),i=null;try{i=e().openSync(b,"r");let a=y(i,c.size-h,h);if(a.bytes.includes(g))return u.set(d,{size:c.size,mtimeMs:c.mtimeMs,hit:!0}),!0;let f=a.complete,j=!1,k=Math.min(c.size,1048576),l=k-h;if(l>0){let b=y(i,c.size-k,l);f&&=b.complete,j=Buffer.concat([b.bytes,a.bytes]).includes(g)}return(j||f)&&u.set(d,{size:c.size,mtimeMs:c.mtimeMs,hit:j}),j}catch{return!1}finally{null!==i&&e().closeSync(i)}})(j,a.path));m&&(f=d.path)!==(g=m.path)&&I.get(f)!==g&&(S(I,f,g),M().compactDirty=!0);let n=m??(l?k.find(a=>"live"!==a.activity):void 0);n&&!c(d,n,a)&&(n.parent=d.path)})})}async function Q(a,b,c){let d;try{d=await c(()=>(0,f.readdir)(a,{withFileTypes:!0}))}catch{return[]}return(await Promise.all(d.map(async d=>{let e=h().join(a,d.name);return d.isDirectory()?Q(e,b,c):d.isFile()&&b(e)?[e]:[]}))).flat()}async function R(a,b,c){let d=D.GH["claude-projects"],f=c??E.get(a)??null;if(!f){let c=(await Q(d,b=>h().basename(b)===a+".jsonl",b))[0];if(!c)return[null,[]];f=h().basename(h().dirname(c)),E.set(a,f)}let g=h().join(d,f,a+".jsonl"),i=h().join(d,f,a,"subagents"),j=(await Q(i,a=>h().basename(a).startsWith("agent-")&&a.endsWith(".jsonl"),b)).sort();return[e().existsSync(g)?g:null,j]}function S(a,b,c){for(a.delete(b),a.set(b,c);a.size>2e4;){let b=a.keys().next().value;if(void 0===b)break;a.delete(b)}}function T(a,b){if(b.includes('"tool_use"'))try{let c=JSON.parse(b);for(let b of(0,s.Em)((0,s.xK)(c.message)?.content)){if("tool_use"!==b.type||"string"!=typeof b.id)continue;let c=(0,s.xK)(b.input)??{},d="string"==typeof c.command?c.command:"",e="string"==typeof c.description?c.description:"";(d||e)&&S(a.toolUses,b.id,{command:d,description:e})}}catch{}if(b.includes("background with ID: ")){let c=b.match(/"tool_use_id"\s*:\s*"([^"]+)"/)?.[1];if(c)for(let d of b.matchAll(/background with ID: ([A-Za-z0-9_-]+)/g)){let b=d[1];b&&S(a.taskToolUses,b,c)}}for(let[b,c]of a.taskToolUses){let d=a.toolUses.get(c);d&&(d.command||d.description)&&S(a.commands,b,d)}}let U=(0,k.BQ)("codex-lineage.json"),V=(0,n.E)("codex-lineage"),W=!1,X=!1;function Y(){if(W)return;W=!0;let a=(0,s.Vh)(U);if(a&&"object"==typeof a&&!Array.isArray(a)){for(let[b,c]of Object.entries(a))"string"!=typeof c||V.has(b)||V.set(b,c);V.size!==Object.keys(a).length&&(X=!0)}}function Z(a,b){if(V.get(a)!==b){for(V.set(a,b);V.size>2e4;){let a=V.keys().next().value;if(void 0===a)break;V.delete(a)}X=!0}}function $(){if(X){X=!1;try{e().mkdirSync(h().dirname(U),{recursive:!0}),e().writeFileSync(U,JSON.stringify(Object.fromEntries(V)))}catch{}}}async function _(a,b){Y();let c=new Map;await (0,m.pV)(a,a=>{if("codex-sessions"!==a.root||!a.path.endsWith(".jsonl"))return;let b=(0,p.Gz)(a.path);b&&c.set(b,a.path)}),await (0,m.pV)(a,a=>{if("codex-sessions"!==a.root||a.parent)return;let d=void 0===a.nativeParentThreadId?(0,p.S)(a.path,a.size,1e3*a.mtime):a.nativeParentThreadId,e=d?c.get(d)??null:null;e&&e!==a.path&&(a.parent=e,b&&Z(a.path,e))}),b&&$()}async function aa(a,b){Y();let c=a.filter(a=>"codex-sessions"===a.root&&!a.parent);if(0===c.length)return;let d=new Map;await (0,m.pV)(a,a=>{("claude-projects"===a.root||"codex-sessions"===a.root)&&null!==a.pid&&d.set(a.pid,a.path)}),await (0,m.pV)(c,a=>{let c=null,e=new Set;for(let b=a.pid;null!==b&&!e.has(b)&&(e.add(b),!(e.size>15));b=(0,C.Ib)(b)){let e=d.get(b);if(e&&e!==a.path){c=e;break}}if(c)a.parent=c,b&&Z(a.path,c);else{let b=V.get(a.path);b&&(a.parent=b)}}),b&&$()}async function ab(a,b){let c=new Map(a.map(a=>[a.path,a]));await (0,m.pV)(a,a=>{if(a.parent||"claude-projects"!==a.root&&"codex-sessions"!==a.root||!a.path.endsWith(".jsonl")||a.path.includes(h().sep+"subagents"+h().sep))return;let d=(0,l._b)(a.path);if(!d&&null!==a.pid){let c=new Set;for(let b=a.pid;null!==b&&!c.has(b)&&(c.add(b),!(c.size>15||(d=(0,l.N0)(b))));b=(0,C.Ib)(b));b&&d&&d!==a.path&&(0,l.A6)(a.path,d)}d&&d!==a.path&&c.has(d)&&(a.parent=d,a.handoff=!0)}),b&&(0,l.OA)()}async function ac(a,b={}){let c,d,f=!1!==b.persist;!function(){let a=M();if(a.backgroundLoaded)return;a.backgroundLoaded=!0;let b=(0,s.Vh)((0,k.BQ)(K));if(b?.version!==1)return;let c=(0,s.xK)(b.commands);if(c)for(let[a,b]of Object.entries(c)){let c=(0,s.xK)(b);c&&"string"==typeof c.command&&"string"==typeof c.description&&"string"==typeof c.source&&(c.command||c.description)&&(F.has(a)||S(F,a,{command:c.command,description:c.description,source:c.source}))}}(),function(){let a=M();if(a.compactLoaded)return;a.compactLoaded=!0;let b=(0,s.Vh)((0,k.BQ)(L));if(b?.version!==1)return;let c=(0,s.xK)(b.links);if(c)for(let[a,b]of Object.entries(c))"string"!=typeof b||b===a||I.has(a)||S(I,a,b)}();let g=(c=0,d=[],async function(a){c>=48&&await new Promise(a=>d.push(a)),c+=1;try{return await a()}finally{c-=1,d.shift()?.()}}),i={remaining:262144},j={remaining:262144},l=new Map(a.map(a=>[a.path,a])),n=new Map;await (0,m.pV)(a,a=>{if("claude-tasks"!==a.root)return;let b=(0,r.Y8)(D.GH["claude-tasks"],a.path);b&&n.set(a,b)});let p=n.size;if(await (0,m.pV)(a,async a=>{if("claude-projects"===a.root){let b=(0,o.Zg)(a.name);if(b){let[c,d]=await R(b.parentSessionId,g,b.slug);a.parent=c;let e=(0,s.Vh)(a.path.slice(0,-6)+".meta.json")??{},f=(0,s.r$)(e.toolUseId),h=Number(e.spawnDepth??0);if(f&&h>=1){let b=function(a,b,c){if(void 0===c){for(let c of b)if(c&&B(a,c))return c;return null}let d=b.reduce((a,b)=>a+ +!!b,0);for(let e of b){if(!e)continue;let b=Math.ceil(Math.max(0,c.remaining)/d),f={remaining:b},g=B(a,e,f);if(Number.isFinite(b)&&(c.remaining=Math.max(0,c.remaining-(b-f.remaining))),d-=1,g)return e}return null}(f,d.filter(b=>b!==a.path).concat(c?[c]:[]),j);b&&(a.parent=b)}}}else if("claude-tasks"===a.root){let b=n.get(a);if(!b)return;let[c,d,f]=b,[j,k]=await R(d,g,c),l=Math.ceil(i.remaining/p),m={remaining:l},o=function(a,b,c,d){let f=F.get(a);if(f)return f;let g=null;for(let f of new Set([...b,...c])){if(!f)continue;let b=function(a,b,c){let d;try{d=e().statSync(b)}catch{return null}let f=G.get(b);if(!f||d.size<f.size||d.size===f.size&&d.mtimeMs!==f.mtimeMs){var g;f={size:g=d.size,mtimeMs:d.mtimeMs,offset:0,carry:Buffer.alloc(0),toolUses:new Map,taskToolUses:new Map,commands:new Map,complete:0===g},G.set(b,f)}else f.size=d.size,f.mtimeMs=d.mtimeMs,f.complete=f.offset>=d.size;let h=f.commands.get(a);if(h)return{...h,source:b};if(!f.complete&&c.remaining>0){let g=null;try{for(g=e().openSync(b,"r");f.offset<d.size&&c.remaining>0&&!f.commands.has(a);){let a=Math.min(65536,c.remaining,d.size-f.offset),b=Buffer.allocUnsafe(a),h=e().readSync(g,b,0,a,f.offset);if(0===h)break;f.offset+=h,c.remaining-=h,function(a,b){let c=a.carry.length?Buffer.concat([a.carry,b]):b,d=0;for(let b=c.indexOf(10,d);b>=0;b=c.indexOf(10,d))T(a,c.toString("utf8",d,b)),d=b+1;a.carry=d<c.length?Buffer.from(c.subarray(d)):Buffer.alloc(0)}(f,h===b.length?b:Buffer.from(b.subarray(0,h)))}f.complete=f.offset>=d.size,f.complete&&f.carry.length>0&&T(f,f.carry.toString("utf8"))}catch{}finally{null!==g&&e().closeSync(g)}}let i=f.commands.get(a);return i?{...i,source:b}:f.taskToolUses.has(a)?{command:"",description:"",source:b}:null}(a,f,d);if(b){if(b.command||b.description)return(F.get(a)?.command!==b.command||F.get(a)?.description!==b.description||F.get(a)?.source!==b.source)&&(S(F,a,b),M().backgroundDirty=!0),b;g??=b}}return g}(f,(j?[j]:[]).concat(k),function(a,b){let c,d=h().join(D.GH["claude-projects"],a);try{c=e().readdirSync(d,{withFileTypes:!0})}catch{return[]}let f=[];for(let a of c){if(!a.isFile()||!a.name.endsWith(".jsonl")||a.name===b+".jsonl")continue;let c=h().join(d,a.name);try{let a=e().statSync(c);if(a.size>0x4000000)continue;f.push({pathname:c,mtime:a.mtimeMs})}catch{continue}}return f.sort((a,b)=>b.mtime-a.mtime).slice(0,8).map(a=>a.pathname)}(c,d),m);if(i.remaining-=l-m.remaining,p-=1,o){a.parent=o.source,a.cmd=o.command,a.cmdDesc=o.description;let b=o.description||o.command;b&&(a.title=b.split(/\s+/).join(" ").slice(0,120))}else a.parent=j,a.title="Background task "+f,a.cmd="",a.cmdDesc=""}}),await _(a,f),await aa(a,f),await ab(a,f),await P(a),await (0,m.pV)(a,a=>{a.parent&&l.has(a.parent)?a.project=(a=>{let b=new Set,c=a;for(;!b.has(c.path);){b.add(c.path);let a=l.get(c.parent??"");if(!a)return c.project;c=a}return a.project})(a):a.parent=null}),f){let a;!function(){let a=M();if(!a.backgroundDirty)return;let b=Object.fromEntries([...F].filter(([,a])=>a.command||a.description));N((0,k.BQ)(K),{version:1,commands:b})&&(a.backgroundDirty=!1)}(),(a=M()).compactDirty&&N((0,k.BQ)(L),{version:1,links:Object.fromEntries(I)})&&(a.compactDirty=!1),(0,q.Oc)()}}},45450:(a,b,c)=>{c.d(b,{M:()=>i,QX:()=>h,fM:()=>g,ne:()=>d});let d="2026-07-10",e={"fable-5":{standard:1e6},"mythos-5":{standard:1e6},"mythos-preview":{standard:1e6},"opus-4-8":{standard:1e6},"opus-4-7":{standard:1e6},"opus-4-6":{standard:1e6},"sonnet-5":{standard:1e6},"sonnet-4-6":{standard:1e6},"haiku-4-5":{standard:2e5},"opus-4-5":{standard:2e5},"opus-4-1":{standard:2e5},"sonnet-4-5":{standard:2e5,extended:1e6},"sonnet-4-0":{standard:2e5,extended:1e6}},f={fable:"fable-5",opus:"opus-4-8",sonnet:"sonnet-5",haiku:"haiku-4-5"};function g(a){return f[a]??a}function h(a){let b=a.toLowerCase().trim();if(!b||"<synthetic>"===b)return null;let c=/\[1m\]$/.test(b);return(c&&(b=b.replace(/\[1m\]$/,"")),b=(b=(b=(b=(b=b.replace(/^(?:us\.|eu\.)?anthropic\./,"")).replace(/@20\d{6}$/,"")).replace(/-v\d+(?::\d+)?$/,"")).replace(/-20\d{6}$/,"")).replace(/^claude-/,""))?{key:b,mode:c?"1m":"standard"}:null}function i(a,b){let c=e[a];return c?"1m"===b?c.extended??1e6:c.standard:null}},45656:(a,b,c)=>{c.d(b,{X3:()=>J,eK:()=>X,jJ:()=>K,reconcileStructuredSpawnReplay:()=>U,sh:()=>ad});var d=c(73024),e=c.n(d),f=c(48161),g=c.n(f),h=c(76760),i=c.n(h);c(86850);var j=c(78966),k=c(5602),l=c(14509),m=c(48892),n=c(4012),o=c(16089),p=c(91724);c(26474);var q=c(57563),r=c(77308),s=c(58996),t=c(59683),u=c(64253),v=c(74127);c(27471);var w=c(56809),x=c(25953),y=c(52649),z=c(3127),A=c(83336),B=c(84567),C=c(63629),D=c(98223),E=c(73789),F=c(2592),G=c(32372);c(68512);var H=c(41022);let I="llv-read-only-stage";function J(a,b){let c="uk"===a?r.uk["spawnCard.pinUnavailableQueued"]:q.en["spawnCard.pinUnavailableQueued"];return("string"==typeof c?c:q.en["spawnCard.pinUnavailableQueued"]).replace("{retryAt}",b)}async function K(a,b){return"codex"===a?{kind:"admissible",basis:"current",stale:!1,retryAt:null}:(0,k.Kw)(await (0,s.nn)(i().join(b.home,".credentials.json"),Date.now,600))}async function L(a,b={}){let c,d=b.attempts??3,e=b.sleep??(a=>new Promise(b=>setTimeout(b,a)));for(let b=1;b<=d;b+=1)try{return await a()}catch(a){if(!(0,z.o7)(a))throw a;c=a,b<d&&await e(250*b)}throw c}let M=new Set(["delivered","turn-started","steered"]),N=new Set(["failed","rejected","uncertain","interrupted"]);class O extends Error{constructor(a){super(a),this.name="StructuredInitialMessageTimeoutError"}}async function P(a){if(a.pid===process.pid||null===a.startIdentity)return!1;let b=()=>t.B.processIdentity(a.pid)===a.startIdentity;if(!b())return!0;for(let c of["SIGTERM","SIGKILL"]){if(!(0,u.v)(a.pid,c))try{process.kill(a.pid,c)}catch{break}for(let a=0;a<20;a+=1){if(!b())return!0;a+1<20&&await new Promise(a=>setTimeout(a,25))}}return!b()}function Q(a){let b=a instanceof Error?a.message:"structured spawn failed";return(0,w.j)(b).replace(/\s+/g," ").trim().slice(0,240)||"structured spawn failed"}function R(a,b){let c=a?.receipt.status;return c&&N.has(c)?a.receipt.reason??`${b} ended as ${c}`:null}async function S(a,b,c={}){let d,e=c.now??Date.now,f=c.sleep??(a=>new Promise(b=>setTimeout(b,a))),g=c.timeoutMs??3e4,h=c.pollMs??250,i=e()+g,j=null;for(;;){let c=null;try{c=await a.operationStatus(b,{currentRetryLeaf:!0}),d=c?.receipt.status??d,j=null}catch(a){j=a instanceof Error?a.message:"runtime status read failed"}let k=c?.receipt.status??d;if(k&&M.has(k))return;if(k&&N.has(k))throw Error(c?.receipt.reason??`structured initial message ended as ${k}`);if(e()>=i){if(j)throw new O(`structured initial message status remained unavailable for ${g}ms: ${j}`);throw new O(`structured initial message remained ${k??"pending"} for ${g}ms`)}await f(Math.min(h,i-e()))}}async function T(a,b){let c=0;for(;;){let d=await a.effectBatch(["runtime.spawn"],c);for(let a of d)if(a.payload.operationId===b)return a.payload;if(d.length<100)return null;let e=Math.max(...d.map(a=>a.eventSeq));if(!Number.isSafeInteger(e)||e<=c)throw Error("structured spawn replay effect page did not advance");c=e}}async function U(a,b,c,d={}){let e=b.readOnlySnapshot().receipts[a];if(!e)throw Error("unknown spawn receipt");if("completed"===e.state)return{...e,initialMessage:"delivered"};if("conflicted"===e.state)return{...e,initialMessage:"failed"};let[f,g,h]=await Promise.all([c.operationStatus(`spawn_message_${a}`,{currentRetryLeaf:!0}).catch(()=>null),c.operationStatus(a,{currentRetryLeaf:!0}).catch(()=>null),c.snapshot().catch(()=>null)]),i=f,j=!1;if(!i&&"path-pending"===e.state&&e.artifactPath){let d=await T(c,a).catch(()=>(j=!0,null)),f="string"==typeof d?.prompt?d.prompt:null,g=(0,H.kW)(d?.images??[],16);if(null!==f&&null!==g&&d?.conversationId===e.conversationId&&d.cwd===e.cwd&&(f.trim()||g.length)){let d=_(e,b),h=await (0,F.enqueueStructuredMessage)({path:e.artifactPath,conversationId:e.conversationId,clientMessageId:`spawn_${a}`,operationId:`spawn_message_${a}`,text:f,imageRefs:g,...d?{origin:d}:{}},{client:()=>c,registry:()=>b,enabled:()=>!0});h?.ok&&"held"!==h.outcome&&(i=await c.operationStatus(`spawn_message_${a}`,{currentRetryLeaf:!0}).catch(()=>null))}}let k=!!(i&&i.receipt.conversationId===e.conversationId&&M.has(i.receipt.status)),l=!!(e.artifactPath&&(0,v.x_)(e.artifactPath,e.engine));if(k||l){let c=h?.sessions.find(a=>a.conversationId===e.conversationId),d=c&&c.sessionKey.engine===e.engine&&c.cwd===e.cwd&&"string"==typeof c.artifactPath?c:null,f=d?{key:d.sessionKey,artifactPath:d.artifactPath,cwd:e.cwd,accountId:e.accountId,launchProfile:e.launchProfile,status:"dead"===d.host||"unhosted"===d.host?"dead":"running"===d.turn?"live":"idle",host:null,structuredHost:"codex-app-server"===d.hostKind||"claude-broker"===d.hostKind?{kind:d.hostKind,endpoint:"runtime:reconciled",process:null,eventCursor:d.revision,protocolVersion:null,writerClaimEpoch:0,activeTurnRef:d.activeTurnId,pendingAttention:d.attentionIds,activeFlags:[]}:null,claimEpoch:0,claimOwner:null,pendingAction:null}:void 0,g=b.recoverStructuredSpawnFromEvidence(a,f);if("settled"===g.kind)return{...g.receipt,initialMessage:"delivered"}}let n=i?.receipt.status,o=h?.sessions.find(a=>a.conversationId===e.conversationId&&a.cwd===e.cwd&&(!e.key||(0,m.pp)(a.sessionKey)===(0,m.pp)(e.key)))??null,p=o&&("registering"===o.host||"hosted"===o.host||"recovering"===o.host)?o:null,q=i?Date.parse(i.receipt.at):NaN,r=Number.isFinite(q)?q:Date.parse(e.createdAt),s=(d.now??Date.now)()-r,t=null!==h&&g?.receipt.conversationId===e.conversationId&&"delivered"===g.receipt.status&&null===p,u=d.timeoutMs??(t?3e4:3e5),w=R(i,"structured initial message")??R(g,"structured spawn");if(!w&&s>=u&&(w=p?`structured spawn durable setup remained incomplete for ${u}ms`:j?`structured spawn runtime effect history remained unavailable for ${u}ms`:h?`structured spawn runtime snapshot has no session after ${u}ms`:`structured spawn durable setup remained unconfirmed for ${u}ms`),w){w=w.slice(0,240);let f=b.failStructuredSpawn(a,w);if(!f.claimed){let c=f.receipt??b.readOnlySnapshot().receipts[a]??e;return{...c,initialMessage:"completed"===c.state?"delivered":"failed"}}let h=g?.receipt.status;if("pending"===h||"queued"===h||"delivering"===h)try{await c.transitionOperation(a,"failed",{reason:w})}catch(b){console.error("[spawn] runtime operation failure did not settle during reconciliation",{launchId:a,error:Q(b)})}let i=f.cleanup;if(i){let c=!1,e=b.readOnlySnapshot().entries[(0,m.pp)(i.key)];if(i.releaseRegisteredHost&&e?.structuredHostOperationId===a)try{c=await (d.releaseHost??E.releaseStructuredDeliveryHost)(i.key)}catch(b){console.error("[spawn] registered host release failed during reconciliation",{launchId:a,error:Q(b)})}if(!c&&i.process){let c=b.readOnlySnapshot().entries[(0,m.pp)(i.key)];if(i.releaseRegisteredHost?c?.structuredHostOperationId===a:c?.structuredHostOperationId==null&&c.artifactPath===f.receipt?.artifactPath&&"dead"===c.status&&null===c.claimOwner)try{await (d.terminateHostProcess??P)(i.process)||i.process.pid===process.pid||console.error("[spawn] staged host termination remained unconfirmed",{launchId:a,pid:i.process.pid})}catch(b){console.error("[spawn] staged host termination failed during reconciliation",{launchId:a,error:Q(b)})}}}return{...b.readOnlySnapshot().receipts[a]??e,initialMessage:"failed"}}let x=b.readOnlySnapshot().receipts[a]??e;return{...x,initialMessage:"failed"===x.state||void 0!==n&&N.has(n)?"failed":k||"completed"===x.state?"delivered":"queued"===n||"pending"===n||"delivering"===n?"queued":"pending"}}async function V(a,b,c,d,e){let f=e?.key??b.key,g=e?.artifactPath??b.artifactPath;f&&g&&await a.append({scope:{type:"session",id:b.conversationId},kind:"session-status",producer:{kind:"codex"===f.engine?"codex-app-server":"claude-broker",eventKey:d},payload:{conversationId:b.conversationId,sessionKey:f,hostKind:"codex"===f.engine?"codex-app-server":"claude-broker",host:"dead",turn:"idle",provenance:"structured",accountId:c.accountId,parentConversationId:b.parentConversationId,cwd:c.cwd,artifactPath:g,capabilities:{steer:"codex"===f.engine,structuredAttention:!0,imageInput:(0,G.ki)(f.engine,!1),runtimeSettings:(0,C.wL)(f.engine)},activeTurnId:null}})}function W(a,b){if("resume-successor"!==b.purpose)return null;let c=a.conversation(b.conversationId),d=c?.generations.find(a=>a.path===b.resumeSourcePath)??c?.generations.at(-1);return d?{key:{engine:b.engine,sessionId:d.id},artifactPath:d.path}:null}function X(a,b){return a&&("bypassPermissions"!==a||!b.agentInitiated||b.operatorAuthenticated||b.roleSpawn)?a:"default"}async function Y(a,b){let c=a.spec.launchProfile??{},d=Z(a),f=d?a.registry.readOnlySnapshot().entries[(0,m.pp)({engine:a.engine,sessionId:d})]?.structuredHost?.eventCursor:void 0;if(void 0!==f&&(!Number.isSafeInteger(f)||f<0))throw Error("structured resume event cursor is invalid");let h=function(a,b,c){let d={...b,...c?{LLV_SPAWN_CAPABILITY:c}:{}};if(!a)return{env:d,codex:{sandbox:"danger-full-access"},host:{},scratchDirectory:null,cleanup:()=>{}};let f=(void 0)??(0,p.BQ)("scratch");e().mkdirSync(f,{recursive:!0,mode:448});let h=e().mkdtempSync(i().join(f,"llv-read-only-stage-"));try{e().chmodSync(h,448);let a=i().join(h,"tmp");e().mkdirSync(a,{mode:448});let c=`permissions.${I}={extends=":read-only",filesystem={${JSON.stringify(h)}="write"}}`,f=()=>e().rmSync(h,{recursive:!0,force:!0});return{env:{...d,TMPDIR:a,GH_CONFIG_DIR:function(a){if(a.GH_CONFIG_DIR)return a.GH_CONFIG_DIR;let b=a.HOME||g().homedir();return i().join(a.XDG_CONFIG_HOME||i().join(b,".config"),"gh")}(b)},codex:{permissionProfile:I,permissionProfileConfig:c},host:{forwardGitHubConfig:!0,releaseCleanup:f},scratchDirectory:h,cleanup:f}}catch(a){throw e().rmSync(h,{recursive:!0,force:!0}),a}}(!0===c.readOnly,a.account.env,b),k=h.env;if("codex"===a.engine){let b={cwd:a.spec.cwd,codexHome:a.account.home,fileAuthCredentials:"managed"===a.account.kind,model:c.model??void 0,effort:c.effort??void 0,allowSubagents:c.allowSubagents,mcpServers:c.mcpServers,plugins:c.plugins,...h.codex,...h.host,approvalPolicy:c.permissionMode??void 0,initialEventCursor:f,env:k};return d?await y.o.adopt(d,b):await y.o.start(b)}let n=function(a,b=e().existsSync){let c=W(a.registry,a.receipt);return c&&function(a,b=e().existsSync){return!!a.artifactPath&&b(a.artifactPath)}(c,b)?{kind:"resume",sessionId:c.key.sessionId}:{kind:"fresh",sessionId:c?.key.sessionId??(a.spec.transcript?i().basename(a.spec.transcript,".jsonl"):void 0)}}(a),o={cwd:a.spec.cwd,claudeConfigDir:a.account.home,claudeProjectsDir:a.account.transcriptRoot,spawnPolicyBaseSettingsPath:function(a,b=j.ZK){return"managed"===a.kind?b():null}(a.account),allowSubagents:c.allowSubagents,mcpServers:c.mcpServers,mcpStatePath:"managed"===a.account.kind?i().join(a.account.home,".claude.json"):i().join(i().dirname(a.account.home),".claude.json"),readOnly:!0===c.readOnly,model:c.model??void 0,effort:c.effort??void 0,permissionMode:(0,l.A5)(c),initialEventCursor:f,env:k,...h.host};return"resume"===n.kind?await x.s7.adopt(n.sessionId,o):await x.s7.start({...o,...n.sessionId?{sessionId:n.sessionId}:{}})}function Z(a){return W(a.registry,a.receipt)?.key.sessionId??null}async function $(a,b,c,d,e,f="unhosted"){return"codex"===b.engine?await (0,D.WF)(a,b,c,d,e,f):await (0,D.n$)(a,b,c,d,e,f)}function _(a,b){if(0===a.delegationDepth)return{kind:"operator"};if(null===a.delegationDepth||void 0===a.delegationDepth)return;let c=a.parentConversationId?b.conversation(a.parentConversationId):null,d=(0,B.S)(c?.agentRole??void 0);return{kind:"agent",...d?{role:d}:{}}}async function aa(a,b){if(!a.prompt.trim()&&!a.imageRefs?.length)return;let c=_(a.receipt,a.registry),d=await (0,F.enqueueStructuredMessage)({path:b,conversationId:a.receipt.conversationId,clientMessageId:`spawn_${a.receipt.launchId}`,operationId:`spawn_message_${a.receipt.launchId}`,text:a.prompt,imageRefs:a.imageRefs,...c?{origin:c}:{}},{client:()=>a.client,registry:()=>a.registry,enabled:()=>!0});if(!d?.ok){let a=d?.error??"structured spawn first-message delivery was unavailable";if(d?.transportUncertain)throw new O(a);throw Error(a)}if("held"===d.outcome)return"held";if("delivered"!==d.outcome){var e,f;let b,c;await S(a.client,d.operationId),e=a.registry,f=a.receipt.launchId,b=`spawn_${f}`,(c=Object.values(e.readOnlySnapshot().heldDeliveries).find(a=>a.clientMessageId===b))&&"delivered"!==c.state&&e.recordDeliveryOutcome(c.id,"delivered")}}async function ab(a){let b;if(!a)return null;try{b=await a.health()}catch{return null}return"dead"!==b.status?null:a.terminalExitReason?.()??"structured spawn host exited before its first message"}async function ac(a,b){await a?.release();let c=null;try{await b.unregister()}catch(a){c=a}if(b.stopPersistence(),c)throw c}async function ad(a,b={}){var c,d,e,f,g;let h=b.startHost??Y,i=b.bindHost??$,j=b.publishHost??((a,b,c)=>(0,E.xq)({key:a,host:b},c)),k=b.deliverFirst??aa,l=b.processIdentity??(()=>({pid:process.pid,startIdentity:t.B.processIdentity(process.pid)})),p=a.receipt.launchId,q=Z(a),r=q?(0,m.ce)(a.engine,q):null,s=W(a.registry,a.receipt),u=null,v={stopPersistence:()=>{},unregister:async()=>{}},w=null,x=null,y=!1,z=!1,B=!1,C=null,D=null,F=()=>{null!==C&&clearTimeout(C),C=null,D=null},G=a=>D?Promise.race([a,D]):a;try{let e;"claude"===a.engine&&"managed"===a.account.kind&&(0,n.prepareManagedClaudeSpawnHome)(a.account.home,a.spec.cwd);let f=a.imageRefs??[],g=a.prompt.trim()||f.length?(0,H.rM)(a.prompt,f):null;await L(()=>a.client.command({kind:"spawn",operationId:p,idempotencyKey:p,conversationId:a.receipt.conversationId,engine:a.engine,cwd:a.spec.cwd,prompt:g?.content.text??"",...g?.content.images.length?{images:g.content.images}:{},...g?{contentDigest:g.contentDigest}:{},accountId:a.account.accountId,parentConversationId:a.receipt.parentConversationId,..."resume-successor"===a.receipt.purpose?{sessionId:Z(a)}:{}}));let q=a.registry.rotateSpawnCapabilityForReceipt(a.receipt.launchId),s=r?a.registry.readOnlySnapshot().entries[(0,m.pp)(r)]:null;if(s?.structuredHost&&(x=a.registry.claimStructuredHost(r,l(),{allowUnhosted:!0}),!x?.claimOwner))throw z=!0,Error("structured resume host claim is unavailable");let t=b.durableSetupTimeoutMs??3e5;D=new Promise((a,b)=>{C=setTimeout(()=>{B=!0,b(Error(`structured spawn durable host setup timed out after ${t}ms`))},t),C.unref?.()});let A=h(a,q);A.then(async b=>{if(B)try{await b.release()}catch(b){console.error("[spawn] late structured host could not be released after setup timeout",{launchId:a.receipt.launchId,error:Q(b)})}},()=>{}),u=await G(A);let E=function(a,b,c){if("codex"===a){let a=b.identity;if(!a.threadId)throw Error("structured Codex spawn returned no thread identity");if(!a.path)throw Error("structured Codex spawn feature gap: app-server returned no transcript path");let c=(0,m.ce)("codex",a.threadId);if(!c)throw Error("structured Codex spawn returned an invalid thread identity");return{key:c,path:a.path}}let d=b.identity;if(!d.sessionId)throw Error("structured Claude spawn returned no session identity");let e=(0,m.ce)("claude",d.sessionId);if(!e)throw Error("structured Claude spawn returned an invalid session identity");return{key:e,path:c.spec.transcript??(0,o.eV)(c.spec.cwd,d.sessionId,c.account.transcriptRoot)}}(a.engine,u,a);if(w=E.key,r&&(0,m.pp)(w)!==(0,m.pp)(r))throw Error("structured resume returned a different session identity");let I=x?.claimEpoch??0,J=x?.claimOwner??null,K=a.registry.stageStructuredSpawn(a.receipt.launchId,{key:w,artifactPath:E.path,cwd:a.spec.cwd,accountId:a.account.accountId,launchProfile:a.spec.launchProfile,status:"unhosted",host:null,structuredHost:function(a,b=0,c=0){return{kind:"codex"===a?"codex-app-server":"claude-broker",endpoint:"stdio:pending",process:null,eventCursor:b,protocolVersion:null,writerClaimEpoch:c,activeTurnRef:null,pendingAttention:[],activeFlags:[]}}(a.engine,x?.structuredHost?.eventCursor??0,I),claimEpoch:I,claimOwner:J,pendingAction:"spawn"});if("conflict"===K.kind)throw Error(`structured spawn registry conflict: ${K.code}`);let M=x?K.entry:a.registry.claimStructuredHost(w,l(),{allowUnhosted:!0});if(!M?.claimOwner)throw Error("structured spawn host claim is unavailable");y=null!==x,v.stopPersistence=await G(i(a.registry,w,u,M.claimOwner,M.claimEpoch));let N=async()=>{if(B)return!1;let b=a.registry.readOnlySnapshot(),c=b.receipts[a.receipt.launchId],d=b.entries[(0,m.pp)(w)];return!!(c&&"completed"!==c.state&&"failed"!==c.state&&"conflicted"!==c.state&&d?.structuredHostOperationId===a.receipt.launchId)};v.unregister=await G(j(w,u,N));try{e=await G(k(a,E.path))}catch(g){let b;if(!(g instanceof O))throw g;let f=await ab(u);if(f)throw Error(f);c=a.registry,d=a.receipt.launchId,(b=Object.values(c.readOnlySnapshot().heldDeliveries).find(a=>a.clientMessageId===`spawn_${d}`))&&"delivered"!==b.state&&c.recordDeliveryOutcome(b.id,"delivery-uncertain",g.message),e="held"}if("held"===e)return F(),a.registry.releaseStructuredSpawnAdmissionOwner(a.receipt.launchId,a.receipt.admissionOwner??l()),{ok:!0,target:null,path:E.path,..."claude"===a.engine?{effectivePermissionMode:a.spec.launchProfile?.permissionMode??"default"}:{},launchId:a.receipt.launchId,conversationId:a.receipt.conversationId,launched:!0,retrySafe:!1,initialMessage:"queued",state:"path-pending",transport:"structured"};await G(L(()=>a.client.transitionOperation(p,"delivered")));let P=a.registry.finalizeStructuredSpawn(a.receipt.launchId);if("conflict"===P.kind)throw Error(`structured spawn registry conflict: ${P.code}`);return F(),{ok:!0,target:null,path:E.path,..."claude"===a.engine?{effectivePermissionMode:a.spec.launchProfile?.permissionMode??"default"}:{},launchId:a.receipt.launchId,conversationId:P.conversation.id,launched:!0,retrySafe:!1,initialMessage:"delivered",state:"settled",transport:"structured"}}catch(k){F();let b=Q(k);await a.client.transitionOperation(p,"failed",{reason:b}).catch(()=>{}),!u&&k instanceof A.EY&&(u=k.host,r&&x?.claimOwner&&(w=r,v.stopPersistence=await i(a.registry,r,u,x.claimOwner,x.claimEpoch,"dead")));try{await ac(u,v)}catch{throw k}let c=null,d=s;if(w){let b=a.registry.readOnlySnapshot().entries[(0,m.pp)(w)];b&&(c=b,d={key:w,artifactPath:b.artifactPath})}else s&&(c=a.registry.readOnlySnapshot().entries[(0,m.pp)(s.key)]??null);"string"==typeof c?.structuredHostOperationId&&c.structuredHostOperationId!==a.receipt.launchId&&(d=null);let h=!0;if(d&&!z)try{await V(a.client,a.receipt,c??{accountId:a.account.accountId,cwd:a.spec.cwd},`structured-spawn-failed:${a.receipt.launchId}`,d)}catch{h=!1}!x||y&&h||(e=a.registry,f=x,g=h,f.claimOwner&&f.structuredHost&&(g&&e.setStructuredHostClaimed(f.key,{...f.structuredHost,endpoint:"stdio:released",process:null,activeTurnRef:null,pendingAttention:[],activeFlags:[]},"dead",f.claimOwner,f.claimEpoch,!0)||e.releaseStructuredHostClaim(f.key,f.claimOwner,f.claimEpoch)));let j="launch"===a.receipt.purpose;throw(h||j)&&(w?a.registry.failStructuredSpawn(a.receipt.launchId,b):a.registry.failSpawn(a.receipt.launchId,b)),k}}},50201:(a,b,c)=>{c.d(b,{Ee:()=>i,S0:()=>j,Zn:()=>h,_l:()=>d,cM:()=>f,ji:()=>g});let d="runtime-plane-absent";function e(a){if(void 0===a)return!1;switch(a.trim().replace(/^(["'])([\s\S]*)\1$/,"$2").trim().toLowerCase()){case"0":case"false":case"off":case"no":return!0;default:return!1}}function f(a=process.env){return!e(a.LLV_STRUCTURED_HOSTS)}function g(a=process.env){return e(a.LLV_RUNTIME_EVENTS)}function h(a=process.env){return!g(a)&&!!j(a)}function i(a=process.env){return!e(a.NEXT_PUBLIC_RUNTIME_UI)}function j(a=process.env){return a.LLV_RUNTIME_HOST_SOCKET?.trim()||null}},51906:(a,b,c)=>{c.d(b,{IL:()=>H,OZ:()=>J,P1:()=>E,T:()=>I,gn:()=>F});var d=c(31421),e=c(77598),f=c.n(e),g=c(73024),h=c.n(g),i=c(76760),j=c.n(i),k=c(14509),l=c(78966),m=c(16089),n=c(4012),o=c(77149),p=c(59683),q=c(92806),r=c(98590);let s=new Map;function t(a,b){let c=(0,q.Fd)(a);return delete c.LLV_TOKEN,b&&(c.LLV_SPAWN_CAPABILITY=b),c}function u(a,b){return`${a}:${b}`}function v(a){if(!a||!Number.isInteger(a)||a<=0)return!1;try{return process.kill(a,0),!0}catch{return!1}}let w={pidAlive:v,processIdentity:a=>p.B.processIdentity(a),signalProcess:(a,b)=>{process.kill(a,b)},setTimeout:(a,b)=>setTimeout(a,b)},x={...w,processGroupAlive:a=>{try{return process.kill(-a,0),!0}catch{return!1}},wait:async a=>await new Promise(b=>setTimeout(b,a))};function y(a,b,c={}){let d={...w,...c.runtime};if(!(!0===c.ownedByLiveHandle||b&&d.pidAlive(a)&&d.processIdentity(a)===b))return;try{d.signalProcess(-a,"SIGTERM")}catch{if(!c.leaderExited)try{(c.fallbackLeader??(b=>d.signalProcess(a,b)))("SIGTERM")}catch{}}let e=d.setTimeout(()=>{try{d.signalProcess(-a,"SIGKILL")}catch{}},c.graceMs??3e3);e.unref?.()}async function z(a,b,c={}){let d={...x,...c.runtime};if(!(!0===c.ownedByLiveHandle||b&&d.pidAlive(a)&&d.processIdentity(a)===b))return!d.processGroupAlive(a);let e=b=>{try{d.signalProcess(-a,b)}catch{if(!c.leaderExited)try{(c.fallbackLeader??(b=>d.signalProcess(a,b)))(b)}catch{}}},f=async b=>{let e=Math.max(1,c.pollMs??25),f=Math.max(1,Math.ceil(b/e));for(let b=0;b<f;b+=1){if(!d.processGroupAlive(a))return!0;await d.wait(e)}return!d.processGroupAlive(a)};return e("SIGTERM"),!!await f(c.graceMs??3e3)||(e("SIGKILL"),await f(c.killWaitMs??1e3))}function A(a,b,c=3e3){y(a,b,{graceMs:c})}function B(a){let b=a.child.pid;b&&!a.terminationStarted&&(a.terminationStarted=!0,y(b,null,{ownedByLiveHandle:!0,leaderExited:null!==a.exit,fallbackLeader:b=>{a.child.kill(b)}}))}let C=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,D=new Set(["session_id","sessionId","thread_id","threadId","rollout_id"]);function E(a,b,c,e,g,i=18e5,v,w,x,y){let z,A=u(a,b);if(s.has(A))return{pid:null,identity:null,sessionId:null,reviewerPath:null};let C=(0,r.WJ)(a,b);h().mkdirSync(j().dirname(C),{recursive:!0}),F(a,b);let D=function(a,b,c,d,e,g,h){if("claude"===a.engine){let c=f().randomUUID(),e=["-p",b,"--dangerously-skip-permissions","--session-id",c];a.model&&e.push("--model",a.model),a.effort&&e.push("--effort",a.effort);let i=g?(0,n.applyClaudeSpawnPolicy)(g.home,{baseSettingsPath:g.managed?(0,l.ZK)():null,profileId:`headless-${c}`}).settingsPath:null;i&&e.push("--settings",i);let j=g?.managed?(0,l.x0)(g.home):process.env;return{command:(0,k.uX)("claude"),args:e,env:t(j,h),stdin:null,outputPath:null,sessionId:c,reviewerPath:(0,m.eV)(d,c,g?.projectsDir)}}let i=["--disable","multi_agent","exec","--ignore-user-config","-","--json","--output-last-message",c,"--dangerously-bypass-approvals-and-sandbox"];return e?.managed&&i.unshift("-c","cli_auth_credentials_store=file"),a.model&&i.push("-m",a.model),a.effort&&i.push("-c",`model_reasoning_effort=${a.effort}`),{command:(0,k.uX)("codex"),args:i,env:t(e?.home?{...(0,q.Fd)(process.env),CODEX_HOME:e.home}:process.env,h),stdin:(0,n.fenceViewerSpawnPrompt)("codex",b),outputPath:c,sessionId:null,reviewerPath:null}}(c,g,C,e,v,w,y),G=h().openSync((0,r.Ml)(a,b),"w"),H=h().openSync((0,r.NO)(a,b),"w");try{z=(0,d.spawn)(x?.command??D.command,D.args,{cwd:e,env:D.env,detached:!0,stdio:[null===D.stdin?"ignore":"pipe",G,H]}),null!==D.stdin&&z.stdin&&(z.stdin.on("error",()=>{}),z.stdin.end(D.stdin,"utf8"))}finally{h().closeSync(G),h().closeSync(H)}z.unref();let I=x?.processIdentity??p.B.processIdentity,J=z.pid?I(z.pid):null,K={child:z,identity:J,identityOf:I,startedAt:Date.now(),exit:null,terminationStarted:!1,timer:setTimeout(()=>{B(K)},i)};K.timer.unref(),s.set(A,K);let L=!1,M=()=>{L||(L=!0,(0,o.L1)())};return z.on("error",()=>{clearTimeout(K.timer),K.exit={code:null,signal:null},B(K),M()}),z.on("close",(a,b)=>{clearTimeout(K.timer),K.exit={code:a,signal:b},B(K),M()}),{pid:z.pid??null,identity:J,sessionId:D.sessionId,reviewerPath:D.reviewerPath}}function F(a,b){for(let c of[(0,r.WJ)(a,b),(0,r.Ml)(a,b),(0,r.NO)(a,b)])h().rmSync(c,{force:!0})}function G(a){if(!a)return"";try{return h().readFileSync(a,"utf8")}catch{return""}}function H(a,b,c,d,e=18e5){let f=s.get(u(a,b)),g=G((0,r.Ml)(a,b)),h=f?.child.pid??c.reviewerPid??null;f&&h&&!f.identity&&v(h)&&(f.identity||(f.identity=f.identityOf(h)),f.identity);let i=f?.identity??c.reviewerIdentity??null,j=G((0,r.NO)(a,b)),k=function(a){let b=null,c="";for(let d of a.split("\n")){let a=d.trim();if(a.startsWith("{"))try{let d=JSON.parse(a);b||(b=function a(b,c=0){if(!b||"object"!=typeof b||c>4)return null;for(let[d,e]of Object.entries(b)){if(D.has(d)&&"string"==typeof e&&C.test(e))return e;let b=a(e,c+1);if(b)return b}return null}(d));let e=function(a){let b=a.item;if(b&&("agent_message"===b.type||"agent_message"===b.item_type)&&"string"==typeof b.text)return b.text;let c=a.msg;return c?.type==="agent_message"&&"string"==typeof c.message?c.message:null}(d);e&&(c=e)}catch{}}return{sessionId:b,lastAgentMessage:c}}(g),l=G("codex"===d?(0,r.WJ)(a,b):null).trim();if(!f&&null===h&&!g&&!j&&!l&&!c.spawnStartedAt)return null;let m=f?.startedAt??Date.parse(c.spawnStartedAt??""),n=Number.isFinite(m)?Date.now()-m:0,o=l||k.lastAgentMessage||("claude"===d?g.trim():"");if(l)return{status:"done",stdout:g,stderr:j,finalOutput:o,sessionId:k.sessionId,processIdentity:i,code:f?.exit?.code??null,signal:f?.exit?.signal??null};if(!f&&null!==h&&!i&&v(h))return{status:"lost",stdout:g,stderr:j,finalOutput:o,sessionId:k.sessionId,processIdentity:null,code:null,signal:null};if(f?null===f.exit&&v(h):!!(h&&i&&v(h)&&p.B.processIdentity(h)===i))return!f&&n>=e&&h&&A(h,i),{status:"running",stdout:g,stderr:j,finalOutput:"",sessionId:k.sessionId,processIdentity:i,code:null,signal:null};if(!f&&null===h&&!l)return{status:"lost",stdout:g,stderr:j,finalOutput:o,sessionId:k.sessionId,processIdentity:i,code:null,signal:null};let q=f?.exit??null;return{status:q?.code===0||o?"done":!o&&n>=e?"timeout":"failed",stdout:g,stderr:j,finalOutput:o,sessionId:k.sessionId,processIdentity:i,code:q?.code??null,signal:q?.signal??null}}function I(a,b,c={reviewerPid:null,reviewerIdentity:null}){let d=u(a,b),e=s.get(d);s.delete(d);let f=e?.child.pid??c.reviewerPid??null,g=e?.identity??c.reviewerIdentity??null;(e&&clearTimeout(e.timer),e)?B(e):f&&A(f,g)}async function J(a,b,c={reviewerPid:null,reviewerIdentity:null}){let d=u(a,b),e=s.get(d),f=e?.child.pid??c.reviewerPid??null,g=e?.identity??c.reviewerIdentity??null;if(!f)return s.delete(d),!0;e&&(clearTimeout(e.timer),e.terminationStarted=!0);let h=await z(f,g,{ownedByLiveHandle:!!e,leaderExited:e?.exit!==null,fallbackLeader:e?a=>{e.child.kill(a)}:void 0});return h&&s.delete(d),h}},52649:(a,b,c)=>{c.d(b,{o:()=>af,I:()=>U});var d=c(31421),e=c(77598),f=c.n(e),g=c(58152),h=c(59683),i=c(64253),j=c(94595),k=c(61971),l=c(56809),m=c(69858),n=c(41022);let o=/^data:([a-z0-9.+-]+\/[a-z0-9.+-]+);base64,([\s\S]*)$/i,p=new Set(["image_url","imageUrl","data","url","source"]);class q extends Error{constructor(a){super(`Codex replay frame exceeded its bounded ${a} budget`)}}let r=/^data:[a-z0-9.+-]+\/[a-z0-9.+-]+;base64,/i;class s{constructor(a){this.budgets=a,this.parts=[],this.outputUnits=0,this.rawUnits=0,this.inString=!1,this.stringParts=[],this.stringUnits=0,this.stringOmitted=0,this.stringHead="",this.stringCapSniffed=!1,this.escapeCarry="",this.stringCap=a.maxStringUnits}feed(a){if(this.rawUnits+=a.length,this.rawUnits>this.budgets.maxRawUnits)throw new q("raw");this.escapeCarry&&(a=this.escapeCarry+a,this.escapeCarry="");let b=0;for(;b<a.length;){if(!this.inString){let c=a.indexOf('"',b);if(-1===c)return void this.append(a.slice(b));this.append(a.slice(b,c+1)),this.inString=!0,b=c+1;continue}let c=a.indexOf('"',b),d=a.indexOf("\\",b),e=-1===c?d:-1===d?c:Math.min(c,d);if(-1===e)return void this.appendToString(a.slice(b));if(e>b&&this.appendToString(a.slice(b,e)),e===c){this.endString(),b=e+1;continue}let f=117===a.charCodeAt(e+1)?6:2,g=a.slice(e,e+f);if(g.length<f){this.escapeCarry=g;return}this.appendToString(g,!0),b=e+f}}finish(){return this.escapeCarry&&(this.appendToString(this.escapeCarry),this.escapeCarry=""),this.inString&&this.endString(!1),this.parts.join("")}append(a){if(a){if(this.outputUnits+=a.length,this.outputUnits>this.budgets.maxOutputUnits)throw new q("output");this.parts.push(a)}}appendToString(a,b=!1){this.stringHead.length<64&&(this.stringHead+=a.slice(0,64-this.stringHead.length)),!this.stringCapSniffed&&this.stringUnits+a.length>this.stringCap&&(this.stringCapSniffed=!0,r.test(this.stringHead)&&(this.stringCap=this.budgets.maxImageStringUnits));let c=this.stringCap-this.stringUnits;if(c>=a.length){this.stringParts.push(a),this.stringUnits+=a.length;return}if(b||c<=0){this.stringOmitted+=a.length;return}this.stringParts.push(a.slice(0,c)),this.stringUnits+=c,this.stringOmitted+=a.length-c}endString(a=!0){if(this.stringOmitted>0){let a=this.stringParts[this.stringParts.length-1],b=a?a.charCodeAt(a.length-1):0;b>=55296&&b<=56319&&(this.stringParts[this.stringParts.length-1]=a.slice(0,-1),this.stringOmitted+=1),this.stringParts.push(`…[truncated ${this.stringOmitted} chars]`)}this.append(this.stringParts.join("")+(a?'"':"")),this.inString=!1,this.stringParts=[],this.stringUnits=0,this.stringOmitted=0,this.stringHead="",this.stringCap=this.budgets.maxStringUnits,this.stringCapSniffed=!1}}var t=c(32372),u=c(29861),v=c(77276);let w=/[.!?…](?:["')\]}»”’]+)?\s+/gu;function x(a,b,c){let d=a.slice(0,b+1).search(/\s+\S*$/u);if(d>=c)return d+a.slice(d).match(/^\s+/u)[0].length;let e=a.slice(b).search(/\s/u);return e>=0?b+e+1:a.length}var y=c(83336),z=c(37037),A=c(73024),B=c.n(A),C=c(76760),D=c.n(C),E=c(91724);let F=`Your name is Alik. You are the voice coordinator: you speak aloud and you run the work of other agents.
|
|
8
|
+
`;e().writeSync(d,g),e().fsyncSync(d);let h={lastSeq:b.seq,bytes:f.bytes+Buffer.byteLength(g)};this.tails.set(a,h);let i=l().get(c),j=e().fstatSync(d);i&&i.identity.size===f.bytes&&(i.events.at(-1)?.seq??0)===f.lastSeq?o(c,m(j),[...i.events,b]):p(c)}finally{e().closeSync(d)}}reconcileTail(a,b,c){if(0===e().fstatSync(c).size){let b={lastSeq:0,bytes:0};return this.tails.set(a,b),b}let d=this.load(a),f=e().fstatSync(c).size,g=Buffer.allocUnsafe(1);if(!(f>0&&1===e().readSync(c,g,0,1,f-1)&&10===g[0])){let a,d=e().readFileSync(b,"utf8"),f=d.lastIndexOf("\n")+1,g=d.slice(f);try{a=JSON.parse(g)}catch{a=null}t(a)?e().writeSync(c,"\n"):e().ftruncateSync(c,Buffer.byteLength(d.slice(0,f)))}let h=e().fstatSync(c),i={lastSeq:d.at(-1)?.seq??0,bytes:h.size};return this.tails.set(a,i),o(b,m(h),d),i}filename(a){return g().join(this.directory,`${encodeURIComponent(a)}.jsonl`)}}},38855:(a,b,c)=>{c.d(b,{l:()=>e});let d=process;function e(){return d.__llvStructuredDeliveryKick?.()}},41288:(a,b,c)=>{c.d(b,{o:()=>d,t:()=>e});let d=["deployer"],e=["start","update-draft","set-position","add-stage","remove-stage","reorder-stage","set-edge","pause","resume","retry-stage","skip-stage","override-stage","link-task","unlink-task","set-src","delete","close"]},42087:(a,b,c)=>{c.d(b,{s:()=>m});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(16089),i=c(66024),j=c(23921),k=c(89333);function l(a){return new Promise(b=>setTimeout(b,a))}async function m(a){if(a.knownTranscript)return a.knownTranscript;if("codex"!==a.engine)return null;let b=a.panePid;if("number"!=typeof b||!Number.isInteger(b)||b<=0)return null;let c=a.env??{},d=c.now??Date.now,f=c.sleep??l,m=c.candidatePaths??(b=>(function(a,b=k.GH["codex-sessions"]){let c=a-5e3,d=[],f=(a,b)=>{let h;if(!(b>6)){try{h=e().readdirSync(a,{withFileTypes:!0})}catch{return}for(let i of h){let h=g().join(a,i.name);if(i.isDirectory()){f(h,b+1);continue}if(i.isFile()&&i.name.endsWith(".jsonl"))try{let a=e().statSync(h);a.mtimeMs>=c&&d.push({path:h,mtimeMs:a.mtimeMs})}catch{continue}}}};return f(b,0),d.sort((a,b)=>b.mtimeMs-a.mtimeMs).slice(0,32).map(a=>a.path)})(b,a.codexSessionsDir??k.GH["codex-sessions"])),n=c.holderPidByPath??(a=>(0,j.SP)(a,!0)),o=c.parentPidOf??j.Ib,p=c.timeoutMs??2500,q=c.pollMs??150,r=d()+p;for(;;){let c=function(a,b,c,d){let f=d.holderPidByPath(a);for(let g of a){let a=f.get(g);if(void 0!==a&&function(a,b){let c=(0,h.tX)(a,{bytes:8192,maxLines:10});return null===c||c===b}(g,c)&&!function(a){try{let b=e().statSync(a);return(0,i.ET)(a,b.size)}catch{return!1}}(g)&&function(a,b,c){let d=new Set;for(let e=a;null!==e&&!d.has(e);e=c(e)){if(e===b)return!0;if(d.add(e),d.size>64)break}return!1}(a,b,d.parentPidOf))return g}return null}(m(a.startedAtMs),b,a.cwd,{holderPidByPath:n,parentPidOf:o});if(c)return c;if(d()>=r)return null;await f(q)}}},43384:(a,b,c)=>{c.d(b,{H:()=>h,l:()=>g});var d=c(4837),e=c(50201),f=c(41022);function g(a=process.env){let b=a.LLV_SPAWN_TRANSPORT?.trim();if(!b)return(0,e.cM)(a)&&(0,e.Zn)(a)&&(0,e.Ee)(a)?"structured":"tmux";if("tmux"!==b&&"structured"!==b)throw Error("LLV_SPAWN_TRANSPORT must be tmux or structured");return b}function h(a,b=process.env){return(0,e.cM)(b)?(0,e.ji)(b)?"structured spawn is rolled back by LLV_RUNTIME_EVENTS=0":(0,e.S0)(b)?(0,e.Ee)(b)?a.hasImages&&"codex"===a.engine&&!(0,d.JL)(a.model)?f.t6:"codex"===a.engine&&null!==a.fast?"structured Codex spawn does not support an explicit Codex service tier":null:"structured spawn requires the runtime UI (NEXT_PUBLIC_RUNTIME_UI=0 removes the viewer controls)":"structured spawn requires a runtime host socket (LLV_RUNTIME_HOST_SOCKET)":"structured spawn is rolled back by LLV_STRUCTURED_HOSTS=0"}},44836:(a,b,c)=>{c.d(b,{Gp:()=>k,mj:()=>j,po:()=>i});let d=/^conversation_[A-Za-z0-9_-]{1,180}$/,e=/^[A-Za-z0-9_.:-]{1,200}$/;function f(a,b){return null===b?{}:{[a]:b}}function g(a,b){if("string"!=typeof a)return null;let c=a.replace(/[\u0000-\u001f\u007f-\u009f]+/gu," ").trim();return c&&[...c].slice(0,b).join("").trim()||null}function h(a){return"string"==typeof a&&e.test(a)?a:null}function i(a){var b;let c;if(!a||"object"!=typeof a||Array.isArray(a)||1!==a.version)return null;let e=function(a){if("string"!=typeof a||a.length>40)return null;let b=Date.parse(a);return Number.isFinite(b)?new Date(b).toISOString():null}(a.capturedAt);if(!e)return null;let i={capturedAt:e,...f("project",g(a.project,200)),...f("viewSessionId",h(a.viewSessionId)),...f("deviceId",h(a.deviceId)),...f("revision","number"==typeof(b=a.revision)&&Number.isSafeInteger(b)&&b>=0?b:null)};if("none"===a.state)return{version:1,state:"none",...i};if("selected"!==a.state)return null;let j="string"==typeof a.conversationId&&d.test(a.conversationId)?a.conversationId:null;return j?{version:1,state:"selected",conversationId:j,...i,...f("path",(c=g(a.path,1025))&&c.length<=1024?c:null),...f("label",g(a.label,80))}:null}function j(a){let b=JSON.stringify(a),c=new TextEncoder().encode(b),d="";for(let a of c)d+=String.fromCharCode(a);return btoa(d).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function k(a){if(!a||!/^[A-Za-z0-9_-]+$/.test(a))return null;try{let b=a.replace(/-/g,"+").replace(/_/g,"/"),c=atob(b+"=".repeat((4-b.length%4)%4)),d=Uint8Array.from(c,a=>a.charCodeAt(0));return i(JSON.parse(new TextDecoder().decode(d)))}catch{return null}}},45442:(a,b,c)=>{c.d(b,{b:()=>ac,X:()=>O});var d=c(73024),e=c.n(d),f=c(51455),g=c(76760),h=c.n(g),i=c(77598),j=c.n(i),k=c(91724),l=c(26474),m=c(12770),n=c(52509),o=c(2451),p=c(66024),q=c(70107),r=c(28617),s=c(95544);let t=(0,n.E)("needle-v2"),u=(0,n.E)("needle-tail-v1"),v=(0,n.E)("needle-tail-uuid-v1"),w=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,x=/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;function y(a,b,c){let d=Buffer.allocUnsafe(c),f=0;for(;f<c;){let g=e().readSync(a,d,f,c-f,b+f);if(0===g)break;f+=g}return{bytes:f===d.length?d:Buffer.from(d.subarray(0,f)),complete:f===c}}function z(a,b){for(let c of b.toString("utf8").match(x)??[])a.add(c.toLowerCase())}function A(a){return(0,i.createHash)("sha256").update(a).digest("base64url")}function B(a,b,c){let d,f=t.get(a);f&&f.hits&&f.sizes||(f={hits:f?.hits??{},scanned:f?.scanned??{},sizes:f?.sizes??{},observations:f?.observations??{},boundaries:f?.boundaries??{}},t.set(a,f));let g=Buffer.from(a),h=Math.max(0,g.length-1);try{d=e().statSync(b)}catch{return!1}let i=d.size,j=f.scanned[b]??0,k=f.sizes[b],l=f.observations[b],m=f.boundaries[b],n=!!(j>0&&!l);if(l)if((n||=l.dev!==d.dev||l.ino!==d.ino)||!(i>l.size))n||(n||=i!==l.size||d.mtimeMs!==l.mtimeMs);else if(!m||m.offset+m.bytes!==j||j>l.size)n=!0;else{if(c&&c.remaining<m.bytes)return!1;let a=null;try{a=e().openSync(b,"r");let d=y(a,m.offset,m.bytes);c&&(c.remaining-=d.bytes.length),n=!d.complete||A(d.bytes)!==m.fingerprint}catch{return!1}finally{null!==a&&e().closeSync(a)}}if((n||void 0!==k&&i<k)&&(j=0,f.scanned[b]=0,delete f.hits[b],delete f.boundaries[b],m=void 0),f.sizes[b]=i,f.hits[b])return!0;if(i<=j)return!1;let o=void 0===c?1/0:Math.min(Math.max(0,c.remaining),1048576);if(o<=0)return!1;try{let a=e().openSync(b,"r");try{let k=Math.max(0,j-h),l=Buffer.alloc(0),m=Buffer.alloc(0),n=!1,p=0;for(;k<i&&p<o;){let b=Math.min(1048576,Math.ceil(o-p),i-k),c=Buffer.alloc(b),d=e().readSync(a,c,0,b,k);if(!d)break;p+=d;let f=Buffer.concat([l,c.subarray(0,d)]);if(m=Buffer.concat([m,c.subarray(0,d)]).subarray(-65536),f.includes(g)){n=!0;break}l=h?c.subarray(Math.max(0,d-h),d):Buffer.alloc(0),k+=d}if(void 0!==c&&Number.isFinite(p)&&(c.remaining-=p),f.scanned[b]=n||k>=i?i:k,f.observations[b]={dev:d.dev,ino:d.ino,size:i,mtimeMs:d.mtimeMs},!n){let a=Buffer.from(m);f.boundaries[b]={offset:f.scanned[b]-a.length,bytes:a.length,fingerprint:A(a)}}return n&&(f.hits[b]=!0),n}finally{e().closeSync(a)}}catch{return!1}}var C=c(23921),D=c(89333);let E=(0,n.E)("sid-slug"),F=(0,n.E)("bgcmd"),G=(0,n.E)("background-index-v1"),H=(0,n.E)("chain-uuid"),I=(0,n.E)("compact-links-v1"),J=(0,n.E)("lineage-store-state-v1"),K="bg-commands.json",L="compact-chains.json";function M(){let a=(0,k.BQ)(K),b=J.get(a);return b||(b={backgroundLoaded:!1,backgroundDirty:!1,compactLoaded:!1,compactDirty:!1},J.set(a,b)),b}function N(a,b){let c=null;try{return e().mkdirSync(h().dirname(a),{recursive:!0,mode:448}),e().chmodSync(h().dirname(a),448),c=h().join(h().dirname(a),`.${h().basename(a)}.${process.pid}.${j().randomUUID()}.tmp`),e().writeFileSync(c,JSON.stringify(b)+"\n",{encoding:"utf8",mode:384}),e().renameSync(c,a),!0}catch{if(c)try{e().unlinkSync(c)}catch{}return!1}}function O(a){for(let b of a){if(!0!==b.derivationComplete||"claude-tasks"!==b.root||!b.parent||!b.cmd&&!b.cmdDesc)continue;let a=(0,r.Y8)(D.GH["claude-tasks"],b.path),c=a?.[2];c&&S(F,c,{command:b.cmd??"",description:b.cmdDesc??"",source:b.parent})}}async function P(a){let b=new Map;await (0,m.pV)(a,a=>{if("claude-projects"!==a.root)return;let c=a.name.split(h().sep);if(2!==c.length)return;let d=c[0]??"";b.set(d,(b.get(d)??[]).concat(a))});let c=(a,b,c)=>{let d=new Map(c.map(a=>[a.path,a])),e=new Set;for(let c=a;c?.parent&&!e.has(c.path);c=d.get(c.parent))if(e.add(c.path),c.parent===b.path)return!0;return!1};await (0,m.pV)([...b.values()],async a=>{let b=[...a].sort((a,b)=>a.mtime-b.mtime);await (0,m.pV)(b,d=>{var f,g;let h=I.get(d.path),i=h?b.find(a=>a.path===h&&a!==d&&!a.parent):void 0;if(i&&!c(d,i,a)){i.parent=d.path;return}let j=function(a,b){let c=H.get(a);if(c&&(null!==c[1]||c[0]>=524288||c[0]>=b))return c[1];let d=null,f=0;try{let c=e().openSync(a,"r");try{let a=Buffer.alloc(Math.min(b,524288));for(let b of(f=e().readSync(c,a,0,a.length,0),a.toString("utf8",0,f).split("\n")))if(b.includes('"compact_boundary"')){d=b.match(/"logicalParentUuid"\s*:\s*"([0-9a-f-]{36})"/)?.[1]??null;break}}finally{e().closeSync(c)}}catch{return null}return H.set(a,[f,d]),d}(d.path,d.size);if(!j)return;let k=b.filter(a=>a!==d&&!a.parent).sort((a,b)=>b.mtime-a.mtime),l="live"===d.activity||"recent"===d.activity,m=k.find(a=>(function(a,b){let c;try{c=e().statSync(b)}catch{return!1}if(w.test(a))return function(a,b,c){let d=a.toLowerCase(),f=v.get(b);if(f?.dev===c.dev&&f.ino===c.ino&&f.size===c.size&&f.mtimeMs===c.mtimeMs){if(f.uuids.has(d))return!0;if(f.complete)return!1;let a=Math.min(c.size,1048576),g=a-Math.min(c.size,131072),h=null;try{h=e().openSync(b,"r");let i=y(h,c.size-a,g);return z(f.uuids,Buffer.concat([i.bytes,f.boundary])),i.complete&&(f.complete=!0,f.boundary=Buffer.alloc(0)),f.uuids.has(d)}catch{return!1}finally{null!==h&&e().closeSync(h)}}let g=new Set,h=Math.min(c.size,131072),i=null;try{i=e().openSync(b,"r");let a=y(i,c.size-h,h);z(g,a.bytes);let f=Math.min(c.size,1048576),j=f-h,k={dev:c.dev,ino:c.ino,size:c.size,mtimeMs:c.mtimeMs,uuids:g,complete:a.complete&&0===j,boundary:Buffer.from(a.bytes.subarray(0,Math.min(a.bytes.length,35)))};if(v.set(b,k),g.has(d)||k.complete)return g.has(d);let l=y(i,c.size-f,j);return z(g,Buffer.concat([l.bytes,k.boundary])),a.complete&&l.complete&&(k.complete=!0,k.boundary=Buffer.alloc(0)),g.has(d)}catch{return!1}finally{null!==i&&e().closeSync(i)}}(a,b,c);let d=`${a}\u0000${b}`,f=u.get(d);if(f?.hit)return!0;if(f?.size===c.size&&f.mtimeMs===c.mtimeMs)return!1;let g=Buffer.from(a),h=Math.min(c.size,131072),i=null;try{i=e().openSync(b,"r");let a=y(i,c.size-h,h);if(a.bytes.includes(g))return u.set(d,{size:c.size,mtimeMs:c.mtimeMs,hit:!0}),!0;let f=a.complete,j=!1,k=Math.min(c.size,1048576),l=k-h;if(l>0){let b=y(i,c.size-k,l);f&&=b.complete,j=Buffer.concat([b.bytes,a.bytes]).includes(g)}return(j||f)&&u.set(d,{size:c.size,mtimeMs:c.mtimeMs,hit:j}),j}catch{return!1}finally{null!==i&&e().closeSync(i)}})(j,a.path));m&&(f=d.path)!==(g=m.path)&&I.get(f)!==g&&(S(I,f,g),M().compactDirty=!0);let n=m??(l?k.find(a=>"live"!==a.activity):void 0);n&&!c(d,n,a)&&(n.parent=d.path)})})}async function Q(a,b,c){let d;try{d=await c(()=>(0,f.readdir)(a,{withFileTypes:!0}))}catch{return[]}return(await Promise.all(d.map(async d=>{let e=h().join(a,d.name);return d.isDirectory()?Q(e,b,c):d.isFile()&&b(e)?[e]:[]}))).flat()}async function R(a,b,c){let d=D.GH["claude-projects"],f=c??E.get(a)??null;if(!f){let c=(await Q(d,b=>h().basename(b)===a+".jsonl",b))[0];if(!c)return[null,[]];f=h().basename(h().dirname(c)),E.set(a,f)}let g=h().join(d,f,a+".jsonl"),i=h().join(d,f,a,"subagents"),j=(await Q(i,a=>h().basename(a).startsWith("agent-")&&a.endsWith(".jsonl"),b)).sort();return[e().existsSync(g)?g:null,j]}function S(a,b,c){for(a.delete(b),a.set(b,c);a.size>2e4;){let b=a.keys().next().value;if(void 0===b)break;a.delete(b)}}function T(a,b){if(b.includes('"tool_use"'))try{let c=JSON.parse(b);for(let b of(0,s.Em)((0,s.xK)(c.message)?.content)){if("tool_use"!==b.type||"string"!=typeof b.id)continue;let c=(0,s.xK)(b.input)??{},d="string"==typeof c.command?c.command:"",e="string"==typeof c.description?c.description:"";(d||e)&&S(a.toolUses,b.id,{command:d,description:e})}}catch{}if(b.includes("background with ID: ")){let c=b.match(/"tool_use_id"\s*:\s*"([^"]+)"/)?.[1];if(c)for(let d of b.matchAll(/background with ID: ([A-Za-z0-9_-]+)/g)){let b=d[1];b&&S(a.taskToolUses,b,c)}}for(let[b,c]of a.taskToolUses){let d=a.toolUses.get(c);d&&(d.command||d.description)&&S(a.commands,b,d)}}let U=(0,k.BQ)("codex-lineage.json"),V=(0,n.E)("codex-lineage"),W=!1,X=!1;function Y(){if(W)return;W=!0;let a=(0,s.Vh)(U);if(a&&"object"==typeof a&&!Array.isArray(a)){for(let[b,c]of Object.entries(a))"string"!=typeof c||V.has(b)||V.set(b,c);V.size!==Object.keys(a).length&&(X=!0)}}function Z(a,b){if(V.get(a)!==b){for(V.set(a,b);V.size>2e4;){let a=V.keys().next().value;if(void 0===a)break;V.delete(a)}X=!0}}function $(){if(X){X=!1;try{e().mkdirSync(h().dirname(U),{recursive:!0}),e().writeFileSync(U,JSON.stringify(Object.fromEntries(V)))}catch{}}}async function _(a,b){Y();let c=new Map;await (0,m.pV)(a,a=>{if("codex-sessions"!==a.root||!a.path.endsWith(".jsonl"))return;let b=(0,p.Gz)(a.path);b&&c.set(b,a.path)}),await (0,m.pV)(a,a=>{if("codex-sessions"!==a.root||a.parent)return;let d=void 0===a.nativeParentThreadId?(0,p.S)(a.path,a.size,1e3*a.mtime):a.nativeParentThreadId,e=d?c.get(d)??null:null;e&&e!==a.path&&(a.parent=e,b&&Z(a.path,e))}),b&&$()}async function aa(a,b){Y();let c=a.filter(a=>"codex-sessions"===a.root&&!a.parent);if(0===c.length)return;let d=new Map;await (0,m.pV)(a,a=>{("claude-projects"===a.root||"codex-sessions"===a.root)&&null!==a.pid&&d.set(a.pid,a.path)}),await (0,m.pV)(c,a=>{let c=null,e=new Set;for(let b=a.pid;null!==b&&!e.has(b)&&(e.add(b),!(e.size>15));b=(0,C.Ib)(b)){let e=d.get(b);if(e&&e!==a.path){c=e;break}}if(c)a.parent=c,b&&Z(a.path,c);else{let b=V.get(a.path);b&&(a.parent=b)}}),b&&$()}async function ab(a,b){let c=new Map(a.map(a=>[a.path,a]));await (0,m.pV)(a,a=>{if(a.parent||"claude-projects"!==a.root&&"codex-sessions"!==a.root||!a.path.endsWith(".jsonl")||a.path.includes(h().sep+"subagents"+h().sep))return;let d=(0,l._b)(a.path);if(!d&&null!==a.pid){let c=new Set;for(let b=a.pid;null!==b&&!c.has(b)&&(c.add(b),!(c.size>15||(d=(0,l.N0)(b))));b=(0,C.Ib)(b));b&&d&&d!==a.path&&(0,l.A6)(a.path,d)}d&&d!==a.path&&c.has(d)&&(a.parent=d,a.handoff=!0)}),b&&(0,l.OA)()}async function ac(a,b={}){let c,d,f=!1!==b.persist;!function(){let a=M();if(a.backgroundLoaded)return;a.backgroundLoaded=!0;let b=(0,s.Vh)((0,k.BQ)(K));if(b?.version!==1)return;let c=(0,s.xK)(b.commands);if(c)for(let[a,b]of Object.entries(c)){let c=(0,s.xK)(b);c&&"string"==typeof c.command&&"string"==typeof c.description&&"string"==typeof c.source&&(c.command||c.description)&&(F.has(a)||S(F,a,{command:c.command,description:c.description,source:c.source}))}}(),function(){let a=M();if(a.compactLoaded)return;a.compactLoaded=!0;let b=(0,s.Vh)((0,k.BQ)(L));if(b?.version!==1)return;let c=(0,s.xK)(b.links);if(c)for(let[a,b]of Object.entries(c))"string"!=typeof b||b===a||I.has(a)||S(I,a,b)}();let g=(c=0,d=[],async function(a){c>=48&&await new Promise(a=>d.push(a)),c+=1;try{return await a()}finally{c-=1,d.shift()?.()}}),i={remaining:262144},j={remaining:262144},l=new Map(a.map(a=>[a.path,a])),n=new Map;await (0,m.pV)(a,a=>{if("claude-tasks"!==a.root)return;let b=(0,r.Y8)(D.GH["claude-tasks"],a.path);b&&n.set(a,b)});let p=n.size;if(await (0,m.pV)(a,async a=>{if("claude-projects"===a.root){let b=(0,o.Zg)(a.name);if(b){let[c,d]=await R(b.parentSessionId,g,b.slug);a.parent=c;let e=(0,s.Vh)(a.path.slice(0,-6)+".meta.json")??{},f=(0,s.r$)(e.toolUseId),h=Number(e.spawnDepth??0);if(f&&h>=1){let b=function(a,b,c){if(void 0===c){for(let c of b)if(c&&B(a,c))return c;return null}let d=b.reduce((a,b)=>a+ +!!b,0);for(let e of b){if(!e)continue;let b=Math.ceil(Math.max(0,c.remaining)/d),f={remaining:b},g=B(a,e,f);if(Number.isFinite(b)&&(c.remaining=Math.max(0,c.remaining-(b-f.remaining))),d-=1,g)return e}return null}(f,d.filter(b=>b!==a.path).concat(c?[c]:[]),j);b&&(a.parent=b)}}}else if("claude-tasks"===a.root){let b=n.get(a);if(!b)return;let[c,d,f]=b,[j,k]=await R(d,g,c),l=Math.ceil(i.remaining/p),m={remaining:l},o=function(a,b,c,d){let f=F.get(a);if(f)return f;let g=null;for(let f of new Set([...b,...c])){if(!f)continue;let b=function(a,b,c){let d;try{d=e().statSync(b)}catch{return null}let f=G.get(b);if(!f||d.size<f.size||d.size===f.size&&d.mtimeMs!==f.mtimeMs){var g;f={size:g=d.size,mtimeMs:d.mtimeMs,offset:0,carry:Buffer.alloc(0),toolUses:new Map,taskToolUses:new Map,commands:new Map,complete:0===g},G.set(b,f)}else f.size=d.size,f.mtimeMs=d.mtimeMs,f.complete=f.offset>=d.size;let h=f.commands.get(a);if(h)return{...h,source:b};if(!f.complete&&c.remaining>0){let g=null;try{for(g=e().openSync(b,"r");f.offset<d.size&&c.remaining>0&&!f.commands.has(a);){let a=Math.min(65536,c.remaining,d.size-f.offset),b=Buffer.allocUnsafe(a),h=e().readSync(g,b,0,a,f.offset);if(0===h)break;f.offset+=h,c.remaining-=h,function(a,b){let c=a.carry.length?Buffer.concat([a.carry,b]):b,d=0;for(let b=c.indexOf(10,d);b>=0;b=c.indexOf(10,d))T(a,c.toString("utf8",d,b)),d=b+1;a.carry=d<c.length?Buffer.from(c.subarray(d)):Buffer.alloc(0)}(f,h===b.length?b:Buffer.from(b.subarray(0,h)))}f.complete=f.offset>=d.size,f.complete&&f.carry.length>0&&T(f,f.carry.toString("utf8"))}catch{}finally{null!==g&&e().closeSync(g)}}let i=f.commands.get(a);return i?{...i,source:b}:f.taskToolUses.has(a)?{command:"",description:"",source:b}:null}(a,f,d);if(b){if(b.command||b.description)return(F.get(a)?.command!==b.command||F.get(a)?.description!==b.description||F.get(a)?.source!==b.source)&&(S(F,a,b),M().backgroundDirty=!0),b;g??=b}}return g}(f,(j?[j]:[]).concat(k),function(a,b){let c,d=h().join(D.GH["claude-projects"],a);try{c=e().readdirSync(d,{withFileTypes:!0})}catch{return[]}let f=[];for(let a of c){if(!a.isFile()||!a.name.endsWith(".jsonl")||a.name===b+".jsonl")continue;let c=h().join(d,a.name);try{let a=e().statSync(c);if(a.size>0x4000000)continue;f.push({pathname:c,mtime:a.mtimeMs})}catch{continue}}return f.sort((a,b)=>b.mtime-a.mtime).slice(0,8).map(a=>a.pathname)}(c,d),m);if(i.remaining-=l-m.remaining,p-=1,o){a.parent=o.source,a.cmd=o.command,a.cmdDesc=o.description;let b=o.description||o.command;b&&(a.title=b.split(/\s+/).join(" ").slice(0,120))}else a.parent=j,a.title="Background task "+f,a.cmd="",a.cmdDesc=""}}),await _(a,f),await aa(a,f),await ab(a,f),await P(a),await (0,m.pV)(a,a=>{a.parent&&l.has(a.parent)?a.project=(a=>{let b=new Set,c=a;for(;!b.has(c.path);){b.add(c.path);let a=l.get(c.parent??"");if(!a)return c.project;c=a}return a.project})(a):a.parent=null}),f){let a;!function(){let a=M();if(!a.backgroundDirty)return;let b=Object.fromEntries([...F].filter(([,a])=>a.command||a.description));N((0,k.BQ)(K),{version:1,commands:b})&&(a.backgroundDirty=!1)}(),(a=M()).compactDirty&&N((0,k.BQ)(L),{version:1,links:Object.fromEntries(I)})&&(a.compactDirty=!1),(0,q.Oc)()}}},45450:(a,b,c)=>{c.d(b,{M:()=>i,QX:()=>h,fM:()=>g,ne:()=>d});let d="2026-07-10",e={"fable-5":{standard:1e6},"mythos-5":{standard:1e6},"mythos-preview":{standard:1e6},"opus-4-8":{standard:1e6},"opus-4-7":{standard:1e6},"opus-4-6":{standard:1e6},"sonnet-5":{standard:1e6},"sonnet-4-6":{standard:1e6},"haiku-4-5":{standard:2e5},"opus-4-5":{standard:2e5},"opus-4-1":{standard:2e5},"sonnet-4-5":{standard:2e5,extended:1e6},"sonnet-4-0":{standard:2e5,extended:1e6}},f={fable:"fable-5",opus:"opus-4-8",sonnet:"sonnet-5",haiku:"haiku-4-5"};function g(a){return f[a]??a}function h(a){let b=a.toLowerCase().trim();if(!b||"<synthetic>"===b)return null;let c=/\[1m\]$/.test(b);return(c&&(b=b.replace(/\[1m\]$/,"")),b=(b=(b=(b=(b=b.replace(/^(?:us\.|eu\.)?anthropic\./,"")).replace(/@20\d{6}$/,"")).replace(/-v\d+(?::\d+)?$/,"")).replace(/-20\d{6}$/,"")).replace(/^claude-/,""))?{key:b,mode:c?"1m":"standard"}:null}function i(a,b){let c=e[a];return c?"1m"===b?c.extended??1e6:c.standard:null}},45656:(a,b,c)=>{c.d(b,{X3:()=>K,eK:()=>Y,jJ:()=>L,reconcileStructuredSpawnReplay:()=>V,sh:()=>ae});var d=c(73024),e=c.n(d),f=c(48161),g=c.n(f),h=c(76760),i=c.n(h);c(86850);var j=c(78966),k=c(5602),l=c(14509),m=c(48892),n=c(4012),o=c(16089),p=c(91724);c(26474);var q=c(57563),r=c(77308),s=c(58996),t=c(59683),u=c(64253),v=c(74127);c(27471);var w=c(56809),x=c(25953),y=c(52649),z=c(3127),A=c(50201),B=c(83336),C=c(84567),D=c(63629),E=c(98223),F=c(73789),G=c(2592),H=c(32372);c(68512);var I=c(41022);let J="llv-read-only-stage";function K(a,b){let c="uk"===a?r.uk["spawnCard.pinUnavailableQueued"]:q.en["spawnCard.pinUnavailableQueued"];return("string"==typeof c?c:q.en["spawnCard.pinUnavailableQueued"]).replace("{retryAt}",b)}async function L(a,b){return"codex"===a?{kind:"admissible",basis:"current",stale:!1,retryAt:null}:(0,k.Kw)(await (0,s.nn)(i().join(b.home,".credentials.json"),Date.now,600))}async function M(a,b={}){let c,d=b.attempts??3,e=b.sleep??(a=>new Promise(b=>setTimeout(b,a)));for(let b=1;b<=d;b+=1)try{return await a()}catch(a){if(!(0,z.o7)(a))throw a;c=a,b<d&&await e(250*b)}throw c}let N=new Set(["delivered","turn-started","steered"]),O=new Set(["failed","rejected","uncertain","interrupted"]);class P extends Error{constructor(a){super(a),this.name="StructuredInitialMessageTimeoutError"}}async function Q(a){if(a.pid===process.pid||null===a.startIdentity)return!1;let b=()=>t.B.processIdentity(a.pid)===a.startIdentity;if(!b())return!0;for(let c of["SIGTERM","SIGKILL"]){if(!(0,u.v)(a.pid,c))try{process.kill(a.pid,c)}catch{break}for(let a=0;a<20;a+=1){if(!b())return!0;a+1<20&&await new Promise(a=>setTimeout(a,25))}}return!b()}function R(a){if((0,z.o7)(a))return(0,A.lN)("structured spawn runtime host");let b=a instanceof Error?a.message:"structured spawn failed";return(0,w.j)(b).replace(/\s+/g," ").trim().slice(0,240)||"structured spawn failed"}function S(a,b){let c=a?.receipt.status;return c&&O.has(c)?a.receipt.reason??`${b} ended as ${c}`:null}async function T(a,b,c={}){let d,e=c.now??Date.now,f=c.sleep??(a=>new Promise(b=>setTimeout(b,a))),g=c.timeoutMs??3e4,h=c.pollMs??250,i=e()+g,j=null;for(;;){let c=null;try{c=await a.operationStatus(b,{currentRetryLeaf:!0}),d=c?.receipt.status??d,j=null}catch(a){j=a instanceof Error?a.message:"runtime status read failed"}let k=c?.receipt.status??d;if(k&&N.has(k))return;if(k&&O.has(k))throw Error(c?.receipt.reason??`structured initial message ended as ${k}`);if(e()>=i){if(j)throw new P(`structured initial message status remained unavailable for ${g}ms: ${j}`);throw new P(`structured initial message remained ${k??"pending"} for ${g}ms`)}await f(Math.min(h,i-e()))}}async function U(a,b){let c=0;for(;;){let d=await a.effectBatch(["runtime.spawn"],c);for(let a of d)if(a.payload.operationId===b)return a.payload;if(d.length<100)return null;let e=Math.max(...d.map(a=>a.eventSeq));if(!Number.isSafeInteger(e)||e<=c)throw Error("structured spawn replay effect page did not advance");c=e}}async function V(a,b,c,d={}){let e=b.readOnlySnapshot().receipts[a];if(!e)throw Error("unknown spawn receipt");if("completed"===e.state)return{...e,initialMessage:"delivered"};if("conflicted"===e.state)return{...e,initialMessage:"failed"};let[f,g,h]=await Promise.all([c.operationStatus(`spawn_message_${a}`,{currentRetryLeaf:!0}).catch(()=>null),c.operationStatus(a,{currentRetryLeaf:!0}).catch(()=>null),c.snapshot().catch(()=>null)]),i=f,j=!1;if(!i&&"path-pending"===e.state&&e.artifactPath){let d=await U(c,a).catch(()=>(j=!0,null)),f="string"==typeof d?.prompt?d.prompt:null,g=(0,I.kW)(d?.images??[],16);if(null!==f&&null!==g&&d?.conversationId===e.conversationId&&d.cwd===e.cwd&&(f.trim()||g.length)){let d=aa(e,b),h=await (0,G.enqueueStructuredMessage)({path:e.artifactPath,conversationId:e.conversationId,clientMessageId:`spawn_${a}`,operationId:`spawn_message_${a}`,text:f,imageRefs:g,...d?{origin:d}:{}},{client:()=>c,registry:()=>b,enabled:()=>!0});h?.ok&&"held"!==h.outcome&&(i=await c.operationStatus(`spawn_message_${a}`,{currentRetryLeaf:!0}).catch(()=>null))}}let k=!!(i&&i.receipt.conversationId===e.conversationId&&N.has(i.receipt.status)),l=!!(e.artifactPath&&(0,v.x_)(e.artifactPath,e.engine));if(k||l){let c=h?.sessions.find(a=>a.conversationId===e.conversationId),d=c&&c.sessionKey.engine===e.engine&&c.cwd===e.cwd&&"string"==typeof c.artifactPath?c:null,f=d?{key:d.sessionKey,artifactPath:d.artifactPath,cwd:e.cwd,accountId:e.accountId,launchProfile:e.launchProfile,status:"dead"===d.host||"unhosted"===d.host?"dead":"running"===d.turn?"live":"idle",host:null,structuredHost:"codex-app-server"===d.hostKind||"claude-broker"===d.hostKind?{kind:d.hostKind,endpoint:"runtime:reconciled",process:null,eventCursor:d.revision,protocolVersion:null,writerClaimEpoch:0,activeTurnRef:d.activeTurnId,pendingAttention:d.attentionIds,activeFlags:[]}:null,claimEpoch:0,claimOwner:null,pendingAction:null}:void 0,g=b.recoverStructuredSpawnFromEvidence(a,f);if("settled"===g.kind)return{...g.receipt,initialMessage:"delivered"}}let n=i?.receipt.status,o=h?.sessions.find(a=>a.conversationId===e.conversationId&&a.cwd===e.cwd&&(!e.key||(0,m.pp)(a.sessionKey)===(0,m.pp)(e.key)))??null,p=o&&("registering"===o.host||"hosted"===o.host||"recovering"===o.host)?o:null,q=i?Date.parse(i.receipt.at):NaN,r=Number.isFinite(q)?q:Date.parse(e.createdAt),s=(d.now??Date.now)()-r,t=null!==h&&g?.receipt.conversationId===e.conversationId&&"delivered"===g.receipt.status&&null===p,u=d.timeoutMs??(t?3e4:3e5),w=S(i,"structured initial message")??S(g,"structured spawn");if(!w&&s>=u&&(w=p?`structured spawn durable setup remained incomplete for ${u}ms`:j?`structured spawn runtime effect history remained unavailable for ${u}ms`:h?`structured spawn runtime snapshot has no session after ${u}ms`:`structured spawn durable setup remained unconfirmed for ${u}ms`),w){w=w.slice(0,240);let f=b.failStructuredSpawn(a,w);if(!f.claimed){let c=f.receipt??b.readOnlySnapshot().receipts[a]??e;return{...c,initialMessage:"completed"===c.state?"delivered":"failed"}}let h=g?.receipt.status;if("pending"===h||"queued"===h||"delivering"===h)try{await c.transitionOperation(a,"failed",{reason:w})}catch(b){console.error("[spawn] runtime operation failure did not settle during reconciliation",{launchId:a,error:R(b)})}let i=f.cleanup;if(i){let c=!1,e=b.readOnlySnapshot().entries[(0,m.pp)(i.key)];if(i.releaseRegisteredHost&&e?.structuredHostOperationId===a)try{c=await (d.releaseHost??F.releaseStructuredDeliveryHost)(i.key)}catch(b){console.error("[spawn] registered host release failed during reconciliation",{launchId:a,error:R(b)})}if(!c&&i.process){let c=b.readOnlySnapshot().entries[(0,m.pp)(i.key)];if(i.releaseRegisteredHost?c?.structuredHostOperationId===a:c?.structuredHostOperationId==null&&c.artifactPath===f.receipt?.artifactPath&&"dead"===c.status&&null===c.claimOwner)try{await (d.terminateHostProcess??Q)(i.process)||i.process.pid===process.pid||console.error("[spawn] staged host termination remained unconfirmed",{launchId:a,pid:i.process.pid})}catch(b){console.error("[spawn] staged host termination failed during reconciliation",{launchId:a,error:R(b)})}}}return{...b.readOnlySnapshot().receipts[a]??e,initialMessage:"failed"}}let x=b.readOnlySnapshot().receipts[a]??e;return{...x,initialMessage:"failed"===x.state||void 0!==n&&O.has(n)?"failed":k||"completed"===x.state?"delivered":"queued"===n||"pending"===n||"delivering"===n?"queued":"pending"}}async function W(a,b,c,d,e){let f=e?.key??b.key,g=e?.artifactPath??b.artifactPath;f&&g&&await a.append({scope:{type:"session",id:b.conversationId},kind:"session-status",producer:{kind:"codex"===f.engine?"codex-app-server":"claude-broker",eventKey:d},payload:{conversationId:b.conversationId,sessionKey:f,hostKind:"codex"===f.engine?"codex-app-server":"claude-broker",host:"dead",turn:"idle",provenance:"structured",accountId:c.accountId,parentConversationId:b.parentConversationId,cwd:c.cwd,artifactPath:g,capabilities:{steer:"codex"===f.engine,structuredAttention:!0,imageInput:(0,H.ki)(f.engine,!1),runtimeSettings:(0,D.wL)(f.engine)},activeTurnId:null}})}function X(a,b){if("resume-successor"!==b.purpose)return null;let c=a.conversation(b.conversationId),d=c?.generations.find(a=>a.path===b.resumeSourcePath)??c?.generations.at(-1);return d?{key:{engine:b.engine,sessionId:d.id},artifactPath:d.path}:null}function Y(a,b){return a&&("bypassPermissions"!==a||!b.agentInitiated||b.operatorAuthenticated||b.roleSpawn)?a:"default"}async function Z(a,b){let c=a.spec.launchProfile??{},d=$(a),f=d?a.registry.readOnlySnapshot().entries[(0,m.pp)({engine:a.engine,sessionId:d})]?.structuredHost?.eventCursor:void 0;if(void 0!==f&&(!Number.isSafeInteger(f)||f<0))throw Error("structured resume event cursor is invalid");let h=function(a,b,c){let d={...b,...c?{LLV_SPAWN_CAPABILITY:c}:{}};if(!a)return{env:d,codex:{sandbox:"danger-full-access"},host:{},scratchDirectory:null,cleanup:()=>{}};let f=(void 0)??(0,p.BQ)("scratch");e().mkdirSync(f,{recursive:!0,mode:448});let h=e().mkdtempSync(i().join(f,"llv-read-only-stage-"));try{e().chmodSync(h,448);let a=i().join(h,"tmp");e().mkdirSync(a,{mode:448});let c=`permissions.${J}={extends=":read-only",filesystem={${JSON.stringify(h)}="write"}}`,f=()=>e().rmSync(h,{recursive:!0,force:!0});return{env:{...d,TMPDIR:a,GH_CONFIG_DIR:function(a){if(a.GH_CONFIG_DIR)return a.GH_CONFIG_DIR;let b=a.HOME||g().homedir();return i().join(a.XDG_CONFIG_HOME||i().join(b,".config"),"gh")}(b)},codex:{permissionProfile:J,permissionProfileConfig:c},host:{forwardGitHubConfig:!0,releaseCleanup:f},scratchDirectory:h,cleanup:f}}catch(a){throw e().rmSync(h,{recursive:!0,force:!0}),a}}(!0===c.readOnly,a.account.env,b),k=h.env;if("codex"===a.engine){let b={cwd:a.spec.cwd,codexHome:a.account.home,fileAuthCredentials:"managed"===a.account.kind,model:c.model??void 0,effort:c.effort??void 0,allowSubagents:c.allowSubagents,mcpServers:c.mcpServers,plugins:c.plugins,...h.codex,...h.host,approvalPolicy:c.permissionMode??void 0,initialEventCursor:f,env:k};return d?await y.o.adopt(d,b):await y.o.start(b)}let n=function(a,b=e().existsSync){let c=X(a.registry,a.receipt);return c&&function(a,b=e().existsSync){return!!a.artifactPath&&b(a.artifactPath)}(c,b)?{kind:"resume",sessionId:c.key.sessionId}:{kind:"fresh",sessionId:c?.key.sessionId??(a.spec.transcript?i().basename(a.spec.transcript,".jsonl"):void 0)}}(a),o={cwd:a.spec.cwd,claudeConfigDir:a.account.home,claudeProjectsDir:a.account.transcriptRoot,spawnPolicyBaseSettingsPath:function(a,b=j.ZK){return"managed"===a.kind?b():null}(a.account),allowSubagents:c.allowSubagents,mcpServers:c.mcpServers,mcpStatePath:"managed"===a.account.kind?i().join(a.account.home,".claude.json"):i().join(i().dirname(a.account.home),".claude.json"),readOnly:!0===c.readOnly,model:c.model??void 0,effort:c.effort??void 0,permissionMode:(0,l.A5)(c),initialEventCursor:f,env:k,...h.host};return"resume"===n.kind?await x.s7.adopt(n.sessionId,o):await x.s7.start({...o,...n.sessionId?{sessionId:n.sessionId}:{}})}function $(a){return X(a.registry,a.receipt)?.key.sessionId??null}async function _(a,b,c,d,e,f="unhosted"){return"codex"===b.engine?await (0,E.WF)(a,b,c,d,e,f):await (0,E.n$)(a,b,c,d,e,f)}function aa(a,b){if(0===a.delegationDepth)return{kind:"operator"};if(null===a.delegationDepth||void 0===a.delegationDepth)return;let c=a.parentConversationId?b.conversation(a.parentConversationId):null,d=(0,C.S)(c?.agentRole??void 0);return{kind:"agent",...d?{role:d}:{}}}async function ab(a,b){if(!a.prompt.trim()&&!a.imageRefs?.length)return;let c=aa(a.receipt,a.registry),d=await (0,G.enqueueStructuredMessage)({path:b,conversationId:a.receipt.conversationId,clientMessageId:`spawn_${a.receipt.launchId}`,operationId:`spawn_message_${a.receipt.launchId}`,text:a.prompt,imageRefs:a.imageRefs,...c?{origin:c}:{}},{client:()=>a.client,registry:()=>a.registry,enabled:()=>!0});if(!d?.ok){let a=d?.error??"structured spawn first-message delivery was unavailable";if(d?.transportUncertain)throw new P(a);throw Error(a)}if("held"===d.outcome)return"held";if("delivered"!==d.outcome){var e,f;let b,c;await T(a.client,d.operationId),e=a.registry,f=a.receipt.launchId,b=`spawn_${f}`,(c=Object.values(e.readOnlySnapshot().heldDeliveries).find(a=>a.clientMessageId===b))&&"delivered"!==c.state&&e.recordDeliveryOutcome(c.id,"delivered")}}async function ac(a){let b;if(!a)return null;try{b=await a.health()}catch{return null}return"dead"!==b.status?null:a.terminalExitReason?.()??"structured spawn host exited before its first message"}async function ad(a,b){await a?.release();let c=null;try{await b.unregister()}catch(a){c=a}if(b.stopPersistence(),c)throw c}async function ae(a,b={}){var c,d,e,f,g;let h=b.startHost??Z,i=b.bindHost??_,j=b.publishHost??((a,b,c)=>(0,F.xq)({key:a,host:b},c)),k=b.deliverFirst??ab,l=b.processIdentity??(()=>({pid:process.pid,startIdentity:t.B.processIdentity(process.pid)})),p=a.receipt.launchId,q=$(a),r=q?(0,m.ce)(a.engine,q):null,s=X(a.registry,a.receipt),u=null,v={stopPersistence:()=>{},unregister:async()=>{}},w=null,x=null,y=!1,z=!1,A=!1,C=null,D=null,E=()=>{null!==C&&clearTimeout(C),C=null,D=null},G=a=>D?Promise.race([a,D]):a;try{let e;"claude"===a.engine&&"managed"===a.account.kind&&(0,n.prepareManagedClaudeSpawnHome)(a.account.home,a.spec.cwd);let f=a.imageRefs??[],g=a.prompt.trim()||f.length?(0,I.rM)(a.prompt,f):null;await M(()=>a.client.command({kind:"spawn",operationId:p,idempotencyKey:p,conversationId:a.receipt.conversationId,engine:a.engine,cwd:a.spec.cwd,prompt:g?.content.text??"",...g?.content.images.length?{images:g.content.images}:{},...g?{contentDigest:g.contentDigest}:{},accountId:a.account.accountId,parentConversationId:a.receipt.parentConversationId,..."resume-successor"===a.receipt.purpose?{sessionId:$(a)}:{}}));let q=a.registry.rotateSpawnCapabilityForReceipt(a.receipt.launchId),s=r?a.registry.readOnlySnapshot().entries[(0,m.pp)(r)]:null;if(s?.structuredHost&&(x=a.registry.claimStructuredHost(r,l(),{allowUnhosted:!0}),!x?.claimOwner))throw z=!0,Error("structured resume host claim is unavailable");let t=b.durableSetupTimeoutMs??3e5;D=new Promise((a,b)=>{C=setTimeout(()=>{A=!0,b(Error(`structured spawn durable host setup timed out after ${t}ms`))},t),C.unref?.()});let B=h(a,q);B.then(async b=>{if(A)try{await b.release()}catch(b){console.error("[spawn] late structured host could not be released after setup timeout",{launchId:a.receipt.launchId,error:R(b)})}},()=>{}),u=await G(B);let F=function(a,b,c){if("codex"===a){let a=b.identity;if(!a.threadId)throw Error("structured Codex spawn returned no thread identity");if(!a.path)throw Error("structured Codex spawn feature gap: app-server returned no transcript path");let c=(0,m.ce)("codex",a.threadId);if(!c)throw Error("structured Codex spawn returned an invalid thread identity");return{key:c,path:a.path}}let d=b.identity;if(!d.sessionId)throw Error("structured Claude spawn returned no session identity");let e=(0,m.ce)("claude",d.sessionId);if(!e)throw Error("structured Claude spawn returned an invalid session identity");return{key:e,path:c.spec.transcript??(0,o.eV)(c.spec.cwd,d.sessionId,c.account.transcriptRoot)}}(a.engine,u,a);if(w=F.key,r&&(0,m.pp)(w)!==(0,m.pp)(r))throw Error("structured resume returned a different session identity");let H=x?.claimEpoch??0,J=x?.claimOwner??null,K=a.registry.stageStructuredSpawn(a.receipt.launchId,{key:w,artifactPath:F.path,cwd:a.spec.cwd,accountId:a.account.accountId,launchProfile:a.spec.launchProfile,status:"unhosted",host:null,structuredHost:function(a,b=0,c=0){return{kind:"codex"===a?"codex-app-server":"claude-broker",endpoint:"stdio:pending",process:null,eventCursor:b,protocolVersion:null,writerClaimEpoch:c,activeTurnRef:null,pendingAttention:[],activeFlags:[]}}(a.engine,x?.structuredHost?.eventCursor??0,H),claimEpoch:H,claimOwner:J,pendingAction:"spawn"});if("conflict"===K.kind)throw Error(`structured spawn registry conflict: ${K.code}`);let L=x?K.entry:a.registry.claimStructuredHost(w,l(),{allowUnhosted:!0});if(!L?.claimOwner)throw Error("structured spawn host claim is unavailable");y=null!==x,v.stopPersistence=await G(i(a.registry,w,u,L.claimOwner,L.claimEpoch));let N=async()=>{if(A)return!1;let b=a.registry.readOnlySnapshot(),c=b.receipts[a.receipt.launchId],d=b.entries[(0,m.pp)(w)];return!!(c&&"completed"!==c.state&&"failed"!==c.state&&"conflicted"!==c.state&&d?.structuredHostOperationId===a.receipt.launchId)};v.unregister=await G(j(w,u,N));try{e=await G(k(a,F.path))}catch(g){let b;if(!(g instanceof P))throw g;let f=await ac(u);if(f)throw Error(f);c=a.registry,d=a.receipt.launchId,(b=Object.values(c.readOnlySnapshot().heldDeliveries).find(a=>a.clientMessageId===`spawn_${d}`))&&"delivered"!==b.state&&c.recordDeliveryOutcome(b.id,"delivery-uncertain",g.message),e="held"}if("held"===e)return E(),a.registry.releaseStructuredSpawnAdmissionOwner(a.receipt.launchId,a.receipt.admissionOwner??l()),{ok:!0,target:null,path:F.path,..."claude"===a.engine?{effectivePermissionMode:a.spec.launchProfile?.permissionMode??"default"}:{},launchId:a.receipt.launchId,conversationId:a.receipt.conversationId,launched:!0,retrySafe:!1,initialMessage:"queued",state:"path-pending",transport:"structured"};await G(M(()=>a.client.transitionOperation(p,"delivered")));let O=a.registry.finalizeStructuredSpawn(a.receipt.launchId);if("conflict"===O.kind)throw Error(`structured spawn registry conflict: ${O.code}`);return E(),{ok:!0,target:null,path:F.path,..."claude"===a.engine?{effectivePermissionMode:a.spec.launchProfile?.permissionMode??"default"}:{},launchId:a.receipt.launchId,conversationId:O.conversation.id,launched:!0,retrySafe:!1,initialMessage:"delivered",state:"settled",transport:"structured"}}catch(k){E();let b=R(k);await a.client.transitionOperation(p,"failed",{reason:b}).catch(()=>{}),!u&&k instanceof B.EY&&(u=k.host,r&&x?.claimOwner&&(w=r,v.stopPersistence=await i(a.registry,r,u,x.claimOwner,x.claimEpoch,"dead")));try{await ad(u,v)}catch{throw k}let c=null,d=s;if(w){let b=a.registry.readOnlySnapshot().entries[(0,m.pp)(w)];b&&(c=b,d={key:w,artifactPath:b.artifactPath})}else s&&(c=a.registry.readOnlySnapshot().entries[(0,m.pp)(s.key)]??null);"string"==typeof c?.structuredHostOperationId&&c.structuredHostOperationId!==a.receipt.launchId&&(d=null);let h=!0;if(d&&!z)try{await W(a.client,a.receipt,c??{accountId:a.account.accountId,cwd:a.spec.cwd},`structured-spawn-failed:${a.receipt.launchId}`,d)}catch{h=!1}!x||y&&h||(e=a.registry,f=x,g=h,f.claimOwner&&f.structuredHost&&(g&&e.setStructuredHostClaimed(f.key,{...f.structuredHost,endpoint:"stdio:released",process:null,activeTurnRef:null,pendingAttention:[],activeFlags:[]},"dead",f.claimOwner,f.claimEpoch,!0)||e.releaseStructuredHostClaim(f.key,f.claimOwner,f.claimEpoch)));let j="launch"===a.receipt.purpose;throw(h||j)&&(w?a.registry.failStructuredSpawn(a.receipt.launchId,b):a.registry.failSpawn(a.receipt.launchId,b)),k}}},50201:(a,b,c)=>{c.d(b,{Ee:()=>j,S0:()=>k,Zn:()=>i,_l:()=>d,cM:()=>g,ji:()=>h,lN:()=>e});let d="runtime-plane-absent";function e(a){return`${a} is unavailable; start agent-log-viewer through its CLI and check the CLI log for the host startup failure`}function f(a){if(void 0===a)return!1;switch(a.trim().replace(/^(["'])([\s\S]*)\1$/,"$2").trim().toLowerCase()){case"0":case"false":case"off":case"no":return!0;default:return!1}}function g(a=process.env){return!f(a.LLV_STRUCTURED_HOSTS)}function h(a=process.env){return f(a.LLV_RUNTIME_EVENTS)}function i(a=process.env){return!h(a)&&!!k(a)}function j(a=process.env){return!f(a.NEXT_PUBLIC_RUNTIME_UI)}function k(a=process.env){return a.LLV_RUNTIME_HOST_SOCKET?.trim()||null}},51906:(a,b,c)=>{c.d(b,{IL:()=>H,OZ:()=>J,P1:()=>E,T:()=>I,gn:()=>F});var d=c(31421),e=c(77598),f=c.n(e),g=c(73024),h=c.n(g),i=c(76760),j=c.n(i),k=c(14509),l=c(78966),m=c(16089),n=c(4012),o=c(77149),p=c(59683),q=c(92806),r=c(98590);let s=new Map;function t(a,b){let c=(0,q.Fd)(a);return delete c.LLV_TOKEN,b&&(c.LLV_SPAWN_CAPABILITY=b),c}function u(a,b){return`${a}:${b}`}function v(a){if(!a||!Number.isInteger(a)||a<=0)return!1;try{return process.kill(a,0),!0}catch{return!1}}let w={pidAlive:v,processIdentity:a=>p.B.processIdentity(a),signalProcess:(a,b)=>{process.kill(a,b)},setTimeout:(a,b)=>setTimeout(a,b)},x={...w,processGroupAlive:a=>{try{return process.kill(-a,0),!0}catch{return!1}},wait:async a=>await new Promise(b=>setTimeout(b,a))};function y(a,b,c={}){let d={...w,...c.runtime};if(!(!0===c.ownedByLiveHandle||b&&d.pidAlive(a)&&d.processIdentity(a)===b))return;try{d.signalProcess(-a,"SIGTERM")}catch{if(!c.leaderExited)try{(c.fallbackLeader??(b=>d.signalProcess(a,b)))("SIGTERM")}catch{}}let e=d.setTimeout(()=>{try{d.signalProcess(-a,"SIGKILL")}catch{}},c.graceMs??3e3);e.unref?.()}async function z(a,b,c={}){let d={...x,...c.runtime};if(!(!0===c.ownedByLiveHandle||b&&d.pidAlive(a)&&d.processIdentity(a)===b))return!d.processGroupAlive(a);let e=b=>{try{d.signalProcess(-a,b)}catch{if(!c.leaderExited)try{(c.fallbackLeader??(b=>d.signalProcess(a,b)))(b)}catch{}}},f=async b=>{let e=Math.max(1,c.pollMs??25),f=Math.max(1,Math.ceil(b/e));for(let b=0;b<f;b+=1){if(!d.processGroupAlive(a))return!0;await d.wait(e)}return!d.processGroupAlive(a)};return e("SIGTERM"),!!await f(c.graceMs??3e3)||(e("SIGKILL"),await f(c.killWaitMs??1e3))}function A(a,b,c=3e3){y(a,b,{graceMs:c})}function B(a){let b=a.child.pid;b&&!a.terminationStarted&&(a.terminationStarted=!0,y(b,null,{ownedByLiveHandle:!0,leaderExited:null!==a.exit,fallbackLeader:b=>{a.child.kill(b)}}))}let C=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,D=new Set(["session_id","sessionId","thread_id","threadId","rollout_id"]);function E(a,b,c,e,g,i=18e5,v,w,x,y){let z,A=u(a,b);if(s.has(A))return{pid:null,identity:null,sessionId:null,reviewerPath:null};let C=(0,r.WJ)(a,b);h().mkdirSync(j().dirname(C),{recursive:!0}),F(a,b);let D=function(a,b,c,d,e,g,h){if("claude"===a.engine){let c=f().randomUUID(),e=["-p",b,"--dangerously-skip-permissions","--session-id",c];a.model&&e.push("--model",a.model),a.effort&&e.push("--effort",a.effort);let i=g?(0,n.applyClaudeSpawnPolicy)(g.home,{baseSettingsPath:g.managed?(0,l.ZK)():null,profileId:`headless-${c}`}).settingsPath:null;i&&e.push("--settings",i);let j=g?.managed?(0,l.x0)(g.home):process.env;return{command:(0,k.uX)("claude"),args:e,env:t(j,h),stdin:null,outputPath:null,sessionId:c,reviewerPath:(0,m.eV)(d,c,g?.projectsDir)}}let i=["--disable","multi_agent","exec","--ignore-user-config","-","--json","--output-last-message",c,"--dangerously-bypass-approvals-and-sandbox"];return e?.managed&&i.unshift("-c","cli_auth_credentials_store=file"),a.model&&i.push("-m",a.model),a.effort&&i.push("-c",`model_reasoning_effort=${a.effort}`),{command:(0,k.uX)("codex"),args:i,env:t(e?.home?{...(0,q.Fd)(process.env),CODEX_HOME:e.home}:process.env,h),stdin:(0,n.fenceViewerSpawnPrompt)("codex",b),outputPath:c,sessionId:null,reviewerPath:null}}(c,g,C,e,v,w,y),G=h().openSync((0,r.Ml)(a,b),"w"),H=h().openSync((0,r.NO)(a,b),"w");try{z=(0,d.spawn)(x?.command??D.command,D.args,{cwd:e,env:D.env,detached:!0,stdio:[null===D.stdin?"ignore":"pipe",G,H]}),null!==D.stdin&&z.stdin&&(z.stdin.on("error",()=>{}),z.stdin.end(D.stdin,"utf8"))}finally{h().closeSync(G),h().closeSync(H)}z.unref();let I=x?.processIdentity??p.B.processIdentity,J=z.pid?I(z.pid):null,K={child:z,identity:J,identityOf:I,startedAt:Date.now(),exit:null,terminationStarted:!1,timer:setTimeout(()=>{B(K)},i)};K.timer.unref(),s.set(A,K);let L=!1,M=()=>{L||(L=!0,(0,o.L1)())};return z.on("error",()=>{clearTimeout(K.timer),K.exit={code:null,signal:null},B(K),M()}),z.on("close",(a,b)=>{clearTimeout(K.timer),K.exit={code:a,signal:b},B(K),M()}),{pid:z.pid??null,identity:J,sessionId:D.sessionId,reviewerPath:D.reviewerPath}}function F(a,b){for(let c of[(0,r.WJ)(a,b),(0,r.Ml)(a,b),(0,r.NO)(a,b)])h().rmSync(c,{force:!0})}function G(a){if(!a)return"";try{return h().readFileSync(a,"utf8")}catch{return""}}function H(a,b,c,d,e=18e5){let f=s.get(u(a,b)),g=G((0,r.Ml)(a,b)),h=f?.child.pid??c.reviewerPid??null;f&&h&&!f.identity&&v(h)&&(f.identity||(f.identity=f.identityOf(h)),f.identity);let i=f?.identity??c.reviewerIdentity??null,j=G((0,r.NO)(a,b)),k=function(a){let b=null,c="";for(let d of a.split("\n")){let a=d.trim();if(a.startsWith("{"))try{let d=JSON.parse(a);b||(b=function a(b,c=0){if(!b||"object"!=typeof b||c>4)return null;for(let[d,e]of Object.entries(b)){if(D.has(d)&&"string"==typeof e&&C.test(e))return e;let b=a(e,c+1);if(b)return b}return null}(d));let e=function(a){let b=a.item;if(b&&("agent_message"===b.type||"agent_message"===b.item_type)&&"string"==typeof b.text)return b.text;let c=a.msg;return c?.type==="agent_message"&&"string"==typeof c.message?c.message:null}(d);e&&(c=e)}catch{}}return{sessionId:b,lastAgentMessage:c}}(g),l=G("codex"===d?(0,r.WJ)(a,b):null).trim();if(!f&&null===h&&!g&&!j&&!l&&!c.spawnStartedAt)return null;let m=f?.startedAt??Date.parse(c.spawnStartedAt??""),n=Number.isFinite(m)?Date.now()-m:0,o=l||k.lastAgentMessage||("claude"===d?g.trim():"");if(l)return{status:"done",stdout:g,stderr:j,finalOutput:o,sessionId:k.sessionId,processIdentity:i,code:f?.exit?.code??null,signal:f?.exit?.signal??null};if(!f&&null!==h&&!i&&v(h))return{status:"lost",stdout:g,stderr:j,finalOutput:o,sessionId:k.sessionId,processIdentity:null,code:null,signal:null};if(f?null===f.exit&&v(h):!!(h&&i&&v(h)&&p.B.processIdentity(h)===i))return!f&&n>=e&&h&&A(h,i),{status:"running",stdout:g,stderr:j,finalOutput:"",sessionId:k.sessionId,processIdentity:i,code:null,signal:null};if(!f&&null===h&&!l)return{status:"lost",stdout:g,stderr:j,finalOutput:o,sessionId:k.sessionId,processIdentity:i,code:null,signal:null};let q=f?.exit??null;return{status:q?.code===0||o?"done":!o&&n>=e?"timeout":"failed",stdout:g,stderr:j,finalOutput:o,sessionId:k.sessionId,processIdentity:i,code:q?.code??null,signal:q?.signal??null}}function I(a,b,c={reviewerPid:null,reviewerIdentity:null}){let d=u(a,b),e=s.get(d);s.delete(d);let f=e?.child.pid??c.reviewerPid??null,g=e?.identity??c.reviewerIdentity??null;(e&&clearTimeout(e.timer),e)?B(e):f&&A(f,g)}async function J(a,b,c={reviewerPid:null,reviewerIdentity:null}){let d=u(a,b),e=s.get(d),f=e?.child.pid??c.reviewerPid??null,g=e?.identity??c.reviewerIdentity??null;if(!f)return s.delete(d),!0;e&&(clearTimeout(e.timer),e.terminationStarted=!0);let h=await z(f,g,{ownedByLiveHandle:!!e,leaderExited:e?.exit!==null,fallbackLeader:e?a=>{e.child.kill(a)}:void 0});return h&&s.delete(d),h}},52649:(a,b,c)=>{c.d(b,{o:()=>af,I:()=>U});var d=c(31421),e=c(77598),f=c.n(e),g=c(58152),h=c(59683),i=c(64253),j=c(94595),k=c(61971),l=c(56809),m=c(69858),n=c(41022);let o=/^data:([a-z0-9.+-]+\/[a-z0-9.+-]+);base64,([\s\S]*)$/i,p=new Set(["image_url","imageUrl","data","url","source"]);class q extends Error{constructor(a){super(`Codex replay frame exceeded its bounded ${a} budget`)}}let r=/^data:[a-z0-9.+-]+\/[a-z0-9.+-]+;base64,/i;class s{constructor(a){this.budgets=a,this.parts=[],this.outputUnits=0,this.rawUnits=0,this.inString=!1,this.stringParts=[],this.stringUnits=0,this.stringOmitted=0,this.stringHead="",this.stringCapSniffed=!1,this.escapeCarry="",this.stringCap=a.maxStringUnits}feed(a){if(this.rawUnits+=a.length,this.rawUnits>this.budgets.maxRawUnits)throw new q("raw");this.escapeCarry&&(a=this.escapeCarry+a,this.escapeCarry="");let b=0;for(;b<a.length;){if(!this.inString){let c=a.indexOf('"',b);if(-1===c)return void this.append(a.slice(b));this.append(a.slice(b,c+1)),this.inString=!0,b=c+1;continue}let c=a.indexOf('"',b),d=a.indexOf("\\",b),e=-1===c?d:-1===d?c:Math.min(c,d);if(-1===e)return void this.appendToString(a.slice(b));if(e>b&&this.appendToString(a.slice(b,e)),e===c){this.endString(),b=e+1;continue}let f=117===a.charCodeAt(e+1)?6:2,g=a.slice(e,e+f);if(g.length<f){this.escapeCarry=g;return}this.appendToString(g,!0),b=e+f}}finish(){return this.escapeCarry&&(this.appendToString(this.escapeCarry),this.escapeCarry=""),this.inString&&this.endString(!1),this.parts.join("")}append(a){if(a){if(this.outputUnits+=a.length,this.outputUnits>this.budgets.maxOutputUnits)throw new q("output");this.parts.push(a)}}appendToString(a,b=!1){this.stringHead.length<64&&(this.stringHead+=a.slice(0,64-this.stringHead.length)),!this.stringCapSniffed&&this.stringUnits+a.length>this.stringCap&&(this.stringCapSniffed=!0,r.test(this.stringHead)&&(this.stringCap=this.budgets.maxImageStringUnits));let c=this.stringCap-this.stringUnits;if(c>=a.length){this.stringParts.push(a),this.stringUnits+=a.length;return}if(b||c<=0){this.stringOmitted+=a.length;return}this.stringParts.push(a.slice(0,c)),this.stringUnits+=c,this.stringOmitted+=a.length-c}endString(a=!0){if(this.stringOmitted>0){let a=this.stringParts[this.stringParts.length-1],b=a?a.charCodeAt(a.length-1):0;b>=55296&&b<=56319&&(this.stringParts[this.stringParts.length-1]=a.slice(0,-1),this.stringOmitted+=1),this.stringParts.push(`…[truncated ${this.stringOmitted} chars]`)}this.append(this.stringParts.join("")+(a?'"':"")),this.inString=!1,this.stringParts=[],this.stringUnits=0,this.stringOmitted=0,this.stringHead="",this.stringCap=this.budgets.maxStringUnits,this.stringCapSniffed=!1}}var t=c(32372),u=c(29861),v=c(77276);let w=/[.!?…](?:["')\]}»”’]+)?\s+/gu;function x(a,b,c){let d=a.slice(0,b+1).search(/\s+\S*$/u);if(d>=c)return d+a.slice(d).match(/^\s+/u)[0].length;let e=a.slice(b).search(/\s/u);return e>=0?b+e+1:a.length}var y=c(83336),z=c(37037),A=c(73024),B=c.n(A),C=c(76760),D=c.n(C),E=c(91724);let F=`Your name is Alik. You are the voice coordinator: you speak aloud and you run the work of other agents.
|
|
9
9
|
|
|
10
10
|
## Language
|
|
11
11
|
|
|
@@ -77,11 +77,11 @@ Do not ask permission for what you can check yourself.
|
|
|
77
77
|
|
|
78
78
|
Stay silent until you are spoken to: this text is context, and there is nothing here to greet.`;function G(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:null}function H(a,b){let c=null;try{c=G(JSON.parse(a.toString("utf8")))}catch{return!1}let d=G(c?.payload);return c?.type==="response_item"&&d?.type==="message"&&d.id===b&&"developer"===d.role}function I(a){return(0,e.createHash)("sha256").update("voice-persona-bootstrap\0","utf8").update(a,"utf8").digest("hex")}async function J(a,b){let c;if(!a){let a=Error("canonical transcript path is unavailable");throw a.code="NO_TRANSCRIPT_PATH",a}try{c=await B().promises.open(a,B().constants.O_RDONLY|(B().constants.O_NOFOLLOW??0))}catch(b){let a=b.code;if("ENOENT"===a||"ENOTDIR"===a)return!1;throw b}return new Promise((a,d)=>{let e=c.createReadStream({autoClose:!0}),f=!1,g=[],h=0,i=!1,j=b=>{f||(f=!0,e.destroy(),a(b))},k=()=>{g=[],h=0,i=!1};e.on("data",a=>{let c=Buffer.isBuffer(a)?a:Buffer.from(a),d=0;for(;d<=c.length;){let a=c.indexOf(10,d);if(-1===a){let a=c.length-d;!i&&a>0&&(h+a>0x2000000?(g=[],h=0,i=!0):(g.push(Buffer.from(c.subarray(d))),h+=a));return}if(!i){let e=c.subarray(d,a);if(h+e.length<=0x2000000&&H(h?Buffer.concat([...g,e],h+e.length):e,b))return j(!0)}k(),d=a+1}}),e.on("end",()=>{!i&&h>0&&H(Buffer.concat(g,h),b)?j(!0):j(!1)}),e.on("error",a=>{f||(f=!0,d(a))})})}let K=["PATH","HOME","USER","LOGNAME","SHELL","TMPDIR","TMP","TEMP","LANG","LC_ALL","LC_CTYPE","TERM","COLORTERM","NO_COLOR","XDG_CONFIG_HOME","XDG_CACHE_HOME","XDG_DATA_HOME","XDG_STATE_HOME","XDG_RUNTIME_DIR","DBUS_SESSION_BUS_ADDRESS","SSL_CERT_FILE","SSL_CERT_DIR","LLV_SPAWN_CAPABILITY"],L=["DISPLAY","XAUTHORITY","WAYLAND_DISPLAY","XDG_SESSION_TYPE","XDG_CURRENT_DESKTOP","DESKTOP_SESSION"],M=t.u1+262144,N=new Set(["thread/resume","thread/read"]),O=/^\{(?:"jsonrpc":"2\.0",)?"id":(\d+),"result":/,P={maxStringUnits:16384,maxImageStringUnits:t.u1+64,maxOutputUnits:0x4000000,maxRawUnits:0x20000000},Q=new Set(["thread/start","thread/resume","turn/start","turn/steer","turn/interrupt","thread/realtime/start","thread/realtime/stop","thread/inject_items","thread/compact/start"]);function R(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:null}function S(a,b){let c=R(a);return c&&"string"==typeof c[b]?c[b]:null}function T(a){let b=a instanceof Error?a.message:String(a);return(0,l.j)(b).replace(/(["']?(?:cookie|set-cookie)["']?\s*[:=]\s*["']?)[^\s,"'}]+/gi,"$1[redacted]")}function U(a){return T(a).slice(0,500)}let V=U;function W(a,b){let c=R(a),d=R(c?.thread)??c,e=S(d,"id");if(!e)throw Error(`${b} returned no thread id`);return{threadId:e,path:S(d,"path")}}function X(a,b){let c=R(a),d=S(R(c?.turn),"id")??S(c,"turnId");if(!d)throw Error(`${b} returned no turn id`);return d}function Y(a){return S(a.turn,"id")??S(a,"turnId")}function Z(a){return"completed"===a?"completed":"interrupted"===a?"interrupted":"error"}function $(a,b){let c=R(a)?.data;if(!Array.isArray(c))return!1;let d=c.map(R).filter(a=>null!==a),e=b?d.find(a=>S(a,"id")===b):d.find(a=>!0===a.isDefault);return Array.isArray(e?.inputModalities)&&e.inputModalities.includes("image")}function _(a){let b=R(a),c=R(b?.thread)??b;if(Array.isArray(c?.turns))return c.turns.map(R).filter(a=>null!==a);let d=R(c?.initialTurnsPage);return Array.isArray(d?.data)?d.data.map(R).filter(a=>null!==a):[]}function aa(a){let b=S(a,"id");return b?`id:${b}`:`json:${JSON.stringify(a)}`}function ab(a){return"delta"===a.kind?JSON.stringify([a.kind,a.turnId,a.text]):"attention"===a.kind?JSON.stringify([a.kind,a.id,a.method,a.attention]):null}function ac(a){let b=S(a,"text");if(null!==b)return b;if("string"==typeof a.content)return a.content;if(!Array.isArray(a.content))return null;let c=[];for(let b of a.content){if("string"==typeof b){c.push(b);continue}let a=S(b,"text")??S(b,"content");null!==a&&c.push(a)}return c.length>0?c.join(""):null}function ad(a,b){let c=Buffer.from(a,"utf8");if(c.byteLength<=b)return{text:a,truncated:!1};let d=c.byteLength-b;for(;d<c.byteLength&&(192&c[d])==128;)d+=1;return{text:c.subarray(d).toString("utf8"),truncated:!0}}function ae(a){let b=R(a),c=R(b?.thread),d=R(b?.status)??R(c?.status),e=S(d,"type");return"active"!==e&&"idle"!==e&&"notLoaded"!==e&&"systemError"!==e?null:{type:e,activeFlags:Array.isArray(d?.activeFlags)?d.activeFlags.filter(a=>"string"==typeof a):[]}}class af{constructor(a,b,c){this.pending=new Map,this.pendingRealtimeStart=null,this.realtimeFailure=null,this.realtimeSessionId=null,this.lateThreadReadResponses=new Map,this.replayEnvelopeRequestIds=new Set,this.replayReduction=null,this.subscribers=new Set,this.events=[],this.confirmedDeliveries=new Map,this.pendingDeliveries=new Map,this.pendingCompactions=new Map,this.realtimeDeliveries=new Map,this.voiceStreams=new Map,this.unresolvedVoicePersonaBootstrap=null,this.voicePersonaBootstrapInsertion=null,this.voicePersonaBootstrapAccepted=!1,this.pendingVoiceChunks=new Map,this.cancelledVoiceTurns=new Set,this.activeRealtimeDeliveries=new Map,this.attentions=new Map,this.stateListeners=new Set,this.preRestoreEvents=[],this.preRestoreMessages=[],this.bufferedTerminalTurnIds=new Set,this.bufferedNotificationOverlap=[],this.nextRpcId=1,this.stdoutBuffer="",this.stderrTail="",this.preRestoreBytes=0,this.eventLedgerRestored=!1,this.activeTurnId=null,this.protocolVersion=null,this.account=null,this.engineStatus="idle",this.activeFlags=[],this.imageInputSupport="unknown",this.realtimeDeliveryEpoch=0,this.releasing=!1,this.released=!1,this.dead=!1,this.reaped=!1,this.terminationStarted=!1,this.terminationTimer=null,this.terminationPromise=null,this.resolveTermination=null,this.failureCleanupTimer=null,this.releasePromise=null,this.writerFence=null,this.ledgerFailed=!1,this.failure=null,this.child=a,this.identity=b,this.requestTimeoutMs=c.requestTimeoutMs??3e4,this.realtimePersonaTimeoutMs=c.realtimePersonaTimeoutMs??3e3,this.realtimeStartTimeoutMs=c.realtimeStartTimeoutMs??9e4,this.deliveryConfirmationTimeoutMs=c.deliveryConfirmationTimeoutMs??3e5,this.compactEvidenceTimeoutMs=c.compactEvidenceTimeoutMs??3e5,this.shutdownGraceMs=c.shutdownGraceMs??1e3,this.eventStore=c.eventStore??new z.mI,this.effort=c.effort,this.signalProcess=c.signalProcess??process.kill,this.processIdentity=c.processIdentity??(a=>h.B.processIdentity(a)),this.pidAlive=c.pidAlive??(a=>h.B.pidAlive(a)),this.releaseCleanup=c.releaseCleanup??null,this.childStartIdentity=a.pid?this.processIdentity(a.pid):null,this.onEventCursorRecovery=c.onEventCursorRecovery,this.resolveImagePath=c.resolveImagePath??(a=>{let b=(0,t.PF)();return b.read(a),b.pathFor(a)}),this.cursor=c.initialEventCursor??0,this.reapedPromise=new Promise(a=>{this.resolveReaped=a}),a.stdout.on("data",a=>this.acceptStdout(String(a))),a.stderr.on("data",a=>this.acceptStderr(String(a))),a.stdin.on("error",a=>{this.releasing||this.released||this.fail(Error(`Codex app-server stdin failed: ${V(a)}`))}),a.on("error",a=>this.fail(Error(`Codex app-server child failed: ${V(a)}`))),a.on("close",()=>{if(this.reaped=!0,this.completeGroupCleanupAfterReap(),this.resolveReaped(),this.releasing)this.startFailureCleanup();else if(!this.released)if(this.dead)this.notifyStateListeners();else{let a=T(this.stderrTail).split(/\r?\n/).map(a=>a.replace(/\s+/g," ").trim()).filter(Boolean).slice(-4).reverse().map(a=>a.slice(-240)).join(" | ").slice(0,430);this.fail(Error(`Codex app-server child exited${a?`: ${a}`:""}`))}})}static async start(a){return this.open(a,null)}static async adopt(a,b){if(!a)throw Error("Codex thread id is required for adoption");return this.open(b,a)}static async open(a,b){let c,e=a.spawnProcess??((a,b,c)=>(0,d.spawn)(a,b,{...c,stdio:["pipe","pipe","pipe"]})),f=[...a.fileAuthCredentials?["-c","cli_auth_credentials_store=file"]:[],...a.permissionProfile&&a.permissionProfileConfig?["-c",`default_permissions=${JSON.stringify(a.permissionProfile)}`,"-c",a.permissionProfileConfig]:[],"app-server","--enable","realtime_conversation"],g=(0,k.sJ)(a.plugins);try{c=e(a.binary??process.env.LLV_CODEX_BINARY??"codex",f,{cwd:a.cwd,env:(0,u.$)(function(a,b,c=!1,d=!1){let e={NODE_ENV:a.NODE_ENV};for(let b of c?[...K,...L]:K)void 0!==a[b]&&(e[b]=a[b]);return d&&void 0!==a.GH_CONFIG_DIR&&(e.GH_CONFIG_DIR=a.GH_CONFIG_DIR),b&&(e.CODEX_HOME=b),e}(a.env??process.env,a.codexHome,g.length>0,!0===a.forwardGitHubConfig),a.mcpServers),detached:!0})}catch(b){throw a.releaseCleanup?.(),b}let h=new af(c,{threadId:b??"pending",path:null},a);try{var i;let c,d;i=R(await h.rpc("initialize",{clientInfo:{name:"llv-structured-host",title:"Live Log Viewer",version:"0.11.7"},capabilities:{experimentalApi:!0}})),h.protocolVersion=(c=S(i,"appServerVersion")??S(i,"serverVersion")??S(i,"version"))||(S(i,"userAgent")?.match(/^[^/]+\/([^\s]+)/)?.[1]??null),h.notify("initialized",{});let e=R(await h.rpc("account/read",{refreshToken:!1})),f=R(e?.account),k=S(f,"type");if("chatgpt"!==k)throw Error("Codex app-server requires a ChatGPT subscription login");h.account={type:k,planType:S(f,"planType")},h.requestedModel=a.model;try{h.imageInputSupport=$(await h.rpc("model/list",{}),a.model)?"supported":"unsupported"}catch{h.imageInputSupport="unknown"}let l=(0,j.v)(await h.rpc("config/read",{cwd:a.cwd,includeLayers:!1}),!0===a.allowSubagents,a.mcpServers,g),m=b?await h.rpc("thread/resume",{threadId:b,...a.permissionProfile?{permissions:a.permissionProfile}:{},config:l}):await h.rpc("thread/start",{cwd:a.cwd,...a.model?{model:a.model}:{},...a.permissionProfile?{permissions:a.permissionProfile}:{sandbox:a.sandbox??"read-only"},approvalPolicy:a.approvalPolicy??"never",config:l}),n=W(m,b?"thread/resume":"thread/start");if(b&&n.threadId!==b)throw Error("thread/resume returned a different thread id");return h.identity.threadId=n.threadId,h.identity.path=n.path,g.length>0&&await h.verifyPluginGrant(g,l),h.rememberConfirmedDeliveries(m),h.restoreEvents(),h.beginBufferedNotificationReconciliation(),h.flushPreRestoreEvents(),h.flushPreRestoreMessages(b?m:null),b&&h.reconcileThreadHistory(m),h.reconcileAfterOpen(ae(m),(d=_(m).findLast(a=>"inProgress"===S(a,"status")))?S(d,"id"):null),h.endBufferedNotificationReconciliation(),h}catch(a){try{await h.release()}catch(b){throw new y.EY(V(a),h,{cause:b})}throw Error(V(a))}}async verifyPluginGrant(a,b){let c,d=new Set(Object.keys(R(b.mcp_servers)??{})),e=new Set((0,k.QN)(a));try{c=await this.rpc("mcpServerStatus/list",{threadId:this.identity.threadId})}catch(a){throw Error(`Codex plugin grant could not be verified: ${V(a)}`)}let f=R(c)?.data??c;if(!Array.isArray(f))throw Error("Codex plugin grant could not be verified: mcpServerStatus/list returned no server list");let g=f.map(a=>S(R(a),"name")).filter(a=>null!==a&&!d.has(a)&&!e.has(a));if(g.length>0)throw Error(`Codex plugin grant surfaced servers outside the allowlist: ${[...new Set(g)].sort().join(", ")}`)}attach(a){if(!Number.isSafeInteger(a)||a<0)throw Error("afterSeq must be a non-negative integer");let b={afterSeq:a,queue:[],wake:null,closed:!1},c=this.events[0]?.seq;if(void 0!==c&&a+1<c)throw new y.AW(a,c);for(let c of this.events)c.seq>a&&b.queue.push(c);this.subscribers.add(b);let d=this.subscribers;return{async *[Symbol.asyncIterator](){try{for(;;){let a=b.queue.shift();if(a){a.seq>b.afterSeq&&(b.afterSeq=a.seq,yield a);continue}if(b.closed)break;await new Promise(a=>{b.wake=a}),b.wake=null}}finally{b.closed=!0,d.delete(b)}}}}async refreshImageInputSupport(){try{this.imageInputSupport=$(await this.rpc("model/list",{}),this.requestedModel)?"supported":"unsupported"}catch{return}"supported"===this.imageInputSupport&&this.setSessionStatus(this.engineStatus,this.activeFlags)}async send(a){if(this.dead||this.releasing||this.released||!this.writerFenceAllowsActuation())return{outcome:"rejected",reason:"dead-host"};let b=(0,y.h4)(a);if(b.content.images.length){if("unknown"===this.imageInputSupport&&await this.refreshImageInputSupport(),"unsupported"===this.imageInputSupport)throw Error("The selected Codex model does not advertise image input through app-server.");if("supported"!==this.imageInputSupport)throw Error("Codex image capability discovery is temporarily unavailable; retry shortly.")}if(!(a={id:b.id,text:b.content.text,content:b.content,contentDigest:b.contentDigest,...void 0!==b.expectedTurnId?{expectedTurnId:b.expectedTurnId}:{},...b.runtime?{runtime:b.runtime}:{},...b.selectedContext?{selectedContext:b.selectedContext}:{},...b.origin?{origin:b.origin}:{}}).id)throw Error("queue entry id is required");let c=await this.confirmedDelivery(a);if(c)return c;let d=this.activeTurnId;if(void 0!==a.expectedTurnId&&a.expectedTurnId!==d)return{outcome:"rejected",reason:"stale-turn"};let e=[...b.content.images.map(a=>({type:"localImage",path:this.resolveImagePath(a)})),{type:"text",text:(0,m.D)(b.content.text,b.content.images.length>0?b.contentDigest:void 0,b.selectedContext,b.origin)}];if(d)try{let b=await this.rpc("turn/steer",{threadId:this.identity.threadId,expectedTurnId:d,input:e,clientUserMessageId:a.id});return this.awaitDeliveryConfirmation(a,{outcome:"steered",turnId:X(b,"turn/steer")})}catch(a){if(/expectedTurnId|active turn|stale/i.test(V(a)))return{outcome:"rejected",reason:"stale-turn"};throw a}let f=(a.runtime?.effort&&(0,g.ck)(a.runtime.effort)?a.runtime.effort:void 0)??this.effort,h=X(await this.rpc("turn/start",{threadId:this.identity.threadId,...f?{effort:f}:{},input:e,clientUserMessageId:a.id}),"turn/start");return this.activeTurnId=h,this.notifyStateListeners(),this.awaitDeliveryConfirmation(a,{outcome:"turn-started",turnId:h})}async interrupt(a){if(this.dead||this.releasing||this.released||!this.writerFenceAllowsActuation())throw Error("Codex app-server host is unavailable");if(!a||this.activeTurnId!==a)throw Error("active turn fence is stale");await this.rpc("turn/interrupt",{threadId:this.identity.threadId,turnId:a})}async compact(a){let b;if(this.dead||this.releasing||this.released||!this.writerFenceAllowsActuation())throw new y.BL("Codex app-server host is unavailable","refused");if(a.threadId&&a.threadId!==this.identity.threadId)throw new y.BL("compact target thread is not the thread this host owns","refused");if(this.activeTurnId)throw new y.BL("a turn is active; compaction would race it","refused");let c=this.pendingCompactions.get(a.operationId);if(c)return c.promise;if(this.pendingCompactions.size>0)throw new y.BL("a compaction is already running on this thread","refused");let d=new Promise((a,c)=>{b={promise:void 0,resolve:a,reject:c,timer:void 0}});b.promise=d,this.pendingCompactions.set(a.operationId,b),d.catch(()=>void 0);try{await this.rpc("thread/compact/start",{threadId:this.identity.threadId},this.compactEvidenceTimeoutMs)}catch(e){if(this.pendingCompactions.get(a.operationId)!==b)return d;this.pendingCompactions.delete(a.operationId);let c=V(e);throw new y.BL(c,/outcome is uncertain/.test(c)?"unverified":"refused")}return this.pendingCompactions.get(a.operationId)===b&&(b.timer=setTimeout(()=>{this.pendingCompactions.delete(a.operationId),b.reject(new y.BL("Codex compaction evidence did not arrive; the outcome is unverified","unverified"))},this.compactEvidenceTimeoutMs)),d}acceptCompactionItem(a,b){if("completed"!==b||0===this.pendingCompactions.size)return;let c=R(a);c&&this.settlePendingCompactions({compactionId:S(c,"id")})}acceptCompactedNotification(a){0===this.pendingCompactions.size||S(a,"threadId")===this.identity.threadId&&this.settlePendingCompactions({compactionId:null})}rejectPendingCompactions(a){this.settlePendingCompactions(new y.BL(V(a),"unverified"))}settlePendingCompactions(a){if(0===this.pendingCompactions.size)return;let b=[...this.pendingCompactions.values()];for(let c of(this.pendingCompactions.clear(),b))c.timer&&clearTimeout(c.timer),a instanceof y.BL?c.reject(a):c.resolve(a)}settlePendingCompactionsFromTerminalTurn(a,b){if("completed"===b||0===this.pendingCompactions.size)return;let c=V(S(R(a?.error),"message")??("interrupted"===b?"Codex compaction was interrupted; the outcome is unverified":"Codex compaction failed"));this.settlePendingCompactions(new y.BL(c,"interrupted"===b?"unverified":"refused"))}async startRealtimeWebRtc(a){let b,c,d,e;if(this.dead||this.releasing||this.released||!this.writerFenceAllowsActuation())throw Error("Codex app-server host is unavailable");let f=a.endsWith("\n")?a:`${a}\r
|
|
79
79
|
`;if(!f.trimStart().startsWith("v=0")||Buffer.byteLength(f,"utf8")>524288)throw Error("A valid WebRTC SDP offer is required");if(this.pendingRealtimeStart)throw Error("A realtime session is already starting");this.realtimeFailure=null,this.realtimeSessionId=null;let g=(c=I(this.identity.threadId).slice(0,46),d=`voice_persona_${c}`,e=`msg_${d}`,{receiptId:d,itemId:e}),h=new Promise((a,c)=>{b={resolve:a,reject:c,timer:void 0,started:!1,realtimeSessionId:null,sdp:null,personaBootstrap:{...g,insertion:"accepted"}}});this.pendingRealtimeStart=b,h.catch(()=>void 0);try{let a=await this.ensureVoicePersonaBootstrap(g,b);if("superseded"===a)return h}catch(d){if(this.pendingRealtimeStart!==b)return h;let a=b;this.pendingRealtimeStart=null,clearTimeout(a.timer);let c={sdp:null,realtimeSessionId:null,personaBootstrap:{...g,insertion:"rejected",diagnostic:V(d)}};return a.resolve(c),h}if(this.pendingRealtimeStart!==b)return h;let i=function(a){let b=[],c=!1;for(let d of a){if("delta"===d.kind){if(!d.text)continue;let a=b.at(-1);if(a?.role==="assistant"&&a.turnId===d.turnId){let b=ad(a.text+d.text,8192);a.text=b.text,c||=b.truncated}else{let a=ad(d.text,8192);b=[{role:"assistant",text:a.text,turnId:d.turnId,source:"durable-delta"}],c=a.truncated}continue}if("item"!==d.kind||"completed"!==d.phase)continue;let a=function(a){let b=R(a);if(!b)return null;let c=S(b,"type"),d=R(b.message),e=S(b,"role")??S(d,"role"),f="userMessage"===c||"user_message"===c||"user"===c||"message"===c&&"user"===e;if(!f&&"agentMessage"!==c&&"agent_message"!==c&&"assistant"!==c&&("message"!==c||"assistant"!==e))return null;let g=S(b,"text")??ac(b)??(d?S(d,"text")??ac(d):null);return g?f?{role:"user",text:(0,m.$)(g).text}:{role:"assistant",text:g}:null}(d.item);if(a){if("user"===a.role){if(0===b.length)continue;let e=ad(a.text,8192);b.push({...a,text:e.text,turnId:d.turnId,source:"durable-item"}),c||=e.truncated,b.length>12&&(b=[b[0],...b.slice(-11)],c=!0);continue}b.findLastIndex(a=>"assistant"===a.role&&(null===d.turnId||a.turnId===d.turnId))>=0&&(b=[],c=!1)}}let d=(b=b.filter(a=>a.text.length>0)).reduce((a,b)=>a+Buffer.byteLength(b.text,"utf8"),0);for(;d>24576&&b.length>1;){let a=b.splice(1,1)[0];d-=Buffer.byteLength(a.text,"utf8"),c=!0}return{items:b.map(({role:a,text:b})=>({role:a,text:b})),diagnosticItems:b.map(({role:a,source:b,text:c})=>({role:a,source:b,bytes:Buffer.byteLength(c,"utf8")})),truncated:c}}(this.events);console.info("[realtime context] selected",{providerStartupContext:!0,durableTail:i.diagnosticItems,truncated:i.truncated}),b.timer=setTimeout(()=>{this.pendingRealtimeStart===b&&this.fail(Error("thread/realtime/start timed out; outcome is uncertain"))},this.realtimeStartTimeoutMs);try{await this.rpc("thread/realtime/start",{threadId:this.identity.threadId,version:"v3",model:"gpt-live-1-codex",outputModality:"audio",transport:{type:"webrtc",sdp:f},clientManagedHandoffs:!0,codexResponsesAsItems:!0,includeStartupContext:!0,...i.items.length>0?{initialItems:i.items}:{}},this.realtimeStartTimeoutMs)}catch(a){this.rejectRealtimeStart(a instanceof Error?a:Error(V(a)))}return h}async ensureVoicePersonaBootstrap(a,b){for(await this.ensureCanonicalTranscriptPath();!this.voicePersonaBootstrapAccepted;){var c;let d=this.voicePersonaBootstrapInsertion;if(d){try{await d.promise}catch(a){if(this.pendingRealtimeStart!==b)return"superseded";if(d.owner===b)throw a}continue}let e=await this.scanVoicePersonaBootstrap(a.itemId,"canonical scan unavailable; refusing insertion"),f=!e&&await this.scanVoicePersonaBootstrap((c=this.identity.threadId,`msg_voice_persona_${I(c)}`),"legacy canonical scan unavailable; refusing insertion");if(e||f){this.voicePersonaBootstrapAccepted=!0,this.unresolvedVoicePersonaBootstrap=null;break}if(this.pendingRealtimeStart!==b)return"superseded";if(this.voicePersonaBootstrapInsertion)continue;let g=this.unresolvedVoicePersonaBootstrap??function(a){let b=function(a=a=>B().readFileSync(a,"utf8")){try{let b=a((0,E.ks)(D().join(..."prompts/voice-persona.md".split("/")))).trim();if(b)return b}catch{}return F}(void 0);return{item:{type:"message",id:a.itemId,role:"developer",content:[{type:"input_text",text:b}]}}}(a);this.unresolvedVoicePersonaBootstrap=g;let h=this.insertVoicePersonaBootstrap(g,a.itemId),i={owner:b,promise:h};this.voicePersonaBootstrapInsertion=i;let j=()=>{this.voicePersonaBootstrapInsertion===i&&(this.voicePersonaBootstrapInsertion=null)};h.then(j,j);try{await h}catch(a){if(this.pendingRealtimeStart!==b)return"superseded";throw a}}return"accepted"}async ensureCanonicalTranscriptPath(){if(this.identity.path)return;let a=W(await this.rpc("thread/read",{threadId:this.identity.threadId,includeTurns:!0}),"thread/read");if(a.threadId!==this.identity.threadId)throw Error("thread/read returned a different thread id");if(!a.path){let a=Error("canonical transcript path is unavailable");throw a.code="NO_TRANSCRIPT_PATH",a}this.identity.path=a.path}async insertVoicePersonaBootstrap(a,b){try{await this.rpc("thread/inject_items",{threadId:this.identity.threadId,items:[a.item]},this.realtimePersonaTimeoutMs)}catch(a){if(!await this.scanVoicePersonaBootstrap(b,"recovery scan unavailable"))throw a}this.voicePersonaBootstrapAccepted=!0,this.unresolvedVoicePersonaBootstrap=null}async scanVoicePersonaBootstrap(a,b){try{return await J(this.identity.path,a)}catch(a){throw console.warn(`[voice persona bootstrap] ${b}`,{code:a.code??"unknown",diagnostic:V(a)}),a}}async appendRealtimeSpeech(a){if(!a||Buffer.byteLength(a,"utf8")>8192)throw Error("Realtime speech text is empty or too large");await this.rpc("thread/realtime/appendSpeech",{threadId:this.identity.threadId,text:a})}voiceStream(a){let b=this.voiceStreams.get(a);if(b)return b;let c={turnId:a,segmentIndex:0,nextChunkIndex:0,buffer:"",observedChars:0,emittedChars:0,observedHash:(0,e.createHash)("sha256"),emittedHash:(0,e.createHash)("sha256"),fallbackToTerminal:!1,timer:null};return this.voiceStreams.set(a,c),c}observeVoiceDelta(a,b){if(!b||this.cancelledVoiceTurns.has(a))return;let c=this.voiceStream(a);if(c.buffer+=b,c.observedChars+=b.length,c.observedHash.update(b),Buffer.byteLength(c.buffer,"utf8")>24576){c.fallbackToTerminal=!0,c.buffer="",this.clearVoiceStreamTimer(c);return}this.realtimeSessionId&&!c.fallbackToTerminal&&(this.flushVoiceStream(c,"eager"),this.scheduleVoiceStreamFlush(c))}flushVoiceStream(a,b){if(!this.realtimeSessionId||a.fallbackToTerminal||this.cancelledVoiceTurns.has(a.turnId)||this.pendingVoiceChunks.size>=6)return!1;let c=function(a,b){if(!a)return null;let c=(0,v._t)(a,0,1800),d=c.text,e=c.nextOffset<a.length,f=function(a){w.lastIndex=0;let b=-1;for(let c of a.matchAll(w)){let a=(c.index??0)+c[0].length;a>=180&&(b=a)}return b}(d),g=-1;return(f>=0?g=f:"final"===b?g=d.length:e||a.length>=560?g=x(d,Math.min(560,d.length),180):"deadline"===b&&a.length>=140&&(g=x(d,d.length,140)),g<=0)?null:{text:a.slice(0,g),remainder:a.slice(g)}}(a.buffer,b);if(!c)return!1;let d=a.emittedChars,e=d+c.text.length,f=(0,v.N5)({sourceTurnId:a.turnId,chunkIndex:a.nextChunkIndex,startOffset:d,endOffset:e,text:c.text});return this.emit({kind:"voice-chunk",turnId:a.turnId,delivery:f}),!this.ledgerFailed&&(this.pendingVoiceChunks.set(f.deliveryId,a.turnId),a.nextChunkIndex+=1,a.emittedChars=e,a.emittedHash.update(c.text),a.buffer=c.remainder,!0)}scheduleVoiceStreamFlush(a){this.clearVoiceStreamTimer(a),!a.buffer||!this.realtimeSessionId||a.fallbackToTerminal||this.cancelledVoiceTurns.has(a.turnId)||(a.timer=setTimeout(()=>{a.timer=null,this.flushVoiceStream(a,"deadline")&&a.buffer.length>0&&this.pendingVoiceChunks.size<6&&this.scheduleVoiceStreamFlush(a)},1100))}clearVoiceStreamTimer(a){a.timer&&(clearTimeout(a.timer),a.timer=null)}clearVoiceStreamTimers(){for(let a of this.voiceStreams.values())this.clearVoiceStreamTimer(a)}resetVoiceStreamSegment(a){this.clearVoiceStreamTimer(a),a.segmentIndex+=1,a.buffer="",a.observedChars=0,a.emittedChars=0,a.observedHash=(0,e.createHash)("sha256"),a.emittedHash=(0,e.createHash)("sha256"),a.fallbackToTerminal=!1}finalizeVoiceStreamItem(a,b){let c=this.voiceStreams.get(a),d=(0,v.mT)(b,`voice-final:${a}:${c?.segmentIndex??0}`);if(!d||!c||0===c.observedChars)return;this.clearVoiceStreamTimer(c);let f=d.text.slice(0,c.emittedChars),g=(0,e.createHash)("sha256").update(f).digest("hex")===c.emittedHash.copy().digest("hex"),h=d.text.slice(0,c.observedChars),i=c.observedChars<=d.text.length&&(0,e.createHash)("sha256").update(h).digest("hex")===c.observedHash.copy().digest("hex");g&&i&&!c.fallbackToTerminal&&this.flushVoiceStream(c,"final");let j=g?c.emittedChars:0,k=d.text.slice(j);return(g&&i||console.warn("[realtime voice stream] terminal reconciliation used bounded fallback",{turnId:a,emittedChars:c.emittedChars,observedChars:c.observedChars,emittedMatches:g,observedMatches:i}),this.resetVoiceStreamSegment(c),k)?{responseId:j>0?`${d.responseId}:suffix:${j}`:d.responseId,text:k}:null}cancelVoiceStream(a){let b=this.voiceStreams.get(a);for(let[c,d]of(b&&this.clearVoiceStreamTimer(b),this.voiceStreams.delete(a),this.cancelledVoiceTurns.add(a),this.pendingVoiceChunks))d===a&&this.pendingVoiceChunks.delete(c)}resumeVoiceStreams(){if(this.realtimeSessionId)for(let a of this.voiceStreams.values())this.cancelledVoiceTurns.has(a.turnId)||(a.fallbackToTerminal=!1,this.flushVoiceStream(a,"eager"),this.scheduleVoiceStreamFlush(a))}async deliverRealtimeWorkerResponse(a){let b=(0,v.Im)([a])[0];if(!b||!b.ready||b.deliveryId!==a.deliveryId)throw Error("Realtime worker delivery is invalid");if(b.sourceTurnId&&this.cancelledVoiceTurns.has(b.sourceTurnId))throw Error("Realtime worker delivery belongs to an interrupted turn");let c=(0,e.createHash)("sha256").update(JSON.stringify(b.responses)).digest("hex"),d=this.activeRealtimeDeliveries.get(b.deliveryId);if(d){if(d.digest!==c)throw Error("Realtime delivery id belongs to different content");return d.promise}let f=this.performRealtimeWorkerDelivery(b,c);this.activeRealtimeDeliveries.set(b.deliveryId,{digest:c,promise:f});try{return await f}finally{this.activeRealtimeDeliveries.get(b.deliveryId)?.promise===f&&this.activeRealtimeDeliveries.delete(b.deliveryId)}}async performRealtimeWorkerDelivery(a,b){let c=this.realtimeDeliveries.get(a.deliveryId);if(c?.digest!==void 0&&c.digest!==b)throw Error("Realtime delivery id belongs to different content");if(c?.acknowledged)return{deliveryId:a.deliveryId,acknowledged:!0};let d=c?.responseIndex??0,e=c?.offset??0;if(d>a.responses.length||d<a.responses.length&&e>a.responses[d].text.length)throw Error("Realtime delivery cursor is invalid");let f=this.realtimeDeliveryEpoch;for(;d<a.responses.length;){if(f!==this.realtimeDeliveryEpoch)throw Error("Realtime worker delivery paused by stop");let c=a.responses[d],g=(0,v._t)(c.text,e,8192);if(!g){d+=1,e=0;continue}if(await this.appendRealtimeSpeech(g.text),(e=g.nextOffset)===c.text.length&&(d+=1,e=0),this.emit({kind:"realtime-delivery-progress",deliveryId:a.deliveryId,digest:b,responseIndex:d,offset:e}),this.ledgerFailed)throw Error("Realtime delivery progress was not persisted");this.realtimeDeliveries.set(a.deliveryId,{digest:b,responseIndex:d,offset:e,acknowledged:!1})}if(this.emit({kind:"realtime-delivery-acknowledged",deliveryId:a.deliveryId,digest:b}),this.ledgerFailed)throw Error("Realtime delivery acknowledgement was not persisted");this.realtimeDeliveries.set(a.deliveryId,{digest:b,responseIndex:d,offset:e,acknowledged:!0});let g=this.pendingVoiceChunks.get(a.deliveryId);if(g){this.pendingVoiceChunks.delete(a.deliveryId);let b=this.voiceStreams.get(g);b&&!this.cancelledVoiceTurns.has(g)&&(this.flushVoiceStream(b,"eager"),this.scheduleVoiceStreamFlush(b))}return{deliveryId:a.deliveryId,acknowledged:!0}}async stopRealtime(){for(let a of(this.realtimeDeliveryEpoch+=1,await this.rpc("thread/realtime/stop",{threadId:this.identity.threadId}),this.rejectRealtimeStart(Error("Realtime session stopped during startup")),this.realtimeFailure=null,this.realtimeSessionId=null,this.voiceStreams.values()))this.clearVoiceStreamTimer(a),a.fallbackToTerminal=!0}async answer(a,b){if(this.dead||this.releasing||this.released||!this.writerFenceAllowsActuation())throw Error("Codex app-server host is unavailable");let c=this.attentions.get(a);if(!c)throw Error("attention request is missing or already answered");if(c.answer)throw Error("attention answer is already awaiting confirmation");await new Promise((a,d)=>{let e=setTimeout(()=>{c.answer=void 0;let a=Error("attention answer timed out; outcome is uncertain");d(a),this.fail(a)},this.requestTimeoutMs);c.answer={resolve:a,reject:d,timer:e},this.write({jsonrpc:"2.0",id:c.rpcId,result:b??{}})})}async health(){return this.currentState()}onStateChange(a){return this.stateListeners.add(a),a(this.currentState()),()=>this.stateListeners.delete(a)}setWriterFence(a){this.writerFence=a}writerFenceAllowsActuation(){try{return this.writerFence?.()??!0}catch{return!1}}currentState(){let a=this.reaped||this.released?null:this.child.pid??null,b=a&&"owned"===this.childProcessOwnership()?this.childStartIdentity:null;return{status:this.dead?"dead":this.released?"unhosted":this.attentions.size>0?"attention":this.activeTurnId?"active":this.engineStatus,sessionKey:this.identity.threadId,endpoint:a?`stdio:${a}`:"stdio:released",pid:a,processStartIdentity:b,eventCursor:this.cursor,protocolVersion:this.protocolVersion,activeTurnRef:this.activeTurnId,pendingAttention:[...this.attentions.keys()],activeFlags:[...this.activeFlags],account:this.account}}async release(){if(!this.released){if(!this.releasePromise){let a=this.releaseAndReap();this.releasePromise=a,a.catch(()=>{this.releasePromise===a&&(this.releasePromise=null)})}return this.releasePromise}}async releaseAndReap(){if(this.realtimeDeliveryEpoch+=1,this.realtimeSessionId){let a=this.rpc("thread/realtime/stop",{threadId:this.identity.threadId},2e3);await a.catch(()=>void 0),this.realtimeSessionId=null}for(let a of(this.releasing=!0,this.unresolvedVoicePersonaBootstrap=null,this.rejectRealtimeStart(Error("Codex app-server host released")),this.rejectPendingAnswers(Error("Codex app-server host released")),this.rejectPendingDeliveries(Error("Codex app-server host released")),this.rejectPendingCompactions(Error("Codex app-server host released")),this.pending.values()))clearTimeout(a.timer),a.reject(Error("Codex app-server host released"));this.pending.clear();let a=this.startTermination(),b=this.childProcessOwnership();if(!this.reaped&&("gone"===b||"recycled"===b))return void await this.finishReleaseAfterGroupCleanup();if(this.reaped||"owned"!==b||a||(a=this.startTermination()),!this.reaped&&!a)throw Error("Codex app-server child ownership is unknown");if(!await this.waitForReap(this.shutdownGraceMs)){let a=this.childProcessOwnership();if(!this.reaped&&("gone"===a||"recycled"===a))return void await this.finishReleaseAfterGroupCleanup();if(!this.reaped&&"unknown"===a)throw Error("Codex app-server child ownership is unknown");if(this.signalTermination("SIGKILL"),!await this.waitForReap(this.shutdownGraceMs)){let a=this.childProcessOwnership();if(!this.reaped&&("gone"===a||"recycled"===a))return void await this.finishReleaseAfterGroupCleanup();if(!this.reaped&&"unknown"===a)throw Error("Codex app-server child ownership is unknown");throw Error("Codex app-server child could not be reaped")}}await this.finishReleaseAfterGroupCleanup()}async finishReleaseAfterGroupCleanup(){await this.terminationPromise,this.finishRelease()}finishRelease(){if(this.released)return;this.clearVoiceStreamTimers(),this.failureCleanupTimer&&(clearTimeout(this.failureCleanupTimer),this.failureCleanupTimer=null),this.released=!0,this.releasing=!1,this.activeTurnId=null,this.attentions.clear(),this.setSessionStatus("unhosted",[]),(this.ledgerFailed||!this.eventLedgerRestored)&&this.notifyStateListeners(),this.closeSubscribers();let a=this.releaseCleanup;this.releaseCleanup=null,a?.()}completeGroupCleanupAfterReap(){if(this.terminationStarted&&this.resolveTermination){this.terminationTimer&&(clearTimeout(this.terminationTimer),this.terminationTimer=null);try{"gone"===this.childProcessOwnership()&&(0,i.v)(this.child.pid,"SIGKILL",this.signalProcess)}finally{this.resolveTermination(),this.resolveTermination=null}}}startTermination(){if(this.terminationStarted)return!0;try{this.child.stdin.end()}catch{}let a=this.childProcessOwnership();return"gone"===a?((0,i.v)(this.child.pid,"SIGTERM",this.signalProcess),(0,i.v)(this.child.pid,"SIGKILL",this.signalProcess),this.terminationStarted=!0,this.terminationPromise=Promise.resolve(),!0):"owned"===a&&"unsafe"!==this.signalTermination("SIGTERM")&&(this.terminationStarted=!0,this.terminationPromise=new Promise(a=>{this.resolveTermination=a}),this.terminationTimer=setTimeout(()=>{this.terminationTimer=null;try{this.signalTermination("SIGKILL")}finally{this.resolveTermination?.(),this.resolveTermination=null}},this.shutdownGraceMs),!0)}childProcessOwnership(){let a=this.child.pid;if(!a||!Number.isInteger(a)||a<=0||!this.pidAlive(a))return"gone";let b=this.processIdentity(a);return null===this.childStartIdentity||null===b?"unknown":b===this.childStartIdentity?"owned":"recycled"}signalTermination(a){let b=this.childProcessOwnership();return"gone"===b?((0,i.v)(this.child.pid,a,this.signalProcess),"attempted"):this.reaped||"owned"!==b?"unsafe":((0,i.f)(this.child,a,this.signalProcess),"attempted")}async waitForReap(a){let b;if(this.reaped)return!0;try{return await Promise.race([this.reapedPromise.then(()=>!0),new Promise(c=>{b=setTimeout(()=>c(!1),a)})])}finally{b&&clearTimeout(b)}}emit(a){let b;if(this.ledgerFailed)return;if(!this.eventLedgerRestored){if(this.preRestoreEvents.length+this.preRestoreMessages.length>=256){this.ledgerFailed=!0,this.failWithoutLedger(Error("Codex app-server pre-restore event buffer exceeded its bounded capacity"));return}this.preRestoreEvents.push(a);return}try{b=(0,z.RO)(this.cursor)}catch(a){this.ledgerFailed=!0,this.failWithoutLedger(Error(V(a)));return}this.cursor=b;let c={...a,seq:b};try{this.eventStore.append(this.identity.threadId,c)}catch(a){this.ledgerFailed=!0,this.cursor=this.events.at(-1)?.seq??Math.max(0,this.cursor-1),this.failWithoutLedger(Error(`runtime event ledger failed: ${V(a)}`));return}for(let a of(this.events.push(c),this.subscribers))a.queue.push(c),a.wake?.();this.notifyStateListeners()}restoreEvents(){let a=this.eventStore.load(this.identity.threadId),b=new Map([...this.attentions].filter(([,a])=>"current"===a.origin));for(let b of(this.attentions.clear(),this.clearVoiceStreamTimers(),this.voiceStreams.clear(),this.pendingVoiceChunks.clear(),this.cancelledVoiceTurns.clear(),this.events.splice(0,this.events.length,...a),this.cursor=(0,z.dq)(this.identity.threadId,a.at(-1)?.seq??0,this.cursor,this.onEventCursorRecovery),a)){if("turn-started"===b.kind&&(this.cancelledVoiceTurns.delete(b.turnId),this.activeTurnId=b.turnId),"delta"===b.kind&&this.observeVoiceDelta(b.turnId,b.text),"voice-chunk"===b.kind){let a=(0,v.Im)([b.delivery])[0],c=a?.responses[0],d=a?.sourceTurnId?this.voiceStream(a.sourceTurnId):null;a?.streamChunk&&c&&d&&a.streamChunk.startOffset===d.emittedChars&&d.buffer.startsWith(c.text)?(d.buffer=d.buffer.slice(c.text.length),d.emittedChars=a.streamChunk.endOffset,d.emittedHash.update(c.text),d.nextChunkIndex=Math.max(d.nextChunkIndex,a.streamChunk.index+1),this.pendingVoiceChunks.set(a.deliveryId,a.sourceTurnId)):d&&(d.fallbackToTerminal=!0,d.buffer="")}if("item"===b.kind&&"completed"===b.phase&&b.turnId&&(0,v.mT)(b.item,"restored")){let a=this.voiceStreams.get(b.turnId);a&&this.resetVoiceStreamSegment(a)}if("turn-ended"===b.kind){b.turnId===this.activeTurnId&&(this.activeTurnId=null);let a=this.voiceStreams.get(b.turnId);a&&this.clearVoiceStreamTimer(a),this.voiceStreams.delete(b.turnId),"completed"!==b.status&&this.cancelledVoiceTurns.add(b.turnId)}if("attention"===b.kind&&this.attentions.set(b.id,{rpcId:"restored",method:b.method,origin:"restored"}),"attention-resolved"===b.kind&&this.attentions.delete(b.id),"realtime-delivery-progress"===b.kind&&this.realtimeDeliveries.set(b.deliveryId,{digest:b.digest,responseIndex:b.responseIndex,offset:b.offset,acknowledged:!1}),"realtime-delivery-acknowledged"===b.kind){let a=this.realtimeDeliveries.get(b.deliveryId);this.realtimeDeliveries.set(b.deliveryId,{digest:b.digest,responseIndex:a?.responseIndex??0,offset:a?.offset??0,acknowledged:!0}),this.pendingVoiceChunks.delete(b.deliveryId)}"session-status"===b.kind&&(this.engineStatus=b.status,this.activeFlags=[...b.activeFlags??[]],("unhosted"===b.status||"dead"===b.status)&&(this.activeTurnId=null,this.attentions.clear()))}for(let[a,c]of b)this.attentions.set(a,c);return this.eventLedgerRestored=!0,a.length}reconcileAfterOpen(a,b){let c=a??{type:"idle",activeFlags:[]};if("active"===c.type&&!b)throw Error("thread/resume returned active status without an active turn id");let d=null!==b&&this.bufferedTerminalTurnIds.has(b);if("active"===c.type&&b&&!d&&this.activeTurnId!==b&&(this.activeTurnId&&this.emit({kind:"turn-ended",turnId:this.activeTurnId,status:"error"}),this.activeTurnId=b,this.emit({kind:"turn-started",turnId:b})),this.activeTurnId&&"active"!==c.type){let a=this.activeTurnId;this.activeTurnId=null,this.emit({kind:"turn-ended",turnId:a,status:"error"})}for(let[a,b]of[...this.attentions])"restored"===b.origin&&(this.attentions.delete(a),this.emit({kind:"attention-resolved",id:a,resolution:"host-restarted"}));this.emitThreadStatus(d&&!this.activeTurnId?{type:"idle",activeFlags:[]}:c)}reconcileThreadHistory(a){for(let b of _(a))this.reconcileTurnHistory(b)}reconcileTurnHistory(a){let b=S(a,"id");if(!b)return;let c=this.events.filter(a=>"turnId"in a&&a.turnId===b),d=S(a,"status"),e=c.some(a=>"turn-started"===a.kind);this.bufferedTerminalTurnIds.has(b)||e&&("inProgress"!==d||this.activeTurnId===b)||(this.activeTurnId=b,this.emit({kind:"turn-started",turnId:b}));let f=new Map;for(let a of c){if("item"!==a.kind||"completed"!==a.phase)continue;let b=aa(a.item);f.set(b,(f.get(b)??0)+1)}if(Array.isArray(a.items))for(let c of a.items){let a=this.boundImageBodies(c),d=aa(a),e=f.get(d)??0;if(e>0){f.set(d,e-1);continue}this.emit({kind:"item",turnId:b,item:a,phase:"completed"})}if("completed"===d||"interrupted"===d||"failed"===d||"error"===d){let a=Z(d),e=c.findLast(a=>"turn-ended"===a.kind);(e?.kind!=="turn-ended"||e.status!==a)&&this.emit({kind:"turn-ended",turnId:b,status:a}),this.activeTurnId===b&&(this.activeTurnId=null)}}rememberConfirmedDeliveries(a){for(let b of _(a)){let a=S(b,"id");if(a&&Array.isArray(b.items))for(let c of b.items)this.rememberConfirmedDelivery(a,c)}}async confirmedDelivery(a){let b,c=this.confirmedDeliveries.get(a.id);if(c)return this.confirmedReceipt(a,c);try{let a=this.activeTurnId?3*this.requestTimeoutMs:this.requestTimeoutMs;b=await this.rpc("thread/read",{threadId:this.identity.threadId,includeTurns:!0},a)}catch(b){let a=V(b);if(/not materialized yet/i.test(a)&&/before first user message/i.test(a))return null;throw b}if(this.dead)throw Error(V(this.failure??"Codex app-server host is unavailable"));this.rememberConfirmedDeliveries(b);let d=this.confirmedDeliveries.get(a.id);return d?this.confirmedReceipt(a,d):null}awaitDeliveryConfirmation(a,b){let c,d,e=this.confirmedDeliveries.get(a.id);if(e)return this.confirmedReceipt(a,e),e.receipt=b,Promise.resolve(b);let f=this.pendingDeliveries.get(a.id);if(f)return f.contentDigest!==a.contentDigest?Promise.reject(Error("Codex queue entry id belongs to a different payload")):f.promise;let g=new Promise((a,b)=>{c=a,d=b}),h=setTimeout(()=>{this.pendingDeliveries.get(a.id)?.promise===g&&this.fail(Error("Codex delivery confirmation timed out; outcome is uncertain"))},this.deliveryConfirmationTimeoutMs),i={text:a.text??"",contentDigest:a.contentDigest,receipt:b,promise:g,resolve:c,reject:d,timer:h};return this.pendingDeliveries.set(a.id,i),g}confirmedReceipt(a,b){if(!(b.contentDigest?b.contentDigest===a.contentDigest:b.text===a.text))throw Error("Codex queue entry id belongs to a different payload");return b.receipt}rememberConfirmedDelivery(a,b){let c=R(b);if(!c||"userMessage"!==S(c,"type"))return;let d=S(c,"clientId");if(!d)return;let e=ac(c),f=null===e?null:(0,m.$)(e),g=f?.text??null,h=f?.contentDigest??null,i=this.confirmedDeliveries.get(d),j=this.pendingDeliveries.get(d),k={receipt:i?.receipt??j?.receipt??{outcome:"turn-started",turnId:a},text:i&&(i.text!==g||i.contentDigest!==h)?null:g,contentDigest:i&&(i.text!==g||i.contentDigest!==h)?null:h};if(this.confirmedDeliveries.set(d,k),j){this.pendingDeliveries.delete(d),clearTimeout(j.timer);try{j.resolve(this.confirmedReceipt({id:d,text:j.text,contentDigest:j.contentDigest},k))}catch(a){j.reject(a instanceof Error?a:Error(V(a)))}}}flushPreRestoreEvents(){for(let a of this.preRestoreEvents.splice(0))this.emit(a)}beginBufferedNotificationReconciliation(){this.bufferedTerminalTurnIds.clear();let a=[];for(let b of this.events){if("attention"===b.kind&&!this.attentions.has(b.id))continue;let c=ab(b);c&&a.push(c)}let b=[],c=this.activeTurnId;for(let{message:a}of this.preRestoreMessages){let d="string"==typeof a.method?a.method:null;if(!d)continue;let e=R(a.params)??{},f=a.id;if("number"==typeof f||"string"==typeof f){let a=ab({kind:"attention",id:`${d}:${String(f)}`,method:d,attention:e});a&&b.push(a);continue}let g=Y(e);if("turn/started"===d&&g&&(c=g),"item/agentMessage/delta"===d){let a=ab({kind:"delta",turnId:g??c??"unknown",text:S(e,"delta")??""});a&&b.push(a)}"turn/completed"===d&&g===c&&(c=null)}let d=Math.min(a.length,b.length),e=0;for(let c=d;c>0;c-=1){let d=a.length-c;if(b.slice(0,c).every((b,c)=>b===a[d+c])){e=c;break}}this.bufferedNotificationOverlap=b.slice(0,e)}consumeBufferedNotification(a){let b=ab(a);return b&&this.bufferedNotificationOverlap[0]===b?(this.bufferedNotificationOverlap.shift(),!0):(this.bufferedNotificationOverlap=[],!1)}endBufferedNotificationReconciliation(){this.bufferedNotificationOverlap=[],this.bufferedTerminalTurnIds.clear()}flushPreRestoreMessages(a){let b=new Map(_(a).flatMap(a=>{let b=S(a,"id");return b?[[b,a]]:[]}));for(let{message:a,bytes:c}of this.preRestoreMessages.splice(0)){if(this.preRestoreBytes-=c,"turn/completed"===a.method){let c=Y(R(a.params)??{}),d=c?b.get(c):null;d&&this.reconcileTurnHistory(d)}if(this.acceptParsedMessage(a,!0),this.dead||this.releasing||this.released)break}this.preRestoreBytes=0}notifyStateListeners(){let a=this.currentState();for(let b of this.stateListeners)b(a)}closeSubscribers(){for(let a of this.subscribers)a.closed=!0,a.wake?.();this.subscribers.clear()}setSessionStatus(a,b){let c=b.filter(a=>a!==n.Zx);"supported"===this.imageInputSupport&&"unhosted"!==a&&"dead"!==a&&c.push(n.Zx),this.engineStatus=a,this.activeFlags=c,this.emit({kind:"session-status",status:a,...c.length>0?{activeFlags:[...c]}:{}})}emitThreadStatus(a){if("systemError"===a.type)return void this.setSessionStatus("idle",a.activeFlags);let b="notLoaded"===a.type?"unhosted":a.type;this.setSessionStatus(b,a.activeFlags)}rpc(a,b={},c=this.requestTimeoutMs){if(this.dead||this.releasing||this.released)return Promise.reject(Error("Codex app-server host is unavailable"));let d=this.nextRpcId++;return N.has(a)&&this.trackReplayEnvelopeRequest(d),new Promise((e,f)=>{let g=setTimeout(()=>{this.pending.delete(d),"thread/read"===a&&this.rememberLateThreadReadResponse(d,c);let b=Error(`${a} timed out${Q.has(a)?"; outcome is uncertain":""}`);f(b),Q.has(a)&&this.fail(b)},c);this.pending.set(d,{resolve:e,reject:f,timer:g}),this.write({jsonrpc:"2.0",id:d,method:a,params:b})})}rememberLateThreadReadResponse(a,b){let c=Date.now();for(let[a,b]of this.lateThreadReadResponses)b<=c&&this.lateThreadReadResponses.delete(a);let d=Math.max(3*b,1e3);for(this.lateThreadReadResponses.set(a,c+d);this.lateThreadReadResponses.size>32;){let a=this.lateThreadReadResponses.keys().next().value;if(void 0===a)break;this.lateThreadReadResponses.delete(a)}}consumeLateThreadReadResponse(a){let b=this.lateThreadReadResponses.get(a);return void 0!==b&&(this.lateThreadReadResponses.delete(a),b>Date.now())}notify(a,b){this.write({jsonrpc:"2.0",method:a,params:b})}write(a){try{this.child.stdin.write(`${JSON.stringify(a)}
|
|
80
|
-
`)}catch(a){this.fail(Error(`Codex app-server stdin failed: ${V(a)}`))}}boundImageBodies(a){try{var b;let c,d;return(b={store:(a,b)=>{let c=(0,t.PF)(),[d]=c.putMany([{base64:a.toString("base64"),mime:b}]);return d?c.pathFor(d):null}},c=[],{value:(d=(a,e)=>{if("string"==typeof a){if(!e||!p.has(e))return a;let d=function(a){let b=o.exec(a.trim());if(!b)return null;let c=(0,n.CC)(b[1]);if(!c)return null;let d=Buffer.from(b[2],"base64");return d.byteLength?{data:d,mime:c}:null}(a);if(!d)return a;let g=function(a,b,c){let d=f().createHash("sha256").update(a).digest("hex"),e=null;try{e=c.store(a,b)}catch{e=null}return{type:"localImage",path:e??"",sha256:d,mime:b,bytes:a.byteLength}}(d.data,d.mime,b);return c.push({sha256:g.sha256,mime:d.mime,bytes:g.bytes}),g}if(Array.isArray(a)){let b=!1,c=a.map(a=>{let c=d(a,e);return c!==a&&(b=!0),c});return b?c:a}if(!a||"object"!=typeof a)return a;let g=!1,h={};for(let[b,c]of Object.entries(a)){let a=d(c,b);a!==c&&(g=!0),h[b]=a}return g?h:a})(a,null),captured:c}).value}catch{return a}}acceptStdout(a){let b=a;for(;b;){if(this.dead||this.releasing||this.released){this.stdoutBuffer="",this.replayReduction=null;return}b=this.replayReduction?this.feedReplayReduction(b):this.acceptPlainStdout(b)}(this.dead||this.releasing||this.released)&&(this.stdoutBuffer="",this.replayReduction=null)}acceptPlainStdout(a){this.stdoutBuffer+=a;let b=this.stdoutBuffer.indexOf("\n");for(;b>=0;){let a=this.stdoutBuffer.slice(0,b).trim();if(this.stdoutBuffer=this.stdoutBuffer.slice(b+1),Buffer.byteLength(a)>M){if(null===this.awaitedReplayEnvelopeId(a))return this.fail(Error("Codex app-server emitted an oversized JSONL frame")),"";let b=this.stdoutBuffer;if(this.stdoutBuffer="",this.replayReduction=new s(P),!this.feedReplayFrame(a))return"";return this.finishReplayReduction(),this.dead||this.releasing||this.released?"":b}if(a&&this.acceptMessage(a),this.dead||this.releasing||this.released)return this.stdoutBuffer="","";b=this.stdoutBuffer.indexOf("\n")}let c=Buffer.byteLength(this.stdoutBuffer);if(c>262144&&null!==this.awaitedReplayEnvelopeId(this.stdoutBuffer)){let a=this.stdoutBuffer;return this.stdoutBuffer="",this.replayReduction=new s(P),a}return c>M&&(this.fail(Error("Codex app-server emitted an oversized JSONL frame")),this.stdoutBuffer=""),""}feedReplayReduction(a){let b=a.indexOf("\n");return this.feedReplayFrame(-1===b?a:a.slice(0,b))&&-1!==b?(this.finishReplayReduction(),this.dead||this.releasing||this.released?"":a.slice(b+1)):""}feedReplayFrame(a){try{return this.replayReduction.feed(a),!0}catch(a){return this.replayReduction=null,this.fail(a instanceof q?a:Error(V(a))),!1}}finishReplayReduction(){let a,b=this.replayReduction;this.replayReduction=null;try{a=b.finish().trim(),Buffer.byteLength(a)>M&&(a=(function(a,b,c){let d=a,e=c.maxStringUnits,f=!1;for(;Buffer.byteLength(d)>b&&e>64;){e=Math.max(64,Math.floor(e/4));let a=new s({...c,maxStringUnits:e,...f?{maxImageStringUnits:e}:{}});a.feed(d),d=a.finish(),f=!0}return d})(a,M,P).trim())}catch(a){this.fail(a instanceof q?a:Error(V(a)));return}Buffer.byteLength(a)>M?this.fail(Error("Codex app-server emitted an oversized JSONL frame")):a&&this.acceptMessage(a)}awaitedReplayEnvelopeId(a){let b=O.exec(a.slice(0,64).trimStart());if(!b)return null;let c=Number(b[1]);return this.replayEnvelopeRequestIds.has(c)?c:null}trackReplayEnvelopeRequest(a){for(this.replayEnvelopeRequestIds.add(a);this.replayEnvelopeRequestIds.size>64;){let a=this.replayEnvelopeRequestIds.values().next().value;if(void 0===a)break;this.replayEnvelopeRequestIds.delete(a)}}acceptStderr(a){for(this.stderrTail+=a;Buffer.byteLength(this.stderrTail,"utf8")>16384;)this.stderrTail=this.stderrTail.slice(Math.max(1,Math.floor(this.stderrTail.length/4)))}acceptMessage(a){let b;try{b=R(JSON.parse(a))}catch{b=null}if(!b)return void this.fail(Error("Codex app-server emitted malformed JSON-RPC"));if("string"==typeof b.method&&!this.eventLedgerRestored){let c=Buffer.byteLength(a);return this.preRestoreEvents.length+this.preRestoreMessages.length>=256||this.preRestoreBytes+c>4194304?void this.fail(Error("Codex app-server pre-restore notification buffer exceeded its bounded capacity")):(this.preRestoreMessages.push({message:b,bytes:c}),void(this.preRestoreBytes+=c))}this.acceptParsedMessage(b)}acceptParsedMessage(a,b=!1){let c=a.id,d="string"==typeof a.method?a.method:null;if(("number"==typeof c||"string"==typeof c)&&!d){if("number"!=typeof c)return this.fail(Error("Codex app-server response id is invalid"));this.replayEnvelopeRequestIds.delete(c);let b=this.pending.get(c);if(!b&&this.consumeLateThreadReadResponse(c))return;if(!b)return this.fail(Error("Codex app-server response has no matching request"));this.pending.delete(c),clearTimeout(b.timer);let d=R(a.error);return void(d?b.reject(Error(`Codex app-server request failed: ${V(d.message??"unknown error")}`)):b.resolve(a.result))}if(!d)return this.fail(Error("Codex app-server message has no method"));let e=R(a.params)??{};if("number"==typeof c||"string"==typeof c){let a=`${d}:${String(c)}`;this.attentions.set(a,{rpcId:c,method:d,origin:"current"});let f={kind:"attention",id:a,method:d,attention:e};b&&this.consumeBufferedNotification(f)||this.emit(f);return}this.acceptNotification(d,e,b)}acceptNotification(a,b,c=!1){if("thread/realtime/started"===a){let a=this.pendingRealtimeStart;if(!a||S(b,"threadId")!==this.identity.threadId)return;a.started=!0,a.realtimeSessionId=S(b,"realtimeSessionId"),this.realtimeSessionId=a.realtimeSessionId,this.resumeVoiceStreams(),this.resolveRealtimeStart();return}if("thread/realtime/sdp"===a){let a=this.pendingRealtimeStart;return a&&S(b,"threadId")===this.identity.threadId?(a.sdp=S(b,"sdp"),a.sdp)?void this.resolveRealtimeStart():void this.rejectRealtimeStart(Error("Codex app-server returned an empty WebRTC SDP answer")):void 0}if("thread/realtime/error"===a){if(S(b,"threadId")!==this.identity.threadId)return;let a=S(b,"message")??"Codex realtime session failed";this.recordRealtimeFailure(a),this.rejectRealtimeStart(Error(a));return}if("thread/realtime/closed"===a){if(S(b,"threadId")!==this.identity.threadId)return;let a=S(b,"reason")??"Codex realtime session closed";this.recordRealtimeFailure(a,{keepExisting:!0}),this.rejectRealtimeStart(Error(a));return}let d=Y(b);if("serverRequest/resolved"===a){let a=b.requestId;if("number"!=typeof a&&"string"!=typeof a)return;let c=[...this.attentions.entries()].find(([,b])=>String(b.rpcId)===String(a));if(!c)return;let d=c[1].answer;d&&(clearTimeout(d.timer),d.resolve()),this.attentions.delete(c[0]),this.emit({kind:"attention-resolved",id:c[0],resolution:d?"answered":"server-resolved"});return}if("turn/started"===a&&d){if(c){let a=this.events.some(a=>"turn-started"===a.kind&&a.turnId===d),b=this.events.some(a=>"turn-ended"===a.kind&&a.turnId===d);if(a&&(b||null!==this.activeTurnId))return}this.cancelledVoiceTurns.delete(d),this.activeTurnId=d,this.emit({kind:"turn-started",turnId:d});return}if("item/agentMessage/delta"===a){let a={kind:"delta",turnId:d??this.activeTurnId??"unknown",text:S(b,"delta")??""};c&&this.consumeBufferedNotification(a)||(this.emit(a),this.observeVoiceDelta(a.turnId,a.text));return}if(("item/started"===a||"item/completed"===a)&&"item"in b){"item/completed"===a&&d&&this.rememberConfirmedDelivery(d,b.item);let e=d??this.activeTurnId,f="item/started"===a?"started":"completed";if(c&&e){if(this.events.some(a=>"turn-ended"===a.kind&&a.turnId===e))return;let a=aa(b.item);if(this.events.some(b=>"item"===b.kind&&b.turnId===e&&b.phase===f&&aa(b.item)===a))return;this.events.some(a=>"turn-started"===a.kind&&a.turnId===e)||(this.activeTurnId=e,this.emit({kind:"turn-started",turnId:e}))}let g="completed"===f&&e?this.finalizeVoiceStreamItem(e,b.item):void 0;this.emit({kind:"item",turnId:e,item:this.boundImageBodies(b.item),phase:f,...void 0!==g?{voiceResponse:g}:{}}),R(b.item)?.type==="contextCompaction"&&this.acceptCompactionItem(b.item,f);return}if("turn/completed"===a&&d){let a=R(b.turn),e=Z(a?.status);if(c&&this.bufferedTerminalTurnIds.add(d),c&&this.events.some(a=>"turn-ended"===a.kind&&a.turnId===d))return;if(this.activeTurnId===d&&(this.activeTurnId=null),c&&!this.events.some(a=>"turn-started"===a.kind&&a.turnId===d)&&this.emit({kind:"turn-started",turnId:d}),"completed"!==e)this.cancelVoiceStream(d);else{let a=this.voiceStreams.get(d);a&&this.clearVoiceStreamTimer(a),this.voiceStreams.delete(d)}this.emit({kind:"turn-ended",turnId:d,status:e}),this.settlePendingCompactionsFromTerminalTurn(a,e);return}if("account/rateLimits/updated"===a)return void this.emit({kind:"limits",snapshot:b});if("thread/compacted"===a)return void this.acceptCompactedNotification(b);if("thread/status/changed"===a){let a=ae(b);a&&this.emitThreadStatus(a)}}fail(a,b=[]){if(!this.dead&&!this.released){for(let b of(this.clearVoiceStreamTimers(),this.dead=!0,this.failure=a,this.activeTurnId=null,this.rejectRealtimeStart(a),this.rejectPendingAnswers(a),this.rejectPendingDeliveries(a),this.rejectPendingCompactions(a),this.attentions.clear(),this.pending.values()))clearTimeout(b.timer),b.reject(Error(V(a)));this.pending.clear(),this.setSessionStatus("dead",b),this.closeSubscribers(),this.startFailureCleanup()}}failWithoutLedger(a){if(!this.dead&&!this.released){for(let b of(this.dead=!0,this.failure=a,this.engineStatus="dead",this.activeFlags=[],this.activeTurnId=null,this.rejectRealtimeStart(a),this.rejectPendingAnswers(a),this.rejectPendingDeliveries(a),this.rejectPendingCompactions(a),this.attentions.clear(),this.pending.values()))clearTimeout(b.timer),b.reject(Error(V(a)));this.pending.clear(),this.notifyStateListeners(),this.closeSubscribers(),this.startFailureCleanup()}}startFailureCleanup(){this.release().catch(()=>{this.released||this.failureCleanupTimer||(this.failureCleanupTimer=setTimeout(()=>{this.failureCleanupTimer=null,this.startFailureCleanup()},this.shutdownGraceMs))})}rejectPendingAnswers(a){let b=Error(V(a));for(let a of this.attentions.values())a.answer&&(clearTimeout(a.answer.timer),a.answer.reject(b),a.answer=void 0)}rejectPendingDeliveries(a){let b=Error(V(a));for(let a of this.pendingDeliveries.values())clearTimeout(a.timer),a.reject(b);this.pendingDeliveries.clear()}resolveRealtimeStart(){let a=this.pendingRealtimeStart;a?.started&&null!==a.sdp&&(this.pendingRealtimeStart=null,clearTimeout(a.timer),a.resolve({sdp:a.sdp,realtimeSessionId:a.realtimeSessionId,personaBootstrap:a.personaBootstrap}))}currentRealtimeSessionId(){return this.realtimeSessionId}lastRealtimeFailure(){return this.realtimeFailure}recordRealtimeFailure(a,b={}){b.keepExisting&&this.realtimeFailure||(this.realtimeFailure={message:a.slice(0,500),at:new Date().toISOString(),realtimeSessionId:this.realtimeSessionId})}rejectRealtimeStart(a){let b=this.pendingRealtimeStart;b&&(this.pendingRealtimeStart=null,clearTimeout(b.timer),b.reject(Error(V(a))))}}},56809:(a,b,c)=>{c.d(b,{X:()=>j,j:()=>g});var d=c(73024),e=c.n(d),f=c(23261);function g(a){return(0,f.fp)(a).replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g,"[redacted]").replace(/(^|\n)(\s*(?:proxy-)?authorization\s*:\s*)[^\r\n]*/gi,"$1$2[redacted]").replace(/(^|\n)(\s*(?:set-)?cookie\s*:\s*)[^\r\n]*/gi,"$1$2[redacted]").replace(/\b(?:sk-[A-Za-z0-9_-]{12,}|sk-ant-[A-Za-z0-9_-]{12,}|gh[pousr]_[A-Za-z0-9_]{20,}|github_pat_[A-Za-z0-9_]{20,}|npm_[A-Za-z0-9]{20,}|xox[baprs]-[A-Za-z0-9-]{10,}|AKIA[0-9A-Z]{16}|ASIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{35})\b/g,"[redacted]").replace(/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,"[redacted]").replace(/(?<=Bearer\s)[A-Za-z0-9._-]{12,}/gi,"[redacted]")}function h(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}function i(a){return"string"==typeof a?a:""}function j(a,b,c,d){let f=function(a){let b,c,d=null;try{d=e().openSync(a.path,e().constants.O_RDONLY|e().constants.O_NOFOLLOW);let f=e().fstatSync(d);if(!f.isFile())throw Error("transcript is not a regular file");let g=e().lstatSync(a.path);if(!g.isFile()||g.dev!==f.dev||g.ino!==f.ino)throw Error("transcript identity changed");let h=Math.max(0,f.size-1048576);c=f.size-h;let i=Buffer.alloc(c);e().readSync(d,i,0,i.length,h),b=i.toString("utf8"),h>0&&(b=b.slice(b.indexOf("\n")+1))}catch{return{messages:[],scannedBytes:0,error:!0}}finally{null!==d&&e().closeSync(d)}let f=[];for(let c of b.split("\n"))try{let b=h(JSON.parse(c)),d=i(b.timestamp)||i(b.ts)||null;if("claude"===a.engine){var g;let a="user"===b.type?"user":"assistant"===b.type?"assistant":null,c=(g=h(b.message).content,"string"==typeof g?g:Array.isArray(g)?g.filter(a=>!!a&&"object"==typeof a&&!Array.isArray(a)).filter(a=>"text"===a.type).map(a=>i(a.text)).join("\n"):"");a&&c.trim()&&f.push({role:a,at:d,text:c})}else{let a=h(b.payload),c=i(a.type),e="user_message"===c?"user":"agent_message"===c?"assistant":null,g=i(a.message);e&&g.trim()&&f.push({role:e,at:d,text:g})}}catch{}return{messages:f,scannedBytes:c,error:!1}}(a),j=f.messages.slice(-b),k=0,l=0,m=!1,n=[];for(let a of j){let b=g(a.text).replace(/\s+/g," ").trim(),e=Math.max(0,c-k),f=Math.max(0,d-l);if(e<=0||f<=0){m=!0;break}let h=function(a,b,c){let d=0,e=0,f="";for(let g of a){let a=Buffer.byteLength(g,"utf8");if(e>=b||d+a>c)return{value:f,truncated:!0};f+=g,d+=a,e+=1}return{value:f,truncated:!1}}(b,e,f);m||=h.truncated,k+=[...h.value].length,l+=Buffer.byteLength(h.value,"utf8"),h.value&&n.push({role:a.role,at:a.at,text:h.value})}return{messages:n,truncated:m||f.error,scannedBytes:f.scannedBytes,...f.error?{error:"unavailable"}:{}}}},57563:(a,b,c)=>{c.d(b,{en:()=>d});let d={"common.serverUnavailable":"server unavailable","common.loading":"loading…","common.loadingCap":"Loading…","common.cancel":"Cancel","common.edit":"edit","common.show":"show","common.showAll":"show all","common.collapse":"collapse","common.copy":"Copy","common.copied":"copied","common.clickToCopy":"click to copy","common.yes":"Yes","common.no":"No","common.send":"Send","common.sending":"sending…","common.sent":"sent","common.close":"Close","common.failedSend":"couldn't send","common.failedDelete":"couldn't delete","common.nothingFound":"Nothing found","common.nothingRunning":"nothing is running right now","common.kb":"kB","common.chars":"{n} chars","lang.aria":"Interface language","util.effortTitle":"Reasoning effort: {effort}","runtimeConfig.model":"Running agent model","runtimeConfig.effort":"Running agent reasoning effort","runtimeConfig.speedTitle":"Fast uses the Codex priority service tier","runtimeConfig.apply":"Apply","runtimeConfig.failed":"Could not change the running agent configuration","runtimeConfig.pending":"switch pending","runtimeConfig.applied":"Conversation settings applied","time.agoSec":"{n}s ago","time.agoMin":"{n}m ago","time.agoHour":"{n}h ago","time.agoDay":"{n}d ago","turn.worked":"Worked for {d}","turn.running":"working {d}","turn.lastRun":"last run: {d}","turn.timer":"elapsed work time","cardStatus.needsYou":"needs you","cardStatus.held":"held","cardStatus.running":"working","cardStatus.queued":"queued","cardSwitch.pending":"switch pending","cardSwitch.pendingTo":"\xab{label}\xbb pending","cardSwitch.switching":"switching…","cardSwitch.switchingTo":"→ \xab{label}\xbb","cardSwitch.failed":"switch failed","cardSwitch.route":"\xab{from}\xbb → \xab{to}\xbb","kind.session":"session","kind.subagent":"subagent","kind.job":"job","kind.background":"background","kind.handoff":"handoff","rail.title":"Agent logs","rail.filter":"Filter projects…","rail.projects":"Projects","rail.overview":"Overview","rail.archive":"Archive","rail.crown":"Crown — pin to top","rail.uncrown":"Remove crown","rail.createProject":"Create project","rail.newProjectName":"Project name","rail.newProjectRoot":"Root directory (absolute path)","rail.create":"Create","rail.creating":"Creating…","rail.invalidName":"Enter a project name","rail.invalidRoot":"Directory not found","rail.missingRoot":"This directory doesn't exist yet","rail.createRootAndProject":"Create directory and project","rail.mkdirFailed":"Couldn't create the directory","rail.duplicateProject":"This project already exists","rail.createFailed":"Couldn't create the project","dash.branchesLive":{one:"{count} branch running",other:"{count} branches running"},"dash.trees":{one:"{count} tree",other:"{count} trees"},"dash.recentConvos":{one:"{count} recent conversation",other:"{count} recent conversations"},"dash.quietTrees":{one:"{count} quiet tree",other:"{count} quiet trees"},"dash.openProjects":"Open project list","dash.createMenu":"Create","dash.moreMenu":"More actions","dash.soundMenu":"Sound alerts","dash.unarchive":"Restore from archive","dash.newConvo":"New conversation with an agent","dash.agent":"Agent","dash.newWorkflow":"New workflow: stages → review → PR","dash.workflow":"Workflow","dash.task":"Task","dash.newTask":"New task","dash.pipelinesUnavailable":"Pipelines are temporarily unavailable: the pipelines state file could not be read. Other panels stay live.","dash.loadingBoard":"Loading the board…","dash.emptyTitle":"The scheme is empty for now","dash.emptyHint":"Open the switchboard in the bottom-right corner and click a conversation — it will appear here","dash.viewScheme":"scheme","dash.viewList":"conversations","dash.viewSchemeMenu":"View: scheme","dash.viewListMenu":"View: conversations","dash.viewMenuGroup":"Board view","dash.hiddenShelf":"Hidden","trash.title":"Root conversations","trash.hint":"Clicking a row opens the conversation as a node; the trash icon deletes its file from disk permanently.","trash.deletedFromDisk":"\xb7 deleted from disk","trash.open":"Open {title}","trash.activeSubtree":"active branches","trash.toArchive":"Archive","trash.notDeleted":"{failed} of {total} not deleted","trash.confirmDelete":{one:"Delete {count} project file from disk?",other:"Delete {count} project files from disk?"},"trash.deleting":"deleting…","trash.confirmYes":"Yes, delete","trash.deleteProject":"Delete project from disk","trash.projectLoadFailed":"Could not load every project conversation","list.title":"All conversations","list.hint":"Loaded in recent-first pages from every conversation stored for this project.","list.searchHint":"Searching every conversation stored across all projects.","list.loadMore":"Load more conversations","list.failed":"Could not load conversations","list.retry":"Retry","search.open":"Search your messages (/)","search.openMobile":"Search your messages","search.title":"Find my messages","search.aria":"Global message search","search.placeholder":"Search everything you've sent…","search.mine":"My messages","search.everything":"Everything","search.speakerAria":"Search scope","search.hint":"Type to search everything you've sent — every project, engine and account.","search.keysHint":"↑ ↓ to move \xb7 Enter to open \xb7 Esc to close","search.results":"Results","search.updating":"updating…","search.loadMore":"More results","search.none":"Nothing found for \xab{query}\xbb","search.corpus":"Searched {messages} across {conversations}","search.corpusMessages":{one:"{formatted} message",other:"{formatted} messages"},"search.corpusConversations":{one:"{formatted} conversation",other:"{formatted} conversations"},"search.everythingInstead":"Search everything instead","search.failed":"Search failed","search.retry":"Retry","search.untitled":"(no title)","search.speaker.you":"you","search.speaker.agent":"agent","search.close":"Close search","switch.aria":"Agent switchboard","switch.title":"Switchboard","switch.search":"Search title, first prompt, or project","switch.results":"All conversation results","switch.updating":"updating…","switch.close":"Close switchboard","switch.waiting":"Waiting for you","switch.working":"Working","switch.recent":"Recent","switch.older":"Older","switch.hidden":"Hidden ({count})","switch.hide":"hide","switch.restore":"restore","accounts.activeAria":"Active Codex account","accounts.placeholder":"Codex account","accounts.add":"Add","accounts.prompt":"Account label","accounts.login":"login","accounts.switchFailed":"Could not switch account","accounts.conversationTitle":"Run this conversation on","accounts.conversationPending":"Account switch pending","accounts.conversationApplied":"Conversation account switched","accounts.conversationUnconfirmed":"Account switch got no confirmation — try again","accounts.manage":"Manage accounts…","accounts.addFailed":"Could not add account","accounts.loginOpened":"Device login opened in {target}","accounts.openLogin":"Open sign-in","accounts.refreshFailed":"Could not refresh accounts. Try again.","accounts.loading":"Loading accounts…","accounts.noAccounts":"No accounts available yet.","limits.accountLoading":"Loading account limits…","accounts.retry":"Retry","accounts.title":"Codex accounts","accounts.trigger":"Accounts","accounts.active":"active","accounts.needsLogin":"needs sign-in","accounts.pendingLogin":"signing in…","accounts.auth.authenticated":"Authenticated","accounts.auth.signedOut":"Signed out","accounts.auth.unknown":"Auth unchecked","accounts.auth.error":"Auth error","accounts.operation.refresh":"Refreshing accounts…","accounts.operation.add":"Starting account sign-in…","accounts.operation.switch":"Switching the account for future launches…","accounts.operation.login":"Updating sign-in…","accounts.operation.remove":"Removing account…","accounts.operation.terminal":"Preparing the account command…","accounts.terminalCopied":"Command copied for {label}","accounts.terminalFailed":"Could not prepare the command for {label}","accounts.copyCli":"Copy CLI","accounts.copyCliAria":"Copy the agent command for {label}","accounts.labelPlaceholder":"New account label","accounts.confirmAdd":"Add","accounts.close":"Close","accounts.remove":"Remove","accounts.removeAria":"Remove {label}","accounts.removeConfirm":"Remove this account? Its past conversations stay readable.","accounts.removeConfirmCta":"Confirm","accounts.removeConfirmCancel":"Cancel","accounts.removeBlocked":"{label} still has an active session or sign-in.","accounts.removeHistoryBlocked":"{label} still runs live conversations. Wait for them to finish, then remove it.","accounts.removeFailed":"Could not remove this account.","accounts.cleanupPending":"{label} was removed. Its local data still needs cleanup.","accounts.cleanupManual":"Some local account data failed safety checks. Inspect and remove it manually.","accounts.cleanupFailed":"Could not clean up abandoned homes.","accounts.forceRemove":"Force remove","accounts.cleanupOrphans":"Clean up abandoned homes","accounts.titleFor":"{engine} accounts","accounts.triggerAria":"{engine} accounts — switch or add","accounts.effective":"{pct}%","accounts.effectiveTip":"{window} binds","accounts.effectiveStale":"{window} binds \xb7 stale","accounts.limitsAria":"Quota windows for {label}","accounts.limitsChecked":"Checked","accounts.limitsStale":"Last known values","accounts.limitsStaleTip":"Last known values — not a live read","accounts.claudeLoginStarted":"Sign-in started for {label}","accounts.claudeLogin.starting":"Starting sign-in…","accounts.claudeLogin.awaitingBrowser":"Waiting for the sign-in link…","accounts.claudeLogin.openLink":"Open claude.ai sign-in","accounts.claudeLogin.codeLabel":"Authorization code","accounts.claudeLogin.codePlaceholder":"Paste the code from the browser","accounts.claudeLogin.codeHint":"After signing in, copy the code claude.ai shows and paste it here.","accounts.claudeLogin.submit":"Submit code","accounts.claudeLogin.verifying":"Verifying…","accounts.claudeLogin.canceling":"Canceling…","accounts.claudeLogin.cancel":"Cancel","accounts.claudeLogin.signIn":"Sign in","accounts.claudeLogin.groupAria":"{label} sign-in","accounts.claudeLogin.err.timed_out":"Sign-in timed out.","accounts.claudeLogin.err.interrupted":"Sign-in was interrupted by a restart.","accounts.claudeLogin.err.verification_failed":"The code could not be verified.","accounts.claudeLogin.err.input_failed":"The code could not be submitted.","accounts.claudeLogin.err.login_busy":"Another sign-in is already in progress.","accounts.claudeLogin.err.generic":"Sign-in could not start. Try again.","accounts.claudeLogin.announceCodeReady":"Sign-in link ready for {label}. Open it and paste the code.","accounts.claudeLogin.announceDone":"{label} signed in.","migrate.confirmTitle":"Switch {engine} to \xab{label}\xbb?","migrate.confirmBody":"New agents use \xab{label}\xbb immediately. {idle} active sessions switch now; {busy} switch after their current turn; {deferred} inactive conversations switch when you message them again.","migrate.confirmCta":"Switch account","migrate.confirmAllCta":"Migrate all ({total})","migrate.confirmCancel":"Cancel","migrate.retargetTitle":"Redirect migration to \xab{label}\xbb?","migrate.retargetBody":"A migration to \xab{current}\xbb is still running. New agents use \xab{label}\xbb immediately; active sessions redirect there, while inactive conversations move when you message them. Migrate all also moves deferred history and previously moved conversations now.","migrate.banner":"Migrating to \xab{label}\xbb — {done}/{total} done","migrate.bannerWaiting":"{n} waiting on turns","migrate.bannerFailed":"{n} failed","migrate.bannerAria":"{engine} migration progress","migrate.stop":"Stop migration","migrate.bannerRetryFailed":"Retry failed ({n})","migrate.stoppedNotice":"Migration stopped. Remaining sessions stay on their current account; new agents keep using \xab{label}\xbb.","migrate.failedNotice":"{n} sessions couldn't move to \xab{label}\xbb.","migrate.completeNotice":"All {engine} sessions now on \xab{label}\xbb","migrate.announceComplete":"All {engine} sessions now on {label}","migrate.cardPending":"Account switch pending — after current turn","migrate.cardSwitching":"Switching to \xab{label}\xbb…","migrate.cardSwitchingUnnamed":"Switching account…","migrate.cardFailed":"Account switch failed","migrate.cardRetry":"Retry","migrate.cardKeep":"Keep on \xab{label}\xbb","migrate.ribbonAria":"Account migration status","migrate.divider":"Continued from \xab{label}\xbb — previous transcript archived","migrate.openPrevious":"Open previous transcript","migrate.heldSend":"Message held — delivers after the switch","migrate.readOnlyPredecessor":"Archived — this conversation continued under \xab{label}\xbb","migrate.retryFailed":"Couldn't retry the switch","migrate.keepFailed":"Couldn't keep this session on its current account","migrate.recoveryFailed":"{detail}","autobalance.title":"Auto balance","autobalance.desc":"Switches this engine's sessions when the active account drops below {threshold}% and another has more.","autobalance.toggleAria":"Auto balance for {engine}","autobalance.idle":"Last check {time} \xb7 no switch needed","autobalance.waitingFresh":"Paused — waiting for fresh quota data","autobalance.cooldown":"Cooldown — next check in {n} min","autobalance.draining":"Balancing now…","autobalance.switched":"Switched to \xab{to}\xbb at {time} — \xab{from}\xbb fell to {pct}% ({window})","autobalance.bannerTag":"Auto","autobalance.override":"Auto balance suggested \xab{to}\xbb; your choice takes over.","limits.windowSession":"5h window","limits.windowWeekly":"weekly window","switchCard.openColumn":"Open {title} as a column","switchCard.remove":"Remove from switchboard","composer.imagesCount":{one:"{count} image",other:"{count} images"},"composer.spawned":"launched agent in tmux {target}","composer.sentPaths":"sent {count} path(s)","composer.failedInterrupt":"couldn't interrupt","composer.escapeSent":"sent Escape — agent interrupted","composer.escapeSentWaiting":"sent Escape — waiting for the agent to stop","composer.spawnAria":"Launch an agent with a prompt","composer.resolvingAria":"Message the existing agent — delivery starts after its host is resolved","composer.sendAria":"Send a message to the agent in tmux {target}","composer.sendStructuredAria":"Send a message through the structured runtime host","composer.queueAria":"Queue of sent messages","composer.removeFromQueue":"Remove from queue","composer.deliveryHeld":"Held for \xab{label}\xbb — delivers after the account switch","composer.deliveryHeldUnnamed":"Held — delivers after the account switch","composer.deliveryHeldWaiting":"Held — waiting to be delivered","composer.admissionTimedOut":"Delivery confirmation timed out. Checking the durable receipt; your message remains preserved.","composer.deliveryUnconfirmed":"Delivery couldn't be confirmed. Your message is preserved — send again to retry safely; the same message key is reused.","composer.runtimePill":"Model and reasoning — applies to your next message","composer.reasoningGroup":"Reasoning","composer.modelGroup":"Model","composer.speedGroup":"Speed","composer.speedStandard":"Standard","composer.speedFastTier":"Fast — priority tier","composer.backTo":"Back","composer.nextMessageUses":"Next message: {model} \xb7 {effort}","composer.settingsNextResume":"applies when the conversation is next resumed","composer.structuredImagesUnavailable":"Image delivery is unavailable for structured conversations","composer.codexImagesTextOnly":"The selected Codex model accepts text input only.","composer.structuredImagesProtocol":"This structured host has no negotiated image capability.","composer.imagesBlockedDuringRecovery":"Drafted images will be sent after the host recovers; text can be sent right away.","composer.imageCapabilityLoading":"Image capability is loading.","composer.imageCapabilityError":"Image capability could not be loaded.","composer.imageCapabilityRetry":"Retry image check","composer.attachTerminal":"Attach terminal viewer","composer.attachTerminalReady":"terminal viewer ready in tmux {target}","composer.attachTerminalFailed":"couldn't create the terminal viewer","composer.receiptHeld":"held","composer.receiptQueued":"queued","composer.receiptRecovering":"recovering","composer.receiptFailed":"not delivered","composer.deliveredEcho":"Delivered — appearing in the feed","composer.retrySend":"Retry send","composer.placeholderRelay":"type — I'll relay through the root session…","composer.placeholderSpawn":"prompt — the agent will start…","composer.placeholderResolving":"message the agent — reconnecting to its session…","composer.placeholderSend":"message the agent…","composer.textAria":"Text for the agent","composer.optionsShow":"Show message options","composer.optionsHide":"Hide message options","composer.titleRelay":"relayed through the branch's root session","composer.titleSpawnResumed":"starts a fresh agent session that continues this conversation","composer.root":"root","composer.interruptAria":"Interrupt the agent (Escape)","composer.interruptTitle":"send Escape to the agent pane","composer.compactAria":"Compact the agent's context (/compact)","composer.compactTitle":"send /compact — the agent condenses its context; a band appears in the feed when done","composer.compactConfirm":"Compact?","composer.compactConfirmTitle":"Click again to send /compact","composer.compactSent":"compaction started — the band will appear in the feed once it's done","composer.failedCompact":"couldn't start compaction","composer.addImages":"Add images","composer.moreTools":"More actions","composer.stopAndSend":"Stop recording and send","composer.launchAgent":"Launch the agent","composer.sendToAgent":"Send to the agent","composer.stopAndSendTitle":"stop recording and send","composer.sendMenuTitle":"Send options","composer.quickAck":"Yes, continue","composer.quickAckLabel":"Continue","composer.quickAckAria":"Send a quick “Yes, continue” to the agent","composer.quickAckTitle":"Quick reply — yes, continue","strip.live":"live","strip.resume":"resume","strip.deadMode":"dead host","strip.moreActions":"More actions","strip.stopSubagent":"interrupts the root agent","strip.compactSubagent":"not available for subagents","strip.structuredUnsupported":"the structured host does not support this action yet","strip.compactEngineUnsupported":"this engine has no compact control","strip.compactBusyTurn":"not while a turn is running","strip.resolving":"resolving the agent host…","deadHost.title":"Agent inactive \xb7 {since} — messages will queue","deadHost.body":"Text you send now is saved durably and delivered after the host recovers. Images can't be attached until then. Pending approvals expired — recover with the controls below.","deadHost.respawn":"Respawn conversation","deadHost.attach":"Open in terminal","deadHost.recheck":"Re-check","deadHost.recheckFailed":"Couldn't reach the runtime — try again.","strip.recheckHint":"Re-check the runtime host","deadHost.respawnFailed":"Respawn failed — try again.","deadHost.sendBlocked":"host is dead — respawn to continue","deadHost.expiredCard":"expired — the host died before this was answered","superseded.title":"Round superseded \xb7 {since}","superseded.body":"A recovery replaced this round with a live successor. This transcript stays as round history.","superseded.open":"Open the live round","superseded.resumeHere":"Resume here","superseded.resumeConfirm":"Resume this retired round? It forks the work: this card goes live again beside the successor.","superseded.resumeFailed":"Couldn't clear the supersedence link — try again.","superseded.sendBlocked":"round superseded — open the live successor","lineage.continues":"round {round} \xb7 continues previous","lineage.continuesTitle":"Round {round}: continues a superseded predecessor round — click to open it","attach.dialogTitle":"Attach in your terminal","attach.dialogIntro":"Runs this conversation in your own terminal with the same account ({account}) and working directory.","attach.copyCwd":"Copy working directory","attach.copyCommand":"Copy command","attach.copyFull":"Copy full command","attach.copiedFull":"Full command copied to clipboard","attach.takeoverWarning":"Resuming here takes over the conversation from the viewer.","attach.subagentNote":"Subagents resume through their root session.","attach.secondaryViewer":"Open a read-only viewer pane in tmux","attach.secondaryFailed":"Couldn't open the viewer pane — try again.","receipt.human.deadHost":"the agent's host has died","receipt.human.staleKey":"the delivery key was stale","receipt.human.duplicate":"already delivered","receipt.human.turnActive":"the agent is mid-turn","receipt.human.noTurn":"there is no active turn","receipt.human.unsupportedCapability":"this engine has no such control","receipt.human.verbatim":"not delivered: {reason}","spawnCard.starting":"Launch admitted. Starting the agent.","spawnCard.binding":"Agent identity allocated. Binding the structured host.","spawnCard.queued":"The structured host is ready. The initial message is queued.","spawnCard.reconciling":"Delivery is reconciling with the structured host.","spawnCard.recoverable-timeout":"The initial-message timeout is recoverable while durable delivery settles.","spawnCard.live-late-success":"Late delivery succeeded and the live conversation was adopted.","spawnCard.failed":"The launch ended with an error.","spawnCard.recovered":"Durable evidence recovered this launch.","spawnCard.initial.pending":"Initial message: waiting for host binding","spawnCard.initial.queued":"Initial message: queued","spawnCard.initial.delivered":"Initial message: delivered","spawnCard.initial.failed":"Initial message: failed","spawnCard.retrySafe":"This launch is closed. You can start a new attempt.","spawnCard.pinUnavailableFallback":"Launched on another account — pin unavailable","spawnCard.pinUnavailableQueued":"Pinned account quota is exhausted — queued until {retryAt}","spawnCard.launch":"Launch {id}","spawnChip.starting":"Starting","spawnChip.binding":"Binding host","spawnChip.queued":"Host ready","spawnChip.reconciling":"Reconciling","spawnChip.recoverable-timeout":"Settling","spawnChip.live-late-success":"Late delivery OK","spawnChip.failed":"Launch failed","spawnChip.recovered":"Launched","spawnChip.initial.pending":"First message: waiting","spawnChip.initial.queued":"First message: queued","spawnChip.initial.delivered":"First message: delivered","spawnChip.initial.failed":"First message: failed","outbox.queueAria":"Messages waiting to be delivered","outbox.queued":"Queued","outbox.delivering":"Delivering","outbox.heldForSwitch":"Held for \xab{label}\xbb — delivers after the switch","outbox.heldForSwitchUnnamed":"Held — delivers after the account switch","outbox.delivered":"Delivered","outbox.failed":"Not delivered","outbox.cancel":"Cancel this message","outbox.retry":"Retry sending this message","outbox.reattach":"Not sent — re-attach the images and send again","draft.readPrompt":"Read the agent conversation in file {src} and continue from there: ","draft.needDir":"specify a working directory","draft.launchFailed":"couldn't launch","draft.paneAria":"Draft of a new agent conversation","draft.notStarted":"agent not started yet","draft.engineAria":"Agent engine","draft.accountAria":"{engine} account for this launch","draft.accountDefault":"{label} \xb7 active","draft.accountNeedsLogin":"{label} \xb7 needs sign-in","draft.handoffLabel":"handoff: {title}","draft.newConvo":"new conversation","draft.conversation":"conversation","draft.dismiss":"Dismiss the draft conversation","draft.directory":"directory","draft.dirAria":"Agent working directory","dirPicker.empty":"no directory chosen","dirPicker.searchAria":"Filter the known directories, or type a path","dirPicker.searchPlaceholder":"filter, or type a path","dirPicker.listAria":"Known working directories","dirPicker.current":"current","dirPicker.useTyped":"use this path","dirPicker.noMatch":"nothing matches that filter — type a path to use one anyway","dirPicker.noneKnown":"no directories known yet — type a path","dirPicker.count":"{shown} of {total} directories","draft.reasoning":"reasoning","draft.role":"role","draft.roleAria":"Agent role preset","draft.noRole":"No role","draft.roleParameters":"Role parameters","draft.safetyFences":"Safety fences","draft.roleNeedsParams":"complete the required role parameters","draft.reviews":"reviewed conversation","draft.reviewsAria":"Reviewed conversation","draft.reviewsPlaceholder":"Choose a conversation","draft.reviewerNeedsConversation":"choose the conversation this reviewer will review","draft.deployConfirm":"Type deploy to authorize this deployment plan","draft.modelAria":"Agent model","draft.modelDefault":"model: default","draft.reasoningAria":"Reasoning effort level","draft.effortDefault":"effort: default","draft.speedAria":"Codex speed mode","draft.speedTitle":"fast = priority tier (1.5x speed, higher usage)","draft.speedDefault":"speed: default","draft.imagesOnly":"(images)","draft.launched":"agent launched in tmux {target} — waiting for the conversation to appear here…","draft.launchedStructured":"agent launched — waiting for the conversation to appear here…","draft.slow":"Taking a while. Check tmux window {target} — the panel will pick up the transcript as soon as it appears.","draft.slowStructured":"Taking a while. The panel will pick up the transcript as soon as it appears.","draft.confirming":"Launched — confirming the agent in tmux {target}. Don't send again; the panel attaches the conversation as soon as its transcript appears.","draft.confirmingStructured":"Launched — confirming the agent. Don't send again; the panel attaches the conversation as soon as its transcript appears.","draft.confirmingNoTarget":"Confirming whether the agent started. Don't send again — the panel attaches the conversation as soon as its transcript appears.","draft.confirmingSlow":"Launching slowly — the launch is confirmed in tmux {target}. The panel keeps watching and attaches the conversation itself; don't launch again.","draft.confirmingSlowStructured":"Launching slowly — the launch is confirmed. The panel keeps watching and attaches the conversation itself; don't launch again.","draft.attention":"The agent may already be running in tmux {target}. Don't launch it again. Dismiss this draft once you've checked; it still attaches automatically if the transcript appears.","draft.attentionStructured":"The agent may already be running. Don't launch it again. Dismiss this draft once you've checked; it still attaches automatically if the transcript appears.","draft.attentionNoTarget":"The agent may already be running — check your tmux windows. Don't launch it again. Dismiss this draft once you've checked; it still attaches automatically if the transcript appears.","draft.hintRelay":"The new agent will first read the parent conversation's transcript and pick up from there. Add to the prompt what to do next — the branch will appear on the scheme alongside.","draft.hintNew":"Choose an engine and a directory, write the first prompt — the agent will start in tmux, and the conversation will continue in this same panel.","draft.hintNewStructured":"Choose an engine and a directory, write the first prompt — the agent will start, and the conversation will continue in this same panel.","draft.promptAria":"First prompt for the new agent","draft.placeholder":"first prompt — the agent will start in tmux…","draft.placeholderStructured":"first prompt — the agent will start…","draft.promptTextAria":"First prompt text","draft.newWindowTitle":"new tmux window with a fresh agent","draft.newWindowTitleStructured":"new structured session with a fresh agent","draft.newAgent":"new agent","draft.addImages":"Add images to the prompt","draft.stopAndLaunch":"Stop recording and launch the agent","draft.rolePromptToggle":"Role prompt (EN)","draft.speedFast":"fast","draft.speedStandard":"standard","effortTier.minimal":"minimal","effortTier.low":"low","effortTier.medium":"medium","effortTier.high":"high","effortTier.xhigh":"extra high","effortTier.max":"max","effortTier.ultra":"ultra","reasoningTier.minimal":"Minimal","reasoningTier.low":"Light","reasoningTier.medium":"Medium","reasoningTier.high":"High","reasoningTier.xhigh":"Extra High","reasoningTier.max":"Max","reasoningTier.ultra":"Ultra","roleCopy.orchestrator.name":"Orchestrator","roleCopy.orchestrator.description":"Coordinates fresh agents through the Viewer control plane.","roleCopy.orchestrator.param.mode.label":"Mode","roleCopy.orchestrator.param.mode.description":"Operating mode for the coordination run.","roleCopy.orchestrator.param.mode.option.standard":"Standard","roleCopy.orchestrator.param.mode.option.plan-tickets":"Plan tickets","roleCopy.orchestrator.param.mode.option.wayfind":"Wayfind","roleCopy.orchestrator.param.mode.option.backlog-campaign":"Backlog campaign","roleCopy.orchestrator.param.repo.label":"Repository","roleCopy.orchestrator.param.repo.description":"Repository for backlog-campaign mode.","roleCopy.orchestrator.param.issueQuery.label":"Issue query","roleCopy.orchestrator.param.issueQuery.description":"GitHub issue query for backlog-campaign mode.","roleCopy.orchestrator.param.urgent.label":"Urgent list","roleCopy.orchestrator.param.urgent.description":"Comma-separated urgent issue ids.","roleCopy.orchestrator.param.maxWorkers.label":"Maximum workers","roleCopy.orchestrator.param.maxWorkers.description":"Worker cap for backlog-campaign mode.","roleCopy.orchestrator.param.mergePolicy.label":"Merge policy","roleCopy.orchestrator.param.mergePolicy.description":"Delivery policy for backlog-campaign mode.","roleCopy.orchestrator.param.mergePolicy.option.pr":"Pull request","roleCopy.orchestrator.param.mergePolicy.option.merge":"Merge","roleCopy.orchestrator.param.completionPolicy.label":"Completion policy","roleCopy.orchestrator.param.completionPolicy.description":"Terminal policy for backlog-campaign mode.","roleCopy.orchestrator.param.completionPolicy.option.pr-opened":"PR opened","roleCopy.orchestrator.param.completionPolicy.option.merged":"Merged","roleCopy.orchestrator.param.completionPolicy.option.released":"Released","roleCopy.reviewer.name":"Reviewer","roleCopy.reviewer.description":"Reviews a code diff and returns severity-ranked evidence-backed findings.","roleCopy.reviewer.param.diffSource.label":"Diff source","roleCopy.reviewer.param.diffSource.description":"Diff or pull request reference to inspect.","roleCopy.reviewer.param.lens.label":"Lens","roleCopy.reviewer.param.lens.description":"Review lens.","roleCopy.reviewer.param.lens.option.correctness":"Correctness","roleCopy.reviewer.param.lens.option.over-engineering":"Over-engineering","roleCopy.reviewer.param.lens.option.silent-failure":"Silent failures","roleCopy.reviewer.param.lens.option.test-coverage":"Test coverage","roleCopy.reviewer.param.lens.option.scope":"Scope","roleCopy.reviewer.param.lens.option.prod-ops":"Prod ops","roleCopy.reviewer.param.lens.option.standards+spec":"Standards + spec","roleCopy.reviewer.param.lens.option.code-smells":"Code smells","roleCopy.reviewer.param.lens.option.all":"All lenses","roleCopy.reviewer.param.mode.label":"Mode","roleCopy.reviewer.param.mode.description":"Reviewer context mode.","roleCopy.reviewer.param.mode.option.fresh":"Fresh context","roleCopy.reviewer.param.parallelN.label":"Parallel passes","roleCopy.reviewer.param.parallelN.description":"Independent review passes.","roleCopy.verifier.name":"Verifier","roleCopy.verifier.description":"Tests supplied hypotheses and returns a per-claim evidence verdict.","roleCopy.verifier.param.claims.label":"Claims","roleCopy.verifier.param.claims.description":"Hypotheses to confirm or refute.","roleCopy.builder.name":"Builder","roleCopy.builder.description":"Writes product code for a scoped directive.","roleCopy.builder.param.mode.label":"Mode","roleCopy.builder.param.mode.description":"Implementation discipline.","roleCopy.builder.param.mode.option.plain":"Plain","roleCopy.builder.param.mode.option.apply-fixes":"Apply fixes","roleCopy.builder.param.mode.option.tdd":"TDD","roleCopy.builder.param.mode.option.diagnose":"Diagnose","roleCopy.builder.param.mode.option.prototype":"Prototype","roleCopy.builder.param.mode.option.merge-resolve":"Merge resolve","roleCopy.builder.param.domain.label":"Domain","roleCopy.builder.param.domain.description":"Product domain for the implementation.","roleCopy.builder.param.domain.option.general":"General","roleCopy.builder.param.domain.option.frontend":"Frontend","roleCopy.architect.name":"Architect","roleCopy.architect.description":"Produces an evidence-grounded design without product edits.","roleCopy.architect.param.mode.label":"Mode","roleCopy.architect.param.mode.description":"Architecture output mode.","roleCopy.architect.param.mode.option.design":"Design","roleCopy.architect.param.mode.option.spec":"Spec","roleCopy.architect.param.mode.option.architecture-audit":"Architecture audit","roleCopy.cleaner.name":"Cleaner","roleCopy.cleaner.description":"Safely recovers a dirty checkout under a backup contract.","roleCopy.prod-auditor.name":"Prod auditor","roleCopy.prod-auditor.description":"Performs a read-only evidence-backed production investigation.","roleCopy.prod-auditor.param.questions.label":"Questions","roleCopy.prod-auditor.param.questions.description":"Production questions to investigate.","roleCopy.deployer.name":"Deployer","roleCopy.deployer.description":"Plans a blue/green production deployment and stops for approval before mutation.","roleCopy.deployer.param.sha.label":"Merged SHA","roleCopy.deployer.param.sha.description":"Merged commit SHA to deploy.","roleCopy.deployer.param.pr.label":"Pull request","roleCopy.deployer.param.pr.description":"Optional pull request reference.","link.handoffContext":"You've been handed another agent's context — the conversation \xab{title}\xbb. Its transcript: {path} — read that file first for full context, then carry out the request below.\n\n{ask}","link.dropped":"context is in the composer of \xab{title}\xbb — type the ask and send","handoff.aria":"Hand the conversation to a new agent — a draft appears below","handoff.title":"click — draft a new agent with this context \xb7 drag — link to an existing one","handoff.label":"hand off to agent","qr.showAria":"Show a QR code for phone login","qr.failed":"couldn't get the link","qr.startHint":"Start the viewer with Tailscale access: ","qr.alt":"QR code for phone login","qr.generating":"generating QR…","qr.linkAria":"Phone login link","qr.copy":"Copy link","qr.scanHint":"scan from a phone on the same tailnet","telegram.title":"Telegram","telegram.rowAria":"Telegram connection","telegram.close":"Close","telegram.readOnlyNote":"Read-only \xb7 operator sessions only","telegram.status.disconnected":"Not connected","telegram.status.starting":"Starting…","telegram.status.awaiting_scan":"Scan the QR code","telegram.status.awaiting_password":"Password needed","telegram.status.verifying":"Verifying…","telegram.status.connected":"Connected","telegram.status.expired":"Session expired","telegram.status.error":"Error","telegram.connect":"Connect Telegram","telegram.connectHint":"Sign in by scanning a QR code from the Telegram app. The Viewer stores the session on this machine only.","telegram.credentialsHint":"Telegram API credentials are not configured yet. Enter your api_id and api_hash from my.telegram.org — they stay on this machine.","telegram.credentialsIdLabel":"API ID","telegram.credentialsHashLabel":"API hash","telegram.credentialsSave":"Save credentials","telegram.credentialsSource":"Saved into the Viewer's own config (telegram.json, owner-only). Environment variables, when set, take precedence.","telegram.credentialsInvalid":"That does not look like a valid api_id + api_hash pair. Nothing was saved.","telegram.reconnect":"Reconnect","telegram.retry":"Retry","telegram.cancel":"Cancel","telegram.qrAlt":"Telegram sign-in QR code","telegram.qrGenerating":"generating QR…","telegram.qrFailed":"The QR code could not be generated.","telegram.qrRetry":"Try QR again","telegram.qrHint":"In Telegram on your phone: Settings → Devices → Link Desktop Device, then scan. An expired code refreshes automatically.","telegram.passwordLabel":"Two-step verification password","telegram.passwordPlaceholder":"Telegram 2FA password","telegram.passwordSubmit":"Submit","telegram.passwordInvalid":"Wrong password. Try again.","telegram.passwordHint":"Telegram asked for your two-step verification password. It goes to Telegram only.","telegram.connectedAs":"Connected as","telegram.lastCheck":"Checked {time}","telegram.expiredHint":"Telegram ended this session. Reconnect to continue.","telegram.logout":"Log out","telegram.logoutConfirm":"Log out of Telegram and remove the local session?","telegram.deleteLocal":"Delete local session","telegram.deleteLocalConfirm":"Delete the local session? The remote Telegram authorization may remain — remove it in Telegram → Devices.","telegram.confirmCta":"Confirm","telegram.confirmCancel":"Cancel","telegram.actionFailed":"That didn't go through. Try again; if it keeps failing, close and reopen this panel.","telegram.actionUnreachable":"The Viewer server didn't respond. Check the connection and try again.","telegram.err.login_busy":"Another Telegram sign-in is already in progress.","telegram.err.credentials_missing":"Telegram API credentials are not configured on this host.","telegram.err.start_failed":"Sign-in could not start.","telegram.err.bridge_failed":"Sign-in ended unexpectedly.","telegram.err.password_invalid":"Wrong password.","telegram.err.network_failed":"Network error. Try again.","telegram.err.timed_out":"Sign-in timed out.","telegram.err.canceled":"Sign-in was canceled.","telegram.err.session_unsafe":"Local session storage failed safety checks.","telegram.err.connector_failed":"The Telegram connector could not start.","telegram.err.host_registration_failed":"Telegram could not be registered with the local agent hosts.","telegram.err.not_read_only":"Refused: the connector advertised tools that are not read-only.","telegram.err.logout_failed":"Remote logout failed. You can delete the local session instead.","telegram.err.health_failed":"Could not check the connection.","telegram.announceScan":"Telegram QR code ready. Scan it from your phone.","telegram.announcePassword":"Telegram asks for your two-step verification password.","telegram.announceConnected":"Telegram connected.","telegram.report.title":"Daily report","telegram.report.loading":"Loading…","telegram.report.disabledHint":"Once a day, an agent reads your private dialogs and the groups you pick, then writes one report you read here.","telegram.report.enable":"Enable daily report","telegram.report.disable":"Turn off","telegram.report.at":"At","telegram.report.zone":"Kyiv time","telegram.report.sourcesSummary":{one:"Sources: active private dialogs + {count} group",other:"Sources: active private dialogs + {count} groups"},"telegram.report.sourcesEdit":"Groups","telegram.report.sourcesDone":"Done","telegram.report.sourcesHint":"Private dialogs are picked automatically by recent activity. Choose which groups to include: light reads only what touches you, full reads the whole group.","telegram.report.loadGroups":"Load my groups","telegram.report.noGroups":"No groups loaded yet.","telegram.report.modeLight":"Light","telegram.report.modeFull":"Full","telegram.report.runNow":"Run now","telegram.report.running":"Running…","telegram.report.nextRun":"Next {time}, {date}","telegram.report.noRuns":"No runs yet.","telegram.report.open":"Open","telegram.report.openRun":"Run","telegram.report.openRunTitle":"Open this run on the board","telegram.report.promptTitle":"Report prompt","telegram.report.promptHint":"Your brief for the report agent: language, the tag line, the sections, which repository issue proposals target, tone. Edit it here — no release needed.","telegram.report.promptPreamble":"The Viewer always adds the window, the selected sources, the output path and the sequential-read rules in front of your text. It verifies the connected account itself, before the run starts.","telegram.report.promptEdit":"Prompt","telegram.report.promptSave":"Save prompt","telegram.report.promptReset":"Reset to default","telegram.report.promptDefault":"Prompt: default template","telegram.report.promptEdited":"Prompt: edited by you","telegram.report.back":"Back","telegram.report.status.running":"running","telegram.report.status.ok":"report","telegram.report.status.quiet":"quiet","telegram.report.status.failed":"failed","telegram.report.status.account-mismatch":"wrong account","telegram.report.err.account_mismatch":"The connected account is not the one this report was set up for. Nothing was read.","telegram.report.err.not_connected":"Telegram is not connected, so the run could not start.","telegram.report.err.reports_disabled":"Daily reports are turned off.","telegram.report.err.run_in_progress":"A report run is already going.","telegram.report.err.account_check_failed":"The connected account could not be verified, so nothing was read.","telegram.report.err.sources_failed":"The chats to read could not be listed. The connector may be restarting.","telegram.report.err.launch_failed":"The report run could not be started.","telegram.report.err.run_ended_without_report":"The run ended before it wrote a report. Run it again.","telegram.report.err.timed_out":"The run took too long and was stopped.","telegram.report.err.invalid_report":"The run wrote something the Viewer could not read as a report.","telegram.report.err.report_missing":"That report is no longer stored.","telegram.report.err.transport":"The Viewer server didn't respond. Try again.","telegram.report.err.generic":"That didn't go through. Try again.","push.enabled":"Push notifications enabled","push.enable":"Enable push notifications","push.disable":"Disable push notifications","push.needsHttps":"Push requires HTTPS","sound.on":"Sound notifications on","sound.off":"Sound notifications off","sound.mute":"Mute sound notifications","sound.unmute":"Enable sound notifications","sound.settings":"Sound levels","sound.cueVolume":"Notification cues","sound.ambientViewer":"Background music in the Viewer","sound.ambient":"Background music during a call","sound.ambientVolume":"Music level","sound.ambientHint":"Plays quietly at this level, and ducks under speech during a call. With both on, the same track keeps playing across the call.","keepAwake.label":"Keep screen awake","keepAwake.enableAria":"Keep the screen awake on this device","keepAwake.disableAria":"Let the screen sleep on this device","keepAwake.off":"The screen sleeps on this device's usual timer.","keepAwake.requesting":"Asking the browser…","keepAwake.active":"Screen stays awake while this tab is visible. Uses more battery.","keepAwake.waiting":"Paused while this tab is hidden. Resumes when you come back.","keepAwake.interrupted":"The system released the lock. Turn this off and on to ask again.","keepAwake.blocked":"The browser refused the request. The screen is not held.","keepAwake.failed":"The request failed. The screen is not held.","keepAwake.insecure":"Needs an HTTPS address. Over plain HTTP the screen cannot be held.","keepAwake.unsupported":"This browser has no screen wake lock.","mic.stopRecognize":"Stop recording and transcribe","mic.cancel":"Cancel recording","mic.recognizing":"Transcribing…","mic.dictate":"Dictate","mic.dictateHint":"dictate (up to 10 min) \xb7 right-click: transcription method","mic.timeLeft":"{time} left before auto-stop","mic.capStopped":"stopped at 10:00","mic.connecting":"Connecting the microphone — a moment…","mic.menuTitle":"Transcription method","mic.menuLoading":"checking what's available…","mic.menuLocked":"Locked by the LLV_TRANSCRIBE_BACKEND environment variable","mic.noKey":"not set up","mic.saveFailed":"couldn't save the choice","mic.keyTitle":"{name} is not set up","mic.copy":"copy","mic.copyPath":"Copy path","mic.copied":"copied","mic.back":"Back","stt.local.name":"Faster Whisper","stt.local.desc":"Free, fully local — audio never leaves this machine.","stt.local.fix":"Run scripts/setup-whisper.sh in the app folder once; it installs the local engine at:","stt.chatgpt.name":"ChatGPT Voice","stt.chatgpt.desc":"Covered by your ChatGPT subscription, via the Codex login.","stt.chatgpt.fix":"Log in to Codex (run `codex login`) — the token will appear at:","stt.elevenlabs.name":"ElevenLabs Scribe","stt.elevenlabs.desc":"Paid ElevenLabs API — the most accurate option.","stt.elevenlabs.fix":"Put your ElevenLabs API key (a single line) into this file:","stt.soniox.name":"Soniox","stt.soniox.desc":"Paid Soniox API — the fastest live transcription.","stt.soniox.fix":"Put your Soniox API key (a single line) into this file:","delFile.confirm":"Delete from disk?","delFile.aria":"Delete the conversation from disk","rename.edit":"Rename","rename.editAria":"Rename “{title}”","rename.inputAria":"Session title","rename.save":"Save name","rename.cancel":"Cancel","rename.reset":"Reset to auto title","rename.resetHint":"Reset to the auto title: {title}","rename.autoHint":"Auto title: {title}","rename.retry":"Retry","rename.saved":"Renamed to {title}","rename.conflict":"Name changed elsewhere — adopted the latest and retried","rename.failed":"Couldn't save the name","img.readFailed":"couldn't read the image","img.readAborted":"image reading aborted","img.unsupported":"unsupported image format: {name}","img.unknownFile":"unknown file","img.tooLarge":"{name}: too large (10 MB limit)","img.structuredTooLarge":"Image exceeds this host's {max} MB limit","img.tooManyStructured":"Up to {max} images can be sent at once","img.structuredAggregateTooLarge":"Images exceed this host's {max} MB request limit","img.image":"image","img.error":"image error","img.previewAlt":"image preview {n}","img.removeAria":"Remove image {n}","img.readingAria":"loading image {n}","img.retry":"Retry","img.retryAria":"Retry image {n}","img.clearAll":"Clear all","img.clearAllAria":"Remove all images","img.blockedReading":"Waiting for the image to finish loading…","img.blockedFailed":"Remove or retry the failed image to send","img.deliveryHint":"attached to the message","question.sec":"{n} s","question.min":"{n} min","question.hour":"{n} h","question.waiting":"waiting for a reply","question.sentToPane":"Sent to the pane: {text}","question.keysHint":"keys into the pane \xb7 or the composer below","question.pane":"Pane {target}","question.alreadyAnswered":"answer already recorded","question.openFailed":"couldn't open the session","question.opened":"opened {target}","question.answered":"Answered: {text}","question.answeredElsewhere":"Answered elsewhere: {text}","question.noPane":"tmux pane unavailable","question.openSession":"open session","question.rejectComment":"Rejection comment…","question.approved":"approved","question.rejected":"rejected","question.approve":"Approve","question.reject":"Reject","question.ownAnswer":"Your own answer…","question.dismiss":"Dismiss the question card","question.deliveryFailed":"Delivery failed","question.failedChoice":"not delivered","question.retryAnswer":"Retry","question.errorNotRunning":"the agent is no longer running, so nothing was delivered","question.errorMoved":"the agent has moved on from this question","question.errorUnconfirmed":"the answer was sent, but the agent never confirmed it","question.errorNotDelivered":"the agent's screen did not respond as expected, so the answer was not delivered","question.errorRejected":"the viewer could not build a valid answer","inbox.deleted":"deleted from disk","inbox.fileGone":"the file is no longer on disk","inbox.confirmDelete":"Delete the file from disk?","inbox.deleteAria":"Delete {name} from disk","inbox.deleteFromDisk":"delete from disk","inbox.attachedAlt":"attached image {name}","lightbox.zoomOut":"Zoom out","lightbox.resetZoom":"Reset zoom","lightbox.zoomIn":"Zoom in","preview.dialogTitle":"{name} — document preview","preview.close":"Close preview","preview.download":"Download file","preview.openExternal":"Open in a new tab","preview.resize":"Resize preview","preview.kindPdf":"PDF document","preview.kindImage":"Image","preview.kindText":"Text file","preview.kindUnknown":"File","preview.loading":"Loading…","preview.missing":"This file no longer exists.","preview.denied":"Access to this file was denied.","preview.unsupported":"This file type cannot be previewed.","preview.oversized":"This file is larger than the preview limit.","preview.changed":"The file changed on disk since the preview opened.","preview.aborted":"Loading was cancelled.","preview.error":"The preview could not be loaded.","preview.reload":"Reload","preview.searchPlaceholder":"Search loaded text","preview.noMatches":"no matches","preview.prevMatch":"Previous match","preview.nextMatch":"Next match","preview.wrapLines":"Wrap lines","preview.loadMore":"Load more","preview.loadedOf":"Loaded {loaded} of {size}","preview.fit":"Fit","preview.fitImage":"Fit to pane","preview.fitWidth":"Fit width","preview.prevPage":"Previous page","preview.nextPage":"Next page","preview.pageOf":"Page {page} of {pages}","feed.agentEnded":"agent finished","feed.copyCode":"Copy code","feed.copyMd":"Copy message (Markdown)","feed.voiceTurn":"Voice","selectedContext.stale":"stale","selectedContext.ariaSelected":"Selected card: {name} (project {project})","feed.voiceContext":"Call transcript","feed.speak":"Read answer aloud (AI-generated voice)","feed.stopSpeaking":"Stop reading aloud","tts.read":"Read answer aloud","tts.readPaid":"Read aloud (paid)","tts.replay":"Replay answer audio","tts.replayFree":"Replay aloud (free)","tts.triggerTitle":"{action} \xb7 right-click: voice & billing","tts.stop":"Stop reading aloud","tts.menuTitle":"Voice & billing","tts.menuLocked":"Locked by the LLV_TTS_BACKEND environment variable","tts.nextPaid":"Next click: paid synthesis of this answer","tts.nextFree":"Next click: free replay from the cache","tts.nextStop":"Next click: stop reading this answer","tts.noKey":"not set up","tts.saveFailed":"Could not switch the voice provider","tts.replayExpired":"Cached audio expired — this replay is a paid synthesis.","tts.backendChanged":"The voice provider changed — this read is billed to {provider}.","tts.characters":"{count} characters","tts.billing":"Billed to your {provider} account per character.","tts.disclosure":"You’ll hear an AI-generated voice, not a human voice.","tts.tooLong":"Too long to read aloud ({count} character limit). Nothing is cut short — read a shorter passage.","tts.seekHint":"Click the text while it plays to jump there.","tts.partOf":"Part {index} of {count}","tts.finished":"Finished reading","tts.missingKey":"Add the {provider} API key at {path}","tts.generating":"Generating audio…","tts.playing":"Playing audio","tts.stopped":"Stopped","tts.configError":"TTS configuration unavailable","tts.requestError":"TTS request failed ({status})","tts.requestFailed":"TTS request failed","tts.playError":"The browser blocked audio playback. Try again.","feed.running":"running {tool}…","feed.tool":"tool","feed.thinking":"thinking…","feed.working":"working…","feed.liveTail":"live tail","feed.liveOmittedItems":"… ({count} earlier live items, {chars} characters)","feed.liveToolArgsOmitted":"arguments omitted","feed.liveToolOutcomeOmitted":"outcome omitted","feed.liveOmittedChars":"… (+{chars} characters)","feed.backToLive":"Back to the live tail","feed.newCount":"{count} new","feed.down":"down","feed.pickLog":"Pick a log on the left — the feed updates itself","feed.showEarlier":"show earlier","feed.showEarlierHidden":"show earlier (hidden {count})","feed.loadEarlier":"load earlier from the file","feed.startOfConvo":"start of the conversation","feed.finishedTurn":"finished the turn — waiting for a reply","feed.returnedResult":"returned with a result","feed.noOutput":"No output yet — the file is empty for now","feed.onlyService":"Only service records are present ({count}).","feed.empty":"Empty (no rows to show)","render.system":"system","render.executing":"executing…","render.error":"error","render.teammate":"teammate","render.left":"{peer}: left{at}","render.codexSessionCreated":"Codex session created","render.taskStarted":"Task started","render.taskComplete":"Task completed","render.compacted":"context compacted","render.compactAuto":"auto","render.compactManual":"manual","render.compactPre":"{n}k tokens before","render.compactSummary":"conversation summary","render.stdinSession":"stdin → session {id}","render.record":"record","render.transcriptRecord":"transcript record","render.recordDetails":"record details","render.protocol":"protocol","render.image":"image","render.imageOutput":"image output","render.toolOutput":"tool output","render.toolOutputType":"tool output: {type}","render.dataKb":"{n} kB of data","render.commands":{one:"{count} command",other:"{count} commands"},"render.actions":{one:"{count} action",other:"{count} actions"},"render.noFindings":"no findings","render.moreFindings":"{count} more findings in raw","render.memoryCitations":"memory citations ({count})","render.noCitations":"no citation entries","render.moreEntries":"{count} more entries in raw","render.truncated":"truncated","render.shutdownRequest":"shutdown request","render.shutdownResponse":"shutdown response","render.planRequest":"plan approval request","render.planVerdict":"plan verdict","render.approved":"approved","render.rejected":"rejected","render.from":"from {from}","render.structured":"structured message","render.showJson":"show JSON","render.toDir":"to","render.fromDir":"from","render.internalTag":"internal","render.agentPeer":"agent","render.delivered":"delivered","render.notDelivered":"not delivered","render.reasoning":"agent reasoning","tools.read":"Read","tools.write":"Write","tools.edit":"Edit","tools.lines":{one:"{count} line",other:"{count} lines"},"tools.files":{one:"{count} file",other:"{count} files"},"tools.items":{one:"{count} item",other:"{count} items"},"tools.family.shell":"shell command","tools.family.read":"read file","tools.family.write":"write file","tools.family.edit":"edit","tools.family.search":"search","tools.family.web":"web","tools.family.spawn":"spawn agent","tools.family.plan":"plan","tools.family.mcp":"MCP tool","tools.family.other":"tool","tools.showAllLines":"show all ({count} lines)","tools.showOutput":"show all output","tools.moreFiles":"…and {count} more files","tools.binaryContent":"binary content \xb7 {size}","tools.rawRecord":"raw record","tools.noRawRecord":"detail no longer loaded","tools.noOutput":"no output captured","tools.noOutputTip":"the full output lives in the rollout session","tools.stdin":"stdin","tools.stdinPoll":"poll","tools.pollRun":{one:"{count} poll",other:"{count} polls"},"tools.wait":"wait","tools.session":"session","tools.waitingSeconds":"waiting {n}s","tools.wakeup":"scheduled wakeup","tools.cron":"scheduled agent","tools.monitor":"monitor","tools.schedule":"schedule","tools.diffTruncated":"truncated to fit","tools.orchestration":{one:"{count} tool call",other:"{count} tool calls"},"tools.nestedCalls":"nested calls","tools.callId":"call {id}","tools.copyId":"copy id","tools.copyDiff":"Copy diff","tools.copyOutput":"Copy output","tools.source":"source","tools.action":"action {index}","tools.cwd":"cwd","tools.copyCwd":"copy cwd","tools.copyCommand":"Copy command","tools.stdout":"stdout","tools.stderr":"stderr","tools.copyStderr":"Copy stderr","tools.showStderr":"show all stderr","tools.noStderr":"no stderr captured","tools.exitOk":"exit 0","tools.exitCode":"exit {code}","tools.durationSec":"{n}s","tools.durationMin":"{m}m {s}s","tools.durationMs":"{n}ms","tools.ranAt":"{start}–{end}","tools.nestedWaits":{one:"{count} follow-up",other:"{count} follow-ups"},"wakeup.card":"scheduled wakeup","wakeup.wakesAt":"wakes at {time}","wakeup.wasSetFor":"was set for {time}","wakeup.firedAt":"fired at {time}","wakeup.fired":"fired","wakeup.failed":"scheduling failed","wakeup.superseded":"superseded","wakeup.noTime":"wakeup scheduled","wakeup.plan":"wake plan","wakeup.planInternal":"internal prompt","wakeup.noPlan":"no wake plan given","wakeup.inRel":"in {rel}","wakeup.agoRel":"{rel} ago","wakeup.relSec":{one:"{count}s",other:"{count}s"},"wakeup.relMin":{one:"{count} min",other:"{count} min"},"wakeup.relHour":{one:"{count} h",other:"{count} h"},"wakeup.relDay":{one:"{count} d",other:"{count} d"},"wakeup.chipTitle":"sleeping until {time} — {reason}","flowDialog.engine":"Engine: {label}","flowDialog.modelPlaceholder":"model (default)","flowDialog.model":"Model: {label}","flowDialog.effortDefault":"effort: default","flowDialog.createFailed":"couldn't create the flow ({status})","flowDialog.title":"Start a flow","flowDialog.subtitle":"implement → review \xb7 this conversation becomes the implementer","flowDialog.preset":"preset","flowDialog.rolesManualOpen":"▾ roles manually","flowDialog.rolesManual":"▸ roles manually (model / effort)","flowDialog.spec":"specification and acceptance criteria","flowDialog.specPlaceholder":"Task statement\nAC1: …\nAC2: …","flowDialog.implementer":"implementer","flowDialog.reviewer":"reviewer","flowDialog.diffBase":"diff base","flowDialog.fromHead":"from current HEAD","flowDialog.fromMergeBase":"from merge-base with main","flowDialog.headless":"headless (no pane)","flowDialog.tmuxPane":"tmux pane","flowDialog.transitions":"transitions","flowDialog.auto":"auto","flowDialog.manual":"manual (gate every step)","flowDialog.roundLimit":"round limit","flowDialog.creating":"creating…","flowDialog.start":"▶ Start","flowStrip.startReview":"Start review","flowStrip.spawnReviewer":"Spawn reviewer","flowStrip.relayNotes":"Relay notes","flowStrip.retryRound":"Retry round","flowStrip.anotherRound":"Another round","flowStrip.flow":"Flow","flowStrip.roundsAria":"Review rounds","flowStrip.roundError":"Round {n}: {error}","flowStrip.roundVerdict":"Round {n}: {verdict}","flowStrip.roundInProgress":"Round {n}: in progress","flowStrip.addRoundsTitle":"Add more rounds to the limit","flowStrip.plus2":"+2 rounds","flowStrip.limitTitle":"Round limit: reviews before the loop parks (∞ — unlimited)","flowStrip.limitAria":"Set the round limit to {count}","flowStrip.limitUnlimitedAria":"Unlimited rounds","flowStrip.stopReviewer":"Stop","flowStrip.stopReviewerTitle":"Stop the running reviewer; the round lands in “needs decision”","flowStrip.notePlaceholder":"note for the reviewer…","flowStrip.noteTitle":"Sent to the next reviewer as the round's ready note","flowStrip.autoTitle":"Auto: transitions run themselves. Click — manual.","flowStrip.manualTitle":"Manual: every transition waits for a click. Click — auto.","flowStrip.manualShort":"manual","flowStrip.resume":"Resume flow","flowStrip.pause":"Pause","flowStrip.close":"Close flow","flowHub.aria":"Flow controls — round {n}, {state}","flowHub.ariaNoRound":"Flow controls — {state}","flowHub.controls":"Flow controls","groupOverride.closePanel":"Close controls","groupOverride.flowTitle":"Override \xb7 {name}","groupOverride.pipelineTitle":"Override \xb7 {name}","groupOverride.draftTitle":"Edit draft \xb7 {name}","groupOverride.task":"Task","groupOverride.spec":"Specification","groupOverride.repoDir":"Repository","groupOverride.saveDraft":"Save draft details","groupOverride.savedDraft":"Draft details saved","groupOverride.reviewerRole":"Next reviewer","groupOverride.engine":"Engine","groupOverride.effort":"Effort","groupOverride.effortDefault":"default","groupOverride.model":"Model","groupOverride.modelPlaceholder":"engine default","groupOverride.applyRole":"Update reviewer","groupOverride.nextRoundNote":"Next-round note","groupOverride.notePlaceholder":"What the next reviewer should focus on…","groupOverride.noteUnavailable":"Editable when you start, spawn, or retry a round.","groupOverride.roundLimit":"Round limit","groupOverride.setLimit":"Set","groupOverride.extend":"+1 round","groupOverride.nextStage":"Next stage","groupOverride.draftStage":"Draft stage","groupOverride.addStage":"Add stage","groupOverride.removeStage":"Remove stage","groupOverride.moveStageUp":"Move up","groupOverride.moveStageDown":"Move down","groupOverride.role":"Role","groupOverride.noRole":"No role","groupOverride.stagePrompt":"Stage prompt","groupOverride.applyStage":"Update stage","groupOverride.noEditableStage":"No upcoming stage to edit — every stage has already started.","groupOverride.editStagesOnCanvas":"Edit stages on their cards — role, model, prompt, order, and connections live on each stage's card in the canvas.","groupOverride.savedReviewer":"Reviewer updated for the next round","groupOverride.savedLimit":"Round limit updated","groupOverride.savedExtend":"Added a round","groupOverride.savedRetry":"Retrying the round","groupOverride.savedCancel":"Reviewer stopped","groupOverride.savedStage":"Stage updated for its next run","groupOverride.stagesHeading":"Stages \xb7 execution order","groupOverride.stagesHint":"Drag cards to reorder. The order is the execution chain.","groupOverride.stagesEmpty":"No stages yet — add a stage below to start building.","groupOverride.startNeedsStages":"Add at least 1 stage before starting.","groupOverride.addRunStage":"Add stage","groupOverride.addReviewStage":"Add review loop","groupOverride.dragHandle":"Drag to reorder this stage","groupOverride.runKind":"run","groupOverride.reviewKind":"review loop","groupOverride.reordered":"Stages reordered","groupOverride.stageAdded":"Stage added","groupOverride.stageRemoved":"Stage removed","pipelineBuilder.untitledTask":"New pipeline","pipelineBuilder.createDraft":"Pipeline","pipelineBuilder.createDraftAria":"Add a draft pipeline to the canvas","roundDeck.roundAborted":"Round {n} \xb7 aborted","roundDeck.roundVerdict":"Round {n} \xb7 {verdict}","roundDeck.roundInProgress":"Round {n} \xb7 in progress","roundDeck.aborted":"aborted","roundDeck.reviewInProgress":"review in progress","roundDeck.waitingFirst":"waiting for the first review round…","roundDeck.spawningReviewer":"launching the reviewer — the transcript will appear shortly…","roundDeck.moreRounds":"{count} more round(s) — click the chips on the flow strip","roundDeck.findings":{one:"{count} finding",other:"{count} findings"},"roundDeck.roundsCount":{one:"{count} round",other:"{count} rounds"},"roundDeck.collapseStack":"Collapse review stack ({count} rounds)","roundDeck.expandStack":"Expand review stack ({count} rounds)","roundDeck.groupAria":{one:"Review conversation group \xb7 {count} round",other:"Review conversation group \xb7 {count} rounds"},"roundDeck.groupAriaNamed":{one:"Review group for {name} \xb7 {count} round",other:"Review group for {name} \xb7 {count} rounds"},"subagentTray.label":{one:"{count} subagent",other:"{count} subagents"},"subagentTray.toggle":{one:"Expand the subagent tray ({count} folded subagent)",other:"Expand the subagent tray ({count} folded subagents)"},"subagentTray.collapse":{one:"Collapse the subagent tray ({count} folded subagent)",other:"Collapse the subagent tray ({count} folded subagents)"},"subagentTray.rows":"Folded subagents","subagentTray.open":"Open the {name} subagent transcript","subagentTray.fold":"Fold {name} into the subagent tray","subagentTray.unfold":"Restore {name} to a full card","subagentTray.state.running":"working","subagentTray.state.live":"live","subagentTray.state.silent":"alive but silent","subagentTray.state.closed":"idle","subagentTray.state.dead":"unavailable","flowState.waiting_ready":"waiting for READY","flowState.spawn_pending":"ready to spawn the reviewer","flowState.spawning":"spawning the reviewer","flowState.reviewing":"reviewing","flowState.relay_pending":"verdict ready — relay?","flowState.relaying":"relaying notes","flowState.fixing":"fixing","flowState.approved":"approved","flowState.done_comment":"done with comments","flowState.needs_decision":"needs a decision","flowState.paused":"paused","flowState.closed":"closed","flowState.blocked_rate_limited":"blocked: rate-limited","flowState.rate_limit_until":"resets at {time}","flowState.rate_limit_wait":"waiting for the quota reset","flowModel.failed":"failed ({status})","wfState.provisioning":"provisioning the worktree","wfState.implementing":"stages running","wfState.reviewing":"reviewing","wfState.finishing":"finishing","wfState.approved":"approved","wfState.needs_decision":"needs a decision","wfState.paused":"paused","wfState.closed":"closed","wfModel.failed":"failed ({status})","wfStrip.workflow":"Workflow","wfStrip.stagesAria":"Workflow stages","wfStrip.reviewStage":"review","wfStrip.advance":"Advance","wfStrip.retryStage":"Retry stage","wfStrip.skipStage":"Skip","wfStrip.resume":"Resume workflow","wfStrip.pause":"Pause","wfStrip.close":"Close workflow","pipelineState.draft":"draft","pipelineState.provisioning":"provisioning the worktree","pipelineState.running":"stages running","pipelineState.needs_decision":"needs a decision","pipelineState.paused":"paused","pipelineState.completed":"completed","pipelineState.closed":"closed","pipelineModel.failed":"failed ({status})","pipelineStrip.pipeline":"Pipeline","pipelineStrip.start":"Start pipeline","pipelineStrip.discard":"Discard draft","pipelineStrip.stagesAria":"Pipeline stages","pipelineStrip.reviewStage":"review loop","pipelineStrip.retryStage":"Retry stage","pipelineStrip.skipStage":"Skip","pipelineStrip.resume":"Resume pipeline","pipelineStrip.pause":"Pause pipeline","pipelineStrip.close":"Close pipeline","pipelineStrip.readOnly":"read-only","pipelineStrip.readWrite":"read-write","pipelineStrip.groupAria":"Pipeline {task}","pipelineStrip.baseSha":"Base {sha}","pipelineStrip.baseShaFull":"Full base commit {sha}","pipelineStrip.copyBaseSha":"Copy full base commit {sha}","pipelineStrip.copiedBaseSha":"Full base commit copied","pipelineStrip.copyBaseShaFailed":"Could not copy the base commit","pipelineStrip.moreActions":"More pipeline actions","pipelineStrip.announce":"Pipeline {task}: {state}, stage {stage} {k} of {n}","pipelineStrip.openStage":"Open stage {label}","pipelineStrip.openVerdict":"Open verdict for stage {label}, state {state}","pipelineStrip.openTranscript":"Open transcript for stage {label}, state {state}","pipelineStrip.configureStage":"Configure stage {label}, state {state}","pipelineStrip.configAria":"Configuration for stage {label}","pipelineStrip.closeConfig":"Close stage configuration","pipelineStrip.lineageAria":"Stage lineage from {from} to {to}","pipelineStrip.previousStage":"Open previous stage {label}, state {state}","pipelineStrip.nextStage":"Open next stage {label}, state {state}","pipelineStrip.evidenceAria":"Stage {label} evidence: {verdict}, duration {duration}, model {model}","pipelineStrip.defaultModel":"default model","pipelineStrip.unknownDuration":"duration unavailable","pipelineStrip.linkedTasks":"Linked tasks","pipelineStrip.openTask":"Open linked task {label}","pipelineStrip.roundShort":"R{n}","pipelineStrip.attemptSuffix":"\xd7{n}","stageGraph.roundProgress":"round {round}/{total}","stageGraph.startedNotice":"This stage started while settings were open. Its saved server configuration is now locked.","pipelineStrip.chipAria":"Stage {label}: {state}","pipelineStrip.compactChipAria":"{label}, {state}","pipelineStrip.stageOf":"stage {k}/{n}","pipelineStrip.passEdgeAria":"Pass edge from {from} to {to}","pipelineStrip.failEdgeAria":"Fail edge from {from} to {to}, round {k} of {n}","pipelineStrip.nextEdge":"next","pipelineStrip.nextEdgeAria":"This edge runs next","pipelinePresentation.queued":"Queued","pipelinePresentation.waiting":"Waiting","pipelineShelf.aria":"Pipeline shelf","pipelineShelf.title":"Pipelines","pipelineShelf.edit":"Edit pipeline {task}","pipelineGroup.toggle":"Expand or collapse pipeline {task}","pipelineGroup.openHistory":"Open pipeline history for {task}","pipelineSlot.paneAria":"Planned stage {title}","pipelineSlot.completedAria":"Completed stage {title} — open to review","pipelineSlot.openTranscript":"Open conversation","pipelineSlot.stageOf":"stage {k}/{n}","pipelineSlot.promptLabel":"Stage prompt","pipelineSlot.noPrompt":"Extra context for this agent — the wiring above is automatic.","pipelineSlot.wiringTask":"Automatically receives: the task text","pipelineSlot.wiringPrev":"Automatically receives: the previous stage's output + the task text","pipelineSlot.waiting":"The {role} chat window opens here when this stage starts.","pipelineSlot.starting":"Starting the {role} agent…","pipelineSlot.reviewHint":"Review cycle over the previous stage — its rounds land here.","pipelineSlot.frozen":"This stage already ran — its configuration is locked.","pipelineSlot.saved":"Saved","pipelineSlot.rowAria":"Finished stage {title}","pipelineSlot.reasonSkipped":"Skipped by the operator — the chain moved on","pipelineSlot.rowExpand":"Show the full stage card","pipelineSlot.rowCollapse":"Collapse back to the status row","pipelineTemplates.planBuildReview":"Plan → Build → Review","pipelineTemplates.buildReview":"Build → Review","pipelineTemplates.buildVerify":"Build → Verify","pipelineSlot.addAgent":"Next agent","pipelineSlot.addAgentTitle":"Add the next agent handoff after this stage","pipelineSlot.addReview":"Review cycle","pipelineSlot.addReviewTitle":"Attach a review cycle (hard link) after this stage","pipelineSlot.moveEarlier":"Move {role} earlier in the chain","pipelineSlot.moveLater":"Move {role} later in the chain","pipelineSlot.savePrompt":"Save prompt","pipelineSlot.promptAria":"Stage prompt editor","pipelineSlot.connectHeading":"Connections","pipelineSlot.passEdgeLabel":"On pass, continue to","pipelineSlot.passEdgeEnd":"— completes the pipeline","pipelineSlot.failEdgeLabel":"On fail, loop back to","pipelineSlot.failEdgeNone":"— park for the operator","pipelineSlot.failEdgeSelf":"↺ this stage (retry itself)","pipelineSlot.failEdgeRounds":"Max loop rounds","pipelineSlot.passEdgeFrozen":"This stage already ran — its pass edge is frozen evidence.","pipelineSlot.failEdgeFrozen":"This fail edge was already traversed — it is frozen evidence.","pipelineTemplates.title":"New pipeline","pipelineTemplates.subtitle":"Pick a template. Its pipeline group lands on the board beside the linked task. Stage configuration remains available on demand.","pipelineTemplates.blank":"Blank canvas","pipelineTemplates.blankHint":"Start empty and assemble the stages by hand.","pipelineTemplates.noRole":"no role","pipelineTemplates.repoDir":"Repository directory","pipelineTemplates.checking":"Checking repository…","pipelineTemplates.ready":"Repository ready","pipelineTemplates.creating":"Creating pipeline…","pipelineTemplates.retry":"Retry","pipelinePreflight.empty":"Enter a repository directory","pipelinePreflight.missing":"The directory does not exist: {path}","pipelinePreflight.not_directory":"Choose a directory: {path}","pipelinePreflight.repo_unreadable":"The repository cannot be read: {path}","pipelinePreflight.repo_untraversable":"The repository cannot be opened: {path}","pipelinePreflight.not_git":"Choose a Git repository: {path}","pipelinePreflight.probe_failed":"The repository check could not finish — retry: {path}","pipelinePreflight.git_metadata_unwritable":"Git metadata is read-only: {path}","pipelinePreflight.worktree_parent_unwritable":"Pipeline worktrees cannot be created beside this repository: {path}","pipelineChipState.pending":"pending","pipelineChipState.spawning":"spawning","pipelineChipState.running":"running","pipelineChipState.reviewing":"reviewing","pipelineChipState.committing":"committing","pipelineChipState.passed":"passed","pipelineChipState.failed":"failed","pipelineChipState.needs_decision":"needs a decision","pipelineChipState.skipped":"skipped","pipelineVerdict.pass":"pass","pipelineVerdict.fail":"fail","pipelineVerdict.needsDecision":"needs decision","pipelineVerdict.confidence":"confidence","pipelineVerdict.reviewerSha":"Reviewer SHA {sha}","pipelineVerdict.findings":{one:"{count} finding",other:"{count} findings"},"pipelineVerdict.noFindings":"no findings recorded","pipelineVerdict.more":"+{count} more","pipelineVerdict.openTranscript":"Open transcript","pipelineVerdict.openAttemptTranscript":"Open transcript for attempt {n}","pipelineVerdict.reviewTranscripts":"Review transcripts","pipelineVerdict.openReviewTranscript":"Open review transcript {n}","pipelineVerdict.openFlow":"Open review","pipelineVerdict.retry":"Retry","pipelineVerdict.skip":"Skip","pipelineVerdict.priorAttempts":"Earlier attempts","pipelineVerdict.attemptLine":"Attempt {n}: {status}","pipelineVerdict.title":"Stage {label} verdict","pipelineHub.aria":"Pipeline {task}: {stage} \xb7 {k}/{n}","pipelineHub.controls":"Pipeline controls","pipelineHub.stageOf":"{stage} \xb7 {k}/{n}","pipelineHub.openControls":"Open pipeline controls","pipelineHub.attempt":"attempt {n}","pipelineHub.openDashboard":"Open dashboard strip","dash.pipeline":"Pipeline","dash.newPipeline":"New pipeline","board.historyGroup":"Undo and redo board actions","board.undo":"Undo","board.redo":"Redo","board.undoReopen":"Undo — reopen “{title}”","board.redoReclose":"Redo — close “{title}” again","board.undoNothing":"Nothing to undo","board.redoNothing":"Nothing to redo","scheme.pipeline":"Pipeline","scheme.pipelineTitle":"Start a pipeline from this conversation","board.pipeline":"Pipeline","board.newPipeline":"New pipeline","pipelineMobile.chipAria":"Pipeline {task}","pipelineMobile.position":"{k}/{n}","pipelineMobile.prevStage":"Previous stage {label}, state {state}","pipelineMobile.nextStage":"Next stage {label}, state {state}","pipelineMobile.openVerdict":"Open verdict for {label}, state {state}","pipelineMobile.expandDock":"Expand pipeline {task}","pipelineMobile.collapseDock":"Collapse pipeline {task}","pipelineMobile.summaryOpen":"Open pipelines ({n})","pipelineMobile.summaryCount":{one:"{n} pipeline",other:"{n} pipelines"},"pipelineMobile.summaryActive":"{n} active","pipelineMobile.summaryAttention":"{n} need you","pipelineMobile.summaryCompleted":"{n} done","pipelineMobile.sheetTitle":"Pipelines","pipelineMobile.closeSheet":"Close pipelines","pipelineMobile.completedGroup":{one:"{n} completed",other:"{n} completed"},"wfDraft.paneAria":"Draft of a new workflow","wfDraft.notStarted":"the workflow is not launched yet","wfDraft.newWorkflow":"new workflow","wfDraft.dismiss":"Dismiss the workflow draft","wfDraft.template":"template","wfDraft.templateAria":"Workflow template","wfDraft.repo":"repository","wfDraft.repoAria":"Repository directory","wfDraft.manualMode":"manual: a gate at every stage boundary","wfDraft.hint":"Pick a template and a repository, describe the task — the workflow creates a worktree, runs the stages and the review, then opens a PR.","wfDraft.taskPlaceholder":"the task for the workflow — the brief goes to every stage…","wfDraft.taskAria":"Workflow task brief","wfDraft.footerHint":"worktree \xb7 stages \xb7 review \xb7 PR","wfDraft.finishMerge":"local merge","wfDraft.needDir":"set the repository directory","wfDraft.needTask":"describe the task","wfDraft.launchFailed":"launch failed","wfDraft.launch":"▶ Launch workflow","wfDraft.launching":"launching…","scheme.flowTitle":"Run the implement → review cycle for this conversation","scheme.flow":"Flow","scheme.collapsedTitle":"Collapsed branches and tasks of this conversation","scheme.ancestorElided":{one:"Parent not drawn on this board: {title}",other:"{count} ancestors not drawn on this board, nearest: {title}"},"scheme.ancestorOffBoard":"Parent conversation is not on this board","scheme.underneath":"underneath","scheme.handTool":"Hand — drag the canvas (H, or hold Space)","scheme.selectTool":"Select — click and work with conversations (V)","scheme.zoomOut":"Zoom out (−)","scheme.zoom100":"Zoom 100% (1)","scheme.zoomIn":"Zoom in (+)","scheme.fitCurrent":"Fit current work (0)","scheme.fit":"Fit all content (Shift+0, or double-click the background)","scheme.framedCurrent":"Framed current work — {count} items","scheme.framedAll":"Framed all content — {count} items","scheme.offscreenNav":"Off-screen work","scheme.offscreenMore":"Show {count} more off-screen clusters","mobile.mapFrame":"Map framing","mobile.mapAll":"All","mobile.mapCurrent":"Current","scheme.roleImplementer":"Implementer","scheme.roleReviewer":"Reviewer","scheme.roleWorking":"working","scheme.roleWaiting":"waiting","scheme.lassoTool":"Multi-select — draw a box around agents, click cards to toggle","scheme.selectCheckOn":"Add this agent to the selection","scheme.selectCheckOff":"Remove this agent from the selection","scheme.boardAria":"Agent board — arrow keys move between agent windows","scheme.navStack":{one:"{count} quiet branch under {title}",other:"{count} quiet branches under {title}"},"scheme.navStackBare":{one:"{count} quiet branch",other:"{count} quiet branches"},"bulk.selectedCount":{one:"{count} selected",other:"{count} selected"},"bulk.placeholder":"one message to every selected agent…","bulk.textAria":"Broadcast text for the selected agents","bulk.sendAll":"Send to {count} agents","bulk.interrupt":"Interrupt","bulk.stop":"Stop","bulk.stopConfirm":"Stop {count} agents?","bulk.remove":"Clear from board","bulk.removeConfirm":"Close {count} cards?","bulk.flow":"Flow","bulk.fit":"Show selection","bulk.exit":"Exit selection (Esc)","bulk.retryFailed":"Retry failed ({count})","bulk.nodeGone":"node left the board","bulk.flowTitle":"Start a review flow on {count} agents","bulk.flowStart":"Start {count} flows","minimap.title":"Minimap — click or drag to navigate","minimap.stacks":{one:"{count} collapsed stack",other:"{count} collapsed stacks"},"plan.agentPlan":"Agent plan:","plan.stepsAria":"Plan: {done} of {total} steps","plan.nowSuffix":", now: {current}","plan.goal":"goal","plan.goalDone":"goal ✓","plan.goalBlocked":"goal ✖","plan.noObjective":"(objective not recorded in the transcript tail)","plan.tokens":"tokens: {n}","plan.time":"time: {n} min","plan.ctxTitle":"Context window: {pct}% used\n{used} of {window} tokens","plan.ctxSourceRuntime":"Window reported by the agent runtime","plan.ctxSourceRegistry":"Window from the bundled model registry ({version}) — approximate","plan.ctxTitleUnknown":"Context usage: {used} tokens\nWindow unknown for this model — percentage withheld","plan.ctxAria":"Context: {pct} percent of the window used","plan.ctxAriaUnknown":"Context: {used} tokens used, window size unknown","plan.goalAria":"Session goal: {status}","limits.now":"now","limits.inMin":"in {n}m","limits.inHour":"in {n}h","limits.inDay":"in {n}d","limits.asOf":"as of {time}","limits.left":"left","limits.reset":"reset {eta} \xb7 {at}","limits.stale":"data is stale: {stale}","limits.5h":"5h","limits.week":"Week","limits.windowMinutes":"{n}m","limits.windowHours":"{n}h","limits.windowDays":"{n}d","limits.accountsOpenAria":"Codex accounts — switch or add","limits.noDataYet":"no data yet","limits.rateLimited":"Provider is rate-limiting requests.","limits.rateLimitedRetry":"Provider is rate-limiting requests. Retry at {time}.","limits.reauthRequired":"Re-login to Claude is required.","burndown.title":"burndown","burndown.openAria":"Open {engine} burndown chart","burndown.close":"Close chart","burndown.windowAria":"Chart window","burndown.ideal":"even pace","burndown.actual":"remaining","burndown.loading":"Loading history…","burndown.failed":"Couldn't load history.","burndown.empty":"No history yet — the chart fills in as quota is sampled.","burndown.windowUnreported":"This plan reports no {window} window, so there is nothing to chart here.","burndown.buildsFrom":"history builds from {date}","burndown.fast":"{pct}% ahead of pace — burning fast","burndown.slow":"{pct}% under pace — room to spare","burndown.even":"on even pace","burndown.emptyBy":"at this rate, 0% by {at}","resources.ram":"RAM","resources.swap":"Swap","resources.free":"{amount} free","resources.used":"{amount} used","resources.stale":"resource data is stale: {stale}","resources.captured":"captured {age}","resources.openAria":"Agent sessions and memory","resources.title":"Agent sessions","resources.total":"Σ {amount}","resources.empty":"no agent sessions in tmux","resources.orphan":"orphan pane","resources.hostConflict":"duplicate conversation pane","resources.hostConflictHint":"multiple live panes claim this conversation","resources.procs":{one:"{count} process",other:"{count} processes"},"resources.swapShare":"+ {amount} swap","resources.kill":"Kill","resources.confirm":"Sure?","resources.killLiveHint":"the agent is working right now — click to unlock, then confirm","resources.killHint":"kill the tmux pane with its whole process tree","resources.bulkLabel":"idle longer than","resources.bulkKill":"Kill idle","resources.bulkNone":"nothing has been idle that long","resources.hoursN":"{n} h","resources.killAll":"Kill all agents","resources.killAllConfirm":"Confirm — kill {n}?","resources.killAllHint":"force-kill every agent pane, live ones included — a clean slate so the next spawn/message routes cleanly. Your shells and the viewer are left alone.","resources.killAllNone":"no agent sessions to kill","resources.close":"Close","attach.attach":"Attach","attach.readonly":"Read-only","attach.copy":"Copy attach command","attach.copyReadonly":"Copy read-only attach command","attach.hint":"copy the tmux attach command for this pane — paste it into any shell","attach.readonlyHint":"copy a read-only (view-only) attach command — you watch without touching the keys","attach.loading":"resolving…","attach.copied":"attach command copied","attach.copiedReadonly":"read-only command copied","attach.stale":"This pane changed or closed. Refresh and try again.","attach.restarted":"The tmux server restarted. Refresh and try again.","attach.unavailable":"The tmux endpoint is unavailable. Refresh and try again.","attach.badRequest":"Can’t resolve this pane — refresh the list.","attach.network":"Network error — try again.","attach.clipboard":"Couldn’t copy — check clipboard permissions.","attach.refresh":"Refresh","status.awaitingPlan":"awaiting plan approval","status.awaitingAnswer":"awaiting an answer to a question","status.awaitingTerminal":"awaiting a reply in the terminal","status.working":"working…","status.returnedResult":"returned with a result","status.stalled":"interrupted or awaiting permission","status.finishedTurn":"finished the turn — waiting for a reply","status.rateLimited":"rate-limited","status.providerThrottled":"provider is throttling — resumes at {time}","status.flow":"flow: {label}","rateLimit.badge":"rate-limited","rateLimit.badgeUntil":"rate-limited until {time}","rateLimit.reseat":"continue on a healthy account","rateLimit.reseatRequested":"reseating…","rateLimit.reseatTitle":"Spawn a successor of this conversation on the healthiest signed-in account; the rate-limited one is parked, attached flows follow.","rateLimit.reseatFailed":"reseat failed","rateLimit.reseatAlready":"already reseated","rateLimit.reseatWaitingTurn":"Reseat queued: waiting for the rate-limited turn to release the pane, then the successor spawns.","dictation.capWarn":"less than a minute of recording left","dictation.capStopped":"Recording stopped at the 10-minute limit; the text will appear in the field.","dictation.failed":"couldn't transcribe","dictation.silence":"silence — nothing recognized","dictation.unsupported":"recording is not supported in this browser","dictation.liveError":"live transcription error","dictation.connectionLost":"transcription connection dropped","dictation.noMic":"no microphone access","overview.branchesLiveIn":{one:"{count} branch running in {projects}",other:"{count} branches running in {projects}"},"overview.projects":{one:"{count} project",other:"{count} projects"},"overview.archived":"\xb7 {count} archived","overview.moreLive":"{count} more live","overview.quiet":"quiet \xb7 last activity {age}","overview.empty":"No logs yet","catalog.unreachable":"catalog unavailable","catalog.errorTitle":"Couldn't load the session catalog","catalog.errorBody":"The viewer server did not answer, so what is running is unknown.","catalog.retry":"Retry","catalog.attempts":{one:"{count} failed attempt",other:"{count} failed attempts"},"launch.account":"Account","launch.reasoning":"Reasoning","orchPanel.title":"Orchestrator","orchPanel.toggleAria":"Orchestrator panel","orchPanel.regionAria":"Orchestrator for {project}","orchPanel.close":"Close the orchestrator panel","orchPanel.resize":"Resize the orchestrator panel","orchPanel.loading":"Reading this project's orchestrator…","orchPanel.unavailable":"The orchestrator seat can't be read","orchPanel.unavailableHint":"Nothing was changed. Until this answers, creating one here could designate a second orchestrator.","orchPanel.recheck":"Check again","orchPanel.draftTitle":"Create this project's orchestrator","orchPanel.draftHint":"It runs in {project}, owns this board, and answers you here. The text below is delivered to it as its first message — edit it however you like.","orchPanel.draftHintVacated":"The previous orchestrator's conversation is gone. Create a new one for {project}; the text below is delivered as its first message.","orchPanel.mandate":"Mandate","orchPanel.mandateSent":"Sent as the first message","orchPanel.restoreDefault":"Restore default","orchPanel.mandateRequired":"The mandate can't be empty.","orchPanel.cwd":"Working directory: {cwd}","orchPanel.confirm":"Create orchestrator","orchPanel.confirmRetry":"Try again","orchPanel.creating":"Creating the orchestrator…","orchPanel.creatingHint":"The designation is recorded. The mandate is delivered exactly once, even if this page reloads.","orchPanel.receipt":"Launch {launchId}","orchPanel.creatingStuck":"This designation has been pending since before this page loaded — the request that started it never finished.","orchPanel.creatingResume":"Finish this designation","orchPanel.errorTitle":"The orchestrator wasn't designated","orchPanel.errorHint":"Nothing is running. Fix the mandate or the parameters and try again.","orchPanel.errorUnknownTitle":"The last attempt's outcome is unknown","orchPanel.errorUnknownHint":"The reply was lost, so an orchestrator may already exist. Trying again replays the same request instead of creating a second one.","orchPanel.transportLost":"The reply never arrived — the connection dropped.","orchPanel.transitionPending":"A new designation is settling…","orchPanel.transitionFailed":"The last designation failed","orchPanel.stalled":"This orchestrator has gone quiet. Send it a message to pick the work back up.","orchPanel.resumable":"This orchestrator has finished its run. Send it a message to resume this same conversation.","orchPanel.resolving":"Opening the conversation…","orchPanel.resolvingHint":"The orchestrator is designated; its transcript hasn't reached this view yet.","orchPanel.openOnBoard":"Open it on the board","orchPanel.rotation":"Rotation recommended","orchPanel.rotationStrong":"Rotation strongly recommended","orchPanel.rotationContext":"context is at {percent}% of the model's window","orchPanel.rotationDead":"its host is gone","orchPanel.badgeLive":"live","orchPanel.badgeStalled":"quiet","orchPanel.badgeResumable":"finished","orchPanel.badgeDead":"host gone","orchPanel.badgeResolving":"opening","orchPanel.badgeCreating":"creating","orchPanel.badgeFailed":"failed","orchPanel.badgeNone":"none yet","orchPanel.badgeReading":"reading","orchPanel.incumbentAria":"The orchestrator holding this project's seat","orchPanel.incumbentUnknown":"model not resolved yet","orchPanel.accountTitle":"Running on the {account} account","orchPanel.ctxTitle":"Context: {used} of {window} tokens ({percent}%)","orchPanel.ctxUnknownWindow":"{used} tokens in context; this model has no configured window, so no percentage is claimed","orchPanel.ctxAria":"Context window {percent}% full","orchPanel.ctxAriaUnknown":"Context usage, window unknown","orchPanel.predecessor":"Replaced an earlier orchestrator","orchPanel.predecessorTitle":"Open the predecessor's conversation on the board","orchPanel.rotate":"Rotate","orchPanel.rotateTitle":"Replace this orchestrator with a fresh one. Nothing rotates until you confirm.","orchPanel.rotateHeading":"Replace this project's orchestrator","orchPanel.rotateHint":"The successor starts with the mandate below. Its predecessor's transcript and this project's open tasks are handed over by the server — you don't have to repeat them here. The predecessor's conversation stays on the board, linked to the new one.","orchPanel.rotateConfirm":"Rotate orchestrator","orchPanel.rotateCancel":"Keep this one","orchPanel.rotateErrorTitle":"The rotation didn't happen","orchPanel.rotateErrorHint":"Your current orchestrator is untouched and still holds the seat. Fix the mandate or the parameters and try again.","orchPanel.rotateErrorUnknownTitle":"The last rotation's outcome is unknown","orchPanel.rotateErrorUnknownHint":"The reply was lost, so a successor may already exist. Trying again replays the same request instead of rotating twice.","orchPanel.rotateVacated":"That orchestrator's conversation was closed while this rotation was still in flight. Finish it here — trying again replays the same request instead of rotating twice.","orchPanel.restoreIncumbent":"Restore current mandate","orchPanel.cwdInherited":"The successor continues in {cwd}","orchMobile.create":"Create orchestrator","orchMobile.unreadable":"unreadable","orchMobile.rowCreateAria":"Create this project's orchestrator","orchMobile.rowLiveAria":"Orchestrator {model} — {state}. Opens its conversation.","orchMobile.rowStatusAria":"Orchestrator — {state}. Opens the orchestrator sheet.","orchMobile.pendingAria":"A new designation is settling — open it","orchMobile.transitionAria":"The last designation failed — open it","orchMobile.sheetAria":"Orchestrator for {project}","orchMobile.liveTitle":"This project's orchestrator","orchMobile.liveHint":"It answers in its own conversation. Opening it lands there, with the composer.","orchMobile.open":"Open the conversation","branch.live":"working","branch.waiting":"finished the turn — waiting for a reply","branch.returned":"returned with a result","branch.stalled":"interrupted or awaiting permission","branch.done":"done — safe to remove","branch.worktree":"Worktree {name}","branch.lastActivity":"Last activity: {age}","branch.lastActivityQuiet":"Marked active, but the transcript is quiet: last activity {age}","branch.handoffTitle":"agent spawned by this conversation's handoff","branch.branchTitle":"branch of this conversation","branch.accountTip":"Account {id} \xb7 {engine} \xb7 {health}","branch.accountTipPlain":"Account {id} \xb7 {engine}","branch.accountAria":"Open accounts for {id}","lineage.parentRemoved":"parent removed","lineage.parentRemovedTitle":"The parent conversation transcript was removed","branch.removeColumn":"Remove column {title}","branch.toggleBackground":"{action} background task {title}","branch.collapse":"Collapse","branch.expand":"Expand","branch.expandFull":"Expand conversation {title} to the full window","branch.collapseFull":"Back to the canvas (Esc)","branch.detailsShow":"Show conversation details","branch.detailsHide":"Hide conversation details","branch.favorite":"Mark as favorite","branch.unfavorite":"Remove from favorites","tree.quiet":"Quiet conversations and tasks","taskStacks.collapse":"Fold the card back into its status stack","readiness.title":"Task readiness","readiness.aria":"Readiness sections for every project task","readiness.legend":"Now — assigned into work \xb7 Review — a review is running or has a verdict \xb7 Blocked — needs a decision \xb7 Planned — inbox/backlog \xb7 Done — finished","readiness.section.now":"Now","readiness.section.review":"In review","readiness.section.blocked":"Blocked","readiness.section.planned":"Planned","readiness.section.done":"Done","readiness.sectionAria":"“{section}” tasks \xb7 {count}","readiness.open":"Open task on the board: {title}","readiness.place":"Place task on the map: {title}","readiness.issueAria":"Open issue #{issue} on GitHub","readiness.agent":"agent","readiness.agentAria":"Open the assigned agent: {title}","readiness.pipeline":"pipeline","readiness.pipelineAria":"Open the linked pipeline stage: {title}","readiness.review":"review","readiness.reviewAria":"Open the linked review: {title}","readiness.state.live":"live","readiness.state.gone":"gone","readiness.state.failed":"failed","launchHistory.title":"Launch history","launchHistory.aria":"Terminal launch receipts","launchHistory.failed":"failed","launchHistory.recovered":"recovered","launchHistory.retryLabel":"Retry","launchHistory.retry":"Retry launch: {title}","workerStack.title":"Collapsed workers","workerStack.aria":"Collapsed worker conversations","workerStack.expandGroup":"Expand review group on the board","workerStack.flow":"Flow","workerStack.pipeline":"Pipeline","workerStack.origin":"Spawned","workerStack.worktree":"Workers","corner.waitingCount":"\xb7 {count} waiting","corner.openSwitchboard":"Open the agent switchboard","task.working":", working","task.interrupted":", interrupted","task.finished":", finished","task.interruptedBadge":"interrupted","task.finishedBadge":"finished","task.stopFailed":"couldn't stop","task.signalSent":"sent {signal} to PID {pid}","task.killRequested":"kill requested","task.confirmKill":"Really kill PID {pid}?","task.confirmKillNamed":"Stop {name}?","task.confirmKillUntitled":"this agent","task.confirmKillYes":"Yes, kill","task.stopAria":"Stop process PID {pid}","task.kill":"Kill","task.backgroundCommand":"Background command","task.commandNotFound":"The command that started this background task wasn't found in the session transcripts","viewer.closeProjects":"Close the project list","viewer.agentWaiting":"Agent is waiting for a reply","viewer.staleFocusEntry":"That conversation is no longer available","viewer.unknownFragment":"This link names nothing the viewer recognizes","viewer.closeNotification":"Close the notification","attention.badge":{one:"{count} waiting",other:"{count} waiting"},"attention.needsYou":"Needs you","attention.next":"Next","attention.nextHint":"Focus the next one waiting on you (N, Shift-N — back)","attention.openQueue":"Attention queue — who is blocked on you (N — next)","attention.popoverTitle":"Waiting on you","attention.filterOn":"Show only those waiting on you (F)","attention.filterOff":"Show all nodes (F)","mobile.noConvos":"No conversations yet","mobile.map":"Map","mobile.closeMap":"Close the map","mobile.tapNode":"Tap a node — the conversation opens full-screen","mobile.agent":"agent","mobile.openMap":"Open the project map","mobile.mapLoading":"Loading the map…","mobile.marker.open":"Open {title}","mobile.marker.node":"conversation","mobile.marker.deck":"review","mobile.marker.draft":"draft agent","mobile.marker.stack":"history","mobile.marker.worker":"workers","mobile.marker.task":"task","mobile.marker.pipeline":"pipeline","tasks.failed":"failed ({status})","tasks.tool":"Task — the next click drops a card on the canvas (T)","tasks.untitled":"untitled","tasks.newPlaceholder":"task text… (the first line is the title)","tasks.newTask":"new task","tasks.panelCreate":"Create the task","tasks.unplaced":"unplaced","tasks.placeOnMap":"place on map","tasks.addDue":"deadline","tasks.clearDue":"Clear the deadline","tasks.dueTitle":"Deadline (zone: {zone})","tasks.attachCount":{one:"{count} image",other:"{count} images"},"tasks.draftDiscarded":"draft discarded","tasks.editAria":"Task text","tasks.spawning":"starting…","tasks.deadChip":"the conversation is gone from the list","tasks.failedChip":"delivery failed","tasks.killedChip":"the agent process was killed","tasks.unhostedChip":"the agent isn't running","tasks.migratingChip":"the agent is moving to another account","tasks.source":"source","tasks.sourceTitle":"Captured from","tasks.retry":"retry delivery","tasks.retryLaunch":"retry launch","tasks.retryLaunchAria":"Retry the failed launch for {title}","tasks.retryLaunched":"agent relaunched","tasks.chipFailedTitle":"not delivered: {error}","tasks.handoffChip":"routed into this agent's prompt — not sent yet","tasks.detach":"detach","tasks.detachAria":"Detach {title} from this task","tasks.expand":"Expand task","tasks.collapse":"Collapse task","tasks.openAgent":"open and center the agent pane","tasks.openAgentAria":"Open agent {title}","tasks.openAgentUnavailableAria":"Open agent {title} — unavailable: {reason}","tasks.openSource":"open and center the source conversation","tasks.openSourceAria":"Open source conversation {title}","tasks.openSourceUnavailableAria":"Open source conversation {title} — unavailable: {reason}","tasks.sourceGone":"the source conversation is not on the board","tasks.relatedNav":"Related tasks","tasks.openTaskAria":"Open task {title}","tasks.relatedAssignedTitle":"assigned to this conversation","tasks.relatedSourceTitle":"captured from this conversation","tasks.send":"send","tasks.sendTitle":"Pull the arrow onto an agent's pane to drop the task into its prompt (nothing is sent); click to seed a fresh draft conversation","tasks.linkHanded":"routed into “{title}” — review and send it there","tasks.linkSent":"task sent → “{title}”","tasks.spawn":"agent","tasks.spawnTitle":"Spawn a fresh agent with this task as the brief","tasks.spawnGo":"Launch","tasks.statusTitle":"Status: {label} — click cycles (inbox → assigned → blocked → done)","tasks.status.inbox":"inbox","tasks.status.assigned":"assigned","tasks.status.blocked":"blocked","tasks.status.done":"done","tasks.delete":"delete","tasks.deleteConfirm":"sure?","tasks.deleteAria":"Delete task {title}","tasks.pickerTitle":"Send to","tasks.pickerAllChildren":"⤷ all children","tasks.pickerEmpty":"no conversations in the project","tasks.pickerSend":"Send ({count})","tasks.sendOk":"Delivered {delivered} of {total}","tasks.sendFailPart":"✗ “{title}”: {error}","tasks.spawnOk":"agent started in tmux {target}","tasks.composerToggle":"create a task","tasks.composerToggleTitle":"On — the text becomes a tracked task card assigned to the selection; off — a plain broadcast with no trace","tasks.composerNeedsText":"a task needs text","tasks.panelTitle":"Tasks","tasks.panelToggleAria":"Toggle the task panel","tasks.panelThisProject":"this project","tasks.panelAll":"all","tasks.panelEmpty":"no tasks yet — drop one with the board's task tool (T)","tasks.panelClose":"Close the task panel","favorites.sectionTitle":"Favorites","favorites.empty":"no favorites yet — hover a card and tap its crown","favorites.focusTitle":"Focus {title} on the board","tasks.sheetNew":"new task","tasks.sheetCreate":"Create the task","tasks.sheetBack":"Back to the task list","tasks.sheetTargets":{one:"{count} target",other:"{count} targets"},"tasks.sheetAssignments":"assignments","tasks.sheetEmpty":"no tasks yet","tasks.sheetGone":"the task is gone","tasks.textNotSaved":"the text didn't save — delivery aborted, try again","tasks.emptyTextBlocked":"empty text isn't saved — restore the task text before sending","runtime.live":"live","runtime.reconnecting":"reconnecting","runtime.degraded":"degraded","runtime.offline":"offline","runtime.resynced":"resynced","runtime.connection":"runtime connection","runtime.announce.live":"runtime connection live","runtime.announce.reconnecting":"runtime reconnecting","runtime.announce.degraded":"runtime degraded — polling for updates","runtime.announce.offline":"runtime offline","runtime.announce.resynced":"runtime resynced from a fresh snapshot","runtime.staleSince":"stale {duration}","runtime.lastKnown":"last update {duration} ago","runtime.legacyProvenance":"legacy \xb7 derived state","staging.badge":"Staging","staging.badgeTitle":"Staging instance — isolated state; nothing here touches prod","runtime.drift":"drift: {evidence}","runtime.driftDismiss":"Dismiss","runtime.receipt.pending":"sending…","runtime.receipt.busyRetry":"Couldn’t deliver — agent is busy, we’ll retry","runtime.receipt.summary":"Delivery attempts: {count}","runtime.receipt.pendingCount":"pending: {count}","runtime.receipt.attemptCount":"attempts: {count}","runtime.receipt.problemCount":"issues: {count}","runtime.receipt.showDetails":"Show delivery details","runtime.receipt.hideDetails":"Hide delivery details","runtime.receipt.statusSummary":"Delivery status: {pending}, {problems}.","runtime.receipt.statusPending":{one:"{count} pending message",other:"{count} pending messages"},"runtime.receipt.statusProblems":{one:"{count} issue",other:"{count} issues"},"runtime.receipt.delivering":"delivering…","runtime.receipt.applying":"applying switch…","runtime.receipt.turn-started":"turn started","runtime.receipt.steered":"steered into current turn","runtime.receipt.queued":"queued","runtime.receipt.queuedPos":"queued \xb7 #{position}","runtime.receipt.delivered":"delivered","runtime.receipt.applied":"switch applied","runtime.receipt.interrupted":"interrupted","runtime.receipt.answered":"answered","runtime.receipt.rejected":"rejected: {reason}","runtime.receipt.failed":"failed: {reason}","runtime.receipt.uncertain":"uncertain — recovering","runtime.receipt.retry":"Retry","runtime.receipt.edit":"Edit & resend","runtime.receipt.dismiss":"Dismiss","runtime.attention.title":"needs your decision","runtime.attention.approval":"approval","runtime.attention.permission":"permission","runtime.attention.question":"question","runtime.attention.waiting_heuristic":"possibly waiting","runtime.attention.heuristicNote":"low-confidence signal","runtime.attention.unowned":"no approver attached","runtime.attention.command":"command","runtime.attention.tool":"tool","runtime.attention.approve":"Approve","runtime.attention.deny":"Deny","runtime.attention.answer":"Answer","runtime.attention.answering":"answering…","runtime.attention.expiresIn":"auto-resolves in {seconds}s","runtime.attention.keysHint":"Enter approves \xb7 Esc denies","voice.start":"Start continuous voice conversation","voice.stop":"End voice conversation","voice.connecting":"Connecting voice…","voice.live":"Voice conversation is live \xb7 speak whenever you’re ready","voice.stopping":"Ending voice conversation…","voice.failed":"Voice connection needs attention","voice.panel":"Voice conversation","voice.you":"You","voice.agent":"Agent","voice.progress":"Progress","voice.retry":"Try again","voice.ended":"Voice conversation ended","voice.elapsed":"Call duration","voice.micLevel":"Microphone level","voice.micMute":"Mute microphone","voice.micUnmute":"Unmute microphone","voice.outputMute":"Silence the agent","voice.outputUnmute":"Unsilence the agent","voice.floatSurface":"Voice conversation","voice.float":"Open the floating voice window","voice.dock":"Close the floating window and keep the call","voice.floatUnsupported":"A floating voice window needs a Chromium browser; the call stays here.","attention.return":"Back to where you were","attention.returnLine":"Go back to where you were"}},58128:(a,b,c)=>{c.d(b,{WD:()=>F,w1:()=>D,zN:()=>E});var d=c(77598),e=c.n(d),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(14509),k=c(29733),l=c(86850),m=c(42087),n=c(16089),o=c(77513),p=c(5425),q=c(98590),r=c(26474),s=c(2159);c(66024);var t=c(70107),u=c(27359),v=c(27471),w=c(25123),x=c(46825);let y=new Set(["approved","closed"]),z=new Set(["needs_decision","paused"]);function A(){return{exec:w.Ix,startSetup:w.ot,setupStatus:w.ae,spawnAgent:async(a,b,c,d)=>{let e=l.lD.resolveSpawn(a.engine,d),f=(0,j.lV)(a.engine,b,{model:a.model,effort:a.effort,codexHome:"codex"===e.engine?e.home:null,claudeConfigDir:"claude"===e.engine?e.home:null,claudeProjectsDir:"claude"===e.engine?e.transcriptRoot:null}),g=Date.now(),h=await (0,v.Tk)(f,c),i=await (0,m.s)({engine:a.engine,knownTranscript:f.transcript??null,panePid:h.panePid??null,cwd:b,startedAtMs:g,codexSessionsDir:"codex"===e.engine?e.transcriptRoot:null});return{paneId:h.paneId,transcript:i,panePid:h.panePid??null}},paneAgentAlive:async a=>{let b=await (0,v.RZ)(a);return null!==b&&!(0,u.g2)(b.command)},headCwd:a=>(0,n.tX)(a),lastMessage:p.if,createFlow:o._p,advanceFlow:(a,b)=>void(0,o.n1)(a,{action:"advance",note:b}),closeFlow:o.ni,getFlow:a=>(0,q.mL)().find(b=>b.id===a)??null,findFlowByImplementer:a=>(0,q.mL)().filter(b=>b.implementerPath===a).sort((a,b)=>a.createdAt<b.createdAt?1:-1)[0]??null,projectForCwd:t.hY,linkChild:(a,b)=>{(0,r.A6)(a,b),(0,r.OA)()},now:()=>new Date().toISOString()}}function B(a){return a.stageRuns[a.stageIndex]??null}function C(a){return"needs_decision"===a.state||"paused"===a.state?a.pausedState??"provisioning":a.state}async function D(a,b,c=A(),d=s.a){let e=(0,x.Ny)(),f=e.find(b=>b.id===a);if(!f)return{error:"workflow not found",status:404};if("pause"===b.action)"paused"===f.state||y.has(f.state)||("needs_decision"!==f.state&&(f.pausedState=f.state),f.state="paused",f.stateDetail=(0,s.P)("paused",d));else if("resume"===b.action)("paused"===f.state||"needs_decision"===f.state)&&(f.state=f.pausedState&&!z.has(f.pausedState)?f.pausedState:"provisioning",f.pausedState=null,f.stateDetail=(0,s.P)("resumed",d));else if("advance"===b.action){let a=C(f);if(y.has(f.state)||"finishing"===a)return{error:"workflow cannot advance from its current state",status:409};if("provisioning"===a){if(!f.baseRef)return{error:"workflow has no worktree yet — retry provisioning instead",status:409};f.state="implementing"}else{let d=B(f);if(!d)return{error:"workflow has no current stage",status:409};if(d.doneAt||(d.doneAt=c.now(),d.doneNote=("string"==typeof b.note&&b.note.trim()?b.note.trim().slice(0,2e3):null)??d.doneNote??"advanced manually"),"reviewing"===a){let a=f.flowId?c.getFlow(f.flowId):null;if(a&&null===a.closedAt&&"closed"!==a.state){let b=await c.closeFlow(a.id);if(b?.error)return{error:b.error,status:b.status??409}}f.state="finishing"}else{let a;f.stageIndex+=1,a=f.template.stages[f.stageIndex],f.state=a?.kind==="review-loop"?"reviewing":"implementing",f.stateDetail=null}}f.pausedState=null,f.stateDetail=null}else if("retry-stage"===b.action){let a=C(f);if(y.has(f.state))return{error:"workflow is finished",status:409};if("provisioning"===a){f.setupPid=null;try{g().rmSync((0,x.VO)(f.id),{force:!0})}catch{}}else if("implementing"===a||"reviewing"===a){let b=B(f);if(b&&Object.assign(b,{agentPath:null,agentConversationId:null,paneId:null,startedAt:null,doneAt:null,doneNote:null}),"reviewing"===a){let a=f.flowId?c.getFlow(f.flowId):null;if(a&&null===a.closedAt&&"closed"!==a.state){let b=await c.closeFlow(a.id);if(b?.error)return{error:b.error,status:b.status??409}}f.flowId=null,f.fixerPath=null,f.fixerConversationId=null}}f.state=a,f.pausedState=null,f.stateDetail=null}else if("close"===b.action){let a=f.flowId?c.getFlow(f.flowId):null;if(a&&null===a.closedAt&&"closed"!==a.state){let b=await c.closeFlow(a.id);if(b?.error)return{error:b.error,status:b.status??409}}f.state="closed",f.pausedState=null,f.stateDetail=null,f.closedAt=c.now()}return(0,x.co)(e),{workflow:f}}function E(a,b=A()){let c,d="string"==typeof a.task?a.task.trim():"";if(!d)return{error:"task brief is required",status:400};let f="string"==typeof a.repoDir?a.repoDir.trim():"";if(!f)return{error:"repoDir is required",status:400};if(0!==b.exec("git",["rev-parse","--git-dir"],f).code)return{error:`not a git repository: ${f}`,status:400};if(a.template){let b=(0,x.K8)().find(b=>b.name===a.template);if(!b)return{error:`unknown workflow template: ${a.template}`,status:400};c=b}else{let b=(0,x.Fl)(a.stages);if("error"in b)return{error:b.error,status:400};c={name:"ad-hoc",stages:b.stages,finish:"merge"===a.finish?"merge":"pr",..."string"==typeof a.setup&&a.setup.trim()?{setup:a.setup.trim()}:{},..."string"==typeof a.verify&&a.verify.trim()?{verify:a.verify.trim()}:{}}}let g=(0,x.xV)(c.stages);if("error"in g)return{error:g.error,status:400};let h=(0,x.aL)({id:e().randomUUID().slice(0,8),name:c.name,task:d,project:b.projectForCwd(f)??i().basename(f),repoDir:f,template:c,mode:"manual"===a.mode?"manual":"auto",now:b.now()});"string"==typeof a.src&&a.src.trim()&&(h.srcPath=a.src.trim(),h.srcConversationId=(0,k.agentRegistry)().conversationForPath(h.srcPath)?.id??null);let j=(0,x.Ny)();return j.push(h),(0,x.co)(j),{workflow:h}}function F(){return{workflows:(0,x.Ny)(),templates:(0,x.K8)()}}},59371:(a,b,c)=>{c.d(b,{Qs:()=>x,_v:()=>y,ww:()=>w}),c(77598);var d=c(73024),e=c.n(d);c(86850),c(78966),c(41617);var f=c(29733),g=c(48892);c(16089);var h=c(3587),i=c(12770),j=c(59683);c(5626);var k=c(23855);c(66024);var l=c(23921),m=c(73789),n=c(74382),o=c(91596),p=c(8995);function q(a,b,c){let d=a.readOnlySnapshot().entries[(0,g.pp)({engine:b,sessionId:c.id})],e=d?.structuredHost;return!!e&&d.artifactPath===c.path&&("live"===d.status||"idle"===d.status)&&null!==e.process&&null!==e.process.startIdentity&&j.B.processIdentity(e.process.pid)===e.process.startIdentity&&null===e.activeTurnRef}function r(a,b){let c,d=a.generations.at(-1)?.path,f="unknown"===a.turn.state&&"empty"===a.turn.source&&!!d&&!e().existsSync(d),g=(c=a.migration?.sourceGenerationId,a.generations.find(a=>a.id===c)??a.generations.at(-1)),h=void 0!==g&&q(b,a.engine,g);return("terminal"===a.turn.state||"idle"===a.turn.state||!!f||!!h)&&!b.pendingDeliveries(a.id).some(a=>"delivery-uncertain"===a.state)}function s(a,b,c,d){var f,g;let h,i;try{h=e().statSync(b.path)}catch(a){return c&&"ENOENT"===a.code}let j=(0,k.pk)(b.path,h.size,h.mtimeMs,"codex"===a.engine);if(!j.complete)return!1;try{i=e().statSync(b.path)}catch{return!1}if(i.size!==h.size||i.mtimeMs!==h.mtimeMs)return!1;if(j.composerReleased||q(d,a.engine,b))return!0;if(j.recoveryReleased&&(f=d,g=b.path,new Set(Object.values(f.readOnlySnapshot().entries).filter(a=>a.artifactPath&&["starting","live","idle","handoff"].includes(a.status)&&(null!==a.host||null!==a.structuredHost)).map(a=>a.artifactPath)).has(g)))return!1;if("terminal"===j.turn.state)return!0;let m=a.turn.observedAt?Date.parse(a.turn.observedAt):NaN;return"codex"===a.engine&&"idle"===a.turn.state&&null===b.host&&Number.isFinite(m)&&m>=i.mtimeMs&&!(0,l.SP)([b.path],!0).has(b.path)}async function t(a,b,c,d){let e=[];await (0,i.pV)(a,a=>{let b=function(a){if(a.migration?.phase!=="committed")return null;let b=a.generations.at(-1),c=a.generations.find(b=>b.id===a.migration?.sourceGenerationId)??a.generations.at(-2);if(!c||!b||c.id===b.id)return null;let d=b.launchProfile.project||c.launchProfile.project||"other";if(a.migration.boardProject===d&&a.migration.boardOperationId===a.migration.operationId)return null;let e=[...new Set([...a.continuityPaths,...a.migration.providerReceipt?.continuityPaths??[]])],f=[...new Set([...a.generations.slice(0,-1).map(a=>a.path),...e])].filter(a=>a!==b.path);return{conversationId:a.id,operationId:a.migration.operationId,project:d,previousProject:a.migration.boardPlacementProject??a.migration.boardProject??c.launchProfile.project,placementPaths:[...new Set([c.path,b.path,...e])],pairs:f.map(a=>({from:a,to:b.path})),provisionalManual:e.filter(a=>a!==b.path)}}(a);b&&e.push(b)});let f=[];if(await (0,i.pV)(e,a=>{a.previousProject&&a.previousProject!==a.project&&f.push({fromProject:a.previousProject,toProject:a.project,paths:a.placementPaths})}),f.length>0)try{d(f)}catch(a){console.warn("[account-migration] board project repair deferred",{projects:f.length,error:(0,p.Kb)(a)});return}b.markMigrationBoardPlacementProjects(e.map(a=>({id:a.conversationId,operationId:a.operationId,project:a.project})));let g=new Map;await (0,i.pV)(e,a=>{let b=g.get(a.project)??[];b.push(a),g.set(a.project,b)});let h=[];await (0,i.pV)([...g],([a,b])=>{try{let d=c(a,b.flatMap(a=>a.pairs),{provisionalManual:[...new Set(b.flatMap(a=>a.provisionalManual))]}).pathAliases??{};if(!b.every(a=>a.pairs.every(({from:a,to:b})=>d[a]===b)))throw Error("board continuity aliases did not converge");h.push(...b.map(b=>({id:b.conversationId,operationId:b.operationId,project:a})))}catch(c){console.warn("[account-migration] board continuity repair deferred",{project:a,conversations:b.length,error:(0,p.Kb)(c)})}}),b.markMigrationBoardProjects(h)}async function u(a,b,c,d){if(!b)return;let e=c.migration?.phase==="committed",f=c.generations.at(-1),g=f?.host!==null&&f?.host!==void 0&&(0,n.Qq)(f.host,b.host);if(e&&f?.id===b.nativeId&&f.path===b.path&&g)return void d.completeSuccessorCleanup(b.operationId);d.queueSuccessorCleanup(c.id,b);try{await a.cleanup?.(b),d.completeSuccessorCleanup(b.operationId)}catch(a){d.recordSuccessorCleanupFailure(b.operationId,a instanceof Error?a.message:String(a))}}function v(a,b){let c=a.migration,d=a.reconfigure;return c?.phase==="verifying"&&null!==c.providerReceipt&&(0,n.WB)(c.providerReceipt,b)&&d?.status==="applying"&&d.accountId===c.targetId}async function w(a,b=(0,f.agentRegistry)(),c=new o.wh,d={}){var e,g,i;let j,k=b.conversation(a);if(!k?.migration)throw Error("conversation has no migration");if(e=k,g=d.reconfigureOperationId,j=e.reconfigure,j?.status==="applying"&&j.accountId===e.migration?.targetId&&j.operationId!==g)return k;let l=k.migration;if("waiting-turn"===l.phase){if(!r(k,b))return k;l=(k=b.transitionConversationMigration(k.id,l.revision,["waiting-turn"],{phase:"requested"})).migration}if("committed"===l.phase)return d.deferBoardRepair||await t([k],b,d.remapBoardPaths??h.cw,d.transferBoardPathPlacements??h.L5),b.conversation(k.id)??k;if("rolled-back"===l.phase||"failed-recoverable"===l.phase)return k;let q="copy"in c?{virtualSource:!0,async create(a){let b=await c.copy({engine:a.engine,sourcePath:a.source.path,targetHome:a.targetAccountId,conversationId:a.conversationId});return{operationId:a.operationId,nativeId:b.nativeId,path:b.path,continuityPaths:[],historyHash:"legacy-copy-port",host:{kind:"tmux",identity:"legacy-copy-port",epoch:1,verifiedAt:new Date().toISOString()}}},async verify(){}}:c,x=l.providerReceipt;try{if(l.providerReceipt)x=l.providerReceipt;else{if(!r(k,b))return k;let a=l.phase,c=c=>{let d=c.migration??l;return d.phase!==a&&("preparing"===d.phase||"successor-starting"===d.phase)?b.transitionConversationMigration(c.id,d.revision,[d.phase],{phase:a}):c},d=k.generations.find(a=>a.id===l.sourceGenerationId)??k.generations.at(-1);if(!d)throw Error("conversation has no source generation");if(!s(k,d,!0===q.virtualSource,b))return k;if("requested"===l.phase&&(l=(k=b.transitionConversationMigration(k.id,l.revision,["requested"],{phase:"preparing"})).migration),"preparing"===l.phase&&(l=(k=b.transitionConversationMigration(k.id,l.revision,["preparing"],{phase:"successor-starting"})).migration),l=(k=b.conversation(k.id)??k).migration??l,!r(k,b))return c(k);if(!(d=k.generations.find(a=>a.id===l.sourceGenerationId)??k.generations.at(-1)))throw Error("conversation has no source generation");if(!s(k,d,!0===q.virtualSource,b))return c(k);let e=k.id,f={operationId:l.operationId,revision:l.revision};if((x=await q.create({engine:k.engine,operationId:f.operationId,conversationId:e,source:d,targetAccountId:l.targetId,recordContinuityPath(a){b.recordMigrationContinuityPath(e,a,f)}})).operationId!==f.operationId)throw Error("successor receipt operation does not match");x=(l=(k=b.persistMigrationProviderReceipt(e,f.revision,f.operationId,x)).migration).providerReceipt??x}let a=k.generations.find(a=>a.id===l.sourceGenerationId)??k.generations.at(-1);if(!a)throw Error("conversation has no source generation");if(!x||x.operationId!==l.operationId)throw Error("persisted successor receipt operation does not match");await q.verify(x,{engine:k.engine,targetAccountId:l.targetId,launchProfile:a.launchProfile});let c=k.id,e=x,f=l.revision,g=l.operationId,i=async()=>{if(d.ownsOperation&&!await d.ownsOperation())return!1;let a=b.conversation(c),h=a?.migration;return!!(a&&h?.phase==="verifying"&&h.revision===f&&h.operationId===g&&null!==h.providerReceipt&&(0,n.WB)(h.providerReceipt,e))},j=b.conversation(c);if(!j||!await i()||(await q.publishHost?.(e,{engine:k.engine,conversationId:c,targetAccountId:l.targetId,launchProfile:a.launchProfile,ownsOperation:i}),!(j=b.conversation(c))||!await i()))return j&&(v(j,e)||await u(q,e,j,b),d.deferBoardRepair||await t([j],b,d.remapBoardPaths??h.cw,d.transferBoardPathPlacements??h.L5)),b.conversation(c)??j??k;let m=b.commitSuccessor(c,{id:e.nativeId,path:e.path,accountId:l.targetId,launchProfile:a.launchProfile,historyHash:e.historyHash,host:e.host},f,g,e);return d.deferBoardRepair||await t([m],b,d.remapBoardPaths??h.cw,d.transferBoardPathPlacements??h.L5),b.conversation(m.id)??m}catch(j){let a=b.conversation(k.id);if(j instanceof o.IM||(0,m.gR)(j))return a??k;let c=a?.migration?.providerReceipt,e=null!==x&&null!=c&&!(0,n.WB)(c,x);if(a&&(!a.migration||a.migration.revision!==l.revision||a.migration.operationId!==l.operationId||"committed"===(i=a.migration.phase)||"rolled-back"===i||"failed-recoverable"===i||e))return await u(q,x,a,b),d.deferBoardRepair||await t([a],b,d.remapBoardPaths??h.cw,d.transferBoardPathPlacements??h.L5),b.conversation(a.id)??a;console.warn("[account-migration] recoverable successor provider failure",{conversationId:k.id,engine:k.engine,phase:l.phase,targetAccountId:l.targetId,error:(0,p.Kb)(j)});let f=j instanceof o.I1?{message:"Codex fork outcome is awaiting recovery",code:"codex-fork-outcome-unknown"}:(0,p.rI)(j),g=b.transitionConversationMigration(k.id,l.revision,["requested","preparing","successor-starting","verifying"],{phase:"failed-recoverable",error:f.message,errorCode:f.code});return await u(q,x,g,b),g}}async function x(a,b,c=(0,f.agentRegistry)()){let d=c.conversation(a),e=d?.generations.at(-1);e&&await (0,i.pV)(c.pendingDeliveries(a),async a=>{let d="delivery-uncertain"===a.state;if(d&&!b.reconcileUncertain||!d&&("assigned"!==a.state||a.generationId!==e.id))return;if("text"!==a.payloadKind&&"runtime-images"!==a.payloadKind)return void c.recordDeliveryOutcome(a.id,"failed","request-local delivery requires client retry");let f=d?a:c.beginDeliveryAttempt(a.id,e.id);if(!f)return;let g=f.clientMessageId??`migration:${f.id}`;try{let a={delivery:f,path:e.path,clientMessageId:g},h=d?await b.reconcileUncertain(a):await b.deliver(a);"held"===h?d||c.requeueUnactuatedDelivery(f.id):c.recordDeliveryOutcome(f.id,h,"failed"===h?"delivery failed and remains recoverable":null)}catch{c.recordDeliveryOutcome(f.id,"delivery-uncertain","delivery result is uncertain and remains recoverable")}})}function y(a){return a.migration?["waiting-turn","requested","preparing","successor-starting","verifying"].includes(a.migration.phase)?"held":"failed-recoverable"===a.migration.phase?"recoverable":"deliver":"deliver"}},59680:(a,b,c)=>{function d(a){return["You are now in an implement-review loop controlled by the local log viewer.","",...a?["Pinned flow specification and acceptance criteria:",a,""]:["Before your first REVIEW_READY, write spec.md with the task statement and an acceptance-criteria list using entries such as `AC1: …`.",""],"Work normally in this long-lived implementer session. When the work is ready for a fresh independent review, end your final assistant message with a line that starts exactly with:","REVIEW_READY: <one-line note>","Do not print the REVIEW_READY marker now and never quote it at the start of a line when acknowledging these instructions — print it only when the work is actually ready for review.","","Every review round will use a fresh reviewer who sees the full diff from the captured base ref, with no history from earlier rounds. If the reviewer sends findings back, respond to each finding before the next marker using:","FIXED","or","REJECTED — <reason>","","Give concrete arguments for rejections because the next reviewer will be fresh and blind to previous discussion."].join("\n")}function e(a,b){return["You are the reviewer in an implement-review loop.\n",`Working directory: ${a.cwd}`,`Review scope: git diff ${a.baseRef}...HEAD plus uncommitted changes in the same working tree.`,`Exact review HEAD: ${b.reviewHeadSha??"unavailable"}`,"\nPinned flow specification and acceptance criteria:",a.spec?.trim()||"No pinned specification was supplied for this flow.",b.readyNote?`Ready note: ${b.readyNote}`:"Ready note: none provided.","\nRead-only requirement: run tests, builds, linters, searches, and other investigation commands as needed. Do not edit files, write notebooks, commit, stage, or mutate the working tree.\n\nOutput exactly this format:\nVERDICT: APPROVE | REQUEST_CHANGES | COMMENT\n\nThen write findings in Markdown. For each finding include severity, file, line, title, and explanation. Use REQUEST_CHANGES for required fixes, COMMENT for non-blocking notes, and APPROVE only when no blocking issues remain."].join("\n")}function f(a,b){return["Review round findings are below. Address every finding before the next review marker.\n",b.trim(),"\nFor each finding, respond with FIXED or REJECTED — <reason>. When the work is reviewable again, end your final assistant message with:\nREVIEW_READY: <one-line note>"].join("\n")}c.d(b,{SB:()=>d,i0:()=>f,qu:()=>e})},63629:(a,b,c)=>{c.d(b,{Lu:()=>j,Vu:()=>f,s_:()=>h,wL:()=>g,zV:()=>i});var d=c(77598);let e=["session","flow","workflow","task","operation","deployment","edge","account","system"];function f(a){if(!a.presentationOperationId||void 0===a.presentationRevision)return a;let{presentationOperationId:b,presentationRevision:c,...d}=a;return{...d,operationId:b,revision:c}}function g(a){return{perTurnEffort:"codex"===a,perTurnModel:!1}}function h(a){return"codex"===a?{control:"compact",engine:a,supported:!0}:{control:"compact",engine:a,supported:!1,reason:"The Claude stream-json protocol has no client-originated compact control; only interrupt is exposed."}}function i(a,b){if(!e.includes(a))throw Error("runtime scope type is invalid");if(!b||b.length>200||b.includes(":")||/\s/.test(b))throw Error("runtime scope id is invalid");return{type:a,id:b}}function j(){return`op_${(0,d.randomUUID)()}`}},64487:(a,b,c)=>{c.d(b,{Hq:()=>y,WV:()=>o,Zp:()=>F,oe:()=>E});var d=c(57975),e=c(29733),f=c(48892),g=c(59683),h=c(70547),i=c(5626),j=c(23921),k=c(2451),l=c(27471);let m=/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i,n={scanner:3,resume:2,argv:1};function o(a,b){return a.canonicalFor(b)?.display??null}let p=globalThis;function q(a){return a.slice(a.lastIndexOf("/")+1).match(m)?.[0]?.toLowerCase()??null}function r(a){for(let b=a.length-1;b>=0;b-=1){let c=a[b]?.match(m)?.[0];if(c)return c.toLowerCase()}return null}function s(a){let b=Number(a.slice(1));return Number.isInteger(b)?b:-1}function t(a){return[...a].sort((a,b)=>n[b.source]-n[a.source]||a.pathname.localeCompare(b.pathname))[0]??null}function u(a,b,c){let d=new Set,e=a;for(let a=0;null!==e&&a<64;a+=1){if(e===b)return a;if(d.has(e))break;d.add(e),e=c.get(e)??null}return -1}function v(a,b,c){let d=c(b);return a.conflicts?.find(a=>null!==d&&a.conversationId===d||a.paths.includes(b))??null}class w extends Error{constructor(a){super(a.quarantinedPaneIds?.length?"conversation has a quarantined live pane":"conversation has multiple live panes"),this.name="TranscriptHostConflictError"}}function x(a,b=500,c){let d=a instanceof w?409:b;return{ok:!1,outcome:"failed",error:a instanceof Error?a.message:String(a),status:d,...c?{actuation:c}:{}}}function y(a,b=new Map){let c=async function(b,c,d){let e,f=a.conversationIdForPath??(()=>null),[g,i,j]=await Promise.all([c??a.listFiles(),a.panes(b),a.resumeRecords()]),k=j?.serverPid??await a.serverPid();if("failure"===i.kind&&null!==k)return{hosts:[],observation:"failure",observationError:i.error,conflicts:[],canonicalFor:()=>null};if(null===k||"no-server"===i.kind)return await a.reconcile?.([]),{hosts:[],observation:"no-server",conflicts:[],canonicalFor:()=>null};if("available"!==i.kind||0===i.panes.size)return await a.reconcile?.([]),{hosts:[],observation:"available",conflicts:[],canonicalFor:()=>null};let{panes:l}=i,m=d??a.ppidMap(),o=a.agents(b),p=function(a){let b=new Map;for(let c of a){if(null===c.pid||"running"!==c.proc)continue;let a=b.get(c.pid);a&&(!a.parent||c.parent)||b.set(c.pid,c)}return b}(g),w=function(a){let b=new Map;for(let c of a){let a=q(c.path);if(!a)continue;let d=b.get(a);d&&(!d.parent||c.parent)||b.set(a,c)}return b}(g),x=[];for(let[b,c]of l){let d=new Set((0,h.mO)(b,m));for(let e of o){if(!d.has(e.pid))continue;let f=function(a,b,c,d,e,f,g){let h=[],i=d.get(a.pid),j=r(a.argv),k=i?q(i.path):null;if(i?.engine===a.engine&&(null!==j&&null!==k&&j===k||g(a.pid,i.path))&&h.push({pathname:i.path,source:"scanner"}),f)for(let[d,e]of f.records)e.paneId===b.paneId&&e.panePid===c&&e.engine===a.engine&&h.push({pathname:d,source:"resume"});let l=j?e.get(j):void 0;return l?.engine===a.engine&&h.push({pathname:l.path,source:"argv"}),h}(e,c,b,p,w,j,a.writesPath??(()=>!1)),g=t(f);x.push({tmuxServerPid:k,paneId:c.paneId,panePid:b,agentPid:e.pid,display:c.target,windowName:c.windowName??"",engine:e.engine,cwd:e.cwd,agentArgv:[...e.argv],agentIdentity:a.identity(e.pid),launchId:a.launchId?await a.launchId(c.paneId):null,claimedPaths:[...new Set(f.map(a=>a.pathname))],primaryPath:g?.pathname??null,claims:f})}}let y=(e=new Map,x.forEach((a,b)=>{let c=r(a.agentArgv),d=c?`${a.paneId}:${a.engine}:${c}`:`${a.paneId}:${a.engine}:pid:${a.agentPid}`,f=e.get(d)??{firstIndex:b,hosts:[]};f.hosts.push(a),e.set(d,f)}),[...e.values()].sort((a,b)=>a.firstIndex-b.firstIndex).flatMap(a=>{if(1===a.hosts.length)return a.hosts;let b=[...a.hosts].sort((a,b)=>u(b.agentPid,b.panePid,m)-u(a.agentPid,a.panePid,m)||b.agentPid-a.agentPid)[0];if(!a.hosts.every(a=>u(b.agentPid,a.agentPid,m)>=0))return a.hosts;let c=[...new Map(a.hosts.flatMap(a=>a.claims).map(a=>[`${a.source}:${a.pathname}`,a])).values()],d=t(c);return[{...b,claims:c,claimedPaths:[...new Set(c.map(a=>a.pathname))],primaryPath:d?.pathname??null}]})),z=await a.reconcile?.(y),A=new Set(z?.quarantinedPaneIds??[]),B=y.filter(a=>!A.has(a.paneId)),C=function(a,b,c=new Set){let d=new Map;for(let e of a){let a=new Set(e.claims.map(a=>a.pathname)),f=[...new Set([...a].map(b).filter(a=>null!==a))];for(let b of f.length>0?f.map(a=>`conversation:${a}`):[...a].map(a=>`path:${a}`)){let f=b.startsWith("conversation:")?b.slice(13):null,g=d.get(b)??{conversationId:f,paths:new Set,paneIds:new Set,quarantinedPaneIds:new Set};for(let b of a)g.paths.add(b);g.paneIds.add(e.paneId),c.has(e.paneId)&&g.quarantinedPaneIds.add(e.paneId),d.set(b,g)}}return[...d.values()].filter(a=>a.paneIds.size>1||a.quarantinedPaneIds.size>0).map(a=>({conversationId:a.conversationId,paths:[...a.paths].sort(),paneIds:[...a.paneIds].sort((a,b)=>s(a)-s(b)),...a.quarantinedPaneIds.size>0?{quarantinedPaneIds:[...a.quarantinedPaneIds].sort((a,b)=>s(a)-s(b))}:{}})).sort((a,b)=>(a.conversationId??a.paths[0]??"").localeCompare(b.conversationId??b.paths[0]??""))}(y,f,A),D={hosts:y,observation:"available",conflicts:C,canonicalFor:a=>{let b;return v(D,a,f)?null:(b=B.map(b=>({host:b,claim:b.claims.filter(b=>b.pathname===a).sort((a,b)=>n[b.source]-n[a.source])[0]})).filter(a=>void 0!==a.claim).sort((a,b)=>n[b.claim.source]-n[a.claim.source]||s(b.host.paneId)-s(a.host.paneId)),b[0]?.host??null)}};return D};async function d(b,c){if(b.engine!==c.engine||await a.serverPid()!==b.tmuxServerPid||await a.panePid(b.paneId)!==b.panePid||!a.alive(b.agentPid)||b.windowName&&a.paneWindowName&&await a.paneWindowName(b.paneId)!==b.windowName||!function(a,b,c){let d=new Set,e=a;for(let a=0;null!==e&&a<64;a+=1){if(e===b)return!0;if(d.has(e))break;d.add(e),e=c(e)}return!1}(b.agentPid,b.panePid,a.parentPid))return!1;let d=a.argv(b.agentPid);if(d.length!==b.agentArgv.length||d.some((a,c)=>a!==b.agentArgv[c])||null!==b.agentIdentity&&a.identity(b.agentPid)!==b.agentIdentity||(0,j.Fe)(d)!==b.engine)return!1;let e=q(c.path);return(c.pid===b.agentPid||null!==e&&r(d)===e)&&b.claimedPaths.includes(c.path)}async function e(b){let e=a.conversationIdForPath??(()=>null),f=await c(!0);if("failure"===f.observation)throw Error(`tmux pane observation failed: ${f.observationError}`);let g=v(f,b.entry.path,e);if(g)throw new w(g);let h=f.canonicalFor(b.entry.path);if(h&&await d(h,b.entry))return{host:h,resumed:!1};let i=h;if("failure"===(f=await c(!0)).observation)throw Error(`tmux pane observation failed: ${f.observationError}`);let j=v(f,b.entry.path,e);if(j)throw new w(j);let k=null!==(h=f.canonicalFor(b.entry.path))&&null!==i&&h.paneId===i.paneId&&h.agentPid===i.agentPid&&null!==h.agentIdentity&&null!==i.agentIdentity&&h.agentIdentity!==i.agentIdentity;if(h&&!k&&await d(h,b.entry))return{host:h,resumed:!1};let l=a.beginResume?.(b.entry,b.spec)??null,m=l?.spec??b.spec,n=await a.spawn(m,"",l?.receipt);if(await a.remember(b.entry.path,m,n),"failure"===(f=await c(!0)).observation)throw Error(`tmux pane observation failed: ${f.observationError}`);let o=v(f,b.entry.path,e);if(o)throw new w(o);if(!(h=f.canonicalFor(b.entry.path))||!await d(h,b.entry))throw Error("resumed agent host could not be identified safely");return{host:h,resumed:!0}}function f(a){let c=b.get(a.entry.path);if(c)return{owner:!1,task:c};let d=e(a).finally(()=>b.delete(a.entry.path));return b.set(a.entry.path,d),{owner:!0,task:d}}async function g(b){let c,e=!1,g=!1;try{let a=f(b);e=a.owner,g=(c=await a.task).resumed}catch(a){return x(a)}for(let h=0;h<2;h+=1){if(!await d(c.host,b.entry))try{let a=f(b);c=await a.task,e||=a.owner,g||=c.resumed;continue}catch(a){return x(a)}try{await a.deliver(c.host.paneId,b.payload);try{await a.confirmAlive?.(c.host)}catch(a){console.error("[transcript host] live delivery registry confirmation failed",a)}return{ok:!0,outcome:e&&g?"resumed":"delivered-to-live",target:c.host.display}}catch(a){if(a instanceof l.SS)return x(a,500,"started");if(1===h)return x(a);try{let a=f(b);c=await a.task,e||=a.owner,g||=c.resumed}catch(a){return x(a)}}}return x("agent host became unavailable during delivery")}return{readTranscriptHosts:c,deliverToTranscriptHost:b=>a.serializeDelivery?a.serializeDelivery(b.entry,()=>g(b)):g(b)}}function z(a){return{kind:"tmux",endpoint:(0,l.WH)(),server:{pid:a.tmuxServerPid,startIdentity:g.B.processIdentity(a.tmuxServerPid)},paneId:a.paneId,panePid:{pid:a.panePid,startIdentity:g.B.processIdentity(a.panePid)},windowName:a.windowName??"",agent:{pid:a.agentPid,startIdentity:a.agentIdentity},argv:a.agentArgv}}async function A(){let a=await (0,l.lC)();if(null===a)return null;let b=(0,e.agentRegistry)(),c=b.readOnlySnapshot();if(!c.importedResumePanes){let c=await (0,l.MA)();if(c)return b.importResumePanes(c.serverPid,c.records),{serverPid:a,records:c.serverPid===a?new Map(c.records):new Map}}let d=c.legacyResumePanes;return{serverPid:a,records:d.serverPid===a?new Map(Object.entries(d.panes)):new Map}}async function B(a,b,c){if(await (0,l.$o)(a,b,c),!c.panePid)return;let d=await (0,l.lC)();null!==d&&(0,e.agentRegistry)().rememberResumePane(d,a,{paneId:c.paneId,panePid:c.panePid,windowName:b.windowName,engine:b.engine})}async function C(a,b){if("claude"!==a.engine&&"codex"!==a.engine)return b();let c=(0,f.sz)(a.engine,a.path);if(!c)return b();let d={pid:process.pid,startIdentity:g.B.processIdentity(process.pid)};try{return await (0,e.agentRegistry)().withOperationLock(c,d,b)}catch(a){return x(a,409)}}let D=y({listFiles:i.CS,panes:l.m7,ppidMap:()=>g.B.ppidMap(),agents:j.Bj,serverPid:l.lC,resumeRecords:A,panePid:l.zX,paneWindowName:async a=>(await (0,l.RZ)(a))?.windowName??null,alive:j.pl,argv:j.$U,parentPid:j.Ib,identity:g.B.processIdentity,writesPath:j.FQ,launchId:l.r$,conversationIdForPath:a=>(0,e.agentRegistry)().conversationForPath(a)?.id??null,beginResume:function(a,b,c=(0,e.agentRegistry)()){if("claude"!==a.engine&&"codex"!==a.engine)return null;let d=c.conversationForPath(a.path)??c.ensureConversation(a.engine,a.path,null),f=d.generations.at(-1);return{receipt:c.beginSpawnRequest({engine:a.engine,cwd:b.cwd,accountId:f?.accountId??null,conversationId:d.id,purpose:"resume-successor",origin:{kind:"successor"},launchProfile:b.launchProfile??f?.launchProfile}).receipt,spec:b}},spawn:l.Tk,remember:B,deliver:l.oF,confirmAlive:function(a){a.launchId&&(0,e.agentRegistry)().confirmSpawnPaneAlive(a.launchId,z(a),{engine:a.engine,cwd:a.cwd})},reconcile:function(a,b={registry:(0,e.agentRegistry)(),evidenceForHost:z}){let{registry:c,evidenceForHost:g}=b,h=c.readOnlySnapshot(),i=!1,j=new Set,l=new Set;for(let b of a){let a=g(b);if(b.launchId&&!b.primaryPath&&(c.confirmSpawnPaneAlive(b.launchId,a,{engine:b.engine,cwd:b.cwd}),i=!0),!b.primaryPath)continue;if(b.launchId){let e=function(a){for(let b of[a.primaryPath,...a.claimedPaths].filter(a=>!!a))if("claude"!==a.engine||!(0,k.X6)(b))return b;return null}(b),g=e?(0,f.sz)(b.engine,e):null;if(!e||!g){c.confirmSpawnPaneAlive(b.launchId,a,{engine:b.engine,cwd:b.cwd}),i=!0,l.add(b.paneId);continue}let m=`${g.engine}:${g.sessionId}`,n=h.receipts[b.launchId],o=h.entries[m];if(n?.state==="completed"&&n.cwd===b.cwd&&n.artifactPath===e&&n.key?.engine===g.engine&&n.key.sessionId===g.sessionId&&(0,d.isDeepStrictEqual)(n.verifiedHost,a)&&o?.artifactPath===e&&o.cwd===b.cwd&&"live"===o.status&&null===o.pendingAction&&(0,d.isDeepStrictEqual)(o.host,a)){j.add(m);continue}if(c.confirmSpawnPaneAlive(b.launchId,a,{engine:b.engine,cwd:b.cwd}),i=!0,"settled"===c.completeObservedSpawn(b.launchId,{key:g,artifactPath:e,cwd:b.cwd,accountId:null,status:"live",host:a,claimEpoch:0,claimOwner:null,pendingAction:null}).kind){j.add(m);continue}l.add(b.paneId);continue}let e=(0,f.sz)(b.engine,b.primaryPath);if(!e)continue;let m=`${e.engine}:${e.sessionId}`,n=h.entries[m],o={key:e,artifactPath:b.primaryPath,cwd:b.cwd,accountId:n?.accountId??null,status:"live",host:a,claimEpoch:n?.claimEpoch??0,claimOwner:n?.claimOwner??null,pendingAction:null};(function(a,b){if(!a)return!0;let c=void 0===b.structuredHost&&void 0!==a.structuredHost?{...b,structuredHost:a.structuredHost}:b,e={...a};return delete e.updatedAt,!(0,d.isDeepStrictEqual)(e,c)})(n,o)&&(c.upsert(o),i=!0),j.add(m)}for(let[a,b]of(i&&(h=c.readOnlySnapshot()),Object.entries(h.entries)))b.host?.kind!=="tmux"||j.has(a)||c.markUnhosted(b.key);return function(a,b){let c=new Set;for(let d of b){let b=a.entries[d];if(b){if(null!==b.pendingAction)return!0;c.add(b.artifactPath)}}return Object.values(a.receipts).some(a=>"starting"===a.state&&null!==a.artifactPath&&c.has(a.artifactPath))}(h,j)&&c.reconcileSpawnReceipts([...j].map(a=>{let[b,c]=a.split(":");return{engine:b,sessionId:c}})),{quarantinedPaneIds:[...l]}},serializeDelivery:C},p.__llvTranscriptHostDecisions??=new Map),E=D.readTranscriptHosts,F=D.deliverToTranscriptHost},66858:(a,b,c)=>{c.d(b,{ox:()=>d});function d(a){let b,c,d,e,f=new Set;for(let b of a){if(!b.source||!b.pos)continue;let a=function(a){let b=(a.x-740)/300,c=(a.y-120)/120;return!Number.isInteger(b)||b<0||!Number.isInteger(c)||c<0||c>=24?null:48*Math.floor(b/2)+2*c+b%2}(b.pos);null!==a&&f.add(a)}let g=0;for(;f.has(g);)g+=1;return c=Math.floor((b=Math.max(0,Math.floor(g)))/48),e=Math.floor((d=b%48)/2),{x:740+300*c*2+d%2*300,y:120+120*e}}},68512:(a,b,c)=>{c.d(b,{G:()=>e});let d=Promise.resolve();function e(a){let b=d.catch(()=>void 0).then(async()=>{let b=await a.snapshot();await a.append({scope:{type:"system",id:"files"},kind:"files.revision",payload:{filesRevision:b.filesRevision+1},producer:{kind:"structured-spawn-materialized"}})});return d=b,b}},69858:(a,b,c)=>{c.d(b,{$:()=>k,D:()=>j});var d=c(44836),e=c(84567);let f="\x3c!-- llv:structured-user --\x3e\n",g=/^<!-- llv:structured-user((?: [a-z0-9]+=[^ >]+)+) -->\n/,h=/(?:^| )([a-z0-9]+)=([^ >]+)/g,i=/^[a-f0-9]{64}$/;function j(a,b,c,g){let h=[];if(b&&h.push(`sha256=${b}`),c&&h.push(`ctx=${(0,d.mj)(c)}`),g){h.push(`origin=${g.kind}`);let a=(0,e.S)(g.role);a&&h.push(`sender=${a}`)}return 0===h.length?f+a:`<!-- llv:structured-user ${h.join(" ")} -->
|
|
81
|
-
${a}`}function k(a){let b=a.match(g);if(b){let c,f=null,g=null,j=null;for(let[,a,k]of b[1].matchAll(h))"sha256"===a&&i.test(k)&&(f=k),"ctx"===a&&(g=(0,d.Gp)(k)),"origin"===a&&("operator"===k||"agent"===k)&&(j=k),"sender"===a&&(c=(0,e.S)(k));let k=j?{kind:j,..."agent"===j&&c?{role:c}:{}}:null;return{text:a.slice(b[0].length),structured:!0,contentDigest:f,selectedContext:g,origin:k}}return a.startsWith(f)?{text:a.slice(f.length),structured:!0,contentDigest:null,selectedContext:null,origin:null}:{text:a,structured:!1,contentDigest:null,selectedContext:null,origin:null}}},73367:(a,b,c)=>{c.d(b,{JN:()=>i,NN:()=>n,ZD:()=>p,f$:()=>m,wi:()=>o});var d=c(31421),e=c(73024),f=c.n(e),g=c(76760),h=c.n(g);function i(a,b){let c="head"===b?["rev-parse","HEAD"]:["merge-base","HEAD",function(a){let b=(0,d.spawnSync)("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:a,encoding:"utf8"});if(0===b.status&&b.stdout.trim())return b.stdout.trim().replace(/^origin\//,"origin/");for(let b of["origin/main","origin/master","main","master"])if(0===(0,d.spawnSync)("git",["rev-parse","--verify",b],{cwd:a,encoding:"utf8"}).status)return b;return null}(a)??"origin/main"],e=(0,d.spawnSync)("git",c,{cwd:a,encoding:"utf8"});if(0!==e.status)return{ok:!1,error:(e.stderr||e.stdout||"failed to resolve git base ref").trim()};let f=e.stdout.trim();return f?{ok:!0,sha:f}:{ok:!1,error:"git returned an empty base ref"}}function j(a){let b=a.trim().replace(/\.git$/,""),c=RegExp(String.raw`^(?:ssh:\/\/)?git`+"@"+String.raw`github\.com[:/]([^/]+\/[^/]+)$`).exec(b);if(c)return c[1]??null;try{let a=new URL(b);if("github.com"!==a.hostname)return null;let c=a.pathname.replace(/^\//,"");return/^[^/]+\/[^/]+$/.test(c)?c:null}catch{return null}}let k=globalThis,l=k.__llvRepositoryCache??=new Map;function m(a,b=Date.now()){let c=l.get(a);if(c&&b-c.at<6e5)return c.repository;let d=null;try{let b=function(a){let b,c=function(a){let b=h().join(a,".git");try{let c=f().lstatSync(b);if(c.isDirectory())return b;if(!c.isFile())return null;let d=f().readFileSync(b,"utf8").slice(0,4096),e=/^gitdir:\s*(.+)\s*$/im.exec(d);return e?.[1]?h().resolve(a,e[1]):null}catch{return null}}(a);if(!c)return null;try{b=f().readFileSync(h().join(function(a){try{let b=f().readFileSync(h().join(a,"commondir"),"utf8").trim();return b?h().resolve(a,b):a}catch{return a}}(c),"config"),"utf8")}catch{return null}let d=!1;for(let a of b.split(/\r?\n/)){let b=/^\s*\[\s*remote\s+"([^"]+)"\s*\]\s*$/i.exec(a);if(b){d="origin"===b[1];continue}if(/^\s*\[/.test(a)){d=!1;continue}if(!d)continue;let c=/^\s*url\s*=\s*(.*?)\s*$/i.exec(a)?.[1],e=c?.replace(/\s+[;#].*$/,"").trim();if(e)return e}return null}(a);b&&(d=j(b))}catch{d=null}return l.set(a,{repository:d,at:b}),d}function n(a){let b=(0,d.spawnSync)("git",["remote","get-url","origin"],{cwd:a,encoding:"utf8"}),c=(0,d.spawnSync)("git",["branch","--show-current"],{cwd:a,encoding:"utf8"}),e=(0,d.spawnSync)("git",["rev-parse","HEAD"],{cwd:a,encoding:"utf8"});if(0!==b.status||0!==c.status||0!==e.status)return null;let f=j(b.stdout),g=c.stdout.trim(),h=e.stdout.trim();return f&&g&&/^[0-9a-f]{40}$/i.test(h)?{repository:f,headRef:g,headSha:h}:null}function o(a){let b=(0,d.spawnSync)("git",["status","--porcelain=v1","--untracked-files=all"],{cwd:a,encoding:"utf8",timeout:2e3});if(0!==b.status||b.stdout.trim())return null;let c=(0,d.spawnSync)("git",["rev-parse","HEAD"],{cwd:a,encoding:"utf8",timeout:2e3}),e=c.stdout.trim();return 0===c.status&&/^[0-9a-f]{40}$/i.test(e)?e:null}function p(a,b){let c=(0,d.spawnSync)("git",["ls-remote","--heads","origin",`refs/heads/${b}`],{cwd:a,encoding:"utf8",timeout:5e3});if(0!==c.status)return null;let e=c.stdout.trim().split(/\s+/)[0]??"";return/^[0-9a-f]{40}$/i.test(e)?e:null}},73789:(a,b,c)=>{c.d(b,{sy:()=>k,gR:()=>i,xq:()=>m,releaseStructuredDeliveryHost:()=>o,A:()=>n,pr:()=>j,Aj:()=>l}),c(77598),c(81533),c(29733);var d=c(48892);c(3127),c(63629),c(83336),c(41022),c(86850),c(59371),c(91596),c(94292),new TextEncoder,new TextDecoder,c(68512),c(32372);let e=process,f=e.__llvStructuredDeliveryController??={activeQueue:null,activeRegistry:null,activeHosts:null,registerActiveHost:null,republishActiveHost:null,releaseActiveHost:null,terminateActiveHost:null,completeActive:null,stopActive:()=>{}},g="structured-delivery-controller-unavailable";class h extends Error{constructor(){super("structured delivery controller is unavailable"),this.code=g,this.name="StructuredDeliveryControllerUnavailableError"}}function i(a){return a instanceof h||"object"==typeof a&&null!==a&&"code"in a&&a.code===g}function j(){let a=f.registerActiveHost;if(!a)throw new h;return a}function k(a){return f.activeHosts?.has((0,d.pp)(a))??!1}function l(a){var b,c;return a.startsWith("conversation_")&&f.activeRegistry&&f.activeHosts?(b=f.activeRegistry,c=f.activeHosts,a=>{let e=b.conversation(a),f=e?.generations.at(-1);return e&&f?c.get((0,d.pp)({engine:e.engine,sessionId:f.id}))??null:null})(a):null}async function m(a,b){return j()(a,b)}async function n(a){return await f.republishActiveHost?.(a)??!1}async function o(a){return await f.releaseActiveHost?.(a)??!1}},77149:(a,b,c)=>{c.d(b,{L1:()=>h});let d=globalThis;async function e(a=fetch,b=process.env){let c=b.LLV_VIEWER_CONTROL_URL?.trim()||"http://127.0.0.1:8898",d=await a(new URL("/api/pipelines/tick",c),{method:"POST",headers:{"content-type":"application/json",origin:c,"sec-fetch-site":"same-origin"},body:"{}"});if(!d.ok)throw Error(`pipeline controller request failed with status ${d.status}`)}async function f(){await e()}let g=d.__llvPipelineSignal??={tick:f,scheduled:!1};function h(){g.scheduled||null===g.tick||(g.scheduled=!0,queueMicrotask(()=>{g.scheduled=!1;let a=g.tick;null!==a&&a().catch(a=>{console.error("[pipeline controller] requested tick failed",a)})}))}},77276:(a,b,c)=>{function d(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:null}function e(a){return"string"==typeof a?a:""}function f(a){return"string"==typeof a?a:Array.isArray(a)?a.map(a=>{if("string"==typeof a)return a;let b=d(a),c=e(b?.type);return"text"===c||"input_text"===c||"output_text"===c?e(b?.text):""}).join(""):""}function g(a,b){let c=d(a);if(!c)return null;let g=d(c.message),h=e(c.type),i=e(c.role)||e(g?.role);if("agentMessage"!==h&&"agent_message"!==h&&"assistant"!==h&&("message"!==h||"assistant"!==i))return null;let j=("string"==typeof c.text?c.text:"")||f(c.content)||f(g?.content);return j?{responseId:e(c.id)||e(c.uuid)||e(g?.id)||b,text:j}:null}function h(a,b){return`voice:${JSON.stringify([a,b.map(a=>a.responseId)])}`}function i(a){return Array.isArray(a)?a.flatMap(a=>{let b=d(a),c=e(b?.turnId),f=Array.isArray(b?.responses)?b.responses.flatMap(a=>{let b=d(a),c=e(b?.responseId);return c&&"string"==typeof b?.text?[{responseId:c,text:b.text}]:[]}):[];if(!c||0===f.length)return[];let g=e(b?.sourceTurnId),i=d(b?.streamChunk),j=i?.index,k=i?.startOffset,l=i?.endOffset,m=g&&Number.isInteger(j)&&Number.isInteger(k)&&Number.isInteger(l)&&j>=0&&k>=0&&l>k;return[{deliveryId:h(c,f),turnId:c,responses:f,ready:b?.ready===!0,...m?{sourceTurnId:g,streamChunk:{index:j,startOffset:k,endOffset:l}}:{}}]}):[]}function j(a){let b=`voice-stream:${a.sourceTurnId}:${a.chunkIndex}:${a.startOffset}:${a.endOffset}`,c=`${b}:response`;return i([{deliveryId:"derived",turnId:b,sourceTurnId:a.sourceTurnId,streamChunk:{index:a.chunkIndex,startOffset:a.startOffset,endOffset:a.endOffset},responses:[{responseId:c,text:a.text}],ready:!0}])[0]}function k(a){if(!Array.isArray(a))return[];let b=[];for(let c of a){if("string"!=typeof c||!c)continue;let a=b.indexOf(c);a>=0&&b.splice(a,1),b.push(c)}return b.slice(-256)}function l(a,b,c){let d=i(a),e=d.findIndex(a=>a.turnId===b),f=e>=0?d[e]:{deliveryId:"",turnId:b,responses:[],ready:!1},g=f.responses.findIndex(a=>a.responseId===c.responseId),j=g>=0?f.responses.map((a,b)=>b===g?c:a):[...f.responses,c],k={deliveryId:h(b,j),turnId:b,responses:j,ready:f.ready};return e<0?[...d,k]:d.map((a,b)=>b===e?k:a)}function m(a,b,c){if(!Number.isInteger(b)||b<0||b>a.length)throw Error("voice delivery offset is invalid");let d=a.charCodeAt(b),e=a.charCodeAt(b-1);if(b>0&&d>=56320&&d<=57343&&e>=55296&&e<=56319)throw Error("voice delivery offset splits a Unicode scalar");if(!Number.isInteger(c)||c<4)throw Error("voice delivery chunk size is invalid");if(b===a.length)return null;let f=b,g=0;for(;f<a.length;){let d=a.codePointAt(f),e=d<=127?1:d<=2047?2:d<=65535?3:4;if(f>b&&g+e>c)break;g+=e,f+=d>65535?2:1}return f>b?{text:a.slice(b,f),nextOffset:f}:null}c.d(b,{Im:()=>i,N5:()=>j,_5:()=>l,_t:()=>m,mT:()=>g,yK:()=>k})},77308:(a,b,c)=>{c.d(b,{uk:()=>d});let d={"common.serverUnavailable":"сервер недоступний","common.loading":"завантаження…","common.loadingCap":"Завантаження…","common.cancel":"Скасувати","common.edit":"змінити","common.show":"показати","common.showAll":"показати все","common.collapse":"згорнути","common.copy":"Копіювати","common.copied":"скопійовано","common.clickToCopy":"клік — скопіювати","common.yes":"Так","common.no":"Ні","common.send":"Надіслати","common.sending":"надсилаю…","common.sent":"надіслано","common.close":"Закрити","common.failedSend":"не вдалося надіслати","common.failedDelete":"не вдалося видалити","common.nothingFound":"Нічого не знайдено","common.nothingRunning":"зараз нічого не працює","common.kb":"кБ","common.chars":"{n} симв.","lang.aria":"Мова інтерфейсу","util.effortTitle":"Зусилля міркування: {effort}","runtimeConfig.model":"Модель активного агента","runtimeConfig.effort":"Зусилля міркування активного агента","runtimeConfig.speedTitle":"Fast використовує пріоритетний рівень Codex","runtimeConfig.apply":"Застосувати","runtimeConfig.failed":"Не вдалося змінити конфігурацію активного агента","runtimeConfig.pending":"зміна очікує","runtimeConfig.applied":"Налаштування розмови застосовано","time.agoSec":"{n} с тому","time.agoMin":"{n} хв тому","time.agoHour":"{n} год тому","time.agoDay":"{n} д тому","turn.worked":"Працював {d}","turn.running":"працює {d}","turn.lastRun":"останній прогін: {d}","turn.timer":"час роботи","cardStatus.needsYou":"потребує вас","cardStatus.held":"притримано","cardStatus.running":"працює","cardStatus.queued":"у черзі","cardSwitch.pending":"очікує перемикання","cardSwitch.pendingTo":"\xab{label}\xbb очікує","cardSwitch.switching":"перемикання…","cardSwitch.switchingTo":"→ \xab{label}\xbb","cardSwitch.failed":"збій перемикання","cardSwitch.route":"\xab{from}\xbb → \xab{to}\xbb","kind.session":"сесія","kind.subagent":"субагент","kind.job":"джоба","kind.background":"фон","kind.handoff":"хендофф","rail.title":"Логи агентів","rail.filter":"Фільтр проєктів…","rail.projects":"Проєкти","rail.overview":"Огляд","rail.archive":"Архів","rail.crown":"Коронувати — закріпити зверху","rail.uncrown":"Зняти корону","rail.createProject":"Створити проєкт","rail.newProjectName":"Назва проєкту","rail.newProjectRoot":"Коренева тека (абсолютний шлях)","rail.create":"Створити","rail.creating":"Створення…","rail.invalidName":"Вкажіть назву проєкту","rail.invalidRoot":"Теку не знайдено","rail.missingRoot":"Такої теки ще немає","rail.createRootAndProject":"Створити теку і проєкт","rail.mkdirFailed":"Не вдалося створити теку","rail.duplicateProject":"Такий проєкт уже існує","rail.createFailed":"Не вдалося створити проєкт","dash.branchesLive":{one:"{count} гілка працює",few:"{count} гілки працюють",many:"{count} гілок працюють",other:"{count} гілок працюють"},"dash.trees":{one:"{count} дерево",few:"{count} дерева",many:"{count} дерев",other:"{count} дерев"},"dash.recentConvos":{one:"{count} нещодавня розмова",few:"{count} нещодавні розмови",many:"{count} нещодавніх розмов",other:"{count} нещодавніх розмов"},"dash.quietTrees":{one:"{count} тихе дерево",few:"{count} тихі дерева",many:"{count} тихих дерев",other:"{count} тихих дерев"},"dash.openProjects":"Відкрити список проєктів","dash.createMenu":"Створити","dash.moreMenu":"Більше дій","dash.soundMenu":"Звукові сповіщення","dash.unarchive":"Повернути з архіву","dash.newConvo":"Нова розмова з агентом","dash.agent":"Агент","dash.newWorkflow":"Новий воркфлоу: етапи → ревью → PR","dash.workflow":"Воркфлоу","dash.task":"Задача","dash.newTask":"Нова задача","dash.pipelinesUnavailable":"Пайплайни тимчасово недоступні: файл стану пайплайнів не вдалося прочитати. Решта панелей працює.","dash.loadingBoard":"Завантаження дошки…","dash.emptyTitle":"На схемі поки порожньо","dash.emptyHint":"Відкрий пульт у правому нижньому куті і клікни розмову — вона з'явиться тут","dash.viewScheme":"схема","dash.viewList":"розмови","dash.viewSchemeMenu":"Вигляд: схема","dash.viewListMenu":"Вигляд: розмови","dash.viewMenuGroup":"Вигляд дошки","dash.hiddenShelf":"Приховане","trash.title":"Кореневі розмови","trash.hint":"Клік по рядку відкриває розмову нодою; смітник видаляє її файл з диска назавжди.","trash.deletedFromDisk":"\xb7 видалено з диска","trash.open":"Відкрити {title}","trash.activeSubtree":"має активні гілки","trash.toArchive":"В архів","trash.notDeleted":"не видалено {failed} з {total}","trash.confirmDelete":{one:"Видалити з диска {count} файл проєкту?",few:"Видалити з диска {count} файли проєкту?",many:"Видалити з диска {count} файлів проєкту?",other:"Видалити з диска {count} файлів проєкту?"},"trash.deleting":"видаляю…","trash.confirmYes":"Так, видалити","trash.deleteProject":"Видалити проєкт з диска","trash.projectLoadFailed":"Не вдалося завантажити всі розмови проєкту","list.title":"Усі розмови","list.hint":"Завантажуються сторінками від найновіших з усіх розмов цього проєкту на диску.","list.searchHint":"Пошук у всіх розмовах на диску в усіх проєктах.","list.loadMore":"Завантажити більше розмов","list.failed":"Не вдалося завантажити розмови","list.retry":"Повторити","search.open":"Пошук моїх повідомлень (/)","search.openMobile":"Пошук моїх повідомлень","search.title":"Знайти мої повідомлення","search.aria":"Глобальний пошук повідомлень","search.placeholder":"Шукати серед усього надісланого…","search.mine":"Мої повідомлення","search.everything":"Усе","search.speakerAria":"Обсяг пошуку","search.hint":"Почни вводити, щоб шукати серед усього надісланого — у всіх проєктах, рушіях і акаунтах.","search.keysHint":"↑ ↓ — переміщення \xb7 Enter — відкрити \xb7 Esc — закрити","search.results":"Результати","search.updating":"оновлення…","search.loadMore":"Ще результати","search.none":"Нічого не знайдено за \xab{query}\xbb","search.corpus":"Переглянуто {messages} у {conversations}","search.corpusMessages":{one:"{formatted} повідомлення",few:"{formatted} повідомлення",many:"{formatted} повідомлень",other:"{formatted} повідомлень"},"search.corpusConversations":{one:"{formatted} розмові",few:"{formatted} розмовах",many:"{formatted} розмовах",other:"{formatted} розмовах"},"search.everythingInstead":"Шукати серед усього","search.failed":"Пошук не вдався","search.retry":"Повторити","search.untitled":"(без назви)","search.speaker.you":"ви","search.speaker.agent":"агент","search.close":"Закрити пошук","switch.aria":"Пульт агентів","switch.title":"Пульт","switch.search":"Пошук за назвою, першим промптом або проєктом","switch.results":"Усі знайдені розмови","switch.updating":"оновлення…","switch.close":"Закрити пульт","switch.waiting":"Чекає тебе","switch.working":"Працюють","switch.recent":"Нещодавні","switch.older":"Старіше","switch.hidden":"Приховані ({count})","switch.hide":"сховати","switch.restore":"повернути","accounts.activeAria":"Активний акаунт Codex","accounts.placeholder":"Акаунт Codex","accounts.add":"Додати","accounts.prompt":"Назва акаунта","accounts.login":"вхід","accounts.switchFailed":"Не вдалося змінити акаунт","accounts.conversationTitle":"Запустити цю розмову через","accounts.conversationPending":"Зміна акаунта очікує","accounts.conversationApplied":"Акаунт розмови змінено","accounts.conversationUnconfirmed":"Зміна акаунта без підтвердження — спробуйте ще раз","accounts.manage":"Керувати акаунтами…","accounts.addFailed":"Не вдалося додати акаунт","accounts.loginOpened":"Вхід через пристрій відкрито в {target}","accounts.openLogin":"Відкрити вхід","accounts.refreshFailed":"Не вдалося оновити акаунти. Спробуй ще раз.","accounts.loading":"Завантаження акаунтів…","accounts.noAccounts":"Акаунтів поки немає.","limits.accountLoading":"Завантаження лімітів акаунта…","accounts.retry":"Повторити","accounts.title":"Акаунти Codex","accounts.trigger":"Акаунти","accounts.active":"активний","accounts.needsLogin":"потрібен вхід","accounts.pendingLogin":"вхід…","accounts.auth.authenticated":"Авторизовано","accounts.auth.signedOut":"Вихід виконано","accounts.auth.unknown":"Вхід не перевірено","accounts.auth.error":"Помилка входу","accounts.operation.refresh":"Оновлюємо акаунти…","accounts.operation.add":"Починаємо вхід в акаунт…","accounts.operation.switch":"Змінюємо акаунт для майбутніх запусків…","accounts.operation.login":"Оновлюємо стан входу…","accounts.operation.remove":"Видаляємо акаунт…","accounts.operation.terminal":"Готуємо команду акаунта…","accounts.terminalCopied":"Команду скопійовано для {label}","accounts.terminalFailed":"Не вдалося підготувати команду для {label}","accounts.copyCli":"Копіювати CLI","accounts.copyCliAria":"Скопіювати команду агента для {label}","accounts.labelPlaceholder":"Назва нового акаунта","accounts.confirmAdd":"Додати","accounts.close":"Закрити","accounts.remove":"Видалити","accounts.removeAria":"Видалити {label}","accounts.removeConfirm":"Видалити цей акаунт? Минулі розмови залишаться доступними.","accounts.removeConfirmCta":"Підтвердити","accounts.removeConfirmCancel":"Скасувати","accounts.removeBlocked":"Для {label} ще є активна сесія або вхід.","accounts.removeHistoryBlocked":"{label} має активні розмови. Дочекайтеся їх завершення, а потім видаліть акаунт.","accounts.removeFailed":"Не вдалося видалити цей акаунт.","accounts.cleanupPending":"{label} видалено. Локальні дані ще потрібно очистити.","accounts.cleanupManual":"Частина локальних даних акаунта не пройшла перевірку безпеки. Перевірте й видаліть її вручну.","accounts.cleanupFailed":"Не вдалося очистити покинуті теки.","accounts.forceRemove":"Видалити примусово","accounts.cleanupOrphans":"Очистити покинуті теки","accounts.titleFor":"Акаунти {engine}","accounts.triggerAria":"Акаунти {engine} — змінити або додати","accounts.effective":"{pct}%","accounts.effectiveTip":"{window} обмежує","accounts.effectiveStale":"{window} обмежує \xb7 застаріло","accounts.limitsAria":"Вікна лімітів для {label}","accounts.limitsChecked":"Перевірено","accounts.limitsStale":"Останні відомі значення","accounts.limitsStaleTip":"Останні відомі значення — не наживо","accounts.claudeLoginStarted":"Вхід для {label} розпочато","accounts.claudeLogin.starting":"Починаємо вхід…","accounts.claudeLogin.awaitingBrowser":"Очікуємо посилання для входу…","accounts.claudeLogin.openLink":"Відкрити вхід claude.ai","accounts.claudeLogin.codeLabel":"Код авторизації","accounts.claudeLogin.codePlaceholder":"Встав код із браузера","accounts.claudeLogin.codeHint":"Після входу скопіюй код зі сторінки claude.ai і встав його сюди.","accounts.claudeLogin.submit":"Надіслати код","accounts.claudeLogin.verifying":"Перевіряємо…","accounts.claudeLogin.canceling":"Скасовуємо…","accounts.claudeLogin.cancel":"Скасувати","accounts.claudeLogin.signIn":"Увійти","accounts.claudeLogin.groupAria":"Вхід для {label}","accounts.claudeLogin.err.timed_out":"Час на вхід вичерпано.","accounts.claudeLogin.err.interrupted":"Вхід перервано перезапуском.","accounts.claudeLogin.err.verification_failed":"Не вдалося перевірити код.","accounts.claudeLogin.err.input_failed":"Не вдалося надіслати код.","accounts.claudeLogin.err.login_busy":"Інший вхід уже триває.","accounts.claudeLogin.err.generic":"Не вдалося почати вхід. Спробуй ще раз.","accounts.claudeLogin.announceCodeReady":"Посилання для входу {label} готове. Відкрий його і встав код.","accounts.claudeLogin.announceDone":"{label}: вхід виконано.","migrate.confirmTitle":"Перемкнути {engine} на \xab{label}\xbb?","migrate.confirmBody":"Нові агенти одразу використовують \xab{label}\xbb. {idle} активних сесій перемкнуться зараз; {busy} — після поточного ходу; {deferred} неактивних розмов — під час наступного повідомлення.","migrate.confirmCta":"Перемкнути акаунт","migrate.confirmAllCta":"Мігрувати всі ({total})","migrate.confirmCancel":"Скасувати","migrate.retargetTitle":"Перенаправити міграцію на \xab{label}\xbb?","migrate.retargetBody":"Міграція на \xab{current}\xbb ще триває. Нові агенти одразу використовуватимуть \xab{label}\xbb; активні сесії буде перенаправлено, неактивні розмови перейдуть під час наступного повідомлення. \xabМігрувати всі\xbb одразу охопить відкладену історію та вже перенесені розмови.","migrate.banner":"Міграція на \xab{label}\xbb — {done}/{total} готово","migrate.bannerWaiting":"{n} чекають завершення ходу","migrate.bannerFailed":"{n} з помилкою","migrate.bannerAria":"Хід міграції {engine}","migrate.stop":"Зупинити міграцію","migrate.bannerRetryFailed":"Повторити невдалі ({n})","migrate.stoppedNotice":"Міграцію зупинено. Решта сесій лишається на своєму акаунті; нові агенти й далі використовують \xab{label}\xbb.","migrate.failedNotice":"{n} сесій не вдалося перенести на \xab{label}\xbb.","migrate.completeNotice":"Усі сесії {engine} тепер на \xab{label}\xbb","migrate.announceComplete":"Усі сесії {engine} тепер на {label}","migrate.cardPending":"Очікує зміни акаунта — після поточного ходу","migrate.cardSwitching":"Перемикання на \xab{label}\xbb…","migrate.cardSwitchingUnnamed":"Змінюємо акаунт…","migrate.cardFailed":"Не вдалося змінити акаунт","migrate.cardRetry":"Повторити","migrate.cardKeep":"Лишити на \xab{label}\xbb","migrate.ribbonAria":"Стан міграції акаунта","migrate.divider":"Продовжено з \xab{label}\xbb — попередній запис в архіві","migrate.openPrevious":"Відкрити попередній запис","migrate.heldSend":"Повідомлення утримано — надійде після перемикання","migrate.readOnlyPredecessor":"В архіві — розмову продовжено під \xab{label}\xbb","migrate.retryFailed":"Не вдалося повторити перемикання","migrate.keepFailed":"Не вдалося лишити цю сесію на поточному акаунті","migrate.recoveryFailed":"{detail}","autobalance.title":"Автобаланс","autobalance.desc":"Перемикає сесії цього рушія, коли активний акаунт падає нижче {threshold}%, а інший має більше.","autobalance.toggleAria":"Автобаланс для {engine}","autobalance.idle":"Остання перевірка {time} \xb7 перемикання не потрібне","autobalance.waitingFresh":"Пауза — очікуємо свіжі дані квоти","autobalance.cooldown":"Пауза після перемикання — наступна перевірка за {n} хв","autobalance.draining":"Балансування…","autobalance.switched":"Перемкнуто на \xab{to}\xbb о {time} — \xab{from}\xbb впав до {pct}% ({window})","autobalance.bannerTag":"Авто","autobalance.override":"Автобаланс пропонував \xab{to}\xbb; ваш вибір має пріоритет.","limits.windowSession":"вікно 5 год","limits.windowWeekly":"тижневе вікно","switchCard.openColumn":"Відкрити колонкою {title}","switchCard.remove":"Прибрати з пульта","composer.imagesCount":{one:"{count} картинка",few:"{count} картинки",many:"{count} картинок",other:"{count} картинок"},"composer.spawned":"запущено агента в tmux {target}","composer.sentPaths":"надіслано {count} шлях(и)","composer.failedInterrupt":"не вдалося перервати","composer.escapeSent":"надіслано Escape — агент перервано","composer.escapeSentWaiting":"надіслано Escape — чекаємо, поки агент зупиниться","composer.spawnAria":"Запустити агента з промптом","composer.resolvingAria":"Повідомлення наявному агенту — доставка почнеться після відновлення його хоста","composer.sendAria":"Надіслати повідомлення агенту в tmux {target}","composer.sendStructuredAria":"Надіслати повідомлення через структурований runtime-хост","composer.queueAria":"Черга надісланих повідомлень","composer.removeFromQueue":"Прибрати з черги","composer.deliveryHeld":"Притримано для \xab{label}\xbb — доставиться після зміни акаунта","composer.deliveryHeldUnnamed":"Притримано — доставиться після зміни акаунта","composer.deliveryHeldWaiting":"Притримано — очікує доставки","composer.admissionTimedOut":"Час очікування підтвердження вичерпано. Перевіряємо надійну квитанцію; повідомлення збережено.","composer.deliveryUnconfirmed":"Не вдалося підтвердити доставку. Повідомлення збережено — надішліть ще раз, щоб безпечно повторити; той самий ключ повідомлення буде використано.","composer.runtimePill":"Модель і міркування — застосується до наступного повідомлення","composer.reasoningGroup":"Міркування","composer.modelGroup":"Модель","composer.speedGroup":"Швидкість","composer.speedStandard":"Стандартна","composer.speedFastTier":"Швидка — пріоритетний тариф","composer.backTo":"Назад","composer.nextMessageUses":"Наступне повідомлення: {model} \xb7 {effort}","composer.settingsNextResume":"застосується під час наступного відновлення розмови","composer.structuredImagesUnavailable":"Структуровані розмови поки не підтримують картинки","composer.codexImagesTextOnly":"Обрана модель Codex приймає лише текст.","composer.structuredImagesProtocol":"Цей структурований хост не узгодив підтримку зображень.","composer.imagesBlockedDuringRecovery":"Зображення з чернетки буде надіслано після відновлення хоста; текст можна надіслати вже зараз.","composer.imageCapabilityLoading":"Завантажуємо дані про підтримку зображень.","composer.imageCapabilityError":"Не вдалося завантажити дані про підтримку зображень.","composer.imageCapabilityRetry":"Повторити перевірку зображень","composer.attachTerminal":"Відкрити термінал для перегляду","composer.attachTerminalReady":"термінал для перегляду готовий у tmux {target}","composer.attachTerminalFailed":"не вдалося створити термінал для перегляду","composer.receiptHeld":"притримано","composer.receiptQueued":"у черзі","composer.receiptRecovering":"відновлення","composer.receiptFailed":"не доставлено","composer.deliveredEcho":"Доставлено — зʼявиться у стрічці","composer.retrySend":"Надіслати ще раз","composer.placeholderRelay":"написати — передам через кореневу сесію…","composer.placeholderSpawn":"промпт — агент запуститься…","composer.placeholderResolving":"написати агенту — відновлюємо з'єднання з сесією…","composer.placeholderSend":"написати агенту…","composer.textAria":"Текст для агента","composer.optionsShow":"Показати параметри повідомлення","composer.optionsHide":"Сховати параметри повідомлення","composer.titleRelay":"передасться через кореневу сесію гілки","composer.titleSpawnResumed":"запустить новий сеанс агента, який продовжить цю розмову","composer.root":"корінь","composer.interruptAria":"Перервати агента (Escape)","composer.interruptTitle":"надіслати Escape у пейн агента","composer.compactAria":"Стиснути контекст агента (/compact)","composer.compactTitle":"надіслати /compact — агент стисне контекст; після завершення у стрічці з'явиться позначка","composer.compactConfirm":"Точно?","composer.compactConfirmTitle":"Натисни ще раз, щоб надіслати /compact","composer.compactSent":"стискання почалось — позначка з'явиться у стрічці, щойно завершиться","composer.failedCompact":"не вдалося запустити стискання","composer.addImages":"Додати картинки","composer.moreTools":"Додаткові дії","composer.stopAndSend":"Зупинити запис і надіслати","composer.launchAgent":"Запустити агента","composer.sendToAgent":"Надіслати агенту","composer.stopAndSendTitle":"зупинити запис і надіслати","composer.sendMenuTitle":"Дії відправки","composer.quickAck":"Так, продовжуй","composer.quickAckLabel":"Продовжити","composer.quickAckAria":"Надіслати агенту швидке \xabТак, продовжуй\xbb","composer.quickAckTitle":"Швидка відповідь — так, продовжуй","spawnCard.starting":"Запуск прийнято. Агент запускається.","spawnCard.binding":"Ідентифікатор агента створено. Під’єднуємо структурований хост.","spawnCard.queued":"Структурований хост готовий. Перше повідомлення в черзі.","spawnCard.reconciling":"Доставка узгоджується зі структурованим хостом.","spawnCard.recoverable-timeout":"Тайм-аут першого повідомлення можна відновити, поки збережена доставка завершується.","spawnCard.live-late-success":"Пізня доставка успішна, активну розмову приєднано.","spawnCard.failed":"Запуск завершився з помилкою.","spawnCard.recovered":"Запуск відновлено за збереженими даними.","spawnCard.initial.pending":"Перше повідомлення: очікує на під’єднання хоста","spawnCard.initial.queued":"Перше повідомлення: у черзі","spawnCard.initial.delivered":"Перше повідомлення: доставлено","spawnCard.initial.failed":"Перше повідомлення: помилка доставки","spawnCard.retrySafe":"Цей запуск завершено. Можна створити нову спробу.","spawnCard.pinUnavailableFallback":"Запущено на іншому акаунті — pin недоступний","spawnCard.pinUnavailableQueued":"Квоту закріпленого акаунта вичерпано — запуск у черзі до {retryAt}","spawnCard.launch":"Запуск {id}","spawnChip.starting":"Запускається","spawnChip.binding":"Під’єднання хоста","spawnChip.queued":"Хост готовий","spawnChip.reconciling":"Узгодження","spawnChip.recoverable-timeout":"Завершується","spawnChip.live-late-success":"Пізня доставка успішна","spawnChip.failed":"Запуск не вдався","spawnChip.recovered":"Запущено","spawnChip.initial.pending":"Перше повідомлення: очікує","spawnChip.initial.queued":"Перше повідомлення: у черзі","spawnChip.initial.delivered":"Перше повідомлення: доставлено","spawnChip.initial.failed":"Перше повідомлення: помилка","outbox.queueAria":"Повідомлення, що очікують доставки","outbox.queued":"У черзі","outbox.delivering":"Доставляється","outbox.heldForSwitch":"Притримано для \xab{label}\xbb — доставиться після перемикання","outbox.heldForSwitchUnnamed":"Притримано — доставиться після зміни акаунта","outbox.delivered":"Доставлено","outbox.failed":"Не доставлено","outbox.cancel":"Скасувати це повідомлення","outbox.retry":"Повторити надсилання цього повідомлення","outbox.reattach":"Не надіслано — додайте зображення знову та надішліть","strip.live":"наживо","strip.resume":"відновити","strip.deadMode":"мертвий хост","strip.moreActions":"Більше дій","strip.stopSubagent":"перериває кореневого агента","strip.compactSubagent":"недоступно для субагентів","strip.structuredUnsupported":"структурований хост поки не підтримує цю дію","strip.compactEngineUnsupported":"цей двигун не має команди стиснення","strip.compactBusyTurn":"недоступно, поки триває хід","strip.resolving":"визначаємо середовище агента…","deadHost.title":"Агент неактивний \xb7 {since} — повідомлення підуть у чергу","deadHost.body":"Текст, надісланий зараз, надійно зберігається і буде доставлений після відновлення хоста. Зображення не можна додати, доки хост не повернеться. Очікувані підтвердження застаріли — відновіть роботу елементами керування нижче.","deadHost.respawn":"Відновити розмову","deadHost.attach":"Відкрити в терміналі","deadHost.recheck":"Перевірити знову","deadHost.recheckFailed":"Не вдалося зʼєднатися зі середовищем — спробуйте ще раз.","strip.recheckHint":"Перевірити хост середовища ще раз","deadHost.respawnFailed":"Не вдалося перезапустити — спробуйте ще раз.","deadHost.sendBlocked":"хост мертвий — відновіть, щоб продовжити","deadHost.expiredCard":"застаріло — хост помер, перш ніж на це відповіли","superseded.title":"Раунд замінено \xb7 {since}","superseded.body":"Відновлення замінило цей раунд живим наступником. Ця розмова лишається як історія раундів.","superseded.open":"Відкрити живий раунд","superseded.resumeHere":"Продовжити тут","superseded.resumeConfirm":"Продовжити цей закритий раунд? Це розгалужить роботу: картка знову стане живою поруч із наступником.","superseded.resumeFailed":"Не вдалося зняти звʼязок заміни — спробуйте ще раз.","superseded.sendBlocked":"раунд замінено — відкрийте живий наступник","lineage.continues":"раунд {round} \xb7 продовжує попередній","lineage.continuesTitle":"Раунд {round}: продовжує замінений попередній раунд — натисніть, щоб відкрити його","attach.dialogTitle":"Підключитися у своєму терміналі","attach.dialogIntro":"Запускає цю розмову у вашому власному терміналі з тим самим акаунтом ({account}) і робочою директорією.","attach.copyCwd":"Скопіювати робочу директорію","attach.copyCommand":"Скопіювати команду","attach.copyFull":"Скопіювати повну команду","attach.copiedFull":"Повну команду скопійовано в буфер","attach.takeoverWarning":"Відновлення тут перебирає розмову у переглядача.","attach.subagentNote":"Субагенти відновлюються через свою кореневу сесію.","attach.secondaryViewer":"Відкрити панель перегляду лише для читання в tmux","attach.secondaryFailed":"Не вдалося відкрити панель перегляду — спробуйте ще раз.","receipt.human.deadHost":"хост агента помер","receipt.human.staleKey":"ключ доставки застарів","receipt.human.duplicate":"вже доставлено","receipt.human.turnActive":"агент посеред ходу","receipt.human.noTurn":"немає активного ходу","receipt.human.unsupportedCapability":"цей двигун не має такої команди","receipt.human.verbatim":"не доставлено: {reason}","draft.readPrompt":"Прочитай розмову агента у файлі {src} і продовж роботу звідти: ","draft.needDir":"вкажи робочу директорію","draft.launchFailed":"не вдалося запустити","draft.paneAria":"Чернетка нової розмови з агентом","draft.notStarted":"агент ще не запущений","draft.engineAria":"Двигун агента","draft.accountAria":"Обліковий запис {engine} для цього запуску","draft.accountDefault":"{label} \xb7 активний","draft.accountNeedsLogin":"{label} \xb7 потрібен вхід","draft.handoffLabel":"хендофф: {title}","draft.newConvo":"нова розмова","draft.conversation":"розмова","draft.dismiss":"Прибрати чернетку розмови","draft.directory":"директорія","draft.dirAria":"Робоча директорія агента","dirPicker.empty":"директорію не вибрано","dirPicker.searchAria":"Відфільтруй відомі директорії або впиши шлях","dirPicker.searchPlaceholder":"фільтр або власний шлях","dirPicker.listAria":"Відомі робочі директорії","dirPicker.current":"поточна","dirPicker.useTyped":"взяти цей шлях","dirPicker.noMatch":"нічого не збігається — впиши шлях, щоб узяти власний","dirPicker.noneKnown":"відомих директорій ще немає — впиши шлях","dirPicker.count":"{shown} з {total} директорій","draft.reasoning":"міркування","draft.role":"роль","draft.roleAria":"Рольовий пресет агента","draft.noRole":"Без ролі","draft.roleParameters":"Параметри ролі","draft.safetyFences":"Запобіжники безпеки","draft.roleNeedsParams":"заповніть обов'язкові параметри ролі","draft.reviews":"розмова для ревʼю","draft.reviewsAria":"Розмова для ревʼю","draft.reviewsPlaceholder":"Оберіть розмову","draft.reviewerNeedsConversation":"оберіть розмову, яку перевірятиме ревʼюер","draft.deployConfirm":"Введіть deploy, щоб підтвердити цей план деплою","draft.modelAria":"Модель агента","draft.modelDefault":"модель: типова","draft.reasoningAria":"Глибина міркувань агента","draft.effortDefault":"міркування: типові","draft.speedAria":"Режим швидкості Codex","draft.speedTitle":"fast = priority tier (1.5x швидкість, більша витрата лімітів)","draft.speedDefault":"швидкість: дефолт","draft.imagesOnly":"(картинки)","draft.launched":"агент запущений у tmux {target} — чекаю, поки розмова з'явиться тут…","draft.launchedStructured":"агент запущений — чекаю, поки розмова з'явиться тут…","draft.slow":"Щось довго. Перевір вікно tmux {target} — щойно транскрипт з'явиться, панель підхопить його сама.","draft.slowStructured":"Щось довго. Щойно транскрипт з'явиться, панель підхопить його сама.","draft.confirming":"Запущено — підтверджую агента в tmux {target}. Не надсилай ще раз; панель підхопить розмову, щойно з'явиться її транскрипт.","draft.confirmingStructured":"Запущено — підтверджую агента. Не надсилай ще раз; панель підхопить розмову, щойно з'явиться її транскрипт.","draft.confirmingNoTarget":"Підтверджую, чи запустився агент. Не надсилай ще раз — панель підхопить розмову, щойно з'явиться її транскрипт.","draft.confirmingSlow":"Запускається повільно — запуск підтверджено в tmux {target}. Панель стежить далі й підхопить розмову сама; не запускай ще раз.","draft.confirmingSlowStructured":"Запускається повільно — запуск підтверджено. Панель стежить далі й підхопить розмову сама; не запускай ще раз.","draft.attention":"Агент, можливо, вже працює в tmux {target}. Не запускай його ще раз. Прибери цю чернетку, коли перевіриш; вона все одно підхопиться автоматично, щойно з'явиться транскрипт.","draft.attentionStructured":"Агент, можливо, вже працює. Не запускай його ще раз. Прибери цю чернетку, коли перевіриш; вона все одно підхопиться автоматично, щойно з'явиться транскрипт.","draft.attentionNoTarget":"Агент, можливо, вже працює — перевір свої вікна tmux. Не запускай його ще раз. Прибери цю чернетку, коли перевіриш; вона все одно підхопиться автоматично, щойно з'явиться транскрипт.","draft.hintRelay":"Новий агент спершу прочитає транскрипт батьківської розмови і продовжить з того місця. Допиши в промпт, що зробити далі, — гілка з'явиться на схемі поруч.","draft.hintNew":"Обери двигун і директорію, напиши перший промпт — агент запуститься в tmux, і розмова продовжиться в цій самій панелі.","draft.hintNewStructured":"Обери двигун і директорію, напиши перший промпт — агент запуститься, і розмова продовжиться в цій самій панелі.","draft.promptAria":"Перший промпт для нового агента","draft.placeholder":"перший промпт — агент запуститься в tmux…","draft.placeholderStructured":"перший промпт — агент запуститься…","draft.promptTextAria":"Текст першого промпта","draft.newWindowTitle":"нове tmux-вікно зі свіжим агентом","draft.newWindowTitleStructured":"нова структурована сесія зі свіжим агентом","draft.newAgent":"новий агент","draft.addImages":"Додати картинки до промпта","draft.stopAndLaunch":"Зупинити запис і запустити агента","draft.rolePromptToggle":"Промпт ролі (EN)","draft.speedFast":"швидкий","draft.speedStandard":"стандартний","effortTier.minimal":"мінімальні","effortTier.low":"низькі","effortTier.medium":"середні","effortTier.high":"високі","effortTier.xhigh":"дуже високі","effortTier.max":"максимальні","effortTier.ultra":"ультра","reasoningTier.minimal":"Мінімальні","reasoningTier.low":"Легкі","reasoningTier.medium":"Середні","reasoningTier.high":"Високі","reasoningTier.xhigh":"Дуже високі","reasoningTier.max":"Максимальні","reasoningTier.ultra":"Ультра","roleCopy.orchestrator.name":"Оркестратор","roleCopy.orchestrator.description":"Координує нових агентів через панель керування Viewer.","roleCopy.orchestrator.param.mode.label":"Режим","roleCopy.orchestrator.param.mode.description":"Режим роботи координаційного запуску.","roleCopy.orchestrator.param.mode.option.standard":"стандартний","roleCopy.orchestrator.param.mode.option.plan-tickets":"план у тікети","roleCopy.orchestrator.param.mode.option.wayfind":"розвідка","roleCopy.orchestrator.param.mode.option.backlog-campaign":"кампанія по беклогу","roleCopy.orchestrator.param.repo.label":"Репозиторій","roleCopy.orchestrator.param.repo.description":"Репозиторій для кампанії по беклогу.","roleCopy.orchestrator.param.issueQuery.label":"Запит задач","roleCopy.orchestrator.param.issueQuery.description":"GitHub-запит задач для кампанії по беклогу.","roleCopy.orchestrator.param.urgent.label":"Термінові","roleCopy.orchestrator.param.urgent.description":"Список термінових задач через кому.","roleCopy.orchestrator.param.maxWorkers.label":"Максимум воркерів","roleCopy.orchestrator.param.maxWorkers.description":"Ліміт воркерів для кампанії по беклогу.","roleCopy.orchestrator.param.mergePolicy.label":"Політика злиття","roleCopy.orchestrator.param.mergePolicy.description":"Спосіб доставлення для кампанії по беклогу.","roleCopy.orchestrator.param.mergePolicy.option.pr":"пул-реквест","roleCopy.orchestrator.param.mergePolicy.option.merge":"мердж","roleCopy.orchestrator.param.completionPolicy.label":"Політика завершення","roleCopy.orchestrator.param.completionPolicy.description":"Умова завершення кампанії по беклогу.","roleCopy.orchestrator.param.completionPolicy.option.pr-opened":"відкрито PR","roleCopy.orchestrator.param.completionPolicy.option.merged":"змерджено","roleCopy.orchestrator.param.completionPolicy.option.released":"зарелізено","roleCopy.reviewer.name":"Рев'юер","roleCopy.reviewer.description":"Перевіряє диф коду й повертає знахідки з доказами, впорядковані за серйозністю.","roleCopy.reviewer.param.diffSource.label":"Джерело дифу","roleCopy.reviewer.param.diffSource.description":"Диф або пул-реквест для перевірки.","roleCopy.reviewer.param.lens.label":"Лінза","roleCopy.reviewer.param.lens.description":"Фокус рев'ю.","roleCopy.reviewer.param.lens.option.correctness":"коректність","roleCopy.reviewer.param.lens.option.over-engineering":"надлишкова інженерія","roleCopy.reviewer.param.lens.option.silent-failure":"тихі збої","roleCopy.reviewer.param.lens.option.test-coverage":"покриття тестами","roleCopy.reviewer.param.lens.option.scope":"межі задачі","roleCopy.reviewer.param.lens.option.prod-ops":"прод-експлуатація","roleCopy.reviewer.param.lens.option.standards+spec":"стандарти + спека","roleCopy.reviewer.param.lens.option.code-smells":"код-смелли","roleCopy.reviewer.param.lens.option.all":"усі лінзи","roleCopy.reviewer.param.mode.label":"Режим","roleCopy.reviewer.param.mode.description":"Контекст рев'юера.","roleCopy.reviewer.param.mode.option.fresh":"свіжий контекст","roleCopy.reviewer.param.parallelN.label":"Паралельні проходи","roleCopy.reviewer.param.parallelN.description":"Кількість незалежних проходів рев'ю.","roleCopy.verifier.name":"Верифікатор","roleCopy.verifier.description":"Перевіряє гіпотези й повертає вердикт із доказами по кожному твердженню.","roleCopy.verifier.param.claims.label":"Твердження","roleCopy.verifier.param.claims.description":"Гіпотези, які треба підтвердити або спростувати.","roleCopy.builder.name":"Білдер","roleCopy.builder.description":"Пише продуктовий код за окресленою задачею.","roleCopy.builder.param.mode.label":"Режим","roleCopy.builder.param.mode.description":"Дисципліна імплементації.","roleCopy.builder.param.mode.option.plain":"звичайний","roleCopy.builder.param.mode.option.apply-fixes":"застосувати фікси","roleCopy.builder.param.mode.option.tdd":"TDD","roleCopy.builder.param.mode.option.diagnose":"діагностика","roleCopy.builder.param.mode.option.prototype":"прототип","roleCopy.builder.param.mode.option.merge-resolve":"розв'язати конфлікти","roleCopy.builder.param.domain.label":"Домен","roleCopy.builder.param.domain.description":"Продуктовий домен імплементації.","roleCopy.builder.param.domain.option.general":"загальний","roleCopy.builder.param.domain.option.frontend":"фронтенд","roleCopy.architect.name":"Архітектор","roleCopy.architect.description":"Готує обґрунтований доказами дизайн без правок продукту.","roleCopy.architect.param.mode.label":"Режим","roleCopy.architect.param.mode.description":"Формат архітектурного результату.","roleCopy.architect.param.mode.option.design":"дизайн","roleCopy.architect.param.mode.option.spec":"спека","roleCopy.architect.param.mode.option.architecture-audit":"аудит архітектури","roleCopy.cleaner.name":"Клінер","roleCopy.cleaner.description":"Безпечно відновлює брудний чекаут за контрактом із бекапами.","roleCopy.prod-auditor.name":"Прод-аудитор","roleCopy.prod-auditor.description":"Проводить розслідування на проді лише в режимі читання, з доказами.","roleCopy.prod-auditor.param.questions.label":"Питання","roleCopy.prod-auditor.param.questions.description":"Питання щодо проду для розслідування.","roleCopy.deployer.name":"Деплоєр","roleCopy.deployer.description":"Планує blue/green-деплой і зупиняється для підтвердження перед змінами.","roleCopy.deployer.param.sha.label":"SHA мерджу","roleCopy.deployer.param.sha.description":"SHA змердженого коміту для деплою.","roleCopy.deployer.param.pr.label":"Пул-реквест","roleCopy.deployer.param.pr.description":"Необов'язкове посилання на пул-реквест.","link.handoffContext":"Тобі передали контекст іншого агента — розмову \xab{title}\xbb. Її транскрипт: {path} — спочатку прочитай цей файл, щоб мати повний контекст, а тоді виконай прохання нижче.\n\n{ask}","link.dropped":"контекст у промпті \xab{title}\xbb — допиши прохання і надішли","handoff.aria":"Перекинути розмову новому агентові — чернетка з'явиться нижче","handoff.title":"клік — чернетка нового агента з цим контекстом \xb7 потягни — звʼязати з наявним","handoff.label":"перекинути агенту","qr.showAria":"Показати QR для входу з телефона","qr.failed":"не вдалося отримати посилання","qr.startHint":"Запустіть viewer з доступом через Tailscale: ","qr.alt":"QR код для входу з телефона","qr.generating":"генерую QR…","qr.linkAria":"Посилання для входу з телефона","qr.copy":"Копіювати посилання","qr.scanHint":"скануй з телефона в тому ж tailnet","telegram.title":"Telegram","telegram.rowAria":"Підключення Telegram","telegram.close":"Закрити","telegram.readOnlyNote":"Лише читання \xb7 тільки сесії оператора","telegram.status.disconnected":"Не підключено","telegram.status.starting":"Запуск…","telegram.status.awaiting_scan":"Скануйте QR-код","telegram.status.awaiting_password":"Потрібен пароль","telegram.status.verifying":"Перевірка…","telegram.status.connected":"Підключено","telegram.status.expired":"Сесія завершилась","telegram.status.error":"Помилка","telegram.connect":"Підключити Telegram","telegram.connectHint":"Увійдіть, скануючи QR-код у застосунку Telegram. Viewer зберігає сесію лише на цій машині.","telegram.credentialsHint":"API-креденшали Telegram ще не налаштовані. Введіть api_id та api_hash з my.telegram.org — вони залишаться на цій машині.","telegram.credentialsIdLabel":"API ID","telegram.credentialsHashLabel":"API hash","telegram.credentialsSave":"Зберегти креденшали","telegram.credentialsSource":"Зберігається у власному конфігу Viewer (telegram.json, доступ лише власнику). Змінні середовища, якщо задані, мають пріоритет.","telegram.credentialsInvalid":"Це не схоже на коректну пару api_id + api_hash. Нічого не збережено.","telegram.reconnect":"Перепідключити","telegram.retry":"Повторити","telegram.cancel":"Скасувати","telegram.qrAlt":"QR-код входу в Telegram","telegram.qrGenerating":"генерую QR…","telegram.qrFailed":"Не вдалося згенерувати QR-код.","telegram.qrRetry":"Спробувати QR ще раз","telegram.qrHint":"У Telegram на телефоні: Налаштування → Пристрої → Підключити пристрій, потім скануйте. Прострочений код оновлюється автоматично.","telegram.passwordLabel":"Пароль двоетапної перевірки","telegram.passwordPlaceholder":"Пароль 2FA Telegram","telegram.passwordSubmit":"Надіслати","telegram.passwordInvalid":"Невірний пароль. Спробуйте ще раз.","telegram.passwordHint":"Telegram запитує пароль двоетапної перевірки. Він передається лише в Telegram.","telegram.connectedAs":"Підключено як","telegram.lastCheck":"Перевірено {time}","telegram.expiredHint":"Telegram завершив цю сесію. Перепідключіться, щоб продовжити.","telegram.logout":"Вийти","telegram.logoutConfirm":"Вийти з Telegram і видалити локальну сесію?","telegram.deleteLocal":"Видалити локальну сесію","telegram.deleteLocalConfirm":"Видалити локальну сесію? Віддалена авторизація Telegram може залишитись — видаліть її в Telegram → Пристрої.","telegram.confirmCta":"Підтвердити","telegram.confirmCancel":"Скасувати","telegram.actionFailed":"Не вдалося виконати дію. Спробуйте ще раз; якщо повторюється — закрийте й відкрийте панель.","telegram.actionUnreachable":"Сервер Viewer не відповів. Перевірте з'єднання і спробуйте ще раз.","telegram.err.login_busy":"Інший вхід у Telegram уже триває.","telegram.err.credentials_missing":"API-облікові дані Telegram не налаштовані на цьому хості.","telegram.err.start_failed":"Не вдалося почати вхід.","telegram.err.bridge_failed":"Вхід завершився несподівано.","telegram.err.password_invalid":"Невірний пароль.","telegram.err.network_failed":"Помилка мережі. Спробуйте ще раз.","telegram.err.timed_out":"Час входу вичерпано.","telegram.err.canceled":"Вхід скасовано.","telegram.err.session_unsafe":"Локальне сховище сесії не пройшло перевірку безпеки.","telegram.err.connector_failed":"Не вдалося запустити конектор Telegram.","telegram.err.host_registration_failed":"Не вдалося зареєструвати Telegram у локальних хостах агентів.","telegram.err.not_read_only":"Відмовлено: конектор оголосив інструменти, що не є лише для читання.","telegram.err.logout_failed":"Віддалений вихід не вдався. Можна видалити локальну сесію.","telegram.err.health_failed":"Не вдалося перевірити підключення.","telegram.announceScan":"QR-код Telegram готовий. Скануйте з телефона.","telegram.announcePassword":"Telegram запитує пароль двоетапної перевірки.","telegram.announceConnected":"Telegram підключено.","telegram.report.title":"Щоденний звіт","telegram.report.loading":"Завантаження…","telegram.report.disabledHint":"Раз на день агент читає ваші особисті діалоги та вибрані групи й пише один звіт, який ви читаєте тут.","telegram.report.enable":"Увімкнути щоденний звіт","telegram.report.disable":"Вимкнути","telegram.report.at":"О","telegram.report.zone":"за Києвом","telegram.report.sourcesSummary":{one:"Джерела: активні особисті діалоги + {count} група",few:"Джерела: активні особисті діалоги + {count} групи",many:"Джерела: активні особисті діалоги + {count} груп",other:"Джерела: активні особисті діалоги + {count} груп"},"telegram.report.sourcesEdit":"Групи","telegram.report.sourcesDone":"Готово","telegram.report.sourcesHint":"Особисті діалоги добираються автоматично за свіжою активністю. Оберіть групи: легкий прохід читає лише те, що стосується вас, повний — усю групу.","telegram.report.loadGroups":"Завантажити мої групи","telegram.report.noGroups":"Групи ще не завантажені.","telegram.report.modeLight":"Легкий","telegram.report.modeFull":"Повний","telegram.report.runNow":"Запустити зараз","telegram.report.running":"Виконується…","telegram.report.nextRun":"Далі {time}, {date}","telegram.report.noRuns":"Запусків ще не було.","telegram.report.open":"Відкрити","telegram.report.openRun":"Запуск","telegram.report.openRunTitle":"Відкрити цей запуск на дошці","telegram.report.promptTitle":"Промпт звіту","telegram.report.promptHint":"Ваше завдання для агента звіту: мова, рядок з тегом, розділи, для якого репозиторію пропонувати issues, тон. Редагуйте тут — без релізу.","telegram.report.promptPreamble":"Viewer завжди додає перед вашим текстом вікно, вибрані джерела, шлях виводу та правила послідовного читання. Підключений акаунт він перевіряє сам, перед запуском.","telegram.report.promptEdit":"Промпт","telegram.report.promptSave":"Зберегти промпт","telegram.report.promptReset":"Повернути типовий","telegram.report.promptDefault":"Промпт: типовий шаблон","telegram.report.promptEdited":"Промпт: змінений вами","telegram.report.back":"Назад","telegram.report.status.running":"виконується","telegram.report.status.ok":"звіт","telegram.report.status.quiet":"тиша","telegram.report.status.failed":"збій","telegram.report.status.account-mismatch":"інший акаунт","telegram.report.err.account_mismatch":"Підключений акаунт не той, для якого налаштовано звіт. Нічого не прочитано.","telegram.report.err.not_connected":"Telegram не підключено, тому запуск не відбувся.","telegram.report.err.reports_disabled":"Щоденні звіти вимкнено.","telegram.report.err.run_in_progress":"Запуск звіту вже триває.","telegram.report.err.account_check_failed":"Не вдалося перевірити підключений акаунт, тому нічого не читалося.","telegram.report.err.sources_failed":"Не вдалося отримати список чатів. Можливо, конектор перезапускається.","telegram.report.err.launch_failed":"Не вдалося запустити звіт.","telegram.report.err.run_ended_without_report":"Запуск завершився, не написавши звіт. Спробуйте ще раз.","telegram.report.err.timed_out":"Запуск тривав надто довго й був зупинений.","telegram.report.err.invalid_report":"Запуск записав те, що Viewer не зміг прочитати як звіт.","telegram.report.err.report_missing":"Цей звіт більше не зберігається.","telegram.report.err.transport":"Сервер Viewer не відповів. Спробуйте ще раз.","telegram.report.err.generic":"Не вдалося. Спробуйте ще раз.","push.enabled":"Push-сповіщення увімкнено","push.enable":"Увімкнути push-сповіщення","push.disable":"Вимкнути push-сповіщення","push.needsHttps":"Push потребує HTTPS","sound.on":"Звукові сповіщення увімкнено","sound.off":"Звукові сповіщення вимкнено","sound.mute":"Вимкнути звукові сповіщення","sound.unmute":"Увімкнути звукові сповіщення","sound.settings":"Рівні звуку","sound.cueVolume":"Звукові сигнали","sound.ambientViewer":"Фонова музика у переглядачі","sound.ambient":"Фонова музика під час дзвінка","sound.ambientVolume":"Рівень музики","sound.ambientHint":"Тихо звучить на цьому рівні й стишується під мову під час дзвінка. Якщо ввімкнено обидва, той самий трек продовжує грати через дзвінок.","keepAwake.label":"Не гасити екран","keepAwake.enableAria":"Не давати екрану гаснути на цьому пристрої","keepAwake.disableAria":"Дозволити екрану гаснути на цьому пристрої","keepAwake.off":"Екран гасне за звичайним таймером цього пристрою.","keepAwake.requesting":"Запитую браузер…","keepAwake.active":"Екран не гасне, поки ця вкладка видима. Витрачає більше заряду.","keepAwake.waiting":"Пауза, поки вкладка прихована. Відновиться, коли ви повернетесь.","keepAwake.interrupted":"Система зняла блокування. Вимкніть і ввімкніть, щоб запитати знову.","keepAwake.blocked":"Браузер відмовив у запиті. Екран не втримується.","keepAwake.failed":"Запит не вдався. Екран не втримується.","keepAwake.insecure":"Потрібна адреса HTTPS. Через звичайний HTTP екран втримати не можна.","keepAwake.unsupported":"Цей браузер не має блокування вимкнення екрана.","mic.stopRecognize":"Зупинити запис і розпізнати","mic.cancel":"Скасувати запис","mic.recognizing":"Розпізнаю…","mic.dictate":"Надиктувати","mic.dictateHint":"надиктувати (до 10 хв) \xb7 правий клік: спосіб розпізнавання","mic.timeLeft":"до автостопу {time}","mic.capStopped":"зупинено на 10:00","mic.connecting":"Під'єдную мікрофон — секунду…","mic.menuTitle":"Спосіб розпізнавання","mic.menuLoading":"перевіряю, що доступно…","mic.menuLocked":"Заблоковано змінною середовища LLV_TRANSCRIBE_BACKEND","mic.noKey":"не налаштовано","mic.saveFailed":"не вдалося зберегти вибір","mic.keyTitle":"{name} не налаштовано","mic.copy":"копіювати","mic.copyPath":"Скопіювати шлях","mic.copied":"скопійовано","mic.back":"Назад","stt.local.name":"Faster Whisper","stt.local.desc":"Безкоштовно, повністю локально — аудіо не покидає цю машину.","stt.local.fix":"Запусти scripts/setup-whisper.sh у теці застосунку один раз; він встановить локальний рушій у:","stt.chatgpt.name":"ChatGPT Voice","stt.chatgpt.desc":"У межах підписки ChatGPT, через логін Codex.","stt.chatgpt.fix":"Залогінься в Codex (команда `codex login`) — токен з'явиться у:","stt.elevenlabs.name":"ElevenLabs Scribe","stt.elevenlabs.desc":"Платний API ElevenLabs — найточніший варіант.","stt.elevenlabs.fix":"Поклади свій API-ключ ElevenLabs (одним рядком) у цей файл:","stt.soniox.name":"Soniox","stt.soniox.desc":"Платний API Soniox — найшвидша жива транскрипція.","stt.soniox.fix":"Поклади свій API-ключ Soniox (одним рядком) у цей файл:","delFile.confirm":"Видалити з диска?","delFile.aria":"Видалити розмову з диска","rename.edit":"Перейменувати","rename.editAria":"Перейменувати \xab{title}\xbb","rename.inputAria":"Назва сесії","rename.save":"Зберегти назву","rename.cancel":"Скасувати","rename.reset":"Повернути автоназву","rename.resetHint":"Повернути автоназву: {title}","rename.autoHint":"Автоназва: {title}","rename.retry":"Повторити","rename.saved":"Перейменовано на {title}","rename.conflict":"Назву змінили деінде — застосовано найновішу та повторено","rename.failed":"Не вдалося зберегти назву","img.readFailed":"не вдалося прочитати картинку","img.readAborted":"читання картинки перервано","img.unsupported":"непідтримуваний формат картинки: {name}","img.unknownFile":"невідомий файл","img.tooLarge":"{name}: завелика (ліміт 10 МБ)","img.structuredTooLarge":"Картинка перевищує ліміт цього хоста — {max} МБ","img.tooManyStructured":"За один раз можна надіслати до {max} картинок","img.structuredAggregateTooLarge":"Картинки перевищують ліміт запиту цього хоста — {max} МБ","img.image":"картинка","img.error":"помилка картинки","img.previewAlt":"прев'ю картинки {n}","img.removeAria":"Прибрати картинку {n}","img.readingAria":"завантаження картинки {n}","img.retry":"Повторити","img.retryAria":"Повторити картинку {n}","img.clearAll":"Очистити все","img.clearAllAria":"Прибрати всі картинки","img.blockedReading":"Зачекайте, поки картинка завантажиться…","img.blockedFailed":"Приберіть або повторіть невдалу картинку, щоб надіслати","img.deliveryHint":"додано до повідомлення","question.sec":"{n} с","question.min":"{n} хв","question.hour":"{n} год","question.waiting":"чекає на відповідь","question.sentToPane":"Надіслано в пейн: {text}","question.keysHint":"клавіші в пейн \xb7 або композер нижче","question.pane":"Пейн {target}","question.alreadyAnswered":"відповідь уже записана","question.openFailed":"не вдалося відкрити сесію","question.opened":"відкрито {target}","question.answered":"Відповідено: {text}","question.answeredElsewhere":"Відповідено в іншому місці: {text}","question.noPane":"tmux-пейн недоступний","question.openSession":"відкрити сесію","question.rejectComment":"Коментар до відхилення…","question.approved":"затверджено","question.rejected":"відхилено","question.approve":"Затвердити","question.reject":"Відхилити","question.ownAnswer":"Своя відповідь…","question.dismiss":"Прибрати картку запитання","question.deliveryFailed":"Доставка не вдалася","question.failedChoice":"не доставлено","question.retryAnswer":"Спробувати ще","question.errorNotRunning":"агент більше не працює, тож нічого не доставлено","question.errorMoved":"агент уже пішов далі від цього питання","question.errorUnconfirmed":"відповідь надіслано, але агент її не підтвердив","question.errorNotDelivered":"екран агента не відреагував як очікувалось, тож відповідь не доставлена","question.errorRejected":"вʼювер не зміг зібрати коректну відповідь","inbox.deleted":"видалено з диска","inbox.fileGone":"файла вже немає на диску","inbox.confirmDelete":"Видалити файл з диска?","inbox.deleteAria":"Видалити {name} з диска","inbox.deleteFromDisk":"видалити з диска","inbox.attachedAlt":"вкладена картинка {name}","lightbox.zoomOut":"Зменшити","lightbox.resetZoom":"Скинути масштаб","lightbox.zoomIn":"Збільшити","preview.dialogTitle":"{name} — перегляд документа","preview.close":"Закрити перегляд","preview.download":"Завантажити файл","preview.openExternal":"Відкрити в новій вкладці","preview.resize":"Змінити ширину перегляду","preview.kindPdf":"PDF-документ","preview.kindImage":"Зображення","preview.kindText":"Текстовий файл","preview.kindUnknown":"Файл","preview.loading":"Завантаження…","preview.missing":"Цього файлу вже не існує.","preview.denied":"Доступ до цього файлу заборонено.","preview.unsupported":"Цей тип файлу не можна переглянути.","preview.oversized":"Файл більший за ліміт перегляду.","preview.changed":"Файл змінився на диску після відкриття перегляду.","preview.aborted":"Завантаження скасовано.","preview.error":"Не вдалося завантажити перегляд.","preview.reload":"Перезавантажити","preview.searchPlaceholder":"Пошук у завантаженому тексті","preview.noMatches":"збігів немає","preview.prevMatch":"Попередній збіг","preview.nextMatch":"Наступний збіг","preview.wrapLines":"Переносити рядки","preview.loadMore":"Завантажити ще","preview.loadedOf":"Завантажено {loaded} із {size}","preview.fit":"Вписати","preview.fitImage":"Вписати в панель","preview.fitWidth":"За шириною","preview.prevPage":"Попередня сторінка","preview.nextPage":"Наступна сторінка","preview.pageOf":"Сторінка {page} з {pages}","feed.agentEnded":"агент завершився","feed.copyCode":"Скопіювати код","feed.copyMd":"Скопіювати повідомлення (Markdown)","feed.voiceTurn":"Голос","selectedContext.stale":"застаріле","selectedContext.ariaSelected":"Вибрана картка: {name} (проєкт {project})","feed.voiceContext":"Стенограма дзвінка","feed.speak":"Прочитати відповідь уголос (голос згенеровано ШІ)","feed.stopSpeaking":"Зупинити озвучення","tts.read":"Прочитати відповідь уголос","tts.readPaid":"Прочитати вголос (платно)","tts.replay":"Повторити аудіо відповіді","tts.replayFree":"Повторити вголос (безкоштовно)","tts.triggerTitle":"{action} \xb7 правий клік: голос і оплата","tts.stop":"Зупинити озвучення","tts.menuTitle":"Голос і оплата","tts.menuLocked":"Заблоковано змінною середовища LLV_TTS_BACKEND","tts.nextPaid":"Наступний клік: платне озвучення цієї відповіді","tts.nextFree":"Наступний клік: безкоштовний повтор із кешу","tts.nextStop":"Наступний клік: зупинити читання цієї відповіді","tts.noKey":"не налаштовано","tts.saveFailed":"Не вдалося змінити провайдера голосу","tts.replayExpired":"Кешоване аудіо застаріло — цей повтор буде платним озвученням.","tts.backendChanged":"Провайдер голосу змінився — це читання оплачує {provider}.","tts.characters":"{count} символів","tts.billing":"Оплата з вашого облікового запису {provider} за кожен символ.","tts.disclosure":"Ви почуєте голос, згенерований ШІ, а не голос людини.","tts.tooLong":"Задовге для озвучення (ліміт {count} символів). Нічого не обрізається — озвучте коротший фрагмент.","tts.seekHint":"Клацніть у тексті під час відтворення, щоб перейти до цього місця.","tts.partOf":"Частина {index} з {count}","tts.finished":"Читання завершено","tts.missingKey":"Додайте API-ключ {provider} у {path}","tts.generating":"Створення аудіо…","tts.playing":"Відтворення аудіо","tts.stopped":"Зупинено","tts.configError":"Конфігурація TTS недоступна","tts.requestError":"Помилка запиту TTS ({status})","tts.requestFailed":"Помилка запиту TTS","tts.playError":"Браузер заблокував відтворення аудіо. Спробуйте ще раз.","feed.running":"виконує {tool}…","feed.tool":"інструмент","feed.thinking":"думає…","feed.working":"працює…","feed.liveTail":"живий хвіст","feed.liveOmittedItems":"… ({count} попередніх живих записів, {chars} символів)","feed.liveToolArgsOmitted":"аргументи пропущено","feed.liveToolOutcomeOmitted":"результат пропущено","feed.liveOmittedChars":"… (+{chars} символів)","feed.backToLive":"Повернутись до живого хвоста","feed.newCount":"{count} нових","feed.down":"вниз","feed.pickLog":"Вибери лог зліва — стрічка оновлюється сама","feed.showEarlier":"показати раніше","feed.showEarlierHidden":"показати раніше (сховано {count})","feed.loadEarlier":"завантажити раніше з файлу","feed.startOfConvo":"початок розмови","feed.finishedTurn":"закінчив хід — чекає відповіді","feed.returnedResult":"повернувся з результатом","feed.noOutput":"Ще без виводу — файл поки порожній","feed.onlyService":"Є лише службові записи ({count}).","feed.empty":"Порожньо (немає рядків для показу)","render.system":"системне","render.executing":"виконується…","render.error":"помилка","render.teammate":"тімейт","render.left":"{peer}: звільнився{at}","render.codexSessionCreated":"Сесія Codex створена","render.taskStarted":"Задача стартувала","render.taskComplete":"Задачу завершено","render.compacted":"контекст стиснуто","render.compactAuto":"авто","render.compactManual":"вручну","render.compactPre":"{n}k токенів до","render.compactSummary":"підсумок розмови","render.stdinSession":"stdin → сесія {id}","render.record":"запис","render.transcriptRecord":"запис транскрипту","render.recordDetails":"деталі запису","render.protocol":"протокол","render.image":"зображення","render.imageOutput":"вивід зображення","render.toolOutput":"вивід інструмента","render.toolOutputType":"вивід інструмента: {type}","render.dataKb":"даних {n} КБ","render.commands":{one:"{count} команда",few:"{count} команди",many:"{count} команд",other:"{count} команд"},"render.actions":{one:"{count} дія",few:"{count} дії",many:"{count} дій",other:"{count} дій"},"render.noFindings":"без findings","render.moreFindings":"ще {count} findings у raw","render.memoryCitations":"цитати пам'яті ({count})","render.noCitations":"без citation entries","render.moreEntries":"ще {count} entries у raw","render.truncated":"обрізано","render.shutdownRequest":"запит на завершення","render.shutdownResponse":"відповідь на завершення","render.planRequest":"запит на затвердження плану","render.planVerdict":"вердикт по плану","render.approved":"схвалено","render.rejected":"відхилено","render.from":"від {from}","render.structured":"структуроване повідомлення","render.showJson":"показати JSON","render.toDir":"до","render.fromDir":"від","render.internalTag":"внутрішнє","render.agentPeer":"агент","render.delivered":"доставлено","render.notDelivered":"не доставлено","render.reasoning":"міркування агента","tools.read":"Читання","tools.write":"Запис","tools.edit":"Редагування","tools.lines":{one:"{count} рядок",few:"{count} рядки",many:"{count} рядків",other:"{count} рядка"},"tools.files":{one:"{count} файл",few:"{count} файли",many:"{count} файлів",other:"{count} файлу"},"tools.items":{one:"{count} пункт",few:"{count} пункти",many:"{count} пунктів",other:"{count} пункту"},"tools.family.shell":"команда оболонки","tools.family.read":"читання файлу","tools.family.write":"запис файлу","tools.family.edit":"редагування","tools.family.search":"пошук","tools.family.web":"веб","tools.family.spawn":"запуск агента","tools.family.plan":"план","tools.family.mcp":"інструмент MCP","tools.family.other":"інструмент","tools.showAllLines":"показати всі ({count} рядків)","tools.showOutput":"показати весь вивід","tools.moreFiles":"…і ще {count} файлів","tools.binaryContent":"бінарний вміст \xb7 {size}","tools.rawRecord":"сирий запис","tools.noRawRecord":"деталі більше не завантажені","tools.noOutput":"вивід не збережено","tools.noOutputTip":"повний вивід зберігається в сесії rollout","tools.stdin":"stdin","tools.stdinPoll":"опитування","tools.pollRun":{one:"{count} опитування",few:"{count} опитування",many:"{count} опитувань",other:"{count} опитувань"},"tools.wait":"очікування","tools.session":"сесія","tools.waitingSeconds":"очікування {n} с","tools.wakeup":"заплановане пробудження","tools.cron":"запланований агент","tools.monitor":"монітор","tools.schedule":"розклад","tools.diffTruncated":"обрізано","tools.orchestration":{one:"{count} виклик інструмента",few:"{count} виклики інструментів",many:"{count} викликів інструментів",other:"{count} викликів інструментів"},"tools.nestedCalls":"вкладені виклики","tools.callId":"виклик {id}","tools.copyId":"копіювати id","tools.copyDiff":"Копіювати diff","tools.copyOutput":"Копіювати вивід","tools.source":"джерело","tools.action":"дія {index}","tools.cwd":"cwd","tools.copyCwd":"копіювати cwd","tools.copyCommand":"Копіювати команду","tools.stdout":"stdout","tools.stderr":"stderr","tools.copyStderr":"Копіювати stderr","tools.showStderr":"показати весь stderr","tools.noStderr":"stderr не збережено","tools.exitOk":"код виходу 0","tools.exitCode":"код виходу {code}","tools.durationSec":"{n} с","tools.durationMin":"{m} хв {s} с","tools.durationMs":"{n} мс","tools.ranAt":"{start}–{end}","tools.nestedWaits":{one:"{count} додатковий",few:"{count} додаткові",many:"{count} додаткових",other:"{count} додаткових"},"wakeup.card":"заплановане пробудження","wakeup.wakesAt":"прокинеться о {time}","wakeup.wasSetFor":"було на {time}","wakeup.firedAt":"спрацював о {time}","wakeup.fired":"спрацював","wakeup.failed":"не заплановано","wakeup.superseded":"замінено","wakeup.noTime":"пробудження заплановано","wakeup.plan":"план пробудження","wakeup.planInternal":"внутрішній промпт","wakeup.noPlan":"план пробудження не задано","wakeup.inRel":"через {rel}","wakeup.agoRel":"{rel} тому","wakeup.relSec":{one:"{count} с",few:"{count} с",many:"{count} с",other:"{count} с"},"wakeup.relMin":{one:"{count} хв",few:"{count} хв",many:"{count} хв",other:"{count} хв"},"wakeup.relHour":{one:"{count} год",few:"{count} год",many:"{count} год",other:"{count} год"},"wakeup.relDay":{one:"{count} дн",few:"{count} дн",many:"{count} дн",other:"{count} дн"},"wakeup.chipTitle":"спить до {time} — {reason}","flowDialog.engine":"Двигун: {label}","flowDialog.modelPlaceholder":"модель (дефолт)","flowDialog.model":"Модель: {label}","flowDialog.effortDefault":"effort: дефолт","flowDialog.createFailed":"не вдалося створити флоу ({status})","flowDialog.title":"Запустити флоу","flowDialog.subtitle":"implement → review \xb7 ця розмова стає виконавцем","flowDialog.preset":"пресет","flowDialog.rolesManualOpen":"▾ ролі вручну","flowDialog.rolesManual":"▸ ролі вручну (модель / effort)","flowDialog.spec":"специфікація та критерії приймання","flowDialog.specPlaceholder":"Опис задачі\nAC1: …\nAC2: …","flowDialog.implementer":"виконавець","flowDialog.reviewer":"ревʼюер","flowDialog.diffBase":"база діфу","flowDialog.fromHead":"від поточного HEAD","flowDialog.fromMergeBase":"від merge-base з main","flowDialog.headless":"headless (без панелі)","flowDialog.tmuxPane":"tmux-панель","flowDialog.transitions":"переходи","flowDialog.auto":"авто","flowDialog.manual":"вручну (гейт на кожен крок)","flowDialog.roundLimit":"ліміт раундів","flowDialog.creating":"створюю…","flowDialog.start":"▶ Запустити","flowStrip.startReview":"Почати ревью","flowStrip.spawnReviewer":"Заспавнити ревʼюера","flowStrip.relayNotes":"Передати зауваження","flowStrip.retryRound":"Повторити раунд","flowStrip.anotherRound":"Ще коло","flowStrip.flow":"Флоу","flowStrip.roundsAria":"Раунди ревью","flowStrip.roundError":"Раунд {n}: {error}","flowStrip.roundVerdict":"Раунд {n}: {verdict}","flowStrip.roundInProgress":"Раунд {n}: триває","flowStrip.addRoundsTitle":"Додати ще раунди до ліміту","flowStrip.plus2":"+2 раунди","flowStrip.limitTitle":"Ліміт раундів: скільки ревью до зупинки (∞ — без ліміту)","flowStrip.limitAria":"Встановити ліміт раундів: {count}","flowStrip.limitUnlimitedAria":"Без ліміту раундів","flowStrip.stopReviewer":"Стоп","flowStrip.stopReviewerTitle":"Зупинити поточного ревʼюера; раунд перейде в \xabпотрібне рішення\xbb","flowStrip.notePlaceholder":"нотатка ревʼюеру…","flowStrip.noteTitle":"Піде наступному ревʼюеру як ready-нотатка раунду","flowStrip.autoTitle":"Авто: переходи самі. Клік — вручну.","flowStrip.manualTitle":"Вручну: кожен перехід чекає кліку. Клік — авто.","flowStrip.manualShort":"вручну","flowStrip.resume":"Продовжити флоу","flowStrip.pause":"Пауза","flowStrip.close":"Закрити флоу","flowHub.aria":"Керування флоу — раунд {n}, {state}","flowHub.ariaNoRound":"Керування флоу — {state}","flowHub.controls":"Керування флоу","groupOverride.closePanel":"Закрити керування","groupOverride.flowTitle":"Змінити \xb7 {name}","groupOverride.pipelineTitle":"Змінити \xb7 {name}","groupOverride.draftTitle":"Редагувати чернетку \xb7 {name}","groupOverride.task":"Завдання","groupOverride.spec":"Специфікація","groupOverride.repoDir":"Репозиторій","groupOverride.saveDraft":"Зберегти деталі чернетки","groupOverride.savedDraft":"Деталі чернетки збережено","groupOverride.reviewerRole":"Наступний рев'юер","groupOverride.engine":"Рушій","groupOverride.effort":"Зусилля","groupOverride.effortDefault":"типове","groupOverride.model":"Модель","groupOverride.modelPlaceholder":"типова для рушія","groupOverride.applyRole":"Оновити рев'юера","groupOverride.nextRoundNote":"Нотатка на наступний раунд","groupOverride.notePlaceholder":"На чому зосередити наступного рев'юера…","groupOverride.noteUnavailable":"Можна редагувати під час старту, запуску або повтору раунду.","groupOverride.roundLimit":"Ліміт раундів","groupOverride.setLimit":"Задати","groupOverride.extend":"+1 раунд","groupOverride.nextStage":"Наступний етап","groupOverride.draftStage":"Етап чернетки","groupOverride.addStage":"Додати етап","groupOverride.removeStage":"Видалити етап","groupOverride.moveStageUp":"Перемістити вгору","groupOverride.moveStageDown":"Перемістити вниз","groupOverride.role":"Роль","groupOverride.noRole":"Без ролі","groupOverride.stagePrompt":"Промпт стадії","groupOverride.applyStage":"Оновити етап","groupOverride.noEditableStage":"Немає майбутнього етапу для змін — усі етапи вже стартували.","groupOverride.editStagesOnCanvas":"Редагуйте етапи на їхніх картках — роль, модель, підказка, порядок і зʼєднання є на картці кожного етапу на полотні.","groupOverride.savedReviewer":"Рев'юера оновлено на наступний раунд","groupOverride.savedLimit":"Ліміт раундів оновлено","groupOverride.savedExtend":"Додано раунд","groupOverride.savedRetry":"Повторюємо раунд","groupOverride.savedCancel":"Рев'юера зупинено","groupOverride.savedStage":"Етап оновлено для наступного запуску","groupOverride.stagesHeading":"Етапи \xb7 порядок виконання","groupOverride.stagesHint":"Перетягуй картки, щоб змінити порядок. Порядок — це ланцюг виконання.","groupOverride.stagesEmpty":"Ще немає етапів — додай етап нижче, щоб почати збірку.","groupOverride.startNeedsStages":"Додай щонайменше 1 етап перед запуском.","groupOverride.addRunStage":"Додати етап","groupOverride.addReviewStage":"Додати цикл ревʼю","groupOverride.dragHandle":"Перетягни, щоб змінити порядок етапу","groupOverride.runKind":"запуск","groupOverride.reviewKind":"цикл ревʼю","groupOverride.reordered":"Порядок етапів змінено","groupOverride.stageAdded":"Етап додано","groupOverride.stageRemoved":"Етап видалено","pipelineBuilder.untitledTask":"Новий пайплайн","pipelineBuilder.createDraft":"Пайплайн","pipelineBuilder.createDraftAria":"Додати чернетку пайплайна на полотно","roundDeck.roundAborted":"Раунд {n} \xb7 перервано","roundDeck.roundVerdict":"Раунд {n} \xb7 {verdict}","roundDeck.roundInProgress":"Раунд {n} \xb7 триває","roundDeck.aborted":"перервано","roundDeck.reviewInProgress":"ревью триває","roundDeck.waitingFirst":"чекаю на перший раунд ревью…","roundDeck.spawningReviewer":"запускаю ревʼюера — транскрипт зʼявиться за мить…","roundDeck.moreRounds":"ще {count} раунд(и) — клікни чипи на стрічці флоу","roundDeck.findings":{one:"{count} знахідка",few:"{count} знахідки",many:"{count} знахідок",other:"{count} знахідок"},"roundDeck.roundsCount":{one:"{count} раунд",few:"{count} раунди",many:"{count} раундів",other:"{count} раундів"},"roundDeck.collapseStack":"Згорнути стек ревʼю ({count} раундів)","roundDeck.expandStack":"Розгорнути стек ревʼю ({count} раундів)","roundDeck.groupAria":{one:"Група ревʼю \xb7 {count} раунд",few:"Група ревʼю \xb7 {count} раунди",many:"Група ревʼю \xb7 {count} раундів",other:"Група ревʼю \xb7 {count} раундів"},"roundDeck.groupAriaNamed":{one:"Група ревʼю для {name} \xb7 {count} раунд",few:"Група ревʼю для {name} \xb7 {count} раунди",many:"Група ревʼю для {name} \xb7 {count} раундів",other:"Група ревʼю для {name} \xb7 {count} раундів"},"subagentTray.label":{one:"{count} підагент",few:"{count} підагенти",many:"{count} підагентів",other:"{count} підагентів"},"subagentTray.toggle":{one:"Розгорнути лоток підагентів ({count} згорнутий)",few:"Розгорнути лоток підагентів ({count} згорнуті)",many:"Розгорнути лоток підагентів ({count} згорнутих)",other:"Розгорнути лоток підагентів ({count} згорнутих)"},"subagentTray.collapse":{one:"Згорнути лоток підагентів ({count} згорнутий)",few:"Згорнути лоток підагентів ({count} згорнуті)",many:"Згорнути лоток підагентів ({count} згорнутих)",other:"Згорнути лоток підагентів ({count} згорнутих)"},"subagentTray.rows":"Згорнуті підагенти","subagentTray.open":"Відкрити транскрипт підагента {name}","subagentTray.fold":"Згорнути {name} у лоток підагентів","subagentTray.unfold":"Повернути {name} як повну картку","subagentTray.state.running":"працює","subagentTray.state.live":"наживо","subagentTray.state.silent":"живий, але мовчить","subagentTray.state.closed":"простій","subagentTray.state.dead":"недоступний","flowState.waiting_ready":"чекає READY","flowState.spawn_pending":"готовий спавнити ревʼюера","flowState.spawning":"запускаю ревʼюера","flowState.reviewing":"ревью","flowState.relay_pending":"вердикт є — передати?","flowState.relaying":"передаю зауваження","flowState.fixing":"фікси","flowState.approved":"затверджено","flowState.done_comment":"готово із зауваженнями","flowState.needs_decision":"потребує рішення","flowState.paused":"пауза","flowState.closed":"закрито","flowState.blocked_rate_limited":"заблоковано: вичерпано ліміт","flowState.rate_limit_until":"скинеться о {time}","flowState.rate_limit_wait":"чекає на скидання ліміту","flowModel.failed":"не вдалося ({status})","wfState.provisioning":"готую worktree","wfState.implementing":"етапи виконуються","wfState.reviewing":"ревью","wfState.finishing":"завершення","wfState.approved":"approved","wfState.needs_decision":"потребує рішення","wfState.paused":"пауза","wfState.closed":"закрито","wfModel.failed":"не вдалося ({status})","wfStrip.workflow":"Воркфлоу","wfStrip.stagesAria":"Етапи воркфлоу","wfStrip.reviewStage":"ревью","wfStrip.advance":"Далі","wfStrip.retryStage":"Повторити етап","wfStrip.skipStage":"Пропустити","wfStrip.resume":"Продовжити воркфлоу","wfStrip.pause":"Пауза","wfStrip.close":"Закрити воркфлоу","pipelineState.draft":"чернетка","pipelineState.provisioning":"готую worktree","pipelineState.running":"етапи виконуються","pipelineState.needs_decision":"потребує рішення","pipelineState.paused":"пауза","pipelineState.completed":"завершено","pipelineState.closed":"закрито","pipelineModel.failed":"не вдалося ({status})","pipelineStrip.pipeline":"Пайплайн","pipelineStrip.start":"Запустити пайплайн","pipelineStrip.discard":"Відкинути чернетку","pipelineStrip.stagesAria":"Етапи пайплайна","pipelineStrip.reviewStage":"цикл ревью","pipelineStrip.retryStage":"Повторити етап","pipelineStrip.skipStage":"Пропустити","pipelineStrip.resume":"Продовжити пайплайн","pipelineStrip.pause":"Пауза","pipelineStrip.close":"Закрити пайплайн","pipelineStrip.readOnly":"лише читання","pipelineStrip.readWrite":"читання й запис","pipelineStrip.groupAria":"Пайплайн {task}","pipelineStrip.baseSha":"База {sha}","pipelineStrip.baseShaFull":"Повний базовий коміт {sha}","pipelineStrip.copyBaseSha":"Скопіювати повний базовий коміт {sha}","pipelineStrip.copiedBaseSha":"Повний базовий коміт скопійовано","pipelineStrip.copyBaseShaFailed":"Не вдалося скопіювати базовий коміт","pipelineStrip.moreActions":"Інші дії пайплайна","pipelineStrip.announce":"Пайплайн {task}: {state}, етап {stage} {k} з {n}","pipelineStrip.openStage":"Відкрити етап {label}","pipelineStrip.openVerdict":"Відкрити вердикт етапу {label}, стан: {state}","pipelineStrip.openTranscript":"Відкрити транскрипт етапу {label}, стан: {state}","pipelineStrip.configureStage":"Налаштувати етап {label}, стан: {state}","pipelineStrip.configAria":"Налаштування етапу {label}","pipelineStrip.closeConfig":"Закрити налаштування етапу","pipelineStrip.lineageAria":"Послідовність етапів від {from} до {to}","pipelineStrip.previousStage":"Відкрити попередній етап {label}, стан: {state}","pipelineStrip.nextStage":"Відкрити наступний етап {label}, стан: {state}","pipelineStrip.evidenceAria":"Свідчення етапу {label}: {verdict}, тривалість {duration}, модель {model}","pipelineStrip.defaultModel":"типова модель","pipelineStrip.unknownDuration":"тривалість недоступна","pipelineStrip.linkedTasks":"Пов’язані завдання","pipelineStrip.openTask":"Відкрити пов’язане завдання {label}","pipelineStrip.roundShort":"Р{n}","pipelineStrip.attemptSuffix":"\xd7{n}","stageGraph.roundProgress":"раунд {round}/{total}","stageGraph.startedNotice":"Етап запустився, поки налаштування були відкриті. Збережену серверну конфігурацію тепер заблоковано.","pipelineStrip.chipAria":"Етап {label}: {state}","pipelineStrip.compactChipAria":"{label}, {state}","pipelineStrip.stageOf":"етап {k}/{n}","pipelineStrip.passEdgeAria":"Ребро проходження від {from} до {to}","pipelineStrip.failEdgeAria":"Ребро невдачі від {from} до {to}, раунд {k} з {n}","pipelineStrip.nextEdge":"далі","pipelineStrip.nextEdgeAria":"Це ребро виконується наступним","pipelinePresentation.queued":"У черзі","pipelinePresentation.waiting":"Очікує","pipelineShelf.aria":"Полиця пайплайнів","pipelineShelf.title":"Пайплайни","pipelineShelf.edit":"Редагувати пайплайн {task}","pipelineGroup.toggle":"Розгорнути або згорнути пайплайн {task}","pipelineGroup.openHistory":"Відкрити історію пайплайна {task}","pipelineSlot.paneAria":"Запланований етап {title}","pipelineSlot.completedAria":"Завершений етап {title} — відкрийте для перегляду","pipelineSlot.openTranscript":"Відкрити розмову","pipelineSlot.stageOf":"етап {k}/{n}","pipelineSlot.promptLabel":"Промпт стадії","pipelineSlot.noPrompt":"Додатковий контекст для агента — все вище підключається автоматично.","pipelineSlot.wiringTask":"Автоматично отримує: текст задачі","pipelineSlot.wiringPrev":"Автоматично отримує: результат попереднього етапу + текст задачі","pipelineSlot.waiting":"Вікно чату {role} з’явиться тут, щойно етап стартує.","pipelineSlot.starting":"Запускаємо агента {role}…","pipelineSlot.reviewHint":"Цикл рев’ю попереднього етапу — його раунди з’являться тут.","pipelineSlot.frozen":"Етап уже виконувався — конфігурацію заморожено.","pipelineSlot.saved":"Збережено","pipelineSlot.rowAria":"Завершений етап {title}","pipelineSlot.reasonSkipped":"Пропущено оператором — ланцюжок пішов далі","pipelineSlot.rowExpand":"Показати повну картку етапу","pipelineSlot.rowCollapse":"Згорнути назад до рядка статусу","pipelineTemplates.planBuildReview":"План → Збірка → Рев’ю","pipelineTemplates.buildReview":"Збірка → Рев’ю","pipelineTemplates.buildVerify":"Збірка → Перевірка","pipelineSlot.addAgent":"Наступний агент","pipelineSlot.addAgentTitle":"Додати наступного агента після цього етапу","pipelineSlot.addReview":"Цикл рев’ю","pipelineSlot.addReviewTitle":"Прикріпити цикл рев’ю (жорстка зв’язка) після цього етапу","pipelineSlot.moveEarlier":"Перемістити {role} раніше в ланцюжку","pipelineSlot.moveLater":"Перемістити {role} пізніше в ланцюжку","pipelineSlot.savePrompt":"Зберегти промпт","pipelineSlot.promptAria":"Редактор промпту етапу","pipelineSlot.connectHeading":"З'єднання","pipelineSlot.passEdgeLabel":"Після проходження — до","pipelineSlot.passEdgeEnd":"— завершує конвеєр","pipelineSlot.failEdgeLabel":"У разі невдачі — назад до","pipelineSlot.failEdgeNone":"— зупинка для оператора","pipelineSlot.failEdgeSelf":"↺ цей етап (повтор себе)","pipelineSlot.failEdgeRounds":"Макс. раундів циклу","pipelineSlot.passEdgeFrozen":"Цей етап уже виконувався — його ребро проходження заморожене як свідчення.","pipelineSlot.failEdgeFrozen":"Це ребро невдачі вже пройдене — воно заморожене як свідчення.","pipelineTemplates.title":"Новий пайплайн","pipelineTemplates.subtitle":"Обери шаблон. Група пайплайна з’явиться на дошці біля пов’язаного завдання. Налаштування етапів доступні за запитом.","pipelineTemplates.blank":"Порожнє полотно","pipelineTemplates.blankHint":"Почни з нуля і збери етапи вручну.","pipelineTemplates.noRole":"без ролі","pipelineTemplates.repoDir":"Каталог репозиторію","pipelineTemplates.checking":"Перевіряємо репозиторій…","pipelineTemplates.ready":"Репозиторій готовий","pipelineTemplates.creating":"Створюємо пайплайн…","pipelineTemplates.retry":"Повторити","pipelinePreflight.empty":"Вкажи каталог репозиторію","pipelinePreflight.missing":"Каталог не існує: {path}","pipelinePreflight.not_directory":"Обери каталог: {path}","pipelinePreflight.repo_unreadable":"Репозиторій недоступний для читання: {path}","pipelinePreflight.repo_untraversable":"Репозиторій неможливо відкрити: {path}","pipelinePreflight.not_git":"Обери Git-репозиторій: {path}","pipelinePreflight.probe_failed":"Перевірку репозиторію не завершено — повтори: {path}","pipelinePreflight.git_metadata_unwritable":"Метадані Git доступні лише для читання: {path}","pipelinePreflight.worktree_parent_unwritable":"Поруч із цим репозиторієм неможливо створити робочу копію пайплайна: {path}","pipelineChipState.pending":"очікує","pipelineChipState.spawning":"запускається","pipelineChipState.running":"виконується","pipelineChipState.reviewing":"рев’ю","pipelineChipState.committing":"коміт","pipelineChipState.passed":"пройдено","pipelineChipState.failed":"провалено","pipelineChipState.needs_decision":"потребує рішення","pipelineChipState.skipped":"пропущено","pipelineVerdict.pass":"успіх","pipelineVerdict.fail":"провал","pipelineVerdict.needsDecision":"рішення","pipelineVerdict.confidence":"впевненість","pipelineVerdict.reviewerSha":"SHA ревʼюера {sha}","pipelineVerdict.findings":{one:"{count} зауваження",few:"{count} зауваження",many:"{count} зауважень",other:"{count} зауважень"},"pipelineVerdict.noFindings":"зауважень немає","pipelineVerdict.more":"+{count} ще","pipelineVerdict.openTranscript":"Відкрити транскрипт","pipelineVerdict.openAttemptTranscript":"Відкрити транскрипт спроби {n}","pipelineVerdict.reviewTranscripts":"Транскрипти рев’ю","pipelineVerdict.openReviewTranscript":"Відкрити транскрипт рев’ю {n}","pipelineVerdict.openFlow":"Відкрити рев’ю","pipelineVerdict.retry":"Повторити","pipelineVerdict.skip":"Пропустити","pipelineVerdict.priorAttempts":"Попередні спроби","pipelineVerdict.attemptLine":"Спроба {n}: {status}","pipelineVerdict.title":"Вердикт етапу {label}","pipelineHub.aria":"Пайплайн {task}: {stage} \xb7 {k}/{n}","pipelineHub.controls":"Керування пайплайном","pipelineHub.stageOf":"{stage} \xb7 {k}/{n}","pipelineHub.openControls":"Відкрити керування пайплайном","pipelineHub.attempt":"спроба {n}","pipelineHub.openDashboard":"Відкрити панель","dash.pipeline":"Пайплайн","dash.newPipeline":"Новий пайплайн","board.historyGroup":"Скасувати та повторити дії на дошці","board.undo":"Скасувати","board.redo":"Повторити","board.undoReopen":"Скасувати — знову відкрити \xab{title}\xbb","board.redoReclose":"Повторити — знову закрити \xab{title}\xbb","board.undoNothing":"Немає що скасовувати","board.redoNothing":"Немає що повторювати","scheme.pipeline":"Пайплайн","scheme.pipelineTitle":"Запустити пайплайн із цієї розмови","board.pipeline":"Пайплайн","board.newPipeline":"Новий пайплайн","pipelineMobile.chipAria":"Пайплайн {task}","pipelineMobile.position":"{k}/{n}","pipelineMobile.prevStage":"Попередній етап {label}, стан: {state}","pipelineMobile.nextStage":"Наступний етап {label}, стан: {state}","pipelineMobile.openVerdict":"Відкрити вердикт для {label}, стан: {state}","pipelineMobile.expandDock":"Розгорнути пайплайн {task}","pipelineMobile.collapseDock":"Згорнути пайплайн {task}","pipelineMobile.summaryOpen":"Відкрити пайплайни ({n})","pipelineMobile.summaryCount":{one:"{n} пайплайн",other:"{n} пайплайнів"},"pipelineMobile.summaryActive":"{n} активних","pipelineMobile.summaryAttention":"{n} потребують вас","pipelineMobile.summaryCompleted":"{n} завершено","pipelineMobile.sheetTitle":"Пайплайни","pipelineMobile.closeSheet":"Закрити пайплайни","pipelineMobile.completedGroup":{one:"{n} завершений",other:"{n} завершено"},"wfDraft.paneAria":"Чернетка нового воркфлоу","wfDraft.notStarted":"воркфлоу ще не запущений","wfDraft.newWorkflow":"новий воркфлоу","wfDraft.dismiss":"Прибрати чернетку воркфлоу","wfDraft.template":"шаблон","wfDraft.templateAria":"Шаблон воркфлоу","wfDraft.repo":"репозиторій","wfDraft.repoAria":"Директорія репозиторію","wfDraft.manualMode":"вручну: гейт на межі кожного етапу","wfDraft.hint":"Обери шаблон і репозиторій, опиши задачу — воркфлоу створить worktree, прожене етапи, ревью і відкриє PR.","wfDraft.taskPlaceholder":"задача для воркфлоу — бриф піде кожному етапу…","wfDraft.taskAria":"Бриф задачі воркфлоу","wfDraft.footerHint":"worktree \xb7 етапи \xb7 ревью \xb7 PR","wfDraft.finishMerge":"merge локально","wfDraft.needDir":"вкажи директорію репозиторію","wfDraft.needTask":"опиши задачу","wfDraft.launchFailed":"не вдалося запустити","wfDraft.launch":"▶ Запустити воркфлоу","wfDraft.launching":"запускаю…","scheme.flowTitle":"Запустити цикл implement → review для цієї розмови","scheme.flow":"Флоу","scheme.collapsedTitle":"Згорнуті гілки й задачі цієї розмови","scheme.ancestorElided":{one:"Батьківську розмову не показано: {title}",few:"{count} предків не показано, найближчий: {title}",many:"{count} предків не показано, найближчий: {title}",other:"{count} предків не показано, найближчий: {title}"},"scheme.ancestorOffBoard":"Батьківської розмови немає на цій дошці","scheme.underneath":"під сподом","scheme.handTool":"Рука — тягнути полотно (H, або тримай Space)","scheme.selectTool":"Виділення — клік і робота з розмовами (V)","scheme.zoomOut":"Віддалити (−)","scheme.zoom100":"Масштаб 100% (1)","scheme.zoomIn":"Наблизити (+)","scheme.fitCurrent":"Вписати поточну роботу (0)","scheme.fit":"Вписати весь вміст (Shift+0, або подвійний клік по фону)","scheme.framedCurrent":"Поточну роботу вписано — {count} елементів","scheme.framedAll":"Весь вміст вписано — {count} елементів","scheme.offscreenNav":"Робота за межами екрана","scheme.offscreenMore":"Показати ще {count} кластерів за межами екрана","mobile.mapFrame":"Рамка мапи","mobile.mapAll":"Усе","mobile.mapCurrent":"Поточне","scheme.roleImplementer":"Імплементер","scheme.roleReviewer":"Ревʼюер","scheme.roleWorking":"працює","scheme.roleWaiting":"чекає","scheme.lassoTool":"Вибірка — обведи агентів рамкою, кліком додавай чи знімай","scheme.selectCheckOn":"Додати цього агента до вибірки","scheme.selectCheckOff":"Прибрати цього агента з вибірки","scheme.boardAria":"Дошка агентів — стрілки переміщують між вікнами агентів","scheme.navStack":{one:"{count} тиха гілка під {title}",few:"{count} тихі гілки під {title}",many:"{count} тихих гілок під {title}",other:"{count} тихих гілок під {title}"},"scheme.navStackBare":{one:"{count} тиха гілка",few:"{count} тихі гілки",many:"{count} тихих гілок",other:"{count} тихих гілок"},"bulk.selectedCount":{one:"Вибрано {count}",few:"Вибрано {count}",many:"Вибрано {count}",other:"Вибрано {count}"},"bulk.placeholder":"одне повідомлення кожному вибраному агенту…","bulk.textAria":"Текст розсилки вибраним агентам","bulk.sendAll":"Надіслати {count} агентам","bulk.interrupt":"Перервати","bulk.stop":"Зупинити","bulk.stopConfirm":"Точно зупинити {count}?","bulk.remove":"Прибрати зі схеми","bulk.removeConfirm":"Закрити {count} карток?","bulk.flow":"Флоу","bulk.fit":"Показати вибірку","bulk.exit":"Вийти з вибірки (Esc)","bulk.retryFailed":"Повторити невдалі ({count})","bulk.nodeGone":"вузол зник зі схеми","bulk.flowTitle":"Запустити ревʼю-флоу для {count} агентів","bulk.flowStart":"Запустити {count} флоу","minimap.title":"Мінімапа — клікни або тягни, щоб перейти","minimap.stacks":{one:"{count} згорнутий стек",few:"{count} згорнуті стеки",many:"{count} згорнутих стеків",other:"{count} згорнутих стеків"},"plan.agentPlan":"План агента:","plan.stepsAria":"План: {done} з {total} кроків","plan.nowSuffix":", зараз: {current}","plan.goal":"ціль","plan.goalDone":"ціль ✓","plan.goalBlocked":"ціль ✖","plan.noObjective":"(objective не записаний у хвості транскрипта)","plan.tokens":"токенів: {n}","plan.time":"часу: {n} хв","plan.ctxTitle":"Контекстне вікно: використано {pct}%\n{used} з {window} токенів","plan.ctxSourceRuntime":"Розмір вікна повідомлений середовищем агента","plan.ctxSourceRegistry":"Розмір вікна з вбудованого реєстру моделей ({version}) — приблизно","plan.ctxTitleUnknown":"Використання контексту: {used} токенів\nРозмір вікна для цієї моделі невідомий — відсоток не показується","plan.ctxAria":"Контекст: використано {pct} відсотків вікна","plan.ctxAriaUnknown":"Контекст: використано {used} токенів, розмір вікна невідомий","plan.goalAria":"Ціль сесії: {status}","limits.now":"зараз","limits.inMin":"через {n} хв","limits.inHour":"через {n} год","limits.inDay":"через {n} д","limits.asOf":"станом на {time}","limits.left":"лишилось","limits.reset":"скид {eta} \xb7 {at}","limits.stale":"дані застарілі: {stale}","limits.5h":"5 год","limits.week":"Тиждень","limits.windowMinutes":"{n} хв","limits.windowHours":"{n} год","limits.windowDays":"{n} д","limits.accountsOpenAria":"Акаунти Codex — змінити або додати","limits.noDataYet":"поки немає даних","limits.rateLimited":"Провайдер обмежує частоту запитів.","limits.rateLimitedRetry":"Провайдер обмежує частоту запитів. Наступна спроба о {time}.","limits.reauthRequired":"Потрібно повторно увійти в Claude.","burndown.title":"витрати","burndown.openAria":"Відкрити графік витрати квоти {engine}","burndown.close":"Закрити графік","burndown.windowAria":"Вікно графіка","burndown.ideal":"рівний темп","burndown.actual":"лишок","burndown.loading":"Завантаження історії…","burndown.failed":"Не вдалося завантажити історію.","burndown.empty":"Історії ще немає — графік заповнюється в міру збору даних.","burndown.windowUnreported":"Цей план не повідомляє вікно \xab{window}\xbb, тож малювати тут нічого.","burndown.buildsFrom":"історія від {date}","burndown.fast":"на {pct}% швидше за рівний темп — витрачаєте зашвидко","burndown.slow":"на {pct}% повільніше за рівний темп — є запас","burndown.even":"рівний темп","burndown.emptyBy":"за таким темпом 0% до {at}","resources.ram":"RAM","resources.swap":"Swap","resources.free":"{amount} вільно","resources.used":"{amount} зайнято","resources.stale":"дані про ресурси застарілі: {stale}","resources.captured":"знято {age}","resources.openAria":"Сесії агентів і пам'ять","resources.title":"Сесії агентів","resources.total":"Σ {amount}","resources.empty":"у tmux немає сесій агентів","resources.orphan":"осиротілий пейн","resources.hostConflict":"дублікат пейна розмови","resources.hostConflictHint":"кілька активних пейнів належать цій розмові","resources.procs":{one:"{count} процес",few:"{count} процеси",many:"{count} процесів",other:"{count} процесу"},"resources.swapShare":"+ {amount} swap","resources.kill":"Убити","resources.confirm":"Точно?","resources.killLiveHint":"агент зараз працює — натисни, щоб розблокувати, і підтверди","resources.killHint":"закрити tmux-пейн разом з усім деревом процесів","resources.bulkLabel":"неактивні довше ніж","resources.bulkKill":"Убити неактивні","resources.bulkNone":"немає сесій, неактивних так довго","resources.hoursN":"{n} год","resources.killAll":"Убити всіх агентів","resources.killAllConfirm":"Підтвердити — убити {n}?","resources.killAllHint":"примусово закрити кожен пейн агента, разом із активними — чистий старт, щоб наступний spawn/повідомлення пішли правильно. Твої шели і в'ювер не чіпає.","resources.killAllNone":"немає сесій агентів для закриття","resources.close":"Закрити","attach.attach":"Приєднатися","attach.readonly":"Лише перегляд","attach.copy":"Скопіювати команду приєднання","attach.copyReadonly":"Скопіювати команду приєднання лише для перегляду","attach.hint":"скопіювати команду tmux attach для цього пейна — встав її в будь-який шел","attach.readonlyHint":"скопіювати команду приєднання лише для перегляду — дивишся, не чіпаючи клавіш","attach.loading":"обчислюю…","attach.copied":"команду приєднання скопійовано","attach.copiedReadonly":"команду лише для перегляду скопійовано","attach.stale":"Цей пейн змінився або закрився. Онови й спробуй ще раз.","attach.restarted":"Сервер tmux перезапустився. Онови й спробуй ще раз.","attach.unavailable":"Ендпоінт tmux недоступний. Онови й спробуй ще раз.","attach.badRequest":"Не вдалося визначити пейн — онови список.","attach.network":"Помилка мережі — спробуй ще раз.","attach.clipboard":"Не вдалося скопіювати — перевір доступ до буфера обміну.","attach.refresh":"Оновити","status.awaitingPlan":"чекає затвердження плану","status.awaitingAnswer":"чекає відповіді на питання","status.awaitingTerminal":"чекає на відповідь у терміналі","status.working":"працює…","status.returnedResult":"повернувся з результатом","status.stalled":"перервано або чекає дозволу","status.finishedTurn":"закінчив хід — чекає відповіді","status.rateLimited":"вичерпано ліміт","status.providerThrottled":"провайдер обмежує частоту — продовжить о {time}","status.flow":"флоу: {label}","rateLimit.badge":"вичерпано ліміт","rateLimit.badgeUntil":"ліміт до {time}","rateLimit.reseat":"продовжити на здоровому акаунті","rateLimit.reseatRequested":"пересадка…","rateLimit.reseatTitle":"Створити наступника цієї розмови на найздоровішому акаунті; вичерпана розмова паркується, прив'язані флоу переходять слідом.","rateLimit.reseatFailed":"не вдалося пересадити","rateLimit.reseatAlready":"вже пересаджено","rateLimit.reseatWaitingTurn":"Пересадку поставлено в чергу: щойно обмежений хід звільнить панель, буде створено наступника.","dictation.capWarn":"залишилось менше хвилини запису","dictation.capStopped":"Запис зупинено на 10-хвилинній межі; текст зʼявиться в полі.","dictation.failed":"не вдалося розпізнати","dictation.silence":"тиша — нічого не розпізналось","dictation.unsupported":"запис не підтримується в цьому браузері","dictation.liveError":"помилка live-транскрипції","dictation.connectionLost":"зʼєднання з транскрипцією обірвалось","dictation.noMic":"немає доступу до мікрофона","overview.branchesLiveIn":{one:"{count} гілка працює у {projects}",few:"{count} гілки працюють у {projects}",many:"{count} гілок працюють у {projects}",other:"{count} гілок працюють у {projects}"},"overview.projects":{one:"{count} проєкті",few:"{count} проєктах",many:"{count} проєктах",other:"{count} проєктах"},"overview.archived":"\xb7 {count} в архіві","overview.moreLive":"ще {count} live","overview.quiet":"тихо \xb7 остання активність {age}","overview.empty":"Логів поки нема","catalog.unreachable":"каталог недоступний","catalog.errorTitle":"Не вдалося завантажити каталог сесій","catalog.errorBody":"Сервер вʼювера не відповів, тож невідомо, що зараз працює.","catalog.retry":"Спробувати ще","catalog.attempts":{one:"{count} невдала спроба",few:"{count} невдалі спроби",many:"{count} невдалих спроб",other:"{count} невдалих спроб"},"launch.account":"Обліковий запис","launch.reasoning":"Міркування","orchPanel.title":"Оркестратор","orchPanel.toggleAria":"Панель оркестратора","orchPanel.regionAria":"Оркестратор проєкту {project}","orchPanel.close":"Закрити панель оркестратора","orchPanel.resize":"Змінити ширину панелі оркестратора","orchPanel.loading":"Читаю оркестратора цього проєкту…","orchPanel.unavailable":"Не вдається прочитати місце оркестратора","orchPanel.unavailableHint":"Нічого не змінено. Поки немає відповіді, створення тут могло б призначити другого оркестратора.","orchPanel.recheck":"Перевірити ще раз","orchPanel.draftTitle":"Створити оркестратора для цього проєкту","orchPanel.draftHint":"Він працює в {project}, володіє цією дошкою і відповідає вам тут. Текст нижче буде доставлено йому як перше повідомлення — редагуйте як завгодно.","orchPanel.draftHintVacated":"Розмова попереднього оркестратора зникла. Створіть нового для {project}; текст нижче буде доставлено як перше повідомлення.","orchPanel.mandate":"Мандат","orchPanel.mandateSent":"Надсилається як перше повідомлення","orchPanel.restoreDefault":"Повернути типовий","orchPanel.mandateRequired":"Мандат не може бути порожнім.","orchPanel.cwd":"Робоча тека: {cwd}","orchPanel.confirm":"Створити оркестратора","orchPanel.confirmRetry":"Спробувати ще раз","orchPanel.creating":"Створюю оркестратора…","orchPanel.creatingHint":"Призначення записано. Мандат буде доставлено рівно один раз, навіть якщо сторінку перезавантажити.","orchPanel.receipt":"Запуск {launchId}","orchPanel.creatingStuck":"Це призначення очікує ще від часу до завантаження сторінки — запит, який його почав, не завершився.","orchPanel.creatingResume":"Завершити призначення","orchPanel.errorTitle":"Оркестратора не призначено","orchPanel.errorHint":"Нічого не запущено. Виправте мандат або параметри й спробуйте ще раз.","orchPanel.errorUnknownTitle":"Результат останньої спроби невідомий","orchPanel.errorUnknownHint":"Відповідь загубилася, тож оркестратор уже може існувати. Повторна спроба відтворює той самий запит, а не створює другого.","orchPanel.transportLost":"Відповідь не надійшла — зʼєднання обірвалося.","orchPanel.transitionPending":"Нове призначення завершується…","orchPanel.transitionFailed":"Останнє призначення не вдалося","orchPanel.stalled":"Оркестратор затих. Надішліть повідомлення, щоб він повернувся до роботи.","orchPanel.resumable":"Оркестратор завершив роботу. Надішліть повідомлення, щоб продовжити цю саму розмову.","orchPanel.resolving":"Відкриваю розмову…","orchPanel.resolvingHint":"Оркестратора призначено; його транскрипт ще не дійшов до цього вигляду.","orchPanel.openOnBoard":"Відкрити на дошці","orchPanel.rotation":"Рекомендовано ротацію","orchPanel.rotationStrong":"Наполегливо рекомендовано ротацію","orchPanel.rotationContext":"контекст на {percent}% вікна моделі","orchPanel.rotationDead":"його хост зник","orchPanel.badgeLive":"живий","orchPanel.badgeStalled":"тиша","orchPanel.badgeResumable":"завершив","orchPanel.badgeDead":"хост зник","orchPanel.badgeResolving":"відкриваю","orchPanel.badgeCreating":"створюю","orchPanel.badgeFailed":"помилка","orchPanel.badgeNone":"ще немає","orchPanel.badgeReading":"читаю","orchPanel.incumbentAria":"Оркестратор, який зараз тримає місце цього проєкту","orchPanel.incumbentUnknown":"модель ще не визначено","orchPanel.accountTitle":"Працює на акаунті {account}","orchPanel.ctxTitle":"Контекст: {used} з {window} токенів ({percent}%)","orchPanel.ctxUnknownWindow":"{used} токенів у контексті; для цієї моделі вікно не налаштоване, тому відсоток не вказується","orchPanel.ctxAria":"Вікно контексту заповнене на {percent}%","orchPanel.ctxAriaUnknown":"Використання контексту, вікно невідоме","orchPanel.predecessor":"Замінив попереднього оркестратора","orchPanel.predecessorTitle":"Відкрити розмову попередника на дошці","orchPanel.rotate":"Замінити","orchPanel.rotateTitle":"Замінити цього оркестратора новим. Нічого не заміниться, доки ви не підтвердите.","orchPanel.rotateHeading":"Замінити оркестратора цього проєкту","orchPanel.rotateHint":"Наступник починає з мандата нижче. Транскрипт попередника й відкриті задачі проєкту передає сервер — тут їх повторювати не треба. Розмова попередника лишається на дошці, зв'язана з новою.","orchPanel.rotateConfirm":"Замінити оркестратора","orchPanel.rotateCancel":"Лишити цього","orchPanel.rotateErrorTitle":"Заміна не відбулася","orchPanel.rotateErrorHint":"Поточний оркестратор недоторканий і далі тримає місце. Виправте мандат чи параметри й спробуйте ще раз.","orchPanel.rotateErrorUnknownTitle":"Результат останньої заміни невідомий","orchPanel.rotateErrorUnknownHint":"Відповідь загубилася, тож наступник уже може існувати. Повторна спроба відтворює той самий запит, а не замінює двічі.","orchPanel.rotateVacated":"Розмову того оркестратора закрили, поки ця заміна ще тривала. Завершіть її тут — повторна спроба відтворює той самий запит, а не замінює двічі.","orchPanel.restoreIncumbent":"Повернути поточний мандат","orchPanel.cwdInherited":"Наступник продовжить у {cwd}","orchMobile.create":"Створити оркестратора","orchMobile.unreadable":"не читається","orchMobile.rowCreateAria":"Створити оркестратора для цього проєкту","orchMobile.rowLiveAria":"Оркестратор {model} — {state}. Відкриває його розмову.","orchMobile.rowStatusAria":"Оркестратор — {state}. Відкриває панель оркестратора.","orchMobile.pendingAria":"Нове призначення завершується — відкрити","orchMobile.transitionAria":"Останнє призначення не вдалося — відкрити","orchMobile.sheetAria":"Оркестратор проєкту {project}","orchMobile.liveTitle":"Оркестратор цього проєкту","orchMobile.liveHint":"Він відповідає у власній розмові. Відкрийте її — і ви в ній, разом із полем вводу.","orchMobile.open":"Відкрити розмову","branch.live":"працює","branch.waiting":"закінчив хід — чекає відповіді","branch.returned":"повернувся з результатом","branch.stalled":"перервано або чекає дозволу","branch.done":"завершено — можна прибрати","branch.worktree":"Ворк-дерево {name}","branch.lastActivity":"Остання активність: {age}","branch.lastActivityQuiet":"Позначений активним, але транскрипт мовчить: остання активність {age}","branch.handoffTitle":"агент, породжений хендоффом цієї розмови","branch.branchTitle":"гілка цієї розмови","branch.accountTip":"Акаунт {id} \xb7 {engine} \xb7 {health}","branch.accountTipPlain":"Акаунт {id} \xb7 {engine}","branch.accountAria":"Відкрити акаунти для {id}","lineage.parentRemoved":"батьківську розмову видалено","lineage.parentRemovedTitle":"Транскрипт батьківської розмови видалено","branch.removeColumn":"Прибрати колонку {title}","branch.toggleBackground":"{action} фонову задачу {title}","branch.collapse":"Згорнути","branch.expand":"Розгорнути","branch.expandFull":"Розгорнути розмову {title} на все вікно","branch.collapseFull":"Повернутися до полотна (Esc)","branch.detailsShow":"Показати деталі розмови","branch.detailsHide":"Сховати деталі розмови","branch.favorite":"Додати в обране","branch.unfavorite":"Прибрати з обраного","tree.quiet":"Тихі розмови й задачі","taskStacks.collapse":"Згорнути картку назад у стек статусу","readiness.title":"Готовність задач","readiness.aria":"Секції готовності всіх задач проєкту","readiness.legend":"Зараз — призначено в роботу \xb7 На рев'ю — рев'ю триває або є вердикт \xb7 Заблоковано — потрібне рішення \xb7 Заплановано — інбокс/беклог \xb7 Готово — завершено","readiness.section.now":"Зараз","readiness.section.review":"На рев'ю","readiness.section.blocked":"Заблоковано","readiness.section.planned":"Заплановано","readiness.section.done":"Готово","readiness.sectionAria":"Задачі \xab{section}\xbb \xb7 {count}","readiness.open":"Відкрити задачу на дошці: {title}","readiness.place":"Розмістити задачу на мапі: {title}","readiness.issueAria":"Відкрити issue #{issue} на GitHub","readiness.agent":"агент","readiness.agentAria":"Відкрити призначеного агента: {title}","readiness.pipeline":"пайплайн","readiness.pipelineAria":"Відкрити стадію пайплайна: {title}","readiness.review":"рев'ю","readiness.reviewAria":"Відкрити пов'язане рев'ю: {title}","readiness.state.live":"живий","readiness.state.gone":"зник","readiness.state.failed":"збій","launchHistory.title":"Історія запусків","launchHistory.aria":"Термінальні квитанції запусків","launchHistory.failed":"невдалий","launchHistory.recovered":"відновлений","launchHistory.retryLabel":"Повторити","launchHistory.retry":"Повторити запуск: {title}","workerStack.title":"Згорнуті воркери","workerStack.aria":"Згорнуті розмови воркерів","workerStack.expandGroup":"Розгорнути групу ревʼю на дошці","workerStack.flow":"Потік","workerStack.pipeline":"Пайплайн","workerStack.origin":"Породжені","workerStack.worktree":"Воркери","corner.waitingCount":"\xb7 {count} чекають","corner.openSwitchboard":"Відкрити пульт агентів","task.working":", працює","task.interrupted":", перервано","task.finished":", закінчив","task.interruptedBadge":"перервано","task.finishedBadge":"завершено","task.stopFailed":"помилка зупинки","task.signalSent":"надіслано {signal} PID {pid}","task.killRequested":"запит на зупинку надіслано","task.confirmKill":"Точно вбити PID {pid}?","task.confirmKillNamed":"Зупинити {name}?","task.confirmKillUntitled":"цього агента","task.confirmKillYes":"Так, вбити","task.stopAria":"Зупинити процес PID {pid}","task.kill":"Вбити","task.backgroundCommand":"Фонова команда","task.commandNotFound":"Команду, що запустила цю фонову задачу, не знайдено у транскриптах сесії","viewer.closeProjects":"Закрити список проєктів","viewer.agentWaiting":"Агент чекає відповіді","viewer.staleFocusEntry":"Ця розмова більше недоступна","viewer.unknownFragment":"Це посилання не вказує ні на що відоме переглядачу","viewer.closeNotification":"Закрити сповіщення","attention.badge":{one:"{count} чекає",few:"{count} чекають",many:"{count} чекають",other:"{count} чекають"},"attention.needsYou":"Чекають","attention.next":"Далі","attention.nextHint":"Сфокусувати наступного, хто чекає на тебе (N, Shift-N — назад)","attention.openQueue":"Черга уваги — хто заблокований на тобі (N — наступний)","attention.popoverTitle":"Чекають на тебе","attention.filterOn":"Показати лише тих, хто чекає на тебе (F)","attention.filterOff":"Показати всі вузли (F)","mobile.noConvos":"Розмов поки нема","mobile.map":"Карта","mobile.closeMap":"Закрити карту","mobile.tapNode":"Тапни вузол — розмова відкриється на весь екран","mobile.agent":"агент","mobile.openMap":"Відкрити карту проєкту","mobile.mapLoading":"Завантаження карти…","mobile.marker.open":"Відкрити {title}","mobile.marker.node":"розмова","mobile.marker.deck":"рев'ю","mobile.marker.draft":"чернетка агента","mobile.marker.stack":"історія","mobile.marker.worker":"воркери","mobile.marker.task":"задача","mobile.marker.pipeline":"пайплайн","tasks.failed":"не вдалося ({status})","tasks.tool":"Задача — наступний клік кладе картку на полотно (T)","tasks.untitled":"без назви","tasks.newPlaceholder":"текст задачі… (перший рядок — назва)","tasks.newTask":"нова задача","tasks.panelCreate":"Створити задачу","tasks.unplaced":"без місця","tasks.placeOnMap":"розмістити на дошці","tasks.addDue":"дедлайн","tasks.clearDue":"Прибрати дедлайн","tasks.dueTitle":"Дедлайн (зона: {zone})","tasks.attachCount":{one:"{count} зображення",other:"{count} зображень"},"tasks.draftDiscarded":"чернетку відкинуто","tasks.editAria":"Текст задачі","tasks.spawning":"запускається…","tasks.deadChip":"розмови вже немає у списку","tasks.failedChip":"доставку не виконано","tasks.killedChip":"процес агента зупинено","tasks.unhostedChip":"агент зараз не запущений","tasks.migratingChip":"агент переходить на інший акаунт","tasks.source":"джерело","tasks.sourceTitle":"Взято з","tasks.retry":"повторити доставку","tasks.retryLaunch":"повторити запуск","tasks.retryLaunchAria":"Повторити невдалий запуск для {title}","tasks.retryLaunched":"агента перезапущено","tasks.chipFailedTitle":"не доставлено: {error}","tasks.handoffChip":"закинуто в промпт цього агента — ще не надіслано","tasks.detach":"відв'язати","tasks.detachAria":"Відв'язати {title} від задачі","tasks.expand":"Розгорнути задачу","tasks.collapse":"Згорнути задачу","tasks.openAgent":"відкрити й показати панель агента","tasks.openAgentAria":"Відкрити агента {title}","tasks.openAgentUnavailableAria":"Відкрити агента {title} — недоступно: {reason}","tasks.openSource":"відкрити й показати розмову-джерело","tasks.openSourceAria":"Відкрити розмову-джерело {title}","tasks.openSourceUnavailableAria":"Відкрити розмову-джерело {title} — недоступно: {reason}","tasks.sourceGone":"розмови-джерела немає на дошці","tasks.relatedNav":"Пов'язані задачі","tasks.openTaskAria":"Відкрити задачу {title}","tasks.relatedAssignedTitle":"призначена цій розмові","tasks.relatedSourceTitle":"записана з цієї розмови","tasks.send":"надіслати","tasks.sendTitle":"Потягни стрілку на панель агента — задача ляже в його промпт (нічого не надсилається); клік — створить чернетку нової розмови","tasks.linkHanded":"закинуто в \xab{title}\xbb — перевір і надішли там","tasks.linkSent":"задачу надіслано → \xab{title}\xbb","tasks.spawn":"агент","tasks.spawnTitle":"Запустити нового агента з цією задачею як брифом","tasks.spawnGo":"Запустити","tasks.statusTitle":"Статус: {label} — клік перемикає (інбокс → призначено → заблоковано → готово)","tasks.status.inbox":"інбокс","tasks.status.assigned":"призначено","tasks.status.blocked":"заблоковано","tasks.status.done":"готово","tasks.delete":"видалити","tasks.deleteConfirm":"точно?","tasks.deleteAria":"Видалити задачу {title}","tasks.pickerTitle":"Кому надіслати","tasks.pickerAllChildren":"⤷ всім дітям","tasks.pickerEmpty":"у проєкті немає розмов","tasks.pickerSend":"Надіслати ({count})","tasks.sendOk":"Доставлено {delivered} з {total}","tasks.sendFailPart":"✗ „{title}“: {error}","tasks.spawnOk":"агента запущено в tmux {target}","tasks.composerToggle":"створити задачу","tasks.composerToggleTitle":"Увімкнено — текст стає задачею-карткою з призначеннями на вибір; вимкнено — проста розсилка без сліду","tasks.composerNeedsText":"для задачі потрібен текст","tasks.panelTitle":"Задачі","tasks.panelToggleAria":"Показати або сховати панель задач","tasks.panelThisProject":"цей проєкт","tasks.panelAll":"всі","tasks.panelEmpty":"задач поки нема — кинь картку інструментом \xabзадача\xbb (T)","tasks.panelClose":"Закрити панель задач","favorites.sectionTitle":"Обране","favorites.empty":"обраного поки нема — наведи на картку й тапни корону","favorites.focusTitle":"Показати {title} на дошці","tasks.sheetNew":"нова задача","tasks.sheetCreate":"Створити задачу","tasks.sheetBack":"Назад до списку задач","tasks.sheetTargets":{one:"{count} адресат",few:"{count} адресати",many:"{count} адресатів",other:"{count} адресатів"},"tasks.sheetAssignments":"призначення","tasks.sheetEmpty":"задач поки нема","tasks.sheetGone":"задачі вже немає","tasks.textNotSaved":"текст не зберігся — надсилання скасовано, спробуй ще раз","tasks.emptyTextBlocked":"порожній текст не зберігається — віднови текст задачі перед надсиланням","runtime.live":"наживо","runtime.reconnecting":"перепідключення","runtime.degraded":"деградовано","runtime.offline":"офлайн","runtime.resynced":"пересинхронізовано","runtime.connection":"з'єднання рантайму","runtime.announce.live":"з'єднання рантайму наживо","runtime.announce.reconnecting":"рантайм перепідключається","runtime.announce.degraded":"рантайм деградовано — опитування оновлень","runtime.announce.offline":"рантайм офлайн","runtime.announce.resynced":"рантайм пересинхронізовано зі свіжого знімка","runtime.staleSince":"застаріло {duration}","runtime.lastKnown":"останнє оновлення {duration} тому","runtime.legacyProvenance":"легасі \xb7 похідний стан","staging.badge":"Стейджинг","staging.badgeTitle":"Стейджинг-інстанс — ізольований стан; нічого звідси не торкається проду","runtime.drift":"розбіжність: {evidence}","runtime.driftDismiss":"Сховати","runtime.receipt.pending":"надсилання…","runtime.receipt.busyRetry":"Не вдалося доставити — агент зайнятий, повторимо","runtime.receipt.summary":"Спроб доставки: {count}","runtime.receipt.pendingCount":"очікують: {count}","runtime.receipt.attemptCount":"спроб: {count}","runtime.receipt.problemCount":"проблем: {count}","runtime.receipt.showDetails":"Показати деталі доставки","runtime.receipt.hideDetails":"Сховати деталі доставки","runtime.receipt.statusSummary":"Стан доставки: {pending}, {problems}.","runtime.receipt.statusPending":{one:"{count} повідомлення очікує",few:"{count} повідомлення очікують",many:"{count} повідомлень очікують",other:"{count} повідомлень очікують"},"runtime.receipt.statusProblems":{one:"{count} проблема",few:"{count} проблеми",many:"{count} проблем",other:"{count} проблем"},"runtime.receipt.delivering":"доставляється…","runtime.receipt.applying":"застосовується…","runtime.receipt.turn-started":"хід почато","runtime.receipt.steered":"вкладено в поточний хід","runtime.receipt.queued":"у черзі","runtime.receipt.queuedPos":"у черзі \xb7 #{position}","runtime.receipt.delivered":"доставлено","runtime.receipt.applied":"зміну застосовано","runtime.receipt.interrupted":"перервано","runtime.receipt.answered":"відповіджено","runtime.receipt.rejected":"відхилено: {reason}","runtime.receipt.failed":"збій: {reason}","runtime.receipt.uncertain":"невизначено — відновлення","runtime.receipt.retry":"Повторити","runtime.receipt.edit":"Змінити й надіслати","runtime.receipt.dismiss":"Прибрати","runtime.attention.title":"потрібне твоє рішення","runtime.attention.approval":"підтвердження","runtime.attention.permission":"дозвіл","runtime.attention.question":"питання","runtime.attention.waiting_heuristic":"можливо, чекає","runtime.attention.heuristicNote":"сигнал низької впевненості","runtime.attention.unowned":"немає відповідального","runtime.attention.command":"команда","runtime.attention.tool":"інструмент","runtime.attention.approve":"Схвалити","runtime.attention.deny":"Відхилити","runtime.attention.answer":"Відповісти","runtime.attention.answering":"відповідаю…","runtime.attention.expiresIn":"авторішення через {seconds}с","runtime.attention.keysHint":"Enter схвалює \xb7 Esc відхиляє","voice.start":"Почати безперервну голосову розмову","voice.stop":"Завершити голосову розмову","voice.connecting":"Підключаю голос…","voice.live":"Голосова розмова активна \xb7 говоріть у будь-який момент","voice.stopping":"Завершую голосову розмову…","voice.failed":"Голосове зʼєднання потребує уваги","voice.panel":"Голосова розмова","voice.you":"Ви","voice.agent":"Агент","voice.progress":"Перебіг","voice.retry":"Спробувати ще раз","voice.ended":"Голосову розмову завершено","voice.elapsed":"Тривалість дзвінка","voice.micLevel":"Рівень мікрофона","voice.micMute":"Вимкнути мікрофон","voice.micUnmute":"Увімкнути мікрофон","voice.outputMute":"Приглушити агента","voice.outputUnmute":"Увімкнути звук агента","voice.floatSurface":"Голосова розмова","voice.float":"Відкрити плавуче вікно голосу","voice.dock":"Закрити плавуче вікно, не завершуючи розмову","voice.floatUnsupported":"Плавуче вікно голосу потребує браузера на Chromium; розмова лишається тут.","attention.return":"Назад, де ви були","attention.returnLine":"Повернутися туди, де ви були"}},77513:(a,b,c)=>{c.d(b,{F4:()=>x,_p:()=>y,cr:()=>z,n1:()=>E,ni:()=>D,vT:()=>C});var d=c(77598),e=c.n(d),f=c(76760),g=c.n(f),h=c(58152),i=c(4837),j=c(29733),k=c(16089),l=c(10167),m=c(2159),n=c(70107),o=c(27359),p=c(27471),q=c(16667),r=c(51906),s=c(73367),t=c(59680),u=c(98590);function v(a){return!a||"object"!=typeof a||Array.isArray(a)||"claude"!==a.engine&&"codex"!==a.engine?null:{engine:a.engine,model:"string"==typeof a.model&&a.model.trim()?a.model.trim():null,effort:"string"==typeof a.effort&&a.effort.trim()?a.effort.trim():null}}let w=new Set(["structured resume host claim is unavailable"]);function x(a){if("paused"!==a.state||"relaying"!==a.pausedState||!a.stateDetail)return!1;let b=(0,q.Hw)(a);return b?.relayStartedAt!=null&&null==b.relayedAt&&null==b.relayDelivery&&null==b.relayDeliveryTransport&&b.error===a.stateDetail&&w.has(a.stateDetail)}async function y(a,b){let c,d=function(a){if(void 0===a)return{ok:!0};if("string"!=typeof a)return{ok:!1};let b=a.trim();return b?{ok:!0,spec:b}:{ok:!0}}(a.spec);if(!d.ok)return{error:"spec must be a string",status:400};let f=null,h=a.headRef?.trim()??null;if(h&&(!/^[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(h)||h.includes("..")||h.endsWith("/")))return{error:"headRef must be a safe branch name",status:400};if(void 0!==a.targetSha){if("string"!=typeof a.targetSha||!/^[0-9a-f]{40}$/i.test(a.targetSha.trim()))return{error:"targetSha must be an exact commit SHA",status:400};f=a.targetSha.trim().toLowerCase()}let l=function(a){let b=(0,u.Vd)();if(a.preset){let c=b.find(b=>b.name===a.preset);return c?{implementer:{...c.implementer},reviewer:{...c.reviewer}}:null}let c=v(a.roles?.implementer),d=v(a.roles?.reviewer);return c&&d?{implementer:c,reviewer:d}:null}(a);if(!l)return{error:"invalid flow roles or preset",status:400};if(l.reviewer.model){let a=(0,i.RC)(l.reviewer.engine,l.reviewer.model);if("error"in a)return{error:a.error,status:400};l.reviewer.model=a.model}let m=(0,j.agentRegistry)(),o=a.implementerConversationId?.startsWith("conversation_")?a.implementerConversationId:null;if(a.implementerConversationId&&!o)return{error:"implementer conversation identity is invalid",status:400};let p=o?m.conversation(o):null,r=b.find(b=>b.path===a.implementerPath),w=o?b.find(a=>a.conversationId===o):void 0,x=[...new Set((o?[a.implementerPath,p?.generations.at(-1)?.path,w?.path]:[]).filter(a=>!!a))].find(a=>null!==(0,k.tX)(a))??r?.path??null,y=x?b.find(a=>a.path===x)??w:void 0;if(!x)return{error:"implementer transcript is unknown",status:404};let z=p??m.conversationForPath(x)??m.ensureConversation(l.implementer.engine,x,null);if(z.engine!==l.implementer.engine)return{error:"implementer engine does not match its durable conversation",status:400};if(y&&"claude-projects"!==y.root&&"codex-sessions"!==y.root)return{error:"implementer must be a Claude or Codex session",status:400};if(y&&"claude"!==y.engine&&"codex"!==y.engine)return{error:"implementer must use the Claude or Codex engine",status:400};let A=(0,k.tX)(x);if(!A)return{error:"could not determine the session working directory",status:409};let B=y?.project??(0,n.hY)(A)??g().basename(A),C="merge-base"===a.baseMode?"merge-base":"head",D="string"==typeof a.baseRef&&a.baseRef.trim()?{ok:!0,sha:a.baseRef.trim()}:(0,s.JN)(A,C);if(!D.ok)return{error:D.error,status:409};let E=(0,u.mL)();if(E.find(a=>(a.implementerConversationId===z.id||a.implementerPath===x)&&null===a.closedAt&&"closed"!==a.state))return{error:"implementer already has an active flow",status:409};let F={id:e().randomUUID().slice(0,8),template:"implement-review-loop",project:B,cwd:A,implementerPath:x,implementerConversationId:z.id,roles:l,reviewerFallback:"codex"===l.reviewer.engine?(0,u.ay)():null,baseRef:D.sha,headRef:h,targetSha:f,...d.spec?{spec:d.spec}:{},baseMode:C,mode:"manual"===a.mode?"manual":"auto",reviewerMode:"pane"===a.reviewerMode?"pane":"headless",roundLimit:Number.isInteger(a.roundLimit)&&a.roundLimit>0?Math.min(a.roundLimit,50):5,state:"waiting_ready",pausedState:null,stateDetail:null,mergeEvidence:(c=(0,s.NN)(A))?{...c,prNumber:null,mergedAt:null,checkedAt:null,source:null}:null,kickoffDelivery:null,hostClaim:null,rounds:[],createdAt:(0,q.Ec)(),closedAt:null};if(m.rememberMembership(z.id,{kind:"flow",containerId:F.id,role:"implementer",slot:"implementer",stageId:null,stageOrder:0,round:null,parentConversationId:null}),E.push(F),(0,u.tu)(E),!1!==a.deliverKickoff)try{let a=await (0,q.iq)(F,new Map(b.map(a=>[a.path,a])),(0,t.SB)(F.spec));F.kickoffDelivery={path:a,deliveredAt:(0,q.Ec)()},(0,u.tu)(E)}catch(a){F.state="paused",F.pausedState="waiting_ready",F.stateDetail=a instanceof Error?a.message:String(a),(0,u.tu)(E)}return{flow:F}}let z=2e3;function A(a){if("string"!=typeof a.note)return;let b=a.note.trim();return b?b.slice(0,z):null}async function B(a,b){if("pane"!==a.reviewerMode)return await (0,r.OZ)(a.id,b.n,b);try{let a=b.reviewerPane;if(a){let b=await (0,p.RZ)(a.paneId);b&&b.windowName===a.windowName&&!(0,o.g2)(b.command)&&await (0,p.VT)(a.paneId)}else if(b.reviewerPath){let a=b.reviewerConversationId?.startsWith("conversation_")?(0,j.agentRegistry)().conversation(b.reviewerConversationId)?.generations.at(-1)?.path??b.reviewerPath:(0,j.agentRegistry)().canonicalPath(b.reviewerPath),c=await (0,l.AB)(a);null!==c&&await (0,p.VT)(c)}}catch{}return!0}async function C(a){let b=(0,u.mL)().find(b=>b.id===a);if(!b)return{error:"flow not found",status:404};let c=(0,q.Hw)(b);return"reviewing"===b.state&&c?await B(b,c)?await (0,u.ke)((b,d)=>{let e=b.find(b=>b.id===a);if(!e)return{error:"flow not found",status:404};let f=(0,q.Hw)(e);return"reviewing"!==e.state||f?.n!==c.n||f.reviewerBindingId!==c.reviewerBindingId?{error:"flow changed during reviewer teardown",status:409}:(f.error="cancelled by user",f.terminalAt=(0,q.Ec)(),e.state="needs_decision",e.stateDetail="round cancelled by user",d(),{flow:e})}):{error:"reviewer process group did not terminate",status:409}:{error:"no reviewer is running for this flow",status:409}}async function D(a){let b=(0,u.mL)().find(b=>b.id===a);if(!b)return{error:"flow not found",status:404};let c=(0,q.Hw)(b),d=c&&null===c.verdict&&!c.error?{n:c.n,reviewerBindingId:c.reviewerBindingId}:null;if(null!==d&&!await B(b,c))return{error:"reviewer process group did not terminate",status:409};let e=null===d?null:{round:d.n};return await (0,u.ke)((b,c)=>{let f=b.find(b=>b.id===a);if(!f)return{error:"flow not found",status:404};if("closed"===f.state)return{flow:f,stoppedReviewer:e};let g=(0,q.Hw)(f);return null!==d&&(g?.n!==d.n||g.reviewerBindingId!==d.reviewerBindingId)?{error:"flow changed during reviewer teardown",status:409}:(null!==d&&g&&null===g.verdict&&!g.error&&(g.error="flow closed by user",g.terminalAt=(0,q.Ec)()),f.state="closed",f.closedAt=(0,q.Ec)(),f.stateDetail=null,c(),{flow:f,stoppedReviewer:e})})}function E(a,b,c=m.a){let d=(0,u.mL)(),f=d.find(b=>b.id===a);if(!f)return{error:"flow not found",status:404};let g=(0,q.Hw)(f);if("pause"===b.action)"paused"!==f.state&&"closed"!==f.state&&(f.pausedState=f.state,f.state="paused",f.stateDetail=(0,m.P)("paused",c));else if("resume"===b.action)"paused"===f.state&&(g&&x(f)&&(g.relayStartedAt=null,g.relayDeliveryTransport=null,g.relayRetryAt=null,g.relayRetryRequiresIdempotency=!1),f.state=f.pausedState&&"paused"!==f.pausedState?f.pausedState:"waiting_ready",f.pausedState=null,f.stateDetail=(0,m.P)("resumed",c));else if("set-mode"===b.action){if("auto"!==b.mode&&"manual"!==b.mode)return{error:"mode must be auto or manual",status:400};f.mode=b.mode}else if("advance"===b.action){let a=A(b);if("waiting_ready"===f.state)f.rounds.push((0,q.xz)(f,"button",a??null)),f.state="manual"===f.mode?"spawn_pending":"spawning";else if("spawn_pending"===f.state)void 0!==a&&g&&(g.readyNote=a),f.state="spawning";else if("relay_pending"===f.state)f.state="relaying";else{if("fixing"!==f.state||!g||"structured"!==g.relayDeliveryTransport||null==g.relayedAt||null!==(0,q.SZ)(f))return{error:"flow cannot advance from its current state",status:409};Object.assign(g,{relayDelivery:null,relayedAt:null,relayPendingSettlement:null,relayStartedAt:null,relayRetryCount:0,relayRetryAt:null,relayRetryRequiresIdempotency:!0,error:null}),f.state="relaying"}f.stateDetail=null}else if("retry-round"===b.action){if("needs_decision"!==f.state||!g)return{error:"flow cannot retry from its current state",status:409};(0,r.T)(f.id,g.n,g),(0,r.gn)(f.id,g.n);let a=A(b);Object.assign(g,{reviewerPath:null,reviewerConversationId:null,reviewerBindingId:e().randomUUID(),accountId:null,attemptedAccounts:[],autoRetryCount:0,sessionId:null,reviewerPid:null,reviewerIdentity:null,reviewerPane:null,findingsPath:null,verdict:null,findingsCount:null,reviewerRole:{...f.roles.reviewer},readyNote:void 0===a?g.readyNote:a,reviewHeadSha:null,startedAt:(0,q.Ec)(),spawnStartedAt:null,launchId:null,launchLeaseUntil:null,relayStartedAt:null,relayRetryCount:0,relayDeliveryAttempt:0,relayDeliveryTransport:null,relayRetryAt:null,relayRetryRequiresIdempotency:!1,relayDelivery:null,reviewedAt:null,terminalAt:null,relayedAt:null,error:null}),f.state="manual"===f.mode?"spawn_pending":"spawning",f.stateDetail=null}else if("extend"===b.action){let a=Number.isInteger(b.rounds)&&b.rounds&&b.rounds>0?Math.min(b.rounds,20):1;f.roundLimit>0&&(f.roundLimit+=a),"needs_decision"===f.state&&(f.state="waiting_ready",f.stateDetail=null)}else if("set-round-limit"===b.action){let a=b.rounds;if(!Number.isInteger(a)||void 0===a||a<0||a>50)return{error:"rounds must be an integer 0–50 (0 = unlimited)",status:400};f.roundLimit=0===a?0:Math.max(a,f.rounds.length),"needs_decision"===f.state&&"round limit reached"===f.stateDetail&&(0===f.roundLimit||f.roundLimit>f.rounds.length)&&(f.state="waiting_ready",f.stateDetail=null)}else if("another-round"===b.action){if("done_comment"!==f.state)return{error:"flow is not waiting for another round",status:409};f.closedAt=null,f.state="waiting_ready",f.stateDetail=null}else if("set-roles"===b.action){if("closed"===f.state)return{error:"flow is closed",status:409};let a=b.roles&&"object"==typeof b.roles&&!Array.isArray(b.roles)?b.roles.reviewer:void 0;if(void 0===a)return{error:"reviewer role override is required",status:400};let c=function(a,b){if(!b||"object"!=typeof b||Array.isArray(b))return{error:"invalid reviewer role override"};let c={...a};if(void 0!==b.engine){if("claude"!==b.engine&&"codex"!==b.engine)return{error:"invalid reviewer role override"};c.engine=b.engine}if(void 0!==b.model){if(null!==b.model&&"string"!=typeof b.model)return{error:"invalid reviewer role override"};c.model="string"==typeof b.model&&b.model.trim()?b.model.trim():null}if(void 0!==b.effort){if(null!==b.effort&&"string"!=typeof b.effort)return{error:"invalid reviewer role override"};c.effort="string"==typeof b.effort&&b.effort.trim()?b.effort.trim():null}if(c.model){let a=(0,i.RC)(c.engine,c.model);if("error"in a)return a;c.model=a.model}return c.effort&&!(0,h.z9)(c.engine,c.effort)?{error:"invalid reviewer role override"}:{role:c}}(f.roles.reviewer,a);if("error"in c)return{error:c.error,status:400};let d=c.role;f.roles={...f.roles,reviewer:d};let e="spawn_pending"===f.state||"paused"===f.state&&"spawn_pending"===f.pausedState?g:null;e&&null==e.spawnStartedAt&&(e.reviewerRole={...d})}return g&&"spawning"===f.state&&(g.error=null),(0,u.tu)(d),{flow:f}}},81533:(a,b,c)=>{c.d(b,{U:()=>f});let d=process,e=d.__llvAccountMigrationSignal??={tick:null,scheduled:!1};function f(){e.scheduled||null===e.tick||(e.scheduled=!0,queueMicrotask(()=>{e.scheduled=!1;let a=e.tick;null!==a&&a().catch(a=>{console.error("[account migration controller] requested reconciliation failed",a)})}))}},83336:(a,b,c)=>{c.d(b,{AW:()=>f,BL:()=>g,EY:()=>h,h4:()=>e});var d=c(41022);function e(a){let b=(0,d.rM)(a.content?.text??a.text??"",a.content?.images??a.images??[]);if(a.contentDigest&&a.contentDigest!==b.contentDigest)throw Error("queue entry content digest mismatch");return{id:a.id,content:b.content,contentDigest:b.contentDigest,...void 0!==a.expectedTurnId?{expectedTurnId:a.expectedTurnId}:{},...a.runtime?{runtime:a.runtime}:{},...a.selectedContext?{selectedContext:a.selectedContext}:{},...a.origin?{origin:a.origin}:{}}}class f extends Error{constructor(a,b){super(`runtime replay begins at sequence ${b}; requested after ${a}`),this.requestedAfterSeq=a,this.firstAvailableSeq=b,this.name="RuntimeReplayGapError"}}class g extends Error{constructor(a,b){super(a),this.phase=b,this.name="StructuredCompactError"}}class h extends Error{constructor(a,b,c){super(a,c),this.host=b,this.name="StructuredHostAdoptionCleanupError"}}},91596:(a,b,c)=>{c.d(b,{I1:()=>A,IM:()=>z,P4:()=>V,wh:()=>Y});var d=c(77598),e=c.n(d),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(86850),k=c(22025),l=c(78966),m=c(32977),n=c(14509),o=c(29733),p=c(48892),q=c(91724),r=c(59683),s=c(25953),t=c(52649),u=c(83336),v=c(73789),w=c(98223),x=c(27471),y=c(8995);class z extends Error{constructor(){super("successor launch receipt is awaiting host settlement"),this.name="SuccessorPendingError"}}class A extends Error{constructor(a="Codex provider fork outcome is unknown"){super(a),this.name="CodexForkOutcomeUnknownError"}}let B={accounts:j.lD,startCodex:a=>k.zC.start({home:a}),claudeStatus:a=>m.kR.status(a),spawnClaude:(a,b)=>(0,x.Tk)(a,"",b),verifyClaudeHost:a=>(0,x.PB)(a),cancelClaude:a=>(0,x.xs)(a),now:()=>new Date().toISOString()};function C(a){return!0===a||"cancelled"===a||"absent"===a}function D(a){try{let b=JSON.parse(g().readFileSync(a,"utf8"));if(!Number.isInteger(b.pid)||!b.pid||b.pid<1)return Date.now()-g().statSync(a).mtimeMs>3e4;if(!r.B.pidAlive(b.pid))return!0;if("string"==typeof b.startIdentity){let a=r.B.processIdentity(b.pid);return null!==a&&a!==b.startIdentity}return Date.now()-g().statSync(a).mtimeMs>3e4}catch{try{return Date.now()-g().statSync(a).mtimeMs>3e4}catch{return!1}}}function E(a,b){try{JSON.parse(g().readFileSync(a,"utf8")).token===b&&g().rmSync(a,{force:!0})}catch{}}function F(a){let b=[],c=i().resolve(a);for(;!g().existsSync(c);){b.push(c);let a=i().dirname(c);if(a===c)break;c=a}for(let a of b.reverse()){try{g().mkdirSync(a,{mode:448})}catch(a){if("EEXIST"!==a.code)throw a}let b=g().openSync(i().dirname(a),"r");try{g().fsyncSync(b)}finally{g().closeSync(b)}let c=g().openSync(a,"r");try{g().fsyncSync(c)}finally{g().closeSync(c)}}}async function G(a){if(a.ownsOperation&&!await a.ownsOperation()||!(0,w.cM)())return async()=>{};let b=(0,p.ce)("codex",a.receipt.nativeId);if(!b)throw Error("successor Codex thread identity is invalid");if((0,v.sy)(b))return async()=>{await (0,v.releaseStructuredDeliveryHost)(b)};let c=a.registry.readOnlySnapshot().entries[(0,p.pp)(b)],d=a.registry.upsert({...c??{key:b,status:"unhosted",host:null,claimEpoch:0,claimOwner:null,pendingAction:null},key:b,artifactPath:a.receipt.path,cwd:a.profile.cwd,accountId:a.target.accountId,launchProfile:a.profile,structuredHostOperationId:a.receipt.operationId});d.structuredHost||a.registry.setStructuredHost(b,{kind:"codex-app-server",endpoint:"stdio:pending",process:null,eventCursor:0,protocolVersion:null,writerClaimEpoch:d.claimEpoch,activeTurnRef:null,pendingAttention:[],activeFlags:[]},"unhosted");let e={pid:process.pid,startIdentity:r.B.processIdentity(process.pid)},f=a.registry.claimStructuredHost(b,e,{allowUnhosted:!0});if(!f?.claimOwner)throw Error("successor Codex structured host claim is unavailable");let g=a.profile.permissionMode&&["never","on-request","untrusted"].includes(a.profile.permissionMode)?a.profile.permissionMode:void 0,h=null,i=()=>{},j=async()=>{};try{h=await t.o.adopt(a.receipt.nativeId,{cwd:a.profile.cwd,codexHome:a.target.home,fileAuthCredentials:"managed"===a.target.kind,model:a.profile.model??void 0,effort:a.profile.effort??void 0,sandbox:a.profile.readOnly?"read-only":void 0,approvalPolicy:g,initialEventCursor:f.structuredHost?.eventCursor,env:a.target.env}),i=await (0,w.WF)(a.registry,b,h,f.claimOwner,f.claimEpoch),j=await (0,v.xq)({key:b,host:h},a.ownsOperation)}catch(c){if(!h&&c instanceof u.EY&&c.host instanceof t.o)throw h=c.host,i=await (0,w.WF)(a.registry,b,h,f.claimOwner,f.claimEpoch,"dead"),await h.release(),i(),c;throw await j(),h&&await h.release(),i(),a.registry.releaseStructuredHostClaim(b,f.claimOwner,f.claimEpoch),c}let k=h;return async()=>{await j(),await k.release(),i()}}async function H(a){if(a.ownsOperation&&!await a.ownsOperation()||!(0,w.cM)())return async()=>{};let b=(0,p.ce)("claude",a.receipt.nativeId);if(!b)throw Error("successor Claude session identity is invalid");if((0,v.sy)(b))return async()=>{await (0,v.releaseStructuredDeliveryHost)(b)};(0,v.pr)();let c=a.registry.readOnlySnapshot().entries[(0,p.pp)(b)],d=a.registry.upsert({...c??{key:b,status:"unhosted",host:null,claimEpoch:0,claimOwner:null,pendingAction:null},key:b,artifactPath:a.receipt.path,cwd:a.profile.cwd,accountId:a.target.accountId,launchProfile:a.profile,structuredHostOperationId:a.receipt.operationId});d.structuredHost||a.registry.setStructuredHost(b,{kind:"claude-broker",endpoint:"stdio:pending",process:null,eventCursor:0,protocolVersion:null,writerClaimEpoch:d.claimEpoch,activeTurnRef:null,pendingAttention:[],activeFlags:[]},"unhosted");let e={pid:process.pid,startIdentity:r.B.processIdentity(process.pid)},f=a.registry.claimStructuredHost(b,e,{allowUnhosted:!0});if(!f?.claimOwner)throw Error("successor Claude structured host claim is unavailable");let g=null,h=()=>{},i=async()=>{};try{let c=X(a.receipt),d=await a.cancelClaude(c);if(!C(d))throw Error("successor Claude host transition is still pending");await (0,x.XW)(a.receipt.path,c),g=await s.s7.adopt(a.receipt.nativeId,{cwd:a.profile.cwd,claudeConfigDir:"managed"===a.target.kind?a.target.home:void 0,claudeProjectsDir:a.target.transcriptRoot,env:a.target.env,model:a.profile.model??void 0,effort:a.profile.effort??void 0,permissionMode:a.profile.permissionMode??void 0,initialEventCursor:f.structuredHost?.eventCursor}),h=await (0,w.n$)(a.registry,b,g,f.claimOwner,f.claimEpoch),i=await (0,v.xq)({key:b,host:g},a.ownsOperation)}catch(c){if(!g&&c instanceof u.EY&&c.host instanceof s.s7)throw g=c.host,h=await (0,w.n$)(a.registry,b,g,f.claimOwner,f.claimEpoch,"dead"),await g.release(),h(),c;throw await i(),g&&await g.release(),h(),a.registry.releaseStructuredHostClaim(b,f.claimOwner,f.claimEpoch),c}let j=g;return async()=>{await i(),await j.release(),h()}}async function I(){await new Promise(a=>setTimeout(a,5))}async function J(a,b,c){let d=O(a,b),f=`${d}.lock`,h=`${d}.locks`;F(a),F(h);let j={pid:process.pid,startIdentity:r.B.processIdentity(process.pid),token:e().randomUUID()},k=i().join(h,`${String(Date.now()).padStart(16,"0")}-${process.pid}-${j.token}.json`);g().writeFileSync(k,JSON.stringify(j),{encoding:"utf8",flag:"wx",mode:384});try{for(let a=0;a<24e3;a+=1){let a;try{g().utimesSync(k,new Date,new Date)}catch{}let b=[];for(let a of g().readdirSync(h).filter(a=>a.endsWith(".json")).sort()){let c=i().join(h,a);if(D(c)){g().rmSync(c,{force:!0});continue}g().existsSync(c)&&b.push(c)}if(b[0]!==k){await I();continue}try{a=g().openSync(f,"wx",384)}catch(a){if("EEXIST"!==a.code)throw a;D(f)&&g().rmSync(f,{force:!0}),await I();continue}g().writeFileSync(a,JSON.stringify(j),"utf8"),g().fsyncSync(a);let d=setInterval(()=>{try{let a=new Date;g().utimesSync(f,a,a),g().utimesSync(k,a,a)}catch{}},1e4);d.unref();try{return await c(()=>(function(a,b){try{if(JSON.parse(g().readFileSync(a,"utf8")).token===b)return}catch{}throw Error("Codex provider operation lease was lost")})(f,j.token))}finally{clearInterval(d),g().closeSync(a),E(f,j.token)}}throw Error("Codex provider operation is busy")}finally{E(k,j.token)}}function K(a){let b=null;try{let c=g().lstatSync(a);if(!c.isFile()||c.isSymbolicLink())return null;b=g().openSync(a,g().constants.O_RDONLY|(g().constants.O_NOFOLLOW??0));let d=Buffer.alloc(Math.min(262144,Math.max(1,c.size))),e=g().readSync(b,d,0,d.length,0);for(let a of d.subarray(0,e).toString("utf8").split("\n"))if(a.trim())try{let b=JSON.parse(a);if("session_meta"!==b.type||!b.payload||"object"!=typeof b.payload||Array.isArray(b.payload))continue;let c=b.payload;if("string"!=typeof c.id||!c.id)return null;return{id:c.id,forkedFromId:"string"==typeof c.forked_from_id&&c.forked_from_id?c.forked_from_id:null}}catch{}return null}catch{return null}finally{null!==b&&g().closeSync(b)}}function L(a,b,c,d=2e4){let e=[{dir:a,depth:0}],f=[],h=0;for(;e.length;){let j=e.pop();if(!(j.depth>6))for(let k of g().readdirSync(j.dir,{withFileTypes:!0})){let l=i().join(j.dir,k.name);if(k.isSymbolicLink())continue;if(k.isDirectory()){e.push({dir:l,depth:j.depth+1});continue}if(!k.isFile()||!k.name.endsWith(".jsonl"))continue;if(++h>d)return console.warn("[account-migration] Codex fork recovery scan hit its bound",{root:a,limit:d,found:f.length}),f;if(g().statSync(l).mtimeMs<c)continue;let m=K(l);m?.forkedFromId===b&&f.push({id:m.id,path:g().realpathSync(l)})}}return f}function M(a){try{let b=g().statSync(a);return b.isFile()?{size:b.size,mtimeMs:b.mtimeMs}:null}catch{return null}}function N(...a){let b=new Map;for(let c of a)for(let a of c)b.has(a.id)||b.set(a.id,a);return[...b.values()]}function O(a,b){return i().join(a,`${e().createHash("sha256").update(b).digest("hex")}.json`)}function P(a,b){g().mkdirSync(a,{recursive:!0,mode:448});let c=O(a,b.operationId),d=`${c}.${process.pid}.${e().randomUUID()}.tmp`;try{g().writeFileSync(d,JSON.stringify(b,null,2)+"\n",{mode:384,flag:"wx"});let e=g().openSync(d,"r");try{g().fsyncSync(e)}finally{g().closeSync(e)}g().renameSync(d,c);let f=g().openSync(a,"r");try{g().fsyncSync(f)}finally{g().closeSync(f)}}finally{g().rmSync(d,{force:!0})}}function Q(a){return a&&"object"==typeof a&&1===a.version&&"string"==typeof a.operationId&&"string"==typeof a.sourceNativeId&&"string"==typeof a.sourceRoot&&"string"==typeof a.targetRoot&&"number"==typeof a.createdAtMs&&Number.isFinite(a.createdAtMs)?{version:1,operationId:a.operationId,conversationId:"string"==typeof a.conversationId&&a.conversationId?a.conversationId:null,sourceNativeId:a.sourceNativeId,sourceRoot:a.sourceRoot,targetRoot:a.targetRoot,createdAtMs:a.createdAtMs,forkRecoveryFloorMs:"number"==typeof a.forkRecoveryFloorMs&&Number.isFinite(a.forkRecoveryFloorMs)?a.forkRecoveryFloorMs:"number"==typeof a.forkRequestedAtMs&&Number.isFinite(a.forkRequestedAtMs)?a.forkRequestedAtMs:null,forkRequestedAtMs:"number"==typeof a.forkRequestedAtMs&&Number.isFinite(a.forkRequestedAtMs)?a.forkRequestedAtMs:null,fork:a.fork&&"string"==typeof a.fork.id&&"string"==typeof a.fork.path?{id:a.fork.id,path:a.fork.path}:null,forkSource:a.forkSource&&"number"==typeof a.forkSource.size&&Number.isFinite(a.forkSource.size)&&"number"==typeof a.forkSource.mtimeMs&&Number.isFinite(a.forkSource.mtimeMs)?{size:a.forkSource.size,mtimeMs:a.forkSource.mtimeMs}:null,supersededForks:Array.isArray(a.supersededForks)?a.supersededForks.flatMap(a=>a&&"object"==typeof a&&"string"==typeof a.id&&"string"==typeof a.path?[{id:a.id,path:a.path}]:[]):[]}:null}function R(a){try{return g().statSync(a).mtimeMs}catch{return 0}}function S(a){return[...a].sort((a,b)=>R(b.path)-R(a.path)||b.path.localeCompare(a.path))}function T(a,b,c){let d=(0,y.Ux)(a.path,c),e=K(d.sourcePath);if(!i().basename(d.sourcePath).endsWith(`${a.id}.jsonl`)||e?.id!==a.id||e.forkedFromId!==b)throw new y.Bc("unsafe-source");return{id:a.id,path:d.sourcePath}}function U(a,b=L){if(a.fork)return{fork:T(a.fork,a.sourceNativeId,a.sourceRoot),forkSource:a.forkSource,superseded:[]};let c=a.forkRecoveryFloorMs??a.forkRequestedAtMs;if(null===c)return{fork:null,forkSource:null,superseded:[]};let d=new Set(a.supersededForks.map(a=>a.id)),e=S(b(a.sourceRoot,a.sourceNativeId,c).filter(a=>!d.has(a.id)).flatMap(b=>{try{return[T(b,a.sourceNativeId,a.sourceRoot)]}catch{return[]}}));return{fork:e[0]??null,forkSource:a.forkSource,superseded:e.slice(1)}}async function V(a,b,c=(0,q.BQ)("migration-provider-operations"),d=L){let e,f=O(c,a);try{e=Q(JSON.parse(g().readFileSync(f,"utf8")))}catch(a){if("ENOENT"===a.code)return"not-needed";throw a}if(!e||e.operationId!==a||e.conversationId&&e.conversationId!==b)throw Error("Codex provider operation journal does not match");return J(c,`move:${e.sourceNativeId}`,async e=>{let h=Q(JSON.parse(g().readFileSync(f,"utf8")));if(!h||h.operationId!==a||h.conversationId&&h.conversationId!==b)throw Error("Codex provider operation journal does not match");return h.fork||null===h.forkRequestedAtMs?"not-needed":U(h,d).fork?"recovery-ready":(h.forkRequestedAtMs=null,e(),P(c,h),"reauthorized")})}function W(a){let b=g().lstatSync(a.home);if(!b.isDirectory()||b.isSymbolicLink()||process.getuid&&b.uid!==process.getuid()||(18&b.mode)!=0)throw new y.IO("unsafe-home","target account home failed safety checks");if(i().dirname(i().resolve(a.transcriptRoot))!==i().resolve(a.home)&&!("claude"===a.engine&&function(a){try{return g().realpathSync(a)===g().realpathSync((0,l.o1)())}catch{return!1}}(a.transcriptRoot)))throw Error("target transcript root is outside its account home");try{g().mkdirSync(a.transcriptRoot,{mode:448})}catch(a){if("EEXIST"!==a.code)throw a}let c=g().lstatSync(a.transcriptRoot);if(!c.isDirectory()||c.isSymbolicLink()||process.getuid&&c.uid!==process.getuid()||(18&c.mode)!=0)throw Error("target transcript root failed safety checks")}function X(a){let b=function(a){if("claude-stream"!==a.host.kind)throw Error("successor Claude host identity is invalid");let b=/^(%[0-9]+):([1-9][0-9]*)$/.exec(a.host.identity);if(!b)throw Error("successor Claude host identity is invalid");return{paneId:b[1],panePid:Number(b[2])}}(a),c=a.host.tmuxHost;if(!c||"tmux"!==c.kind||c.paneId!==b.paneId||c.panePid.pid!==b.panePid)throw Error("successor Claude host identity is invalid");return c}class Y{constructor(a=B){this.dependencies=a,this.publishedHosts=new Map,this.publishingHosts=new Map}async create(a){let b=this.dependencies.accounts.resolveSpawn(a.engine,a.targetAccountId),c=function(a,b,c){if(!a||a.engine!==b.engine)throw Error("source account ownership is unavailable");return(0,y.Ux)(c,a.transcriptRoot),a}(this.dependencies.accounts.resolveTranscriptOwner(a.engine,a.source.path),b,a.source.path);return W(b),"codex"===a.engine?this.createCodex(a.operationId,a.conversationId,a.source.id,a.source.path,a.source.launchProfile,c,b,a.recordContinuityPath):this.createClaude(a.operationId,a.conversationId,a.source.path,a.source.launchProfile,c,b,a.recordContinuityPath)}async verify(a,b){let c=this.dependencies.accounts.resolveSpawn(b.engine,b.targetAccountId);if(W(c),"claude"===b.engine){if(!(await this.dependencies.claudeStatus(c.home)).loggedIn)throw new y.IO("not-authenticated","target Claude account is not authenticated");if(!a.path.startsWith(c.transcriptRoot+i().sep))throw Error("target Claude history is outside its registered root");if(i().basename(a.path,".jsonl")!==a.nativeId)throw Error("target Claude transcript identity does not match");if(!g().existsSync(a.path)||0===(0,y.z4)(a.path,c.transcriptRoot).size)throw Error("target Claude successor transcript is not durable");if(!g().readFileSync(a.path,"utf8").split("\n").some(b=>{try{let c=JSON.parse(b);return c.sessionId===a.nativeId||c.session_id===a.nativeId}catch{return!1}}))throw Error("target Claude transcript session identity does not match");let b=X(a),d=this.dependencies.registry??(0,o.agentRegistry)();if(!("claude-migration-successor"===b.windowName&&await this.dependencies.verifyClaudeHost?.(b))&&!function(a,b,c){let d=(0,p.ce)("claude",b.nativeId);if(!d)return!1;let e=a.readOnlySnapshot().entries[(0,p.pp)(d)];return e?.structuredHostOperationId===b.operationId&&e.artifactPath===b.path&&e.accountId===c.accountId&&e.structuredHost?.kind==="claude-broker"&&"stdio:pending"!==e.structuredHost.endpoint&&null!==e.structuredHost.protocolVersion}(d,a,c))throw Error("target Claude successor host is not live and canonical");return}let d=await this.dependencies.startCodex(c.home);try{if(!(await d.readAccount()).account)throw new y.IO("not-authenticated","target Codex account is not authenticated");if((await d.readThread(a.nativeId)).id!==a.nativeId)throw Error("target Codex thread identity does not match")}finally{d.close()}}async publishHost(a,b){if(b.ownsOperation&&!await b.ownsOperation())return;let c="codex"===b.engine?this.dependencies.publishCodexHost:this.dependencies.publishClaudeHost;if(!c&&!(0,w.cM)())return;let d=this.publishedHosts.get(a.operationId);if(d){if(d.nativeId!==a.nativeId||d.path!==a.path)throw Error("successor host publication conflicts");return}let e=this.publishingHosts.get(a.operationId);if(e){await e;let b=this.publishedHosts.get(a.operationId);if(!b||b.nativeId!==a.nativeId||b.path!==a.path)throw Error("successor host publication conflicts");return}let f=(async()=>{let d,e={receipt:a,target:this.dependencies.accounts.resolveSpawn(b.engine,b.targetAccountId),profile:b.launchProfile,registry:this.dependencies.registry??(0,o.agentRegistry)(),ownsOperation:b.ownsOperation};(d="codex"===b.engine?await (c??G)(e):c?await c(e):await H({...e,cancelClaude:this.dependencies.cancelClaude??B.cancelClaude}),b.ownsOperation&&!await b.ownsOperation())?await d():this.publishedHosts.set(a.operationId,{nativeId:a.nativeId,path:a.path,cleanup:d})})();this.publishingHosts.set(a.operationId,f);try{await f}finally{this.publishingHosts.get(a.operationId)===f&&this.publishingHosts.delete(a.operationId)}}async cleanup(a){let b=this.publishedHosts.get(a.operationId);if(b&&b.nativeId===a.nativeId&&b.path===a.path){await b.cleanup(),this.publishedHosts.delete(a.operationId);return}let c="codex-app-server"===a.host.kind?(0,p.ce)("codex",a.nativeId):"claude-stream"===a.host.kind?(0,p.ce)("claude",a.nativeId):null;if(c&&await (0,v.releaseStructuredDeliveryHost)(c)||"codex-app-server"===a.host.kind||"claude-stream"!==a.host.kind)return;let d=X(a);if(!C(await this.dependencies.cancelClaude?.(d)))throw Error("successor Claude host cleanup is still pending");await (0,x.XW)(a.path,d)}async createClaude(a,b,c,d,e,f,g){return J(this.dependencies.claudeJournalRoot??(0,q.BQ)("migration-provider-claude-operations"),a,h=>this.createClaudeLocked(a,b,c,d,e,f,g,h))}async createClaudeLocked(a,b,c,d,f,h,j,k){let l;if(!(await this.dependencies.claudeStatus(h.home)).loggedIn)throw new y.IO("not-authenticated","target Claude account is not authenticated");let m=(0,y.z4)(c,f.transcriptRoot),p=function(a){if(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(a))return a;let b=Buffer.from(e().createHash("sha256").update(a).digest().subarray(0,16));b[6]=15&b[6]|64,b[8]=63&b[8]|128;let c=b.toString("hex");return`${c.slice(0,8)}-${c.slice(8,12)}-${c.slice(12,16)}-${c.slice(16,20)}-${c.slice(20)}`}(a),q=(0,n.HI)({sourcePath:c,candidateId:p,targetHome:h.home,targetProjectsDir:h.transcriptRoot,profile:d}),r=q.transcript??i().join(h.transcriptRoot,`${p}.jsonl`),s=this.dependencies.registry??(0,o.agentRegistry)(),t=async(a,b)=>{try{j(r)}catch(c){s.preserveSpawnArtifactOwnership(a,"migration continuity persistence failed");try{let a=await this.dependencies.cancelClaude?.(b);C(a)&&await (0,x.XW)(r,b)}catch{}throw c}},u=e().createHash("sha256").update(JSON.stringify({operationId:a,conversationId:b,target:h.accountId,nativeId:p})).digest("hex"),v=s.beginSpawnRequest({engine:"claude",cwd:d.cwd,launchProfile:d,clientAttemptId:`migration-successor:${a}`,requestDigest:u,accountId:h.accountId,conversationId:b,purpose:"migration-successor",origin:{kind:"successor"},expectedArtifactPath:r});if("conflict"===v.kind)throw Error("successor Claude operation receipt conflicts");let w=v.receipt;if("replay"===v.kind){if("failed"===w.state||"conflicted"===w.state)throw Error("successor Claude operation receipt is terminal");let b=w.verifiedHost;if(b){if(!await this.dependencies.verifyClaudeHost?.(b))throw Error("successor Claude operation has no recoverable live host");return await t(w.launchId,b),{operationId:a,nativeId:p,path:r,continuityPaths:[r],historyHash:m.hash,host:{kind:"claude-stream",identity:`${b.paneId}:${b.panePid.pid}`,epoch:1,verifiedAt:this.dependencies.now(),tmuxHost:b}}}if("starting"!==w.state||w.pane||g().existsSync(r))throw new z}else this.dependencies.afterClaudeReceiptCreated?.();k();try{l=await this.dependencies.spawnClaude(q,w)}catch(a){throw s.failSpawn(w.launchId,a instanceof Error?a.message:String(a)),a}if(!l.host||void 0===l.panePid||l.host.paneId!==l.paneId||l.host.panePid.pid!==l.panePid)throw s.failSpawn(w.launchId,"successor Claude host evidence is unavailable"),Error("successor Claude host evidence is unavailable");let A=async a=>{if("failed"===a.state||"conflicted"===a.state){try{await this.dependencies.cancelClaude?.(l.host)}catch{}throw Error("successor Claude operation receipt became terminal")}},B=s.bindSpawnPane(w.launchId,{endpoint:l.host.endpoint,server:l.host.server,paneId:l.host.paneId,panePid:l.host.panePid,target:l.host.paneId});await A(B);let D=s.markSpawnHostVerified(w.launchId,l.host);await A(D);let E=s.markSpawnPromptDelivered(w.launchId);return await A(E),await t(w.launchId,l.host),k(),this.dependencies.afterClaudeSpawned?.(),{operationId:a,nativeId:p,path:r,continuityPaths:[r],historyHash:m.hash,host:{kind:"claude-stream",identity:`${l.paneId}:${l.panePid}`,epoch:1,verifiedAt:this.dependencies.now(),tmuxHost:l.host}}}async createCodex(a,b,c,d,e,f,g,h){let i=this.dependencies.journalRoot??(0,q.BQ)("migration-provider-operations");return J(i,`move:${c}`,j=>this.createCodexLocked(a,b,c,d,e,f,g,h,i,j))}async createCodexLocked(a,b,c,d,e,f,h,j,l,m){var n,o;let p=function(a,b,c,d,e,f){let h=O(a,b);try{let a=Q(JSON.parse(g().readFileSync(h,"utf8")));if(!a||a.operationId!==b||a.sourceNativeId!==d||a.sourceRoot!==e||a.targetRoot!==f)throw Error("Codex provider operation journal does not match");return{journal:{...a,conversationId:a.conversationId??c},fresh:!1}}catch(a){if("ENOENT"!==a.code)throw a}let i={version:1,operationId:b,conversationId:c,sourceNativeId:d,sourceRoot:e,targetRoot:f,createdAtMs:Date.now(),forkRecoveryFloorMs:null,forkRequestedAtMs:null,fork:null,forkSource:null,supersededForks:[]};return P(a,i),{journal:i,fresh:!0}}(l,a,b,c,g().realpathSync(f.transcriptRoot),g().realpathSync(h.transcriptRoot)),q=p.journal,r=[],s=null,t=null,u=[];if(!p.fresh){let a=U(q,this.dependencies.scanCodexForkArtifacts);s=a.fork,t=a.forkSource,u=a.superseded}if(!s&&null===q.forkRequestedAtMs){let a=function(a,b,c=L){let d=function(a,b){let c;try{c=g().readdirSync(a)}catch{return[]}let d=[];for(let e of c){if(!e.endsWith(".json"))continue;let c=null;try{c=Q(JSON.parse(g().readFileSync(i().join(a,e),"utf8")))}catch{continue}if(c&&c.operationId!==b.operationId&&c.sourceNativeId===b.sourceNativeId&&c.sourceRoot===b.sourceRoot&&c.targetRoot===b.targetRoot&&(!c.conversationId||!b.conversationId||c.conversationId===b.conversationId)){if(!c.conversationId&&b.conversationId&&i().join(a,e)===O(a,c.operationId)){let d={...c,conversationId:b.conversationId};try{P(a,d),c=d}catch{}}d.push(c)}}return d}(a,b);if(0===d.length)return{fork:null,forkSource:null,superseded:[],operationIds:[]};let e=Math.min(...d.map(a=>a.forkRequestedAtMs??a.createdAtMs)),f=new Map,h=new Map;for(let a of d)a.fork&&(f.set(a.fork.id,a.fork),a.forkSource&&h.set(a.fork.id,a.forkSource));for(let a of c(b.sourceRoot,b.sourceNativeId,e))f.set(a.id,a);for(let a of b.supersededForks)f.delete(a.id);let j=S([...f.values()].flatMap(a=>{try{return[T(a,b.sourceNativeId,b.sourceRoot)]}catch{return[]}})),k=j[0]??null;return{fork:k,forkSource:k?h.get(k.id)??null:null,superseded:j.slice(1),operationIds:d.map(a=>a.operationId)}}(l,q,this.dependencies.scanCodexForkArtifacts);s=a.fork,t=a.forkSource,u=a.superseded,s&&(r=a.operationIds)}let v=!1;if(s&&(n=M(d),o=t,n&&(!o||n.size!==o.size||n.mtimeMs!==o.mtimeMs))&&(q.supersededForks=N(q.supersededForks,[s],u),q.fork=null,q.forkSource=null,q.forkRequestedAtMs=null,m(),P(l,q),s=null,t=null,u=[],r=[],v=!0),s&&(!q.fork||u.length>0)&&(q.fork=s,q.forkSource=t,q.supersededForks=N(q.supersededForks,u),m(),P(l,q)),!s&&!v&&!p.fresh&&null!==q.forkRequestedAtMs)throw new A;if(!s){let a,b=await this.dependencies.startCodex(f.home);try{if(!(await b.readAccount()).account)throw Error("source Codex account is not authenticated");q.forkRequestedAtMs=Date.now(),q.forkRecoveryFloorMs??=q.forkRequestedAtMs,q.forkSource=M(d),m(),P(l,q);try{a=await b.forkThread(c)}catch(a){if(a instanceof k.yj&&"unknown"===a.outcome)throw new A(a.message);throw q.forkRequestedAtMs=null,q.forkSource=null,m(),P(l,q),a}this.dependencies.afterCodexForkReturned?.()}finally{b.close()}let e=a.path??function(a,b){let c=[{dir:a,depth:0}],d=0;for(;c.length;){let a=c.pop();if(!(a.depth>6))for(let e of g().readdirSync(a.dir,{withFileTypes:!0})){if(++d>2e4)throw Error("forked Codex history was not found within the scan bound");let f=i().join(a.dir,e.name);if(!e.isSymbolicLink()){if(e.isDirectory())c.push({dir:f,depth:a.depth+1});else if(e.isFile()&&e.name.endsWith(`${b}.jsonl`))return f}}}throw Error("forked Codex history was not found")}(f.transcriptRoot,a.id);q.fork=s=T({id:a.id,path:e},c,f.transcriptRoot),m(),P(l,q),this.dependencies.afterCodexForkCreated?.()}let w=s,x=N(q.supersededForks,u).filter(a=>a.id!==w.id).flatMap(a=>{try{return[T(a,c,f.transcriptRoot)]}catch{return[]}}),z=w.path;for(let a of(j(z),x))j(a.path);let B=i().relative(f.transcriptRoot,z);m();let C=(0,y.PM)({sourcePath:z,sourceRoot:f.transcriptRoot,targetRoot:h.transcriptRoot,destinationRelative:B,operationId:a,priorOperationIds:r,afterDestinationPublished:this.dependencies.afterCodexCopyPublished});j(C.path);let D=await this.dependencies.startCodex(h.home);try{if(!(await D.readAccount()).account)throw new y.IO("not-authenticated","target Codex account is not authenticated");m();let a=e.permissionMode&&["never","on-request","untrusted"].includes(e.permissionMode)?e.permissionMode:null;if((await D.resumeThread(s.id,{path:C.path,cwd:e.cwd,model:e.model,effort:e.effort,fast:e.fast,approvalPolicy:a,sandbox:e.readOnly?"read-only":null})).id!==s.id)throw Error("target Codex resume returned another thread");if(e.title&&await D.setThreadName(s.id,e.title),e.goal?.objective&&await D.setThreadGoal(s.id,e.goal.objective,e.goal.status),(await D.readThread(s.id)).id!==s.id)throw Error("target Codex history verification failed")}finally{D.close()}return{operationId:a,nativeId:s.id,path:C.path,continuityPaths:[z,C.path],historyHash:C.hash,host:{kind:"codex-app-server",identity:s.id,epoch:1,verifiedAt:this.dependencies.now()}}}}},93012:(a,b,c)=>{c.d(b,{p:()=>g});var d=c(32372),e=c(41022);function f(a,b){return{images:[],error:{error:a,status:b}}}function g(a){let b;if(void 0!==a.images){if(!Array.isArray(a.images))return f("images must be an array",400);b=a.images}else if(void 0!==a.image){if(!a.image||"object"!=typeof a.image||Array.isArray(a.image))return f("invalid image",400);b=[a.image]}else b=[];if(b.length>d.sP)return f(`too many images (${d.sP} limit)`,413);let c=[],g=0,h=0;for(let a of b){if(!a||"object"!=typeof a||Array.isArray(a)||"string"!=typeof a.base64||"string"!=typeof a.mime)return f("invalid image",400);if((g+=Buffer.byteLength(a.base64))>d.u1)return f("runtime image request encoding is too large",413);let b=function(a){if(!a||a.length%4!=0||!/^[A-Za-z0-9+/]+={0,2}$/.test(a))return null;let b=Buffer.from(a,"base64");return b.length>0&&b.toString("base64")===a?b:null}(a.base64);if(!b)return f("runtime image base64 is invalid",400);let i=(0,e.CC)(a.mime);if(!i)return f("unsupported image type",415);if(b.byteLength>d.DO)return f("image is too large (10 MB limit)",413);if(!(0,d.G)(b,i))return f("runtime image signature does not match MIME",415);if((h+=b.byteLength)>d.ON)return f("runtime image request is too large",413);c.push({base64:a.base64,mime:i})}return{images:c,error:null}}},94292:(a,b,c)=>{c.r(b),c.d(b,{recoverDeadStructuredConversation:()=>t,structuredHostProcessAlive:()=>o});var d=c(86850),e=c(74382),f=c(81533),g=c(29733),h=c(48892),i=c(59683),j=c(3127),k=c(98223),l=c(45656),m=c(43384);class n extends Error{constructor(){super("structured recovery operation is superseded"),this.name="StructuredRecoverySupersededError"}}function o(a){return!!a&&!!Number.isInteger(a.pid)&&!(a.pid<=0)&&!!i.B.pidAlive(a.pid)&&(null===a.startIdentity||i.B.processIdentity(a.pid)===a.startIdentity)}let p=globalThis,q=p.__llvStructuredRecovery??=new Map;function r(a,b,c=!1){let d=b.conversationId?.startsWith("conversation_")?a.conversation(b.conversationId):a.conversationForPath(b.path),f=d?.generations.at(-1);if(!d||!f)return null;let g={engine:d.engine,sessionId:f.id},i=a.readOnlySnapshot(),j=i.entries[(0,h.pp)(g)];if(j?.host)return null;let k=j?.status==="dead"||j?.status==="unhosted",l=!!(o(j?.structuredHost?.process??null)&&j?.claimOwner&&null===j.pendingAction&&!k),m=(0,e.Ui)(c?{...j?.launchProfile??{},...f.launchProfile,cwd:f.launchProfile.cwd||j?.launchProfile?.cwd||j?.cwd}:{...f.launchProfile,...j?.launchProfile??{},cwd:j?.launchProfile?.cwd||f.launchProfile.cwd||j?.cwd}),n=i.lineageEdges[d.id]?.parentConversationId??m.parentConversationId,p=n&&n!==d.id?a.canonicalConversationId(n):null;return{conversationId:d.id,engine:d.engine,key:g,path:f.path,accountId:f.accountId??j?.accountId??null,parentConversationId:p===d.id?null:p,spec:{command:"",cwd:m.cwd,windowName:"structured-resume",engine:d.engine,transcript:f.path,launchProfile:m},publishReady:l}}async function s(a,b,c,e){let g=b.ownership,h=async()=>{if(g&&!await g.owns())throw new n},m=(b.processIdentity??(()=>({pid:process.pid,startIdentity:i.B.processIdentity(process.pid)})))();return c.withOperationLock(e.key,m,async()=>{await h();let e=r(c,a,!!g);if(!e||!e.publishReady&&((0,k.DQ)(c,e.conversationId,e.key),!(e=r(c,a,!!g))))return null;if(e.publishReady){if(!g)return{target:null,path:e.path,conversationId:e.conversationId,spawned:!1};if(await g.releaseHost(e.key),await h(),c.terminateStructuredHost(e.key),await h(),!(e=r(c,a,!0)))return null}let i=void 0===b.client?(0,j.sS)():b.client;if(!i)throw Error("structured recovery runtime host is unavailable");let m=(b.resolveAccount??d.lD.resolveSpawn)(e.engine,e.accountId),n=c.beginSpawnRequest({engine:e.engine,cwd:e.spec.cwd,transport:"structured",accountId:m.accountId,conversationId:e.conversationId,parentConversationId:e.parentConversationId,purpose:"resume-successor",origin:{kind:"successor"},expectedArtifactPath:e.path,launchProfile:e.spec.launchProfile});if("created"!==n.kind)throw Error("structured recovery reservation is unavailable");try{await h()}catch(a){throw c.failSpawn(n.receipt.launchId,"structured recovery operation was superseded"),a}let o=await (b.spawn??l.sh)({engine:e.engine,receipt:n.receipt,spec:e.spec,account:m,prompt:"",registry:c,client:i});if(!o.ok||!o.path)throw Error("structured recovery host did not publish its transcript");try{await h()}catch(a){throw await g?.releaseHost(e.key),c.terminateStructuredHost(e.key),a}return(b.requestDeliveryDrain??f.U)(),{target:null,path:o.path,conversationId:e.conversationId,spawned:!0}})}async function t(a,b={}){if("structured"!==(b.transport??m.l)())return null;let c=b.registry??(0,g.agentRegistry)();if(b.ownership&&!await b.ownership.owns())throw new n;let d=r(c,a,!!b.ownership);if(!d)return null;let e=b.ownership?`${c.filename}:${d.conversationId}:${b.ownership.operationId}:${b.ownership.revision}`:`${c.filename}:${d.conversationId}`,f=q.get(e);if(f)return f;if(d.publishReady&&!b.ownership)return{target:null,path:d.path,conversationId:d.conversationId,spawned:!1};let h=s(a,b,c,d);q.set(e,h);try{return await h}finally{q.get(e)===h&&q.delete(e)}}},94777:(a,b,c)=>{c.d(b,{PD:()=>i,UE:()=>h,xE:()=>g});var d=c(50201);let e=process;function f(){return{state:"pending",phase:"waiting for structured startup",completedHosts:0,totalHosts:null,updatedAt:new Date().toISOString()}}function g(){e.__llvStructuredHostStartupFailed=!1;var a={...e.__llvStructuredHostStartupProgress??f(),phase:"ready"};if(!Number.isSafeInteger(a.completedHosts)||a.completedHosts<0)throw Error("structured host startup completed count is invalid");if(null!==a.totalHosts&&(!Number.isSafeInteger(a.totalHosts)||a.totalHosts<a.completedHosts))throw Error("structured host startup total count is invalid");e.__llvStructuredHostStartupProgress={...a,state:"ready",updatedAt:new Date().toISOString()}}function h(a=process.env){if(!(0,d.cM)(a))return null;let b=e.__llvStructuredHostStartupFailed;return void 0===b?"pending":b?"failed":"ready"}function i(a=process.env){return(0,d.cM)(a)?{...e.__llvStructuredHostStartupProgress??f()}:null}},94896:(a,b,c)=>{c.d(b,{FK:()=>j,bs:()=>l,eX:()=>i});var d=c(73024),e=c.n(d),f=c(29733),g=c(48892),h=c(89333);class i extends Error{constructor(a,b){super(a),this.status=b,this.name="SpawnParentError"}}function j(a){let b,c;try{b=e().realpathSync(a),c=e().statSync(b)}catch{return!1}return!!c.isFile()&&!!b.endsWith(".jsonl")&&(!!(0,h.Ps)(b)||!!(0,h.Bz)(b))}function k(a,b=(0,f.agentRegistry)()){let c;if(void 0!==a.parentConversationId){if("string"!=typeof a.parentConversationId||!/^conversation_[0-9a-f-]{36}$/i.test(a.parentConversationId))throw new i("parentConversationId is invalid",400);let c=b.conversation(a.parentConversationId);if(!c)throw new i("parent conversation is unknown",404);let d=c.generations.at(-1)?.path;if(!d)throw new i("parent conversation has no active generation",409);return{conversationId:c.id,engine:c.engine,artifactPath:d,sessionKey:(0,g.sz)(c.engine,d)}}let d="string"==typeof a.parent?a.parent:"string"==typeof a.src?a.src:"";if(!d||!j(d))return null;let e=(0,h.Ps)(d)?"codex":"claude";return{conversationId:(c=b.conversationForPath(d))?c.id:b.ensureConversation((0,h.Ps)(d)?"codex":"claude",d,null).id,engine:e,artifactPath:d,sessionKey:(0,g.sz)(e,d)}}function l(a,b=(0,f.agentRegistry)()){if("reviewer"!==a.role){if(void 0!==a.reviews)throw new i("reviews requires role: reviewer",400);return{parent:k(a,b),reviewed:null}}if("string"!=typeof a.reviews||!a.reviews.trim())throw new i("reviewer requires reviews",400);let c=a.reviews.trim(),d=c.startsWith("conversation_")?k({parentConversationId:c},b):k({parent:c},b);if(!d)throw new i("reviewed conversation is invalid",400);let e=void 0!==a.parentConversationId||void 0!==a.parent||void 0!==a.src?k(a,b):d;if(!e)throw new i("reviewer caller is invalid",400);return{parent:e,reviewed:d}}},98223:(a,b,c)=>{c.d(b,{DQ:()=>l,WF:()=>j,cM:()=>e.cM,n$:()=>k});var d=c(48892);c(59683),c(52649),c(25953),c(83336);var e=c(50201);function f(a,b){return{kind:"codex-app-server",endpoint:a.endpoint,process:null===a.pid?null:{pid:a.pid,startIdentity:a.processStartIdentity},eventCursor:a.eventCursor,protocolVersion:a.protocolVersion,writerClaimEpoch:b,activeTurnRef:a.activeTurnRef,pendingAttention:a.pendingAttention,activeFlags:a.activeFlags}}function g(a,b){return{kind:"claude-broker",endpoint:a.endpoint,process:null===a.pid?null:{pid:a.pid,startIdentity:a.processStartIdentity},eventCursor:a.eventCursor,protocolVersion:a.protocolVersion,writerClaimEpoch:b,activeTurnRef:a.activeTurnRef,pendingAttention:a.pendingAttention,activeFlags:a.activeFlags}}function h(a,b){return a.length===b.length&&a.every((a,c)=>a===b[c])}async function i(a,b,c,d,e,f,g,i){let j;c.setWriterFence(()=>a.ownsStructuredHostClaim(b,d,e));let k=(c,h=!1)=>{let i=g(c,e),k=a.setStructuredHostClaimed(b,h&&"unhosted"===c.status?{...i,process:null}:i,h&&"dead"===f?"dead":"active"===c.status||"attention"===c.status?"live":"idle"===c.status?"idle":"unhosted"===c.status?"unhosted":"dead",d,e,h);if(!k)throw Error("structured host writer claim is stale");return j=structuredClone(c),k};try{k(await c.health())}catch(a){throw await c.release(),a}let l=Number.isFinite(i.cursorDebounceMs)?Math.max(0,i.cursorDebounceMs):3e4,m=!1,n=!1,o=!1,p=null,q=null,r=()=>{},s=()=>{null!==q&&(clearTimeout(q),q=null)},t=()=>{o||(o=!0,a.releaseStructuredHostClaim(b,d,e))},u=()=>{m||(m=!0,n=!0,p=null,s(),r(),t(),c.release())},v=()=>{let a=p;p=null,s(),a&&k(a)};return r=c.onStateChange(a=>{var b;if(m||n)return;let c="unhosted"===a.status||"dead"===a.status&&null===a.pid;if(!c&&(b=j).status===a.status&&b.endpoint===a.endpoint&&b.pid===a.pid&&b.processStartIdentity===a.processStartIdentity&&b.protocolVersion===a.protocolVersion&&b.activeTurnRef===a.activeTurnRef&&h(b.pendingAttention,a.pendingAttention)&&h(b.activeFlags,a.activeFlags)){p=structuredClone(a),null===q&&(q=setTimeout(()=>{if(q=null,!m&&!n&&null!==p)try{v()}catch{u()}},l),q.unref?.());return}p=null,s();try{k(a,c),c&&(o=!0,n=!0,r())}catch{u()}}),n&&r(),()=>{if(!n){try{v()}catch{u();return}n=!0,r(),t()}}}async function j(a,b,c,d,e,g="unhosted",h={}){return i(a,b,c,d,e,g,f,h)}async function k(a,b,c,d,e,f="unhosted",h={}){return i(a,b,c,d,e,f,g,h)}function l(a,b,c){let e=a.readOnlySnapshot().entries[(0,d.pp)(c)],f=e?.structuredHost?.process;return!!e&&!!f&&!!a.terminateInactiveStructuredHost(b,c,{process:f,claimEpoch:e.claimEpoch})}},99463:(a,b,c)=>{c.d(b,{F_:()=>aX,u_:()=>bF,a3:()=>bG,Cz:()=>bO,jA:()=>bN,RO:()=>aV,UA:()=>a2,n6:()=>bp});var d=c(77598),e=c.n(d),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(86850),k=c(78966),l=c(74382),m=c(14509),n=c(29733),o=c(12770),p=c(94896),q=c(48892),r=c(16089),s=c(77513),t=c(5425),u=c(98590),v=c(26474),w=c(2159),x=c(3127),y=c(48161),z=c.n(y),A=c(56809);let B=/(?:%2[Ff][A-Za-z0-9._+-]+){2,}/g,C=["home","Users","root"],D=RegExp(`-(?:${C.join("|")})(?:-[A-Za-z0-9._+]+)+`,"g"),E=RegExp(`(?<![\\w.-])\\/(?:${C.join("|")})(?:\\/[A-Za-z0-9._-]+)?`,"g"),F=/(?<![\w:/~.%-])\/[A-Za-z0-9._+-]+(?:\/[A-Za-z0-9._+-]+)+/g,G=/(?<![\w.+-])[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g;function H(a){let b=a.split("/").filter(Boolean).at(-1);return b?`…/${b}`:"…"}function I(a,b){let c,d,e=(c=z().homedir(),d=(d=(d=(d=(0,A.j)(a)).replace(G,"[redacted-email]")).replace(B,"…")).replace(D,"…"),c&&"/"!==c&&(d=d.split(c).join("~")),d=(d=d.replace(E,"~")).replace(F,H)).trim();return e.length<=b?e:`${e.slice(0,b-1).trimEnd()}…`}var J=c(23261),K=c(45656),L=c(70107),M=c(21153),N=c(89333),O=c(27359),P=c(27471),Q=c(25123),R=c(77149),S=c(49113),T=c(23855);async function U(a,b){let c=await (0,T.mR)(b);if("complete"!==c.integrity)return null;let d="codex"===a,e=(0,S.j)(c.records,d),f=0;try{f=g().statSync(b).mtimeMs}catch{}let h=(0,t.uc)(c.records,d?"codex-sessions":"claude-projects",f);return{turn:"terminal"===e.state?"terminal":"busy"===e.state?"busy":"unknown",message:h}}function V(a,b){return{ok:!1,error:`${a}: ${(b.stderr||b.stdout||"no output").trim()}`}}function W(a){return/^[A-Za-z0-9][A-Za-z0-9._/-]{0,254}$/.test(a)&&!a.includes("..")&&!a.includes("//")&&!a.includes("@{")&&!a.endsWith("/")&&!a.endsWith(".")&&!a.endsWith(".lock")}function X(a,b,c){let d=b.baseBranch?.trim()||"main";if(!W(d))return{ok:!1,error:"the pipeline base branch is invalid"};let e=b.baseRef?.trim();if(!e){let b=c("git",["fetch","--no-tags","origin",`+refs/heads/${d}:refs/remotes/origin/${d}`],a);if(0!==b.code)return V(`fetching origin/${d}`,b)}let f=e||`origin/${d}`,g=c("git",["rev-parse","--verify","--end-of-options",`${f}^{commit}`],a);if(0!==g.code)return V(`resolving pipeline base ${f}`,g);let h=g.stdout.trim();return/^[0-9a-f]{40}$/i.test(h)?{ok:!0,baseBranch:d,baseRef:h}:{ok:!1,error:`resolving pipeline base ${f}: expected an exact commit SHA`}}function Y(a,b){if(!a.lastPassedCommit)return{ok:!1,error:"the pipeline has no passed-stage commit"};let c=b("git",["reset","--hard",a.lastPassedCommit],a.worktreeDir);if(0!==c.code)return V("resetting the pipeline stage",c);let d=b("git",["clean","-fd"],a.worktreeDir);return 0!==d.code?V("cleaning the pipeline stage",d):{ok:!0,sha:a.lastPassedCommit}}function Z(a,b){if(!W(a.branch))return{ok:!1,error:"the pipeline branch is invalid"};let c=b("git",["status","--porcelain"],a.worktreeDir);if(0!==c.code)return V("checking the pipeline worktree",c);if(c.stdout.trim())return{ok:!1,error:"the pipeline worktree has uncommitted changes; choose whether to commit or discard them before retrying review"};let d=b("git",["branch","--show-current"],a.worktreeDir);if(0!==d.code)return V("checking the pipeline branch",d);if(d.stdout.trim()!==a.branch)return{ok:!1,error:"the pipeline worktree is not checked out on its persisted branch"};let e=b("git",["rev-parse","HEAD"],a.worktreeDir);if(0!==e.code)return V("resolving the pipeline branch HEAD",e);let f=e.stdout.trim();return/^[0-9a-f]{40}$/i.test(f)?{ok:!0,sha:f}:{ok:!1,error:"resolving the pipeline branch HEAD: expected an exact commit SHA"}}function $(a,b,c){let d=b("timeout",["--signal=KILL","5s","git","ls-remote","--heads","origin",`refs/heads/${a.branch}`],a.worktreeDir);return 0===d.code?{ok:!0,sha:d.stdout.trim().split(/\s+/)[0]??""}:124===d.code||137===d.code?{ok:!1,error:`${c}: git remote read timed out after 5s`}:V(c,d)}function _(a,b,c){let d=c.acceptedSha;if(!/^[0-9a-f]{40}$/i.test(d))return{ok:!1,error:`the accepted pipeline revision is not an exact commit SHA: ${d||"absent"}`};let e=Z(a,b);if(!e.ok)return e;if(e.sha!==d)return{ok:!1,error:`the pipeline worktree is at ${e.sha}, not the accepted revision ${d}; nothing was published`};if(c.publishedSha&&c.publishedSha===d)return{ok:!0,sha:d,remote:"published"};let f=b("git",["remote","get-url","origin"],a.worktreeDir);if(0!==f.code||!f.stdout.trim())return{ok:!0,sha:d,remote:"unavailable"};let g=$(a,b,"checking the remote pipeline branch");if(!g.ok)return{ok:!0,sha:d,remote:"unreachable",detail:g.error};let h=g.sha;if(h===d)return{ok:!0,sha:d,remote:"published"};if(h){if(!/^[0-9a-f]{40}$/i.test(h))return{ok:!1,error:"the remote pipeline branch has no exact commit SHA"};if(0!==b("git",["cat-file","-e",`${h}^{commit}`],a.worktreeDir).code){let c=b("git",["fetch","--no-tags","origin",`+refs/heads/${a.branch}:refs/remotes/origin/${a.branch}`],a.worktreeDir);if(0!==c.code)return V("fetching the remote pipeline branch",c)}let c=b("git",["merge-base","--is-ancestor",h,d],a.worktreeDir);if(1===c.code)return{ok:!1,error:"the local and remote pipeline branches diverged; choose which revision to publish before the review stage can start"};if(0!==c.code)return V("comparing local and remote pipeline revisions",c)}let i=b("git",["push","origin",`${d}:refs/heads/${a.branch}`],a.worktreeDir);if(0!==i.code)return V("publishing the pipeline branch",i);let j=$(a,b,"confirming the published pipeline branch");if(!j.ok)return{ok:!0,sha:d,remote:"unreachable",detail:j.error};let k=j.sha;return k!==d?{ok:!1,error:`publishing the pipeline branch did not land: origin/${a.branch} is ${k||"absent"}, expected ${d}`}:{ok:!0,sha:d,remote:"published"}}var aa=c(19849),ab=c(96826);function ac(a,b,c){return a.split(b).join(c)}var ad=c(99411),ae=c(89822),af=c(58152),ag=c(4837),ah=c(79247),ai=c(41288);let aj=["orchestrator","reviewer","verifier","builder","architect","cleaner","prod-auditor","deployer"],ak=(a,b)=>{let c=(0,ad.OH)().find(b=>b.id===a);if(!c)return null;let d=Object.fromEntries(c.parameters.map(a=>{let c=b?.[a.key],d=void 0!==c&&""!==c?c:(0,ah.y)(a);return[a.key,d]})),e=(0,ad.hB)(c,d),f=(0,ad.X2)(c);return{...(0,ad.aW)(c,d),access:c.capabilities.includes("read-only")?"read-only":"read-write",promptScaffold:`${e.slice(0,ae.le-f.length)}${f}`}};function al(a,b){if(!b)return null;let c=(0,ad.OH)().find(b=>b.id===a);if(!c)return null;let d=(0,ad.$d)(c,b,{requireRequired:!1});return d.ok?null:d.error}function am(a,b,c){let d=a.role;if(void 0!==d&&(!d||"object"!=typeof d||Array.isArray(d)))return{error:"stage role must be an object"};let e=d&&"string"==typeof d.roleId?d.roleId.trim():"";if(d&&!e)return{error:"stage roleId is required when role is present"};if(e&&!aj.includes(e))return{error:`unknown pipeline role: ${e}`};if(e&&ai.o.includes(e))return{error:`role ${e} is not allowed in a pipeline (it requires interactive deploy confirmation)`};let f=d&&d.params&&"object"==typeof d.params&&!Array.isArray(d.params)?d.params:void 0;if(void 0!==a.engine&&"claude"!==a.engine&&"codex"!==a.engine)return{error:"stage engine must be claude or codex"};if(void 0!==a.access&&"read-only"!==a.access&&"read-write"!==a.access)return{error:"stage has an invalid access value"};if("review-loop"===b&&"read-write"===a.access)return{error:"review-loop stages require read-only access"};let g=void 0===c?null:c,h=g?.("builder")??null;if(!h)return{error:"Builder role is unavailable in the role registry"};let i=e||null,j=i?g?.(i,f)??null:null,k=(a,b)=>null===a?null:"string"==typeof a?a.trim()||null:b??null,l=a.engine??j?.engine??h.engine,m=k(a.model,j?.model??h.model),n=k(a.effort,j?.effort??h.effort);if(m){let a=(0,ag.RC)(l,m);if("error"in a)return{error:a.error,field:"model"}}if(n&&!(0,af.z9)(l,n))return{error:`stage effort is not supported by ${l}`};let o=i&&"string"==typeof j?.promptScaffold&&j.promptScaffold.trim()||null;return i&&!o?{error:`role ${i} resolves to an empty prompt scaffold`}:{role:{roleId:i,engine:l,model:m,effort:n,access:"review-loop"===b?"read-only":a.access??j?.access??h.access??"read-write",promptScaffold:o}}}function an(a){if(0===a.length)return"invalid pipeline request";if(1===a.length)return a[0].message;let b=a.map(a=>`${a.field}: ${a.message} (expected ${a.expected})`);return`${a.length} validation errors — ${b.join("; ")}`}var ao=c(13896),ap=c(34471),aq=c(63376);async function ar(a,b){let c=j.lD.resolveSpawn(a.role.engine),d=function(a){if(!a)return{conversationId:null,sessionKey:null};let b=(0,N.Ps)(a)?"codex":(0,N.Bz)(a)?"claude":null;if(!b)return{conversationId:null,sessionKey:null};let c=(0,n.agentRegistry)();return{conversationId:(c.conversationForPath(a)??c.ensureConversation(b,a,null)).id,sessionKey:(0,q.sz)(b,a)}}(a.parentPath),f=(0,m.lV)(a.role.engine,a.cwd,{model:a.role.model,effort:a.role.effort,readOnly:"read-only"===a.role.access,permissionMode:"claude"===a.role.engine?"bypassPermissions":null,codexHome:"codex"===a.role.engine?c.home:null,claudeConfigDir:"claude"===a.role.engine?c.home:null,claudeProjectsDir:"claude"===a.role.engine?c.transcriptRoot:null}),g=(0,l.Ui)({...f.launchProfile??{},cwd:a.cwd,parentConversationId:d.conversationId}),h=(0,n.agentRegistry)(),i=a.supersedes?.startsWith("conversation_")&&h.conversation(a.supersedes)?h.canonicalConversationId(a.supersedes):null,k=e().createHash("sha256").update(JSON.stringify({engine:a.role.engine,model:a.role.model,effort:a.role.effort,cwd:a.cwd,parentConversationId:d.conversationId,...i?{supersedes:i}:{},prompt:a.prompt})).digest("hex"),o=a.creatorConversationId?.startsWith("conversation_")?h.canonicalConversationId(a.creatorConversationId):null,p=h.beginSpawnRequest({engine:a.role.engine,cwd:a.cwd,transport:"structured",accountId:c.accountId,accountPin:!0,parentConversationId:d.conversationId,parentSessionKey:d.sessionKey,parentArtifactPath:d.conversationId?a.parentPath:null,role:a.role.roleId,origin:{kind:"container",container:"pipeline",containerId:a.membership.containerId,creatorConversationId:o},memberships:[{...a.membership,parentConversationId:d.conversationId}],launchProfile:g,clientAttemptId:a.clientAttemptId,requestDigest:k,supersedes:i,supersedesReason:"stage-retry"});if("conflict"===p.kind)throw Error("pipeline spawn attempt conflicts with its original request");if(b({launchId:p.receipt.launchId,conversationId:p.receipt.conversationId}),"replay"===p.kind){let a=h.conversation(p.receipt.conversationId),b=p.receipt.artifactPath??a?.generations.at(-1)?.path??null;return{launchId:p.receipt.launchId,conversationId:p.receipt.conversationId,sessionId:p.receipt.key?.sessionId??null,transcript:b,paneId:p.receipt.verifiedHost?.paneId??p.receipt.pane?.paneId??null}}let r={...f,launchProfile:g},s=(0,x.sS)();if(!s)throw Error("pipeline structured runtime host is unavailable");let t=(await (0,K.sh)({engine:a.role.engine,receipt:p.receipt,spec:r,account:c,prompt:a.prompt,registry:h,client:s})).path??null,u=t?(0,q.sz)(a.role.engine,t):null;return t&&a.parentPath&&d.conversationId&&((0,v.A6)(t,a.parentPath),(0,v.OA)()),{launchId:p.receipt.launchId,conversationId:p.receipt.conversationId,sessionId:u?.sessionId??null,transcript:t,paneId:null}}let as=new Set(["delivered"]),at=new Set(["failed","rejected"]);async function au(a){let b=(0,n.agentRegistry)(),d=(a.conversationId?.startsWith("conversation_")?b.conversation(a.conversationId):null)??(a.agentPath?b.conversationForPath(a.agentPath):null),e=d?.generations.at(-1)??null;if(!d||!e)return null;let f=(0,q.pp)({engine:d.engine,sessionId:e.id}),{structuredHostProcessAlive:g}=await Promise.resolve().then(c.bind(c,94292));return{conversationId:d.id,transcriptPath:e.path,resident:()=>{let a=b.readOnlySnapshot().entries[f];return!!a&&"dead"!==a.status&&"unhosted"!==a.status&&(g(a.structuredHost?.process??null)||!!a.host)},host:()=>b.readOnlySnapshot().entries[f]?.host??null}}async function av(a,b={}){let c=a.paneId;if(!c)return{outcome:"not-running"};let d=b.paneSnapshot??P.RZ,e=a=>a?`pane ${c} now runs ${a.command} in window ${a.windowName}`:`pane ${c}`;try{let f=await au(a),g=f?.host()??null;if(!g||g.paneId!==c){let a=await d(c);if(!a||(0,O.g2)(a.command))return{outcome:"not-running"};return{outcome:"unknown",detail:`${e(a)} and cannot be identified as this stage's agent; stop it yourself if it is the orphan, or close again with acknowledgeHosts to dismiss it`}}if(await (b.killHostIfMatches??P.B$)(g))return{outcome:"stopped"};let h=await d(c);if(!h||(0,O.g2)(h.command))return{outcome:"not-running"};return{outcome:"unknown",detail:`${e(h)}; it changed or its agent did not exit, so it was left running`}}catch(a){return{outcome:"failed",error:a instanceof Error?a.message:String(a)}}}async function aw(a,b={}){try{let d=await au(a);if(!d||!d.resident())return{outcome:"not-running"};let{conversationId:e,transcriptPath:f,resident:g}=d,{applyConversationAction:h}=await c.e(3558).then(c.bind(c,53558)),i=await h({conversationId:e,transcriptPath:f,action:"kill"}),j=i.body;if(i.status>=400||!0!==j.ok)return{outcome:"failed",error:j.error??`stage host kill was refused with status ${i.status}`};let k=j.receipt?.status??null;if(!k||as.has(k))return{outcome:"stopped"};let l=j.operationId??null,m=void 0===b.client?(0,x.sS)():b.client,n=b.now??Date.now,o=b.sleep??(a=>new Promise(b=>setTimeout(b,a))),p=n()+(b.budgetMs??1500),q=b.intervalMs??250;for(let a=0;a<8;a+=1){if(!g())return{outcome:"stopped"};if(l&&m){let a=await m.operationStatus(l).catch(()=>null),b=a?.receipt.status??null;if(b&&as.has(b))return{outcome:"stopped"};if(b&&at.has(b))return{outcome:"failed",error:a?.receipt.reason??`stage host kill ${b} (operation ${l})`}}if(n()>=p)break;await o(q)}if(!g())return{outcome:"stopped"};return{outcome:"unconfirmed",operationId:l,detail:`kill accepted as ${k} but termination was not confirmed`}}catch(a){return{outcome:"failed",error:a instanceof Error?a.message:String(a)}}}function ax(){let a=null,b=(0,n.agentRegistry)(),c=null,d=null,e=null,f=()=>c??=b.readOnlySnapshot(),h=()=>e??=(0,u.mL)(),i=()=>{c=null,d=null};return{exec:Q.Ix,preflightRepo:ab.OF,roleLookup:ak,spawnAgent:async(a,b)=>{let c=await ar(a,b);return i(),c},spawnReceipt:a=>{let b=f().receipts[a];return b?{state:b.state,launchId:b.launchId,conversationId:b.conversationId,sessionId:b.key?.sessionId??null,transcript:b.artifactPath,paneId:b.verifiedHost?.paneId??b.pane?.paneId??null}:null},claimSpawnRetry:(a,c)=>{let d=b.claimFailedSpawnForRetry(a,c).kind;return i(),d},paneAgentAlive:async a=>{let b=await (0,P.RZ)(a);return null!==b&&!(0,O.g2)(b.command)},stopStageAgent:a=>aw(a),stopStagePane:a=>av(a),stageHostResident:async a=>{try{let b=await au(a);return!!b&&b.resident()}catch{return!0}},monotonicNow:()=>Date.now(),worktreePresent:a=>!!a&&g().existsSync(a),conversationAgentActive:async b=>{let c,d=(0,x.sS)();if(!d)return null;a??=d.snapshot();try{c=await a}catch{return null}let e=c.sessions.find(a=>a.conversationId===b);return e?["dead","unhosted","conflict"].includes(e.host)?(a=null,!1):"running"===e.turn||"interrupt_requested"===e.turn||e.attentionIds.length>0||null:null},conversationHostUnavailableSince:async a=>{if(!a.startsWith("conversation_"))return;let b=f(),c=b.conversations[a],d=c?.generations.at(-1);if(!c||!d)return;let e=(0,q.sz)(c.engine,d.path);if(!e)return;let g=b.entries[(0,q.pp)(e)];return g?"dead"===g.status||"unhosted"===g.status?g.updatedAt:null:d.createdAt},sleep:a=>new Promise(b=>setTimeout(b,a)),durableTurnEvidence:U,headCwd:a=>(0,r.tX)(a),lastMessage:t.if,pathForConversation:a=>a.startsWith("conversation_")?f().conversations[a]?.generations.at(-1)?.path??null:null,sourcePathAllowed:p.FK,conversationIdForPath:a=>{for(let b of Object.values(f().conversations))if(b.generations.some(b=>b.path===a))return b.id;return null},pipelineAdoptionCandidates:a=>(()=>{if(d)return d;let a=f(),b=new Map(Object.values(a.receipts).map(a=>[a.conversationId,a])),c=new Map;for(let[d,e]of Object.entries(a.memberships))for(let f of e){if("pipeline"!==f.kind||!f.containerId||!f.slot.startsWith("adopt:")||!f.stageId||!f.parentConversationId)continue;let e=b.get(d)??null,g=a.conversations[d]??null,h=g?.generations.at(-1)??null,i=e?.artifactPath??h?.path??null;if(!i)continue;let j=f.runtime??(e?{engine:e.engine,model:e.launchProfile.model,effort:e.launchProfile.effort}:g?{engine:g.engine,model:h?.launchProfile.model??null,effort:h?.launchProfile.effort??null}:null),k=c.get(f.containerId)??[];k.push({stageId:f.stageId,sourceConversationId:f.parentConversationId,launchId:e?.launchId??null,conversationId:d,sessionId:e?.key?.sessionId??null,agentPath:i,paneId:e?.verifiedHost?.paneId??e?.pane?.paneId??null,startedAt:e?.createdAt??f.createdAt,runtime:j}),c.set(f.containerId,k)}return d=c,c})().get(a)??[],createFlow:async(a,b)=>{let c=await (0,s._p)(a,b);return e=null,c},patchFlow:(a,b,c,d=null)=>{let f=(0,s.n1)(a,{action:b,...c?{note:c}:{}},d);return e=null,f},closeFlow:async a=>{let b=await (0,s.ni)(a);return e=null,b},getFlow:a=>h().find(b=>b.id===a)??null,findFlow:(a,b,c,d)=>h().filter(e=>e.baseRef===c&&e.targetSha===d&&null===e.closedAt&&"closed"!==e.state&&(e.implementerPath===a||!!(b&&e.implementerConversationId===b))).sort((a,b)=>b.createdAt.localeCompare(a.createdAt))[0]??null,projectForCwd:L.hY,now:()=>new Date().toISOString()}}let ay=new Set,az=new Set(["completed","closed"]),aA="stage completed without a valid final JSON verdict",aB="historical attempt completed without a valid final JSON verdict",aC=new Set(["passed","failed","needs_decision","skipped"]);function aD(a,b,c){return`${a.id}:${b.id}:${c.n}`}function aE(a){return a.cursor?a.stages.find(b=>b.id===a.cursor?.stageId)??null:null}function aF(a,b){return a.runs.find(a=>a.stageId===b)??null}function aG(a,b){return aF(a,b)?.attempts.findLast(a=>!a.historical)??null}function aH(a){let b=a?Date.parse(a):0;return Number.isFinite(b)?b:0}function aI(a){return"string"==typeof a?a.trim()||null:"number"==typeof a&&Number.isFinite(a)?String(a):null}function aJ(a){if(!a||"object"!=typeof a||Array.isArray(a))return a;let b=aI(a.severity),c=aI(a.file),d=aI(a.line),e=[b,c?`${c}${d?`:${d}`:""}`:d?`line ${d}`:null,aI(a.summary)].filter(a=>!!a);return e.length>0?e.join(" — "):a}function aK(a){let b,c=[...a.matchAll(/```(?:json)?\s*([\s\S]*?)```/gi)].at(-1);if(!c||void 0===c.index)return a;try{b=JSON.parse(c[1]??"")}catch{return a}if(!b||"object"!=typeof b||Array.isArray(b))return a;let d=b;if(!Array.isArray(d.findings)||!d.findings.some(a=>a&&"object"==typeof a&&!Array.isArray(a)))return a;let e={...d,findings:d.findings.map(aJ)},f=c[0],g=c[1]??"",h=f.indexOf(g),i=c.index+h;return`${a.slice(0,i)}${JSON.stringify(e)}${a.slice(i+g.length)}`}function aL(a){return(0,aq.fM)(aK(a))}function aM(a){return(0,aq.DL)(aK(a))}function aN(a,b,c){let d=a.verdictRecovery;d&&"recovered"!==d.state&&(a.verdictRecovery={...d,state:"recovered",lastCheckedAt:b,nextCheckAt:null,messageTs:c})}function aO(a,b,c,d,e){let f=c.now(),g=b.verdictRecovery?.state==="pending"?b.verdictRecovery:null,h=null!==e&&g?.messageTs!==null&&g?.messageTs!==void 0&&e>g.messageTs;if(g&&!h&&aH(f)<aH(g.nextCheckAt))return;let i=(g?.checks??0)+1,j={state:i>=3?"exhausted":"pending",checks:i,maxChecks:3,startedAt:g?.startedAt??f,lastCheckedAt:f,nextCheckAt:i>=3?null:new Date(aH(f)+3e4).toISOString(),reason:d,messageTs:e};if(b.verdictRecovery=j,"exhausted"===j.state){b.completedAt=f,aP(a,`stage verdict recovery exhausted after 3 checks: ${d}`,b);return}b.state="running",b.error=null,a.state="running",a.stateDetail=`re-evaluating terminal stage verdict (${i}/3): ${d}`}function aP(a,b,c){c&&"failed"!==c.state&&(c.state="needs_decision"),c&&(c.error=b),a.state="needs_decision",a.pausedState=null,a.stateDetail=b}function aQ(a,b,c){let d=a.cursor?.stageId===b?{input:a.cursor.input,activatedBy:a.cursor.activatedBy}:{input:null,activatedBy:null};a.cursor={stageId:b,state:c,...d}}function aR(a){if(!a.cursor)return"";let b=a.stages.findIndex(b=>b.id===a.cursor?.stageId);for(let c=b-1;c>=0;c-=1){let b=aG(a,a.stages[c].id);if(b?.output)return b.output}return""}function*aS(a,b){let c=new Set,d=aG(a,b)?.activatedBy??(a.cursor?.stageId===b?a.cursor.activatedBy:null);for(;d;){let b=`${d.stageId}:${d.attempt}`;if(c.has(b))break;c.add(b);let e=a.stages.find(a=>a.id===d.stageId)??null,f=aF(a,d.stageId)?.attempts.find(a=>a.n===d.attempt)??null;if(!e||!f)break;yield{stage:e,attempt:f,boundary:null==f.activatedBy},d=f.activatedBy}}function aT(a,b){let c=!0;for(let d of aS(a,b)){if("run"===d.stage.kind&&"passed"===d.attempt.state&&d.attempt.agentPath)return d.attempt;c=d.boundary}if(!c)return null;let d=a.stages.findIndex(a=>a.id===b);for(let b=d-1;b>=0;b-=1){let c=a.stages[b];if("run"!==c.kind)continue;let d=aG(a,c.id);if(d?.state==="passed"&&d.agentPath)return d}return null}function aU(a,b){let c=aF(a,b.id);if(!c)return aP(a,"pipeline stage run record is missing"),null;let d=a.cursor?.stageId===b.id?a.cursor:null,e={n:c.attempts.length+1,state:"pending",effectiveRole:structuredClone(b.effectiveRole),launchId:null,conversationId:null,sessionId:null,agentPath:null,paneId:null,flowId:null,expectedReviewHeadSha:null,reviewHeadSha:null,startedAt:null,completedAt:null,input:d?.input??null,activatedBy:d?.activatedBy?{...d.activatedBy}:null,output:null,verdict:null,error:null};return c.attempts.push(e),e}function aV(a){for(let b of(0,ao.IR)())for(let c=0;c<b.runs.length;c+=1){let d=b.runs[c],e=d.attempts.find(b=>b.conversationId===a);if(e)return{pipelineId:b.id,stageId:d.stageId,stageOrder:c,role:e.effectiveRole.roleId??"agent"}}return null}function aW(a,b,c){let d=aF(a,b),e=a.stages.find(a=>a.id===b)??null;if(!d||!e)return null;let f=d.attempts.find(a=>a.conversationId===c.conversationId||null!==c.launchId&&a.launchId===c.launchId);if(f)return f;let g=d.attempts.find(a=>a.conversationId===c.sourceConversationId)??null;if(!g)return null;let h=structuredClone(g.effectiveRole??e.effectiveRole);c.runtime&&(h.engine=c.runtime.engine,h.model=c.runtime.model,h.effort=c.runtime.effort);let i={n:d.attempts.length+1,historical:!0,state:"running",effectiveRole:h,launchId:c.launchId,conversationId:c.conversationId,sessionId:c.sessionId,agentPath:c.agentPath,paneId:c.paneId,flowId:null,expectedReviewHeadSha:null,reviewHeadSha:null,startedAt:c.startedAt,completedAt:null,input:g.input,activatedBy:g.activatedBy?{...g.activatedBy}:null,output:null,verdict:null,error:null};return d.attempts.push(i),i}async function aX(a,b){return(0,ao.Km)((c,d)=>{for(let e of c)for(let c of e.runs){if(!c.attempts.some(b=>b.conversationId===a))continue;let f=aW(e,c.stageId,{...b,sourceConversationId:a});if(!f)return null;return d(),{pipeline:e,stageId:c.stageId,attempt:f}}return null})}async function aY(a,b,c){let d=!1;for(let e of a.runs)for(let f of e.attempts){if(!f.historical||!["spawning","running"].includes(f.state))continue;let e=JSON.stringify(f);if(a9(a,f,b,c),!f.agentPath){if(f.launchId){let a=c.spawnReceipt(f.launchId);a&&(f.conversationId=a.conversationId,f.sessionId=a.sessionId,f.agentPath=a.transcript,f.paneId=a.paneId,("failed"===a.state||"conflicted"===a.state)&&(f.state="failed",f.completedAt=c.now(),f.error=`historical spawn ended in receipt state ${a.state}`))}d=JSON.stringify(f)!==e||d;continue}let g=await c.durableTurnEvidence(f.effectiveRole.engine,f.agentPath);if(!(g?.turn==="terminal"&&null!==g.message&&g.message.ts>aH(f.startedAt))){d=JSON.stringify(f)!==e||d;continue}let h=aL(g.message.text);f.completedAt=new Date(g.message.ts).toISOString(),f.output=null,h?"failureReason"in h?(f.state="failed",f.error=h.failureReason):(f.verdict=h.verdict,f.state="pass"===h.verdict.status?"passed":"fail"===h.verdict.status?"failed":"needs_decision",f.error=h.verdict.findings?.[0]??null):(f.state="failed",f.error=aB),d=JSON.stringify(f)!==e||d}return d}function aZ(a,b){a.flowId=b.id;let c=b.rounds.at(-1);a.launchId=c?.launchId??a.launchId,a.sessionId=c?.sessionId??a.sessionId,a.agentPath=c?.reviewerPath??a.agentPath,a.conversationId=c?.reviewerConversationId??a.conversationId,a.paneId=c?.reviewerPane?.paneId??a.paneId}let a$=new Set(["approved","done_comment","needs_decision","closed"]),a_="review flow host claim retry: ",a0="review flow relay retry: ";function a1(a,b,c){let d=b.rounds.at(-1)??null,f=b.rounds.findLast(a=>a.reviewHeadSha)?.reviewHeadSha??b.targetSha??null,g=d?.reviewHeadSha??null,h=function(a){let b=[a.createdAt,a.closedAt];for(let c of a.rounds)b.push(c.startedAt,c.spawnStartedAt??null,c.reviewedAt,c.relayStartedAt??null,c.relayedAt,c.terminalAt??null);return b.filter(a=>!!a).sort((a,b)=>b.localeCompare(a))[0]??null}(b),i=h?Date.parse(h):NaN,j=Date.parse(c),k={sourceRevision:b.revision??0,roundCount:b.rounds.length,implementerHeadSha:f,reviewerHeadSha:g,verdict:d?.verdict??null,relayState:b.state,terminalState:a$.has(b.state)?b.state:null,hostClaim:b.hostClaim??null,sourceUpdatedAt:h},l=e().createHash("sha256").update(JSON.stringify({...k,stateDetail:b.stateDetail,implementerPath:b.implementerPath,implementerConversationId:b.implementerConversationId??null,rounds:b.rounds.map(a=>({n:a.n,reviewerPath:a.reviewerPath,reviewerConversationId:a.reviewerConversationId??null,reviewHeadSha:a.reviewHeadSha??null,verdict:a.verdict,reviewedAt:a.reviewedAt,relayStartedAt:a.relayStartedAt??null,relayedAt:a.relayedAt,terminalAt:a.terminalAt??null,error:a.error}))})).digest("hex").slice(0,16);if(a.reviewFlowSync?.generation===l)return!1;let m=a.reviewFlowSync;if(m){let a=m.sourceRevision??0;if(a>0&&k.sourceRevision<=a||k.roundCount<m.roundCount)return!1;let b=m.sourceUpdatedAt?Date.parse(m.sourceUpdatedAt):NaN;if(k.roundCount===m.roundCount&&Number.isFinite(i)&&Number.isFinite(b)&&i<b)return!1}return aZ(a,b),g&&(a.expectedReviewHeadSha=g,a.reviewHeadSha=g),a.reviewFlowSync={generation:l,...k,synchronizedAt:c,lagMs:Number.isFinite(i)&&Number.isFinite(j)?Math.max(0,j-i):null},!0}function a2(a,b,c=new Date().toISOString()){let d=new Map(b.map(a=>[a.id,a])),e=new Set(a.flatMap(a=>a.runs.flatMap(a=>a.attempts.flatMap(a=>a.flowId?[a.flowId]:[])))),f=!1;for(let g of a){for(let a of g.stages){if("review-loop"!==a.kind)continue;let c=aG(g,a.id);if(!c||c.flowId||!c.expectedReviewHeadSha)continue;let d=aT(g,a.id);if(!d?.agentPath)continue;let h=b.filter(a=>!e.has(a.id)&&a.baseRef===g.baseRef&&a.targetSha===c.expectedReviewHeadSha&&null===a.closedAt&&"closed"!==a.state&&(a.implementerPath===d.agentPath||!!(d.conversationId&&a.implementerConversationId===d.conversationId)));1===h.length&&(c.flowId=h[0].id,e.add(h[0].id),f=!0)}for(let a of g.runs)for(let b of a.attempts){let a=b.flowId?d.get(b.flowId):null;a&&(f=a1(b,a,c)||f)}}return f}function a3(a,b,c,d){if(null===b.next){a.cursor=null,a.state="completed",a.stateDetail=null,a.pausedState=null,a.closedAt=c.now();return}a.cursor={stageId:b.next,state:"pending",input:d?.output??null,activatedBy:d?{stageId:b.id,attempt:d.n,edge:"pass"}:null},a.state="running",a.stateDetail=null,a.pausedState=null}function a4(a,b,c){let d=`passed but unpublished: ${c}`;b.error=d,a.state="running",a.stateDetail=d}function a5(a,b,c,d){let e=_(a,d.exec,{acceptedSha:a.lastPassedCommit,publishedSha:a.publishedCommit??null});e.ok?"unreachable"===e.remote?a4(a,c,e.detail):(a.publishedCommit="published"===e.remote?e.sha:null,c.error=null,a3(a,b,d,c)):aP(a,`publishing the passed stage: ${e.error}`,c)}function a6(a,b,c,d,e){if(!b.onFail)return!1;let f=a.stages.find(a=>a.id===b.onFail.to),g=function(a,b){if(!b.onFail)return 0;let c=aF(a,b.onFail.to);return c?c.attempts.filter(a=>!a.historical&&a.activatedBy?.edge==="fail"&&a.activatedBy.stageId===b.id).length:0}(a,b);return f&&g<b.onFail.maxRounds?(a.cursor={stageId:f.id,state:"pending",input:d,activatedBy:{stageId:b.id,attempt:c.n,edge:"fail"}},a.state="running",a.stateDetail=null,a.pausedState=null,!0):!!f&&(aP(a,`fail-edge budget exhausted after ${g} round(s): ${e}`,c),!0)}function a7(a,b,c,d){let e="run"===b.kind&&"read-write"===c.effectiveRole.access,f=function(a,b,c,d){let e=d("git",["status","--porcelain"],a.worktreeDir);if(0!==e.code)return V("checking the pipeline worktree",e);if(e.stdout.trim()){if(!c)return{ok:!1,error:`read-only stage ${b} modified the pipeline worktree`};let e=d("git",["add","-A"],a.worktreeDir);if(0!==e.code)return V("staging the passed stage",e);let f=d("git",["commit","-m",`pipeline(${a.id}): complete ${b}`],a.worktreeDir);if(0!==f.code)return V("committing the passed stage",f)}let f=d("git",["rev-parse","HEAD"],a.worktreeDir);return 0===f.code&&f.stdout.trim()?{ok:!0,sha:f.stdout.trim()}:V("recording the passed stage commit",f)}(a,b.id,e,d.exec);if(!f.ok)return void aP(a,f.error,c);if("review-loop"===b.kind&&f.sha!==c.reviewHeadSha)return void aP(a,`approved review flow head mismatch during settlement: reviewed ${c.reviewHeadSha??"no exact head"}, settled ${f.sha}`,c);a.lastPassedCommit=f.sha;let g=_(a,d.exec,{acceptedSha:f.sha,publishedSha:a.publishedCommit??null});g.ok?(a.publishedCommit="published"===g.remote?g.sha:null,c.state="passed",c.completedAt=d.now(),"unreachable"===g.remote&&null===b.next)?a4(a,c,g.detail):(a3(a,b,d,c),"unreachable"===g.remote&&a4(a,c,g.detail)):aP(a,`publishing the passed stage: ${g.error}`,c)}function a8(a,b,c,d,e,f){if(c.output=d.output,"failureReason"in d){c.completedAt=e.now(),aP(a,d.failureReason,c);return}if(c.verdict=d.verdict,"pass"!==d.verdict.status){let f;if(c.state="fail"===d.verdict.status?"failed":"needs_decision",c.completedAt=e.now(),"fail"===d.verdict.status&&a6(a,b,c,(f=d.verdict.findings?.length?`Fail verdict findings:
|
|
82
|
-
${d.verdict.findings.map(a=>`- ${a}`).join("\n")}`:"",[d.output,f].filter(Boolean).join("\n\n").trim()||null),d.verdict.findings?.[0]??"stage verdict: fail"))return;
|
|
80
|
+
`)}catch(a){this.fail(Error(`Codex app-server stdin failed: ${V(a)}`))}}boundImageBodies(a){try{var b;let c,d;return(b={store:(a,b)=>{let c=(0,t.PF)(),[d]=c.putMany([{base64:a.toString("base64"),mime:b}]);return d?c.pathFor(d):null}},c=[],{value:(d=(a,e)=>{if("string"==typeof a){if(!e||!p.has(e))return a;let d=function(a){let b=o.exec(a.trim());if(!b)return null;let c=(0,n.CC)(b[1]);if(!c)return null;let d=Buffer.from(b[2],"base64");return d.byteLength?{data:d,mime:c}:null}(a);if(!d)return a;let g=function(a,b,c){let d=f().createHash("sha256").update(a).digest("hex"),e=null;try{e=c.store(a,b)}catch{e=null}return{type:"localImage",path:e??"",sha256:d,mime:b,bytes:a.byteLength}}(d.data,d.mime,b);return c.push({sha256:g.sha256,mime:d.mime,bytes:g.bytes}),g}if(Array.isArray(a)){let b=!1,c=a.map(a=>{let c=d(a,e);return c!==a&&(b=!0),c});return b?c:a}if(!a||"object"!=typeof a)return a;let g=!1,h={};for(let[b,c]of Object.entries(a)){let a=d(c,b);a!==c&&(g=!0),h[b]=a}return g?h:a})(a,null),captured:c}).value}catch{return a}}acceptStdout(a){let b=a;for(;b;){if(this.dead||this.releasing||this.released){this.stdoutBuffer="",this.replayReduction=null;return}b=this.replayReduction?this.feedReplayReduction(b):this.acceptPlainStdout(b)}(this.dead||this.releasing||this.released)&&(this.stdoutBuffer="",this.replayReduction=null)}acceptPlainStdout(a){this.stdoutBuffer+=a;let b=this.stdoutBuffer.indexOf("\n");for(;b>=0;){let a=this.stdoutBuffer.slice(0,b).trim();if(this.stdoutBuffer=this.stdoutBuffer.slice(b+1),Buffer.byteLength(a)>M){if(null===this.awaitedReplayEnvelopeId(a))return this.fail(Error("Codex app-server emitted an oversized JSONL frame")),"";let b=this.stdoutBuffer;if(this.stdoutBuffer="",this.replayReduction=new s(P),!this.feedReplayFrame(a))return"";return this.finishReplayReduction(),this.dead||this.releasing||this.released?"":b}if(a&&this.acceptMessage(a),this.dead||this.releasing||this.released)return this.stdoutBuffer="","";b=this.stdoutBuffer.indexOf("\n")}let c=Buffer.byteLength(this.stdoutBuffer);if(c>262144&&null!==this.awaitedReplayEnvelopeId(this.stdoutBuffer)){let a=this.stdoutBuffer;return this.stdoutBuffer="",this.replayReduction=new s(P),a}return c>M&&(this.fail(Error("Codex app-server emitted an oversized JSONL frame")),this.stdoutBuffer=""),""}feedReplayReduction(a){let b=a.indexOf("\n");return this.feedReplayFrame(-1===b?a:a.slice(0,b))&&-1!==b?(this.finishReplayReduction(),this.dead||this.releasing||this.released?"":a.slice(b+1)):""}feedReplayFrame(a){try{return this.replayReduction.feed(a),!0}catch(a){return this.replayReduction=null,this.fail(a instanceof q?a:Error(V(a))),!1}}finishReplayReduction(){let a,b=this.replayReduction;this.replayReduction=null;try{a=b.finish().trim(),Buffer.byteLength(a)>M&&(a=(function(a,b,c){let d=a,e=c.maxStringUnits,f=!1;for(;Buffer.byteLength(d)>b&&e>64;){e=Math.max(64,Math.floor(e/4));let a=new s({...c,maxStringUnits:e,...f?{maxImageStringUnits:e}:{}});a.feed(d),d=a.finish(),f=!0}return d})(a,M,P).trim())}catch(a){this.fail(a instanceof q?a:Error(V(a)));return}Buffer.byteLength(a)>M?this.fail(Error("Codex app-server emitted an oversized JSONL frame")):a&&this.acceptMessage(a)}awaitedReplayEnvelopeId(a){let b=O.exec(a.slice(0,64).trimStart());if(!b)return null;let c=Number(b[1]);return this.replayEnvelopeRequestIds.has(c)?c:null}trackReplayEnvelopeRequest(a){for(this.replayEnvelopeRequestIds.add(a);this.replayEnvelopeRequestIds.size>64;){let a=this.replayEnvelopeRequestIds.values().next().value;if(void 0===a)break;this.replayEnvelopeRequestIds.delete(a)}}acceptStderr(a){for(this.stderrTail+=a;Buffer.byteLength(this.stderrTail,"utf8")>16384;)this.stderrTail=this.stderrTail.slice(Math.max(1,Math.floor(this.stderrTail.length/4)))}acceptMessage(a){let b;try{b=R(JSON.parse(a))}catch{b=null}if(!b)return void this.fail(Error("Codex app-server emitted malformed JSON-RPC"));if("string"==typeof b.method&&!this.eventLedgerRestored){let c=Buffer.byteLength(a);return this.preRestoreEvents.length+this.preRestoreMessages.length>=256||this.preRestoreBytes+c>4194304?void this.fail(Error("Codex app-server pre-restore notification buffer exceeded its bounded capacity")):(this.preRestoreMessages.push({message:b,bytes:c}),void(this.preRestoreBytes+=c))}this.acceptParsedMessage(b)}acceptParsedMessage(a,b=!1){let c=a.id,d="string"==typeof a.method?a.method:null;if(("number"==typeof c||"string"==typeof c)&&!d){if("number"!=typeof c)return this.fail(Error("Codex app-server response id is invalid"));this.replayEnvelopeRequestIds.delete(c);let b=this.pending.get(c);if(!b&&this.consumeLateThreadReadResponse(c))return;if(!b)return this.fail(Error("Codex app-server response has no matching request"));this.pending.delete(c),clearTimeout(b.timer);let d=R(a.error);return void(d?b.reject(Error(`Codex app-server request failed: ${V(d.message??"unknown error")}`)):b.resolve(a.result))}if(!d)return this.fail(Error("Codex app-server message has no method"));let e=R(a.params)??{};if("number"==typeof c||"string"==typeof c){let a=`${d}:${String(c)}`;this.attentions.set(a,{rpcId:c,method:d,origin:"current"});let f={kind:"attention",id:a,method:d,attention:e};b&&this.consumeBufferedNotification(f)||this.emit(f);return}this.acceptNotification(d,e,b)}acceptNotification(a,b,c=!1){if("thread/realtime/started"===a){let a=this.pendingRealtimeStart;if(!a||S(b,"threadId")!==this.identity.threadId)return;a.started=!0,a.realtimeSessionId=S(b,"realtimeSessionId"),this.realtimeSessionId=a.realtimeSessionId,this.resumeVoiceStreams(),this.resolveRealtimeStart();return}if("thread/realtime/sdp"===a){let a=this.pendingRealtimeStart;return a&&S(b,"threadId")===this.identity.threadId?(a.sdp=S(b,"sdp"),a.sdp)?void this.resolveRealtimeStart():void this.rejectRealtimeStart(Error("Codex app-server returned an empty WebRTC SDP answer")):void 0}if("thread/realtime/error"===a){if(S(b,"threadId")!==this.identity.threadId)return;let a=S(b,"message")??"Codex realtime session failed";this.recordRealtimeFailure(a),this.rejectRealtimeStart(Error(a));return}if("thread/realtime/closed"===a){if(S(b,"threadId")!==this.identity.threadId)return;let a=S(b,"reason")??"Codex realtime session closed";this.recordRealtimeFailure(a,{keepExisting:!0}),this.rejectRealtimeStart(Error(a));return}let d=Y(b);if("serverRequest/resolved"===a){let a=b.requestId;if("number"!=typeof a&&"string"!=typeof a)return;let c=[...this.attentions.entries()].find(([,b])=>String(b.rpcId)===String(a));if(!c)return;let d=c[1].answer;d&&(clearTimeout(d.timer),d.resolve()),this.attentions.delete(c[0]),this.emit({kind:"attention-resolved",id:c[0],resolution:d?"answered":"server-resolved"});return}if("turn/started"===a&&d){if(c){let a=this.events.some(a=>"turn-started"===a.kind&&a.turnId===d),b=this.events.some(a=>"turn-ended"===a.kind&&a.turnId===d);if(a&&(b||null!==this.activeTurnId))return}this.cancelledVoiceTurns.delete(d),this.activeTurnId=d,this.emit({kind:"turn-started",turnId:d});return}if("item/agentMessage/delta"===a){let a={kind:"delta",turnId:d??this.activeTurnId??"unknown",text:S(b,"delta")??""};c&&this.consumeBufferedNotification(a)||(this.emit(a),this.observeVoiceDelta(a.turnId,a.text));return}if(("item/started"===a||"item/completed"===a)&&"item"in b){"item/completed"===a&&d&&this.rememberConfirmedDelivery(d,b.item);let e=d??this.activeTurnId,f="item/started"===a?"started":"completed";if(c&&e){if(this.events.some(a=>"turn-ended"===a.kind&&a.turnId===e))return;let a=aa(b.item);if(this.events.some(b=>"item"===b.kind&&b.turnId===e&&b.phase===f&&aa(b.item)===a))return;this.events.some(a=>"turn-started"===a.kind&&a.turnId===e)||(this.activeTurnId=e,this.emit({kind:"turn-started",turnId:e}))}let g="completed"===f&&e?this.finalizeVoiceStreamItem(e,b.item):void 0;this.emit({kind:"item",turnId:e,item:this.boundImageBodies(b.item),phase:f,...void 0!==g?{voiceResponse:g}:{}}),R(b.item)?.type==="contextCompaction"&&this.acceptCompactionItem(b.item,f);return}if("turn/completed"===a&&d){let a=R(b.turn),e=Z(a?.status);if(c&&this.bufferedTerminalTurnIds.add(d),c&&this.events.some(a=>"turn-ended"===a.kind&&a.turnId===d))return;if(this.activeTurnId===d&&(this.activeTurnId=null),c&&!this.events.some(a=>"turn-started"===a.kind&&a.turnId===d)&&this.emit({kind:"turn-started",turnId:d}),"completed"!==e)this.cancelVoiceStream(d);else{let a=this.voiceStreams.get(d);a&&this.clearVoiceStreamTimer(a),this.voiceStreams.delete(d)}this.emit({kind:"turn-ended",turnId:d,status:e}),this.settlePendingCompactionsFromTerminalTurn(a,e);return}if("account/rateLimits/updated"===a)return void this.emit({kind:"limits",snapshot:b});if("thread/compacted"===a)return void this.acceptCompactedNotification(b);if("thread/status/changed"===a){let a=ae(b);a&&this.emitThreadStatus(a)}}fail(a,b=[]){if(!this.dead&&!this.released){for(let b of(this.clearVoiceStreamTimers(),this.dead=!0,this.failure=a,this.activeTurnId=null,this.rejectRealtimeStart(a),this.rejectPendingAnswers(a),this.rejectPendingDeliveries(a),this.rejectPendingCompactions(a),this.attentions.clear(),this.pending.values()))clearTimeout(b.timer),b.reject(Error(V(a)));this.pending.clear(),this.setSessionStatus("dead",b),this.closeSubscribers(),this.startFailureCleanup()}}failWithoutLedger(a){if(!this.dead&&!this.released){for(let b of(this.dead=!0,this.failure=a,this.engineStatus="dead",this.activeFlags=[],this.activeTurnId=null,this.rejectRealtimeStart(a),this.rejectPendingAnswers(a),this.rejectPendingDeliveries(a),this.rejectPendingCompactions(a),this.attentions.clear(),this.pending.values()))clearTimeout(b.timer),b.reject(Error(V(a)));this.pending.clear(),this.notifyStateListeners(),this.closeSubscribers(),this.startFailureCleanup()}}startFailureCleanup(){this.release().catch(()=>{this.released||this.failureCleanupTimer||(this.failureCleanupTimer=setTimeout(()=>{this.failureCleanupTimer=null,this.startFailureCleanup()},this.shutdownGraceMs))})}rejectPendingAnswers(a){let b=Error(V(a));for(let a of this.attentions.values())a.answer&&(clearTimeout(a.answer.timer),a.answer.reject(b),a.answer=void 0)}rejectPendingDeliveries(a){let b=Error(V(a));for(let a of this.pendingDeliveries.values())clearTimeout(a.timer),a.reject(b);this.pendingDeliveries.clear()}resolveRealtimeStart(){let a=this.pendingRealtimeStart;a?.started&&null!==a.sdp&&(this.pendingRealtimeStart=null,clearTimeout(a.timer),a.resolve({sdp:a.sdp,realtimeSessionId:a.realtimeSessionId,personaBootstrap:a.personaBootstrap}))}currentRealtimeSessionId(){return this.realtimeSessionId}lastRealtimeFailure(){return this.realtimeFailure}recordRealtimeFailure(a,b={}){b.keepExisting&&this.realtimeFailure||(this.realtimeFailure={message:a.slice(0,500),at:new Date().toISOString(),realtimeSessionId:this.realtimeSessionId})}rejectRealtimeStart(a){let b=this.pendingRealtimeStart;b&&(this.pendingRealtimeStart=null,clearTimeout(b.timer),b.reject(Error(V(a))))}}},56809:(a,b,c)=>{c.d(b,{X:()=>j,j:()=>g});var d=c(73024),e=c.n(d),f=c(23261);function g(a){return(0,f.fp)(a).replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g,"[redacted]").replace(/(^|\n)(\s*(?:proxy-)?authorization\s*:\s*)[^\r\n]*/gi,"$1$2[redacted]").replace(/(^|\n)(\s*(?:set-)?cookie\s*:\s*)[^\r\n]*/gi,"$1$2[redacted]").replace(/\b(?:sk-[A-Za-z0-9_-]{12,}|sk-ant-[A-Za-z0-9_-]{12,}|gh[pousr]_[A-Za-z0-9_]{20,}|github_pat_[A-Za-z0-9_]{20,}|npm_[A-Za-z0-9]{20,}|xox[baprs]-[A-Za-z0-9-]{10,}|AKIA[0-9A-Z]{16}|ASIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{35})\b/g,"[redacted]").replace(/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,"[redacted]").replace(/(?<=Bearer\s)[A-Za-z0-9._-]{12,}/gi,"[redacted]")}function h(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}function i(a){return"string"==typeof a?a:""}function j(a,b,c,d){let f=function(a){let b,c,d=null;try{d=e().openSync(a.path,e().constants.O_RDONLY|e().constants.O_NOFOLLOW);let f=e().fstatSync(d);if(!f.isFile())throw Error("transcript is not a regular file");let g=e().lstatSync(a.path);if(!g.isFile()||g.dev!==f.dev||g.ino!==f.ino)throw Error("transcript identity changed");let h=Math.max(0,f.size-1048576);c=f.size-h;let i=Buffer.alloc(c);e().readSync(d,i,0,i.length,h),b=i.toString("utf8"),h>0&&(b=b.slice(b.indexOf("\n")+1))}catch{return{messages:[],scannedBytes:0,error:!0}}finally{null!==d&&e().closeSync(d)}let f=[];for(let c of b.split("\n"))try{let b=h(JSON.parse(c)),d=i(b.timestamp)||i(b.ts)||null;if("claude"===a.engine){var g;let a="user"===b.type?"user":"assistant"===b.type?"assistant":null,c=(g=h(b.message).content,"string"==typeof g?g:Array.isArray(g)?g.filter(a=>!!a&&"object"==typeof a&&!Array.isArray(a)).filter(a=>"text"===a.type).map(a=>i(a.text)).join("\n"):"");a&&c.trim()&&f.push({role:a,at:d,text:c})}else{let a=h(b.payload),c=i(a.type),e="user_message"===c?"user":"agent_message"===c?"assistant":null,g=i(a.message);e&&g.trim()&&f.push({role:e,at:d,text:g})}}catch{}return{messages:f,scannedBytes:c,error:!1}}(a),j=f.messages.slice(-b),k=0,l=0,m=!1,n=[];for(let a of j){let b=g(a.text).replace(/\s+/g," ").trim(),e=Math.max(0,c-k),f=Math.max(0,d-l);if(e<=0||f<=0){m=!0;break}let h=function(a,b,c){let d=0,e=0,f="";for(let g of a){let a=Buffer.byteLength(g,"utf8");if(e>=b||d+a>c)return{value:f,truncated:!0};f+=g,d+=a,e+=1}return{value:f,truncated:!1}}(b,e,f);m||=h.truncated,k+=[...h.value].length,l+=Buffer.byteLength(h.value,"utf8"),h.value&&n.push({role:a.role,at:a.at,text:h.value})}return{messages:n,truncated:m||f.error,scannedBytes:f.scannedBytes,...f.error?{error:"unavailable"}:{}}}},57563:(a,b,c)=>{c.d(b,{en:()=>d});let d={"common.serverUnavailable":"server unavailable","common.loading":"loading…","common.loadingCap":"Loading…","common.cancel":"Cancel","common.edit":"edit","common.show":"show","common.showAll":"show all","common.collapse":"collapse","common.copy":"Copy","common.copied":"copied","common.clickToCopy":"click to copy","common.yes":"Yes","common.no":"No","common.send":"Send","common.sending":"sending…","common.sent":"sent","common.close":"Close","common.failedSend":"couldn't send","common.failedDelete":"couldn't delete","common.nothingFound":"Nothing found","common.nothingRunning":"nothing is running right now","common.kb":"kB","common.chars":"{n} chars","lang.aria":"Interface language","util.effortTitle":"Reasoning effort: {effort}","runtimeConfig.model":"Running agent model","runtimeConfig.effort":"Running agent reasoning effort","runtimeConfig.speedTitle":"Fast uses the Codex priority service tier","runtimeConfig.apply":"Apply","runtimeConfig.failed":"Could not change the running agent configuration","runtimeConfig.pending":"switch pending","runtimeConfig.applied":"Conversation settings applied","time.agoSec":"{n}s ago","time.agoMin":"{n}m ago","time.agoHour":"{n}h ago","time.agoDay":"{n}d ago","turn.worked":"Worked for {d}","turn.running":"working {d}","turn.lastRun":"last run: {d}","turn.timer":"elapsed work time","cardStatus.needsYou":"needs you","cardStatus.held":"held","cardStatus.running":"working","cardStatus.queued":"queued","cardSwitch.pending":"switch pending","cardSwitch.pendingTo":"\xab{label}\xbb pending","cardSwitch.switching":"switching…","cardSwitch.switchingTo":"→ \xab{label}\xbb","cardSwitch.failed":"switch failed","cardSwitch.route":"\xab{from}\xbb → \xab{to}\xbb","kind.session":"session","kind.subagent":"subagent","kind.job":"job","kind.background":"background","kind.handoff":"handoff","rail.title":"Agent logs","rail.filter":"Filter projects…","rail.projects":"Projects","rail.overview":"Overview","rail.archive":"Archive","rail.crown":"Crown — pin to top","rail.uncrown":"Remove crown","rail.createProject":"Create project","rail.newProjectName":"Project name","rail.newProjectRoot":"Root directory (absolute path)","rail.create":"Create","rail.creating":"Creating…","rail.invalidName":"Enter a project name","rail.invalidRoot":"Directory not found","rail.missingRoot":"This directory doesn't exist yet","rail.createRootAndProject":"Create directory and project","rail.mkdirFailed":"Couldn't create the directory","rail.duplicateProject":"This project already exists","rail.createFailed":"Couldn't create the project","dash.branchesLive":{one:"{count} branch running",other:"{count} branches running"},"dash.trees":{one:"{count} tree",other:"{count} trees"},"dash.recentConvos":{one:"{count} recent conversation",other:"{count} recent conversations"},"dash.quietTrees":{one:"{count} quiet tree",other:"{count} quiet trees"},"dash.openProjects":"Open project list","dash.createMenu":"Create","dash.moreMenu":"More actions","dash.soundMenu":"Sound alerts","dash.unarchive":"Restore from archive","dash.newConvo":"New conversation with an agent","dash.agent":"Agent","dash.newWorkflow":"New workflow: stages → review → PR","dash.workflow":"Workflow","dash.task":"Task","dash.newTask":"New task","dash.pipelinesUnavailable":"Pipelines are temporarily unavailable: the pipelines state file could not be read. Other panels stay live.","dash.loadingBoard":"Loading the board…","dash.emptyTitle":"The scheme is empty for now","dash.emptyHint":"Open the switchboard in the bottom-right corner and click a conversation — it will appear here","dash.viewScheme":"scheme","dash.viewList":"conversations","dash.viewSchemeMenu":"View: scheme","dash.viewListMenu":"View: conversations","dash.viewMenuGroup":"Board view","dash.hiddenShelf":"Hidden","trash.title":"Root conversations","trash.hint":"Clicking a row opens the conversation as a node; the trash icon deletes its file from disk permanently.","trash.deletedFromDisk":"\xb7 deleted from disk","trash.open":"Open {title}","trash.activeSubtree":"active branches","trash.toArchive":"Archive","trash.notDeleted":"{failed} of {total} not deleted","trash.confirmDelete":{one:"Delete {count} project file from disk?",other:"Delete {count} project files from disk?"},"trash.deleting":"deleting…","trash.confirmYes":"Yes, delete","trash.deleteProject":"Delete project from disk","trash.projectLoadFailed":"Could not load every project conversation","list.title":"All conversations","list.hint":"Loaded in recent-first pages from every conversation stored for this project.","list.searchHint":"Searching every conversation stored across all projects.","list.loadMore":"Load more conversations","list.failed":"Could not load conversations","list.retry":"Retry","search.open":"Search your messages (/)","search.openMobile":"Search your messages","search.title":"Find my messages","search.aria":"Global message search","search.placeholder":"Search everything you've sent…","search.mine":"My messages","search.everything":"Everything","search.speakerAria":"Search scope","search.hint":"Type to search everything you've sent — every project, engine and account.","search.keysHint":"↑ ↓ to move \xb7 Enter to open \xb7 Esc to close","search.results":"Results","search.updating":"updating…","search.loadMore":"More results","search.none":"Nothing found for \xab{query}\xbb","search.corpus":"Searched {messages} across {conversations}","search.corpusMessages":{one:"{formatted} message",other:"{formatted} messages"},"search.corpusConversations":{one:"{formatted} conversation",other:"{formatted} conversations"},"search.everythingInstead":"Search everything instead","search.failed":"Search failed","search.retry":"Retry","search.untitled":"(no title)","search.speaker.you":"you","search.speaker.agent":"agent","search.close":"Close search","switch.aria":"Agent switchboard","switch.title":"Switchboard","switch.search":"Search title, first prompt, or project","switch.results":"All conversation results","switch.updating":"updating…","switch.close":"Close switchboard","switch.waiting":"Waiting for you","switch.working":"Working","switch.recent":"Recent","switch.older":"Older","switch.hidden":"Hidden ({count})","switch.hide":"hide","switch.restore":"restore","accounts.activeAria":"Active Codex account","accounts.placeholder":"Codex account","accounts.add":"Add","accounts.prompt":"Account label","accounts.login":"login","accounts.switchFailed":"Could not switch account","accounts.conversationTitle":"Run this conversation on","accounts.conversationPending":"Account switch pending","accounts.conversationApplied":"Conversation account switched","accounts.conversationUnconfirmed":"Account switch got no confirmation — try again","accounts.manage":"Manage accounts…","accounts.addFailed":"Could not add account","accounts.loginOpened":"Device login opened in {target}","accounts.openLogin":"Open sign-in","accounts.refreshFailed":"Could not refresh accounts. Try again.","accounts.loading":"Loading accounts…","accounts.noAccounts":"No accounts available yet.","limits.accountLoading":"Loading account limits…","accounts.retry":"Retry","accounts.title":"Codex accounts","accounts.trigger":"Accounts","accounts.active":"active","accounts.needsLogin":"needs sign-in","accounts.pendingLogin":"signing in…","accounts.auth.authenticated":"Authenticated","accounts.auth.signedOut":"Signed out","accounts.auth.unknown":"Auth unchecked","accounts.auth.error":"Auth error","accounts.operation.refresh":"Refreshing accounts…","accounts.operation.add":"Starting account sign-in…","accounts.operation.switch":"Switching the account for future launches…","accounts.operation.login":"Updating sign-in…","accounts.operation.remove":"Removing account…","accounts.operation.terminal":"Preparing the account command…","accounts.terminalCopied":"Command copied for {label}","accounts.terminalFailed":"Could not prepare the command for {label}","accounts.copyCli":"Copy CLI","accounts.copyCliAria":"Copy the agent command for {label}","accounts.labelPlaceholder":"New account label","accounts.confirmAdd":"Add","accounts.close":"Close","accounts.remove":"Remove","accounts.removeAria":"Remove {label}","accounts.removeConfirm":"Remove this account? Its past conversations stay readable.","accounts.removeConfirmCta":"Confirm","accounts.removeConfirmCancel":"Cancel","accounts.removeBlocked":"{label} still has an active session or sign-in.","accounts.removeHistoryBlocked":"{label} still runs live conversations. Wait for them to finish, then remove it.","accounts.removeFailed":"Could not remove this account.","accounts.cleanupPending":"{label} was removed. Its local data still needs cleanup.","accounts.cleanupManual":"Some local account data failed safety checks. Inspect and remove it manually.","accounts.cleanupFailed":"Could not clean up abandoned homes.","accounts.forceRemove":"Force remove","accounts.cleanupOrphans":"Clean up abandoned homes","accounts.titleFor":"{engine} accounts","accounts.triggerAria":"{engine} accounts — switch or add","accounts.effective":"{pct}%","accounts.effectiveTip":"{window} binds","accounts.effectiveStale":"{window} binds \xb7 stale","accounts.limitsAria":"Quota windows for {label}","accounts.limitsChecked":"Checked","accounts.limitsStale":"Last known values","accounts.limitsStaleTip":"Last known values — not a live read","accounts.claudeLoginStarted":"Sign-in started for {label}","accounts.claudeLogin.starting":"Starting sign-in…","accounts.claudeLogin.awaitingBrowser":"Waiting for the sign-in link…","accounts.claudeLogin.openLink":"Open claude.ai sign-in","accounts.claudeLogin.codeLabel":"Authorization code","accounts.claudeLogin.codePlaceholder":"Paste the code from the browser","accounts.claudeLogin.codeHint":"After signing in, copy the code claude.ai shows and paste it here.","accounts.claudeLogin.submit":"Submit code","accounts.claudeLogin.verifying":"Verifying…","accounts.claudeLogin.canceling":"Canceling…","accounts.claudeLogin.cancel":"Cancel","accounts.claudeLogin.signIn":"Sign in","accounts.claudeLogin.groupAria":"{label} sign-in","accounts.claudeLogin.err.timed_out":"Sign-in timed out.","accounts.claudeLogin.err.interrupted":"Sign-in was interrupted by a restart.","accounts.claudeLogin.err.verification_failed":"The code could not be verified.","accounts.claudeLogin.err.input_failed":"The code could not be submitted.","accounts.claudeLogin.err.login_busy":"Another sign-in is already in progress.","accounts.claudeLogin.err.generic":"Sign-in could not start. Try again.","accounts.claudeLogin.announceCodeReady":"Sign-in link ready for {label}. Open it and paste the code.","accounts.claudeLogin.announceDone":"{label} signed in.","migrate.confirmTitle":"Switch {engine} to \xab{label}\xbb?","migrate.confirmBody":"New agents use \xab{label}\xbb immediately. {idle} active sessions switch now; {busy} switch after their current turn; {deferred} inactive conversations switch when you message them again.","migrate.confirmCta":"Switch account","migrate.confirmAllCta":"Migrate all ({total})","migrate.confirmCancel":"Cancel","migrate.retargetTitle":"Redirect migration to \xab{label}\xbb?","migrate.retargetBody":"A migration to \xab{current}\xbb is still running. New agents use \xab{label}\xbb immediately; active sessions redirect there, while inactive conversations move when you message them. Migrate all also moves deferred history and previously moved conversations now.","migrate.banner":"Migrating to \xab{label}\xbb — {done}/{total} done","migrate.bannerWaiting":"{n} waiting on turns","migrate.bannerFailed":"{n} failed","migrate.bannerAria":"{engine} migration progress","migrate.stop":"Stop migration","migrate.bannerRetryFailed":"Retry failed ({n})","migrate.stoppedNotice":"Migration stopped. Remaining sessions stay on their current account; new agents keep using \xab{label}\xbb.","migrate.failedNotice":"{n} sessions couldn't move to \xab{label}\xbb.","migrate.completeNotice":"All {engine} sessions now on \xab{label}\xbb","migrate.announceComplete":"All {engine} sessions now on {label}","migrate.cardPending":"Account switch pending — after current turn","migrate.cardSwitching":"Switching to \xab{label}\xbb…","migrate.cardSwitchingUnnamed":"Switching account…","migrate.cardFailed":"Account switch failed","migrate.cardRetry":"Retry","migrate.cardKeep":"Keep on \xab{label}\xbb","migrate.ribbonAria":"Account migration status","migrate.divider":"Continued from \xab{label}\xbb — previous transcript archived","migrate.openPrevious":"Open previous transcript","migrate.heldSend":"Message held — delivers after the switch","migrate.readOnlyPredecessor":"Archived — this conversation continued under \xab{label}\xbb","migrate.retryFailed":"Couldn't retry the switch","migrate.keepFailed":"Couldn't keep this session on its current account","migrate.recoveryFailed":"{detail}","autobalance.title":"Auto balance","autobalance.desc":"Switches this engine's sessions when the active account drops below {threshold}% and another has more.","autobalance.toggleAria":"Auto balance for {engine}","autobalance.idle":"Last check {time} \xb7 no switch needed","autobalance.waitingFresh":"Paused — waiting for fresh quota data","autobalance.cooldown":"Cooldown — next check in {n} min","autobalance.draining":"Balancing now…","autobalance.switched":"Switched to \xab{to}\xbb at {time} — \xab{from}\xbb fell to {pct}% ({window})","autobalance.bannerTag":"Auto","autobalance.override":"Auto balance suggested \xab{to}\xbb; your choice takes over.","limits.windowSession":"5h window","limits.windowWeekly":"weekly window","switchCard.openColumn":"Open {title} as a column","switchCard.remove":"Remove from switchboard","composer.imagesCount":{one:"{count} image",other:"{count} images"},"composer.spawned":"launched agent in tmux {target}","composer.sentPaths":"sent {count} path(s)","composer.failedInterrupt":"couldn't interrupt","composer.escapeSent":"sent Escape — agent interrupted","composer.escapeSentWaiting":"sent Escape — waiting for the agent to stop","composer.spawnAria":"Launch an agent with a prompt","composer.resolvingAria":"Message the existing agent — delivery starts after its host is resolved","composer.sendAria":"Send a message to the agent in tmux {target}","composer.sendStructuredAria":"Send a message through the structured runtime host","composer.queueAria":"Queue of sent messages","composer.removeFromQueue":"Remove from queue","composer.deliveryHeld":"Held for \xab{label}\xbb — delivers after the account switch","composer.deliveryHeldUnnamed":"Held — delivers after the account switch","composer.deliveryHeldWaiting":"Held — waiting to be delivered","composer.admissionTimedOut":"Delivery confirmation timed out. Checking the durable receipt; your message remains preserved.","composer.deliveryUnconfirmed":"Delivery couldn't be confirmed. Your message is preserved — send again to retry safely; the same message key is reused.","composer.runtimePill":"Model and reasoning — applies to your next message","composer.reasoningGroup":"Reasoning","composer.modelGroup":"Model","composer.speedGroup":"Speed","composer.speedStandard":"Standard","composer.speedFastTier":"Fast — priority tier","composer.backTo":"Back","composer.nextMessageUses":"Next message: {model} \xb7 {effort}","composer.settingsNextResume":"applies when the conversation is next resumed","composer.structuredImagesUnavailable":"Image delivery is unavailable for structured conversations","composer.codexImagesTextOnly":"The selected Codex model accepts text input only.","composer.structuredImagesProtocol":"This structured host has no negotiated image capability.","composer.imagesBlockedDuringRecovery":"Drafted images will be sent after the host recovers; text can be sent right away.","composer.imageCapabilityLoading":"Image capability is loading.","composer.imageCapabilityError":"Image capability could not be loaded.","composer.imageCapabilityRetry":"Retry image check","composer.attachTerminal":"Attach terminal viewer","composer.attachTerminalReady":"terminal viewer ready in tmux {target}","composer.attachTerminalFailed":"couldn't create the terminal viewer","composer.receiptHeld":"held","composer.receiptQueued":"queued","composer.receiptRecovering":"recovering","composer.receiptFailed":"not delivered","composer.deliveredEcho":"Delivered — appearing in the feed","composer.retrySend":"Retry send","composer.placeholderRelay":"type — I'll relay through the root session…","composer.placeholderSpawn":"prompt — the agent will start…","composer.placeholderResolving":"message the agent — reconnecting to its session…","composer.placeholderSend":"message the agent…","composer.placeholderOrchestrator":"what should get done in {project}?","composer.textAria":"Text for the agent","composer.optionsShow":"Show message options","composer.optionsHide":"Hide message options","composer.titleRelay":"relayed through the branch's root session","composer.titleSpawnResumed":"starts a fresh agent session that continues this conversation","composer.root":"root","composer.interruptAria":"Interrupt the agent (Escape)","composer.interruptTitle":"send Escape to the agent pane","composer.compactAria":"Compact the agent's context (/compact)","composer.compactTitle":"send /compact — the agent condenses its context; a band appears in the feed when done","composer.compactConfirm":"Compact?","composer.compactConfirmTitle":"Click again to send /compact","composer.compactSent":"compaction started — the band will appear in the feed once it's done","composer.failedCompact":"couldn't start compaction","composer.addImages":"Add images","composer.moreTools":"More actions","composer.stopAndSend":"Stop recording and send","composer.launchAgent":"Launch the agent","composer.sendToAgent":"Send to the agent","composer.stopAndSendTitle":"stop recording and send","composer.sendMenuTitle":"Send options","composer.quickAck":"Yes, continue","composer.quickAckLabel":"Continue","composer.quickAckAria":"Send a quick “Yes, continue” to the agent","composer.quickAckTitle":"Quick reply — yes, continue","strip.live":"live","strip.resume":"resume","strip.deadMode":"dead host","strip.moreActions":"More actions","strip.stopSubagent":"interrupts the root agent","strip.compactSubagent":"not available for subagents","strip.structuredUnsupported":"the structured host does not support this action yet","strip.compactEngineUnsupported":"this engine has no compact control","strip.compactBusyTurn":"not while a turn is running","strip.resolving":"resolving the agent host…","deadHost.title":"Agent inactive \xb7 {since} — messages will queue","deadHost.body":"Text you send now is saved durably and delivered after the host recovers. Images can't be attached until then. Pending approvals expired — recover with the controls below.","deadHost.respawn":"Respawn conversation","deadHost.attach":"Open in terminal","deadHost.recheck":"Re-check","deadHost.recheckFailed":"Couldn't reach the runtime — try again.","strip.recheckHint":"Re-check the runtime host","deadHost.respawnFailed":"Respawn failed — try again.","deadHost.sendBlocked":"host is dead — respawn to continue","deadHost.expiredCard":"expired — the host died before this was answered","superseded.title":"Round superseded \xb7 {since}","superseded.body":"A recovery replaced this round with a live successor. This transcript stays as round history.","superseded.open":"Open the live round","superseded.resumeHere":"Resume here","superseded.resumeConfirm":"Resume this retired round? It forks the work: this card goes live again beside the successor.","superseded.resumeFailed":"Couldn't clear the supersedence link — try again.","superseded.sendBlocked":"round superseded — open the live successor","lineage.continues":"round {round} \xb7 continues previous","lineage.continuesTitle":"Round {round}: continues a superseded predecessor round — click to open it","attach.dialogTitle":"Attach in your terminal","attach.dialogIntro":"Runs this conversation in your own terminal with the same account ({account}) and working directory.","attach.copyCwd":"Copy working directory","attach.copyCommand":"Copy command","attach.copyFull":"Copy full command","attach.copiedFull":"Full command copied to clipboard","attach.takeoverWarning":"Resuming here takes over the conversation from the viewer.","attach.subagentNote":"Subagents resume through their root session.","attach.secondaryViewer":"Open a read-only viewer pane in tmux","attach.secondaryFailed":"Couldn't open the viewer pane — try again.","receipt.human.deadHost":"the agent's host has died","receipt.human.staleKey":"the delivery key was stale","receipt.human.duplicate":"already delivered","receipt.human.turnActive":"the agent is mid-turn","receipt.human.noTurn":"there is no active turn","receipt.human.unsupportedCapability":"this engine has no such control","receipt.human.verbatim":"not delivered: {reason}","spawnCard.starting":"Launch admitted. Starting the agent.","spawnCard.binding":"Agent identity allocated. Binding the structured host.","spawnCard.queued":"The structured host is ready. The initial message is queued.","spawnCard.reconciling":"Delivery is reconciling with the structured host.","spawnCard.recoverable-timeout":"The initial-message timeout is recoverable while durable delivery settles.","spawnCard.live-late-success":"Late delivery succeeded and the live conversation was adopted.","spawnCard.failed":"The launch ended with an error.","spawnCard.recovered":"Durable evidence recovered this launch.","spawnCard.initial.pending":"Initial message: waiting for host binding","spawnCard.initial.queued":"Initial message: queued","spawnCard.initial.delivered":"Initial message: delivered","spawnCard.initial.failed":"Initial message: failed","spawnCard.retrySafe":"This launch is closed. You can start a new attempt.","spawnCard.pinUnavailableFallback":"Launched on another account — pin unavailable","spawnCard.pinUnavailableQueued":"Pinned account quota is exhausted — queued until {retryAt}","spawnCard.launch":"Launch {id}","spawnChip.starting":"Starting","spawnChip.binding":"Binding host","spawnChip.queued":"Host ready","spawnChip.reconciling":"Reconciling","spawnChip.recoverable-timeout":"Settling","spawnChip.live-late-success":"Late delivery OK","spawnChip.failed":"Launch failed","spawnChip.recovered":"Launched","spawnChip.initial.pending":"First message: waiting","spawnChip.initial.queued":"First message: queued","spawnChip.initial.delivered":"First message: delivered","spawnChip.initial.failed":"First message: failed","outbox.queueAria":"Messages waiting to be delivered","outbox.queued":"Queued","outbox.delivering":"Delivering","outbox.heldForSwitch":"Held for \xab{label}\xbb — delivers after the switch","outbox.heldForSwitchUnnamed":"Held — delivers after the account switch","outbox.delivered":"Delivered","outbox.failed":"Not delivered","outbox.cancel":"Cancel this message","outbox.retry":"Retry sending this message","outbox.reattach":"Not sent — re-attach the images and send again","draft.readPrompt":"Read the agent conversation in file {src} and continue from there: ","draft.needDir":"specify a working directory","draft.launchFailed":"couldn't launch","draft.paneAria":"Draft of a new agent conversation","draft.notStarted":"agent not started yet","draft.engineAria":"Agent engine","draft.accountAria":"{engine} account for this launch","draft.accountDefault":"{label} \xb7 active","draft.accountNeedsLogin":"{label} \xb7 needs sign-in","draft.handoffLabel":"handoff: {title}","draft.newConvo":"new conversation","draft.conversation":"conversation","draft.dismiss":"Dismiss the draft conversation","draft.directory":"directory","draft.dirAria":"Agent working directory","dirPicker.empty":"no directory chosen","dirPicker.searchAria":"Filter the known directories, or type a path","dirPicker.searchPlaceholder":"filter, or type a path","dirPicker.listAria":"Known working directories","dirPicker.current":"current","dirPicker.useTyped":"use this path","dirPicker.noMatch":"nothing matches that filter — type a path to use one anyway","dirPicker.noneKnown":"no directories known yet — type a path","dirPicker.count":"{shown} of {total} directories","draft.reasoning":"reasoning","draft.role":"role","draft.roleAria":"Agent role preset","draft.noRole":"No role","draft.roleParameters":"Role parameters","draft.safetyFences":"Safety fences","draft.roleNeedsParams":"complete the required role parameters","draft.reviews":"reviewed conversation","draft.reviewsAria":"Reviewed conversation","draft.reviewsPlaceholder":"Choose a conversation","draft.reviewerNeedsConversation":"choose the conversation this reviewer will review","draft.deployConfirm":"Type deploy to authorize this deployment plan","draft.modelAria":"Agent model","draft.modelDefault":"model: default","draft.reasoningAria":"Reasoning effort level","draft.effortDefault":"effort: default","draft.speedAria":"Codex speed mode","draft.speedTitle":"fast = priority tier (1.5x speed, higher usage)","draft.speedDefault":"speed: default","draft.imagesOnly":"(images)","draft.launched":"agent launched in tmux {target} — waiting for the conversation to appear here…","draft.launchedStructured":"agent launched — waiting for the conversation to appear here…","draft.slow":"Taking a while. Check tmux window {target} — the panel will pick up the transcript as soon as it appears.","draft.slowStructured":"Taking a while. The panel will pick up the transcript as soon as it appears.","draft.confirming":"Launched — confirming the agent in tmux {target}. Don't send again; the panel attaches the conversation as soon as its transcript appears.","draft.confirmingStructured":"Launched — confirming the agent. Don't send again; the panel attaches the conversation as soon as its transcript appears.","draft.confirmingNoTarget":"Confirming whether the agent started. Don't send again — the panel attaches the conversation as soon as its transcript appears.","draft.confirmingSlow":"Launching slowly — the launch is confirmed in tmux {target}. The panel keeps watching and attaches the conversation itself; don't launch again.","draft.confirmingSlowStructured":"Launching slowly — the launch is confirmed. The panel keeps watching and attaches the conversation itself; don't launch again.","draft.attention":"The agent may already be running in tmux {target}. Don't launch it again. Dismiss this draft once you've checked; it still attaches automatically if the transcript appears.","draft.attentionStructured":"The agent may already be running. Don't launch it again. Dismiss this draft once you've checked; it still attaches automatically if the transcript appears.","draft.attentionNoTarget":"The agent may already be running — check your tmux windows. Don't launch it again. Dismiss this draft once you've checked; it still attaches automatically if the transcript appears.","draft.hintRelay":"The new agent will first read the parent conversation's transcript and pick up from there. Add to the prompt what to do next — the branch will appear on the scheme alongside.","draft.hintNew":"Choose an engine and a directory, write the first prompt — the agent will start in tmux, and the conversation will continue in this same panel.","draft.hintNewStructured":"Choose an engine and a directory, write the first prompt — the agent will start, and the conversation will continue in this same panel.","draft.promptAria":"First prompt for the new agent","draft.placeholder":"first prompt — the agent will start in tmux…","draft.placeholderStructured":"first prompt — the agent will start…","draft.promptTextAria":"First prompt text","draft.newWindowTitle":"new tmux window with a fresh agent","draft.newWindowTitleStructured":"new structured session with a fresh agent","draft.newAgent":"new agent","draft.addImages":"Add images to the prompt","draft.stopAndLaunch":"Stop recording and launch the agent","draft.rolePromptToggle":"Role prompt (EN)","draft.speedFast":"fast","draft.speedStandard":"standard","effortTier.minimal":"minimal","effortTier.low":"low","effortTier.medium":"medium","effortTier.high":"high","effortTier.xhigh":"extra high","effortTier.max":"max","effortTier.ultra":"ultra","reasoningTier.minimal":"Minimal","reasoningTier.low":"Light","reasoningTier.medium":"Medium","reasoningTier.high":"High","reasoningTier.xhigh":"Extra High","reasoningTier.max":"Max","reasoningTier.ultra":"Ultra","roleCopy.orchestrator.name":"Orchestrator","roleCopy.orchestrator.description":"Coordinates fresh agents through the Viewer control plane.","roleCopy.orchestrator.param.mode.label":"Mode","roleCopy.orchestrator.param.mode.description":"Operating mode for the coordination run.","roleCopy.orchestrator.param.mode.option.standard":"Standard","roleCopy.orchestrator.param.mode.option.plan-tickets":"Plan tickets","roleCopy.orchestrator.param.mode.option.wayfind":"Wayfind","roleCopy.orchestrator.param.mode.option.backlog-campaign":"Backlog campaign","roleCopy.orchestrator.param.repo.label":"Repository","roleCopy.orchestrator.param.repo.description":"Repository for backlog-campaign mode.","roleCopy.orchestrator.param.issueQuery.label":"Issue query","roleCopy.orchestrator.param.issueQuery.description":"GitHub issue query for backlog-campaign mode.","roleCopy.orchestrator.param.urgent.label":"Urgent list","roleCopy.orchestrator.param.urgent.description":"Comma-separated urgent issue ids.","roleCopy.orchestrator.param.maxWorkers.label":"Maximum workers","roleCopy.orchestrator.param.maxWorkers.description":"Worker cap for backlog-campaign mode.","roleCopy.orchestrator.param.mergePolicy.label":"Merge policy","roleCopy.orchestrator.param.mergePolicy.description":"Delivery policy for backlog-campaign mode.","roleCopy.orchestrator.param.mergePolicy.option.pr":"Pull request","roleCopy.orchestrator.param.mergePolicy.option.merge":"Merge","roleCopy.orchestrator.param.completionPolicy.label":"Completion policy","roleCopy.orchestrator.param.completionPolicy.description":"Terminal policy for backlog-campaign mode.","roleCopy.orchestrator.param.completionPolicy.option.pr-opened":"PR opened","roleCopy.orchestrator.param.completionPolicy.option.merged":"Merged","roleCopy.orchestrator.param.completionPolicy.option.released":"Released","roleCopy.reviewer.name":"Reviewer","roleCopy.reviewer.description":"Reviews a code diff and returns severity-ranked evidence-backed findings.","roleCopy.reviewer.param.diffSource.label":"Diff source","roleCopy.reviewer.param.diffSource.description":"Diff or pull request reference to inspect.","roleCopy.reviewer.param.lens.label":"Lens","roleCopy.reviewer.param.lens.description":"Review lens.","roleCopy.reviewer.param.lens.option.correctness":"Correctness","roleCopy.reviewer.param.lens.option.over-engineering":"Over-engineering","roleCopy.reviewer.param.lens.option.silent-failure":"Silent failures","roleCopy.reviewer.param.lens.option.test-coverage":"Test coverage","roleCopy.reviewer.param.lens.option.scope":"Scope","roleCopy.reviewer.param.lens.option.prod-ops":"Prod ops","roleCopy.reviewer.param.lens.option.standards+spec":"Standards + spec","roleCopy.reviewer.param.lens.option.code-smells":"Code smells","roleCopy.reviewer.param.lens.option.all":"All lenses","roleCopy.reviewer.param.mode.label":"Mode","roleCopy.reviewer.param.mode.description":"Reviewer context mode.","roleCopy.reviewer.param.mode.option.fresh":"Fresh context","roleCopy.reviewer.param.parallelN.label":"Parallel passes","roleCopy.reviewer.param.parallelN.description":"Independent review passes.","roleCopy.verifier.name":"Verifier","roleCopy.verifier.description":"Tests supplied hypotheses and returns a per-claim evidence verdict.","roleCopy.verifier.param.claims.label":"Claims","roleCopy.verifier.param.claims.description":"Hypotheses to confirm or refute.","roleCopy.builder.name":"Builder","roleCopy.builder.description":"Writes product code for a scoped directive.","roleCopy.builder.param.mode.label":"Mode","roleCopy.builder.param.mode.description":"Implementation discipline.","roleCopy.builder.param.mode.option.plain":"Plain","roleCopy.builder.param.mode.option.apply-fixes":"Apply fixes","roleCopy.builder.param.mode.option.tdd":"TDD","roleCopy.builder.param.mode.option.diagnose":"Diagnose","roleCopy.builder.param.mode.option.prototype":"Prototype","roleCopy.builder.param.mode.option.merge-resolve":"Merge resolve","roleCopy.builder.param.domain.label":"Domain","roleCopy.builder.param.domain.description":"Product domain for the implementation.","roleCopy.builder.param.domain.option.general":"General","roleCopy.builder.param.domain.option.frontend":"Frontend","roleCopy.architect.name":"Architect","roleCopy.architect.description":"Produces an evidence-grounded design without product edits.","roleCopy.architect.param.mode.label":"Mode","roleCopy.architect.param.mode.description":"Architecture output mode.","roleCopy.architect.param.mode.option.design":"Design","roleCopy.architect.param.mode.option.spec":"Spec","roleCopy.architect.param.mode.option.architecture-audit":"Architecture audit","roleCopy.cleaner.name":"Cleaner","roleCopy.cleaner.description":"Safely recovers a dirty checkout under a backup contract.","roleCopy.prod-auditor.name":"Prod auditor","roleCopy.prod-auditor.description":"Performs a read-only evidence-backed production investigation.","roleCopy.prod-auditor.param.questions.label":"Questions","roleCopy.prod-auditor.param.questions.description":"Production questions to investigate.","roleCopy.deployer.name":"Deployer","roleCopy.deployer.description":"Plans a blue/green production deployment and stops for approval before mutation.","roleCopy.deployer.param.sha.label":"Merged SHA","roleCopy.deployer.param.sha.description":"Merged commit SHA to deploy.","roleCopy.deployer.param.pr.label":"Pull request","roleCopy.deployer.param.pr.description":"Optional pull request reference.","link.handoffContext":"You've been handed another agent's context — the conversation \xab{title}\xbb. Its transcript: {path} — read that file first for full context, then carry out the request below.\n\n{ask}","link.dropped":"context is in the composer of \xab{title}\xbb — type the ask and send","handoff.aria":"Hand the conversation to a new agent — a draft appears below","handoff.title":"click — draft a new agent with this context \xb7 drag — link to an existing one","handoff.label":"hand off to agent","qr.showAria":"Show a QR code for phone login","qr.failed":"couldn't get the link","qr.startHint":"Start the viewer with Tailscale access: ","qr.alt":"QR code for phone login","qr.generating":"generating QR…","qr.linkAria":"Phone login link","qr.copy":"Copy link","qr.scanHint":"scan from a phone on the same tailnet","telegram.title":"Telegram","telegram.rowAria":"Telegram connection","telegram.close":"Close","telegram.readOnlyNote":"Read-only \xb7 operator sessions only","telegram.status.disconnected":"Not connected","telegram.status.starting":"Starting…","telegram.status.awaiting_scan":"Scan the QR code","telegram.status.awaiting_password":"Password needed","telegram.status.verifying":"Verifying…","telegram.status.connected":"Connected","telegram.status.expired":"Session expired","telegram.status.error":"Error","telegram.connect":"Connect Telegram","telegram.connectHint":"Sign in by scanning a QR code from the Telegram app. The Viewer stores the session on this machine only.","telegram.credentialsHint":"Telegram API credentials are not configured yet. Enter your api_id and api_hash from my.telegram.org — they stay on this machine.","telegram.credentialsIdLabel":"API ID","telegram.credentialsHashLabel":"API hash","telegram.credentialsSave":"Save credentials","telegram.credentialsSource":"Saved into the Viewer's own config (telegram.json, owner-only). Environment variables, when set, take precedence.","telegram.credentialsInvalid":"That does not look like a valid api_id + api_hash pair. Nothing was saved.","telegram.reconnect":"Reconnect","telegram.retry":"Retry","telegram.cancel":"Cancel","telegram.qrAlt":"Telegram sign-in QR code","telegram.qrGenerating":"generating QR…","telegram.qrFailed":"The QR code could not be generated.","telegram.qrRetry":"Try QR again","telegram.qrHint":"In Telegram on your phone: Settings → Devices → Link Desktop Device, then scan. An expired code refreshes automatically.","telegram.passwordLabel":"Two-step verification password","telegram.passwordPlaceholder":"Telegram 2FA password","telegram.passwordSubmit":"Submit","telegram.passwordInvalid":"Wrong password. Try again.","telegram.passwordHint":"Telegram asked for your two-step verification password. It goes to Telegram only.","telegram.connectedAs":"Connected as","telegram.lastCheck":"Checked {time}","telegram.expiredHint":"Telegram ended this session. Reconnect to continue.","telegram.logout":"Log out","telegram.logoutConfirm":"Log out of Telegram and remove the local session?","telegram.deleteLocal":"Delete local session","telegram.deleteLocalConfirm":"Delete the local session? The remote Telegram authorization may remain — remove it in Telegram → Devices.","telegram.confirmCta":"Confirm","telegram.confirmCancel":"Cancel","telegram.actionFailed":"That didn't go through. Try again; if it keeps failing, close and reopen this panel.","telegram.actionUnreachable":"The Viewer server didn't respond. Check the connection and try again.","telegram.err.login_busy":"Another Telegram sign-in is already in progress.","telegram.err.credentials_missing":"Telegram API credentials are not configured on this host.","telegram.err.start_failed":"Sign-in could not start.","telegram.err.bridge_failed":"Sign-in ended unexpectedly.","telegram.err.password_invalid":"Wrong password.","telegram.err.network_failed":"Network error. Try again.","telegram.err.timed_out":"Sign-in timed out.","telegram.err.canceled":"Sign-in was canceled.","telegram.err.session_unsafe":"Local session storage failed safety checks.","telegram.err.connector_failed":"The Telegram connector could not start.","telegram.err.host_registration_failed":"Telegram could not be registered with the local agent hosts.","telegram.err.not_read_only":"Refused: the connector advertised tools that are not read-only.","telegram.err.logout_failed":"Remote logout failed. You can delete the local session instead.","telegram.err.health_failed":"Could not check the connection.","telegram.announceScan":"Telegram QR code ready. Scan it from your phone.","telegram.announcePassword":"Telegram asks for your two-step verification password.","telegram.announceConnected":"Telegram connected.","telegram.report.title":"Daily report","telegram.report.loading":"Loading…","telegram.report.disabledHint":"Once a day, an agent reads your private dialogs and the groups you pick, then writes one report you read here.","telegram.report.enable":"Enable daily report","telegram.report.disable":"Turn off","telegram.report.at":"At","telegram.report.zone":"Kyiv time","telegram.report.sourcesSummary":{one:"Sources: active private dialogs + {count} group",other:"Sources: active private dialogs + {count} groups"},"telegram.report.sourcesEdit":"Groups","telegram.report.sourcesDone":"Done","telegram.report.sourcesHint":"Private dialogs are picked automatically by recent activity. Choose which groups to include: light reads only what touches you, full reads the whole group.","telegram.report.loadGroups":"Load my groups","telegram.report.noGroups":"No groups loaded yet.","telegram.report.modeLight":"Light","telegram.report.modeFull":"Full","telegram.report.runNow":"Run now","telegram.report.running":"Running…","telegram.report.nextRun":"Next {time}, {date}","telegram.report.noRuns":"No runs yet.","telegram.report.open":"Open","telegram.report.openRun":"Run","telegram.report.openRunTitle":"Open this run on the board","telegram.report.promptTitle":"Report prompt","telegram.report.promptHint":"Your brief for the report agent: language, the tag line, the sections, which repository issue proposals target, tone. Edit it here — no release needed.","telegram.report.promptPreamble":"The Viewer always adds the window, the selected sources, the output path and the sequential-read rules in front of your text. It verifies the connected account itself, before the run starts.","telegram.report.promptEdit":"Prompt","telegram.report.promptSave":"Save prompt","telegram.report.promptReset":"Reset to default","telegram.report.promptDefault":"Prompt: default template","telegram.report.promptEdited":"Prompt: edited by you","telegram.report.back":"Back","telegram.report.status.running":"running","telegram.report.status.ok":"report","telegram.report.status.quiet":"quiet","telegram.report.status.failed":"failed","telegram.report.status.account-mismatch":"wrong account","telegram.report.err.account_mismatch":"The connected account is not the one this report was set up for. Nothing was read.","telegram.report.err.not_connected":"Telegram is not connected, so the run could not start.","telegram.report.err.reports_disabled":"Daily reports are turned off.","telegram.report.err.run_in_progress":"A report run is already going.","telegram.report.err.account_check_failed":"The connected account could not be verified, so nothing was read.","telegram.report.err.sources_failed":"The chats to read could not be listed. The connector may be restarting.","telegram.report.err.launch_failed":"The report run could not be started.","telegram.report.err.run_ended_without_report":"The run ended before it wrote a report. Run it again.","telegram.report.err.timed_out":"The run took too long and was stopped.","telegram.report.err.invalid_report":"The run wrote something the Viewer could not read as a report.","telegram.report.err.report_missing":"That report is no longer stored.","telegram.report.err.transport":"The Viewer server didn't respond. Try again.","telegram.report.err.generic":"That didn't go through. Try again.","push.enabled":"Push notifications enabled","push.enable":"Enable push notifications","push.disable":"Disable push notifications","push.needsHttps":"Push requires HTTPS","sound.on":"Sound notifications on","sound.off":"Sound notifications off","sound.mute":"Mute sound notifications","sound.unmute":"Enable sound notifications","sound.settings":"Sound levels","sound.cueVolume":"Notification cues","sound.ambientViewer":"Background music in the Viewer","sound.ambient":"Background music during a call","sound.ambientVolume":"Music level","sound.ambientHint":"Plays quietly at this level, and ducks under speech during a call. With both on, the same track keeps playing across the call.","keepAwake.label":"Keep screen awake","keepAwake.enableAria":"Keep the screen awake on this device","keepAwake.disableAria":"Let the screen sleep on this device","keepAwake.off":"The screen sleeps on this device's usual timer.","keepAwake.requesting":"Asking the browser…","keepAwake.active":"Screen stays awake while this tab is visible. Uses more battery.","keepAwake.waiting":"Paused while this tab is hidden. Resumes when you come back.","keepAwake.interrupted":"The system released the lock. Turn this off and on to ask again.","keepAwake.blocked":"The browser refused the request. The screen is not held.","keepAwake.failed":"The request failed. The screen is not held.","keepAwake.insecure":"Needs an HTTPS address. Over plain HTTP the screen cannot be held.","keepAwake.unsupported":"This browser has no screen wake lock.","mic.stopRecognize":"Stop recording and transcribe","mic.cancel":"Cancel recording","mic.recognizing":"Transcribing…","mic.dictate":"Dictate","mic.dictateHint":"dictate (up to 10 min) \xb7 right-click: transcription method","mic.timeLeft":"{time} left before auto-stop","mic.capStopped":"stopped at 10:00","mic.connecting":"Connecting the microphone — a moment…","mic.menuTitle":"Transcription method","mic.menuLoading":"checking what's available…","mic.menuLocked":"Locked by the LLV_TRANSCRIBE_BACKEND environment variable","mic.noKey":"not set up","mic.saveFailed":"couldn't save the choice","mic.keyTitle":"{name} is not set up","mic.copy":"copy","mic.copyPath":"Copy path","mic.copied":"copied","mic.back":"Back","stt.local.name":"Faster Whisper","stt.local.desc":"Free, fully local — audio never leaves this machine.","stt.local.fix":"Run scripts/setup-whisper.sh in the app folder once; it installs the local engine at:","stt.chatgpt.name":"ChatGPT Voice","stt.chatgpt.desc":"Covered by your ChatGPT subscription, via the Codex login.","stt.chatgpt.fix":"Log in to Codex (run `codex login`) — the token will appear at:","stt.elevenlabs.name":"ElevenLabs Scribe","stt.elevenlabs.desc":"Paid ElevenLabs API — the most accurate option.","stt.elevenlabs.fix":"Put your ElevenLabs API key (a single line) into this file:","stt.soniox.name":"Soniox","stt.soniox.desc":"Paid Soniox API — the fastest live transcription.","stt.soniox.fix":"Put your Soniox API key (a single line) into this file:","delFile.confirm":"Delete from disk?","delFile.aria":"Delete the conversation from disk","rename.edit":"Rename","rename.editAria":"Rename “{title}”","rename.inputAria":"Session title","rename.save":"Save name","rename.cancel":"Cancel","rename.reset":"Reset to auto title","rename.resetHint":"Reset to the auto title: {title}","rename.autoHint":"Auto title: {title}","rename.retry":"Retry","rename.saved":"Renamed to {title}","rename.conflict":"Name changed elsewhere — adopted the latest and retried","rename.failed":"Couldn't save the name","img.readFailed":"couldn't read the image","img.readAborted":"image reading aborted","img.unsupported":"unsupported image format: {name}","img.unknownFile":"unknown file","img.tooLarge":"{name}: too large (10 MB limit)","img.structuredTooLarge":"Image exceeds this host's {max} MB limit","img.tooManyStructured":"Up to {max} images can be sent at once","img.structuredAggregateTooLarge":"Images exceed this host's {max} MB request limit","img.image":"image","img.error":"image error","img.previewAlt":"image preview {n}","img.removeAria":"Remove image {n}","img.readingAria":"loading image {n}","img.retry":"Retry","img.retryAria":"Retry image {n}","img.clearAll":"Clear all","img.clearAllAria":"Remove all images","img.blockedReading":"Waiting for the image to finish loading…","img.blockedFailed":"Remove or retry the failed image to send","img.deliveryHint":"attached to the message","question.sec":"{n} s","question.min":"{n} min","question.hour":"{n} h","question.waiting":"waiting for a reply","question.sentToPane":"Sent to the pane: {text}","question.keysHint":"keys into the pane \xb7 or the composer below","question.pane":"Pane {target}","question.alreadyAnswered":"answer already recorded","question.openFailed":"couldn't open the session","question.opened":"opened {target}","question.answered":"Answered: {text}","question.answeredElsewhere":"Answered elsewhere: {text}","question.noPane":"tmux pane unavailable","question.openSession":"open session","question.rejectComment":"Rejection comment…","question.approved":"approved","question.rejected":"rejected","question.approve":"Approve","question.reject":"Reject","question.ownAnswer":"Your own answer…","question.dismiss":"Dismiss the question card","question.deliveryFailed":"Delivery failed","question.failedChoice":"not delivered","question.retryAnswer":"Retry","question.errorNotRunning":"the agent is no longer running, so nothing was delivered","question.errorMoved":"the agent has moved on from this question","question.errorUnconfirmed":"the answer was sent, but the agent never confirmed it","question.errorNotDelivered":"the agent's screen did not respond as expected, so the answer was not delivered","question.errorRejected":"the viewer could not build a valid answer","inbox.deleted":"deleted from disk","inbox.fileGone":"the file is no longer on disk","inbox.confirmDelete":"Delete the file from disk?","inbox.deleteAria":"Delete {name} from disk","inbox.deleteFromDisk":"delete from disk","inbox.attachedAlt":"attached image {name}","lightbox.zoomOut":"Zoom out","lightbox.resetZoom":"Reset zoom","lightbox.zoomIn":"Zoom in","preview.dialogTitle":"{name} — document preview","preview.close":"Close preview","preview.download":"Download file","preview.openExternal":"Open in a new tab","preview.resize":"Resize preview","preview.kindPdf":"PDF document","preview.kindImage":"Image","preview.kindText":"Text file","preview.kindUnknown":"File","preview.loading":"Loading…","preview.missing":"This file no longer exists.","preview.denied":"Access to this file was denied.","preview.unsupported":"This file type cannot be previewed.","preview.oversized":"This file is larger than the preview limit.","preview.changed":"The file changed on disk since the preview opened.","preview.aborted":"Loading was cancelled.","preview.error":"The preview could not be loaded.","preview.reload":"Reload","preview.searchPlaceholder":"Search loaded text","preview.noMatches":"no matches","preview.prevMatch":"Previous match","preview.nextMatch":"Next match","preview.wrapLines":"Wrap lines","preview.loadMore":"Load more","preview.loadedOf":"Loaded {loaded} of {size}","preview.fit":"Fit","preview.fitImage":"Fit to pane","preview.fitWidth":"Fit width","preview.prevPage":"Previous page","preview.nextPage":"Next page","preview.pageOf":"Page {page} of {pages}","feed.agentEnded":"agent finished","feed.copyCode":"Copy code","feed.copyMd":"Copy message (Markdown)","feed.voiceTurn":"Voice","selectedContext.stale":"stale","selectedContext.ariaSelected":"Selected card: {name} (project {project})","feed.voiceContext":"Call transcript","feed.speak":"Read answer aloud (AI-generated voice)","feed.stopSpeaking":"Stop reading aloud","tts.read":"Read answer aloud","tts.readPaid":"Read aloud (paid)","tts.replay":"Replay answer audio","tts.replayFree":"Replay aloud (free)","tts.triggerTitle":"{action} \xb7 right-click: voice & billing","tts.stop":"Stop reading aloud","tts.menuTitle":"Voice & billing","tts.menuLocked":"Locked by the LLV_TTS_BACKEND environment variable","tts.nextPaid":"Next click: paid synthesis of this answer","tts.nextFree":"Next click: free replay from the cache","tts.nextStop":"Next click: stop reading this answer","tts.noKey":"not set up","tts.saveFailed":"Could not switch the voice provider","tts.replayExpired":"Cached audio expired — this replay is a paid synthesis.","tts.backendChanged":"The voice provider changed — this read is billed to {provider}.","tts.characters":"{count} characters","tts.billing":"Billed to your {provider} account per character.","tts.disclosure":"You’ll hear an AI-generated voice, not a human voice.","tts.tooLong":"Too long to read aloud ({count} character limit). Nothing is cut short — read a shorter passage.","tts.seekHint":"Click the text while it plays to jump there.","tts.partOf":"Part {index} of {count}","tts.finished":"Finished reading","tts.missingKey":"Add the {provider} API key at {path}","tts.generating":"Generating audio…","tts.playing":"Playing audio","tts.stopped":"Stopped","tts.configError":"TTS configuration unavailable","tts.requestError":"TTS request failed ({status})","tts.requestFailed":"TTS request failed","tts.playError":"The browser blocked audio playback. Try again.","feed.running":"running {tool}…","feed.tool":"tool","feed.thinking":"thinking…","feed.working":"working…","feed.liveTail":"live tail","feed.liveOmittedItems":"… ({count} earlier live items, {chars} characters)","feed.liveToolArgsOmitted":"arguments omitted","feed.liveToolOutcomeOmitted":"outcome omitted","feed.liveOmittedChars":"… (+{chars} characters)","feed.backToLive":"Back to the live tail","feed.newCount":"{count} new","feed.down":"down","feed.pickLog":"Pick a log on the left — the feed updates itself","feed.showEarlier":"show earlier","feed.showEarlierHidden":"show earlier (hidden {count})","feed.loadEarlier":"load earlier from the file","feed.startOfConvo":"start of the conversation","feed.finishedTurn":"finished the turn — waiting for a reply","feed.returnedResult":"returned with a result","feed.noOutput":"No output yet — the file is empty for now","feed.onlyService":"Only service records are present ({count}).","feed.empty":"Empty (no rows to show)","render.system":"system","render.executing":"executing…","render.error":"error","render.teammate":"teammate","render.left":"{peer}: left{at}","render.codexSessionCreated":"Codex session created","render.taskStarted":"Task started","render.taskComplete":"Task completed","render.compacted":"context compacted","render.compactAuto":"auto","render.compactManual":"manual","render.compactPre":"{n}k tokens before","render.compactSummary":"conversation summary","render.stdinSession":"stdin → session {id}","render.record":"record","render.transcriptRecord":"transcript record","render.recordDetails":"record details","render.protocol":"protocol","render.image":"image","render.imageOutput":"image output","render.toolOutput":"tool output","render.toolOutputType":"tool output: {type}","render.dataKb":"{n} kB of data","render.commands":{one:"{count} command",other:"{count} commands"},"render.actions":{one:"{count} action",other:"{count} actions"},"render.noFindings":"no findings","render.moreFindings":"{count} more findings in raw","render.memoryCitations":"memory citations ({count})","render.noCitations":"no citation entries","render.moreEntries":"{count} more entries in raw","render.truncated":"truncated","render.shutdownRequest":"shutdown request","render.shutdownResponse":"shutdown response","render.planRequest":"plan approval request","render.planVerdict":"plan verdict","render.approved":"approved","render.rejected":"rejected","render.from":"from {from}","render.structured":"structured message","render.showJson":"show JSON","render.toDir":"to","render.fromDir":"from","render.internalTag":"internal","render.agentPeer":"agent","render.delivered":"delivered","render.notDelivered":"not delivered","render.reasoning":"agent reasoning","tools.read":"Read","tools.write":"Write","tools.edit":"Edit","tools.lines":{one:"{count} line",other:"{count} lines"},"tools.files":{one:"{count} file",other:"{count} files"},"tools.items":{one:"{count} item",other:"{count} items"},"tools.family.shell":"shell command","tools.family.read":"read file","tools.family.write":"write file","tools.family.edit":"edit","tools.family.search":"search","tools.family.web":"web","tools.family.spawn":"spawn agent","tools.family.plan":"plan","tools.family.mcp":"MCP tool","tools.family.other":"tool","tools.showAllLines":"show all ({count} lines)","tools.showOutput":"show all output","tools.moreFiles":"…and {count} more files","tools.binaryContent":"binary content \xb7 {size}","tools.rawRecord":"raw record","tools.noRawRecord":"detail no longer loaded","tools.noOutput":"no output captured","tools.noOutputTip":"the full output lives in the rollout session","tools.stdin":"stdin","tools.stdinPoll":"poll","tools.pollRun":{one:"{count} poll",other:"{count} polls"},"tools.wait":"wait","tools.session":"session","tools.waitingSeconds":"waiting {n}s","tools.wakeup":"scheduled wakeup","tools.cron":"scheduled agent","tools.monitor":"monitor","tools.schedule":"schedule","tools.diffTruncated":"truncated to fit","tools.orchestration":{one:"{count} tool call",other:"{count} tool calls"},"tools.nestedCalls":"nested calls","tools.callId":"call {id}","tools.copyId":"copy id","tools.copyDiff":"Copy diff","tools.copyOutput":"Copy output","tools.source":"source","tools.action":"action {index}","tools.cwd":"cwd","tools.copyCwd":"copy cwd","tools.copyCommand":"Copy command","tools.stdout":"stdout","tools.stderr":"stderr","tools.copyStderr":"Copy stderr","tools.showStderr":"show all stderr","tools.noStderr":"no stderr captured","tools.exitOk":"exit 0","tools.exitCode":"exit {code}","tools.durationSec":"{n}s","tools.durationMin":"{m}m {s}s","tools.durationMs":"{n}ms","tools.ranAt":"{start}–{end}","tools.nestedWaits":{one:"{count} follow-up",other:"{count} follow-ups"},"wakeup.card":"scheduled wakeup","wakeup.wakesAt":"wakes at {time}","wakeup.wasSetFor":"was set for {time}","wakeup.firedAt":"fired at {time}","wakeup.fired":"fired","wakeup.failed":"scheduling failed","wakeup.superseded":"superseded","wakeup.noTime":"wakeup scheduled","wakeup.plan":"wake plan","wakeup.planInternal":"internal prompt","wakeup.noPlan":"no wake plan given","wakeup.inRel":"in {rel}","wakeup.agoRel":"{rel} ago","wakeup.relSec":{one:"{count}s",other:"{count}s"},"wakeup.relMin":{one:"{count} min",other:"{count} min"},"wakeup.relHour":{one:"{count} h",other:"{count} h"},"wakeup.relDay":{one:"{count} d",other:"{count} d"},"wakeup.chipTitle":"sleeping until {time} — {reason}","flowDialog.engine":"Engine: {label}","flowDialog.modelPlaceholder":"model (default)","flowDialog.model":"Model: {label}","flowDialog.effortDefault":"effort: default","flowDialog.createFailed":"couldn't create the flow ({status})","flowDialog.title":"Start a flow","flowDialog.subtitle":"implement → review \xb7 this conversation becomes the implementer","flowDialog.preset":"preset","flowDialog.rolesManualOpen":"▾ roles manually","flowDialog.rolesManual":"▸ roles manually (model / effort)","flowDialog.spec":"specification and acceptance criteria","flowDialog.specPlaceholder":"Task statement\nAC1: …\nAC2: …","flowDialog.implementer":"implementer","flowDialog.reviewer":"reviewer","flowDialog.diffBase":"diff base","flowDialog.fromHead":"from current HEAD","flowDialog.fromMergeBase":"from merge-base with main","flowDialog.headless":"headless (no pane)","flowDialog.tmuxPane":"tmux pane","flowDialog.transitions":"transitions","flowDialog.auto":"auto","flowDialog.manual":"manual (gate every step)","flowDialog.roundLimit":"round limit","flowDialog.creating":"creating…","flowDialog.start":"▶ Start","flowStrip.startReview":"Start review","flowStrip.spawnReviewer":"Spawn reviewer","flowStrip.relayNotes":"Relay notes","flowStrip.retryRound":"Retry round","flowStrip.anotherRound":"Another round","flowStrip.flow":"Flow","flowStrip.roundsAria":"Review rounds","flowStrip.roundError":"Round {n}: {error}","flowStrip.roundVerdict":"Round {n}: {verdict}","flowStrip.roundInProgress":"Round {n}: in progress","flowStrip.addRoundsTitle":"Add more rounds to the limit","flowStrip.plus2":"+2 rounds","flowStrip.limitTitle":"Round limit: reviews before the loop parks (∞ — unlimited)","flowStrip.limitAria":"Set the round limit to {count}","flowStrip.limitUnlimitedAria":"Unlimited rounds","flowStrip.stopReviewer":"Stop","flowStrip.stopReviewerTitle":"Stop the running reviewer; the round lands in “needs decision”","flowStrip.notePlaceholder":"note for the reviewer…","flowStrip.noteTitle":"Sent to the next reviewer as the round's ready note","flowStrip.autoTitle":"Auto: transitions run themselves. Click — manual.","flowStrip.manualTitle":"Manual: every transition waits for a click. Click — auto.","flowStrip.manualShort":"manual","flowStrip.resume":"Resume flow","flowStrip.pause":"Pause","flowStrip.close":"Close flow","flowHub.aria":"Flow controls — round {n}, {state}","flowHub.ariaNoRound":"Flow controls — {state}","flowHub.controls":"Flow controls","groupOverride.closePanel":"Close controls","groupOverride.flowTitle":"Override \xb7 {name}","groupOverride.pipelineTitle":"Override \xb7 {name}","groupOverride.draftTitle":"Edit draft \xb7 {name}","groupOverride.task":"Task","groupOverride.spec":"Specification","groupOverride.repoDir":"Repository","groupOverride.saveDraft":"Save draft details","groupOverride.savedDraft":"Draft details saved","groupOverride.reviewerRole":"Next reviewer","groupOverride.engine":"Engine","groupOverride.effort":"Effort","groupOverride.effortDefault":"default","groupOverride.model":"Model","groupOverride.modelPlaceholder":"engine default","groupOverride.applyRole":"Update reviewer","groupOverride.nextRoundNote":"Next-round note","groupOverride.notePlaceholder":"What the next reviewer should focus on…","groupOverride.noteUnavailable":"Editable when you start, spawn, or retry a round.","groupOverride.roundLimit":"Round limit","groupOverride.setLimit":"Set","groupOverride.extend":"+1 round","groupOverride.nextStage":"Next stage","groupOverride.draftStage":"Draft stage","groupOverride.addStage":"Add stage","groupOverride.removeStage":"Remove stage","groupOverride.moveStageUp":"Move up","groupOverride.moveStageDown":"Move down","groupOverride.role":"Role","groupOverride.noRole":"No role","groupOverride.stagePrompt":"Stage prompt","groupOverride.applyStage":"Update stage","groupOverride.noEditableStage":"No upcoming stage to edit — every stage has already started.","groupOverride.editStagesOnCanvas":"Edit stages on their cards — role, model, prompt, order, and connections live on each stage's card in the canvas.","groupOverride.savedReviewer":"Reviewer updated for the next round","groupOverride.savedLimit":"Round limit updated","groupOverride.savedExtend":"Added a round","groupOverride.savedRetry":"Retrying the round","groupOverride.savedCancel":"Reviewer stopped","groupOverride.savedStage":"Stage updated for its next run","groupOverride.stagesHeading":"Stages \xb7 execution order","groupOverride.stagesHint":"Drag cards to reorder. The order is the execution chain.","groupOverride.stagesEmpty":"No stages yet — add a stage below to start building.","groupOverride.startNeedsStages":"Add at least 1 stage before starting.","groupOverride.addRunStage":"Add stage","groupOverride.addReviewStage":"Add review loop","groupOverride.dragHandle":"Drag to reorder this stage","groupOverride.runKind":"run","groupOverride.reviewKind":"review loop","groupOverride.reordered":"Stages reordered","groupOverride.stageAdded":"Stage added","groupOverride.stageRemoved":"Stage removed","pipelineBuilder.untitledTask":"New pipeline","pipelineBuilder.createDraft":"Pipeline","pipelineBuilder.createDraftAria":"Add a draft pipeline to the canvas","roundDeck.roundAborted":"Round {n} \xb7 aborted","roundDeck.roundVerdict":"Round {n} \xb7 {verdict}","roundDeck.roundInProgress":"Round {n} \xb7 in progress","roundDeck.aborted":"aborted","roundDeck.reviewInProgress":"review in progress","roundDeck.waitingFirst":"waiting for the first review round…","roundDeck.spawningReviewer":"launching the reviewer — the transcript will appear shortly…","roundDeck.moreRounds":"{count} more round(s) — click the chips on the flow strip","roundDeck.findings":{one:"{count} finding",other:"{count} findings"},"roundDeck.roundsCount":{one:"{count} round",other:"{count} rounds"},"roundDeck.collapseStack":"Collapse review stack ({count} rounds)","roundDeck.expandStack":"Expand review stack ({count} rounds)","roundDeck.groupAria":{one:"Review conversation group \xb7 {count} round",other:"Review conversation group \xb7 {count} rounds"},"roundDeck.groupAriaNamed":{one:"Review group for {name} \xb7 {count} round",other:"Review group for {name} \xb7 {count} rounds"},"subagentTray.label":{one:"{count} subagent",other:"{count} subagents"},"subagentTray.toggle":{one:"Expand the subagent tray ({count} folded subagent)",other:"Expand the subagent tray ({count} folded subagents)"},"subagentTray.collapse":{one:"Collapse the subagent tray ({count} folded subagent)",other:"Collapse the subagent tray ({count} folded subagents)"},"subagentTray.rows":"Folded subagents","subagentTray.open":"Open the {name} subagent transcript","subagentTray.fold":"Fold {name} into the subagent tray","subagentTray.unfold":"Restore {name} to a full card","subagentTray.state.running":"working","subagentTray.state.live":"live","subagentTray.state.silent":"alive but silent","subagentTray.state.closed":"idle","subagentTray.state.dead":"unavailable","flowState.waiting_ready":"waiting for READY","flowState.spawn_pending":"ready to spawn the reviewer","flowState.spawning":"spawning the reviewer","flowState.reviewing":"reviewing","flowState.relay_pending":"verdict ready — relay?","flowState.relaying":"relaying notes","flowState.fixing":"fixing","flowState.approved":"approved","flowState.done_comment":"done with comments","flowState.needs_decision":"needs a decision","flowState.paused":"paused","flowState.closed":"closed","flowState.blocked_rate_limited":"blocked: rate-limited","flowState.rate_limit_until":"resets at {time}","flowState.rate_limit_wait":"waiting for the quota reset","flowModel.failed":"failed ({status})","wfState.provisioning":"provisioning the worktree","wfState.implementing":"stages running","wfState.reviewing":"reviewing","wfState.finishing":"finishing","wfState.approved":"approved","wfState.needs_decision":"needs a decision","wfState.paused":"paused","wfState.closed":"closed","wfModel.failed":"failed ({status})","wfStrip.workflow":"Workflow","wfStrip.stagesAria":"Workflow stages","wfStrip.reviewStage":"review","wfStrip.advance":"Advance","wfStrip.retryStage":"Retry stage","wfStrip.skipStage":"Skip","wfStrip.resume":"Resume workflow","wfStrip.pause":"Pause","wfStrip.close":"Close workflow","pipelineState.draft":"draft","pipelineState.provisioning":"provisioning the worktree","pipelineState.running":"stages running","pipelineState.needs_decision":"needs a decision","pipelineState.paused":"paused","pipelineState.completed":"completed","pipelineState.closed":"closed","pipelineModel.failed":"failed ({status})","pipelineStrip.pipeline":"Pipeline","pipelineStrip.start":"Start pipeline","pipelineStrip.discard":"Discard draft","pipelineStrip.stagesAria":"Pipeline stages","pipelineStrip.reviewStage":"review loop","pipelineStrip.retryStage":"Retry stage","pipelineStrip.skipStage":"Skip","pipelineStrip.resume":"Resume pipeline","pipelineStrip.pause":"Pause pipeline","pipelineStrip.close":"Close pipeline","pipelineStrip.readOnly":"read-only","pipelineStrip.readWrite":"read-write","pipelineStrip.groupAria":"Pipeline {task}","pipelineStrip.baseSha":"Base {sha}","pipelineStrip.baseShaFull":"Full base commit {sha}","pipelineStrip.copyBaseSha":"Copy full base commit {sha}","pipelineStrip.copiedBaseSha":"Full base commit copied","pipelineStrip.copyBaseShaFailed":"Could not copy the base commit","pipelineStrip.moreActions":"More pipeline actions","pipelineStrip.announce":"Pipeline {task}: {state}, stage {stage} {k} of {n}","pipelineStrip.openStage":"Open stage {label}","pipelineStrip.openVerdict":"Open verdict for stage {label}, state {state}","pipelineStrip.openTranscript":"Open transcript for stage {label}, state {state}","pipelineStrip.configureStage":"Configure stage {label}, state {state}","pipelineStrip.configAria":"Configuration for stage {label}","pipelineStrip.closeConfig":"Close stage configuration","pipelineStrip.lineageAria":"Stage lineage from {from} to {to}","pipelineStrip.previousStage":"Open previous stage {label}, state {state}","pipelineStrip.nextStage":"Open next stage {label}, state {state}","pipelineStrip.evidenceAria":"Stage {label} evidence: {verdict}, duration {duration}, model {model}","pipelineStrip.defaultModel":"default model","pipelineStrip.unknownDuration":"duration unavailable","pipelineStrip.linkedTasks":"Linked tasks","pipelineStrip.openTask":"Open linked task {label}","pipelineStrip.roundShort":"R{n}","pipelineStrip.attemptSuffix":"\xd7{n}","stageGraph.roundProgress":"round {round}/{total}","stageGraph.startedNotice":"This stage started while settings were open. Its saved server configuration is now locked.","pipelineStrip.chipAria":"Stage {label}: {state}","pipelineStrip.compactChipAria":"{label}, {state}","pipelineStrip.stageOf":"stage {k}/{n}","pipelineStrip.passEdgeAria":"Pass edge from {from} to {to}","pipelineStrip.failEdgeAria":"Fail edge from {from} to {to}, round {k} of {n}","pipelineStrip.nextEdge":"next","pipelineStrip.nextEdgeAria":"This edge runs next","pipelinePresentation.queued":"Queued","pipelinePresentation.waiting":"Waiting","pipelineShelf.aria":"Pipeline shelf","pipelineShelf.title":"Pipelines","pipelineShelf.edit":"Edit pipeline {task}","pipelineGroup.toggle":"Expand or collapse pipeline {task}","pipelineGroup.openHistory":"Open pipeline history for {task}","pipelineSlot.paneAria":"Planned stage {title}","pipelineSlot.completedAria":"Completed stage {title} — open to review","pipelineSlot.openTranscript":"Open conversation","pipelineSlot.stageOf":"stage {k}/{n}","pipelineSlot.promptLabel":"Stage prompt","pipelineSlot.noPrompt":"Extra context for this agent — the wiring above is automatic.","pipelineSlot.wiringTask":"Automatically receives: the task text","pipelineSlot.wiringPrev":"Automatically receives: the previous stage's output + the task text","pipelineSlot.waiting":"The {role} chat window opens here when this stage starts.","pipelineSlot.starting":"Starting the {role} agent…","pipelineSlot.reviewHint":"Review cycle over the previous stage — its rounds land here.","pipelineSlot.frozen":"This stage already ran — its configuration is locked.","pipelineSlot.saved":"Saved","pipelineSlot.rowAria":"Finished stage {title}","pipelineSlot.reasonSkipped":"Skipped by the operator — the chain moved on","pipelineSlot.rowExpand":"Show the full stage card","pipelineSlot.rowCollapse":"Collapse back to the status row","pipelineTemplates.planBuildReview":"Plan → Build → Review","pipelineTemplates.buildReview":"Build → Review","pipelineTemplates.buildVerify":"Build → Verify","pipelineSlot.addAgent":"Next agent","pipelineSlot.addAgentTitle":"Add the next agent handoff after this stage","pipelineSlot.addReview":"Review cycle","pipelineSlot.addReviewTitle":"Attach a review cycle (hard link) after this stage","pipelineSlot.moveEarlier":"Move {role} earlier in the chain","pipelineSlot.moveLater":"Move {role} later in the chain","pipelineSlot.savePrompt":"Save prompt","pipelineSlot.promptAria":"Stage prompt editor","pipelineSlot.connectHeading":"Connections","pipelineSlot.passEdgeLabel":"On pass, continue to","pipelineSlot.passEdgeEnd":"— completes the pipeline","pipelineSlot.failEdgeLabel":"On fail, loop back to","pipelineSlot.failEdgeNone":"— park for the operator","pipelineSlot.failEdgeSelf":"↺ this stage (retry itself)","pipelineSlot.failEdgeRounds":"Max loop rounds","pipelineSlot.passEdgeFrozen":"This stage already ran — its pass edge is frozen evidence.","pipelineSlot.failEdgeFrozen":"This fail edge was already traversed — it is frozen evidence.","pipelineTemplates.title":"New pipeline","pipelineTemplates.subtitle":"Pick a template. Its pipeline group lands on the board beside the linked task. Stage configuration remains available on demand.","pipelineTemplates.blank":"Blank canvas","pipelineTemplates.blankHint":"Start empty and assemble the stages by hand.","pipelineTemplates.noRole":"no role","pipelineTemplates.repoDir":"Repository directory","pipelineTemplates.checking":"Checking repository…","pipelineTemplates.ready":"Repository ready","pipelineTemplates.creating":"Creating pipeline…","pipelineTemplates.retry":"Retry","pipelinePreflight.empty":"Enter a repository directory","pipelinePreflight.missing":"The directory does not exist: {path}","pipelinePreflight.not_directory":"Choose a directory: {path}","pipelinePreflight.repo_unreadable":"The repository cannot be read: {path}","pipelinePreflight.repo_untraversable":"The repository cannot be opened: {path}","pipelinePreflight.not_git":"Choose a Git repository: {path}","pipelinePreflight.probe_failed":"The repository check could not finish — retry: {path}","pipelinePreflight.git_metadata_unwritable":"Git metadata is read-only: {path}","pipelinePreflight.worktree_parent_unwritable":"Pipeline worktrees cannot be created beside this repository: {path}","pipelineChipState.pending":"pending","pipelineChipState.spawning":"spawning","pipelineChipState.running":"running","pipelineChipState.reviewing":"reviewing","pipelineChipState.committing":"committing","pipelineChipState.passed":"passed","pipelineChipState.failed":"failed","pipelineChipState.needs_decision":"needs a decision","pipelineChipState.skipped":"skipped","pipelineVerdict.pass":"pass","pipelineVerdict.fail":"fail","pipelineVerdict.needsDecision":"needs decision","pipelineVerdict.confidence":"confidence","pipelineVerdict.reviewerSha":"Reviewer SHA {sha}","pipelineVerdict.findings":{one:"{count} finding",other:"{count} findings"},"pipelineVerdict.noFindings":"no findings recorded","pipelineVerdict.more":"+{count} more","pipelineVerdict.openTranscript":"Open transcript","pipelineVerdict.openAttemptTranscript":"Open transcript for attempt {n}","pipelineVerdict.reviewTranscripts":"Review transcripts","pipelineVerdict.openReviewTranscript":"Open review transcript {n}","pipelineVerdict.openFlow":"Open review","pipelineVerdict.retry":"Retry","pipelineVerdict.skip":"Skip","pipelineVerdict.priorAttempts":"Earlier attempts","pipelineVerdict.attemptLine":"Attempt {n}: {status}","pipelineVerdict.title":"Stage {label} verdict","pipelineHub.aria":"Pipeline {task}: {stage} \xb7 {k}/{n}","pipelineHub.controls":"Pipeline controls","pipelineHub.stageOf":"{stage} \xb7 {k}/{n}","pipelineHub.openControls":"Open pipeline controls","pipelineHub.attempt":"attempt {n}","pipelineHub.openDashboard":"Open dashboard strip","dash.pipeline":"Pipeline","dash.newPipeline":"New pipeline","board.historyGroup":"Undo and redo board actions","board.undo":"Undo","board.redo":"Redo","board.undoReopen":"Undo — reopen “{title}”","board.redoReclose":"Redo — close “{title}” again","board.undoNothing":"Nothing to undo","board.redoNothing":"Nothing to redo","scheme.pipeline":"Pipeline","scheme.pipelineTitle":"Start a pipeline from this conversation","board.pipeline":"Pipeline","board.newPipeline":"New pipeline","pipelineMobile.chipAria":"Pipeline {task}","pipelineMobile.position":"{k}/{n}","pipelineMobile.prevStage":"Previous stage {label}, state {state}","pipelineMobile.nextStage":"Next stage {label}, state {state}","pipelineMobile.openVerdict":"Open verdict for {label}, state {state}","pipelineMobile.expandDock":"Expand pipeline {task}","pipelineMobile.collapseDock":"Collapse pipeline {task}","pipelineMobile.summaryOpen":"Open pipelines ({n})","pipelineMobile.summaryCount":{one:"{n} pipeline",other:"{n} pipelines"},"pipelineMobile.summaryActive":"{n} active","pipelineMobile.summaryAttention":"{n} need you","pipelineMobile.summaryCompleted":"{n} done","pipelineMobile.sheetTitle":"Pipelines","pipelineMobile.closeSheet":"Close pipelines","pipelineMobile.completedGroup":{one:"{n} completed",other:"{n} completed"},"wfDraft.paneAria":"Draft of a new workflow","wfDraft.notStarted":"the workflow is not launched yet","wfDraft.newWorkflow":"new workflow","wfDraft.dismiss":"Dismiss the workflow draft","wfDraft.template":"template","wfDraft.templateAria":"Workflow template","wfDraft.repo":"repository","wfDraft.repoAria":"Repository directory","wfDraft.manualMode":"manual: a gate at every stage boundary","wfDraft.hint":"Pick a template and a repository, describe the task — the workflow creates a worktree, runs the stages and the review, then opens a PR.","wfDraft.taskPlaceholder":"the task for the workflow — the brief goes to every stage…","wfDraft.taskAria":"Workflow task brief","wfDraft.footerHint":"worktree \xb7 stages \xb7 review \xb7 PR","wfDraft.finishMerge":"local merge","wfDraft.needDir":"set the repository directory","wfDraft.needTask":"describe the task","wfDraft.launchFailed":"launch failed","wfDraft.launch":"▶ Launch workflow","wfDraft.launching":"launching…","scheme.flowTitle":"Run the implement → review cycle for this conversation","scheme.flow":"Flow","scheme.collapsedTitle":"Collapsed branches and tasks of this conversation","scheme.ancestorElided":{one:"Parent not drawn on this board: {title}",other:"{count} ancestors not drawn on this board, nearest: {title}"},"scheme.ancestorOffBoard":"Parent conversation is not on this board","scheme.underneath":"underneath","scheme.handTool":"Hand — drag the canvas (H, or hold Space)","scheme.selectTool":"Select — click and work with conversations (V)","scheme.zoomOut":"Zoom out (−)","scheme.zoom100":"Zoom 100% (1)","scheme.zoomIn":"Zoom in (+)","scheme.fitCurrent":"Fit current work (0)","scheme.fit":"Fit all content (Shift+0, or double-click the background)","scheme.framedCurrent":"Framed current work — {count} items","scheme.framedAll":"Framed all content — {count} items","scheme.offscreenNav":"Off-screen work","scheme.offscreenMore":"Show {count} more off-screen clusters","mobile.mapFrame":"Map framing","mobile.mapAll":"All","mobile.mapCurrent":"Current","scheme.roleImplementer":"Implementer","scheme.roleReviewer":"Reviewer","scheme.roleWorking":"working","scheme.roleWaiting":"waiting","scheme.lassoTool":"Multi-select — draw a box around agents, click cards to toggle","scheme.selectCheckOn":"Add this agent to the selection","scheme.selectCheckOff":"Remove this agent from the selection","scheme.boardAria":"Agent board — arrow keys move between agent windows","scheme.navStack":{one:"{count} quiet branch under {title}",other:"{count} quiet branches under {title}"},"scheme.navStackBare":{one:"{count} quiet branch",other:"{count} quiet branches"},"bulk.selectedCount":{one:"{count} selected",other:"{count} selected"},"bulk.placeholder":"one message to every selected agent…","bulk.textAria":"Broadcast text for the selected agents","bulk.sendAll":"Send to {count} agents","bulk.interrupt":"Interrupt","bulk.stop":"Stop","bulk.stopConfirm":"Stop {count} agents?","bulk.remove":"Clear from board","bulk.removeConfirm":"Close {count} cards?","bulk.flow":"Flow","bulk.fit":"Show selection","bulk.exit":"Exit selection (Esc)","bulk.retryFailed":"Retry failed ({count})","bulk.nodeGone":"node left the board","bulk.flowTitle":"Start a review flow on {count} agents","bulk.flowStart":"Start {count} flows","minimap.title":"Minimap — click or drag to navigate","minimap.stacks":{one:"{count} collapsed stack",other:"{count} collapsed stacks"},"plan.agentPlan":"Agent plan:","plan.stepsAria":"Plan: {done} of {total} steps","plan.nowSuffix":", now: {current}","plan.goal":"goal","plan.goalDone":"goal ✓","plan.goalBlocked":"goal ✖","plan.noObjective":"(objective not recorded in the transcript tail)","plan.tokens":"tokens: {n}","plan.time":"time: {n} min","plan.ctxTitle":"Context window: {pct}% used\n{used} of {window} tokens","plan.ctxSourceRuntime":"Window reported by the agent runtime","plan.ctxSourceRegistry":"Window from the bundled model registry ({version}) — approximate","plan.ctxTitleUnknown":"Context usage: {used} tokens\nWindow unknown for this model — percentage withheld","plan.ctxAria":"Context: {pct} percent of the window used","plan.ctxAriaUnknown":"Context: {used} tokens used, window size unknown","plan.goalAria":"Session goal: {status}","limits.now":"now","limits.inMin":"in {n}m","limits.inHour":"in {n}h","limits.inDay":"in {n}d","limits.asOf":"as of {time}","limits.left":"left","limits.reset":"reset {eta} \xb7 {at}","limits.stale":"data is stale: {stale}","limits.5h":"5h","limits.week":"Week","limits.windowMinutes":"{n}m","limits.windowHours":"{n}h","limits.windowDays":"{n}d","limits.accountsOpenAria":"Codex accounts — switch or add","limits.noDataYet":"no data yet","limits.rateLimited":"Provider is rate-limiting requests.","limits.rateLimitedRetry":"Provider is rate-limiting requests. Retry at {time}.","limits.reauthRequired":"Re-login to Claude is required.","burndown.title":"burndown","burndown.openAria":"Open {engine} burndown chart","burndown.close":"Close chart","burndown.windowAria":"Chart window","burndown.ideal":"even pace","burndown.actual":"remaining","burndown.loading":"Loading history…","burndown.failed":"Couldn't load history.","burndown.empty":"No history yet — the chart fills in as quota is sampled.","burndown.windowUnreported":"This plan reports no {window} window, so there is nothing to chart here.","burndown.buildsFrom":"history builds from {date}","burndown.fast":"{pct}% ahead of pace — burning fast","burndown.slow":"{pct}% under pace — room to spare","burndown.even":"on even pace","burndown.emptyBy":"at this rate, 0% by {at}","resources.ram":"RAM","resources.swap":"Swap","resources.free":"{amount} free","resources.used":"{amount} used","resources.stale":"resource data is stale: {stale}","resources.captured":"captured {age}","resources.openAria":"Agent sessions and memory","resources.title":"Agent sessions","resources.total":"Σ {amount}","resources.empty":"no agent sessions in tmux","resources.orphan":"orphan pane","resources.hostConflict":"duplicate conversation pane","resources.hostConflictHint":"multiple live panes claim this conversation","resources.procs":{one:"{count} process",other:"{count} processes"},"resources.swapShare":"+ {amount} swap","resources.kill":"Kill","resources.confirm":"Sure?","resources.killLiveHint":"the agent is working right now — click to unlock, then confirm","resources.killHint":"kill the tmux pane with its whole process tree","resources.bulkLabel":"idle longer than","resources.bulkKill":"Kill idle","resources.bulkNone":"nothing has been idle that long","resources.hoursN":"{n} h","resources.killAll":"Kill all agents","resources.killAllConfirm":"Confirm — kill {n}?","resources.killAllHint":"force-kill every agent pane, live ones included — a clean slate so the next spawn/message routes cleanly. Your shells and the viewer are left alone.","resources.killAllNone":"no agent sessions to kill","resources.close":"Close","attach.attach":"Attach","attach.readonly":"Read-only","attach.copy":"Copy attach command","attach.copyReadonly":"Copy read-only attach command","attach.hint":"copy the tmux attach command for this pane — paste it into any shell","attach.readonlyHint":"copy a read-only (view-only) attach command — you watch without touching the keys","attach.loading":"resolving…","attach.copied":"attach command copied","attach.copiedReadonly":"read-only command copied","attach.stale":"This pane changed or closed. Refresh and try again.","attach.restarted":"The tmux server restarted. Refresh and try again.","attach.unavailable":"The tmux endpoint is unavailable. Refresh and try again.","attach.badRequest":"Can’t resolve this pane — refresh the list.","attach.network":"Network error — try again.","attach.clipboard":"Couldn’t copy — check clipboard permissions.","attach.refresh":"Refresh","status.awaitingPlan":"awaiting plan approval","status.awaitingAnswer":"awaiting an answer to a question","status.awaitingTerminal":"awaiting a reply in the terminal","status.working":"working…","status.returnedResult":"returned with a result","status.stalled":"interrupted or awaiting permission","status.finishedTurn":"finished the turn — waiting for a reply","status.rateLimited":"rate-limited","status.providerThrottled":"provider is throttling — resumes at {time}","status.flow":"flow: {label}","rateLimit.badge":"rate-limited","rateLimit.badgeUntil":"rate-limited until {time}","rateLimit.reseat":"continue on a healthy account","rateLimit.reseatRequested":"reseating…","rateLimit.reseatTitle":"Spawn a successor of this conversation on the healthiest signed-in account; the rate-limited one is parked, attached flows follow.","rateLimit.reseatFailed":"reseat failed","rateLimit.reseatAlready":"already reseated","rateLimit.reseatWaitingTurn":"Reseat queued: waiting for the rate-limited turn to release the pane, then the successor spawns.","dictation.capWarn":"less than a minute of recording left","dictation.capStopped":"Recording stopped at the 10-minute limit; the text will appear in the field.","dictation.failed":"couldn't transcribe","dictation.silence":"silence — nothing recognized","dictation.unsupported":"recording is not supported in this browser","dictation.liveError":"live transcription error","dictation.connectionLost":"transcription connection dropped","dictation.noMic":"no microphone access","overview.branchesLiveIn":{one:"{count} branch running in {projects}",other:"{count} branches running in {projects}"},"overview.projects":{one:"{count} project",other:"{count} projects"},"overview.archived":"\xb7 {count} archived","overview.moreLive":"{count} more live","overview.quiet":"quiet \xb7 last activity {age}","overview.empty":"No logs yet","catalog.unreachable":"catalog unavailable","catalog.errorTitle":"Couldn't load the session catalog","catalog.errorBody":"The viewer server did not answer, so what is running is unknown.","catalog.retry":"Retry","catalog.attempts":{one:"{count} failed attempt",other:"{count} failed attempts"},"launch.account":"Account","launch.reasoning":"Reasoning","orchPanel.title":"Orchestrator","orchPanel.toggleAria":"Orchestrator panel","orchPanel.regionAria":"Orchestrator for {project}","orchPanel.close":"Close the orchestrator panel","orchPanel.resize":"Resize the orchestrator panel","orchPanel.loading":"Reading this project's orchestrator…","orchPanel.unavailable":"The orchestrator seat can't be read","orchPanel.unavailableHint":"Nothing was changed. Until this answers, creating one here could designate a second orchestrator.","orchPanel.recheck":"Check again","orchPanel.draftTitle":"Create this project's orchestrator","orchPanel.draftHint":"It runs in {project}, owns this board, and answers you here. The text below is delivered to it as its first message — edit it however you like.","orchPanel.draftHintVacated":"The previous orchestrator's conversation is gone. Create a new one for {project}; the text below is delivered as its first message.","orchPanel.viewerMcpRegistered":"viewer MCP: registered ✓","orchPanel.viewerMcpMissing":"viewer MCP: run scripts/install-mcp.sh or claude mcp add viewer -- bun ./bin/mcp-server.mjs","orchPanel.mandate":"Mandate","orchPanel.mandateSent":"Sent as the first message","orchPanel.restoreDefault":"Restore default","orchPanel.mandateRequired":"The mandate can't be empty.","orchPanel.cwd":"Working directory: {cwd}","orchPanel.confirm":"Create orchestrator","orchPanel.confirmRetry":"Try again","orchPanel.creating":"Creating the orchestrator…","orchPanel.creatingHint":"The designation is recorded. The mandate is delivered exactly once, even if this page reloads.","orchPanel.receipt":"Launch {launchId}","orchPanel.creatingStuck":"This designation has been pending since before this page loaded — the request that started it never finished.","orchPanel.creatingResume":"Finish this designation","orchPanel.errorTitle":"The orchestrator wasn't designated","orchPanel.errorHint":"Nothing is running. Fix the mandate or the parameters and try again.","orchPanel.errorUnknownTitle":"The last attempt's outcome is unknown","orchPanel.errorUnknownHint":"The reply was lost, so an orchestrator may already exist. Trying again replays the same request instead of creating a second one.","orchPanel.transportLost":"The reply never arrived — the connection dropped.","orchPanel.transitionPending":"A new designation is settling…","orchPanel.transitionFailed":"The last designation failed","orchPanel.stalled":"This orchestrator has gone quiet. Send it a message to pick the work back up.","orchPanel.resumable":"This orchestrator has finished its run. Send it a message to resume this same conversation.","orchPanel.resolving":"Opening the conversation…","orchPanel.resolvingHint":"The orchestrator is designated; its transcript hasn't reached this view yet.","orchPanel.openOnBoard":"Open it on the board","orchPanel.rotation":"Rotation recommended","orchPanel.rotationStrong":"Rotation strongly recommended","orchPanel.rotationContext":"context is at {percent}% of the model's window","orchPanel.rotationDead":"its host is gone","orchPanel.badgeLive":"live","orchPanel.badgeStalled":"quiet","orchPanel.badgeResumable":"finished","orchPanel.badgeDead":"host gone","orchPanel.badgeResolving":"opening","orchPanel.badgeCreating":"creating","orchPanel.badgeFailed":"failed","orchPanel.badgeNone":"none yet","orchPanel.badgeReading":"reading","orchPanel.incumbentAria":"The orchestrator holding this project's seat","orchPanel.incumbentUnknown":"model not resolved yet","orchPanel.accountTitle":"Running on the {account} account","orchPanel.ctxTitle":"Context: {used} of {window} tokens ({percent}%)","orchPanel.ctxUnknownWindow":"{used} tokens in context; this model has no configured window, so no percentage is claimed","orchPanel.ctxAria":"Context window {percent}% full","orchPanel.ctxAriaUnknown":"Context usage, window unknown","orchPanel.predecessor":"Replaced an earlier orchestrator","orchPanel.predecessorTitle":"Open the predecessor's conversation on the board","orchPanel.rotate":"Rotate","orchPanel.rotateTitle":"Replace this orchestrator with a fresh one. Nothing rotates until you confirm.","orchPanel.rotateHeading":"Replace this project's orchestrator","orchPanel.rotateHint":"The successor starts with the mandate below. Its predecessor's transcript and this project's open tasks are handed over by the server — you don't have to repeat them here. The predecessor's conversation stays on the board, linked to the new one.","orchPanel.rotateConfirm":"Rotate orchestrator","orchPanel.rotateCancel":"Keep this one","orchPanel.rotateErrorTitle":"The rotation didn't happen","orchPanel.rotateErrorHint":"Your current orchestrator is untouched and still holds the seat. Fix the mandate or the parameters and try again.","orchPanel.rotateErrorUnknownTitle":"The last rotation's outcome is unknown","orchPanel.rotateErrorUnknownHint":"The reply was lost, so a successor may already exist. Trying again replays the same request instead of rotating twice.","orchPanel.rotateVacated":"That orchestrator's conversation was closed while this rotation was still in flight. Finish it here — trying again replays the same request instead of rotating twice.","orchPanel.restoreIncumbent":"Restore current mandate","orchPanel.cwdInherited":"The successor continues in {cwd}","orchMobile.create":"Create orchestrator","orchMobile.unreadable":"unreadable","orchMobile.rowCreateAria":"Create this project's orchestrator","orchMobile.rowLiveAria":"Orchestrator {model} — {state}. Opens its conversation.","orchMobile.rowStatusAria":"Orchestrator — {state}. Opens the orchestrator sheet.","orchMobile.pendingAria":"A new designation is settling — open it","orchMobile.transitionAria":"The last designation failed — open it","orchMobile.sheetAria":"Orchestrator for {project}","orchMobile.liveTitle":"This project's orchestrator","orchMobile.liveHint":"It answers in its own conversation. Opening it lands there, with the composer.","orchMobile.open":"Open the conversation","branch.live":"working","branch.waiting":"finished the turn — waiting for a reply","branch.returned":"returned with a result","branch.stalled":"interrupted or awaiting permission","branch.done":"done — safe to remove","branch.worktree":"Worktree {name}","branch.lastActivity":"Last activity: {age}","branch.lastActivityQuiet":"Marked active, but the transcript is quiet: last activity {age}","branch.handoffTitle":"agent spawned by this conversation's handoff","branch.branchTitle":"branch of this conversation","branch.accountTip":"Account {id} \xb7 {engine} \xb7 {health}","branch.accountTipPlain":"Account {id} \xb7 {engine}","branch.accountAria":"Open accounts for {id}","lineage.parentRemoved":"parent removed","lineage.parentRemovedTitle":"The parent conversation transcript was removed","branch.removeColumn":"Remove column {title}","branch.toggleBackground":"{action} background task {title}","branch.collapse":"Collapse","branch.expand":"Expand","branch.expandFull":"Expand conversation {title} to the full window","branch.collapseFull":"Back to the canvas (Esc)","branch.detailsShow":"Show conversation details","branch.detailsHide":"Hide conversation details","branch.favorite":"Mark as favorite","branch.unfavorite":"Remove from favorites","tree.quiet":"Quiet conversations and tasks","taskStacks.collapse":"Fold the card back into its status stack","readiness.title":"Task readiness","readiness.aria":"Readiness sections for every project task","readiness.legend":"Now — assigned into work \xb7 Review — a review is running or has a verdict \xb7 Blocked — needs a decision \xb7 Planned — inbox/backlog \xb7 Done — finished","readiness.section.now":"Now","readiness.section.review":"In review","readiness.section.blocked":"Blocked","readiness.section.planned":"Planned","readiness.section.done":"Done","readiness.sectionAria":"“{section}” tasks \xb7 {count}","readiness.open":"Open task on the board: {title}","readiness.place":"Place task on the map: {title}","readiness.issueAria":"Open issue #{issue} on GitHub","readiness.agent":"agent","readiness.agentAria":"Open the assigned agent: {title}","readiness.pipeline":"pipeline","readiness.pipelineAria":"Open the linked pipeline stage: {title}","readiness.review":"review","readiness.reviewAria":"Open the linked review: {title}","readiness.state.live":"live","readiness.state.gone":"gone","readiness.state.failed":"failed","launchHistory.title":"Launch history","launchHistory.aria":"Terminal launch receipts","launchHistory.failed":"failed","launchHistory.recovered":"recovered","launchHistory.retryLabel":"Retry","launchHistory.retry":"Retry launch: {title}","workerStack.title":"Collapsed workers","workerStack.aria":"Collapsed worker conversations","workerStack.expandGroup":"Expand review group on the board","workerStack.flow":"Flow","workerStack.pipeline":"Pipeline","workerStack.origin":"Spawned","workerStack.worktree":"Workers","corner.waitingCount":"\xb7 {count} waiting","corner.openSwitchboard":"Open the agent switchboard","task.working":", working","task.interrupted":", interrupted","task.finished":", finished","task.interruptedBadge":"interrupted","task.finishedBadge":"finished","task.stopFailed":"couldn't stop","task.signalSent":"sent {signal} to PID {pid}","task.killRequested":"kill requested","task.confirmKill":"Really kill PID {pid}?","task.confirmKillNamed":"Stop {name}?","task.confirmKillUntitled":"this agent","task.confirmKillYes":"Yes, kill","task.stopAria":"Stop process PID {pid}","task.kill":"Kill","task.backgroundCommand":"Background command","task.commandNotFound":"The command that started this background task wasn't found in the session transcripts","viewer.closeProjects":"Close the project list","viewer.agentWaiting":"Agent is waiting for a reply","viewer.staleFocusEntry":"That conversation is no longer available","viewer.unknownFragment":"This link names nothing the viewer recognizes","viewer.closeNotification":"Close the notification","attention.badge":{one:"{count} waiting",other:"{count} waiting"},"attention.needsYou":"Needs you","attention.next":"Next","attention.nextHint":"Focus the next one waiting on you (N, Shift-N — back)","attention.openQueue":"Attention queue — who is blocked on you (N — next)","attention.popoverTitle":"Waiting on you","attention.filterOn":"Show only those waiting on you (F)","attention.filterOff":"Show all nodes (F)","mobile.noConvos":"No conversations yet","mobile.map":"Map","mobile.closeMap":"Close the map","mobile.tapNode":"Tap a node — the conversation opens full-screen","mobile.agent":"agent","mobile.openMap":"Open the project map","mobile.mapLoading":"Loading the map…","mobile.marker.open":"Open {title}","mobile.marker.node":"conversation","mobile.marker.deck":"review","mobile.marker.draft":"draft agent","mobile.marker.stack":"history","mobile.marker.worker":"workers","mobile.marker.task":"task","mobile.marker.pipeline":"pipeline","tasks.failed":"failed ({status})","tasks.tool":"Task — the next click drops a card on the canvas (T)","tasks.untitled":"untitled","tasks.newPlaceholder":"task text… (the first line is the title)","tasks.newTask":"new task","tasks.panelCreate":"Create the task","tasks.unplaced":"unplaced","tasks.placeOnMap":"place on map","tasks.addDue":"deadline","tasks.clearDue":"Clear the deadline","tasks.dueTitle":"Deadline (zone: {zone})","tasks.attachCount":{one:"{count} image",other:"{count} images"},"tasks.draftDiscarded":"draft discarded","tasks.editAria":"Task text","tasks.spawning":"starting…","tasks.deadChip":"the conversation is gone from the list","tasks.failedChip":"delivery failed","tasks.killedChip":"the agent process was killed","tasks.unhostedChip":"the agent isn't running","tasks.migratingChip":"the agent is moving to another account","tasks.source":"source","tasks.sourceTitle":"Captured from","tasks.retry":"retry delivery","tasks.retryLaunch":"retry launch","tasks.retryLaunchAria":"Retry the failed launch for {title}","tasks.retryLaunched":"agent relaunched","tasks.chipFailedTitle":"not delivered: {error}","tasks.handoffChip":"routed into this agent's prompt — not sent yet","tasks.detach":"detach","tasks.detachAria":"Detach {title} from this task","tasks.expand":"Expand task","tasks.collapse":"Collapse task","tasks.openAgent":"open and center the agent pane","tasks.openAgentAria":"Open agent {title}","tasks.openAgentUnavailableAria":"Open agent {title} — unavailable: {reason}","tasks.openSource":"open and center the source conversation","tasks.openSourceAria":"Open source conversation {title}","tasks.openSourceUnavailableAria":"Open source conversation {title} — unavailable: {reason}","tasks.sourceGone":"the source conversation is not on the board","tasks.relatedNav":"Related tasks","tasks.openTaskAria":"Open task {title}","tasks.relatedAssignedTitle":"assigned to this conversation","tasks.relatedSourceTitle":"captured from this conversation","tasks.send":"send","tasks.sendTitle":"Pull the arrow onto an agent's pane to drop the task into its prompt (nothing is sent); click to seed a fresh draft conversation","tasks.linkHanded":"routed into “{title}” — review and send it there","tasks.linkSent":"task sent → “{title}”","tasks.spawn":"agent","tasks.spawnTitle":"Spawn a fresh agent with this task as the brief","tasks.spawnGo":"Launch","tasks.statusTitle":"Status: {label} — click cycles (inbox → assigned → blocked → done)","tasks.status.inbox":"inbox","tasks.status.assigned":"assigned","tasks.status.blocked":"blocked","tasks.status.done":"done","tasks.delete":"delete","tasks.deleteConfirm":"sure?","tasks.deleteAria":"Delete task {title}","tasks.pickerTitle":"Send to","tasks.pickerAllChildren":"⤷ all children","tasks.pickerEmpty":"no conversations in the project","tasks.pickerSend":"Send ({count})","tasks.sendOk":"Delivered {delivered} of {total}","tasks.sendFailPart":"✗ “{title}”: {error}","tasks.spawnOk":"agent started in tmux {target}","tasks.composerToggle":"create a task","tasks.composerToggleTitle":"On — the text becomes a tracked task card assigned to the selection; off — a plain broadcast with no trace","tasks.composerNeedsText":"a task needs text","tasks.panelTitle":"Tasks","tasks.panelToggleAria":"Toggle the task panel","tasks.panelThisProject":"this project","tasks.panelAll":"all","tasks.panelEmpty":"no tasks yet — drop one with the board's task tool (T)","tasks.panelClose":"Close the task panel","favorites.sectionTitle":"Favorites","favorites.empty":"no favorites yet — hover a card and tap its crown","favorites.focusTitle":"Focus {title} on the board","tasks.sheetNew":"new task","tasks.sheetCreate":"Create the task","tasks.sheetBack":"Back to the task list","tasks.sheetTargets":{one:"{count} target",other:"{count} targets"},"tasks.sheetAssignments":"assignments","tasks.sheetEmpty":"no tasks yet","tasks.sheetGone":"the task is gone","tasks.textNotSaved":"the text didn't save — delivery aborted, try again","tasks.emptyTextBlocked":"empty text isn't saved — restore the task text before sending","runtime.live":"live","runtime.reconnecting":"reconnecting","runtime.degraded":"degraded","runtime.offline":"offline","runtime.resynced":"resynced","runtime.connection":"runtime connection","runtime.announce.live":"runtime connection live","runtime.announce.reconnecting":"runtime reconnecting","runtime.announce.degraded":"runtime degraded — polling for updates","runtime.announce.offline":"runtime offline","runtime.announce.resynced":"runtime resynced from a fresh snapshot","runtime.staleSince":"stale {duration}","runtime.lastKnown":"last update {duration} ago","runtime.legacyProvenance":"legacy \xb7 derived state","staging.badge":"Staging","staging.badgeTitle":"Staging instance — isolated state; nothing here touches prod","runtime.drift":"drift: {evidence}","runtime.driftDismiss":"Dismiss","runtime.receipt.pending":"sending…","runtime.receipt.busyRetry":"Couldn’t deliver — agent is busy, we’ll retry","runtime.receipt.summary":"Delivery attempts: {count}","runtime.receipt.pendingCount":"pending: {count}","runtime.receipt.attemptCount":"attempts: {count}","runtime.receipt.problemCount":"issues: {count}","runtime.receipt.showDetails":"Show delivery details","runtime.receipt.hideDetails":"Hide delivery details","runtime.receipt.statusSummary":"Delivery status: {pending}, {problems}.","runtime.receipt.statusPending":{one:"{count} pending message",other:"{count} pending messages"},"runtime.receipt.statusProblems":{one:"{count} issue",other:"{count} issues"},"runtime.receipt.delivering":"delivering…","runtime.receipt.applying":"applying switch…","runtime.receipt.turn-started":"turn started","runtime.receipt.steered":"steered into current turn","runtime.receipt.queued":"queued","runtime.receipt.queuedPos":"queued \xb7 #{position}","runtime.receipt.delivered":"delivered","runtime.receipt.applied":"switch applied","runtime.receipt.interrupted":"interrupted","runtime.receipt.answered":"answered","runtime.receipt.rejected":"rejected: {reason}","runtime.receipt.failed":"failed: {reason}","runtime.receipt.uncertain":"uncertain — recovering","runtime.receipt.retry":"Retry","runtime.receipt.edit":"Edit & resend","runtime.receipt.dismiss":"Dismiss","runtime.attention.title":"needs your decision","runtime.attention.approval":"approval","runtime.attention.permission":"permission","runtime.attention.question":"question","runtime.attention.waiting_heuristic":"possibly waiting","runtime.attention.heuristicNote":"low-confidence signal","runtime.attention.unowned":"no approver attached","runtime.attention.command":"command","runtime.attention.tool":"tool","runtime.attention.approve":"Approve","runtime.attention.deny":"Deny","runtime.attention.answer":"Answer","runtime.attention.answering":"answering…","runtime.attention.expiresIn":"auto-resolves in {seconds}s","runtime.attention.keysHint":"Enter approves \xb7 Esc denies","voice.start":"Start continuous voice conversation","voice.stop":"End voice conversation","voice.connecting":"Connecting voice…","voice.live":"Voice conversation is live \xb7 speak whenever you’re ready","voice.stopping":"Ending voice conversation…","voice.failed":"Voice connection needs attention","voice.panel":"Voice conversation","voice.you":"You","voice.agent":"Agent","voice.progress":"Progress","voice.retry":"Try again","voice.ended":"Voice conversation ended","voice.elapsed":"Call duration","voice.micLevel":"Microphone level","voice.micMute":"Mute microphone","voice.micUnmute":"Unmute microphone","voice.outputMute":"Silence the agent","voice.outputUnmute":"Unsilence the agent","voice.floatSurface":"Voice conversation","voice.float":"Open the floating voice window","voice.dock":"Close the floating window and keep the call","voice.floatUnsupported":"A floating voice window needs a Chromium browser; the call stays here.","attention.return":"Back to where you were","attention.returnLine":"Go back to where you were"}},58128:(a,b,c)=>{c.d(b,{WD:()=>F,w1:()=>D,zN:()=>E});var d=c(77598),e=c.n(d),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(14509),k=c(29733),l=c(86850),m=c(42087),n=c(16089),o=c(77513),p=c(5425),q=c(98590),r=c(26474),s=c(2159);c(66024);var t=c(70107),u=c(27359),v=c(27471),w=c(25123),x=c(46825);let y=new Set(["approved","closed"]),z=new Set(["needs_decision","paused"]);function A(){return{exec:w.Ix,startSetup:w.ot,setupStatus:w.ae,spawnAgent:async(a,b,c,d)=>{let e=l.lD.resolveSpawn(a.engine,d),f=(0,j.lV)(a.engine,b,{model:a.model,effort:a.effort,codexHome:"codex"===e.engine?e.home:null,claudeConfigDir:"claude"===e.engine?e.home:null,claudeProjectsDir:"claude"===e.engine?e.transcriptRoot:null}),g=Date.now(),h=await (0,v.Tk)(f,c),i=await (0,m.s)({engine:a.engine,knownTranscript:f.transcript??null,panePid:h.panePid??null,cwd:b,startedAtMs:g,codexSessionsDir:"codex"===e.engine?e.transcriptRoot:null});return{paneId:h.paneId,transcript:i,panePid:h.panePid??null}},paneAgentAlive:async a=>{let b=await (0,v.RZ)(a);return null!==b&&!(0,u.g2)(b.command)},headCwd:a=>(0,n.tX)(a),lastMessage:p.if,createFlow:o._p,advanceFlow:(a,b)=>void(0,o.n1)(a,{action:"advance",note:b}),closeFlow:o.ni,getFlow:a=>(0,q.mL)().find(b=>b.id===a)??null,findFlowByImplementer:a=>(0,q.mL)().filter(b=>b.implementerPath===a).sort((a,b)=>a.createdAt<b.createdAt?1:-1)[0]??null,projectForCwd:t.hY,linkChild:(a,b)=>{(0,r.A6)(a,b),(0,r.OA)()},now:()=>new Date().toISOString()}}function B(a){return a.stageRuns[a.stageIndex]??null}function C(a){return"needs_decision"===a.state||"paused"===a.state?a.pausedState??"provisioning":a.state}async function D(a,b,c=A(),d=s.a){let e=(0,x.Ny)(),f=e.find(b=>b.id===a);if(!f)return{error:"workflow not found",status:404};if("pause"===b.action)"paused"===f.state||y.has(f.state)||("needs_decision"!==f.state&&(f.pausedState=f.state),f.state="paused",f.stateDetail=(0,s.P)("paused",d));else if("resume"===b.action)("paused"===f.state||"needs_decision"===f.state)&&(f.state=f.pausedState&&!z.has(f.pausedState)?f.pausedState:"provisioning",f.pausedState=null,f.stateDetail=(0,s.P)("resumed",d));else if("advance"===b.action){let a=C(f);if(y.has(f.state)||"finishing"===a)return{error:"workflow cannot advance from its current state",status:409};if("provisioning"===a){if(!f.baseRef)return{error:"workflow has no worktree yet — retry provisioning instead",status:409};f.state="implementing"}else{let d=B(f);if(!d)return{error:"workflow has no current stage",status:409};if(d.doneAt||(d.doneAt=c.now(),d.doneNote=("string"==typeof b.note&&b.note.trim()?b.note.trim().slice(0,2e3):null)??d.doneNote??"advanced manually"),"reviewing"===a){let a=f.flowId?c.getFlow(f.flowId):null;if(a&&null===a.closedAt&&"closed"!==a.state){let b=await c.closeFlow(a.id);if(b?.error)return{error:b.error,status:b.status??409}}f.state="finishing"}else{let a;f.stageIndex+=1,a=f.template.stages[f.stageIndex],f.state=a?.kind==="review-loop"?"reviewing":"implementing",f.stateDetail=null}}f.pausedState=null,f.stateDetail=null}else if("retry-stage"===b.action){let a=C(f);if(y.has(f.state))return{error:"workflow is finished",status:409};if("provisioning"===a){f.setupPid=null;try{g().rmSync((0,x.VO)(f.id),{force:!0})}catch{}}else if("implementing"===a||"reviewing"===a){let b=B(f);if(b&&Object.assign(b,{agentPath:null,agentConversationId:null,paneId:null,startedAt:null,doneAt:null,doneNote:null}),"reviewing"===a){let a=f.flowId?c.getFlow(f.flowId):null;if(a&&null===a.closedAt&&"closed"!==a.state){let b=await c.closeFlow(a.id);if(b?.error)return{error:b.error,status:b.status??409}}f.flowId=null,f.fixerPath=null,f.fixerConversationId=null}}f.state=a,f.pausedState=null,f.stateDetail=null}else if("close"===b.action){let a=f.flowId?c.getFlow(f.flowId):null;if(a&&null===a.closedAt&&"closed"!==a.state){let b=await c.closeFlow(a.id);if(b?.error)return{error:b.error,status:b.status??409}}f.state="closed",f.pausedState=null,f.stateDetail=null,f.closedAt=c.now()}return(0,x.co)(e),{workflow:f}}function E(a,b=A()){let c,d="string"==typeof a.task?a.task.trim():"";if(!d)return{error:"task brief is required",status:400};let f="string"==typeof a.repoDir?a.repoDir.trim():"";if(!f)return{error:"repoDir is required",status:400};if(0!==b.exec("git",["rev-parse","--git-dir"],f).code)return{error:`not a git repository: ${f}`,status:400};if(a.template){let b=(0,x.K8)().find(b=>b.name===a.template);if(!b)return{error:`unknown workflow template: ${a.template}`,status:400};c=b}else{let b=(0,x.Fl)(a.stages);if("error"in b)return{error:b.error,status:400};c={name:"ad-hoc",stages:b.stages,finish:"merge"===a.finish?"merge":"pr",..."string"==typeof a.setup&&a.setup.trim()?{setup:a.setup.trim()}:{},..."string"==typeof a.verify&&a.verify.trim()?{verify:a.verify.trim()}:{}}}let g=(0,x.xV)(c.stages);if("error"in g)return{error:g.error,status:400};let h=(0,x.aL)({id:e().randomUUID().slice(0,8),name:c.name,task:d,project:b.projectForCwd(f)??i().basename(f),repoDir:f,template:c,mode:"manual"===a.mode?"manual":"auto",now:b.now()});"string"==typeof a.src&&a.src.trim()&&(h.srcPath=a.src.trim(),h.srcConversationId=(0,k.agentRegistry)().conversationForPath(h.srcPath)?.id??null);let j=(0,x.Ny)();return j.push(h),(0,x.co)(j),{workflow:h}}function F(){return{workflows:(0,x.Ny)(),templates:(0,x.K8)()}}},59371:(a,b,c)=>{c.d(b,{Qs:()=>x,_v:()=>y,ww:()=>w}),c(77598);var d=c(73024),e=c.n(d);c(86850),c(78966),c(41617);var f=c(29733),g=c(48892);c(16089);var h=c(3587),i=c(12770),j=c(59683);c(5626);var k=c(23855);c(66024);var l=c(23921),m=c(73789),n=c(74382),o=c(91596),p=c(8995);function q(a,b,c){let d=a.readOnlySnapshot().entries[(0,g.pp)({engine:b,sessionId:c.id})],e=d?.structuredHost;return!!e&&d.artifactPath===c.path&&("live"===d.status||"idle"===d.status)&&null!==e.process&&null!==e.process.startIdentity&&j.B.processIdentity(e.process.pid)===e.process.startIdentity&&null===e.activeTurnRef}function r(a,b){let c,d=a.generations.at(-1)?.path,f="unknown"===a.turn.state&&"empty"===a.turn.source&&!!d&&!e().existsSync(d),g=(c=a.migration?.sourceGenerationId,a.generations.find(a=>a.id===c)??a.generations.at(-1)),h=void 0!==g&&q(b,a.engine,g);return("terminal"===a.turn.state||"idle"===a.turn.state||!!f||!!h)&&!b.pendingDeliveries(a.id).some(a=>"delivery-uncertain"===a.state)}function s(a,b,c,d){var f,g;let h,i;try{h=e().statSync(b.path)}catch(a){return c&&"ENOENT"===a.code}let j=(0,k.pk)(b.path,h.size,h.mtimeMs,"codex"===a.engine);if(!j.complete)return!1;try{i=e().statSync(b.path)}catch{return!1}if(i.size!==h.size||i.mtimeMs!==h.mtimeMs)return!1;if(j.composerReleased||q(d,a.engine,b))return!0;if(j.recoveryReleased&&(f=d,g=b.path,new Set(Object.values(f.readOnlySnapshot().entries).filter(a=>a.artifactPath&&["starting","live","idle","handoff"].includes(a.status)&&(null!==a.host||null!==a.structuredHost)).map(a=>a.artifactPath)).has(g)))return!1;if("terminal"===j.turn.state)return!0;let m=a.turn.observedAt?Date.parse(a.turn.observedAt):NaN;return"codex"===a.engine&&"idle"===a.turn.state&&null===b.host&&Number.isFinite(m)&&m>=i.mtimeMs&&!(0,l.SP)([b.path],!0).has(b.path)}async function t(a,b,c,d){let e=[];await (0,i.pV)(a,a=>{let b=function(a){if(a.migration?.phase!=="committed")return null;let b=a.generations.at(-1),c=a.generations.find(b=>b.id===a.migration?.sourceGenerationId)??a.generations.at(-2);if(!c||!b||c.id===b.id)return null;let d=b.launchProfile.project||c.launchProfile.project||"other";if(a.migration.boardProject===d&&a.migration.boardOperationId===a.migration.operationId)return null;let e=[...new Set([...a.continuityPaths,...a.migration.providerReceipt?.continuityPaths??[]])],f=[...new Set([...a.generations.slice(0,-1).map(a=>a.path),...e])].filter(a=>a!==b.path);return{conversationId:a.id,operationId:a.migration.operationId,project:d,previousProject:a.migration.boardPlacementProject??a.migration.boardProject??c.launchProfile.project,placementPaths:[...new Set([c.path,b.path,...e])],pairs:f.map(a=>({from:a,to:b.path})),provisionalManual:e.filter(a=>a!==b.path)}}(a);b&&e.push(b)});let f=[];if(await (0,i.pV)(e,a=>{a.previousProject&&a.previousProject!==a.project&&f.push({fromProject:a.previousProject,toProject:a.project,paths:a.placementPaths})}),f.length>0)try{d(f)}catch(a){console.warn("[account-migration] board project repair deferred",{projects:f.length,error:(0,p.Kb)(a)});return}b.markMigrationBoardPlacementProjects(e.map(a=>({id:a.conversationId,operationId:a.operationId,project:a.project})));let g=new Map;await (0,i.pV)(e,a=>{let b=g.get(a.project)??[];b.push(a),g.set(a.project,b)});let h=[];await (0,i.pV)([...g],([a,b])=>{try{let d=c(a,b.flatMap(a=>a.pairs),{provisionalManual:[...new Set(b.flatMap(a=>a.provisionalManual))]}).pathAliases??{};if(!b.every(a=>a.pairs.every(({from:a,to:b})=>d[a]===b)))throw Error("board continuity aliases did not converge");h.push(...b.map(b=>({id:b.conversationId,operationId:b.operationId,project:a})))}catch(c){console.warn("[account-migration] board continuity repair deferred",{project:a,conversations:b.length,error:(0,p.Kb)(c)})}}),b.markMigrationBoardProjects(h)}async function u(a,b,c,d){if(!b)return;let e=c.migration?.phase==="committed",f=c.generations.at(-1),g=f?.host!==null&&f?.host!==void 0&&(0,n.Qq)(f.host,b.host);if(e&&f?.id===b.nativeId&&f.path===b.path&&g)return void d.completeSuccessorCleanup(b.operationId);d.queueSuccessorCleanup(c.id,b);try{await a.cleanup?.(b),d.completeSuccessorCleanup(b.operationId)}catch(a){d.recordSuccessorCleanupFailure(b.operationId,a instanceof Error?a.message:String(a))}}function v(a,b){let c=a.migration,d=a.reconfigure;return c?.phase==="verifying"&&null!==c.providerReceipt&&(0,n.WB)(c.providerReceipt,b)&&d?.status==="applying"&&d.accountId===c.targetId}async function w(a,b=(0,f.agentRegistry)(),c=new o.wh,d={}){var e,g,i;let j,k=b.conversation(a);if(!k?.migration)throw Error("conversation has no migration");if(e=k,g=d.reconfigureOperationId,j=e.reconfigure,j?.status==="applying"&&j.accountId===e.migration?.targetId&&j.operationId!==g)return k;let l=k.migration;if("waiting-turn"===l.phase){if(!r(k,b))return k;l=(k=b.transitionConversationMigration(k.id,l.revision,["waiting-turn"],{phase:"requested"})).migration}if("committed"===l.phase)return d.deferBoardRepair||await t([k],b,d.remapBoardPaths??h.cw,d.transferBoardPathPlacements??h.L5),b.conversation(k.id)??k;if("rolled-back"===l.phase||"failed-recoverable"===l.phase)return k;let q="copy"in c?{virtualSource:!0,async create(a){let b=await c.copy({engine:a.engine,sourcePath:a.source.path,targetHome:a.targetAccountId,conversationId:a.conversationId});return{operationId:a.operationId,nativeId:b.nativeId,path:b.path,continuityPaths:[],historyHash:"legacy-copy-port",host:{kind:"tmux",identity:"legacy-copy-port",epoch:1,verifiedAt:new Date().toISOString()}}},async verify(){}}:c,x=l.providerReceipt;try{if(l.providerReceipt)x=l.providerReceipt;else{if(!r(k,b))return k;let a=l.phase,c=c=>{let d=c.migration??l;return d.phase!==a&&("preparing"===d.phase||"successor-starting"===d.phase)?b.transitionConversationMigration(c.id,d.revision,[d.phase],{phase:a}):c},d=k.generations.find(a=>a.id===l.sourceGenerationId)??k.generations.at(-1);if(!d)throw Error("conversation has no source generation");if(!s(k,d,!0===q.virtualSource,b))return k;if("requested"===l.phase&&(l=(k=b.transitionConversationMigration(k.id,l.revision,["requested"],{phase:"preparing"})).migration),"preparing"===l.phase&&(l=(k=b.transitionConversationMigration(k.id,l.revision,["preparing"],{phase:"successor-starting"})).migration),l=(k=b.conversation(k.id)??k).migration??l,!r(k,b))return c(k);if(!(d=k.generations.find(a=>a.id===l.sourceGenerationId)??k.generations.at(-1)))throw Error("conversation has no source generation");if(!s(k,d,!0===q.virtualSource,b))return c(k);let e=k.id,f={operationId:l.operationId,revision:l.revision};if((x=await q.create({engine:k.engine,operationId:f.operationId,conversationId:e,source:d,targetAccountId:l.targetId,recordContinuityPath(a){b.recordMigrationContinuityPath(e,a,f)}})).operationId!==f.operationId)throw Error("successor receipt operation does not match");x=(l=(k=b.persistMigrationProviderReceipt(e,f.revision,f.operationId,x)).migration).providerReceipt??x}let a=k.generations.find(a=>a.id===l.sourceGenerationId)??k.generations.at(-1);if(!a)throw Error("conversation has no source generation");if(!x||x.operationId!==l.operationId)throw Error("persisted successor receipt operation does not match");await q.verify(x,{engine:k.engine,targetAccountId:l.targetId,launchProfile:a.launchProfile});let c=k.id,e=x,f=l.revision,g=l.operationId,i=async()=>{if(d.ownsOperation&&!await d.ownsOperation())return!1;let a=b.conversation(c),h=a?.migration;return!!(a&&h?.phase==="verifying"&&h.revision===f&&h.operationId===g&&null!==h.providerReceipt&&(0,n.WB)(h.providerReceipt,e))},j=b.conversation(c);if(!j||!await i()||(await q.publishHost?.(e,{engine:k.engine,conversationId:c,targetAccountId:l.targetId,launchProfile:a.launchProfile,ownsOperation:i}),!(j=b.conversation(c))||!await i()))return j&&(v(j,e)||await u(q,e,j,b),d.deferBoardRepair||await t([j],b,d.remapBoardPaths??h.cw,d.transferBoardPathPlacements??h.L5)),b.conversation(c)??j??k;let m=b.commitSuccessor(c,{id:e.nativeId,path:e.path,accountId:l.targetId,launchProfile:a.launchProfile,historyHash:e.historyHash,host:e.host},f,g,e);return d.deferBoardRepair||await t([m],b,d.remapBoardPaths??h.cw,d.transferBoardPathPlacements??h.L5),b.conversation(m.id)??m}catch(j){let a=b.conversation(k.id);if(j instanceof o.IM||(0,m.gR)(j))return a??k;let c=a?.migration?.providerReceipt,e=null!==x&&null!=c&&!(0,n.WB)(c,x);if(a&&(!a.migration||a.migration.revision!==l.revision||a.migration.operationId!==l.operationId||"committed"===(i=a.migration.phase)||"rolled-back"===i||"failed-recoverable"===i||e))return await u(q,x,a,b),d.deferBoardRepair||await t([a],b,d.remapBoardPaths??h.cw,d.transferBoardPathPlacements??h.L5),b.conversation(a.id)??a;console.warn("[account-migration] recoverable successor provider failure",{conversationId:k.id,engine:k.engine,phase:l.phase,targetAccountId:l.targetId,error:(0,p.Kb)(j)});let f=j instanceof o.I1?{message:"Codex fork outcome is awaiting recovery",code:"codex-fork-outcome-unknown"}:(0,p.rI)(j),g=b.transitionConversationMigration(k.id,l.revision,["requested","preparing","successor-starting","verifying"],{phase:"failed-recoverable",error:f.message,errorCode:f.code});return await u(q,x,g,b),g}}async function x(a,b,c=(0,f.agentRegistry)()){let d=c.conversation(a),e=d?.generations.at(-1);e&&await (0,i.pV)(c.pendingDeliveries(a),async a=>{let d="delivery-uncertain"===a.state;if(d&&!b.reconcileUncertain||!d&&("assigned"!==a.state||a.generationId!==e.id))return;if("text"!==a.payloadKind&&"runtime-images"!==a.payloadKind)return void c.recordDeliveryOutcome(a.id,"failed","request-local delivery requires client retry");let f=d?a:c.beginDeliveryAttempt(a.id,e.id);if(!f)return;let g=f.clientMessageId??`migration:${f.id}`;try{let a={delivery:f,path:e.path,clientMessageId:g},h=d?await b.reconcileUncertain(a):await b.deliver(a);"held"===h?d||c.requeueUnactuatedDelivery(f.id):c.recordDeliveryOutcome(f.id,h,"failed"===h?"delivery failed and remains recoverable":null)}catch{c.recordDeliveryOutcome(f.id,"delivery-uncertain","delivery result is uncertain and remains recoverable")}})}function y(a){return a.migration?["waiting-turn","requested","preparing","successor-starting","verifying"].includes(a.migration.phase)?"held":"failed-recoverable"===a.migration.phase?"recoverable":"deliver":"deliver"}},59680:(a,b,c)=>{function d(a){return["You are now in an implement-review loop controlled by the local log viewer.","",...a?["Pinned flow specification and acceptance criteria:",a,""]:["Before your first REVIEW_READY, write spec.md with the task statement and an acceptance-criteria list using entries such as `AC1: …`.",""],"Work normally in this long-lived implementer session. When the work is ready for a fresh independent review, end your final assistant message with a line that starts exactly with:","REVIEW_READY: <one-line note>","Do not print the REVIEW_READY marker now and never quote it at the start of a line when acknowledging these instructions — print it only when the work is actually ready for review.","","Every review round will use a fresh reviewer who sees the full diff from the captured base ref, with no history from earlier rounds. If the reviewer sends findings back, respond to each finding before the next marker using:","FIXED","or","REJECTED — <reason>","","Give concrete arguments for rejections because the next reviewer will be fresh and blind to previous discussion."].join("\n")}function e(a,b){return["You are the reviewer in an implement-review loop.\n",`Working directory: ${a.cwd}`,`Review scope: git diff ${a.baseRef}...HEAD plus uncommitted changes in the same working tree.`,`Exact review HEAD: ${b.reviewHeadSha??"unavailable"}`,"\nPinned flow specification and acceptance criteria:",a.spec?.trim()||"No pinned specification was supplied for this flow.",b.readyNote?`Ready note: ${b.readyNote}`:"Ready note: none provided.","\nRead-only requirement: run tests, builds, linters, searches, and other investigation commands as needed. Do not edit files, write notebooks, commit, stage, or mutate the working tree.\n\nOutput exactly this format:\nVERDICT: APPROVE | REQUEST_CHANGES | COMMENT\n\nThen write findings in Markdown. For each finding include severity, file, line, title, and explanation. Use REQUEST_CHANGES for required fixes, COMMENT for non-blocking notes, and APPROVE only when no blocking issues remain."].join("\n")}function f(a,b){return["Review round findings are below. Address every finding before the next review marker.\n",b.trim(),"\nFor each finding, respond with FIXED or REJECTED — <reason>. When the work is reviewable again, end your final assistant message with:\nREVIEW_READY: <one-line note>"].join("\n")}c.d(b,{SB:()=>d,i0:()=>f,qu:()=>e})},63629:(a,b,c)=>{c.d(b,{Lu:()=>j,Vu:()=>f,s_:()=>h,wL:()=>g,zV:()=>i});var d=c(77598);let e=["session","flow","workflow","task","operation","deployment","edge","account","system"];function f(a){if(!a.presentationOperationId||void 0===a.presentationRevision)return a;let{presentationOperationId:b,presentationRevision:c,...d}=a;return{...d,operationId:b,revision:c}}function g(a){return{perTurnEffort:"codex"===a,perTurnModel:!1}}function h(a){return"codex"===a?{control:"compact",engine:a,supported:!0}:{control:"compact",engine:a,supported:!1,reason:"The Claude stream-json protocol has no client-originated compact control; only interrupt is exposed."}}function i(a,b){if(!e.includes(a))throw Error("runtime scope type is invalid");if(!b||b.length>200||b.includes(":")||/\s/.test(b))throw Error("runtime scope id is invalid");return{type:a,id:b}}function j(){return`op_${(0,d.randomUUID)()}`}},64487:(a,b,c)=>{c.d(b,{Hq:()=>y,WV:()=>o,Zp:()=>F,oe:()=>E});var d=c(57975),e=c(29733),f=c(48892),g=c(59683),h=c(70547),i=c(5626),j=c(23921),k=c(2451),l=c(27471);let m=/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i,n={scanner:3,resume:2,argv:1};function o(a,b){return a.canonicalFor(b)?.display??null}let p=globalThis;function q(a){return a.slice(a.lastIndexOf("/")+1).match(m)?.[0]?.toLowerCase()??null}function r(a){for(let b=a.length-1;b>=0;b-=1){let c=a[b]?.match(m)?.[0];if(c)return c.toLowerCase()}return null}function s(a){let b=Number(a.slice(1));return Number.isInteger(b)?b:-1}function t(a){return[...a].sort((a,b)=>n[b.source]-n[a.source]||a.pathname.localeCompare(b.pathname))[0]??null}function u(a,b,c){let d=new Set,e=a;for(let a=0;null!==e&&a<64;a+=1){if(e===b)return a;if(d.has(e))break;d.add(e),e=c.get(e)??null}return -1}function v(a,b,c){let d=c(b);return a.conflicts?.find(a=>null!==d&&a.conversationId===d||a.paths.includes(b))??null}class w extends Error{constructor(a){super(a.quarantinedPaneIds?.length?"conversation has a quarantined live pane":"conversation has multiple live panes"),this.name="TranscriptHostConflictError"}}function x(a,b=500,c){let d=a instanceof w?409:b;return{ok:!1,outcome:"failed",error:a instanceof Error?a.message:String(a),status:d,...c?{actuation:c}:{}}}function y(a,b=new Map){let c=async function(b,c,d){let e,f=a.conversationIdForPath??(()=>null),[g,i,j]=await Promise.all([c??a.listFiles(),a.panes(b),a.resumeRecords()]),k=j?.serverPid??await a.serverPid();if("failure"===i.kind&&null!==k)return{hosts:[],observation:"failure",observationError:i.error,conflicts:[],canonicalFor:()=>null};if(null===k||"no-server"===i.kind)return await a.reconcile?.([]),{hosts:[],observation:"no-server",conflicts:[],canonicalFor:()=>null};if("available"!==i.kind||0===i.panes.size)return await a.reconcile?.([]),{hosts:[],observation:"available",conflicts:[],canonicalFor:()=>null};let{panes:l}=i,m=d??a.ppidMap(),o=a.agents(b),p=function(a){let b=new Map;for(let c of a){if(null===c.pid||"running"!==c.proc)continue;let a=b.get(c.pid);a&&(!a.parent||c.parent)||b.set(c.pid,c)}return b}(g),w=function(a){let b=new Map;for(let c of a){let a=q(c.path);if(!a)continue;let d=b.get(a);d&&(!d.parent||c.parent)||b.set(a,c)}return b}(g),x=[];for(let[b,c]of l){let d=new Set((0,h.mO)(b,m));for(let e of o){if(!d.has(e.pid))continue;let f=function(a,b,c,d,e,f,g){let h=[],i=d.get(a.pid),j=r(a.argv),k=i?q(i.path):null;if(i?.engine===a.engine&&(null!==j&&null!==k&&j===k||g(a.pid,i.path))&&h.push({pathname:i.path,source:"scanner"}),f)for(let[d,e]of f.records)e.paneId===b.paneId&&e.panePid===c&&e.engine===a.engine&&h.push({pathname:d,source:"resume"});let l=j?e.get(j):void 0;return l?.engine===a.engine&&h.push({pathname:l.path,source:"argv"}),h}(e,c,b,p,w,j,a.writesPath??(()=>!1)),g=t(f);x.push({tmuxServerPid:k,paneId:c.paneId,panePid:b,agentPid:e.pid,display:c.target,windowName:c.windowName??"",engine:e.engine,cwd:e.cwd,agentArgv:[...e.argv],agentIdentity:a.identity(e.pid),launchId:a.launchId?await a.launchId(c.paneId):null,claimedPaths:[...new Set(f.map(a=>a.pathname))],primaryPath:g?.pathname??null,claims:f})}}let y=(e=new Map,x.forEach((a,b)=>{let c=r(a.agentArgv),d=c?`${a.paneId}:${a.engine}:${c}`:`${a.paneId}:${a.engine}:pid:${a.agentPid}`,f=e.get(d)??{firstIndex:b,hosts:[]};f.hosts.push(a),e.set(d,f)}),[...e.values()].sort((a,b)=>a.firstIndex-b.firstIndex).flatMap(a=>{if(1===a.hosts.length)return a.hosts;let b=[...a.hosts].sort((a,b)=>u(b.agentPid,b.panePid,m)-u(a.agentPid,a.panePid,m)||b.agentPid-a.agentPid)[0];if(!a.hosts.every(a=>u(b.agentPid,a.agentPid,m)>=0))return a.hosts;let c=[...new Map(a.hosts.flatMap(a=>a.claims).map(a=>[`${a.source}:${a.pathname}`,a])).values()],d=t(c);return[{...b,claims:c,claimedPaths:[...new Set(c.map(a=>a.pathname))],primaryPath:d?.pathname??null}]})),z=await a.reconcile?.(y),A=new Set(z?.quarantinedPaneIds??[]),B=y.filter(a=>!A.has(a.paneId)),C=function(a,b,c=new Set){let d=new Map;for(let e of a){let a=new Set(e.claims.map(a=>a.pathname)),f=[...new Set([...a].map(b).filter(a=>null!==a))];for(let b of f.length>0?f.map(a=>`conversation:${a}`):[...a].map(a=>`path:${a}`)){let f=b.startsWith("conversation:")?b.slice(13):null,g=d.get(b)??{conversationId:f,paths:new Set,paneIds:new Set,quarantinedPaneIds:new Set};for(let b of a)g.paths.add(b);g.paneIds.add(e.paneId),c.has(e.paneId)&&g.quarantinedPaneIds.add(e.paneId),d.set(b,g)}}return[...d.values()].filter(a=>a.paneIds.size>1||a.quarantinedPaneIds.size>0).map(a=>({conversationId:a.conversationId,paths:[...a.paths].sort(),paneIds:[...a.paneIds].sort((a,b)=>s(a)-s(b)),...a.quarantinedPaneIds.size>0?{quarantinedPaneIds:[...a.quarantinedPaneIds].sort((a,b)=>s(a)-s(b))}:{}})).sort((a,b)=>(a.conversationId??a.paths[0]??"").localeCompare(b.conversationId??b.paths[0]??""))}(y,f,A),D={hosts:y,observation:"available",conflicts:C,canonicalFor:a=>{let b;return v(D,a,f)?null:(b=B.map(b=>({host:b,claim:b.claims.filter(b=>b.pathname===a).sort((a,b)=>n[b.source]-n[a.source])[0]})).filter(a=>void 0!==a.claim).sort((a,b)=>n[b.claim.source]-n[a.claim.source]||s(b.host.paneId)-s(a.host.paneId)),b[0]?.host??null)}};return D};async function d(b,c){if(b.engine!==c.engine||await a.serverPid()!==b.tmuxServerPid||await a.panePid(b.paneId)!==b.panePid||!a.alive(b.agentPid)||b.windowName&&a.paneWindowName&&await a.paneWindowName(b.paneId)!==b.windowName||!function(a,b,c){let d=new Set,e=a;for(let a=0;null!==e&&a<64;a+=1){if(e===b)return!0;if(d.has(e))break;d.add(e),e=c(e)}return!1}(b.agentPid,b.panePid,a.parentPid))return!1;let d=a.argv(b.agentPid);if(d.length!==b.agentArgv.length||d.some((a,c)=>a!==b.agentArgv[c])||null!==b.agentIdentity&&a.identity(b.agentPid)!==b.agentIdentity||(0,j.Fe)(d)!==b.engine)return!1;let e=q(c.path);return(c.pid===b.agentPid||null!==e&&r(d)===e)&&b.claimedPaths.includes(c.path)}async function e(b){let e=a.conversationIdForPath??(()=>null),f=await c(!0);if("failure"===f.observation)throw Error(`tmux pane observation failed: ${f.observationError}`);let g=v(f,b.entry.path,e);if(g)throw new w(g);let h=f.canonicalFor(b.entry.path);if(h&&await d(h,b.entry))return{host:h,resumed:!1};let i=h;if("failure"===(f=await c(!0)).observation)throw Error(`tmux pane observation failed: ${f.observationError}`);let j=v(f,b.entry.path,e);if(j)throw new w(j);let k=null!==(h=f.canonicalFor(b.entry.path))&&null!==i&&h.paneId===i.paneId&&h.agentPid===i.agentPid&&null!==h.agentIdentity&&null!==i.agentIdentity&&h.agentIdentity!==i.agentIdentity;if(h&&!k&&await d(h,b.entry))return{host:h,resumed:!1};let l=a.beginResume?.(b.entry,b.spec)??null,m=l?.spec??b.spec,n=await a.spawn(m,"",l?.receipt);if(await a.remember(b.entry.path,m,n),"failure"===(f=await c(!0)).observation)throw Error(`tmux pane observation failed: ${f.observationError}`);let o=v(f,b.entry.path,e);if(o)throw new w(o);if(!(h=f.canonicalFor(b.entry.path))||!await d(h,b.entry))throw Error("resumed agent host could not be identified safely");return{host:h,resumed:!0}}function f(a){let c=b.get(a.entry.path);if(c)return{owner:!1,task:c};let d=e(a).finally(()=>b.delete(a.entry.path));return b.set(a.entry.path,d),{owner:!0,task:d}}async function g(b){let c,e=!1,g=!1;try{let a=f(b);e=a.owner,g=(c=await a.task).resumed}catch(a){return x(a)}for(let h=0;h<2;h+=1){if(!await d(c.host,b.entry))try{let a=f(b);c=await a.task,e||=a.owner,g||=c.resumed;continue}catch(a){return x(a)}try{await a.deliver(c.host.paneId,b.payload);try{await a.confirmAlive?.(c.host)}catch(a){console.error("[transcript host] live delivery registry confirmation failed",a)}return{ok:!0,outcome:e&&g?"resumed":"delivered-to-live",target:c.host.display}}catch(a){if(a instanceof l.SS)return x(a,500,"started");if(1===h)return x(a);try{let a=f(b);c=await a.task,e||=a.owner,g||=c.resumed}catch(a){return x(a)}}}return x("agent host became unavailable during delivery")}return{readTranscriptHosts:c,deliverToTranscriptHost:b=>a.serializeDelivery?a.serializeDelivery(b.entry,()=>g(b)):g(b)}}function z(a){return{kind:"tmux",endpoint:(0,l.WH)(),server:{pid:a.tmuxServerPid,startIdentity:g.B.processIdentity(a.tmuxServerPid)},paneId:a.paneId,panePid:{pid:a.panePid,startIdentity:g.B.processIdentity(a.panePid)},windowName:a.windowName??"",agent:{pid:a.agentPid,startIdentity:a.agentIdentity},argv:a.agentArgv}}async function A(){let a=await (0,l.lC)();if(null===a)return null;let b=(0,e.agentRegistry)(),c=b.readOnlySnapshot();if(!c.importedResumePanes){let c=await (0,l.MA)();if(c)return b.importResumePanes(c.serverPid,c.records),{serverPid:a,records:c.serverPid===a?new Map(c.records):new Map}}let d=c.legacyResumePanes;return{serverPid:a,records:d.serverPid===a?new Map(Object.entries(d.panes)):new Map}}async function B(a,b,c){if(await (0,l.$o)(a,b,c),!c.panePid)return;let d=await (0,l.lC)();null!==d&&(0,e.agentRegistry)().rememberResumePane(d,a,{paneId:c.paneId,panePid:c.panePid,windowName:b.windowName,engine:b.engine})}async function C(a,b){if("claude"!==a.engine&&"codex"!==a.engine)return b();let c=(0,f.sz)(a.engine,a.path);if(!c)return b();let d={pid:process.pid,startIdentity:g.B.processIdentity(process.pid)};try{return await (0,e.agentRegistry)().withOperationLock(c,d,b)}catch(a){return x(a,409)}}let D=y({listFiles:i.CS,panes:l.m7,ppidMap:()=>g.B.ppidMap(),agents:j.Bj,serverPid:l.lC,resumeRecords:A,panePid:l.zX,paneWindowName:async a=>(await (0,l.RZ)(a))?.windowName??null,alive:j.pl,argv:j.$U,parentPid:j.Ib,identity:g.B.processIdentity,writesPath:j.FQ,launchId:l.r$,conversationIdForPath:a=>(0,e.agentRegistry)().conversationForPath(a)?.id??null,beginResume:function(a,b,c=(0,e.agentRegistry)()){if("claude"!==a.engine&&"codex"!==a.engine)return null;let d=c.conversationForPath(a.path)??c.ensureConversation(a.engine,a.path,null),f=d.generations.at(-1);return{receipt:c.beginSpawnRequest({engine:a.engine,cwd:b.cwd,accountId:f?.accountId??null,conversationId:d.id,purpose:"resume-successor",origin:{kind:"successor"},launchProfile:b.launchProfile??f?.launchProfile}).receipt,spec:b}},spawn:l.Tk,remember:B,deliver:l.oF,confirmAlive:function(a){a.launchId&&(0,e.agentRegistry)().confirmSpawnPaneAlive(a.launchId,z(a),{engine:a.engine,cwd:a.cwd})},reconcile:function(a,b={registry:(0,e.agentRegistry)(),evidenceForHost:z}){let{registry:c,evidenceForHost:g}=b,h=c.readOnlySnapshot(),i=!1,j=new Set,l=new Set;for(let b of a){let a=g(b);if(b.launchId&&!b.primaryPath&&(c.confirmSpawnPaneAlive(b.launchId,a,{engine:b.engine,cwd:b.cwd}),i=!0),!b.primaryPath)continue;if(b.launchId){let e=function(a){for(let b of[a.primaryPath,...a.claimedPaths].filter(a=>!!a))if("claude"!==a.engine||!(0,k.X6)(b))return b;return null}(b),g=e?(0,f.sz)(b.engine,e):null;if(!e||!g){c.confirmSpawnPaneAlive(b.launchId,a,{engine:b.engine,cwd:b.cwd}),i=!0,l.add(b.paneId);continue}let m=`${g.engine}:${g.sessionId}`,n=h.receipts[b.launchId],o=h.entries[m];if(n?.state==="completed"&&n.cwd===b.cwd&&n.artifactPath===e&&n.key?.engine===g.engine&&n.key.sessionId===g.sessionId&&(0,d.isDeepStrictEqual)(n.verifiedHost,a)&&o?.artifactPath===e&&o.cwd===b.cwd&&"live"===o.status&&null===o.pendingAction&&(0,d.isDeepStrictEqual)(o.host,a)){j.add(m);continue}if(c.confirmSpawnPaneAlive(b.launchId,a,{engine:b.engine,cwd:b.cwd}),i=!0,"settled"===c.completeObservedSpawn(b.launchId,{key:g,artifactPath:e,cwd:b.cwd,accountId:null,status:"live",host:a,claimEpoch:0,claimOwner:null,pendingAction:null}).kind){j.add(m);continue}l.add(b.paneId);continue}let e=(0,f.sz)(b.engine,b.primaryPath);if(!e)continue;let m=`${e.engine}:${e.sessionId}`,n=h.entries[m],o={key:e,artifactPath:b.primaryPath,cwd:b.cwd,accountId:n?.accountId??null,status:"live",host:a,claimEpoch:n?.claimEpoch??0,claimOwner:n?.claimOwner??null,pendingAction:null};(function(a,b){if(!a)return!0;let c=void 0===b.structuredHost&&void 0!==a.structuredHost?{...b,structuredHost:a.structuredHost}:b,e={...a};return delete e.updatedAt,!(0,d.isDeepStrictEqual)(e,c)})(n,o)&&(c.upsert(o),i=!0),j.add(m)}for(let[a,b]of(i&&(h=c.readOnlySnapshot()),Object.entries(h.entries)))b.host?.kind!=="tmux"||j.has(a)||c.markUnhosted(b.key);return function(a,b){let c=new Set;for(let d of b){let b=a.entries[d];if(b){if(null!==b.pendingAction)return!0;c.add(b.artifactPath)}}return Object.values(a.receipts).some(a=>"starting"===a.state&&null!==a.artifactPath&&c.has(a.artifactPath))}(h,j)&&c.reconcileSpawnReceipts([...j].map(a=>{let[b,c]=a.split(":");return{engine:b,sessionId:c}})),{quarantinedPaneIds:[...l]}},serializeDelivery:C},p.__llvTranscriptHostDecisions??=new Map),E=D.readTranscriptHosts,F=D.deliverToTranscriptHost},66858:(a,b,c)=>{c.d(b,{ox:()=>d});function d(a){let b,c,d,e,f=new Set;for(let b of a){if(!b.source||!b.pos)continue;let a=function(a){let b=(a.x-740)/300,c=(a.y-120)/120;return!Number.isInteger(b)||b<0||!Number.isInteger(c)||c<0||c>=24?null:48*Math.floor(b/2)+2*c+b%2}(b.pos);null!==a&&f.add(a)}let g=0;for(;f.has(g);)g+=1;return c=Math.floor((b=Math.max(0,Math.floor(g)))/48),e=Math.floor((d=b%48)/2),{x:740+300*c*2+d%2*300,y:120+120*e}}},68512:(a,b,c)=>{c.d(b,{G:()=>e});let d=Promise.resolve();function e(a){let b=d.catch(()=>void 0).then(async()=>{let b=await a.snapshot();await a.append({scope:{type:"system",id:"files"},kind:"files.revision",payload:{filesRevision:b.filesRevision+1},producer:{kind:"structured-spawn-materialized"}})});return d=b,b}},69858:(a,b,c)=>{c.d(b,{$:()=>k,D:()=>j});var d=c(44836),e=c(84567);let f="\x3c!-- llv:structured-user --\x3e\n",g=/^<!-- llv:structured-user((?: [a-z0-9]+=[^ >]+)+) -->\n/,h=/(?:^| )([a-z0-9]+)=([^ >]+)/g,i=/^[a-f0-9]{64}$/;function j(a,b,c,g){let h=[];if(b&&h.push(`sha256=${b}`),c&&h.push(`ctx=${(0,d.mj)(c)}`),g){h.push(`origin=${g.kind}`);let a=(0,e.S)(g.role);a&&h.push(`sender=${a}`)}return 0===h.length?f+a:`<!-- llv:structured-user ${h.join(" ")} -->
|
|
81
|
+
${a}`}function k(a){let b=a.match(g);if(b){let c,f=null,g=null,j=null;for(let[,a,k]of b[1].matchAll(h))"sha256"===a&&i.test(k)&&(f=k),"ctx"===a&&(g=(0,d.Gp)(k)),"origin"===a&&("operator"===k||"agent"===k)&&(j=k),"sender"===a&&(c=(0,e.S)(k));let k=j?{kind:j,..."agent"===j&&c?{role:c}:{}}:null;return{text:a.slice(b[0].length),structured:!0,contentDigest:f,selectedContext:g,origin:k}}return a.startsWith(f)?{text:a.slice(f.length),structured:!0,contentDigest:null,selectedContext:null,origin:null}:{text:a,structured:!1,contentDigest:null,selectedContext:null,origin:null}}},73367:(a,b,c)=>{c.d(b,{JN:()=>i,NN:()=>n,ZD:()=>p,f$:()=>m,wi:()=>o});var d=c(31421),e=c(73024),f=c.n(e),g=c(76760),h=c.n(g);function i(a,b){let c="head"===b?["rev-parse","HEAD"]:["merge-base","HEAD",function(a){let b=(0,d.spawnSync)("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:a,encoding:"utf8"});if(0===b.status&&b.stdout.trim())return b.stdout.trim().replace(/^origin\//,"origin/");for(let b of["origin/main","origin/master","main","master"])if(0===(0,d.spawnSync)("git",["rev-parse","--verify",b],{cwd:a,encoding:"utf8"}).status)return b;return null}(a)??"origin/main"],e=(0,d.spawnSync)("git",c,{cwd:a,encoding:"utf8"});if(0!==e.status)return{ok:!1,error:(e.stderr||e.stdout||"failed to resolve git base ref").trim()};let f=e.stdout.trim();return f?{ok:!0,sha:f}:{ok:!1,error:"git returned an empty base ref"}}function j(a){let b=a.trim().replace(/\.git$/,""),c=RegExp(String.raw`^(?:ssh:\/\/)?git`+"@"+String.raw`github\.com[:/]([^/]+\/[^/]+)$`).exec(b);if(c)return c[1]??null;try{let a=new URL(b);if("github.com"!==a.hostname)return null;let c=a.pathname.replace(/^\//,"");return/^[^/]+\/[^/]+$/.test(c)?c:null}catch{return null}}let k=globalThis,l=k.__llvRepositoryCache??=new Map;function m(a,b=Date.now()){let c=l.get(a);if(c&&b-c.at<6e5)return c.repository;let d=null;try{let b=function(a){let b,c=function(a){let b=h().join(a,".git");try{let c=f().lstatSync(b);if(c.isDirectory())return b;if(!c.isFile())return null;let d=f().readFileSync(b,"utf8").slice(0,4096),e=/^gitdir:\s*(.+)\s*$/im.exec(d);return e?.[1]?h().resolve(a,e[1]):null}catch{return null}}(a);if(!c)return null;try{b=f().readFileSync(h().join(function(a){try{let b=f().readFileSync(h().join(a,"commondir"),"utf8").trim();return b?h().resolve(a,b):a}catch{return a}}(c),"config"),"utf8")}catch{return null}let d=!1;for(let a of b.split(/\r?\n/)){let b=/^\s*\[\s*remote\s+"([^"]+)"\s*\]\s*$/i.exec(a);if(b){d="origin"===b[1];continue}if(/^\s*\[/.test(a)){d=!1;continue}if(!d)continue;let c=/^\s*url\s*=\s*(.*?)\s*$/i.exec(a)?.[1],e=c?.replace(/\s+[;#].*$/,"").trim();if(e)return e}return null}(a);b&&(d=j(b))}catch{d=null}return l.set(a,{repository:d,at:b}),d}function n(a){let b=(0,d.spawnSync)("git",["remote","get-url","origin"],{cwd:a,encoding:"utf8"}),c=(0,d.spawnSync)("git",["branch","--show-current"],{cwd:a,encoding:"utf8"}),e=(0,d.spawnSync)("git",["rev-parse","HEAD"],{cwd:a,encoding:"utf8"});if(0!==b.status||0!==c.status||0!==e.status)return null;let f=j(b.stdout),g=c.stdout.trim(),h=e.stdout.trim();return f&&g&&/^[0-9a-f]{40}$/i.test(h)?{repository:f,headRef:g,headSha:h}:null}function o(a){let b=(0,d.spawnSync)("git",["status","--porcelain=v1","--untracked-files=all"],{cwd:a,encoding:"utf8",timeout:2e3});if(0!==b.status||b.stdout.trim())return null;let c=(0,d.spawnSync)("git",["rev-parse","HEAD"],{cwd:a,encoding:"utf8",timeout:2e3}),e=c.stdout.trim();return 0===c.status&&/^[0-9a-f]{40}$/i.test(e)?e:null}function p(a,b){let c=(0,d.spawnSync)("git",["ls-remote","--heads","origin",`refs/heads/${b}`],{cwd:a,encoding:"utf8",timeout:5e3});if(0!==c.status)return null;let e=c.stdout.trim().split(/\s+/)[0]??"";return/^[0-9a-f]{40}$/i.test(e)?e:null}},73789:(a,b,c)=>{c.d(b,{sy:()=>k,gR:()=>i,xq:()=>m,releaseStructuredDeliveryHost:()=>o,A:()=>n,pr:()=>j,Aj:()=>l}),c(77598),c(81533),c(29733);var d=c(48892);c(3127),c(63629),c(83336),c(41022),c(86850),c(59371),c(91596),c(94292),new TextEncoder,new TextDecoder,c(68512),c(32372);let e=process,f=e.__llvStructuredDeliveryController??={activeQueue:null,activeRegistry:null,activeHosts:null,registerActiveHost:null,republishActiveHost:null,releaseActiveHost:null,terminateActiveHost:null,completeActive:null,stopActive:()=>{}},g="structured-delivery-controller-unavailable";class h extends Error{constructor(){super("structured delivery controller is unavailable"),this.code=g,this.name="StructuredDeliveryControllerUnavailableError"}}function i(a){return a instanceof h||"object"==typeof a&&null!==a&&"code"in a&&a.code===g}function j(){let a=f.registerActiveHost;if(!a)throw new h;return a}function k(a){return f.activeHosts?.has((0,d.pp)(a))??!1}function l(a){var b,c;return a.startsWith("conversation_")&&f.activeRegistry&&f.activeHosts?(b=f.activeRegistry,c=f.activeHosts,a=>{let e=b.conversation(a),f=e?.generations.at(-1);return e&&f?c.get((0,d.pp)({engine:e.engine,sessionId:f.id}))??null:null})(a):null}async function m(a,b){return j()(a,b)}async function n(a){return await f.republishActiveHost?.(a)??!1}async function o(a){return await f.releaseActiveHost?.(a)??!1}},77149:(a,b,c)=>{c.d(b,{L1:()=>h});let d=globalThis;async function e(a=fetch,b=process.env){let c=b.LLV_VIEWER_CONTROL_URL?.trim()||"http://127.0.0.1:8898",d=await a(new URL("/api/pipelines/tick",c),{method:"POST",headers:{"content-type":"application/json",origin:c,"sec-fetch-site":"same-origin"},body:"{}"});if(!d.ok)throw Error(`pipeline controller request failed with status ${d.status}`)}async function f(){await e()}let g=d.__llvPipelineSignal??={tick:f,scheduled:!1};function h(){g.scheduled||null===g.tick||(g.scheduled=!0,queueMicrotask(()=>{g.scheduled=!1;let a=g.tick;null!==a&&a().catch(a=>{console.error("[pipeline controller] requested tick failed",a)})}))}},77276:(a,b,c)=>{function d(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:null}function e(a){return"string"==typeof a?a:""}function f(a){return"string"==typeof a?a:Array.isArray(a)?a.map(a=>{if("string"==typeof a)return a;let b=d(a),c=e(b?.type);return"text"===c||"input_text"===c||"output_text"===c?e(b?.text):""}).join(""):""}function g(a,b){let c=d(a);if(!c)return null;let g=d(c.message),h=e(c.type),i=e(c.role)||e(g?.role);if("agentMessage"!==h&&"agent_message"!==h&&"assistant"!==h&&("message"!==h||"assistant"!==i))return null;let j=("string"==typeof c.text?c.text:"")||f(c.content)||f(g?.content);return j?{responseId:e(c.id)||e(c.uuid)||e(g?.id)||b,text:j}:null}function h(a,b){return`voice:${JSON.stringify([a,b.map(a=>a.responseId)])}`}function i(a){return Array.isArray(a)?a.flatMap(a=>{let b=d(a),c=e(b?.turnId),f=Array.isArray(b?.responses)?b.responses.flatMap(a=>{let b=d(a),c=e(b?.responseId);return c&&"string"==typeof b?.text?[{responseId:c,text:b.text}]:[]}):[];if(!c||0===f.length)return[];let g=e(b?.sourceTurnId),i=d(b?.streamChunk),j=i?.index,k=i?.startOffset,l=i?.endOffset,m=g&&Number.isInteger(j)&&Number.isInteger(k)&&Number.isInteger(l)&&j>=0&&k>=0&&l>k;return[{deliveryId:h(c,f),turnId:c,responses:f,ready:b?.ready===!0,...m?{sourceTurnId:g,streamChunk:{index:j,startOffset:k,endOffset:l}}:{}}]}):[]}function j(a){let b=`voice-stream:${a.sourceTurnId}:${a.chunkIndex}:${a.startOffset}:${a.endOffset}`,c=`${b}:response`;return i([{deliveryId:"derived",turnId:b,sourceTurnId:a.sourceTurnId,streamChunk:{index:a.chunkIndex,startOffset:a.startOffset,endOffset:a.endOffset},responses:[{responseId:c,text:a.text}],ready:!0}])[0]}function k(a){if(!Array.isArray(a))return[];let b=[];for(let c of a){if("string"!=typeof c||!c)continue;let a=b.indexOf(c);a>=0&&b.splice(a,1),b.push(c)}return b.slice(-256)}function l(a,b,c){let d=i(a),e=d.findIndex(a=>a.turnId===b),f=e>=0?d[e]:{deliveryId:"",turnId:b,responses:[],ready:!1},g=f.responses.findIndex(a=>a.responseId===c.responseId),j=g>=0?f.responses.map((a,b)=>b===g?c:a):[...f.responses,c],k={deliveryId:h(b,j),turnId:b,responses:j,ready:f.ready};return e<0?[...d,k]:d.map((a,b)=>b===e?k:a)}function m(a,b,c){if(!Number.isInteger(b)||b<0||b>a.length)throw Error("voice delivery offset is invalid");let d=a.charCodeAt(b),e=a.charCodeAt(b-1);if(b>0&&d>=56320&&d<=57343&&e>=55296&&e<=56319)throw Error("voice delivery offset splits a Unicode scalar");if(!Number.isInteger(c)||c<4)throw Error("voice delivery chunk size is invalid");if(b===a.length)return null;let f=b,g=0;for(;f<a.length;){let d=a.codePointAt(f),e=d<=127?1:d<=2047?2:d<=65535?3:4;if(f>b&&g+e>c)break;g+=e,f+=d>65535?2:1}return f>b?{text:a.slice(b,f),nextOffset:f}:null}c.d(b,{Im:()=>i,N5:()=>j,_5:()=>l,_t:()=>m,mT:()=>g,yK:()=>k})},77308:(a,b,c)=>{c.d(b,{uk:()=>d});let d={"common.serverUnavailable":"сервер недоступний","common.loading":"завантаження…","common.loadingCap":"Завантаження…","common.cancel":"Скасувати","common.edit":"змінити","common.show":"показати","common.showAll":"показати все","common.collapse":"згорнути","common.copy":"Копіювати","common.copied":"скопійовано","common.clickToCopy":"клік — скопіювати","common.yes":"Так","common.no":"Ні","common.send":"Надіслати","common.sending":"надсилаю…","common.sent":"надіслано","common.close":"Закрити","common.failedSend":"не вдалося надіслати","common.failedDelete":"не вдалося видалити","common.nothingFound":"Нічого не знайдено","common.nothingRunning":"зараз нічого не працює","common.kb":"кБ","common.chars":"{n} симв.","lang.aria":"Мова інтерфейсу","util.effortTitle":"Зусилля міркування: {effort}","runtimeConfig.model":"Модель активного агента","runtimeConfig.effort":"Зусилля міркування активного агента","runtimeConfig.speedTitle":"Fast використовує пріоритетний рівень Codex","runtimeConfig.apply":"Застосувати","runtimeConfig.failed":"Не вдалося змінити конфігурацію активного агента","runtimeConfig.pending":"зміна очікує","runtimeConfig.applied":"Налаштування розмови застосовано","time.agoSec":"{n} с тому","time.agoMin":"{n} хв тому","time.agoHour":"{n} год тому","time.agoDay":"{n} д тому","turn.worked":"Працював {d}","turn.running":"працює {d}","turn.lastRun":"останній прогін: {d}","turn.timer":"час роботи","cardStatus.needsYou":"потребує вас","cardStatus.held":"притримано","cardStatus.running":"працює","cardStatus.queued":"у черзі","cardSwitch.pending":"очікує перемикання","cardSwitch.pendingTo":"\xab{label}\xbb очікує","cardSwitch.switching":"перемикання…","cardSwitch.switchingTo":"→ \xab{label}\xbb","cardSwitch.failed":"збій перемикання","cardSwitch.route":"\xab{from}\xbb → \xab{to}\xbb","kind.session":"сесія","kind.subagent":"субагент","kind.job":"джоба","kind.background":"фон","kind.handoff":"хендофф","rail.title":"Логи агентів","rail.filter":"Фільтр проєктів…","rail.projects":"Проєкти","rail.overview":"Огляд","rail.archive":"Архів","rail.crown":"Коронувати — закріпити зверху","rail.uncrown":"Зняти корону","rail.createProject":"Створити проєкт","rail.newProjectName":"Назва проєкту","rail.newProjectRoot":"Коренева тека (абсолютний шлях)","rail.create":"Створити","rail.creating":"Створення…","rail.invalidName":"Вкажіть назву проєкту","rail.invalidRoot":"Теку не знайдено","rail.missingRoot":"Такої теки ще немає","rail.createRootAndProject":"Створити теку і проєкт","rail.mkdirFailed":"Не вдалося створити теку","rail.duplicateProject":"Такий проєкт уже існує","rail.createFailed":"Не вдалося створити проєкт","dash.branchesLive":{one:"{count} гілка працює",few:"{count} гілки працюють",many:"{count} гілок працюють",other:"{count} гілок працюють"},"dash.trees":{one:"{count} дерево",few:"{count} дерева",many:"{count} дерев",other:"{count} дерев"},"dash.recentConvos":{one:"{count} нещодавня розмова",few:"{count} нещодавні розмови",many:"{count} нещодавніх розмов",other:"{count} нещодавніх розмов"},"dash.quietTrees":{one:"{count} тихе дерево",few:"{count} тихі дерева",many:"{count} тихих дерев",other:"{count} тихих дерев"},"dash.openProjects":"Відкрити список проєктів","dash.createMenu":"Створити","dash.moreMenu":"Більше дій","dash.soundMenu":"Звукові сповіщення","dash.unarchive":"Повернути з архіву","dash.newConvo":"Нова розмова з агентом","dash.agent":"Агент","dash.newWorkflow":"Новий воркфлоу: етапи → ревью → PR","dash.workflow":"Воркфлоу","dash.task":"Задача","dash.newTask":"Нова задача","dash.pipelinesUnavailable":"Пайплайни тимчасово недоступні: файл стану пайплайнів не вдалося прочитати. Решта панелей працює.","dash.loadingBoard":"Завантаження дошки…","dash.emptyTitle":"На схемі поки порожньо","dash.emptyHint":"Відкрий пульт у правому нижньому куті і клікни розмову — вона з'явиться тут","dash.viewScheme":"схема","dash.viewList":"розмови","dash.viewSchemeMenu":"Вигляд: схема","dash.viewListMenu":"Вигляд: розмови","dash.viewMenuGroup":"Вигляд дошки","dash.hiddenShelf":"Приховане","trash.title":"Кореневі розмови","trash.hint":"Клік по рядку відкриває розмову нодою; смітник видаляє її файл з диска назавжди.","trash.deletedFromDisk":"\xb7 видалено з диска","trash.open":"Відкрити {title}","trash.activeSubtree":"має активні гілки","trash.toArchive":"В архів","trash.notDeleted":"не видалено {failed} з {total}","trash.confirmDelete":{one:"Видалити з диска {count} файл проєкту?",few:"Видалити з диска {count} файли проєкту?",many:"Видалити з диска {count} файлів проєкту?",other:"Видалити з диска {count} файлів проєкту?"},"trash.deleting":"видаляю…","trash.confirmYes":"Так, видалити","trash.deleteProject":"Видалити проєкт з диска","trash.projectLoadFailed":"Не вдалося завантажити всі розмови проєкту","list.title":"Усі розмови","list.hint":"Завантажуються сторінками від найновіших з усіх розмов цього проєкту на диску.","list.searchHint":"Пошук у всіх розмовах на диску в усіх проєктах.","list.loadMore":"Завантажити більше розмов","list.failed":"Не вдалося завантажити розмови","list.retry":"Повторити","search.open":"Пошук моїх повідомлень (/)","search.openMobile":"Пошук моїх повідомлень","search.title":"Знайти мої повідомлення","search.aria":"Глобальний пошук повідомлень","search.placeholder":"Шукати серед усього надісланого…","search.mine":"Мої повідомлення","search.everything":"Усе","search.speakerAria":"Обсяг пошуку","search.hint":"Почни вводити, щоб шукати серед усього надісланого — у всіх проєктах, рушіях і акаунтах.","search.keysHint":"↑ ↓ — переміщення \xb7 Enter — відкрити \xb7 Esc — закрити","search.results":"Результати","search.updating":"оновлення…","search.loadMore":"Ще результати","search.none":"Нічого не знайдено за \xab{query}\xbb","search.corpus":"Переглянуто {messages} у {conversations}","search.corpusMessages":{one:"{formatted} повідомлення",few:"{formatted} повідомлення",many:"{formatted} повідомлень",other:"{formatted} повідомлень"},"search.corpusConversations":{one:"{formatted} розмові",few:"{formatted} розмовах",many:"{formatted} розмовах",other:"{formatted} розмовах"},"search.everythingInstead":"Шукати серед усього","search.failed":"Пошук не вдався","search.retry":"Повторити","search.untitled":"(без назви)","search.speaker.you":"ви","search.speaker.agent":"агент","search.close":"Закрити пошук","switch.aria":"Пульт агентів","switch.title":"Пульт","switch.search":"Пошук за назвою, першим промптом або проєктом","switch.results":"Усі знайдені розмови","switch.updating":"оновлення…","switch.close":"Закрити пульт","switch.waiting":"Чекає тебе","switch.working":"Працюють","switch.recent":"Нещодавні","switch.older":"Старіше","switch.hidden":"Приховані ({count})","switch.hide":"сховати","switch.restore":"повернути","accounts.activeAria":"Активний акаунт Codex","accounts.placeholder":"Акаунт Codex","accounts.add":"Додати","accounts.prompt":"Назва акаунта","accounts.login":"вхід","accounts.switchFailed":"Не вдалося змінити акаунт","accounts.conversationTitle":"Запустити цю розмову через","accounts.conversationPending":"Зміна акаунта очікує","accounts.conversationApplied":"Акаунт розмови змінено","accounts.conversationUnconfirmed":"Зміна акаунта без підтвердження — спробуйте ще раз","accounts.manage":"Керувати акаунтами…","accounts.addFailed":"Не вдалося додати акаунт","accounts.loginOpened":"Вхід через пристрій відкрито в {target}","accounts.openLogin":"Відкрити вхід","accounts.refreshFailed":"Не вдалося оновити акаунти. Спробуй ще раз.","accounts.loading":"Завантаження акаунтів…","accounts.noAccounts":"Акаунтів поки немає.","limits.accountLoading":"Завантаження лімітів акаунта…","accounts.retry":"Повторити","accounts.title":"Акаунти Codex","accounts.trigger":"Акаунти","accounts.active":"активний","accounts.needsLogin":"потрібен вхід","accounts.pendingLogin":"вхід…","accounts.auth.authenticated":"Авторизовано","accounts.auth.signedOut":"Вихід виконано","accounts.auth.unknown":"Вхід не перевірено","accounts.auth.error":"Помилка входу","accounts.operation.refresh":"Оновлюємо акаунти…","accounts.operation.add":"Починаємо вхід в акаунт…","accounts.operation.switch":"Змінюємо акаунт для майбутніх запусків…","accounts.operation.login":"Оновлюємо стан входу…","accounts.operation.remove":"Видаляємо акаунт…","accounts.operation.terminal":"Готуємо команду акаунта…","accounts.terminalCopied":"Команду скопійовано для {label}","accounts.terminalFailed":"Не вдалося підготувати команду для {label}","accounts.copyCli":"Копіювати CLI","accounts.copyCliAria":"Скопіювати команду агента для {label}","accounts.labelPlaceholder":"Назва нового акаунта","accounts.confirmAdd":"Додати","accounts.close":"Закрити","accounts.remove":"Видалити","accounts.removeAria":"Видалити {label}","accounts.removeConfirm":"Видалити цей акаунт? Минулі розмови залишаться доступними.","accounts.removeConfirmCta":"Підтвердити","accounts.removeConfirmCancel":"Скасувати","accounts.removeBlocked":"Для {label} ще є активна сесія або вхід.","accounts.removeHistoryBlocked":"{label} має активні розмови. Дочекайтеся їх завершення, а потім видаліть акаунт.","accounts.removeFailed":"Не вдалося видалити цей акаунт.","accounts.cleanupPending":"{label} видалено. Локальні дані ще потрібно очистити.","accounts.cleanupManual":"Частина локальних даних акаунта не пройшла перевірку безпеки. Перевірте й видаліть її вручну.","accounts.cleanupFailed":"Не вдалося очистити покинуті теки.","accounts.forceRemove":"Видалити примусово","accounts.cleanupOrphans":"Очистити покинуті теки","accounts.titleFor":"Акаунти {engine}","accounts.triggerAria":"Акаунти {engine} — змінити або додати","accounts.effective":"{pct}%","accounts.effectiveTip":"{window} обмежує","accounts.effectiveStale":"{window} обмежує \xb7 застаріло","accounts.limitsAria":"Вікна лімітів для {label}","accounts.limitsChecked":"Перевірено","accounts.limitsStale":"Останні відомі значення","accounts.limitsStaleTip":"Останні відомі значення — не наживо","accounts.claudeLoginStarted":"Вхід для {label} розпочато","accounts.claudeLogin.starting":"Починаємо вхід…","accounts.claudeLogin.awaitingBrowser":"Очікуємо посилання для входу…","accounts.claudeLogin.openLink":"Відкрити вхід claude.ai","accounts.claudeLogin.codeLabel":"Код авторизації","accounts.claudeLogin.codePlaceholder":"Встав код із браузера","accounts.claudeLogin.codeHint":"Після входу скопіюй код зі сторінки claude.ai і встав його сюди.","accounts.claudeLogin.submit":"Надіслати код","accounts.claudeLogin.verifying":"Перевіряємо…","accounts.claudeLogin.canceling":"Скасовуємо…","accounts.claudeLogin.cancel":"Скасувати","accounts.claudeLogin.signIn":"Увійти","accounts.claudeLogin.groupAria":"Вхід для {label}","accounts.claudeLogin.err.timed_out":"Час на вхід вичерпано.","accounts.claudeLogin.err.interrupted":"Вхід перервано перезапуском.","accounts.claudeLogin.err.verification_failed":"Не вдалося перевірити код.","accounts.claudeLogin.err.input_failed":"Не вдалося надіслати код.","accounts.claudeLogin.err.login_busy":"Інший вхід уже триває.","accounts.claudeLogin.err.generic":"Не вдалося почати вхід. Спробуй ще раз.","accounts.claudeLogin.announceCodeReady":"Посилання для входу {label} готове. Відкрий його і встав код.","accounts.claudeLogin.announceDone":"{label}: вхід виконано.","migrate.confirmTitle":"Перемкнути {engine} на \xab{label}\xbb?","migrate.confirmBody":"Нові агенти одразу використовують \xab{label}\xbb. {idle} активних сесій перемкнуться зараз; {busy} — після поточного ходу; {deferred} неактивних розмов — під час наступного повідомлення.","migrate.confirmCta":"Перемкнути акаунт","migrate.confirmAllCta":"Мігрувати всі ({total})","migrate.confirmCancel":"Скасувати","migrate.retargetTitle":"Перенаправити міграцію на \xab{label}\xbb?","migrate.retargetBody":"Міграція на \xab{current}\xbb ще триває. Нові агенти одразу використовуватимуть \xab{label}\xbb; активні сесії буде перенаправлено, неактивні розмови перейдуть під час наступного повідомлення. \xabМігрувати всі\xbb одразу охопить відкладену історію та вже перенесені розмови.","migrate.banner":"Міграція на \xab{label}\xbb — {done}/{total} готово","migrate.bannerWaiting":"{n} чекають завершення ходу","migrate.bannerFailed":"{n} з помилкою","migrate.bannerAria":"Хід міграції {engine}","migrate.stop":"Зупинити міграцію","migrate.bannerRetryFailed":"Повторити невдалі ({n})","migrate.stoppedNotice":"Міграцію зупинено. Решта сесій лишається на своєму акаунті; нові агенти й далі використовують \xab{label}\xbb.","migrate.failedNotice":"{n} сесій не вдалося перенести на \xab{label}\xbb.","migrate.completeNotice":"Усі сесії {engine} тепер на \xab{label}\xbb","migrate.announceComplete":"Усі сесії {engine} тепер на {label}","migrate.cardPending":"Очікує зміни акаунта — після поточного ходу","migrate.cardSwitching":"Перемикання на \xab{label}\xbb…","migrate.cardSwitchingUnnamed":"Змінюємо акаунт…","migrate.cardFailed":"Не вдалося змінити акаунт","migrate.cardRetry":"Повторити","migrate.cardKeep":"Лишити на \xab{label}\xbb","migrate.ribbonAria":"Стан міграції акаунта","migrate.divider":"Продовжено з \xab{label}\xbb — попередній запис в архіві","migrate.openPrevious":"Відкрити попередній запис","migrate.heldSend":"Повідомлення утримано — надійде після перемикання","migrate.readOnlyPredecessor":"В архіві — розмову продовжено під \xab{label}\xbb","migrate.retryFailed":"Не вдалося повторити перемикання","migrate.keepFailed":"Не вдалося лишити цю сесію на поточному акаунті","migrate.recoveryFailed":"{detail}","autobalance.title":"Автобаланс","autobalance.desc":"Перемикає сесії цього рушія, коли активний акаунт падає нижче {threshold}%, а інший має більше.","autobalance.toggleAria":"Автобаланс для {engine}","autobalance.idle":"Остання перевірка {time} \xb7 перемикання не потрібне","autobalance.waitingFresh":"Пауза — очікуємо свіжі дані квоти","autobalance.cooldown":"Пауза після перемикання — наступна перевірка за {n} хв","autobalance.draining":"Балансування…","autobalance.switched":"Перемкнуто на \xab{to}\xbb о {time} — \xab{from}\xbb впав до {pct}% ({window})","autobalance.bannerTag":"Авто","autobalance.override":"Автобаланс пропонував \xab{to}\xbb; ваш вибір має пріоритет.","limits.windowSession":"вікно 5 год","limits.windowWeekly":"тижневе вікно","switchCard.openColumn":"Відкрити колонкою {title}","switchCard.remove":"Прибрати з пульта","composer.imagesCount":{one:"{count} картинка",few:"{count} картинки",many:"{count} картинок",other:"{count} картинок"},"composer.spawned":"запущено агента в tmux {target}","composer.sentPaths":"надіслано {count} шлях(и)","composer.failedInterrupt":"не вдалося перервати","composer.escapeSent":"надіслано Escape — агент перервано","composer.escapeSentWaiting":"надіслано Escape — чекаємо, поки агент зупиниться","composer.spawnAria":"Запустити агента з промптом","composer.resolvingAria":"Повідомлення наявному агенту — доставка почнеться після відновлення його хоста","composer.sendAria":"Надіслати повідомлення агенту в tmux {target}","composer.sendStructuredAria":"Надіслати повідомлення через структурований runtime-хост","composer.queueAria":"Черга надісланих повідомлень","composer.removeFromQueue":"Прибрати з черги","composer.deliveryHeld":"Притримано для \xab{label}\xbb — доставиться після зміни акаунта","composer.deliveryHeldUnnamed":"Притримано — доставиться після зміни акаунта","composer.deliveryHeldWaiting":"Притримано — очікує доставки","composer.admissionTimedOut":"Час очікування підтвердження вичерпано. Перевіряємо надійну квитанцію; повідомлення збережено.","composer.deliveryUnconfirmed":"Не вдалося підтвердити доставку. Повідомлення збережено — надішліть ще раз, щоб безпечно повторити; той самий ключ повідомлення буде використано.","composer.runtimePill":"Модель і міркування — застосується до наступного повідомлення","composer.reasoningGroup":"Міркування","composer.modelGroup":"Модель","composer.speedGroup":"Швидкість","composer.speedStandard":"Стандартна","composer.speedFastTier":"Швидка — пріоритетний тариф","composer.backTo":"Назад","composer.nextMessageUses":"Наступне повідомлення: {model} \xb7 {effort}","composer.settingsNextResume":"застосується під час наступного відновлення розмови","composer.structuredImagesUnavailable":"Структуровані розмови поки не підтримують картинки","composer.codexImagesTextOnly":"Обрана модель Codex приймає лише текст.","composer.structuredImagesProtocol":"Цей структурований хост не узгодив підтримку зображень.","composer.imagesBlockedDuringRecovery":"Зображення з чернетки буде надіслано після відновлення хоста; текст можна надіслати вже зараз.","composer.imageCapabilityLoading":"Завантажуємо дані про підтримку зображень.","composer.imageCapabilityError":"Не вдалося завантажити дані про підтримку зображень.","composer.imageCapabilityRetry":"Повторити перевірку зображень","composer.attachTerminal":"Відкрити термінал для перегляду","composer.attachTerminalReady":"термінал для перегляду готовий у tmux {target}","composer.attachTerminalFailed":"не вдалося створити термінал для перегляду","composer.receiptHeld":"притримано","composer.receiptQueued":"у черзі","composer.receiptRecovering":"відновлення","composer.receiptFailed":"не доставлено","composer.deliveredEcho":"Доставлено — зʼявиться у стрічці","composer.retrySend":"Надіслати ще раз","composer.placeholderRelay":"написати — передам через кореневу сесію…","composer.placeholderSpawn":"промпт — агент запуститься…","composer.placeholderResolving":"написати агенту — відновлюємо з'єднання з сесією…","composer.placeholderSend":"написати агенту…","composer.placeholderOrchestrator":"що зробити в {project}?","composer.textAria":"Текст для агента","composer.optionsShow":"Показати параметри повідомлення","composer.optionsHide":"Сховати параметри повідомлення","composer.titleRelay":"передасться через кореневу сесію гілки","composer.titleSpawnResumed":"запустить новий сеанс агента, який продовжить цю розмову","composer.root":"корінь","composer.interruptAria":"Перервати агента (Escape)","composer.interruptTitle":"надіслати Escape у пейн агента","composer.compactAria":"Стиснути контекст агента (/compact)","composer.compactTitle":"надіслати /compact — агент стисне контекст; після завершення у стрічці з'явиться позначка","composer.compactConfirm":"Точно?","composer.compactConfirmTitle":"Натисни ще раз, щоб надіслати /compact","composer.compactSent":"стискання почалось — позначка з'явиться у стрічці, щойно завершиться","composer.failedCompact":"не вдалося запустити стискання","composer.addImages":"Додати картинки","composer.moreTools":"Додаткові дії","composer.stopAndSend":"Зупинити запис і надіслати","composer.launchAgent":"Запустити агента","composer.sendToAgent":"Надіслати агенту","composer.stopAndSendTitle":"зупинити запис і надіслати","composer.sendMenuTitle":"Дії відправки","composer.quickAck":"Так, продовжуй","composer.quickAckLabel":"Продовжити","composer.quickAckAria":"Надіслати агенту швидке \xabТак, продовжуй\xbb","composer.quickAckTitle":"Швидка відповідь — так, продовжуй","spawnCard.starting":"Запуск прийнято. Агент запускається.","spawnCard.binding":"Ідентифікатор агента створено. Під’єднуємо структурований хост.","spawnCard.queued":"Структурований хост готовий. Перше повідомлення в черзі.","spawnCard.reconciling":"Доставка узгоджується зі структурованим хостом.","spawnCard.recoverable-timeout":"Тайм-аут першого повідомлення можна відновити, поки збережена доставка завершується.","spawnCard.live-late-success":"Пізня доставка успішна, активну розмову приєднано.","spawnCard.failed":"Запуск завершився з помилкою.","spawnCard.recovered":"Запуск відновлено за збереженими даними.","spawnCard.initial.pending":"Перше повідомлення: очікує на під’єднання хоста","spawnCard.initial.queued":"Перше повідомлення: у черзі","spawnCard.initial.delivered":"Перше повідомлення: доставлено","spawnCard.initial.failed":"Перше повідомлення: помилка доставки","spawnCard.retrySafe":"Цей запуск завершено. Можна створити нову спробу.","spawnCard.pinUnavailableFallback":"Запущено на іншому акаунті — pin недоступний","spawnCard.pinUnavailableQueued":"Квоту закріпленого акаунта вичерпано — запуск у черзі до {retryAt}","spawnCard.launch":"Запуск {id}","spawnChip.starting":"Запускається","spawnChip.binding":"Під’єднання хоста","spawnChip.queued":"Хост готовий","spawnChip.reconciling":"Узгодження","spawnChip.recoverable-timeout":"Завершується","spawnChip.live-late-success":"Пізня доставка успішна","spawnChip.failed":"Запуск не вдався","spawnChip.recovered":"Запущено","spawnChip.initial.pending":"Перше повідомлення: очікує","spawnChip.initial.queued":"Перше повідомлення: у черзі","spawnChip.initial.delivered":"Перше повідомлення: доставлено","spawnChip.initial.failed":"Перше повідомлення: помилка","outbox.queueAria":"Повідомлення, що очікують доставки","outbox.queued":"У черзі","outbox.delivering":"Доставляється","outbox.heldForSwitch":"Притримано для \xab{label}\xbb — доставиться після перемикання","outbox.heldForSwitchUnnamed":"Притримано — доставиться після зміни акаунта","outbox.delivered":"Доставлено","outbox.failed":"Не доставлено","outbox.cancel":"Скасувати це повідомлення","outbox.retry":"Повторити надсилання цього повідомлення","outbox.reattach":"Не надіслано — додайте зображення знову та надішліть","strip.live":"наживо","strip.resume":"відновити","strip.deadMode":"мертвий хост","strip.moreActions":"Більше дій","strip.stopSubagent":"перериває кореневого агента","strip.compactSubagent":"недоступно для субагентів","strip.structuredUnsupported":"структурований хост поки не підтримує цю дію","strip.compactEngineUnsupported":"цей двигун не має команди стиснення","strip.compactBusyTurn":"недоступно, поки триває хід","strip.resolving":"визначаємо середовище агента…","deadHost.title":"Агент неактивний \xb7 {since} — повідомлення підуть у чергу","deadHost.body":"Текст, надісланий зараз, надійно зберігається і буде доставлений після відновлення хоста. Зображення не можна додати, доки хост не повернеться. Очікувані підтвердження застаріли — відновіть роботу елементами керування нижче.","deadHost.respawn":"Відновити розмову","deadHost.attach":"Відкрити в терміналі","deadHost.recheck":"Перевірити знову","deadHost.recheckFailed":"Не вдалося зʼєднатися зі середовищем — спробуйте ще раз.","strip.recheckHint":"Перевірити хост середовища ще раз","deadHost.respawnFailed":"Не вдалося перезапустити — спробуйте ще раз.","deadHost.sendBlocked":"хост мертвий — відновіть, щоб продовжити","deadHost.expiredCard":"застаріло — хост помер, перш ніж на це відповіли","superseded.title":"Раунд замінено \xb7 {since}","superseded.body":"Відновлення замінило цей раунд живим наступником. Ця розмова лишається як історія раундів.","superseded.open":"Відкрити живий раунд","superseded.resumeHere":"Продовжити тут","superseded.resumeConfirm":"Продовжити цей закритий раунд? Це розгалужить роботу: картка знову стане живою поруч із наступником.","superseded.resumeFailed":"Не вдалося зняти звʼязок заміни — спробуйте ще раз.","superseded.sendBlocked":"раунд замінено — відкрийте живий наступник","lineage.continues":"раунд {round} \xb7 продовжує попередній","lineage.continuesTitle":"Раунд {round}: продовжує замінений попередній раунд — натисніть, щоб відкрити його","attach.dialogTitle":"Підключитися у своєму терміналі","attach.dialogIntro":"Запускає цю розмову у вашому власному терміналі з тим самим акаунтом ({account}) і робочою директорією.","attach.copyCwd":"Скопіювати робочу директорію","attach.copyCommand":"Скопіювати команду","attach.copyFull":"Скопіювати повну команду","attach.copiedFull":"Повну команду скопійовано в буфер","attach.takeoverWarning":"Відновлення тут перебирає розмову у переглядача.","attach.subagentNote":"Субагенти відновлюються через свою кореневу сесію.","attach.secondaryViewer":"Відкрити панель перегляду лише для читання в tmux","attach.secondaryFailed":"Не вдалося відкрити панель перегляду — спробуйте ще раз.","receipt.human.deadHost":"хост агента помер","receipt.human.staleKey":"ключ доставки застарів","receipt.human.duplicate":"вже доставлено","receipt.human.turnActive":"агент посеред ходу","receipt.human.noTurn":"немає активного ходу","receipt.human.unsupportedCapability":"цей двигун не має такої команди","receipt.human.verbatim":"не доставлено: {reason}","draft.readPrompt":"Прочитай розмову агента у файлі {src} і продовж роботу звідти: ","draft.needDir":"вкажи робочу директорію","draft.launchFailed":"не вдалося запустити","draft.paneAria":"Чернетка нової розмови з агентом","draft.notStarted":"агент ще не запущений","draft.engineAria":"Двигун агента","draft.accountAria":"Обліковий запис {engine} для цього запуску","draft.accountDefault":"{label} \xb7 активний","draft.accountNeedsLogin":"{label} \xb7 потрібен вхід","draft.handoffLabel":"хендофф: {title}","draft.newConvo":"нова розмова","draft.conversation":"розмова","draft.dismiss":"Прибрати чернетку розмови","draft.directory":"директорія","draft.dirAria":"Робоча директорія агента","dirPicker.empty":"директорію не вибрано","dirPicker.searchAria":"Відфільтруй відомі директорії або впиши шлях","dirPicker.searchPlaceholder":"фільтр або власний шлях","dirPicker.listAria":"Відомі робочі директорії","dirPicker.current":"поточна","dirPicker.useTyped":"взяти цей шлях","dirPicker.noMatch":"нічого не збігається — впиши шлях, щоб узяти власний","dirPicker.noneKnown":"відомих директорій ще немає — впиши шлях","dirPicker.count":"{shown} з {total} директорій","draft.reasoning":"міркування","draft.role":"роль","draft.roleAria":"Рольовий пресет агента","draft.noRole":"Без ролі","draft.roleParameters":"Параметри ролі","draft.safetyFences":"Запобіжники безпеки","draft.roleNeedsParams":"заповніть обов'язкові параметри ролі","draft.reviews":"розмова для ревʼю","draft.reviewsAria":"Розмова для ревʼю","draft.reviewsPlaceholder":"Оберіть розмову","draft.reviewerNeedsConversation":"оберіть розмову, яку перевірятиме ревʼюер","draft.deployConfirm":"Введіть deploy, щоб підтвердити цей план деплою","draft.modelAria":"Модель агента","draft.modelDefault":"модель: типова","draft.reasoningAria":"Глибина міркувань агента","draft.effortDefault":"міркування: типові","draft.speedAria":"Режим швидкості Codex","draft.speedTitle":"fast = priority tier (1.5x швидкість, більша витрата лімітів)","draft.speedDefault":"швидкість: дефолт","draft.imagesOnly":"(картинки)","draft.launched":"агент запущений у tmux {target} — чекаю, поки розмова з'явиться тут…","draft.launchedStructured":"агент запущений — чекаю, поки розмова з'явиться тут…","draft.slow":"Щось довго. Перевір вікно tmux {target} — щойно транскрипт з'явиться, панель підхопить його сама.","draft.slowStructured":"Щось довго. Щойно транскрипт з'явиться, панель підхопить його сама.","draft.confirming":"Запущено — підтверджую агента в tmux {target}. Не надсилай ще раз; панель підхопить розмову, щойно з'явиться її транскрипт.","draft.confirmingStructured":"Запущено — підтверджую агента. Не надсилай ще раз; панель підхопить розмову, щойно з'явиться її транскрипт.","draft.confirmingNoTarget":"Підтверджую, чи запустився агент. Не надсилай ще раз — панель підхопить розмову, щойно з'явиться її транскрипт.","draft.confirmingSlow":"Запускається повільно — запуск підтверджено в tmux {target}. Панель стежить далі й підхопить розмову сама; не запускай ще раз.","draft.confirmingSlowStructured":"Запускається повільно — запуск підтверджено. Панель стежить далі й підхопить розмову сама; не запускай ще раз.","draft.attention":"Агент, можливо, вже працює в tmux {target}. Не запускай його ще раз. Прибери цю чернетку, коли перевіриш; вона все одно підхопиться автоматично, щойно з'явиться транскрипт.","draft.attentionStructured":"Агент, можливо, вже працює. Не запускай його ще раз. Прибери цю чернетку, коли перевіриш; вона все одно підхопиться автоматично, щойно з'явиться транскрипт.","draft.attentionNoTarget":"Агент, можливо, вже працює — перевір свої вікна tmux. Не запускай його ще раз. Прибери цю чернетку, коли перевіриш; вона все одно підхопиться автоматично, щойно з'явиться транскрипт.","draft.hintRelay":"Новий агент спершу прочитає транскрипт батьківської розмови і продовжить з того місця. Допиши в промпт, що зробити далі, — гілка з'явиться на схемі поруч.","draft.hintNew":"Обери двигун і директорію, напиши перший промпт — агент запуститься в tmux, і розмова продовжиться в цій самій панелі.","draft.hintNewStructured":"Обери двигун і директорію, напиши перший промпт — агент запуститься, і розмова продовжиться в цій самій панелі.","draft.promptAria":"Перший промпт для нового агента","draft.placeholder":"перший промпт — агент запуститься в tmux…","draft.placeholderStructured":"перший промпт — агент запуститься…","draft.promptTextAria":"Текст першого промпта","draft.newWindowTitle":"нове tmux-вікно зі свіжим агентом","draft.newWindowTitleStructured":"нова структурована сесія зі свіжим агентом","draft.newAgent":"новий агент","draft.addImages":"Додати картинки до промпта","draft.stopAndLaunch":"Зупинити запис і запустити агента","draft.rolePromptToggle":"Промпт ролі (EN)","draft.speedFast":"швидкий","draft.speedStandard":"стандартний","effortTier.minimal":"мінімальні","effortTier.low":"низькі","effortTier.medium":"середні","effortTier.high":"високі","effortTier.xhigh":"дуже високі","effortTier.max":"максимальні","effortTier.ultra":"ультра","reasoningTier.minimal":"Мінімальні","reasoningTier.low":"Легкі","reasoningTier.medium":"Середні","reasoningTier.high":"Високі","reasoningTier.xhigh":"Дуже високі","reasoningTier.max":"Максимальні","reasoningTier.ultra":"Ультра","roleCopy.orchestrator.name":"Оркестратор","roleCopy.orchestrator.description":"Координує нових агентів через панель керування Viewer.","roleCopy.orchestrator.param.mode.label":"Режим","roleCopy.orchestrator.param.mode.description":"Режим роботи координаційного запуску.","roleCopy.orchestrator.param.mode.option.standard":"стандартний","roleCopy.orchestrator.param.mode.option.plan-tickets":"план у тікети","roleCopy.orchestrator.param.mode.option.wayfind":"розвідка","roleCopy.orchestrator.param.mode.option.backlog-campaign":"кампанія по беклогу","roleCopy.orchestrator.param.repo.label":"Репозиторій","roleCopy.orchestrator.param.repo.description":"Репозиторій для кампанії по беклогу.","roleCopy.orchestrator.param.issueQuery.label":"Запит задач","roleCopy.orchestrator.param.issueQuery.description":"GitHub-запит задач для кампанії по беклогу.","roleCopy.orchestrator.param.urgent.label":"Термінові","roleCopy.orchestrator.param.urgent.description":"Список термінових задач через кому.","roleCopy.orchestrator.param.maxWorkers.label":"Максимум воркерів","roleCopy.orchestrator.param.maxWorkers.description":"Ліміт воркерів для кампанії по беклогу.","roleCopy.orchestrator.param.mergePolicy.label":"Політика злиття","roleCopy.orchestrator.param.mergePolicy.description":"Спосіб доставлення для кампанії по беклогу.","roleCopy.orchestrator.param.mergePolicy.option.pr":"пул-реквест","roleCopy.orchestrator.param.mergePolicy.option.merge":"мердж","roleCopy.orchestrator.param.completionPolicy.label":"Політика завершення","roleCopy.orchestrator.param.completionPolicy.description":"Умова завершення кампанії по беклогу.","roleCopy.orchestrator.param.completionPolicy.option.pr-opened":"відкрито PR","roleCopy.orchestrator.param.completionPolicy.option.merged":"змерджено","roleCopy.orchestrator.param.completionPolicy.option.released":"зарелізено","roleCopy.reviewer.name":"Рев'юер","roleCopy.reviewer.description":"Перевіряє диф коду й повертає знахідки з доказами, впорядковані за серйозністю.","roleCopy.reviewer.param.diffSource.label":"Джерело дифу","roleCopy.reviewer.param.diffSource.description":"Диф або пул-реквест для перевірки.","roleCopy.reviewer.param.lens.label":"Лінза","roleCopy.reviewer.param.lens.description":"Фокус рев'ю.","roleCopy.reviewer.param.lens.option.correctness":"коректність","roleCopy.reviewer.param.lens.option.over-engineering":"надлишкова інженерія","roleCopy.reviewer.param.lens.option.silent-failure":"тихі збої","roleCopy.reviewer.param.lens.option.test-coverage":"покриття тестами","roleCopy.reviewer.param.lens.option.scope":"межі задачі","roleCopy.reviewer.param.lens.option.prod-ops":"прод-експлуатація","roleCopy.reviewer.param.lens.option.standards+spec":"стандарти + спека","roleCopy.reviewer.param.lens.option.code-smells":"код-смелли","roleCopy.reviewer.param.lens.option.all":"усі лінзи","roleCopy.reviewer.param.mode.label":"Режим","roleCopy.reviewer.param.mode.description":"Контекст рев'юера.","roleCopy.reviewer.param.mode.option.fresh":"свіжий контекст","roleCopy.reviewer.param.parallelN.label":"Паралельні проходи","roleCopy.reviewer.param.parallelN.description":"Кількість незалежних проходів рев'ю.","roleCopy.verifier.name":"Верифікатор","roleCopy.verifier.description":"Перевіряє гіпотези й повертає вердикт із доказами по кожному твердженню.","roleCopy.verifier.param.claims.label":"Твердження","roleCopy.verifier.param.claims.description":"Гіпотези, які треба підтвердити або спростувати.","roleCopy.builder.name":"Білдер","roleCopy.builder.description":"Пише продуктовий код за окресленою задачею.","roleCopy.builder.param.mode.label":"Режим","roleCopy.builder.param.mode.description":"Дисципліна імплементації.","roleCopy.builder.param.mode.option.plain":"звичайний","roleCopy.builder.param.mode.option.apply-fixes":"застосувати фікси","roleCopy.builder.param.mode.option.tdd":"TDD","roleCopy.builder.param.mode.option.diagnose":"діагностика","roleCopy.builder.param.mode.option.prototype":"прототип","roleCopy.builder.param.mode.option.merge-resolve":"розв'язати конфлікти","roleCopy.builder.param.domain.label":"Домен","roleCopy.builder.param.domain.description":"Продуктовий домен імплементації.","roleCopy.builder.param.domain.option.general":"загальний","roleCopy.builder.param.domain.option.frontend":"фронтенд","roleCopy.architect.name":"Архітектор","roleCopy.architect.description":"Готує обґрунтований доказами дизайн без правок продукту.","roleCopy.architect.param.mode.label":"Режим","roleCopy.architect.param.mode.description":"Формат архітектурного результату.","roleCopy.architect.param.mode.option.design":"дизайн","roleCopy.architect.param.mode.option.spec":"спека","roleCopy.architect.param.mode.option.architecture-audit":"аудит архітектури","roleCopy.cleaner.name":"Клінер","roleCopy.cleaner.description":"Безпечно відновлює брудний чекаут за контрактом із бекапами.","roleCopy.prod-auditor.name":"Прод-аудитор","roleCopy.prod-auditor.description":"Проводить розслідування на проді лише в режимі читання, з доказами.","roleCopy.prod-auditor.param.questions.label":"Питання","roleCopy.prod-auditor.param.questions.description":"Питання щодо проду для розслідування.","roleCopy.deployer.name":"Деплоєр","roleCopy.deployer.description":"Планує blue/green-деплой і зупиняється для підтвердження перед змінами.","roleCopy.deployer.param.sha.label":"SHA мерджу","roleCopy.deployer.param.sha.description":"SHA змердженого коміту для деплою.","roleCopy.deployer.param.pr.label":"Пул-реквест","roleCopy.deployer.param.pr.description":"Необов'язкове посилання на пул-реквест.","link.handoffContext":"Тобі передали контекст іншого агента — розмову \xab{title}\xbb. Її транскрипт: {path} — спочатку прочитай цей файл, щоб мати повний контекст, а тоді виконай прохання нижче.\n\n{ask}","link.dropped":"контекст у промпті \xab{title}\xbb — допиши прохання і надішли","handoff.aria":"Перекинути розмову новому агентові — чернетка з'явиться нижче","handoff.title":"клік — чернетка нового агента з цим контекстом \xb7 потягни — звʼязати з наявним","handoff.label":"перекинути агенту","qr.showAria":"Показати QR для входу з телефона","qr.failed":"не вдалося отримати посилання","qr.startHint":"Запустіть viewer з доступом через Tailscale: ","qr.alt":"QR код для входу з телефона","qr.generating":"генерую QR…","qr.linkAria":"Посилання для входу з телефона","qr.copy":"Копіювати посилання","qr.scanHint":"скануй з телефона в тому ж tailnet","telegram.title":"Telegram","telegram.rowAria":"Підключення Telegram","telegram.close":"Закрити","telegram.readOnlyNote":"Лише читання \xb7 тільки сесії оператора","telegram.status.disconnected":"Не підключено","telegram.status.starting":"Запуск…","telegram.status.awaiting_scan":"Скануйте QR-код","telegram.status.awaiting_password":"Потрібен пароль","telegram.status.verifying":"Перевірка…","telegram.status.connected":"Підключено","telegram.status.expired":"Сесія завершилась","telegram.status.error":"Помилка","telegram.connect":"Підключити Telegram","telegram.connectHint":"Увійдіть, скануючи QR-код у застосунку Telegram. Viewer зберігає сесію лише на цій машині.","telegram.credentialsHint":"API-креденшали Telegram ще не налаштовані. Введіть api_id та api_hash з my.telegram.org — вони залишаться на цій машині.","telegram.credentialsIdLabel":"API ID","telegram.credentialsHashLabel":"API hash","telegram.credentialsSave":"Зберегти креденшали","telegram.credentialsSource":"Зберігається у власному конфігу Viewer (telegram.json, доступ лише власнику). Змінні середовища, якщо задані, мають пріоритет.","telegram.credentialsInvalid":"Це не схоже на коректну пару api_id + api_hash. Нічого не збережено.","telegram.reconnect":"Перепідключити","telegram.retry":"Повторити","telegram.cancel":"Скасувати","telegram.qrAlt":"QR-код входу в Telegram","telegram.qrGenerating":"генерую QR…","telegram.qrFailed":"Не вдалося згенерувати QR-код.","telegram.qrRetry":"Спробувати QR ще раз","telegram.qrHint":"У Telegram на телефоні: Налаштування → Пристрої → Підключити пристрій, потім скануйте. Прострочений код оновлюється автоматично.","telegram.passwordLabel":"Пароль двоетапної перевірки","telegram.passwordPlaceholder":"Пароль 2FA Telegram","telegram.passwordSubmit":"Надіслати","telegram.passwordInvalid":"Невірний пароль. Спробуйте ще раз.","telegram.passwordHint":"Telegram запитує пароль двоетапної перевірки. Він передається лише в Telegram.","telegram.connectedAs":"Підключено як","telegram.lastCheck":"Перевірено {time}","telegram.expiredHint":"Telegram завершив цю сесію. Перепідключіться, щоб продовжити.","telegram.logout":"Вийти","telegram.logoutConfirm":"Вийти з Telegram і видалити локальну сесію?","telegram.deleteLocal":"Видалити локальну сесію","telegram.deleteLocalConfirm":"Видалити локальну сесію? Віддалена авторизація Telegram може залишитись — видаліть її в Telegram → Пристрої.","telegram.confirmCta":"Підтвердити","telegram.confirmCancel":"Скасувати","telegram.actionFailed":"Не вдалося виконати дію. Спробуйте ще раз; якщо повторюється — закрийте й відкрийте панель.","telegram.actionUnreachable":"Сервер Viewer не відповів. Перевірте з'єднання і спробуйте ще раз.","telegram.err.login_busy":"Інший вхід у Telegram уже триває.","telegram.err.credentials_missing":"API-облікові дані Telegram не налаштовані на цьому хості.","telegram.err.start_failed":"Не вдалося почати вхід.","telegram.err.bridge_failed":"Вхід завершився несподівано.","telegram.err.password_invalid":"Невірний пароль.","telegram.err.network_failed":"Помилка мережі. Спробуйте ще раз.","telegram.err.timed_out":"Час входу вичерпано.","telegram.err.canceled":"Вхід скасовано.","telegram.err.session_unsafe":"Локальне сховище сесії не пройшло перевірку безпеки.","telegram.err.connector_failed":"Не вдалося запустити конектор Telegram.","telegram.err.host_registration_failed":"Не вдалося зареєструвати Telegram у локальних хостах агентів.","telegram.err.not_read_only":"Відмовлено: конектор оголосив інструменти, що не є лише для читання.","telegram.err.logout_failed":"Віддалений вихід не вдався. Можна видалити локальну сесію.","telegram.err.health_failed":"Не вдалося перевірити підключення.","telegram.announceScan":"QR-код Telegram готовий. Скануйте з телефона.","telegram.announcePassword":"Telegram запитує пароль двоетапної перевірки.","telegram.announceConnected":"Telegram підключено.","telegram.report.title":"Щоденний звіт","telegram.report.loading":"Завантаження…","telegram.report.disabledHint":"Раз на день агент читає ваші особисті діалоги та вибрані групи й пише один звіт, який ви читаєте тут.","telegram.report.enable":"Увімкнути щоденний звіт","telegram.report.disable":"Вимкнути","telegram.report.at":"О","telegram.report.zone":"за Києвом","telegram.report.sourcesSummary":{one:"Джерела: активні особисті діалоги + {count} група",few:"Джерела: активні особисті діалоги + {count} групи",many:"Джерела: активні особисті діалоги + {count} груп",other:"Джерела: активні особисті діалоги + {count} груп"},"telegram.report.sourcesEdit":"Групи","telegram.report.sourcesDone":"Готово","telegram.report.sourcesHint":"Особисті діалоги добираються автоматично за свіжою активністю. Оберіть групи: легкий прохід читає лише те, що стосується вас, повний — усю групу.","telegram.report.loadGroups":"Завантажити мої групи","telegram.report.noGroups":"Групи ще не завантажені.","telegram.report.modeLight":"Легкий","telegram.report.modeFull":"Повний","telegram.report.runNow":"Запустити зараз","telegram.report.running":"Виконується…","telegram.report.nextRun":"Далі {time}, {date}","telegram.report.noRuns":"Запусків ще не було.","telegram.report.open":"Відкрити","telegram.report.openRun":"Запуск","telegram.report.openRunTitle":"Відкрити цей запуск на дошці","telegram.report.promptTitle":"Промпт звіту","telegram.report.promptHint":"Ваше завдання для агента звіту: мова, рядок з тегом, розділи, для якого репозиторію пропонувати issues, тон. Редагуйте тут — без релізу.","telegram.report.promptPreamble":"Viewer завжди додає перед вашим текстом вікно, вибрані джерела, шлях виводу та правила послідовного читання. Підключений акаунт він перевіряє сам, перед запуском.","telegram.report.promptEdit":"Промпт","telegram.report.promptSave":"Зберегти промпт","telegram.report.promptReset":"Повернути типовий","telegram.report.promptDefault":"Промпт: типовий шаблон","telegram.report.promptEdited":"Промпт: змінений вами","telegram.report.back":"Назад","telegram.report.status.running":"виконується","telegram.report.status.ok":"звіт","telegram.report.status.quiet":"тиша","telegram.report.status.failed":"збій","telegram.report.status.account-mismatch":"інший акаунт","telegram.report.err.account_mismatch":"Підключений акаунт не той, для якого налаштовано звіт. Нічого не прочитано.","telegram.report.err.not_connected":"Telegram не підключено, тому запуск не відбувся.","telegram.report.err.reports_disabled":"Щоденні звіти вимкнено.","telegram.report.err.run_in_progress":"Запуск звіту вже триває.","telegram.report.err.account_check_failed":"Не вдалося перевірити підключений акаунт, тому нічого не читалося.","telegram.report.err.sources_failed":"Не вдалося отримати список чатів. Можливо, конектор перезапускається.","telegram.report.err.launch_failed":"Не вдалося запустити звіт.","telegram.report.err.run_ended_without_report":"Запуск завершився, не написавши звіт. Спробуйте ще раз.","telegram.report.err.timed_out":"Запуск тривав надто довго й був зупинений.","telegram.report.err.invalid_report":"Запуск записав те, що Viewer не зміг прочитати як звіт.","telegram.report.err.report_missing":"Цей звіт більше не зберігається.","telegram.report.err.transport":"Сервер Viewer не відповів. Спробуйте ще раз.","telegram.report.err.generic":"Не вдалося. Спробуйте ще раз.","push.enabled":"Push-сповіщення увімкнено","push.enable":"Увімкнути push-сповіщення","push.disable":"Вимкнути push-сповіщення","push.needsHttps":"Push потребує HTTPS","sound.on":"Звукові сповіщення увімкнено","sound.off":"Звукові сповіщення вимкнено","sound.mute":"Вимкнути звукові сповіщення","sound.unmute":"Увімкнути звукові сповіщення","sound.settings":"Рівні звуку","sound.cueVolume":"Звукові сигнали","sound.ambientViewer":"Фонова музика у переглядачі","sound.ambient":"Фонова музика під час дзвінка","sound.ambientVolume":"Рівень музики","sound.ambientHint":"Тихо звучить на цьому рівні й стишується під мову під час дзвінка. Якщо ввімкнено обидва, той самий трек продовжує грати через дзвінок.","keepAwake.label":"Не гасити екран","keepAwake.enableAria":"Не давати екрану гаснути на цьому пристрої","keepAwake.disableAria":"Дозволити екрану гаснути на цьому пристрої","keepAwake.off":"Екран гасне за звичайним таймером цього пристрою.","keepAwake.requesting":"Запитую браузер…","keepAwake.active":"Екран не гасне, поки ця вкладка видима. Витрачає більше заряду.","keepAwake.waiting":"Пауза, поки вкладка прихована. Відновиться, коли ви повернетесь.","keepAwake.interrupted":"Система зняла блокування. Вимкніть і ввімкніть, щоб запитати знову.","keepAwake.blocked":"Браузер відмовив у запиті. Екран не втримується.","keepAwake.failed":"Запит не вдався. Екран не втримується.","keepAwake.insecure":"Потрібна адреса HTTPS. Через звичайний HTTP екран втримати не можна.","keepAwake.unsupported":"Цей браузер не має блокування вимкнення екрана.","mic.stopRecognize":"Зупинити запис і розпізнати","mic.cancel":"Скасувати запис","mic.recognizing":"Розпізнаю…","mic.dictate":"Надиктувати","mic.dictateHint":"надиктувати (до 10 хв) \xb7 правий клік: спосіб розпізнавання","mic.timeLeft":"до автостопу {time}","mic.capStopped":"зупинено на 10:00","mic.connecting":"Під'єдную мікрофон — секунду…","mic.menuTitle":"Спосіб розпізнавання","mic.menuLoading":"перевіряю, що доступно…","mic.menuLocked":"Заблоковано змінною середовища LLV_TRANSCRIBE_BACKEND","mic.noKey":"не налаштовано","mic.saveFailed":"не вдалося зберегти вибір","mic.keyTitle":"{name} не налаштовано","mic.copy":"копіювати","mic.copyPath":"Скопіювати шлях","mic.copied":"скопійовано","mic.back":"Назад","stt.local.name":"Faster Whisper","stt.local.desc":"Безкоштовно, повністю локально — аудіо не покидає цю машину.","stt.local.fix":"Запусти scripts/setup-whisper.sh у теці застосунку один раз; він встановить локальний рушій у:","stt.chatgpt.name":"ChatGPT Voice","stt.chatgpt.desc":"У межах підписки ChatGPT, через логін Codex.","stt.chatgpt.fix":"Залогінься в Codex (команда `codex login`) — токен з'явиться у:","stt.elevenlabs.name":"ElevenLabs Scribe","stt.elevenlabs.desc":"Платний API ElevenLabs — найточніший варіант.","stt.elevenlabs.fix":"Поклади свій API-ключ ElevenLabs (одним рядком) у цей файл:","stt.soniox.name":"Soniox","stt.soniox.desc":"Платний API Soniox — найшвидша жива транскрипція.","stt.soniox.fix":"Поклади свій API-ключ Soniox (одним рядком) у цей файл:","delFile.confirm":"Видалити з диска?","delFile.aria":"Видалити розмову з диска","rename.edit":"Перейменувати","rename.editAria":"Перейменувати \xab{title}\xbb","rename.inputAria":"Назва сесії","rename.save":"Зберегти назву","rename.cancel":"Скасувати","rename.reset":"Повернути автоназву","rename.resetHint":"Повернути автоназву: {title}","rename.autoHint":"Автоназва: {title}","rename.retry":"Повторити","rename.saved":"Перейменовано на {title}","rename.conflict":"Назву змінили деінде — застосовано найновішу та повторено","rename.failed":"Не вдалося зберегти назву","img.readFailed":"не вдалося прочитати картинку","img.readAborted":"читання картинки перервано","img.unsupported":"непідтримуваний формат картинки: {name}","img.unknownFile":"невідомий файл","img.tooLarge":"{name}: завелика (ліміт 10 МБ)","img.structuredTooLarge":"Картинка перевищує ліміт цього хоста — {max} МБ","img.tooManyStructured":"За один раз можна надіслати до {max} картинок","img.structuredAggregateTooLarge":"Картинки перевищують ліміт запиту цього хоста — {max} МБ","img.image":"картинка","img.error":"помилка картинки","img.previewAlt":"прев'ю картинки {n}","img.removeAria":"Прибрати картинку {n}","img.readingAria":"завантаження картинки {n}","img.retry":"Повторити","img.retryAria":"Повторити картинку {n}","img.clearAll":"Очистити все","img.clearAllAria":"Прибрати всі картинки","img.blockedReading":"Зачекайте, поки картинка завантажиться…","img.blockedFailed":"Приберіть або повторіть невдалу картинку, щоб надіслати","img.deliveryHint":"додано до повідомлення","question.sec":"{n} с","question.min":"{n} хв","question.hour":"{n} год","question.waiting":"чекає на відповідь","question.sentToPane":"Надіслано в пейн: {text}","question.keysHint":"клавіші в пейн \xb7 або композер нижче","question.pane":"Пейн {target}","question.alreadyAnswered":"відповідь уже записана","question.openFailed":"не вдалося відкрити сесію","question.opened":"відкрито {target}","question.answered":"Відповідено: {text}","question.answeredElsewhere":"Відповідено в іншому місці: {text}","question.noPane":"tmux-пейн недоступний","question.openSession":"відкрити сесію","question.rejectComment":"Коментар до відхилення…","question.approved":"затверджено","question.rejected":"відхилено","question.approve":"Затвердити","question.reject":"Відхилити","question.ownAnswer":"Своя відповідь…","question.dismiss":"Прибрати картку запитання","question.deliveryFailed":"Доставка не вдалася","question.failedChoice":"не доставлено","question.retryAnswer":"Спробувати ще","question.errorNotRunning":"агент більше не працює, тож нічого не доставлено","question.errorMoved":"агент уже пішов далі від цього питання","question.errorUnconfirmed":"відповідь надіслано, але агент її не підтвердив","question.errorNotDelivered":"екран агента не відреагував як очікувалось, тож відповідь не доставлена","question.errorRejected":"вʼювер не зміг зібрати коректну відповідь","inbox.deleted":"видалено з диска","inbox.fileGone":"файла вже немає на диску","inbox.confirmDelete":"Видалити файл з диска?","inbox.deleteAria":"Видалити {name} з диска","inbox.deleteFromDisk":"видалити з диска","inbox.attachedAlt":"вкладена картинка {name}","lightbox.zoomOut":"Зменшити","lightbox.resetZoom":"Скинути масштаб","lightbox.zoomIn":"Збільшити","preview.dialogTitle":"{name} — перегляд документа","preview.close":"Закрити перегляд","preview.download":"Завантажити файл","preview.openExternal":"Відкрити в новій вкладці","preview.resize":"Змінити ширину перегляду","preview.kindPdf":"PDF-документ","preview.kindImage":"Зображення","preview.kindText":"Текстовий файл","preview.kindUnknown":"Файл","preview.loading":"Завантаження…","preview.missing":"Цього файлу вже не існує.","preview.denied":"Доступ до цього файлу заборонено.","preview.unsupported":"Цей тип файлу не можна переглянути.","preview.oversized":"Файл більший за ліміт перегляду.","preview.changed":"Файл змінився на диску після відкриття перегляду.","preview.aborted":"Завантаження скасовано.","preview.error":"Не вдалося завантажити перегляд.","preview.reload":"Перезавантажити","preview.searchPlaceholder":"Пошук у завантаженому тексті","preview.noMatches":"збігів немає","preview.prevMatch":"Попередній збіг","preview.nextMatch":"Наступний збіг","preview.wrapLines":"Переносити рядки","preview.loadMore":"Завантажити ще","preview.loadedOf":"Завантажено {loaded} із {size}","preview.fit":"Вписати","preview.fitImage":"Вписати в панель","preview.fitWidth":"За шириною","preview.prevPage":"Попередня сторінка","preview.nextPage":"Наступна сторінка","preview.pageOf":"Сторінка {page} з {pages}","feed.agentEnded":"агент завершився","feed.copyCode":"Скопіювати код","feed.copyMd":"Скопіювати повідомлення (Markdown)","feed.voiceTurn":"Голос","selectedContext.stale":"застаріле","selectedContext.ariaSelected":"Вибрана картка: {name} (проєкт {project})","feed.voiceContext":"Стенограма дзвінка","feed.speak":"Прочитати відповідь уголос (голос згенеровано ШІ)","feed.stopSpeaking":"Зупинити озвучення","tts.read":"Прочитати відповідь уголос","tts.readPaid":"Прочитати вголос (платно)","tts.replay":"Повторити аудіо відповіді","tts.replayFree":"Повторити вголос (безкоштовно)","tts.triggerTitle":"{action} \xb7 правий клік: голос і оплата","tts.stop":"Зупинити озвучення","tts.menuTitle":"Голос і оплата","tts.menuLocked":"Заблоковано змінною середовища LLV_TTS_BACKEND","tts.nextPaid":"Наступний клік: платне озвучення цієї відповіді","tts.nextFree":"Наступний клік: безкоштовний повтор із кешу","tts.nextStop":"Наступний клік: зупинити читання цієї відповіді","tts.noKey":"не налаштовано","tts.saveFailed":"Не вдалося змінити провайдера голосу","tts.replayExpired":"Кешоване аудіо застаріло — цей повтор буде платним озвученням.","tts.backendChanged":"Провайдер голосу змінився — це читання оплачує {provider}.","tts.characters":"{count} символів","tts.billing":"Оплата з вашого облікового запису {provider} за кожен символ.","tts.disclosure":"Ви почуєте голос, згенерований ШІ, а не голос людини.","tts.tooLong":"Задовге для озвучення (ліміт {count} символів). Нічого не обрізається — озвучте коротший фрагмент.","tts.seekHint":"Клацніть у тексті під час відтворення, щоб перейти до цього місця.","tts.partOf":"Частина {index} з {count}","tts.finished":"Читання завершено","tts.missingKey":"Додайте API-ключ {provider} у {path}","tts.generating":"Створення аудіо…","tts.playing":"Відтворення аудіо","tts.stopped":"Зупинено","tts.configError":"Конфігурація TTS недоступна","tts.requestError":"Помилка запиту TTS ({status})","tts.requestFailed":"Помилка запиту TTS","tts.playError":"Браузер заблокував відтворення аудіо. Спробуйте ще раз.","feed.running":"виконує {tool}…","feed.tool":"інструмент","feed.thinking":"думає…","feed.working":"працює…","feed.liveTail":"живий хвіст","feed.liveOmittedItems":"… ({count} попередніх живих записів, {chars} символів)","feed.liveToolArgsOmitted":"аргументи пропущено","feed.liveToolOutcomeOmitted":"результат пропущено","feed.liveOmittedChars":"… (+{chars} символів)","feed.backToLive":"Повернутись до живого хвоста","feed.newCount":"{count} нових","feed.down":"вниз","feed.pickLog":"Вибери лог зліва — стрічка оновлюється сама","feed.showEarlier":"показати раніше","feed.showEarlierHidden":"показати раніше (сховано {count})","feed.loadEarlier":"завантажити раніше з файлу","feed.startOfConvo":"початок розмови","feed.finishedTurn":"закінчив хід — чекає відповіді","feed.returnedResult":"повернувся з результатом","feed.noOutput":"Ще без виводу — файл поки порожній","feed.onlyService":"Є лише службові записи ({count}).","feed.empty":"Порожньо (немає рядків для показу)","render.system":"системне","render.executing":"виконується…","render.error":"помилка","render.teammate":"тімейт","render.left":"{peer}: звільнився{at}","render.codexSessionCreated":"Сесія Codex створена","render.taskStarted":"Задача стартувала","render.taskComplete":"Задачу завершено","render.compacted":"контекст стиснуто","render.compactAuto":"авто","render.compactManual":"вручну","render.compactPre":"{n}k токенів до","render.compactSummary":"підсумок розмови","render.stdinSession":"stdin → сесія {id}","render.record":"запис","render.transcriptRecord":"запис транскрипту","render.recordDetails":"деталі запису","render.protocol":"протокол","render.image":"зображення","render.imageOutput":"вивід зображення","render.toolOutput":"вивід інструмента","render.toolOutputType":"вивід інструмента: {type}","render.dataKb":"даних {n} КБ","render.commands":{one:"{count} команда",few:"{count} команди",many:"{count} команд",other:"{count} команд"},"render.actions":{one:"{count} дія",few:"{count} дії",many:"{count} дій",other:"{count} дій"},"render.noFindings":"без findings","render.moreFindings":"ще {count} findings у raw","render.memoryCitations":"цитати пам'яті ({count})","render.noCitations":"без citation entries","render.moreEntries":"ще {count} entries у raw","render.truncated":"обрізано","render.shutdownRequest":"запит на завершення","render.shutdownResponse":"відповідь на завершення","render.planRequest":"запит на затвердження плану","render.planVerdict":"вердикт по плану","render.approved":"схвалено","render.rejected":"відхилено","render.from":"від {from}","render.structured":"структуроване повідомлення","render.showJson":"показати JSON","render.toDir":"до","render.fromDir":"від","render.internalTag":"внутрішнє","render.agentPeer":"агент","render.delivered":"доставлено","render.notDelivered":"не доставлено","render.reasoning":"міркування агента","tools.read":"Читання","tools.write":"Запис","tools.edit":"Редагування","tools.lines":{one:"{count} рядок",few:"{count} рядки",many:"{count} рядків",other:"{count} рядка"},"tools.files":{one:"{count} файл",few:"{count} файли",many:"{count} файлів",other:"{count} файлу"},"tools.items":{one:"{count} пункт",few:"{count} пункти",many:"{count} пунктів",other:"{count} пункту"},"tools.family.shell":"команда оболонки","tools.family.read":"читання файлу","tools.family.write":"запис файлу","tools.family.edit":"редагування","tools.family.search":"пошук","tools.family.web":"веб","tools.family.spawn":"запуск агента","tools.family.plan":"план","tools.family.mcp":"інструмент MCP","tools.family.other":"інструмент","tools.showAllLines":"показати всі ({count} рядків)","tools.showOutput":"показати весь вивід","tools.moreFiles":"…і ще {count} файлів","tools.binaryContent":"бінарний вміст \xb7 {size}","tools.rawRecord":"сирий запис","tools.noRawRecord":"деталі більше не завантажені","tools.noOutput":"вивід не збережено","tools.noOutputTip":"повний вивід зберігається в сесії rollout","tools.stdin":"stdin","tools.stdinPoll":"опитування","tools.pollRun":{one:"{count} опитування",few:"{count} опитування",many:"{count} опитувань",other:"{count} опитувань"},"tools.wait":"очікування","tools.session":"сесія","tools.waitingSeconds":"очікування {n} с","tools.wakeup":"заплановане пробудження","tools.cron":"запланований агент","tools.monitor":"монітор","tools.schedule":"розклад","tools.diffTruncated":"обрізано","tools.orchestration":{one:"{count} виклик інструмента",few:"{count} виклики інструментів",many:"{count} викликів інструментів",other:"{count} викликів інструментів"},"tools.nestedCalls":"вкладені виклики","tools.callId":"виклик {id}","tools.copyId":"копіювати id","tools.copyDiff":"Копіювати diff","tools.copyOutput":"Копіювати вивід","tools.source":"джерело","tools.action":"дія {index}","tools.cwd":"cwd","tools.copyCwd":"копіювати cwd","tools.copyCommand":"Копіювати команду","tools.stdout":"stdout","tools.stderr":"stderr","tools.copyStderr":"Копіювати stderr","tools.showStderr":"показати весь stderr","tools.noStderr":"stderr не збережено","tools.exitOk":"код виходу 0","tools.exitCode":"код виходу {code}","tools.durationSec":"{n} с","tools.durationMin":"{m} хв {s} с","tools.durationMs":"{n} мс","tools.ranAt":"{start}–{end}","tools.nestedWaits":{one:"{count} додатковий",few:"{count} додаткові",many:"{count} додаткових",other:"{count} додаткових"},"wakeup.card":"заплановане пробудження","wakeup.wakesAt":"прокинеться о {time}","wakeup.wasSetFor":"було на {time}","wakeup.firedAt":"спрацював о {time}","wakeup.fired":"спрацював","wakeup.failed":"не заплановано","wakeup.superseded":"замінено","wakeup.noTime":"пробудження заплановано","wakeup.plan":"план пробудження","wakeup.planInternal":"внутрішній промпт","wakeup.noPlan":"план пробудження не задано","wakeup.inRel":"через {rel}","wakeup.agoRel":"{rel} тому","wakeup.relSec":{one:"{count} с",few:"{count} с",many:"{count} с",other:"{count} с"},"wakeup.relMin":{one:"{count} хв",few:"{count} хв",many:"{count} хв",other:"{count} хв"},"wakeup.relHour":{one:"{count} год",few:"{count} год",many:"{count} год",other:"{count} год"},"wakeup.relDay":{one:"{count} дн",few:"{count} дн",many:"{count} дн",other:"{count} дн"},"wakeup.chipTitle":"спить до {time} — {reason}","flowDialog.engine":"Двигун: {label}","flowDialog.modelPlaceholder":"модель (дефолт)","flowDialog.model":"Модель: {label}","flowDialog.effortDefault":"effort: дефолт","flowDialog.createFailed":"не вдалося створити флоу ({status})","flowDialog.title":"Запустити флоу","flowDialog.subtitle":"implement → review \xb7 ця розмова стає виконавцем","flowDialog.preset":"пресет","flowDialog.rolesManualOpen":"▾ ролі вручну","flowDialog.rolesManual":"▸ ролі вручну (модель / effort)","flowDialog.spec":"специфікація та критерії приймання","flowDialog.specPlaceholder":"Опис задачі\nAC1: …\nAC2: …","flowDialog.implementer":"виконавець","flowDialog.reviewer":"ревʼюер","flowDialog.diffBase":"база діфу","flowDialog.fromHead":"від поточного HEAD","flowDialog.fromMergeBase":"від merge-base з main","flowDialog.headless":"headless (без панелі)","flowDialog.tmuxPane":"tmux-панель","flowDialog.transitions":"переходи","flowDialog.auto":"авто","flowDialog.manual":"вручну (гейт на кожен крок)","flowDialog.roundLimit":"ліміт раундів","flowDialog.creating":"створюю…","flowDialog.start":"▶ Запустити","flowStrip.startReview":"Почати ревью","flowStrip.spawnReviewer":"Заспавнити ревʼюера","flowStrip.relayNotes":"Передати зауваження","flowStrip.retryRound":"Повторити раунд","flowStrip.anotherRound":"Ще коло","flowStrip.flow":"Флоу","flowStrip.roundsAria":"Раунди ревью","flowStrip.roundError":"Раунд {n}: {error}","flowStrip.roundVerdict":"Раунд {n}: {verdict}","flowStrip.roundInProgress":"Раунд {n}: триває","flowStrip.addRoundsTitle":"Додати ще раунди до ліміту","flowStrip.plus2":"+2 раунди","flowStrip.limitTitle":"Ліміт раундів: скільки ревью до зупинки (∞ — без ліміту)","flowStrip.limitAria":"Встановити ліміт раундів: {count}","flowStrip.limitUnlimitedAria":"Без ліміту раундів","flowStrip.stopReviewer":"Стоп","flowStrip.stopReviewerTitle":"Зупинити поточного ревʼюера; раунд перейде в \xabпотрібне рішення\xbb","flowStrip.notePlaceholder":"нотатка ревʼюеру…","flowStrip.noteTitle":"Піде наступному ревʼюеру як ready-нотатка раунду","flowStrip.autoTitle":"Авто: переходи самі. Клік — вручну.","flowStrip.manualTitle":"Вручну: кожен перехід чекає кліку. Клік — авто.","flowStrip.manualShort":"вручну","flowStrip.resume":"Продовжити флоу","flowStrip.pause":"Пауза","flowStrip.close":"Закрити флоу","flowHub.aria":"Керування флоу — раунд {n}, {state}","flowHub.ariaNoRound":"Керування флоу — {state}","flowHub.controls":"Керування флоу","groupOverride.closePanel":"Закрити керування","groupOverride.flowTitle":"Змінити \xb7 {name}","groupOverride.pipelineTitle":"Змінити \xb7 {name}","groupOverride.draftTitle":"Редагувати чернетку \xb7 {name}","groupOverride.task":"Завдання","groupOverride.spec":"Специфікація","groupOverride.repoDir":"Репозиторій","groupOverride.saveDraft":"Зберегти деталі чернетки","groupOverride.savedDraft":"Деталі чернетки збережено","groupOverride.reviewerRole":"Наступний рев'юер","groupOverride.engine":"Рушій","groupOverride.effort":"Зусилля","groupOverride.effortDefault":"типове","groupOverride.model":"Модель","groupOverride.modelPlaceholder":"типова для рушія","groupOverride.applyRole":"Оновити рев'юера","groupOverride.nextRoundNote":"Нотатка на наступний раунд","groupOverride.notePlaceholder":"На чому зосередити наступного рев'юера…","groupOverride.noteUnavailable":"Можна редагувати під час старту, запуску або повтору раунду.","groupOverride.roundLimit":"Ліміт раундів","groupOverride.setLimit":"Задати","groupOverride.extend":"+1 раунд","groupOverride.nextStage":"Наступний етап","groupOverride.draftStage":"Етап чернетки","groupOverride.addStage":"Додати етап","groupOverride.removeStage":"Видалити етап","groupOverride.moveStageUp":"Перемістити вгору","groupOverride.moveStageDown":"Перемістити вниз","groupOverride.role":"Роль","groupOverride.noRole":"Без ролі","groupOverride.stagePrompt":"Промпт стадії","groupOverride.applyStage":"Оновити етап","groupOverride.noEditableStage":"Немає майбутнього етапу для змін — усі етапи вже стартували.","groupOverride.editStagesOnCanvas":"Редагуйте етапи на їхніх картках — роль, модель, підказка, порядок і зʼєднання є на картці кожного етапу на полотні.","groupOverride.savedReviewer":"Рев'юера оновлено на наступний раунд","groupOverride.savedLimit":"Ліміт раундів оновлено","groupOverride.savedExtend":"Додано раунд","groupOverride.savedRetry":"Повторюємо раунд","groupOverride.savedCancel":"Рев'юера зупинено","groupOverride.savedStage":"Етап оновлено для наступного запуску","groupOverride.stagesHeading":"Етапи \xb7 порядок виконання","groupOverride.stagesHint":"Перетягуй картки, щоб змінити порядок. Порядок — це ланцюг виконання.","groupOverride.stagesEmpty":"Ще немає етапів — додай етап нижче, щоб почати збірку.","groupOverride.startNeedsStages":"Додай щонайменше 1 етап перед запуском.","groupOverride.addRunStage":"Додати етап","groupOverride.addReviewStage":"Додати цикл ревʼю","groupOverride.dragHandle":"Перетягни, щоб змінити порядок етапу","groupOverride.runKind":"запуск","groupOverride.reviewKind":"цикл ревʼю","groupOverride.reordered":"Порядок етапів змінено","groupOverride.stageAdded":"Етап додано","groupOverride.stageRemoved":"Етап видалено","pipelineBuilder.untitledTask":"Новий пайплайн","pipelineBuilder.createDraft":"Пайплайн","pipelineBuilder.createDraftAria":"Додати чернетку пайплайна на полотно","roundDeck.roundAborted":"Раунд {n} \xb7 перервано","roundDeck.roundVerdict":"Раунд {n} \xb7 {verdict}","roundDeck.roundInProgress":"Раунд {n} \xb7 триває","roundDeck.aborted":"перервано","roundDeck.reviewInProgress":"ревью триває","roundDeck.waitingFirst":"чекаю на перший раунд ревью…","roundDeck.spawningReviewer":"запускаю ревʼюера — транскрипт зʼявиться за мить…","roundDeck.moreRounds":"ще {count} раунд(и) — клікни чипи на стрічці флоу","roundDeck.findings":{one:"{count} знахідка",few:"{count} знахідки",many:"{count} знахідок",other:"{count} знахідок"},"roundDeck.roundsCount":{one:"{count} раунд",few:"{count} раунди",many:"{count} раундів",other:"{count} раундів"},"roundDeck.collapseStack":"Згорнути стек ревʼю ({count} раундів)","roundDeck.expandStack":"Розгорнути стек ревʼю ({count} раундів)","roundDeck.groupAria":{one:"Група ревʼю \xb7 {count} раунд",few:"Група ревʼю \xb7 {count} раунди",many:"Група ревʼю \xb7 {count} раундів",other:"Група ревʼю \xb7 {count} раундів"},"roundDeck.groupAriaNamed":{one:"Група ревʼю для {name} \xb7 {count} раунд",few:"Група ревʼю для {name} \xb7 {count} раунди",many:"Група ревʼю для {name} \xb7 {count} раундів",other:"Група ревʼю для {name} \xb7 {count} раундів"},"subagentTray.label":{one:"{count} підагент",few:"{count} підагенти",many:"{count} підагентів",other:"{count} підагентів"},"subagentTray.toggle":{one:"Розгорнути лоток підагентів ({count} згорнутий)",few:"Розгорнути лоток підагентів ({count} згорнуті)",many:"Розгорнути лоток підагентів ({count} згорнутих)",other:"Розгорнути лоток підагентів ({count} згорнутих)"},"subagentTray.collapse":{one:"Згорнути лоток підагентів ({count} згорнутий)",few:"Згорнути лоток підагентів ({count} згорнуті)",many:"Згорнути лоток підагентів ({count} згорнутих)",other:"Згорнути лоток підагентів ({count} згорнутих)"},"subagentTray.rows":"Згорнуті підагенти","subagentTray.open":"Відкрити транскрипт підагента {name}","subagentTray.fold":"Згорнути {name} у лоток підагентів","subagentTray.unfold":"Повернути {name} як повну картку","subagentTray.state.running":"працює","subagentTray.state.live":"наживо","subagentTray.state.silent":"живий, але мовчить","subagentTray.state.closed":"простій","subagentTray.state.dead":"недоступний","flowState.waiting_ready":"чекає READY","flowState.spawn_pending":"готовий спавнити ревʼюера","flowState.spawning":"запускаю ревʼюера","flowState.reviewing":"ревью","flowState.relay_pending":"вердикт є — передати?","flowState.relaying":"передаю зауваження","flowState.fixing":"фікси","flowState.approved":"затверджено","flowState.done_comment":"готово із зауваженнями","flowState.needs_decision":"потребує рішення","flowState.paused":"пауза","flowState.closed":"закрито","flowState.blocked_rate_limited":"заблоковано: вичерпано ліміт","flowState.rate_limit_until":"скинеться о {time}","flowState.rate_limit_wait":"чекає на скидання ліміту","flowModel.failed":"не вдалося ({status})","wfState.provisioning":"готую worktree","wfState.implementing":"етапи виконуються","wfState.reviewing":"ревью","wfState.finishing":"завершення","wfState.approved":"approved","wfState.needs_decision":"потребує рішення","wfState.paused":"пауза","wfState.closed":"закрито","wfModel.failed":"не вдалося ({status})","wfStrip.workflow":"Воркфлоу","wfStrip.stagesAria":"Етапи воркфлоу","wfStrip.reviewStage":"ревью","wfStrip.advance":"Далі","wfStrip.retryStage":"Повторити етап","wfStrip.skipStage":"Пропустити","wfStrip.resume":"Продовжити воркфлоу","wfStrip.pause":"Пауза","wfStrip.close":"Закрити воркфлоу","pipelineState.draft":"чернетка","pipelineState.provisioning":"готую worktree","pipelineState.running":"етапи виконуються","pipelineState.needs_decision":"потребує рішення","pipelineState.paused":"пауза","pipelineState.completed":"завершено","pipelineState.closed":"закрито","pipelineModel.failed":"не вдалося ({status})","pipelineStrip.pipeline":"Пайплайн","pipelineStrip.start":"Запустити пайплайн","pipelineStrip.discard":"Відкинути чернетку","pipelineStrip.stagesAria":"Етапи пайплайна","pipelineStrip.reviewStage":"цикл ревью","pipelineStrip.retryStage":"Повторити етап","pipelineStrip.skipStage":"Пропустити","pipelineStrip.resume":"Продовжити пайплайн","pipelineStrip.pause":"Пауза","pipelineStrip.close":"Закрити пайплайн","pipelineStrip.readOnly":"лише читання","pipelineStrip.readWrite":"читання й запис","pipelineStrip.groupAria":"Пайплайн {task}","pipelineStrip.baseSha":"База {sha}","pipelineStrip.baseShaFull":"Повний базовий коміт {sha}","pipelineStrip.copyBaseSha":"Скопіювати повний базовий коміт {sha}","pipelineStrip.copiedBaseSha":"Повний базовий коміт скопійовано","pipelineStrip.copyBaseShaFailed":"Не вдалося скопіювати базовий коміт","pipelineStrip.moreActions":"Інші дії пайплайна","pipelineStrip.announce":"Пайплайн {task}: {state}, етап {stage} {k} з {n}","pipelineStrip.openStage":"Відкрити етап {label}","pipelineStrip.openVerdict":"Відкрити вердикт етапу {label}, стан: {state}","pipelineStrip.openTranscript":"Відкрити транскрипт етапу {label}, стан: {state}","pipelineStrip.configureStage":"Налаштувати етап {label}, стан: {state}","pipelineStrip.configAria":"Налаштування етапу {label}","pipelineStrip.closeConfig":"Закрити налаштування етапу","pipelineStrip.lineageAria":"Послідовність етапів від {from} до {to}","pipelineStrip.previousStage":"Відкрити попередній етап {label}, стан: {state}","pipelineStrip.nextStage":"Відкрити наступний етап {label}, стан: {state}","pipelineStrip.evidenceAria":"Свідчення етапу {label}: {verdict}, тривалість {duration}, модель {model}","pipelineStrip.defaultModel":"типова модель","pipelineStrip.unknownDuration":"тривалість недоступна","pipelineStrip.linkedTasks":"Пов’язані завдання","pipelineStrip.openTask":"Відкрити пов’язане завдання {label}","pipelineStrip.roundShort":"Р{n}","pipelineStrip.attemptSuffix":"\xd7{n}","stageGraph.roundProgress":"раунд {round}/{total}","stageGraph.startedNotice":"Етап запустився, поки налаштування були відкриті. Збережену серверну конфігурацію тепер заблоковано.","pipelineStrip.chipAria":"Етап {label}: {state}","pipelineStrip.compactChipAria":"{label}, {state}","pipelineStrip.stageOf":"етап {k}/{n}","pipelineStrip.passEdgeAria":"Ребро проходження від {from} до {to}","pipelineStrip.failEdgeAria":"Ребро невдачі від {from} до {to}, раунд {k} з {n}","pipelineStrip.nextEdge":"далі","pipelineStrip.nextEdgeAria":"Це ребро виконується наступним","pipelinePresentation.queued":"У черзі","pipelinePresentation.waiting":"Очікує","pipelineShelf.aria":"Полиця пайплайнів","pipelineShelf.title":"Пайплайни","pipelineShelf.edit":"Редагувати пайплайн {task}","pipelineGroup.toggle":"Розгорнути або згорнути пайплайн {task}","pipelineGroup.openHistory":"Відкрити історію пайплайна {task}","pipelineSlot.paneAria":"Запланований етап {title}","pipelineSlot.completedAria":"Завершений етап {title} — відкрийте для перегляду","pipelineSlot.openTranscript":"Відкрити розмову","pipelineSlot.stageOf":"етап {k}/{n}","pipelineSlot.promptLabel":"Промпт стадії","pipelineSlot.noPrompt":"Додатковий контекст для агента — все вище підключається автоматично.","pipelineSlot.wiringTask":"Автоматично отримує: текст задачі","pipelineSlot.wiringPrev":"Автоматично отримує: результат попереднього етапу + текст задачі","pipelineSlot.waiting":"Вікно чату {role} з’явиться тут, щойно етап стартує.","pipelineSlot.starting":"Запускаємо агента {role}…","pipelineSlot.reviewHint":"Цикл рев’ю попереднього етапу — його раунди з’являться тут.","pipelineSlot.frozen":"Етап уже виконувався — конфігурацію заморожено.","pipelineSlot.saved":"Збережено","pipelineSlot.rowAria":"Завершений етап {title}","pipelineSlot.reasonSkipped":"Пропущено оператором — ланцюжок пішов далі","pipelineSlot.rowExpand":"Показати повну картку етапу","pipelineSlot.rowCollapse":"Згорнути назад до рядка статусу","pipelineTemplates.planBuildReview":"План → Збірка → Рев’ю","pipelineTemplates.buildReview":"Збірка → Рев’ю","pipelineTemplates.buildVerify":"Збірка → Перевірка","pipelineSlot.addAgent":"Наступний агент","pipelineSlot.addAgentTitle":"Додати наступного агента після цього етапу","pipelineSlot.addReview":"Цикл рев’ю","pipelineSlot.addReviewTitle":"Прикріпити цикл рев’ю (жорстка зв’язка) після цього етапу","pipelineSlot.moveEarlier":"Перемістити {role} раніше в ланцюжку","pipelineSlot.moveLater":"Перемістити {role} пізніше в ланцюжку","pipelineSlot.savePrompt":"Зберегти промпт","pipelineSlot.promptAria":"Редактор промпту етапу","pipelineSlot.connectHeading":"З'єднання","pipelineSlot.passEdgeLabel":"Після проходження — до","pipelineSlot.passEdgeEnd":"— завершує конвеєр","pipelineSlot.failEdgeLabel":"У разі невдачі — назад до","pipelineSlot.failEdgeNone":"— зупинка для оператора","pipelineSlot.failEdgeSelf":"↺ цей етап (повтор себе)","pipelineSlot.failEdgeRounds":"Макс. раундів циклу","pipelineSlot.passEdgeFrozen":"Цей етап уже виконувався — його ребро проходження заморожене як свідчення.","pipelineSlot.failEdgeFrozen":"Це ребро невдачі вже пройдене — воно заморожене як свідчення.","pipelineTemplates.title":"Новий пайплайн","pipelineTemplates.subtitle":"Обери шаблон. Група пайплайна з’явиться на дошці біля пов’язаного завдання. Налаштування етапів доступні за запитом.","pipelineTemplates.blank":"Порожнє полотно","pipelineTemplates.blankHint":"Почни з нуля і збери етапи вручну.","pipelineTemplates.noRole":"без ролі","pipelineTemplates.repoDir":"Каталог репозиторію","pipelineTemplates.checking":"Перевіряємо репозиторій…","pipelineTemplates.ready":"Репозиторій готовий","pipelineTemplates.creating":"Створюємо пайплайн…","pipelineTemplates.retry":"Повторити","pipelinePreflight.empty":"Вкажи каталог репозиторію","pipelinePreflight.missing":"Каталог не існує: {path}","pipelinePreflight.not_directory":"Обери каталог: {path}","pipelinePreflight.repo_unreadable":"Репозиторій недоступний для читання: {path}","pipelinePreflight.repo_untraversable":"Репозиторій неможливо відкрити: {path}","pipelinePreflight.not_git":"Обери Git-репозиторій: {path}","pipelinePreflight.probe_failed":"Перевірку репозиторію не завершено — повтори: {path}","pipelinePreflight.git_metadata_unwritable":"Метадані Git доступні лише для читання: {path}","pipelinePreflight.worktree_parent_unwritable":"Поруч із цим репозиторієм неможливо створити робочу копію пайплайна: {path}","pipelineChipState.pending":"очікує","pipelineChipState.spawning":"запускається","pipelineChipState.running":"виконується","pipelineChipState.reviewing":"рев’ю","pipelineChipState.committing":"коміт","pipelineChipState.passed":"пройдено","pipelineChipState.failed":"провалено","pipelineChipState.needs_decision":"потребує рішення","pipelineChipState.skipped":"пропущено","pipelineVerdict.pass":"успіх","pipelineVerdict.fail":"провал","pipelineVerdict.needsDecision":"рішення","pipelineVerdict.confidence":"впевненість","pipelineVerdict.reviewerSha":"SHA ревʼюера {sha}","pipelineVerdict.findings":{one:"{count} зауваження",few:"{count} зауваження",many:"{count} зауважень",other:"{count} зауважень"},"pipelineVerdict.noFindings":"зауважень немає","pipelineVerdict.more":"+{count} ще","pipelineVerdict.openTranscript":"Відкрити транскрипт","pipelineVerdict.openAttemptTranscript":"Відкрити транскрипт спроби {n}","pipelineVerdict.reviewTranscripts":"Транскрипти рев’ю","pipelineVerdict.openReviewTranscript":"Відкрити транскрипт рев’ю {n}","pipelineVerdict.openFlow":"Відкрити рев’ю","pipelineVerdict.retry":"Повторити","pipelineVerdict.skip":"Пропустити","pipelineVerdict.priorAttempts":"Попередні спроби","pipelineVerdict.attemptLine":"Спроба {n}: {status}","pipelineVerdict.title":"Вердикт етапу {label}","pipelineHub.aria":"Пайплайн {task}: {stage} \xb7 {k}/{n}","pipelineHub.controls":"Керування пайплайном","pipelineHub.stageOf":"{stage} \xb7 {k}/{n}","pipelineHub.openControls":"Відкрити керування пайплайном","pipelineHub.attempt":"спроба {n}","pipelineHub.openDashboard":"Відкрити панель","dash.pipeline":"Пайплайн","dash.newPipeline":"Новий пайплайн","board.historyGroup":"Скасувати та повторити дії на дошці","board.undo":"Скасувати","board.redo":"Повторити","board.undoReopen":"Скасувати — знову відкрити \xab{title}\xbb","board.redoReclose":"Повторити — знову закрити \xab{title}\xbb","board.undoNothing":"Немає що скасовувати","board.redoNothing":"Немає що повторювати","scheme.pipeline":"Пайплайн","scheme.pipelineTitle":"Запустити пайплайн із цієї розмови","board.pipeline":"Пайплайн","board.newPipeline":"Новий пайплайн","pipelineMobile.chipAria":"Пайплайн {task}","pipelineMobile.position":"{k}/{n}","pipelineMobile.prevStage":"Попередній етап {label}, стан: {state}","pipelineMobile.nextStage":"Наступний етап {label}, стан: {state}","pipelineMobile.openVerdict":"Відкрити вердикт для {label}, стан: {state}","pipelineMobile.expandDock":"Розгорнути пайплайн {task}","pipelineMobile.collapseDock":"Згорнути пайплайн {task}","pipelineMobile.summaryOpen":"Відкрити пайплайни ({n})","pipelineMobile.summaryCount":{one:"{n} пайплайн",other:"{n} пайплайнів"},"pipelineMobile.summaryActive":"{n} активних","pipelineMobile.summaryAttention":"{n} потребують вас","pipelineMobile.summaryCompleted":"{n} завершено","pipelineMobile.sheetTitle":"Пайплайни","pipelineMobile.closeSheet":"Закрити пайплайни","pipelineMobile.completedGroup":{one:"{n} завершений",other:"{n} завершено"},"wfDraft.paneAria":"Чернетка нового воркфлоу","wfDraft.notStarted":"воркфлоу ще не запущений","wfDraft.newWorkflow":"новий воркфлоу","wfDraft.dismiss":"Прибрати чернетку воркфлоу","wfDraft.template":"шаблон","wfDraft.templateAria":"Шаблон воркфлоу","wfDraft.repo":"репозиторій","wfDraft.repoAria":"Директорія репозиторію","wfDraft.manualMode":"вручну: гейт на межі кожного етапу","wfDraft.hint":"Обери шаблон і репозиторій, опиши задачу — воркфлоу створить worktree, прожене етапи, ревью і відкриє PR.","wfDraft.taskPlaceholder":"задача для воркфлоу — бриф піде кожному етапу…","wfDraft.taskAria":"Бриф задачі воркфлоу","wfDraft.footerHint":"worktree \xb7 етапи \xb7 ревью \xb7 PR","wfDraft.finishMerge":"merge локально","wfDraft.needDir":"вкажи директорію репозиторію","wfDraft.needTask":"опиши задачу","wfDraft.launchFailed":"не вдалося запустити","wfDraft.launch":"▶ Запустити воркфлоу","wfDraft.launching":"запускаю…","scheme.flowTitle":"Запустити цикл implement → review для цієї розмови","scheme.flow":"Флоу","scheme.collapsedTitle":"Згорнуті гілки й задачі цієї розмови","scheme.ancestorElided":{one:"Батьківську розмову не показано: {title}",few:"{count} предків не показано, найближчий: {title}",many:"{count} предків не показано, найближчий: {title}",other:"{count} предків не показано, найближчий: {title}"},"scheme.ancestorOffBoard":"Батьківської розмови немає на цій дошці","scheme.underneath":"під сподом","scheme.handTool":"Рука — тягнути полотно (H, або тримай Space)","scheme.selectTool":"Виділення — клік і робота з розмовами (V)","scheme.zoomOut":"Віддалити (−)","scheme.zoom100":"Масштаб 100% (1)","scheme.zoomIn":"Наблизити (+)","scheme.fitCurrent":"Вписати поточну роботу (0)","scheme.fit":"Вписати весь вміст (Shift+0, або подвійний клік по фону)","scheme.framedCurrent":"Поточну роботу вписано — {count} елементів","scheme.framedAll":"Весь вміст вписано — {count} елементів","scheme.offscreenNav":"Робота за межами екрана","scheme.offscreenMore":"Показати ще {count} кластерів за межами екрана","mobile.mapFrame":"Рамка мапи","mobile.mapAll":"Усе","mobile.mapCurrent":"Поточне","scheme.roleImplementer":"Імплементер","scheme.roleReviewer":"Ревʼюер","scheme.roleWorking":"працює","scheme.roleWaiting":"чекає","scheme.lassoTool":"Вибірка — обведи агентів рамкою, кліком додавай чи знімай","scheme.selectCheckOn":"Додати цього агента до вибірки","scheme.selectCheckOff":"Прибрати цього агента з вибірки","scheme.boardAria":"Дошка агентів — стрілки переміщують між вікнами агентів","scheme.navStack":{one:"{count} тиха гілка під {title}",few:"{count} тихі гілки під {title}",many:"{count} тихих гілок під {title}",other:"{count} тихих гілок під {title}"},"scheme.navStackBare":{one:"{count} тиха гілка",few:"{count} тихі гілки",many:"{count} тихих гілок",other:"{count} тихих гілок"},"bulk.selectedCount":{one:"Вибрано {count}",few:"Вибрано {count}",many:"Вибрано {count}",other:"Вибрано {count}"},"bulk.placeholder":"одне повідомлення кожному вибраному агенту…","bulk.textAria":"Текст розсилки вибраним агентам","bulk.sendAll":"Надіслати {count} агентам","bulk.interrupt":"Перервати","bulk.stop":"Зупинити","bulk.stopConfirm":"Точно зупинити {count}?","bulk.remove":"Прибрати зі схеми","bulk.removeConfirm":"Закрити {count} карток?","bulk.flow":"Флоу","bulk.fit":"Показати вибірку","bulk.exit":"Вийти з вибірки (Esc)","bulk.retryFailed":"Повторити невдалі ({count})","bulk.nodeGone":"вузол зник зі схеми","bulk.flowTitle":"Запустити ревʼю-флоу для {count} агентів","bulk.flowStart":"Запустити {count} флоу","minimap.title":"Мінімапа — клікни або тягни, щоб перейти","minimap.stacks":{one:"{count} згорнутий стек",few:"{count} згорнуті стеки",many:"{count} згорнутих стеків",other:"{count} згорнутих стеків"},"plan.agentPlan":"План агента:","plan.stepsAria":"План: {done} з {total} кроків","plan.nowSuffix":", зараз: {current}","plan.goal":"ціль","plan.goalDone":"ціль ✓","plan.goalBlocked":"ціль ✖","plan.noObjective":"(objective не записаний у хвості транскрипта)","plan.tokens":"токенів: {n}","plan.time":"часу: {n} хв","plan.ctxTitle":"Контекстне вікно: використано {pct}%\n{used} з {window} токенів","plan.ctxSourceRuntime":"Розмір вікна повідомлений середовищем агента","plan.ctxSourceRegistry":"Розмір вікна з вбудованого реєстру моделей ({version}) — приблизно","plan.ctxTitleUnknown":"Використання контексту: {used} токенів\nРозмір вікна для цієї моделі невідомий — відсоток не показується","plan.ctxAria":"Контекст: використано {pct} відсотків вікна","plan.ctxAriaUnknown":"Контекст: використано {used} токенів, розмір вікна невідомий","plan.goalAria":"Ціль сесії: {status}","limits.now":"зараз","limits.inMin":"через {n} хв","limits.inHour":"через {n} год","limits.inDay":"через {n} д","limits.asOf":"станом на {time}","limits.left":"лишилось","limits.reset":"скид {eta} \xb7 {at}","limits.stale":"дані застарілі: {stale}","limits.5h":"5 год","limits.week":"Тиждень","limits.windowMinutes":"{n} хв","limits.windowHours":"{n} год","limits.windowDays":"{n} д","limits.accountsOpenAria":"Акаунти Codex — змінити або додати","limits.noDataYet":"поки немає даних","limits.rateLimited":"Провайдер обмежує частоту запитів.","limits.rateLimitedRetry":"Провайдер обмежує частоту запитів. Наступна спроба о {time}.","limits.reauthRequired":"Потрібно повторно увійти в Claude.","burndown.title":"витрати","burndown.openAria":"Відкрити графік витрати квоти {engine}","burndown.close":"Закрити графік","burndown.windowAria":"Вікно графіка","burndown.ideal":"рівний темп","burndown.actual":"лишок","burndown.loading":"Завантаження історії…","burndown.failed":"Не вдалося завантажити історію.","burndown.empty":"Історії ще немає — графік заповнюється в міру збору даних.","burndown.windowUnreported":"Цей план не повідомляє вікно \xab{window}\xbb, тож малювати тут нічого.","burndown.buildsFrom":"історія від {date}","burndown.fast":"на {pct}% швидше за рівний темп — витрачаєте зашвидко","burndown.slow":"на {pct}% повільніше за рівний темп — є запас","burndown.even":"рівний темп","burndown.emptyBy":"за таким темпом 0% до {at}","resources.ram":"RAM","resources.swap":"Swap","resources.free":"{amount} вільно","resources.used":"{amount} зайнято","resources.stale":"дані про ресурси застарілі: {stale}","resources.captured":"знято {age}","resources.openAria":"Сесії агентів і пам'ять","resources.title":"Сесії агентів","resources.total":"Σ {amount}","resources.empty":"у tmux немає сесій агентів","resources.orphan":"осиротілий пейн","resources.hostConflict":"дублікат пейна розмови","resources.hostConflictHint":"кілька активних пейнів належать цій розмові","resources.procs":{one:"{count} процес",few:"{count} процеси",many:"{count} процесів",other:"{count} процесу"},"resources.swapShare":"+ {amount} swap","resources.kill":"Убити","resources.confirm":"Точно?","resources.killLiveHint":"агент зараз працює — натисни, щоб розблокувати, і підтверди","resources.killHint":"закрити tmux-пейн разом з усім деревом процесів","resources.bulkLabel":"неактивні довше ніж","resources.bulkKill":"Убити неактивні","resources.bulkNone":"немає сесій, неактивних так довго","resources.hoursN":"{n} год","resources.killAll":"Убити всіх агентів","resources.killAllConfirm":"Підтвердити — убити {n}?","resources.killAllHint":"примусово закрити кожен пейн агента, разом із активними — чистий старт, щоб наступний spawn/повідомлення пішли правильно. Твої шели і в'ювер не чіпає.","resources.killAllNone":"немає сесій агентів для закриття","resources.close":"Закрити","attach.attach":"Приєднатися","attach.readonly":"Лише перегляд","attach.copy":"Скопіювати команду приєднання","attach.copyReadonly":"Скопіювати команду приєднання лише для перегляду","attach.hint":"скопіювати команду tmux attach для цього пейна — встав її в будь-який шел","attach.readonlyHint":"скопіювати команду приєднання лише для перегляду — дивишся, не чіпаючи клавіш","attach.loading":"обчислюю…","attach.copied":"команду приєднання скопійовано","attach.copiedReadonly":"команду лише для перегляду скопійовано","attach.stale":"Цей пейн змінився або закрився. Онови й спробуй ще раз.","attach.restarted":"Сервер tmux перезапустився. Онови й спробуй ще раз.","attach.unavailable":"Ендпоінт tmux недоступний. Онови й спробуй ще раз.","attach.badRequest":"Не вдалося визначити пейн — онови список.","attach.network":"Помилка мережі — спробуй ще раз.","attach.clipboard":"Не вдалося скопіювати — перевір доступ до буфера обміну.","attach.refresh":"Оновити","status.awaitingPlan":"чекає затвердження плану","status.awaitingAnswer":"чекає відповіді на питання","status.awaitingTerminal":"чекає на відповідь у терміналі","status.working":"працює…","status.returnedResult":"повернувся з результатом","status.stalled":"перервано або чекає дозволу","status.finishedTurn":"закінчив хід — чекає відповіді","status.rateLimited":"вичерпано ліміт","status.providerThrottled":"провайдер обмежує частоту — продовжить о {time}","status.flow":"флоу: {label}","rateLimit.badge":"вичерпано ліміт","rateLimit.badgeUntil":"ліміт до {time}","rateLimit.reseat":"продовжити на здоровому акаунті","rateLimit.reseatRequested":"пересадка…","rateLimit.reseatTitle":"Створити наступника цієї розмови на найздоровішому акаунті; вичерпана розмова паркується, прив'язані флоу переходять слідом.","rateLimit.reseatFailed":"не вдалося пересадити","rateLimit.reseatAlready":"вже пересаджено","rateLimit.reseatWaitingTurn":"Пересадку поставлено в чергу: щойно обмежений хід звільнить панель, буде створено наступника.","dictation.capWarn":"залишилось менше хвилини запису","dictation.capStopped":"Запис зупинено на 10-хвилинній межі; текст зʼявиться в полі.","dictation.failed":"не вдалося розпізнати","dictation.silence":"тиша — нічого не розпізналось","dictation.unsupported":"запис не підтримується в цьому браузері","dictation.liveError":"помилка live-транскрипції","dictation.connectionLost":"зʼєднання з транскрипцією обірвалось","dictation.noMic":"немає доступу до мікрофона","overview.branchesLiveIn":{one:"{count} гілка працює у {projects}",few:"{count} гілки працюють у {projects}",many:"{count} гілок працюють у {projects}",other:"{count} гілок працюють у {projects}"},"overview.projects":{one:"{count} проєкті",few:"{count} проєктах",many:"{count} проєктах",other:"{count} проєктах"},"overview.archived":"\xb7 {count} в архіві","overview.moreLive":"ще {count} live","overview.quiet":"тихо \xb7 остання активність {age}","overview.empty":"Логів поки нема","catalog.unreachable":"каталог недоступний","catalog.errorTitle":"Не вдалося завантажити каталог сесій","catalog.errorBody":"Сервер вʼювера не відповів, тож невідомо, що зараз працює.","catalog.retry":"Спробувати ще","catalog.attempts":{one:"{count} невдала спроба",few:"{count} невдалі спроби",many:"{count} невдалих спроб",other:"{count} невдалих спроб"},"launch.account":"Обліковий запис","launch.reasoning":"Міркування","orchPanel.title":"Оркестратор","orchPanel.toggleAria":"Панель оркестратора","orchPanel.regionAria":"Оркестратор проєкту {project}","orchPanel.close":"Закрити панель оркестратора","orchPanel.resize":"Змінити ширину панелі оркестратора","orchPanel.loading":"Читаю оркестратора цього проєкту…","orchPanel.unavailable":"Не вдається прочитати місце оркестратора","orchPanel.unavailableHint":"Нічого не змінено. Поки немає відповіді, створення тут могло б призначити другого оркестратора.","orchPanel.recheck":"Перевірити ще раз","orchPanel.draftTitle":"Створити оркестратора для цього проєкту","orchPanel.draftHint":"Він працює в {project}, володіє цією дошкою і відповідає вам тут. Текст нижче буде доставлено йому як перше повідомлення — редагуйте як завгодно.","orchPanel.draftHintVacated":"Розмова попереднього оркестратора зникла. Створіть нового для {project}; текст нижче буде доставлено як перше повідомлення.","orchPanel.viewerMcpRegistered":"viewer MCP: зареєстровано ✓","orchPanel.viewerMcpMissing":"viewer MCP: виконайте scripts/install-mcp.sh або claude mcp add viewer -- bun ./bin/mcp-server.mjs","orchPanel.mandate":"Мандат","orchPanel.mandateSent":"Надсилається як перше повідомлення","orchPanel.restoreDefault":"Повернути типовий","orchPanel.mandateRequired":"Мандат не може бути порожнім.","orchPanel.cwd":"Робоча тека: {cwd}","orchPanel.confirm":"Створити оркестратора","orchPanel.confirmRetry":"Спробувати ще раз","orchPanel.creating":"Створюю оркестратора…","orchPanel.creatingHint":"Призначення записано. Мандат буде доставлено рівно один раз, навіть якщо сторінку перезавантажити.","orchPanel.receipt":"Запуск {launchId}","orchPanel.creatingStuck":"Це призначення очікує ще від часу до завантаження сторінки — запит, який його почав, не завершився.","orchPanel.creatingResume":"Завершити призначення","orchPanel.errorTitle":"Оркестратора не призначено","orchPanel.errorHint":"Нічого не запущено. Виправте мандат або параметри й спробуйте ще раз.","orchPanel.errorUnknownTitle":"Результат останньої спроби невідомий","orchPanel.errorUnknownHint":"Відповідь загубилася, тож оркестратор уже може існувати. Повторна спроба відтворює той самий запит, а не створює другого.","orchPanel.transportLost":"Відповідь не надійшла — зʼєднання обірвалося.","orchPanel.transitionPending":"Нове призначення завершується…","orchPanel.transitionFailed":"Останнє призначення не вдалося","orchPanel.stalled":"Оркестратор затих. Надішліть повідомлення, щоб він повернувся до роботи.","orchPanel.resumable":"Оркестратор завершив роботу. Надішліть повідомлення, щоб продовжити цю саму розмову.","orchPanel.resolving":"Відкриваю розмову…","orchPanel.resolvingHint":"Оркестратора призначено; його транскрипт ще не дійшов до цього вигляду.","orchPanel.openOnBoard":"Відкрити на дошці","orchPanel.rotation":"Рекомендовано ротацію","orchPanel.rotationStrong":"Наполегливо рекомендовано ротацію","orchPanel.rotationContext":"контекст на {percent}% вікна моделі","orchPanel.rotationDead":"його хост зник","orchPanel.badgeLive":"живий","orchPanel.badgeStalled":"тиша","orchPanel.badgeResumable":"завершив","orchPanel.badgeDead":"хост зник","orchPanel.badgeResolving":"відкриваю","orchPanel.badgeCreating":"створюю","orchPanel.badgeFailed":"помилка","orchPanel.badgeNone":"ще немає","orchPanel.badgeReading":"читаю","orchPanel.incumbentAria":"Оркестратор, який зараз тримає місце цього проєкту","orchPanel.incumbentUnknown":"модель ще не визначено","orchPanel.accountTitle":"Працює на акаунті {account}","orchPanel.ctxTitle":"Контекст: {used} з {window} токенів ({percent}%)","orchPanel.ctxUnknownWindow":"{used} токенів у контексті; для цієї моделі вікно не налаштоване, тому відсоток не вказується","orchPanel.ctxAria":"Вікно контексту заповнене на {percent}%","orchPanel.ctxAriaUnknown":"Використання контексту, вікно невідоме","orchPanel.predecessor":"Замінив попереднього оркестратора","orchPanel.predecessorTitle":"Відкрити розмову попередника на дошці","orchPanel.rotate":"Замінити","orchPanel.rotateTitle":"Замінити цього оркестратора новим. Нічого не заміниться, доки ви не підтвердите.","orchPanel.rotateHeading":"Замінити оркестратора цього проєкту","orchPanel.rotateHint":"Наступник починає з мандата нижче. Транскрипт попередника й відкриті задачі проєкту передає сервер — тут їх повторювати не треба. Розмова попередника лишається на дошці, зв'язана з новою.","orchPanel.rotateConfirm":"Замінити оркестратора","orchPanel.rotateCancel":"Лишити цього","orchPanel.rotateErrorTitle":"Заміна не відбулася","orchPanel.rotateErrorHint":"Поточний оркестратор недоторканий і далі тримає місце. Виправте мандат чи параметри й спробуйте ще раз.","orchPanel.rotateErrorUnknownTitle":"Результат останньої заміни невідомий","orchPanel.rotateErrorUnknownHint":"Відповідь загубилася, тож наступник уже може існувати. Повторна спроба відтворює той самий запит, а не замінює двічі.","orchPanel.rotateVacated":"Розмову того оркестратора закрили, поки ця заміна ще тривала. Завершіть її тут — повторна спроба відтворює той самий запит, а не замінює двічі.","orchPanel.restoreIncumbent":"Повернути поточний мандат","orchPanel.cwdInherited":"Наступник продовжить у {cwd}","orchMobile.create":"Створити оркестратора","orchMobile.unreadable":"не читається","orchMobile.rowCreateAria":"Створити оркестратора для цього проєкту","orchMobile.rowLiveAria":"Оркестратор {model} — {state}. Відкриває його розмову.","orchMobile.rowStatusAria":"Оркестратор — {state}. Відкриває панель оркестратора.","orchMobile.pendingAria":"Нове призначення завершується — відкрити","orchMobile.transitionAria":"Останнє призначення не вдалося — відкрити","orchMobile.sheetAria":"Оркестратор проєкту {project}","orchMobile.liveTitle":"Оркестратор цього проєкту","orchMobile.liveHint":"Він відповідає у власній розмові. Відкрийте її — і ви в ній, разом із полем вводу.","orchMobile.open":"Відкрити розмову","branch.live":"працює","branch.waiting":"закінчив хід — чекає відповіді","branch.returned":"повернувся з результатом","branch.stalled":"перервано або чекає дозволу","branch.done":"завершено — можна прибрати","branch.worktree":"Ворк-дерево {name}","branch.lastActivity":"Остання активність: {age}","branch.lastActivityQuiet":"Позначений активним, але транскрипт мовчить: остання активність {age}","branch.handoffTitle":"агент, породжений хендоффом цієї розмови","branch.branchTitle":"гілка цієї розмови","branch.accountTip":"Акаунт {id} \xb7 {engine} \xb7 {health}","branch.accountTipPlain":"Акаунт {id} \xb7 {engine}","branch.accountAria":"Відкрити акаунти для {id}","lineage.parentRemoved":"батьківську розмову видалено","lineage.parentRemovedTitle":"Транскрипт батьківської розмови видалено","branch.removeColumn":"Прибрати колонку {title}","branch.toggleBackground":"{action} фонову задачу {title}","branch.collapse":"Згорнути","branch.expand":"Розгорнути","branch.expandFull":"Розгорнути розмову {title} на все вікно","branch.collapseFull":"Повернутися до полотна (Esc)","branch.detailsShow":"Показати деталі розмови","branch.detailsHide":"Сховати деталі розмови","branch.favorite":"Додати в обране","branch.unfavorite":"Прибрати з обраного","tree.quiet":"Тихі розмови й задачі","taskStacks.collapse":"Згорнути картку назад у стек статусу","readiness.title":"Готовність задач","readiness.aria":"Секції готовності всіх задач проєкту","readiness.legend":"Зараз — призначено в роботу \xb7 На рев'ю — рев'ю триває або є вердикт \xb7 Заблоковано — потрібне рішення \xb7 Заплановано — інбокс/беклог \xb7 Готово — завершено","readiness.section.now":"Зараз","readiness.section.review":"На рев'ю","readiness.section.blocked":"Заблоковано","readiness.section.planned":"Заплановано","readiness.section.done":"Готово","readiness.sectionAria":"Задачі \xab{section}\xbb \xb7 {count}","readiness.open":"Відкрити задачу на дошці: {title}","readiness.place":"Розмістити задачу на мапі: {title}","readiness.issueAria":"Відкрити issue #{issue} на GitHub","readiness.agent":"агент","readiness.agentAria":"Відкрити призначеного агента: {title}","readiness.pipeline":"пайплайн","readiness.pipelineAria":"Відкрити стадію пайплайна: {title}","readiness.review":"рев'ю","readiness.reviewAria":"Відкрити пов'язане рев'ю: {title}","readiness.state.live":"живий","readiness.state.gone":"зник","readiness.state.failed":"збій","launchHistory.title":"Історія запусків","launchHistory.aria":"Термінальні квитанції запусків","launchHistory.failed":"невдалий","launchHistory.recovered":"відновлений","launchHistory.retryLabel":"Повторити","launchHistory.retry":"Повторити запуск: {title}","workerStack.title":"Згорнуті воркери","workerStack.aria":"Згорнуті розмови воркерів","workerStack.expandGroup":"Розгорнути групу ревʼю на дошці","workerStack.flow":"Потік","workerStack.pipeline":"Пайплайн","workerStack.origin":"Породжені","workerStack.worktree":"Воркери","corner.waitingCount":"\xb7 {count} чекають","corner.openSwitchboard":"Відкрити пульт агентів","task.working":", працює","task.interrupted":", перервано","task.finished":", закінчив","task.interruptedBadge":"перервано","task.finishedBadge":"завершено","task.stopFailed":"помилка зупинки","task.signalSent":"надіслано {signal} PID {pid}","task.killRequested":"запит на зупинку надіслано","task.confirmKill":"Точно вбити PID {pid}?","task.confirmKillNamed":"Зупинити {name}?","task.confirmKillUntitled":"цього агента","task.confirmKillYes":"Так, вбити","task.stopAria":"Зупинити процес PID {pid}","task.kill":"Вбити","task.backgroundCommand":"Фонова команда","task.commandNotFound":"Команду, що запустила цю фонову задачу, не знайдено у транскриптах сесії","viewer.closeProjects":"Закрити список проєктів","viewer.agentWaiting":"Агент чекає відповіді","viewer.staleFocusEntry":"Ця розмова більше недоступна","viewer.unknownFragment":"Це посилання не вказує ні на що відоме переглядачу","viewer.closeNotification":"Закрити сповіщення","attention.badge":{one:"{count} чекає",few:"{count} чекають",many:"{count} чекають",other:"{count} чекають"},"attention.needsYou":"Чекають","attention.next":"Далі","attention.nextHint":"Сфокусувати наступного, хто чекає на тебе (N, Shift-N — назад)","attention.openQueue":"Черга уваги — хто заблокований на тобі (N — наступний)","attention.popoverTitle":"Чекають на тебе","attention.filterOn":"Показати лише тих, хто чекає на тебе (F)","attention.filterOff":"Показати всі вузли (F)","mobile.noConvos":"Розмов поки нема","mobile.map":"Карта","mobile.closeMap":"Закрити карту","mobile.tapNode":"Тапни вузол — розмова відкриється на весь екран","mobile.agent":"агент","mobile.openMap":"Відкрити карту проєкту","mobile.mapLoading":"Завантаження карти…","mobile.marker.open":"Відкрити {title}","mobile.marker.node":"розмова","mobile.marker.deck":"рев'ю","mobile.marker.draft":"чернетка агента","mobile.marker.stack":"історія","mobile.marker.worker":"воркери","mobile.marker.task":"задача","mobile.marker.pipeline":"пайплайн","tasks.failed":"не вдалося ({status})","tasks.tool":"Задача — наступний клік кладе картку на полотно (T)","tasks.untitled":"без назви","tasks.newPlaceholder":"текст задачі… (перший рядок — назва)","tasks.newTask":"нова задача","tasks.panelCreate":"Створити задачу","tasks.unplaced":"без місця","tasks.placeOnMap":"розмістити на дошці","tasks.addDue":"дедлайн","tasks.clearDue":"Прибрати дедлайн","tasks.dueTitle":"Дедлайн (зона: {zone})","tasks.attachCount":{one:"{count} зображення",other:"{count} зображень"},"tasks.draftDiscarded":"чернетку відкинуто","tasks.editAria":"Текст задачі","tasks.spawning":"запускається…","tasks.deadChip":"розмови вже немає у списку","tasks.failedChip":"доставку не виконано","tasks.killedChip":"процес агента зупинено","tasks.unhostedChip":"агент зараз не запущений","tasks.migratingChip":"агент переходить на інший акаунт","tasks.source":"джерело","tasks.sourceTitle":"Взято з","tasks.retry":"повторити доставку","tasks.retryLaunch":"повторити запуск","tasks.retryLaunchAria":"Повторити невдалий запуск для {title}","tasks.retryLaunched":"агента перезапущено","tasks.chipFailedTitle":"не доставлено: {error}","tasks.handoffChip":"закинуто в промпт цього агента — ще не надіслано","tasks.detach":"відв'язати","tasks.detachAria":"Відв'язати {title} від задачі","tasks.expand":"Розгорнути задачу","tasks.collapse":"Згорнути задачу","tasks.openAgent":"відкрити й показати панель агента","tasks.openAgentAria":"Відкрити агента {title}","tasks.openAgentUnavailableAria":"Відкрити агента {title} — недоступно: {reason}","tasks.openSource":"відкрити й показати розмову-джерело","tasks.openSourceAria":"Відкрити розмову-джерело {title}","tasks.openSourceUnavailableAria":"Відкрити розмову-джерело {title} — недоступно: {reason}","tasks.sourceGone":"розмови-джерела немає на дошці","tasks.relatedNav":"Пов'язані задачі","tasks.openTaskAria":"Відкрити задачу {title}","tasks.relatedAssignedTitle":"призначена цій розмові","tasks.relatedSourceTitle":"записана з цієї розмови","tasks.send":"надіслати","tasks.sendTitle":"Потягни стрілку на панель агента — задача ляже в його промпт (нічого не надсилається); клік — створить чернетку нової розмови","tasks.linkHanded":"закинуто в \xab{title}\xbb — перевір і надішли там","tasks.linkSent":"задачу надіслано → \xab{title}\xbb","tasks.spawn":"агент","tasks.spawnTitle":"Запустити нового агента з цією задачею як брифом","tasks.spawnGo":"Запустити","tasks.statusTitle":"Статус: {label} — клік перемикає (інбокс → призначено → заблоковано → готово)","tasks.status.inbox":"інбокс","tasks.status.assigned":"призначено","tasks.status.blocked":"заблоковано","tasks.status.done":"готово","tasks.delete":"видалити","tasks.deleteConfirm":"точно?","tasks.deleteAria":"Видалити задачу {title}","tasks.pickerTitle":"Кому надіслати","tasks.pickerAllChildren":"⤷ всім дітям","tasks.pickerEmpty":"у проєкті немає розмов","tasks.pickerSend":"Надіслати ({count})","tasks.sendOk":"Доставлено {delivered} з {total}","tasks.sendFailPart":"✗ „{title}“: {error}","tasks.spawnOk":"агента запущено в tmux {target}","tasks.composerToggle":"створити задачу","tasks.composerToggleTitle":"Увімкнено — текст стає задачею-карткою з призначеннями на вибір; вимкнено — проста розсилка без сліду","tasks.composerNeedsText":"для задачі потрібен текст","tasks.panelTitle":"Задачі","tasks.panelToggleAria":"Показати або сховати панель задач","tasks.panelThisProject":"цей проєкт","tasks.panelAll":"всі","tasks.panelEmpty":"задач поки нема — кинь картку інструментом \xabзадача\xbb (T)","tasks.panelClose":"Закрити панель задач","favorites.sectionTitle":"Обране","favorites.empty":"обраного поки нема — наведи на картку й тапни корону","favorites.focusTitle":"Показати {title} на дошці","tasks.sheetNew":"нова задача","tasks.sheetCreate":"Створити задачу","tasks.sheetBack":"Назад до списку задач","tasks.sheetTargets":{one:"{count} адресат",few:"{count} адресати",many:"{count} адресатів",other:"{count} адресатів"},"tasks.sheetAssignments":"призначення","tasks.sheetEmpty":"задач поки нема","tasks.sheetGone":"задачі вже немає","tasks.textNotSaved":"текст не зберігся — надсилання скасовано, спробуй ще раз","tasks.emptyTextBlocked":"порожній текст не зберігається — віднови текст задачі перед надсиланням","runtime.live":"наживо","runtime.reconnecting":"перепідключення","runtime.degraded":"деградовано","runtime.offline":"офлайн","runtime.resynced":"пересинхронізовано","runtime.connection":"з'єднання рантайму","runtime.announce.live":"з'єднання рантайму наживо","runtime.announce.reconnecting":"рантайм перепідключається","runtime.announce.degraded":"рантайм деградовано — опитування оновлень","runtime.announce.offline":"рантайм офлайн","runtime.announce.resynced":"рантайм пересинхронізовано зі свіжого знімка","runtime.staleSince":"застаріло {duration}","runtime.lastKnown":"останнє оновлення {duration} тому","runtime.legacyProvenance":"легасі \xb7 похідний стан","staging.badge":"Стейджинг","staging.badgeTitle":"Стейджинг-інстанс — ізольований стан; нічого звідси не торкається проду","runtime.drift":"розбіжність: {evidence}","runtime.driftDismiss":"Сховати","runtime.receipt.pending":"надсилання…","runtime.receipt.busyRetry":"Не вдалося доставити — агент зайнятий, повторимо","runtime.receipt.summary":"Спроб доставки: {count}","runtime.receipt.pendingCount":"очікують: {count}","runtime.receipt.attemptCount":"спроб: {count}","runtime.receipt.problemCount":"проблем: {count}","runtime.receipt.showDetails":"Показати деталі доставки","runtime.receipt.hideDetails":"Сховати деталі доставки","runtime.receipt.statusSummary":"Стан доставки: {pending}, {problems}.","runtime.receipt.statusPending":{one:"{count} повідомлення очікує",few:"{count} повідомлення очікують",many:"{count} повідомлень очікують",other:"{count} повідомлень очікують"},"runtime.receipt.statusProblems":{one:"{count} проблема",few:"{count} проблеми",many:"{count} проблем",other:"{count} проблем"},"runtime.receipt.delivering":"доставляється…","runtime.receipt.applying":"застосовується…","runtime.receipt.turn-started":"хід почато","runtime.receipt.steered":"вкладено в поточний хід","runtime.receipt.queued":"у черзі","runtime.receipt.queuedPos":"у черзі \xb7 #{position}","runtime.receipt.delivered":"доставлено","runtime.receipt.applied":"зміну застосовано","runtime.receipt.interrupted":"перервано","runtime.receipt.answered":"відповіджено","runtime.receipt.rejected":"відхилено: {reason}","runtime.receipt.failed":"збій: {reason}","runtime.receipt.uncertain":"невизначено — відновлення","runtime.receipt.retry":"Повторити","runtime.receipt.edit":"Змінити й надіслати","runtime.receipt.dismiss":"Прибрати","runtime.attention.title":"потрібне твоє рішення","runtime.attention.approval":"підтвердження","runtime.attention.permission":"дозвіл","runtime.attention.question":"питання","runtime.attention.waiting_heuristic":"можливо, чекає","runtime.attention.heuristicNote":"сигнал низької впевненості","runtime.attention.unowned":"немає відповідального","runtime.attention.command":"команда","runtime.attention.tool":"інструмент","runtime.attention.approve":"Схвалити","runtime.attention.deny":"Відхилити","runtime.attention.answer":"Відповісти","runtime.attention.answering":"відповідаю…","runtime.attention.expiresIn":"авторішення через {seconds}с","runtime.attention.keysHint":"Enter схвалює \xb7 Esc відхиляє","voice.start":"Почати безперервну голосову розмову","voice.stop":"Завершити голосову розмову","voice.connecting":"Підключаю голос…","voice.live":"Голосова розмова активна \xb7 говоріть у будь-який момент","voice.stopping":"Завершую голосову розмову…","voice.failed":"Голосове зʼєднання потребує уваги","voice.panel":"Голосова розмова","voice.you":"Ви","voice.agent":"Агент","voice.progress":"Перебіг","voice.retry":"Спробувати ще раз","voice.ended":"Голосову розмову завершено","voice.elapsed":"Тривалість дзвінка","voice.micLevel":"Рівень мікрофона","voice.micMute":"Вимкнути мікрофон","voice.micUnmute":"Увімкнути мікрофон","voice.outputMute":"Приглушити агента","voice.outputUnmute":"Увімкнути звук агента","voice.floatSurface":"Голосова розмова","voice.float":"Відкрити плавуче вікно голосу","voice.dock":"Закрити плавуче вікно, не завершуючи розмову","voice.floatUnsupported":"Плавуче вікно голосу потребує браузера на Chromium; розмова лишається тут.","attention.return":"Назад, де ви були","attention.returnLine":"Повернутися туди, де ви були"}},77513:(a,b,c)=>{c.d(b,{F4:()=>x,_p:()=>y,cr:()=>z,n1:()=>E,ni:()=>D,vT:()=>C});var d=c(77598),e=c.n(d),f=c(76760),g=c.n(f),h=c(58152),i=c(4837),j=c(29733),k=c(16089),l=c(10167),m=c(2159),n=c(70107),o=c(27359),p=c(27471),q=c(16667),r=c(51906),s=c(73367),t=c(59680),u=c(98590);function v(a){return!a||"object"!=typeof a||Array.isArray(a)||"claude"!==a.engine&&"codex"!==a.engine?null:{engine:a.engine,model:"string"==typeof a.model&&a.model.trim()?a.model.trim():null,effort:"string"==typeof a.effort&&a.effort.trim()?a.effort.trim():null}}let w=new Set(["structured resume host claim is unavailable"]);function x(a){if("paused"!==a.state||"relaying"!==a.pausedState||!a.stateDetail)return!1;let b=(0,q.Hw)(a);return b?.relayStartedAt!=null&&null==b.relayedAt&&null==b.relayDelivery&&null==b.relayDeliveryTransport&&b.error===a.stateDetail&&w.has(a.stateDetail)}async function y(a,b){let c,d=function(a){if(void 0===a)return{ok:!0};if("string"!=typeof a)return{ok:!1};let b=a.trim();return b?{ok:!0,spec:b}:{ok:!0}}(a.spec);if(!d.ok)return{error:"spec must be a string",status:400};let f=null,h=a.headRef?.trim()??null;if(h&&(!/^[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(h)||h.includes("..")||h.endsWith("/")))return{error:"headRef must be a safe branch name",status:400};if(void 0!==a.targetSha){if("string"!=typeof a.targetSha||!/^[0-9a-f]{40}$/i.test(a.targetSha.trim()))return{error:"targetSha must be an exact commit SHA",status:400};f=a.targetSha.trim().toLowerCase()}let l=function(a){let b=(0,u.Vd)();if(a.preset){let c=b.find(b=>b.name===a.preset);return c?{implementer:{...c.implementer},reviewer:{...c.reviewer}}:null}let c=v(a.roles?.implementer),d=v(a.roles?.reviewer);return c&&d?{implementer:c,reviewer:d}:null}(a);if(!l)return{error:"invalid flow roles or preset",status:400};if(l.reviewer.model){let a=(0,i.RC)(l.reviewer.engine,l.reviewer.model);if("error"in a)return{error:a.error,status:400};l.reviewer.model=a.model}let m=(0,j.agentRegistry)(),o=a.implementerConversationId?.startsWith("conversation_")?a.implementerConversationId:null;if(a.implementerConversationId&&!o)return{error:"implementer conversation identity is invalid",status:400};let p=o?m.conversation(o):null,r=b.find(b=>b.path===a.implementerPath),w=o?b.find(a=>a.conversationId===o):void 0,x=[...new Set((o?[a.implementerPath,p?.generations.at(-1)?.path,w?.path]:[]).filter(a=>!!a))].find(a=>null!==(0,k.tX)(a))??r?.path??null,y=x?b.find(a=>a.path===x)??w:void 0;if(!x)return{error:"implementer transcript is unknown",status:404};let z=p??m.conversationForPath(x)??m.ensureConversation(l.implementer.engine,x,null);if(z.engine!==l.implementer.engine)return{error:"implementer engine does not match its durable conversation",status:400};if(y&&"claude-projects"!==y.root&&"codex-sessions"!==y.root)return{error:"implementer must be a Claude or Codex session",status:400};if(y&&"claude"!==y.engine&&"codex"!==y.engine)return{error:"implementer must use the Claude or Codex engine",status:400};let A=(0,k.tX)(x);if(!A)return{error:"could not determine the session working directory",status:409};let B=y?.project??(0,n.hY)(A)??g().basename(A),C="merge-base"===a.baseMode?"merge-base":"head",D="string"==typeof a.baseRef&&a.baseRef.trim()?{ok:!0,sha:a.baseRef.trim()}:(0,s.JN)(A,C);if(!D.ok)return{error:D.error,status:409};let E=(0,u.mL)();if(E.find(a=>(a.implementerConversationId===z.id||a.implementerPath===x)&&null===a.closedAt&&"closed"!==a.state))return{error:"implementer already has an active flow",status:409};let F={id:e().randomUUID().slice(0,8),template:"implement-review-loop",project:B,cwd:A,implementerPath:x,implementerConversationId:z.id,roles:l,reviewerFallback:"codex"===l.reviewer.engine?(0,u.ay)():null,baseRef:D.sha,headRef:h,targetSha:f,...d.spec?{spec:d.spec}:{},baseMode:C,mode:"manual"===a.mode?"manual":"auto",reviewerMode:"pane"===a.reviewerMode?"pane":"headless",roundLimit:Number.isInteger(a.roundLimit)&&a.roundLimit>0?Math.min(a.roundLimit,50):5,state:"waiting_ready",pausedState:null,stateDetail:null,mergeEvidence:(c=(0,s.NN)(A))?{...c,prNumber:null,mergedAt:null,checkedAt:null,source:null}:null,kickoffDelivery:null,hostClaim:null,rounds:[],createdAt:(0,q.Ec)(),closedAt:null};if(m.rememberMembership(z.id,{kind:"flow",containerId:F.id,role:"implementer",slot:"implementer",stageId:null,stageOrder:0,round:null,parentConversationId:null}),E.push(F),(0,u.tu)(E),!1!==a.deliverKickoff)try{let a=await (0,q.iq)(F,new Map(b.map(a=>[a.path,a])),(0,t.SB)(F.spec));F.kickoffDelivery={path:a,deliveredAt:(0,q.Ec)()},(0,u.tu)(E)}catch(a){F.state="paused",F.pausedState="waiting_ready",F.stateDetail=a instanceof Error?a.message:String(a),(0,u.tu)(E)}return{flow:F}}let z=2e3;function A(a){if("string"!=typeof a.note)return;let b=a.note.trim();return b?b.slice(0,z):null}async function B(a,b){if("pane"!==a.reviewerMode)return await (0,r.OZ)(a.id,b.n,b);try{let a=b.reviewerPane;if(a){let b=await (0,p.RZ)(a.paneId);b&&b.windowName===a.windowName&&!(0,o.g2)(b.command)&&await (0,p.VT)(a.paneId)}else if(b.reviewerPath){let a=b.reviewerConversationId?.startsWith("conversation_")?(0,j.agentRegistry)().conversation(b.reviewerConversationId)?.generations.at(-1)?.path??b.reviewerPath:(0,j.agentRegistry)().canonicalPath(b.reviewerPath),c=await (0,l.AB)(a);null!==c&&await (0,p.VT)(c)}}catch{}return!0}async function C(a){let b=(0,u.mL)().find(b=>b.id===a);if(!b)return{error:"flow not found",status:404};let c=(0,q.Hw)(b);return"reviewing"===b.state&&c?await B(b,c)?await (0,u.ke)((b,d)=>{let e=b.find(b=>b.id===a);if(!e)return{error:"flow not found",status:404};let f=(0,q.Hw)(e);return"reviewing"!==e.state||f?.n!==c.n||f.reviewerBindingId!==c.reviewerBindingId?{error:"flow changed during reviewer teardown",status:409}:(f.error="cancelled by user",f.terminalAt=(0,q.Ec)(),e.state="needs_decision",e.stateDetail="round cancelled by user",d(),{flow:e})}):{error:"reviewer process group did not terminate",status:409}:{error:"no reviewer is running for this flow",status:409}}async function D(a){let b=(0,u.mL)().find(b=>b.id===a);if(!b)return{error:"flow not found",status:404};let c=(0,q.Hw)(b),d=c&&null===c.verdict&&!c.error?{n:c.n,reviewerBindingId:c.reviewerBindingId}:null;if(null!==d&&!await B(b,c))return{error:"reviewer process group did not terminate",status:409};let e=null===d?null:{round:d.n};return await (0,u.ke)((b,c)=>{let f=b.find(b=>b.id===a);if(!f)return{error:"flow not found",status:404};if("closed"===f.state)return{flow:f,stoppedReviewer:e};let g=(0,q.Hw)(f);return null!==d&&(g?.n!==d.n||g.reviewerBindingId!==d.reviewerBindingId)?{error:"flow changed during reviewer teardown",status:409}:(null!==d&&g&&null===g.verdict&&!g.error&&(g.error="flow closed by user",g.terminalAt=(0,q.Ec)()),f.state="closed",f.closedAt=(0,q.Ec)(),f.stateDetail=null,c(),{flow:f,stoppedReviewer:e})})}function E(a,b,c=m.a){let d=(0,u.mL)(),f=d.find(b=>b.id===a);if(!f)return{error:"flow not found",status:404};let g=(0,q.Hw)(f);if("pause"===b.action)"paused"!==f.state&&"closed"!==f.state&&(f.pausedState=f.state,f.state="paused",f.stateDetail=(0,m.P)("paused",c));else if("resume"===b.action)"paused"===f.state&&(g&&x(f)&&(g.relayStartedAt=null,g.relayDeliveryTransport=null,g.relayRetryAt=null,g.relayRetryRequiresIdempotency=!1),f.state=f.pausedState&&"paused"!==f.pausedState?f.pausedState:"waiting_ready",f.pausedState=null,f.stateDetail=(0,m.P)("resumed",c));else if("set-mode"===b.action){if("auto"!==b.mode&&"manual"!==b.mode)return{error:"mode must be auto or manual",status:400};f.mode=b.mode}else if("advance"===b.action){let a=A(b);if("waiting_ready"===f.state)f.rounds.push((0,q.xz)(f,"button",a??null)),f.state="manual"===f.mode?"spawn_pending":"spawning";else if("spawn_pending"===f.state)void 0!==a&&g&&(g.readyNote=a),f.state="spawning";else if("relay_pending"===f.state)f.state="relaying";else{if("fixing"!==f.state||!g||"structured"!==g.relayDeliveryTransport||null==g.relayedAt||null!==(0,q.SZ)(f))return{error:"flow cannot advance from its current state",status:409};Object.assign(g,{relayDelivery:null,relayedAt:null,relayPendingSettlement:null,relayStartedAt:null,relayRetryCount:0,relayRetryAt:null,relayRetryRequiresIdempotency:!0,error:null}),f.state="relaying"}f.stateDetail=null}else if("retry-round"===b.action){if("needs_decision"!==f.state||!g)return{error:"flow cannot retry from its current state",status:409};(0,r.T)(f.id,g.n,g),(0,r.gn)(f.id,g.n);let a=A(b);Object.assign(g,{reviewerPath:null,reviewerConversationId:null,reviewerBindingId:e().randomUUID(),accountId:null,attemptedAccounts:[],autoRetryCount:0,sessionId:null,reviewerPid:null,reviewerIdentity:null,reviewerPane:null,findingsPath:null,verdict:null,findingsCount:null,reviewerRole:{...f.roles.reviewer},readyNote:void 0===a?g.readyNote:a,reviewHeadSha:null,startedAt:(0,q.Ec)(),spawnStartedAt:null,launchId:null,launchLeaseUntil:null,relayStartedAt:null,relayRetryCount:0,relayDeliveryAttempt:0,relayDeliveryTransport:null,relayRetryAt:null,relayRetryRequiresIdempotency:!1,relayDelivery:null,reviewedAt:null,terminalAt:null,relayedAt:null,error:null}),f.state="manual"===f.mode?"spawn_pending":"spawning",f.stateDetail=null}else if("extend"===b.action){let a=Number.isInteger(b.rounds)&&b.rounds&&b.rounds>0?Math.min(b.rounds,20):1;f.roundLimit>0&&(f.roundLimit+=a),"needs_decision"===f.state&&(f.state="waiting_ready",f.stateDetail=null)}else if("set-round-limit"===b.action){let a=b.rounds;if(!Number.isInteger(a)||void 0===a||a<0||a>50)return{error:"rounds must be an integer 0–50 (0 = unlimited)",status:400};f.roundLimit=0===a?0:Math.max(a,f.rounds.length),"needs_decision"===f.state&&"round limit reached"===f.stateDetail&&(0===f.roundLimit||f.roundLimit>f.rounds.length)&&(f.state="waiting_ready",f.stateDetail=null)}else if("another-round"===b.action){if("done_comment"!==f.state)return{error:"flow is not waiting for another round",status:409};f.closedAt=null,f.state="waiting_ready",f.stateDetail=null}else if("set-roles"===b.action){if("closed"===f.state)return{error:"flow is closed",status:409};let a=b.roles&&"object"==typeof b.roles&&!Array.isArray(b.roles)?b.roles.reviewer:void 0;if(void 0===a)return{error:"reviewer role override is required",status:400};let c=function(a,b){if(!b||"object"!=typeof b||Array.isArray(b))return{error:"invalid reviewer role override"};let c={...a};if(void 0!==b.engine){if("claude"!==b.engine&&"codex"!==b.engine)return{error:"invalid reviewer role override"};c.engine=b.engine}if(void 0!==b.model){if(null!==b.model&&"string"!=typeof b.model)return{error:"invalid reviewer role override"};c.model="string"==typeof b.model&&b.model.trim()?b.model.trim():null}if(void 0!==b.effort){if(null!==b.effort&&"string"!=typeof b.effort)return{error:"invalid reviewer role override"};c.effort="string"==typeof b.effort&&b.effort.trim()?b.effort.trim():null}if(c.model){let a=(0,i.RC)(c.engine,c.model);if("error"in a)return a;c.model=a.model}return c.effort&&!(0,h.z9)(c.engine,c.effort)?{error:"invalid reviewer role override"}:{role:c}}(f.roles.reviewer,a);if("error"in c)return{error:c.error,status:400};let d=c.role;f.roles={...f.roles,reviewer:d};let e="spawn_pending"===f.state||"paused"===f.state&&"spawn_pending"===f.pausedState?g:null;e&&null==e.spawnStartedAt&&(e.reviewerRole={...d})}return g&&"spawning"===f.state&&(g.error=null),(0,u.tu)(d),{flow:f}}},81533:(a,b,c)=>{c.d(b,{U:()=>f});let d=process,e=d.__llvAccountMigrationSignal??={tick:null,scheduled:!1};function f(){e.scheduled||null===e.tick||(e.scheduled=!0,queueMicrotask(()=>{e.scheduled=!1;let a=e.tick;null!==a&&a().catch(a=>{console.error("[account migration controller] requested reconciliation failed",a)})}))}},83336:(a,b,c)=>{c.d(b,{AW:()=>f,BL:()=>g,EY:()=>h,h4:()=>e});var d=c(41022);function e(a){let b=(0,d.rM)(a.content?.text??a.text??"",a.content?.images??a.images??[]);if(a.contentDigest&&a.contentDigest!==b.contentDigest)throw Error("queue entry content digest mismatch");return{id:a.id,content:b.content,contentDigest:b.contentDigest,...void 0!==a.expectedTurnId?{expectedTurnId:a.expectedTurnId}:{},...a.runtime?{runtime:a.runtime}:{},...a.selectedContext?{selectedContext:a.selectedContext}:{},...a.origin?{origin:a.origin}:{}}}class f extends Error{constructor(a,b){super(`runtime replay begins at sequence ${b}; requested after ${a}`),this.requestedAfterSeq=a,this.firstAvailableSeq=b,this.name="RuntimeReplayGapError"}}class g extends Error{constructor(a,b){super(a),this.phase=b,this.name="StructuredCompactError"}}class h extends Error{constructor(a,b,c){super(a,c),this.host=b,this.name="StructuredHostAdoptionCleanupError"}}},91596:(a,b,c)=>{c.d(b,{I1:()=>A,IM:()=>z,P4:()=>V,wh:()=>Y});var d=c(77598),e=c.n(d),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(86850),k=c(22025),l=c(78966),m=c(32977),n=c(14509),o=c(29733),p=c(48892),q=c(91724),r=c(59683),s=c(25953),t=c(52649),u=c(83336),v=c(73789),w=c(98223),x=c(27471),y=c(8995);class z extends Error{constructor(){super("successor launch receipt is awaiting host settlement"),this.name="SuccessorPendingError"}}class A extends Error{constructor(a="Codex provider fork outcome is unknown"){super(a),this.name="CodexForkOutcomeUnknownError"}}let B={accounts:j.lD,startCodex:a=>k.zC.start({home:a}),claudeStatus:a=>m.kR.status(a),spawnClaude:(a,b)=>(0,x.Tk)(a,"",b),verifyClaudeHost:a=>(0,x.PB)(a),cancelClaude:a=>(0,x.xs)(a),now:()=>new Date().toISOString()};function C(a){return!0===a||"cancelled"===a||"absent"===a}function D(a){try{let b=JSON.parse(g().readFileSync(a,"utf8"));if(!Number.isInteger(b.pid)||!b.pid||b.pid<1)return Date.now()-g().statSync(a).mtimeMs>3e4;if(!r.B.pidAlive(b.pid))return!0;if("string"==typeof b.startIdentity){let a=r.B.processIdentity(b.pid);return null!==a&&a!==b.startIdentity}return Date.now()-g().statSync(a).mtimeMs>3e4}catch{try{return Date.now()-g().statSync(a).mtimeMs>3e4}catch{return!1}}}function E(a,b){try{JSON.parse(g().readFileSync(a,"utf8")).token===b&&g().rmSync(a,{force:!0})}catch{}}function F(a){let b=[],c=i().resolve(a);for(;!g().existsSync(c);){b.push(c);let a=i().dirname(c);if(a===c)break;c=a}for(let a of b.reverse()){try{g().mkdirSync(a,{mode:448})}catch(a){if("EEXIST"!==a.code)throw a}let b=g().openSync(i().dirname(a),"r");try{g().fsyncSync(b)}finally{g().closeSync(b)}let c=g().openSync(a,"r");try{g().fsyncSync(c)}finally{g().closeSync(c)}}}async function G(a){if(a.ownsOperation&&!await a.ownsOperation()||!(0,w.cM)())return async()=>{};let b=(0,p.ce)("codex",a.receipt.nativeId);if(!b)throw Error("successor Codex thread identity is invalid");if((0,v.sy)(b))return async()=>{await (0,v.releaseStructuredDeliveryHost)(b)};let c=a.registry.readOnlySnapshot().entries[(0,p.pp)(b)],d=a.registry.upsert({...c??{key:b,status:"unhosted",host:null,claimEpoch:0,claimOwner:null,pendingAction:null},key:b,artifactPath:a.receipt.path,cwd:a.profile.cwd,accountId:a.target.accountId,launchProfile:a.profile,structuredHostOperationId:a.receipt.operationId});d.structuredHost||a.registry.setStructuredHost(b,{kind:"codex-app-server",endpoint:"stdio:pending",process:null,eventCursor:0,protocolVersion:null,writerClaimEpoch:d.claimEpoch,activeTurnRef:null,pendingAttention:[],activeFlags:[]},"unhosted");let e={pid:process.pid,startIdentity:r.B.processIdentity(process.pid)},f=a.registry.claimStructuredHost(b,e,{allowUnhosted:!0});if(!f?.claimOwner)throw Error("successor Codex structured host claim is unavailable");let g=a.profile.permissionMode&&["never","on-request","untrusted"].includes(a.profile.permissionMode)?a.profile.permissionMode:void 0,h=null,i=()=>{},j=async()=>{};try{h=await t.o.adopt(a.receipt.nativeId,{cwd:a.profile.cwd,codexHome:a.target.home,fileAuthCredentials:"managed"===a.target.kind,model:a.profile.model??void 0,effort:a.profile.effort??void 0,sandbox:a.profile.readOnly?"read-only":void 0,approvalPolicy:g,initialEventCursor:f.structuredHost?.eventCursor,env:a.target.env}),i=await (0,w.WF)(a.registry,b,h,f.claimOwner,f.claimEpoch),j=await (0,v.xq)({key:b,host:h},a.ownsOperation)}catch(c){if(!h&&c instanceof u.EY&&c.host instanceof t.o)throw h=c.host,i=await (0,w.WF)(a.registry,b,h,f.claimOwner,f.claimEpoch,"dead"),await h.release(),i(),c;throw await j(),h&&await h.release(),i(),a.registry.releaseStructuredHostClaim(b,f.claimOwner,f.claimEpoch),c}let k=h;return async()=>{await j(),await k.release(),i()}}async function H(a){if(a.ownsOperation&&!await a.ownsOperation()||!(0,w.cM)())return async()=>{};let b=(0,p.ce)("claude",a.receipt.nativeId);if(!b)throw Error("successor Claude session identity is invalid");if((0,v.sy)(b))return async()=>{await (0,v.releaseStructuredDeliveryHost)(b)};(0,v.pr)();let c=a.registry.readOnlySnapshot().entries[(0,p.pp)(b)],d=a.registry.upsert({...c??{key:b,status:"unhosted",host:null,claimEpoch:0,claimOwner:null,pendingAction:null},key:b,artifactPath:a.receipt.path,cwd:a.profile.cwd,accountId:a.target.accountId,launchProfile:a.profile,structuredHostOperationId:a.receipt.operationId});d.structuredHost||a.registry.setStructuredHost(b,{kind:"claude-broker",endpoint:"stdio:pending",process:null,eventCursor:0,protocolVersion:null,writerClaimEpoch:d.claimEpoch,activeTurnRef:null,pendingAttention:[],activeFlags:[]},"unhosted");let e={pid:process.pid,startIdentity:r.B.processIdentity(process.pid)},f=a.registry.claimStructuredHost(b,e,{allowUnhosted:!0});if(!f?.claimOwner)throw Error("successor Claude structured host claim is unavailable");let g=null,h=()=>{},i=async()=>{};try{let c=X(a.receipt),d=await a.cancelClaude(c);if(!C(d))throw Error("successor Claude host transition is still pending");await (0,x.XW)(a.receipt.path,c),g=await s.s7.adopt(a.receipt.nativeId,{cwd:a.profile.cwd,claudeConfigDir:"managed"===a.target.kind?a.target.home:void 0,claudeProjectsDir:a.target.transcriptRoot,env:a.target.env,model:a.profile.model??void 0,effort:a.profile.effort??void 0,permissionMode:a.profile.permissionMode??void 0,initialEventCursor:f.structuredHost?.eventCursor}),h=await (0,w.n$)(a.registry,b,g,f.claimOwner,f.claimEpoch),i=await (0,v.xq)({key:b,host:g},a.ownsOperation)}catch(c){if(!g&&c instanceof u.EY&&c.host instanceof s.s7)throw g=c.host,h=await (0,w.n$)(a.registry,b,g,f.claimOwner,f.claimEpoch,"dead"),await g.release(),h(),c;throw await i(),g&&await g.release(),h(),a.registry.releaseStructuredHostClaim(b,f.claimOwner,f.claimEpoch),c}let j=g;return async()=>{await i(),await j.release(),h()}}async function I(){await new Promise(a=>setTimeout(a,5))}async function J(a,b,c){let d=O(a,b),f=`${d}.lock`,h=`${d}.locks`;F(a),F(h);let j={pid:process.pid,startIdentity:r.B.processIdentity(process.pid),token:e().randomUUID()},k=i().join(h,`${String(Date.now()).padStart(16,"0")}-${process.pid}-${j.token}.json`);g().writeFileSync(k,JSON.stringify(j),{encoding:"utf8",flag:"wx",mode:384});try{for(let a=0;a<24e3;a+=1){let a;try{g().utimesSync(k,new Date,new Date)}catch{}let b=[];for(let a of g().readdirSync(h).filter(a=>a.endsWith(".json")).sort()){let c=i().join(h,a);if(D(c)){g().rmSync(c,{force:!0});continue}g().existsSync(c)&&b.push(c)}if(b[0]!==k){await I();continue}try{a=g().openSync(f,"wx",384)}catch(a){if("EEXIST"!==a.code)throw a;D(f)&&g().rmSync(f,{force:!0}),await I();continue}g().writeFileSync(a,JSON.stringify(j),"utf8"),g().fsyncSync(a);let d=setInterval(()=>{try{let a=new Date;g().utimesSync(f,a,a),g().utimesSync(k,a,a)}catch{}},1e4);d.unref();try{return await c(()=>(function(a,b){try{if(JSON.parse(g().readFileSync(a,"utf8")).token===b)return}catch{}throw Error("Codex provider operation lease was lost")})(f,j.token))}finally{clearInterval(d),g().closeSync(a),E(f,j.token)}}throw Error("Codex provider operation is busy")}finally{E(k,j.token)}}function K(a){let b=null;try{let c=g().lstatSync(a);if(!c.isFile()||c.isSymbolicLink())return null;b=g().openSync(a,g().constants.O_RDONLY|(g().constants.O_NOFOLLOW??0));let d=Buffer.alloc(Math.min(262144,Math.max(1,c.size))),e=g().readSync(b,d,0,d.length,0);for(let a of d.subarray(0,e).toString("utf8").split("\n"))if(a.trim())try{let b=JSON.parse(a);if("session_meta"!==b.type||!b.payload||"object"!=typeof b.payload||Array.isArray(b.payload))continue;let c=b.payload;if("string"!=typeof c.id||!c.id)return null;return{id:c.id,forkedFromId:"string"==typeof c.forked_from_id&&c.forked_from_id?c.forked_from_id:null}}catch{}return null}catch{return null}finally{null!==b&&g().closeSync(b)}}function L(a,b,c,d=2e4){let e=[{dir:a,depth:0}],f=[],h=0;for(;e.length;){let j=e.pop();if(!(j.depth>6))for(let k of g().readdirSync(j.dir,{withFileTypes:!0})){let l=i().join(j.dir,k.name);if(k.isSymbolicLink())continue;if(k.isDirectory()){e.push({dir:l,depth:j.depth+1});continue}if(!k.isFile()||!k.name.endsWith(".jsonl"))continue;if(++h>d)return console.warn("[account-migration] Codex fork recovery scan hit its bound",{root:a,limit:d,found:f.length}),f;if(g().statSync(l).mtimeMs<c)continue;let m=K(l);m?.forkedFromId===b&&f.push({id:m.id,path:g().realpathSync(l)})}}return f}function M(a){try{let b=g().statSync(a);return b.isFile()?{size:b.size,mtimeMs:b.mtimeMs}:null}catch{return null}}function N(...a){let b=new Map;for(let c of a)for(let a of c)b.has(a.id)||b.set(a.id,a);return[...b.values()]}function O(a,b){return i().join(a,`${e().createHash("sha256").update(b).digest("hex")}.json`)}function P(a,b){g().mkdirSync(a,{recursive:!0,mode:448});let c=O(a,b.operationId),d=`${c}.${process.pid}.${e().randomUUID()}.tmp`;try{g().writeFileSync(d,JSON.stringify(b,null,2)+"\n",{mode:384,flag:"wx"});let e=g().openSync(d,"r");try{g().fsyncSync(e)}finally{g().closeSync(e)}g().renameSync(d,c);let f=g().openSync(a,"r");try{g().fsyncSync(f)}finally{g().closeSync(f)}}finally{g().rmSync(d,{force:!0})}}function Q(a){return a&&"object"==typeof a&&1===a.version&&"string"==typeof a.operationId&&"string"==typeof a.sourceNativeId&&"string"==typeof a.sourceRoot&&"string"==typeof a.targetRoot&&"number"==typeof a.createdAtMs&&Number.isFinite(a.createdAtMs)?{version:1,operationId:a.operationId,conversationId:"string"==typeof a.conversationId&&a.conversationId?a.conversationId:null,sourceNativeId:a.sourceNativeId,sourceRoot:a.sourceRoot,targetRoot:a.targetRoot,createdAtMs:a.createdAtMs,forkRecoveryFloorMs:"number"==typeof a.forkRecoveryFloorMs&&Number.isFinite(a.forkRecoveryFloorMs)?a.forkRecoveryFloorMs:"number"==typeof a.forkRequestedAtMs&&Number.isFinite(a.forkRequestedAtMs)?a.forkRequestedAtMs:null,forkRequestedAtMs:"number"==typeof a.forkRequestedAtMs&&Number.isFinite(a.forkRequestedAtMs)?a.forkRequestedAtMs:null,fork:a.fork&&"string"==typeof a.fork.id&&"string"==typeof a.fork.path?{id:a.fork.id,path:a.fork.path}:null,forkSource:a.forkSource&&"number"==typeof a.forkSource.size&&Number.isFinite(a.forkSource.size)&&"number"==typeof a.forkSource.mtimeMs&&Number.isFinite(a.forkSource.mtimeMs)?{size:a.forkSource.size,mtimeMs:a.forkSource.mtimeMs}:null,supersededForks:Array.isArray(a.supersededForks)?a.supersededForks.flatMap(a=>a&&"object"==typeof a&&"string"==typeof a.id&&"string"==typeof a.path?[{id:a.id,path:a.path}]:[]):[]}:null}function R(a){try{return g().statSync(a).mtimeMs}catch{return 0}}function S(a){return[...a].sort((a,b)=>R(b.path)-R(a.path)||b.path.localeCompare(a.path))}function T(a,b,c){let d=(0,y.Ux)(a.path,c),e=K(d.sourcePath);if(!i().basename(d.sourcePath).endsWith(`${a.id}.jsonl`)||e?.id!==a.id||e.forkedFromId!==b)throw new y.Bc("unsafe-source");return{id:a.id,path:d.sourcePath}}function U(a,b=L){if(a.fork)return{fork:T(a.fork,a.sourceNativeId,a.sourceRoot),forkSource:a.forkSource,superseded:[]};let c=a.forkRecoveryFloorMs??a.forkRequestedAtMs;if(null===c)return{fork:null,forkSource:null,superseded:[]};let d=new Set(a.supersededForks.map(a=>a.id)),e=S(b(a.sourceRoot,a.sourceNativeId,c).filter(a=>!d.has(a.id)).flatMap(b=>{try{return[T(b,a.sourceNativeId,a.sourceRoot)]}catch{return[]}}));return{fork:e[0]??null,forkSource:a.forkSource,superseded:e.slice(1)}}async function V(a,b,c=(0,q.BQ)("migration-provider-operations"),d=L){let e,f=O(c,a);try{e=Q(JSON.parse(g().readFileSync(f,"utf8")))}catch(a){if("ENOENT"===a.code)return"not-needed";throw a}if(!e||e.operationId!==a||e.conversationId&&e.conversationId!==b)throw Error("Codex provider operation journal does not match");return J(c,`move:${e.sourceNativeId}`,async e=>{let h=Q(JSON.parse(g().readFileSync(f,"utf8")));if(!h||h.operationId!==a||h.conversationId&&h.conversationId!==b)throw Error("Codex provider operation journal does not match");return h.fork||null===h.forkRequestedAtMs?"not-needed":U(h,d).fork?"recovery-ready":(h.forkRequestedAtMs=null,e(),P(c,h),"reauthorized")})}function W(a){let b=g().lstatSync(a.home);if(!b.isDirectory()||b.isSymbolicLink()||process.getuid&&b.uid!==process.getuid()||(18&b.mode)!=0)throw new y.IO("unsafe-home","target account home failed safety checks");if(i().dirname(i().resolve(a.transcriptRoot))!==i().resolve(a.home)&&!("claude"===a.engine&&function(a){try{return g().realpathSync(a)===g().realpathSync((0,l.o1)())}catch{return!1}}(a.transcriptRoot)))throw Error("target transcript root is outside its account home");try{g().mkdirSync(a.transcriptRoot,{mode:448})}catch(a){if("EEXIST"!==a.code)throw a}let c=g().lstatSync(a.transcriptRoot);if(!c.isDirectory()||c.isSymbolicLink()||process.getuid&&c.uid!==process.getuid()||(18&c.mode)!=0)throw Error("target transcript root failed safety checks")}function X(a){let b=function(a){if("claude-stream"!==a.host.kind)throw Error("successor Claude host identity is invalid");let b=/^(%[0-9]+):([1-9][0-9]*)$/.exec(a.host.identity);if(!b)throw Error("successor Claude host identity is invalid");return{paneId:b[1],panePid:Number(b[2])}}(a),c=a.host.tmuxHost;if(!c||"tmux"!==c.kind||c.paneId!==b.paneId||c.panePid.pid!==b.panePid)throw Error("successor Claude host identity is invalid");return c}class Y{constructor(a=B){this.dependencies=a,this.publishedHosts=new Map,this.publishingHosts=new Map}async create(a){let b=this.dependencies.accounts.resolveSpawn(a.engine,a.targetAccountId),c=function(a,b,c){if(!a||a.engine!==b.engine)throw Error("source account ownership is unavailable");return(0,y.Ux)(c,a.transcriptRoot),a}(this.dependencies.accounts.resolveTranscriptOwner(a.engine,a.source.path),b,a.source.path);return W(b),"codex"===a.engine?this.createCodex(a.operationId,a.conversationId,a.source.id,a.source.path,a.source.launchProfile,c,b,a.recordContinuityPath):this.createClaude(a.operationId,a.conversationId,a.source.path,a.source.launchProfile,c,b,a.recordContinuityPath)}async verify(a,b){let c=this.dependencies.accounts.resolveSpawn(b.engine,b.targetAccountId);if(W(c),"claude"===b.engine){if(!(await this.dependencies.claudeStatus(c.home)).loggedIn)throw new y.IO("not-authenticated","target Claude account is not authenticated");if(!a.path.startsWith(c.transcriptRoot+i().sep))throw Error("target Claude history is outside its registered root");if(i().basename(a.path,".jsonl")!==a.nativeId)throw Error("target Claude transcript identity does not match");if(!g().existsSync(a.path)||0===(0,y.z4)(a.path,c.transcriptRoot).size)throw Error("target Claude successor transcript is not durable");if(!g().readFileSync(a.path,"utf8").split("\n").some(b=>{try{let c=JSON.parse(b);return c.sessionId===a.nativeId||c.session_id===a.nativeId}catch{return!1}}))throw Error("target Claude transcript session identity does not match");let b=X(a),d=this.dependencies.registry??(0,o.agentRegistry)();if(!("claude-migration-successor"===b.windowName&&await this.dependencies.verifyClaudeHost?.(b))&&!function(a,b,c){let d=(0,p.ce)("claude",b.nativeId);if(!d)return!1;let e=a.readOnlySnapshot().entries[(0,p.pp)(d)];return e?.structuredHostOperationId===b.operationId&&e.artifactPath===b.path&&e.accountId===c.accountId&&e.structuredHost?.kind==="claude-broker"&&"stdio:pending"!==e.structuredHost.endpoint&&null!==e.structuredHost.protocolVersion}(d,a,c))throw Error("target Claude successor host is not live and canonical");return}let d=await this.dependencies.startCodex(c.home);try{if(!(await d.readAccount()).account)throw new y.IO("not-authenticated","target Codex account is not authenticated");if((await d.readThread(a.nativeId)).id!==a.nativeId)throw Error("target Codex thread identity does not match")}finally{d.close()}}async publishHost(a,b){if(b.ownsOperation&&!await b.ownsOperation())return;let c="codex"===b.engine?this.dependencies.publishCodexHost:this.dependencies.publishClaudeHost;if(!c&&!(0,w.cM)())return;let d=this.publishedHosts.get(a.operationId);if(d){if(d.nativeId!==a.nativeId||d.path!==a.path)throw Error("successor host publication conflicts");return}let e=this.publishingHosts.get(a.operationId);if(e){await e;let b=this.publishedHosts.get(a.operationId);if(!b||b.nativeId!==a.nativeId||b.path!==a.path)throw Error("successor host publication conflicts");return}let f=(async()=>{let d,e={receipt:a,target:this.dependencies.accounts.resolveSpawn(b.engine,b.targetAccountId),profile:b.launchProfile,registry:this.dependencies.registry??(0,o.agentRegistry)(),ownsOperation:b.ownsOperation};(d="codex"===b.engine?await (c??G)(e):c?await c(e):await H({...e,cancelClaude:this.dependencies.cancelClaude??B.cancelClaude}),b.ownsOperation&&!await b.ownsOperation())?await d():this.publishedHosts.set(a.operationId,{nativeId:a.nativeId,path:a.path,cleanup:d})})();this.publishingHosts.set(a.operationId,f);try{await f}finally{this.publishingHosts.get(a.operationId)===f&&this.publishingHosts.delete(a.operationId)}}async cleanup(a){let b=this.publishedHosts.get(a.operationId);if(b&&b.nativeId===a.nativeId&&b.path===a.path){await b.cleanup(),this.publishedHosts.delete(a.operationId);return}let c="codex-app-server"===a.host.kind?(0,p.ce)("codex",a.nativeId):"claude-stream"===a.host.kind?(0,p.ce)("claude",a.nativeId):null;if(c&&await (0,v.releaseStructuredDeliveryHost)(c)||"codex-app-server"===a.host.kind||"claude-stream"!==a.host.kind)return;let d=X(a);if(!C(await this.dependencies.cancelClaude?.(d)))throw Error("successor Claude host cleanup is still pending");await (0,x.XW)(a.path,d)}async createClaude(a,b,c,d,e,f,g){return J(this.dependencies.claudeJournalRoot??(0,q.BQ)("migration-provider-claude-operations"),a,h=>this.createClaudeLocked(a,b,c,d,e,f,g,h))}async createClaudeLocked(a,b,c,d,f,h,j,k){let l;if(!(await this.dependencies.claudeStatus(h.home)).loggedIn)throw new y.IO("not-authenticated","target Claude account is not authenticated");let m=(0,y.z4)(c,f.transcriptRoot),p=function(a){if(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(a))return a;let b=Buffer.from(e().createHash("sha256").update(a).digest().subarray(0,16));b[6]=15&b[6]|64,b[8]=63&b[8]|128;let c=b.toString("hex");return`${c.slice(0,8)}-${c.slice(8,12)}-${c.slice(12,16)}-${c.slice(16,20)}-${c.slice(20)}`}(a),q=(0,n.HI)({sourcePath:c,candidateId:p,targetHome:h.home,targetProjectsDir:h.transcriptRoot,profile:d}),r=q.transcript??i().join(h.transcriptRoot,`${p}.jsonl`),s=this.dependencies.registry??(0,o.agentRegistry)(),t=async(a,b)=>{try{j(r)}catch(c){s.preserveSpawnArtifactOwnership(a,"migration continuity persistence failed");try{let a=await this.dependencies.cancelClaude?.(b);C(a)&&await (0,x.XW)(r,b)}catch{}throw c}},u=e().createHash("sha256").update(JSON.stringify({operationId:a,conversationId:b,target:h.accountId,nativeId:p})).digest("hex"),v=s.beginSpawnRequest({engine:"claude",cwd:d.cwd,launchProfile:d,clientAttemptId:`migration-successor:${a}`,requestDigest:u,accountId:h.accountId,conversationId:b,purpose:"migration-successor",origin:{kind:"successor"},expectedArtifactPath:r});if("conflict"===v.kind)throw Error("successor Claude operation receipt conflicts");let w=v.receipt;if("replay"===v.kind){if("failed"===w.state||"conflicted"===w.state)throw Error("successor Claude operation receipt is terminal");let b=w.verifiedHost;if(b){if(!await this.dependencies.verifyClaudeHost?.(b))throw Error("successor Claude operation has no recoverable live host");return await t(w.launchId,b),{operationId:a,nativeId:p,path:r,continuityPaths:[r],historyHash:m.hash,host:{kind:"claude-stream",identity:`${b.paneId}:${b.panePid.pid}`,epoch:1,verifiedAt:this.dependencies.now(),tmuxHost:b}}}if("starting"!==w.state||w.pane||g().existsSync(r))throw new z}else this.dependencies.afterClaudeReceiptCreated?.();k();try{l=await this.dependencies.spawnClaude(q,w)}catch(a){throw s.failSpawn(w.launchId,a instanceof Error?a.message:String(a)),a}if(!l.host||void 0===l.panePid||l.host.paneId!==l.paneId||l.host.panePid.pid!==l.panePid)throw s.failSpawn(w.launchId,"successor Claude host evidence is unavailable"),Error("successor Claude host evidence is unavailable");let A=async a=>{if("failed"===a.state||"conflicted"===a.state){try{await this.dependencies.cancelClaude?.(l.host)}catch{}throw Error("successor Claude operation receipt became terminal")}},B=s.bindSpawnPane(w.launchId,{endpoint:l.host.endpoint,server:l.host.server,paneId:l.host.paneId,panePid:l.host.panePid,target:l.host.paneId});await A(B);let D=s.markSpawnHostVerified(w.launchId,l.host);await A(D);let E=s.markSpawnPromptDelivered(w.launchId);return await A(E),await t(w.launchId,l.host),k(),this.dependencies.afterClaudeSpawned?.(),{operationId:a,nativeId:p,path:r,continuityPaths:[r],historyHash:m.hash,host:{kind:"claude-stream",identity:`${l.paneId}:${l.panePid}`,epoch:1,verifiedAt:this.dependencies.now(),tmuxHost:l.host}}}async createCodex(a,b,c,d,e,f,g,h){let i=this.dependencies.journalRoot??(0,q.BQ)("migration-provider-operations");return J(i,`move:${c}`,j=>this.createCodexLocked(a,b,c,d,e,f,g,h,i,j))}async createCodexLocked(a,b,c,d,e,f,h,j,l,m){var n,o;let p=function(a,b,c,d,e,f){let h=O(a,b);try{let a=Q(JSON.parse(g().readFileSync(h,"utf8")));if(!a||a.operationId!==b||a.sourceNativeId!==d||a.sourceRoot!==e||a.targetRoot!==f)throw Error("Codex provider operation journal does not match");return{journal:{...a,conversationId:a.conversationId??c},fresh:!1}}catch(a){if("ENOENT"!==a.code)throw a}let i={version:1,operationId:b,conversationId:c,sourceNativeId:d,sourceRoot:e,targetRoot:f,createdAtMs:Date.now(),forkRecoveryFloorMs:null,forkRequestedAtMs:null,fork:null,forkSource:null,supersededForks:[]};return P(a,i),{journal:i,fresh:!0}}(l,a,b,c,g().realpathSync(f.transcriptRoot),g().realpathSync(h.transcriptRoot)),q=p.journal,r=[],s=null,t=null,u=[];if(!p.fresh){let a=U(q,this.dependencies.scanCodexForkArtifacts);s=a.fork,t=a.forkSource,u=a.superseded}if(!s&&null===q.forkRequestedAtMs){let a=function(a,b,c=L){let d=function(a,b){let c;try{c=g().readdirSync(a)}catch{return[]}let d=[];for(let e of c){if(!e.endsWith(".json"))continue;let c=null;try{c=Q(JSON.parse(g().readFileSync(i().join(a,e),"utf8")))}catch{continue}if(c&&c.operationId!==b.operationId&&c.sourceNativeId===b.sourceNativeId&&c.sourceRoot===b.sourceRoot&&c.targetRoot===b.targetRoot&&(!c.conversationId||!b.conversationId||c.conversationId===b.conversationId)){if(!c.conversationId&&b.conversationId&&i().join(a,e)===O(a,c.operationId)){let d={...c,conversationId:b.conversationId};try{P(a,d),c=d}catch{}}d.push(c)}}return d}(a,b);if(0===d.length)return{fork:null,forkSource:null,superseded:[],operationIds:[]};let e=Math.min(...d.map(a=>a.forkRequestedAtMs??a.createdAtMs)),f=new Map,h=new Map;for(let a of d)a.fork&&(f.set(a.fork.id,a.fork),a.forkSource&&h.set(a.fork.id,a.forkSource));for(let a of c(b.sourceRoot,b.sourceNativeId,e))f.set(a.id,a);for(let a of b.supersededForks)f.delete(a.id);let j=S([...f.values()].flatMap(a=>{try{return[T(a,b.sourceNativeId,b.sourceRoot)]}catch{return[]}})),k=j[0]??null;return{fork:k,forkSource:k?h.get(k.id)??null:null,superseded:j.slice(1),operationIds:d.map(a=>a.operationId)}}(l,q,this.dependencies.scanCodexForkArtifacts);s=a.fork,t=a.forkSource,u=a.superseded,s&&(r=a.operationIds)}let v=!1;if(s&&(n=M(d),o=t,n&&(!o||n.size!==o.size||n.mtimeMs!==o.mtimeMs))&&(q.supersededForks=N(q.supersededForks,[s],u),q.fork=null,q.forkSource=null,q.forkRequestedAtMs=null,m(),P(l,q),s=null,t=null,u=[],r=[],v=!0),s&&(!q.fork||u.length>0)&&(q.fork=s,q.forkSource=t,q.supersededForks=N(q.supersededForks,u),m(),P(l,q)),!s&&!v&&!p.fresh&&null!==q.forkRequestedAtMs)throw new A;if(!s){let a,b=await this.dependencies.startCodex(f.home);try{if(!(await b.readAccount()).account)throw Error("source Codex account is not authenticated");q.forkRequestedAtMs=Date.now(),q.forkRecoveryFloorMs??=q.forkRequestedAtMs,q.forkSource=M(d),m(),P(l,q);try{a=await b.forkThread(c)}catch(a){if(a instanceof k.yj&&"unknown"===a.outcome)throw new A(a.message);throw q.forkRequestedAtMs=null,q.forkSource=null,m(),P(l,q),a}this.dependencies.afterCodexForkReturned?.()}finally{b.close()}let e=a.path??function(a,b){let c=[{dir:a,depth:0}],d=0;for(;c.length;){let a=c.pop();if(!(a.depth>6))for(let e of g().readdirSync(a.dir,{withFileTypes:!0})){if(++d>2e4)throw Error("forked Codex history was not found within the scan bound");let f=i().join(a.dir,e.name);if(!e.isSymbolicLink()){if(e.isDirectory())c.push({dir:f,depth:a.depth+1});else if(e.isFile()&&e.name.endsWith(`${b}.jsonl`))return f}}}throw Error("forked Codex history was not found")}(f.transcriptRoot,a.id);q.fork=s=T({id:a.id,path:e},c,f.transcriptRoot),m(),P(l,q),this.dependencies.afterCodexForkCreated?.()}let w=s,x=N(q.supersededForks,u).filter(a=>a.id!==w.id).flatMap(a=>{try{return[T(a,c,f.transcriptRoot)]}catch{return[]}}),z=w.path;for(let a of(j(z),x))j(a.path);let B=i().relative(f.transcriptRoot,z);m();let C=(0,y.PM)({sourcePath:z,sourceRoot:f.transcriptRoot,targetRoot:h.transcriptRoot,destinationRelative:B,operationId:a,priorOperationIds:r,afterDestinationPublished:this.dependencies.afterCodexCopyPublished});j(C.path);let D=await this.dependencies.startCodex(h.home);try{if(!(await D.readAccount()).account)throw new y.IO("not-authenticated","target Codex account is not authenticated");m();let a=e.permissionMode&&["never","on-request","untrusted"].includes(e.permissionMode)?e.permissionMode:null;if((await D.resumeThread(s.id,{path:C.path,cwd:e.cwd,model:e.model,effort:e.effort,fast:e.fast,approvalPolicy:a,sandbox:e.readOnly?"read-only":null})).id!==s.id)throw Error("target Codex resume returned another thread");if(e.title&&await D.setThreadName(s.id,e.title),e.goal?.objective&&await D.setThreadGoal(s.id,e.goal.objective,e.goal.status),(await D.readThread(s.id)).id!==s.id)throw Error("target Codex history verification failed")}finally{D.close()}return{operationId:a,nativeId:s.id,path:C.path,continuityPaths:[z,C.path],historyHash:C.hash,host:{kind:"codex-app-server",identity:s.id,epoch:1,verifiedAt:this.dependencies.now()}}}}},93012:(a,b,c)=>{c.d(b,{p:()=>g});var d=c(32372),e=c(41022);function f(a,b){return{images:[],error:{error:a,status:b}}}function g(a){let b;if(void 0!==a.images){if(!Array.isArray(a.images))return f("images must be an array",400);b=a.images}else if(void 0!==a.image){if(!a.image||"object"!=typeof a.image||Array.isArray(a.image))return f("invalid image",400);b=[a.image]}else b=[];if(b.length>d.sP)return f(`too many images (${d.sP} limit)`,413);let c=[],g=0,h=0;for(let a of b){if(!a||"object"!=typeof a||Array.isArray(a)||"string"!=typeof a.base64||"string"!=typeof a.mime)return f("invalid image",400);if((g+=Buffer.byteLength(a.base64))>d.u1)return f("runtime image request encoding is too large",413);let b=function(a){if(!a||a.length%4!=0||!/^[A-Za-z0-9+/]+={0,2}$/.test(a))return null;let b=Buffer.from(a,"base64");return b.length>0&&b.toString("base64")===a?b:null}(a.base64);if(!b)return f("runtime image base64 is invalid",400);let i=(0,e.CC)(a.mime);if(!i)return f("unsupported image type",415);if(b.byteLength>d.DO)return f("image is too large (10 MB limit)",413);if(!(0,d.G)(b,i))return f("runtime image signature does not match MIME",415);if((h+=b.byteLength)>d.ON)return f("runtime image request is too large",413);c.push({base64:a.base64,mime:i})}return{images:c,error:null}}},94292:(a,b,c)=>{c.r(b),c.d(b,{recoverDeadStructuredConversation:()=>t,structuredHostProcessAlive:()=>o});var d=c(86850),e=c(74382),f=c(81533),g=c(29733),h=c(48892),i=c(59683),j=c(3127),k=c(98223),l=c(45656),m=c(43384);class n extends Error{constructor(){super("structured recovery operation is superseded"),this.name="StructuredRecoverySupersededError"}}function o(a){return!!a&&!!Number.isInteger(a.pid)&&!(a.pid<=0)&&!!i.B.pidAlive(a.pid)&&(null===a.startIdentity||i.B.processIdentity(a.pid)===a.startIdentity)}let p=globalThis,q=p.__llvStructuredRecovery??=new Map;function r(a,b,c=!1){let d=b.conversationId?.startsWith("conversation_")?a.conversation(b.conversationId):a.conversationForPath(b.path),f=d?.generations.at(-1);if(!d||!f)return null;let g={engine:d.engine,sessionId:f.id},i=a.readOnlySnapshot(),j=i.entries[(0,h.pp)(g)];if(j?.host)return null;let k=j?.status==="dead"||j?.status==="unhosted",l=!!(o(j?.structuredHost?.process??null)&&j?.claimOwner&&null===j.pendingAction&&!k),m=(0,e.Ui)(c?{...j?.launchProfile??{},...f.launchProfile,cwd:f.launchProfile.cwd||j?.launchProfile?.cwd||j?.cwd}:{...f.launchProfile,...j?.launchProfile??{},cwd:j?.launchProfile?.cwd||f.launchProfile.cwd||j?.cwd}),n=i.lineageEdges[d.id]?.parentConversationId??m.parentConversationId,p=n&&n!==d.id?a.canonicalConversationId(n):null;return{conversationId:d.id,engine:d.engine,key:g,path:f.path,accountId:f.accountId??j?.accountId??null,parentConversationId:p===d.id?null:p,spec:{command:"",cwd:m.cwd,windowName:"structured-resume",engine:d.engine,transcript:f.path,launchProfile:m},publishReady:l}}async function s(a,b,c,e){let g=b.ownership,h=async()=>{if(g&&!await g.owns())throw new n},m=(b.processIdentity??(()=>({pid:process.pid,startIdentity:i.B.processIdentity(process.pid)})))();return c.withOperationLock(e.key,m,async()=>{await h();let e=r(c,a,!!g);if(!e||!e.publishReady&&((0,k.DQ)(c,e.conversationId,e.key),!(e=r(c,a,!!g))))return null;if(e.publishReady){if(!g)return{target:null,path:e.path,conversationId:e.conversationId,spawned:!1};if(await g.releaseHost(e.key),await h(),c.terminateStructuredHost(e.key),await h(),!(e=r(c,a,!0)))return null}let i=void 0===b.client?(0,j.sS)():b.client;if(!i)throw Error("structured recovery runtime host is unavailable");let m=(b.resolveAccount??d.lD.resolveSpawn)(e.engine,e.accountId),n=c.beginSpawnRequest({engine:e.engine,cwd:e.spec.cwd,transport:"structured",accountId:m.accountId,conversationId:e.conversationId,parentConversationId:e.parentConversationId,purpose:"resume-successor",origin:{kind:"successor"},expectedArtifactPath:e.path,launchProfile:e.spec.launchProfile});if("created"!==n.kind)throw Error("structured recovery reservation is unavailable");try{await h()}catch(a){throw c.failSpawn(n.receipt.launchId,"structured recovery operation was superseded"),a}let o=await (b.spawn??l.sh)({engine:e.engine,receipt:n.receipt,spec:e.spec,account:m,prompt:"",registry:c,client:i});if(!o.ok||!o.path)throw Error("structured recovery host did not publish its transcript");try{await h()}catch(a){throw await g?.releaseHost(e.key),c.terminateStructuredHost(e.key),a}return(b.requestDeliveryDrain??f.U)(),{target:null,path:o.path,conversationId:e.conversationId,spawned:!0}})}async function t(a,b={}){if("structured"!==(b.transport??m.l)())return null;let c=b.registry??(0,g.agentRegistry)();if(b.ownership&&!await b.ownership.owns())throw new n;let d=r(c,a,!!b.ownership);if(!d)return null;let e=b.ownership?`${c.filename}:${d.conversationId}:${b.ownership.operationId}:${b.ownership.revision}`:`${c.filename}:${d.conversationId}`,f=q.get(e);if(f)return f;if(d.publishReady&&!b.ownership)return{target:null,path:d.path,conversationId:d.conversationId,spawned:!1};let h=s(a,b,c,d);q.set(e,h);try{return await h}finally{q.get(e)===h&&q.delete(e)}}},94777:(a,b,c)=>{c.d(b,{PD:()=>i,UE:()=>h,xE:()=>g});var d=c(50201);let e=process;function f(){return{state:"pending",phase:"waiting for structured startup",completedHosts:0,totalHosts:null,updatedAt:new Date().toISOString()}}function g(){e.__llvStructuredHostStartupFailed=!1;var a={...e.__llvStructuredHostStartupProgress??f(),phase:"ready"};if(!Number.isSafeInteger(a.completedHosts)||a.completedHosts<0)throw Error("structured host startup completed count is invalid");if(null!==a.totalHosts&&(!Number.isSafeInteger(a.totalHosts)||a.totalHosts<a.completedHosts))throw Error("structured host startup total count is invalid");e.__llvStructuredHostStartupProgress={...a,state:"ready",updatedAt:new Date().toISOString()}}function h(a=process.env){if(!(0,d.cM)(a))return null;let b=e.__llvStructuredHostStartupFailed;return void 0===b?"pending":b?"failed":"ready"}function i(a=process.env){return(0,d.cM)(a)?{...e.__llvStructuredHostStartupProgress??f()}:null}},94896:(a,b,c)=>{c.d(b,{FK:()=>j,bs:()=>l,eX:()=>i});var d=c(73024),e=c.n(d),f=c(29733),g=c(48892),h=c(89333);class i extends Error{constructor(a,b){super(a),this.status=b,this.name="SpawnParentError"}}function j(a){let b,c;try{b=e().realpathSync(a),c=e().statSync(b)}catch{return!1}return!!c.isFile()&&!!b.endsWith(".jsonl")&&(!!(0,h.Ps)(b)||!!(0,h.Bz)(b))}function k(a,b=(0,f.agentRegistry)()){let c;if(void 0!==a.parentConversationId){if("string"!=typeof a.parentConversationId||!/^conversation_[0-9a-f-]{36}$/i.test(a.parentConversationId))throw new i("parentConversationId is invalid",400);let c=b.conversation(a.parentConversationId);if(!c)throw new i("parent conversation is unknown",404);let d=c.generations.at(-1)?.path;if(!d)throw new i("parent conversation has no active generation",409);return{conversationId:c.id,engine:c.engine,artifactPath:d,sessionKey:(0,g.sz)(c.engine,d)}}let d="string"==typeof a.parent?a.parent:"string"==typeof a.src?a.src:"";if(!d||!j(d))return null;let e=(0,h.Ps)(d)?"codex":"claude";return{conversationId:(c=b.conversationForPath(d))?c.id:b.ensureConversation((0,h.Ps)(d)?"codex":"claude",d,null).id,engine:e,artifactPath:d,sessionKey:(0,g.sz)(e,d)}}function l(a,b=(0,f.agentRegistry)()){if("reviewer"!==a.role){if(void 0!==a.reviews)throw new i("reviews requires role: reviewer",400);return{parent:k(a,b),reviewed:null}}if("string"!=typeof a.reviews||!a.reviews.trim())throw new i("reviewer requires reviews",400);let c=a.reviews.trim(),d=c.startsWith("conversation_")?k({parentConversationId:c},b):k({parent:c},b);if(!d)throw new i("reviewed conversation is invalid",400);let e=void 0!==a.parentConversationId||void 0!==a.parent||void 0!==a.src?k(a,b):d;if(!e)throw new i("reviewer caller is invalid",400);return{parent:e,reviewed:d}}},98223:(a,b,c)=>{c.d(b,{DQ:()=>l,WF:()=>j,cM:()=>e.cM,n$:()=>k});var d=c(48892);c(59683),c(52649),c(25953),c(83336);var e=c(50201);function f(a,b){return{kind:"codex-app-server",endpoint:a.endpoint,process:null===a.pid?null:{pid:a.pid,startIdentity:a.processStartIdentity},eventCursor:a.eventCursor,protocolVersion:a.protocolVersion,writerClaimEpoch:b,activeTurnRef:a.activeTurnRef,pendingAttention:a.pendingAttention,activeFlags:a.activeFlags}}function g(a,b){return{kind:"claude-broker",endpoint:a.endpoint,process:null===a.pid?null:{pid:a.pid,startIdentity:a.processStartIdentity},eventCursor:a.eventCursor,protocolVersion:a.protocolVersion,writerClaimEpoch:b,activeTurnRef:a.activeTurnRef,pendingAttention:a.pendingAttention,activeFlags:a.activeFlags}}function h(a,b){return a.length===b.length&&a.every((a,c)=>a===b[c])}async function i(a,b,c,d,e,f,g,i){let j;c.setWriterFence(()=>a.ownsStructuredHostClaim(b,d,e));let k=(c,h=!1)=>{let i=g(c,e),k=a.setStructuredHostClaimed(b,h&&"unhosted"===c.status?{...i,process:null}:i,h&&"dead"===f?"dead":"active"===c.status||"attention"===c.status?"live":"idle"===c.status?"idle":"unhosted"===c.status?"unhosted":"dead",d,e,h);if(!k)throw Error("structured host writer claim is stale");return j=structuredClone(c),k};try{k(await c.health())}catch(a){throw await c.release(),a}let l=Number.isFinite(i.cursorDebounceMs)?Math.max(0,i.cursorDebounceMs):3e4,m=!1,n=!1,o=!1,p=null,q=null,r=()=>{},s=()=>{null!==q&&(clearTimeout(q),q=null)},t=()=>{o||(o=!0,a.releaseStructuredHostClaim(b,d,e))},u=()=>{m||(m=!0,n=!0,p=null,s(),r(),t(),c.release())},v=()=>{let a=p;p=null,s(),a&&k(a)};return r=c.onStateChange(a=>{var b;if(m||n)return;let c="unhosted"===a.status||"dead"===a.status&&null===a.pid;if(!c&&(b=j).status===a.status&&b.endpoint===a.endpoint&&b.pid===a.pid&&b.processStartIdentity===a.processStartIdentity&&b.protocolVersion===a.protocolVersion&&b.activeTurnRef===a.activeTurnRef&&h(b.pendingAttention,a.pendingAttention)&&h(b.activeFlags,a.activeFlags)){p=structuredClone(a),null===q&&(q=setTimeout(()=>{if(q=null,!m&&!n&&null!==p)try{v()}catch{u()}},l),q.unref?.());return}p=null,s();try{k(a,c),c&&(o=!0,n=!0,r())}catch{u()}}),n&&r(),()=>{if(!n){try{v()}catch{u();return}n=!0,r(),t()}}}async function j(a,b,c,d,e,g="unhosted",h={}){return i(a,b,c,d,e,g,f,h)}async function k(a,b,c,d,e,f="unhosted",h={}){return i(a,b,c,d,e,f,g,h)}function l(a,b,c){let e=a.readOnlySnapshot().entries[(0,d.pp)(c)],f=e?.structuredHost?.process;return!!e&&!!f&&!!a.terminateInactiveStructuredHost(b,c,{process:f,claimEpoch:e.claimEpoch})}},99463:(a,b,c)=>{c.d(b,{F_:()=>aY,u_:()=>bG,a3:()=>bH,Cz:()=>bP,jA:()=>bO,RO:()=>aW,UA:()=>a3,n6:()=>bq});var d=c(77598),e=c.n(d),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(86850),k=c(78966),l=c(74382),m=c(14509),n=c(29733),o=c(12770),p=c(94896),q=c(48892),r=c(16089),s=c(77513),t=c(5425),u=c(98590),v=c(26474),w=c(2159),x=c(3127),y=c(50201),z=c(48161),A=c.n(z),B=c(56809);let C=/(?:%2[Ff][A-Za-z0-9._+-]+){2,}/g,D=["home","Users","root"],E=RegExp(`-(?:${D.join("|")})(?:-[A-Za-z0-9._+]+)+`,"g"),F=RegExp(`(?<![\\w.-])\\/(?:${D.join("|")})(?:\\/[A-Za-z0-9._-]+)?`,"g"),G=/(?<![\w:/~.%-])\/[A-Za-z0-9._+-]+(?:\/[A-Za-z0-9._+-]+)+/g,H=/(?<![\w.+-])[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g;function I(a){let b=a.split("/").filter(Boolean).at(-1);return b?`…/${b}`:"…"}function J(a,b){let c,d,e=(c=A().homedir(),d=(d=(d=(d=(0,B.j)(a)).replace(H,"[redacted-email]")).replace(C,"…")).replace(E,"…"),c&&"/"!==c&&(d=d.split(c).join("~")),d=(d=d.replace(F,"~")).replace(G,I)).trim();return e.length<=b?e:`${e.slice(0,b-1).trimEnd()}…`}var K=c(23261),L=c(45656),M=c(70107),N=c(21153),O=c(89333),P=c(27359),Q=c(27471),R=c(25123),S=c(77149),T=c(49113),U=c(23855);async function V(a,b){let c=await (0,U.mR)(b);if("complete"!==c.integrity)return null;let d="codex"===a,e=(0,T.j)(c.records,d),f=0;try{f=g().statSync(b).mtimeMs}catch{}let h=(0,t.uc)(c.records,d?"codex-sessions":"claude-projects",f);return{turn:"terminal"===e.state?"terminal":"busy"===e.state?"busy":"unknown",message:h}}function W(a,b){return{ok:!1,error:`${a}: ${(b.stderr||b.stdout||"no output").trim()}`}}function X(a){return/^[A-Za-z0-9][A-Za-z0-9._/-]{0,254}$/.test(a)&&!a.includes("..")&&!a.includes("//")&&!a.includes("@{")&&!a.endsWith("/")&&!a.endsWith(".")&&!a.endsWith(".lock")}function Y(a,b,c){let d=b.baseBranch?.trim()||"main";if(!X(d))return{ok:!1,error:"the pipeline base branch is invalid"};let e=b.baseRef?.trim();if(!e){let b=c("git",["fetch","--no-tags","origin",`+refs/heads/${d}:refs/remotes/origin/${d}`],a);if(0!==b.code)return W(`fetching origin/${d}`,b)}let f=e||`origin/${d}`,g=c("git",["rev-parse","--verify","--end-of-options",`${f}^{commit}`],a);if(0!==g.code)return W(`resolving pipeline base ${f}`,g);let h=g.stdout.trim();return/^[0-9a-f]{40}$/i.test(h)?{ok:!0,baseBranch:d,baseRef:h}:{ok:!1,error:`resolving pipeline base ${f}: expected an exact commit SHA`}}function Z(a,b){if(!a.lastPassedCommit)return{ok:!1,error:"the pipeline has no passed-stage commit"};let c=b("git",["reset","--hard",a.lastPassedCommit],a.worktreeDir);if(0!==c.code)return W("resetting the pipeline stage",c);let d=b("git",["clean","-fd"],a.worktreeDir);return 0!==d.code?W("cleaning the pipeline stage",d):{ok:!0,sha:a.lastPassedCommit}}function $(a,b){if(!X(a.branch))return{ok:!1,error:"the pipeline branch is invalid"};let c=b("git",["status","--porcelain"],a.worktreeDir);if(0!==c.code)return W("checking the pipeline worktree",c);if(c.stdout.trim())return{ok:!1,error:"the pipeline worktree has uncommitted changes; choose whether to commit or discard them before retrying review"};let d=b("git",["branch","--show-current"],a.worktreeDir);if(0!==d.code)return W("checking the pipeline branch",d);if(d.stdout.trim()!==a.branch)return{ok:!1,error:"the pipeline worktree is not checked out on its persisted branch"};let e=b("git",["rev-parse","HEAD"],a.worktreeDir);if(0!==e.code)return W("resolving the pipeline branch HEAD",e);let f=e.stdout.trim();return/^[0-9a-f]{40}$/i.test(f)?{ok:!0,sha:f}:{ok:!1,error:"resolving the pipeline branch HEAD: expected an exact commit SHA"}}function _(a,b,c){let d=b("timeout",["--signal=KILL","5s","git","ls-remote","--heads","origin",`refs/heads/${a.branch}`],a.worktreeDir);return 0===d.code?{ok:!0,sha:d.stdout.trim().split(/\s+/)[0]??""}:124===d.code||137===d.code?{ok:!1,error:`${c}: git remote read timed out after 5s`}:W(c,d)}function aa(a,b,c){let d=c.acceptedSha;if(!/^[0-9a-f]{40}$/i.test(d))return{ok:!1,error:`the accepted pipeline revision is not an exact commit SHA: ${d||"absent"}`};let e=$(a,b);if(!e.ok)return e;if(e.sha!==d)return{ok:!1,error:`the pipeline worktree is at ${e.sha}, not the accepted revision ${d}; nothing was published`};if(c.publishedSha&&c.publishedSha===d)return{ok:!0,sha:d,remote:"published"};let f=b("git",["remote","get-url","origin"],a.worktreeDir);if(0!==f.code||!f.stdout.trim())return{ok:!0,sha:d,remote:"unavailable"};let g=_(a,b,"checking the remote pipeline branch");if(!g.ok)return{ok:!0,sha:d,remote:"unreachable",detail:g.error};let h=g.sha;if(h===d)return{ok:!0,sha:d,remote:"published"};if(h){if(!/^[0-9a-f]{40}$/i.test(h))return{ok:!1,error:"the remote pipeline branch has no exact commit SHA"};if(0!==b("git",["cat-file","-e",`${h}^{commit}`],a.worktreeDir).code){let c=b("git",["fetch","--no-tags","origin",`+refs/heads/${a.branch}:refs/remotes/origin/${a.branch}`],a.worktreeDir);if(0!==c.code)return W("fetching the remote pipeline branch",c)}let c=b("git",["merge-base","--is-ancestor",h,d],a.worktreeDir);if(1===c.code)return{ok:!1,error:"the local and remote pipeline branches diverged; choose which revision to publish before the review stage can start"};if(0!==c.code)return W("comparing local and remote pipeline revisions",c)}let i=b("git",["push","origin",`${d}:refs/heads/${a.branch}`],a.worktreeDir);if(0!==i.code)return W("publishing the pipeline branch",i);let j=_(a,b,"confirming the published pipeline branch");if(!j.ok)return{ok:!0,sha:d,remote:"unreachable",detail:j.error};let k=j.sha;return k!==d?{ok:!1,error:`publishing the pipeline branch did not land: origin/${a.branch} is ${k||"absent"}, expected ${d}`}:{ok:!0,sha:d,remote:"published"}}var ab=c(19849),ac=c(96826);function ad(a,b,c){return a.split(b).join(c)}var ae=c(99411),af=c(89822),ag=c(58152),ah=c(4837),ai=c(79247),aj=c(41288);let ak=["orchestrator","reviewer","verifier","builder","architect","cleaner","prod-auditor","deployer"],al=(a,b)=>{let c=(0,ae.OH)().find(b=>b.id===a);if(!c)return null;let d=Object.fromEntries(c.parameters.map(a=>{let c=b?.[a.key],d=void 0!==c&&""!==c?c:(0,ai.y)(a);return[a.key,d]})),e=(0,ae.hB)(c,d),f=(0,ae.X2)(c);return{...(0,ae.aW)(c,d),access:c.capabilities.includes("read-only")?"read-only":"read-write",promptScaffold:`${e.slice(0,af.le-f.length)}${f}`}};function am(a,b){if(!b)return null;let c=(0,ae.OH)().find(b=>b.id===a);if(!c)return null;let d=(0,ae.$d)(c,b,{requireRequired:!1});return d.ok?null:d.error}function an(a,b,c){let d=a.role;if(void 0!==d&&(!d||"object"!=typeof d||Array.isArray(d)))return{error:"stage role must be an object"};let e=d&&"string"==typeof d.roleId?d.roleId.trim():"";if(d&&!e)return{error:"stage roleId is required when role is present"};if(e&&!ak.includes(e))return{error:`unknown pipeline role: ${e}`};if(e&&aj.o.includes(e))return{error:`role ${e} is not allowed in a pipeline (it requires interactive deploy confirmation)`};let f=d&&d.params&&"object"==typeof d.params&&!Array.isArray(d.params)?d.params:void 0;if(void 0!==a.engine&&"claude"!==a.engine&&"codex"!==a.engine)return{error:"stage engine must be claude or codex"};if(void 0!==a.access&&"read-only"!==a.access&&"read-write"!==a.access)return{error:"stage has an invalid access value"};if("review-loop"===b&&"read-write"===a.access)return{error:"review-loop stages require read-only access"};let g=void 0===c?null:c,h=g?.("builder")??null;if(!h)return{error:"Builder role is unavailable in the role registry"};let i=e||null,j=i?g?.(i,f)??null:null,k=(a,b)=>null===a?null:"string"==typeof a?a.trim()||null:b??null,l=a.engine??j?.engine??h.engine,m=k(a.model,j?.model??h.model),n=k(a.effort,j?.effort??h.effort);if(m){let a=(0,ah.RC)(l,m);if("error"in a)return{error:a.error,field:"model"}}if(n&&!(0,ag.z9)(l,n))return{error:`stage effort is not supported by ${l}`};let o=i&&"string"==typeof j?.promptScaffold&&j.promptScaffold.trim()||null;return i&&!o?{error:`role ${i} resolves to an empty prompt scaffold`}:{role:{roleId:i,engine:l,model:m,effort:n,access:"review-loop"===b?"read-only":a.access??j?.access??h.access??"read-write",promptScaffold:o}}}function ao(a){if(0===a.length)return"invalid pipeline request";if(1===a.length)return a[0].message;let b=a.map(a=>`${a.field}: ${a.message} (expected ${a.expected})`);return`${a.length} validation errors — ${b.join("; ")}`}var ap=c(13896),aq=c(34471),ar=c(63376);async function as(a,b){let c,d=j.lD.resolveSpawn(a.role.engine),f=function(a){if(!a)return{conversationId:null,sessionKey:null};let b=(0,O.Ps)(a)?"codex":(0,O.Bz)(a)?"claude":null;if(!b)return{conversationId:null,sessionKey:null};let c=(0,n.agentRegistry)();return{conversationId:(c.conversationForPath(a)??c.ensureConversation(b,a,null)).id,sessionKey:(0,q.sz)(b,a)}}(a.parentPath),g=(0,m.lV)(a.role.engine,a.cwd,{model:a.role.model,effort:a.role.effort,readOnly:"read-only"===a.role.access,permissionMode:"claude"===a.role.engine?"bypassPermissions":null,codexHome:"codex"===a.role.engine?d.home:null,claudeConfigDir:"claude"===a.role.engine?d.home:null,claudeProjectsDir:"claude"===a.role.engine?d.transcriptRoot:null}),h=(0,l.Ui)({...g.launchProfile??{},cwd:a.cwd,parentConversationId:f.conversationId}),i=(0,n.agentRegistry)(),k=a.supersedes?.startsWith("conversation_")&&i.conversation(a.supersedes)?i.canonicalConversationId(a.supersedes):null,o=e().createHash("sha256").update(JSON.stringify({engine:a.role.engine,model:a.role.model,effort:a.role.effort,cwd:a.cwd,parentConversationId:f.conversationId,...k?{supersedes:k}:{},prompt:a.prompt})).digest("hex"),p=a.creatorConversationId?.startsWith("conversation_")?i.canonicalConversationId(a.creatorConversationId):null,r=i.beginSpawnRequest({engine:a.role.engine,cwd:a.cwd,transport:"structured",accountId:d.accountId,accountPin:!0,parentConversationId:f.conversationId,parentSessionKey:f.sessionKey,parentArtifactPath:f.conversationId?a.parentPath:null,role:a.role.roleId,origin:{kind:"container",container:"pipeline",containerId:a.membership.containerId,creatorConversationId:p},memberships:[{...a.membership,parentConversationId:f.conversationId}],launchProfile:h,clientAttemptId:a.clientAttemptId,requestDigest:o,supersedes:k,supersedesReason:"stage-retry"});if("conflict"===r.kind)throw Error("pipeline spawn attempt conflicts with its original request");if(b({launchId:r.receipt.launchId,conversationId:r.receipt.conversationId}),"replay"===r.kind){let a=i.conversation(r.receipt.conversationId),b=r.receipt.artifactPath??a?.generations.at(-1)?.path??null;return{launchId:r.receipt.launchId,conversationId:r.receipt.conversationId,sessionId:r.receipt.key?.sessionId??null,transcript:b,paneId:r.receipt.verifiedHost?.paneId??r.receipt.pane?.paneId??null}}let s={...g,launchProfile:h},t=(0,x.sS)(),u=(0,y.lN)("pipeline structured runtime host");if(!t)throw Error(u);try{c=await (0,L.sh)({engine:a.role.engine,receipt:r.receipt,spec:s,account:d,prompt:a.prompt,registry:i,client:t})}catch(a){if((0,x.o7)(a))throw Error(u,{cause:a});throw a}let w=c.path??null,z=w?(0,q.sz)(a.role.engine,w):null;return w&&a.parentPath&&f.conversationId&&((0,v.A6)(w,a.parentPath),(0,v.OA)()),{launchId:r.receipt.launchId,conversationId:r.receipt.conversationId,sessionId:z?.sessionId??null,transcript:w,paneId:null}}let at=new Set(["delivered"]),au=new Set(["failed","rejected"]);async function av(a){let b=(0,n.agentRegistry)(),d=(a.conversationId?.startsWith("conversation_")?b.conversation(a.conversationId):null)??(a.agentPath?b.conversationForPath(a.agentPath):null),e=d?.generations.at(-1)??null;if(!d||!e)return null;let f=(0,q.pp)({engine:d.engine,sessionId:e.id}),{structuredHostProcessAlive:g}=await Promise.resolve().then(c.bind(c,94292));return{conversationId:d.id,transcriptPath:e.path,resident:()=>{let a=b.readOnlySnapshot().entries[f];return!!a&&"dead"!==a.status&&"unhosted"!==a.status&&(g(a.structuredHost?.process??null)||!!a.host)},host:()=>b.readOnlySnapshot().entries[f]?.host??null}}async function aw(a,b={}){let c=a.paneId;if(!c)return{outcome:"not-running"};let d=b.paneSnapshot??Q.RZ,e=a=>a?`pane ${c} now runs ${a.command} in window ${a.windowName}`:`pane ${c}`;try{let f=await av(a),g=f?.host()??null;if(!g||g.paneId!==c){let a=await d(c);if(!a||(0,P.g2)(a.command))return{outcome:"not-running"};return{outcome:"unknown",detail:`${e(a)} and cannot be identified as this stage's agent; stop it yourself if it is the orphan, or close again with acknowledgeHosts to dismiss it`}}if(await (b.killHostIfMatches??Q.B$)(g))return{outcome:"stopped"};let h=await d(c);if(!h||(0,P.g2)(h.command))return{outcome:"not-running"};return{outcome:"unknown",detail:`${e(h)}; it changed or its agent did not exit, so it was left running`}}catch(a){return{outcome:"failed",error:a instanceof Error?a.message:String(a)}}}async function ax(a,b={}){try{let d=await av(a);if(!d||!d.resident())return{outcome:"not-running"};let{conversationId:e,transcriptPath:f,resident:g}=d,{applyConversationAction:h}=await c.e(3558).then(c.bind(c,53558)),i=await h({conversationId:e,transcriptPath:f,action:"kill"}),j=i.body;if(i.status>=400||!0!==j.ok)return{outcome:"failed",error:j.error??`stage host kill was refused with status ${i.status}`};let k=j.receipt?.status??null;if(!k||at.has(k))return{outcome:"stopped"};let l=j.operationId??null,m=void 0===b.client?(0,x.sS)():b.client,n=b.now??Date.now,o=b.sleep??(a=>new Promise(b=>setTimeout(b,a))),p=n()+(b.budgetMs??1500),q=b.intervalMs??250;for(let a=0;a<8;a+=1){if(!g())return{outcome:"stopped"};if(l&&m){let a=await m.operationStatus(l).catch(()=>null),b=a?.receipt.status??null;if(b&&at.has(b))return{outcome:"stopped"};if(b&&au.has(b))return{outcome:"failed",error:a?.receipt.reason??`stage host kill ${b} (operation ${l})`}}if(n()>=p)break;await o(q)}if(!g())return{outcome:"stopped"};return{outcome:"unconfirmed",operationId:l,detail:`kill accepted as ${k} but termination was not confirmed`}}catch(a){return{outcome:"failed",error:a instanceof Error?a.message:String(a)}}}function ay(){let a=null,b=(0,n.agentRegistry)(),c=null,d=null,e=null,f=()=>c??=b.readOnlySnapshot(),h=()=>e??=(0,u.mL)(),i=()=>{c=null,d=null};return{exec:R.Ix,preflightRepo:ac.OF,roleLookup:al,spawnAgent:async(a,b)=>{let c=await as(a,b);return i(),c},spawnReceipt:a=>{let b=f().receipts[a];return b?{state:b.state,launchId:b.launchId,conversationId:b.conversationId,sessionId:b.key?.sessionId??null,transcript:b.artifactPath,paneId:b.verifiedHost?.paneId??b.pane?.paneId??null}:null},claimSpawnRetry:(a,c)=>{let d=b.claimFailedSpawnForRetry(a,c).kind;return i(),d},paneAgentAlive:async a=>{let b=await (0,Q.RZ)(a);return null!==b&&!(0,P.g2)(b.command)},stopStageAgent:a=>ax(a),stopStagePane:a=>aw(a),stageHostResident:async a=>{try{let b=await av(a);return!!b&&b.resident()}catch{return!0}},monotonicNow:()=>Date.now(),worktreePresent:a=>!!a&&g().existsSync(a),conversationAgentActive:async b=>{let c,d=(0,x.sS)();if(!d)return null;a??=d.snapshot();try{c=await a}catch{return null}let e=c.sessions.find(a=>a.conversationId===b);return e?["dead","unhosted","conflict"].includes(e.host)?(a=null,!1):"running"===e.turn||"interrupt_requested"===e.turn||e.attentionIds.length>0||null:null},conversationHostUnavailableSince:async a=>{if(!a.startsWith("conversation_"))return;let b=f(),c=b.conversations[a],d=c?.generations.at(-1);if(!c||!d)return;let e=(0,q.sz)(c.engine,d.path);if(!e)return;let g=b.entries[(0,q.pp)(e)];return g?"dead"===g.status||"unhosted"===g.status?g.updatedAt:null:d.createdAt},sleep:a=>new Promise(b=>setTimeout(b,a)),durableTurnEvidence:V,headCwd:a=>(0,r.tX)(a),lastMessage:t.if,pathForConversation:a=>a.startsWith("conversation_")?f().conversations[a]?.generations.at(-1)?.path??null:null,sourcePathAllowed:p.FK,conversationIdForPath:a=>{for(let b of Object.values(f().conversations))if(b.generations.some(b=>b.path===a))return b.id;return null},pipelineAdoptionCandidates:a=>(()=>{if(d)return d;let a=f(),b=new Map(Object.values(a.receipts).map(a=>[a.conversationId,a])),c=new Map;for(let[d,e]of Object.entries(a.memberships))for(let f of e){if("pipeline"!==f.kind||!f.containerId||!f.slot.startsWith("adopt:")||!f.stageId||!f.parentConversationId)continue;let e=b.get(d)??null,g=a.conversations[d]??null,h=g?.generations.at(-1)??null,i=e?.artifactPath??h?.path??null;if(!i)continue;let j=f.runtime??(e?{engine:e.engine,model:e.launchProfile.model,effort:e.launchProfile.effort}:g?{engine:g.engine,model:h?.launchProfile.model??null,effort:h?.launchProfile.effort??null}:null),k=c.get(f.containerId)??[];k.push({stageId:f.stageId,sourceConversationId:f.parentConversationId,launchId:e?.launchId??null,conversationId:d,sessionId:e?.key?.sessionId??null,agentPath:i,paneId:e?.verifiedHost?.paneId??e?.pane?.paneId??null,startedAt:e?.createdAt??f.createdAt,runtime:j}),c.set(f.containerId,k)}return d=c,c})().get(a)??[],createFlow:async(a,b)=>{let c=await (0,s._p)(a,b);return e=null,c},patchFlow:(a,b,c,d=null)=>{let f=(0,s.n1)(a,{action:b,...c?{note:c}:{}},d);return e=null,f},closeFlow:async a=>{let b=await (0,s.ni)(a);return e=null,b},getFlow:a=>h().find(b=>b.id===a)??null,findFlow:(a,b,c,d)=>h().filter(e=>e.baseRef===c&&e.targetSha===d&&null===e.closedAt&&"closed"!==e.state&&(e.implementerPath===a||!!(b&&e.implementerConversationId===b))).sort((a,b)=>b.createdAt.localeCompare(a.createdAt))[0]??null,projectForCwd:M.hY,now:()=>new Date().toISOString()}}let az=new Set,aA=new Set(["completed","closed"]),aB="stage completed without a valid final JSON verdict",aC="historical attempt completed without a valid final JSON verdict",aD=new Set(["passed","failed","needs_decision","skipped"]);function aE(a,b,c){return`${a.id}:${b.id}:${c.n}`}function aF(a){return a.cursor?a.stages.find(b=>b.id===a.cursor?.stageId)??null:null}function aG(a,b){return a.runs.find(a=>a.stageId===b)??null}function aH(a,b){return aG(a,b)?.attempts.findLast(a=>!a.historical)??null}function aI(a){let b=a?Date.parse(a):0;return Number.isFinite(b)?b:0}function aJ(a){return"string"==typeof a?a.trim()||null:"number"==typeof a&&Number.isFinite(a)?String(a):null}function aK(a){if(!a||"object"!=typeof a||Array.isArray(a))return a;let b=aJ(a.severity),c=aJ(a.file),d=aJ(a.line),e=[b,c?`${c}${d?`:${d}`:""}`:d?`line ${d}`:null,aJ(a.summary)].filter(a=>!!a);return e.length>0?e.join(" — "):a}function aL(a){let b,c=[...a.matchAll(/```(?:json)?\s*([\s\S]*?)```/gi)].at(-1);if(!c||void 0===c.index)return a;try{b=JSON.parse(c[1]??"")}catch{return a}if(!b||"object"!=typeof b||Array.isArray(b))return a;let d=b;if(!Array.isArray(d.findings)||!d.findings.some(a=>a&&"object"==typeof a&&!Array.isArray(a)))return a;let e={...d,findings:d.findings.map(aK)},f=c[0],g=c[1]??"",h=f.indexOf(g),i=c.index+h;return`${a.slice(0,i)}${JSON.stringify(e)}${a.slice(i+g.length)}`}function aM(a){return(0,ar.fM)(aL(a))}function aN(a){return(0,ar.DL)(aL(a))}function aO(a,b,c){let d=a.verdictRecovery;d&&"recovered"!==d.state&&(a.verdictRecovery={...d,state:"recovered",lastCheckedAt:b,nextCheckAt:null,messageTs:c})}function aP(a,b,c,d,e){let f=c.now(),g=b.verdictRecovery?.state==="pending"?b.verdictRecovery:null,h=null!==e&&g?.messageTs!==null&&g?.messageTs!==void 0&&e>g.messageTs;if(g&&!h&&aI(f)<aI(g.nextCheckAt))return;let i=(g?.checks??0)+1,j={state:i>=3?"exhausted":"pending",checks:i,maxChecks:3,startedAt:g?.startedAt??f,lastCheckedAt:f,nextCheckAt:i>=3?null:new Date(aI(f)+3e4).toISOString(),reason:d,messageTs:e};if(b.verdictRecovery=j,"exhausted"===j.state){b.completedAt=f,aQ(a,`stage verdict recovery exhausted after 3 checks: ${d}`,b);return}b.state="running",b.error=null,a.state="running",a.stateDetail=`re-evaluating terminal stage verdict (${i}/3): ${d}`}function aQ(a,b,c){c&&"failed"!==c.state&&(c.state="needs_decision"),c&&(c.error=b),a.state="needs_decision",a.pausedState=null,a.stateDetail=b}function aR(a,b,c){let d=a.cursor?.stageId===b?{input:a.cursor.input,activatedBy:a.cursor.activatedBy}:{input:null,activatedBy:null};a.cursor={stageId:b,state:c,...d}}function aS(a){if(!a.cursor)return"";let b=a.stages.findIndex(b=>b.id===a.cursor?.stageId);for(let c=b-1;c>=0;c-=1){let b=aH(a,a.stages[c].id);if(b?.output)return b.output}return""}function*aT(a,b){let c=new Set,d=aH(a,b)?.activatedBy??(a.cursor?.stageId===b?a.cursor.activatedBy:null);for(;d;){let b=`${d.stageId}:${d.attempt}`;if(c.has(b))break;c.add(b);let e=a.stages.find(a=>a.id===d.stageId)??null,f=aG(a,d.stageId)?.attempts.find(a=>a.n===d.attempt)??null;if(!e||!f)break;yield{stage:e,attempt:f,boundary:null==f.activatedBy},d=f.activatedBy}}function aU(a,b){let c=!0;for(let d of aT(a,b)){if("run"===d.stage.kind&&"passed"===d.attempt.state&&d.attempt.agentPath)return d.attempt;c=d.boundary}if(!c)return null;let d=a.stages.findIndex(a=>a.id===b);for(let b=d-1;b>=0;b-=1){let c=a.stages[b];if("run"!==c.kind)continue;let d=aH(a,c.id);if(d?.state==="passed"&&d.agentPath)return d}return null}function aV(a,b){let c=aG(a,b.id);if(!c)return aQ(a,"pipeline stage run record is missing"),null;let d=a.cursor?.stageId===b.id?a.cursor:null,e={n:c.attempts.length+1,state:"pending",effectiveRole:structuredClone(b.effectiveRole),launchId:null,conversationId:null,sessionId:null,agentPath:null,paneId:null,flowId:null,expectedReviewHeadSha:null,reviewHeadSha:null,startedAt:null,completedAt:null,input:d?.input??null,activatedBy:d?.activatedBy?{...d.activatedBy}:null,output:null,verdict:null,error:null};return c.attempts.push(e),e}function aW(a){for(let b of(0,ap.IR)())for(let c=0;c<b.runs.length;c+=1){let d=b.runs[c],e=d.attempts.find(b=>b.conversationId===a);if(e)return{pipelineId:b.id,stageId:d.stageId,stageOrder:c,role:e.effectiveRole.roleId??"agent"}}return null}function aX(a,b,c){let d=aG(a,b),e=a.stages.find(a=>a.id===b)??null;if(!d||!e)return null;let f=d.attempts.find(a=>a.conversationId===c.conversationId||null!==c.launchId&&a.launchId===c.launchId);if(f)return f;let g=d.attempts.find(a=>a.conversationId===c.sourceConversationId)??null;if(!g)return null;let h=structuredClone(g.effectiveRole??e.effectiveRole);c.runtime&&(h.engine=c.runtime.engine,h.model=c.runtime.model,h.effort=c.runtime.effort);let i={n:d.attempts.length+1,historical:!0,state:"running",effectiveRole:h,launchId:c.launchId,conversationId:c.conversationId,sessionId:c.sessionId,agentPath:c.agentPath,paneId:c.paneId,flowId:null,expectedReviewHeadSha:null,reviewHeadSha:null,startedAt:c.startedAt,completedAt:null,input:g.input,activatedBy:g.activatedBy?{...g.activatedBy}:null,output:null,verdict:null,error:null};return d.attempts.push(i),i}async function aY(a,b){return(0,ap.Km)((c,d)=>{for(let e of c)for(let c of e.runs){if(!c.attempts.some(b=>b.conversationId===a))continue;let f=aX(e,c.stageId,{...b,sourceConversationId:a});if(!f)return null;return d(),{pipeline:e,stageId:c.stageId,attempt:f}}return null})}async function aZ(a,b,c){let d=!1;for(let e of a.runs)for(let f of e.attempts){if(!f.historical||!["spawning","running"].includes(f.state))continue;let e=JSON.stringify(f);if(ba(a,f,b,c),!f.agentPath){if(f.launchId){let a=c.spawnReceipt(f.launchId);a&&(f.conversationId=a.conversationId,f.sessionId=a.sessionId,f.agentPath=a.transcript,f.paneId=a.paneId,("failed"===a.state||"conflicted"===a.state)&&(f.state="failed",f.completedAt=c.now(),f.error=`historical spawn ended in receipt state ${a.state}`))}d=JSON.stringify(f)!==e||d;continue}let g=await c.durableTurnEvidence(f.effectiveRole.engine,f.agentPath);if(!(g?.turn==="terminal"&&null!==g.message&&g.message.ts>aI(f.startedAt))){d=JSON.stringify(f)!==e||d;continue}let h=aM(g.message.text);f.completedAt=new Date(g.message.ts).toISOString(),f.output=null,h?"failureReason"in h?(f.state="failed",f.error=h.failureReason):(f.verdict=h.verdict,f.state="pass"===h.verdict.status?"passed":"fail"===h.verdict.status?"failed":"needs_decision",f.error=h.verdict.findings?.[0]??null):(f.state="failed",f.error=aC),d=JSON.stringify(f)!==e||d}return d}function a$(a,b){a.flowId=b.id;let c=b.rounds.at(-1);a.launchId=c?.launchId??a.launchId,a.sessionId=c?.sessionId??a.sessionId,a.agentPath=c?.reviewerPath??a.agentPath,a.conversationId=c?.reviewerConversationId??a.conversationId,a.paneId=c?.reviewerPane?.paneId??a.paneId}let a_=new Set(["approved","done_comment","needs_decision","closed"]),a0="review flow host claim retry: ",a1="review flow relay retry: ";function a2(a,b,c){let d=b.rounds.at(-1)??null,f=b.rounds.findLast(a=>a.reviewHeadSha)?.reviewHeadSha??b.targetSha??null,g=d?.reviewHeadSha??null,h=function(a){let b=[a.createdAt,a.closedAt];for(let c of a.rounds)b.push(c.startedAt,c.spawnStartedAt??null,c.reviewedAt,c.relayStartedAt??null,c.relayedAt,c.terminalAt??null);return b.filter(a=>!!a).sort((a,b)=>b.localeCompare(a))[0]??null}(b),i=h?Date.parse(h):NaN,j=Date.parse(c),k={sourceRevision:b.revision??0,roundCount:b.rounds.length,implementerHeadSha:f,reviewerHeadSha:g,verdict:d?.verdict??null,relayState:b.state,terminalState:a_.has(b.state)?b.state:null,hostClaim:b.hostClaim??null,sourceUpdatedAt:h},l=e().createHash("sha256").update(JSON.stringify({...k,stateDetail:b.stateDetail,implementerPath:b.implementerPath,implementerConversationId:b.implementerConversationId??null,rounds:b.rounds.map(a=>({n:a.n,reviewerPath:a.reviewerPath,reviewerConversationId:a.reviewerConversationId??null,reviewHeadSha:a.reviewHeadSha??null,verdict:a.verdict,reviewedAt:a.reviewedAt,relayStartedAt:a.relayStartedAt??null,relayedAt:a.relayedAt,terminalAt:a.terminalAt??null,error:a.error}))})).digest("hex").slice(0,16);if(a.reviewFlowSync?.generation===l)return!1;let m=a.reviewFlowSync;if(m){let a=m.sourceRevision??0;if(a>0&&k.sourceRevision<=a||k.roundCount<m.roundCount)return!1;let b=m.sourceUpdatedAt?Date.parse(m.sourceUpdatedAt):NaN;if(k.roundCount===m.roundCount&&Number.isFinite(i)&&Number.isFinite(b)&&i<b)return!1}return a$(a,b),g&&(a.expectedReviewHeadSha=g,a.reviewHeadSha=g),a.reviewFlowSync={generation:l,...k,synchronizedAt:c,lagMs:Number.isFinite(i)&&Number.isFinite(j)?Math.max(0,j-i):null},!0}function a3(a,b,c=new Date().toISOString()){let d=new Map(b.map(a=>[a.id,a])),e=new Set(a.flatMap(a=>a.runs.flatMap(a=>a.attempts.flatMap(a=>a.flowId?[a.flowId]:[])))),f=!1;for(let g of a){for(let a of g.stages){if("review-loop"!==a.kind)continue;let c=aH(g,a.id);if(!c||c.flowId||!c.expectedReviewHeadSha)continue;let d=aU(g,a.id);if(!d?.agentPath)continue;let h=b.filter(a=>!e.has(a.id)&&a.baseRef===g.baseRef&&a.targetSha===c.expectedReviewHeadSha&&null===a.closedAt&&"closed"!==a.state&&(a.implementerPath===d.agentPath||!!(d.conversationId&&a.implementerConversationId===d.conversationId)));1===h.length&&(c.flowId=h[0].id,e.add(h[0].id),f=!0)}for(let a of g.runs)for(let b of a.attempts){let a=b.flowId?d.get(b.flowId):null;a&&(f=a2(b,a,c)||f)}}return f}function a4(a,b,c,d){if(null===b.next){a.cursor=null,a.state="completed",a.stateDetail=null,a.pausedState=null,a.closedAt=c.now();return}a.cursor={stageId:b.next,state:"pending",input:d?.output??null,activatedBy:d?{stageId:b.id,attempt:d.n,edge:"pass"}:null},a.state="running",a.stateDetail=null,a.pausedState=null}function a5(a,b,c){let d=`passed but unpublished: ${c}`;b.error=d,a.state="running",a.stateDetail=d}function a6(a,b,c,d){let e=aa(a,d.exec,{acceptedSha:a.lastPassedCommit,publishedSha:a.publishedCommit??null});e.ok?"unreachable"===e.remote?a5(a,c,e.detail):(a.publishedCommit="published"===e.remote?e.sha:null,c.error=null,a4(a,b,d,c)):aQ(a,`publishing the passed stage: ${e.error}`,c)}function a7(a,b,c,d,e){if(!b.onFail)return!1;let f=a.stages.find(a=>a.id===b.onFail.to),g=function(a,b){if(!b.onFail)return 0;let c=aG(a,b.onFail.to);return c?c.attempts.filter(a=>!a.historical&&a.activatedBy?.edge==="fail"&&a.activatedBy.stageId===b.id).length:0}(a,b);return f&&g<b.onFail.maxRounds?(a.cursor={stageId:f.id,state:"pending",input:d,activatedBy:{stageId:b.id,attempt:c.n,edge:"fail"}},a.state="running",a.stateDetail=null,a.pausedState=null,!0):!!f&&(aQ(a,`fail-edge budget exhausted after ${g} round(s): ${e}`,c),!0)}function a8(a,b,c,d){let e="run"===b.kind&&"read-write"===c.effectiveRole.access,f=function(a,b,c,d){let e=d("git",["status","--porcelain"],a.worktreeDir);if(0!==e.code)return W("checking the pipeline worktree",e);if(e.stdout.trim()){if(!c)return{ok:!1,error:`read-only stage ${b} modified the pipeline worktree`};let e=d("git",["add","-A"],a.worktreeDir);if(0!==e.code)return W("staging the passed stage",e);let f=d("git",["commit","-m",`pipeline(${a.id}): complete ${b}`],a.worktreeDir);if(0!==f.code)return W("committing the passed stage",f)}let f=d("git",["rev-parse","HEAD"],a.worktreeDir);return 0===f.code&&f.stdout.trim()?{ok:!0,sha:f.stdout.trim()}:W("recording the passed stage commit",f)}(a,b.id,e,d.exec);if(!f.ok)return void aQ(a,f.error,c);if("review-loop"===b.kind&&f.sha!==c.reviewHeadSha)return void aQ(a,`approved review flow head mismatch during settlement: reviewed ${c.reviewHeadSha??"no exact head"}, settled ${f.sha}`,c);a.lastPassedCommit=f.sha;let g=aa(a,d.exec,{acceptedSha:f.sha,publishedSha:a.publishedCommit??null});g.ok?(a.publishedCommit="published"===g.remote?g.sha:null,c.state="passed",c.completedAt=d.now(),"unreachable"===g.remote&&null===b.next)?a5(a,c,g.detail):(a4(a,b,d,c),"unreachable"===g.remote&&a5(a,c,g.detail)):aQ(a,`publishing the passed stage: ${g.error}`,c)}function a9(a,b,c,d,e,f){if(c.output=d.output,"failureReason"in d){c.completedAt=e.now(),aQ(a,d.failureReason,c);return}if(c.verdict=d.verdict,"pass"!==d.verdict.status){let f;if(c.state="fail"===d.verdict.status?"failed":"needs_decision",c.completedAt=e.now(),"fail"===d.verdict.status&&a7(a,b,c,(f=d.verdict.findings?.length?`Fail verdict findings:
|
|
82
|
+
${d.verdict.findings.map(a=>`- ${a}`).join("\n")}`:"",[d.output,f].filter(Boolean).join("\n\n").trim()||null),d.verdict.findings?.[0]??"stage verdict: fail"))return;aQ(a,d.verdict.findings?.[0]??`stage verdict: ${d.verdict.status}`,c);return}c.state="committing",aR(a,b.id,"committing"),f(),a8(a,b,c,e)}function ba(a,b,c,d){if(b.conversationId){let a=d.pathForConversation(b.conversationId);a&&(b.agentPath=a)}!b.agentPath&&b.sessionId&&(b.agentPath=c.find(a=>i().basename(a.path).includes(b.sessionId))?.path??null),b.agentPath&&(b.conversationId??=d.conversationIdForPath(b.agentPath),b.sessionId??=(0,q.sz)(b.effectiveRole.engine,b.agentPath)?.sessionId??null)}async function bb(a,b,c,d,e,f){let g=aH(a,b.id),h=a.cursor?.state==="pending"&&g&&["passed","failed","needs_decision","skipped"].includes(g.state)?aV(a,b):g??aV(a,b);if(!h||"needs_decision"===a.state)return;if("passed"===h.state&&a.cursor?.state==="committing")return void a6(a,b,h,d);if("committing"===h.state)return void a8(a,b,h,d);if("pending"===h.state){h.state="spawning",h.startedAt=d.now(),aR(a,b.id,"spawning"),az.add(aE(a,b,h)),e();try{var i,j;let c,f,g,k,l=(i=h.effectiveRole,j=h.activatedBy?h.input??"":h.input??aS(a),c=ad(b.prompt,"{{task}}",a.task),c=ad(c,"{{prev.output}}",j),(f=i.promptScaffold?ad(i.promptScaffold,"{{task}}",a.task):null)&&(f=ad(f,"{{prev.output}}",j)),g="read-only"===i.access?"Access: read-only. Inspect and validate freely. Avoid edits, staging, commits, pushes, and other repository mutations.":"Access: read-write. Work only inside this pipeline's dedicated worktree and commit-ready scope.",k=i.roleId?[`Role preset: ${i.roleId} (${i.engine}${i.model?`/${i.model}`:""}${i.effort?`, ${i.effort}`:""}).`,...f?["","Role prompt scaffold:",f]:[]]:[],[c.trim(),"","Pinned task:",a.task,"","Pinned specification and acceptance criteria:",a.spec?.trim()||"No separate pinned specification was supplied.","",...k,g,"Pipeline nesting is forbidden. Never create or start another pipeline from this stage.","","Finish the completed turn with one fenced JSON object as the final block. This block is the only completion authority:","```json",'{"status":"pass","findings":[],"confidence":0.9}',"```","Use pass when the stage contract is complete, fail for a retryable stage failure, and needs_decision when operator judgment is required.","Pass requires findings to be empty or omitted. Use fail or needs_decision when findings describe unresolved work.","Every prose terminal marker must agree with the JSON status: APPROVE=pass, REQUEST_CHANGES=fail, COMMENT=needs_decision. NO FINDINGS agrees with pass.","Human-readable output may appear before the JSON block. Never place text after the block."].join("\n")),m=aG(a,b.id)?.attempts.filter(a=>!a.historical).at(-2)??null,n={role:h.effectiveRole,cwd:a.worktreeDir,prompt:l,parentPath:function(a,b){let c=!0;if(b)for(let d of aT(a,b)){if(d.attempt.agentPath&&("passed"===d.attempt.state||"skipped"===d.attempt.state))return d.attempt.agentPath;c=d.boundary}if(!c)return a.srcPath;let d=b?a.stages.findIndex(a=>a.id===b):a.stages.length;for(let b=d-1;b>=0;b-=1){let c=aH(a,a.stages[b].id);if(c?.agentPath&&("passed"===c.state||"skipped"===c.state))return c.agentPath}return a.srcPath}(a,b.id),clientAttemptId:`pipeline_${a.id}_${b.id}_${h.n}`.replace(/[^A-Za-z0-9_-]/g,"_").slice(0,128),creatorConversationId:a.srcConversationId,supersedes:m?.conversationId??null,membership:{kind:"pipeline",containerId:a.id,role:h.effectiveRole.roleId??"agent",slot:`${b.id}:${h.n}`,stageId:b.id,stageOrder:a.stages.indexOf(b),round:h.n,parentConversationId:null}},o=null;for(let a=1;a<=3;a+=1)try{o=await d.spawnAgent({...n,clientAttemptId:1===a?n.clientAttemptId:`handshake_retry_${a-1}_${n.clientAttemptId}`.slice(0,128)},a=>{h.launchId=a.launchId,h.conversationId=a.conversationId,e()});break}catch(f){let b=f instanceof Error?f.message:String(f),c=bn(b);if(!c||3===a){if(c)throw Error(`stage spawn failed after ${a-1} retries: ${b}`);throw f}let e=d.sleep??(a=>new Promise(b=>setTimeout(b,a)));await e(1e3)}if(!o)throw Error("stage spawn failed without a result");h.launchId=o.launchId,h.conversationId=o.conversationId,h.sessionId=o.sessionId,h.agentPath=o.transcript,h.paneId=o.paneId,h.state="running",aR(a,b.id,"running")}catch(b){aQ(a,b instanceof Error?b.message:String(b),h)}finally{az.delete(aE(a,b,h))}return}if("spawning"===h.state){if(!az.has(aE(a,b,h))&&!h.launchId)return void aQ(a,"stage spawn was interrupted before durable launch evidence",h);if(!az.has(aE(a,b,h))&&h.launchId){let b=d.spawnReceipt(h.launchId);if(!b)return void aQ(a,"stage spawn receipt disappeared before recovery",h);if(h.conversationId=b.conversationId,h.sessionId=b.sessionId,h.agentPath=b.transcript,h.paneId=b.paneId,"failed"===b.state||"conflicted"===b.state||"starting"===b.state&&!b.paneId&&!b.transcript)return void aQ(a,`stage spawn cannot recover from receipt state ${b.state}`,h)}h.state="running"}ba(a,h,c,d);let k=!h.paneId&&h.conversationId?await d.conversationAgentActive(h.conversationId):null;if(!h.agentPath)return void(!1===k?aQ(a,"structured stage ended before its session was discovered",h):h.paneId&&!await d.paneAgentAlive(h.paneId)&&aQ(a,"stage agent exited before its session was discovered",h));let l=c.find(a=>a.path===h.agentPath),m=l?.activity==="live"||l?.activityReason==="jsonl_turn_open"||l?.activityReason==="jsonl_turn_stalled"&&null!==h.paneId,n=!h.paneId&&h.conversationId?await d.conversationHostUnavailableSince?.(h.conversationId):null,o=n?aI(n):0,p=o>0&&aI(d.now())-o>=18e4;if(l&&!1!==k&&m&&!p||!(d.monotonicNow()<f))return;let q=await d.durableTurnEvidence(h.effectiveRole.engine,h.agentPath),r=q?.turn==="terminal"&&null!==q.message&&q.message.ts>aI(h.startedAt);if(q&&r){let c=aM(q.message.text);if(c&&(!p||"verdict"in c)){aO(h,d.now(),q.message.ts),a9(a,b,h,c,d,e);return}if(!p){if(!(d.monotonicNow()<f))return;aP(a,h,d,aN(q.message.text),q.message.ts);return}}if(p){if(h.state="failed",h.completedAt=d.now(),h.error=aC,a7(a,b,h,aC,aC))return;aQ(a,aC,h);return}if(!l){if(q)return;!1===k&&d.monotonicNow()<f?aP(a,h,d,"canonical stage transcript is not yet readable after structured stage termination",null):h.paneId&&!await d.paneAgentAlive(h.paneId)&&d.monotonicNow()<f&&aP(a,h,d,"canonical stage transcript is not yet readable after agent termination",null);return}if(!0===k||q?.turn==="busy"&&!h.paneId)return;let s=d.lastMessage(l);if(!s||s.ts<=aI(h.startedAt))return void(!1===k&&d.monotonicNow()<f?aP(a,h,d,"canonical completed assistant turn has not been ingested after structured stage termination",s?.ts??null):h.paneId&&!await d.paneAgentAlive(h.paneId)&&d.monotonicNow()<f&&aP(a,h,d,"canonical completed assistant turn has not been ingested after agent termination",s?.ts??null));let t=aM(s.text);if(!t){if(!(d.monotonicNow()<f))return;aP(a,h,d,aN(s.text),s.ts);return}aO(h,d.now(),s.ts),a9(a,b,h,t,d,e)}function bc(a,b){let c=b.cursor?.activatedBy?b.cursor.input??"":b.cursor?.input??aS(b);return a.split("{{task}}").join(b.task).split("{{prev.output}}").join(c).trim()}function bd(a,b,c){let d=bc(b.prompt,a),e=c.roleId&&c.promptScaffold?bc(c.promptScaffold,a):"",f=e?e.lastIndexOf("\n\nSafety fences:\n"):-1,g=f>=0?e.slice(0,f):e,h=f>=0?e.slice(f):"";if(d.length+h.length>s.cr)return{error:`review directive is too long for the reviewer note (${d.length+h.length} chars after expansion; the reviewer receives at most ${s.cr}). Shorten this stage's prompt.`};if(!e)return{note:d};let i=`
|
|
83
83
|
|
|
84
84
|
Reviewer role scaffold (${c.roleId}):
|
|
85
|
-
`,j=s.cr-d.length-i.length-h.length,k=j>0?g.slice(0,j):"";return{note:k?`${d}${i}${k}${h}`:`${d}${h}`}}async function bd(a,b,c,d,e){let f=aG(a,b.id),g=a.cursor?.state==="pending"&&f&&["passed","failed","needs_decision","skipped"].includes(f.state)?aU(a,b):f??aU(a,b);if(!g||"needs_decision"===a.state)return;if("passed"===g.state&&a.cursor?.state==="committing")return void a5(a,b,g,d);if("committing"===g.state){let c=bi(a,g,d);return c?void aP(a,c,g):void a7(a,b,g,d)}let h=aT(a,b.id);if(!h?.agentPath)return void aP(a,"review-loop stage requires a passed run session",g);if(g.startedAt||(g.startedAt=d.now()),g.state="reviewing",aQ(a,b.id,"reviewing"),!g.expectedReviewHeadSha){if(!a.lastPassedCommit)return void aP(a,"review-loop stage requires a verified pipeline commit",g);g.expectedReviewHeadSha=a.lastPassedCommit,e()}if(!g.flowId){let f=function(a,b,c){let d=b.expectedReviewHeadSha;if(!d)return{ok:!1,retryable:!1,detail:"review-loop stage requires a verified pipeline commit"};let e=Z(a,c.exec);if(!e.ok)return{ok:!1,retryable:!1,detail:`review stage could not verify the pipeline head before publishing: ${e.error}`};if(e.sha!==d)return{ok:!1,retryable:!1,detail:`review stage head mismatch: the accepted review head is ${d}, but the pipeline worktree is at ${e.sha}; nothing was published`};let f=_(a,c.exec,{acceptedSha:d});return f.ok?"unreachable"===f.remote?{ok:!1,retryable:!0,detail:`passed but unpublished: ${f.detail}`}:"unavailable"===f.remote?{ok:!1,retryable:!1,detail:`review stage requires a published pipeline branch, but this repository has no origin remote to publish ${d} to`}:(a.publishedCommit=f.sha,{ok:!0}):{ok:!1,retryable:!1,detail:`review stage could not publish the accepted head ${d}: ${f.error}`}}(a,g,d);if(!f.ok){if(f.retryable){g.error=f.detail,a.state="running",a.stateDetail=f.detail;return}aP(a,f.detail,g);return}g.error=null,a.stateDetail=null,e();let i=d.findFlow(h.agentPath,h.conversationId,a.baseRef,g.expectedReviewHeadSha);if(i){aZ(g,i),e();return}e();let j={engine:h.effectiveRole.engine,model:h.effectiveRole.model,effort:h.effectiveRole.effort},k={engine:g.effectiveRole.engine,model:g.effectiveRole.model,effort:g.effectiveRole.effort},l=await d.createFlow({implementerPath:h.agentPath,...h.conversationId?{implementerConversationId:h.conversationId}:{},deliverKickoff:!1,roles:{implementer:j,reviewer:k},baseMode:"head",baseRef:a.baseRef,headRef:a.branch,targetSha:g.expectedReviewHeadSha,spec:a.spec??a.task,mode:"auto",reviewerMode:"headless",roundLimit:5},c);if(!l.flow)return void aP(a,`creating the review flow failed: ${l.error??"unknown error"}`,g);if(aZ(g,l.flow),e(),"paused"===l.flow.state)return void aP(a,`review flow startup paused: ${l.flow.stateDetail??"kickoff delivery failed"}`,g);let m=bc(a,b,g.effectiveRole);if("error"in m)return void aP(a,m.error,g);let n=d.patchFlow(l.flow.id,"advance",m.note);return void(n.error&&aP(a,`advancing the review flow failed: ${n.error}`,g))}let i=d.getFlow(g.flowId);if(!i)return void aP(a,"embedded review flow record disappeared",g);if("paused"===i.state){let b=i.pausedState&&"paused"!==i.pausedState?i.pausedState:"unknown phase";aP(a,`review flow paused in ${b}: ${i.stateDetail??"operator decision required"}`,g);return}if("waiting_ready"===i.state&&0===i.rounds.length){let c=bc(a,b,g.effectiveRole);if("error"in c)return void aP(a,c.error,g);let e=d.patchFlow(i.id,"advance",c.note);return void(e.error&&aP(a,`advancing the review flow failed: ${e.error}`,g))}aZ(g,i);let j=i.rounds.findLast(a=>a.reviewHeadSha)?.reviewHeadSha??null;j&&g.reviewHeadSha!==j&&(g.expectedReviewHeadSha=j,g.reviewHeadSha=j,e());let k=function(a){if("relaying"!==a.state||!a.stateDetail?.includes("retrying automatically"))return null;let b=a.hostClaim?`structured host claim ${a.hostClaim.sessionKey} on account ${a.hostClaim.accountRef} failed:`:null,c=b&&a.stateDetail.includes(b)?a_:a0;return`${c}${a.stateDetail}`}(i);if(k?a.stateDetail=k:(a.stateDetail?.startsWith(a_)||a.stateDetail?.startsWith(a0))&&(a.stateDetail=null),"approved"===i.state){let c=bi(a,g,d);if(c)return void aP(a,c,g);g.output=`Review loop approved after ${i.rounds.length} round(s).`,g.verdict={status:"pass",confidence:1},g.state="committing",aQ(a,b.id,"committing"),e(),a7(a,b,g,d)}else{let b=bj(i);b&&aP(a,b,g)}}async function be(a,b,c,d,e){let f=JSON.stringify(a);if("provisioning"===a.state){if(!a.baseBranch||!a.baseRef||!a.lastPassedCommit){let b=X(a.repoDir,{},c.exec);if(!b.ok)return aP(a,b.error),JSON.stringify(a)!==f;a.baseBranch=b.baseBranch,a.baseRef=b.baseRef,a.lastPassedCommit=b.baseRef,d()}let b=function(a,b){if(!a.baseBranch||!/^[0-9a-f]{40}$/i.test(a.baseRef))return{ok:!1,error:"the pipeline base is unresolved"};let c=b("git",["worktree","add","-b",a.branch,a.worktreeDir,a.baseRef],a.repoDir);if(0!==c.code){let d=b("git",["rev-parse","--abbrev-ref","HEAD"],a.worktreeDir);if(0!==d.code||d.stdout.trim()!==a.branch)return V("git worktree add",c)}let d=b("git",["rev-parse","HEAD"],a.worktreeDir);return 0===d.code&&d.stdout.trim()?d.stdout.trim()!==a.baseRef?{ok:!1,error:"the pipeline worktree does not match its persisted base"}:{ok:!0,sha:a.baseRef,baseBranch:a.baseBranch}:V("resolving the pipeline base ref",d)}(a,c.exec);b.ok?(a.baseBranch=b.baseBranch??"",a.baseRef=b.sha,a.lastPassedCommit=b.sha,a.state="running",a.stateDetail=null):aP(a,b.error)}else if("running"===a.state){let f=aE(a);f?"run"===f.kind?await ba(a,f,b,c,d,e):await bd(a,f,b,c,d):aP(a,"pipeline cursor points to an unknown stage")}return JSON.stringify(a)!==f}let bf=globalThis,bg=new Set(["waiting_ready","spawn_pending","spawning","reviewing","relay_pending","relaying","fixing","approved","paused","needs_decision","done_comment","closed"]),bh=["review flow startup paused:","review flow paused in ","review flow paused during startup:","advancing the review flow failed:","review loop ended in ","embedded review flow record disappeared"];function bi(a,b,c){if(!b.reviewHeadSha||b.expectedReviewHeadSha!==b.reviewHeadSha)return`approved review flow envelope mismatch: expected ${b.expectedReviewHeadSha??"no exact head"}, reviewed ${b.reviewHeadSha??"no exact head"}`;let d=Z(a,c.exec);if(!d.ok)return`approved review flow could not verify the current pipeline head: ${d.error}`;if(b.reviewHeadSha!==d.sha)return`approved review flow head mismatch: reviewed ${b.reviewHeadSha}, current pipeline head is ${d.sha}`;let e=function(a,b){if(!W(a.branch))return{ok:!1,error:"the pipeline branch is invalid"};let c=b("git",["ls-remote","--heads","origin",`refs/heads/${a.branch}`],a.worktreeDir);if(0!==c.code)return V("checking the remote pipeline branch",c);let d=c.stdout.trim().split(/\s+/)[0]??"";return/^[0-9a-f]{40}$/i.test(d)?{ok:!0,sha:d}:{ok:!1,error:"the remote pipeline branch has no exact commit SHA"}}(a,c.exec);return e.ok?b.reviewHeadSha!==e.sha?`approved review flow head mismatch: reviewed ${b.reviewHeadSha}, remote pipeline head is ${e.sha}`:null:`approved review flow could not verify the remote pipeline head: ${e.error}`}function bj(a){return"needs_decision"!==a.state&&"done_comment"!==a.state&&"closed"!==a.state?null:`review loop ended in ${a.state}: ${a.stateDetail??"operator decision required"}`}async function bk(a,b,c){if("needs_decision"!==a.state)return!1;let d=aE(a);if(!d||"run"!==d.kind)return!1;let e=aG(a,d.id),f=e?.verdictRecovery;if(!e?.agentPath||f?.state!=="exhausted")return!1;let g=await b.durableTurnEvidence(e.effectiveRole.engine,e.agentPath),h=g?.turn==="terminal"?g.message:null;if(!h||h.ts<=aH(e.startedAt)||h.ts<=(f.messageTs??0))return!1;let i=aL(h.text);return!!i&&!("failureReason"in i)&&(e.state="running",e.completedAt=null,e.error=null,a.state="running",a.stateDetail=null,aN(e,b.now(),h.ts),a8(a,d,e,i,b,c),!0)}function bl(a,b){let c=b.error??a.stateDetail??"";return c.startsWith("stage spawn")||bm(c)}function bm(a){return a.includes("structured delivery controller is unavailable")||a.includes("structured initial message")||a.includes("runtime host request timed out")}async function bn(a,b){let c=a.unconfirmedHosts;if(!c?.length)return!1;let d=[];for(let a of c){let c={stageId:a.stageId,attempt:a.attempt,conversationId:a.conversationId,agentPath:a.agentPath,paneId:a.paneId??null},e=await b.stageHostResident(c),f=!e&&!!c.paneId&&await b.paneAgentAlive(c.paneId);(e||f)&&d.push(a)}return d.length!==c.length&&(a.unconfirmedHosts=d.length>0?d:void 0,a.unconfirmedHosts||"closed"!==a.state||(a.hiddenAt=a.closedAt??b.now()),!0)}async function bo(a,b){if("completed"!==a.state||a.terminalReap?.settledAt)return!1;let c=a.terminalReap??{rounds:0,stopped:0,lastAt:b.now(),settledAt:null},d=b.monotonicNow()+5e3,e=bL(a).filter(({target:b,turnSettled:c})=>c&&!(b.conversationId&&b.conversationId===a.srcConversationId)&&!(b.agentPath&&b.agentPath===a.srcPath)),f=[],g=!1,h=!1;for(let[a,{target:i}]of e.entries()){if(b.monotonicNow()>=d){h=!0,c.rounds+1>=5&&f.push(...e.slice(a).map(({target:a})=>({...a,operationId:null,detail:"terminal reap budget expired before this host was probed"})));break}if(!await b.stageHostResident(i)||i.conversationId&&await b.conversationAgentActive(i.conversationId)===!0)continue;g=!0;let j=await b.stopStageAgent(i);"stopped"===j.outcome?c.stopped+=1:"unconfirmed"===j.outcome?f.push({...i,operationId:j.operationId,detail:j.detail}):"failed"===j.outcome&&f.push({...i,operationId:null,detail:j.error})}if(c.lastAt=b.now(),(g||h)&&(c.rounds+=1),(!h&&0===f.length||c.rounds>=5)&&(c.settledAt=c.lastAt,f.length>0)){let b=new Set((a.unconfirmedHosts??[]).map(a=>`${a.stageId}:${a.attempt}`));a.unconfirmedHosts=[...a.unconfirmedHosts??[],...f.filter(a=>!b.has(`${a.stageId}:${a.attempt}`)).map(a=>({stageId:a.stageId,attempt:a.attempt,conversationId:a.conversationId,agentPath:a.agentPath,paneId:a.paneId,operationId:a.operationId,detail:a.detail,at:c.settledAt}))]}return a.terminalReap=c,!0}async function bp(a,b=ax()){if(bf.__llvPipelineTick)return{pipelines:[],changed:!1};bf.__llvPipelineTick=!0;let c=!1,d=b.monotonicNow()+15e3;try{let e=await (0,ao.M7)(async(c,e)=>{let f=!1;return await (0,o.pV)(c,async c=>{let g=()=>e([c]),h=function(a,b){let c=!1;for(let d of a.runs)for(let a of d.attempts){let d=a.flowId?b.getFlow(a.flowId):null;d&&(c=a1(a,d,b.now())||c)}return c}(c,b);h=function(a,b){let c=!1;for(let d of b.pipelineAdoptionCandidates(a.id)){let b=aF(a,d.stageId);b?.attempts.find(a=>a.conversationId===d.conversationId||null!==d.launchId&&a.launchId===d.launchId)||(c=null!==aW(a,d.stageId,d)||c)}return c}(c,b)||h,h=await aY(c,a,b)||h,h=function(a,b){let c=!1;if(a.srcConversationId){let d=b.pathForConversation(a.srcConversationId);d&&d!==a.srcPath&&(a.srcPath=d,c=!0)}for(let d of a.runs)for(let a of d.attempts){if(!a.conversationId)continue;let d=b.pathForConversation(a.conversationId);d&&d!==a.agentPath&&(a.agentPath=d,c=!0)}return c}(c,b)||h,h=await bk(c,b,g)||h,h=function(a,b){if("needs_decision"!==a.state)return!1;let c=aE(a);if(!c||"run"!==c.kind)return!1;let d=aG(a,c.id);if(!d||"needs_decision"!==d.state||null!==d.completedAt||null!==d.output||null!==d.verdict||d.error!==aA)return!1;let e=b.now();return d.verdictRecovery={state:"pending",checks:0,maxChecks:3,startedAt:e,lastCheckedAt:e,nextCheckAt:e,reason:aA,messageTs:null},d.state="running",d.error=null,a.state="running",a.stateDetail=null,aQ(a,c.id,"running"),!0}(c,b)||h,h=function(a,b){if("needs_decision"!==a.state)return!1;let c=aE(a);if(!c||"run"!==c.kind)return!1;let d=aG(a,c.id);if(!d?.launchId||d.paneId||d.verdict||d.completedAt||!bl(a,d))return!1;let e=b.spawnReceipt(d.launchId);return e?.state==="completed"&&e.launchId===d.launchId&&e.conversationId===d.conversationId&&(d.sessionId=e.sessionId,d.agentPath=e.transcript,d.paneId=e.paneId,d.state="running",d.error=null,a.state="running",a.stateDetail=null,aQ(a,c.id,"running"),!0)}(c,b)||h,h=function(a,b,c){if("needs_decision"!==a.state)return!1;let d=aE(a);if(d?.kind!=="review-loop")return!1;let e=aG(a,d.id),f=e?.error,g=e?.flowId?b.getFlow(e.flowId):null;if(!f||!bh.some(a=>f.startsWith(a))||!g||!bg.has(g.state))return!1;let h=function(a){if("needs_decision"!==a.state&&"done_comment"!==a.state&&"closed"!==a.state)return null;let b=a.rounds.findLast(a=>null!==a.verdict);if(!b?.findingsPath||"APPROVE"===b.verdict)return null;let c=(0,t.V_)(b);if(!c||c.verdict!==b.verdict)return null;let d=(0,J.wV)(c.content,b.reviewedAt),e=(d?.findings??[]).map(b=>(function(a,b){let c=b.file?.trim()??"",d=c;if(c&&i().isAbsolute(c)){let b=i().relative(a.cwd,c);d=!b||b.startsWith("..")||i().isAbsolute(b)?i().basename(c):b}let e=d?`${I(d,400)}${b.line?`:${b.line}`:""}`:b.line?`line ${b.line}`:"";return[b.severity,e,I(b.title,400)].filter(Boolean).join(" — ")})(a,b)),f=[...a.stateDetail?[I(a.stateDetail,2e3)]:[],...e].slice(0,50);return 0===e.length&&f.length<50&&f.push(`Review flow round ${b.n} returned ${c.verdict}; open the round artifact for details.`),{verdict:{status:"REQUEST_CHANGES"===c.verdict?"fail":"needs_decision",findings:f,confidence:1},output:`Review flow round ${b.n}: ${c.verdict}
|
|
85
|
+
`,j=s.cr-d.length-i.length-h.length,k=j>0?g.slice(0,j):"";return{note:k?`${d}${i}${k}${h}`:`${d}${h}`}}async function be(a,b,c,d,e){let f=aH(a,b.id),g=a.cursor?.state==="pending"&&f&&["passed","failed","needs_decision","skipped"].includes(f.state)?aV(a,b):f??aV(a,b);if(!g||"needs_decision"===a.state)return;if("passed"===g.state&&a.cursor?.state==="committing")return void a6(a,b,g,d);if("committing"===g.state){let c=bj(a,g,d);return c?void aQ(a,c,g):void a8(a,b,g,d)}let h=aU(a,b.id);if(!h?.agentPath)return void aQ(a,"review-loop stage requires a passed run session",g);if(g.startedAt||(g.startedAt=d.now()),g.state="reviewing",aR(a,b.id,"reviewing"),!g.expectedReviewHeadSha){if(!a.lastPassedCommit)return void aQ(a,"review-loop stage requires a verified pipeline commit",g);g.expectedReviewHeadSha=a.lastPassedCommit,e()}if(!g.flowId){let f=function(a,b,c){let d=b.expectedReviewHeadSha;if(!d)return{ok:!1,retryable:!1,detail:"review-loop stage requires a verified pipeline commit"};let e=$(a,c.exec);if(!e.ok)return{ok:!1,retryable:!1,detail:`review stage could not verify the pipeline head before publishing: ${e.error}`};if(e.sha!==d)return{ok:!1,retryable:!1,detail:`review stage head mismatch: the accepted review head is ${d}, but the pipeline worktree is at ${e.sha}; nothing was published`};let f=aa(a,c.exec,{acceptedSha:d});return f.ok?"unreachable"===f.remote?{ok:!1,retryable:!0,detail:`passed but unpublished: ${f.detail}`}:"unavailable"===f.remote?{ok:!1,retryable:!1,detail:`review stage requires a published pipeline branch, but this repository has no origin remote to publish ${d} to`}:(a.publishedCommit=f.sha,{ok:!0}):{ok:!1,retryable:!1,detail:`review stage could not publish the accepted head ${d}: ${f.error}`}}(a,g,d);if(!f.ok){if(f.retryable){g.error=f.detail,a.state="running",a.stateDetail=f.detail;return}aQ(a,f.detail,g);return}g.error=null,a.stateDetail=null,e();let i=d.findFlow(h.agentPath,h.conversationId,a.baseRef,g.expectedReviewHeadSha);if(i){a$(g,i),e();return}e();let j={engine:h.effectiveRole.engine,model:h.effectiveRole.model,effort:h.effectiveRole.effort},k={engine:g.effectiveRole.engine,model:g.effectiveRole.model,effort:g.effectiveRole.effort},l=await d.createFlow({implementerPath:h.agentPath,...h.conversationId?{implementerConversationId:h.conversationId}:{},deliverKickoff:!1,roles:{implementer:j,reviewer:k},baseMode:"head",baseRef:a.baseRef,headRef:a.branch,targetSha:g.expectedReviewHeadSha,spec:a.spec??a.task,mode:"auto",reviewerMode:"headless",roundLimit:5},c);if(!l.flow)return void aQ(a,`creating the review flow failed: ${l.error??"unknown error"}`,g);if(a$(g,l.flow),e(),"paused"===l.flow.state)return void aQ(a,`review flow startup paused: ${l.flow.stateDetail??"kickoff delivery failed"}`,g);let m=bd(a,b,g.effectiveRole);if("error"in m)return void aQ(a,m.error,g);let n=d.patchFlow(l.flow.id,"advance",m.note);return void(n.error&&aQ(a,`advancing the review flow failed: ${n.error}`,g))}let i=d.getFlow(g.flowId);if(!i)return void aQ(a,"embedded review flow record disappeared",g);if("paused"===i.state){let b=i.pausedState&&"paused"!==i.pausedState?i.pausedState:"unknown phase";aQ(a,`review flow paused in ${b}: ${i.stateDetail??"operator decision required"}`,g);return}if("waiting_ready"===i.state&&0===i.rounds.length){let c=bd(a,b,g.effectiveRole);if("error"in c)return void aQ(a,c.error,g);let e=d.patchFlow(i.id,"advance",c.note);return void(e.error&&aQ(a,`advancing the review flow failed: ${e.error}`,g))}a$(g,i);let j=i.rounds.findLast(a=>a.reviewHeadSha)?.reviewHeadSha??null;j&&g.reviewHeadSha!==j&&(g.expectedReviewHeadSha=j,g.reviewHeadSha=j,e());let k=function(a){if("relaying"!==a.state||!a.stateDetail?.includes("retrying automatically"))return null;let b=a.hostClaim?`structured host claim ${a.hostClaim.sessionKey} on account ${a.hostClaim.accountRef} failed:`:null,c=b&&a.stateDetail.includes(b)?a0:a1;return`${c}${a.stateDetail}`}(i);if(k?a.stateDetail=k:(a.stateDetail?.startsWith(a0)||a.stateDetail?.startsWith(a1))&&(a.stateDetail=null),"approved"===i.state){let c=bj(a,g,d);if(c)return void aQ(a,c,g);g.output=`Review loop approved after ${i.rounds.length} round(s).`,g.verdict={status:"pass",confidence:1},g.state="committing",aR(a,b.id,"committing"),e(),a8(a,b,g,d)}else{let b=bk(i);b&&aQ(a,b,g)}}async function bf(a,b,c,d,e){let f=JSON.stringify(a);if("provisioning"===a.state){if(!a.baseBranch||!a.baseRef||!a.lastPassedCommit){let b=Y(a.repoDir,{},c.exec);if(!b.ok)return aQ(a,b.error),JSON.stringify(a)!==f;a.baseBranch=b.baseBranch,a.baseRef=b.baseRef,a.lastPassedCommit=b.baseRef,d()}let b=function(a,b){if(!a.baseBranch||!/^[0-9a-f]{40}$/i.test(a.baseRef))return{ok:!1,error:"the pipeline base is unresolved"};let c=b("git",["worktree","add","-b",a.branch,a.worktreeDir,a.baseRef],a.repoDir);if(0!==c.code){let d=b("git",["rev-parse","--abbrev-ref","HEAD"],a.worktreeDir);if(0!==d.code||d.stdout.trim()!==a.branch)return W("git worktree add",c)}let d=b("git",["rev-parse","HEAD"],a.worktreeDir);return 0===d.code&&d.stdout.trim()?d.stdout.trim()!==a.baseRef?{ok:!1,error:"the pipeline worktree does not match its persisted base"}:{ok:!0,sha:a.baseRef,baseBranch:a.baseBranch}:W("resolving the pipeline base ref",d)}(a,c.exec);b.ok?(a.baseBranch=b.baseBranch??"",a.baseRef=b.sha,a.lastPassedCommit=b.sha,a.state="running",a.stateDetail=null):aQ(a,b.error)}else if("running"===a.state){let f=aF(a);f?"run"===f.kind?await bb(a,f,b,c,d,e):await be(a,f,b,c,d):aQ(a,"pipeline cursor points to an unknown stage")}return JSON.stringify(a)!==f}let bg=globalThis,bh=new Set(["waiting_ready","spawn_pending","spawning","reviewing","relay_pending","relaying","fixing","approved","paused","needs_decision","done_comment","closed"]),bi=["review flow startup paused:","review flow paused in ","review flow paused during startup:","advancing the review flow failed:","review loop ended in ","embedded review flow record disappeared"];function bj(a,b,c){if(!b.reviewHeadSha||b.expectedReviewHeadSha!==b.reviewHeadSha)return`approved review flow envelope mismatch: expected ${b.expectedReviewHeadSha??"no exact head"}, reviewed ${b.reviewHeadSha??"no exact head"}`;let d=$(a,c.exec);if(!d.ok)return`approved review flow could not verify the current pipeline head: ${d.error}`;if(b.reviewHeadSha!==d.sha)return`approved review flow head mismatch: reviewed ${b.reviewHeadSha}, current pipeline head is ${d.sha}`;let e=function(a,b){if(!X(a.branch))return{ok:!1,error:"the pipeline branch is invalid"};let c=b("git",["ls-remote","--heads","origin",`refs/heads/${a.branch}`],a.worktreeDir);if(0!==c.code)return W("checking the remote pipeline branch",c);let d=c.stdout.trim().split(/\s+/)[0]??"";return/^[0-9a-f]{40}$/i.test(d)?{ok:!0,sha:d}:{ok:!1,error:"the remote pipeline branch has no exact commit SHA"}}(a,c.exec);return e.ok?b.reviewHeadSha!==e.sha?`approved review flow head mismatch: reviewed ${b.reviewHeadSha}, remote pipeline head is ${e.sha}`:null:`approved review flow could not verify the remote pipeline head: ${e.error}`}function bk(a){return"needs_decision"!==a.state&&"done_comment"!==a.state&&"closed"!==a.state?null:`review loop ended in ${a.state}: ${a.stateDetail??"operator decision required"}`}async function bl(a,b,c){if("needs_decision"!==a.state)return!1;let d=aF(a);if(!d||"run"!==d.kind)return!1;let e=aH(a,d.id),f=e?.verdictRecovery;if(!e?.agentPath||f?.state!=="exhausted")return!1;let g=await b.durableTurnEvidence(e.effectiveRole.engine,e.agentPath),h=g?.turn==="terminal"?g.message:null;if(!h||h.ts<=aI(e.startedAt)||h.ts<=(f.messageTs??0))return!1;let i=aM(h.text);return!!i&&!("failureReason"in i)&&(e.state="running",e.completedAt=null,e.error=null,a.state="running",a.stateDetail=null,aO(e,b.now(),h.ts),a9(a,d,e,i,b,c),!0)}function bm(a,b){let c=b.error??a.stateDetail??"";return c.startsWith("stage spawn")||bn(c)}function bn(a){return a.includes("structured delivery controller is unavailable")||a.includes("structured initial message")||a.includes("runtime host request timed out")}async function bo(a,b){let c=a.unconfirmedHosts;if(!c?.length)return!1;let d=[];for(let a of c){let c={stageId:a.stageId,attempt:a.attempt,conversationId:a.conversationId,agentPath:a.agentPath,paneId:a.paneId??null},e=await b.stageHostResident(c),f=!e&&!!c.paneId&&await b.paneAgentAlive(c.paneId);(e||f)&&d.push(a)}return d.length!==c.length&&(a.unconfirmedHosts=d.length>0?d:void 0,a.unconfirmedHosts||"closed"!==a.state||(a.hiddenAt=a.closedAt??b.now()),!0)}async function bp(a,b){if("completed"!==a.state||a.terminalReap?.settledAt)return!1;let c=a.terminalReap??{rounds:0,stopped:0,lastAt:b.now(),settledAt:null},d=b.monotonicNow()+5e3,e=bM(a).filter(({target:b,turnSettled:c})=>c&&!(b.conversationId&&b.conversationId===a.srcConversationId)&&!(b.agentPath&&b.agentPath===a.srcPath)),f=[],g=!1,h=!1;for(let[a,{target:i}]of e.entries()){if(b.monotonicNow()>=d){h=!0,c.rounds+1>=5&&f.push(...e.slice(a).map(({target:a})=>({...a,operationId:null,detail:"terminal reap budget expired before this host was probed"})));break}if(!await b.stageHostResident(i)||i.conversationId&&await b.conversationAgentActive(i.conversationId)===!0)continue;g=!0;let j=await b.stopStageAgent(i);"stopped"===j.outcome?c.stopped+=1:"unconfirmed"===j.outcome?f.push({...i,operationId:j.operationId,detail:j.detail}):"failed"===j.outcome&&f.push({...i,operationId:null,detail:j.error})}if(c.lastAt=b.now(),(g||h)&&(c.rounds+=1),(!h&&0===f.length||c.rounds>=5)&&(c.settledAt=c.lastAt,f.length>0)){let b=new Set((a.unconfirmedHosts??[]).map(a=>`${a.stageId}:${a.attempt}`));a.unconfirmedHosts=[...a.unconfirmedHosts??[],...f.filter(a=>!b.has(`${a.stageId}:${a.attempt}`)).map(a=>({stageId:a.stageId,attempt:a.attempt,conversationId:a.conversationId,agentPath:a.agentPath,paneId:a.paneId,operationId:a.operationId,detail:a.detail,at:c.settledAt}))]}return a.terminalReap=c,!0}async function bq(a,b=ay()){if(bg.__llvPipelineTick)return{pipelines:[],changed:!1};bg.__llvPipelineTick=!0;let c=!1,d=b.monotonicNow()+15e3;try{let e=await (0,ap.M7)(async(c,e)=>{let f=!1;return await (0,o.pV)(c,async c=>{let g=()=>e([c]),h=function(a,b){let c=!1;for(let d of a.runs)for(let a of d.attempts){let d=a.flowId?b.getFlow(a.flowId):null;d&&(c=a2(a,d,b.now())||c)}return c}(c,b);h=function(a,b){let c=!1;for(let d of b.pipelineAdoptionCandidates(a.id)){let b=aG(a,d.stageId);b?.attempts.find(a=>a.conversationId===d.conversationId||null!==d.launchId&&a.launchId===d.launchId)||(c=null!==aX(a,d.stageId,d)||c)}return c}(c,b)||h,h=await aZ(c,a,b)||h,h=function(a,b){let c=!1;if(a.srcConversationId){let d=b.pathForConversation(a.srcConversationId);d&&d!==a.srcPath&&(a.srcPath=d,c=!0)}for(let d of a.runs)for(let a of d.attempts){if(!a.conversationId)continue;let d=b.pathForConversation(a.conversationId);d&&d!==a.agentPath&&(a.agentPath=d,c=!0)}return c}(c,b)||h,h=await bl(c,b,g)||h,h=function(a,b){if("needs_decision"!==a.state)return!1;let c=aF(a);if(!c||"run"!==c.kind)return!1;let d=aH(a,c.id);if(!d||"needs_decision"!==d.state||null!==d.completedAt||null!==d.output||null!==d.verdict||d.error!==aB)return!1;let e=b.now();return d.verdictRecovery={state:"pending",checks:0,maxChecks:3,startedAt:e,lastCheckedAt:e,nextCheckAt:e,reason:aB,messageTs:null},d.state="running",d.error=null,a.state="running",a.stateDetail=null,aR(a,c.id,"running"),!0}(c,b)||h,h=function(a,b){if("needs_decision"!==a.state)return!1;let c=aF(a);if(!c||"run"!==c.kind)return!1;let d=aH(a,c.id);if(!d?.launchId||d.paneId||d.verdict||d.completedAt||!bm(a,d))return!1;let e=b.spawnReceipt(d.launchId);return e?.state==="completed"&&e.launchId===d.launchId&&e.conversationId===d.conversationId&&(d.sessionId=e.sessionId,d.agentPath=e.transcript,d.paneId=e.paneId,d.state="running",d.error=null,a.state="running",a.stateDetail=null,aR(a,c.id,"running"),!0)}(c,b)||h,h=function(a,b,c){if("needs_decision"!==a.state)return!1;let d=aF(a);if(d?.kind!=="review-loop")return!1;let e=aH(a,d.id),f=e?.error,g=e?.flowId?b.getFlow(e.flowId):null;if(!f||!bi.some(a=>f.startsWith(a))||!g||!bh.has(g.state))return!1;let h=function(a){if("needs_decision"!==a.state&&"done_comment"!==a.state&&"closed"!==a.state)return null;let b=a.rounds.findLast(a=>null!==a.verdict);if(!b?.findingsPath||"APPROVE"===b.verdict)return null;let c=(0,t.V_)(b);if(!c||c.verdict!==b.verdict)return null;let d=(0,K.wV)(c.content,b.reviewedAt),e=(d?.findings??[]).map(b=>(function(a,b){let c=b.file?.trim()??"",d=c;if(c&&i().isAbsolute(c)){let b=i().relative(a.cwd,c);d=!b||b.startsWith("..")||i().isAbsolute(b)?i().basename(c):b}let e=d?`${J(d,400)}${b.line?`:${b.line}`:""}`:b.line?`line ${b.line}`:"";return[b.severity,e,J(b.title,400)].filter(Boolean).join(" — ")})(a,b)),f=[...a.stateDetail?[J(a.stateDetail,2e3)]:[],...e].slice(0,50);return 0===e.length&&f.length<50&&f.push(`Review flow round ${b.n} returned ${c.verdict}; open the round artifact for details.`),{verdict:{status:"REQUEST_CHANGES"===c.verdict?"fail":"needs_decision",findings:f,confidence:1},output:`Review flow round ${b.n}: ${c.verdict}
|
|
86
86
|
|
|
87
|
-
${f.map(a=>`- ${a}`).join("\n")}`}}(g);return h?(a1(e,g,b.now()),a8(a,d,e,h,b,c),!0):("paused"!==g.state||!!(0,s.F4)(g)&&!b.patchFlow(g.id,"resume").error&&!!(g=b.getFlow(g.id))&&"relaying"===g.state)&&f!==bj(g)&&(a.state="running",a.stateDetail=null,e.state="reviewing",e.error=null,a1(e,g,b.now()),aQ(a,d.id,"reviewing"),!0)}(c,b,g)||h,h=await bn(c,b)||h,h=await bo(c,b)||h,az.has(c.state)||"paused"===c.state||"needs_decision"===c.state||(h=await be(c,a,b,g,d)||h),h&&(f=!0,g())},{batchSize:4,timeBudgetMs:16}),{pipelines:c,changed:f}});return c=e.pipelines.some(a=>"running"===a.state&&a.cursor?.state==="pending"),e}catch(a){if(!(a instanceof ao.mZ))throw a;return console.error("[pipelines] skipping tick; registry unreadable",a),{pipelines:[],changed:!1}}finally{bf.__llvPipelineTick=!1,c&&(0,R.L1)()}}let bq="{id, kind, prompt, next, onFail?, role?, engine?/model?/effort?/access? overrides}",br=`non-empty string up to ${aa.Y3} characters`,bs=`{roleId: one of ${aj.join(" | ")}, params?: {<key>: string | number}} — runtime overrides belong on the stage, not in role`,bt=`one of ${aj.join(" | ")}`,bu="object of the role's declared parameters, values string or number",bv=`null, or {to: <existing stage id>, maxRounds?: 1–${aa.e7}} — run stages only`;function bw(a){return{error:an(a),violations:a}}function bx(a,b,c,d=aa.WD){if(!Array.isArray(a)||a.length<d||a.length>aa.IO)return bw([{field:"stages",message:0===d?`pipelines require at most ${aa.IO} stages`:`pipelines require ${aa.WD}–${aa.IO} stages`,expected:`array of ${d}–${aa.IO} stage objects`}]);let e=[],f=new Set,g=[],h=[],i=!0;for(let[d,j]of a.entries()){let a=a=>`stages[${d}]${a?`.${a}`:""}`;if(!j||"object"!=typeof j||Array.isArray(j)){g.push({field:a(""),message:"invalid pipeline stage",expected:bq}),i=!1;continue}let k=g.length,l="string"==typeof j.id?j.id.trim():"",m=/^[A-Za-z0-9_-]{1,64}$/.test(l)&&!f.has(l);m||g.push({field:a("id"),message:"stage ids must be unique URL-safe names",expected:"1–64 characters of A–Z a–z 0–9 _ -, unique across stages"});let n=c?.get(l),o="run"===j.kind||"review-loop"===j.kind;o||g.push({field:a("kind"),message:"stage kind must be run or review-loop",expected:'"run" | "review-loop"'});let p=j.onFail,q=!0;if(null!=p)if(!p||"object"!=typeof p||Array.isArray(p))g.push({field:a("onFail"),message:`stage ${l} onFail must be an object or null`,expected:bv}),q=!1;else{"string"==typeof p.to&&p.to.trim()||(g.push({field:a("onFail.to"),message:`stage ${l} onFail requires a target stage id`,expected:"id of an existing stage"}),q=!1);let b=void 0===p.maxRounds?aa.Ty:p.maxRounds;(!Number.isInteger(b)||b<1||b>aa.e7)&&(g.push({field:a("onFail.maxRounds"),message:`stage ${l} onFail maxRounds must be an integer between 1 and ${aa.e7}`,expected:`integer 1–${aa.e7} (default ${aa.Ty})`}),q=!1)}let r="string"==typeof j.prompt?j.prompt.trim():"";r?r.length>aa.Y3&&g.push({field:a("prompt"),message:`stage ${l} prompt exceeds ${aa.Y3} characters`,expected:br}):g.push({field:a("prompt"),message:`stage ${l} prompt is required`,expected:br});let s=j.role,t=!0;void 0!==s&&(!s||"object"!=typeof s||Array.isArray(s))&&(g.push({field:a("role"),message:`stage ${l} role must be an object`,expected:bs}),t=!1),t&&s&&Object.keys(s).some(a=>"roleId"!==a&&"params"!==a)&&(g.push({field:a("role"),message:`stage ${l} role only accepts roleId and params; place runtime overrides on the stage`,expected:bs}),t=!1);let u=t&&s&&"string"==typeof s.roleId?s.roleId.trim():"";t&&s&&!u&&(g.push({field:a("role.roleId"),message:`stage ${l} roleId is required when role is present`,expected:bt}),t=!1);let v=t?s?.params:void 0;void 0!==v&&(!v||"object"!=typeof v||Array.isArray(v))&&(g.push({field:a("role.params"),message:`stage ${l} role params must be an object`,expected:bu}),t=!1);let w=t?v:void 0;if(w&&Object.values(w).some(a=>"string"!=typeof a&&"number"!=typeof a)&&(g.push({field:a("role.params"),message:`stage ${l} role params must be strings or numbers`,expected:bu}),t=!1),t&&w&&!u&&(g.push({field:a("role.roleId"),message:`stage ${l} role params require a roleId`,expected:bt}),t=!1),t&&u&&w&&!n){let b=al(u,w);b&&(g.push({field:a("role.params"),message:`stage ${l} ${b}`,expected:bu}),t=!1)}void 0!==j.model&&null!==j.model&&"string"!=typeof j.model&&g.push({field:a("model"),message:`stage ${l} model must be a string or null`,expected:"model id string, or null to inherit the role default"}),void 0!==j.effort&&null!==j.effort&&"string"!=typeof j.effort&&g.push({field:a("effort"),message:`stage ${l} effort must be a string or null`,expected:"effort string supported by the stage engine, or null to inherit the role default"});let x=void 0===j.next||null===j.next||"string"==typeof j.next;if(x||g.push({field:a("next"),message:`stage ${l} next must be a stage id or null`,expected:"id of another stage, or null to terminate the pass chain"}),m&&o&&q&&x?h.push({id:l,kind:j.kind,next:j.next??null,onFail:p?{to:p.to.trim(),maxRounds:p.maxRounds??aa.Ty}:null}):i=!1,m&&f.add(l),g.length>k)continue;let y=p?{to:p.to.trim(),maxRounds:p.maxRounds??aa.Ty}:null,z={id:l,kind:j.kind,...u?{role:{roleId:u,...w&&Object.keys(w).length?{params:w}:{}}}:{},...void 0!==j.engine?{engine:j.engine}:{},...void 0!==j.model?{model:"string"==typeof j.model&&j.model.trim()||null}:{},...void 0!==j.effort?{effort:"string"==typeof j.effort&&j.effort.trim()||null}:{},...void 0!==j.access?{access:j.access}:{},prompt:r,next:j.next??null,onFail:y},A=n?{role:n.effectiveRole}:am(z,j.kind,b);if(!A.role){let b="field"in A&&"model"===A.field?"model":"role";g.push({field:a(b),message:"error"in A&&A.error?A.error:"invalid stage role",expected:"model"===b?"model id from the selected engine's curated catalog":"a role and stage-level engine/model/effort/access the role registry can resolve"});continue}let B={...z,effectiveRole:structuredClone(A.role)};e.push(B)}let j=i?(0,ao.T7)(h):null;return(j&&g.push({field:"stages[].next",message:j,expected:"acyclic next chains over existing stage ids, with every review-loop reachable from a run stage"}),g.length)?bw(g):{stages:e}}function by(a){return a.map(a=>({id:a.id,kind:a.kind,...a.role?{role:structuredClone(a.role)}:{},...void 0!==a.engine?{engine:a.engine}:{},...void 0!==a.model?{model:a.model}:{},...void 0!==a.effort?{effort:a.effort}:{},...void 0!==a.access?{access:a.access}:{},prompt:a.prompt,next:a.next??null,onFail:a.onFail??null}))}function bz(a,b,c){let d=new Set(b.map(a=>a.id)),e=bx(b.map(a=>({...a,next:null!=a.next&&a.next!==a.id&&d.has(a.next)?a.next:null,onFail:a.onFail&&d.has(a.onFail.to)?a.onFail:null})),c,new Map(a.stages.map(a=>[a.id,a])),0);return e.stages?e.stages[0]&&"run"!==e.stages[0].kind?{error:`review-loop stage ${e.stages[0].id} may not be the entry stage: the plan starts on its first stage, which must be a run stage whose session a review-loop then reviews`}:(a.stages=e.stages,a.runs=e.stages.map(a=>({stageId:a.id,attempts:[]})),a.cursor=e.stages.length?{stageId:e.stages[0].id,state:"pending",input:null,activatedBy:null}:null,{}):{error:e.error??"invalid stages",...e.violations?{violations:e.violations}:{}}}let bA="src must be a .jsonl transcript under an accepted root: the shared Claude transcript store (<viewer config dir>/shared/claude/projects), a Claude account's own projects root, or a Codex sessions root (~/.codex/sessions). A native ~/.claude/projects path is accepted and normalized to the shared store when the mirrored file exists there.";function bB(a,b){let c="string"==typeof a?a.trim():"";if(!c)return{error:"pipeline creator lineage is required; pass src",status:400};for(let a of[c,(0,k.OG)(c)]){if(!a||!b.sourcePathAllowed(a))continue;let c=b.conversationIdForPath(a);if(c)return{lineage:{srcPath:a,srcConversationId:c}}}return b.sourcePathAllowed(c)?{error:`src conversation does not exist. ${bA}`,status:400}:{error:`src path is not an allowed conversation transcript. ${bA}`,status:400}}function bC(a,b){if(!a.launchId||!a.conversationId)return{error:"task pipeline creation requires launch and conversation identity",status:400};if(null===a.srcPath)return{lineage:{srcPath:null,srcConversationId:a.conversationId}};let c=bB(a.srcPath,b);return c.lineage&&c.lineage.srcConversationId!==a.conversationId?{error:"task pipeline creator path does not match its launch conversation",status:409}:c}function bD(a,b,c,d){let e=a.creationIntent;if(!e)return{changed:!1};if("task-spawn"!==e.kind||e.taskId!==b.id)return{changed:!1,error:"task pipeline creation intent does not match its task",status:409};let f=!1;if(e.launchId!==c.launchId){let b=d.spawnReceipt(e.launchId),g=b?.state==="failed"||b?.state==="conflicted";if(!(null===a.srcPath&&(c.retryOfLaunchId===e.launchId||g)))return{changed:!1};a.creationIntent={...e,launchId:c.launchId},a.srcConversationId=c.conversationId,f=!0}let g=a.creationIntent;if(!g||g.launchId!==c.launchId)return{changed:f};if(a.srcConversationId!==c.conversationId)return{changed:!1,error:"task pipeline launch conversation changed during reconciliation",status:409};if(null===c.srcPath||a.srcPath===c.srcPath)return{changed:f};let h=bC(c,d);return h.lineage?(a.srcPath=h.lineage.srcPath,{changed:!0}):{changed:!1,error:h.error,status:h.status}}function bE(a){return{error:(0,ab.ML)(a),status:(0,ab.oT)(a.code),code:a.code,field:"repoDir",path:a.path}}async function bF(a,b=ax(),c={}){let d=[],f="string"==typeof a.task?a.task.trim():"";f?f.length>aa.g9&&d.push({field:"task",message:`task exceeds ${aa.g9} characters`,expected:`non-empty string up to ${aa.g9} characters`}):d.push({field:"task",message:"task is required",expected:`non-empty string up to ${aa.g9} characters`});let g="string"==typeof a.spec&&a.spec.trim()?a.spec.trim():void 0;void 0!==a.spec&&"string"!=typeof a.spec&&d.push({field:"spec",message:"spec must be a string",expected:`string up to ${aa.qf} characters`}),g&&g.length>aa.qf&&d.push({field:"spec",message:`spec exceeds ${aa.qf} characters`,expected:`string up to ${aa.qf} characters`}),void 0!==a.autoStart&&"boolean"!=typeof a.autoStart&&d.push({field:"autoStart",message:"autoStart must be a boolean",expected:"boolean (false creates a draft the operator starts)"}),void 0!==a.baseBranch&&"string"!=typeof a.baseBranch&&d.push({field:"baseBranch",message:"baseBranch must be a string",expected:"branch name string"}),void 0!==a.baseRef&&"string"!=typeof a.baseRef&&d.push({field:"baseRef",message:"baseRef must be a string",expected:"commit-ish string resolved against repoDir"}),void 0!==a.taskIds&&(!Array.isArray(a.taskIds)||a.taskIds.some(a=>"string"!=typeof a||!a.trim()))&&d.push({field:"taskIds",message:"taskIds must be an array of non-empty strings",expected:"array of board task ids"});let h=c.ensureTask&&c.spawnParams&&(0,ap.Rz)(c.spawnParams)?{task:c.ensureTask,params:c.spawnParams}:null,j=c.allowOperatorDraftWithoutLineage&&!1===a.autoStart&&("string"!=typeof a.src||!a.src.trim()),k=h?bC(h.params,b):j?{lineage:{srcPath:null,srcConversationId:null}}:bB(a.src,b);if(!k.lineage&&h)return{error:k.error,status:k.status};k.lineage||d.push({field:"src",message:k.error??"pipeline creator lineage is required; pass src",expected:bA});let l=[...new Set((a.taskIds??[]).map(a=>a.trim()))],m="string"==typeof a.repoDir?a.repoDir.trim():"";m||d.push({field:"repoDir",message:"repoDir is required",expected:"absolute path of an existing git repository"});let n=bx(a.stages,b.roleLookup,void 0,!1===a.autoStart?0:aa.WD);n.stages||d.push(...n.violations??[{field:"stages",message:n.error??"invalid stages",expected:bq}]);let o="string"==typeof a.baseRef?a.baseRef.trim():void 0,p="string"==typeof a.baseBranch?a.baseBranch.trim():"";if(!1===a.autoStart&&p&&!o&&d.push({field:"baseRef",message:"a draft baseBranch requires an explicit baseRef",expected:"commit SHA the draft is pinned to, resolved by the caller (a draft is not provisioned, so the viewer cannot resolve the branch itself)"}),d.length||!n.stages||!k.lineage)return{error:an(d),violations:d,status:400};let q=b.preflightRepo(m);if(!q.ok)return bE(q);let r=q.repoDir,s=!1!==a.autoStart||o?X(r,{baseBranch:a.baseBranch,baseRef:o},b.exec):null;if(s&&!s.ok)return{error:s.error,status:409};let t=(0,ao.PT)({id:e().randomUUID().slice(0,8),task:f,taskIds:l,...h?{creationIntent:{kind:"task-spawn",taskId:h.task.id,launchId:h.params.launchId}}:{},...g?{spec:g}:{},project:b.projectForCwd(r)??i().basename(r),repoDir:r,stages:n.stages,srcPath:k.lineage.srcPath,srcConversationId:k.lineage.srcConversationId,now:b.now(),state:!1===a.autoStart?"draft":"provisioning"});return s?.ok&&(t.baseBranch=s.baseBranch,t.baseRef=s.baseRef,t.lastPassedCommit=s.baseRef),(0,ao.Km)((a,d)=>{if(c.ensureTask&&c.spawnParams&&null===(0,ap.L1)(c.ensureTask,a,c.spawnParams)){let e=a.find(a=>a.taskIds.includes(c.ensureTask.id)&&"closed"!==a.state&&!a.hiddenAt);if(!e)return{error:"task pipeline binding changed during creation",status:409};if((0,ap.Rz)(c.spawnParams)){let a=bD(e,c.ensureTask,c.spawnParams,b);if(a.error)return{error:a.error,status:a.status};a.changed&&d()}return{pipeline:e}}let e=(0,ao.qo)(t,l,(0,M.h6)());return e?{error:e,status:400}:(a.push(t),d(),{pipeline:t})})}async function bG(a,b,c=ax()){let d=(0,ao.IR)(),e=(0,ap.L1)(a,d,b);return null===e?(0,ao.Km)((d,e)=>{let f=d.find(b=>b.taskIds.includes(a.id)&&"closed"!==b.state&&!b.hiddenAt);if(!f)return{error:"task pipeline binding changed during lookup",status:409};if((0,ap.Rz)(b)){let d=bD(f,a,b,c);if(d.error)return{error:d.error,status:d.status};d.changed&&e()}return{pipeline:f}}):bF(e,c,{ensureTask:a,spawnParams:b})}async function bH(a,b){return a&&!a.verdict&&!a.completedAt&&a.paneId&&await b.paneAgentAlive(a.paneId)?{error:`stage agent may still be running in pane ${a.paneId}; wait for it to exit or kill the pane first`,status:409}:null}function bI(a,b,c){if(b?.verdictRecovery?.state!=="exhausted")return null;let d=a=>({error:`automatic verdict recovery exhausted; retry-stage and skip-stage require a reset-safe worktree: ${a}. Preserve the work or use close`,status:409});if(!a.lastPassedCommit)return d("the pipeline has no passed-stage commit");let e=Z(a,c.exec);return e.ok?e.sha===a.lastPassedCommit?null:d(`the worktree HEAD ${e.sha} differs from the last-passed commit ${a.lastPassedCommit}`):d(e.error)}async function bJ(a,b){try{if(!await b.stageHostResident(a.target))return"the host registry entry is dead or absent"}catch{}if(!a.target.agentPath)return null;let c=await b.durableTurnEvidence(a.attempt.effectiveRole.engine,a.target.agentPath);if(c?.turn!=="terminal"||!c.message||c.message.ts<=aH(a.attempt.startedAt))return null;let d=aL(c.message.text);return!d||"failureReason"in d?null:"the attempt transcript holds a completed final assistant turn with a valid fenced verdict"}function bK(a,b,c){aC.has(a.attempt.state)||(a.attempt.state="failed",a.attempt.error=b),a.attempt.completedAt??=c.now()}function bL(a){let b=[],c=new Set;for(let d of a.runs)for(let a of d.attempts){if(!a.conversationId&&!a.agentPath&&!a.paneId)continue;let e=`${a.conversationId??""}|${a.agentPath??""}|${a.paneId??""}`;c.has(e)||(c.add(e),b.push({attempt:a,target:{stageId:d.stageId,attempt:a.n,conversationId:a.conversationId,agentPath:a.agentPath,paneId:a.paneId,...a.historical?{adopted:!0}:{}},turnSettled:!!(a.verdict||a.completedAt)}))}return b}function bM(a){let b=a.adopted?"adopted agent of stage":"stage";return`${b} ${a.stageId} attempt ${a.attempt} (${a.conversationId??a.agentPath??"unknown host"})`}async function bN(a,b,c=ax(),d=w.a){return(0,ao.Km)(async(e,f)=>{let g=e.find(b=>b.id===a);if(!g)return{error:"pipeline not found",status:404};let h=aE(g),j=h?aG(g,h.id):null,k=j?.flowId?c.getFlow(j.flowId):null;if("set-src"===b.action){if(void 0!==b.overwrite&&"boolean"!=typeof b.overwrite)return{error:"overwrite must be a boolean",status:400};let a=bB(b.srcPath,c);if(!a.lineage)return{error:a.error,status:a.status};let d=null!==g.srcPath||null!==g.srcConversationId,e=g.srcPath===a.lineage.srcPath&&g.srcConversationId===a.lineage.srcConversationId;if(d&&!e&&!0!==b.overwrite)return{error:"pipeline creator lineage already exists; pass overwrite: true to replace it",status:409};g.srcPath=a.lineage.srcPath,g.srcConversationId=a.lineage.srcConversationId}else if("link-task"===b.action){let a="string"==typeof b.taskId?b.taskId.trim():"";if(!a)return{error:"taskId is required",status:400};let c=(0,ao.qo)(g,[a],(0,M.h6)());if(c)return{error:c,status:400};g.taskIds.includes(a)||g.taskIds.push(a)}else if("unlink-task"===b.action){let a="string"==typeof b.taskId?b.taskId.trim():"";if(!a)return{error:"taskId is required",status:400};g.taskIds=g.taskIds.filter(b=>b!==a)}else if("start"===b.action){if("draft"!==g.state)return{error:"pipeline is not a draft",status:409};if(g.stages.length<aa.WD)return{error:`add at least ${aa.WD} stage before starting`,status:409};let a=c.preflightRepo(g.repoDir);if(!a.ok)return bE(a);if(a.repoDir!==g.repoDir){let b=c.projectForCwd(a.repoDir)??i().basename(a.repoDir),d=(0,ao.qo)({project:b},g.taskIds,(0,M.h6)(),{allowMissing:!0});if(d)return{error:d,status:400};g.repoDir=a.repoDir,g.project=b,Object.assign(g,(0,ao.J2)(g.id,g.task,a.repoDir))}if(!g.baseBranch||!g.baseRef||!g.lastPassedCommit){let a=X(g.repoDir,{},c.exec);if(!a.ok)return{error:a.error,status:409};g.baseBranch=a.baseBranch,g.baseRef=a.baseRef,g.lastPassedCommit=a.baseRef}g.state="provisioning",g.stateDetail=null}else if("update-draft"===b.action){if("draft"!==g.state)return{error:"pipeline is not a draft",status:409};if(void 0===b.task&&void 0===b.spec&&void 0===b.repoDir)return{error:"update-draft needs at least one field to change",status:400};let a=void 0===b.task?g.task:"string"==typeof b.task?b.task.trim():"";if(!a)return{error:"task is required",status:400};if(a.length>aa.g9)return{error:`task exceeds ${aa.g9} characters`,status:400};if(void 0!==b.spec&&"string"!=typeof b.spec)return{error:"spec must be a string",status:400};let d=void 0===b.spec?g.spec:b.spec.trim()||void 0;if(d&&d.length>aa.qf)return{error:`spec exceeds ${aa.qf} characters`,status:400};let e=void 0===b.repoDir?g.repoDir:"string"==typeof b.repoDir?b.repoDir.trim():"";if(!e)return{error:"repoDir is required",status:400};let f=g.repoDir;if(e!==g.repoDir){let a=c.preflightRepo(e);if(!a.ok)return bE(a);f=a.repoDir}let h=f!==g.repoDir,j=c.projectForCwd(f)??i().basename(f);if(h){let a=(0,ao.qo)({project:j},g.taskIds,(0,M.h6)(),{allowMissing:!0});if(a)return{error:a,status:400}}g.task=a,d?g.spec=d:delete g.spec,g.repoDir=f,g.project=j,Object.assign(g,(0,ao.J2)(g.id,a,f)),h&&(g.baseBranch="",g.baseRef="",g.lastPassedCommit="")}else if("set-position"===b.action){if(!b.pos||"object"!=typeof b.pos||!Number.isFinite(b.pos.x)||!Number.isFinite(b.pos.y))return{error:"position requires finite x and y",status:400};g.pos={x:Math.round(b.pos.x),y:Math.round(b.pos.y)}}else if("add-stage"===b.action){if("draft"!==g.state)return{error:"pipeline is not a draft",status:409};if(!b.stage||"object"!=typeof b.stage||Array.isArray(b.stage))return{error:"stage is required",status:400};let a=by(g.stages),d=void 0===b.index?a.length:b.index;if(!Number.isInteger(d)||d<0||d>a.length)return{error:"stage index is out of range",status:400};let e=d>0?a[d-1]:null,f=e?e.next??null:a[d]?.id??null,h={...b.stage,next:f};a.splice(d,0,h),e&&(e.next=h.id);let i=bz(g,a,c.roleLookup);if(i.error)return{error:i.error,status:400,...i.violations?{violations:i.violations}:{}}}else if("remove-stage"===b.action){if("draft"!==g.state)return{error:"pipeline is not a draft",status:409};if(0===g.stages.length)return{error:"no stage to remove",status:409};if(1===g.stages.length)return{error:"a pipeline keeps at least one stage; reconfigure it instead",status:409};let a=g.stages.findIndex(a=>a.id===b.stageId);if(a<0)return{error:"stage not found",status:404};let d=g.stages[a],e=by(g.stages);e.splice(a,1);let f=d.next&&d.next!==d.id?d.next:null;for(let a of e)a.next===d.id&&(a.next=f),a.onFail?.to===d.id&&(a.onFail=null);let h=bz(g,e,c.roleLookup);if(h.error)return{error:h.error,status:400,...h.violations?{violations:h.violations}:{}}}else if("reorder-stage"===b.action){let a;if("draft"!==g.state)return{error:"pipeline is not a draft",status:409};let d=by(g.stages);if(Array.isArray(b.stageIds)){let c=new Set(d.map(a=>a.id));if(b.stageIds.length!==d.length||new Set(b.stageIds).size!==d.length||b.stageIds.some(a=>!c.has(a)))return{error:"stageIds must contain every stage exactly once",status:400};let e=new Map(d.map(a=>[a.id,a]));a=b.stageIds.map(a=>e.get(a))}else{let c=d.findIndex(a=>a.id===b.stageId);if(c<0)return{error:"stage not found",status:404};let e=b.toIndex;if(!Number.isInteger(e)||e<0||e>=d.length)return{error:"stage index is out of range",status:400};let[f]=(a=[...d]).splice(c,1);a.splice(e,0,f)}let e=bz(g,a,c.roleLookup);if(e.error)return{error:e.error,status:400,...e.violations?{violations:e.violations}:{}}}else if("set-edge"===b.action){if(az.has(g.state))return{error:"pipeline is closed or completed",status:409};let a="string"==typeof b.stageId?g.stages.find(a=>a.id===b.stageId)??null:null;if(!a)return{error:"stage not found",status:404};if("pass"!==b.edge&&"fail"!==b.edge)return{error:"edge must be pass or fail",status:400};if(void 0===b.to)return{error:"to is required (null clears the edge)",status:400};if(null!==b.to&&("string"!=typeof b.to||!g.stages.some(a=>a.id===b.to)))return{error:"edge target stage not found",status:400};if("pass"===b.edge){if(void 0!==b.maxRounds)return{error:"maxRounds applies only to fail edges",status:400};let c=g.runs.find(b=>b.stageId===a.id);if(c&&c.attempts.length>0)return{error:"stage has already run; its pass edge is frozen evidence",status:409};let d=g.stages.map(c=>c.id===a.id?{...c,next:b.to}:c),e=(0,ao.T7)(d);if(e)return{error:e,status:400};a.next=b.to}else{if(g.cursor?.activatedBy?.edge==="fail"&&g.cursor.activatedBy.stageId===a.id||g.runs.some(b=>b.attempts.some(b=>!b.historical&&b.activatedBy?.edge==="fail"&&b.activatedBy.stageId===a.id)))return{error:"fail edge has already been traversed; it is frozen evidence",status:409};if(null===b.to){if(void 0!==b.maxRounds)return{error:"maxRounds requires a fail-edge target",status:400};a.onFail=null}else{let c=void 0===b.maxRounds?aa.Ty:b.maxRounds;if(!Number.isInteger(c)||c<1||c>aa.e7)return{error:`maxRounds must be an integer between 1 and ${aa.e7}`,status:400};let d=g.stages.map(d=>d.id===a.id?{...d,onFail:{to:b.to,maxRounds:c}}:d),e=(0,ao.T7)(d);if(e)return{error:e,status:400};a.onFail={to:b.to,maxRounds:c}}}}else if("pause"===b.action){if("draft"===g.state)return{error:"draft pipelines can only be started, edited, or deleted",status:409};!az.has(g.state)&&"paused"!==g.state&&(g.pausedState=g.state,g.state="paused",g.pausedAt=c.now(),g.stateDetail=(0,w.P)("paused",d),k&&"paused"!==k.state&&"closed"!==k.state&&c.patchFlow(k.id,"pause",void 0,d))}else if("resume"===b.action){if("paused"!==g.state)return{error:"pipeline is not paused",status:409};g.state=g.pausedState??"running",g.pausedState=null,g.resumedAt=c.now(),g.stateDetail=(0,w.P)("resumed",d),k?.state==="paused"&&c.patchFlow(k.id,"resume",void 0,d)}else if("retry-stage"===b.action){if("needs_decision"!==g.state)return{error:"pipeline does not have a stage awaiting retry",status:409};let a=bI(g,j,c);if(a)return a;let d=void 0!==b.stageId||void 0!==b.launchId;if(d&&("string"!=typeof b.stageId||"string"!=typeof b.launchId))return{error:"receipt retry requires both stageId and launchId",status:400};let e=d?b.stageId:h?.id??null,i=d?b.launchId:j?.launchId??null,l=(d||j?.paneId===null)&&null!==e&&null!==i;if(d&&h?.id!==e)return{error:"the clicked launch belongs to a different pipeline stage",status:409};if(d&&j?.launchId!==i)return{error:"the clicked launch is no longer the current failed attempt",status:409};let m=(a=!1)=>{if(!l)return{conflict:null,claimRequired:!1};let b=c.spawnReceipt(i);return b?"failed"===b.state||"conflicted"===b.state?{conflict:null,claimRequired:!0}:d||a||null!==j&&bl(g,j)||"completed"!==b.state?{conflict:{error:`the clicked launch settled as ${b.state}; retry was cancelled`,status:409},claimRequired:!1}:{conflict:null,claimRequired:!1}:{conflict:{error:"the clicked launch receipt is no longer available",status:409},claimRequired:!1}},n=m();if(n.conflict)return n.conflict;let o=await bH(j,c);if(o)return o;if(k&&"closed"!==k.state){let a=await c.closeFlow(k.id);if(a?.error)return g.stateDetail=a.error,f(),{error:a.error,status:a.status??409}}let p=m(n.claimRequired);if(p.conflict)return p.conflict;if(p.claimRequired){if(!i||!e)return{error:"structured retry identity is unavailable",status:409};let a=c.claimSpawnRetry(i,`${g.id}:${e}:${i}`);if("claimed"!==a)return{error:"settled"===a?"the clicked launch settled before its retry could be claimed":"the clicked launch is already claimed by another retry",status:409}}let q=h?.kind==="review-loop"?function(a,b){let c=Z(a,b);if(!c.ok)return c;let d=b("git",["ls-remote","--heads","origin",`refs/heads/${a.branch}`],a.worktreeDir);if(0!==d.code)return V("checking the remote pipeline branch",d);if(!d.stdout.trim())return c;let e=b("git",["fetch","--no-tags","origin",`+refs/heads/${a.branch}:refs/remotes/origin/${a.branch}`],a.worktreeDir);if(0!==e.code)return V("fetching the remote pipeline branch",e);let f=b("git",["rev-parse",`refs/remotes/origin/${a.branch}`],a.worktreeDir);if(0!==f.code)return V("resolving the remote pipeline branch",f);let g=f.stdout.trim();if(!/^[0-9a-f]{40}$/i.test(g))return{ok:!1,error:"resolving the remote pipeline branch: expected an exact commit SHA"};if(g===c.sha)return c;let h=b("git",["merge-base","--is-ancestor",c.sha,g],a.worktreeDir);if(0===h.code){let c=b("git",["merge","--ff-only",`refs/remotes/origin/${a.branch}`],a.worktreeDir);return 0!==c.code?V("fast-forwarding the pipeline worktree to its remote repair",c):{ok:!0,sha:g}}if(1!==h.code)return V("comparing local and remote pipeline revisions",h);let i=b("git",["merge-base","--is-ancestor",g,c.sha],a.worktreeDir);return 0===i.code?c:1!==i.code?V("comparing local and remote pipeline revisions",i):{ok:!1,error:"the local and remote pipeline branches diverged; choose which repair to keep before retrying review"}}(g,c.exec):null;if(q&&!q.ok)return g.stateDetail=q.error,f(),{error:q.error,status:409};if(g.runs.every(a=>0===a.attempts.length))g.state="provisioning";else if(h?.kind==="review-loop"){g.lastPassedCommit=q.sha;let a=_(g,c.exec,{acceptedSha:q.sha,publishedSha:g.publishedCommit??null});if(!a.ok)return g.stateDetail=a.error,f(),{error:a.error,status:409};g.publishedCommit="published"===a.remote?a.sha:null,g.state="running"}else if(g.lastPassedCommit){let a=Y(g,c.exec);if(!a.ok)return{error:a.error,status:409};g.state="running"}else g.state="provisioning";h&&aQ(g,h.id,"pending"),g.pausedState=null,g.stateDetail=null}else if("skip-stage"===b.action){if("needs_decision"!==g.state||!h)return{error:"pipeline does not have a stage awaiting a decision",status:409};let a=bI(g,j,c);if(a)return a;let b=await bH(j,c);if(b)return b;if(k&&"closed"!==k.state){let a=await c.closeFlow(k.id);if(a?.error)return g.stateDetail=a.error,f(),{error:a.error,status:a.status??409}}if(!g.lastPassedCommit)return{error:"pipeline worktree has not been provisioned",status:409};let d=Y(g,c.exec);if(!d.ok)return{error:d.error,status:409};j&&(j.state="skipped",j.completedAt=c.now(),j.output="Skipped by operator."),a3(g,h,c,j)}else if("override-stage"===b.action){if(az.has(g.state))return{error:"pipeline is closed or completed",status:409};let a="string"==typeof b.stageId?b.stageId:null,d=a?g.stages.find(b=>b.id===a)??null:null;if(!d)return{error:"stage not found",status:404};let e=g.runs.find(a=>a.stageId===d.id);if(e&&e.attempts.length>0)return{error:"stage has already started",status:409};let f=void 0!==b.role||void 0!==b.engine||void 0!==b.model||void 0!==b.effort;if(!f&&void 0===b.prompt)return{error:"override-stage needs at least one field to change",status:400};if(void 0!==b.engine&&"claude"!==b.engine&&"codex"!==b.engine)return{error:"engine must be claude or codex",status:400};if(void 0!==b.model&&null!==b.model&&"string"!=typeof b.model)return{error:"model must be a string or null",status:400};if(void 0!==b.effort&&null!==b.effort&&"string"!=typeof b.effort)return{error:"effort must be a string or null",status:400};if(f){let a=d.role;if(void 0!==b.role)if(null===b.role)a=void 0;else{if("object"!=typeof b.role||Array.isArray(b.role))return{error:"role must be an object or null",status:400};let c="string"==typeof b.role.roleId?b.role.roleId.trim():"";if(!c)return{error:"role requires a roleId",status:400};let d=b.role.params;if(void 0!==d&&(!d||"object"!=typeof d||Array.isArray(d)))return{error:"role params must be an object",status:400};if(d&&Object.values(d).some(a=>"string"!=typeof a&&"number"!=typeof a))return{error:"role params must be strings or numbers",status:400};let e=d?al(c,d):null;if(e)return{error:e,status:400};a={roleId:c,...d&&Object.keys(d).length?{params:d}:{}}}let e=void 0!==b.role,f=am({role:a,engine:void 0!==b.engine?b.engine:e?void 0:d.engine,model:void 0!==b.model?b.model:e?void 0:d.model,effort:void 0!==b.effort?b.effort:e?void 0:d.effort,access:d.access},d.kind,c.roleLookup);if(!f.role)return{error:f.error??"invalid stage role",status:400};if(d.effectiveRole=f.role,d.role=a,d.engine=f.role.engine,d.model=f.role.model,d.effort=f.role.effort,d.access=f.role.access,!(0,ao.E0)(d.effectiveRole))return{error:"stage role is not a valid engine/model/effort combination",status:400}}if(void 0!==b.prompt){if("string"!=typeof b.prompt||!b.prompt.trim())return{error:"prompt must be a non-empty string",status:400};let a=b.prompt.trim();if(a.length>aa.Y3)return{error:`stage prompt exceeds ${aa.Y3} characters`,status:400};d.prompt=a}}else{if("delete"===b.action)return"draft"!==g.state?{error:"only draft pipelines can be deleted",status:409}:(g.hiddenAt=c.now(),f(),{pipeline:g});if("close"!==b.action)return{error:"unknown pipeline action",status:400};if("draft"===g.state)return g.hiddenAt=c.now(),f(),{pipeline:g};if(void 0!==b.acknowledgeHosts&&"boolean"!=typeof b.acknowledgeHosts)return{error:"acknowledgeHosts must be a boolean",status:400};let a={stopped:[],alreadyStopped:[],unconfirmed:[],acknowledged:[],reviewers:[],stillRunning:[],notes:[],worktree:null},d=c.monotonicNow()+1e4,e=bL(g);for(let b=0;b<e.length;b+=1){let f=e[b],{target:g,turnSettled:h}=f;if(b>0&&c.monotonicNow()>=d){for(let c of e.slice(b))a.unconfirmed.push({...c.target,operationId:null,detail:"close teardown budget expired before this host was probed"});break}let i=await c.stopStageAgent(g);if("stopped"===i.outcome)a.stopped.push(g);else if("failed"===i.outcome){let b=await bJ(f,c);if(b){let d=`stop failed with "${i.error}"; terminalized from ${b}`;a.alreadyStopped.push(g),a.notes.push({...g,detail:d}),bK(f,d,c)}else a.stillRunning.push({...g,error:i.error})}else if("unconfirmed"===i.outcome)a.unconfirmed.push({...g,operationId:i.operationId,detail:i.detail});else if(!h&&g.paneId){let b=await c.stopStagePane(g);"stopped"===b.outcome?a.stopped.push(g):"failed"===b.outcome?a.stillRunning.push({...g,error:b.error}):"unknown"===b.outcome?a.unconfirmed.push({...g,operationId:null,detail:b.detail}):(a.alreadyStopped.push(g),bK(f,"the stage pane was already absent when the pipeline closed",c))}else a.alreadyStopped.push(g),bK(f,"the stage host was already absent when the pipeline closed",c)}if(a.worktree=function(a,b){if("provisioning"===a.state||!a.lastPassedCommit||!b.worktreePresent(a.worktreeDir))return null;let c=function(a,b,c=20){let d=b("git",["status","--porcelain"],a.worktreeDir);if(0!==d.code)return V("checking the pipeline worktree",d);let e=d.stdout.split("\n").map(a=>a.trimEnd()).filter(a=>a.length>3).map(a=>a.slice(3).split(" -> ").at(-1).trim()).filter(a=>a.length>0);return{ok:!0,paths:e.slice(0,c),truncated:e.length>c}}(a,b.exec);return c.ok?{dir:a.worktreeDir,uncommitted:c.paths,truncated:c.truncated}:{dir:a.worktreeDir,uncommitted:[],truncated:!1,error:c.error}}(g,c),a.stillRunning.length>0){let b=`could not stop ${a.stillRunning.map(a=>`${bM(a)}: ${a.error}`).join("; ")}`;return g.stateDetail=b,f(),{error:b,status:409,close:a}}if(k&&"closed"!==k.state){let b=await c.closeFlow(k.id);if(b?.error)return h&&j&&a.stillRunning.push({stageId:h.id,attempt:j.n,conversationId:j.conversationId,agentPath:j.agentPath,paneId:j.paneId,error:b.error}),g.stateDetail=b.error,f(),{error:b.error,status:b.status??409,close:a};b?.stoppedReviewer&&h&&j&&a.reviewers.push({stageId:h.id,attempt:j.n,flowId:k.id,round:b.stoppedReviewer.round})}return h&&(!j||g.cursor?.state==="pending"&&aC.has(j.state))&&aU(g,h),g.state="closed",g.cursor=null,g.pausedState=null,!0===b.acknowledgeHosts&&a.unconfirmed.length>0&&(a.acknowledged.push(...a.unconfirmed.map(a=>({...a,detail:a.detail}))),a.unconfirmed.length=0),g.stateDetail=function(a){let b=[],c=a.stopped.filter(a=>a.adopted).length,d=a.stopped.length-c;for(let e of(d>0&&b.push(`stopped ${d} stage host${1===d?"":"s"}`),c>0&&b.push(`stopped ${c} adopted agent${1===c?"":"s"}`),a.reviewers.length>0&&b.push(`stopped ${a.reviewers.length} review round${1===a.reviewers.length?"":"s"}`),a.unconfirmed))b.push(`${e.detail} for ${bM(e)}${e.operationId?` (operation ${e.operationId})`:""}`);for(let c of(a.acknowledged.length>0&&b.push(`dismissed ${a.acknowledged.length} unconfirmed host${1===a.acknowledged.length?"":"s"} on the operator's word`),a.notes))b.push(`${c.detail} for ${bM(c)}`);if(a.worktree?.error)b.push(`could not read the worktree at ${a.worktree.dir}: ${a.worktree.error}`);else{let c=a.worktree?.uncommitted.length??0;c>0&&b.push(`kept ${c}${a.worktree?.truncated?"+":""} uncommitted path${1===c?"":"s"} in the worktree`)}return b.length>0?`closed; ${b.join("; ")}`:null}(a),g.closedAt=c.now(),g.unconfirmedHosts=a.unconfirmed.length>0?a.unconfirmed.map(a=>({stageId:a.stageId,attempt:a.attempt,conversationId:a.conversationId,agentPath:a.agentPath,paneId:a.paneId,operationId:a.operationId,detail:a.detail,at:g.closedAt})):void 0,g.hiddenAt=g.unconfirmedHosts?null:g.closedAt,f(),{pipeline:g,close:a}}return f(),{pipeline:g}})}function bO(){return{pipelines:(0,ao.IR)()}}}};
|
|
87
|
+
${f.map(a=>`- ${a}`).join("\n")}`}}(g);return h?(a2(e,g,b.now()),a9(a,d,e,h,b,c),!0):("paused"!==g.state||!!(0,s.F4)(g)&&!b.patchFlow(g.id,"resume").error&&!!(g=b.getFlow(g.id))&&"relaying"===g.state)&&f!==bk(g)&&(a.state="running",a.stateDetail=null,e.state="reviewing",e.error=null,a2(e,g,b.now()),aR(a,d.id,"reviewing"),!0)}(c,b,g)||h,h=await bo(c,b)||h,h=await bp(c,b)||h,aA.has(c.state)||"paused"===c.state||"needs_decision"===c.state||(h=await bf(c,a,b,g,d)||h),h&&(f=!0,g())},{batchSize:4,timeBudgetMs:16}),{pipelines:c,changed:f}});return c=e.pipelines.some(a=>"running"===a.state&&a.cursor?.state==="pending"),e}catch(a){if(!(a instanceof ap.mZ))throw a;return console.error("[pipelines] skipping tick; registry unreadable",a),{pipelines:[],changed:!1}}finally{bg.__llvPipelineTick=!1,c&&(0,S.L1)()}}let br="{id, kind, prompt, next, onFail?, role?, engine?/model?/effort?/access? overrides}",bs=`non-empty string up to ${ab.Y3} characters`,bt=`{roleId: one of ${ak.join(" | ")}, params?: {<key>: string | number}} — runtime overrides belong on the stage, not in role`,bu=`one of ${ak.join(" | ")}`,bv="object of the role's declared parameters, values string or number",bw=`null, or {to: <existing stage id>, maxRounds?: 1–${ab.e7}} — run stages only`;function bx(a){return{error:ao(a),violations:a}}function by(a,b,c,d=ab.WD){if(!Array.isArray(a)||a.length<d||a.length>ab.IO)return bx([{field:"stages",message:0===d?`pipelines require at most ${ab.IO} stages`:`pipelines require ${ab.WD}–${ab.IO} stages`,expected:`array of ${d}–${ab.IO} stage objects`}]);let e=[],f=new Set,g=[],h=[],i=!0;for(let[d,j]of a.entries()){let a=a=>`stages[${d}]${a?`.${a}`:""}`;if(!j||"object"!=typeof j||Array.isArray(j)){g.push({field:a(""),message:"invalid pipeline stage",expected:br}),i=!1;continue}let k=g.length,l="string"==typeof j.id?j.id.trim():"",m=/^[A-Za-z0-9_-]{1,64}$/.test(l)&&!f.has(l);m||g.push({field:a("id"),message:"stage ids must be unique URL-safe names",expected:"1–64 characters of A–Z a–z 0–9 _ -, unique across stages"});let n=c?.get(l),o="run"===j.kind||"review-loop"===j.kind;o||g.push({field:a("kind"),message:"stage kind must be run or review-loop",expected:'"run" | "review-loop"'});let p=j.onFail,q=!0;if(null!=p)if(!p||"object"!=typeof p||Array.isArray(p))g.push({field:a("onFail"),message:`stage ${l} onFail must be an object or null`,expected:bw}),q=!1;else{"string"==typeof p.to&&p.to.trim()||(g.push({field:a("onFail.to"),message:`stage ${l} onFail requires a target stage id`,expected:"id of an existing stage"}),q=!1);let b=void 0===p.maxRounds?ab.Ty:p.maxRounds;(!Number.isInteger(b)||b<1||b>ab.e7)&&(g.push({field:a("onFail.maxRounds"),message:`stage ${l} onFail maxRounds must be an integer between 1 and ${ab.e7}`,expected:`integer 1–${ab.e7} (default ${ab.Ty})`}),q=!1)}let r="string"==typeof j.prompt?j.prompt.trim():"";r?r.length>ab.Y3&&g.push({field:a("prompt"),message:`stage ${l} prompt exceeds ${ab.Y3} characters`,expected:bs}):g.push({field:a("prompt"),message:`stage ${l} prompt is required`,expected:bs});let s=j.role,t=!0;void 0!==s&&(!s||"object"!=typeof s||Array.isArray(s))&&(g.push({field:a("role"),message:`stage ${l} role must be an object`,expected:bt}),t=!1),t&&s&&Object.keys(s).some(a=>"roleId"!==a&&"params"!==a)&&(g.push({field:a("role"),message:`stage ${l} role only accepts roleId and params; place runtime overrides on the stage`,expected:bt}),t=!1);let u=t&&s&&"string"==typeof s.roleId?s.roleId.trim():"";t&&s&&!u&&(g.push({field:a("role.roleId"),message:`stage ${l} roleId is required when role is present`,expected:bu}),t=!1);let v=t?s?.params:void 0;void 0!==v&&(!v||"object"!=typeof v||Array.isArray(v))&&(g.push({field:a("role.params"),message:`stage ${l} role params must be an object`,expected:bv}),t=!1);let w=t?v:void 0;if(w&&Object.values(w).some(a=>"string"!=typeof a&&"number"!=typeof a)&&(g.push({field:a("role.params"),message:`stage ${l} role params must be strings or numbers`,expected:bv}),t=!1),t&&w&&!u&&(g.push({field:a("role.roleId"),message:`stage ${l} role params require a roleId`,expected:bu}),t=!1),t&&u&&w&&!n){let b=am(u,w);b&&(g.push({field:a("role.params"),message:`stage ${l} ${b}`,expected:bv}),t=!1)}void 0!==j.model&&null!==j.model&&"string"!=typeof j.model&&g.push({field:a("model"),message:`stage ${l} model must be a string or null`,expected:"model id string, or null to inherit the role default"}),void 0!==j.effort&&null!==j.effort&&"string"!=typeof j.effort&&g.push({field:a("effort"),message:`stage ${l} effort must be a string or null`,expected:"effort string supported by the stage engine, or null to inherit the role default"});let x=void 0===j.next||null===j.next||"string"==typeof j.next;if(x||g.push({field:a("next"),message:`stage ${l} next must be a stage id or null`,expected:"id of another stage, or null to terminate the pass chain"}),m&&o&&q&&x?h.push({id:l,kind:j.kind,next:j.next??null,onFail:p?{to:p.to.trim(),maxRounds:p.maxRounds??ab.Ty}:null}):i=!1,m&&f.add(l),g.length>k)continue;let y=p?{to:p.to.trim(),maxRounds:p.maxRounds??ab.Ty}:null,z={id:l,kind:j.kind,...u?{role:{roleId:u,...w&&Object.keys(w).length?{params:w}:{}}}:{},...void 0!==j.engine?{engine:j.engine}:{},...void 0!==j.model?{model:"string"==typeof j.model&&j.model.trim()||null}:{},...void 0!==j.effort?{effort:"string"==typeof j.effort&&j.effort.trim()||null}:{},...void 0!==j.access?{access:j.access}:{},prompt:r,next:j.next??null,onFail:y},A=n?{role:n.effectiveRole}:an(z,j.kind,b);if(!A.role){let b="field"in A&&"model"===A.field?"model":"role";g.push({field:a(b),message:"error"in A&&A.error?A.error:"invalid stage role",expected:"model"===b?"model id from the selected engine's curated catalog":"a role and stage-level engine/model/effort/access the role registry can resolve"});continue}let B={...z,effectiveRole:structuredClone(A.role)};e.push(B)}let j=i?(0,ap.T7)(h):null;return(j&&g.push({field:"stages[].next",message:j,expected:"acyclic next chains over existing stage ids, with every review-loop reachable from a run stage"}),g.length)?bx(g):{stages:e}}function bz(a){return a.map(a=>({id:a.id,kind:a.kind,...a.role?{role:structuredClone(a.role)}:{},...void 0!==a.engine?{engine:a.engine}:{},...void 0!==a.model?{model:a.model}:{},...void 0!==a.effort?{effort:a.effort}:{},...void 0!==a.access?{access:a.access}:{},prompt:a.prompt,next:a.next??null,onFail:a.onFail??null}))}function bA(a,b,c){let d=new Set(b.map(a=>a.id)),e=by(b.map(a=>({...a,next:null!=a.next&&a.next!==a.id&&d.has(a.next)?a.next:null,onFail:a.onFail&&d.has(a.onFail.to)?a.onFail:null})),c,new Map(a.stages.map(a=>[a.id,a])),0);return e.stages?e.stages[0]&&"run"!==e.stages[0].kind?{error:`review-loop stage ${e.stages[0].id} may not be the entry stage: the plan starts on its first stage, which must be a run stage whose session a review-loop then reviews`}:(a.stages=e.stages,a.runs=e.stages.map(a=>({stageId:a.id,attempts:[]})),a.cursor=e.stages.length?{stageId:e.stages[0].id,state:"pending",input:null,activatedBy:null}:null,{}):{error:e.error??"invalid stages",...e.violations?{violations:e.violations}:{}}}let bB="src must be a .jsonl transcript under an accepted root: the shared Claude transcript store (<viewer config dir>/shared/claude/projects), a Claude account's own projects root, or a Codex sessions root (~/.codex/sessions). A native ~/.claude/projects path is accepted and normalized to the shared store when the mirrored file exists there.";function bC(a,b){let c="string"==typeof a?a.trim():"";if(!c)return{error:"pipeline creator lineage is required; pass src",status:400};for(let a of[c,(0,k.OG)(c)]){if(!a||!b.sourcePathAllowed(a))continue;let c=b.conversationIdForPath(a);if(c)return{lineage:{srcPath:a,srcConversationId:c}}}return b.sourcePathAllowed(c)?{error:`src conversation does not exist. ${bB}`,status:400}:{error:`src path is not an allowed conversation transcript. ${bB}`,status:400}}function bD(a,b){if(!a.launchId||!a.conversationId)return{error:"task pipeline creation requires launch and conversation identity",status:400};if(null===a.srcPath)return{lineage:{srcPath:null,srcConversationId:a.conversationId}};let c=bC(a.srcPath,b);return c.lineage&&c.lineage.srcConversationId!==a.conversationId?{error:"task pipeline creator path does not match its launch conversation",status:409}:c}function bE(a,b,c,d){let e=a.creationIntent;if(!e)return{changed:!1};if("task-spawn"!==e.kind||e.taskId!==b.id)return{changed:!1,error:"task pipeline creation intent does not match its task",status:409};let f=!1;if(e.launchId!==c.launchId){let b=d.spawnReceipt(e.launchId),g=b?.state==="failed"||b?.state==="conflicted";if(!(null===a.srcPath&&(c.retryOfLaunchId===e.launchId||g)))return{changed:!1};a.creationIntent={...e,launchId:c.launchId},a.srcConversationId=c.conversationId,f=!0}let g=a.creationIntent;if(!g||g.launchId!==c.launchId)return{changed:f};if(a.srcConversationId!==c.conversationId)return{changed:!1,error:"task pipeline launch conversation changed during reconciliation",status:409};if(null===c.srcPath||a.srcPath===c.srcPath)return{changed:f};let h=bD(c,d);return h.lineage?(a.srcPath=h.lineage.srcPath,{changed:!0}):{changed:!1,error:h.error,status:h.status}}function bF(a){return{error:(0,ac.ML)(a),status:(0,ac.oT)(a.code),code:a.code,field:"repoDir",path:a.path}}async function bG(a,b=ay(),c={}){let d=[],f="string"==typeof a.task?a.task.trim():"";f?f.length>ab.g9&&d.push({field:"task",message:`task exceeds ${ab.g9} characters`,expected:`non-empty string up to ${ab.g9} characters`}):d.push({field:"task",message:"task is required",expected:`non-empty string up to ${ab.g9} characters`});let g="string"==typeof a.spec&&a.spec.trim()?a.spec.trim():void 0;void 0!==a.spec&&"string"!=typeof a.spec&&d.push({field:"spec",message:"spec must be a string",expected:`string up to ${ab.qf} characters`}),g&&g.length>ab.qf&&d.push({field:"spec",message:`spec exceeds ${ab.qf} characters`,expected:`string up to ${ab.qf} characters`}),void 0!==a.autoStart&&"boolean"!=typeof a.autoStart&&d.push({field:"autoStart",message:"autoStart must be a boolean",expected:"boolean (false creates a draft the operator starts)"}),void 0!==a.baseBranch&&"string"!=typeof a.baseBranch&&d.push({field:"baseBranch",message:"baseBranch must be a string",expected:"branch name string"}),void 0!==a.baseRef&&"string"!=typeof a.baseRef&&d.push({field:"baseRef",message:"baseRef must be a string",expected:"commit-ish string resolved against repoDir"}),void 0!==a.taskIds&&(!Array.isArray(a.taskIds)||a.taskIds.some(a=>"string"!=typeof a||!a.trim()))&&d.push({field:"taskIds",message:"taskIds must be an array of non-empty strings",expected:"array of board task ids"});let h=c.ensureTask&&c.spawnParams&&(0,aq.Rz)(c.spawnParams)?{task:c.ensureTask,params:c.spawnParams}:null,j=c.allowOperatorDraftWithoutLineage&&!1===a.autoStart&&("string"!=typeof a.src||!a.src.trim()),k=h?bD(h.params,b):j?{lineage:{srcPath:null,srcConversationId:null}}:bC(a.src,b);if(!k.lineage&&h)return{error:k.error,status:k.status};k.lineage||d.push({field:"src",message:k.error??"pipeline creator lineage is required; pass src",expected:bB});let l=[...new Set((a.taskIds??[]).map(a=>a.trim()))],m="string"==typeof a.repoDir?a.repoDir.trim():"";m||d.push({field:"repoDir",message:"repoDir is required",expected:"absolute path of an existing git repository"});let n=by(a.stages,b.roleLookup,void 0,!1===a.autoStart?0:ab.WD);n.stages||d.push(...n.violations??[{field:"stages",message:n.error??"invalid stages",expected:br}]);let o="string"==typeof a.baseRef?a.baseRef.trim():void 0,p="string"==typeof a.baseBranch?a.baseBranch.trim():"";if(!1===a.autoStart&&p&&!o&&d.push({field:"baseRef",message:"a draft baseBranch requires an explicit baseRef",expected:"commit SHA the draft is pinned to, resolved by the caller (a draft is not provisioned, so the viewer cannot resolve the branch itself)"}),d.length||!n.stages||!k.lineage)return{error:ao(d),violations:d,status:400};let q=b.preflightRepo(m);if(!q.ok)return bF(q);let r=q.repoDir,s=!1!==a.autoStart||o?Y(r,{baseBranch:a.baseBranch,baseRef:o},b.exec):null;if(s&&!s.ok)return{error:s.error,status:409};let t=(0,ap.PT)({id:e().randomUUID().slice(0,8),task:f,taskIds:l,...h?{creationIntent:{kind:"task-spawn",taskId:h.task.id,launchId:h.params.launchId}}:{},...g?{spec:g}:{},project:b.projectForCwd(r)??i().basename(r),repoDir:r,stages:n.stages,srcPath:k.lineage.srcPath,srcConversationId:k.lineage.srcConversationId,now:b.now(),state:!1===a.autoStart?"draft":"provisioning"});return s?.ok&&(t.baseBranch=s.baseBranch,t.baseRef=s.baseRef,t.lastPassedCommit=s.baseRef),(0,ap.Km)((a,d)=>{if(c.ensureTask&&c.spawnParams&&null===(0,aq.L1)(c.ensureTask,a,c.spawnParams)){let e=a.find(a=>a.taskIds.includes(c.ensureTask.id)&&"closed"!==a.state&&!a.hiddenAt);if(!e)return{error:"task pipeline binding changed during creation",status:409};if((0,aq.Rz)(c.spawnParams)){let a=bE(e,c.ensureTask,c.spawnParams,b);if(a.error)return{error:a.error,status:a.status};a.changed&&d()}return{pipeline:e}}let e=(0,ap.qo)(t,l,(0,N.h6)());return e?{error:e,status:400}:(a.push(t),d(),{pipeline:t})})}async function bH(a,b,c=ay()){let d=(0,ap.IR)(),e=(0,aq.L1)(a,d,b);return null===e?(0,ap.Km)((d,e)=>{let f=d.find(b=>b.taskIds.includes(a.id)&&"closed"!==b.state&&!b.hiddenAt);if(!f)return{error:"task pipeline binding changed during lookup",status:409};if((0,aq.Rz)(b)){let d=bE(f,a,b,c);if(d.error)return{error:d.error,status:d.status};d.changed&&e()}return{pipeline:f}}):bG(e,c,{ensureTask:a,spawnParams:b})}async function bI(a,b){return a&&!a.verdict&&!a.completedAt&&a.paneId&&await b.paneAgentAlive(a.paneId)?{error:`stage agent may still be running in pane ${a.paneId}; wait for it to exit or kill the pane first`,status:409}:null}function bJ(a,b,c){if(b?.verdictRecovery?.state!=="exhausted")return null;let d=a=>({error:`automatic verdict recovery exhausted; retry-stage and skip-stage require a reset-safe worktree: ${a}. Preserve the work or use close`,status:409});if(!a.lastPassedCommit)return d("the pipeline has no passed-stage commit");let e=$(a,c.exec);return e.ok?e.sha===a.lastPassedCommit?null:d(`the worktree HEAD ${e.sha} differs from the last-passed commit ${a.lastPassedCommit}`):d(e.error)}async function bK(a,b){try{if(!await b.stageHostResident(a.target))return"the host registry entry is dead or absent"}catch{}if(!a.target.agentPath)return null;let c=await b.durableTurnEvidence(a.attempt.effectiveRole.engine,a.target.agentPath);if(c?.turn!=="terminal"||!c.message||c.message.ts<=aI(a.attempt.startedAt))return null;let d=aM(c.message.text);return!d||"failureReason"in d?null:"the attempt transcript holds a completed final assistant turn with a valid fenced verdict"}function bL(a,b,c){aD.has(a.attempt.state)||(a.attempt.state="failed",a.attempt.error=b),a.attempt.completedAt??=c.now()}function bM(a){let b=[],c=new Set;for(let d of a.runs)for(let a of d.attempts){if(!a.conversationId&&!a.agentPath&&!a.paneId)continue;let e=`${a.conversationId??""}|${a.agentPath??""}|${a.paneId??""}`;c.has(e)||(c.add(e),b.push({attempt:a,target:{stageId:d.stageId,attempt:a.n,conversationId:a.conversationId,agentPath:a.agentPath,paneId:a.paneId,...a.historical?{adopted:!0}:{}},turnSettled:!!(a.verdict||a.completedAt)}))}return b}function bN(a){let b=a.adopted?"adopted agent of stage":"stage";return`${b} ${a.stageId} attempt ${a.attempt} (${a.conversationId??a.agentPath??"unknown host"})`}async function bO(a,b,c=ay(),d=w.a){return(0,ap.Km)(async(e,f)=>{let g=e.find(b=>b.id===a);if(!g)return{error:"pipeline not found",status:404};let h=aF(g),j=h?aH(g,h.id):null,k=j?.flowId?c.getFlow(j.flowId):null;if("set-src"===b.action){if(void 0!==b.overwrite&&"boolean"!=typeof b.overwrite)return{error:"overwrite must be a boolean",status:400};let a=bC(b.srcPath,c);if(!a.lineage)return{error:a.error,status:a.status};let d=null!==g.srcPath||null!==g.srcConversationId,e=g.srcPath===a.lineage.srcPath&&g.srcConversationId===a.lineage.srcConversationId;if(d&&!e&&!0!==b.overwrite)return{error:"pipeline creator lineage already exists; pass overwrite: true to replace it",status:409};g.srcPath=a.lineage.srcPath,g.srcConversationId=a.lineage.srcConversationId}else if("link-task"===b.action){let a="string"==typeof b.taskId?b.taskId.trim():"";if(!a)return{error:"taskId is required",status:400};let c=(0,ap.qo)(g,[a],(0,N.h6)());if(c)return{error:c,status:400};g.taskIds.includes(a)||g.taskIds.push(a)}else if("unlink-task"===b.action){let a="string"==typeof b.taskId?b.taskId.trim():"";if(!a)return{error:"taskId is required",status:400};g.taskIds=g.taskIds.filter(b=>b!==a)}else if("start"===b.action){if("draft"!==g.state)return{error:"pipeline is not a draft",status:409};if(g.stages.length<ab.WD)return{error:`add at least ${ab.WD} stage before starting`,status:409};let a=c.preflightRepo(g.repoDir);if(!a.ok)return bF(a);if(a.repoDir!==g.repoDir){let b=c.projectForCwd(a.repoDir)??i().basename(a.repoDir),d=(0,ap.qo)({project:b},g.taskIds,(0,N.h6)(),{allowMissing:!0});if(d)return{error:d,status:400};g.repoDir=a.repoDir,g.project=b,Object.assign(g,(0,ap.J2)(g.id,g.task,a.repoDir))}if(!g.baseBranch||!g.baseRef||!g.lastPassedCommit){let a=Y(g.repoDir,{},c.exec);if(!a.ok)return{error:a.error,status:409};g.baseBranch=a.baseBranch,g.baseRef=a.baseRef,g.lastPassedCommit=a.baseRef}g.state="provisioning",g.stateDetail=null}else if("update-draft"===b.action){if("draft"!==g.state)return{error:"pipeline is not a draft",status:409};if(void 0===b.task&&void 0===b.spec&&void 0===b.repoDir)return{error:"update-draft needs at least one field to change",status:400};let a=void 0===b.task?g.task:"string"==typeof b.task?b.task.trim():"";if(!a)return{error:"task is required",status:400};if(a.length>ab.g9)return{error:`task exceeds ${ab.g9} characters`,status:400};if(void 0!==b.spec&&"string"!=typeof b.spec)return{error:"spec must be a string",status:400};let d=void 0===b.spec?g.spec:b.spec.trim()||void 0;if(d&&d.length>ab.qf)return{error:`spec exceeds ${ab.qf} characters`,status:400};let e=void 0===b.repoDir?g.repoDir:"string"==typeof b.repoDir?b.repoDir.trim():"";if(!e)return{error:"repoDir is required",status:400};let f=g.repoDir;if(e!==g.repoDir){let a=c.preflightRepo(e);if(!a.ok)return bF(a);f=a.repoDir}let h=f!==g.repoDir,j=c.projectForCwd(f)??i().basename(f);if(h){let a=(0,ap.qo)({project:j},g.taskIds,(0,N.h6)(),{allowMissing:!0});if(a)return{error:a,status:400}}g.task=a,d?g.spec=d:delete g.spec,g.repoDir=f,g.project=j,Object.assign(g,(0,ap.J2)(g.id,a,f)),h&&(g.baseBranch="",g.baseRef="",g.lastPassedCommit="")}else if("set-position"===b.action){if(!b.pos||"object"!=typeof b.pos||!Number.isFinite(b.pos.x)||!Number.isFinite(b.pos.y))return{error:"position requires finite x and y",status:400};g.pos={x:Math.round(b.pos.x),y:Math.round(b.pos.y)}}else if("add-stage"===b.action){if("draft"!==g.state)return{error:"pipeline is not a draft",status:409};if(!b.stage||"object"!=typeof b.stage||Array.isArray(b.stage))return{error:"stage is required",status:400};let a=bz(g.stages),d=void 0===b.index?a.length:b.index;if(!Number.isInteger(d)||d<0||d>a.length)return{error:"stage index is out of range",status:400};let e=d>0?a[d-1]:null,f=e?e.next??null:a[d]?.id??null,h={...b.stage,next:f};a.splice(d,0,h),e&&(e.next=h.id);let i=bA(g,a,c.roleLookup);if(i.error)return{error:i.error,status:400,...i.violations?{violations:i.violations}:{}}}else if("remove-stage"===b.action){if("draft"!==g.state)return{error:"pipeline is not a draft",status:409};if(0===g.stages.length)return{error:"no stage to remove",status:409};if(1===g.stages.length)return{error:"a pipeline keeps at least one stage; reconfigure it instead",status:409};let a=g.stages.findIndex(a=>a.id===b.stageId);if(a<0)return{error:"stage not found",status:404};let d=g.stages[a],e=bz(g.stages);e.splice(a,1);let f=d.next&&d.next!==d.id?d.next:null;for(let a of e)a.next===d.id&&(a.next=f),a.onFail?.to===d.id&&(a.onFail=null);let h=bA(g,e,c.roleLookup);if(h.error)return{error:h.error,status:400,...h.violations?{violations:h.violations}:{}}}else if("reorder-stage"===b.action){let a;if("draft"!==g.state)return{error:"pipeline is not a draft",status:409};let d=bz(g.stages);if(Array.isArray(b.stageIds)){let c=new Set(d.map(a=>a.id));if(b.stageIds.length!==d.length||new Set(b.stageIds).size!==d.length||b.stageIds.some(a=>!c.has(a)))return{error:"stageIds must contain every stage exactly once",status:400};let e=new Map(d.map(a=>[a.id,a]));a=b.stageIds.map(a=>e.get(a))}else{let c=d.findIndex(a=>a.id===b.stageId);if(c<0)return{error:"stage not found",status:404};let e=b.toIndex;if(!Number.isInteger(e)||e<0||e>=d.length)return{error:"stage index is out of range",status:400};let[f]=(a=[...d]).splice(c,1);a.splice(e,0,f)}let e=bA(g,a,c.roleLookup);if(e.error)return{error:e.error,status:400,...e.violations?{violations:e.violations}:{}}}else if("set-edge"===b.action){if(aA.has(g.state))return{error:"pipeline is closed or completed",status:409};let a="string"==typeof b.stageId?g.stages.find(a=>a.id===b.stageId)??null:null;if(!a)return{error:"stage not found",status:404};if("pass"!==b.edge&&"fail"!==b.edge)return{error:"edge must be pass or fail",status:400};if(void 0===b.to)return{error:"to is required (null clears the edge)",status:400};if(null!==b.to&&("string"!=typeof b.to||!g.stages.some(a=>a.id===b.to)))return{error:"edge target stage not found",status:400};if("pass"===b.edge){if(void 0!==b.maxRounds)return{error:"maxRounds applies only to fail edges",status:400};let c=g.runs.find(b=>b.stageId===a.id);if(c&&c.attempts.length>0)return{error:"stage has already run; its pass edge is frozen evidence",status:409};let d=g.stages.map(c=>c.id===a.id?{...c,next:b.to}:c),e=(0,ap.T7)(d);if(e)return{error:e,status:400};a.next=b.to}else{if(g.cursor?.activatedBy?.edge==="fail"&&g.cursor.activatedBy.stageId===a.id||g.runs.some(b=>b.attempts.some(b=>!b.historical&&b.activatedBy?.edge==="fail"&&b.activatedBy.stageId===a.id)))return{error:"fail edge has already been traversed; it is frozen evidence",status:409};if(null===b.to){if(void 0!==b.maxRounds)return{error:"maxRounds requires a fail-edge target",status:400};a.onFail=null}else{let c=void 0===b.maxRounds?ab.Ty:b.maxRounds;if(!Number.isInteger(c)||c<1||c>ab.e7)return{error:`maxRounds must be an integer between 1 and ${ab.e7}`,status:400};let d=g.stages.map(d=>d.id===a.id?{...d,onFail:{to:b.to,maxRounds:c}}:d),e=(0,ap.T7)(d);if(e)return{error:e,status:400};a.onFail={to:b.to,maxRounds:c}}}}else if("pause"===b.action){if("draft"===g.state)return{error:"draft pipelines can only be started, edited, or deleted",status:409};!aA.has(g.state)&&"paused"!==g.state&&(g.pausedState=g.state,g.state="paused",g.pausedAt=c.now(),g.stateDetail=(0,w.P)("paused",d),k&&"paused"!==k.state&&"closed"!==k.state&&c.patchFlow(k.id,"pause",void 0,d))}else if("resume"===b.action){if("paused"!==g.state)return{error:"pipeline is not paused",status:409};g.state=g.pausedState??"running",g.pausedState=null,g.resumedAt=c.now(),g.stateDetail=(0,w.P)("resumed",d),k?.state==="paused"&&c.patchFlow(k.id,"resume",void 0,d)}else if("retry-stage"===b.action){if("needs_decision"!==g.state)return{error:"pipeline does not have a stage awaiting retry",status:409};let a=bJ(g,j,c);if(a)return a;let d=void 0!==b.stageId||void 0!==b.launchId;if(d&&("string"!=typeof b.stageId||"string"!=typeof b.launchId))return{error:"receipt retry requires both stageId and launchId",status:400};let e=d?b.stageId:h?.id??null,i=d?b.launchId:j?.launchId??null,l=(d||j?.paneId===null)&&null!==e&&null!==i;if(d&&h?.id!==e)return{error:"the clicked launch belongs to a different pipeline stage",status:409};if(d&&j?.launchId!==i)return{error:"the clicked launch is no longer the current failed attempt",status:409};let m=(a=!1)=>{if(!l)return{conflict:null,claimRequired:!1};let b=c.spawnReceipt(i);return b?"failed"===b.state||"conflicted"===b.state?{conflict:null,claimRequired:!0}:d||a||null!==j&&bm(g,j)||"completed"!==b.state?{conflict:{error:`the clicked launch settled as ${b.state}; retry was cancelled`,status:409},claimRequired:!1}:{conflict:null,claimRequired:!1}:{conflict:{error:"the clicked launch receipt is no longer available",status:409},claimRequired:!1}},n=m();if(n.conflict)return n.conflict;let o=await bI(j,c);if(o)return o;if(k&&"closed"!==k.state){let a=await c.closeFlow(k.id);if(a?.error)return g.stateDetail=a.error,f(),{error:a.error,status:a.status??409}}let p=m(n.claimRequired);if(p.conflict)return p.conflict;if(p.claimRequired){if(!i||!e)return{error:"structured retry identity is unavailable",status:409};let a=c.claimSpawnRetry(i,`${g.id}:${e}:${i}`);if("claimed"!==a)return{error:"settled"===a?"the clicked launch settled before its retry could be claimed":"the clicked launch is already claimed by another retry",status:409}}let q=h?.kind==="review-loop"?function(a,b){let c=$(a,b);if(!c.ok)return c;let d=b("git",["ls-remote","--heads","origin",`refs/heads/${a.branch}`],a.worktreeDir);if(0!==d.code)return W("checking the remote pipeline branch",d);if(!d.stdout.trim())return c;let e=b("git",["fetch","--no-tags","origin",`+refs/heads/${a.branch}:refs/remotes/origin/${a.branch}`],a.worktreeDir);if(0!==e.code)return W("fetching the remote pipeline branch",e);let f=b("git",["rev-parse",`refs/remotes/origin/${a.branch}`],a.worktreeDir);if(0!==f.code)return W("resolving the remote pipeline branch",f);let g=f.stdout.trim();if(!/^[0-9a-f]{40}$/i.test(g))return{ok:!1,error:"resolving the remote pipeline branch: expected an exact commit SHA"};if(g===c.sha)return c;let h=b("git",["merge-base","--is-ancestor",c.sha,g],a.worktreeDir);if(0===h.code){let c=b("git",["merge","--ff-only",`refs/remotes/origin/${a.branch}`],a.worktreeDir);return 0!==c.code?W("fast-forwarding the pipeline worktree to its remote repair",c):{ok:!0,sha:g}}if(1!==h.code)return W("comparing local and remote pipeline revisions",h);let i=b("git",["merge-base","--is-ancestor",g,c.sha],a.worktreeDir);return 0===i.code?c:1!==i.code?W("comparing local and remote pipeline revisions",i):{ok:!1,error:"the local and remote pipeline branches diverged; choose which repair to keep before retrying review"}}(g,c.exec):null;if(q&&!q.ok)return g.stateDetail=q.error,f(),{error:q.error,status:409};if(g.runs.every(a=>0===a.attempts.length))g.state="provisioning";else if(h?.kind==="review-loop"){g.lastPassedCommit=q.sha;let a=aa(g,c.exec,{acceptedSha:q.sha,publishedSha:g.publishedCommit??null});if(!a.ok)return g.stateDetail=a.error,f(),{error:a.error,status:409};g.publishedCommit="published"===a.remote?a.sha:null,g.state="running"}else if(g.lastPassedCommit){let a=Z(g,c.exec);if(!a.ok)return{error:a.error,status:409};g.state="running"}else g.state="provisioning";h&&aR(g,h.id,"pending"),g.pausedState=null,g.stateDetail=null}else if("skip-stage"===b.action){if("needs_decision"!==g.state||!h)return{error:"pipeline does not have a stage awaiting a decision",status:409};let a=bJ(g,j,c);if(a)return a;let b=await bI(j,c);if(b)return b;if(k&&"closed"!==k.state){let a=await c.closeFlow(k.id);if(a?.error)return g.stateDetail=a.error,f(),{error:a.error,status:a.status??409}}if(!g.lastPassedCommit)return{error:"pipeline worktree has not been provisioned",status:409};let d=Z(g,c.exec);if(!d.ok)return{error:d.error,status:409};j&&(j.state="skipped",j.completedAt=c.now(),j.output="Skipped by operator."),a4(g,h,c,j)}else if("override-stage"===b.action){if(aA.has(g.state))return{error:"pipeline is closed or completed",status:409};let a="string"==typeof b.stageId?b.stageId:null,d=a?g.stages.find(b=>b.id===a)??null:null;if(!d)return{error:"stage not found",status:404};let e=g.runs.find(a=>a.stageId===d.id);if(e&&e.attempts.length>0)return{error:"stage has already started",status:409};let f=void 0!==b.role||void 0!==b.engine||void 0!==b.model||void 0!==b.effort;if(!f&&void 0===b.prompt)return{error:"override-stage needs at least one field to change",status:400};if(void 0!==b.engine&&"claude"!==b.engine&&"codex"!==b.engine)return{error:"engine must be claude or codex",status:400};if(void 0!==b.model&&null!==b.model&&"string"!=typeof b.model)return{error:"model must be a string or null",status:400};if(void 0!==b.effort&&null!==b.effort&&"string"!=typeof b.effort)return{error:"effort must be a string or null",status:400};if(f){let a=d.role;if(void 0!==b.role)if(null===b.role)a=void 0;else{if("object"!=typeof b.role||Array.isArray(b.role))return{error:"role must be an object or null",status:400};let c="string"==typeof b.role.roleId?b.role.roleId.trim():"";if(!c)return{error:"role requires a roleId",status:400};let d=b.role.params;if(void 0!==d&&(!d||"object"!=typeof d||Array.isArray(d)))return{error:"role params must be an object",status:400};if(d&&Object.values(d).some(a=>"string"!=typeof a&&"number"!=typeof a))return{error:"role params must be strings or numbers",status:400};let e=d?am(c,d):null;if(e)return{error:e,status:400};a={roleId:c,...d&&Object.keys(d).length?{params:d}:{}}}let e=void 0!==b.role,f=an({role:a,engine:void 0!==b.engine?b.engine:e?void 0:d.engine,model:void 0!==b.model?b.model:e?void 0:d.model,effort:void 0!==b.effort?b.effort:e?void 0:d.effort,access:d.access},d.kind,c.roleLookup);if(!f.role)return{error:f.error??"invalid stage role",status:400};if(d.effectiveRole=f.role,d.role=a,d.engine=f.role.engine,d.model=f.role.model,d.effort=f.role.effort,d.access=f.role.access,!(0,ap.E0)(d.effectiveRole))return{error:"stage role is not a valid engine/model/effort combination",status:400}}if(void 0!==b.prompt){if("string"!=typeof b.prompt||!b.prompt.trim())return{error:"prompt must be a non-empty string",status:400};let a=b.prompt.trim();if(a.length>ab.Y3)return{error:`stage prompt exceeds ${ab.Y3} characters`,status:400};d.prompt=a}}else{if("delete"===b.action)return"draft"!==g.state?{error:"only draft pipelines can be deleted",status:409}:(g.hiddenAt=c.now(),f(),{pipeline:g});if("close"!==b.action)return{error:"unknown pipeline action",status:400};if("draft"===g.state)return g.hiddenAt=c.now(),f(),{pipeline:g};if(void 0!==b.acknowledgeHosts&&"boolean"!=typeof b.acknowledgeHosts)return{error:"acknowledgeHosts must be a boolean",status:400};let a={stopped:[],alreadyStopped:[],unconfirmed:[],acknowledged:[],reviewers:[],stillRunning:[],notes:[],worktree:null},d=c.monotonicNow()+1e4,e=bM(g);for(let b=0;b<e.length;b+=1){let f=e[b],{target:g,turnSettled:h}=f;if(b>0&&c.monotonicNow()>=d){for(let c of e.slice(b))a.unconfirmed.push({...c.target,operationId:null,detail:"close teardown budget expired before this host was probed"});break}let i=await c.stopStageAgent(g);if("stopped"===i.outcome)a.stopped.push(g);else if("failed"===i.outcome){let b=await bK(f,c);if(b){let d=`stop failed with "${i.error}"; terminalized from ${b}`;a.alreadyStopped.push(g),a.notes.push({...g,detail:d}),bL(f,d,c)}else a.stillRunning.push({...g,error:i.error})}else if("unconfirmed"===i.outcome)a.unconfirmed.push({...g,operationId:i.operationId,detail:i.detail});else if(!h&&g.paneId){let b=await c.stopStagePane(g);"stopped"===b.outcome?a.stopped.push(g):"failed"===b.outcome?a.stillRunning.push({...g,error:b.error}):"unknown"===b.outcome?a.unconfirmed.push({...g,operationId:null,detail:b.detail}):(a.alreadyStopped.push(g),bL(f,"the stage pane was already absent when the pipeline closed",c))}else a.alreadyStopped.push(g),bL(f,"the stage host was already absent when the pipeline closed",c)}if(a.worktree=function(a,b){if("provisioning"===a.state||!a.lastPassedCommit||!b.worktreePresent(a.worktreeDir))return null;let c=function(a,b,c=20){let d=b("git",["status","--porcelain"],a.worktreeDir);if(0!==d.code)return W("checking the pipeline worktree",d);let e=d.stdout.split("\n").map(a=>a.trimEnd()).filter(a=>a.length>3).map(a=>a.slice(3).split(" -> ").at(-1).trim()).filter(a=>a.length>0);return{ok:!0,paths:e.slice(0,c),truncated:e.length>c}}(a,b.exec);return c.ok?{dir:a.worktreeDir,uncommitted:c.paths,truncated:c.truncated}:{dir:a.worktreeDir,uncommitted:[],truncated:!1,error:c.error}}(g,c),a.stillRunning.length>0){let b=`could not stop ${a.stillRunning.map(a=>`${bN(a)}: ${a.error}`).join("; ")}`;return g.stateDetail=b,f(),{error:b,status:409,close:a}}if(k&&"closed"!==k.state){let b=await c.closeFlow(k.id);if(b?.error)return h&&j&&a.stillRunning.push({stageId:h.id,attempt:j.n,conversationId:j.conversationId,agentPath:j.agentPath,paneId:j.paneId,error:b.error}),g.stateDetail=b.error,f(),{error:b.error,status:b.status??409,close:a};b?.stoppedReviewer&&h&&j&&a.reviewers.push({stageId:h.id,attempt:j.n,flowId:k.id,round:b.stoppedReviewer.round})}return h&&(!j||g.cursor?.state==="pending"&&aD.has(j.state))&&aV(g,h),g.state="closed",g.cursor=null,g.pausedState=null,!0===b.acknowledgeHosts&&a.unconfirmed.length>0&&(a.acknowledged.push(...a.unconfirmed.map(a=>({...a,detail:a.detail}))),a.unconfirmed.length=0),g.stateDetail=function(a){let b=[],c=a.stopped.filter(a=>a.adopted).length,d=a.stopped.length-c;for(let e of(d>0&&b.push(`stopped ${d} stage host${1===d?"":"s"}`),c>0&&b.push(`stopped ${c} adopted agent${1===c?"":"s"}`),a.reviewers.length>0&&b.push(`stopped ${a.reviewers.length} review round${1===a.reviewers.length?"":"s"}`),a.unconfirmed))b.push(`${e.detail} for ${bN(e)}${e.operationId?` (operation ${e.operationId})`:""}`);for(let c of(a.acknowledged.length>0&&b.push(`dismissed ${a.acknowledged.length} unconfirmed host${1===a.acknowledged.length?"":"s"} on the operator's word`),a.notes))b.push(`${c.detail} for ${bN(c)}`);if(a.worktree?.error)b.push(`could not read the worktree at ${a.worktree.dir}: ${a.worktree.error}`);else{let c=a.worktree?.uncommitted.length??0;c>0&&b.push(`kept ${c}${a.worktree?.truncated?"+":""} uncommitted path${1===c?"":"s"} in the worktree`)}return b.length>0?`closed; ${b.join("; ")}`:null}(a),g.closedAt=c.now(),g.unconfirmedHosts=a.unconfirmed.length>0?a.unconfirmed.map(a=>({stageId:a.stageId,attempt:a.attempt,conversationId:a.conversationId,agentPath:a.agentPath,paneId:a.paneId,operationId:a.operationId,detail:a.detail,at:g.closedAt})):void 0,g.hiddenAt=g.unconfirmedHosts?null:g.closedAt,f(),{pipeline:g,close:a}}return f(),{pipeline:g}})}function bP(){return{pipelines:(0,ap.IR)()}}}};
|