@coreframe/dev 0.1.31 → 0.1.33

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