@coreframe/dev 0.1.16 → 0.1.18

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.
@@ -1 +1 @@
1
- import{access as e,appendFile as t,chmod as n,mkdir as r,readFile as i,rename as a,rm as o,stat as s,unlink as c,writeFile as l}from"node:fs/promises";import u from"node:process";import{readFileSync as d}from"node:fs";const f={access:e,appendFile:t,chmod:n,mkdir:r,readFile:i,readFileSync:d,rename:a,rm:o,stat:s,unlink:c,writeFile:l},p={cwd:u.cwd.bind(u),env:u.env,execPath:u.execPath,kill:u.kill.bind(u),once:u.once.bind(u),pid:u.pid,platform:u.platform};export{f as fs,p as process};
1
+ import e from"node:process";import{access as t,appendFile as n,chmod as r,mkdir as i,readFile as a,rename as o,rm as s,stat as c,unlink as l,writeFile as u}from"node:fs/promises";import{readFileSync as d}from"node:fs";const f={access:t,appendFile:n,chmod:r,mkdir:i,readFile:a,readFileSync:d,rename:o,rm:s,stat:c,unlink:l,writeFile:u},p={cwd:e.cwd.bind(e),env:e.env,execPath:e.execPath,kill:e.kill.bind(e),once:e.once.bind(e),pid:e.pid,platform:e.platform};export{f as fs,p as process};
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { CodexTaskOpenResult, CodexTaskStartOptions, CodexTaskStartResult, openCodexThread, startCodexTask } from "./codex-task.js";
2
1
  import { coreframeDevHttpsConfig, devHttpsCertEnv, devHttpsKeyEnv, prepareDevHttps } from "./https.js";
3
2
  import { ManagedDevSession, isManagedDevCheckout, isPrimaryCheckout, startManagedDevSession } from "./managed-dev.js";
4
3
  import { connectDevSupervisor, runDevSupervisorProcess } from "./supervisor.js";
@@ -7,7 +6,7 @@ export * from "@coreframe/dev-supervisor";
7
6
 
8
7
  //#region src/index.d.ts
9
8
  declare namespace index_d_exports {
10
- export { CodexTaskOpenResult, CodexTaskStartOptions, CodexTaskStartResult, ManagedDevSession, connectDevSupervisor, coreframeDevHttpsConfig, createDevStartupTiming, devHttpsCertEnv, devHttpsKeyEnv, devStartupStartedAtEnv, devStartupTimingsEnv, isManagedDevCheckout, isPrimaryCheckout, openCodexThread, prepareDevHttps, runDevSupervisorProcess, startCodexTask, startManagedDevSession };
9
+ export { ManagedDevSession, connectDevSupervisor, coreframeDevHttpsConfig, createDevStartupTiming, devHttpsCertEnv, devHttpsKeyEnv, devStartupStartedAtEnv, devStartupTimingsEnv, isManagedDevCheckout, isPrimaryCheckout, prepareDevHttps, runDevSupervisorProcess, startManagedDevSession };
11
10
  }
12
11
  //#endregion
