@coreframe/dev 0.1.38 → 0.1.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/managed-dev-operation.js +1 -1
- package/dist/managed-dev.js +10 -10
- package/package.json +4 -4
|
@@ -1 +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};
|
|
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})}checkpointBranches(e){this.update({branchReset:e})}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.branchReset===void 0||n.branchReset&&[`main`,`dev`,`consumedDev`,`expectedMain`,`expectedDev`,`expectedConsumedDev`].every(e=>/^[a-f0-9]{40,64}$/.test(n.branchReset[e]??``)))&&(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};
|
package/dist/managed-dev.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
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 ne,randomBytes as re,randomUUID as ie}from"node:crypto";import{watch as ae}from"node:fs";import L from"node:path";import{stripVTControlCharacters as oe}from"node:util";import{isManagedDevOperationActive as se,managedDevCodexEfforts as ce,managedDevCodexModels as le}from"@coreframe/dev-contracts/managed-dev";import{resolve as ue}from"import-meta-resolve";import{SubprocessError as de}from"nano-spawn";const R=`refs/heads/main`,z=`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=L.resolve(n,await Z(e,[`rev-parse`,`--git-dir`])),i=L.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=xt,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,ne=!1,ae,oe=e=>(e.catch(e=>{e instanceof Error&&/Unresolved (?:Codex|managed) process ownership/.test(e.message)&&(ae=e)}),N.add(e),e.finally(()=>N.delete(e)).catch(()=>void 0),e),ce=()=>{if(M!==`active`)throw Error(`Managed development owner is closing or closed.`)},le=!1,ue=!1,de,B,ye=!1,be=!1,xe=v??(e=>Dt(r,O,e,B?.signal)),V,Ce,Te,H=!1,U,W,ke,Me,Ie,ze,Be=[],G,He=Promise.resolve(),K=()=>{if(M===`active`){j={...j,operation:q.snapshot};let e={...Kt(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 We=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()},Ge=(e,t,n,r)=>Tt(e,t,n,We,{...r,signal:r?.signal??B?.signal}),Ke=async({fetch:e=!1}={})=>{if(!(!le||M!==`active`||!W)){if(ue){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`,R])]);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(ue){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`,z]),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 qt(r,e.commit,U)&&!(e.source===`dev`&&e.commit===l)){d=e;break}let f,p=!1;d?.source===`dev`&&l&&(await qt(r,l,d.commit)?f=await Le(r,U,d.commit):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:at(o.fingerprint),proposalUntracked:G?.untracked,target:d===void 0?void 0:await Ht(r,f??U,d.commit,d.source)}}catch(e){if(ue){H=!0;return}C.event(`refresh.failed`,P(e),`error`),j={...j,message:$(e),warnings:[$(e)]}}finally{K()}}},qe,Je=!1,Ye=!1,Xe=({fetch:e=!1}={})=>M===`active`?(Je=!0,Ye||=e,qe||(qe=oe((async()=>{for(;Je&&M===`active`;){Je=!1;let e=Ye;Ye=!1,await C.run({sessionId:w,operationId:ie(),trigger:e?`remote-poll`:`local-refresh`},()=>Ke({fetch:e}))}})().finally(()=>{qe=void 0})),qe)):Promise.resolve(),Ze=()=>{clearTimeout(ze),ze=setTimeout(()=>void Xe(),50),ze.unref()},Qe=(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 Ge(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=re(12).toString(`hex`),n[i].output=Ot(e)}r()}};He=He.then(n,n)},$e=async()=>{if(le||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}ce();let n=L.join(e.commonDir,`coreframe-managed-dev.lock`);await Ut(n,w),ke=n,ne=!0,ce(),await Q(r,[`rev-parse`,`--verify`,z])||await t(r,[`branch`,`dev`,e.head]),await a(e.commonDir),W=e,U=e.head;let i=await mt(r,e,l);Te=i?.notice,V=i?.paused,Ce=V?.recoveryRef,le=!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 ut({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(),Be=await b(e,Ze),Me=setInterval(()=>{j.draft&&Xe()},s),Me.unref(),Ie=setInterval(()=>void Xe({fetch:!0}),_),Ie.unref(),await Xe(),Xe({fetch:!0})},et=async(t,{onCodexEvent:n=()=>void 0}={})=>{if(ce(),!le||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=de;if(!e)throw Error(`There is no Codex conflict resolution to cancel.`);return e(),await q.flush(),{status:j}}if(ue||se(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&&(ct(q.snapshot.source,q.snapshot.target,!0),q.phase(`setup`));let i=[],a=[],s,c,l=e=>{if(q.codex(e),e.phase===`activity`){We({...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`)}};ue=!0,j={...j,busy:Zt(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 wt(),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 Ct(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 lt({codex:t.codex,codexApproved:!0,onCodexEvent:l,source:e.target.source,target:e.target.commit})}else if(t.type===`prepare`){let e=it(t.target),n=await Ne(r);n.tracked||n.untracked.length>0?j={...j,draft:n,proposal:at(n.fingerprint),proposalUntracked:G?.untracked}:await lt({codex:t.codex,onCodexEvent:l,source:e.source,target:t.target})}else if(t.type===`message`){let e=await ot(t.fingerprint,t.untracked);if(!e.tracked&&t.untracked.length===0)throw Error(`Select at least one file to commit.`);let n=at(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: ${Ot(e)}`]}}}j={...j,draft:e,proposal:n,proposalUntracked:t.untracked}}else if(t.type===`commit`){let e=await st(t);j={...j,currentCommit:e,draft:void 0,message:void 0,proposal:void 0,target:void 0},Ze()}else if(t.type===`retry-install`)await J();else if(t.type===`retry-codegen`)await ft();else if(t.type===`reset-database`)await pt();else{let e=it(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 ot(t.fingerprint,t.untracked),(n.tracked||t.untracked.length>0)&&(!t.message||!me.test(Xt(t.message))))throw Error(`Enter a commit message with a valid Conventional Commits header.`)}await lt({codex:t.codex,fingerprint:t.fingerprint,message:t.message,onCodexEvent:l,source:e.source,target:t.target,untracked:t.untracked})}}catch(e){if(se(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(ue=!1,j={...j,busy:void 0},se(q.snapshot)&&q.snapshot?.requestIds.includes(String(te()?.operationId)))if(j.pendingRebase)q.pause(j.pendingRebase);else if(B?.signal.aborted)tt();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`),oe(He.then(()=>{q.snapshot?.id===e&&q.snapshot.requestIds.at(-1)===t&&se(q.snapshot)&&tt()}))}else tt();se(q.snapshot)||(de=void 0,B=void 0),K(),await q.flush(),H&&(H=!1,Ze())}return c&&q.snapshot?.state!==`failed`&&q.snapshot?.state!==`cancelled`&&await bt(c,i,a,s),{status:j}},tt=()=>{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.`),de=void 0,B=void 0,K()},nt=new Map,rt=(e,t={})=>{let n=t.requestKey??t.operationId,r=JSON.stringify(e),i=n?nt.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=oe(C.run({sessionId:w,operationId:t.operationId??ie(),actionType:e.type},()=>I(`action`,()=>et(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};nt.set(n,e);let t=()=>{e.settled=!0;for(let[e,t]of nt){if(nt.size<=100)break;t.settled&&nt.delete(e)}};a.then(t,t)}return a},it=e=>{if(!j.target||j.target.commit!==e)throw Error(`The offered update changed. Review the latest target before refreshing.`);return j.target},at=(e,t)=>G?.fingerprint===e&&(!t||Jt(G.untracked,t))?G.message:void 0,ot=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},st=async({fingerprint:e,message:n,untracked:i})=>{if(!(await ot(e,i)).tracked&&i.length===0)throw Error(`Select at least one file to commit.`);if(!n||!me.test(Xt(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},ct=(e,t,n)=>{let r=String(te()?.operationId??ie());q.begin(e,t,r,n),B=new AbortController;let i=B;return be=!1,ye=!1,de=()=>{se(q.snapshot)&&(q.cancel(ye),C.event(`integration.cancel-requested`,{integrationOperationId:q.snapshot?.id}),ye?be=!0:i.abort())},i},lt=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=ct(u,d,a&&j.pendingRebase?.target.commit===d);u===`upstream`&&await je(r),i&&await Ct(h);let _=a&&j.pendingRebase?.target.commit===d?j.pendingRebase:void 0;_?j={...j,pendingRebase:void 0}:it(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`,R]),startingDev:await Q(r,[`rev-parse`,z])});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=u===`upstream`?await Q(r,[`rev-parse`,z]):void 0,k,A;ce();let M=te()?.operationId,N=W?L.join(W.commonDir,he):void 0;try{if(k=await I(`integration`,()=>Fe({codex:h,codexApproved:a,cwd:r,env:O,journal:N&&M?{journalPath:N,operationId:M,recoveryRef:S??V?.recoveryRef,sessionId:w}:void 0,localMain:E,onCodexEvent:c,prepareVerification:(e,t)=>St({config:n,cwd:e,env:O,signal:t,startDatabase:y,trackActivity:Ge}),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`,R])!==E)throw Error(`Local main changed while the accepted update was being prepared.`);A=k.pause?{applied:k.pause.applied,commits:k.pause.commits,dropped:k.pause.record.dropped.length>0?k.pause.record.dropped:void 0,files:k.pause.files,target:await Ht(r,k.pause.devBase??E,d,u)}:void 0,k.pause&&(V=k.pause.record);let e=k.commit;if(e===void 0){j={...j,pendingRebase:A},C.event(`integration.paused`,{applied:A?.applied,conflictCount:A?.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(ce(),Y(g.signal),!ne||i.trim()!==`${p.pid} ${w}`)throw Error(`Managed development ownership changed; publication was refused.`);q.phase(`publishing`),ye=!0;let o=await Ue({advanceDev:k.advanceDev,base:E,commit:e,cwd:r,devTarget:k.devTarget,gitDir:W.gitDir,journalPath:N,onMutate:l,onStage:m,operationId:M,paused:k.pause?.record,releasedPins:_&&!k.pause?[V?.originalRef,V?.preparedRef].filter(e=>typeof e==`string`):void 0,sessionId:w,signal:g.signal,source:u,target:d});if(ye=!1,q.published(),H=!0,U=e,u===`upstream`&&D&&!A){let t=await Re(r,E,e,D,g.signal);t&&(j={...j,warnings:[...j.warnings,t]})}let s=Yt(await Z(r,[`diff`,`--name-only`,`-z`,v,e])),f=Bt(s),b=Vt(s);if(G=void 0,A&&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&&!k.pause&&(await t(r,[`update-ref`,`-d`,Ce]),C.event(`recovery.deleted`,{recoveryRef:Ce}),Ce=void 0),_&&!k.pause&&(V=void 0),j={...j,currentCommit:e,draft:void 0,pendingRebase:A,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:!!A,restartRequired:f,flutterRestartRequired:b}),be){g.abort();let t=zt(s);await _t({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 dt({installDependencies:zt(s),flutterRestartRequired:b,restartRequired:f,trigger:`synchronization`})}catch(e){let t=S?` Recovery commit: ${S}.`:``;throw e instanceof Ve&&(Te=e.message),H=!0,j={...j,currentCommit:U,message:`${$(e)}${t}`,pendingRebase:_??A??j.pendingRebase,warnings:e instanceof Ve?[e.message]:j.warnings},e}},ut=async({commit:e,flutterRestartRequired:t,restartRequired:n})=>{try{return await I(`setup.codegen`,()=>f({cwd:r,env:O,runCodegen:()=>Ge(`Generating styles`,`pnpm codegen`,()=>u([`codegen`],{cwd:r,env:O,signal:B?.signal}).then(()=>void 0))})),!0}catch(r){return await _t({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}},dt=async({flutterRestartRequired:e,installDependencies:t,restartRequired:i,trigger:a})=>{let o=U;if(t)try{await gt([`install`,`--frozen-lockfile`])}catch(t){await _t({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 ut({commit:o,flutterRestartRequired:e,restartRequired:i})){try{n.database&&await Ge(`Preparing database`,`pnpm db migrate-local`,()=>I(`setup.migration`,()=>At({config:n,cwd:r,env:O,signal:B?.signal})))}catch(t){await _t({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 vt(),Qe(o,a),e&&await c(),i&&h()}},J=async()=>{let e=ht(`dependencies`);await vt(),await dt({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!0,restartRequired:e.restartRequired,trigger:`dependency-recovery`})},ft=async()=>{let e=ht(`codegen`);await vt(),await dt({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!1,restartRequired:e.restartRequired,trigger:`codegen-recovery`})},pt=async()=>{let e=ht(`migration`);try{await gt([`db`,`setup`])}catch(t){await _t({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 vt(),Qe(e.commit,`database-recovery`),e.flutterRestartRequired===!0&&await c(),e.restartRequired&&h()},ht=e=>{if(!j.setupFailure||j.setupFailure.stage!==e)throw Error(`There is no failed ${e} setup step to recover.`);return j.setupFailure},gt=async e=>{await Ge(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(` `)}))},_t=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};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=yt();l&&await A(l,`${JSON.stringify(c)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development setup failure: ${$(e)}`)})},vt=async()=>{j={...j,setupFailure:void 0};let e=yt();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)}`)})},yt=()=>W?L.join(W.commonDir,ve):void 0,bt=async(e,t,n,r)=>{let i={commits:n,finalMessage:e,id:re(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(L.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()},Ct=async e=>{j={...j,codexOptions:e},W&&await A(L.join(W.commonDir,_e),`${JSON.stringify(e)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development Codex options: ${$(e)}`)})},wt=async()=>{let e=j.codexCompletion?.id,t=W?.commonDir;j={...j,codexCompletion:void 0},t&&await I(`completion.acknowledge`,()=>k(L.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:rt,activate:()=>oe(C.run({sessionId:w},()=>I(`session.activate`,$e))),getStatus:()=>j,close(){return F||(M=`closing`,de?.(),clearInterval(Me),clearInterval(Ie),clearTimeout(ze),F=(async()=>{if(await Promise.allSettled([...N]),ae)throw ae;for(let e of Be)e.close();clearInterval(Me),clearInterval(Ie),clearTimeout(ze),await q.flush(),ne&&await Gt(ke,w),M=`closed`,C.event(`session.closed`,{sessionId:w}),C.close()})(),F)}}}async function Se(e){let t=L.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||ce.includes(t))&&(n===void 0||le.includes(n))}async function we(e){let t=L.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=L.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`,R]),primary:t.primary}}function ke(e){return e===`HEAD`?void 0:e}async function Ae(e,t){let n=[e.gitDir,L.join(e.commonDir,`refs`,`heads`)],r=[];for(let e of n)try{r.push(ae(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=ne(`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=Yt(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=Yt(a).sort(),d=Yt(o);for(let e of s)r(e);r(i);for(let t of[...new Set([...d,...u])].sort()){r(t);try{let n=L.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(L.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
|
|
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 ee,unlink as O,writeFile as k}from"node:fs/promises";import{pathToFileURL as te}from"node:url";import{startTemporaryProjectPostgres as A,startTemporaryProjectTurso as j}from"@coreframe/db";import{DevDiagnostics as M,devDiagnosticContext as ne,devDiagnosticError as N,devDiagnosticEvent as P,devDiagnosticPhase as F}from"@coreframe/dev-supervisor";import{createHash as I,randomBytes as re,randomUUID as L}from"node:crypto";import{watch as ie}from"node:fs";import R from"node:path";import{stripVTControlCharacters as ae}from"node:util";import{canResetManagedDevBranches as oe,isManagedDevOperationActive as se,managedDevCodexEfforts as ce,managedDevCodexModels as le}from"@coreframe/dev-contracts/managed-dev";import{resolve as ue}from"import-meta-resolve";import{SubprocessError as de}from"nano-spawn";const z=`refs/heads/main`,B=`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`,ge=`coreframe-managed-dev `,_e=`coreframe-managed-dev-codex-completion.json`,ve=`coreframe-managed-dev-codex-options.json`,ye=`coreframe-managed-dev-setup-failure.json`,be=`coreframe-managed-dev-retries.json`;async function xe(e=p.cwd()){let t=await Ne(e);return t.primary&&t.branch===`main`&&t.head===t.main}async function Se(e=p.cwd()){try{let{commonDir:t,gitDir:n}=await V(e);return n===t}catch{return!1}}async function V(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 Ce({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=Et,watchState:b=Fe}){let S=()=>void 0,C=new M(r,`session`,e=>S(e)),w=C.instanceId,D=0,ee=0,te;C.event(`session.created`,{sessionId:w});let A=i,j={mode:`waiting`,warnings:[]},I=`active`,ie=new Set,ae,ce=!1,le,ue=e=>(e.catch(e=>{e instanceof Error&&/Unresolved (?:Codex|managed) process ownership/.test(e.message)&&(le=e)}),ie.add(e),e.finally(()=>ie.delete(e)).catch(()=>void 0),e),de=()=>{if(I!==`active`)throw Error(`Managed development owner is closing or closed.`)},ge=!1,xe=!1,Se,V,Ce=!1,Ee=!1,Oe=v??(e=>Mt(r,A,e,V?.signal)),H,ke,Me,Pe=!1,U,Be=async e=>{if(j={...j,...e},W){let e=R.join(W.commonDir,be),t=`${e}.${L()}`;try{await k(t,JSON.stringify({codexRetry:j.codexRetry,devAlignment:j.devAlignment})),await T(t,e)}catch(e){P(`retries.save-failed`,N(e),`warn`);let n=`Retry actions could not be saved. Keep this dev session open to retry; Git recovery refs remain preserved.`;j.warnings.includes(n)||(j={...j,warnings:[...j.warnings,n]}),await E(t,{force:!0}).catch(()=>void 0)}}},W,G,We,Ke,Ye,Xe=[],K,Ze=Promise.resolve(),Qe,$e=!1,q=()=>{if(I===`active`){j={...j,operation:J.snapshot};let e={...Qt(j),activityRevision:D,operationRevision:j.operation?.revision},t=JSON.stringify(e);t!==te&&(te=t,ee++,C.event(`status.changed`,{sessionId:w,revision:ee,...e})),j={...j,trace:{sessionId:w,revision:ee,operationId:j.operation?.id??ne()?.operationId}};try{g(j)}catch(e){C.event(`status.delivery-failed`,N(e),`warn`)}}},J=new d(w,e=>{j={...j,operation:e,activities:e?.activities??j.activities},q()},e=>{C.event(`operation.persistence-failed`,N(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]},q())});S=e=>J.observe(e);let et=e=>{J.activity(e),D++;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))},q()},tt=(e,t,n,r)=>At(e,t,n,et,{...r,signal:r?.signal??V?.signal}),nt=async({fetch:e=!1}={})=>{if(!(!ge||I!==`active`||!W)){if(xe||$e){Pe=!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:Me?[Me]:[]};return}i!==U&&(U=i,K=void 0);let o=await Le(r);if(xe||$e){Pe=!0;return}if(e&&await Q(r,[`remote`,`get-url`,`origin`]))try{await t(r,[`fetch`,`origin`,`+refs/heads/main:${fe}`]),j={...j,fetchFailure:void 0}}catch(e){j={...j,fetchFailure:$(e)},C.event(`fetch.failed`,N(e),`warn`)}let s=await Q(r,[`rev-parse`,B]),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 $t(r,e.commit,U)&&!(e.source===`dev`&&e.commit===l)){d=e;break}let f,p=!1;d?.source===`dev`&&l&&(await $t(r,l,d.commit)?f=await Ve(r,U,d.commit):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:Y(o.fingerprint),proposalUntracked:K?.untracked,target:d===void 0?void 0:await Jt(r,f??U,d.commit,d.source)}}catch(e){if(xe||$e){Pe=!0;return}C.event(`refresh.failed`,N(e),`error`),j={...j,message:$(e),warnings:[$(e)]}}finally{q()}}},rt,it=!1,at=!1,ot=({fetch:e=!1}={})=>I===`active`?(it=!0,at||=e,rt||(rt=ue((async()=>{for(;it&&I===`active`;){it=!1;let e=at;at=!1,await C.run({sessionId:w,operationId:L(),trigger:e?`remote-poll`:`local-refresh`},()=>nt({fetch:e}))}})().finally(()=>{rt=void 0})),rt)):Promise.resolve(),st=()=>{clearTimeout(Ye),Ye=setTimeout(()=>void ot(),50),Ye.unref()},ct=(e,t,n=[`typecheck`,`test`])=>{let r=async()=>{let r=[{command:`pnpm typecheck`,status:`running`},{command:`pnpm test`,status:`pending`}];for(let e of r){let t=e.command===`pnpm test`?`test`:`typecheck`;n.includes(t)?e.status=`pending`:e.status=`passed`}let i=()=>{j={...j,checks:{commit:e,commands:structuredClone(r),trigger:t}},q()};i();for(let a of n){let n=a===`typecheck`?0:1;if(V?.signal.aborted){for(let e of r)e.status===`pending`&&(e.status=`cancelled`);i();break}r[n].status=`running`,i();try{await tt(a===`test`?`Running tests`:`Checking types`,`pnpm ${a}`,()=>F(`check`,()=>Oe(a),{script:a,commit:e,trigger:t})),r[n].status=`passed`}catch(e){r[n].status=V?.signal.aborted?`cancelled`:`failed`,r[n].failureId=re(12).toString(`hex`),r[n].output=Nt(e)}i()}};Ze=Ze.then(r,r)},lt=async()=>{if(ge||I!==`active`)return;let e=await Ne(r);if(!e.primary){j={message:`Managed development only runs from the primary checkout.`,mode:`unmanaged`,warnings:[]},q();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:[]},q();return}de();let n=R.join(e.commonDir,`coreframe-managed-dev.lock`);await Yt(n,w),G=n,ce=!0,de(),await Q(r,[`rev-parse`,`--verify`,B])||await t(r,[`branch`,`dev`,e.head]),await a(e.commonDir),W=e,U=e.head;let i=await _t(r,e,l);Me=i?.notice,H=i?.paused,ke=H?.recoveryRef,ge=!0,j={codexCompletion:await De(e.commonDir),codexOptions:await Te(e.commonDir),currentCommit:e.head,mode:`managed`,pendingRebase:i?.pendingRebase,setupFailure:await je(e.commonDir,e.head),...await we(e.commonDir,e.head),warnings:Me?[Me]:[]},j.setupFailure||await xt({commit:e.head,flutterRestartRequired:!1,restartRequired:!1}),await J.restore(e.commonDir),J.snapshot?.state===`awaiting-resolution`&&!j.pendingRebase&&J.finish(`failed`,`The recorded replay cannot be resumed. Review the Git recovery diagnostics before continuing.`),q(),Xe=await b(e,st),We=setInterval(()=>{j.draft&&ot()},s),We.unref(),Ke=setInterval(()=>void ot({fetch:!0}),_),Ke.unref(),await ot(),ot({fetch:!0})},ut=async(t,{onCodexEvent:n=()=>void 0}={})=>{if(de(),!ge||j.mode!==`managed`)throw Error(`Managed development is not active.`);if(t.type===`reset-branches`){if($e||t.operationId!==J.snapshot?.id||!oe({...j,operation:J.snapshot}))throw Error(`There is no active merge or rebase that can be safely reset.`);$e=!0;try{Se?.(),await Qe?.catch(()=>void 0);let e=J.snapshot?.branchReset;if(!e||J.snapshot?.id!==t.operationId||!W)throw Error(`The active update changed before its branches could be reset.`);if(await Ue(r))throw Error(`Close the dev branch checkout before resetting branches.`);xe=!0,j={...j,busy:`Resetting branches`},q();let n=await Je({base:e.expectedMain,commit:e.main,cwd:r,gitDir:W.gitDir,journalPath:R.join(W.commonDir,he),operationId:t.operationId,sessionId:w,source:J.snapshot.source,target:J.snapshot.target,resetRefs:[{ref:B,before:e.expectedDev,after:e.dev},{ref:pe,before:e.expectedConsumedDev,after:e.consumedDev}],releasedPins:[H?.originalRef,H?.preparedRef,ke].filter(e=>!!e)});return U=e.main,H=void 0,ke=void 0,K=void 0,await zt(),await Pt(),await Be({codexRetry:void 0,devAlignment:void 0}),j={...j,currentCommit:e.main,pendingRebase:void 0,setupFailure:void 0,checks:void 0,target:void 0,message:void 0,warnings:n.diverged.length?[`Branches were reset; newer edits were preserved in: ${n.diverged.join(`, `)}.`]:[]},J.finish(`cancelled`,`Branches restored to their pre-integration commits.`),await J.flush(),{status:j}}finally{xe=!1,$e=!1,j={...j,busy:void 0},q()}}if(t.type===`cancel-codex`){if(t.operationId&&t.operationId!==J.snapshot?.id)throw Error(`This update is no longer active. Refresh its status before cancelling.`);let e=Se;if(!e)throw Error(`There is no Codex conflict resolution to cancel.`);return e(),await J.flush(),{status:j}}if(xe||$e||se(J.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}}if(t.type===`retry-fetch`)return await ot({fetch:!0}),{status:j};if([`retry-codex`,`retry-install`,`retry-codegen`,`retry-migration`,`retry-checks`,`reset-database`].includes(t.type)&&W&&(await a(W.commonDir),le=void 0),[`retry-install`,`retry-codegen`,`retry-migration`,`reset-database`].includes(t.type)&&j.setupFailure&&(await Z(r,[`rev-parse`,`HEAD`])!==j.setupFailure.commit||await Z(r,[`rev-parse`,z])!==j.setupFailure.commit))throw Error(`The checkout changed since setup failed. Review its current state before retrying setup.`);[`retry-install`,`retry-codegen`,`retry-migration`,`reset-database`].includes(t.type)&&j.setupFailure&&J.snapshot&&(vt(J.snapshot.source,J.snapshot.target,!0),J.phase(`setup`));let i=[],s=[],c,l,u=e=>{if(J.codex(e),e.phase===`activity`){et({...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`?(s=e.commits,c=e.totalCommits,i.splice(0,i.length,e.message)):e.phase===`message`?i.push(e.message):e.phase===`complete`?l=e.finalMessage:e.phase===`progress`&&(s=e.commits,c=e.totalCommits??c);try{n(e)}catch(e){C.event(`codex.delivery-failed`,N(e),`warn`)}};xe=!0,j={...j,busy:rn(t),message:void 0};try{if(q(),t.type===`acknowledge-operation`)await J.dismiss(t.id),!j.pendingRebase&&!j.setupFailure&&(j={...j,message:void 0});else if(t.type===`acknowledge-codex`)j.codexCompletion?.id===t.id?(await zt(),J.snapshot&&await J.dismiss(J.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 Rt(e(t.codex));else if(t.type===`retry-codex`){let e=j.codexRetry;if(!e)throw Error(`There is no failed Codex stage to retry.`);let n=await Z(r,[`rev-parse`,`HEAD`]),i=e.source===`dev`?B:fe;if(n!==e.base||await Q(r,[`rev-parse`,i])!==e.target)throw Error(`The branches changed since Codex failed. Review the current update before continuing.`);await bt({codex:t.codex,codexApproved:!0,onCodexEvent:u,source:e.source,target:e.target,retry:e})}else if(t.type===`retry-checks`){if(j.setupFailure)throw Error(`Complete setup before retrying checks.`);if(j.checks?.commands.some(e=>e.status===`running`||e.status===`pending`))throw Error(`Project checks are already running.`);let e=j.checks?.commands.filter(e=>e.status===`failed`||e.status===`cancelled`);if(!e?.length)throw Error(`There are no failed checks to retry.`);let t=await Z(r,[`rev-parse`,`HEAD`]),n=await Le(r);J.snapshot&&vt(J.snapshot.source,J.snapshot.target,!0);let i=j.checks?.commit===t&&!n.tracked&&n.untracked.length===0?e.map(e=>e.command===`pnpm test`?`test`:`typecheck`):[`typecheck`,`test`];ct(t,`check-recovery`,i),await Ze}else if(t.type===`retry-dev-alignment`){let e=j.devAlignment;if(!e)throw Error(`There is no deferred dev alignment to retry.`);if(await Z(r,[`rev-parse`,`HEAD`])!==e.main||await Z(r,[`rev-parse`,z])!==e.main||await Q(r,[`rev-parse`,B])!==e.dev)throw Error(`The branches changed. Review the current history before aligning dev.`);let t=await He(r,e.previousMain,e.main,e.dev);j={...j,warnings:j.warnings.filter(e=>!e.startsWith(`Local main was synchronized, but dev was left unchanged:`))},t?j.warnings.push(t):await Be({devAlignment:void 0}),Pe=!0}else if(t.type===`resolve-rebase`){let e=j.pendingRebase;if(!e)throw Error(`There is no pending rebase to resolve.`);await bt({codex:t.codex,codexApproved:!0,onCodexEvent:u,source:e.target.source,target:e.target.commit})}else if(t.type===`prepare`){let e=mt(t.target),n=await Le(r);n.tracked||n.untracked.length>0?j={...j,draft:n,proposal:Y(n.fingerprint),proposalUntracked:K?.untracked}:await bt({codex:t.codex,onCodexEvent:u,source:e.source,target:t.target})}else if(t.type===`message`){let e=await ht(t.fingerprint,t.untracked);if(!e.tracked&&t.untracked.length===0)throw Error(`Select at least one file to commit.`);let n=Y(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`,A))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 F(`commit.proposal`,()=>Re(r,A,t.untracked)),K={fingerprint:e.fingerprint,untracked:[...t.untracked],message:n}}catch(e){n=``,j={...j,warnings:[...j.warnings,`Codex could not generate a commit message: ${Nt(e)}`]}}}j={...j,draft:e,proposal:n,proposalUntracked:t.untracked}}else if(t.type===`commit`){let e=await gt(t);j={...j,currentCommit:e,draft:void 0,message:void 0,proposal:void 0,target:void 0},st()}else if(t.type===`retry-install`)await Ct();else if(t.type===`retry-codegen`)await wt();else if(t.type===`retry-migration`){let e=Ot(`migration`);await St({installDependencies:!1,skipCodegen:!0,flutterRestartRequired:e.flutterRestartRequired===!0,restartRequired:e.restartRequired,trigger:`database-recovery`})}else if(t.type===`reset-database`)await Tt();else{let e=mt(t.target),n=await Le(r);if(n.tracked||n.untracked.length>0){if(!t.fingerprint||!t.untracked)throw Error(`Refresh requires the current working-tree confirmation.`);if(await ht(t.fingerprint,t.untracked),(n.tracked||t.untracked.length>0)&&(!t.message||!me.test(nn(t.message))))throw Error(`Enter a commit message with a valid Conventional Commits header.`)}await bt({codex:t.codex,fingerprint:t.fingerprint,message:t.message,onCodexEvent:u,source:e.source,target:t.target,untracked:t.untracked})}}catch(e){if(se(J.snapshot)){let t=V?.signal.aborted&&!(e instanceof Error&&/Unresolved .* process ownership/.test(e.message));J.finish(t?`cancelled`:`failed`,t?J.snapshot?.published?`Changes were applied. Remaining setup and checks were cancelled.`:`Update cancelled. Prepared changes were not applied.`:$(e))}throw e}finally{if(xe=!1,j={...j,busy:void 0},se(J.snapshot)&&J.snapshot?.requestIds.includes(String(ne()?.operationId)))if(j.pendingRebase)J.pause(j.pendingRebase);else if(V?.signal.aborted)dt();else if(j.setupFailure)J.finish(`failed`,j.setupFailure.message);else if(j.checks?.commands.some(e=>e.status===`running`||e.status===`pending`)){let e=J.snapshot.id,t=J.snapshot.requestIds.at(-1);J.phase(`checks`),ue(Ze.then(()=>{J.snapshot?.id===e&&J.snapshot.requestIds.at(-1)===t&&se(J.snapshot)&&dt()}))}else dt();se(J.snapshot)||(Se=void 0,V=void 0),q(),await J.flush(),Pe&&(Pe=!1,st())}return l&&J.snapshot?.state!==`failed`&&J.snapshot?.state!==`cancelled`&&await Lt(l,i,s,c),{status:j}},dt=()=>{V?.signal.aborted?J.finish(`cancelled`,J.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`)?J.finish(`failed`,`Changes were applied, but project checks failed. Review the failed checks.`):J.finish(`succeeded`,`Update ready.`),Se=void 0,V=void 0,q()},ft=new Map,pt=(e,t={})=>{let n=t.requestKey??t.operationId,r=JSON.stringify(e),i=n?ft.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=ue(C.run({sessionId:w,operationId:t.operationId??L(),actionType:e.type},()=>F(`action`,()=>ut(e,t),{actionType:e.type,targetCommit:`target`in e?e.target:void 0,completionId:e.type===`acknowledge-codex`?e.id:void 0})));if([`apply`,`prepare`,`resolve-rebase`].includes(e.type)&&!Qe){Qe=a;let e=()=>{Qe===a&&(Qe=void 0)};a.then(e,e)}if(n){let e={action:r,promise:a,settled:!1};ft.set(n,e);let t=()=>{e.settled=!0;for(let[e,t]of ft){if(ft.size<=100)break;t.settled&&ft.delete(e)}};a.then(t,t)}return a},mt=e=>{if(!j.target||j.target.commit!==e)throw Error(`The offered update changed. Review the latest target before refreshing.`);return j.target},Y=(e,t)=>K?.fingerprint===e&&(!t||en(K.untracked,t))?K.message:void 0,ht=async(e,t)=>{let n=await Le(r);if(n.fingerprint!==e)throw K=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},gt=async({fingerprint:e,message:n,untracked:i})=>{if(!(await ht(e,i)).tracked&&i.length===0)throw Error(`Select at least one file to commit.`);if(!n||!me.test(nn(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}),K=void 0,a},vt=(e,t,n)=>{let r=String(ne()?.operationId??L());J.begin(e,t,r,n),V=new AbortController;let i=V;return Ee=!1,Ce=!1,Se=()=>{se(J.snapshot)&&(J.cancel(Ce),C.event(`integration.cancel-requested`,{integrationOperationId:J.snapshot?.id}),Ce?Ee=!0:i.abort())},i},bt=async({codex:i,codexApproved:a=!1,fingerprint:o,message:s,onCodexEvent:c=()=>void 0,source:u,target:d,retry:f,untracked:h=[]})=>{let g=e(i),_=vt(u,d,a&&j.pendingRebase?.target.commit===d);u===`upstream`&&await Ie(r),i&&await Rt(g);let v=!f?.prepared&&a&&j.pendingRebase?.target.commit===d?j.pendingRebase:void 0;v?j={...j,pendingRebase:void 0}:f||mt(d),await J.flush(),X(_.signal);let b=await Z(r,[`rev-parse`,`HEAD`]);C.event(`integration.accepted`,{source:u,targetCommit:d,startingHead:b,resumed:!!v,codexApproved:a,startingMain:await Z(r,[`rev-parse`,z]),startingDev:await Q(r,[`rev-parse`,B])});let S,T,E=await Le(r);if(E.tracked||E.untracked.length>0){if(!o||E.fingerprint!==o||new Set(h).size!==h.length||h.some(e=>!E.untracked.includes(e)))throw Error(`Working-tree changes changed; review them before refreshing.`);(E.tracked||h.length>0)&&(await t(r,[`add`,`--update`]),h.length>0&&await t(r,[`--literal-pathspecs`,`add`,`--`,...h]),await t(r,[`commit`,`--message`,s],{env:{GIT_EDITOR:`true`}}),S=await Z(r,[`rev-parse`,`HEAD`]),U=S,T=`refs/coreframe/recovery/${Date.now()}-${S.slice(0,12)}`,await t(r,[`update-ref`,T,S]),C.event(`recovery.created`,{recoveryRef:T,commit:S}))}let D=S??b,ee=u===`upstream`?await Q(r,[`rev-parse`,B]):void 0;if(!v||!J.snapshot?.branchReset){let e=await Z(r,[`rev-parse`,B]),t=await Q(r,[`rev-parse`,pe])??qe;J.checkpointBranches({main:D,dev:e,consumedDev:t,expectedMain:D,expectedDev:e,expectedConsumedDev:t}),await J.flush()}let O,k;de();let te=ne()?.operationId,M=W?R.join(W.commonDir,he):void 0;try{if(O=await F(`integration`,()=>ze({codex:g,codexApproved:a,cwd:r,env:A,journal:M&&te?{journalPath:M,operationId:te,recoveryRef:T??H?.recoveryRef,sessionId:w}:void 0,localMain:D,onCodexEvent:c,prepareVerification:(e,t)=>Dt({config:n,cwd:e,env:A,signal:t,startDatabase:y,trackActivity:tt}),resume:v,resumeBase:H?.base,prepared:f?.prepared,signal:_.signal,source:u,target:d}),{source:u,targetCommit:d,integrationBase:D}),X(_.signal),await Z(r,[`rev-parse`,`HEAD`])!==D)throw Error(`HEAD changed while the accepted update was being prepared.`);if(await Z(r,[`rev-parse`,z])!==D)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 Jt(r,O.pause.devBase??D,d,u)}:void 0,O.pause&&(H=O.pause.record);let e=O.commit;if(e===void 0){j={...j,pendingRebase:k},C.event(`integration.paused`,{applied:k?.applied,conflictCount:k?.files.length}),T&&(await t(r,[`update-ref`,`-d`,T]),C.event(`recovery.deleted`,{recoveryRef:T}));return}let i=G?await x(G,`utf8`).catch(()=>``):``;if(de(),X(_.signal),!ce||i.trim()!==`${p.pid} ${w}`)throw Error(`Managed development ownership changed; publication was refused.`);J.phase(`publishing`),Ce=!0;let o=J.snapshot.branchReset,s=await Je({advanceDev:O.advanceDev,base:D,commit:e,cwd:r,devTarget:O.devTarget,gitDir:W.gitDir,journalPath:M,onMutate:l,onStage:m,operationId:te,paused:O.pause?.record,releasedPins:v&&!O.pause?[H?.originalRef,H?.preparedRef].filter(e=>typeof e==`string`):void 0,sessionId:w,signal:_.signal,source:u,target:d,onRefsPublished:async({devMoved:t,consumedDev:n})=>{let r=J.snapshot.branchReset;J.checkpointBranches({...r,expectedMain:e,expectedDev:t?e:r.expectedDev,expectedConsumedDev:n?.after??r.expectedConsumedDev}),await J.flush()},onRefsReverted:async()=>{J.checkpointBranches(o),await J.flush()}});if(Ce=!1,J.published(),Pe=!0,U=e,j.codexRetry&&await Be({codexRetry:void 0}),u===`upstream`&&ee&&!k){let t=await He(r,D,e,ee,_.signal);t?(await Be({devAlignment:{previousMain:D,main:e,dev:ee}}),j={...j,warnings:[...j.warnings,t]}):await Be({devAlignment:void 0})}let h=tn(await Z(r,[`diff`,`--name-only`,`-z`,b,e])),S=Kt(h),E=qt(h);if(K=void 0,k&&T&&(ke=T,C.event(`recovery.retained`,{recoveryRef:T}),T=void 0),T&&(await t(r,[`update-ref`,`-d`,T]),C.event(`recovery.deleted`,{recoveryRef:T})),ke&&!O.pause&&(await t(r,[`update-ref`,`-d`,ke]),C.event(`recovery.deleted`,{recoveryRef:ke}),ke=void 0),v&&!O.pause&&(H=void 0),j={...j,currentCommit:e,draft:void 0,pendingRebase:k,proposal:void 0,setupFailure:void 0,target:void 0,warnings:s.diverged.length?[...j.warnings,`Kept changes made during synchronization in: ${s.diverged.join(`, `)}. Review the working tree before editing further.${s.preserved?` Previous file versions are preserved under ${s.preserved}.`:``}`]:j.warnings},C.event(`integration.published`,{commit:e,source:u,targetCommit:d,paused:!!k,restartRequired:S,flutterRestartRequired:E}),Ee){_.abort();let t=Gt(h);await jt({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:E,restartRequired:S,stage:t?`dependencies`:`codegen`})}X(_.signal),J.phase(`setup`),await St({installDependencies:Gt(h),flutterRestartRequired:E,restartRequired:S,trigger:`synchronization`})}catch(e){e instanceof yt&&!_.signal.aborted&&await Be({codexRetry:{base:D,source:u,target:d,prepared:e.prepared,recoveryRef:e.recoveryRef}});let t=T?` Recovery commit: ${T}.`:``;throw e instanceof Ge&&(Me=e.message),Pe=!0,j={...j,currentCommit:U,message:`${$(e)}${t}`,pendingRebase:v??k??j.pendingRebase,warnings:e instanceof Ge?[e.message]:j.warnings},e}},xt=async({commit:e,flutterRestartRequired:t,restartRequired:n})=>{try{return await F(`setup.codegen`,()=>f({cwd:r,env:A,runCodegen:()=>tt(`Generating styles`,`pnpm codegen`,()=>u([`codegen`],{cwd:r,env:A,signal:V?.signal}).then(()=>void 0))})),!0}catch(r){return await jt({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}},St=async({flutterRestartRequired:e,installDependencies:t,restartRequired:i,trigger:a,skipCodegen:o=!1})=>{let s=U;if(t)try{await kt([`install`,`--frozen-lockfile`])}catch(t){await jt({command:`pnpm install --frozen-lockfile`,commit:s,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(!(!o&&!await xt({commit:s,flutterRestartRequired:e,restartRequired:i}))){try{n.database&&await tt(`Preparing database`,`pnpm db migrate-local`,()=>F(`setup.migration`,()=>Ft({config:n,cwd:r,env:A,signal:V?.signal})))}catch(t){await jt({command:`pnpm db migrate-local`,commit:s,error:t,message:`The project was synchronized, but its database migration failed. The previous database was restored. Fix the reported problem and retry the migration, or reset the database to recreate it.`,flutterRestartRequired:e,restartRequired:i,stage:`migration`});return}await Pt(),ct(s,a),e&&await c(),i&&h()}},Ct=async()=>{let e=Ot(`dependencies`);await Pt(),await St({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!0,restartRequired:e.restartRequired,trigger:`dependency-recovery`})},wt=async()=>{let e=Ot(`codegen`);await Pt(),await St({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!1,restartRequired:e.restartRequired,trigger:`codegen-recovery`})},Tt=async()=>{let e=Ot(`migration`);try{await kt([`db`,`setup`])}catch(t){await jt({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 Pt(),ct(e.commit,`database-recovery`),e.flutterRestartRequired===!0&&await c(),e.restartRequired&&h()},Ot=e=>{if(!j.setupFailure||j.setupFailure.stage!==e)throw Error(`There is no failed ${e} setup step to recover.`);return j.setupFailure},kt=async e=>{await tt(e[0]===`install`?`Installing dependencies`:`Preparing database`,`pnpm ${e.join(` `)}`,()=>F(`setup.command`,()=>u(e,{cwd:r,env:A,signal:V?.signal}),{command:e.slice(0,2).join(` `)}))},jt=async({command:e,commit:t,error:n,flutterRestartRequired:r,message:i,restartRequired:a,stage:o})=>{let s=Nt(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,...N(n)},`error`),j={...j,setupFailure:c,target:void 0},console.error(`Coreframe managed development setup failed (${e}): ${i}\n${s}`);let l=It();l&&await k(l,`${JSON.stringify(c)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development setup failure: ${$(e)}`)})},Pt=async()=>{j={...j,setupFailure:void 0};let e=It();e&&await O(e).catch(e=>{e instanceof Error&&`code`in e&&e.code===`ENOENT`||console.warn(`Could not clear the managed-development setup failure: ${$(e)}`)})},It=()=>W?R.join(W.commonDir,ye):void 0,Lt=async(e,t,n,r)=>{let i={commits:n,finalMessage:e,id:re(16).toString(`hex`),messages:Ae(t),...r===void 0?void 0:{totalCommits:r}};j={...j,codexCompletion:i};let a=W?.commonDir;a&&await F(`completion.save`,()=>k(R.join(a,_e),`${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}),q()},Rt=async e=>{j={...j,codexOptions:e},W&&await k(R.join(W.commonDir,ve),`${JSON.stringify(e)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development Codex options: ${$(e)}`)})},zt=async()=>{let e=j.codexCompletion?.id,t=W?.commonDir;j={...j,codexCompletion:void 0},t&&await F(`completion.acknowledge`,()=>O(R.join(t,_e)).catch(e=>{if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}),{completionId:e}),C.event(`completion.acknowledged`,{completionId:e})};return{action:pt,activate:()=>ue(C.run({sessionId:w},()=>F(`session.activate`,lt))),getStatus:()=>j,close(){return ae||(I=`closing`,Se?.(),clearInterval(We),clearInterval(Ke),clearTimeout(Ye),ae=(async()=>{if(await Promise.allSettled([...ie]),le)throw le;for(let e of Xe)e.close();clearInterval(We),clearInterval(Ke),clearTimeout(Ye),await J.flush(),ce&&await Zt(G,w),I=`closed`,C.event(`session.closed`,{sessionId:w}),C.close()})(),ae)}}}async function we(e,t){try{let n=JSON.parse(await x(R.join(e,be),`utf8`)),r=e=>typeof e==`string`&&/^[a-f0-9]{40,64}$/.test(e),i=n?.codexRetry,a=n?.devAlignment;return{codexRetry:i&&i.base===t&&r(i.base)&&r(i.target)&&[`dev`,`upstream`].includes(i.source)&&(i.prepared===void 0||r(i.prepared)&&typeof i.recoveryRef==`string`&&/^refs\/coreframe\/recovery\/codex-[a-f0-9-]+$/.test(i.recoveryRef)&&await Q(e,[`rev-parse`,i.recoveryRef])===i.prepared)?i:void 0,devAlignment:a&&a.main===t&&r(a.main)&&r(a.previousMain)&&r(a.dev)?a:void 0}}catch(e){return e.code!==`ENOENT`&&P(`retries.restore-failed`,N(e),`warn`),{}}}async function Te(e){let t=R.join(e,ve);try{let e=JSON.parse(await x(t,`utf8`));if(Ee(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 O(t).catch(()=>void 0)}function Ee(e){if(!e||typeof e!=`object`)return!1;let{effort:t,model:n}=e;return(t===void 0||ce.includes(t))&&(n===void 0||le.includes(n))}async function De(e){let t=R.join(e,_e);try{let e=JSON.parse(await x(t,`utf8`));if(Oe(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 O(t).catch(()=>void 0)}function Oe(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(ke)&&(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 ke(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 Ae(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 je(e,t){let n=R.join(e,ye);try{let e=JSON.parse(await x(n,`utf8`));if(Me(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 O(n).catch(()=>void 0)}function Me(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 Ne(e){let t=await V(e);return{branch:Pe(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 Pe(e){return e===`HEAD`?void 0:e}async function Fe(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 Ie(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 U(e){return/^(?:dist|build|coverage|target)\//.test(e)||/(?:^|\/)(?:\.cache|\.turbo|\.vite|\.next|\.nuxt|\.output|__pycache__)\//.test(e)||/\.tsbuildinfo$/.test(e)}async function Le(e){let n=async()=>{let n=I(`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=tn(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=tn(a).sort(),d=tn(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(U)}},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 Re(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 ze({codex:e,codexApproved:n=!1,cwd:r,env:i,journal:a,localMain:o,onCodexEvent:s,prepareVerification:c,resume:l,resumeBase:u,prepared:d,signal:f,source:p,target:m}){if(!d&&p===`dev`&&await $t(r,o,m))return P(`integration.strategy`,{strategy:`fast-forward`,localMain:o,targetCommit:m}),{commit:m,devTarget:m};let h=R.resolve(r,await Z(r,[`rev-parse`,`--git-common-dir`])),g=R.join(h,`coreframe-managed-dev`);await v(g,{recursive:!0});let _=re(8).toString(`hex`),y=R.join(g,`integration-${_}`);P(`integration.strategy`,{strategy:p===`dev`?`rebase-then-merge`:`rebase`,localMain:o,targetCommit:m,worktreeId:_}),a&&!l&&await Y(a.journalPath,{version:2,operationId:a.operationId,sessionId:a.sessionId,phase:`preparing`,source:p,target:m,expectedMain:o,commit:o,checkout:{branch:z,fingerprint:o},worktree:`integration-${_}`}).catch(e=>{P(`publication.journal-failed`,N(e),`warn`)});try{let h=d??(l?u??o:o),g=!(l&&p===`dev`),v;if(await t(r,[`worktree`,`add`,`--detach`,y,h]),d)await bt(y,i,`rebase`,s,{codex:e,prepareVerification:c,signal:f});else if(o!==m)if(l){let t=l.commits.map(e=>e.commit);t.length>0&&await xt(y,i,[`cherry-pick`,`--empty=drop`,...t],`cherry-pick`,s,{codex:e,codexApproved:n,prepareVerification:c,rebaseBase:h,signal:f,totalCommits:l.applied+t.length})}else if(p===`dev`&&(v=await Ve(r,o,m))!==void 0){await Ie(r),g=!1;let t=Number(await Z(y,[`rev-list`,`--count`,`${v}..${m}`]));P(`integration.strategy`,{strategy:`rebase`,consumedBoundary:v,localMain:o,targetCommit:m,worktreeId:_});let l=await xt(y,i,[`rebase`,`--onto`,o,v,m],`rebase`,s,{codex:e,codexApproved:n,journal:a?{...a,expectedMain:o,source:p,target:m}:void 0,prepareVerification:c,rebaseBase:o,signal:f,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(p===`dev`){let n=await Q(y,[`merge-base`,o,m]),a=!1;if(n){await Ie(r);try{await t(y,[`rebase`,`--onto`,o,n,m],{env:{GIT_EDITOR:`true`}}),a=!0}catch(e){if((await jt(y)).length===0)throw e;P(`integration.fallback`,{from:`rebase`,to:`merge`}),await t(y,[`rebase`,`--abort`]),await t(y,[`reset`,`--hard`,o]),X(f)}}a||await xt(y,i,[`merge`,`--no-edit`,`--no-ff`,`--allow-unrelated-histories`,`--message`,`Merge dev into main`,m],`merge`,s,{codex:e,prepareVerification:c,signal:f})}else{let t=await Q(y,[`merge-base`,o,m]),r=Number(await Z(y,[`rev-list`,`--count`,t?`${t}..HEAD`:`HEAD`])),l=await xt(y,i,t?[`rebase`,`--onto`,m,t]:[`rebase`,`--root`,`--onto`,m],`rebase`,s,{codex:e,codexApproved:n,journal:a?{...a,expectedMain:o,source:p,target:m}:void 0,prepareVerification:c,rebaseBase:m,signal:f,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 X(f),{advanceDev:g,commit:await Z(y,[`rev-parse`,`HEAD`]),devTarget:p===`dev`?m:void 0}}finally{await t(r,[`worktree`,`remove`,`--force`,y]).catch(e=>{P(`worktree.cleanup-failed`,{worktreeId:_,...N(e)},`warn`)}),await E(y,{force:!0,recursive:!0})}}async function Be(e,t){let n=await Q(e,[`rev-parse`,pe]);if(n&&await $t(e,n,t))return n}async function Ve(e,t,n){let r=await Be(e,n);return r&&!await $t(e,r,t)?r:void 0}async function He(e,n,r,a,o){let s=e=>`Local main was synchronized, but dev was left unchanged: ${e}. Synchronize dev before continuing work on it.`,c;try{if(await $t(e,r,a))return;if(await Ue(e))return s(`it is checked out in another worktree`);let l=await Q(e,[`rev-parse`,pe]);if(l&&!await $t(e,l,a))return s(`its recorded synchronized history was rewritten`);let u=await Ve(e,n,a)??await Q(e,[`merge-base`,n,a]);if(!u)return s(`it has no known shared history with main`);let d=R.resolve(e,await Z(e,[`rev-parse`,`--git-common-dir`])),f=R.join(d,`coreframe-managed-dev`);await v(f,{recursive:!0}),c=await y(R.join(f,`align-dev-`)),await t(e,[`worktree`,`add`,`--detach`,c,a]),await t(c,[`rebase`,`--onto`,r,u,a],{env:{GIT_EDITOR:`true`}});let p=await Z(c,[`rev-parse`,`HEAD`]);if(X(o),await Ue(e))return s(`it was checked out while synchronization was running`);await i(e,[`start`,`verify ${z} ${r}`,`update ${B} ${p} ${a}`,`update ${pe} ${r} ${l??qe}`,`create refs/coreframe/recovery/dev-${L()} ${a}`,`prepare`,`commit`]),P(`dev.aligned`,{main:r,previousDev:a,dev:p})}catch(e){return P(`dev.alignment-deferred`,N(e),`warn`),s(`the replay conflicted, was interrupted, or its refs changed`)}finally{c&&(await t(e,[`worktree`,`remove`,`--force`,c]).catch(()=>void 0),await E(c,{recursive:!0,force:!0}))}}async function Ue(e){return(await Z(e,[`worktree`,`list`,`--porcelain`]).catch(()=>``)).split(`
|
|
3
3
|
|
|
4
4
|
`).some(e=>e.split(`
|
|
5
|
-
`).includes(`branch ${z}`))}async function Be(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 ze(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 ${R} ${t.commit} ${n}`];s&&t.devTarget&&l.push(c?`update ${z} ${t.commit} ${t.devTarget}`:`verify ${z} ${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`,R]),Q(e,[`rev-parse`,z])])}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{},Ve=class extends Error{},He=class extends Error{};const K=`0000000000000000000000000000000000000000`;async function Ue({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 qe(i,n,r),x=L.join(o,`index`),S=`${x}.lock`,C=L.join(o,`HEAD.lock`),w=L.join(`.coreframe`,`managed-dev-retained`,`${p.pid}-${re(4).toString(`hex`)}`),E=L.join(i,w),D={version:2,operationId:u,sessionId:m,phase:`publishing`,source:g,target:y,expectedMain:n,commit:r,checkout:{branch:R,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 Ge(S,m,`index`);let O=[],A=[],j=[],M=!1,N=!1,ee=!1,te=!1,I,ne=async(e,t,n,r)=>{let a=L.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,L.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 Ke(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 _(L.join(i,e.path)).catch(()=>void 0);t&&!(t.isDirectory()&&e.newMode===`160000`)&&await ne(e.path,null,!0);continue}if(e.oldMode===`160000`)continue;let t=await ne(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=L.dirname(e.path);t&&t!==`.`;t=L.dirname(t)){let n=await _(L.join(i,t)).catch(()=>void 0);if(n&&!n.isDirectory()){await ne(t,null,!0,e.path);break}}for(let e of O)if(!(e.expected!==null&&await Je(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 Ye(E);for(let e of new Set(O.map(e=>L.dirname(L.join(i,e.entryPath)))))await Ye(e)}await l?.(`displaced`),Y(h);let o=await Be(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 Ge(C,m,`HEAD`),M=!0;let u=await ot(i);if(u!==R)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 Ze(i,e,c),A.push({entryPath:e.path,mode:e.newMode,sha:e.newSha})}catch(t){if(t instanceof He){j.push(e.path);continue}throw t}await l?.(`files`),Y(h);for(let e of await rt(i,b))j.includes(e)||j.push(e);let d=await st(i);if(d.branch!==R||d.main!==r)throw D.phase=`recovery-needed`,D.diverged=j,D.error=d.branch===R?`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 Ve(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 tt(i,w);for(let e of b)e.status===`D`&&await lt(i,L.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 pt(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 Ve||e instanceof G?e:void 0;o||(D.error=$(e));let l=[];for(let e of[...A].reverse())try{await Qe(i,E,e,c)?await lt(i,L.dirname(e.entryPath)):l.push(e.entryPath)}catch{l.push(e.entryPath)}for(let e of[...O].reverse())try{await et(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 it(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 tt(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 pt(s);let n=t?` File versions captured during synchronization are preserved under ${t}.`:``;throw o instanceof Ve?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 at(i,R,r),D.observed=await st(i),await ct(i,D),await J(s,D).catch(e=>{F(`publication.journal-failed`,P(e),`warn`)}),new Ve(`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 st(e);if(n!==R||r!==t)throw new Ve(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 We(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 Ge(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 Ke(e,t,n){let i=await ot(e);if(i!==R)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`,R])]);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 _(L.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=L.dirname(t.path);n&&n!==`.`;n=L.dirname(n)){let r=await _(L.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 qe(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 Je(e,t,n){if(n.expected===null)return!1;let r=L.join(t,n.slot),i=await _(r).catch(()=>void 0);return i?n.expected.mode===`160000`?i.isDirectory():n.expected.mode===`120000`?i.isSymbolicLink()&&dt(await C(r))===n.expected.sha:i.isFile()&&await ut(e,n.entryPath,L.relative(e,r))===n.expected.sha:!1}async function Ye(e){let t=await b(e,`r`).catch(()=>void 0);if(t)try{await t.sync()}catch{}finally{await t.close()}}function Xe(e){return e instanceof Error&&`code`in e&&(e.code===`EEXIST`||e.code===`ENOTDIR`||e.code===`EISDIR`||e.code===`ENOTEMPTY`)}async function Ze(e,t,r){let i=L.join(e,t.path);try{await v(L.dirname(i),{recursive:!0})}catch(e){throw Xe(e)?new He($(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 Xe(e)?new He($(e)):e}}async function Qe(e,t,n,r){let i=L.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,L.join(t,a))}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!0;throw e}return await $e(e,t,a,n)?!0:(await et(e,t,a,n.entryPath,r),!1)}async function $e(e,t,n,r){let i=L.join(t,n),a=await _(i).catch(()=>void 0);return a?r.mode===`120000`?a.isSymbolicLink()&&dt(await C(i))===r.sha:a.isFile()&&await ut(e,r.entryPath,L.relative(e,i))===r.sha:!1}async function et(e,t,n,r,i){let a=L.join(t,n),o=L.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(L.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 tt(e,t){let n=L.join(e,t),r=await S(n).catch(()=>[]);if(r.length===0){await D(n).catch(()=>void 0),await lt(e,L.dirname(t)).catch(()=>void 0);return}let i=L.join(`.coreframe`,`managed-dev-previous`,L.basename(t));try{await v(L.join(e,L.dirname(i)),{recursive:!0}),await T(n,L.join(e,i))}catch(e){return F(`publication.preserve-failed`,P(e),`warn`),t}return await lt(e,L.dirname(t)).catch(()=>void 0),F(`publication.preserved`,{location:i,slots:r.length}),i}async function nt(e,t,n){let r=L.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()&&dt(await C(r))===i:o.isFile()?await ut(e,t.path)===i:!1:!1}async function rt(e,t){let n=[];for(let r of t){if(r.status===`D`){await _(L.join(e,r.path)).catch(()=>void 0)!==void 0&&n.push(r.path);continue}await nt(e,r,`new`)||n.push(r.path)}return n}async function it(e,t,n,r,a,o){let s=[`start`,`update ${R} ${t} ${n}`];a&&r&&s.push(`update ${z} ${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 at(e,t,n){return await Q(e,[`rev-parse`,`--verify`,t])===n}async function ot(e){return Q(e,[`symbolic-ref`,`-q`,`HEAD`])}async function st(e){return{branch:await ot(e),head:await Q(e,[`rev-parse`,`HEAD`]),main:await Q(e,[`rev-parse`,R])}}async function ct(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 lt(e,t){let n=t;for(;n&&n!==`.`;){try{await D(L.join(e,n))}catch{return}n=L.dirname(n)}}async function ut(e,t,n=t){return Z(e,[`hash-object`,`--path=${t}`,`--`,n])}function dt(e){let t=Buffer.from(e);return ne(`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 Ye(L.dirname(e))}async function ft(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 pt(e){await k(e).catch(()=>void 0)}async function mt(e,n,i){let a=L.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=L.join(n.gitDir,`index.lock`),c=L.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=L.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);
|
|
7
|
-
`))n&&!T.has(n)&&await t(e,[`update-ref`,`-d`,n]).catch(e=>{
|
|
5
|
+
`).includes(`branch ${B}`))}async function W(e,t,n){let r=t.devTarget?await Q(e,[`rev-parse`,pe])??qe:void 0,a=!1,o,s=async s=>{let c=s&&t.devTarget!==void 0&&t.devTarget!==t.commit&&t.advanceDev!==!1&&!await Ue(e);o=t.devTarget?s&&c?t.commit:t.devTarget:void 0,P(`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 ${B} ${t.commit} ${t.devTarget}`:`verify ${B} ${t.devTarget}`),t.devTarget&&o&&l.push(`update ${pe} ${o} ${r}`),l.push(`prepare`,`commit`),await F(`refs.publish`,()=>i(e,l),{expectedMain:n,expectedDev:t.devTarget,commit:t.commit,includeDev:s}),a=c,P(`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`,B])])}catch{throw i}let[c,l]=a;if(P(`refs.publish-rejected`,{expectedMain:n,actualMain:c,expectedDev:t.devTarget,actualDev:l},`warn`),c!==n||l===t.devTarget)throw i;return P(`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{};function We({ref:e,before:t,after:n}){return t===n?`verify ${e} ${t}`:n===qe?`delete ${e} ${t}`:`update ${e} ${n} ${t}`}var Ge=class extends Error{},Ke=class extends Error{};const qe=`0000000000000000000000000000000000000000`;async function Je({advanceDev:e,base:n,commit:r,cwd:a,devTarget:o,gitDir:s,journalPath:c,onMutate:l,onStage:u,onRefsPublished:d,onRefsReverted:f,operationId:m,paused:h,releasedPins:g,resetRefs:y,sessionId:b,signal:x,source:S,target:C}){let w=y?(await ht(c)).journal:void 0,E=!!(y&&n===r),D=await Qe(a,n,r),ee=R.join(s,`index`),k=`${ee}.lock`,te=R.join(s,`HEAD.lock`),A=R.join(`.coreframe`,`managed-dev-retained`,`${p.pid}-${re(4).toString(`hex`)}`),j=R.join(a,A),M={version:2,operationId:m,sessionId:b,phase:`publishing`,source:S,target:C,expectedMain:n,commit:r,checkout:{branch:z,fingerprint:n},devTarget:o,retainedDir:A,paths:D.map(({path:e,status:t,oldSha:n,newSha:r})=>({path:e,status:t,oldSha:n,newSha:r})),displaced:[],...y?{resetRefs:y,released:g}:{},...h?{paused:h}:{}};await K(k,b,`index`);let ne=[],F=[],I=[],L=!1,ie=!1,ae=!1,oe=!1,se,ce=async(e,t,n,r)=>{let i=R.join(a,e);if(await _(i).catch(()=>void 0)===void 0)return;await l?.(`displace`,e);let o=`${ne.length}.${Buffer.from(e).toString(`base64url`)}`;await v(j,{recursive:!0});try{await T(i,R.join(j,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 ne.push(s),M.displaced.push({path:e,slot:o,expected:t?.sha??null}),s};try{E?await Ye(a,n):await Ze(a,n,D),await u?.(`preflight`),X(x),await Y(c,M);for(let e of D){if(await u?.(`path`,e.path),e.status===`A`){let t=await _(R.join(a,e.path)).catch(()=>void 0);t&&!(t.isDirectory()&&e.newMode===`160000`)&&await ce(e.path,null,!0);continue}if(e.oldMode===`160000`)continue;let t=await ce(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 D)if(e.status!==`D`)for(let t=R.dirname(e.path);t&&t!==`.`;t=R.dirname(t)){let n=await _(R.join(a,t)).catch(()=>void 0);if(n&&!n.isDirectory()){await ce(t,null,!0,e.path);break}}for(let e of ne)if(!(e.expected!==null&&await $e(a,j,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(ne.length>0){await q(j);for(let e of new Set(ne.map(e=>R.dirname(R.join(a,e.entryPath)))))await q(e)}await u?.(`displaced`),X(x);let s=y?await(async()=>(await i(a,[`start`,`update ${z} ${r} ${n}`,...y.map(We),`prepare`,`commit`]),{devMoved:!1,consumedDev:void 0}))():await W(a,{advanceDev:e,commit:r,devTarget:o},n);oe=s.devMoved,se=s.consumedDev,ae=!0,M.refsPublished=!0,await Y(c,M),await d?.(s),await u?.(`refs`),X(x),await K(te,b,`HEAD`),L=!0;let f=await lt(a);if(f!==z)throw new G(`The checkout moved to ${f??`detached HEAD`} during synchronization; nothing was overwritten.`);for(let e of D)if(e.status!==`D`)try{await et(a,e,l),F.push({entryPath:e.path,mode:e.newMode,sha:e.newSha})}catch(t){if(t instanceof Ke){I.push(e.path);continue}throw t}await u?.(`files`),X(x);for(let e of await ot(a,D))I.includes(e)||I.push(e);let p=await ut(a);if(p.branch!==z||p.main!==r)throw M.phase=`recovery-needed`,M.diverged=I,M.error=p.branch===z?`Local main moved to ${p.main?.slice(0,12)??`nothing`} while the update was applied.`:`The checkout moved to ${p.branch??`detached HEAD`} while the update was applied.`,new Ge(M.error);E||await t(a,[`read-tree`,r],{env:{GIT_INDEX_FILE:k}}),await Ye(a,r),E||(await T(k,ee),ie=!0),await u?.(`index`),await Ye(a,r);let m=await it(a,A);for(let e of D)e.status===`D`&&await ft(a,R.dirname(e.path));if(M.paused&&M.paused.remaining.length>0)M.phase=`paused`,await Y(c,M);else{M.phase=`published`,M.released=g,await Y(c,M);for(let e of g??[])await t(a,[`update-ref`,`-d`,e]).catch(t=>{P(`publication.pin-release-failed`,{ref:e,...N(t)},`warn`)});await gt(c)}return P(`checkout.published`,{commit:r,paths:F.length,divergedCount:I.length,...m?{preserved:m}:{}}),{diverged:I,preserved:m}}catch(e){let i=e instanceof Ge||e instanceof G?e:void 0;i||(M.error=$(e));let s=[];for(let e of[...F].reverse())try{await tt(a,j,e,l)?await ft(a,R.dirname(e.entryPath)):s.push(e.entryPath)}catch{s.push(e.entryPath)}for(let e of[...ne].reverse())try{await rt(a,j,e.slot,e.entryPath,l)||s.push(e.entryPath)}catch{s.push(e.entryPath)}L&&(L=!1,await O(te).catch(()=>void 0));let u=ae?await st(a,n,r,o,oe,se,y):!0,d=!ie;if(ie&&u&&s.length===0&&(d=await t(a,[`read-tree`,n]).then(()=>!0,()=>!1)),s.length===0&&u&&d){await f?.();let t=await it(a,A);w?await Y(c,w):M.paused&&M.paused.remaining.length>0?(M.phase=`paused`,M.refsPublished=!1,M.displaced=[],M.diverged=void 0,M.error=void 0,M.observed=void 0,await Y(c,M).catch(e=>{P(`publication.journal-failed`,N(e),`warn`)})):await gt(c);let n=t?` File versions captured during synchronization are preserved under ${t}.`:``;throw i instanceof Ge?new G(`${i.message}${n}`):e instanceof G?new G(`${e.message}${n}`):e}throw M.phase=`recovery-needed`,M.displaced=ne.filter(e=>s.includes(e.entryPath)).map(e=>({path:e.entryPath,slot:e.slot,expected:e.expected?.sha??null})),M.diverged=[...new Set([...M.diverged??[],...I,...s])],M.error??=$(e),M.refsPublished=await ct(a,z,r),M.observed=await ut(a),await dt(a,M),await Y(c,M).catch(e=>{P(`publication.journal-failed`,N(e),`warn`)}),new Ge(`Synchronization was interrupted before the checkout could be fully reconciled.${M.diverged.length?` Kept unreviewed changes in: ${M.diverged.join(`, `)}.`:``} Review \`git status\` before continuing.`)}finally{L&&await O(te).catch(()=>void 0),ie||await O(k).catch(()=>void 0)}}async function Ye(e,t){let{branch:n,main:r}=await ut(e);if(n!==z||r!==t)throw new Ge(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 Xe(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 K(e,t,n){for(let n=0;n<10;n++){try{let n=await b(e,`wx`);await n.writeFile(`${ge}${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 Ze(e,t,n){let i=await lt(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 Qe(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]??qe,newSha:n[3]??qe})}return i}async function $e(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()&&mt(await C(r))===n.expected.sha:i.isFile()&&await pt(e,n.entryPath,R.relative(e,r))===n.expected.sha:!1}async function q(e){let t=await b(e,`r`).catch(()=>void 0);if(t)try{await t.sync()}catch{}finally{await t.close()}}function J(e){return e instanceof Error&&`code`in e&&(e.code===`EEXIST`||e.code===`ENOTDIR`||e.code===`EISDIR`||e.code===`ENOTEMPTY`)}async function et(e,t,r){let i=R.join(e,t.path);try{await v(R.dirname(i),{recursive:!0})}catch(e){throw J(e)?new Ke($(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 ee((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 J(e)?new Ke($(e)):e}}async function tt(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 nt(e,t,a,n)?!0:(await rt(e,t,a,n.entryPath,r),!1)}async function nt(e,t,n,r){let i=R.join(t,n),a=await _(i).catch(()=>void 0);return a?r.mode===`120000`?a.isSymbolicLink()&&mt(await C(i))===r.sha:a.isFile()&&await pt(e,r.entryPath,R.relative(e,i))===r.sha:!1}async function rt(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 ee(await C(a),o):await g(a,o)}catch{return!1}return await O(a).catch(()=>void 0),!0}async function it(e,t){let n=R.join(e,t),r=await S(n).catch(()=>[]);if(r.length===0){await D(n).catch(()=>void 0),await ft(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 P(`publication.preserve-failed`,N(e),`warn`),t}return await ft(e,R.dirname(t)).catch(()=>void 0),P(`publication.preserved`,{location:i,slots:r.length}),i}async function at(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()&&mt(await C(r))===i:o.isFile()?await pt(e,t.path)===i:!1:!1}async function ot(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 at(e,r,`new`)||n.push(r.path)}return n}async function st(e,t,n,r,a,o,s){let c=[`start`,`update ${z} ${t} ${n}`];for(let{ref:e,before:t,after:n}of s??[])c.push(We({ref:e,before:n,after:t}));a&&r&&c.push(`update ${B} ${r} ${n}`),o&&c.push(o.before===qe?`delete ${pe} ${o.after}`:`update ${pe} ${o.before} ${o.after}`),c.push(`prepare`,`commit`);try{return await i(e,c),P(`refs.reverted`,{commit:n,expectedMain:t}),!0}catch(e){return P(`refs.revert-failed`,{commit:n,expectedMain:t,...N(e)},`warn`),!1}}async function ct(e,t,n){return await Q(e,[`rev-parse`,`--verify`,t])===n}async function lt(e){return Q(e,[`symbolic-ref`,`-q`,`HEAD`])}async function ut(e){return{branch:await lt(e),head:await Q(e,[`rev-parse`,`HEAD`]),main:await Q(e,[`rev-parse`,z])}}async function dt(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){P(`publication.pin-failed`,N(e),`warn`)}}async function ft(e,t){let n=t;for(;n&&n!==`.`;){try{await D(R.join(e,n))}catch{return}n=R.dirname(n)}}async function pt(e,t,n=t){return Z(e,[`hash-object`,`--path=${t}`,`--`,n])}function mt(e){let t=Buffer.from(e);return I(`sha1`).update(`blob ${t.length}\0`).update(t).digest(`hex`)}async function Y(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 q(R.dirname(e))}async function ht(e){let t;try{t=JSON.parse(await x(e,`utf8`))}catch(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`?{}:(P(`publication.journal-unreadable`,N(e),`warn`),{problem:`corrupt`})}if(!t||typeof t!=`object`||typeof t.commit!=`string`||typeof t.expectedMain!=`string`)return P(`publication.journal-unreadable`,{shape:`invalid`},`warn`),{problem:`corrupt`};let n=t.version;return n!==1&&n!==2?(P(`publication.journal-unreadable`,{version:typeof n==`number`||typeof n==`string`?n:`unknown`},`warn`),{problem:`unsupported-version`}):{journal:t}}async function gt(e){await O(e).catch(()=>void 0)}async function _t(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(ge)||r&&n(t))&&await O(e).catch(e=>{P(`publication.lock-removal-failed`,N(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=>{P(`worktree.cleanup-failed`,N(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 ht(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=Xe(n);r!==void 0&&!R.isAbsolute(r)&&!r.split(`/`).includes(`..`)&&await rt(e,t,n,r,i)||h.push(r??n)}h.length===n&&await D(t).catch(()=>void 0)}h.length===0&&await ft(e,`.coreframe/managed-dev-retained`).catch(()=>void 0);let[v,y,x,C]=await Promise.all([lt(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,...p?.released??[]].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=>{P(`publication.pin-release-failed`,{ref:n,...N(e)},`warn`)});if(!p)return w?{notice:w}:void 0;let ee=v===z&&y===x&&(x===p.commit||x===p.expectedMain)&&C&&h.length===0,k=!!p.paused&&v===z&&y===x&&(x===p.commit||x===p.expectedMain),te=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`||ee)&&!p.paused)return await te(),await gt(a),{notice:w};if(p.paused&&k){let t=p.paused,n=await(async()=>{if(!await vt(e,`${t.originalRef}^{commit}`)||!await vt(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 vt(e,`${n.commit}^{commit}`))return`a pending commit (${n.commit.slice(0,12)}) that is no longer in the object store`})();return n?(P(`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 Y(a,p).catch(e=>{P(`publication.journal-failed`,N(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 Y(a,p).catch(e=>{P(`publication.journal-failed`,N(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 Jt(e,p.source===`dev`?await Be(e,p.target)??p.expectedMain:p.expectedMain,p.target,p.source)}})}if(p.phase===`preparing`&&v===z&&y===x)return await gt(a),{notice:w};p.phase=`recovery-needed`,p.observed={branch:v,head:y,main:x},await Y(a,p).catch(e=>{P(`publication.journal-failed`,N(e),`warn`)});let A=`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`}`,j=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 ${A}.${j} Run \`git status\` to reconcile, then restart managed development.`}}async function vt(e,t){return r(e,[`rev-parse`,`--verify`,`--quiet`,t],{GIT_OPTIONAL_LOCKS:`0`})}var yt=class extends Error{prepared;recoveryRef;constructor(e,t,n){super(e),this.prepared=t,this.recoveryRef=n}};async function bt(e,n,r,i,{codex:a,prepareVerification:o,signal:s}){let c=await Z(e,[`rev-parse`,`HEAD`]);try{let t=await o?.(e,s)??{dispose:async()=>void 0,env:n};try{await Tt(e,t.env,r,i,s,a)}finally{await t.dispose().catch(e=>{P(`verification.cleanup-failed`,N(e),`warn`)})}}catch(n){X(s);let i=`refs/coreframe/recovery/codex-${c}`;throw await t(e,[`update-ref`,i,c]),new yt(`Codex could not verify the ${r} result: ${$(n)}`,c,i)}}async function xt(e,n,i,a,o,{codex:s,codexApproved:c=!0,journal:l,prepareVerification:u,rebaseBase:d,signal:f,totalCommits:p=0}={}){P(`integration.replay`,{operation:a,totalCommits:p});try{await t(e,i,{env:{GIT_EDITOR:`true`}});return}catch(i){let m=await jt(e);if(P(`integration.conflicts`,{operation:a,conflictCount:m.length,codexApproved:c}),m.length===0)throw i;if(!c&&a===`rebase`)try{let t=await St(e,m,l);return P(`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;){X(f),await wt(e,n,a,m,d?await kt(e,d):[],p,o,f,s),await t(e,[`diff`,`--check`]),await t(e,[`add`,`--all`]);let i=await jt(e);if(P(`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 jt(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 kt(e,d):[],phase:`progress`,stage:`resolve`,totalCommits:p});continue}o({commits:d?await kt(e,d):[],phase:`progress`,stage:`resolve`,totalCommits:p}),m=await jt(e)}(a===`rebase`||a===`cherry-pick`)&&await bt(e,n,a,o,{codex:s,prepareVerification:u,signal:f});return}catch(n){throw P(`integration.aborting`,{operation:a,cancelled:f?.aborted??!1}),await t(e,[a,`--abort`]).catch(()=>void 0),X(f),n instanceof yt?n:new yt(`Codex could not resolve ${a} conflicts: ${$(n)}`)}}}async function St(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
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):
|
|
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??
|
|
11
|
-
`).map(e=>{let[t,n=``]=e.split(`\0`,2);return{commit:t,shortCommit:t.slice(0,12),subject:n}}):[]}function
|
|
12
|
-
`):void 0}async function
|
|
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
|
|
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):P(`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??L()}`}/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 Y(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 X(e){if(e?.aborted)throw Error(`The update integration was cancelled.`)}async function Ct(e,t,n,r,i,a,o){return F(`codex`,()=>s(e,t,n,r,i,a),{model:r?.model,effort:r?.effort,purpose:o})}async function wt(e,t,n,r,i,a,o,s,c){X(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 Ct(e,t,l,c,u,s,`resolve`)||`Codex resolved the conflicts.`,phase:`complete`})}async function Tt(e,t,n,r,i,a){X(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 Ct(e,t,o,a,s,i,`verify`)||`Codex finished verifying the result.`,phase:`complete`})}async function Et({config:e,cwd:t,env:n}){if(e.database?.dialect===`sqlite`){let r=await j({config:e,cwd:t,env:n});return{dispose:()=>r[Symbol.asyncDispose](),env:r.env}}let r=await A({config:e,cwd:t,env:n});return{dispose:()=>r[Symbol.asyncDispose](),env:r.env}}async function Dt({config:e,cwd:t,env:n,signal:r,startDatabase:i=Et,trackActivity:a}){try{if(X(r),await m(R.join(t,`pnpm-lock.yaml`)).then(()=>!0,()=>!1)&&await a(`Installing dependencies`,`pnpm install --frozen-lockfile`,()=>F(`verification.dependencies`,()=>u([`install`,`--frozen-lockfile`],{cwd:t,env:n,signal:r}),{worktree:R.basename(t)}),{stage:`verify`,signal:r}),await F(`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)}),X(r),!e.database)return{dispose:async()=>void 0,env:n};let o=await a(`Starting verification database`,`Managed local database`,()=>F(`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`,()=>F(`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 Ot(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 kt(e,t){return Ot(e,t,`HEAD`)}async function At(e,t,n,r,i={}){let a={id:L(),label:e,command:t,source:`supervisor`,stage:i.stage,status:`running`,startedAt:Date.now()};r(a);try{let e=await n(),t=Pt(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:Nt(e).slice(-8e3)}),e}}async function jt(e){return tn(await Z(e,[`diff`,`--name-only`,`--diff-filter=U`,`-z`]))}async function Mt(e,t,n,r){await u([n],{cwd:e,env:t,signal:r})}function Nt(e){let t=Pt(e);if(t){let e=ae(t).trim();if(e)return e}return ae($(e))}function Pt(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 Ft({config:e,cwd:t,env:n,signal:r}){if(!e.database)return;let i=await It({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 It({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 Lt(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 Rt(t);if(a)return zt({directory:i,connectionString:n.DATABASE_URL,postgres:a});let o=R.join(i,`database.dump`),s=Wt(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 Lt(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 Rt(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(ue(`pg`,te(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 zt({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_${re(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 Vt(c,i,!1),await Ht(c,i),await c.query(`CREATE DATABASE ${Ut(a)} WITH TEMPLATE ${Ut(i)}`),await Vt(c,a,!0)}finally{await Vt(c,i,!0).catch(()=>void 0),await c.end()}return{directory:e,async discard(){await Bt(n,s.href,async e=>{await Ht(e,a),await e.query(`DROP DATABASE ${Ut(a)}`)})},async restore(){await Bt(n,s.href,async e=>{await Vt(e,i,!1),await Ht(e,i),await e.query(`ALTER DATABASE ${Ut(i)} RENAME TO ${Ut(o)}`);try{await e.query(`ALTER DATABASE ${Ut(a)} RENAME TO ${Ut(i)}`)}catch(t){throw await e.query(`ALTER DATABASE ${Ut(o)} RENAME TO ${Ut(i)}`).catch(()=>void 0),await Vt(e,i,!0).catch(()=>void 0),t}await Ht(e,o),await e.query(`DROP DATABASE ${Ut(o)}`)})}}}async function Bt(e,t,n){let r=new e.Client({connectionString:t});await r.connect();try{return await n(r)}finally{await r.end()}}async function Vt(e,t,n){await e.query(`ALTER DATABASE ${Ut(t)} ALLOW_CONNECTIONS ${n?`true`:`false`}`)}async function Ht(e,t){await e.query(`SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1 AND pid <> pg_backend_pid()`,[t])}function Ut(e){return`"${e.replaceAll(`"`,`""`)}"`}function Wt(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 Gt(e){return e.some(e=>R.basename(e)===`package.json`||R.basename(e).endsWith(`lock.yaml`)||R.basename(e)===`pnpm-workspace.yaml`)}function Kt(e){return e.some(e=>Gt([e])||/(^|\/)(panda\.config|vite|coreframe|tsconfig|drizzle)\.[^/]+$/.test(e)||/(^|\/)(drizzle|scripts|src\/api)(\/|$)/.test(e))}function qt(e){return e.some(e=>e===`src-flutter`||e.startsWith(`src-flutter/`))}async function Jt(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 Yt(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)&&!Xt(i)){await O(e).catch(()=>void 0),await Yt(e,t);return}throw Error(`Managed development is already owned by PID ${r}.`)}}function Xt(e){try{return p.kill(e,0),!0}catch(e){return!(e instanceof Error&&`code`in e&&e.code===`ESRCH`)}}async function Zt(e,t){e&&(await x(e,`utf8`).catch(()=>void 0))?.trim()===`${p.pid} ${t}`&&await O(e).catch(()=>void 0)}function Qt(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 de&&e.exitCode&&e.exitCode>0)return;throw e}}async function $t(e,n,r){try{return await t(e,[`merge-base`,`--is-ancestor`,n,r]),!0}catch(e){if(e instanceof de&&e.exitCode===1)return!1;throw e}}function en(e,t){return e.length===t.length&&[...e].sort().every((e,n)=>e===[...t].sort()[n])}function tn(e){return e.split(`\0`).filter(Boolean)}function nn(e){return e.split(/\r?\n/,1)[0]??``}function rn(e){return e.type===`retry-codex`?`Retrying Codex`:e.type===`retry-migration`?`Retrying database migration`:e.type===`retry-checks`?`Retrying project checks`:e.type===`retry-dev-alignment`?`Retrying dev alignment`:e.type===`retry-fetch`?`Fetching upstream updates`: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{xe as isManagedDevCheckout,Se as isPrimaryCheckout,Ce as startManagedDevSession};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coreframe/dev",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.39",
|
|
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.29",
|
|
40
39
|
"@coreframe/config": "^0.1.19",
|
|
41
|
-
"@coreframe/
|
|
42
|
-
"@coreframe/dev-supervisor": "^0.1.25"
|
|
40
|
+
"@coreframe/db": "^0.1.29",
|
|
41
|
+
"@coreframe/dev-supervisor": "^0.1.25",
|
|
42
|
+
"@coreframe/dev-contracts": "^0.1.14"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/node": "^26.1.0",
|