@coreframe/scripts 0.2.48 → 0.2.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/coreframe.js +1 -1
- package/package.json +4 -4
package/dist/coreframe.js
CHANGED
|
@@ -4,7 +4,7 @@ import*as e from"@alloc/cmd-ts";import{array as t,command as n,extendType as r,f
|
|
|
4
4
|
`):[`iOS ${r} build succeeded.`,``,`Install it on a connected iOS device:`,` 1. Enable Developer Mode, connect the device, and trust this Mac if prompted.`,` 2. Verify the device is visible:`,` xcrun devicectl list devices`,` 3. Install the signed app:`,` xcrun devicectl device install app --device <device-id> ${a}`,``,`If multiple devices are connected, use the device UDID shown by devicectl.`].join(`
|
|
5
5
|
`)}function _n(e){return[`Windows release build succeeded.`,``,`The unpackaged application bundle is at ${JSON.stringify(P(e,`src-flutter/build/windows/x64/runner/Release`))}.`,`Create and sign an installer with the Windows packaging workflow for distribution.`].join(`
|
|
6
6
|
`)}function vn(e){return[`Linux release build succeeded.`,``,`The application bundle is at ${JSON.stringify(P(e,`src-flutter/build/linux/x64/release/bundle`))}.`,`Package the bundle with the Linux distribution format used by your release process.`].join(`
|
|
7
|
-
`)}async function yn({apiOrigin:e,cwd:t=process.cwd(),environment:n=process.env,platform:r=`web`,profile:i=!1,simulator:a=!1,prepareClient:o=he,runCommand:s=xn}={}){bn(r,{profile:i,simulator:a});let c={...n};delete c[an],delete c[on],delete c.COREFRAME_PLATFORM,delete c.TAURI_ENV_PLATFORM;let l=r===`web`?void 0:A(e??n.COREFRAME_API_ORIGIN);for(let e of pn(r,{apiOrigin:l,cwd:t,profile:i,simulator:a})){if(e.kind===`prepare`){if(!l)throw Error(`A production API origin is required for the Flutter ${e.platform} build.`);await o({apiOrigin:l,cwd:t,environment:c,platform:e.platform});continue}await s(e.command,e.args,{cwd:e.cwd,env:{...c,...e.environment}})}r===`android`?console.log(hn(t,{profile:i})):r===`ios`?console.log(gn(t,{profile:i,simulator:a})):r===`windows`?console.log(_n(t)):r===`linux`&&console.log(vn(t))}function bn(e,{profile:t,simulator:n}){if(t&&e===`web`)throw Error(`The --profile flag is only supported for Flutter build targets.`);if(n&&e!==`ios`)throw Error(`The --simulator flag is only supported for the iOS build target.`);if(t&&n)throw Error(`Flutter profile builds are not supported for the iOS simulator.`)}async function xn(e,t,{cwd:n,env:r}){await F(e,t,{cwd:n,env:r,stdio:`inherit`})}function Sn(e,t,n,r){return{kind:`command`,command:e,args:t,cwd:n,...r===void 0?{}:{environment:r}}}const Cn=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in a packaged Flutter client.`,async from(e){return A(e)}}),wn=n({name:`build`,description:`Build the web client or a Flutter app (release by default). Tauri is not built.`,args:{platform:u({type:l(s(fn)),displayName:`platform`,description:`Build target: web, iOS, Android, macOS, Windows, or Linux. Defaults to web.`}),apiOrigin:c({long:`api-origin`,type:l(Cn),description:`Exact production HTTPS API origin for a Flutter build. Defaults to COREFRAME_API_ORIGIN.`}),profile:i({long:`profile`,description:`Build a Flutter profile app instead of the default release app.`,defaultValue:()=>!1}),simulator:i({long:`simulator`,description:`Build iOS for the simulator instead of a physical device.`,defaultValue:()=>!1})},handler:({apiOrigin:e,platform:t,profile:n,simulator:r})=>yn({apiOrigin:e,platform:t,profile:n,simulator:r})});function Tn(e){return e.apiKey??process.env.TYPESAFE_API_KEY??process.env.JEV_API_KEY}function En(e){return e.baseUrl??process.env.TYPESAFE_API_BASE??process.env.JEV_API_BASE??`https://jevtypesafeai.com/api/v1/decide`}function Dn(){return{resolvable:{type:`noul`,instructions:`Can these conflicting changes be mechanically combined without choosing between behaviors or losing either side's intent? Answer yes only when a resolution preserves both sides' semantics.`},strategy:{type:`choice`,instructions:`Which resolution strategy preserves both sides' intent?`,criteria:{keep_both:`both changes apply independently; concatenate or interleave them`,take_ours:`the ours side already supersedes or subsumes the theirs side`,take_theirs:`the theirs side already supersedes or subsumes the ours side`,combine_statements:`statements from both sides must be merged into shared code`}},risk:{type:`score`,instructions:`Risk that a mechanically produced resolution silently changes behavior, on an ordered scale.`,criteria:[`minimal`,`low`,`moderate`,`elevated`,`high`,`severe`]}}}async function On(e,t={}){let n=Tn(t);if(!n)return{called:!1,approved:!1,reason:`jev_unavailable: no API key`};let r={state:e,questions:Dn()},i;try{let e=await(t.fetchImpl??fetch)(En(t),{method:`POST`,headers:{Authorization:`Bearer ${n}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:AbortSignal.timeout(t.timeoutMs??1e4)});if(!e.ok)return{called:!0,approved:!1,reason:`jev_unavailable: HTTP ${e.status}`};i=await e.json()}catch(e){return{called:!0,approved:!1,reason:`jev_unavailable: ${e instanceof Error?e.message:String(e)}`}}let a=i.answers?.resolvable?.noul;if(typeof a!=`number`||Number.isNaN(a))return{called:!0,approved:!1,reason:`jev_inconclusive: missing noul answer`,answers:i.answers};let o=t.noulThreshold??.8,s=t.confidenceThreshold??.7,c=i.answers?.strategy?.confidence??i.answers?.risk?.confidence;if(a<o)return{called:!0,approved:!1,reason:`jev_refused: resolvable ${a.toFixed(2)} < ${o}`,answers:i.answers};if(c!==void 0&&c<s)return{called:!0,approved:!1,reason:`jev_inconclusive: confidence ${c.toFixed(2)} < ${s}`,answers:i.answers};let l=i.answers?.strategy?.choice;return{called:!0,approved:!0,reason:`jev approved: resolvable ${a.toFixed(2)}${l?`, strategy ${l}`:``}`,answers:i.answers}}async function kn(e,t={}){await Promise.all(e.map(async e=>{if(e.tier!==`judgment`)return;let n=await On({file:e.path,reasons:e.reasons,entities:e.entities,evidence:e.evidence},t);e.gate=n,e.decision=n.approved?`resolvable`:`escalate`,e.reasons.push(n.reason)}))}const An=`safe`,jn=`judgment`,J=`unsafe`,Mn=new Set([`both_added`,`rename_rename`,`rename_modify`]),Nn=new Set([`both_modified`,`modify_delete`,...Mn]);function Pn(e,t,n){let r=I(t,n,{cwd:e,encoding:`utf8`});if(r.error)throw r.error;return r}function Fn(e,t=`git`){let n=Pn(e,t,[`ls-files`,`-u`,`-z`]);if(n.status!==0)throw Error(`git ls-files -u failed: ${n.stderr.trim()||n.stdout.trim()}`);let r=new Set;for(let e of n.stdout.split(`\0`)){if(!e)continue;let t=e.indexOf(` `);t!==-1&&r.add(e.slice(t+1))}return[...r]}function In(e,t,n=`weave`){let r=I(n,[`explain`,t,`--json`],{cwd:e,encoding:`utf8`});if(r.error)return{error:`weave unavailable: ${r.error.message}`};if(r.status!==0){let e=(r.stderr||r.stdout).toString().trim();return{error:`weave explain failed (${r.status}): ${e}`}}try{return{explain:JSON.parse(r.stdout)}}catch{return{error:`weave explain returned unparseable output`}}}function Ln(e,t,n,r=`git`){let i=Pn(e,r,[`show`,`:${t}:${n}`]);return i.status===0?i.stdout:void 0}function Rn(e){return e.collision??[]}function zn(e){return Rn(e).length>0&&e.ours?.action===`modified`&&e.theirs?.action===`modified`}function Bn(e){let t=e.kind??`unknown`,n=e.entity??`(file)`,r=[],i=(e,r)=>({entity:n,kind:t,tier:e,reasons:[r]});if(!Nn.has(t))return i(J,`unrecognized conflict kind "${t}"`);if(Mn.has(t))return i(J,`${t}: divergent definitions of the same-named entity`);if(t===`modify_delete`){if((e.contested_hunks??0)===0){let i=e.repair?.kept_by;return r.push(`modify_delete with no contested hunks (decide_existence${i?`, kept_by=${i}`:``})`),{entity:n,kind:t,tier:jn,reasons:r}}return i(J,`modify_delete with contested hunks: deleted entity was also rewritten`)}let a=e.hunks??[];if(a.every(e=>Rn(e).length===0))return r.push(`both sides wrote adjacent lines only; no shared base statement rewritten`),{entity:n,kind:t,tier:An,reasons:r};if(a.some(zn))return i(J,`collision on the same base statement: both sides rewrote it differently`);let o=a.reduce((e,t)=>e+Rn(t).length,0);return o<=3?(r.push(`contested collision bounded to ${o} statement(s)`),{entity:n,kind:t,tier:jn,reasons:r}):i(J,`contested collision spans ${o} base statements`)}const Vn={[An]:0,[jn]:1,[J]:2};function Hn(e,t){if(t.error||!t.explain)return{path:e,tier:J,decision:`escalate`,reasons:[t.error??`no analysis`],entities:[],analysisError:t.error};let n=(t.explain.conflicts??[]).map(Bn),r=n.reduce((e,t)=>Vn[t.tier]>Vn[e]?t.tier:e,An),i=n.flatMap(e=>e.reasons.map(t=>`${e.entity}: ${t}`));return{path:e,tier:r,decision:r===`safe`?`resolvable`:`escalate`,reasons:i,entities:n}}const Un=12e3;function Wn(e,t,n,r,i){let a={base:Ln(e,1,t,r),ours:Ln(e,2,t,r),theirs:Ln(e,3,t,r)},o=e=>e===void 0||e.length<=Un?e:`${e.slice(0,Un)}\n… truncated`,s={base:o(a.base),ours:o(a.ours),theirs:o(a.theirs)},c={};if(a.base&&(a.ours||a.theirs)){let e=we(N(je(),`coreframe-conflicts-`));try{let n=N(e,`base`);z(n,a.base);for(let r of[`ours`,`theirs`]){let o=a[r];if(!o)continue;let s=N(e,r);z(s,o);let l=I(i,[`patch`,`extract`,n,s,`--path`,t],{encoding:`utf8`});if(l.status===0)try{c[r]=JSON.parse(l.stdout)}catch{c[r]={error:`unparseable patch ops`}}}}catch{}finally{Ee(e,{recursive:!0,force:!0})}}return{explain:n,stages:s,entityOps:c}}async function Gn(e){let t=e.gitBin??`git`,n=e.weaveBin??process.env.COREFRAME_WEAVE_BIN??`weave`,r=Fn(e.worktree,t).map(r=>{let i=In(e.worktree,r,n),a=Hn(r,i);return a.tier===`judgment`&&(a.evidence=Wn(e.worktree,r,i.explain,t,n)),a}),i=r.filter(e=>e.tier===jn);i.length>0&&await kn(i,e.jev??{});let a={total:r.length,safe:r.filter(e=>e.tier===An).length,judgment:r.filter(e=>e.tier===jn).length,unsafe:r.filter(e=>e.tier===J).length},o=r.every(e=>e.decision===`resolvable`)?`cheap-llm-resolvable`:`escalate`;return{worktree:e.worktree,recommendation:o,files:r,summary:a}}function Kn(e){for(let t of e.files){let e=t.decision===`resolvable`?` `:`!`;console.log(`${e} ${t.tier.padEnd(8)} ${t.decision.padEnd(10)} ${t.path}`);for(let e of t.reasons)console.log(` ${e}`)}let{summary:t}=e;console.log(`\n${t.total} conflicted file(s): ${t.safe} safe, ${t.judgment} judgment, ${t.unsafe} unsafe`),console.log(`recommendation: ${e.recommendation}`)}const qn=m({name:`conflicts`,description:`Classify rebase/merge conflicts in a worktree as cheap-LLM-resolvable or escalate.`,cmds:{classify:n({name:`classify`,description:`Analyze unmerged index stages with weave and emit a per-conflict verdict. Judgment-tier conflicts are gated through the TypeSafe Jev decide API when TYPESAFE_API_KEY (or JEV_API_KEY) is set; any Jev failure escalates.`,args:{worktree:c({long:`worktree`,type:l(p),description:`Worktree to inspect. Defaults to the current directory.`}),json:i({long:`json`,description:`Print the full structured report instead of a summary.`,defaultValue:()=>!1})},handler:async({worktree:e,json:t})=>{let n=await Gn({worktree:e??process.cwd()});t?console.log(JSON.stringify(n,void 0,2)):Kn(n),n.recommendation!==`cheap-llm-resolvable`&&(process.exitCode=1)}})}}),Jn=/^[a-f0-9]{64}$/,Yn=/^[a-f0-9]{40}$/,Xn=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function Zn(e){if(!Jn.test(e))throw Error(`Invalid SHA-256 digest "${e}".`);return e}function Qn(e){if(!Yn.test(e))throw Error(`Invalid full Git revision "${e}".`);return e}function $n(e,t){if(!Xn.test(e))throw Error(`${t} must contain only letters, numbers, dots, underscores, or hyphens.`);return e}function er(e){return`projects/${$n(e,`Project ID`)}/i18n/v1`}function tr(e,t){return Zn(t),`${er(e)}/objects/sha256/${t.slice(0,2)}/${t}`}function nr(e,t){return Qn(t),`${er(e)}/commits/${t}.json`}function rr(e,t){return ir(t),`${er(e)}/releases/${encodeURIComponent(t)}.json`}function ir(e){if(!e.startsWith(`v`)||e.length<2||e.length>128||/\s/.test(e)||e.includes(`..`))throw Error(`Release tag "${e}" must be a valid v-prefixed tag.`);return e}function Y(e,t){if(!t||t.startsWith(`/`)||t.includes(`\0`))throw Error(`Unsafe i18n artifact path "${t}".`);let n=P(e),r=P(n,t);if(r!==n&&!r.startsWith(`${n}${be}`))throw Error(`Unsafe i18n artifact path "${t}".`);return r}function X(e,t,n){return`${e.directory}/${t}/${n}.json`}function ar(e,t,n){return`${e.directory}/${t}/${n}.mjs`}async function or(e){await F(`pnpm`,[`exec`,`lingui`,`extract`],{cwd:e,stdio:`inherit`})}async function sr({config:e,cwd:t,strict:n,temporaryDirectory:r}){let i=[];try{for(let n of e.locales)for(let a of e.catalogs){let o=Y(t,X(e,n,a)),s=await fr(o),c=Object.fromEntries(Object.entries(s).filter(([,e])=>!e.obsolete)),l=N(r,`${n}-${a}.json`);await V(M(l),{recursive:!0}),await Ke(o,l),i.push({path:o,backup:l}),await pr(o,c)}await F(`pnpm`,[`exec`,`lingui`,`compile`,...n?[`--strict`]:[]],{cwd:t,stdio:`inherit`})}finally{try{for(let{path:e,backup:t}of i)await Ke(t,e)}finally{for(let n of e.locales)for(let r of e.catalogs)await U(Y(t,ar(e,n,r)),{force:!0})}}}async function cr({config:e,cwd:t}){let n=[];for(let r of e.locales)if(r!==e.sourceLocale)for(let i of e.catalogs){let a=await fr(Y(t,X(e,r,i)));for(let[e,t]of Object.entries(a)){if(t.obsolete||t.translation?.trim())continue;let a=t.message;if(typeof a!=`string`||!a)throw Error(`Missing source message metadata for ${r}:${e}.`);n.push({catalog:i,comments:t.comments?.filter(e=>typeof e==`string`)??[],context:t.context,id:e,locale:r,message:a,origins:t.origin?.map(([e,t])=>t?`${e}:${t}`:e)??[],placeholders:Object.keys(t.placeholders??{}).sort()})}}return n.sort((e,t)=>vr(e).localeCompare(vr(t)))}async function lr({config:e,cwd:t,messages:n,env:r=process.env}){if(n.length===0)return{translations:[],version:1};if(!e.generator)throw Error(`I18n preparation found ${n.length} missing translations, but no generator is configured.`);let i={messages:n,sourceLocale:e.sourceLocale,version:1};return mr(await hr({args:e.generator.args??[],command:e.generator.command,cwd:t,env:r,input:JSON.stringify(i)}))}async function ur({config:e,cwd:t,missing:n,response:r}){let i=new Map(n.map(e=>[vr(e),e])),a=new Map;for(let e of r.translations){let t=vr(e);if(!i.has(t))throw Error(`Translation generator returned unexpected entry ${e.locale}:${e.catalog}:${e.id}.`);if(a.has(t))throw Error(`Translation generator returned duplicate entry ${e.locale}:${e.catalog}:${e.id}.`);if(!e.translation.trim())throw Error(`Translation generator returned an empty entry ${e.locale}:${e.id}.`);a.set(t,e.translation)}let o=[...i.keys()].filter(e=>!a.has(e));if(o.length>0)throw Error(`Translation generator omitted ${o.length} required entries.`);let s=await Qe(`@lingui/message-utils/compileMessage`,t);for(let e of n){let t=a.get(vr(e));gr({compileMessage:s,id:e.id,locale:e.locale,source:e.message,translation:t})}for(let n of e.locales)if(n!==e.sourceLocale)for(let r of e.catalogs){let i=Y(t,X(e,n,r)),o=await fr(i),s=!1;for(let[e,t]of Object.entries(o)){let i=a.get(vr({catalog:r,id:e,locale:n}));if(i!==void 0){if(t.translation?.trim())throw Error(`Refusing to overwrite preserved translation ${n}:${e}.`);t.translation=i,s=!0}}s&&await pr(i,o)}}async function dr({config:e,cwd:t}){let n=await cr({config:e,cwd:t});if(n.length>0)throw Error(`I18n catalogs remain incomplete: ${n.length} translations are missing.`);let r=await Qe(`@lingui/message-utils/compileMessage`,t);for(let n of e.locales)if(n!==e.sourceLocale)for(let i of e.catalogs){let a=await fr(Y(t,X(e,n,i)));for(let[e,t]of Object.entries(a))if(!t.obsolete){if(typeof t.message!=`string`||typeof t.translation!=`string`)throw Error(`Incomplete source metadata for active translation ${n}:${e}.`);gr({compileMessage:r,id:e,locale:n,source:t.message,translation:t.translation})}}}async function fr(e){let t=JSON.parse(await H(e,`utf8`));if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`Lingui rich JSON catalog must be an object: ${e}.`);for(let[n,r]of Object.entries(t)){if(!r||typeof r!=`object`||Array.isArray(r))throw Error(`Invalid Lingui rich JSON message ${n} in ${e}.`);let t=r;if(t.translation!==void 0&&typeof t.translation!=`string`)throw Error(`Invalid translation value for ${n} in ${e}.`);if(t.message!==void 0&&t.message!==null&&typeof t.message!=`string`)throw Error(`Invalid source message value for ${n} in ${e}.`);if(t.context!==void 0&&typeof t.context!=`string`)throw Error(`Invalid context value for ${n} in ${e}.`);if(t.obsolete!==void 0&&typeof t.obsolete!=`boolean`)throw Error(`Invalid obsolete marker for ${n} in ${e}.`);if(t.comments!==void 0&&(!Array.isArray(t.comments)||t.comments.some(e=>typeof e!=`string`)))throw Error(`Invalid comments for ${n} in ${e}.`);if(t.origin!==void 0&&(!Array.isArray(t.origin)||t.origin.some(e=>!Array.isArray(e)||typeof e[0]!=`string`||e[1]!==void 0&&typeof e[1]!=`number`)))throw Error(`Invalid origins for ${n} in ${e}.`);if(t.placeholders!==void 0&&(!t.placeholders||typeof t.placeholders!=`object`||Array.isArray(t.placeholders)))throw Error(`Invalid placeholders for ${n} in ${e}.`)}return t}async function pr(e,t){await V(M(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;await W(n,`${JSON.stringify(t,null,2)}\n`),await Xe(n,e)}function mr(e){let t;try{t=JSON.parse(e)}catch{throw Error(`Translation generator returned invalid JSON.`)}if(!t||typeof t!=`object`||t.version!==1||!Array.isArray(t.translations))throw Error(`Translation generator returned an invalid response envelope.`);for(let e of t.translations)if(!e||typeof e!=`object`||typeof e.id!=`string`||typeof e.catalog!=`string`||typeof e.locale!=`string`||typeof e.translation!=`string`)throw Error(`Translation generator returned an invalid translation entry.`);return t}function hr({args:e,command:t,cwd:n,env:r,input:i}){return F(t,e,{cwd:n,env:r,stdio:[{string:i},`pipe`,`ignore`]}).then(({stdout:e})=>{if(Buffer.byteLength(e)>10*1024*1024)throw Error(`Translation generator output exceeded 10 MiB.`);return e}).catch(()=>{throw Error(`Translation generator exited unsuccessfully.`)})}function gr({compileMessage:e,id:t,locale:n,source:r,translation:i}){let a,o;try{a=e.compileMessageOrThrow(r),o=e.compileMessageOrThrow(i)}catch{throw Error(`Translation ${n}:${t} is not valid ICU MessageFormat.`)}let s=_r(a),c=_r(o);if(s.length!==c.length||s.some((e,t)=>e!==c[t]))throw Error(`Translation ${n}:${t} does not preserve source ICU placeholders.`)}function _r(e){let t=[];function n(e){for(let r of e){if(typeof r==`string`)continue;let[e,i=`argument`,a]=r;if(t.push(`${e}:${i}`),a&&typeof a==`object`&&!Array.isArray(a))for(let e of Object.values(a))Array.isArray(e)&&n(e)}}return n(e),t.sort()}function vr(e){return`${e.locale}\0${e.catalog}\0${e.id}`}function yr(e){return rt(`sha256`).update(e).digest(`hex`)}async function br(e){return yr(await H(e))}function xr(e){return Buffer.from(`${JSON.stringify(e,null,2)}\n`)}async function Sr({bucket:e,digest:t,projectId:n,source:r,store:i}){if(Zn(t),await br(r)!==t)throw Error(`I18n object source does not match declared SHA-256 digest ${t}.`);let a=tr(n,t);await i.has(e,a)||await i.upload(e,a,r,`application/octet-stream`);let o=`${r}.${process.pid}.${K()}.verify`;try{if(await i.download(e,a,o),await br(o)!==t)throw Error(`Existing immutable i18n object ${a} failed integrity verification.`)}finally{await U(o,{force:!0})}}async function Cr({bucket:e,key:t,reference:n,store:r,temporaryDirectory:i}){let a=xr(n),o=N(i,`reference-${K()}.json`);if(await r.has(e,t))try{if(await r.download(e,t,o),!(await H(o)).equals(a))throw Error(`Immutable i18n reference ${t} already resolves to different snapshot data.`);return}finally{await U(o,{force:!0})}await W(o,a,{flag:`wx`});try{await r.upload(e,t,o,`application/json`)}finally{await U(o,{force:!0})}let s=N(i,`reference-${K()}.verify.json`);try{if(await r.download(e,t,s),!(await H(s)).equals(a))throw Error(`Uploaded immutable i18n reference ${t} failed verification.`)}finally{await U(s,{force:!0})}}async function wr({bucket:e,manifest:t,projectId:n,store:r,temporaryDirectory:i}){let a=xr(t),o=yr(a),s=N(i,`manifest-${o}.json`);await W(s,a,{flag:`wx`});try{await Sr({bucket:e,digest:o,projectId:n,source:s,store:r})}finally{await U(s,{force:!0})}return o}async function Tr({bucket:e,key:t,store:n,temporaryDirectory:r}){if(!await n.has(e,t))return;let i=N(r,`reference-${K()}.json`);try{await n.download(e,t,i);let r=JSON.parse(await H(i,`utf8`));if(r.version!==1||typeof r.revision!=`string`||typeof r.snapshot!=`string`)throw Error(`Invalid i18n reference at ${t}.`);return Qn(r.revision),Zn(r.snapshot),r}finally{await U(i,{force:!0})}}async function Er({bucket:e,projectId:t,revision:n,store:r,temporaryDirectory:i}){let a=await Tr({bucket:e,key:nr(t,n),store:r,temporaryDirectory:i});if(a&&a.revision!==n)throw Error(`I18n commit reference does not match requested revision ${n}.`);return a}async function Dr({bucket:e,projectId:t,reference:n,store:r,tag:i,temporaryDirectory:a}){await Cr({bucket:e,key:nr(t,n.revision),reference:n,store:r,temporaryDirectory:a}),i&&await Cr({bucket:e,key:rr(t,i),reference:n,store:r,temporaryDirectory:a})}async function Or({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:a}){Zn(n);let o=N(P(t),`v1`,`sha256`,n.slice(0,2),n);if(await Ar(o,n)===!1){await V(M(o),{recursive:!0});let t=`${o}.${process.pid}.${K()}.tmp`;try{if(await i.download(e,tr(r,n),t),await br(t)!==n)throw Error(`Downloaded i18n object failed SHA-256 verification: ${n}.`);await U(o,{force:!0}),await Xe(t,o)}finally{await U(t,{force:!0})}}await V(M(a),{recursive:!0});let s=`${a}.${process.pid}.${K()}.tmp`;try{if(await Ke(o,s),await br(s)!==n)throw Error(`Cached i18n object failed SHA-256 verification: ${n}.`);await U(a,{force:!0}),await Xe(s,a)}finally{await U(s,{force:!0})}}async function kr({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,temporaryDirectory:a}){let o=N(a,`manifest-${n}.json`);await Or({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:o});let s=JSON.parse(await H(o,`utf8`));if(s.version!==1||s.projectId!==r||typeof s.revision!=`string`||!Array.isArray(s.files)||!Array.isArray(s.catalogs)||s.catalogs.some(e=>typeof e!=`string`)||!Array.isArray(s.locales)||s.locales.some(e=>typeof e!=`string`)||typeof s.sourceLocale!=`string`||typeof s.generator!=`string`||typeof s.linguiVersion!=`string`)throw Error(`Invalid i18n snapshot manifest ${n}.`);Qn(s.revision),s.baseline!==void 0&&Zn(s.baseline);for(let e of s.files){if(!e||typeof e!=`object`||typeof e.path!=`string`||typeof e.digest!=`string`||typeof e.size!=`number`)throw Error(`Invalid file entry in i18n snapshot manifest ${n}.`);Zn(e.digest)}return s}async function Ar(e,t){try{return(await Ze(e)).isFile()&&await br(e)===t}catch{return!1}}async function jr({cwd:e=process.cwd(),env:t=process.env}={}){let n=await G({cwd:e});if(!n.i18n)return;let r=t.COREFRAME_I18N_RELEASE_REVISION;if(r){if(Fr(Ir(n.i18n))===`multilingual`){await Pr({cwd:e,env:t,revision:r});return}console.log(`I18n source-only mode: building source catalogs for ${r}; no prepared translation snapshot is required.`)}await or(e)}async function Mr({cwd:e=process.cwd(),projectConfig:t}={}){let n=t??await G({cwd:e});if(!n.i18n)return;let r=Ir(n.i18n),i=Y(e,r.directory);try{if(!(await Ze(i)).isDirectory())throw Error(`I18n catalog path is not a directory: ${i}.`)}catch(t){if(t.code!==`ENOENT`)throw t;await or(e);return}for(let t of r.locales)for(let n of r.catalogs)try{if(!(await Ze(Y(e,X(r,t,n)))).isFile())throw Error(`I18n catalog path is not a file: ${t}/${n}.json.`)}catch(t){if(t.code!==`ENOENT`)throw t;await or(e);return}}async function Nr({cwd:e=process.cwd(),env:t=process.env,store:n,tag:r}){ir(r),await Gr(e);let i=await Wr(e);await Kr(e,r,i);let a=await G({cwd:e});if(!a.i18n)throw Error(`Missing i18n configuration in coreframe.config.ts.`);let o=Ir(a.i18n);if(Fr(o)===`source-only`)return{mode:`source-only`,sourceLocale:o.sourceLocale};let s=await Lr({cwd:e,env:t,projectConfig:a,store:n}),c=await Je(N(je(),`coreframe-i18n-prepare-`));try{let n=await Er({bucket:s.assets.sourceBucket,projectId:s.assets.projectId,revision:i,store:s.store,temporaryDirectory:c});if(n){let e=await kr({bucket:s.assets.sourceBucket,cacheRoot:s.cacheRoot,digest:n.snapshot,projectId:s.assets.projectId,store:s.store,temporaryDirectory:c});return Ur(s,e,i),await zr(s,e),await Dr({bucket:s.assets.sourceBucket,projectId:s.assets.projectId,reference:n,store:s.store,tag:r,temporaryDirectory:c}),{mode:`multilingual`,reused:!0,snapshot:n.snapshot}}return await Hr(s,c,async()=>{let n=await Rr(s,i,c);n||await Vr(s),await or(e);let a=await cr({config:s.config,cwd:e}),o=await lr({config:s.config,cwd:e,env:t,messages:a});await ur({config:s.config,cwd:e,missing:a,response:o}),await dr({config:s.config,cwd:e}),await sr({config:s.config,cwd:e,strict:!0,temporaryDirectory:c});let l=await Br(s),u={...n?{baseline:n}:{},catalogs:s.config.catalogs,files:l,generator:a.length>0?s.config.generator?.id??`unconfigured`:`none`,linguiVersion:await qr(e),locales:s.config.locales,projectId:s.assets.projectId,revision:i,sourceLocale:s.config.sourceLocale,version:1},d=await wr({bucket:s.assets.sourceBucket,manifest:u,projectId:s.assets.projectId,store:s.store,temporaryDirectory:c});return await Dr({bucket:s.assets.sourceBucket,projectId:s.assets.projectId,reference:{revision:i,snapshot:d,version:1},store:s.store,tag:r,temporaryDirectory:c}),{mode:`multilingual`,reused:!1,snapshot:d}})}finally{await U(c,{force:!0,recursive:!0})}}async function Pr({cwd:e=process.cwd(),env:t=process.env,revision:n,store:r}={}){let i=await G({cwd:e});if(!i.i18n)return;let a=await Lr({cwd:e,env:t,store:r,projectConfig:i}),o=Qn(n??await Wr(e)),s=await Je(N(je(),`coreframe-i18n-materialize-`));try{let e=await Er({bucket:a.assets.sourceBucket,projectId:a.assets.projectId,revision:o,store:a.store,temporaryDirectory:s});if(!e)throw Error(`No prepared i18n snapshot exists for commit ${o}. Push a v* tag for this commit and wait for the translation gate.`);let t=await kr({bucket:a.assets.sourceBucket,cacheRoot:a.cacheRoot,digest:e.snapshot,projectId:a.assets.projectId,store:a.store,temporaryDirectory:s});return Ur(a,t,o),await zr(a,t),{revision:o,snapshot:e.snapshot}}finally{await U(s,{force:!0,recursive:!0})}}function Fr(e){return e.locales.length===1&&e.locales[0]===e.sourceLocale?`source-only`:`multilingual`}function Ir(e){let t=$n(e.sourceLocale,`Source locale`),n=[...new Set(e.locales.map(e=>$n(e,`Locale`)))],r=[...new Set(e.catalogs.map(e=>$n(e,`Catalog`)))];if(n.length===0||!n.includes(t))throw Error(`I18n locales must include the source locale.`);if(r.length===0)throw Error(`I18n configuration requires at least one catalog.`);if(e.generator&&(!e.generator.command.trim()||!e.generator.id.trim()))throw Error(`I18n generator command and ID must be non-empty.`);return{catalogs:r,directory:e.directory??`locales`,generator:e.generator,locales:n,sourceLocale:t}}async function Lr({cwd:e=process.cwd(),env:t=process.env,projectConfig:n,store:r}){let i=n??await G({cwd:e});if(!i.i18n)throw Error(`Missing i18n configuration in coreframe.config.ts.`);if(!i.assets)throw Error(`I18n snapshots require the existing private build bucket configured under assets.`);let a=i.assets;return{assets:a,cacheRoot:P(e,`.coreframe`,`i18n`,`cache`),config:Ir(i.i18n),cwd:P(e),env:t,store:r??Ue({config:a,env:t})}}async function Rr(e,t,n){let{stdout:r}=await F(`git`,[`rev-list`,`--first-parent`,`--skip=1`,t],{cwd:e.cwd,stdin:`ignore`});for(let t of r.split(/\r?\n/).filter(Boolean)){let r=await Er({bucket:e.assets.sourceBucket,projectId:e.assets.projectId,revision:Qn(t),store:e.store,temporaryDirectory:n});if(!r)continue;let i=await kr({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:r.snapshot,projectId:e.assets.projectId,store:e.store,temporaryDirectory:n});return Ur(e,i,t),await zr(e,i),r.snapshot}}async function zr(e,t){for(let n of t.files)if(await Or({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:n.digest,projectId:e.assets.projectId,store:e.store,target:Y(e.cwd,n.path)}),(await Ze(Y(e.cwd,n.path))).size!==n.size)throw Error(`Materialized i18n artifact size does not match manifest: ${n.path}.`)}async function Br(e){let t=[];for(let n of e.config.locales)for(let r of e.config.catalogs){let i=X(e.config,n,r),a=Y(e.cwd,i),o=await br(a);await Sr({bucket:e.assets.sourceBucket,digest:o,projectId:e.assets.projectId,source:a,store:e.store}),t.push({digest:o,path:i,size:(await Ze(a)).size})}return t.sort((e,t)=>e.path.localeCompare(t.path))}async function Vr(e){let{stdout:t}=await F(`git`,[`rev-parse`,`--show-prefix`],{cwd:e.cwd,stdin:`ignore`}),n=t.trim(),{stdout:r}=await F(`git`,[`log`,`-1`,`--format=%H`,`--diff-filter=AM`,`--`,`:(top)${`${n}${e.config.directory}/${e.config.sourceLocale}/${e.config.catalogs[0]}.po`}`],{cwd:e.cwd,stdin:`ignore`}),i=r.trim();if(!i)return!1;let a=(await Qe(`@lingui/format-po`,e.cwd)).formatter({lineNumbers:!1}),o=!1;for(let t of e.config.locales)for(let r of e.config.catalogs){let s=`${n}${`${e.config.directory}/${t}/${r}.po`}`;try{let{stdout:n}=await F(`git`,[`show`,`${i}:${s}`],{cwd:e.cwd,stdin:`ignore`});await pr(Y(e.cwd,X(e.config,t,r)),a.parse(n)),o=!0}catch{}}return o}async function Hr(e,t,n){let r=[];for(let n of e.config.locales)for(let i of e.config.catalogs){let a=X(e.config,n,i),o=Y(e.cwd,a);try{await We(o)}catch{continue}let s=N(t,`previous-catalogs`,a);await V(M(s),{recursive:!0}),await Xe(o,s),r.push({backup:s,path:o})}try{let e=await n();return await U(N(t,`previous-catalogs`),{force:!0,recursive:!0}),e}catch(t){for(let t of e.config.locales)for(let n of e.config.catalogs)await U(Y(e.cwd,X(e.config,t,n)),{force:!0});for(let{backup:e,path:t}of r)await V(M(t),{recursive:!0}),await Xe(e,t);throw t}}function Ur(e,t,n){if(t.revision!==n||t.projectId!==e.assets.projectId||t.sourceLocale!==e.config.sourceLocale||JSON.stringify(t.locales)!==JSON.stringify(e.config.locales)||JSON.stringify(t.catalogs)!==JSON.stringify(e.config.catalogs))throw Error(`I18n snapshot does not match commit or project configuration.`);let r=e.config.locales.flatMap(t=>e.config.catalogs.map(n=>X(e.config,t,n))),i=t.files.map(e=>e.path);if(new Set(i).size!==i.length||JSON.stringify(i.sort())!==JSON.stringify(r.sort()))throw Error(`I18n snapshot has an incomplete or unexpected artifact set.`)}async function Wr(e){let{stdout:t}=await F(`git`,[`rev-parse`,`HEAD`],{cwd:e,stdin:`ignore`});return Qn(t.trim())}async function Gr(e){let{stdout:t}=await F(`git`,[`status`,`--porcelain`],{cwd:e,stdin:`ignore`});if(t.trim())throw Error(`Tagged i18n preparation requires a clean Git tree.`)}async function Kr(e,t,n){let{stdout:r}=await F(`git`,[`rev-parse`,`${t}^{commit}`],{cwd:e,stdin:`ignore`});if(r.trim()!==n)throw Error(`Release tag ${t} does not point to checked-out commit ${n}.`)}async function qr(e){let{stdout:t}=await F(`pnpm`,[`exec`,`lingui`,`--version`],{cwd:e,stdin:`ignore`});return t.trim()}const Jr=[`Use a B2 Multi-Bucket Application Key restricted to the configured private build-object and public generated-assets buckets.`,`Required capabilities: listAllBucketNames, readFiles, and writeFiles.`,`Deletion, bucket-management, and key-management capabilities are not needed.`].join(` `),Yr=r(p,{displayName:`widths`,description:`Comma-separated responsive variant widths.`,async from(e){let t=e.split(`,`).map(e=>Number(e));if(t.length===0||t.some(e=>!Number.isInteger(e)||e<=0)||t.some((e,n)=>n>0&&e<=t[n-1]))throw Error(`Widths must be positive, unique, strictly ascending integers.`);return t}}),Xr=r(p,{displayName:`profile`,async from(e){return Ve(e)}}),Zr=r(p,{displayName:`pack`,description:`Asset pack name, such as training-videos.`,async from(e){if(!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e))throw Error(`Asset pack names must use lowercase hyphen-separated segments.`);return e}}),Qr=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in the packaged Flutter client.`,async from(e){return A(e)}}),$r=m({name:`assets`,cmds:{configure:n({name:`configure`,description:`Store a Backblaze B2 private build-object key in the operating system credential store. ${Jr}`,args:{profile:u({type:Xr,displayName:`profile`,description:`Credential profile named by coreframe.config.ts.`})},handler:async({profile:e})=>{B.note(Jr,`Required B2 key access`);let t=await B.text({message:`Backblaze B2 application key ID`,validate:e=>e?.trim()?void 0:`The application key ID is required.`});if(B.isCancel(t))throw Error(`Asset credential configuration was cancelled.`);let n=await B.password({message:`Backblaze B2 application key`,validate:e=>e?void 0:`The application key is required.`});if(B.isCancel(n))throw Error(`Asset credential configuration was cancelled.`);await He({applicationKey:n,applicationKeyId:t.trim(),profile:e}),console.log(`Stored Coreframe asset credential profile "${e}".`)}}),add:n({name:`add`,args:{file:u({type:p,displayName:`file`,description:`Source raster image, SVG, MP3, MP4, or Lottie JSON to add to the asset library.`}),id:c({long:`id`,type:p,description:`Logical asset ID, such as blog/my-post/hero.`}),alt:c({long:`alt`,type:l(p),description:`Required alt text for raster image and SVG assets.`}),pack:c({long:`pack`,type:l(Zr),description:`Place the asset in a named, lazily loaded pack.`}),variantWidths:c({long:`widths`,type:l(Yr),description:`Generate exactly these raster-image widths instead of the default ladder.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({alt:e,file:t,id:n,json:r,pack:i,variantWidths:a})=>Re(await Me({alt:e,file:t,id:n,pack:i,variantWidths:a}),r,{kind:`add`,assetId:n})}),backup:n({name:`backup`,description:`Back up every object in both configured asset buckets to a new Git branch.`,args:{branch:c({long:`branch`,type:p,description:`Name of the new local Git branch that will contain the backup.`})},handler:async({branch:e})=>{let t=await Pe({branch:e});console.log(`Backed up ${t.objects} objects (${t.bytes} bytes) to branch "${t.branch}" at ${t.commit}.`)}}),build:n({name:`build`,args:{id:c({long:`id`,type:l(p),description:`Build only one logical asset ID.`}),pack:c({long:`pack`,type:l(Zr),description:`Build only one named asset pack.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({id:e,json:t,pack:n})=>Re(await Fe({id:e,pack:n}),t,{kind:`build`})}),check:n({name:`check`,args:{fix:i({long:`fix`,description:`Migrate asset state and build missing generated output when possible.`,defaultValue:()=>!1}),pack:c({long:`pack`,type:l(Zr),description:`Check only one named asset pack.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({fix:e,json:t,pack:n})=>{let r=await Ie({fix:e,pack:n});Re(r,t,{kind:`check`}),r.ok||(process.exitCode=1)}}),publish:n({name:`publish`,args:{pack:c({long:`pack`,type:l(Zr),description:`Publish only one named asset pack.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e,pack:t})=>{let n=await ze({pack:t});Re(n,e,{kind:`publish`}),n.ok||(process.exitCode=1)}}),status:n({name:`status`,args:{pack:c({long:`pack`,type:l(Zr),description:`Report status for only one named asset pack.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e,pack:t})=>{let n=await Ie({pack:t});Re(n,e,{kind:`status`}),n.ok||(process.exitCode=1)}})}}),ei=m({name:`flutter`,cmds:{acceptance:n({name:`acceptance`,description:`Run the complete packaged Flutter conformance gate on macOS.`,args:{apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:Qr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e})=>_e({environment:{...process.env,COREFRAME_API_ORIGIN:e}})}),codegen:n({name:`codegen`,description:`Generate Flutter bridge contracts and Panda-backed Mix theme tokens.`,args:{check:i({long:`check`,description:`Fail when generated Flutter artifacts are missing or stale.`,defaultValue:()=>!1})},handler:({check:e})=>k({check:e})}),prepare:n({name:`prepare`,description:`Build and package the React client for one Flutter platform.`,args:{platform:u({type:s(O),displayName:`platform`,description:`Flutter platform whose packaged client should be prepared.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:Qr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>he({apiOrigin:e,platform:t})}),check:n({name:`check`,description:`Reject missing, stale, modified, or incorrectly targeted Flutter assets.`,args:{platform:u({type:s(O),displayName:`platform`,description:`Flutter platform whose packaged client should be checked.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:Qr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>D({apiOrigin:e,platform:t})})}}),ti=m({name:`i18n`,cmds:{build:n({name:`build`,description:`Extract source messages or materialize an exact release catalog snapshot.`,args:{},handler:async()=>{await jr()}}),materialize:n({name:`materialize`,description:`Materialize the immutable i18n snapshot for an exact commit.`,args:{revision:c({long:`revision`,type:l(p),description:`Full commit SHA. Defaults to the checked-out commit.`})},handler:async({revision:e})=>{let t=await Pr({revision:e});t&&console.log(`Materialized i18n snapshot ${t.snapshot}.`)}}),prepare:n({name:`prepare`,description:`Fill missing translations, strictly compile, and publish an immutable tagged snapshot. Source-only projects skip translation preparation.`,args:{tag:c({long:`tag`,type:p,description:`Pushed v* release tag that points to the checked-out commit.`})},handler:async({tag:e})=>{let t=await Nr({tag:e});if(t.mode===`source-only`){console.log(`Skipped i18n release preparation: the supported locales contain only the source locale "${t.sourceLocale}", so no translation snapshot is required.`);return}console.log(`${t.reused?`Reused`:`Published`} i18n snapshot ${t.snapshot}.`)}})}}),ni=q.platform===`win32`?`react-router.cmd`:`react-router`,ri=q.platform===`win32`?`panda.cmd`:`panda`;async function ii(e=q.cwd()){await si(e),await oi(e,[`typegen`])}async function ai(e=q.cwd(),t=q.env,n){if((t.COREFRAME_PLATFORM??`web`)!==`web`)return;let r=j.resolve(e,`.coreframe/dashboard-build`),i=j.join(r,`client`),a=j.resolve(e,`dist/client/__dashboard`);await U(r,{force:!0,recursive:!0});let o=await G({cwd:e});if(o.deploy?.mode===`client`||o.dashboard?.enabled===!1){await U(a,{force:!0,recursive:!0});return}await ci(e,ri,[`build`],t),await oi(e,[`build`,...n?[`--mode`,n]:[]],t),await U(a,{force:!0,recursive:!0}),await V(j.dirname(a),{recursive:!0}),await qe(i,a,{recursive:!0})}async function oi(e,t,n=q.env){await ci(e,ni,t,n)}async function si(e){await U(j.resolve(e,`dashboard/.react-router`),{force:!0,recursive:!0})}async function ci(e,t,n,r=q.env){await F(t,n,{cwd:j.resolve(e,`dashboard`),env:{...r,PATH:j.resolve(e,`node_modules/.bin`)+j.delimiter+(r.PATH??r.Path??``)},stdio:`inherit`})}const Z={access:We,chmod:Ge,mkdir:V,mkdtemp:Je,readFile:H,readFileSync:R,rm:U,writeFile:W},li={getAvailablePort:di},ui={homedir:ke,kill:q.kill,networkInterfaces:Ae,tmpdir:je};async function di(){let e=ct();try{await new Promise((t,n)=>{e.once(`error`,n),e.listen(0,`127.0.0.1`,t)});let t=e.address();if(!t||typeof t==`string`)throw Error(`Could not allocate an available TCP port.`);return t.port}finally{e.listening&&await new Promise((t,n)=>{e.close(e=>e?n(e):t())})}}function fi({host:e=`127.0.0.1`,port:t,start:n}){let r,i=!1,a=!1,o=!1,s,c,l,u,d,f=new Set,p=new Promise((e,t)=>{u=e,d=t}),m=e=>{a||o||(o=!0,d(e))},h=()=>(s||=Promise.resolve().then(n).catch(e=>{throw m(e),e}),s),g=e=>{f.add(e),e.once(`close`,()=>f.delete(e)),e.pause(),_(e).catch(t=>{m(t),e.destroy()})},_=async e=>{let t=await h();if(a||e.destroyed)return;let n=await pi(t,()=>a);if(a||e.destroyed){n.destroy();return}f.add(n),n.once(`close`,()=>f.delete(n)),n.on(`error`,()=>e.destroy()),n.once(`close`,()=>e.destroy()),e.on(`error`,()=>n.destroy()),e.once(`close`,()=>n.destroy()),e.pipe(n),n.pipe(e)};return{close:async()=>l||(l=(async()=>{a=!0,o||(o=!0,u());for(let e of f)e.destroy();f.clear(),c&&!i&&await Promise.allSettled([c]),!(!r||!i)&&(await new Promise(e=>{r.close(()=>e())}),i=!1)})(),l),fail:m,listen:async()=>c||(r=ct(g),c=new Promise((n,a)=>{let o=e=>{if(i){m(e);return}a(e)};r.once(`error`,o),r.once(`listening`,()=>{i=!0,r.off(`error`,o),r.on(`error`,m),n()}),r.listen(t,e)}),c),wait:()=>p}}async function pi(e,t){let n=Date.now()+1e4,r;for(;!t();)try{return await mi(e)}catch(e){if(r=e,Date.now()>=n)break;await new Promise(e=>setTimeout(e,50))}throw r instanceof Error?r:Error(`Could not connect to the dashboard.`)}function mi({host:e=`127.0.0.1`,port:t}){return new Promise((n,r)=>{let i=st({host:e,port:t}),a=e=>{i.off(`connect`,o),i.destroy(),r(e)},o=()=>{i.off(`error`,a),n(i)};i.once(`error`,a),i.once(`connect`,o)})}const hi=q.platform===`win32`?`react-router.cmd`:`react-router`;function gi(e){return L(j.resolve(e,`dashboard/dashboard.config.ts`))}function _i({cwd:e,env:t,port:n}){let r=t.PATH??t.Path??``,i,a,o=!1,s,c,l=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>{d()};return q.on(e,t),{handler:t,signal:e}}),u=async(e,t)=>{try{await e,o||a?.fail(Error(`The dashboard development server stopped unexpectedly.`))}catch(e){o||a?.fail(e)}finally{await t.outputTasks,t.stdout.end(),t.stderr.end(),await Promise.allSettled([it(t.stdout),it(t.stderr)]),i===e&&(i=void 0)}};a=fi({port:n,start:async()=>{if(o)throw Error(`The dashboard development server was stopped before it started.`);let n=await li.getAvailablePort();if(o)throw Error(`The dashboard development server was stopped before it started.`);let a=at({label:`dashboard`}),s=at({color:`red`,label:`dashboard`});a.pipe(q.stdout,{end:!1}),s.pipe(q.stderr,{end:!1});let l=F(hi,[`dev`,`--host`,`127.0.0.1`,`--port`,String(n)],{cwd:j.resolve(e,`dashboard`),env:{...t,PATH:j.resolve(e,`node_modules/.bin`)+j.delimiter+r},stdin:`inherit`});i=l;let d=Promise.allSettled([yi(l.stdout,a),yi(l.stderr,s)]);return c=u(l,{outputTasks:d,stderr:s,stdout:a}),{host:`127.0.0.1`,port:n}}});let d=async()=>s||(s=(async()=>{o=!0,await a?.close(),i?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),await c;for(let{handler:e,signal:t}of l)q.off(t,e)})(),s);return{close:d,listen:()=>a.listen(),wait:()=>a.wait()}}async function vi({cwd:e=q.cwd(),env:t=q.env,port:n}){let r=_i({cwd:e,env:t,port:n});try{await r.listen(),await r.wait()}finally{await r.close()}}async function yi(e,t){for await(let n of e)t.write(`${n}\n`)||await new Promise(e=>t.once(`drain`,e))}const bi=m({name:`dashboard`,cmds:{dev:n({name:`dev`,args:{port:c({long:`port`,type:o,description:`Local TCP port for the dashboard proxy.`})},handler:({port:e})=>vi({port:e})}),build:n({name:`build`,args:{mode:c({long:`mode`,type:l(p),description:`Vite environment mode used for the dashboard build.`})},handler:({mode:e})=>ai(void 0,void 0,e)}),typegen:n({name:`typegen`,args:{},handler:()=>ii()})}});function xi(){var e=typeof SuppressedError==`function`?SuppressedError:function(e,t){var n=Error();return n.name=`SuppressedError`,n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(t!=null){if(Object(t)!==t)throw TypeError(`using declarations can only be used with objects, functions, null, or undefined.`);if(e)var r=t[Symbol.asyncDispose||Symbol.for(`Symbol.asyncDispose`)];if(r===void 0&&(r=t[Symbol.dispose||Symbol.for(`Symbol.dispose`)],e))var i=r;if(typeof r!=`function`)throw TypeError(`Object is not disposable.`);i&&(r=function(){try{i.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,i=this.e,a=0;function o(){for(;r=n.pop();)try{if(!r.a&&a===1)return a=0,n.push(r),Promise.resolve().then(o);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(o,s)}else a|=1}catch(e){return s(e)}if(a===1)return i===t?Promise.resolve():Promise.reject(i);if(i!==t)throw i}function s(n){return i=i===t?n:new e(n,i),o()}return o()}}}async function Si({all:e,cwd:t=process.cwd(),ids:n=[],matches:r=[],now:i=new Date}={}){let a=await Oi(t),o=await ki(a.config,t,async e=>a.module.developmentJobs.createStateAdmin(e).list()),s=lt({jobs:a.module.developmentJobs.jobs,now:i,records:o??[]}),c=Ei(s,{all:e,ids:n,matches:r},{defaultAll:!0});return{database:{dialect:a.dialect,state:o?`existing`:`missing`},jobs:s.filter(e=>c.has(e.id)),version:1}}async function Ci({all:e,breakLeases:t=!1,cwd:n=process.cwd(),dryRun:r=!1,ids:i=[],json:a=!1,matches:o=[],now:s=new Date,yes:c=!1}){let l=await Si({all:!0,cwd:n,now:s}),u=Ei(l.jobs,{all:e,ids:i,matches:o},{defaultAll:!1}),d=l.jobs.filter(e=>u.has(e.id)),f=d.filter(e=>e.lease===`active`);if(r)return{database:l.database,dryRun:!0,jobs:d.map(e=>({id:e.id,status:e.lease===`active`&&!t?`blocked-active-lease`:e.persisted?`would-reset`:`no-state`})),version:1};if(f.length>0&&!t)throw Error(`Cannot reset active development job ${Ni(f.map(e=>e.id))}. Wait for the lease to expire or pass --break-leases.`);if((t||e||o.length>0||d.length>1)&&!c){if(a||!process.stdin.isTTY)throw Error(`This reset requires --yes when prompts are unavailable.`);let e=await B.confirm({message:`Reset local development state for ${d.length} job${d.length===1?``:`s`}?`});if(B.isCancel(e)||!e)throw Error(`Development job state reset was cancelled.`)}if(l.database.state===`missing`)return{database:l.database,dryRun:!1,jobs:d.map(e=>({id:e.id,status:`no-state`})),version:1};let p=await Oi(n),m=await ki(p.config,n,async e=>p.module.developmentJobs.createStateAdmin(e).reset({breakLeases:t,jobIds:[...u],now:s}));if(!m)throw Error(`The local database disappeared before development job state was reset.`);if(m.activeLeaseIds.length>0&&!t)throw Error(`Cannot reset active development job ${Ni(m.activeLeaseIds)}. Wait for the lease to expire or pass --break-leases.`);let h=new Set(m.resetIds);return{database:l.database,dryRun:!1,jobs:d.map(e=>({id:e.id,status:h.has(e.id)?`reset`:`no-state`})),version:1}}function wi(e){let t=Mi(e.database);return e.jobs.length===0?`${t}No local development jobs are configured.`:`${t}${Pi([`Job`,`Status`,`Last success`,`Next eligible`,`Lease`],e.jobs.map(e=>[e.id,e.lease===`active`?`running`:e.registration===`orphaned`?`orphaned`:e.eligibility,ji(e.lastSucceededAt),ji(e.nextEligibleAt),e.lease===`none`?`-`:`${e.lease} until ${ji(e.leaseUntil)}`]))}`}function Ti(e){let t=Mi(e.database);return e.jobs.length===0?`${t}No local development job state matched.`:`${t}${Pi([`Job`,`Result`],e.jobs.map(e=>[e.id,e.status.replaceAll(`-`,` `)]))}`}function Ei(e,{all:t=!1,ids:n=[],matches:r=[]},{defaultAll:i}){if(t&&(n.length>0||r.length>0))throw Error(`Use --all or explicit job selectors, not both.`);if(!t&&n.length===0&&r.length===0){if(i)return new Set(e.map(e=>e.id));throw Error(`Select one or more jobs by ID or --match, or pass --all.`)}let a=new Set(e.map(e=>e.id)),o=n.filter(e=>!a.has(e));if(o.length>0)throw Error(`Unknown development job ${Ni(o)}.`);let s=new Set(t?a:n);for(let t of r){let n=Di(t),r=e.filter(e=>n.test(e.id));if(r.length===0)throw Error(`Development job pattern ${JSON.stringify(t)} matched no jobs.`);for(let e of r)s.add(e.id)}return s}function Di(e){if(!e)throw Error(`Development job patterns must not be empty.`);let t=[...e].map(e=>e===`*`?`.*`:e===`?`?`.`:e.replace(/[\\^$.[\]{}()+|]/gu,`\\$&`)).join(``);return RegExp(`^${t}$`,`u`)}async function Oi(e){let t=await G({cwd:e}),n=t.jobs?.entry;if(!n)throw Error(`coreframe.config.ts must configure jobs.entry before managing development job state.`);let r=await $e(n,e);if(!r.developmentJobs||!Array.isArray(r.developmentJobs.jobs)||typeof r.developmentJobs.createStateAdmin!=`function`)throw Error(`${n} must export developmentJobs with jobs and createStateAdmin properties.`);return{config:t,dialect:t.database?.dialect??`postgres`,module:r}}async function ki(e,t,n){try{var r=xi();let a=e.database?.dialect??`postgres`,o=a===`sqlite`?j.resolve(t,`.coreframe/turso.db`):j.resolve(t,`.coreframe/postgres/PG_VERSION`);try{await Ze(o)}catch(e){if(Fi(e)&&e.code===`ENOENT`)return;throw e}if(a===`sqlite`)try{var i=xi();let r=await x({cwd:t,env:i.a(await de({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Ai(n,r)}finally{r.$client.close()}}catch(e){i.e=e}finally{await i.d()}let s=await ee({cwd:t,env:r.a(await E({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Ai(n,s)}finally{await s.$client.end()}}catch(e){r.e=e}finally{await r.d()}}async function Ai(e,t){try{return await e(t)}catch(e){throw Ii(e)?Error(`The local development job state table is missing. Run coreframe db migrate-local, then retry.`,{cause:e}):e}}function ji(e){return e?.toISOString()??`-`}function Mi(e){return e.state===`missing`?`Local ${e.dialect} database is missing; no database was created.\n\n`:``}function Ni(e){return e.map(e=>JSON.stringify(e)).join(`, `)}function Pi(e,t){let n=e.map((e,n)=>Math.max(e.length,...t.map(e=>e[n].length))),r=e=>e.map((e,t)=>e.padEnd(n[t])).join(` `).trimEnd();return[r(e),r(n.map(e=>`-`.repeat(e))),...t.map(r)].join(`
|
|
7
|
+
`)}async function yn({apiOrigin:e,cwd:t=process.cwd(),environment:n=process.env,platform:r=`web`,profile:i=!1,simulator:a=!1,prepareClient:o=he,runCommand:s=xn}={}){bn(r,{profile:i,simulator:a});let c={...n};delete c[an],delete c[on],delete c.COREFRAME_PLATFORM,delete c.TAURI_ENV_PLATFORM;let l=r===`web`?void 0:A(e??n.COREFRAME_API_ORIGIN);for(let e of pn(r,{apiOrigin:l,cwd:t,profile:i,simulator:a})){if(e.kind===`prepare`){if(!l)throw Error(`A production API origin is required for the Flutter ${e.platform} build.`);await o({apiOrigin:l,cwd:t,environment:c,platform:e.platform});continue}await s(e.command,e.args,{cwd:e.cwd,env:{...c,...e.environment}})}r===`android`?console.log(hn(t,{profile:i})):r===`ios`?console.log(gn(t,{profile:i,simulator:a})):r===`windows`?console.log(_n(t)):r===`linux`&&console.log(vn(t))}function bn(e,{profile:t,simulator:n}){if(t&&e===`web`)throw Error(`The --profile flag is only supported for Flutter build targets.`);if(n&&e!==`ios`)throw Error(`The --simulator flag is only supported for the iOS build target.`);if(t&&n)throw Error(`Flutter profile builds are not supported for the iOS simulator.`)}async function xn(e,t,{cwd:n,env:r}){await F(e,t,{cwd:n,env:r,stdio:`inherit`})}function Sn(e,t,n,r){return{kind:`command`,command:e,args:t,cwd:n,...r===void 0?{}:{environment:r}}}const Cn=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in a packaged Flutter client.`,async from(e){return A(e)}}),wn=n({name:`build`,description:`Build the web client or a Flutter app (release by default). Tauri is not built.`,args:{platform:u({type:l(s(fn)),displayName:`platform`,description:`Build target: web, iOS, Android, macOS, Windows, or Linux. Defaults to web.`}),apiOrigin:c({long:`api-origin`,type:l(Cn),description:`Exact production HTTPS API origin for a Flutter build. Defaults to COREFRAME_API_ORIGIN.`}),profile:i({long:`profile`,description:`Build a Flutter profile app instead of the default release app.`,defaultValue:()=>!1}),simulator:i({long:`simulator`,description:`Build iOS for the simulator instead of a physical device.`,defaultValue:()=>!1})},handler:({apiOrigin:e,platform:t,profile:n,simulator:r})=>yn({apiOrigin:e,platform:t,profile:n,simulator:r})});function Tn(e){return e.apiKey??process.env.TYPESAFE_API_KEY??process.env.JEV_API_KEY}function En(e){return e.baseUrl??process.env.TYPESAFE_API_BASE??process.env.JEV_API_BASE??`https://jevtypesafeai.com/api/v1/decide`}function Dn(){return{resolvable:{type:`noul`,instructions:`Can these conflicting changes be mechanically combined without choosing between behaviors or losing either side's intent? Answer yes only when a resolution preserves both sides' semantics.`},strategy:{type:`choice`,instructions:`Which resolution strategy preserves both sides' intent?`,criteria:{keep_both:`both changes apply independently; concatenate or interleave them`,take_ours:`the ours side already supersedes or subsumes the theirs side`,take_theirs:`the theirs side already supersedes or subsumes the ours side`,combine_statements:`statements from both sides must be merged into shared code`}},risk:{type:`score`,instructions:`Risk that a mechanically produced resolution silently changes behavior, on an ordered scale.`,criteria:[`minimal`,`low`,`moderate`,`elevated`,`high`,`severe`]}}}async function On(e,t={}){let n=Tn(t);if(!n)return{called:!1,approved:!1,reason:`jev_unavailable: no API key`};let r={state:e,questions:Dn()},i;try{let e=await(t.fetchImpl??fetch)(En(t),{method:`POST`,headers:{Authorization:`Bearer ${n}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:AbortSignal.timeout(t.timeoutMs??1e4)});if(!e.ok)return{called:!0,approved:!1,reason:`jev_unavailable: HTTP ${e.status}`};i=await e.json()}catch(e){return{called:!0,approved:!1,reason:`jev_unavailable: ${e instanceof Error?e.message:String(e)}`}}let a=i.answers?.resolvable?.noul;if(typeof a!=`number`||Number.isNaN(a))return{called:!0,approved:!1,reason:`jev_inconclusive: missing noul answer`,answers:i.answers};let o=t.noulThreshold??.8,s=t.confidenceThreshold??.7,c=i.answers?.strategy?.confidence??i.answers?.risk?.confidence;if(a<o)return{called:!0,approved:!1,reason:`jev_refused: resolvable ${a.toFixed(2)} < ${o}`,answers:i.answers};if(c!==void 0&&c<s)return{called:!0,approved:!1,reason:`jev_inconclusive: confidence ${c.toFixed(2)} < ${s}`,answers:i.answers};let l=i.answers?.strategy?.choice;return{called:!0,approved:!0,reason:`jev approved: resolvable ${a.toFixed(2)}${l?`, strategy ${l}`:``}`,answers:i.answers}}async function kn(e,t={}){await Promise.all(e.map(async e=>{if(e.tier!==`judgment`)return;let n=await On({file:e.path,reasons:e.reasons,entities:e.entities,evidence:e.evidence},t);e.gate=n,e.decision=n.approved?`resolvable`:`escalate`,e.reasons.push(n.reason)}))}const An=`safe`,jn=`judgment`,J=`unsafe`,Mn=new Set([`both_added`,`rename_rename`,`rename_modify`]),Nn=new Set([`both_modified`,`modify_delete`,...Mn]);function Pn(e,t,n){let r=I(t,n,{cwd:e,encoding:`utf8`});if(r.error)throw r.error;return r}function Fn(e,t=`git`){let n=Pn(e,t,[`ls-files`,`-u`,`-z`]);if(n.status!==0)throw Error(`git ls-files -u failed: ${n.stderr.trim()||n.stdout.trim()}`);let r=new Set;for(let e of n.stdout.split(`\0`)){if(!e)continue;let t=e.indexOf(` `);t!==-1&&r.add(e.slice(t+1))}return[...r]}function In(e,t,n=`weave`){let r=I(n,[`explain`,t,`--json`],{cwd:e,encoding:`utf8`});if(r.error)return{error:`weave unavailable: ${r.error.message}`};if(r.status!==0){let e=(r.stderr||r.stdout).toString().trim();return{error:`weave explain failed (${r.status}): ${e}`}}try{return{explain:JSON.parse(r.stdout)}}catch{return{error:`weave explain returned unparseable output`}}}function Ln(e,t,n,r=`git`){let i=Pn(e,r,[`show`,`:${t}:${n}`]);return i.status===0?i.stdout:void 0}function Rn(e){return e.collision??[]}function zn(e){return Rn(e).length>0&&e.ours?.action===`modified`&&e.theirs?.action===`modified`}function Bn(e){let t=e.kind??`unknown`,n=e.entity??`(file)`,r=[],i=(e,r)=>({entity:n,kind:t,tier:e,reasons:[r]});if(!Nn.has(t))return i(J,`unrecognized conflict kind "${t}"`);if(Mn.has(t))return i(J,`${t}: divergent definitions of the same-named entity`);if(t===`modify_delete`){if((e.contested_hunks??0)===0){let i=e.repair?.kept_by;return r.push(`modify_delete with no contested hunks (decide_existence${i?`, kept_by=${i}`:``})`),{entity:n,kind:t,tier:jn,reasons:r}}return i(J,`modify_delete with contested hunks: deleted entity was also rewritten`)}let a=e.hunks??[];if(a.every(e=>Rn(e).length===0))return r.push(`both sides wrote adjacent lines only; no shared base statement rewritten`),{entity:n,kind:t,tier:An,reasons:r};if(a.some(zn))return i(J,`collision on the same base statement: both sides rewrote it differently`);let o=a.reduce((e,t)=>e+Rn(t).length,0);return o<=3?(r.push(`contested collision bounded to ${o} statement(s)`),{entity:n,kind:t,tier:jn,reasons:r}):i(J,`contested collision spans ${o} base statements`)}const Vn={[An]:0,[jn]:1,[J]:2};function Hn(e,t){if(t.error||!t.explain)return{path:e,tier:J,decision:`escalate`,reasons:[t.error??`no analysis`],entities:[],analysisError:t.error};let n=(t.explain.conflicts??[]).map(Bn),r=n.reduce((e,t)=>Vn[t.tier]>Vn[e]?t.tier:e,An),i=n.flatMap(e=>e.reasons.map(t=>`${e.entity}: ${t}`));return{path:e,tier:r,decision:r===`safe`?`resolvable`:`escalate`,reasons:i,entities:n}}const Un=12e3;function Wn(e,t,n,r,i){let a={base:Ln(e,1,t,r),ours:Ln(e,2,t,r),theirs:Ln(e,3,t,r)},o=e=>e===void 0||e.length<=Un?e:`${e.slice(0,Un)}\n… truncated`,s={base:o(a.base),ours:o(a.ours),theirs:o(a.theirs)},c={};if(a.base&&(a.ours||a.theirs)){let e=we(N(je(),`coreframe-conflicts-`));try{let n=N(e,`base`);z(n,a.base);for(let r of[`ours`,`theirs`]){let o=a[r];if(!o)continue;let s=N(e,r);z(s,o);let l=I(i,[`patch`,`extract`,n,s,`--path`,t],{encoding:`utf8`});if(l.status===0)try{c[r]=JSON.parse(l.stdout)}catch{c[r]={error:`unparseable patch ops`}}}}catch{}finally{Ee(e,{recursive:!0,force:!0})}}return{explain:n,stages:s,entityOps:c}}async function Gn(e){let t=e.gitBin??`git`,n=e.weaveBin??process.env.COREFRAME_WEAVE_BIN??`weave`,r=Fn(e.worktree,t).map(r=>{let i=In(e.worktree,r,n),a=Hn(r,i);return a.tier===`judgment`&&(a.evidence=Wn(e.worktree,r,i.explain,t,n)),a}),i=r.filter(e=>e.tier===jn);i.length>0&&await kn(i,e.jev??{});let a={total:r.length,safe:r.filter(e=>e.tier===An).length,judgment:r.filter(e=>e.tier===jn).length,unsafe:r.filter(e=>e.tier===J).length},o=r.every(e=>e.decision===`resolvable`)?`cheap-llm-resolvable`:`escalate`;return{worktree:e.worktree,recommendation:o,files:r,summary:a}}function Kn(e){for(let t of e.files){let e=t.decision===`resolvable`?` `:`!`;console.log(`${e} ${t.tier.padEnd(8)} ${t.decision.padEnd(10)} ${t.path}`);for(let e of t.reasons)console.log(` ${e}`)}let{summary:t}=e;console.log(`\n${t.total} conflicted file(s): ${t.safe} safe, ${t.judgment} judgment, ${t.unsafe} unsafe`),console.log(`recommendation: ${e.recommendation}`)}const qn=m({name:`conflicts`,description:`Classify rebase/merge conflicts in a worktree as cheap-LLM-resolvable or escalate.`,cmds:{classify:n({name:`classify`,description:`Analyze unmerged index stages with weave and emit a per-conflict verdict. Judgment-tier conflicts are gated through the TypeSafe Jev decide API when TYPESAFE_API_KEY (or JEV_API_KEY) is set; any Jev failure escalates.`,args:{worktree:c({long:`worktree`,type:l(p),description:`Worktree to inspect. Defaults to the current directory.`}),json:i({long:`json`,description:`Print the full structured report instead of a summary.`,defaultValue:()=>!1})},handler:async({worktree:e,json:t})=>{let n=await Gn({worktree:e??process.cwd()});t?console.log(JSON.stringify(n,void 0,2)):Kn(n),n.recommendation!==`cheap-llm-resolvable`&&(process.exitCode=1)}})}}),Jn=/^[a-f0-9]{64}$/,Yn=/^[a-f0-9]{40}$/,Xn=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function Zn(e){if(!Jn.test(e))throw Error(`Invalid SHA-256 digest "${e}".`);return e}function Qn(e){if(!Yn.test(e))throw Error(`Invalid full Git revision "${e}".`);return e}function $n(e,t){if(!Xn.test(e))throw Error(`${t} must contain only letters, numbers, dots, underscores, or hyphens.`);return e}function er(e){return`projects/${$n(e,`Project ID`)}/i18n/v1`}function tr(e,t){return Zn(t),`${er(e)}/objects/sha256/${t.slice(0,2)}/${t}`}function nr(e,t){return Qn(t),`${er(e)}/commits/${t}.json`}function rr(e,t){return ir(t),`${er(e)}/releases/${encodeURIComponent(t)}.json`}function ir(e){if(!e.startsWith(`v`)||e.length<2||e.length>128||/\s/.test(e)||e.includes(`..`))throw Error(`Release tag "${e}" must be a valid v-prefixed tag.`);return e}function Y(e,t){if(!t||t.startsWith(`/`)||t.includes(`\0`))throw Error(`Unsafe i18n artifact path "${t}".`);let n=P(e),r=P(n,t);if(r!==n&&!r.startsWith(`${n}${be}`))throw Error(`Unsafe i18n artifact path "${t}".`);return r}function X(e,t,n){return`${e.directory}/${t}/${n}.json`}function ar(e,t,n){return`${e.directory}/${t}/${n}.mjs`}async function or(e){await F(`pnpm`,[`exec`,`lingui`,`extract`],{cwd:e,stdio:`inherit`})}async function sr({config:e,cwd:t,strict:n,temporaryDirectory:r}){let i=[];try{for(let n of e.locales)for(let a of e.catalogs){let o=Y(t,X(e,n,a)),s=await fr(o),c=Object.fromEntries(Object.entries(s).filter(([,e])=>!e.obsolete)),l=N(r,`${n}-${a}.json`);await V(M(l),{recursive:!0}),await Ke(o,l),i.push({path:o,backup:l}),await pr(o,c)}await F(`pnpm`,[`exec`,`lingui`,`compile`,...n?[`--strict`]:[]],{cwd:t,stdio:`inherit`})}finally{try{for(let{path:e,backup:t}of i)await Ke(t,e)}finally{for(let n of e.locales)for(let r of e.catalogs)await U(Y(t,ar(e,n,r)),{force:!0})}}}async function cr({config:e,cwd:t}){let n=[];for(let r of e.locales)if(r!==e.sourceLocale)for(let i of e.catalogs){let a=await fr(Y(t,X(e,r,i)));for(let[e,t]of Object.entries(a)){if(t.obsolete||t.translation?.trim())continue;let a=t.message;if(typeof a!=`string`||!a)throw Error(`Missing source message metadata for ${r}:${e}.`);n.push({catalog:i,comments:t.comments?.filter(e=>typeof e==`string`)??[],context:t.context,id:e,locale:r,message:a,origins:t.origin?.map(([e,t])=>t?`${e}:${t}`:e)??[],placeholders:Object.keys(t.placeholders??{}).sort()})}}return n.sort((e,t)=>vr(e).localeCompare(vr(t)))}async function lr({config:e,cwd:t,messages:n,env:r=process.env}){if(n.length===0)return{translations:[],version:1};if(!e.generator)throw Error(`I18n preparation found ${n.length} missing translations, but no generator is configured.`);let i={messages:n,sourceLocale:e.sourceLocale,version:1};return mr(await hr({args:e.generator.args??[],command:e.generator.command,cwd:t,env:r,input:JSON.stringify(i)}))}async function ur({config:e,cwd:t,missing:n,response:r}){let i=new Map(n.map(e=>[vr(e),e])),a=new Map;for(let e of r.translations){let t=vr(e);if(!i.has(t))throw Error(`Translation generator returned unexpected entry ${e.locale}:${e.catalog}:${e.id}.`);if(a.has(t))throw Error(`Translation generator returned duplicate entry ${e.locale}:${e.catalog}:${e.id}.`);if(!e.translation.trim())throw Error(`Translation generator returned an empty entry ${e.locale}:${e.id}.`);a.set(t,e.translation)}let o=[...i.keys()].filter(e=>!a.has(e));if(o.length>0)throw Error(`Translation generator omitted ${o.length} required entries.`);let s=await Qe(`@lingui/message-utils/compileMessage`,t);for(let e of n){let t=a.get(vr(e));gr({compileMessage:s,id:e.id,locale:e.locale,source:e.message,translation:t})}for(let n of e.locales)if(n!==e.sourceLocale)for(let r of e.catalogs){let i=Y(t,X(e,n,r)),o=await fr(i),s=!1;for(let[e,t]of Object.entries(o)){let i=a.get(vr({catalog:r,id:e,locale:n}));if(i!==void 0){if(t.translation?.trim())throw Error(`Refusing to overwrite preserved translation ${n}:${e}.`);t.translation=i,s=!0}}s&&await pr(i,o)}}async function dr({config:e,cwd:t}){let n=await cr({config:e,cwd:t});if(n.length>0)throw Error(`I18n catalogs remain incomplete: ${n.length} translations are missing.`);let r=await Qe(`@lingui/message-utils/compileMessage`,t);for(let n of e.locales)if(n!==e.sourceLocale)for(let i of e.catalogs){let a=await fr(Y(t,X(e,n,i)));for(let[e,t]of Object.entries(a))if(!t.obsolete){if(typeof t.message!=`string`||typeof t.translation!=`string`)throw Error(`Incomplete source metadata for active translation ${n}:${e}.`);gr({compileMessage:r,id:e,locale:n,source:t.message,translation:t.translation})}}}async function fr(e){let t=JSON.parse(await H(e,`utf8`));if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`Lingui rich JSON catalog must be an object: ${e}.`);for(let[n,r]of Object.entries(t)){if(!r||typeof r!=`object`||Array.isArray(r))throw Error(`Invalid Lingui rich JSON message ${n} in ${e}.`);let t=r;if(t.translation!==void 0&&typeof t.translation!=`string`)throw Error(`Invalid translation value for ${n} in ${e}.`);if(t.message!==void 0&&t.message!==null&&typeof t.message!=`string`)throw Error(`Invalid source message value for ${n} in ${e}.`);if(t.context!==void 0&&typeof t.context!=`string`)throw Error(`Invalid context value for ${n} in ${e}.`);if(t.obsolete!==void 0&&typeof t.obsolete!=`boolean`)throw Error(`Invalid obsolete marker for ${n} in ${e}.`);if(t.comments!==void 0&&(!Array.isArray(t.comments)||t.comments.some(e=>typeof e!=`string`)))throw Error(`Invalid comments for ${n} in ${e}.`);if(t.origin!==void 0&&(!Array.isArray(t.origin)||t.origin.some(e=>!Array.isArray(e)||typeof e[0]!=`string`||e[1]!==void 0&&typeof e[1]!=`number`)))throw Error(`Invalid origins for ${n} in ${e}.`);if(t.placeholders!==void 0&&(!t.placeholders||typeof t.placeholders!=`object`||Array.isArray(t.placeholders)))throw Error(`Invalid placeholders for ${n} in ${e}.`)}return t}async function pr(e,t){await V(M(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;await W(n,`${JSON.stringify(t,null,2)}\n`),await Xe(n,e)}function mr(e){let t;try{t=JSON.parse(e)}catch{throw Error(`Translation generator returned invalid JSON.`)}if(!t||typeof t!=`object`||t.version!==1||!Array.isArray(t.translations))throw Error(`Translation generator returned an invalid response envelope.`);for(let e of t.translations)if(!e||typeof e!=`object`||typeof e.id!=`string`||typeof e.catalog!=`string`||typeof e.locale!=`string`||typeof e.translation!=`string`)throw Error(`Translation generator returned an invalid translation entry.`);return t}function hr({args:e,command:t,cwd:n,env:r,input:i}){return F(t,e,{cwd:n,env:r,stdio:[{string:i},`pipe`,`ignore`]}).then(({stdout:e})=>{if(Buffer.byteLength(e)>10*1024*1024)throw Error(`Translation generator output exceeded 10 MiB.`);return e}).catch(()=>{throw Error(`Translation generator exited unsuccessfully.`)})}function gr({compileMessage:e,id:t,locale:n,source:r,translation:i}){let a,o;try{a=e.compileMessageOrThrow(r),o=e.compileMessageOrThrow(i)}catch{throw Error(`Translation ${n}:${t} is not valid ICU MessageFormat.`)}let s=_r(a),c=_r(o);if(s.length!==c.length||s.some((e,t)=>e!==c[t]))throw Error(`Translation ${n}:${t} does not preserve source ICU placeholders.`)}function _r(e){let t=[];function n(e){for(let r of e){if(typeof r==`string`)continue;let[e,i=`argument`,a]=r;if(t.push(`${e}:${i}`),a&&typeof a==`object`&&!Array.isArray(a))for(let e of Object.values(a))Array.isArray(e)&&n(e)}}return n(e),t.sort()}function vr(e){return`${e.locale}\0${e.catalog}\0${e.id}`}function yr(e){return rt(`sha256`).update(e).digest(`hex`)}async function br(e){return yr(await H(e))}function xr(e){return Buffer.from(`${JSON.stringify(e,null,2)}\n`)}async function Sr({bucket:e,digest:t,projectId:n,source:r,store:i}){if(Zn(t),await br(r)!==t)throw Error(`I18n object source does not match declared SHA-256 digest ${t}.`);let a=tr(n,t);await i.has(e,a)||await i.upload(e,a,r,`application/octet-stream`);let o=`${r}.${process.pid}.${K()}.verify`;try{if(await i.download(e,a,o),await br(o)!==t)throw Error(`Existing immutable i18n object ${a} failed integrity verification.`)}finally{await U(o,{force:!0})}}async function Cr({bucket:e,key:t,reference:n,store:r,temporaryDirectory:i}){let a=xr(n),o=N(i,`reference-${K()}.json`);if(await r.has(e,t))try{if(await r.download(e,t,o),!(await H(o)).equals(a))throw Error(`Immutable i18n reference ${t} already resolves to different snapshot data.`);return}finally{await U(o,{force:!0})}await W(o,a,{flag:`wx`});try{await r.upload(e,t,o,`application/json`)}finally{await U(o,{force:!0})}let s=N(i,`reference-${K()}.verify.json`);try{if(await r.download(e,t,s),!(await H(s)).equals(a))throw Error(`Uploaded immutable i18n reference ${t} failed verification.`)}finally{await U(s,{force:!0})}}async function wr({bucket:e,manifest:t,projectId:n,store:r,temporaryDirectory:i}){let a=xr(t),o=yr(a),s=N(i,`manifest-${o}.json`);await W(s,a,{flag:`wx`});try{await Sr({bucket:e,digest:o,projectId:n,source:s,store:r})}finally{await U(s,{force:!0})}return o}async function Tr({bucket:e,key:t,store:n,temporaryDirectory:r}){if(!await n.has(e,t))return;let i=N(r,`reference-${K()}.json`);try{await n.download(e,t,i);let r=JSON.parse(await H(i,`utf8`));if(r.version!==1||typeof r.revision!=`string`||typeof r.snapshot!=`string`)throw Error(`Invalid i18n reference at ${t}.`);return Qn(r.revision),Zn(r.snapshot),r}finally{await U(i,{force:!0})}}async function Er({bucket:e,projectId:t,revision:n,store:r,temporaryDirectory:i}){let a=await Tr({bucket:e,key:nr(t,n),store:r,temporaryDirectory:i});if(a&&a.revision!==n)throw Error(`I18n commit reference does not match requested revision ${n}.`);return a}async function Dr({bucket:e,projectId:t,reference:n,store:r,tag:i,temporaryDirectory:a}){await Cr({bucket:e,key:nr(t,n.revision),reference:n,store:r,temporaryDirectory:a}),i&&await Cr({bucket:e,key:rr(t,i),reference:n,store:r,temporaryDirectory:a})}async function Or({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:a}){Zn(n);let o=N(P(t),`v1`,`sha256`,n.slice(0,2),n);if(await Ar(o,n)===!1){await V(M(o),{recursive:!0});let t=`${o}.${process.pid}.${K()}.tmp`;try{if(await i.download(e,tr(r,n),t),await br(t)!==n)throw Error(`Downloaded i18n object failed SHA-256 verification: ${n}.`);await U(o,{force:!0}),await Xe(t,o)}finally{await U(t,{force:!0})}}await V(M(a),{recursive:!0});let s=`${a}.${process.pid}.${K()}.tmp`;try{if(await Ke(o,s),await br(s)!==n)throw Error(`Cached i18n object failed SHA-256 verification: ${n}.`);await U(a,{force:!0}),await Xe(s,a)}finally{await U(s,{force:!0})}}async function kr({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,temporaryDirectory:a}){let o=N(a,`manifest-${n}.json`);await Or({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:o});let s=JSON.parse(await H(o,`utf8`));if(s.version!==1||s.projectId!==r||typeof s.revision!=`string`||!Array.isArray(s.files)||!Array.isArray(s.catalogs)||s.catalogs.some(e=>typeof e!=`string`)||!Array.isArray(s.locales)||s.locales.some(e=>typeof e!=`string`)||typeof s.sourceLocale!=`string`||typeof s.generator!=`string`||typeof s.linguiVersion!=`string`)throw Error(`Invalid i18n snapshot manifest ${n}.`);Qn(s.revision),s.baseline!==void 0&&Zn(s.baseline);for(let e of s.files){if(!e||typeof e!=`object`||typeof e.path!=`string`||typeof e.digest!=`string`||typeof e.size!=`number`)throw Error(`Invalid file entry in i18n snapshot manifest ${n}.`);Zn(e.digest)}return s}async function Ar(e,t){try{return(await Ze(e)).isFile()&&await br(e)===t}catch{return!1}}async function jr({cwd:e=process.cwd(),env:t=process.env}={}){let n=await G({cwd:e});if(!n.i18n)return;let r=t.COREFRAME_I18N_RELEASE_REVISION;if(r){if(Fr(Ir(n.i18n))===`multilingual`){await Pr({cwd:e,env:t,revision:r});return}console.log(`I18n source-only mode: building source catalogs for ${r}; no prepared translation snapshot is required.`)}await or(e)}async function Mr({cwd:e=process.cwd(),projectConfig:t}={}){let n=t??await G({cwd:e});if(!n.i18n)return;let r=Ir(n.i18n),i=Y(e,r.directory);try{if(!(await Ze(i)).isDirectory())throw Error(`I18n catalog path is not a directory: ${i}.`)}catch(t){if(t.code!==`ENOENT`)throw t;await or(e);return}for(let t of r.locales)for(let n of r.catalogs)try{if(!(await Ze(Y(e,X(r,t,n)))).isFile())throw Error(`I18n catalog path is not a file: ${t}/${n}.json.`)}catch(t){if(t.code!==`ENOENT`)throw t;await or(e);return}}async function Nr({cwd:e=process.cwd(),env:t=process.env,store:n,tag:r}){ir(r),await Gr(e);let i=await Wr(e);await Kr(e,r,i);let a=await G({cwd:e});if(!a.i18n)throw Error(`Missing i18n configuration in coreframe.config.ts.`);let o=Ir(a.i18n);if(Fr(o)===`source-only`)return{mode:`source-only`,sourceLocale:o.sourceLocale};let s=await Lr({cwd:e,env:t,projectConfig:a,store:n}),c=await Je(N(je(),`coreframe-i18n-prepare-`));try{let n=await Er({bucket:s.assets.sourceBucket,projectId:s.assets.projectId,revision:i,store:s.store,temporaryDirectory:c});if(n){let e=await kr({bucket:s.assets.sourceBucket,cacheRoot:s.cacheRoot,digest:n.snapshot,projectId:s.assets.projectId,store:s.store,temporaryDirectory:c});return Ur(s,e,i),await zr(s,e),await Dr({bucket:s.assets.sourceBucket,projectId:s.assets.projectId,reference:n,store:s.store,tag:r,temporaryDirectory:c}),{mode:`multilingual`,reused:!0,snapshot:n.snapshot}}return await Hr(s,c,async()=>{let n=await Rr(s,i,c);n||await Vr(s),await or(e);let a=await cr({config:s.config,cwd:e}),o=await lr({config:s.config,cwd:e,env:t,messages:a});await ur({config:s.config,cwd:e,missing:a,response:o}),await dr({config:s.config,cwd:e}),await sr({config:s.config,cwd:e,strict:!0,temporaryDirectory:c});let l=await Br(s),u={...n?{baseline:n}:{},catalogs:s.config.catalogs,files:l,generator:a.length>0?s.config.generator?.id??`unconfigured`:`none`,linguiVersion:await qr(e),locales:s.config.locales,projectId:s.assets.projectId,revision:i,sourceLocale:s.config.sourceLocale,version:1},d=await wr({bucket:s.assets.sourceBucket,manifest:u,projectId:s.assets.projectId,store:s.store,temporaryDirectory:c});return await Dr({bucket:s.assets.sourceBucket,projectId:s.assets.projectId,reference:{revision:i,snapshot:d,version:1},store:s.store,tag:r,temporaryDirectory:c}),{mode:`multilingual`,reused:!1,snapshot:d}})}finally{await U(c,{force:!0,recursive:!0})}}async function Pr({cwd:e=process.cwd(),env:t=process.env,revision:n,store:r}={}){let i=await G({cwd:e});if(!i.i18n)return;let a=await Lr({cwd:e,env:t,store:r,projectConfig:i}),o=Qn(n??await Wr(e)),s=await Je(N(je(),`coreframe-i18n-materialize-`));try{let e=await Er({bucket:a.assets.sourceBucket,projectId:a.assets.projectId,revision:o,store:a.store,temporaryDirectory:s});if(!e)throw Error(`No prepared i18n snapshot exists for commit ${o}. Push a v* tag for this commit and wait for the translation gate.`);let t=await kr({bucket:a.assets.sourceBucket,cacheRoot:a.cacheRoot,digest:e.snapshot,projectId:a.assets.projectId,store:a.store,temporaryDirectory:s});return Ur(a,t,o),await zr(a,t),{revision:o,snapshot:e.snapshot}}finally{await U(s,{force:!0,recursive:!0})}}function Fr(e){return e.locales.length===1&&e.locales[0]===e.sourceLocale?`source-only`:`multilingual`}function Ir(e){let t=$n(e.sourceLocale,`Source locale`),n=[...new Set(e.locales.map(e=>$n(e,`Locale`)))],r=[...new Set(e.catalogs.map(e=>$n(e,`Catalog`)))];if(n.length===0||!n.includes(t))throw Error(`I18n locales must include the source locale.`);if(r.length===0)throw Error(`I18n configuration requires at least one catalog.`);if(e.generator&&(!e.generator.command.trim()||!e.generator.id.trim()))throw Error(`I18n generator command and ID must be non-empty.`);return{catalogs:r,directory:e.directory??`locales`,generator:e.generator,locales:n,sourceLocale:t}}async function Lr({cwd:e=process.cwd(),env:t=process.env,projectConfig:n,store:r}){let i=n??await G({cwd:e});if(!i.i18n)throw Error(`Missing i18n configuration in coreframe.config.ts.`);if(!i.assets)throw Error(`I18n snapshots require the existing private build bucket configured under assets.`);let a=i.assets;return{assets:a,cacheRoot:P(e,`.coreframe`,`i18n`,`cache`),config:Ir(i.i18n),cwd:P(e),env:t,store:r??Ue({config:a,env:t})}}async function Rr(e,t,n){let{stdout:r}=await F(`git`,[`rev-list`,`--first-parent`,`--skip=1`,t],{cwd:e.cwd,stdin:`ignore`});for(let t of r.split(/\r?\n/).filter(Boolean)){let r=await Er({bucket:e.assets.sourceBucket,projectId:e.assets.projectId,revision:Qn(t),store:e.store,temporaryDirectory:n});if(!r)continue;let i=await kr({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:r.snapshot,projectId:e.assets.projectId,store:e.store,temporaryDirectory:n});return Ur(e,i,t),await zr(e,i),r.snapshot}}async function zr(e,t){for(let n of t.files)if(await Or({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:n.digest,projectId:e.assets.projectId,store:e.store,target:Y(e.cwd,n.path)}),(await Ze(Y(e.cwd,n.path))).size!==n.size)throw Error(`Materialized i18n artifact size does not match manifest: ${n.path}.`)}async function Br(e){let t=[];for(let n of e.config.locales)for(let r of e.config.catalogs){let i=X(e.config,n,r),a=Y(e.cwd,i),o=await br(a);await Sr({bucket:e.assets.sourceBucket,digest:o,projectId:e.assets.projectId,source:a,store:e.store}),t.push({digest:o,path:i,size:(await Ze(a)).size})}return t.sort((e,t)=>e.path.localeCompare(t.path))}async function Vr(e){let{stdout:t}=await F(`git`,[`rev-parse`,`--show-prefix`],{cwd:e.cwd,stdin:`ignore`}),n=t.trim(),{stdout:r}=await F(`git`,[`log`,`-1`,`--format=%H`,`--diff-filter=AM`,`--`,`:(top)${`${n}${e.config.directory}/${e.config.sourceLocale}/${e.config.catalogs[0]}.po`}`],{cwd:e.cwd,stdin:`ignore`}),i=r.trim();if(!i)return!1;let a=(await Qe(`@lingui/format-po`,e.cwd)).formatter({lineNumbers:!1}),o=!1;for(let t of e.config.locales)for(let r of e.config.catalogs){let s=`${n}${`${e.config.directory}/${t}/${r}.po`}`;try{let{stdout:n}=await F(`git`,[`show`,`${i}:${s}`],{cwd:e.cwd,stdin:`ignore`});await pr(Y(e.cwd,X(e.config,t,r)),a.parse(n)),o=!0}catch{}}return o}async function Hr(e,t,n){let r=[];for(let n of e.config.locales)for(let i of e.config.catalogs){let a=X(e.config,n,i),o=Y(e.cwd,a);try{await We(o)}catch{continue}let s=N(t,`previous-catalogs`,a);await V(M(s),{recursive:!0}),await Xe(o,s),r.push({backup:s,path:o})}try{let e=await n();return await U(N(t,`previous-catalogs`),{force:!0,recursive:!0}),e}catch(t){for(let t of e.config.locales)for(let n of e.config.catalogs)await U(Y(e.cwd,X(e.config,t,n)),{force:!0});for(let{backup:e,path:t}of r)await V(M(t),{recursive:!0}),await Xe(e,t);throw t}}function Ur(e,t,n){if(t.revision!==n||t.projectId!==e.assets.projectId||t.sourceLocale!==e.config.sourceLocale||JSON.stringify(t.locales)!==JSON.stringify(e.config.locales)||JSON.stringify(t.catalogs)!==JSON.stringify(e.config.catalogs))throw Error(`I18n snapshot does not match commit or project configuration.`);let r=e.config.locales.flatMap(t=>e.config.catalogs.map(n=>X(e.config,t,n))),i=t.files.map(e=>e.path);if(new Set(i).size!==i.length||JSON.stringify(i.sort())!==JSON.stringify(r.sort()))throw Error(`I18n snapshot has an incomplete or unexpected artifact set.`)}async function Wr(e){let{stdout:t}=await F(`git`,[`rev-parse`,`HEAD`],{cwd:e,stdin:`ignore`});return Qn(t.trim())}async function Gr(e){let{stdout:t}=await F(`git`,[`status`,`--porcelain`],{cwd:e,stdin:`ignore`});if(t.trim())throw Error(`Tagged i18n preparation requires a clean Git tree.`)}async function Kr(e,t,n){let{stdout:r}=await F(`git`,[`rev-parse`,`${t}^{commit}`],{cwd:e,stdin:`ignore`});if(r.trim()!==n)throw Error(`Release tag ${t} does not point to checked-out commit ${n}.`)}async function qr(e){let{stdout:t}=await F(`pnpm`,[`exec`,`lingui`,`--version`],{cwd:e,stdin:`ignore`});return t.trim()}const Jr=[`Use a B2 Multi-Bucket Application Key restricted to the configured private build-object and public generated-assets buckets.`,`Required capabilities: listAllBucketNames, readFiles, and writeFiles.`,`Deletion, bucket-management, and key-management capabilities are not needed.`].join(` `),Yr=r(p,{displayName:`widths`,description:`Comma-separated responsive variant widths.`,async from(e){let t=e.split(`,`).map(e=>Number(e));if(t.length===0||t.some(e=>!Number.isInteger(e)||e<=0)||t.some((e,n)=>n>0&&e<=t[n-1]))throw Error(`Widths must be positive, unique, strictly ascending integers.`);return t}}),Xr=r(p,{displayName:`profile`,async from(e){return Ve(e)}}),Zr=r(p,{displayName:`pack`,description:`Asset pack name, such as training-videos.`,async from(e){if(!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e))throw Error(`Asset pack names must use lowercase hyphen-separated segments.`);return e}}),Qr=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in the packaged Flutter client.`,async from(e){return A(e)}}),$r=m({name:`assets`,cmds:{configure:n({name:`configure`,description:`Store a Backblaze B2 private build-object key in the operating system credential store. ${Jr}`,args:{profile:u({type:Xr,displayName:`profile`,description:`Credential profile named by coreframe.config.ts.`})},handler:async({profile:e})=>{B.note(Jr,`Required B2 key access`);let t=await B.text({message:`Backblaze B2 application key ID`,validate:e=>e?.trim()?void 0:`The application key ID is required.`});if(B.isCancel(t))throw Error(`Asset credential configuration was cancelled.`);let n=await B.password({message:`Backblaze B2 application key`,validate:e=>e?void 0:`The application key is required.`});if(B.isCancel(n))throw Error(`Asset credential configuration was cancelled.`);await He({applicationKey:n,applicationKeyId:t.trim(),profile:e}),console.log(`Stored Coreframe asset credential profile "${e}".`)}}),add:n({name:`add`,args:{file:u({type:p,displayName:`file`,description:`Source raster image, SVG, MP3, MP4, or Lottie JSON to add to the asset library.`}),id:c({long:`id`,type:p,description:`Logical asset ID, such as blog/my-post/hero.`}),alt:c({long:`alt`,type:l(p),description:`Required alt text for raster image and SVG assets.`}),pack:c({long:`pack`,type:l(Zr),description:`Place the asset in a named, lazily loaded pack.`}),variantWidths:c({long:`widths`,type:l(Yr),description:`Generate exactly these raster-image widths instead of the default ladder.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({alt:e,file:t,id:n,json:r,pack:i,variantWidths:a})=>Re(await Me({alt:e,file:t,id:n,pack:i,variantWidths:a}),r,{kind:`add`,assetId:n})}),backup:n({name:`backup`,description:`Back up every object in both configured asset buckets to a new Git branch.`,args:{branch:c({long:`branch`,type:p,description:`Name of the new local Git branch that will contain the backup.`})},handler:async({branch:e})=>{let t=await Pe({branch:e});console.log(`Backed up ${t.objects} objects (${t.bytes} bytes) to branch "${t.branch}" at ${t.commit}.`)}}),build:n({name:`build`,args:{id:c({long:`id`,type:l(p),description:`Build only one logical asset ID.`}),pack:c({long:`pack`,type:l(Zr),description:`Build only one named asset pack.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({id:e,json:t,pack:n})=>Re(await Fe({id:e,pack:n}),t,{kind:`build`})}),check:n({name:`check`,args:{fix:i({long:`fix`,description:`Migrate asset state and build missing generated output when possible.`,defaultValue:()=>!1}),pack:c({long:`pack`,type:l(Zr),description:`Check only one named asset pack.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({fix:e,json:t,pack:n})=>{let r=await Ie({fix:e,pack:n});Re(r,t,{kind:`check`}),r.ok||(process.exitCode=1)}}),publish:n({name:`publish`,args:{pack:c({long:`pack`,type:l(Zr),description:`Publish only one named asset pack.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e,pack:t})=>{let n=await ze({pack:t});Re(n,e,{kind:`publish`}),n.ok||(process.exitCode=1)}}),status:n({name:`status`,args:{pack:c({long:`pack`,type:l(Zr),description:`Report status for only one named asset pack.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e,pack:t})=>{let n=await Ie({pack:t});Re(n,e,{kind:`status`}),n.ok||(process.exitCode=1)}})}}),ei=m({name:`flutter`,cmds:{acceptance:n({name:`acceptance`,description:`Run the complete packaged Flutter conformance gate on macOS.`,args:{apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:Qr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e})=>_e({environment:{...process.env,COREFRAME_API_ORIGIN:e}})}),codegen:n({name:`codegen`,description:`Generate Flutter bridge contracts and Panda-backed Mix theme tokens.`,args:{check:i({long:`check`,description:`Fail when generated Flutter artifacts are missing or stale.`,defaultValue:()=>!1})},handler:({check:e})=>k({check:e})}),prepare:n({name:`prepare`,description:`Build and package the React client for one Flutter platform.`,args:{platform:u({type:s(O),displayName:`platform`,description:`Flutter platform whose packaged client should be prepared.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:Qr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>he({apiOrigin:e,platform:t})}),check:n({name:`check`,description:`Reject missing, stale, modified, or incorrectly targeted Flutter assets.`,args:{platform:u({type:s(O),displayName:`platform`,description:`Flutter platform whose packaged client should be checked.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:Qr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>D({apiOrigin:e,platform:t})})}}),ti=m({name:`i18n`,cmds:{build:n({name:`build`,description:`Extract source messages or materialize an exact release catalog snapshot.`,args:{},handler:async()=>{await jr()}}),materialize:n({name:`materialize`,description:`Materialize the immutable i18n snapshot for an exact commit.`,args:{revision:c({long:`revision`,type:l(p),description:`Full commit SHA. Defaults to the checked-out commit.`})},handler:async({revision:e})=>{let t=await Pr({revision:e});t&&console.log(`Materialized i18n snapshot ${t.snapshot}.`)}}),prepare:n({name:`prepare`,description:`Fill missing translations, strictly compile, and publish an immutable tagged snapshot. Source-only projects skip translation preparation.`,args:{tag:c({long:`tag`,type:p,description:`Pushed v* release tag that points to the checked-out commit.`})},handler:async({tag:e})=>{let t=await Nr({tag:e});if(t.mode===`source-only`){console.log(`Skipped i18n release preparation: the supported locales contain only the source locale "${t.sourceLocale}", so no translation snapshot is required.`);return}console.log(`${t.reused?`Reused`:`Published`} i18n snapshot ${t.snapshot}.`)}})}}),ni=q.platform===`win32`?`react-router.cmd`:`react-router`,ri=q.platform===`win32`?`panda.cmd`:`panda`;async function ii(e=q.cwd()){await si(e),await oi(e,[`typegen`])}async function ai(e=q.cwd(),t=q.env,n){if((t.COREFRAME_PLATFORM??`web`)!==`web`)return;let r=j.resolve(e,`.coreframe/dashboard-build`),i=j.join(r,`client`),a=j.resolve(e,`dist/client/__dashboard`);await U(r,{force:!0,recursive:!0});let o=await G({cwd:e});if(o.deploy?.mode===`client`||o.dashboard?.enabled===!1){await U(a,{force:!0,recursive:!0});return}await ci(e,ri,[`build`],t),await oi(e,[`build`,...n?[`--mode`,n]:[]],t),await U(a,{force:!0,recursive:!0}),await V(j.dirname(a),{recursive:!0}),await qe(i,a,{recursive:!0})}async function oi(e,t,n=q.env){await ci(e,ni,t,n)}async function si(e){await U(j.resolve(e,`dashboard/.react-router`),{force:!0,recursive:!0})}async function ci(e,t,n,r=q.env){await F(t,n,{cwd:j.resolve(e,`dashboard`),env:{...r,PATH:j.resolve(e,`node_modules/.bin`)+j.delimiter+(r.PATH??r.Path??``)},stdio:`inherit`})}const Z={access:We,chmod:Ge,mkdir:V,mkdtemp:Je,readFile:H,readFileSync:R,rm:U,writeFile:W},li={getAvailablePort:di},ui={homedir:ke,kill:q.kill,networkInterfaces:Ae,tmpdir:je};async function di(){let e=ct();try{await new Promise((t,n)=>{e.once(`error`,n),e.listen(0,`127.0.0.1`,t)});let t=e.address();if(!t||typeof t==`string`)throw Error(`Could not allocate an available TCP port.`);return t.port}finally{e.listening&&await new Promise((t,n)=>{e.close(e=>e?n(e):t())})}}function fi({host:e=`127.0.0.1`,port:t,start:n}){let r,i=!1,a=!1,o=!1,s,c,l,u,d,f=new Set,p=new Promise((e,t)=>{u=e,d=t}),m=e=>{a||o||(o=!0,d(e))},h=()=>(s||=Promise.resolve().then(n).catch(e=>{throw m(e),e}),s),g=e=>{f.add(e),e.once(`close`,()=>f.delete(e)),e.pause(),_(e).catch(()=>{e.destroy()})},_=async e=>{let t=await h();if(a||e.destroyed)return;let n=await pi(t,()=>a);if(a||e.destroyed){n.destroy();return}f.add(n),n.once(`close`,()=>f.delete(n)),n.on(`error`,()=>e.destroy()),n.once(`close`,()=>e.destroy()),e.on(`error`,()=>n.destroy()),e.once(`close`,()=>n.destroy()),e.pipe(n),n.pipe(e)};return{close:async()=>l||(l=(async()=>{a=!0,o||(o=!0,u());for(let e of f)e.destroy();f.clear(),c&&!i&&await Promise.allSettled([c]),!(!r||!i)&&(await new Promise(e=>{r.close(()=>e())}),i=!1)})(),l),fail:m,listen:async()=>c||(r=ct(g),c=new Promise((n,a)=>{let o=e=>{if(i){m(e);return}a(e)};r.once(`error`,o),r.once(`listening`,()=>{i=!0,r.off(`error`,o),r.on(`error`,m),n()}),r.listen(t,e)}),c),wait:()=>p}}async function pi(e,t){let n=Date.now()+1e4,r;for(;!t();)try{return await mi(e)}catch(e){if(r=e,Date.now()>=n)break;await new Promise(e=>setTimeout(e,50))}throw r instanceof Error?r:Error(`Could not connect to the dashboard.`)}function mi({host:e=`127.0.0.1`,port:t}){return new Promise((n,r)=>{let i=st({host:e,port:t}),a=e=>{i.off(`connect`,o),i.destroy(),r(e)},o=()=>{i.off(`error`,a),n(i)};i.once(`error`,a),i.once(`connect`,o)})}const hi=q.platform===`win32`?`react-router.cmd`:`react-router`;function gi(e){return L(j.resolve(e,`dashboard/dashboard.config.ts`))}function _i({cwd:e,env:t,port:n}){let r=t.PATH??t.Path??``,i,a,o=!1,s,c,l=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>{d()};return q.on(e,t),{handler:t,signal:e}}),u=async(e,t)=>{try{await e,o||a?.fail(Error(`The dashboard development server stopped unexpectedly.`))}catch(e){o||a?.fail(e)}finally{await t.outputTasks,t.stdout.end(),t.stderr.end(),await Promise.allSettled([it(t.stdout),it(t.stderr)]),i===e&&(i=void 0)}};a=fi({port:n,start:async()=>{if(o)throw Error(`The dashboard development server was stopped before it started.`);let n=await li.getAvailablePort();if(o)throw Error(`The dashboard development server was stopped before it started.`);let a=at({label:`dashboard`}),s=at({color:`red`,label:`dashboard`});a.pipe(q.stdout,{end:!1}),s.pipe(q.stderr,{end:!1});let l=F(hi,[`dev`,`--host`,`127.0.0.1`,`--port`,String(n)],{cwd:j.resolve(e,`dashboard`),env:{...t,NODE_OPTIONS:[t.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:j.resolve(e,`node_modules/.bin`)+j.delimiter+r},stdin:`inherit`});i=l;let d=Promise.allSettled([yi(l.stdout,a),yi(l.stderr,s)]);return c=u(l,{outputTasks:d,stderr:s,stdout:a}),{host:`127.0.0.1`,port:n}}});let d=async()=>s||(s=(async()=>{o=!0,await a?.close(),i?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),await c;for(let{handler:e,signal:t}of l)q.off(t,e)})(),s);return{close:d,listen:()=>a.listen(),wait:()=>a.wait()}}async function vi({cwd:e=q.cwd(),env:t=q.env,port:n}){let r=_i({cwd:e,env:t,port:n});try{await r.listen(),await r.wait()}finally{await r.close()}}async function yi(e,t){for await(let n of e)t.write(`${n}\n`)||await new Promise(e=>t.once(`drain`,e))}const bi=m({name:`dashboard`,cmds:{dev:n({name:`dev`,args:{port:c({long:`port`,type:o,description:`Local TCP port for the dashboard proxy.`})},handler:({port:e})=>vi({port:e})}),build:n({name:`build`,args:{mode:c({long:`mode`,type:l(p),description:`Vite environment mode used for the dashboard build.`})},handler:({mode:e})=>ai(void 0,void 0,e)}),typegen:n({name:`typegen`,args:{},handler:()=>ii()})}});function xi(){var e=typeof SuppressedError==`function`?SuppressedError:function(e,t){var n=Error();return n.name=`SuppressedError`,n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(t!=null){if(Object(t)!==t)throw TypeError(`using declarations can only be used with objects, functions, null, or undefined.`);if(e)var r=t[Symbol.asyncDispose||Symbol.for(`Symbol.asyncDispose`)];if(r===void 0&&(r=t[Symbol.dispose||Symbol.for(`Symbol.dispose`)],e))var i=r;if(typeof r!=`function`)throw TypeError(`Object is not disposable.`);i&&(r=function(){try{i.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,i=this.e,a=0;function o(){for(;r=n.pop();)try{if(!r.a&&a===1)return a=0,n.push(r),Promise.resolve().then(o);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(o,s)}else a|=1}catch(e){return s(e)}if(a===1)return i===t?Promise.resolve():Promise.reject(i);if(i!==t)throw i}function s(n){return i=i===t?n:new e(n,i),o()}return o()}}}async function Si({all:e,cwd:t=process.cwd(),ids:n=[],matches:r=[],now:i=new Date}={}){let a=await Oi(t),o=await ki(a.config,t,async e=>a.module.developmentJobs.createStateAdmin(e).list()),s=lt({jobs:a.module.developmentJobs.jobs,now:i,records:o??[]}),c=Ei(s,{all:e,ids:n,matches:r},{defaultAll:!0});return{database:{dialect:a.dialect,state:o?`existing`:`missing`},jobs:s.filter(e=>c.has(e.id)),version:1}}async function Ci({all:e,breakLeases:t=!1,cwd:n=process.cwd(),dryRun:r=!1,ids:i=[],json:a=!1,matches:o=[],now:s=new Date,yes:c=!1}){let l=await Si({all:!0,cwd:n,now:s}),u=Ei(l.jobs,{all:e,ids:i,matches:o},{defaultAll:!1}),d=l.jobs.filter(e=>u.has(e.id)),f=d.filter(e=>e.lease===`active`);if(r)return{database:l.database,dryRun:!0,jobs:d.map(e=>({id:e.id,status:e.lease===`active`&&!t?`blocked-active-lease`:e.persisted?`would-reset`:`no-state`})),version:1};if(f.length>0&&!t)throw Error(`Cannot reset active development job ${Ni(f.map(e=>e.id))}. Wait for the lease to expire or pass --break-leases.`);if((t||e||o.length>0||d.length>1)&&!c){if(a||!process.stdin.isTTY)throw Error(`This reset requires --yes when prompts are unavailable.`);let e=await B.confirm({message:`Reset local development state for ${d.length} job${d.length===1?``:`s`}?`});if(B.isCancel(e)||!e)throw Error(`Development job state reset was cancelled.`)}if(l.database.state===`missing`)return{database:l.database,dryRun:!1,jobs:d.map(e=>({id:e.id,status:`no-state`})),version:1};let p=await Oi(n),m=await ki(p.config,n,async e=>p.module.developmentJobs.createStateAdmin(e).reset({breakLeases:t,jobIds:[...u],now:s}));if(!m)throw Error(`The local database disappeared before development job state was reset.`);if(m.activeLeaseIds.length>0&&!t)throw Error(`Cannot reset active development job ${Ni(m.activeLeaseIds)}. Wait for the lease to expire or pass --break-leases.`);let h=new Set(m.resetIds);return{database:l.database,dryRun:!1,jobs:d.map(e=>({id:e.id,status:h.has(e.id)?`reset`:`no-state`})),version:1}}function wi(e){let t=Mi(e.database);return e.jobs.length===0?`${t}No local development jobs are configured.`:`${t}${Pi([`Job`,`Status`,`Last success`,`Next eligible`,`Lease`],e.jobs.map(e=>[e.id,e.lease===`active`?`running`:e.registration===`orphaned`?`orphaned`:e.eligibility,ji(e.lastSucceededAt),ji(e.nextEligibleAt),e.lease===`none`?`-`:`${e.lease} until ${ji(e.leaseUntil)}`]))}`}function Ti(e){let t=Mi(e.database);return e.jobs.length===0?`${t}No local development job state matched.`:`${t}${Pi([`Job`,`Result`],e.jobs.map(e=>[e.id,e.status.replaceAll(`-`,` `)]))}`}function Ei(e,{all:t=!1,ids:n=[],matches:r=[]},{defaultAll:i}){if(t&&(n.length>0||r.length>0))throw Error(`Use --all or explicit job selectors, not both.`);if(!t&&n.length===0&&r.length===0){if(i)return new Set(e.map(e=>e.id));throw Error(`Select one or more jobs by ID or --match, or pass --all.`)}let a=new Set(e.map(e=>e.id)),o=n.filter(e=>!a.has(e));if(o.length>0)throw Error(`Unknown development job ${Ni(o)}.`);let s=new Set(t?a:n);for(let t of r){let n=Di(t),r=e.filter(e=>n.test(e.id));if(r.length===0)throw Error(`Development job pattern ${JSON.stringify(t)} matched no jobs.`);for(let e of r)s.add(e.id)}return s}function Di(e){if(!e)throw Error(`Development job patterns must not be empty.`);let t=[...e].map(e=>e===`*`?`.*`:e===`?`?`.`:e.replace(/[\\^$.[\]{}()+|]/gu,`\\$&`)).join(``);return RegExp(`^${t}$`,`u`)}async function Oi(e){let t=await G({cwd:e}),n=t.jobs?.entry;if(!n)throw Error(`coreframe.config.ts must configure jobs.entry before managing development job state.`);let r=await $e(n,e);if(!r.developmentJobs||!Array.isArray(r.developmentJobs.jobs)||typeof r.developmentJobs.createStateAdmin!=`function`)throw Error(`${n} must export developmentJobs with jobs and createStateAdmin properties.`);return{config:t,dialect:t.database?.dialect??`postgres`,module:r}}async function ki(e,t,n){try{var r=xi();let a=e.database?.dialect??`postgres`,o=a===`sqlite`?j.resolve(t,`.coreframe/turso.db`):j.resolve(t,`.coreframe/postgres/PG_VERSION`);try{await Ze(o)}catch(e){if(Fi(e)&&e.code===`ENOENT`)return;throw e}if(a===`sqlite`)try{var i=xi();let r=await x({cwd:t,env:i.a(await de({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Ai(n,r)}finally{r.$client.close()}}catch(e){i.e=e}finally{await i.d()}let s=await ee({cwd:t,env:r.a(await E({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Ai(n,s)}finally{await s.$client.end()}}catch(e){r.e=e}finally{await r.d()}}async function Ai(e,t){try{return await e(t)}catch(e){throw Ii(e)?Error(`The local development job state table is missing. Run coreframe db migrate-local, then retry.`,{cause:e}):e}}function ji(e){return e?.toISOString()??`-`}function Mi(e){return e.state===`missing`?`Local ${e.dialect} database is missing; no database was created.\n\n`:``}function Ni(e){return e.map(e=>JSON.stringify(e)).join(`, `)}function Pi(e,t){let n=e.map((e,n)=>Math.max(e.length,...t.map(e=>e[n].length))),r=e=>e.map((e,t)=>e.padEnd(n[t])).join(` `).trimEnd();return[r(e),r(n.map(e=>`-`.repeat(e))),...t.map(r)].join(`
|
|
8
8
|
`)}function Fi(e){return e instanceof Error&&`code`in e}function Ii(e){let t=e;for(;t instanceof Error;){let e=t.message.toLowerCase();if(e.includes(`coreframe_dev_job_state`)&&(e.includes(`does not exist`)||e.includes(`no such table`)))return!0;t=t.cause}return!1}const Li={ids:f({type:p,displayName:`job`,description:`Exact local development job IDs.`}),matches:a({type:t(p),long:`match`,description:`Select job IDs with an anchored * and ? glob. Repeat to add patterns.`,defaultValue:()=>[]})},Ri=m({name:`jobs`,cmds:{status:n({name:`status`,description:`Inspect local development job cooldown and lease state.`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1}),...Li},handler:async({ids:e,json:t,matches:n})=>{let r=await Si({ids:e,matches:n});console.log(t?JSON.stringify(r):wi(r))}}),reset:n({name:`reset`,description:`Make local development jobs eligible for their next startup check.`,args:{all:i({long:`all`,description:`Select every configured and orphaned development job.`,defaultValue:()=>!1}),breakLeases:i({long:`break-leases`,description:`Invalidate active job leases. The original invocation may keep running.`,defaultValue:()=>!1}),dryRun:i({long:`dry-run`,description:`Show the reset without changing local state.`,defaultValue:()=>!1}),json:i({long:`json`,description:`Print machine-readable JSON without prompting.`,defaultValue:()=>!1}),yes:i({long:`yes`,short:`y`,description:`Confirm a multi-job, pattern, all-job, or lease-breaking reset.`,defaultValue:()=>!1}),...Li},handler:async({all:e,breakLeases:t,dryRun:n,ids:r,json:i,matches:a,yes:o})=>{let s=await Ci({all:e,breakLeases:t,dryRun:n,ids:r,json:i,matches:a,yes:o});console.log(i?JSON.stringify(s):Ti(s))}})}}),zi=/^[a-z0-9]+(?:-[a-z0-9]+)*$/u;function Bi(e,t){let n=Hi(e,t);if(!Ui(n)||!Wi(n,[`description`,`requires`,`routes`,`verifier`])||!Ki(n.description)||n.requires!==void 0&&(!Array.isArray(n.requires)||!n.requires.every(Ki))||n.verifier!==void 0&&!Ki(n.verifier)||!Array.isArray(n.routes))throw Error(`${t} must contain a description string, routes array, and optional requires and verifier fields.`);let r=(n.requires??[]).map(e=>Vi(e));if(new Set(r).size!==r.length)throw Error(`${t} contains duplicate recipe requirements.`);let i=n.routes.map((e,n)=>{if(!Ui(e)||!Gi(e,[`path`,`router`,`when`])||!Ki(e.path)||!Ki(e.router)||!Ki(e.when))throw Error(`${t} route ${n+1} must contain router, path, and when strings.`);return{path:e.path,router:e.router,when:e.when}}),a=i.map(e=>`${e.router}\0${e.path}`);if(new Set(a).size!==a.length)throw Error(`${t} contains a duplicate router and path pair.`);return{description:n.description,requires:r,routes:i,verifier:n.verifier}}function Vi(e){if(!zi.test(e))throw Error(`Recipe names use lowercase letters, numbers, and single hyphens.`);return e}function Hi(e,t){try{return ut(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function Ui(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Wi(e,t){return Object.keys(e).every(e=>t.includes(e))}function Gi(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function Ki(e){return typeof e==`string`&&e.length>0}const qi=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u,Ji=`template`;function Yi(e=Ji){return`refs/remotes/${e}/tags`}function Q(e,t=Ji){return qi.test(e)?`${Yi(t)}/v${e}`:e.startsWith(`v`)&&qi.test(e.slice(1))?`${Yi(t)}/${e}`:e}function Xi(e){return e.startsWith(`refs/remotes/`)?e.slice(13):e}function Zi(e,t=Ji){return`${Q(e,t)}:template`}function Qi(e,t,n=Ji){return`${Zi(e,n)}/${t}`}function $i(e,t){return I(`git`,e,{cwd:t,encoding:`utf8`})}function ea(e,t){let n=$i(e,t);if(n.status!==0){let t=n.stderr.trim()||n.stdout.trim();throw Error(`Git command failed: git ${e.join(` `)}${t?`\n${t}`:``}`)}return n.stdout}function ta(e,t){let n=$i([`remote`,`get-url`,e],t);if(n.status===2)return null;if(n.status!==0){let t=n.stderr.trim()||n.stdout.trim();throw Error(`Could not inspect remote ${e}.${t?`\n${t}`:``}`)}return n.stdout.trim()}function na(e,t){$i([`config`,`--get`,`remote.${e}.tagOpt`],t).stdout.trim()!==`--no-tags`&&ea([`config`,`remote.${e}.tagOpt`,`--no-tags`],t);let n=$i([`config`,`--get-all`,`remote.${e}.fetch`],t),r=n.status===0?n.stdout.split(`
|
|
9
9
|
`).map(e=>e.trim()).filter(Boolean):[];for(let n of[`+refs/heads/*:refs/remotes/${e}/*`,`+refs/tags/*:${Yi(e)}/*`])r.includes(n)||ea([`config`,`--add`,`remote.${e}.fetch`,n],t)}function ra(e,t){return ea([`for-each-ref`,`--format=%(refname)`,t],e).split(`
|
|
10
10
|
`).map(e=>e.trim()).filter(Boolean)}function ia(e,t){return ea([`rev-parse`,`--verify`,`${e}^{commit}`],t).trim()}function aa(e,t){let n=`${Yi(e)}/`,r=new Set(ra(t,Yi(e)).map(e=>e.slice(n.length))),i=[],a=[];for(let e of ra(t,`refs/tags`)){let o=e.slice(10);if(r.has(o)){if(ia(e,t)!==ia(`${n}${o}`,t)){a.push(o);continue}ea([`update-ref`,`-d`,e],t),i.push(o)}}i.length>0&&console.log(`Removed ${i.length} copied ${e} tag(s) from refs/tags/ so they cannot be pushed to this repository's own remotes.`),a.length>0&&console.log(`Kept local tag(s) that share a name with ${e} tags but point at different commits: ${a.join(`, `)}`)}function oa({cwd:e=process.cwd(),fetch:t=!0,remote:n=Ji,url:r=`https://github.com/coreframe-js/coreframe.git`}={}){if(n.length===0)throw Error(`Remote name must not be empty.`);ea([`rev-parse`,`--show-toplevel`],e);let i=ta(n,e);if(i===null)ea([`remote`,`add`,n,r],e),console.log(`Added ${n} remote: ${r}`);else if(i===r)console.log(`${n} remote already points at ${r}`);else throw Error(`${n} remote points at ${i}, not ${r}.\nChoose the intended template source before continuing, then update or rename the remote manually.`);na(n,e),t&&(ea([`fetch`,n,`--prune`],e),console.log(`Fetched ${n}.`)),aa(n,e)}function sa({cwd:e=process.cwd(),fetch:t=!0,remote:n=`template`,target:r}={}){let i=da(e),a=ha(i,[`rev-parse`,`--show-toplevel`]),o=Q(r??fa(i),n);return oa({cwd:a,fetch:t,remote:n}),{projectRoot:i,ref:o,refLabel:Xi(o),repositoryRoot:a}}function ca(e,t,n){return la(e,t,n).toString(`utf8`)}function la(e,t,n){let r=`${t}:${n}`,i=I(`git`,[`show`,r],{cwd:e,encoding:`buffer`});if(i.status!==0)throw Error(`Could not read ${r}. ${ga([`show`,r],i)}`);return i.stdout}function ua(e,t,n){let r=I(`git`,[`ls-tree`,`-r`,`--name-only`,`-z`,t,`--`,n],{cwd:e,encoding:`buffer`});if(r.status!==0)throw Error(ga([`ls-tree`,t,n],r));return r.stdout.toString(`utf8`).split(`\0`).filter(Boolean)}function da(e){let t=P(e);for(;;){let e=N(t,`package.json`),n=ma(e);if(n!==void 0&&pa(n,e).engines?.coreframe)return t;let r=M(t);if(r===t)throw Error(`Could not find a package.json with engines.coreframe.`);t=r}}function fa(e){let t=N(e,`package.json`),n=ma(t);if(n===void 0)throw Error(`Required file package.json does not exist.`);let r=pa(n,t).engines?.coreframe;if(!r)throw Error(`package.json must declare an exact engines.coreframe recipe baseline.`);return r}function pa(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function ma(e){try{return R(e,`utf8`)}catch(e){if(_a(e)&&e.code===`ENOENT`)return;throw e}}function ha(e,t){let n=I(`git`,t,{cwd:e,encoding:`utf8`});if(n.status!==0)throw Error(ga(t,n));return n.stdout.trim()}function ga(e,t){let n=t.stderr.toString(`utf8`).trim()||t.stdout.toString(`utf8`).trim();return`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`}function _a(e){return e instanceof Error&&`code`in e}const va=[{path:`package.json`,requirement:`retain the Coreframe Flutter JavaScript runtime used by src-flutter`,test:e=>e.includes(`"@coreframe/flutter-js"`)},{path:`coreframe.config.ts`,requirement:`enable web and at least one Flutter development platform`,test:Da},{path:`src-flutter/pubspec.yaml`,requirement:`declare flutter_driver as a Flutter SDK dependency`,test:Oa},{path:`src-flutter/lib/main.dart`,requirement:`gate Flutter Driver behind kDebugMode and ENABLE_FLUTTER_DRIVER before starting Coreframe`,test:ka},{path:`src/web/app/flutter-shell/application.ts`,requirement:`configure the Flutter shell's app-owned query and session hooks`,test:e=>Ea(e,[`configureShellQueryFocus`,`initializeShellClient`,`authSessionHint`,`authClient.signOut()`,`clearSession`])},{path:`src/web/entry.client.tsx`,requirement:`load the package-owned Flutter development tools only for non-browser development`,test:e=>Ea(e,[`@coreframe/vite/flutter-devtools`,`import.meta.env.PLATFORM !== "web"`])}],ya=`src-flutter/lib/application.dart`,ba=`src/api/worker/auth-origin.ts`;function xa(e){let t=[];for(let n of va){let r=N(e,n.path);if(!L(r)){t.push(`${n.path} is missing; it must ${n.requirement}.`);continue}let i=R(r,`utf8`);n.test(i)||t.push(`${n.path} must ${n.requirement}.`)}let n=Sa(e,t),r=Ca(e,t);return n!==void 0&&r!==void 0&&n!==r&&t.push(`${ya} loopbackPort (${n}) must match ${ba} FLUTTER_LOOPBACK_ORIGIN (${r}).`),t}function Sa(e,t){let n=wa(e,ya,t);if(n===void 0)return;let r=n.match(/^\s*loopbackPort\s*:\s*(\d+)\s*,?\s*$/m)?.[1],i=n.match(/^\s*loopbackPort\s*:\s*([A-Za-z_]\w*)\s*,?\s*$/m)?.[1],a=i?n.match(RegExp(`^\\s*(?:static\\s+)?const\\s+${i}\\s*=\\s*(\\d+)\\s*;\\s*$`,`m`))?.[1]:void 0,o=Ta(r??a);return o===void 0&&t.push(`${ya} must configure loopbackPort as a fixed integer port.`),o}function Ca(e,t){let n=wa(e,ba,t);if(n===void 0)return;let r=Ta(n.match(/^\s*export\s+const\s+FLUTTER_LOOPBACK_ORIGIN\s*=\s*["']http:\/\/localhost:(\d+)["']\s*;?\s*$/m)?.[1]);return r===void 0&&t.push(`${ba} must define FLUTTER_LOOPBACK_ORIGIN as an exact localhost origin with a fixed integer port.`),r}function wa(e,t,n){let r=N(e,t);if(!L(r)){n.push(`${t} is missing; it must define the Flutter loopback origin contract.`);return}return R(r,`utf8`)}function Ta(e){if(!e)return;let t=Number(e);return Number.isInteger(t)&&t>=1&&t<=65535?t:void 0}function Ea(e,t){return t.every(t=>e.includes(t))}function Da(e){let t=e.match(/\bplatforms\s*:\s*\[([\s\S]*?)\]/)?.[1];if(!t)return!1;let n=new Set([...t.matchAll(/(["'`])([^"'`]*)\1/g)].map(e=>e[2]));return n.has(`web`)&&[`ios`,`android`,`linux`,`macos`,`windows`].some(e=>n.has(e))}function Oa(e){try{let t=ut(e);if(!Aa(t)||!Aa(t.dependencies))return!1;let n=t.dependencies.flutter_driver;return Aa(n)&&n.sdk===`flutter`}catch{return!1}}function ka(e){let t=/const\s+(\w+)\s*=\s*kDebugMode\s*&&\s*bool\.fromEnvironment\(\s*['"]ENABLE_FLUTTER_DRIVER['"]\s*\)/u.exec(e),n=e.indexOf(`enableFlutterDriverExtension()`),r=e.indexOf(`runCoreframeApplication(`),i=t?RegExp(`if\\s*\\(\\s*${t[1]}\\s*\\)\\s*\\{[^{}]*enableFlutterDriverExtension\\(\\)[^{}]*\\}`,`u`):void 0;return e.includes(`package:flutter_driver/driver_extension.dart`)&&i?.test(e)===!0&&n>=0&&r>=0&&n<r}function Aa(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ja({name:e,...t}){let n=sa(t),r=`recipes/${e}/recipe.yaml`,i=Pa(Bi(ca(n.repositoryRoot,n.ref,r),r).verifier,n.projectRoot);if(i.length>0)throw Error(`Recipe ${e} verification failed:\n${i.map(e=>`- ${e}`).join(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coreframe/scripts",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.49",
|
|
4
4
|
"description": "Coreframe project workflow CLI and automation scripts",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,15 +29,15 @@
|
|
|
29
29
|
"nano-spawn": "^2.1.0",
|
|
30
30
|
"procband": "^0.3.9",
|
|
31
31
|
"yaml": "^2.9.0",
|
|
32
|
-
"@coreframe/assets": "^0.1.21",
|
|
33
32
|
"@coreframe/config": "^0.1.18",
|
|
34
33
|
"@coreframe/db": "^0.1.27",
|
|
34
|
+
"@coreframe/assets": "^0.1.21",
|
|
35
35
|
"@coreframe/deploy": "^0.1.19",
|
|
36
|
-
"@coreframe/dev": "^0.1.
|
|
36
|
+
"@coreframe/dev": "^0.1.34",
|
|
37
37
|
"@coreframe/dev-contracts": "^0.1.12",
|
|
38
38
|
"@coreframe/flutter-tools": "^0.1.30",
|
|
39
|
-
"@coreframe/object-storage": "^0.1.4",
|
|
40
39
|
"@coreframe/jobs": "^0.1.1",
|
|
40
|
+
"@coreframe/object-storage": "^0.1.4",
|
|
41
41
|
"@coreframe/preview": "^0.1.27"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|