13
- export { CodexTaskOpenResult, CodexTaskStartOptions, CodexTaskStartResult, ManagedDevSession, connectDevSupervisor, coreframeDevHttpsConfig, createDevStartupTiming, devHttpsCertEnv, devHttpsKeyEnv, devStartupStartedAtEnv, devStartupTimingsEnv, isManagedDevCheckout, isPrimaryCheckout, openCodexThread, prepareDevHttps, runDevSupervisorProcess, startCodexTask, startManagedDevSession };
12
+ export { ManagedDevSession, connectDevSupervisor, coreframeDevHttpsConfig, createDevStartupTiming, devHttpsCertEnv, devHttpsKeyEnv, devStartupStartedAtEnv, devStartupTimingsEnv, isManagedDevCheckout, isPrimaryCheckout, prepareDevHttps, runDevSupervisorProcess, startManagedDevSession };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import{openCodexThread as e,startCodexTask as t}from"./codex-task.js";import{isManagedDevCheckout as n,isPrimaryCheckout as r,startManagedDevSession as i}from"./managed-dev.js";import{connectDevSupervisor as a,runDevSupervisorProcess as o}from"./supervisor.js";import{coreframeDevHttpsConfig as s,devHttpsCertEnv as c,devHttpsKeyEnv as l,prepareDevHttps as u}from"./https.js";import{createDevStartupTiming as d,devStartupStartedAtEnv as f,devStartupTimingsEnv as p}from"./timing.js";export*from"@coreframe/dev-supervisor";export{a as connectDevSupervisor,s as coreframeDevHttpsConfig,d as createDevStartupTiming,c as devHttpsCertEnv,l as devHttpsKeyEnv,f as devStartupStartedAtEnv,p as devStartupTimingsEnv,n as isManagedDevCheckout,r as isPrimaryCheckout,e as openCodexThread,u as prepareDevHttps,o as runDevSupervisorProcess,t as startCodexTask,i as startManagedDevSession};
1
+ import"./_virtual/_rolldown/runtime.js";import{isManagedDevCheckout as e,isPrimaryCheckout as t,startManagedDevSession as n}from"./managed-dev.js";import{connectDevSupervisor as r,runDevSupervisorProcess as i}from"./supervisor.js";import{coreframeDevHttpsConfig as a,devHttpsCertEnv as o,devHttpsKeyEnv as s,prepareDevHttps as c}from"./https.js";import{createDevStartupTiming as l,devStartupStartedAtEnv as u,devStartupTimingsEnv as d}from"./timing.js";export*from"@coreframe/dev-supervisor";export{r as connectDevSupervisor,a as coreframeDevHttpsConfig,l as createDevStartupTiming,o as devHttpsCertEnv,s as devHttpsKeyEnv,u as devStartupStartedAtEnv,d as devStartupTimingsEnv,e as isManagedDevCheckout,t as isPrimaryCheckout,c as prepareDevHttps,i as runDevSupervisorProcess,n as startManagedDevSession};
@@ -1,7 +1,7 @@
1
- import{managedDevCodexHighArgs as e,managedDevCodexMaxArgs as t,managedDevCodexMaxAuthor as n}from"./codex-model.js";import{ensurePandaCodegen as r}from"./panda-codegen.js";import{access as i,copyFile as a,mkdir as o,mkdtemp as s,open as c,readFile as l,realpath as u,rm as d,unlink as f,writeFile as p}from"node:fs/promises";import m from"node:path";import h from"node:process";import g,{SubprocessError as _}from"nano-spawn";import{pathToFileURL as v}from"node:url";import{createHash as y,randomBytes as b}from"node:crypto";import{constants as x,watch as S}from"node:fs";import{stripVTControlCharacters as C}from"node:util";import{resolve as w}from"import-meta-resolve";const T=`refs/heads/main`,E=`refs/heads/dev`,ee=`refs/remotes/origin/main`,te=/^[a-z][a-z0-9-]*(?:\([^)]+\))?!?:\s+\S/i,ne=`coreframe-managed-dev-codex-completion.json`,re=`coreframe-managed-dev-setup-failure.json`;async function D(e=h.cwd()){let t=await ue(e);return t.primary&&t.branch===`main`&&t.head===t.main}async function O(e=h.cwd()){try{let{commonDir:t,gitDir:n}=await k(e);return n===t}catch{return!1}}async function k(e){let t=await u(await q(e,[`rev-parse`,`--show-toplevel`])),n=await u(e),r=m.resolve(n,await q(e,[`rev-parse`,`--git-dir`])),i=m.resolve(n,await q(e,[`rev-parse`,`--git-common-dir`]));return{commonDir:i,gitDir:r,primary:t===n&&r===i}}async function A({config:e,cwd:t=h.cwd(),env:n=h.env,localCheckInterval:i=1e3,onFlutterRestart:a=()=>void 0,onRestart:o=()=>void 0,onStatusChange:s=()=>void 0,remoteCheckInterval:c=6e4,runCheck:l=e=>_e(t,n,e),watchState:u=de}){let d=n,_={mode:`waiting`,warnings:[]},v=!1,y=!1,x=!1,S=!1,C,w,D,O,k,A,ae=[],j,oe,le=Promise.resolve(),M=()=>{v||s(_)},P=async({fetch:e=!1}={})=>{if(!(!y||v||!w)){if(x){S=!0;return}try{let[n,r,i]=await Promise.all([q(t,[`rev-parse`,`--abbrev-ref`,`HEAD`]),q(t,[`rev-parse`,`HEAD`]),q(t,[`rev-parse`,T])]);if(n!==`main`||r!==i){_={message:`Managed synchronization is paused until the primary checkout is back on local main.`,mode:`waiting`,warnings:[]};return}r!==C&&(C=r,j=void 0);let a=await N(t);if(a.tracked||a.untracked.length>0){_={..._,currentCommit:C,draft:a,message:void 0,mode:`managed`,proposal:z(a.fingerprint),target:void 0};return}if(e&&await J(t,[`remote`,`get-url`,`origin`]))try{await K(t,[`fetch`,`origin`,`+refs/heads/main:${ee}`])}catch{}let o=await J(t,[`rev-parse`,E]),s=await J(t,[`rev-parse`,ee]),c=[...o?[{commit:o,source:`dev`}]:[],...s?[{commit:s,source:`upstream`}]:[]],l;for(let e of c)if(!await Ae(t,e.commit,C)){l=e;break}_={..._,currentCommit:C,draft:void 0,message:void 0,mode:`managed`,proposal:void 0,target:l===void 0?void 0:await Ee(t,C,l.commit,l.source)}}catch(e){_={..._,message:Z(e),warnings:[Z(e)]}}finally{M()}}},F=()=>{clearTimeout(A),A=setTimeout(()=>void P(),50),A.unref()},I=(e,t)=>{let n=async()=>{let n=[{command:`pnpm typecheck`,status:`running`},{command:`pnpm test`,status:`pending`}],r=()=>{_={..._,checks:{commit:e,commands:structuredClone(n),trigger:t}},M()};r();for(let[e,t]of[`typecheck`,`test`].entries()){e>0&&(n[e].status=`running`,r());try{await l(t),n[e].status=`passed`}catch(t){n[e].status=`failed`,n[e].failureId=b(12).toString(`hex`),n[e].output=ve(t)}r()}};le=le.then(n,n)},ge=async()=>{if(y||v)return;let e=await ue(t);if(!e.primary){_={message:`Managed development only runs from the primary checkout.`,mode:`unmanaged`,warnings:[]},M();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}`),_={message:t,mode:`unmanaged`,warnings:[]},M();return}D=m.join(e.commonDir,`coreframe-managed-dev.lock`),await De(D),await J(t,[`rev-parse`,`--verify`,E])||await K(t,[`branch`,`dev`,e.head]),w=e,C=e.head,y=!0,_={codexCompletion:await ie(e.commonDir),currentCommit:e.head,mode:`managed`,setupFailure:await ce(e.commonDir,e.head),warnings:[]},_.setupFailure||await Se({commit:e.head,flutterRestartRequired:!1,restartRequired:!1}),M(),ae=await u(e,F),O=setInterval(()=>{_.draft&&P()},i),O.unref(),k=setInterval(()=>void P({fetch:!0}),c),k.unref(),await P(),P({fetch:!0})},L=async(e,{onCodexEvent:n=()=>void 0}={})=>{if(!y||_.mode!==`managed`)throw Error(`Managed development is not active.`);if(x)throw Error(`Another managed development action is already running.`);let r=[],i=[],a,o,s=e=>{e.phase===`start`?(i=e.commits,a=e.totalCommits,r.splice(0,r.length,e.message)):e.phase===`message`?r.push(e.message):e.phase===`complete`?o=e.finalMessage:e.phase===`progress`&&(i=e.commits,a=e.totalCommits??a),n(e)};x=!0,_={..._,busy:Ne(e),message:void 0};try{if(M(),e.type===`acknowledge-codex`)_.codexCompletion?.id===e.id&&await Ie();else if(e.type===`dismiss-check`)_.checks&&(_={..._,checks:{..._.checks,commands:_.checks.commands.map(t=>t.failureId===e.failureId?{...t,dismissed:!0}:t)}});else if(e.type===`reject`)_={..._,draft:void 0,proposal:void 0};else if(e.type===`prepare`){let n=R(e.target),r=await N(t);r.tracked||r.untracked.length>0?_={..._,draft:r,proposal:z(r.fingerprint)}:await xe({onCodexEvent:s,source:n.source,target:e.target})}else if(e.type===`message`){let n=await B(e.fingerprint,e.untracked),r=z(n.fingerprint);if(r===void 0){try{if(oe??=pe(`codex`,d),!await oe)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 fe(t,d,n.untracked)}catch(e){r=``,_={..._,warnings:[..._.warnings,`Codex could not generate a commit message: ${Z(e)}`]}}j={fingerprint:n.fingerprint,message:r}}_={..._,draft:n,proposal:r}}else if(e.type===`commit`){let t=await be(e);_={..._,currentCommit:t,draft:void 0,message:void 0,proposal:void 0,target:void 0},F()}else if(e.type===`retry-install`)await H();else if(e.type===`retry-codegen`)await U();else if(e.type===`reset-database`)await W();else{let n=R(e.target),r=await N(t);if(r.tracked||r.untracked.length>0){if(!e.fingerprint||!e.untracked)throw Error(`Refresh requires the current working-tree confirmation.`);if(await B(e.fingerprint,e.untracked),!e.message||!te.test(Me(e.message)))throw Error(`Enter a commit message with a valid Conventional Commits header.`)}await xe({fingerprint:e.fingerprint,message:e.message,onCodexEvent:s,source:n.source,target:e.target,untracked:e.untracked})}}finally{x=!1,_={..._,busy:void 0},M(),S&&(S=!1,F())}return o&&await Fe(o,r,i,a),{status:_}},R=e=>{if(!_.target||_.target.commit!==e)throw Error(`The offered update changed. Review the latest target before refreshing.`);return _.target},z=e=>j?.fingerprint===e?j.message:void 0,B=async(e,n)=>{let r=await N(t);if(r.fingerprint!==e)throw j=void 0,Error(`Working-tree changes changed; generate a new commit message.`);if(!je(r.untracked,n))throw Error(`Include every untracked file or remove it before refreshing.`);return r},be=async({fingerprint:e,message:n,untracked:r})=>{let i=await B(e,r);if(!n||!te.test(Me(n)))throw Error(`Enter a commit message with a valid Conventional Commits header.`);await K(t,[`add`,`--update`]),i.untracked.length>0&&await K(t,[`add`,`--`,...r]),await K(t,[`commit`,`--message`,n],{env:{GIT_EDITOR:`true`}});let a=await q(t,[`rev-parse`,`HEAD`]);return C=a,j=void 0,a},xe=async({fingerprint:e,message:n,onCodexEvent:r=()=>void 0,source:i,target:a,untracked:o=[]})=>{R(a);let s=await q(t,[`rev-parse`,`HEAD`]),c,l,u=await N(t);if(u.tracked||u.untracked.length>0){if(!e||u.fingerprint!==e||!je(u.untracked,o))throw Error(`Working-tree changes changed; review them before refreshing.`);await K(t,[`add`,`--update`]),o.length>0&&await K(t,[`add`,`--`,...o]),await K(t,[`commit`,`--message`,n],{env:{GIT_EDITOR:`true`}}),c=await q(t,[`rev-parse`,`HEAD`]),C=c,l=`refs/coreframe/recovery/${Date.now()}-${c.slice(0,12)}`,await K(t,[`update-ref`,l,c])}let f=c??s,p;try{if(p=await me({cwd:t,env:d,localMain:f,onCodexEvent:r,source:i,target:a}),await q(t,[`rev-parse`,`HEAD`])!==f)throw Error(`HEAD changed while the accepted update was being prepared.`);if(await q(t,[`rev-parse`,T])!==f)throw Error(`Local main changed while the accepted update was being prepared.`);await he(t,p,f),S=!0,C=p.commit,await K(t,[`reset`,`--hard`,p.commit]);let e=Y(await q(t,[`diff`,`--name-only`,`-z`,s,p.commit])),n=we(e),o=Te(e);j=void 0,l&&await K(t,[`update-ref`,`-d`,l]),_={..._,currentCommit:p.commit,draft:void 0,proposal:void 0,setupFailure:void 0,target:void 0},await V({installDependencies:Ce(e),flutterRestartRequired:o,restartRequired:n,trigger:`synchronization`})}catch(e){let t=l?` Recovery commit: ${l}.`:``;throw _={..._,currentCommit:C,message:`${Z(e)}${t}`},e}},Se=async({commit:e,flutterRestartRequired:n,restartRequired:i})=>{try{return await r({cwd:t,env:d}),!0}catch(t){return await Q({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:i,stage:`codegen`}),!1}},V=async({flutterRestartRequired:n,installDependencies:r,restartRequired:i,trigger:s})=>{let c=C;if(r)try{await Oe([`install`,`--frozen-lockfile`])}catch(e){await Q({command:`pnpm install --frozen-lockfile`,commit:c,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 Se({commit:c,flutterRestartRequired:n,restartRequired:i})){try{await ye({config:e,cwd:t,env:d})}catch(e){await Q({command:`pnpm db migrate-local`,commit:c,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 $(),I(c,s),n&&await a(),i&&o()}},H=async()=>{let e=G(`dependencies`);await $(),await V({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!0,restartRequired:e.restartRequired,trigger:`dependency-recovery`})},U=async()=>{let e=G(`codegen`);await $(),await V({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!1,restartRequired:e.restartRequired,trigger:`codegen-recovery`})},W=async()=>{let e=G(`migration`);try{await Oe([`db`,`setup`])}catch(t){await Q({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 $(),I(e.commit,`database-recovery`),e.flutterRestartRequired===!0&&await a(),e.restartRequired&&o()},G=e=>{if(!_.setupFailure||_.setupFailure.stage!==e)throw Error(`There is no failed ${e} setup step to recover.`);return _.setupFailure},Oe=async e=>{await g(X(),e,{cwd:t,env:d})},Q=async({command:e,commit:t,error:n,flutterRestartRequired:r,message:i,restartRequired:a,stage:o})=>{let s=ve(n).slice(-1e5),c={command:e,commit:t,message:i,output:s,...r?{flutterRestartRequired:!0}:void 0,restartRequired:a,stage:o};_={..._,setupFailure:c,target:void 0},console.error(`Coreframe managed development setup failed (${e}): ${i}\n${s}`);let l=Pe();l&&await p(l,`${JSON.stringify(c)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development setup failure: ${Z(e)}`)})},$=async()=>{_={..._,setupFailure:void 0};let e=Pe();e&&await f(e).catch(e=>{e instanceof Error&&`code`in e&&e.code===`ENOENT`||console.warn(`Could not clear the managed-development setup failure: ${Z(e)}`)})},Pe=()=>w?m.join(w.commonDir,re):void 0,Fe=async(e,t,n,r)=>{let i={commits:n,finalMessage:e,id:b(16).toString(`hex`),messages:se(t),...r===void 0?void 0:{totalCommits:r}};_={..._,codexCompletion:i},w&&await p(m.join(w.commonDir,ne),`${JSON.stringify(i)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development Codex result: ${Z(e)}`)}),M()},Ie=async()=>{_={..._,codexCompletion:void 0},w&&await f(m.join(w.commonDir,ne)).catch(e=>{if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e})};return{action:L,activate:ge,getStatus:()=>_,async close(){if(!v){v=!0,clearInterval(O),clearInterval(k),clearTimeout(A);for(let e of ae)e.close();await ke(D)}}}}async function ie(e){let t=m.join(e,ne);try{let e=JSON.parse(await l(t,`utf8`));if(ae(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: ${Z(e)}`)}await f(t).catch(()=>void 0)}function ae(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(oe)&&(t.totalCommits===void 0||Number.isInteger(t.totalCommits)&&t.totalCommits>=0)&&(t.commits===void 0||Array.isArray(t.commits)&&t.commits.every(j))}function j(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 oe(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=m.join(e,re);try{let e=JSON.parse(await l(n,`utf8`));if(le(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: ${Z(e)}`)}await f(n).catch(()=>void 0)}function le(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 ue(e){let t=await k(e);return{branch:M(await q(e,[`rev-parse`,`--abbrev-ref`,`HEAD`])),commonDir:t.commonDir,gitDir:t.gitDir,head:await q(e,[`rev-parse`,`HEAD`]),main:await q(e,[`rev-parse`,T]),primary:t.primary}}function M(e){return e===`HEAD`?void 0:e}async function de(e,t){let n=[e.gitDir,m.join(e.commonDir,`refs`,`heads`)],r=[];for(let e of n)try{r.push(S(e,{persistent:!1},t))}catch{}return r}async function N(e){let[t,n,r]=await Promise.all([q(e,[`status`,`--porcelain`,`--untracked-files=no`]),q(e,[`diff`,`HEAD`,`--binary`]),q(e,[`ls-files`,`--others`,`--exclude-standard`,`-z`])]),i=Y(r).sort(),a=y(`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 fe(t,n,r){let i=[`Tracked changes:`,await q(t,[`diff`,`HEAD`,`--binary`])];for(let e of r){let n=await l(m.join(t,e));i.push(`\nUntracked file: ${e}\n`,n.toString(`utf8`))}let{stdout:a}=await g(`codex`,[`exec`,...e,`--ephemeral`,`--ignore-user-config`,`--sandbox`,`read-only`,`--cd`,t,`Return only a concise Conventional Commits message for the supplied working-tree changes. Use a body only when it adds material context.`],{cwd:t,env:n,stderr:`ignore`,stdin:{string:i.join(`
2
- `)}});return a.trim().replace(/^```(?:text)?\s*|\s*```$/g,``)}async function pe(e,t){let n=t.PATH??t.Path??t.path??``,r=h.platform===`win32`?(t.PATHEXT??`.COM;.EXE;.BAT;.CMD`).split(`;`):[``];for(let t of n.split(m.delimiter))for(let n of r)try{return await i(m.join(t||`.`,`${e}${n}`),x.X_OK),!0}catch{}return!1}async function me({cwd:e,env:t,localMain:n,onCodexEvent:r,source:i,target:a}){if(i===`dev`&&await Ae(e,n,a))return{commit:a,devTarget:a};let s=m.resolve(e,await q(e,[`rev-parse`,`--git-common-dir`])),c=m.join(s,`coreframe-managed-dev`);await o(c,{recursive:!0});let l=b(8).toString(`hex`),u=m.join(c,`integration-${l}`);try{if(await K(e,[`worktree`,`add`,`--detach`,u,n]),n!==a)if(i===`dev`)await P(u,t,[`merge`,`--no-edit`,`--no-ff`,`--allow-unrelated-histories`,`--message`,`Merge dev into main`,a],`merge`,r);else{let e=await J(u,[`merge-base`,n,a]),i=Number(await q(u,[`rev-list`,`--count`,e?`${e}..HEAD`:`HEAD`]));await P(u,t,e?[`rebase`,`--onto`,a,e]:[`rebase`,`--root`,`--onto`,a],`rebase`,r,a,i)}return{commit:await q(u,[`rev-parse`,`HEAD`]),devTarget:i===`dev`?a:void 0}}finally{await K(e,[`worktree`,`remove`,`--force`,u]).catch(()=>void 0),await d(u,{force:!0,recursive:!0})}}async function he(e,t,n){let r=async r=>{let i=[`start`,`update ${T} ${t.commit} ${n}`];r&&t.devTarget&&i.push(t.devTarget===t.commit?`verify ${E} ${t.devTarget}`:`update ${E} ${t.commit} ${t.devTarget}`),i.push(`prepare`,`commit`),await g(`git`,[`update-ref`,`--stdin`],{cwd:e,stdin:{string:`${i.join(`
3
- `)}\n`}})};try{await r(!0)}catch(i){if(!t.devTarget)throw i;let a;try{a=await Promise.all([q(e,[`rev-parse`,T]),J(e,[`rev-parse`,E])])}catch{throw i}let[o,s]=a;if(o!==n||s===t.devTarget)throw i;await r(!1)}}async function P(e,t,n,r,i,a,o=0){try{await K(e,n,{env:{GIT_EDITOR:`true`}});return}catch(n){let s=await R(e);if(s.length===0)throw n;try{for(;s.length>0;){await F(e,t,r,s,a?await I(e,a):[],o,i),await K(e,[`diff`,`--check`]),await K(e,[`add`,`--all`]);let n=await R(e);if(n.length>0)throw Error(`Codex left unresolved paths: ${n.join(`, `)}`);try{await K(e,[r,`--continue`],{env:{GIT_EDITOR:`true`}})}catch(t){if(s=await R(e),s.length===0)throw t;i({commits:a?await I(e,a):[],phase:`progress`,totalCommits:o});continue}i({commits:a?await I(e,a):[],phase:`progress`,totalCommits:o}),s=await R(e)}return}catch(t){throw await K(e,[r,`--abort`]).catch(()=>void 0),Error(`Codex could not resolve ${r} conflicts: ${Z(t)}`)}}}async function F(e,r,i,a,o,s,c){let l=`Resolve the current Git ${i} conflicts cleanly. Edit only files needed for the resolution, preserve intended behavior from both sides, and remove all conflict markers. Do not run pnpm test or any other test suite; managed development will run pnpm test after you finish and report any failures. You may run pnpm typecheck and pnpm format if useful. Do not stage files or run Git continuation commands. Conflicted paths: ${a.join(`, `)}`;c({commits:o,message:{kind:`user`,text:l},phase:`start`,totalCommits:s});let u=g(`codex`,[`exec`,...t,`--ephemeral`,`--ignore-user-config`,`--json`,`--sandbox`,`workspace-write`,`--cd`,e,l],{cwd:e,env:r,stdin:`ignore`}),d=``,f=[];try{await Promise.all([L(u.stdout,e=>{let t=ge(e,n);t&&(t.kind===`agent`&&(d=t.text),c({message:t,phase:`message`}))}),L(u.stderr,e=>f.push(e))])}catch(e){c({phase:`error`});let t=f.join(`
4
- `).trim();throw t?Error(`${Z(e)}\n${t}`):e}c({finalMessage:d||`Codex resolved the conflicts.`,phase:`complete`})}async function I(e,t){let n=await q(e,[`log`,`--reverse`,`--format=%H%x00%s`,`${t}..HEAD`]);return n?n.split(`
5
- `).map(e=>{let[t,n=``]=e.split(`\0`,2);return{commit:t,shortCommit:t.slice(0,12),subject:n}}):[]}function ge(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 L(e,t){for await(let n of e)t(n)}async function R(e){return Y(await q(e,[`diff`,`--name-only`,`--diff-filter=U`,`-z`]))}async function _e(e,t,n){await g(X(),[n],{cwd:e,env:t})}function ve(e){let t=z(e);if(t){let e=C(t).trim();if(e)return e}return C(Z(e))}function z(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 ye({config:e,cwd:t,env:n}){if(!e.database)return;let r=await B({config:e,cwd:t,env:n});try{await g(X(),[`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: ${Z(e)}`)}),await d(r.directory,{force:!0,recursive:!0})}async function B({config:e,cwd:t,env:n}){let r=m.join(t,`.coreframe`,`managed-dev-backups`);await o(r,{recursive:!0});let i=await s(m.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 be(m.join(t,`.coreframe`,r),m.join(i,r))&&n.add(r);return{directory:i,async discard(){},async restore(){for(let r of e){let e=m.join(t,`.coreframe`,r);n.has(r)?await a(m.join(i,r),e):await d(e,{force:!0})}}}}if(!n.DATABASE_URL)throw Error(`DATABASE_URL is required to snapshot local PostgreSQL.`);let c=await xe(t);if(c)return Se({directory:i,connectionString:n.DATABASE_URL,postgres:c});let l=m.join(i,`database.dump`),u=G(n,n.DATABASE_URL);return await g(`pg_dump`,[`--format=custom`,`--file`,l],{cwd:t,env:u,stdin:`ignore`}),{directory:i,async discard(){},async restore(){await g(`pg_restore`,[`--clean`,`--if-exists`,`--no-owner`,`--dbname`,u.PGDATABASE,l],{cwd:t,env:u,stdin:`ignore`})}}}async function be(e,t){try{return await a(e,t),!0}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e;return!1}}async function xe(e){let t=JSON.parse(await l(m.join(e,`package.json`),`utf8`));if(!(!t.dependencies?.pg&&!t.devDependencies?.pg&&!t.optionalDependencies?.pg))try{return await import(w(`pg`,v(m.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 Se({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_${b(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 H(c,i,!1),await U(c,i),await c.query(`CREATE DATABASE ${W(a)} WITH TEMPLATE ${W(i)}`),await H(c,a,!0)}finally{await H(c,i,!0).catch(()=>void 0),await c.end()}return{directory:e,async discard(){await V(n,s.href,async e=>{await U(e,a),await e.query(`DROP DATABASE ${W(a)}`)})},async restore(){await V(n,s.href,async e=>{await H(e,i,!1),await U(e,i),await e.query(`ALTER DATABASE ${W(i)} RENAME TO ${W(o)}`);try{await e.query(`ALTER DATABASE ${W(a)} RENAME TO ${W(i)}`)}catch(t){throw await e.query(`ALTER DATABASE ${W(o)} RENAME TO ${W(i)}`).catch(()=>void 0),await H(e,i,!0).catch(()=>void 0),t}await U(e,o),await e.query(`DROP DATABASE ${W(o)}`)})}}}async function V(e,t,n){let r=new e.Client({connectionString:t});await r.connect();try{return await n(r)}finally{await r.end()}}async function H(e,t,n){await e.query(`ALTER DATABASE ${W(t)} ALLOW_CONNECTIONS ${n?`true`:`false`}`)}async function U(e,t){await e.query(`SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1 AND pid <> pg_backend_pid()`,[t])}function W(e){return`"${e.replaceAll(`"`,`""`)}"`}function G(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 Ce(e){return e.some(e=>m.basename(e)===`package.json`||m.basename(e).endsWith(`lock.yaml`)||m.basename(e)===`pnpm-workspace.yaml`)}function we(e){return e.some(e=>Ce([e])||/(^|\/)(panda\.config|vite|coreframe|tsconfig|drizzle)\.[^/]+$/.test(e)||/(^|\/)(drizzle|scripts|src\/api)(\/|$)/.test(e))}function Te(e){return e.some(e=>e===`src-flutter`||e.startsWith(`src-flutter/`))}async function Ee(e,t,n,r){return{commit:n,commits:(await q(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 q(e,[`show`,`-s`,`--format=%s`,n])}}async function De(e){try{let t=await c(e,`wx`);await t.writeFile(`${h.pid}\n`),await t.close()}catch(t){if(!(t instanceof Error&&`code`in t&&t.code===`EEXIST`))throw t;let n=(await l(e,`utf8`).catch(()=>`unknown`)).trim(),r=Number(n);if(Number.isInteger(r)&&!Oe(r)){await f(e).catch(()=>void 0),await De(e);return}throw Error(`Managed development is already owned by PID ${n}.`)}}function Oe(e){try{return h.kill(e,0),!0}catch(e){return!(e instanceof Error&&`code`in e&&e.code===`ESRCH`)}}async function ke(e){e&&(await l(e,`utf8`).catch(()=>void 0))?.trim()===String(h.pid)&&await f(e).catch(()=>void 0)}async function K(e,t,{env:n}={}){return g(`git`,t,{cwd:e,env:n,stdin:`ignore`})}async function q(e,t){return(await K(e,t)).stdout.trim()}async function J(e,t){try{return await q(e,t)||void 0}catch(e){if(e instanceof _&&e.exitCode&&e.exitCode>0)return;throw e}}async function Ae(e,t,n){try{return await K(e,[`merge-base`,`--is-ancestor`,t,n]),!0}catch(e){if(e instanceof _&&e.exitCode===1)return!1;throw e}}function je(e,t){return e.length===t.length&&[...e].sort().every((e,n)=>e===[...t].sort()[n])}function Y(e){return e.split(`\0`).filter(Boolean)}function Me(e){return e.split(/\r?\n/,1)[0]??``}function Ne(e){return e.type===`acknowledge-codex`?`Acknowledging Codex result`: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 X(){return h.platform===`win32`?`pnpm.cmd`:`pnpm`}function Z(e){return e instanceof Error?e.message:String(e)}export{D as isManagedDevCheckout,O as isPrimaryCheckout,A as startManagedDevSession};
1
+ import{managedDevCodexHighArgs as e,managedDevCodexMaxArgs as t,managedDevCodexMaxAuthor as n}from"./codex-model.js";import{ensurePandaCodegen as r}from"./panda-codegen.js";import i from"node:process";import{access as a,copyFile as o,mkdir as s,mkdtemp as c,open as l,readFile as u,realpath as d,rm as f,unlink as p,writeFile as ee}from"node:fs/promises";import{pathToFileURL as m}from"node:url";import{createHash as h,randomBytes as g}from"node:crypto";import{constants as _,watch as v}from"node:fs";import y from"node:path";import{stripVTControlCharacters as b}from"node:util";import{resolve as x}from"import-meta-resolve";import S,{SubprocessError as C}from"nano-spawn";const w=`refs/heads/main`,T=`refs/heads/dev`,te=`refs/remotes/origin/main`,ne=/^[a-z][a-z0-9-]*(?:\([^)]+\))?!?:\s+\S/i,re=`coreframe-managed-dev-codex-completion.json`,ie=`coreframe-managed-dev-setup-failure.json`;async function E(e=i.cwd()){let t=await le(e);return t.primary&&t.branch===`main`&&t.head===t.main}async function D(e=i.cwd()){try{let{commonDir:t,gitDir:n}=await O(e);return n===t}catch{return!1}}async function O(e){let t=await d(await J(e,[`rev-parse`,`--show-toplevel`])),n=await d(e),r=y.resolve(n,await J(e,[`rev-parse`,`--git-dir`])),i=y.resolve(n,await J(e,[`rev-parse`,`--git-common-dir`]));return{commonDir:i,gitDir:r,primary:t===n&&r===i}}async function k({config:e,cwd:t=i.cwd(),env:n=i.env,localCheckInterval:a=1e3,onFlutterRestart:o=()=>void 0,onRestart:s=()=>void 0,onStatusChange:c=()=>void 0,remoteCheckInterval:l=6e4,runCheck:u=e=>ge(t,n,e),watchState:d=ue}){let f=n,m={mode:`waiting`,warnings:[]},h=!1,_=!1,v=!1,b=!1,x,C,E,D,O,k,A=[],j,M,ce=Promise.resolve(),N=()=>{h||c(m)},F=async({fetch:e=!1}={})=>{if(!(!_||h||!C)){if(v){b=!0;return}try{let[n,r,i]=await Promise.all([J(t,[`rev-parse`,`--abbrev-ref`,`HEAD`]),J(t,[`rev-parse`,`HEAD`]),J(t,[`rev-parse`,w])]);if(n!==`main`||r!==i){m={message:`Managed synchronization is paused until the primary checkout is back on local main.`,mode:`waiting`,warnings:[]};return}r!==x&&(x=r,j=void 0);let a=await P(t);if(a.tracked||a.untracked.length>0){m={...m,currentCommit:x,draft:a,message:void 0,mode:`managed`,proposal:B(a.fingerprint),target:void 0};return}if(e&&await Y(t,[`remote`,`get-url`,`origin`]))try{await q(t,[`fetch`,`origin`,`+refs/heads/main:${te}`])}catch{}let o=await Y(t,[`rev-parse`,T]),s=await Y(t,[`rev-parse`,te]),c=[...o?[{commit:o,source:`dev`}]:[],...s?[{commit:s,source:`upstream`}]:[]],l;for(let e of c)if(!await ke(t,e.commit,x)){l=e;break}m={...m,currentCommit:x,draft:void 0,message:void 0,mode:`managed`,proposal:void 0,target:l===void 0?void 0:await Te(t,x,l.commit,l.source)}}catch(e){m={...m,message:Z(e),warnings:[Z(e)]}}finally{N()}}},I=()=>{clearTimeout(k),k=setTimeout(()=>void F(),50),k.unref()},L=(e,t)=>{let n=async()=>{let n=[{command:`pnpm typecheck`,status:`running`},{command:`pnpm test`,status:`pending`}],r=()=>{m={...m,checks:{commit:e,commands:structuredClone(n),trigger:t}},N()};r();for(let[e,t]of[`typecheck`,`test`].entries()){e>0&&(n[e].status=`running`,r());try{await u(t),n[e].status=`passed`}catch(t){n[e].status=`failed`,n[e].failureId=g(12).toString(`hex`),n[e].output=_e(t)}r()}};ce=ce.then(n,n)},he=async()=>{if(_||h)return;let e=await le(t);if(!e.primary){m={message:`Managed development only runs from the primary checkout.`,mode:`unmanaged`,warnings:[]},N();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}`),m={message:t,mode:`unmanaged`,warnings:[]},N();return}E=y.join(e.commonDir,`coreframe-managed-dev.lock`),await Ee(E),await Y(t,[`rev-parse`,`--verify`,T])||await q(t,[`branch`,`dev`,e.head]),C=e,x=e.head,_=!0,m={codexCompletion:await ae(e.commonDir),currentCommit:e.head,mode:`managed`,setupFailure:await se(e.commonDir,e.head),warnings:[]},m.setupFailure||await xe({commit:e.head,flutterRestartRequired:!1,restartRequired:!1}),N(),A=await d(e,I),D=setInterval(()=>{m.draft&&F()},a),D.unref(),O=setInterval(()=>void F({fetch:!0}),l),O.unref(),await F(),F({fetch:!0})},R=async(e,{onCodexEvent:n=()=>void 0}={})=>{if(!_||m.mode!==`managed`)throw Error(`Managed development is not active.`);if(v)throw Error(`Another managed development action is already running.`);let r=[],i=[],a,o,s=e=>{e.phase===`start`?(i=e.commits,a=e.totalCommits,r.splice(0,r.length,e.message)):e.phase===`message`?r.push(e.message):e.phase===`complete`?o=e.finalMessage:e.phase===`progress`&&(i=e.commits,a=e.totalCommits??a),n(e)};v=!0,m={...m,busy:Ne(e),message:void 0};try{if(N(),e.type===`acknowledge-codex`)m.codexCompletion?.id===e.id&&await Ie();else if(e.type===`dismiss-check`)m.checks&&(m={...m,checks:{...m.checks,commands:m.checks.commands.map(t=>t.failureId===e.failureId?{...t,dismissed:!0}:t)}});else if(e.type===`reject`)m={...m,draft:void 0,proposal:void 0};else if(e.type===`prepare`){let n=z(e.target),r=await P(t);r.tracked||r.untracked.length>0?m={...m,draft:r,proposal:B(r.fingerprint)}:await be({onCodexEvent:s,source:n.source,target:e.target})}else if(e.type===`message`){let n=await V(e.fingerprint,e.untracked),r=B(n.fingerprint);if(r===void 0){try{if(M??=fe(`codex`,f),!await M)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 de(t,f,n.untracked)}catch(e){r=``,m={...m,warnings:[...m.warnings,`Codex could not generate a commit message: ${Z(e)}`]}}j={fingerprint:n.fingerprint,message:r}}m={...m,draft:n,proposal:r}}else if(e.type===`commit`){let t=await ye(e);m={...m,currentCommit:t,draft:void 0,message:void 0,proposal:void 0,target:void 0},I()}else if(e.type===`retry-install`)await U();else if(e.type===`retry-codegen`)await W();else if(e.type===`reset-database`)await G();else{let n=z(e.target),r=await P(t);if(r.tracked||r.untracked.length>0){if(!e.fingerprint||!e.untracked)throw Error(`Refresh requires the current working-tree confirmation.`);if(await V(e.fingerprint,e.untracked),!e.message||!ne.test(Me(e.message)))throw Error(`Enter a commit message with a valid Conventional Commits header.`)}await be({fingerprint:e.fingerprint,message:e.message,onCodexEvent:s,source:n.source,target:e.target,untracked:e.untracked})}}finally{v=!1,m={...m,busy:void 0},N(),b&&(b=!1,I())}return o&&await Fe(o,r,i,a),{status:m}},z=e=>{if(!m.target||m.target.commit!==e)throw Error(`The offered update changed. Review the latest target before refreshing.`);return m.target},B=e=>j?.fingerprint===e?j.message:void 0,V=async(e,n)=>{let r=await P(t);if(r.fingerprint!==e)throw j=void 0,Error(`Working-tree changes changed; generate a new commit message.`);if(!Ae(r.untracked,n))throw Error(`Include every untracked file or remove it before refreshing.`);return r},ye=async({fingerprint:e,message:n,untracked:r})=>{let i=await V(e,r);if(!n||!ne.test(Me(n)))throw Error(`Enter a commit message with a valid Conventional Commits header.`);await q(t,[`add`,`--update`]),i.untracked.length>0&&await q(t,[`add`,`--`,...r]),await q(t,[`commit`,`--message`,n],{env:{GIT_EDITOR:`true`}});let a=await J(t,[`rev-parse`,`HEAD`]);return x=a,j=void 0,a},be=async({fingerprint:e,message:n,onCodexEvent:r=()=>void 0,source:i,target:a,untracked:o=[]})=>{z(a);let s=await J(t,[`rev-parse`,`HEAD`]),c,l,u=await P(t);if(u.tracked||u.untracked.length>0){if(!e||u.fingerprint!==e||!Ae(u.untracked,o))throw Error(`Working-tree changes changed; review them before refreshing.`);await q(t,[`add`,`--update`]),o.length>0&&await q(t,[`add`,`--`,...o]),await q(t,[`commit`,`--message`,n],{env:{GIT_EDITOR:`true`}}),c=await J(t,[`rev-parse`,`HEAD`]),x=c,l=`refs/coreframe/recovery/${Date.now()}-${c.slice(0,12)}`,await q(t,[`update-ref`,l,c])}let d=c??s,p;try{if(p=await pe({cwd:t,env:f,localMain:d,onCodexEvent:r,source:i,target:a}),await J(t,[`rev-parse`,`HEAD`])!==d)throw Error(`HEAD changed while the accepted update was being prepared.`);if(await J(t,[`rev-parse`,w])!==d)throw Error(`Local main changed while the accepted update was being prepared.`);await me(t,p,d),b=!0,x=p.commit,await q(t,[`reset`,`--hard`,p.commit]);let e=je(await J(t,[`diff`,`--name-only`,`-z`,s,p.commit])),n=Ce(e),o=we(e);j=void 0,l&&await q(t,[`update-ref`,`-d`,l]),m={...m,currentCommit:p.commit,draft:void 0,proposal:void 0,setupFailure:void 0,target:void 0},await H({installDependencies:Se(e),flutterRestartRequired:o,restartRequired:n,trigger:`synchronization`})}catch(e){let t=l?` Recovery commit: ${l}.`:``;throw m={...m,currentCommit:x,message:`${Z(e)}${t}`},e}},xe=async({commit:e,flutterRestartRequired:n,restartRequired:i})=>{try{return await r({cwd:t,env:f}),!0}catch(t){return await Q({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:i,stage:`codegen`}),!1}},H=async({flutterRestartRequired:n,installDependencies:r,restartRequired:i,trigger:a})=>{let c=x;if(r)try{await De([`install`,`--frozen-lockfile`])}catch(e){await Q({command:`pnpm install --frozen-lockfile`,commit:c,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:c,flutterRestartRequired:n,restartRequired:i})){try{await ve({config:e,cwd:t,env:f})}catch(e){await Q({command:`pnpm db migrate-local`,commit:c,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 $(),L(c,a),n&&await o(),i&&s()}},U=async()=>{let e=K(`dependencies`);await $(),await H({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!0,restartRequired:e.restartRequired,trigger:`dependency-recovery`})},W=async()=>{let e=K(`codegen`);await $(),await H({flutterRestartRequired:e.flutterRestartRequired===!0,installDependencies:!1,restartRequired:e.restartRequired,trigger:`codegen-recovery`})},G=async()=>{let e=K(`migration`);try{await De([`db`,`setup`])}catch(t){await Q({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 $(),L(e.commit,`database-recovery`),e.flutterRestartRequired===!0&&await o(),e.restartRequired&&s()},K=e=>{if(!m.setupFailure||m.setupFailure.stage!==e)throw Error(`There is no failed ${e} setup step to recover.`);return m.setupFailure},De=async e=>{await S(X(),e,{cwd:t,env:f})},Q=async({command:e,commit:t,error:n,flutterRestartRequired:r,message:i,restartRequired:a,stage:o})=>{let s=_e(n).slice(-1e5),c={command:e,commit:t,message:i,output:s,...r?{flutterRestartRequired:!0}:void 0,restartRequired:a,stage:o};m={...m,setupFailure:c,target:void 0},console.error(`Coreframe managed development setup failed (${e}): ${i}\n${s}`);let l=Pe();l&&await ee(l,`${JSON.stringify(c)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development setup failure: ${Z(e)}`)})},$=async()=>{m={...m,setupFailure:void 0};let e=Pe();e&&await p(e).catch(e=>{e instanceof Error&&`code`in e&&e.code===`ENOENT`||console.warn(`Could not clear the managed-development setup failure: ${Z(e)}`)})},Pe=()=>C?y.join(C.commonDir,ie):void 0,Fe=async(e,t,n,r)=>{let i={commits:n,finalMessage:e,id:g(16).toString(`hex`),messages:oe(t),...r===void 0?void 0:{totalCommits:r}};m={...m,codexCompletion:i},C&&await ee(y.join(C.commonDir,re),`${JSON.stringify(i)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development Codex result: ${Z(e)}`)}),N()},Ie=async()=>{m={...m,codexCompletion:void 0},C&&await p(y.join(C.commonDir,re)).catch(e=>{if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e})};return{action:R,activate:he,getStatus:()=>m,async close(){if(!h){h=!0,clearInterval(D),clearInterval(O),clearTimeout(k);for(let e of A)e.close();await Oe(E)}}}}async function ae(e){let t=y.join(e,re);try{let e=JSON.parse(await u(t,`utf8`));if(A(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: ${Z(e)}`)}await p(t).catch(()=>void 0)}function A(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(M)&&(t.totalCommits===void 0||Number.isInteger(t.totalCommits)&&t.totalCommits>=0)&&(t.commits===void 0||Array.isArray(t.commits)&&t.commits.every(j))}function j(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 M(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 oe(e){let t=new Set(e.filter(e=>e.kind===`user`)),n=[...t].reduce((e,t)=>e+t.text.length,0),r=!1;for(let i of[...e].reverse())if(i.kind!==`user`){if(n+i.text.length>1e5&&r)break;t.add(i),r=!0,n+=i.text.length}return e.filter(e=>t.has(e))}async function se(e,t){let n=y.join(e,ie);try{let e=JSON.parse(await u(n,`utf8`));if(ce(e)&&e.commit===t)return e}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;console.warn(`Could not read the managed-development setup failure: ${Z(e)}`)}await p(n).catch(()=>void 0)}function ce(e){if(!e||typeof e!=`object`)return!1;let t=e;return(t.command===`pnpm codegen`||t.command===`pnpm db migrate-local`||t.command===`pnpm db setup`||t.command===`pnpm install --frozen-lockfile`)&&typeof t.commit==`string`&&typeof t.message==`string`&&typeof t.output==`string`&&(t.flutterRestartRequired===void 0||typeof t.flutterRestartRequired==`boolean`)&&typeof t.restartRequired==`boolean`&&(t.stage===`codegen`||t.stage===`dependencies`||t.stage===`migration`)}async function le(e){let t=await O(e);return{branch:N(await J(e,[`rev-parse`,`--abbrev-ref`,`HEAD`])),commonDir:t.commonDir,gitDir:t.gitDir,head:await J(e,[`rev-parse`,`HEAD`]),main:await J(e,[`rev-parse`,w]),primary:t.primary}}function N(e){return e===`HEAD`?void 0:e}async function ue(e,t){let n=[e.gitDir,y.join(e.commonDir,`refs`,`heads`)],r=[];for(let e of n)try{r.push(v(e,{persistent:!1},t))}catch{}return r}async function P(e){let[t,n,r]=await Promise.all([J(e,[`status`,`--porcelain`,`--untracked-files=no`]),J(e,[`diff`,`HEAD`,`--binary`]),J(e,[`ls-files`,`--others`,`--exclude-standard`,`-z`])]),i=je(r).sort(),a=h(`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 de(t,n,r){let i=[`Tracked changes:`,await J(t,[`diff`,`HEAD`,`--binary`])];for(let e of r){let n=await u(y.join(t,e));i.push(`\nUntracked file: ${e}\n`,n.toString(`utf8`))}let{stdout:a}=await S(`codex`,[`exec`,...e,`--ephemeral`,`--ignore-user-config`,`--sandbox`,`read-only`,`--cd`,t,`Return only a concise Conventional Commits message for the supplied working-tree changes. Use a body only when it adds material context.`],{cwd:t,env:n,stderr:`ignore`,stdin:{string:i.join(`
2
+ `)}});return a.trim().replace(/^```(?:text)?\s*|\s*```$/g,``)}async function fe(e,t){let n=t.PATH??t.Path??t.path??``,r=i.platform===`win32`?(t.PATHEXT??`.COM;.EXE;.BAT;.CMD`).split(`;`):[``];for(let t of n.split(y.delimiter))for(let n of r)try{return await a(y.join(t||`.`,`${e}${n}`),_.X_OK),!0}catch{}return!1}async function pe({cwd:e,env:t,localMain:n,onCodexEvent:r,source:i,target:a}){if(i===`dev`&&await ke(e,n,a))return{commit:a,devTarget:a};let o=y.resolve(e,await J(e,[`rev-parse`,`--git-common-dir`])),c=y.join(o,`coreframe-managed-dev`);await s(c,{recursive:!0});let l=g(8).toString(`hex`),u=y.join(c,`integration-${l}`);try{if(await q(e,[`worktree`,`add`,`--detach`,u,n]),n!==a)if(i===`dev`)await F(u,t,[`merge`,`--no-edit`,`--no-ff`,`--allow-unrelated-histories`,`--message`,`Merge dev into main`,a],`merge`,r);else{let e=await Y(u,[`merge-base`,n,a]),i=Number(await J(u,[`rev-list`,`--count`,e?`${e}..HEAD`:`HEAD`]));await F(u,t,e?[`rebase`,`--onto`,a,e]:[`rebase`,`--root`,`--onto`,a],`rebase`,r,a,i)}return{commit:await J(u,[`rev-parse`,`HEAD`]),devTarget:i===`dev`?a:void 0}}finally{await q(e,[`worktree`,`remove`,`--force`,u]).catch(()=>void 0),await f(u,{force:!0,recursive:!0})}}async function me(e,t,n){let r=async r=>{let i=[`start`,`update ${w} ${t.commit} ${n}`];r&&t.devTarget&&i.push(t.devTarget===t.commit?`verify ${T} ${t.devTarget}`:`update ${T} ${t.commit} ${t.devTarget}`),i.push(`prepare`,`commit`),await S(`git`,[`update-ref`,`--stdin`],{cwd:e,stdin:{string:`${i.join(`
3
+ `)}\n`}})};try{await r(!0)}catch(i){if(!t.devTarget)throw i;let a;try{a=await Promise.all([J(e,[`rev-parse`,w]),Y(e,[`rev-parse`,T])])}catch{throw i}let[o,s]=a;if(o!==n||s===t.devTarget)throw i;await r(!1)}}async function F(e,t,n,r,i,a,o=0){try{await q(e,n,{env:{GIT_EDITOR:`true`}});return}catch(n){let s=await z(e);if(s.length===0)throw n;try{for(;s.length>0;){await I(e,t,r,s,a?await L(e,a):[],o,i),await q(e,[`diff`,`--check`]),await q(e,[`add`,`--all`]);let n=await z(e);if(n.length>0)throw Error(`Codex left unresolved paths: ${n.join(`, `)}`);try{await q(e,[r,`--continue`],{env:{GIT_EDITOR:`true`}})}catch(t){if(s=await z(e),s.length===0)throw t;i({commits:a?await L(e,a):[],phase:`progress`,totalCommits:o});continue}i({commits:a?await L(e,a):[],phase:`progress`,totalCommits:o}),s=await z(e)}return}catch(t){throw await q(e,[r,`--abort`]).catch(()=>void 0),Error(`Codex could not resolve ${r} conflicts: ${Z(t)}`)}}}async function I(e,r,i,a,o,s,c){let l=`Resolve the current Git ${i} conflicts cleanly. Edit only files needed for the resolution, preserve intended behavior from both sides, and remove all conflict markers. Do not run pnpm test or any other test suite; managed development will run pnpm test after you finish and report any failures. You may run pnpm typecheck and pnpm format if useful. Do not stage files or run Git continuation commands. Conflicted paths: ${a.join(`, `)}`;c({commits:o,message:{kind:`user`,text:l},phase:`start`,totalCommits:s});let u=S(`codex`,[`exec`,...t,`--ephemeral`,`--ignore-user-config`,`--json`,`--sandbox`,`workspace-write`,`--cd`,e,l],{cwd:e,env:r,stdin:`ignore`}),d=``,f=[];try{await Promise.all([R(u.stdout,e=>{let t=he(e,n);t&&(t.kind===`agent`&&(d=t.text),c({message:t,phase:`message`}))}),R(u.stderr,e=>f.push(e))])}catch(e){c({phase:`error`});let t=f.join(`
4
+ `).trim();throw t?Error(`${Z(e)}\n${t}`):e}c({finalMessage:d||`Codex resolved the conflicts.`,phase:`complete`})}async function L(e,t){let n=await J(e,[`log`,`--reverse`,`--format=%H%x00%s`,`${t}..HEAD`]);return n?n.split(`
5
+ `).map(e=>{let[t,n=``]=e.split(`\0`,2);return{commit:t,shortCommit:t.slice(0,12),subject:n}}):[]}function he(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 R(e,t){for await(let n of e)t(n)}async function z(e){return je(await J(e,[`diff`,`--name-only`,`--diff-filter=U`,`-z`]))}async function ge(e,t,n){await S(X(),[n],{cwd:e,env:t})}function _e(e){let t=B(e);if(t){let e=b(t).trim();if(e)return e}return b(Z(e))}function B(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 ve({config:e,cwd:t,env:n}){if(!e.database)return;let r=await V({config:e,cwd:t,env:n});try{await S(X(),[`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: ${Z(e)}`)}),await f(r.directory,{force:!0,recursive:!0})}async function V({config:e,cwd:t,env:n}){let r=y.join(t,`.coreframe`,`managed-dev-backups`);await s(r,{recursive:!0});let i=await c(y.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 ye(y.join(t,`.coreframe`,r),y.join(i,r))&&n.add(r);return{directory:i,async discard(){},async restore(){for(let r of e){let e=y.join(t,`.coreframe`,r);n.has(r)?await o(y.join(i,r),e):await f(e,{force:!0})}}}}if(!n.DATABASE_URL)throw Error(`DATABASE_URL is required to snapshot local PostgreSQL.`);let a=await be(t);if(a)return xe({directory:i,connectionString:n.DATABASE_URL,postgres:a});let l=y.join(i,`database.dump`),u=K(n,n.DATABASE_URL);return await S(`pg_dump`,[`--format=custom`,`--file`,l],{cwd:t,env:u,stdin:`ignore`}),{directory:i,async discard(){},async restore(){await S(`pg_restore`,[`--clean`,`--if-exists`,`--no-owner`,`--dbname`,u.PGDATABASE,l],{cwd:t,env:u,stdin:`ignore`})}}}async function ye(e,t){try{return await o(e,t),!0}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e;return!1}}async function be(e){let t=JSON.parse(await u(y.join(e,`package.json`),`utf8`));if(!(!t.dependencies?.pg&&!t.devDependencies?.pg&&!t.optionalDependencies?.pg))try{return await import(x(`pg`,m(y.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 xe({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_${g(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 U(c,i,!1),await W(c,i),await c.query(`CREATE DATABASE ${G(a)} WITH TEMPLATE ${G(i)}`),await U(c,a,!0)}finally{await U(c,i,!0).catch(()=>void 0),await c.end()}return{directory:e,async discard(){await H(n,s.href,async e=>{await W(e,a),await e.query(`DROP DATABASE ${G(a)}`)})},async restore(){await H(n,s.href,async e=>{await U(e,i,!1),await W(e,i),await e.query(`ALTER DATABASE ${G(i)} RENAME TO ${G(o)}`);try{await e.query(`ALTER DATABASE ${G(a)} RENAME TO ${G(i)}`)}catch(t){throw await e.query(`ALTER DATABASE ${G(o)} RENAME TO ${G(i)}`).catch(()=>void 0),await U(e,i,!0).catch(()=>void 0),t}await W(e,o),await e.query(`DROP DATABASE ${G(o)}`)})}}}async function H(e,t,n){let r=new e.Client({connectionString:t});await r.connect();try{return await n(r)}finally{await r.end()}}async function U(e,t,n){await e.query(`ALTER DATABASE ${G(t)} ALLOW_CONNECTIONS ${n?`true`:`false`}`)}async function W(e,t){await e.query(`SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1 AND pid <> pg_backend_pid()`,[t])}function G(e){return`"${e.replaceAll(`"`,`""`)}"`}function K(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 Se(e){return e.some(e=>y.basename(e)===`package.json`||y.basename(e).endsWith(`lock.yaml`)||y.basename(e)===`pnpm-workspace.yaml`)}function Ce(e){return e.some(e=>Se([e])||/(^|\/)(panda\.config|vite|coreframe|tsconfig|drizzle)\.[^/]+$/.test(e)||/(^|\/)(drizzle|scripts|src\/api)(\/|$)/.test(e))}function we(e){return e.some(e=>e===`src-flutter`||e.startsWith(`src-flutter/`))}async function Te(e,t,n,r){return{commit:n,commits:(await J(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 J(e,[`show`,`-s`,`--format=%s`,n])}}async function Ee(e){try{let t=await l(e,`wx`);await t.writeFile(`${i.pid}\n`),await t.close()}catch(t){if(!(t instanceof Error&&`code`in t&&t.code===`EEXIST`))throw t;let n=(await u(e,`utf8`).catch(()=>`unknown`)).trim(),r=Number(n);if(Number.isInteger(r)&&!De(r)){await p(e).catch(()=>void 0),await Ee(e);return}throw Error(`Managed development is already owned by PID ${n}.`)}}function De(e){try{return i.kill(e,0),!0}catch(e){return!(e instanceof Error&&`code`in e&&e.code===`ESRCH`)}}async function Oe(e){e&&(await u(e,`utf8`).catch(()=>void 0))?.trim()===String(i.pid)&&await p(e).catch(()=>void 0)}async function q(e,t,{env:n}={}){return S(`git`,t,{cwd:e,env:n,stdin:`ignore`})}async function J(e,t){return(await q(e,t)).stdout.trim()}async function Y(e,t){try{return await J(e,t)||void 0}catch(e){if(e instanceof C&&e.exitCode&&e.exitCode>0)return;throw e}}async function ke(e,t,n){try{return await q(e,[`merge-base`,`--is-ancestor`,t,n]),!0}catch(e){if(e instanceof C&&e.exitCode===1)return!1;throw e}}function Ae(e,t){return e.length===t.length&&[...e].sort().every((e,n)=>e===[...t].sort()[n])}function je(e){return e.split(`\0`).filter(Boolean)}function Me(e){return e.split(/\r?\n/,1)[0]??``}function Ne(e){return e.type===`acknowledge-codex`?`Acknowledging Codex result`: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 X(){return i.platform===`win32`?`pnpm.cmd`:`pnpm`}function Z(e){return e instanceof Error?e.message:String(e)}export{E as isManagedDevCheckout,D as isPrimaryCheckout,k as startManagedDevSession};
@@ -1 +1 @@
1
- import{access as e,mkdir as t,readFile as n,readdir as r,writeFile as i}from"node:fs/promises";import a from"node:path";import o from"node:process";import s from"nano-spawn";import{createHash as c}from"node:crypto";const l=/^panda\.config\.(?:[cm]?[jt]sx?)$/,u=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],d=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),f=`.coreframe/panda-codegen.json`;async function p({cwd:e=o.cwd(),env:n=o.env,runCodegen:r=()=>m(e,n)}={}){let s=await h(e);if(s.length===0)return{applicable:!1,ran:!1};let c=await _(e,s),l=await x(e);if(l?.schemaVersion===1&&l.fingerprint===c&&await S(e,s))return{applicable:!0,fingerprint:c,ran:!1};if(await r(),!await S(e,s))throw Error(`Panda codegen completed without producing the expected generated output.`);return await t(a.dirname(a.join(e,f)),{recursive:!0}),await i(a.join(e,f),`${JSON.stringify({fingerprint:c,schemaVersion:1})}\n`,{mode:384}),{applicable:!0,fingerprint:c,ran:!0}}async function m(e,t){await s(o.platform===`win32`?`pnpm.cmd`:`pnpm`,[`codegen`],{cwd:e,env:t})}async function h(e){let t=[];return await g(e,``,t),t.sort((e,t)=>e.path.localeCompare(t.path)),t}async function g(e,t,i){let o=await r(e,{withFileTypes:!0});for(let r of o){let o=t?a.join(t,r.name):r.name;if(r.isDirectory()){d.has(r.name)||await g(a.join(e,r.name),o,i);continue}if(r.isFile()&&l.test(r.name)){let t=await n(a.join(e,r.name),`utf8`);i.push({content:t,path:o})}}}async function _(e,t){let n=await v(e);return c(`sha256`).update(JSON.stringify({dependencies:n,configs:t.map(({content:e,path:t})=>({content:e,path:t})),schemaVersion:1})).digest(`hex`)}async function v(e){let t=JSON.parse(await n(a.join(e,`package.json`),`utf8`)),r=[];for(let n of u){let i=t[n];if(!(!i||typeof i!=`object`||Array.isArray(i)))for(let t of Object.keys(i).sort())y(t)&&r.push({name:t,section:n,spec:i[t],version:await b(e,t)})}return r}function y(e){return e===`panda`||e.startsWith(`@pandacss/`)||/panda/i.test(e)}async function b(e,t){try{return JSON.parse(await n(a.join(e,`node_modules`,t,`package.json`),`utf8`)).version}catch{return}}async function x(e){try{let t=JSON.parse(await n(a.join(e,f),`utf8`));if(!t||typeof t!=`object`)return;let r=t;return typeof r.fingerprint==`string`&&typeof r.schemaVersion==`number`?{fingerprint:r.fingerprint,schemaVersion:r.schemaVersion}:void 0}catch{return}}async function S(e,t){return(await Promise.all(t.map(t=>C(e,t)))).every(Boolean)}async function C(t,n){let r=w(t,n);try{return await Promise.all([e(a.join(r,`css/index.js`)),e(a.join(r,`types/index.d.ts`))]),!0}catch{return!1}}function w(e,t){let n=/\boutdir\s*:\s*["'`]([^"'`]+)["'`]/s.exec(t.content)?.[1];return a.resolve(e,a.dirname(t.path),n??`styled-system`)}export{p as ensurePandaCodegen,f as pandaCodegenStateFile};
1
+ import e from"node:process";import{access as t,mkdir as n,readFile as r,readdir as i,writeFile as a}from"node:fs/promises";import{createHash as o}from"node:crypto";import s from"node:path";import c from"nano-spawn";const l=/^panda\.config\.(?:[cm]?[jt]sx?)$/,u=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],d=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),f=`.coreframe/panda-codegen.json`;async function p({cwd:t=e.cwd(),env:r=e.env,runCodegen:i=()=>m(t,r)}={}){let o=await h(t);if(o.length===0)return{applicable:!1,ran:!1};let c=await _(t,o),l=await x(t);if(l?.schemaVersion===1&&l.fingerprint===c&&await S(t,o))return{applicable:!0,fingerprint:c,ran:!1};if(await i(),!await S(t,o))throw Error(`Panda codegen completed without producing the expected generated output.`);return await n(s.dirname(s.join(t,f)),{recursive:!0}),await a(s.join(t,f),`${JSON.stringify({fingerprint:c,schemaVersion:1})}\n`,{mode:384}),{applicable:!0,fingerprint:c,ran:!0}}async function m(t,n){await c(e.platform===`win32`?`pnpm.cmd`:`pnpm`,[`codegen`],{cwd:t,env:n})}async function h(e){let t=[];return await g(e,``,t),t.sort((e,t)=>e.path.localeCompare(t.path)),t}async function g(e,t,n){let a=await i(e,{withFileTypes:!0});for(let i of a){let a=t?s.join(t,i.name):i.name;if(i.isDirectory()){d.has(i.name)||await g(s.join(e,i.name),a,n);continue}if(i.isFile()&&l.test(i.name)){let t=await r(s.join(e,i.name),`utf8`);n.push({content:t,path:a})}}}async function _(e,t){let n=await v(e);return o(`sha256`).update(JSON.stringify({dependencies:n,configs:t.map(({content:e,path:t})=>({content:e,path:t})),schemaVersion:1})).digest(`hex`)}async function v(e){let t=JSON.parse(await r(s.join(e,`package.json`),`utf8`)),n=[];for(let r of u){let i=t[r];if(!(!i||typeof i!=`object`||Array.isArray(i)))for(let t of Object.keys(i).sort())y(t)&&n.push({name:t,section:r,spec:i[t],version:await b(e,t)})}return n}function y(e){return e===`panda`||e.startsWith(`@pandacss/`)||/panda/i.test(e)}async function b(e,t){try{return JSON.parse(await r(s.join(e,`node_modules`,t,`package.json`),`utf8`)).version}catch{return}}async function x(e){try{let t=JSON.parse(await r(s.join(e,f),`utf8`));if(!t||typeof t!=`object`)return;let n=t;return typeof n.fingerprint==`string`&&typeof n.schemaVersion==`number`?{fingerprint:n.fingerprint,schemaVersion:n.schemaVersion}:void 0}catch{return}}async function S(e,t){return(await Promise.all(t.map(t=>C(e,t)))).every(Boolean)}async function C(e,n){let r=w(e,n);try{return await Promise.all([t(s.join(r,`css/index.js`)),t(s.join(r,`types/index.d.ts`))]),!0}catch{return!1}}function w(e,t){let n=/\boutdir\s*:\s*["'`]([^"'`]+)["'`]/s.exec(t.content)?.[1];return s.resolve(e,s.dirname(t.path),n??`styled-system`)}export{p as ensurePandaCodegen,f as pandaCodegenStateFile};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coreframe/dev",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "description": "Development workflow utilities for Coreframe apps",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,10 +16,6 @@
16
16
  "types": "./dist/index.d.ts",
17
17
  "default": "./dist/index.js"
18
18
  },
19
- "./codex-task": {
20
- "types": "./dist/codex-task.d.ts",
21
- "default": "./dist/codex-task.js"
22
- },
23
19
  "./https": {
24
20
  "types": "./dist/https.d.ts",
25
21
  "default": "./dist/https.js"
@@ -40,10 +36,10 @@
40
36
  "dependencies": {
41
37
  "import-meta-resolve": "^4.2.0",
42
38
  "nano-spawn": "^2.1.0",
43
- "@coreframe/config": "^0.1.9",
44
- "@coreframe/db": "^0.1.13",
45
- "@coreframe/dev-contracts": "^0.1.7",
46
- "@coreframe/dev-supervisor": "^0.1.11"
39
+ "@coreframe/db": "^0.1.15",
40
+ "@coreframe/dev-contracts": "^0.1.8",
41
+ "@coreframe/config": "^0.1.11",
42
+ "@coreframe/dev-supervisor": "^0.1.13"
47
43
  },
48
44
  "devDependencies": {
49
45
  "@types/node": "^26.1.0",
@@ -1,31 +0,0 @@
1
- import nanoSpawn from "nano-spawn";
2
-
3
- //#region src/codex-task.d.ts
4
- type CodexTaskOpenResult = {
5
- openedInCodex: boolean;
6
- warning?: string;
7
- };
8
- type CodexTaskStartResult = CodexTaskOpenResult & {
9
- threadId: string;
10
- url: string;
11
- };
12
- type CodexTaskStartOptions = {
13
- cwd: string;
14
- env?: NodeJS.ProcessEnv;
15
- openInBackground?: boolean;
16
- openThread?: (url: string, openInBackground: boolean) => Promise<CodexTaskOpenResult>;
17
- prompt: string;
18
- spawn?: typeof nanoSpawn;
19
- };
20
- /** Start a persistent Codex task and resolve once its local thread is ready to open. */
21
- declare function startCodexTask({
22
- cwd,
23
- env,
24
- openInBackground,
25
- openThread,
26
- prompt,
27
- spawn
28
- }: CodexTaskStartOptions): Promise<CodexTaskStartResult>;
29
- declare function openCodexThread(url: string, env?: NodeJS.ProcessEnv, spawn?: typeof nanoSpawn, platform?: NodeJS.Platform, openInBackground?: boolean): Promise<CodexTaskOpenResult>;
30
- //#endregion
31
- export { CodexTaskOpenResult, CodexTaskStartOptions, CodexTaskStartResult, openCodexThread, startCodexTask };
@@ -1,2 +0,0 @@
1
- import{managedDevCodexHighArgs as e}from"./codex-model.js";import{access as t,constants as n}from"node:fs/promises";import r from"node:path";import i from"node:process";import a from"nano-spawn";async function o({cwd:t,env:n=i.env,openInBackground:r=!1,openThread:o=(e,t)=>s(e,n,a,i.platform,t),prompt:f,spawn:p=a}){let m=f.trim();if(!m)throw Error(`Enter a task for Codex.`);if(!await c(`codex`,n))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.");let h=p(`codex`,[`exec`,...e,`--json`,`--sandbox`,`workspace-write`,`--cd`,t,m],{cwd:t,env:n,stdin:`ignore`}),g=[],_,v,y=!1,b=!1,x=new Promise((e,t)=>{_=e,v=t}),S=e=>{if(y)return;y=!0;let t=g.join(`
2
- `).trim();v(t?Error(`${d(e)}\n${t}`):e)},C=u(h.stdout,e=>{let t;try{t=l(e)}catch(e){S(e);return}if(y||b||t.type!==`thread.started`||typeof t.thread_id!=`string`||t.thread_id.length===0)return;let n=t.thread_id;b=!0;let i=`codex://threads/${encodeURIComponent(n)}`;o(i,r).then(e=>{y||(y=!0,_({threadId:n,url:i,...e}))}).catch(S)}),w=u(h.stderr,e=>g.push(e));return Promise.all([C,w,h]).then(()=>{!y&&!b&&S(Error(`Codex did not report a task ID.`))},e=>{y?console.error(`Coreframe Codex task exited with an error: ${d(e)}`):S(e)}),x}async function s(e,t=i.env,n=a,r=i.platform,o=!0){if(r!==`darwin`)return{openedInCodex:!1,warning:`The Codex app can be opened in the background only on macOS.`};try{return await n(`open`,[...o?[`-g`]:[],e],{env:t,stderr:`ignore`,stdin:`ignore`,stdout:`ignore`}),{openedInCodex:!0}}catch(e){return{openedInCodex:!1,warning:`The Codex task started, but the Codex app could not be opened: ${d(e)}`}}}async function c(e,a){let o=a.PATH??a.Path??a.path??``,s=i.platform===`win32`?(a.PATHEXT??`.COM;.EXE;.BAT;.CMD`).split(`;`):[``];for(let i of o.split(r.delimiter))for(let a of s)try{return await t(r.join(i||`.`,`${e}${a}`),n.X_OK),!0}catch{}return!1}function l(e){let t;try{t=JSON.parse(e)}catch{throw Error(`Codex emitted invalid JSONL output.`)}return!t||typeof t!=`object`?{}:t}async function u(e,t){for await(let n of e)t(n)}function d(e){return e instanceof Error?e.message:String(e)}export{s as openCodexThread,o as startCodexTask};