@coreframe/dev 0.1.35 → 0.1.37

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.
@@ -0,0 +1,2 @@
1
+ import{managedDevCodexArgs as e,managedDevCodexAuthor as t,managedDevCodexHighArgs as n}from"./codex-model.js";import{reserveManagedProcess as r}from"./managed-dev-process.js";import{access as i}from"node:fs/promises";import{randomUUID as a}from"node:crypto";import{constants as o}from"node:fs";import s from"node:path";import{stripVTControlCharacters as c}from"node:util";import l from"nano-spawn";import{spawn as u}from"node:child_process";import{createInterface as d}from"node:readline";async function f(n,i,o,s,c,l){if(v(l),process.platform===`win32`)throw Error(`Managed Codex requires process-tree isolation unavailable on Windows; ownership is retained until shutdown.`);let f=await r(n),g=u(`codex`,[`exec`,...e(s),`--ephemeral`,`--ignore-user-config`,`--json`,`--sandbox`,`workspace-write`,`--cd`,n,o],{cwd:n,env:{...i,GIT_AUTHOR_EMAIL:i.GIT_AUTHOR_EMAIL??`codex@managed-dev.local`,GIT_AUTHOR_NAME:i.GIT_AUTHOR_NAME??`Codex`,GIT_COMMITTER_EMAIL:i.GIT_COMMITTER_EMAIL??`codex@managed-dev.local`,GIT_COMMITTER_NAME:i.GIT_COMMITTER_NAME??`Codex`},detached:!0,stdio:[`ignore`,`pipe`,`pipe`]}),b=new Promise((e,t)=>{g.once(`error`,t),g.once(`close`,(n,r)=>{n===0?e():t(Error(`Codex exited with ${r??n}.`))})});b.catch(()=>void 0),await f?.spawned(g.pid);let x,S,C=e=>{if(g.pid)try{process.kill(-g.pid,e)}catch(e){e.code!==`ESRCH`&&(S=Error(`Unresolved Codex process ownership: could not terminate process group; stop the owned processes before replacing this owner.`))}},w,T,E=new Promise((e,t)=>{T=t}),D=new Map,O=a(),k=e=>{let t=p(e,O,D);t&&(t.status===`running`?D.set(t.id,t):D.delete(t.id),c({phase:`activity`,activity:t}))},A=``,j=[],M=()=>{C(`SIGTERM`),x??=setTimeout(()=>C(`SIGKILL`),500),w??=setTimeout(()=>{S=Error(`Unresolved Codex process ownership: exit or streams did not settle after forced termination; ownership is retained.`),T(S)},3e3)};l?.addEventListener(`abort`,M),l?.aborted&&M();try{let e=(await Promise.race([E,Promise.allSettled([b,h(d({input:g.stdout}),e=>{k(e);let n=m(e,t(s));n&&(n.kind===`agent`&&(A=n.text),c({message:n,phase:`message`}))}),h(d({input:g.stderr}),e=>j.push(e))])])).find(e=>e.status===`rejected`);if(e?.status===`rejected`)throw e.reason;v(l)}catch(e){c({phase:`error`}),v(l);let t=j.join(`
2
+ `).trim();throw t?Error(`${y(e)}\n${t}`):e}finally{for(let e of D.values())e.status===`running`&&c({phase:`activity`,activity:{...e,status:l?.aborted?`cancelled`:`interrupted`,finishedAt:Date.now()}});if(clearTimeout(w),x&&(clearTimeout(x),C(`SIGKILL`),g.pid&&!S)){let e=Date.now()+2e3;for(;_(-g.pid)&&Date.now()<e;)await new Promise(e=>setTimeout(e,20));_(-g.pid)&&(S=Error(`Unresolved Codex process ownership: process group remains after forced termination; ownership is retained.`))}if(S)throw S;l?.removeEventListener(`abort`,M),await f?.release()}return A}function p(e,t,n){let r;try{r=JSON.parse(e)}catch{return}if(!r||typeof r!=`object`)return;let i=r;if(typeof i.type!=`string`||![`item.started`,`item.updated`,`item.completed`].includes(i.type)||!i.item||typeof i.item!=`object`)return;let a=i.item;if(typeof a.id!=`string`)return;let o=a.type===`command_execution`?a.command:a.type===`mcp_tool_call`&&typeof a.server==`string`&&typeof a.tool==`string`?`${a.server}.${a.tool}`:void 0;if(typeof o!=`string`||typeof a.status!=`string`)return;let s=`${t}:${a.id}`,l=n.get(s),u=i.type===`item.completed`,d=typeof a.exit_code==`number`?a.exit_code:void 0,f=u?a.status===`failed`||d!==void 0&&d!==0?`failed`:a.status===`completed`?`succeeded`:`interrupted`:`running`,p=o.match(/^(?:\S*\/)?(?:bash|zsh|sh)\s+-(?:lc|c|cl)\s+(['"])([\s\S]*)\1$/)?.[2]??o;return{id:s,label:a.type===`mcp_tool_call`?`Calling tool`:/^(?:pnpm|npm|yarn|bun) (?:install|ci|add)(?: |$)/.test(p)?`Installing dependencies`:/^(?:pnpm|npm|yarn|bun) (?:run )?test(?: |$)/.test(p)?`Running tests`:/^(?:pnpm|npm|yarn|bun) (?:run )?typecheck(?: |$)/.test(p)?`Checking types`:`Running command`,command:o.slice(0,2e3),source:`codex`,status:f,startedAt:l?.startedAt??Date.now(),finishedAt:u?Date.now():void 0,exitCode:d,output:typeof a.aggregated_output==`string`?c(a.aggregated_output).slice(-8e3):l?.output}}function m(e,t){let n;try{n=JSON.parse(e)}catch{throw Error(`Codex emitted invalid JSONL output.`)}if(!n||typeof n!=`object`)return;let r=n.item;if(n.type!==`item.completed`||!r||typeof r!=`object`)return;let{text:i,type:a}=r;if(!(typeof i!=`string`||!i.trim())){if(a===`reasoning`)return{kind:`thought`,text:i};if(a===`agent_message`)return{author:t,kind:`agent`,text:i}}}async function h(e,t){for await(let n of e)t(n)}async function g(e,t){let n=t.PATH??t.Path??t.path??``,r=process.platform===`win32`?(t.PATHEXT??`.COM;.EXE;.BAT;.CMD`).split(`;`):[``];for(let t of n.split(s.delimiter))for(let n of r)try{return await i(s.join(t||`.`,`${e}${n}`),o.X_OK),!0}catch{}return!1}function _(e){try{return process.kill(e,0),!0}catch(e){return!(e instanceof Error&&`code`in e&&e.code===`ESRCH`)}}function v(e){if(e?.aborted)throw Error(`The update integration was cancelled.`)}function y(e){return e instanceof Error?e.message:String(e)}async function b(e,t,r){return l(`codex`,[`exec`,...n,`--ephemeral`,`--ignore-user-config`,`--sandbox`,`read-only`,`--cd`,e,`Return only a concise Conventional Commits message for the supplied working-tree changes. Use a body only when it adds material context.`],{cwd:e,env:t,stdin:{string:r}})}export{g as executableExists,f as executeCodex,b as requestCommitMessage};
@@ -0,0 +1 @@
1
+ import{reserveManagedProcess as e}from"./managed-dev-process.js";import t from"nano-spawn";async function n(n,r){let{signal:i,...a}=r,o=i&&r.cwd?await e(String(r.cwd)):void 0,s=t(process.platform===`win32`?`pnpm.cmd`:`pnpm`,n,{...a,stdin:a.stdin??`ignore`,detached:!!i&&process.platform!==`win32`});if(s.catch(()=>void 0),!i)return s;let c=await s.nodeChildProcess;await o?.spawned(c.pid);let l,u,d,f,p=new Promise((e,t)=>{f=t}),m=()=>{if(!c.pid)return!1;try{return process.kill(-c.pid,0),!0}catch(e){return e.code!==`ESRCH`}},h=e=>{if(c.pid)try{process.platform===`win32`?(c.kill(e),d=Error(`Unresolved managed process ownership: process-tree cancellation is unavailable on this platform; ownership is retained.`)):process.kill(-c.pid,e)}catch(e){e.code!==`ESRCH`&&(d=Error(`Unresolved managed process ownership: process group could not be terminated; ownership is retained.`))}},g=()=>{h(`SIGTERM`),l??=setTimeout(()=>h(`SIGKILL`),500),u??=setTimeout(()=>f(Error(`Unresolved managed process ownership: exit or streams did not settle after termination; ownership is retained.`)),3e3)};i.addEventListener(`abort`,g),i.aborted&&g();try{return await Promise.race([s,p])}finally{if(i.removeEventListener(`abort`,g),clearTimeout(l),clearTimeout(u),i.aborted){h(`SIGKILL`);let e=Date.now()+2e3;for(;m()&&Date.now()<e&&process.platform!==`win32`;)await new Promise(e=>setTimeout(e,20));m()&&(d??=Error(`Unresolved managed process ownership: process group remains after termination; ownership is retained.`))}if(d)throw d;await o?.release()}}function r(e,n,r){return t(e,n,r)}export{r as runDatabaseCommand,n as runProjectCommand};
@@ -0,0 +1,2 @@
1
+ import{devDiagnosticPhase as e}from"@coreframe/dev-supervisor";import t,{SubprocessError as n}from"nano-spawn";import{spawn as r}from"node:child_process";async function i(n,r,{env:i}={}){let a=r[0];if((a===`status`||a===`diff`)&&(r=[`--no-optional-locks`,...r]),r[0]===`rebase`){let e=r.some(e=>[`--continue`,`--abort`,`--skip`,`--quit`].includes(e));r=[`-c`,`rebase.updateRefs=false`,`-c`,`rebase.backend=merge`,...r,...e?[]:[`--merge`,`--no-update-refs`]]}let o=()=>t(`git`,r,{cwd:n,env:i,stdin:`ignore`});return[`add`,`branch`,`commit`,`fetch`,`merge`,`rebase`,`cherry-pick`,`reset`,`update-ref`,`worktree`].includes(a)?e(`git.${a}`,o,{continuation:r.includes(`--continue`),abort:r.includes(`--abort`)}):o()}async function a(e,r,i){try{return await t(`git`,r,{cwd:e,env:i,stdin:`ignore`}),!0}catch(e){if(e instanceof n&&e.exitCode===1)return!1;throw e}}async function o(e,t,n){let i=n?[`cat-file`,`--filters`,`--path=${n}`,t]:[`cat-file`,`blob`,t];return new Promise((t,n)=>{let a=r(`git`,i,{cwd:e,stdio:[`ignore`,`pipe`,`pipe`]}),o=[],s=[];a.stdout.on(`data`,e=>o.push(e)),a.stderr.on(`data`,e=>s.push(e)),a.once(`error`,n),a.once(`close`,e=>{e===0?t(Buffer.concat(o)):n(Error(`git ${i[0]} failed: ${Buffer.concat(s).toString(`utf8`)}`))})})}function s(e,n){return t(`git`,[`update-ref`,`--stdin`],{cwd:e,stdin:{string:`${n.join(`
2
+ `)}\n`}})}export{i as git,o as gitBlob,a as gitQuiet,s as updateGitRefs};
@@ -0,0 +1 @@
1
+ import{readFile as e,rename as t,rm as n,writeFile as r}from"node:fs/promises";import{randomUUID as i}from"node:crypto";import a from"node:path";import{isManagedDevOperationActive as o,managedDevOperationPhases as s}from"@coreframe/dev-contracts/managed-dev";const c=new Set([`succeeded`,`cancelled`,`failed`,`interrupted`]);var l=class{sessionId;changed;persistenceFailed;snapshot;file;dirty=!1;writing;constructor(e,t,n){this.sessionId=e,this.changed=t,this.persistenceFailed=n}async restore(t){this.file=a.join(t,`coreframe-managed-dev-operation.json`);try{let t=await e(this.file,`utf8`),n=JSON.parse(t);if(!u(n))throw Error(`Invalid managed operation checkpoint`);if(this.snapshot=n.operation,o(this.snapshot)){let e=Date.now();this.update({sessionId:this.sessionId,state:`interrupted`,phase:`finished`,cancellation:`unavailable`,finishedAt:e,message:this.snapshot.published?`The supervisor stopped after applying changes. Review setup and checks before continuing.`:`The supervisor stopped before this update finished. Review the recovered Git state before retrying.`,turns:this.snapshot.turns.map(t=>t.status===`running`?{...t,status:`interrupted`,finishedAt:e}:t),steps:this.snapshot.steps.map(t=>t.status===`running`?{...t,status:`interrupted`,finishedAt:e}:t),activities:this.snapshot.activities.map(t=>t.status===`running`?{...t,status:`interrupted`,finishedAt:e}:t)})}else this.update({sessionId:this.sessionId})}catch(e){e.code!==`ENOENT`&&this.persistenceFailed(e)}}begin(e,t,n,r){let a=this.snapshot,o=Date.now();this.snapshot=r&&a?.target===t?{...a,sessionId:this.sessionId,requestIds:[...new Set([...a.requestIds,n])].slice(-20),state:`running`,phase:`preparing`,cancellation:`available`,cancellationDeferred:!1,finishedAt:void 0,message:void 0}:{id:i(),requestIds:[n],revision:0,sessionId:this.sessionId,source:e,target:t,kind:`rebase`,state:`running`,phase:`preparing`,cancellation:`available`,published:!1,startedAt:o,updatedAt:o,turns:[],steps:[],activities:[]},this.update({})}phase(e){this.snapshot&&this.snapshot.phase!==e&&this.update({phase:e})}published(){this.snapshot&&this.update({published:!0})}cancel(e){this.snapshot&&o(this.snapshot)&&this.update({state:`cancelling`,cancellation:`requested`,cancellationDeferred:e})}pause(e){this.snapshot&&this.update({state:`awaiting-resolution`,phase:`awaiting-resolution`,cancellation:`unavailable`,progress:{applied:e.applied,total:e.applied+e.commits.length+(e.dropped?.length??0),skipped:e.dropped?.length??0,remaining:e.commits.length,current:e.commits[0],files:e.files}})}finish(e,t){if(!this.snapshot)return;let n=Date.now();this.update({state:e,phase:`finished`,cancellation:`unavailable`,cancellationDeferred:!1,finishedAt:n,message:t,progress:e===`succeeded`&&this.snapshot.progress?{...this.snapshot.progress,applied:Math.max(0,(this.snapshot.progress.total??this.snapshot.progress.applied)-this.snapshot.progress.skipped),remaining:0,current:void 0,files:[]}:this.snapshot.progress,turns:this.snapshot.turns.map(t=>t.status===`running`?{...t,status:e===`failed`?`failed`:`interrupted`,finishedAt:n}:t),steps:this.snapshot.steps.map(t=>t.status===`running`?{...t,status:e===`succeeded`?`succeeded`:`interrupted`,finishedAt:n}:t),activities:this.snapshot.activities.map(t=>t.status===`running`?{...t,status:e===`cancelled`?`cancelled`:`interrupted`,finishedAt:n}:t)})}activity(e){if(!this.snapshot||!o(this.snapshot))return;let t=[...this.snapshot.activities.filter(t=>t.id!==e.id),e],n=t.filter(e=>e.status!==`running`).slice(-30);this.update({activities:t.filter(e=>e.status===`running`||n.includes(e))})}codex(e){if(!this.snapshot||!o(this.snapshot)||e.phase===`activity`)return;let t=e.stage??`resolve`,n=this.snapshot.turns,r=n.at(-1);(e.phase===`start`||!r||r.stage!==t)&&(r?.status===`running`&&(n=n.map(e=>e===r?{...e,status:`complete`,finishedAt:Date.now()}:e)),r={id:i(),stage:t,startedAt:Date.now(),status:`running`,messages:[]},n=[...n,r]),(e.phase===`start`||e.phase===`message`)&&(r={...r,messages:[...r.messages,e.message]}),e.phase===`complete`&&(r={...r,status:`complete`,finishedAt:Date.now(),finalMessage:e.finalMessage}),e.phase===`error`&&(r={...r,status:`failed`,finishedAt:Date.now()}),n=[...n.slice(0,-1),r];let a=0,s=!!(this.snapshot.historyTruncated||n.length>20);n=n.slice(-20).reverse().map(e=>{let t=a>=1e5?void 0:e.finalMessage?.slice(-(1e5-a));return t!==e.finalMessage&&(s=!0),a+=t?.length??0,{...e,finalMessage:t,messages:e.messages.slice().reverse().flatMap(e=>{if(a>=1e5)return s=!0,[];let t=e.text.slice(-(1e5-a));return t.length!==e.text.length&&(s=!0),a+=t.length,[{...e,text:t}]}).reverse()}}).reverse();let c=`commits`in e?{applied:e.commits.length,total:e.totalCommits??this.snapshot.progress?.total,skipped:this.snapshot.progress?.skipped??0,remaining:(e.totalCommits??this.snapshot.progress?.total)===void 0?void 0:Math.max(0,(e.totalCommits??this.snapshot.progress.total)-e.commits.length-(this.snapshot.progress?.skipped??0)),current:e.phase===`start`?e.currentCommit:this.snapshot.progress?.current,files:e.phase===`start`?e.files:this.snapshot.progress?.files}:this.snapshot.progress;this.update({turns:n,historyTruncated:s,progress:t===`verify`&&c?{...c,current:void 0,files:[]}:c,phase:t===`verify`?`verifying`:`resolving`})}observe({event:e,properties:t}){let n=this.snapshot;if(!o(n)||!n?.requestIds.includes(String(t.operationId)))return;if(e===`integration.aborting`){this.phase(`cleanup`);return}if(e===`integration.fallback`){let e=Date.now();this.update({kind:`merge`,phase:`merging`,steps:[...n.steps,{id:i(),label:`Rebase conflicted; falling back to merge`,phase:`merging`,status:`succeeded`,startedAt:e,finishedAt:e}]});return}if(e===`integration.strategy`){this.update({kind:t.strategy===`fast-forward`?`fast-forward`:`rebase`});return}if(e===`integration.replay`){let e=typeof t.totalCommits==`number`?t.totalCommits:void 0;this.update({kind:t.operation===`merge`?`merge`:`rebase`,phase:t.operation===`merge`?`merging`:`replaying`,progress:{applied:0,skipped:0,total:e,remaining:e}});return}if(!e.startsWith(`phase.`)||typeof t.phaseId!=`string`||typeof t.phase!=`string`)return;let r=t.phase;if(r===`action`||r===`session.activate`||r===`refresh`)return;let a=r.startsWith(`verification.`)||r===`codex`&&t.purpose===`verify`?`verifying`:r===`codex`?`resolving`:r.startsWith(`setup.`)?`setup`:r===`check`?`checks`:r===`refs.publish`?`publishing`:r===`git.rebase`&&!t.abort?`replaying`:r===`git.merge`&&!t.abort?`merging`:n.phase,s={integration:`Prepare integration`,codex:t.purpose===`verify`?`AI verification`:`AI conflict resolution`,"git.worktree":`Manage temporary worktree`,"git.rebase":t.abort?`Abort rebase`:t.continuation?`Continue rebase`:`Replay commits`,"git.merge":t.abort?`Abort merge`:t.continuation?`Continue merge`:`Merge branches`,"git.cherry-pick":`Replay recorded commits`,"git.add":`Stage prepared changes`,"git.commit":`Save changes`,"git.update-ref":`Update recovery refs`,"git.reset":`Restore prepared checkout`,"refs.publish":`Apply prepared history`,"git.fetch":`Fetch upstream`,check:t.script===`test`?`Run tests`:`Check types`}[r]??(r.startsWith(`verification.`)?`Verification: ${r.slice(13)}`:r.startsWith(`setup.`)?`Environment: ${r.slice(6)}`:r),c=n.steps.find(e=>e.id===t.phaseId);if(!c&&e!==`phase.started`)return;let l=typeof t.durationMs==`number`?t.durationMs:0,u={id:t.phaseId,label:s,phase:a,status:e===`phase.failed`?`failed`:e===`phase.completed`?`succeeded`:`running`,startedAt:c?.startedAt??Date.now(),finishedAt:e===`phase.completed`||e===`phase.failed`?(c?.startedAt??Date.now())+l:void 0,pulse:e===`phase.slow`?(c?.pulse??0)+1:c?.pulse},d=[...n.steps.filter(e=>e.id!==u.id),u],f=d.filter(e=>e.status!==`running`).slice(-60);this.update({steps:d.filter(e=>e.status===`running`||f.includes(e)),phase:e===`phase.started`?a:n.phase})}async dismiss(e){this.snapshot?.id!==e||!c.has(this.snapshot.state)||(await this.flush(),this.snapshot=void 0,this.file&&await n(this.file,{force:!0}),this.changed(void 0))}async flush(){await this.writing}update(e){this.snapshot&&(this.snapshot={...this.snapshot,...e,revision:this.snapshot.revision+1,updatedAt:Date.now()},this.changed(this.snapshot),this.dirty=!0,!this.writing&&this.file&&(this.writing=(async()=>{for(;this.dirty&&this.file;)this.dirty=!1,await r(`${this.file}.tmp`,JSON.stringify({version:1,operation:this.snapshot}),{mode:384}),await t(`${this.file}.tmp`,this.file)})().catch(e=>{this.persistenceFailed(e)}).finally(()=>{this.writing=void 0})))}};function u(e){if(!e||typeof e!=`object`)return!1;let t=e,n=t.operation,r=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),i=e=>typeof e==`number`&&Number.isFinite(e),a=e=>e===void 0||i(e),o=e=>e===void 0||typeof e==`string`,l=e=>{let t=e;return t===void 0||!!(t&&typeof t.commit==`string`&&typeof t.shortCommit==`string`&&typeof t.subject==`string`)};return t.version===1&&!!(n&&typeof n==`object`&&typeof n.id==`string`&&r(n.requestIds)&&typeof n.sessionId==`string`&&typeof n.target==`string`&&[`dev`,`upstream`].includes(n.source)&&[`rebase`,`merge`,`fast-forward`].includes(n.kind)&&[`running`,`cancelling`,`awaiting-resolution`,...c].includes(n.state)&&n.phase in s&&i(n.revision)&&i(n.startedAt)&&i(n.updatedAt)&&a(n.finishedAt)&&o(n.message)&&(n.cancellationDeferred===void 0||typeof n.cancellationDeferred==`boolean`)&&(n.historyTruncated===void 0||typeof n.historyTruncated==`boolean`)&&(n.progress===void 0||n.progress&&i(n.progress.applied)&&i(n.progress.skipped)&&a(n.progress.total)&&a(n.progress.remaining)&&l(n.progress.current)&&(n.progress.files===void 0||r(n.progress.files)))&&typeof n.published==`boolean`&&[`available`,`requested`,`unavailable`].includes(n.cancellation)&&Array.isArray(n.turns)&&n.turns.every(e=>e&&typeof e.id==`string`&&[`resolve`,`verify`].includes(e.stage)&&[`running`,`complete`,`failed`,`interrupted`].includes(e.status)&&i(e.startedAt)&&a(e.finishedAt)&&o(e.finalMessage)&&Array.isArray(e.messages)&&e.messages.every(e=>e&&[`user`,`agent`,`thought`].includes(e.kind)&&typeof e.text==`string`&&o(e.author)))&&Array.isArray(n.steps)&&n.steps.every(e=>e&&typeof e.id==`string`&&typeof e.label==`string`&&e.phase in s&&[`running`,`succeeded`,`failed`,`interrupted`].includes(e.status)&&i(e.startedAt)&&a(e.finishedAt)&&a(e.pulse))&&Array.isArray(n.activities)&&n.activities.every(e=>e&&typeof e.id==`string`&&typeof e.label==`string`&&[`codex`,`supervisor`].includes(e.source)&&[`running`,`succeeded`,`failed`,`cancelled`,`interrupted`].includes(e.status)&&i(e.startedAt)&&a(e.finishedAt)&&o(e.command)&&o(e.output)&&a(e.exitCode)))}export{l as ManagedDevOperationState};
@@ -0,0 +1 @@
1
+ import{git as e}from"./managed-dev-git.js";import{readFile as t,readdir as n,rename as r,rm as i,writeFile as a}from"node:fs/promises";import{randomUUID as o}from"node:crypto";import s from"node:path";import c from"nano-spawn";const l=`coreframe-managed-dev-process-`;function u(e){try{return process.kill(e,0),!0}catch(e){return e.code!==`ESRCH`}}async function d(e){let{stdout:t}=await c(`ps`,[`-o`,`lstart=`,`-p`,String(e)]);return t.trim()}async function f(t){let n=await e(t,[`rev-parse`,`--git-common-dir`]),c=s.join(s.resolve(t,n.stdout.trim()),`${l}${o()}.json`),f={version:1,owner:process.pid};return await a(c,JSON.stringify(f),{mode:384,flag:`wx`}),{async spawned(e){e&&(f.pid=e,f.started=await d(e).catch(()=>``),await a(`${c}.tmp`,JSON.stringify(f),{mode:384}),await r(`${c}.tmp`,c))},async release(){f.pid&&u(-f.pid)&&await m(f.pid),await i(c,{force:!0})}}}async function p(e){for(let r of await n(e)){if(!r.startsWith(l)||!r.endsWith(`.json`))continue;let n=s.join(e,r),a;try{if(a=JSON.parse(await t(n,`utf8`)),a?.version!==1||!Number.isInteger(a.owner)||a.owner<=0||a.pid!==void 0&&(!Number.isInteger(a.pid)||a.pid<=0))throw Error(`Invalid process record`)}catch{throw h(`an ownership record is unreadable; review it before recovery`)}if(u(a.owner))throw h(`another process still owns a managed command`);if(!a.pid)throw h(`the previous owner stopped while spawning a command; review its processes before recovery`);if(u(-a.pid)){let e=await d(a.pid).catch(()=>``);if(!a.started||e!==a.started)throw h(`an orphan group cannot be identified safely; stop the owned processes before recovery`);await m(a.pid)}await i(n,{force:!0})}}async function m(e){for(let t of[`SIGTERM`,`SIGKILL`]){try{process.kill(-e,t)}catch(e){if(e.code!==`ESRCH`)throw h(`could not stop the owned group`)}let n=Date.now()+(t===`SIGTERM`?500:2e3);for(;u(-e)&&Date.now()<n;)await new Promise(e=>setTimeout(e,20));if(!u(-e))return}throw h(`the owned group remains after termination`)}function h(e){return Error(`Unresolved managed process ownership: ${e}; ownership is retained.`)}export{p as recoverManagedProcesses,f as reserveManagedProcess};
@@ -40,6 +40,7 @@ type ManagedDevVerificationDatabase = {
40
40
  type ManagedDevSession = {
41
41
  action(action: ManagedDevAction, options?: {
42
42
  operationId?: string;
43
+ requestKey?: string;
43
44
  onCodexEvent?(event: ManagedDevCodexEvent): void;
44
45
  }): Promise<ManagedDevActionResult>;
45
46
  activate(): Promise<void>;
@@ -1,16 +1,13 @@
1
- import{managedDevCodexArgs as e,managedDevCodexAuthor as t,managedDevCodexHighArgs as n,requireManagedDevCodexOptions as r}from"./codex-model.js";import{ensurePandaCodegen as i}from"./panda-codegen.js";import a from"node:process";import{access as o,copyFile as s,link as c,lstat as l,mkdir as u,mkdtemp as d,open as f,readFile as p,readdir as m,readlink as h,realpath as g,rename as _,rm as v,rmdir as y,symlink as b,unlink as x,writeFile as S}from"node:fs/promises";import{pathToFileURL as C}from"node:url";import{startTemporaryProjectPostgres as w,startTemporaryProjectTurso as T}from"@coreframe/db";import{DevDiagnostics as E,devDiagnosticContext as D,devDiagnosticError as O,devDiagnosticEvent as k,devDiagnosticPhase as A}from"@coreframe/dev-supervisor";import{spawn as j}from"node:child_process";import{createHash as M,randomBytes as N,randomUUID as P}from"node:crypto";import{constants as ee,watch as te}from"node:fs";import F from"node:path";import{createInterface as ne}from"node:readline";import{stripVTControlCharacters as re}from"node:util";import{managedDevCodexEfforts as I,managedDevCodexModels as ie}from"@coreframe/dev-contracts/managed-dev";import{resolve as ae}from"import-meta-resolve";import L,{SubprocessError as oe}from"nano-spawn";const R=`refs/heads/main`,se=`refs/heads/dev`,ce=`refs/remotes/origin/main`,le=`refs/coreframe/consumed-dev`,ue=/^[a-z][a-z0-9-]*(?:\([^)]+\))?!?:\s+\S/i,de=`coreframe-managed-dev-publication.json`,z=`coreframe-managed-dev `,fe=`coreframe-managed-dev-codex-completion.json`,pe=`coreframe-managed-dev-codex-options.json`,me=`coreframe-managed-dev-setup-failure.json`;async function B(e=a.cwd()){let t=await we(e);return t.primary&&t.branch===`main`&&t.head===t.main}async function he(e=a.cwd()){try{let{commonDir:t,gitDir:n}=await V(e);return n===t}catch{return!1}}async function V(e){let t=await g(await Z(e,[`rev-parse`,`--show-toplevel`])),n=await g(e),r=F.resolve(n,await Z(e,[`rev-parse`,`--git-dir`])),i=F.resolve(n,await Z(e,[`rev-parse`,`--git-common-dir`]));return{commonDir:i,gitDir:r,primary:t===n&&r===i}}async function H({config:e,cwd:t=a.cwd(),env:n=a.env,localCheckInterval:o=1e3,onFlutterRestart:s=()=>void 0,onPublishMutation:c,onPublishStage:l,onRestart:u=()=>void 0,onStatusChange:d=()=>void 0,remoteCheckInterval:f=6e4,runCheck:m=e=>Dt(t,n,e),startVerificationDatabase:h=vt,watchState:g=Ee}){let _=new E(t,`session`),v=_.instanceId,y=0,b=0,C;_.event(`session.created`,{sessionId:v});let w=n,T={mode:`waiting`,warnings:[]},j=`active`,M=new Set,ee,te=!1,ne,re=e=>(e.catch(e=>{e instanceof Error&&e.message.includes(`Unresolved Codex process ownership`)&&(ne=e)}),M.add(e),e.finally(()=>M.delete(e)).catch(()=>void 0),e),I=()=>{if(j!==`active`)throw Error(`Managed development owner is closing or closed.`)},ie=!1,ae=!1,oe,z,B,he,V=!1,H,U,ve,ye,be,Ce,Te=[],W,Me=Promise.resolve(),G=()=>{if(j===`active`){let e={...Kt(T),activityRevision:y},t=JSON.stringify(e);t!==C&&(C=t,b++,T.mode===`managed`&&(T={...T,trace:{sessionId:v,revision:b,operationId:D()?.operationId}}),_.event(`status.changed`,{sessionId:v,revision:b,...e})),d(T)}},K=e=>{y++;let t=T.activities??[],n=t.find(t=>t.id===e.id)?t.map(t=>t.id===e.id?e:t):[...t,e],r=n.filter(e=>e.status!==`running`).slice(-30);T={...T,activities:n.filter(e=>e.status===`running`||r.includes(e))},G()},Pe=(e,t,n,r)=>St(e,t,n,K,r),Fe=async({fetch:e=!1}={})=>{if(!(!ie||j!==`active`||!U)){if(ae){V=!0;return}try{let[n,r,i]=await Promise.all([Z(t,[`rev-parse`,`--abbrev-ref`,`HEAD`]),Z(t,[`rev-parse`,`HEAD`]),Z(t,[`rev-parse`,R])]);if(n!==`main`||r!==i){T={message:`Managed synchronization is paused until the primary checkout is back on local main.`,mode:`waiting`,warnings:he?[he]:[]};return}r!==H&&(H=r,W=void 0);let a=await Oe(t);if(ae){V=!0;return}if(a.tracked||a.untracked.length>0){T={...T,currentCommit:H,draft:a,message:void 0,mode:`managed`,proposal:We(a.fingerprint),target:void 0};return}if(e&&await Q(t,[`remote`,`get-url`,`origin`]))try{await X(t,[`fetch`,`origin`,`+refs/heads/main:${ce}`])}catch(e){_.event(`fetch.failed`,O(e),`warn`)}let o=await Q(t,[`rev-parse`,se]),s=await Q(t,[`rev-parse`,ce]),c=await Q(t,[`rev-parse`,le]),l=[...o?[{commit:o,source:`dev`}]:[],...s?[{commit:s,source:`upstream`}]:[]],u;for(let e of l)if(!await qt(t,e.commit,H)&&!(e.source===`dev`&&e.commit===c)){u=e;break}let d,f=!1;u?.source===`dev`&&c&&(await qt(t,c,u.commit)?d=c:f=!0),T={...T,currentCommit:H,draft:void 0,message:f?`Local dev no longer contains the last synchronized dev commit; review its full history before refreshing.`:void 0,mode:`managed`,proposal:void 0,target:u===void 0?void 0:await Ht(t,d??H,u.commit,u.source)}}catch(e){if(ae){V=!0;return}_.event(`refresh.failed`,O(e),`error`),T={...T,message:$(e),warnings:[$(e)]}}finally{G()}}},Le=(e={})=>_.run({sessionId:v,operationId:P(),trigger:e.fetch?`remote-poll`:`local-refresh`},()=>Fe(e)),Re=()=>{clearTimeout(Ce),Ce=setTimeout(()=>void Le(),50),Ce.unref()},ze=(e,t)=>{let n=async()=>{let n=[{command:`pnpm typecheck`,status:`running`},{command:`pnpm test`,status:`pending`}],r=()=>{T={...T,checks:{commit:e,commands:structuredClone(n),trigger:t}},G()};r();for(let[i,a]of[`typecheck`,`test`].entries()){i>0&&(n[i].status=`running`,r());try{await Pe(a===`test`?`Running tests`:`Checking types`,`pnpm ${a}`,()=>A(`check`,()=>m(a),{script:a,commit:e,trigger:t})),n[i].status=`passed`}catch(e){n[i].status=`failed`,n[i].failureId=N(12).toString(`hex`),n[i].output=Ot(e)}r()}};Me=Me.then(n,n)},Be=async()=>{if(ie||j!==`active`)return;let e=await we(t);if(!e.primary){T={message:`Managed development only runs from the primary checkout.`,mode:`unmanaged`,warnings:[]},G();return}if(e.branch!==`main`||e.head!==e.main){let t=`Managed development requires the primary checkout on local main; current branch is ${e.branch??`detached HEAD`}.`;console.warn(`Coreframe managed development disabled: ${t}`),T={message:t,mode:`unmanaged`,warnings:[]},G();return}I();let n=F.join(e.commonDir,`coreframe-managed-dev.lock`);await Ut(n,v),ve=n,te=!0,I(),await Q(t,[`rev-parse`,`--verify`,se])||await X(t,[`branch`,`dev`,e.head]),U=e,H=e.head;let r=await ut(t,e,c);he=r?.notice,z=r?.paused,B=z?.recoveryRef,ie=!0,T={codexCompletion:await _e(e.commonDir),codexOptions:await ge(e.commonDir),currentCommit:e.head,mode:`managed`,pendingRebase:r?.pendingRebase,setupFailure:await Se(e.commonDir,e.head),warnings:he?[he]:[]},T.setupFailure||await Je({commit:e.head,flutterRestartRequired:!1,restartRequired:!1}),G(),Te=await g(e,Re),ye=setInterval(()=>{T.draft&&Le()},o),ye.unref(),be=setInterval(()=>void Le({fetch:!0}),f),be.unref(),await Le(),Le({fetch:!0})},Ve=async(e,{onCodexEvent:n=()=>void 0}={})=>{if(I(),!ie||T.mode!==`managed`)throw Error(`Managed development is not active.`);if(e.type===`cancel-codex`){let e=oe;if(!e)throw Error(`There is no Codex conflict resolution to cancel.`);return e(),{status:T}}if(ae)throw Error(`Another managed development action is already running.`);let i=[],a=[],o,s,c=e=>{if(e.phase===`activity`){K({...e.activity,stage:e.stage});return}e.phase!==`message`&&_.event(`codex.${e.phase}`,{commitCount:`commits`in e?e.commits.length:void 0,stage:e.stage,totalCommits:`totalCommits`in e?e.totalCommits:void 0}),e.phase===`start`?(a=e.commits,o=e.totalCommits,i.splice(0,i.length,e.message)):e.phase===`message`?i.push(e.message):e.phase===`complete`?s=e.finalMessage:e.phase===`progress`&&(a=e.commits,o=e.totalCommits??o),n(e)};ae=!0,T={...T,busy:Zt(e),message:void 0};try{if(G(),e.type===`acknowledge-codex`)T.codexCompletion?.id===e.id?await ot():_.event(`completion.acknowledgment-ignored`,{requestedId:e.id,currentId:T.codexCompletion?.id});else if(e.type===`dismiss-check`)T.checks&&(T={...T,checks:{...T.checks,commands:T.checks.commands.map(t=>t.failureId===e.failureId?{...t,dismissed:!0}:t)}});else if(e.type===`reject`)T={...T,draft:void 0,proposal:void 0};else if(e.type===`configure-codex`)await at(r(e.codex));else if(e.type===`decline-rebase`){let e=T.pendingRebase;if(!e)throw Error(`There is no pending rebase to decline.`);let n=e.commits.at(-1)?.commit;if(n&&U){let r=F.join(U.commonDir,de),i=`refs/coreframe/declined/${v}-${n.slice(0,12)}`;try{await X(t,[`update-ref`,i,n]),await q(r,{version:2,operationId:D()?.operationId,sessionId:v,phase:`declined`,source:e.target.source,target:e.target.commit,expectedMain:z?await Q(t,[`rev-parse`,z.originalRef])??H??``:H??``,commit:await Z(t,[`rev-parse`,R]),checkout:{branch:R,fingerprint:H??``},declinedRef:i})}catch(e){k(`rebase.decline-record-failed`,O(e),`warn`)}for(let e of[z?.originalRef,z?.preparedRef])e&&e!==i&&await X(t,[`update-ref`,`-d`,e]).catch(()=>void 0)}B&&=(await X(t,[`update-ref`,`-d`,B]).catch(()=>void 0),_.event(`recovery.deleted`,{recoveryRef:B}),void 0);let r=e.commits.map(e=>e.subject).join(`; `);z=void 0,T={...T,message:`Declined replay of ${e.commits.length} commit${e.commits.length===1?``:`s`}: ${r}. The original commits remain pinned at ${n?`refs/coreframe/declined`:`the recovery refs`}.`,pendingRebase:void 0}}else if(e.type===`resolve-rebase`){let t=T.pendingRebase;if(!t)throw Error(`There is no pending rebase to resolve.`);await qe({codex:e.codex,codexApproved:!0,onCodexEvent:c,source:t.target.source,target:t.target.commit})}else if(e.type===`prepare`){let n=Ue(e.target),r=await Oe(t);r.tracked||r.untracked.length>0?T={...T,draft:r,proposal:We(r.fingerprint)}:await qe({codex:e.codex,onCodexEvent:c,source:n.source,target:e.target})}else if(e.type===`message`){let n=await Ge(e.fingerprint,e.untracked),r=We(n.fingerprint);if(r===void 0){T={...T,warnings:T.warnings.filter(e=>!e.startsWith(`Codex could not generate a commit message:`))};try{if(!await Ae(`codex`,w))throw Error("Codex CLI is not installed or is unavailable on PATH. Install it with `npm install -g @openai/codex`, then restart the dev server.");r=await A(`commit.proposal`,()=>ke(t,w,n.untracked)),W={fingerprint:n.fingerprint,message:r}}catch(e){r=``,T={...T,warnings:[...T.warnings,`Codex could not generate a commit message: ${Ot(e)}`]}}}T={...T,draft:n,proposal:r}}else if(e.type===`commit`){let t=await Ke(e);T={...T,currentCommit:t,draft:void 0,message:void 0,proposal:void 0,target:void 0},Re()}else if(e.type===`retry-install`)await Xe();else if(e.type===`retry-codegen`)await Ze();else if(e.type===`reset-database`)await Qe();else{let n=Ue(e.target),r=await Oe(t);if(r.tracked||r.untracked.length>0){if(!e.fingerprint||!e.untracked)throw Error(`Refresh requires the current working-tree confirmation.`);if(await Ge(e.fingerprint,e.untracked),!e.message||!ue.test(Xt(e.message)))throw Error(`Enter a commit message with a valid Conventional Commits header.`)}await qe({codex:e.codex,fingerprint:e.fingerprint,message:e.message,onCodexEvent:c,source:n.source,target:e.target,untracked:e.untracked})}}finally{ae=!1,T={...T,busy:void 0},G(),V&&(V=!1,Re())}return s&&await it(s,i,a,o),{status:T}},He=(e,t={})=>re(_.run({sessionId:v,operationId:t.operationId??P(),actionType:e.type},()=>A(`action`,()=>Ve(e,t),{actionType:e.type,targetCommit:`target`in e?e.target:void 0,completionId:e.type===`acknowledge-codex`?e.id:void 0}))),Ue=e=>{if(!T.target||T.target.commit!==e)throw Error(`The offered update changed. Review the latest target before refreshing.`);return T.target},We=e=>W?.fingerprint===e?W.message:void 0,Ge=async(e,n)=>{let r=await Oe(t);if(r.fingerprint!==e)throw W=void 0,Error(`Working-tree changes changed; generate a new commit message.`);if(!Jt(r.untracked,n))throw Error(`Include every untracked file or remove it before refreshing.`);return r},Ke=async({fingerprint:e,message:n,untracked:r})=>{let i=await Ge(e,r);if(!n||!ue.test(Xt(n)))throw Error(`Enter a commit message with a valid Conventional Commits header.`);await X(t,[`add`,`--update`]),i.untracked.length>0&&await X(t,[`add`,`--`,...r]),await X(t,[`commit`,`--message`,n],{env:{GIT_EDITOR:`true`}});let a=await Z(t,[`rev-parse`,`HEAD`]);return H=a,_.event(`commit.created`,{commit:a,untrackedCount:r.length}),W=void 0,a},qe=async({codex:n,codexApproved:i=!1,fingerprint:o,message:s,onCodexEvent:u=()=>void 0,source:d,target:f,untracked:m=[]})=>{d===`upstream`&&await De(t);let g=r(n);n&&await at(g);let y=i&&T.pendingRebase?.target.commit===f?T.pendingRebase:void 0;y?T={...T,pendingRebase:void 0}:Ue(f);let b=await Z(t,[`rev-parse`,`HEAD`]);_.event(`integration.accepted`,{source:d,targetCommit:f,startingHead:b,resumed:!!y,codexApproved:i,startingMain:await Z(t,[`rev-parse`,R]),startingDev:await Q(t,[`rev-parse`,se])});let x,S,C=await Oe(t);if(C.tracked||C.untracked.length>0){if(!o||C.fingerprint!==o||!Jt(C.untracked,m))throw Error(`Working-tree changes changed; review them before refreshing.`);await X(t,[`add`,`--update`]),m.length>0&&await X(t,[`add`,`--`,...m]),await X(t,[`commit`,`--message`,s],{env:{GIT_EDITOR:`true`}}),x=await Z(t,[`rev-parse`,`HEAD`]),H=x,S=`refs/coreframe/recovery/${Date.now()}-${x.slice(0,12)}`,await X(t,[`update-ref`,S,x]),_.event(`recovery.created`,{recoveryRef:S,commit:x})}let E=x??b,O,k;I();let j=new AbortController,M=D()?.operationId,N=U?F.join(U.commonDir,de):void 0;oe=()=>{_.event(`integration.cancel-requested`,{integrationOperationId:M}),j.abort()};try{try{O=await A(`integration`,()=>je({codex:g,codexApproved:i,cwd:t,env:w,journal:N&&M?{journalPath:N,operationId:M,recoveryRef:S??z?.recoveryRef,sessionId:v}:void 0,localMain:E,onCodexEvent:u,prepareVerification:(t,n)=>yt({config:e,cwd:t,env:w,signal:n,startDatabase:h,trackActivity:Pe}),resume:y,resumeBase:z?.base,signal:j.signal,source:d,target:f}),{source:d,targetCommit:f,integrationBase:E})}finally{oe=void 0}if(J(j.signal),await Z(t,[`rev-parse`,`HEAD`])!==E)throw Error(`HEAD changed while the accepted update was being prepared.`);if(await Z(t,[`rev-parse`,R])!==E)throw Error(`Local main changed while the accepted update was being prepared.`);k=O.pause?{applied:O.pause.applied,commits:O.pause.commits,dropped:O.pause.record.dropped.length>0?O.pause.record.dropped:void 0,files:O.pause.files,target:await Ht(t,O.pause.devBase??E,f,d)}:void 0,O.pause&&(z=O.pause.record);let n=O.commit;if(n===void 0){T={...T,pendingRebase:k},_.event(`integration.paused`,{applied:k?.applied,conflictCount:k?.files.length}),S&&(await X(t,[`update-ref`,`-d`,S]),_.event(`recovery.deleted`,{recoveryRef:S}));return}let r=ve?await p(ve,`utf8`).catch(()=>``):``;if(I(),J(j.signal),!te||r.trim()!==`${a.pid} ${v}`)throw Error(`Managed development ownership changed; publication was refused.`);let o=await Ie({advanceDev:O.advanceDev,base:E,commit:n,cwd:t,devTarget:O.devTarget,gitDir:U.gitDir,journalPath:N,onMutate:c,onStage:l,operationId:M,paused:O.pause?.record,releasedPins:y&&!O.pause?[z?.originalRef,z?.preparedRef].filter(e=>typeof e==`string`):void 0,sessionId:v,signal:j.signal,source:d,target:f});V=!0,H=n;let s=Yt(await Z(t,[`diff`,`--name-only`,`-z`,b,n])),m=Bt(s),x=Vt(s);W=void 0,k&&S&&(B=S,_.event(`recovery.retained`,{recoveryRef:S}),S=void 0),S&&(await X(t,[`update-ref`,`-d`,S]),_.event(`recovery.deleted`,{recoveryRef:S})),B&&!O.pause&&(await X(t,[`update-ref`,`-d`,B]),_.event(`recovery.deleted`,{recoveryRef:B}),B=void 0),y&&!O.pause&&(z=void 0),T={...T,currentCommit:n,draft:void 0,pendingRebase:k,proposal:void 0,setupFailure:void 0,target:void 0,warnings:o.diverged.length?[...T.warnings,`Kept changes made during synchronization in: ${o.diverged.join(`, `)}. Review the working tree before editing further.${o.preserved?` Previous file versions are preserved under ${o.preserved}.`:``}`]:T.warnings},_.event(`integration.published`,{commit:n,source:d,targetCommit:f,paused:!!k,restartRequired:m,flutterRestartRequired:x}),await Ye({installDependencies:zt(s),flutterRestartRequired:x,restartRequired:m,trigger:`synchronization`})}catch(e){let t=S?` Recovery commit: ${S}.`:``;throw e instanceof Ne&&(he=e.message),V=!0,T={...T,currentCommit:H,message:`${$(e)}${t}`,pendingRebase:y??k??T.pendingRebase,warnings:e instanceof Ne?[e.message]:T.warnings},e}},Je=async({commit:e,flutterRestartRequired:n,restartRequired:r})=>{try{return await A(`setup.codegen`,()=>i({cwd:t,env:w,runCodegen:()=>Pe(`Generating styles`,`pnpm codegen`,()=>L(Qt(),[`codegen`],{cwd:t,env:w}).then(()=>void 0))})),!0}catch(t){return await tt({command:`pnpm codegen`,commit:e,error:t,message:`Panda generated code could not be prepared. Fix the Panda configuration or dependencies, then retry codegen.`,flutterRestartRequired:n,restartRequired:r,stage:`codegen`}),!1}},Ye=async({flutterRestartRequired:n,installDependencies:r,restartRequired:i,trigger:a})=>{let o=H;if(r)try{await et([`install`,`--frozen-lockfile`])}catch(e){await tt({command:`pnpm install --frozen-lockfile`,commit:o,error:e,message:`The project was synchronized, but dependency installation failed. Fix the package or lockfile issue, then retry the install.`,flutterRestartRequired:n,restartRequired:i,stage:`dependencies`});return}if(await Je({commit:o,flutterRestartRequired:n,restartRequired:i})){try{e.database&&await Pe(`Preparing database`,`pnpm db migrate-local`,()=>A(`setup.migration`,()=>At({config:e,cwd:t,env:w})))}catch(e){await tt({command:`pnpm db migrate-local`,commit:o,error:e,message:`The project was synchronized, but its database migration failed. The previous database was restored. Reset the database to recreate the current schema and rerun seed scripts.`,flutterRestartRequired:n,restartRequired:i,stage:`migration`});return}await nt(),ze(o,a),n&&await s(),i&&u()}},Xe=async()=>{let e=$e(`dependencies`);await nt(),await Ye({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!0,restartRequired:e.restartRequired,trigger:`dependency-recovery`})},Ze=async()=>{let e=$e(`codegen`);await nt(),await Ye({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!1,restartRequired:e.restartRequired,trigger:`codegen-recovery`})},Qe=async()=>{let e=$e(`migration`);try{await et([`db`,`setup`])}catch(t){await tt({command:`pnpm db setup`,commit:e.commit,error:t,message:`The project remains synchronized, but the database reset failed. Review the diagnostics, fix the reported problem, and try the reset again.`,flutterRestartRequired:e.flutterRestartRequired===!0,restartRequired:e.restartRequired,stage:`migration`});return}await nt(),ze(e.commit,`database-recovery`),e.flutterRestartRequired===!0&&await s(),e.restartRequired&&u()},$e=e=>{if(!T.setupFailure||T.setupFailure.stage!==e)throw Error(`There is no failed ${e} setup step to recover.`);return T.setupFailure},et=async e=>{await Pe(e[0]===`install`?`Installing dependencies`:`Preparing database`,`pnpm ${e.join(` `)}`,()=>A(`setup.command`,()=>L(Qt(),e,{cwd:t,env:w}),{command:e.slice(0,2).join(` `)}))},tt=async({command:e,commit:t,error:n,flutterRestartRequired:r,message:i,restartRequired:a,stage:o})=>{let s=Ot(n).slice(-1e5),c={command:e,commit:t,message:i,output:s,...r?{flutterRestartRequired:!0}:void 0,restartRequired:a,stage:o};_.event(`setup.failed`,{stage:o,command:e,commit:t,...O(n)},`error`),T={...T,setupFailure:c,target:void 0},console.error(`Coreframe managed development setup failed (${e}): ${i}\n${s}`);let l=rt();l&&await S(l,`${JSON.stringify(c)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development setup failure: ${$(e)}`)})},nt=async()=>{T={...T,setupFailure:void 0};let e=rt();e&&await x(e).catch(e=>{e instanceof Error&&`code`in e&&e.code===`ENOENT`||console.warn(`Could not clear the managed-development setup failure: ${$(e)}`)})},rt=()=>U?F.join(U.commonDir,me):void 0,it=async(e,t,n,r)=>{let i={commits:n,finalMessage:e,id:N(16).toString(`hex`),messages:xe(t),...r===void 0?void 0:{totalCommits:r}};T={...T,codexCompletion:i};let a=U?.commonDir;a&&await A(`completion.save`,()=>S(F.join(a,fe),`${JSON.stringify(i)}\n`,{mode:384}),{completionId:i.id}).catch(e=>{console.warn(`Could not persist the managed-development Codex result: ${$(e)}`)}),_.event(`completion.available`,{completionId:i.id,messageCount:i.messages.length,commitCount:n.length}),G()},at=async e=>{T={...T,codexOptions:e},U&&await S(F.join(U.commonDir,pe),`${JSON.stringify(e)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development Codex options: ${$(e)}`)})},ot=async()=>{let e=T.codexCompletion?.id,t=U?.commonDir;T={...T,codexCompletion:void 0},t&&await A(`completion.acknowledge`,()=>x(F.join(t,fe)).catch(e=>{if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}),{completionId:e}),_.event(`completion.acknowledged`,{completionId:e})};return{action:He,activate:()=>re(_.run({sessionId:v},()=>A(`session.activate`,Be))),getStatus:()=>T,close(){return ee||(j=`closing`,oe?.(),clearInterval(ye),clearInterval(be),clearTimeout(Ce),ee=(async()=>{if(await Promise.allSettled([...M]),ne)throw ne;for(let e of Te)e.close();clearInterval(ye),clearInterval(be),clearTimeout(Ce),te&&await Gt(ve,v),j=`closed`,_.event(`session.closed`,{sessionId:v}),_.close()})(),ee)}}}async function ge(e){let t=F.join(e,pe);try{let e=JSON.parse(await p(t,`utf8`));if(U(e))return e}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;console.warn(`Could not read the managed-development Codex options: ${$(e)}`)}await x(t).catch(()=>void 0)}function U(e){if(!e||typeof e!=`object`)return!1;let{effort:t,model:n}=e;return(t===void 0||I.includes(t))&&(n===void 0||ie.includes(n))}async function _e(e){let t=F.join(e,fe);try{let e=JSON.parse(await p(t,`utf8`));if(ve(e))return e}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;console.warn(`Could not read the managed-development Codex result: ${$(e)}`)}await x(t).catch(()=>void 0)}function ve(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.finalMessage==`string`&&typeof t.id==`string`&&Array.isArray(t.messages)&&t.messages.every(be)&&(t.totalCommits===void 0||Number.isInteger(t.totalCommits)&&t.totalCommits>=0)&&(t.commits===void 0||Array.isArray(t.commits)&&t.commits.every(ye))}function ye(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.commit==`string`&&typeof t.shortCommit==`string`&&typeof t.subject==`string`}function be(e){if(!e||typeof e!=`object`)return!1;let t=e;return(t.kind===`agent`||t.kind===`thought`||t.kind===`user`)&&(t.author===void 0||typeof t.author==`string`)&&typeof t.text==`string`}function xe(e){let t=new Set(e.filter(e=>e.kind===`user`)),n=[...t].reduce((e,t)=>e+t.text.length,0),r=!1;for(let i of[...e].reverse())if(i.kind!==`user`){if(n+i.text.length>1e5&&r)break;t.add(i),r=!0,n+=i.text.length}return e.filter(e=>t.has(e))}async function Se(e,t){let n=F.join(e,me);try{let e=JSON.parse(await p(n,`utf8`));if(Ce(e)&&e.commit===t)return e}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;console.warn(`Could not read the managed-development setup failure: ${$(e)}`)}await x(n).catch(()=>void 0)}function Ce(e){if(!e||typeof e!=`object`)return!1;let t=e;return(t.command===`pnpm codegen`||t.command===`pnpm db migrate-local`||t.command===`pnpm db setup`||t.command===`pnpm install --frozen-lockfile`)&&typeof t.commit==`string`&&typeof t.message==`string`&&typeof t.output==`string`&&(t.flutterRestartRequired===void 0||typeof t.flutterRestartRequired==`boolean`)&&typeof t.restartRequired==`boolean`&&(t.stage===`codegen`||t.stage===`dependencies`||t.stage===`migration`)}async function we(e){let t=await V(e);return{branch:Te(await Z(e,[`rev-parse`,`--abbrev-ref`,`HEAD`])),commonDir:t.commonDir,gitDir:t.gitDir,head:await Z(e,[`rev-parse`,`HEAD`]),main:await Z(e,[`rev-parse`,R]),primary:t.primary}}function Te(e){return e===`HEAD`?void 0:e}async function Ee(e,t){let n=[e.gitDir,F.join(e.commonDir,`refs`,`heads`)],r=[];for(let e of n)try{r.push(te(e,{persistent:!1},t))}catch{}return r}async function De(e){let t=await Z(e,[`--version`]),n=/git version (\d+)\.(\d+)/.exec(t);if(!n||Number(n[1])<2||Number(n[1])===2&&Number(n[2])<38)throw Error(`Managed replay requires Git 2.38 or newer with the merge rebase backend. Upgrade Git and retry.`)}async function Oe(e){let t=async()=>{let t=M(`sha256`),n=e=>{let n=Buffer.from(e);t.update(`${n.length}:`).update(n)},[r,i,a,...o]=await Promise.all([[`status`,`--porcelain`,`--untracked-files=no`],[`ls-files`,`--others`,`--exclude-standard`,`-z`],[`ls-files`,`-z`],[`rev-parse`,`HEAD`],[`ls-files`,`--stage`,`-z`],[`diff`,`--cached`,`--binary`,`--no-ext-diff`,`--no-textconv`],[`diff`,`--binary`,`--no-ext-diff`,`--no-textconv`]].map(t=>Z(e,t))),s=Yt(i).sort(),c=Yt(a);for(let e of o)n(e);n(r);for(let t of[...new Set([...c,...s])].sort()){n(t);try{let r=F.join(e,t),i=await l(r,{bigint:!0}),a=e=>[e.dev,e.ino,e.mode,e.size,e.mtimeNs,e.ctimeNs].join(`:`);if(n(a(i)),i.isSymbolicLink())n(await h(r));else if(i.isFile())n(await p(r));else if(!i.isDirectory())throw Error(`Unsupported working-tree file type`);if(a(i)!==a(await l(r,{bigint:!0})))throw Error(`Working tree changed during capture. Review the changes again.`)}catch(e){if(e.code!==`ENOENT`)throw e;n(`missing`)}}return{fingerprint:t.digest(`hex`),tracked:r.length>0,untracked:s}},n=await t(),r=await t();if(n.fingerprint!==r.fingerprint)throw Error(`Working tree changed during capture. Review the changes again.`);return r}async function ke(e,t,r){let i=[`Tracked changes:`,await Z(e,[`diff`,`HEAD`,`--binary`])];for(let t of r){let n=await p(F.join(e,t));i.push(`\nUntracked file: ${t}\n`,n.toString(`utf8`))}let{stdout:a}=await L(`codex`,[`exec`,...n,`--ephemeral`,`--ignore-user-config`,`--sandbox`,`read-only`,`--cd`,e,`Return only a concise Conventional Commits message for the supplied working-tree changes. Use a body only when it adds material context.`],{cwd:e,env:t,stdin:{string:i.join(`
2
- `)}}),o=a.trim().replace(/^```(?:text)?\s*|\s*```$/g,``);if(!o)throw Error(`Codex returned an empty commit message. Try again or enter a message manually.`);return o}async function Ae(e,t){let n=t.PATH??t.Path??t.path??``,r=a.platform===`win32`?(t.PATHEXT??`.COM;.EXE;.BAT;.CMD`).split(`;`):[``];for(let t of n.split(F.delimiter))for(let n of r)try{return await o(F.join(t||`.`,`${e}${n}`),ee.X_OK),!0}catch{}return!1}async function je({codex:e,codexApproved:t=!1,cwd:n,env:r,journal:i,localMain:a,onCodexEvent:o,prepareVerification:s,resume:c,resumeBase:l,signal:d,source:f,target:p}){if(f===`dev`&&await qt(n,a,p))return k(`integration.strategy`,{strategy:`fast-forward`,localMain:a,targetCommit:p}),{commit:p,devTarget:p};let m=F.resolve(n,await Z(n,[`rev-parse`,`--git-common-dir`])),h=F.join(m,`coreframe-managed-dev`);await u(h,{recursive:!0});let g=N(8).toString(`hex`),_=F.join(h,`integration-${g}`);k(`integration.strategy`,{strategy:f===`dev`?`rebase-then-merge`:`rebase`,localMain:a,targetCommit:p,worktreeId:g}),i&&!c&&await q(i.journalPath,{version:2,operationId:i.operationId,sessionId:i.sessionId,phase:`preparing`,source:f,target:p,expectedMain:a,commit:a,checkout:{branch:R,fingerprint:a},worktree:`integration-${g}`}).catch(e=>{k(`publication.journal-failed`,O(e),`warn`)});try{let u=c?l??a:a,m=!(c&&f===`dev`),h;if(await X(n,[`worktree`,`add`,`--detach`,_,u]),a!==p)if(c){let n=c.commits.map(e=>e.commit);n.length>0&&await ft(_,r,[`cherry-pick`,`--empty=drop`,...n],`cherry-pick`,o,{codex:e,codexApproved:t,prepareVerification:s,rebaseBase:u,signal:d,totalCommits:c.applied+n.length})}else if(f===`dev`&&(h=await W(n,p))!==void 0&&!await qt(n,h,a)){await De(n),m=!1;let c=Number(await Z(_,[`rev-list`,`--count`,`${h}..${p}`]));k(`integration.strategy`,{strategy:`rebase`,consumedBoundary:h,localMain:a,targetCommit:p,worktreeId:g});let l=await ft(_,r,[`rebase`,`--onto`,a,h,p],`rebase`,o,{codex:e,codexApproved:t,journal:i?{...i,expectedMain:a,source:f,target:p}:void 0,prepareVerification:s,rebaseBase:a,signal:d,totalCommits:c});if(l)return{commit:l.applied>0?l.partial:void 0,pause:{applied:l.applied,commits:l.commits,devBase:h,files:l.files,record:l.record}}}else if(f===`dev`){let t=await Q(_,[`merge-base`,a,p]),i=!1;if(t){await De(n);try{await X(_,[`rebase`,`--onto`,a,t,p],{env:{GIT_EDITOR:`true`}}),i=!0}catch(e){if((await Et(_)).length===0)throw e;await X(_,[`rebase`,`--abort`]),await X(_,[`reset`,`--hard`,a]),J(d)}}i||await ft(_,r,[`merge`,`--no-edit`,`--no-ff`,`--allow-unrelated-histories`,`--message`,`Merge dev into main`,p],`merge`,o,{codex:e,prepareVerification:s,signal:d})}else{let n=await Q(_,[`merge-base`,a,p]),c=Number(await Z(_,[`rev-list`,`--count`,n?`${n}..HEAD`:`HEAD`])),l=await ft(_,r,n?[`rebase`,`--onto`,p,n]:[`rebase`,`--root`,`--onto`,p],`rebase`,o,{codex:e,codexApproved:t,journal:i?{...i,expectedMain:a,source:f,target:p}:void 0,prepareVerification:s,rebaseBase:p,signal:d,totalCommits:c});if(l)return{commit:l.applied>0?l.partial:void 0,pause:{applied:l.applied,commits:l.commits,files:l.files,record:l.record}}}return J(d),{advanceDev:m,commit:await Z(_,[`rev-parse`,`HEAD`]),devTarget:f===`dev`?p:void 0}}finally{await X(n,[`worktree`,`remove`,`--force`,_]).catch(e=>{k(`worktree.cleanup-failed`,{worktreeId:g,...O(e)},`warn`)}),await v(_,{force:!0,recursive:!0})}}async function W(e,t){let n=await Q(e,[`rev-parse`,le]);if(n&&await qt(e,n,t))return n}async function Me(e){return(await Z(e,[`worktree`,`list`,`--porcelain`]).catch(()=>``)).split(`
1
+ import{requireManagedDevCodexOptions as e}from"./codex-model.js";import{git as t,gitBlob as n,gitQuiet as r,updateGitRefs as i}from"./managed-dev-git.js";import{recoverManagedProcesses as a}from"./managed-dev-process.js";import{executableExists as o,executeCodex as s,requestCommitMessage as c}from"./managed-dev-codex.js";import{runDatabaseCommand as l,runProjectCommand as u}from"./managed-dev-commands.js";import{ManagedDevOperationState as d}from"./managed-dev-operation.js";import{ensurePandaCodegen as f}from"./panda-codegen.js";import p from"node:process";import{access as m,copyFile as h,link as g,lstat as _,mkdir as v,mkdtemp as y,open as b,readFile as x,readdir as S,readlink as C,realpath as w,rename as T,rm as E,rmdir as D,symlink as O,unlink as k,writeFile as A}from"node:fs/promises";import{pathToFileURL as j}from"node:url";import{startTemporaryProjectPostgres as M,startTemporaryProjectTurso as N}from"@coreframe/db";import{DevDiagnostics as ee,devDiagnosticContext as te,devDiagnosticError as P,devDiagnosticEvent as F,devDiagnosticPhase as I}from"@coreframe/dev-supervisor";import{createHash as L,randomBytes as ne,randomUUID as re}from"node:crypto";import{watch as ie}from"node:fs";import R from"node:path";import{stripVTControlCharacters as ae}from"node:util";import{isManagedDevOperationActive as oe,managedDevCodexEfforts as se,managedDevCodexModels as ce}from"@coreframe/dev-contracts/managed-dev";import{resolve as le}from"import-meta-resolve";import{SubprocessError as ue}from"nano-spawn";const z=`refs/heads/main`,de=`refs/heads/dev`,fe=`refs/remotes/origin/main`,pe=`refs/coreframe/consumed-dev`,me=/^[a-z][a-z0-9-]*(?:\([^)]+\))?!?:\s+\S/i,he=`coreframe-managed-dev-publication.json`,B=`coreframe-managed-dev `,ge=`coreframe-managed-dev-codex-completion.json`,_e=`coreframe-managed-dev-codex-options.json`,ve=`coreframe-managed-dev-setup-failure.json`;async function ye(e=p.cwd()){let t=await Oe(e);return t.primary&&t.branch===`main`&&t.head===t.main}async function be(e=p.cwd()){try{let{commonDir:t,gitDir:n}=await xe(e);return n===t}catch{return!1}}async function xe(e){let t=await w(await Z(e,[`rev-parse`,`--show-toplevel`])),n=await w(e),r=R.resolve(n,await Z(e,[`rev-parse`,`--git-dir`])),i=R.resolve(n,await Z(e,[`rev-parse`,`--git-common-dir`]));return{commonDir:i,gitDir:r,primary:t===n&&r===i}}async function V({config:n,cwd:r=p.cwd(),env:i=p.env,localCheckInterval:s=1e3,onFlutterRestart:c=()=>void 0,onPublishMutation:l,onPublishStage:m,onRestart:h=()=>void 0,onStatusChange:g=()=>void 0,remoteCheckInterval:_=6e4,runCheck:v,startVerificationDatabase:y=yt,watchState:b=Ae}){let S=()=>void 0,C=new ee(r,`session`,e=>S(e)),w=C.instanceId,T=0,E=0,D;C.event(`session.created`,{sessionId:w});let O=i,j={mode:`waiting`,warnings:[]},M=`active`,N=new Set,F,L=!1,ie,ae=e=>(e.catch(e=>{e instanceof Error&&/Unresolved (?:Codex|managed) process ownership/.test(e.message)&&(ie=e)}),N.add(e),e.finally(()=>N.delete(e)).catch(()=>void 0),e),se=()=>{if(M!==`active`)throw Error(`Managed development owner is closing or closed.`)},ce=!1,le=!1,ue,B,ye=!1,be=!1,xe=v??(e=>Tt(r,O,e,B?.signal)),V,Ce,Te,H=!1,U,W,ke,Me,Ie,Le,Re=[],G,Be=Promise.resolve(),K=()=>{if(M===`active`){j={...j,operation:q.snapshot};let e={...Wt(j),activityRevision:T,operationRevision:j.operation?.revision},t=JSON.stringify(e);t!==D&&(D=t,E++,C.event(`status.changed`,{sessionId:w,revision:E,...e})),j={...j,trace:{sessionId:w,revision:E,operationId:j.operation?.id??te()?.operationId}};try{g(j)}catch(e){C.event(`status.delivery-failed`,P(e),`warn`)}}},q=new d(w,e=>{j={...j,operation:e,activities:e?.activities??j.activities},K()},e=>{C.event(`operation.persistence-failed`,P(e),`warn`);let t=`Managed update progress could not be recovered or saved. Git recovery remains available.`;j.warnings.includes(t)||(j={...j,warnings:[...j.warnings,t]},K())});S=e=>q.observe(e);let He=e=>{q.activity(e),T++;let t=j.activities??[],n=t.find(t=>t.id===e.id)?t.map(t=>t.id===e.id?e:t):[...t,e],r=n.filter(e=>e.status!==`running`).slice(-30);j={...j,activities:n.filter(e=>e.status===`running`||r.includes(e))},K()},Ue=(e,t,n,r)=>Ct(e,t,n,He,{...r,signal:r?.signal??B?.signal}),We=async({fetch:e=!1}={})=>{if(!(!ce||M!==`active`||!W)){if(le){H=!0;return}try{let[n,i,a]=await Promise.all([Z(r,[`rev-parse`,`--abbrev-ref`,`HEAD`]),Z(r,[`rev-parse`,`HEAD`]),Z(r,[`rev-parse`,z])]);if(n!==`main`||i!==a){j={message:`Managed synchronization is paused until the primary checkout is back on local main.`,mode:`waiting`,warnings:Te?[Te]:[]};return}i!==U&&(U=i,G=void 0);let o=await Ne(r);if(le){H=!0;return}if(e&&await Q(r,[`remote`,`get-url`,`origin`]))try{await t(r,[`fetch`,`origin`,`+refs/heads/main:${fe}`])}catch(e){C.event(`fetch.failed`,P(e),`warn`)}let s=await Q(r,[`rev-parse`,de]),c=await Q(r,[`rev-parse`,fe]),l=await Q(r,[`rev-parse`,pe]),u=[...s?[{commit:s,source:`dev`}]:[],...c?[{commit:c,source:`upstream`}]:[]],d;for(let e of u)if(!await Gt(r,e.commit,U)&&!(e.source===`dev`&&e.commit===l)){d=e;break}let f,p=!1;d?.source===`dev`&&l&&(await Gt(r,l,d.commit)?f=l:p=!0),j={...j,currentCommit:U,draft:o.tracked||o.untracked.length>0?o:void 0,message:p?`Local dev no longer contains the last synchronized dev commit; review its full history before refreshing.`:void 0,mode:`managed`,proposal:rt(o.fingerprint),proposalUntracked:G?.untracked,target:d===void 0?void 0:await Bt(r,f??U,d.commit,d.source)}}catch(e){if(le){H=!0;return}C.event(`refresh.failed`,P(e),`error`),j={...j,message:$(e),warnings:[$(e)]}}finally{K()}}},Ge,Ke=!1,qe=!1,Je=({fetch:e=!1}={})=>M===`active`?(Ke=!0,qe||=e,Ge||(Ge=ae((async()=>{for(;Ke&&M===`active`;){Ke=!1;let e=qe;qe=!1,await C.run({sessionId:w,operationId:re(),trigger:e?`remote-poll`:`local-refresh`},()=>We({fetch:e}))}})().finally(()=>{Ge=void 0})),Ge)):Promise.resolve(),Ye=()=>{clearTimeout(Le),Le=setTimeout(()=>void Je(),50),Le.unref()},Xe=(e,t)=>{let n=async()=>{let n=[{command:`pnpm typecheck`,status:`running`},{command:`pnpm test`,status:`pending`}],r=()=>{j={...j,checks:{commit:e,commands:structuredClone(n),trigger:t}},K()};r();for(let[i,a]of[`typecheck`,`test`].entries()){if(B?.signal.aborted){for(let e of n.slice(i))e.status=`cancelled`;r();break}i>0&&(n[i].status=`running`,r());try{await Ue(a===`test`?`Running tests`:`Checking types`,`pnpm ${a}`,()=>I(`check`,()=>xe(a),{script:a,commit:e,trigger:t})),n[i].status=`passed`}catch(e){n[i].status=B?.signal.aborted?`cancelled`:`failed`,n[i].failureId=ne(12).toString(`hex`),n[i].output=Et(e)}r()}};Be=Be.then(n,n)},Ze=async()=>{if(ce||M!==`active`)return;let e=await Oe(r);if(!e.primary){j={message:`Managed development only runs from the primary checkout.`,mode:`unmanaged`,warnings:[]},K();return}if(e.branch!==`main`||e.head!==e.main){let t=`Managed development requires the primary checkout on local main; current branch is ${e.branch??`detached HEAD`}.`;console.warn(`Coreframe managed development disabled: ${t}`),j={message:t,mode:`unmanaged`,warnings:[]},K();return}se();let n=R.join(e.commonDir,`coreframe-managed-dev.lock`);await Vt(n,w),ke=n,L=!0,se(),await Q(r,[`rev-parse`,`--verify`,de])||await t(r,[`branch`,`dev`,e.head]),await a(e.commonDir),W=e,U=e.head;let i=await ft(r,e,l);Te=i?.notice,V=i?.paused,Ce=V?.recoveryRef,ce=!0,j={codexCompletion:await we(e.commonDir),codexOptions:await Se(e.commonDir),currentCommit:e.head,mode:`managed`,pendingRebase:i?.pendingRebase,setupFailure:await De(e.commonDir,e.head),warnings:Te?[Te]:[]},j.setupFailure||await ct({commit:e.head,flutterRestartRequired:!1,restartRequired:!1}),await q.restore(e.commonDir),q.snapshot?.state===`awaiting-resolution`&&!j.pendingRebase&&q.finish(`failed`,`The recorded replay cannot be resumed. Review the Git recovery diagnostics before continuing.`),K(),Re=await b(e,Ye),Me=setInterval(()=>{j.draft&&Je()},s),Me.unref(),Ie=setInterval(()=>void Je({fetch:!0}),_),Ie.unref(),await Je(),Je({fetch:!0})},Qe=async(t,{onCodexEvent:n=()=>void 0}={})=>{if(se(),!ce||j.mode!==`managed`)throw Error(`Managed development is not active.`);if(t.type===`cancel-codex`){if(t.operationId&&t.operationId!==q.snapshot?.id)throw Error(`This update is no longer active. Refresh its status before cancelling.`);let e=ue;if(!e)throw Error(`There is no Codex conflict resolution to cancel.`);return e(),await q.flush(),{status:j}}if(le||oe(q.snapshot)&&t.type!==`configure-codex`)throw Error(`Another managed development action is already running.`);if(t.type===`decline-rebase`){if(!j.pendingRebase)throw Error(`There is no pending rebase to decline.`);return{status:j}}[`retry-install`,`retry-codegen`,`reset-database`].includes(t.type)&&j.setupFailure&&q.snapshot&&(ot(q.snapshot.source,q.snapshot.target,!0),q.phase(`setup`));let i=[],a=[],s,c,l=e=>{if(q.codex(e),e.phase===`activity`){He({...e.activity,stage:e.stage});return}e.phase!==`message`&&C.event(`codex.${e.phase}`,{commitCount:`commits`in e?e.commits.length:void 0,stage:e.stage,totalCommits:`totalCommits`in e?e.totalCommits:void 0}),e.phase===`start`?(a=e.commits,s=e.totalCommits,i.splice(0,i.length,e.message)):e.phase===`message`?i.push(e.message):e.phase===`complete`?c=e.finalMessage:e.phase===`progress`&&(a=e.commits,s=e.totalCommits??s);try{n(e)}catch(e){C.event(`codex.delivery-failed`,P(e),`warn`)}};le=!0,j={...j,busy:Yt(t),message:void 0};try{if(K(),t.type===`acknowledge-operation`)await q.dismiss(t.id),!j.pendingRebase&&!j.setupFailure&&(j={...j,message:void 0});else if(t.type===`acknowledge-codex`)j.codexCompletion?.id===t.id?(await St(),q.snapshot&&await q.dismiss(q.snapshot.id)):C.event(`completion.acknowledgment-ignored`,{requestedId:t.id,currentId:j.codexCompletion?.id});else if(t.type===`dismiss-check`)j.checks&&(j={...j,checks:{...j.checks,commands:j.checks.commands.map(e=>e.failureId===t.failureId?{...e,dismissed:!0}:e)}});else if(t.type===`reject`)j={...j,draft:void 0,proposal:void 0};else if(t.type===`configure-codex`)await xt(e(t.codex));else if(t.type===`resolve-rebase`){let e=j.pendingRebase;if(!e)throw Error(`There is no pending rebase to resolve.`);await st({codex:t.codex,codexApproved:!0,onCodexEvent:l,source:e.target.source,target:e.target.commit})}else if(t.type===`prepare`){let e=nt(t.target),n=await Ne(r);n.tracked||n.untracked.length>0?j={...j,draft:n,proposal:rt(n.fingerprint),proposalUntracked:G?.untracked}:await st({codex:t.codex,onCodexEvent:l,source:e.source,target:t.target})}else if(t.type===`message`){let e=await it(t.fingerprint,t.untracked);if(!e.tracked&&t.untracked.length===0)throw Error(`Select at least one file to commit.`);let n=rt(e.fingerprint,t.untracked);if(n===void 0){j={...j,warnings:j.warnings.filter(e=>!e.startsWith(`Codex could not generate a commit message:`))};try{if(!await o(`codex`,O))throw Error("Codex CLI is not installed or is unavailable on PATH. Install it with `npm install -g @openai/codex`, then restart the dev server.");n=await I(`commit.proposal`,()=>Pe(r,O,t.untracked)),G={fingerprint:e.fingerprint,untracked:[...t.untracked],message:n}}catch(e){n=``,j={...j,warnings:[...j.warnings,`Codex could not generate a commit message: ${Et(e)}`]}}}j={...j,draft:e,proposal:n,proposalUntracked:t.untracked}}else if(t.type===`commit`){let e=await at(t);j={...j,currentCommit:e,draft:void 0,message:void 0,proposal:void 0,target:void 0},Ye()}else if(t.type===`retry-install`)await J();else if(t.type===`retry-codegen`)await ut();else if(t.type===`reset-database`)await dt();else{let e=nt(t.target),n=await Ne(r);if(n.tracked||n.untracked.length>0){if(!t.fingerprint||!t.untracked)throw Error(`Refresh requires the current working-tree confirmation.`);if(await it(t.fingerprint,t.untracked),(n.tracked||t.untracked.length>0)&&(!t.message||!me.test(Jt(t.message))))throw Error(`Enter a commit message with a valid Conventional Commits header.`)}await st({codex:t.codex,fingerprint:t.fingerprint,message:t.message,onCodexEvent:l,source:e.source,target:t.target,untracked:t.untracked})}}catch(e){if(oe(q.snapshot)){let t=B?.signal.aborted&&!(e instanceof Error&&/Unresolved .* process ownership/.test(e.message));q.finish(t?`cancelled`:`failed`,t?q.snapshot?.published?`Changes were applied. Remaining setup and checks were cancelled.`:`Update cancelled. Prepared changes were not applied.`:$(e))}throw e}finally{if(le=!1,j={...j,busy:void 0},oe(q.snapshot)&&q.snapshot?.requestIds.includes(String(te()?.operationId)))if(j.pendingRebase)q.pause(j.pendingRebase);else if(B?.signal.aborted)$e();else if(j.setupFailure)q.finish(`failed`,j.setupFailure.message);else if(j.checks?.commands.some(e=>e.status===`running`||e.status===`pending`)){let e=q.snapshot.id,t=q.snapshot.requestIds.at(-1);q.phase(`checks`),ae(Be.then(()=>{q.snapshot?.id===e&&q.snapshot.requestIds.at(-1)===t&&oe(q.snapshot)&&$e()}))}else $e();oe(q.snapshot)||(ue=void 0,B=void 0),K(),await q.flush(),H&&(H=!1,Ye())}return c&&q.snapshot?.state!==`failed`&&q.snapshot?.state!==`cancelled`&&await vt(c,i,a,s),{status:j}},$e=()=>{B?.signal.aborted?q.finish(`cancelled`,q.snapshot?.published?`Changes were applied. Remaining setup and checks were cancelled.`:`Update cancelled. Prepared changes were not applied.`):j.checks?.commands.some(e=>e.status===`failed`)?q.finish(`failed`,`Changes were applied, but project checks failed. Review the failed checks.`):q.finish(`succeeded`,`Update ready.`),ue=void 0,B=void 0,K()},et=new Map,tt=(e,t={})=>{let n=t.requestKey??t.operationId,r=JSON.stringify(e),i=n?et.get(n):void 0;if(i)return i.action===r?i.promise:Promise.reject(Error(`This request ID was already used for a different action.`));let a=ae(C.run({sessionId:w,operationId:t.operationId??re(),actionType:e.type},()=>I(`action`,()=>Qe(e,t),{actionType:e.type,targetCommit:`target`in e?e.target:void 0,completionId:e.type===`acknowledge-codex`?e.id:void 0})));if(n){let e={action:r,promise:a,settled:!1};et.set(n,e);let t=()=>{e.settled=!0;for(let[e,t]of et){if(et.size<=100)break;t.settled&&et.delete(e)}};a.then(t,t)}return a},nt=e=>{if(!j.target||j.target.commit!==e)throw Error(`The offered update changed. Review the latest target before refreshing.`);return j.target},rt=(e,t)=>G?.fingerprint===e&&(!t||Kt(G.untracked,t))?G.message:void 0,it=async(e,t)=>{let n=await Ne(r);if(n.fingerprint!==e)throw G=void 0,Error(`Working-tree changes changed; generate a new commit message.`);if(new Set(t).size!==t.length||t.some(e=>!n.untracked.includes(e)))throw Error(`Selected files changed; review the untracked files again.`);return n},at=async({fingerprint:e,message:n,untracked:i})=>{if(!(await it(e,i)).tracked&&i.length===0)throw Error(`Select at least one file to commit.`);if(!n||!me.test(Jt(n)))throw Error(`Enter a commit message with a valid Conventional Commits header.`);await t(r,[`add`,`--update`]),i.length>0&&await t(r,[`--literal-pathspecs`,`add`,`--`,...i]),await t(r,[`commit`,`--message`,n],{env:{GIT_EDITOR:`true`}});let a=await Z(r,[`rev-parse`,`HEAD`]);return U=a,C.event(`commit.created`,{commit:a,untrackedCount:i.length}),G=void 0,a},ot=(e,t,n)=>{let r=String(te()?.operationId??re());q.begin(e,t,r,n),B=new AbortController;let i=B;return be=!1,ye=!1,ue=()=>{oe(q.snapshot)&&(q.cancel(ye),C.event(`integration.cancel-requested`,{integrationOperationId:q.snapshot?.id}),ye?be=!0:i.abort())},i},st=async({codex:i,codexApproved:a=!1,fingerprint:o,message:s,onCodexEvent:c=()=>void 0,source:u,target:d,untracked:f=[]})=>{let h=e(i),g=ot(u,d,a&&j.pendingRebase?.target.commit===d);u===`upstream`&&await je(r),i&&await xt(h);let _=a&&j.pendingRebase?.target.commit===d?j.pendingRebase:void 0;_?j={...j,pendingRebase:void 0}:nt(d),await q.flush(),Y(g.signal);let v=await Z(r,[`rev-parse`,`HEAD`]);C.event(`integration.accepted`,{source:u,targetCommit:d,startingHead:v,resumed:!!_,codexApproved:a,startingMain:await Z(r,[`rev-parse`,z]),startingDev:await Q(r,[`rev-parse`,de])});let b,S,T=await Ne(r);if(T.tracked||T.untracked.length>0){if(!o||T.fingerprint!==o||new Set(f).size!==f.length||f.some(e=>!T.untracked.includes(e)))throw Error(`Working-tree changes changed; review them before refreshing.`);(T.tracked||f.length>0)&&(await t(r,[`add`,`--update`]),f.length>0&&await t(r,[`--literal-pathspecs`,`add`,`--`,...f]),await t(r,[`commit`,`--message`,s],{env:{GIT_EDITOR:`true`}}),b=await Z(r,[`rev-parse`,`HEAD`]),U=b,S=`refs/coreframe/recovery/${Date.now()}-${b.slice(0,12)}`,await t(r,[`update-ref`,S,b]),C.event(`recovery.created`,{recoveryRef:S,commit:b}))}let E=b??v,D,k;se();let A=te()?.operationId,M=W?R.join(W.commonDir,he):void 0;try{if(D=await I(`integration`,()=>Fe({codex:h,codexApproved:a,cwd:r,env:O,journal:M&&A?{journalPath:M,operationId:A,recoveryRef:S??V?.recoveryRef,sessionId:w}:void 0,localMain:E,onCodexEvent:c,prepareVerification:(e,t)=>bt({config:n,cwd:e,env:O,signal:t,startDatabase:y,trackActivity:Ue}),resume:_,resumeBase:V?.base,signal:g.signal,source:u,target:d}),{source:u,targetCommit:d,integrationBase:E}),Y(g.signal),await Z(r,[`rev-parse`,`HEAD`])!==E)throw Error(`HEAD changed while the accepted update was being prepared.`);if(await Z(r,[`rev-parse`,z])!==E)throw Error(`Local main changed while the accepted update was being prepared.`);k=D.pause?{applied:D.pause.applied,commits:D.pause.commits,dropped:D.pause.record.dropped.length>0?D.pause.record.dropped:void 0,files:D.pause.files,target:await Bt(r,D.pause.devBase??E,d,u)}:void 0,D.pause&&(V=D.pause.record);let e=D.commit;if(e===void 0){j={...j,pendingRebase:k},C.event(`integration.paused`,{applied:k?.applied,conflictCount:k?.files.length}),S&&(await t(r,[`update-ref`,`-d`,S]),C.event(`recovery.deleted`,{recoveryRef:S}));return}let i=ke?await x(ke,`utf8`).catch(()=>``):``;if(se(),Y(g.signal),!L||i.trim()!==`${p.pid} ${w}`)throw Error(`Managed development ownership changed; publication was refused.`);q.phase(`publishing`),ye=!0;let o=await Ve({advanceDev:D.advanceDev,base:E,commit:e,cwd:r,devTarget:D.devTarget,gitDir:W.gitDir,journalPath:M,onMutate:l,onStage:m,operationId:A,paused:D.pause?.record,releasedPins:_&&!D.pause?[V?.originalRef,V?.preparedRef].filter(e=>typeof e==`string`):void 0,sessionId:w,signal:g.signal,source:u,target:d});ye=!1,q.published(),H=!0,U=e;let s=qt(await Z(r,[`diff`,`--name-only`,`-z`,v,e])),f=Rt(s),b=zt(s);if(G=void 0,k&&S&&(Ce=S,C.event(`recovery.retained`,{recoveryRef:S}),S=void 0),S&&(await t(r,[`update-ref`,`-d`,S]),C.event(`recovery.deleted`,{recoveryRef:S})),Ce&&!D.pause&&(await t(r,[`update-ref`,`-d`,Ce]),C.event(`recovery.deleted`,{recoveryRef:Ce}),Ce=void 0),_&&!D.pause&&(V=void 0),j={...j,currentCommit:e,draft:void 0,pendingRebase:k,proposal:void 0,setupFailure:void 0,target:void 0,warnings:o.diverged.length?[...j.warnings,`Kept changes made during synchronization in: ${o.diverged.join(`, `)}. Review the working tree before editing further.${o.preserved?` Previous file versions are preserved under ${o.preserved}.`:``}`]:j.warnings},C.event(`integration.published`,{commit:e,source:u,targetCommit:d,paused:!!k,restartRequired:f,flutterRestartRequired:b}),be){g.abort();let t=Lt(s);await ht({command:t?`pnpm install --frozen-lockfile`:`pnpm codegen`,commit:e,error:Error(`Setup was cancelled before it started.`),message:`Changes were applied, but setup was cancelled. Retry setup to prepare the environment and run project checks.`,flutterRestartRequired:b,restartRequired:f,stage:t?`dependencies`:`codegen`})}Y(g.signal),q.phase(`setup`),await lt({installDependencies:Lt(s),flutterRestartRequired:b,restartRequired:f,trigger:`synchronization`})}catch(e){let t=S?` Recovery commit: ${S}.`:``;throw e instanceof ze&&(Te=e.message),H=!0,j={...j,currentCommit:U,message:`${$(e)}${t}`,pendingRebase:_??k??j.pendingRebase,warnings:e instanceof ze?[e.message]:j.warnings},e}},ct=async({commit:e,flutterRestartRequired:t,restartRequired:n})=>{try{return await I(`setup.codegen`,()=>f({cwd:r,env:O,runCodegen:()=>Ue(`Generating styles`,`pnpm codegen`,()=>u([`codegen`],{cwd:r,env:O,signal:B?.signal}).then(()=>void 0))})),!0}catch(r){return await ht({command:`pnpm codegen`,commit:e,error:r,message:`Panda generated code could not be prepared. Fix the Panda configuration or dependencies, then retry codegen.`,flutterRestartRequired:t,restartRequired:n,stage:`codegen`}),!1}},lt=async({flutterRestartRequired:e,installDependencies:t,restartRequired:i,trigger:a})=>{let o=U;if(t)try{await mt([`install`,`--frozen-lockfile`])}catch(t){await ht({command:`pnpm install --frozen-lockfile`,commit:o,error:t,message:`The project was synchronized, but dependency installation failed. Fix the package or lockfile issue, then retry the install.`,flutterRestartRequired:e,restartRequired:i,stage:`dependencies`});return}if(await ct({commit:o,flutterRestartRequired:e,restartRequired:i})){try{n.database&&await Ue(`Preparing database`,`pnpm db migrate-local`,()=>I(`setup.migration`,()=>Ot({config:n,cwd:r,env:O,signal:B?.signal})))}catch(t){await ht({command:`pnpm db migrate-local`,commit:o,error:t,message:`The project was synchronized, but its database migration failed. The previous database was restored. Reset the database to recreate the current schema and rerun seed scripts.`,flutterRestartRequired:e,restartRequired:i,stage:`migration`});return}await gt(),Xe(o,a),e&&await c(),i&&h()}},J=async()=>{let e=pt(`dependencies`);await gt(),await lt({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!0,restartRequired:e.restartRequired,trigger:`dependency-recovery`})},ut=async()=>{let e=pt(`codegen`);await gt(),await lt({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!1,restartRequired:e.restartRequired,trigger:`codegen-recovery`})},dt=async()=>{let e=pt(`migration`);try{await mt([`db`,`setup`])}catch(t){await ht({command:`pnpm db setup`,commit:e.commit,error:t,message:`The project remains synchronized, but the database reset failed. Review the diagnostics, fix the reported problem, and try the reset again.`,flutterRestartRequired:e.flutterRestartRequired===!0,restartRequired:e.restartRequired,stage:`migration`});return}await gt(),Xe(e.commit,`database-recovery`),e.flutterRestartRequired===!0&&await c(),e.restartRequired&&h()},pt=e=>{if(!j.setupFailure||j.setupFailure.stage!==e)throw Error(`There is no failed ${e} setup step to recover.`);return j.setupFailure},mt=async e=>{await Ue(e[0]===`install`?`Installing dependencies`:`Preparing database`,`pnpm ${e.join(` `)}`,()=>I(`setup.command`,()=>u(e,{cwd:r,env:O,signal:B?.signal}),{command:e.slice(0,2).join(` `)}))},ht=async({command:e,commit:t,error:n,flutterRestartRequired:r,message:i,restartRequired:a,stage:o})=>{let s=Et(n).slice(-1e5),c={command:e,commit:t,message:i,output:s,...r?{flutterRestartRequired:!0}:void 0,restartRequired:a,stage:o};C.event(`setup.failed`,{stage:o,command:e,commit:t,...P(n)},`error`),j={...j,setupFailure:c,target:void 0},console.error(`Coreframe managed development setup failed (${e}): ${i}\n${s}`);let l=_t();l&&await A(l,`${JSON.stringify(c)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development setup failure: ${$(e)}`)})},gt=async()=>{j={...j,setupFailure:void 0};let e=_t();e&&await k(e).catch(e=>{e instanceof Error&&`code`in e&&e.code===`ENOENT`||console.warn(`Could not clear the managed-development setup failure: ${$(e)}`)})},_t=()=>W?R.join(W.commonDir,ve):void 0,vt=async(e,t,n,r)=>{let i={commits:n,finalMessage:e,id:ne(16).toString(`hex`),messages:Ee(t),...r===void 0?void 0:{totalCommits:r}};j={...j,codexCompletion:i};let a=W?.commonDir;a&&await I(`completion.save`,()=>A(R.join(a,ge),`${JSON.stringify(i)}\n`,{mode:384}),{completionId:i.id}).catch(e=>{console.warn(`Could not persist the managed-development Codex result: ${$(e)}`)}),C.event(`completion.available`,{completionId:i.id,messageCount:i.messages.length,commitCount:n.length}),K()},xt=async e=>{j={...j,codexOptions:e},W&&await A(R.join(W.commonDir,_e),`${JSON.stringify(e)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development Codex options: ${$(e)}`)})},St=async()=>{let e=j.codexCompletion?.id,t=W?.commonDir;j={...j,codexCompletion:void 0},t&&await I(`completion.acknowledge`,()=>k(R.join(t,ge)).catch(e=>{if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}),{completionId:e}),C.event(`completion.acknowledged`,{completionId:e})};return{action:tt,activate:()=>ae(C.run({sessionId:w},()=>I(`session.activate`,Ze))),getStatus:()=>j,close(){return F||(M=`closing`,ue?.(),clearInterval(Me),clearInterval(Ie),clearTimeout(Le),F=(async()=>{if(await Promise.allSettled([...N]),ie)throw ie;for(let e of Re)e.close();clearInterval(Me),clearInterval(Ie),clearTimeout(Le),await q.flush(),L&&await Ut(ke,w),M=`closed`,C.event(`session.closed`,{sessionId:w}),C.close()})(),F)}}}async function Se(e){let t=R.join(e,_e);try{let e=JSON.parse(await x(t,`utf8`));if(Ce(e))return e}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;console.warn(`Could not read the managed-development Codex options: ${$(e)}`)}await k(t).catch(()=>void 0)}function Ce(e){if(!e||typeof e!=`object`)return!1;let{effort:t,model:n}=e;return(t===void 0||se.includes(t))&&(n===void 0||ce.includes(n))}async function we(e){let t=R.join(e,ge);try{let e=JSON.parse(await x(t,`utf8`));if(Te(e))return e}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;console.warn(`Could not read the managed-development Codex result: ${$(e)}`)}await k(t).catch(()=>void 0)}function Te(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.finalMessage==`string`&&typeof t.id==`string`&&Array.isArray(t.messages)&&t.messages.every(U)&&(t.totalCommits===void 0||Number.isInteger(t.totalCommits)&&t.totalCommits>=0)&&(t.commits===void 0||Array.isArray(t.commits)&&t.commits.every(H))}function H(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.commit==`string`&&typeof t.shortCommit==`string`&&typeof t.subject==`string`}function U(e){if(!e||typeof e!=`object`)return!1;let t=e;return(t.kind===`agent`||t.kind===`thought`||t.kind===`user`)&&(t.author===void 0||typeof t.author==`string`)&&typeof t.text==`string`}function Ee(e){let t=new Set(e.filter(e=>e.kind===`user`)),n=[...t].reduce((e,t)=>e+t.text.length,0),r=!1;for(let i of[...e].reverse())if(i.kind!==`user`){if(n+i.text.length>1e5&&r)break;t.add(i),r=!0,n+=i.text.length}return e.filter(e=>t.has(e))}async function De(e,t){let n=R.join(e,ve);try{let e=JSON.parse(await x(n,`utf8`));if(W(e)&&e.commit===t)return e}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;console.warn(`Could not read the managed-development setup failure: ${$(e)}`)}await k(n).catch(()=>void 0)}function W(e){if(!e||typeof e!=`object`)return!1;let t=e;return(t.command===`pnpm codegen`||t.command===`pnpm db migrate-local`||t.command===`pnpm db setup`||t.command===`pnpm install --frozen-lockfile`)&&typeof t.commit==`string`&&typeof t.message==`string`&&typeof t.output==`string`&&(t.flutterRestartRequired===void 0||typeof t.flutterRestartRequired==`boolean`)&&typeof t.restartRequired==`boolean`&&(t.stage===`codegen`||t.stage===`dependencies`||t.stage===`migration`)}async function Oe(e){let t=await xe(e);return{branch:ke(await Z(e,[`rev-parse`,`--abbrev-ref`,`HEAD`])),commonDir:t.commonDir,gitDir:t.gitDir,head:await Z(e,[`rev-parse`,`HEAD`]),main:await Z(e,[`rev-parse`,z]),primary:t.primary}}function ke(e){return e===`HEAD`?void 0:e}async function Ae(e,t){let n=[e.gitDir,R.join(e.commonDir,`refs`,`heads`)],r=[];for(let e of n)try{r.push(ie(e,{persistent:!1},t))}catch{}return r}async function je(e){let t=await Z(e,[`--version`]),n=/git version (\d+)\.(\d+)/.exec(t);if(!n||Number(n[1])<2||Number(n[1])===2&&Number(n[2])<38)throw Error(`Managed replay requires Git 2.38 or newer with the merge rebase backend. Upgrade Git and retry.`)}function Me(e){return/^(?:dist|build|coverage|target)\//.test(e)||/(?:^|\/)(?:\.cache|\.turbo|\.vite|\.next|\.nuxt|\.output|__pycache__)\//.test(e)||/\.tsbuildinfo$/.test(e)}async function Ne(e){let n=async()=>{let n=L(`sha256`),r=e=>{let t=Buffer.from(e);n.update(`${t.length}:`).update(t)},[i,a,o,...s]=await Promise.all([[`status`,`--porcelain=v1`,`--untracked-files=no`,`-z`],[`ls-files`,`--others`,`--exclude-standard`,`-z`],[`ls-files`,`-z`],[`rev-parse`,`HEAD`],[`ls-files`,`--stage`,`-z`],[`diff`,`--cached`,`--binary`,`--no-ext-diff`,`--no-textconv`],[`diff`,`--binary`,`--no-ext-diff`,`--no-textconv`]].map(async n=>n.includes(`-z`)?(await t(e,n)).stdout:Z(e,n))),c=[],l=qt(i);for(let e=0;e<l.length;e++){let t=l[e],n=t.slice(0,2);c.push({path:t.slice(3),status:n,.../[RC]/.test(n)?{originalPath:l[++e]}:{}})}let u=qt(a).sort(),d=qt(o);for(let e of s)r(e);r(i);for(let t of[...new Set([...d,...u])].sort()){r(t);try{let n=R.join(e,t),i=await _(n,{bigint:!0}),a=e=>[e.dev,e.ino,e.mode,e.size,e.mtimeNs,e.ctimeNs].join(`:`);if(r(a(i)),i.isSymbolicLink())r(await C(n));else if(i.isFile())r(await x(n));else if(!i.isDirectory())throw Error(`Unsupported working-tree file type`);if(a(i)!==a(await _(n,{bigint:!0})))throw Error(`Working tree changed during capture. Review the changes again.`)}catch(e){if(e.code!==`ENOENT`)throw e;r(`missing`)}}return{fingerprint:n.digest(`hex`),tracked:i.length>0,trackedFiles:c,untracked:u,artifactFiles:u.filter(Me)}},r=await n(),i=await n();if(r.fingerprint!==i.fingerprint)throw Error(`Working tree changed during capture. Review the changes again.`);return i}async function Pe(e,t,n){let r=[`Tracked changes:`,await Z(e,[`diff`,`HEAD`,`--binary`])];for(let t of n){let n=await x(R.join(e,t));r.push(`\nUntracked file: ${t}\n`,n.toString(`utf8`))}let{stdout:i}=await c(e,t,r.join(`
2
+ `)),a=i.trim().replace(/^```(?:text)?\s*|\s*```$/g,``);if(!a)throw Error(`Codex returned an empty commit message. Try again or enter a message manually.`);return a}async function Fe({codex:e,codexApproved:n=!1,cwd:r,env:i,journal:a,localMain:o,onCodexEvent:s,prepareVerification:c,resume:l,resumeBase:u,signal:d,source:f,target:p}){if(f===`dev`&&await Gt(r,o,p))return F(`integration.strategy`,{strategy:`fast-forward`,localMain:o,targetCommit:p}),{commit:p,devTarget:p};let m=R.resolve(r,await Z(r,[`rev-parse`,`--git-common-dir`])),h=R.join(m,`coreframe-managed-dev`);await v(h,{recursive:!0});let g=ne(8).toString(`hex`),_=R.join(h,`integration-${g}`);F(`integration.strategy`,{strategy:f===`dev`?`rebase-then-merge`:`rebase`,localMain:o,targetCommit:p,worktreeId:g}),a&&!l&&await J(a.journalPath,{version:2,operationId:a.operationId,sessionId:a.sessionId,phase:`preparing`,source:f,target:p,expectedMain:o,commit:o,checkout:{branch:z,fingerprint:o},worktree:`integration-${g}`}).catch(e=>{F(`publication.journal-failed`,P(e),`warn`)});try{let m=l?u??o:o,h=!(l&&f===`dev`),v;if(await t(r,[`worktree`,`add`,`--detach`,_,m]),o!==p)if(l){let t=l.commits.map(e=>e.commit);t.length>0&&await mt(_,i,[`cherry-pick`,`--empty=drop`,...t],`cherry-pick`,s,{codex:e,codexApproved:n,prepareVerification:c,rebaseBase:m,signal:d,totalCommits:l.applied+t.length})}else if(f===`dev`&&(v=await Ie(r,p))!==void 0&&!await Gt(r,v,o)){await je(r),h=!1;let t=Number(await Z(_,[`rev-list`,`--count`,`${v}..${p}`]));F(`integration.strategy`,{strategy:`rebase`,consumedBoundary:v,localMain:o,targetCommit:p,worktreeId:g});let l=await mt(_,i,[`rebase`,`--onto`,o,v,p],`rebase`,s,{codex:e,codexApproved:n,journal:a?{...a,expectedMain:o,source:f,target:p}:void 0,prepareVerification:c,rebaseBase:o,signal:d,totalCommits:t});if(l)return{commit:l.applied>0?l.partial:void 0,pause:{applied:l.applied,commits:l.commits,devBase:v,files:l.files,record:l.record}}}else if(f===`dev`){let n=await Q(_,[`merge-base`,o,p]),a=!1;if(n){await je(r);try{await t(_,[`rebase`,`--onto`,o,n,p],{env:{GIT_EDITOR:`true`}}),a=!0}catch(e){if((await wt(_)).length===0)throw e;F(`integration.fallback`,{from:`rebase`,to:`merge`}),await t(_,[`rebase`,`--abort`]),await t(_,[`reset`,`--hard`,o]),Y(d)}}a||await mt(_,i,[`merge`,`--no-edit`,`--no-ff`,`--allow-unrelated-histories`,`--message`,`Merge dev into main`,p],`merge`,s,{codex:e,prepareVerification:c,signal:d})}else{let t=await Q(_,[`merge-base`,o,p]),r=Number(await Z(_,[`rev-list`,`--count`,t?`${t}..HEAD`:`HEAD`])),l=await mt(_,i,t?[`rebase`,`--onto`,p,t]:[`rebase`,`--root`,`--onto`,p],`rebase`,s,{codex:e,codexApproved:n,journal:a?{...a,expectedMain:o,source:f,target:p}:void 0,prepareVerification:c,rebaseBase:p,signal:d,totalCommits:r});if(l)return{commit:l.applied>0?l.partial:void 0,pause:{applied:l.applied,commits:l.commits,files:l.files,record:l.record}}}return Y(d),{advanceDev:h,commit:await Z(_,[`rev-parse`,`HEAD`]),devTarget:f===`dev`?p:void 0}}finally{await t(r,[`worktree`,`remove`,`--force`,_]).catch(e=>{F(`worktree.cleanup-failed`,{worktreeId:g,...P(e)},`warn`)}),await E(_,{force:!0,recursive:!0})}}async function Ie(e,t){let n=await Q(e,[`rev-parse`,pe]);if(n&&await Gt(e,n,t))return n}async function Le(e){return(await Z(e,[`worktree`,`list`,`--porcelain`]).catch(()=>``)).split(`
3
3
 
4
4
  `).some(e=>e.split(`
5
- `).includes(`branch ${se}`))}async function G(e,t,n){let r=t.devTarget?await Q(e,[`rev-parse`,le])??Fe:void 0,i=!1,a,o=async o=>{let s=o&&t.devTarget!==void 0&&t.devTarget!==t.commit&&t.advanceDev!==!1&&!await Me(e);a=t.devTarget?o&&s?t.commit:t.devTarget:void 0,k(`refs.publish-started`,{expectedMain:n,expectedDev:t.devTarget,commit:t.commit,consumedDev:a,includeDev:o});let c=[`start`,`update ${R} ${t.commit} ${n}`];o&&t.devTarget&&c.push(s?`update ${se} ${t.commit} ${t.devTarget}`:`verify ${se} ${t.devTarget}`),t.devTarget&&a&&c.push(`update ${le} ${a} ${r}`),c.push(`prepare`,`commit`),await A(`refs.publish`,()=>L(`git`,[`update-ref`,`--stdin`],{cwd:e,stdin:{string:`${c.join(`
6
- `)}\n`}}),{expectedMain:n,expectedDev:t.devTarget,commit:t.commit,includeDev:o}),i=s,k(`refs.published`,{main:t.commit,dev:o?t.commit:void 0,consumedDev:a,includeDev:o})};try{return await o(!0),{consumedDev:a!==void 0&&r!==void 0?{after:a,before:r}:void 0,devMoved:i}}catch(i){if(!t.devTarget)throw i;let s;try{s=await Promise.all([Z(e,[`rev-parse`,R]),Q(e,[`rev-parse`,se])])}catch{throw i}let[c,l]=s;if(k(`refs.publish-rejected`,{expectedMain:n,actualMain:c,expectedDev:t.devTarget,actualDev:l},`warn`),c!==n||l===t.devTarget)throw i;return k(`refs.publish-main-only`,{actualDev:l}),await o(!1),{consumedDev:a!==void 0&&r!==void 0?{after:a,before:r}:void 0,devMoved:!1}}}var K=class extends Error{},Ne=class extends Error{},Pe=class extends Error{};const Fe=`0000000000000000000000000000000000000000`;async function Ie({advanceDev:e,base:t,commit:n,cwd:r,devTarget:i,gitDir:o,journalPath:s,onMutate:c,onStage:d,operationId:f,paused:p,releasedPins:m,sessionId:h,signal:g,source:v,target:y}){let b=await Ve(r,t,n),S=F.join(o,`index`),C=`${S}.lock`,w=F.join(o,`HEAD.lock`),T=F.join(`.coreframe`,`managed-dev-retained`,`${a.pid}-${N(4).toString(`hex`)}`),E=F.join(r,T),D={version:2,operationId:f,sessionId:h,phase:`publishing`,source:v,target:y,expectedMain:t,commit:n,checkout:{branch:R,fingerprint:t},devTarget:i,retainedDir:T,paths:b.map(({path:e,status:t,oldSha:n,newSha:r})=>({path:e,status:t,oldSha:n,newSha:r})),displaced:[],...p?{paused:p}:{}};await ze(C,h,`index`);let A=[],j=[],M=[],P=!1,ee=!1,te=!1,ne=!1,re,I=async(e,t,n,i)=>{let a=F.join(r,e);if(await l(a).catch(()=>void 0)===void 0)return;await c?.(`displace`,e);let o=`${A.length}.${Buffer.from(e).toString(`base64url`)}`;await u(E,{recursive:!0});try{await _(a,F.join(E,o))}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let s={entryPath:e,slot:o,expected:t,unexpected:n,blockedPath:i};return A.push(s),D.displaced.push({path:e,slot:o,expected:t?.sha??null}),s};try{await Be(r,t,b),await d?.(`preflight`),J(g),await q(s,D);for(let e of b){if(await d?.(`path`,e.path),e.status===`A`){let t=await l(F.join(r,e.path)).catch(()=>void 0);t&&!(t.isDirectory()&&e.newMode===`160000`)&&await I(e.path,null,!0);continue}if(e.oldMode===`160000`)continue;let t=await I(e.path,{mode:e.oldMode,sha:e.oldSha},!1);if(e.status!==`D`&&t===void 0)throw new K(`The path ${e.path} changed during synchronization; your changes were preserved. Review them and refresh again.`)}for(let e of b)if(e.status!==`D`)for(let t=F.dirname(e.path);t&&t!==`.`;t=F.dirname(t)){let n=await l(F.join(r,t)).catch(()=>void 0);if(n&&!n.isDirectory()){await I(t,null,!0,e.path);break}}for(let e of A)if(!(e.expected!==null&&await He(r,E,e)))throw new K(e.unexpected?e.blockedPath?`The path ${e.entryPath} is not a directory, so the update cannot create ${e.blockedPath}; it was preserved.`:`The path ${e.entryPath} was created during synchronization and the update would replace it; it was preserved. Move it aside or commit it, then refresh again.`:`The path ${e.entryPath} changed during synchronization; your changes were preserved. Review them and refresh again.`);if(A.length>0){await Ue(E);for(let e of new Set(A.map(e=>F.dirname(F.join(r,e.entryPath)))))await Ue(e)}await d?.(`displaced`),J(g);let a=await G(r,{advanceDev:e,commit:n,devTarget:i},t);ne=a.devMoved,re=a.consumedDev,te=!0,D.refsPublished=!0,await q(s,D),await d?.(`refs`),J(g),await ze(w,h,`HEAD`),P=!0;let o=await et(r);if(o!==R)throw new K(`The checkout moved to ${o??`detached HEAD`} during synchronization; nothing was overwritten.`);for(let e of b)if(e.status!==`D`)try{await Ge(r,e,c),j.push({entryPath:e.path,mode:e.newMode,sha:e.newSha})}catch(t){if(t instanceof Pe){M.push(e.path);continue}throw t}await d?.(`files`),J(g);for(let e of await Ze(r,b))M.includes(e)||M.push(e);let u=await tt(r);if(u.branch!==R||u.main!==n)throw D.phase=`recovery-needed`,D.diverged=M,D.error=u.branch===R?`Local main moved to ${u.main?.slice(0,12)??`nothing`} while the update was applied.`:`The checkout moved to ${u.branch??`detached HEAD`} while the update was applied.`,new Ne(D.error);await X(r,[`read-tree`,n],{env:{GIT_INDEX_FILE:C}}),await Le(r,n),await _(C,S),ee=!0,await d?.(`index`),await Le(r,n);let f=await Ye(r,T);for(let e of b)e.status===`D`&&await rt(r,F.dirname(e.path));if(D.paused&&D.paused.remaining.length>0)D.phase=`paused`,await q(s,D);else{D.phase=`published`,D.released=m,await q(s,D);for(let e of m??[])await X(r,[`update-ref`,`-d`,e]).catch(t=>{k(`publication.pin-release-failed`,{ref:e,...O(t)},`warn`)});await lt(s)}return k(`checkout.published`,{commit:n,paths:j.length,divergedCount:M.length,...f?{preserved:f}:{}}),{diverged:M,preserved:f}}catch(e){let a=e instanceof Ne||e instanceof K?e:void 0;a||(D.error=$(e));let o=[];for(let e of[...j].reverse())try{await Ke(r,E,e,c)?await rt(r,F.dirname(e.entryPath)):o.push(e.entryPath)}catch{o.push(e.entryPath)}for(let e of[...A].reverse())try{await Je(r,E,e.slot,e.entryPath,c)||o.push(e.entryPath)}catch{o.push(e.entryPath)}P&&(P=!1,await x(w).catch(()=>void 0));let l=te?await Qe(r,t,n,i,ne,re):!0,u=!ee;if(ee&&l&&o.length===0&&(u=await X(r,[`read-tree`,t]).then(()=>!0,()=>!1)),o.length===0&&l&&u){let t=await Ye(r,T);D.paused&&D.paused.remaining.length>0?(D.phase=`paused`,D.refsPublished=!1,D.displaced=[],D.diverged=void 0,D.error=void 0,D.observed=void 0,await q(s,D).catch(e=>{k(`publication.journal-failed`,O(e),`warn`)})):await lt(s);let n=t?` File versions captured during synchronization are preserved under ${t}.`:``;throw a instanceof Ne?new K(`${a.message}${n}`):e instanceof K?new K(`${e.message}${n}`):e}throw D.phase=`recovery-needed`,D.displaced=A.filter(e=>o.includes(e.entryPath)).map(e=>({path:e.entryPath,slot:e.slot,expected:e.expected?.sha??null})),D.diverged=[...new Set([...D.diverged??[],...M,...o])],D.error??=$(e),D.refsPublished=await $e(r,R,n),D.observed=await tt(r),await nt(r,D),await q(s,D).catch(e=>{k(`publication.journal-failed`,O(e),`warn`)}),new Ne(`Synchronization was interrupted before the checkout could be fully reconciled.${D.diverged.length?` Kept unreviewed changes in: ${D.diverged.join(`, `)}.`:``} Review \`git status\` before continuing.`)}finally{P&&await x(w).catch(()=>void 0),ee||await x(C).catch(()=>void 0)}}async function Le(e,t){let{branch:n,main:r}=await tt(e);if(n!==R||r!==t)throw new Ne(n===R?`Local main moved to ${r?.slice(0,12)??`nothing`} while the update was applied.`:`The checkout moved to ${n??`detached HEAD`} while the update was applied.`)}function Re(e){let t=e.indexOf(`.`);if(t<0)return;let n=Buffer.from(e.slice(t+1),`base64url`).toString(`utf8`);return n===``?void 0:n}async function ze(e,t,n){for(let n=0;n<10;n++){try{let n=await f(e,`wx`);await n.writeFile(`${z}${a.pid} ${t}\n`),await n.close();return}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`EEXIST`))throw e}await new Promise(e=>setTimeout(e,25))}throw new K(`Another Git operation holds the ${n} lock; synchronization was refused so it cannot overwrite in-progress work. Retry once it finishes.`)}async function Be(e,t,n){let r=await et(e);if(r!==R)throw new K(`The checkout moved to ${r??`detached HEAD`} during synchronization; nothing was overwritten.`);let[i,a]=await Promise.all([Z(e,[`rev-parse`,`HEAD`]),Z(e,[`rev-parse`,R])]);if(i!==t||a!==t)throw new K(`Local main changed while the accepted update was being published; nothing was overwritten.`);let o={GIT_OPTIONAL_LOCKS:`0`};if(!await it(e,[`diff`,`--quiet`],o)||!await it(e,[`diff`,`--quiet`,`--cached`],o))throw new K(`The working tree changed during synchronization; your changes were preserved. Review them and refresh again.`);for(let t of n){if(t.status!==`A`)continue;let n=await l(F.join(e,t.path)).catch(()=>void 0);if(n&&!n.isDirectory())throw new K(`The path ${t.path} was created during synchronization and the update would replace it; it was preserved. Move it aside or commit it, then refresh again.`);for(let n=F.dirname(t.path);n&&n!==`.`;n=F.dirname(n)){let r=await l(F.join(e,n)).catch(()=>void 0);if(r&&!r.isDirectory())throw new K(`The path ${n} is not a directory, so the update cannot create ${t.path}; it was preserved.`)}}}async function Ve(e,t,n){let r=(await Z(e,[`diff-tree`,`-r`,`--raw`,`-z`,`--no-renames`,t,n])).split(`\0`).filter(Boolean),i=[];for(let e=0;e<r.length;){let t=r[e++];if(!t.startsWith(`:`))continue;let n=t.slice(1).split(` `),a=r[e++],o=(n[4]??``)[0];(o===`A`||o===`D`||o===`M`||o===`T`)&&i.push({path:a,status:o,oldMode:n[0]??``,newMode:n[1]??``,oldSha:n[2]??Fe,newSha:n[3]??Fe})}return i}async function He(e,t,n){if(n.expected===null)return!1;let r=F.join(t,n.slot),i=await l(r).catch(()=>void 0);return i?n.expected.mode===`160000`?i.isDirectory():n.expected.mode===`120000`?i.isSymbolicLink()&&st(await h(r))===n.expected.sha:i.isFile()&&await at(e,n.entryPath,F.relative(e,r))===n.expected.sha:!1}async function Ue(e){let t=await f(e,`r`).catch(()=>void 0);if(t)try{await t.sync()}catch{}finally{await t.close()}}function We(e){return e instanceof Error&&`code`in e&&(e.code===`EEXIST`||e.code===`ENOTDIR`||e.code===`EISDIR`||e.code===`ENOTEMPTY`)}async function Ge(e,t,n){let r=F.join(e,t.path);try{await u(F.dirname(r),{recursive:!0})}catch(e){throw We(e)?new Pe($(e)):e}await n?.(`write`,t.path);try{if(t.newMode===`160000`){(await l(r).catch(()=>void 0))?.isDirectory()||await u(r);return}if(t.newMode===`120000`){await b((await ot(e,t.newSha)).toString(`utf8`),r);return}let n=await f(r,`wx`,t.newMode===`100755`?493:420);try{await n.writeFile(await ot(e,t.newSha,t.path)),await n.sync()}finally{await n.close()}}catch(e){throw We(e)?new Pe($(e)):e}}async function Ke(e,t,n,r){let i=F.join(e,n.entryPath);if(!await l(i).catch(()=>void 0))return!0;if(n.mode===`160000`)try{return await y(i),!0}catch(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}await r?.(`remove`,n.entryPath),await u(t,{recursive:!0});let a=`w.${Buffer.from(n.entryPath).toString(`base64url`)}`;try{await _(i,F.join(t,a))}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!0;throw e}return await qe(e,t,a,n)?!0:(await Je(e,t,a,n.entryPath,r),!1)}async function qe(e,t,n,r){let i=F.join(t,n),a=await l(i).catch(()=>void 0);return a?r.mode===`120000`?a.isSymbolicLink()&&st(await h(i))===r.sha:a.isFile()&&await at(e,r.entryPath,F.relative(e,i))===r.sha:!1}async function Je(e,t,n,r,i){let a=F.join(t,n),o=F.join(e,r),s=await l(a).catch(()=>void 0);if(!s)return!0;if(await l(o).catch(()=>void 0)!==void 0)return!1;if(await u(F.dirname(o),{recursive:!0}).catch(()=>void 0),await i?.(`restore`,r),s.isDirectory()){try{await u(o)}catch{return!1}try{return await _(a,o),!0}catch{return await y(o).catch(()=>void 0),!1}}try{s.isSymbolicLink()?await b(await h(a),o):await c(a,o)}catch{return!1}return await x(a).catch(()=>void 0),!0}async function Ye(e,t){let n=F.join(e,t),r=await m(n).catch(()=>[]);if(r.length===0){await y(n).catch(()=>void 0),await rt(e,F.dirname(t)).catch(()=>void 0);return}let i=F.join(`.coreframe`,`managed-dev-previous`,F.basename(t));try{await u(F.join(e,F.dirname(i)),{recursive:!0}),await _(n,F.join(e,i))}catch(e){return k(`publication.preserve-failed`,O(e),`warn`),t}return await rt(e,F.dirname(t)).catch(()=>void 0),k(`publication.preserved`,{location:i,slots:r.length}),i}async function Xe(e,t,n){let r=F.join(e,t.path),i=n===`old`?t.oldSha:t.newSha,a=n===`old`?t.oldMode:t.newMode,o=await l(r).catch(()=>void 0);return o?a===`160000`?o.isDirectory():a===`120000`?o.isSymbolicLink()&&st(await h(r))===i:o.isFile()?await at(e,t.path)===i:!1:!1}async function Ze(e,t){let n=[];for(let r of t){if(r.status===`D`){await l(F.join(e,r.path)).catch(()=>void 0)!==void 0&&n.push(r.path);continue}await Xe(e,r,`new`)||n.push(r.path)}return n}async function Qe(e,t,n,r,i,a){let o=[`start`,`update ${R} ${t} ${n}`];i&&r&&o.push(`update ${se} ${r} ${n}`),a&&o.push(a.before===Fe?`delete ${le} ${a.after}`:`update ${le} ${a.before} ${a.after}`),o.push(`prepare`,`commit`);try{return await L(`git`,[`update-ref`,`--stdin`],{cwd:e,stdin:{string:`${o.join(`
7
- `)}\n`}}),k(`refs.reverted`,{commit:n,expectedMain:t}),!0}catch(e){return k(`refs.revert-failed`,{commit:n,expectedMain:t,...O(e)},`warn`),!1}}async function $e(e,t,n){return await Q(e,[`rev-parse`,`--verify`,t])===n}async function et(e){return Q(e,[`symbolic-ref`,`-q`,`HEAD`])}async function tt(e){return{branch:await et(e),head:await Q(e,[`rev-parse`,`HEAD`]),main:await Q(e,[`rev-parse`,R])}}async function nt(e,t){let n=`refs/coreframe/prepared/${t.sessionId}-${t.commit.slice(0,12)}`;try{await X(e,[`update-ref`,n,t.commit]),t.preparedRef=n}catch(e){k(`publication.pin-failed`,O(e),`warn`)}}async function rt(e,t){let n=t;for(;n&&n!==`.`;){try{await y(F.join(e,n))}catch{return}n=F.dirname(n)}}async function it(e,t,n){try{return await L(`git`,t,{cwd:e,env:n,stdin:`ignore`}),!0}catch(e){if(e instanceof oe&&e.exitCode===1)return!1;throw e}}async function at(e,t,n=t){return Z(e,[`hash-object`,`--path=${t}`,`--`,n])}async function ot(e,t,n){let r=n?[`cat-file`,`--filters`,`--path=${n}`,t]:[`cat-file`,`blob`,t];return new Promise((t,n)=>{let i=j(`git`,r,{cwd:e,stdio:[`ignore`,`pipe`,`pipe`]}),a=[],o=[];i.stdout.on(`data`,e=>a.push(e)),i.stderr.on(`data`,e=>o.push(e)),i.once(`error`,n),i.once(`close`,e=>{e===0?t(Buffer.concat(a)):n(Error(`git ${r[0]} failed: ${Buffer.concat(o).toString(`utf8`)}`))})})}function st(e){let t=Buffer.from(e);return M(`sha1`).update(`blob ${t.length}\0`).update(t).digest(`hex`)}async function q(e,t){let n=`${e}.${a.pid}.tmp`,r=await f(n,`w`,384);try{await r.writeFile(`${JSON.stringify(t)}\n`),await r.sync()}finally{await r.close()}await _(n,e),await Ue(F.dirname(e))}async function ct(e){let t;try{t=JSON.parse(await p(e,`utf8`))}catch(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`?{}:(k(`publication.journal-unreadable`,O(e),`warn`),{problem:`corrupt`})}if(!t||typeof t!=`object`||typeof t.commit!=`string`||typeof t.expectedMain!=`string`)return k(`publication.journal-unreadable`,{shape:`invalid`},`warn`),{problem:`corrupt`};let n=t.version;return n!==1&&n!==2?(k(`publication.journal-unreadable`,{version:typeof n==`number`||typeof n==`string`?n:`unknown`},`warn`),{problem:`unsupported-version`}):{journal:t}}async function lt(e){await x(e).catch(()=>void 0)}async function ut(e,t,n){let r=F.join(t.commonDir,de),i=async e=>f(e,`r`).then(async e=>{try{let t=Buffer.alloc(64),{bytesRead:n}=await e.read(t,0,64,0),r=await e.stat();return{head:t.subarray(0,n).toString(`utf8`),mtimeMs:r.mtimeMs}}finally{await e.close()}}).catch(()=>void 0),a=F.join(t.gitDir,`index.lock`),o=F.join(t.gitDir,`HEAD.lock`),[s,c]=await Promise.all([i(a),i(o)]),l=async(e,t,n)=>{if(t===void 0)return;let r=Date.now()-t.mtimeMs>3e4;(t.head.startsWith(z)||r&&n(t))&&await x(e).catch(e=>{k(`publication.lock-removal-failed`,O(e),`warn`)})};await l(a,s,e=>e.head===``||e.head.startsWith(`DIRC`)),await l(o,c,()=>!0);let u=F.join(t.commonDir,`coreframe-managed-dev`);for(let t of(await Z(e,[`worktree`,`list`,`--porcelain`]).catch(()=>``)).split(`
8
- `)){if(!t.startsWith(`worktree `))continue;let n=t.slice(9);F.resolve(n).startsWith(`${F.resolve(u)}${F.sep}`)&&await X(e,[`worktree`,`remove`,`--force`,n]).catch(e=>{k(`worktree.cleanup-failed`,O(e),`warn`)})}await X(e,[`worktree`,`prune`]).catch(()=>void 0);for(let e of await m(u).catch(()=>[]))e.startsWith(`integration-`)&&await v(F.join(u,e),{force:!0,recursive:!0}).catch(()=>void 0);let{journal:d,problem:p}=await ct(r),h=[],g=F.join(e,`.coreframe`,`managed-dev-retained`),_=new Set((await m(g).catch(()=>[])).map(e=>F.join(g,e)));d?.retainedDir&&_.add(F.join(e,d.retainedDir));for(let t of _){let r=h.length;for(let r of await m(t).catch(()=>[])){let i=Re(r);i!==void 0&&!F.isAbsolute(i)&&!i.split(`/`).includes(`..`)&&await Je(e,t,r,i,n)||h.push(i??r)}h.length===r&&await y(t).catch(()=>void 0)}h.length===0&&await rt(e,`.coreframe/managed-dev-retained`).catch(()=>void 0);let[b,S,C,w]=await Promise.all([et(e),Q(e,[`rev-parse`,`HEAD`]),Q(e,[`rev-parse`,R]),(async()=>await it(e,[`diff`,`--quiet`],{GIT_OPTIONAL_LOCKS:`0`})&&await it(e,[`diff`,`--quiet`,`--cached`],{GIT_OPTIONAL_LOCKS:`0`}))()]),T=h.length?`Displaced originals that could not be returned are kept under .coreframe/managed-dev-retained: ${h.join(`, `)}.`:void 0;if(p)return{notice:`A previous synchronization left a ${p===`unsupported-version`?`journal in an unsupported format`:`corrupted journal`}; its pinned commits are preserved under refs/coreframe/managed-dev. Inspect ${r} and \`git status\`, then restart managed development.`};let E=new Set([d?.paused?.originalRef,d?.paused?.preparedRef,d?.preparedRef].filter(e=>typeof e==`string`));for(let t of(await Z(e,[`for-each-ref`,`--format=%(refname)`,`refs/coreframe/managed-dev/`]).catch(()=>``)).split(`
9
- `))t&&!E.has(t)&&await X(e,[`update-ref`,`-d`,t]).catch(e=>{k(`publication.pin-release-failed`,{ref:t,...O(e)},`warn`)});if(!d)return T?{notice:T}:void 0;let D=b===R&&S===C&&(C===d.commit||C===d.expectedMain)&&w&&h.length===0,A=!!d.paused&&b===R&&S===C&&(C===d.commit||C===d.expectedMain),j=async()=>{for(let t of d.released??[])await X(e,[`update-ref`,`-d`,t]).catch(()=>void 0)};if(d.phase===`declined`)return{notice:T};if((d.phase===`published`||d.phase===`preparing`||D)&&!d.paused)return await j(),await lt(r),{notice:T};if(d.paused&&A){let t=d.paused,n=await(async()=>{if(!await dt(e,`${t.originalRef}^{commit}`)||!await dt(e,`${t.preparedRef}^{commit}`))return`its recovery refs are missing`;let n=t.remaining.find(e=>e.command!==`pick`);if(n)return`a replay instruction that cannot be resumed (${n.command})`;for(let n of t.remaining)if(!await dt(e,`${n.commit}^{commit}`))return`a pending commit (${n.commit.slice(0,12)}) that is no longer in the object store`})();return n?(k(`rebase.paused-unrecoverable`,{reason:n,operationId:d.operationId},`warn`),d.phase=`recovery-needed`,d.error=`A paused update replay cannot resume because ${n}; the original commits remain pinned.`,d.observed={branch:b,head:S,main:C},await q(r,d).catch(e=>{k(`publication.journal-failed`,O(e),`warn`)}),{notice:`${d.error} Run \`git status\` to reconcile, then restart managed development.${T?` ${T}`:``}`}):(d.phase=`paused`,d.refsPublished=C===d.commit,await q(r,d).catch(e=>{k(`publication.journal-failed`,O(e),`warn`)}),{notice:T,paused:t,pendingRebase:{applied:t.applied,commits:t.remaining.map(e=>({commit:e.commit,shortCommit:e.commit.slice(0,12),subject:e.subject})),dropped:t.dropped.length>0?t.dropped:void 0,files:t.files,target:await Ht(e,d.source===`dev`?await W(e,d.target)??d.expectedMain:d.expectedMain,d.target,d.source)}})}if(d.phase===`preparing`&&b===R&&S===C)return await lt(r),{notice:T};d.phase=`recovery-needed`,d.observed={branch:b,head:S,main:C},await q(r,d).catch(e=>{k(`publication.journal-failed`,O(e),`warn`)});let M=`HEAD is ${b??`detached at ${S?.slice(0,12)??`unknown`}`}, local main is ${C?.slice(0,12)??`missing`}, and tracked changes ${w?`are clean`:`are present`}`,N=T?` ${T}`:``;return{notice:`A previous synchronization was interrupted and needs review: expected main ${d.expectedMain.slice(0,12)} to become ${d.commit.slice(0,12)}, but ${M}.${N} Run \`git status\` to reconcile, then restart managed development.`}}async function dt(e,t){return it(e,[`rev-parse`,`--verify`,`--quiet`,t],{GIT_OPTIONAL_LOCKS:`0`})}async function ft(e,t,n,r,i,{codex:a,codexApproved:o=!0,journal:s,prepareVerification:c,rebaseBase:l,signal:u,totalCommits:d=0}={}){try{await X(e,n,{env:{GIT_EDITOR:`true`}});return}catch(n){let f=await Et(e);if(k(`integration.conflicts`,{operation:r,conflictCount:f.length,codexApproved:o}),f.length===0)throw n;if(!o&&r===`rebase`)try{let t=await pt(e,f,s);return k(`rebase.paused`,{applied:t.applied,droppedCommits:t.record.dropped.length,remainingCommits:t.commits.length,conflictCount:f.length}),t}finally{await X(e,[r,`--abort`]).catch(()=>void 0)}try{for(;f.length>0;){J(u),await gt(e,t,r,f,l?await xt(e,l):[],d,i,u,a),await X(e,[`diff`,`--check`]),await X(e,[`add`,`--all`]);let n=await Et(e);if(k(`integration.conflicts-resolved`,{operation:r,remainingCount:n.length}),n.length>0)throw Error(`Codex left unresolved paths: ${n.join(`, `)}`);try{await X(e,[r,`--continue`],{env:{GIT_EDITOR:`true`}})}catch(t){if(f=await Et(e),f.length===0)if(r!==`merge`&&await it(e,[`diff`,`--cached`,`--quiet`],{GIT_OPTIONAL_LOCKS:`0`}))await X(e,[r,`--skip`],{env:{GIT_EDITOR:`true`}});else throw t;i({commits:l?await xt(e,l):[],phase:`progress`,stage:`resolve`,totalCommits:d});continue}i({commits:l?await xt(e,l):[],phase:`progress`,stage:`resolve`,totalCommits:d}),f=await Et(e)}try{if(r===`rebase`||r===`cherry-pick`){let n=await c?.(e,u)??{dispose:async()=>void 0,env:t};try{await _t(e,n.env,r,i,u,a)}finally{await n.dispose().catch(e=>{k(`verification.cleanup-failed`,O(e),`warn`)})}}}catch(e){throw J(u),Error(`Codex could not verify the ${r} result: ${$(e)}`)}return}catch(t){throw k(`integration.aborting`,{operation:r,cancelled:u?.aborted??!1}),await X(e,[r,`--abort`]).catch(()=>void 0),J(u),Error(`Codex could not resolve ${r} conflicts: ${$(t)}`)}}}async function pt(e,t,n){let r=F.resolve(e,await Z(e,[`rev-parse`,`--absolute-git-dir`])),i=F.join(r,`rebase-merge`),a=e=>p(F.join(i,e),`utf8`).catch(()=>``),[o,s,c,l,u,d]=await Promise.all([a(`done`),a(`git-rebase-todo`),a(`stopped-sha`),a(`orig-head`),a(`rewritten-list`),Z(e,[`rev-parse`,`HEAD`])]),f=c.trim(),m=l.trim();if(!f||!m)throw Error(`The rebase stopped without readable sequencer state; the pending commits cannot be recorded exactly.`);let h=new Map(u.split(`
10
- `).map(e=>e.trim().split(/\s+/)).filter(e=>e.length===2).map(e=>[e[0],e[1]])),g=async t=>{let n=await Z(e,[`rev-parse`,`${t}^{commit}`]),r=await Z(e,[`show`,`-s`,`--format=%s`,n]);return{commit:n,shortCommit:n.slice(0,12),subject:r}},_=o.split(`
11
- `).map(e=>e.trim()).filter(Boolean).map(e=>{let[,t=``,n=``]=/^(\S+)(?:\s+([0-9a-f]+))?/.exec(e)??[];return{command:t,commit:n}}),v=_.findIndex(e=>e.commit&&f.startsWith(e.commit));v>=0?_.splice(v,1):k(`rebase.stopped-not-in-done`,{stopped:f.slice(0,12)},`warn`);let y=await g(f),b=[{command:`pick`,commit:y.commit,subject:y.subject}];for(let e of s.split(`
12
- `)){let t=e.trim();if(!t||t.startsWith(`#`))continue;let[,n=``,r=``]=/^(\S+)(?:\s+([0-9a-f]+))?/.exec(t)??[],i=r?await g(r):void 0,a={command:n,commit:i?.commit??``,subject:i?.subject??``};if(!a.commit)throw Error(`The rebase queued a replay instruction that cannot be resumed: ${t}.`);b.push(a)}let x=_.filter(e=>e.command===`pick`&&e.commit).map(e=>e.commit),S=[];for(let e of x)[...h.keys()].some(t=>t.startsWith(e))||S.push(await g(e));let C=`refs/coreframe/managed-dev/${n?.operationId??`session-${n?.sessionId??P()}`}/original`,w=`${F.posix.dirname(C)}/prepared`;await X(e,[`update-ref`,C,m]),await X(e,[`update-ref`,w,d]);let T={applied:h.size,base:d,dropped:S,files:t,originalRef:C,preparedRef:w,recoveryRef:n?.recoveryRef,remaining:b};if(n){let e={version:2,operationId:n.operationId,sessionId:n.sessionId,phase:`paused`,source:n.source,target:n.target,expectedMain:n.expectedMain??m,commit:d,checkout:{branch:R,fingerprint:n.expectedMain??m},paused:T};await q(n.journalPath,e)}return{applied:T.applied,commits:b.map(e=>({commit:e.commit,shortCommit:e.commit.slice(0,12),subject:e.subject})),files:t,partial:d,record:T}}function J(e){if(e?.aborted)throw Error(`The update integration was cancelled.`)}async function mt(e,t,n,r,i,a,o){return A(`codex`,()=>ht(e,t,n,r,i,a),{model:r?.model,effort:r?.effort,purpose:o})}async function ht(n,r,i,o,s,c){if(J(c),a.platform===`win32`)throw Error(`Managed Codex requires process-tree isolation unavailable on Windows; ownership is retained until shutdown.`);let l=j(`codex`,[`exec`,...e(o),`--ephemeral`,`--ignore-user-config`,`--json`,`--sandbox`,`workspace-write`,`--cd`,n,i],{cwd:n,env:{...r,GIT_AUTHOR_EMAIL:r.GIT_AUTHOR_EMAIL??`codex@managed-dev.local`,GIT_AUTHOR_NAME:r.GIT_AUTHOR_NAME??`Codex`,GIT_COMMITTER_EMAIL:r.GIT_COMMITTER_EMAIL??`codex@managed-dev.local`,GIT_COMMITTER_NAME:r.GIT_COMMITTER_NAME??`Codex`},detached:!0,stdio:[`ignore`,`pipe`,`pipe`]}),u=new Promise((e,t)=>{l.once(`error`,t),l.once(`close`,(n,r)=>{n===0?e():t(Error(`Codex exited with ${r??n}.`))})});u.catch(()=>void 0);let d,f,p=e=>{if(l.pid)try{a.kill(-l.pid,e)}catch(e){e.code!==`ESRCH`&&(f=Error(`Unresolved Codex process ownership: could not terminate process group; stop the owned processes before replacing this owner.`))}},m,h,g=new Promise((e,t)=>{h=t}),_=new Map,v=P(),y=e=>{let t=Ct(e,v,_);t&&(t.status===`running`?_.set(t.id,t):_.delete(t.id),s({phase:`activity`,activity:t}))},b=``,x=[],S=()=>{p(`SIGTERM`),d??=setTimeout(()=>p(`SIGKILL`),500),m??=setTimeout(()=>{f=Error(`Unresolved Codex process ownership: exit or streams did not settle after forced termination; ownership is retained.`),h(f)},3e3)};c?.addEventListener(`abort`,S),c?.aborted&&S();try{let e=(await Promise.race([g,Promise.allSettled([u,Tt(ne({input:l.stdout}),e=>{y(e);let n=wt(e,t(o));n&&(n.kind===`agent`&&(b=n.text),s({message:n,phase:`message`}))}),Tt(ne({input:l.stderr}),e=>x.push(e))])])).find(e=>e.status===`rejected`);if(e?.status===`rejected`)throw e.reason;J(c)}catch(e){s({phase:`error`}),J(c);let t=x.join(`
13
- `).trim();throw t?Error(`${$(e)}\n${t}`):e}finally{for(let e of _.values())e.status===`running`&&s({phase:`activity`,activity:{...e,status:c?.aborted?`cancelled`:`interrupted`,finishedAt:Date.now()}});if(clearTimeout(m),d&&(clearTimeout(d),p(`SIGKILL`),l.pid&&!f)){let e=Date.now()+2e3;for(;Wt(-l.pid)&&Date.now()<e;)await new Promise(e=>setTimeout(e,20));Wt(-l.pid)&&(f=Error(`Unresolved Codex process ownership: process group remains after forced termination; ownership is retained.`))}if(f)throw f;c?.removeEventListener(`abort`,S)}return b}async function gt(e,t,n,r,i,a,o,s,c){J(s);let l=`Resolve the current Git ${n} conflicts cleanly. Edit only files needed for the resolution, preserve intended behavior from both sides, and remove all conflict markers. Do not run tests, typecheck, lint, format, or other slow checks; the managed development session runs them once after the ${n} finishes. Do not stage files or run Git continuation commands. Conflicted paths: ${r.join(`, `)}`,u=e=>o({...e,stage:`resolve`});u({commits:i,message:{kind:`user`,text:l},phase:`start`,totalCommits:a}),u({finalMessage:await mt(e,t,l,c,u,s,`resolve`)||`Codex resolved the conflicts.`,phase:`complete`})}async function _t(e,t,n,r,i,a){J(i);let o=`The Git ${n} finished replaying every commit. Verify the result in this isolated worktree by running the project's checks once each: pnpm test and pnpm typecheck, plus lint or format checks if the project defines them. Dependencies and generated state were prepared for the accepted target, and the local database environment is managed for verification. If a check fails, apply the smallest safe fix and commit it with a conventional-commit message that describes the fix. Do not rewrite Git history, rebase, or amend existing commits. If a failure cannot be fixed safely, describe it in your final response instead of committing a broken fix.`,s=e=>r({...e,stage:`verify`});s({message:{kind:`user`,text:o},phase:`message`}),s({finalMessage:await mt(e,t,o,a,s,i,`verify`)||`Codex finished verifying the result.`,phase:`complete`})}async function vt({config:e,cwd:t,env:n}){if(e.database?.dialect===`sqlite`){let r=await T({config:e,cwd:t,env:n});return{dispose:()=>r[Symbol.asyncDispose](),env:r.env}}let r=await w({config:e,cwd:t,env:n});return{dispose:()=>r[Symbol.asyncDispose](),env:r.env}}async function yt({config:e,cwd:t,env:n,signal:r,startDatabase:a=vt,trackActivity:s}){try{if(J(r),await o(F.join(t,`pnpm-lock.yaml`)).then(()=>!0,()=>!1)&&await s(`Installing dependencies`,`pnpm install --frozen-lockfile`,()=>A(`verification.dependencies`,()=>L(Qt(),[`install`,`--frozen-lockfile`],{cwd:t,env:n}),{worktree:F.basename(t)}),{stage:`verify`,signal:r}),await A(`verification.codegen`,()=>i({cwd:t,env:n,runCodegen:()=>s(`Generating styles`,`pnpm codegen`,()=>L(Qt(),[`codegen`],{cwd:t,env:n}).then(()=>void 0),{stage:`verify`,signal:r})}),{worktree:F.basename(t)}),J(r),!e.database)return{dispose:async()=>void 0,env:n};let c=await s(`Starting verification database`,`Managed local database`,()=>A(`verification.database`,()=>a({config:e,cwd:t,env:n}),{dialect:e.database?.dialect??`postgres`,worktree:F.basename(t)}),{stage:`verify`,signal:r});try{await s(`Preparing database schema`,`pnpm db ensure`,()=>A(`verification.schema`,()=>L(Qt(),[`db`,`ensure`],{cwd:t,env:c.env}),{worktree:F.basename(t)}),{stage:`verify`,signal:r})}catch(e){throw await c.dispose().catch(()=>void 0),e}return c}catch(e){throw Error(`The isolated verification environment could not be prepared: ${$(e)}`,{cause:e})}}async function bt(e,t,n){let r=await Z(e,[`log`,`--reverse`,`--format=%H%x00%s`,t?`${t}..${n}`:n]);return r?r.split(`
14
- `).map(e=>{let[t,n=``]=e.split(`\0`,2);return{commit:t,shortCommit:t.slice(0,12),subject:n}}):[]}function xt(e,t){return bt(e,t,`HEAD`)}async function St(e,t,n,r,i={}){let a={id:P(),label:e,command:t,source:`supervisor`,stage:i.stage,status:`running`,startedAt:Date.now()};r(a);try{let e=await n(),t=kt(e);return r({...a,status:`succeeded`,finishedAt:Date.now(),output:t?re(t).slice(-8e3):void 0}),e}catch(e){throw r({...a,status:i.signal?.aborted?`cancelled`:`failed`,finishedAt:Date.now(),output:Ot(e).slice(-8e3)}),e}}function Ct(e,t,n){let r;try{r=JSON.parse(e)}catch{return}if(!r||typeof r!=`object`)return;let i=r;if(typeof i.type!=`string`||![`item.started`,`item.updated`,`item.completed`].includes(i.type)||!i.item||typeof i.item!=`object`)return;let a=i.item;if(typeof a.id!=`string`)return;let o=a.type===`command_execution`?a.command:a.type===`mcp_tool_call`&&typeof a.server==`string`&&typeof a.tool==`string`?`${a.server}.${a.tool}`:void 0;if(typeof o!=`string`||typeof a.status!=`string`)return;let s=`${t}:${a.id}`,c=n.get(s),l=i.type===`item.completed`,u=typeof a.exit_code==`number`?a.exit_code:void 0,d=l?a.status===`failed`||u!==void 0&&u!==0?`failed`:a.status===`completed`?`succeeded`:`interrupted`:`running`,f=o.match(/^(?:\S*\/)?(?:bash|zsh|sh)\s+-(?:lc|c|cl)\s+(['"])([\s\S]*)\1$/)?.[2]??o;return{id:s,label:a.type===`mcp_tool_call`?`Calling tool`:/^(?:pnpm|npm|yarn|bun) (?:install|ci|add)(?: |$)/.test(f)?`Installing dependencies`:/^(?:pnpm|npm|yarn|bun) (?:run )?test(?: |$)/.test(f)?`Running tests`:/^(?:pnpm|npm|yarn|bun) (?:run )?typecheck(?: |$)/.test(f)?`Checking types`:`Running command`,command:o.slice(0,2e3),source:`codex`,status:d,startedAt:c?.startedAt??Date.now(),finishedAt:l?Date.now():void 0,exitCode:u,output:typeof a.aggregated_output==`string`?re(a.aggregated_output).slice(-8e3):c?.output}}function wt(e,t){let n;try{n=JSON.parse(e)}catch{throw Error(`Codex emitted invalid JSONL output.`)}if(!n||typeof n!=`object`)return;let r=n.item;if(n.type!==`item.completed`||!r||typeof r!=`object`)return;let{text:i,type:a}=r;if(!(typeof i!=`string`||!i.trim())){if(a===`reasoning`)return{kind:`thought`,text:i};if(a===`agent_message`)return{author:t,kind:`agent`,text:i}}}async function Tt(e,t){for await(let n of e)t(n)}async function Et(e){return Yt(await Z(e,[`diff`,`--name-only`,`--diff-filter=U`,`-z`]))}async function Dt(e,t,n){await L(Qt(),[n],{cwd:e,env:t})}function Ot(e){let t=kt(e);if(t){let e=re(t).trim();if(e)return e}return re($(e))}function kt(e){if(typeof e!=`object`||!e)return;let t=e;if(typeof t.output==`string`&&t.output.trim())return t.output;let n=[t.stdout,t.stderr].filter(e=>typeof e==`string`&&e.length>0);return n.length>0?n.join(`
15
- `):void 0}async function At({config:e,cwd:t,env:n}){if(!e.database)return;let r=await jt({config:e,cwd:t,env:n});try{await L(Qt(),[`db`,`migrate-local`],{cwd:t,env:n})}catch(e){throw await r.restore(),e}await r.discard().catch(e=>{console.warn(`Could not remove the managed-development database snapshot: ${$(e)}`)}),await v(r.directory,{force:!0,recursive:!0})}async function jt({config:e,cwd:t,env:n}){let r=F.join(t,`.coreframe`,`managed-dev-backups`);await u(r,{recursive:!0});let i=await d(F.join(r,`refresh-`));if(e.database?.dialect===`sqlite`){let e=[`turso.db`,`turso.db-wal`,`turso.db-shm`],n=new Set;for(let r of e)await Mt(F.join(t,`.coreframe`,r),F.join(i,r))&&n.add(r);return{directory:i,async discard(){},async restore(){for(let r of e){let e=F.join(t,`.coreframe`,r);n.has(r)?await s(F.join(i,r),e):await v(e,{force:!0})}}}}if(!n.DATABASE_URL)throw Error(`DATABASE_URL is required to snapshot local PostgreSQL.`);let a=await Nt(t);if(a)return Pt({directory:i,connectionString:n.DATABASE_URL,postgres:a});let o=F.join(i,`database.dump`),c=Rt(n,n.DATABASE_URL);return await L(`pg_dump`,[`--format=custom`,`--file`,o],{cwd:t,env:c,stdin:`ignore`}),{directory:i,async discard(){},async restore(){await L(`pg_restore`,[`--clean`,`--if-exists`,`--no-owner`,`--dbname`,c.PGDATABASE,o],{cwd:t,env:c,stdin:`ignore`})}}}async function Mt(e,t){try{return await s(e,t),!0}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e;return!1}}async function Nt(e){let t=JSON.parse(await p(F.join(e,`package.json`),`utf8`));if(!(!t.dependencies?.pg&&!t.devDependencies?.pg&&!t.optionalDependencies?.pg))try{return await import(ae(`pg`,C(F.join(e,`package.json`)).href))}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ERR_MODULE_NOT_FOUND`)return;throw e}}async function Pt({directory:e,connectionString:t,postgres:n}){let r=new URL(t),i=decodeURIComponent(r.pathname.slice(1));if(!i)throw Error(`DATABASE_URL must name a PostgreSQL database to snapshot.`);let a=`coreframe_backup_${N(6).toString(`hex`)}`,o=`${a}_failed`,s=new URL(r);s.pathname=i===`postgres`?`/template1`:`/postgres`;let c=new n.Client({connectionString:s.href});await c.connect();try{await It(c,i,!1),await Lt(c,i),await c.query(`CREATE DATABASE ${Y(a)} WITH TEMPLATE ${Y(i)}`),await It(c,a,!0)}finally{await It(c,i,!0).catch(()=>void 0),await c.end()}return{directory:e,async discard(){await Ft(n,s.href,async e=>{await Lt(e,a),await e.query(`DROP DATABASE ${Y(a)}`)})},async restore(){await Ft(n,s.href,async e=>{await It(e,i,!1),await Lt(e,i),await e.query(`ALTER DATABASE ${Y(i)} RENAME TO ${Y(o)}`);try{await e.query(`ALTER DATABASE ${Y(a)} RENAME TO ${Y(i)}`)}catch(t){throw await e.query(`ALTER DATABASE ${Y(o)} RENAME TO ${Y(i)}`).catch(()=>void 0),await It(e,i,!0).catch(()=>void 0),t}await Lt(e,o),await e.query(`DROP DATABASE ${Y(o)}`)})}}}async function Ft(e,t,n){let r=new e.Client({connectionString:t});await r.connect();try{return await n(r)}finally{await r.end()}}async function It(e,t,n){await e.query(`ALTER DATABASE ${Y(t)} ALLOW_CONNECTIONS ${n?`true`:`false`}`)}async function Lt(e,t){await e.query(`SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1 AND pid <> pg_backend_pid()`,[t])}function Y(e){return`"${e.replaceAll(`"`,`""`)}"`}function Rt(e,t){let n=new URL(t);return{...e,PGDATABASE:decodeURIComponent(n.pathname.slice(1)),PGHOST:n.hostname,PGPASSWORD:decodeURIComponent(n.password),PGPORT:n.port||`5432`,PGUSER:decodeURIComponent(n.username)}}function zt(e){return e.some(e=>F.basename(e)===`package.json`||F.basename(e).endsWith(`lock.yaml`)||F.basename(e)===`pnpm-workspace.yaml`)}function Bt(e){return e.some(e=>zt([e])||/(^|\/)(panda\.config|vite|coreframe|tsconfig|drizzle)\.[^/]+$/.test(e)||/(^|\/)(drizzle|scripts|src\/api)(\/|$)/.test(e))}function Vt(e){return e.some(e=>e===`src-flutter`||e.startsWith(`src-flutter/`))}async function Ht(e,t,n,r){return{commit:n,commits:(await Z(e,[`log`,`--reverse`,`--format=%H%x00%s`,`${t}..${n}`])).split(`
16
- `).filter(Boolean).map(e=>{let[t,n]=e.split(`\0`);return{commit:t,shortCommit:t.slice(0,12),subject:n}}),shortCommit:n.slice(0,12),source:r,subject:await Z(e,[`show`,`-s`,`--format=%s`,n])}}async function Ut(e,t){try{let n=await f(e,`wx`);await n.writeFile(`${a.pid} ${t}\n`),await n.close()}catch(n){if(!(n instanceof Error&&`code`in n&&n.code===`EEXIST`))throw n;let r=(await p(e,`utf8`).catch(()=>`unknown`)).trim(),i=Number(r.split(` `)[0]);if(Number.isInteger(i)&&!Wt(i)){await x(e).catch(()=>void 0),await Ut(e,t);return}throw Error(`Managed development is already owned by PID ${r}.`)}}function Wt(e){try{return a.kill(e,0),!0}catch(e){return!(e instanceof Error&&`code`in e&&e.code===`ESRCH`)}}async function Gt(e,t){e&&(await p(e,`utf8`).catch(()=>void 0))?.trim()===`${a.pid} ${t}`&&await x(e).catch(()=>void 0)}async function X(e,t,{env:n}={}){let r=t[0];if(t[0]===`rebase`){let e=t.some(e=>[`--continue`,`--abort`,`--skip`,`--quit`].includes(e));t=[`-c`,`rebase.updateRefs=false`,`-c`,`rebase.backend=merge`,...t,...e?[]:[`--merge`,`--no-update-refs`]]}let i=()=>L(`git`,t,{cwd:e,env:n,stdin:`ignore`});return[`add`,`branch`,`commit`,`fetch`,`merge`,`rebase`,`cherry-pick`,`reset`,`update-ref`,`worktree`].includes(r)?A(`git.${r}`,i,{continuation:t.includes(`--continue`),abort:t.includes(`--abort`)}):i()}function Kt(e){return{mode:e.mode,busy:e.busy??null,currentCommit:e.currentCommit,targetCommit:e.target?.commit,targetSource:e.target?.source,completionId:e.codexCompletion?.id,trackedDraft:e.draft?.tracked??!1,untrackedCount:e.draft?.untracked.length??0,rebaseApplied:e.pendingRebase?.applied,conflictCount:e.pendingRebase?.files.length,setupStage:e.setupFailure?.stage,warningCount:e.warnings.length,hasMessage:!!e.message,checks:e.checks?.commands.map(e=>`${e.command}:${e.status}`).join(`,`)}}async function Z(e,t){return(await X(e,t)).stdout.trim()}async function Q(e,t){try{return await Z(e,t)||void 0}catch(e){if(e instanceof oe&&e.exitCode&&e.exitCode>0)return;throw e}}async function qt(e,t,n){try{return await X(e,[`merge-base`,`--is-ancestor`,t,n]),!0}catch(e){if(e instanceof oe&&e.exitCode===1)return!1;throw e}}function Jt(e,t){return e.length===t.length&&[...e].sort().every((e,n)=>e===[...t].sort()[n])}function Yt(e){return e.split(`\0`).filter(Boolean)}function Xt(e){return e.split(/\r?\n/,1)[0]??``}function Zt(e){return e.type===`acknowledge-codex`?`Acknowledging Codex result`:e.type===`cancel-codex`?`Cancelling conflict resolution`:e.type===`configure-codex`?`Saving Codex preferences`:e.type===`decline-rebase`?`Declining Codex conflict resolution`:e.type===`resolve-rebase`?`Resolving update conflicts with Codex`:e.type===`dismiss-check`?`Dismissing managed development check`:e.type===`message`?`Generating commit message`:e.type===`commit`?`Committing local changes`:e.type===`apply`?`Integrating accepted update`:e.type===`prepare`?`Reviewing working tree`:e.type===`retry-codegen`?`Retrying Panda codegen`:e.type===`retry-install`?`Retrying dependency installation`:e.type===`reset-database`?`Resetting local database`:`Aborting refresh`}function Qt(){return a.platform===`win32`?`pnpm.cmd`:`pnpm`}function $(e){return e instanceof Error?e.message:String(e)}export{B as isManagedDevCheckout,he as isPrimaryCheckout,H as startManagedDevSession};
5
+ `).includes(`branch ${de}`))}async function Re(e,t,n){let r=t.devTarget?await Q(e,[`rev-parse`,pe])??K:void 0,a=!1,o,s=async s=>{let c=s&&t.devTarget!==void 0&&t.devTarget!==t.commit&&t.advanceDev!==!1&&!await Le(e);o=t.devTarget?s&&c?t.commit:t.devTarget:void 0,F(`refs.publish-started`,{expectedMain:n,expectedDev:t.devTarget,commit:t.commit,consumedDev:o,includeDev:s});let l=[`start`,`update ${z} ${t.commit} ${n}`];s&&t.devTarget&&l.push(c?`update ${de} ${t.commit} ${t.devTarget}`:`verify ${de} ${t.devTarget}`),t.devTarget&&o&&l.push(`update ${pe} ${o} ${r}`),l.push(`prepare`,`commit`),await I(`refs.publish`,()=>i(e,l),{expectedMain:n,expectedDev:t.devTarget,commit:t.commit,includeDev:s}),a=c,F(`refs.published`,{main:t.commit,dev:s?t.commit:void 0,consumedDev:o,includeDev:s})};try{return await s(!0),{consumedDev:o!==void 0&&r!==void 0?{after:o,before:r}:void 0,devMoved:a}}catch(i){if(!t.devTarget)throw i;let a;try{a=await Promise.all([Z(e,[`rev-parse`,z]),Q(e,[`rev-parse`,de])])}catch{throw i}let[c,l]=a;if(F(`refs.publish-rejected`,{expectedMain:n,actualMain:c,expectedDev:t.devTarget,actualDev:l},`warn`),c!==n||l===t.devTarget)throw i;return F(`refs.publish-main-only`,{actualDev:l}),await s(!1),{consumedDev:o!==void 0&&r!==void 0?{after:o,before:r}:void 0,devMoved:!1}}}var G=class extends Error{},ze=class extends Error{},Be=class extends Error{};const K=`0000000000000000000000000000000000000000`;async function Ve({advanceDev:e,base:n,commit:r,cwd:i,devTarget:a,gitDir:o,journalPath:s,onMutate:c,onStage:l,operationId:u,paused:d,releasedPins:f,sessionId:m,signal:h,source:g,target:y}){let b=await Ge(i,n,r),x=R.join(o,`index`),S=`${x}.lock`,C=R.join(o,`HEAD.lock`),w=R.join(`.coreframe`,`managed-dev-retained`,`${p.pid}-${ne(4).toString(`hex`)}`),E=R.join(i,w),D={version:2,operationId:u,sessionId:m,phase:`publishing`,source:g,target:y,expectedMain:n,commit:r,checkout:{branch:z,fingerprint:n},devTarget:a,retainedDir:w,paths:b.map(({path:e,status:t,oldSha:n,newSha:r})=>({path:e,status:t,oldSha:n,newSha:r})),displaced:[],...d?{paused:d}:{}};await Ue(S,m,`index`);let O=[],A=[],j=[],M=!1,N=!1,ee=!1,te=!1,I,L=async(e,t,n,r)=>{let a=R.join(i,e);if(await _(a).catch(()=>void 0)===void 0)return;await c?.(`displace`,e);let o=`${O.length}.${Buffer.from(e).toString(`base64url`)}`;await v(E,{recursive:!0});try{await T(a,R.join(E,o))}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let s={entryPath:e,slot:o,expected:t,unexpected:n,blockedPath:r};return O.push(s),D.displaced.push({path:e,slot:o,expected:t?.sha??null}),s};try{await We(i,n,b),await l?.(`preflight`),Y(h),await J(s,D);for(let e of b){if(await l?.(`path`,e.path),e.status===`A`){let t=await _(R.join(i,e.path)).catch(()=>void 0);t&&!(t.isDirectory()&&e.newMode===`160000`)&&await L(e.path,null,!0);continue}if(e.oldMode===`160000`)continue;let t=await L(e.path,{mode:e.oldMode,sha:e.oldSha},!1);if(e.status!==`D`&&t===void 0)throw new G(`The path ${e.path} changed during synchronization; your changes were preserved. Review them and refresh again.`)}for(let e of b)if(e.status!==`D`)for(let t=R.dirname(e.path);t&&t!==`.`;t=R.dirname(t)){let n=await _(R.join(i,t)).catch(()=>void 0);if(n&&!n.isDirectory()){await L(t,null,!0,e.path);break}}for(let e of O)if(!(e.expected!==null&&await Ke(i,E,e)))throw new G(e.unexpected?e.blockedPath?`The path ${e.entryPath} is not a directory, so the update cannot create ${e.blockedPath}; it was preserved.`:`The path ${e.entryPath} was created during synchronization and the update would replace it; it was preserved. Move it aside or commit it, then refresh again.`:`The path ${e.entryPath} changed during synchronization; your changes were preserved. Review them and refresh again.`);if(O.length>0){await qe(E);for(let e of new Set(O.map(e=>R.dirname(R.join(i,e.entryPath)))))await qe(e)}await l?.(`displaced`),Y(h);let o=await Re(i,{advanceDev:e,commit:r,devTarget:a},n);te=o.devMoved,I=o.consumedDev,ee=!0,D.refsPublished=!0,await J(s,D),await l?.(`refs`),Y(h),await Ue(C,m,`HEAD`),M=!0;let u=await it(i);if(u!==z)throw new G(`The checkout moved to ${u??`detached HEAD`} during synchronization; nothing was overwritten.`);for(let e of b)if(e.status!==`D`)try{await Ye(i,e,c),A.push({entryPath:e.path,mode:e.newMode,sha:e.newSha})}catch(t){if(t instanceof Be){j.push(e.path);continue}throw t}await l?.(`files`),Y(h);for(let e of await tt(i,b))j.includes(e)||j.push(e);let d=await at(i);if(d.branch!==z||d.main!==r)throw D.phase=`recovery-needed`,D.diverged=j,D.error=d.branch===z?`Local main moved to ${d.main?.slice(0,12)??`nothing`} while the update was applied.`:`The checkout moved to ${d.branch??`detached HEAD`} while the update was applied.`,new ze(D.error);await t(i,[`read-tree`,r],{env:{GIT_INDEX_FILE:S}}),await q(i,r),await T(S,x),N=!0,await l?.(`index`),await q(i,r);let p=await $e(i,w);for(let e of b)e.status===`D`&&await st(i,R.dirname(e.path));if(D.paused&&D.paused.remaining.length>0)D.phase=`paused`,await J(s,D);else{D.phase=`published`,D.released=f,await J(s,D);for(let e of f??[])await t(i,[`update-ref`,`-d`,e]).catch(t=>{F(`publication.pin-release-failed`,{ref:e,...P(t)},`warn`)});await dt(s)}return F(`checkout.published`,{commit:r,paths:A.length,divergedCount:j.length,...p?{preserved:p}:{}}),{diverged:j,preserved:p}}catch(e){let o=e instanceof ze||e instanceof G?e:void 0;o||(D.error=$(e));let l=[];for(let e of[...A].reverse())try{await Xe(i,E,e,c)?await st(i,R.dirname(e.entryPath)):l.push(e.entryPath)}catch{l.push(e.entryPath)}for(let e of[...O].reverse())try{await Qe(i,E,e.slot,e.entryPath,c)||l.push(e.entryPath)}catch{l.push(e.entryPath)}M&&(M=!1,await k(C).catch(()=>void 0));let u=ee?await nt(i,n,r,a,te,I):!0,d=!N;if(N&&u&&l.length===0&&(d=await t(i,[`read-tree`,n]).then(()=>!0,()=>!1)),l.length===0&&u&&d){let t=await $e(i,w);D.paused&&D.paused.remaining.length>0?(D.phase=`paused`,D.refsPublished=!1,D.displaced=[],D.diverged=void 0,D.error=void 0,D.observed=void 0,await J(s,D).catch(e=>{F(`publication.journal-failed`,P(e),`warn`)})):await dt(s);let n=t?` File versions captured during synchronization are preserved under ${t}.`:``;throw o instanceof ze?new G(`${o.message}${n}`):e instanceof G?new G(`${e.message}${n}`):e}throw D.phase=`recovery-needed`,D.displaced=O.filter(e=>l.includes(e.entryPath)).map(e=>({path:e.entryPath,slot:e.slot,expected:e.expected?.sha??null})),D.diverged=[...new Set([...D.diverged??[],...j,...l])],D.error??=$(e),D.refsPublished=await rt(i,z,r),D.observed=await at(i),await ot(i,D),await J(s,D).catch(e=>{F(`publication.journal-failed`,P(e),`warn`)}),new ze(`Synchronization was interrupted before the checkout could be fully reconciled.${D.diverged.length?` Kept unreviewed changes in: ${D.diverged.join(`, `)}.`:``} Review \`git status\` before continuing.`)}finally{M&&await k(C).catch(()=>void 0),N||await k(S).catch(()=>void 0)}}async function q(e,t){let{branch:n,main:r}=await at(e);if(n!==z||r!==t)throw new ze(n===z?`Local main moved to ${r?.slice(0,12)??`nothing`} while the update was applied.`:`The checkout moved to ${n??`detached HEAD`} while the update was applied.`)}function He(e){let t=e.indexOf(`.`);if(t<0)return;let n=Buffer.from(e.slice(t+1),`base64url`).toString(`utf8`);return n===``?void 0:n}async function Ue(e,t,n){for(let n=0;n<10;n++){try{let n=await b(e,`wx`);await n.writeFile(`${B}${p.pid} ${t}\n`),await n.close();return}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`EEXIST`))throw e}await new Promise(e=>setTimeout(e,25))}throw new G(`Another Git operation holds the ${n} lock; synchronization was refused so it cannot overwrite in-progress work. Retry once it finishes.`)}async function We(e,t,n){let i=await it(e);if(i!==z)throw new G(`The checkout moved to ${i??`detached HEAD`} during synchronization; nothing was overwritten.`);let[a,o]=await Promise.all([Z(e,[`rev-parse`,`HEAD`]),Z(e,[`rev-parse`,z])]);if(a!==t||o!==t)throw new G(`Local main changed while the accepted update was being published; nothing was overwritten.`);let s={GIT_OPTIONAL_LOCKS:`0`};if(!await r(e,[`diff`,`--quiet`],s)||!await r(e,[`diff`,`--quiet`,`--cached`],s))throw new G(`The working tree changed during synchronization; your changes were preserved. Review them and refresh again.`);for(let t of n){if(t.status!==`A`)continue;let n=await _(R.join(e,t.path)).catch(()=>void 0);if(n&&!n.isDirectory())throw new G(`The path ${t.path} was created during synchronization and the update would replace it; it was preserved. Move it aside or commit it, then refresh again.`);for(let n=R.dirname(t.path);n&&n!==`.`;n=R.dirname(n)){let r=await _(R.join(e,n)).catch(()=>void 0);if(r&&!r.isDirectory())throw new G(`The path ${n} is not a directory, so the update cannot create ${t.path}; it was preserved.`)}}}async function Ge(e,t,n){let r=(await Z(e,[`diff-tree`,`-r`,`--raw`,`-z`,`--no-renames`,t,n])).split(`\0`).filter(Boolean),i=[];for(let e=0;e<r.length;){let t=r[e++];if(!t.startsWith(`:`))continue;let n=t.slice(1).split(` `),a=r[e++],o=(n[4]??``)[0];(o===`A`||o===`D`||o===`M`||o===`T`)&&i.push({path:a,status:o,oldMode:n[0]??``,newMode:n[1]??``,oldSha:n[2]??K,newSha:n[3]??K})}return i}async function Ke(e,t,n){if(n.expected===null)return!1;let r=R.join(t,n.slot),i=await _(r).catch(()=>void 0);return i?n.expected.mode===`160000`?i.isDirectory():n.expected.mode===`120000`?i.isSymbolicLink()&&lt(await C(r))===n.expected.sha:i.isFile()&&await ct(e,n.entryPath,R.relative(e,r))===n.expected.sha:!1}async function qe(e){let t=await b(e,`r`).catch(()=>void 0);if(t)try{await t.sync()}catch{}finally{await t.close()}}function Je(e){return e instanceof Error&&`code`in e&&(e.code===`EEXIST`||e.code===`ENOTDIR`||e.code===`EISDIR`||e.code===`ENOTEMPTY`)}async function Ye(e,t,r){let i=R.join(e,t.path);try{await v(R.dirname(i),{recursive:!0})}catch(e){throw Je(e)?new Be($(e)):e}await r?.(`write`,t.path);try{if(t.newMode===`160000`){(await _(i).catch(()=>void 0))?.isDirectory()||await v(i);return}if(t.newMode===`120000`){await O((await n(e,t.newSha)).toString(`utf8`),i);return}let r=await b(i,`wx`,t.newMode===`100755`?493:420);try{await r.writeFile(await n(e,t.newSha,t.path)),await r.sync()}finally{await r.close()}}catch(e){throw Je(e)?new Be($(e)):e}}async function Xe(e,t,n,r){let i=R.join(e,n.entryPath);if(!await _(i).catch(()=>void 0))return!0;if(n.mode===`160000`)try{return await D(i),!0}catch(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}await r?.(`remove`,n.entryPath),await v(t,{recursive:!0});let a=`w.${Buffer.from(n.entryPath).toString(`base64url`)}`;try{await T(i,R.join(t,a))}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!0;throw e}return await Ze(e,t,a,n)?!0:(await Qe(e,t,a,n.entryPath,r),!1)}async function Ze(e,t,n,r){let i=R.join(t,n),a=await _(i).catch(()=>void 0);return a?r.mode===`120000`?a.isSymbolicLink()&&lt(await C(i))===r.sha:a.isFile()&&await ct(e,r.entryPath,R.relative(e,i))===r.sha:!1}async function Qe(e,t,n,r,i){let a=R.join(t,n),o=R.join(e,r),s=await _(a).catch(()=>void 0);if(!s)return!0;if(await _(o).catch(()=>void 0)!==void 0)return!1;if(await v(R.dirname(o),{recursive:!0}).catch(()=>void 0),await i?.(`restore`,r),s.isDirectory()){try{await v(o)}catch{return!1}try{return await T(a,o),!0}catch{return await D(o).catch(()=>void 0),!1}}try{s.isSymbolicLink()?await O(await C(a),o):await g(a,o)}catch{return!1}return await k(a).catch(()=>void 0),!0}async function $e(e,t){let n=R.join(e,t),r=await S(n).catch(()=>[]);if(r.length===0){await D(n).catch(()=>void 0),await st(e,R.dirname(t)).catch(()=>void 0);return}let i=R.join(`.coreframe`,`managed-dev-previous`,R.basename(t));try{await v(R.join(e,R.dirname(i)),{recursive:!0}),await T(n,R.join(e,i))}catch(e){return F(`publication.preserve-failed`,P(e),`warn`),t}return await st(e,R.dirname(t)).catch(()=>void 0),F(`publication.preserved`,{location:i,slots:r.length}),i}async function et(e,t,n){let r=R.join(e,t.path),i=n===`old`?t.oldSha:t.newSha,a=n===`old`?t.oldMode:t.newMode,o=await _(r).catch(()=>void 0);return o?a===`160000`?o.isDirectory():a===`120000`?o.isSymbolicLink()&&lt(await C(r))===i:o.isFile()?await ct(e,t.path)===i:!1:!1}async function tt(e,t){let n=[];for(let r of t){if(r.status===`D`){await _(R.join(e,r.path)).catch(()=>void 0)!==void 0&&n.push(r.path);continue}await et(e,r,`new`)||n.push(r.path)}return n}async function nt(e,t,n,r,a,o){let s=[`start`,`update ${z} ${t} ${n}`];a&&r&&s.push(`update ${de} ${r} ${n}`),o&&s.push(o.before===K?`delete ${pe} ${o.after}`:`update ${pe} ${o.before} ${o.after}`),s.push(`prepare`,`commit`);try{return await i(e,s),F(`refs.reverted`,{commit:n,expectedMain:t}),!0}catch(e){return F(`refs.revert-failed`,{commit:n,expectedMain:t,...P(e)},`warn`),!1}}async function rt(e,t,n){return await Q(e,[`rev-parse`,`--verify`,t])===n}async function it(e){return Q(e,[`symbolic-ref`,`-q`,`HEAD`])}async function at(e){return{branch:await it(e),head:await Q(e,[`rev-parse`,`HEAD`]),main:await Q(e,[`rev-parse`,z])}}async function ot(e,n){let r=`refs/coreframe/prepared/${n.sessionId}-${n.commit.slice(0,12)}`;try{await t(e,[`update-ref`,r,n.commit]),n.preparedRef=r}catch(e){F(`publication.pin-failed`,P(e),`warn`)}}async function st(e,t){let n=t;for(;n&&n!==`.`;){try{await D(R.join(e,n))}catch{return}n=R.dirname(n)}}async function ct(e,t,n=t){return Z(e,[`hash-object`,`--path=${t}`,`--`,n])}function lt(e){let t=Buffer.from(e);return L(`sha1`).update(`blob ${t.length}\0`).update(t).digest(`hex`)}async function J(e,t){let n=`${e}.${p.pid}.tmp`,r=await b(n,`w`,384);try{await r.writeFile(`${JSON.stringify(t)}\n`),await r.sync()}finally{await r.close()}await T(n,e),await qe(R.dirname(e))}async function ut(e){let t;try{t=JSON.parse(await x(e,`utf8`))}catch(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`?{}:(F(`publication.journal-unreadable`,P(e),`warn`),{problem:`corrupt`})}if(!t||typeof t!=`object`||typeof t.commit!=`string`||typeof t.expectedMain!=`string`)return F(`publication.journal-unreadable`,{shape:`invalid`},`warn`),{problem:`corrupt`};let n=t.version;return n!==1&&n!==2?(F(`publication.journal-unreadable`,{version:typeof n==`number`||typeof n==`string`?n:`unknown`},`warn`),{problem:`unsupported-version`}):{journal:t}}async function dt(e){await k(e).catch(()=>void 0)}async function ft(e,n,i){let a=R.join(n.commonDir,he),o=async e=>b(e,`r`).then(async e=>{try{let t=Buffer.alloc(64),{bytesRead:n}=await e.read(t,0,64,0),r=await e.stat();return{head:t.subarray(0,n).toString(`utf8`),mtimeMs:r.mtimeMs}}finally{await e.close()}}).catch(()=>void 0),s=R.join(n.gitDir,`index.lock`),c=R.join(n.gitDir,`HEAD.lock`),[l,u]=await Promise.all([o(s),o(c)]),d=async(e,t,n)=>{if(t===void 0)return;let r=Date.now()-t.mtimeMs>3e4;(t.head.startsWith(B)||r&&n(t))&&await k(e).catch(e=>{F(`publication.lock-removal-failed`,P(e),`warn`)})};await d(s,l,e=>e.head===``||e.head.startsWith(`DIRC`)),await d(c,u,()=>!0);let f=R.join(n.commonDir,`coreframe-managed-dev`);for(let n of(await Z(e,[`worktree`,`list`,`--porcelain`]).catch(()=>``)).split(`
6
+ `)){if(!n.startsWith(`worktree `))continue;let r=n.slice(9);R.resolve(r).startsWith(`${R.resolve(f)}${R.sep}`)&&await t(e,[`worktree`,`remove`,`--force`,r]).catch(e=>{F(`worktree.cleanup-failed`,P(e),`warn`)})}await t(e,[`worktree`,`prune`]).catch(()=>void 0);for(let e of await S(f).catch(()=>[]))e.startsWith(`integration-`)&&await E(R.join(f,e),{force:!0,recursive:!0}).catch(()=>void 0);let{journal:p,problem:m}=await ut(a),h=[],g=R.join(e,`.coreframe`,`managed-dev-retained`),_=new Set((await S(g).catch(()=>[])).map(e=>R.join(g,e)));p?.retainedDir&&_.add(R.join(e,p.retainedDir));for(let t of _){let n=h.length;for(let n of await S(t).catch(()=>[])){let r=He(n);r!==void 0&&!R.isAbsolute(r)&&!r.split(`/`).includes(`..`)&&await Qe(e,t,n,r,i)||h.push(r??n)}h.length===n&&await D(t).catch(()=>void 0)}h.length===0&&await st(e,`.coreframe/managed-dev-retained`).catch(()=>void 0);let[v,y,x,C]=await Promise.all([it(e),Q(e,[`rev-parse`,`HEAD`]),Q(e,[`rev-parse`,z]),(async()=>await r(e,[`diff`,`--quiet`],{GIT_OPTIONAL_LOCKS:`0`})&&await r(e,[`diff`,`--quiet`,`--cached`],{GIT_OPTIONAL_LOCKS:`0`}))()]),w=h.length?`Displaced originals that could not be returned are kept under .coreframe/managed-dev-retained: ${h.join(`, `)}.`:void 0;if(m)return{notice:`A previous synchronization left a ${m===`unsupported-version`?`journal in an unsupported format`:`corrupted journal`}; its pinned commits are preserved under refs/coreframe/managed-dev. Inspect ${a} and \`git status\`, then restart managed development.`};let T=new Set([p?.paused?.originalRef,p?.paused?.preparedRef,p?.preparedRef].filter(e=>typeof e==`string`));for(let n of(await Z(e,[`for-each-ref`,`--format=%(refname)`,`refs/coreframe/managed-dev/`]).catch(()=>``)).split(`
7
+ `))n&&!T.has(n)&&await t(e,[`update-ref`,`-d`,n]).catch(e=>{F(`publication.pin-release-failed`,{ref:n,...P(e)},`warn`)});if(!p)return w?{notice:w}:void 0;let O=v===z&&y===x&&(x===p.commit||x===p.expectedMain)&&C&&h.length===0,A=!!p.paused&&v===z&&y===x&&(x===p.commit||x===p.expectedMain),j=async()=>{for(let n of p.released??[])await t(e,[`update-ref`,`-d`,n]).catch(()=>void 0)};if(p.phase===`declined`)return{notice:w};if((p.phase===`published`||p.phase===`preparing`||O)&&!p.paused)return await j(),await dt(a),{notice:w};if(p.paused&&A){let t=p.paused,n=await(async()=>{if(!await pt(e,`${t.originalRef}^{commit}`)||!await pt(e,`${t.preparedRef}^{commit}`))return`its recovery refs are missing`;let n=t.remaining.find(e=>e.command!==`pick`);if(n)return`a replay instruction that cannot be resumed (${n.command})`;for(let n of t.remaining)if(!await pt(e,`${n.commit}^{commit}`))return`a pending commit (${n.commit.slice(0,12)}) that is no longer in the object store`})();return n?(F(`rebase.paused-unrecoverable`,{reason:n,operationId:p.operationId},`warn`),p.phase=`recovery-needed`,p.error=`A paused update replay cannot resume because ${n}; the original commits remain pinned.`,p.observed={branch:v,head:y,main:x},await J(a,p).catch(e=>{F(`publication.journal-failed`,P(e),`warn`)}),{notice:`${p.error} Run \`git status\` to reconcile, then restart managed development.${w?` ${w}`:``}`}):(p.phase=`paused`,p.refsPublished=x===p.commit,await J(a,p).catch(e=>{F(`publication.journal-failed`,P(e),`warn`)}),{notice:w,paused:t,pendingRebase:{applied:t.applied,commits:t.remaining.map(e=>({commit:e.commit,shortCommit:e.commit.slice(0,12),subject:e.subject})),dropped:t.dropped.length>0?t.dropped:void 0,files:t.files,target:await Bt(e,p.source===`dev`?await Ie(e,p.target)??p.expectedMain:p.expectedMain,p.target,p.source)}})}if(p.phase===`preparing`&&v===z&&y===x)return await dt(a),{notice:w};p.phase=`recovery-needed`,p.observed={branch:v,head:y,main:x},await J(a,p).catch(e=>{F(`publication.journal-failed`,P(e),`warn`)});let M=`HEAD is ${v??`detached at ${y?.slice(0,12)??`unknown`}`}, local main is ${x?.slice(0,12)??`missing`}, and tracked changes ${C?`are clean`:`are present`}`,N=w?` ${w}`:``;return{notice:`A previous synchronization was interrupted and needs review: expected main ${p.expectedMain.slice(0,12)} to become ${p.commit.slice(0,12)}, but ${M}.${N} Run \`git status\` to reconcile, then restart managed development.`}}async function pt(e,t){return r(e,[`rev-parse`,`--verify`,`--quiet`,t],{GIT_OPTIONAL_LOCKS:`0`})}async function mt(e,n,i,a,o,{codex:s,codexApproved:c=!0,journal:l,prepareVerification:u,rebaseBase:d,signal:f,totalCommits:p=0}={}){F(`integration.replay`,{operation:a,totalCommits:p});try{await t(e,i,{env:{GIT_EDITOR:`true`}});return}catch(i){let m=await wt(e);if(F(`integration.conflicts`,{operation:a,conflictCount:m.length,codexApproved:c}),m.length===0)throw i;if(!c&&a===`rebase`)try{let t=await ht(e,m,l);return F(`rebase.paused`,{applied:t.applied,droppedCommits:t.record.dropped.length,remainingCommits:t.commits.length,conflictCount:m.length}),t}finally{await t(e,[a,`--abort`]).catch(()=>void 0)}try{for(;m.length>0;){Y(f),await _t(e,n,a,m,d?await St(e,d):[],p,o,f,s),await t(e,[`diff`,`--check`]),await t(e,[`add`,`--all`]);let i=await wt(e);if(F(`integration.conflicts-resolved`,{operation:a,remainingCount:i.length}),i.length>0)throw Error(`Codex left unresolved paths: ${i.join(`, `)}`);try{await t(e,[a,`--continue`],{env:{GIT_EDITOR:`true`}})}catch(n){if(m=await wt(e),m.length===0)if(a!==`merge`&&await r(e,[`diff`,`--cached`,`--quiet`],{GIT_OPTIONAL_LOCKS:`0`}))await t(e,[a,`--skip`],{env:{GIT_EDITOR:`true`}});else throw n;o({commits:d?await St(e,d):[],phase:`progress`,stage:`resolve`,totalCommits:p});continue}o({commits:d?await St(e,d):[],phase:`progress`,stage:`resolve`,totalCommits:p}),m=await wt(e)}try{if(a===`rebase`||a===`cherry-pick`){let t=await u?.(e,f)??{dispose:async()=>void 0,env:n};try{await vt(e,t.env,a,o,f,s)}finally{await t.dispose().catch(e=>{F(`verification.cleanup-failed`,P(e),`warn`)})}}}catch(e){throw Y(f),Error(`Codex could not verify the ${a} result: ${$(e)}`)}return}catch(n){throw F(`integration.aborting`,{operation:a,cancelled:f?.aborted??!1}),await t(e,[a,`--abort`]).catch(()=>void 0),Y(f),Error(`Codex could not resolve ${a} conflicts: ${$(n)}`)}}}async function ht(e,n,r){let i=R.resolve(e,await Z(e,[`rev-parse`,`--absolute-git-dir`])),a=R.join(i,`rebase-merge`),o=e=>x(R.join(a,e),`utf8`).catch(()=>``),[s,c,l,u,d,f]=await Promise.all([o(`done`),o(`git-rebase-todo`),o(`stopped-sha`),o(`orig-head`),o(`rewritten-list`),Z(e,[`rev-parse`,`HEAD`])]),p=l.trim(),m=u.trim();if(!p||!m)throw Error(`The rebase stopped without readable sequencer state; the pending commits cannot be recorded exactly.`);let h=new Map(d.split(`
8
+ `).map(e=>e.trim().split(/\s+/)).filter(e=>e.length===2).map(e=>[e[0],e[1]])),g=async t=>{let n=await Z(e,[`rev-parse`,`${t}^{commit}`]),r=await Z(e,[`show`,`-s`,`--format=%s`,n]);return{commit:n,shortCommit:n.slice(0,12),subject:r}},_=s.split(`
9
+ `).map(e=>e.trim()).filter(Boolean).map(e=>{let[,t=``,n=``]=/^(\S+)(?:\s+([0-9a-f]+))?/.exec(e)??[];return{command:t,commit:n}}),v=_.findIndex(e=>e.commit&&p.startsWith(e.commit));v>=0?_.splice(v,1):F(`rebase.stopped-not-in-done`,{stopped:p.slice(0,12)},`warn`);let y=await g(p),b=[{command:`pick`,commit:y.commit,subject:y.subject}];for(let e of c.split(`
10
+ `)){let t=e.trim();if(!t||t.startsWith(`#`))continue;let[,n=``,r=``]=/^(\S+)(?:\s+([0-9a-f]+))?/.exec(t)??[],i=r?await g(r):void 0,a={command:n,commit:i?.commit??``,subject:i?.subject??``};if(!a.commit)throw Error(`The rebase queued a replay instruction that cannot be resumed: ${t}.`);b.push(a)}let S=_.filter(e=>e.command===`pick`&&e.commit).map(e=>e.commit),C=[];for(let e of S)[...h.keys()].some(t=>t.startsWith(e))||C.push(await g(e));let w=`refs/coreframe/managed-dev/${r?.operationId??`session-${r?.sessionId??re()}`}/original`,T=`${R.posix.dirname(w)}/prepared`;await t(e,[`update-ref`,w,m]),await t(e,[`update-ref`,T,f]);let E={applied:h.size,base:f,dropped:C,files:n,originalRef:w,preparedRef:T,recoveryRef:r?.recoveryRef,remaining:b};if(r){let e={version:2,operationId:r.operationId,sessionId:r.sessionId,phase:`paused`,source:r.source,target:r.target,expectedMain:r.expectedMain??m,commit:f,checkout:{branch:z,fingerprint:r.expectedMain??m},paused:E};await J(r.journalPath,e)}return{applied:E.applied,commits:b.map(e=>({commit:e.commit,shortCommit:e.commit.slice(0,12),subject:e.subject})),files:n,partial:f,record:E}}function Y(e){if(e?.aborted)throw Error(`The update integration was cancelled.`)}async function gt(e,t,n,r,i,a,o){return I(`codex`,()=>s(e,t,n,r,i,a),{model:r?.model,effort:r?.effort,purpose:o})}async function _t(e,t,n,r,i,a,o,s,c){Y(s);let l=`Resolve the current Git ${n} conflicts cleanly. Edit only files needed for the resolution, preserve intended behavior from both sides, and remove all conflict markers. Do not run tests, typecheck, lint, format, or other slow checks; the managed development session runs them once after the ${n} finishes. Do not stage files or run Git continuation commands. Conflicted paths: ${r.join(`, `)}`,u=e=>o({...e,stage:`resolve`}),d=n===`merge`?void 0:await Q(e,[`rev-parse`,n===`rebase`?`REBASE_HEAD`:`CHERRY_PICK_HEAD`]),f=d?(await Z(e,[`show`,`--no-patch`,`--format=%H%x00%h%x00%s`,d])).split(`\0`):void 0;u({commits:i,files:r,currentCommit:f?.length===3?{commit:f[0],shortCommit:f[1],subject:f[2]}:void 0,message:{kind:`user`,text:l},phase:`start`,totalCommits:a}),u({finalMessage:await gt(e,t,l,c,u,s,`resolve`)||`Codex resolved the conflicts.`,phase:`complete`})}async function vt(e,t,n,r,i,a){Y(i);let o=`The Git ${n} finished replaying every commit. Verify the result in this isolated worktree by running the project's checks once each: pnpm test and pnpm typecheck, plus lint or format checks if the project defines them. Dependencies and generated state were prepared for the accepted target, and the local database environment is managed for verification. If a check fails, apply the smallest safe fix and commit it with a conventional-commit message that describes the fix. Do not rewrite Git history, rebase, or amend existing commits. If a failure cannot be fixed safely, describe it in your final response instead of committing a broken fix.`,s=e=>r({...e,stage:`verify`});s({message:{kind:`user`,text:o},phase:`message`}),s({finalMessage:await gt(e,t,o,a,s,i,`verify`)||`Codex finished verifying the result.`,phase:`complete`})}async function yt({config:e,cwd:t,env:n}){if(e.database?.dialect===`sqlite`){let r=await N({config:e,cwd:t,env:n});return{dispose:()=>r[Symbol.asyncDispose](),env:r.env}}let r=await M({config:e,cwd:t,env:n});return{dispose:()=>r[Symbol.asyncDispose](),env:r.env}}async function bt({config:e,cwd:t,env:n,signal:r,startDatabase:i=yt,trackActivity:a}){try{if(Y(r),await m(R.join(t,`pnpm-lock.yaml`)).then(()=>!0,()=>!1)&&await a(`Installing dependencies`,`pnpm install --frozen-lockfile`,()=>I(`verification.dependencies`,()=>u([`install`,`--frozen-lockfile`],{cwd:t,env:n,signal:r}),{worktree:R.basename(t)}),{stage:`verify`,signal:r}),await I(`verification.codegen`,()=>f({cwd:t,env:n,runCodegen:()=>a(`Generating styles`,`pnpm codegen`,()=>u([`codegen`],{cwd:t,env:n,signal:r}).then(()=>void 0),{stage:`verify`,signal:r})}),{worktree:R.basename(t)}),Y(r),!e.database)return{dispose:async()=>void 0,env:n};let o=await a(`Starting verification database`,`Managed local database`,()=>I(`verification.database`,()=>i({config:e,cwd:t,env:n}),{dialect:e.database?.dialect??`postgres`,worktree:R.basename(t)}),{stage:`verify`,signal:r});try{await a(`Preparing database schema`,`pnpm db ensure`,()=>I(`verification.schema`,()=>u([`db`,`ensure`],{cwd:t,env:o.env,signal:r}),{worktree:R.basename(t)}),{stage:`verify`,signal:r})}catch(e){throw await o.dispose().catch(()=>void 0),e}return o}catch(e){throw Error(`The isolated verification environment could not be prepared: ${$(e)}`,{cause:e})}}async function xt(e,t,n){let r=await Z(e,[`log`,`--reverse`,`--format=%H%x00%s`,t?`${t}..${n}`:n]);return r?r.split(`
11
+ `).map(e=>{let[t,n=``]=e.split(`\0`,2);return{commit:t,shortCommit:t.slice(0,12),subject:n}}):[]}function St(e,t){return xt(e,t,`HEAD`)}async function Ct(e,t,n,r,i={}){let a={id:re(),label:e,command:t,source:`supervisor`,stage:i.stage,status:`running`,startedAt:Date.now()};r(a);try{let e=await n(),t=Dt(e);return r({...a,status:`succeeded`,finishedAt:Date.now(),output:t?ae(t).slice(-8e3):void 0}),e}catch(e){throw r({...a,status:i.signal?.aborted?`cancelled`:`failed`,finishedAt:Date.now(),output:Et(e).slice(-8e3)}),e}}async function wt(e){return qt(await Z(e,[`diff`,`--name-only`,`--diff-filter=U`,`-z`]))}async function Tt(e,t,n,r){await u([n],{cwd:e,env:t,signal:r})}function Et(e){let t=Dt(e);if(t){let e=ae(t).trim();if(e)return e}return ae($(e))}function Dt(e){if(typeof e!=`object`||!e)return;let t=e;if(typeof t.output==`string`&&t.output.trim())return t.output;let n=[t.stdout,t.stderr].filter(e=>typeof e==`string`&&e.length>0);return n.length>0?n.join(`
12
+ `):void 0}async function Ot({config:e,cwd:t,env:n,signal:r}){if(!e.database)return;let i=await kt({config:e,cwd:t,env:n});try{await u([`db`,`migrate-local`],{cwd:t,env:n,signal:r})}catch(e){throw await i.restore(),e}await i.discard().catch(e=>{console.warn(`Could not remove the managed-development database snapshot: ${$(e)}`)}),await E(i.directory,{force:!0,recursive:!0})}async function kt({config:e,cwd:t,env:n}){let r=R.join(t,`.coreframe`,`managed-dev-backups`);await v(r,{recursive:!0});let i=await y(R.join(r,`refresh-`));if(e.database?.dialect===`sqlite`){let e=[`turso.db`,`turso.db-wal`,`turso.db-shm`],n=new Set;for(let r of e)await At(R.join(t,`.coreframe`,r),R.join(i,r))&&n.add(r);return{directory:i,async discard(){},async restore(){for(let r of e){let e=R.join(t,`.coreframe`,r);n.has(r)?await h(R.join(i,r),e):await E(e,{force:!0})}}}}if(!n.DATABASE_URL)throw Error(`DATABASE_URL is required to snapshot local PostgreSQL.`);let a=await jt(t);if(a)return Mt({directory:i,connectionString:n.DATABASE_URL,postgres:a});let o=R.join(i,`database.dump`),s=It(n,n.DATABASE_URL);return await l(`pg_dump`,[`--format=custom`,`--file`,o],{cwd:t,env:s,stdin:`ignore`}),{directory:i,async discard(){},async restore(){await l(`pg_restore`,[`--clean`,`--if-exists`,`--no-owner`,`--dbname`,s.PGDATABASE,o],{cwd:t,env:s,stdin:`ignore`})}}}async function At(e,t){try{return await h(e,t),!0}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e;return!1}}async function jt(e){let t=JSON.parse(await x(R.join(e,`package.json`),`utf8`));if(!(!t.dependencies?.pg&&!t.devDependencies?.pg&&!t.optionalDependencies?.pg))try{return await import(le(`pg`,j(R.join(e,`package.json`)).href))}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ERR_MODULE_NOT_FOUND`)return;throw e}}async function Mt({directory:e,connectionString:t,postgres:n}){let r=new URL(t),i=decodeURIComponent(r.pathname.slice(1));if(!i)throw Error(`DATABASE_URL must name a PostgreSQL database to snapshot.`);let a=`coreframe_backup_${ne(6).toString(`hex`)}`,o=`${a}_failed`,s=new URL(r);s.pathname=i===`postgres`?`/template1`:`/postgres`;let c=new n.Client({connectionString:s.href});await c.connect();try{await Pt(c,i,!1),await Ft(c,i),await c.query(`CREATE DATABASE ${X(a)} WITH TEMPLATE ${X(i)}`),await Pt(c,a,!0)}finally{await Pt(c,i,!0).catch(()=>void 0),await c.end()}return{directory:e,async discard(){await Nt(n,s.href,async e=>{await Ft(e,a),await e.query(`DROP DATABASE ${X(a)}`)})},async restore(){await Nt(n,s.href,async e=>{await Pt(e,i,!1),await Ft(e,i),await e.query(`ALTER DATABASE ${X(i)} RENAME TO ${X(o)}`);try{await e.query(`ALTER DATABASE ${X(a)} RENAME TO ${X(i)}`)}catch(t){throw await e.query(`ALTER DATABASE ${X(o)} RENAME TO ${X(i)}`).catch(()=>void 0),await Pt(e,i,!0).catch(()=>void 0),t}await Ft(e,o),await e.query(`DROP DATABASE ${X(o)}`)})}}}async function Nt(e,t,n){let r=new e.Client({connectionString:t});await r.connect();try{return await n(r)}finally{await r.end()}}async function Pt(e,t,n){await e.query(`ALTER DATABASE ${X(t)} ALLOW_CONNECTIONS ${n?`true`:`false`}`)}async function Ft(e,t){await e.query(`SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1 AND pid <> pg_backend_pid()`,[t])}function X(e){return`"${e.replaceAll(`"`,`""`)}"`}function It(e,t){let n=new URL(t);return{...e,PGDATABASE:decodeURIComponent(n.pathname.slice(1)),PGHOST:n.hostname,PGPASSWORD:decodeURIComponent(n.password),PGPORT:n.port||`5432`,PGUSER:decodeURIComponent(n.username)}}function Lt(e){return e.some(e=>R.basename(e)===`package.json`||R.basename(e).endsWith(`lock.yaml`)||R.basename(e)===`pnpm-workspace.yaml`)}function Rt(e){return e.some(e=>Lt([e])||/(^|\/)(panda\.config|vite|coreframe|tsconfig|drizzle)\.[^/]+$/.test(e)||/(^|\/)(drizzle|scripts|src\/api)(\/|$)/.test(e))}function zt(e){return e.some(e=>e===`src-flutter`||e.startsWith(`src-flutter/`))}async function Bt(e,t,n,r){return{commit:n,commits:(await Z(e,[`log`,`--reverse`,`--format=%H%x00%s`,`${t}..${n}`])).split(`
13
+ `).filter(Boolean).map(e=>{let[t,n]=e.split(`\0`);return{commit:t,shortCommit:t.slice(0,12),subject:n}}),shortCommit:n.slice(0,12),source:r,subject:await Z(e,[`show`,`-s`,`--format=%s`,n])}}async function Vt(e,t){try{let n=await b(e,`wx`);await n.writeFile(`${p.pid} ${t}\n`),await n.close()}catch(n){if(!(n instanceof Error&&`code`in n&&n.code===`EEXIST`))throw n;let r=(await x(e,`utf8`).catch(()=>`unknown`)).trim(),i=Number(r.split(` `)[0]);if(Number.isInteger(i)&&!Ht(i)){await k(e).catch(()=>void 0),await Vt(e,t);return}throw Error(`Managed development is already owned by PID ${r}.`)}}function Ht(e){try{return p.kill(e,0),!0}catch(e){return!(e instanceof Error&&`code`in e&&e.code===`ESRCH`)}}async function Ut(e,t){e&&(await x(e,`utf8`).catch(()=>void 0))?.trim()===`${p.pid} ${t}`&&await k(e).catch(()=>void 0)}function Wt(e){return{mode:e.mode,busy:e.busy??null,currentCommit:e.currentCommit,targetCommit:e.target?.commit,targetSource:e.target?.source,completionId:e.codexCompletion?.id,trackedDraft:e.draft?.tracked??!1,untrackedCount:e.draft?.untracked.length??0,rebaseApplied:e.pendingRebase?.applied,conflictCount:e.pendingRebase?.files.length,setupStage:e.setupFailure?.stage,warningCount:e.warnings.length,hasMessage:!!e.message,checks:e.checks?.commands.map(e=>`${e.command}:${e.status}`).join(`,`)}}async function Z(e,n){return(await t(e,n)).stdout.trim()}async function Q(e,t){try{return await Z(e,t)||void 0}catch(e){if(e instanceof ue&&e.exitCode&&e.exitCode>0)return;throw e}}async function Gt(e,n,r){try{return await t(e,[`merge-base`,`--is-ancestor`,n,r]),!0}catch(e){if(e instanceof ue&&e.exitCode===1)return!1;throw e}}function Kt(e,t){return e.length===t.length&&[...e].sort().every((e,n)=>e===[...t].sort()[n])}function qt(e){return e.split(`\0`).filter(Boolean)}function Jt(e){return e.split(/\r?\n/,1)[0]??``}function Yt(e){return e.type===`acknowledge-codex`?`Acknowledging Codex result`:e.type===`cancel-codex`?`Cancelling conflict resolution`:e.type===`configure-codex`?`Saving Codex preferences`:e.type===`decline-rebase`?`Declining Codex conflict resolution`:e.type===`resolve-rebase`?`Resolving update conflicts with Codex`:e.type===`dismiss-check`?`Dismissing managed development check`:e.type===`message`?`Generating commit message`:e.type===`commit`?`Committing local changes`:e.type===`apply`?`Integrating accepted update`:e.type===`prepare`?`Reviewing working tree`:e.type===`retry-codegen`?`Retrying Panda codegen`:e.type===`retry-install`?`Retrying dependency installation`:e.type===`reset-database`?`Resetting local database`:`Aborting refresh`}function $(e){return e instanceof Error?e.message:String(e)}export{ye as isManagedDevCheckout,be as isPrimaryCheckout,V as startManagedDevSession};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coreframe/dev",
3
- "version": "0.1.35",
3
+ "version": "0.1.37",
4
4
  "description": "Development workflow utilities for Coreframe apps",
5
5
  "repository": {
6
6
  "type": "git",
@@ -36,10 +36,10 @@
36
36
  "dependencies": {
37
37
  "import-meta-resolve": "^4.2.0",
38
38
  "nano-spawn": "^2.1.0",
39
- "@coreframe/db": "^0.1.28",
39
+ "@coreframe/db": "^0.1.29",
40
40
  "@coreframe/config": "^0.1.19",
41
- "@coreframe/dev-supervisor": "^0.1.24",
42
- "@coreframe/dev-contracts": "^0.1.12"
41
+ "@coreframe/dev-contracts": "^0.1.13",
42
+ "@coreframe/dev-supervisor": "^0.1.25"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^26.1.0",