@coreframe/scripts 0.2.15 → 0.2.17

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.
Files changed (2) hide show
  1. package/dist/coreframe.js +16 -16
  2. package/package.json +6 -6
package/dist/coreframe.js CHANGED
@@ -1,27 +1,27 @@
1
1
  #!/usr/bin/env node
2
- import*as e from"@alloc/cmd-ts";import{array as t,command as n,extendType as r,flag as i,multioption as a,number as o,oneOf as s,option as c,optional as l,positional as u,rest as d,string as f,subcommands as p}from"@alloc/cmd-ts";import{ProjectPostgresAlreadyRunningError as m,checkDeployMigrations as h,checkSchemaPush as g,collectDeployMigrationFiles as _,createProjectPostgresDatabaseAdapter as v,createProjectSqliteDatabaseAdapter as y,ensureLocalDb as b,filterPendingMigrations as x,formatDbErrorMessage as S,formatMigrationList as C,formatMigrationScanFailures as w,migrateHeldMigrations as T,migrateLocalDb as E,readAppliedMigrationNames as D,resetLocalDb as ee,runDrizzleKitCommand as O,scanDeployMigrationFiles as te,seedLocalDb as ne,setupLocalDb as k,startProjectPostgres as A,startProjectTurso as re,stopProjectPostgres as ie}from"@coreframe/db";import{checkFlutterClient as j,ensureFlutterDevAssetDirectories as ae,flutterPlatforms as M,generateFlutterNativeBridge as oe,prepareFlutterClient as N,prepareFlutterDevOutput as se,productionApiOrigin as P,runFlutterAcceptance as ce}from"@coreframe/flutter-tools";import F,{dirname as I,isAbsolute as le,join as L,posix as R,resolve as z,sep as ue}from"node:path";import B from"nano-spawn";import*as V from"@clack/prompts";import{addAsset as de,buildAssets as fe,checkAssets as pe,printAssetResult as me,publishAssets as he}from"@coreframe/assets";import{assertAssetCredentialProfile as ge,configureAssetCredentials as _e,createB2PrivateObjectStore as ve}from"@coreframe/object-storage";import{access as ye,chmod as be,copyFile as xe,cp as Se,link as Ce,mkdir as H,mkdtemp as we,readFile as U,readdir as Te,realpath as Ee,rename as De,rm as W,stat as Oe,unlink as ke,writeFile as G}from"node:fs/promises";import{homedir as Ae,networkInterfaces as je,tmpdir as Me}from"node:os";import{importProjectDependency as Ne,importProjectModule as Pe,normalizeWorkerEnvironment as Fe,readProjectConfig as Ie,wranglerEnvironmentNames as Le}from"@coreframe/config";import{createHash as Re,randomUUID as ze}from"node:crypto";import K from"node:process";import{spawnSync as q}from"node:child_process";import{chmodSync as Be,existsSync as J,lstatSync as Ve,mkdirSync as He,mkdtempSync as Ue,readFileSync as Y,readlinkSync as We,rmSync as Ge,symlinkSync as Ke,writeFileSync as qe}from"node:fs";import{parse as Je,stringify as Ye}from"yaml";import{accessTokenSigningSecretName as Xe,clearAppliedPendingWorkerSecrets as Ze,deployEnvironments as Qe,discardPendingWorkerSecret as $e,discoverStagingUrl as et,inspectWorkerEnvironment as tt,materializePrimaryWorkerConfig as nt,materializePrimaryWorkerTypeConfig as rt,parseDeclaredWorkerSecretEnv as it,parseTauriReleasePlatform as at,prepareAccessTokenSigningSecret as ot,prepareTauriRelease as st,queueWorkerSecret as ct,queueWorkerSecrets as lt,readDeclaredWorkerSecrets as ut,readPackageJson as dt,readPendingWorkerSecretSnapshot as ft,reassignStagingHostname as pt,releaseName as mt,resolveDeployConfig as ht,resolveReleaseVersion as gt,resolveTauriReleasePlan as _t,restoreTauriReleaseMetadata as vt,rotateAccessTokenSigningSecret as yt,runAfterWorkerDeploy as bt,runPostDeployChecks as xt,tauriReleasePlatforms as St,uploadTauriReleaseToB2 as Ct,validateTauriReleasePlan as wt,validateWorkerEnvironmentForDeploy as Tt,verifyAccessTokenSigningSecret as Et,writePackageVersion as Dt,writeTauriReleaseMetadata as Ot}from"@coreframe/deploy";import{connectDevSupervisor as kt,createDevStartupTiming as At,devHttpsCertEnv as jt,devHttpsKeyEnv as Mt,isManagedDevCheckout as Nt,isPrimaryCheckout as Pt,prepareDevHttps as Ft,stopDevSupervisor as It}from"@coreframe/dev";import{inspect as Lt,parseEnv as Rt}from"node:util";import{once as zt}from"node:events";import{finished as Bt}from"node:stream/promises";import{codexTaskEnv as Vt}from"@coreframe/dev-contracts/codex-task";import{managedDevEnv as Ht}from"@coreframe/dev-contracts/managed-dev";import{createPrefixStream as X,supervise as Ut}from"procband";import{createConnection as Wt,createServer as Gt}from"node:net";import{setTimeout as Kt}from"node:timers/promises";import{determineAgent as qt}from"@vercel/detect-agent";import{runPreview as Jt}from"@coreframe/preview";const Yt=[`web`,...M];function Xt(e=`web`,{apiOrigin:t,cwd:n=process.cwd(),profile:r=!1,simulator:i=!1}={}){if(tn(e,{profile:r,simulator:i}),e===`web`)return[rn(`pnpm`,[`build`],n,{COREFRAME_PLATFORM:`web`})];let a=P(t);return[{kind:`prepare`,platform:e},rn(`flutter`,Zt(e,a,{profile:r,simulator:i}),z(n,`src-flutter`),{COREFRAME_API_ORIGIN:a})]}function Zt(e,t,{noCodesign:n=e===`macos`,profile:r=!1,simulator:i=!1}={}){tn(e,{profile:r,simulator:i});let a=P(t);return[`build`,e===`android`?`apk`:e,r?`--profile`:`--release`,...i?[`--simulator`]:[],...n?[`--no-codesign`]:[],`--dart-define=COREFRAME_API_ORIGIN=${a}`]}function Qt(e,{profile:t=!1}={}){let n=t?`profile`:`release`,r=z(e,`src-flutter/build/app/outputs/flutter-apk/app-${n}.apk`),i=JSON.stringify(r);return[`Android ${n} build succeeded.`,``,`Install it on a connected Android device:`,` 1. Enable Developer options and USB debugging, connect the device, and accept the authorization prompt.`,` 2. Verify the device is visible:`,` adb devices`,` 3. Install or update the APK:`,` adb install -r ${i}`,``,`If multiple devices are connected, use:`,` adb -s <device-id> install -r ${i}`].join(`
3
- `)}function $t(e,{profile:t=!1,simulator:n=!1}={}){let r=t?`profile`:`release`,i=z(e,`src-flutter/build/ios/${n?`iphonesimulator`:`iphoneos`}/Runner.app`),a=JSON.stringify(i);return n?[`iOS Simulator ${r} build succeeded.`,``,`Install it on a booted iOS Simulator:`,` 1. Verify available simulators:`,` xcrun simctl list devices`,` 2. Install the app:`,` xcrun simctl install booted ${a}`,``,"If multiple simulators are available, replace `booted` with the simulator UDID."].join(`
2
+ import*as e from"@alloc/cmd-ts";import{array as t,command as n,extendType as r,flag as i,multioption as a,number as o,oneOf as s,option as c,optional as l,positional as u,rest as d,string as f,subcommands as p}from"@alloc/cmd-ts";import{ProjectPostgresAlreadyRunningError as m,checkDeployMigrations as h,checkSchemaPush as g,collectDeployMigrationFiles as _,createProjectPostgresDatabaseAdapter as v,createProjectSqliteDatabaseAdapter as y,ensureLocalDb as b,filterPendingMigrations as x,formatDbErrorMessage as S,formatMigrationList as C,formatMigrationScanFailures as w,migrateHeldMigrations as T,migrateLocalDb as E,readAppliedMigrationNames as D,resetLocalDb as ee,runDrizzleKitCommand as O,scanDeployMigrationFiles as te,seedLocalDb as ne,setupLocalDb as k,startProjectPostgres as A,startProjectTurso as re,stopProjectPostgres as ie}from"@coreframe/db";import{checkFlutterClient as j,ensureFlutterDevAssetDirectories as ae,flutterPlatforms as M,generateFlutterNativeBridge as oe,prepareFlutterClient as N,prepareFlutterDevOutput as se,productionApiOrigin as P,runFlutterAcceptance as ce}from"@coreframe/flutter-tools";import F,{dirname as I,isAbsolute as le,join as L,posix as R,resolve as z,sep as ue}from"node:path";import B from"nano-spawn";import*as V from"@clack/prompts";import{addAsset as de,buildAssets as fe,checkAssets as pe,printAssetResult as me,publishAssets as he}from"@coreframe/assets";import{assertAssetCredentialProfile as ge,configureAssetCredentials as _e,createB2PrivateObjectStore as ve}from"@coreframe/object-storage";import{access as ye,chmod as be,copyFile as xe,cp as Se,link as Ce,mkdir as H,mkdtemp as we,readFile as U,readdir as Te,realpath as Ee,rename as De,rm as W,stat as Oe,unlink as ke,writeFile as G}from"node:fs/promises";import{homedir as Ae,networkInterfaces as je,tmpdir as Me}from"node:os";import{importProjectDependency as Ne,importProjectModule as Pe,normalizeWorkerEnvironment as Fe,readProjectConfig as Ie,wranglerEnvironmentNames as Le}from"@coreframe/config";import{createHash as Re,randomUUID as ze}from"node:crypto";import K from"node:process";import{spawnSync as q}from"node:child_process";import{chmodSync as Be,existsSync as J,lstatSync as Ve,mkdirSync as He,mkdtempSync as Ue,readFileSync as Y,readlinkSync as We,rmSync as Ge,symlinkSync as Ke,watch as qe,writeFileSync as Je}from"node:fs";import{parse as Ye,stringify as Xe}from"yaml";import{accessTokenSigningSecretName as Ze,clearAppliedPendingWorkerSecrets as Qe,deployEnvironments as $e,discardPendingWorkerSecret as et,discoverStagingUrl as tt,inspectWorkerEnvironment as nt,materializePrimaryWorkerConfig as rt,materializePrimaryWorkerTypeConfig as it,parseDeclaredWorkerSecretEnv as at,parseTauriReleasePlatform as ot,prepareAccessTokenSigningSecret as st,prepareTauriRelease as ct,queueWorkerSecret as lt,queueWorkerSecrets as ut,readDeclaredWorkerSecrets as dt,readPackageJson as ft,readPendingWorkerSecretSnapshot as pt,reassignStagingHostname as mt,releaseName as ht,resolveDeployConfig as gt,resolveReleaseVersion as _t,resolveTauriReleasePlan as vt,restoreTauriReleaseMetadata as yt,rotateAccessTokenSigningSecret as bt,runAfterWorkerDeploy as xt,runPostDeployChecks as St,tauriReleasePlatforms as Ct,uploadTauriReleaseToB2 as wt,validateTauriReleasePlan as Tt,validateWorkerEnvironmentForDeploy as Et,verifyAccessTokenSigningSecret as Dt,writePackageVersion as Ot,writeTauriReleaseMetadata as kt}from"@coreframe/deploy";import{connectDevSupervisor as At,createDevStartupTiming as jt,devHttpsCertEnv as Mt,devHttpsKeyEnv as Nt,isManagedDevCheckout as Pt,isPrimaryCheckout as Ft,prepareDevHttps as It,stopDevSupervisor as Lt}from"@coreframe/dev";import{inspect as Rt,parseEnv as zt}from"node:util";import{once as Bt}from"node:events";import{finished as Vt}from"node:stream/promises";import{codexTaskEnv as Ht}from"@coreframe/dev-contracts/codex-task";import{managedDevEnv as Ut,managedDevFlutterRestartFileEnv as Wt}from"@coreframe/dev-contracts/managed-dev";import{createPrefixStream as X,supervise as Gt}from"procband";import{createConnection as Kt,createServer as qt}from"node:net";import{setTimeout as Jt}from"node:timers/promises";import{determineAgent as Yt}from"@vercel/detect-agent";import{runPreview as Xt}from"@coreframe/preview";const Zt=[`web`,...M];function Qt(e=`web`,{apiOrigin:t,cwd:n=process.cwd(),profile:r=!1,simulator:i=!1}={}){if(rn(e,{profile:r,simulator:i}),e===`web`)return[on(`pnpm`,[`build`],n,{COREFRAME_PLATFORM:`web`})];let a=P(t);return[{kind:`prepare`,platform:e},on(`flutter`,$t(e,a,{profile:r,simulator:i}),z(n,`src-flutter`),{COREFRAME_API_ORIGIN:a})]}function $t(e,t,{noCodesign:n=e===`macos`,profile:r=!1,simulator:i=!1}={}){rn(e,{profile:r,simulator:i});let a=P(t);return[`build`,e===`android`?`apk`:e,r?`--profile`:`--release`,...i?[`--simulator`]:[],...n?[`--no-codesign`]:[],`--dart-define=COREFRAME_API_ORIGIN=${a}`]}function en(e,{profile:t=!1}={}){let n=t?`profile`:`release`,r=z(e,`src-flutter/build/app/outputs/flutter-apk/app-${n}.apk`),i=JSON.stringify(r);return[`Android ${n} build succeeded.`,``,`Install it on a connected Android device:`,` 1. Enable Developer options and USB debugging, connect the device, and accept the authorization prompt.`,` 2. Verify the device is visible:`,` adb devices`,` 3. Install or update the APK:`,` adb install -r ${i}`,``,`If multiple devices are connected, use:`,` adb -s <device-id> install -r ${i}`].join(`
3
+ `)}function tn(e,{profile:t=!1,simulator:n=!1}={}){let r=t?`profile`:`release`,i=z(e,`src-flutter/build/ios/${n?`iphonesimulator`:`iphoneos`}/Runner.app`),a=JSON.stringify(i);return n?[`iOS Simulator ${r} build succeeded.`,``,`Install it on a booted iOS Simulator:`,` 1. Verify available simulators:`,` xcrun simctl list devices`,` 2. Install the app:`,` xcrun simctl install booted ${a}`,``,"If multiple simulators are available, replace `booted` with the simulator UDID."].join(`
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
- `)}async function en({apiOrigin:e,cwd:t=process.cwd(),environment:n=process.env,platform:r=`web`,profile:i=!1,simulator:a=!1,prepareClient:o=N,runCommand:s=nn}={}){tn(r,{profile:i,simulator:a});let c={...n};delete c.COREFRAME_FLUTTER_DEVELOPMENT,delete c.COREFRAME_PLATFORM,delete c.TAURI_ENV_PLATFORM;let l=r===`web`?void 0:P(e??n.COREFRAME_API_ORIGIN);for(let e of Xt(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(Qt(t,{profile:i})):r===`ios`&&console.log($t(t,{profile:i,simulator:a}))}function tn(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 nn(e,t,{cwd:n,env:r}){await B(e,t,{cwd:n,env:r,stdio:`inherit`})}function rn(e,t,n,r){return{kind:`command`,command:e,args:t,cwd:n,...r===void 0?{}:{environment:r}}}const an=r(f,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in a packaged Flutter client.`,async from(e){return P(e)}}),on=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(Yt)),displayName:`platform`,description:`Build target: web, iOS, Android, or macOS. Defaults to web.`}),apiOrigin:c({long:`api-origin`,type:l(an),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})=>en({apiOrigin:e,platform:t,profile:n,simulator:r})}),sn=/^[a-f0-9]{64}$/,cn=/^[a-f0-9]{40}$/,ln=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function un(e){if(!sn.test(e))throw Error(`Invalid SHA-256 digest "${e}".`);return e}function dn(e){if(!cn.test(e))throw Error(`Invalid full Git revision "${e}".`);return e}function fn(e,t){if(!ln.test(e))throw Error(`${t} must contain only letters, numbers, dots, underscores, or hyphens.`);return e}function pn(e){return`projects/${fn(e,`Project ID`)}/i18n/v1`}function mn(e,t){return un(t),`${pn(e)}/objects/sha256/${t.slice(0,2)}/${t}`}function hn(e,t){return dn(t),`${pn(e)}/commits/${t}.json`}function gn(e,t){return _n(t),`${pn(e)}/releases/${encodeURIComponent(t)}.json`}function _n(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 Z(e,t){if(!t||t.startsWith(`/`)||t.includes(`\0`))throw Error(`Unsafe i18n artifact path "${t}".`);let n=z(e),r=z(n,t);if(r!==n&&!r.startsWith(`${n}${ue}`))throw Error(`Unsafe i18n artifact path "${t}".`);return r}function Q(e,t,n){return`${e.directory}/${t}/${n}.json`}function vn(e,t,n){return`${e.directory}/${t}/${n}.mjs`}async function yn(e){await B(`pnpm`,[`exec`,`lingui`,`extract`],{cwd:e,stdio:`inherit`})}async function bn({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=Z(t,Q(e,n,a)),s=await Tn(o),c=Object.fromEntries(Object.entries(s).filter(([,e])=>!e.obsolete)),l=L(r,`${n}-${a}.json`);await H(I(l),{recursive:!0}),await xe(o,l),i.push({path:o,backup:l}),await En(o,c)}await B(`pnpm`,[`exec`,`lingui`,`compile`,...n?[`--strict`]:[]],{cwd:t,stdio:`inherit`})}finally{try{for(let{path:e,backup:t}of i)await xe(t,e)}finally{for(let n of e.locales)for(let r of e.catalogs)await W(Z(t,vn(e,n,r)),{force:!0})}}}async function xn({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 Tn(Z(t,Q(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)=>jn(e).localeCompare(jn(t)))}async function Sn({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 Dn(await On({args:e.generator.args??[],command:e.generator.command,cwd:t,env:r,input:JSON.stringify(i)}))}async function Cn({config:e,cwd:t,missing:n,response:r}){let i=new Map(n.map(e=>[jn(e),e])),a=new Map;for(let e of r.translations){let t=jn(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 Ne(`@lingui/message-utils/compileMessage`,t);for(let e of n){let t=a.get(jn(e));kn({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=Z(t,Q(e,n,r)),o=await Tn(i),s=!1;for(let[e,t]of Object.entries(o)){let i=a.get(jn({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 En(i,o)}}async function wn({config:e,cwd:t}){let n=await xn({config:e,cwd:t});if(n.length>0)throw Error(`I18n catalogs remain incomplete: ${n.length} translations are missing.`);let r=await Ne(`@lingui/message-utils/compileMessage`,t);for(let n of e.locales)if(n!==e.sourceLocale)for(let i of e.catalogs){let a=await Tn(Z(t,Q(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}.`);kn({compileMessage:r,id:e,locale:n,source:t.message,translation:t.translation})}}}async function Tn(e){let t=JSON.parse(await U(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 En(e,t){await H(I(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;await G(n,`${JSON.stringify(t,null,2)}\n`),await De(n,e)}function Dn(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 On({args:e,command:t,cwd:n,env:r,input:i}){return B(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 kn({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=An(a),c=An(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 An(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 jn(e){return`${e.locale}\0${e.catalog}\0${e.id}`}function Mn(e){return Re(`sha256`).update(e).digest(`hex`)}async function Nn(e){return Mn(await U(e))}function Pn(e){return Buffer.from(`${JSON.stringify(e,null,2)}\n`)}async function Fn({bucket:e,digest:t,projectId:n,source:r,store:i}){if(un(t),await Nn(r)!==t)throw Error(`I18n object source does not match declared SHA-256 digest ${t}.`);let a=mn(n,t);await i.has(e,a)||await i.upload(e,a,r,`application/octet-stream`);let o=`${r}.${process.pid}.${ze()}.verify`;try{if(await i.download(e,a,o),await Nn(o)!==t)throw Error(`Existing immutable i18n object ${a} failed integrity verification.`)}finally{await W(o,{force:!0})}}async function In({bucket:e,key:t,reference:n,store:r,temporaryDirectory:i}){let a=Pn(n),o=L(i,`reference-${ze()}.json`);if(await r.has(e,t))try{if(await r.download(e,t,o),!(await U(o)).equals(a))throw Error(`Immutable i18n reference ${t} already resolves to different snapshot data.`);return}finally{await W(o,{force:!0})}await G(o,a,{flag:`wx`});try{await r.upload(e,t,o,`application/json`)}finally{await W(o,{force:!0})}let s=L(i,`reference-${ze()}.verify.json`);try{if(await r.download(e,t,s),!(await U(s)).equals(a))throw Error(`Uploaded immutable i18n reference ${t} failed verification.`)}finally{await W(s,{force:!0})}}async function Ln({bucket:e,manifest:t,projectId:n,store:r,temporaryDirectory:i}){let a=Pn(t),o=Mn(a),s=L(i,`manifest-${o}.json`);await G(s,a,{flag:`wx`});try{await Fn({bucket:e,digest:o,projectId:n,source:s,store:r})}finally{await W(s,{force:!0})}return o}async function Rn({bucket:e,key:t,store:n,temporaryDirectory:r}){if(!await n.has(e,t))return;let i=L(r,`reference-${ze()}.json`);try{await n.download(e,t,i);let r=JSON.parse(await U(i,`utf8`));if(r.version!==1||typeof r.revision!=`string`||typeof r.snapshot!=`string`)throw Error(`Invalid i18n reference at ${t}.`);return dn(r.revision),un(r.snapshot),r}finally{await W(i,{force:!0})}}async function zn({bucket:e,projectId:t,revision:n,store:r,temporaryDirectory:i}){let a=await Rn({bucket:e,key:hn(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 Bn({bucket:e,projectId:t,reference:n,store:r,tag:i,temporaryDirectory:a}){await In({bucket:e,key:hn(t,n.revision),reference:n,store:r,temporaryDirectory:a}),i&&await In({bucket:e,key:gn(t,i),reference:n,store:r,temporaryDirectory:a})}async function Vn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:a}){un(n);let o=L(z(t),`v1`,`sha256`,n.slice(0,2),n);if(await Un(o,n)===!1){await H(I(o),{recursive:!0});let t=`${o}.${process.pid}.${ze()}.tmp`;try{if(await i.download(e,mn(r,n),t),await Nn(t)!==n)throw Error(`Downloaded i18n object failed SHA-256 verification: ${n}.`);await W(o,{force:!0}),await De(t,o)}finally{await W(t,{force:!0})}}await H(I(a),{recursive:!0});let s=`${a}.${process.pid}.${ze()}.tmp`;try{if(await xe(o,s),await Nn(s)!==n)throw Error(`Cached i18n object failed SHA-256 verification: ${n}.`);await W(a,{force:!0}),await De(s,a)}finally{await W(s,{force:!0})}}async function Hn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,temporaryDirectory:a}){let o=L(a,`manifest-${n}.json`);await Vn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:o});let s=JSON.parse(await U(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}.`);dn(s.revision),s.baseline!==void 0&&un(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}.`);un(e.digest)}return s}async function Un(e,t){try{return(await Oe(e)).isFile()&&await Nn(e)===t}catch{return!1}}async function Wn({cwd:e=process.cwd(),env:t=process.env}={}){if((await Ie({cwd:e})).i18n){if(t.COREFRAME_I18N_RELEASE_REVISION){await qn({cwd:e,env:t,revision:t.COREFRAME_I18N_RELEASE_REVISION});return}await yn(e)}}async function Gn({cwd:e=process.cwd(),projectConfig:t}={}){let n=t??await Ie({cwd:e});if(!n.i18n)return;let r=Jn(n.i18n),i=Z(e,r.directory);try{if(!(await Oe(i)).isDirectory())throw Error(`I18n catalog path is not a directory: ${i}.`)}catch(t){if(t.code!==`ENOENT`)throw t;await yn(e);return}for(let t of r.locales)for(let n of r.catalogs)try{if(!(await Oe(Z(e,Q(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 yn(e);return}}async function Kn({cwd:e=process.cwd(),env:t=process.env,store:n,tag:r}){_n(r);let i=await Yn({cwd:e,env:t,store:n});await rr(e);let a=await nr(e);await ir(e,r,a);let o=await we(L(Me(),`coreframe-i18n-prepare-`));try{let n=await zn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,revision:a,store:i.store,temporaryDirectory:o});if(n){let e=await Hn({bucket:i.assets.sourceBucket,cacheRoot:i.cacheRoot,digest:n.snapshot,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return tr(i,e,a),await Zn(i,e),await Bn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,reference:n,store:i.store,tag:r,temporaryDirectory:o}),{reused:!0,snapshot:n.snapshot}}return await er(i,o,async()=>{let n=await Xn(i,a,o);n||await $n(i),await yn(e);let s=await xn({config:i.config,cwd:e}),c=await Sn({config:i.config,cwd:e,env:t,messages:s});await Cn({config:i.config,cwd:e,missing:s,response:c}),await wn({config:i.config,cwd:e}),await bn({config:i.config,cwd:e,strict:!0,temporaryDirectory:o});let l=await Qn(i),u={...n?{baseline:n}:{},catalogs:i.config.catalogs,files:l,generator:s.length>0?i.config.generator?.id??`unconfigured`:`none`,linguiVersion:await ar(e),locales:i.config.locales,projectId:i.assets.projectId,revision:a,sourceLocale:i.config.sourceLocale,version:1},d=await Ln({bucket:i.assets.sourceBucket,manifest:u,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return await Bn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,reference:{revision:a,snapshot:d,version:1},store:i.store,tag:r,temporaryDirectory:o}),{reused:!1,snapshot:d}})}finally{await W(o,{force:!0,recursive:!0})}}async function qn({cwd:e=process.cwd(),env:t=process.env,revision:n,store:r}={}){let i=await Ie({cwd:e});if(!i.i18n)return;let a=await Yn({cwd:e,env:t,store:r,projectConfig:i}),o=dn(n??await nr(e)),s=await we(L(Me(),`coreframe-i18n-materialize-`));try{let e=await zn({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 Hn({bucket:a.assets.sourceBucket,cacheRoot:a.cacheRoot,digest:e.snapshot,projectId:a.assets.projectId,store:a.store,temporaryDirectory:s});return tr(a,t,o),await Zn(a,t),{revision:o,snapshot:e.snapshot}}finally{await W(s,{force:!0,recursive:!0})}}function Jn(e){let t=fn(e.sourceLocale,`Source locale`),n=[...new Set(e.locales.map(e=>fn(e,`Locale`)))],r=[...new Set(e.catalogs.map(e=>fn(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 Yn({cwd:e=process.cwd(),env:t=process.env,projectConfig:n,store:r}){let i=n??await Ie({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:z(e,`.coreframe`,`i18n`,`cache`),config:Jn(i.i18n),cwd:z(e),env:t,store:r??ve({config:a,env:t})}}async function Xn(e,t,n){let{stdout:r}=await B(`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 zn({bucket:e.assets.sourceBucket,projectId:e.assets.projectId,revision:dn(t),store:e.store,temporaryDirectory:n});if(!r)continue;let i=await Hn({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:r.snapshot,projectId:e.assets.projectId,store:e.store,temporaryDirectory:n});return tr(e,i,t),await Zn(e,i),r.snapshot}}async function Zn(e,t){for(let n of t.files)if(await Vn({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:n.digest,projectId:e.assets.projectId,store:e.store,target:Z(e.cwd,n.path)}),(await Oe(Z(e.cwd,n.path))).size!==n.size)throw Error(`Materialized i18n artifact size does not match manifest: ${n.path}.`)}async function Qn(e){let t=[];for(let n of e.config.locales)for(let r of e.config.catalogs){let i=Q(e.config,n,r),a=Z(e.cwd,i),o=await Nn(a);await Fn({bucket:e.assets.sourceBucket,digest:o,projectId:e.assets.projectId,source:a,store:e.store}),t.push({digest:o,path:i,size:(await Oe(a)).size})}return t.sort((e,t)=>e.path.localeCompare(t.path))}async function $n(e){let{stdout:t}=await B(`git`,[`rev-parse`,`--show-prefix`],{cwd:e.cwd,stdin:`ignore`}),n=t.trim(),{stdout:r}=await B(`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 Ne(`@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 B(`git`,[`show`,`${i}:${s}`],{cwd:e.cwd,stdin:`ignore`});await En(Z(e.cwd,Q(e.config,t,r)),a.parse(n)),o=!0}catch{}}return o}async function er(e,t,n){let r=[];for(let n of e.config.locales)for(let i of e.config.catalogs){let a=Q(e.config,n,i),o=Z(e.cwd,a);try{await ye(o)}catch{continue}let s=L(t,`previous-catalogs`,a);await H(I(s),{recursive:!0}),await De(o,s),r.push({backup:s,path:o})}try{let e=await n();return await W(L(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 W(Z(e.cwd,Q(e.config,t,n)),{force:!0});for(let{backup:e,path:t}of r)await H(I(t),{recursive:!0}),await De(e,t);throw t}}function tr(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=>Q(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 nr(e){let{stdout:t}=await B(`git`,[`rev-parse`,`HEAD`],{cwd:e,stdin:`ignore`});return dn(t.trim())}async function rr(e){let{stdout:t}=await B(`git`,[`status`,`--porcelain`],{cwd:e,stdin:`ignore`});if(t.trim())throw Error(`Tagged i18n preparation requires a clean Git tree.`)}async function ir(e,t,n){let{stdout:r}=await B(`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 ar(e){let{stdout:t}=await B(`pnpm`,[`exec`,`lingui`,`--version`],{cwd:e,stdin:`ignore`});return t.trim()}const or=[`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(` `),sr=r(f,{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}}),cr=r(f,{displayName:`profile`,async from(e){return ge(e)}}),lr=r(f,{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}}),ur=r(f,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in the packaged Flutter client.`,async from(e){return P(e)}}),dr=p({name:`assets`,cmds:{configure:n({name:`configure`,description:`Store a Backblaze B2 private build-object key in the operating system credential store. ${or}`,args:{profile:u({type:cr,displayName:`profile`,description:`Credential profile named by coreframe.config.ts.`})},handler:async({profile:e})=>{V.note(or,`Required B2 key access`);let t=await V.text({message:`Backblaze B2 application key ID`,validate:e=>e?.trim()?void 0:`The application key ID is required.`});if(V.isCancel(t))throw Error(`Asset credential configuration was cancelled.`);let n=await V.password({message:`Backblaze B2 application key`,validate:e=>e?void 0:`The application key is required.`});if(V.isCancel(n))throw Error(`Asset credential configuration was cancelled.`);await _e({applicationKey:n,applicationKeyId:t.trim(),profile:e}),console.log(`Stored Coreframe asset credential profile "${e}".`)}}),add:n({name:`add`,args:{file:u({type:f,displayName:`file`,description:`Source raster image, SVG, MP3, MP4, or Lottie JSON to add to the asset library.`}),id:c({long:`id`,type:f,description:`Logical asset ID, such as blog/my-post/hero.`}),alt:c({long:`alt`,type:l(f),description:`Required alt text for raster image and SVG assets.`}),pack:c({long:`pack`,type:l(lr),description:`Place the asset in a named, lazily loaded pack.`}),variantWidths:c({long:`widths`,type:l(sr),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})=>me(await de({alt:e,file:t,id:n,pack:i,variantWidths:a}),r)}),build:n({name:`build`,args:{id:c({long:`id`,type:l(f),description:`Build only one logical asset ID.`}),pack:c({long:`pack`,type:l(lr),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})=>me(await fe({id:e,pack:n}),t)}),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(lr),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 pe({fix:e,pack:n});me(r,t),r.ok||(process.exitCode=1)}}),publish:n({name:`publish`,args:{pack:c({long:`pack`,type:l(lr),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 he({pack:t});me(n,e),n.ok||(process.exitCode=1)}}),status:n({name:`status`,args:{pack:c({long:`pack`,type:l(lr),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 pe({pack:t});me(n,e),n.ok||(process.exitCode=1)}})}}),fr=p({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:ur,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e})=>ce({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})=>oe({check:e})}),prepare:n({name:`prepare`,description:`Build and package the React client for one Flutter platform.`,args:{platform:u({type:s(M),displayName:`platform`,description:`Flutter platform whose packaged client should be prepared.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:ur,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>N({apiOrigin:e,platform:t})}),check:n({name:`check`,description:`Reject missing, stale, modified, or incorrectly targeted Flutter assets.`,args:{platform:u({type:s(M),displayName:`platform`,description:`Flutter platform whose packaged client should be checked.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:ur,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>j({apiOrigin:e,platform:t})})}}),pr=p({name:`i18n`,cmds:{build:n({name:`build`,description:`Extract source messages or materialize an exact release catalog snapshot.`,args:{},handler:async()=>{await Wn()}}),materialize:n({name:`materialize`,description:`Materialize the immutable i18n snapshot for an exact commit.`,args:{revision:c({long:`revision`,type:l(f),description:`Full commit SHA. Defaults to the checked-out commit.`})},handler:async({revision:e})=>{let t=await qn({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.`,args:{tag:c({long:`tag`,type:f,description:`Pushed v* release tag that points to the checked-out commit.`})},handler:async({tag:e})=>{let t=await Kn({tag:e});console.log(`${t.reused?`Reused`:`Published`} i18n snapshot ${t.snapshot}.`)}})}}),mr=K.platform===`win32`?`react-router.cmd`:`react-router`,hr=K.platform===`win32`?`panda.cmd`:`panda`;async function gr(e=K.cwd()){await yr(e),await vr(e,[`typegen`])}async function _r(e=K.cwd(),t=K.env,n){if((t.COREFRAME_PLATFORM??t.TAURI_ENV_PLATFORM??`web`)!==`web`)return;let r=F.resolve(e,`.coreframe/dashboard-build`),i=F.join(r,`client`),a=F.resolve(e,`dist/client/__dashboard`);await W(r,{force:!0,recursive:!0}),await br(e,hr,[`build`],t),await vr(e,[`build`,...n?[`--mode`,n]:[]],t),await W(a,{force:!0,recursive:!0}),await H(F.dirname(a),{recursive:!0}),await Se(i,a,{recursive:!0})}async function vr(e,t,n=K.env){await br(e,mr,t,n)}async function yr(e){await W(F.resolve(e,`dashboard/.react-router`),{force:!0,recursive:!0})}async function br(e,t,n,r=K.env){await B(t,n,{cwd:F.resolve(e,`dashboard`),env:{...r,PATH:F.resolve(e,`node_modules/.bin`)+F.delimiter+(r.PATH??r.Path??``)},stdio:`inherit`})}const xr=p({name:`dashboard`,cmds:{build:n({name:`build`,args:{mode:c({long:`mode`,type:l(f),description:`Vite environment mode used for the dashboard build.`})},handler:({mode:e})=>_r(void 0,void 0,e)}),typegen:n({name:`typegen`,args:{},handler:()=>gr()})}}),Sr=/^[a-z0-9]+(?:-[a-z0-9]+)*$/u;function Cr(e,t){let n=Tr(e,t);if(!Er(n)||!Dr(n,[`description`,`requires`,`routes`,`verifier`])||!kr(n.description)||n.requires!==void 0&&(!Array.isArray(n.requires)||!n.requires.every(kr))||n.verifier!==void 0&&!kr(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=>wr(e));if(new Set(r).size!==r.length)throw Error(`${t} contains duplicate recipe requirements.`);let i=n.routes.map((e,n)=>{if(!Er(e)||!Or(e,[`path`,`router`,`when`])||!kr(e.path)||!kr(e.router)||!kr(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 wr(e){if(!Sr.test(e))throw Error(`Recipe names use lowercase letters, numbers, and single hyphens.`);return e}function Tr(e,t){try{return Je(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function Er(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Dr(e,t){return Object.keys(e).every(e=>t.includes(e))}function Or(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function kr(e){return typeof e==`string`&&e.length>0}const Ar=`https://github.com/airlock-labs/coreframe.git`;function jr(e,t){return q(`git`,e,{cwd:t,encoding:`utf8`})}function Mr(e,t){let n=jr(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 Nr(e,t){let n=jr([`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 Pr({cwd:e=process.cwd(),fetch:t=!0,remote:n=`template`}={}){if(n.length===0)throw Error(`Remote name must not be empty.`);Mr([`rev-parse`,`--show-toplevel`],e);let r=Nr(n,e);if(r===null)Mr([`remote`,`add`,n,Ar],e),console.log(`Added ${n} remote: ${Ar}`);else if(r===Ar)console.log(`${n} remote already points at ${Ar}`);else throw Error(`${n} remote points at ${r}, not ${Ar}.\nChoose the intended template source before continuing, then update or rename the remote manually.`);t&&(Mr([`fetch`,n,`--tags`,`--prune`],e),console.log(`Fetched ${n}.`))}const Fr=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u;function Ir(e){return Fr.test(e)?`v${e}`:e}function Lr(e){return`${Ir(e)}:template`}function Rr(e,t){return`${Lr(e)}/${t}`}function zr({cwd:e=process.cwd(),fetch:t=!0,remote:n=`template`,target:r}={}){let i=Ur(e),a=qr(i,[`rev-parse`,`--show-toplevel`]),o=Ir(r??Wr(i));return Pr({cwd:a,fetch:t,remote:n}),{projectRoot:i,ref:o,repositoryRoot:a}}function Br(e,t,n){return Vr(e,t,n).toString(`utf8`)}function Vr(e,t,n){let r=`${t}:${n}`,i=q(`git`,[`show`,r],{cwd:e,encoding:`buffer`});if(i.status!==0)throw Error(`Could not read ${r}. ${Jr([`show`,r],i)}`);return i.stdout}function Hr(e,t,n){let r=q(`git`,[`ls-tree`,`-r`,`--name-only`,`-z`,t,`--`,n],{cwd:e,encoding:`buffer`});if(r.status!==0)throw Error(Jr([`ls-tree`,t,n],r));return r.stdout.toString(`utf8`).split(`\0`).filter(Boolean)}function Ur(e){let t=z(e);for(;;){let e=L(t,`package.json`),n=Kr(e);if(n!==void 0&&Gr(n,e).engines?.coreframe)return t;let r=I(t);if(r===t)throw Error(`Could not find a package.json with engines.coreframe.`);t=r}}function Wr(e){let t=L(e,`package.json`),n=Kr(t);if(n===void 0)throw Error(`Required file package.json does not exist.`);let r=Gr(n,t).engines?.coreframe;if(!r)throw Error(`package.json must declare an exact engines.coreframe recipe baseline.`);return r}function Gr(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function Kr(e){try{return Y(e,`utf8`)}catch(e){if(Yr(e)&&e.code===`ENOENT`)return;throw e}}function qr(e,t){let n=q(`git`,t,{cwd:e,encoding:`utf8`});if(n.status!==0)throw Error(Jr(t,n));return n.stdout.trim()}function Jr(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 Yr(e){return e instanceof Error&&`code`in e}const Xr=[{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:$r},{path:`src/api/client/app-origin.ts`,requirement:`allow the Flutter shell to provide its exact API origin`,test:e=>Qr(e,[`@coreframe/flutter-js/client`,`resolveAppOrigin`,`browserOrigin: location?.origin`])},{path:`src/api/worker/auth-config.ts`,requirement:`trust the exact Flutter authentication origins`,test:e=>Qr(e,[`appendFlutterAuthOrigins`,`appendFlutterAuthOrigins([], development)`])},{path:`src/api/worker/middleware/auth.ts`,requirement:`broker Flutter access tokens and accept Flutter bearer origins`,test:e=>Qr(e,[`createFlutterAccessTokenResponse`,`isFlutterAuthOrigin(origin, import.meta.env.DEV)`,`readFlutterBearerToken(request, import.meta.env.DEV, developmentOrigin)`,`native && ctx.request.method !== "GET"`])&&!e.includes(`isNativeOrigin`)},{path:`src/api/worker/middleware/flutter-cors.ts`,requirement:`provide the Flutter packaged-origin CORS boundary`,test:e=>Qr(e,[`applyFlutterCors`,`handleFlutterCorsPreflight`,`flutterCorsMiddleware`])},{path:`src/api/worker/middleware/index.ts`,requirement:`apply Flutter CORS to ordinary Worker responses`,test:e=>e.includes(`flutterCorsMiddleware`)},{path:`src/web/app/flutter-shell/application.ts`,requirement:`configure the Flutter shell's app-owned query and session hooks`,test:e=>Qr(e,[`configureShellQueryFocus`,`authSessionHint`])},{path:`src/web/entry.client.tsx`,requirement:`load the package-owned Flutter development tools only for non-browser development`,test:e=>Qr(e,[`@coreframe/vite/flutter-devtools`,`import.meta.env.PLATFORM !== "web"`])}];function Zr(e){let t=[];for(let n of Xr){let r=L(e,n.path);if(!J(r)){t.push(`${n.path} is missing; it must ${n.requirement}.`);continue}let i=Y(r,`utf8`);n.test(i)||t.push(`${n.path} must ${n.requirement}.`)}return t}function Qr(e,t){return t.every(t=>e.includes(t))}function $r(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`,`macos`].some(e=>n.has(e))}const ei=[{path:`package.json`,requirement:`declare the Tauri CLI, plugin-log, and Coreframe Tauri runtime packages`,test:e=>$(e,[`"@tauri-apps/cli"`,`"@tauri-apps/plugin-log"`,`"@coreframe/tauri-js"`,`"@coreframe/tauri-plugin-auth-session"`])},{path:`src-tauri/Cargo.toml`,requirement:`declare Tauri, plugin-log, and Coreframe auth-session Rust dependencies`,test:e=>$(e,[`tauri-build`,`tauri-plugin-log`,`coreframe-tauri-plugin-auth-session`])},{path:`src-tauri/src/main.rs`,requirement:`launch the project-owned Tauri Rust library`,test:e=>e.includes(`::run();`)},{path:`src-tauri/src/lib.rs`,requirement:`register plugin-log and the Coreframe auth-session broker`,test:e=>$(e,[`tauri_plugin_log::Builder`,`coreframe_tauri_plugin_auth_session::init`,`VITE_APP_ORIGIN`])},{path:`src-tauri/build.rs`,requirement:`forward VITE_APP_ORIGIN and TAURI_DEV_HOST into the Rust build`,test:e=>$(e,[`VITE_APP_ORIGIN`,`TAURI_DEV_HOST`])},{path:`src-tauri/capabilities/default.json`,requirement:`grant log and auth-session permissions to the main window`,test:e=>$(e,[`"windows": ["main"]`,`"log:default"`,`"coreframe-tauri-plugin-auth-session:default"`])},{path:`vite.config.ts`,requirement:`define the Tauri runtime and platform environment and fixed native dev server`,test:e=>$(e,[`env.host === "tauri"`,`"import.meta.env.TAURI"`,`"import.meta.env.PLATFORM"`,`TAURI_DEV_HOST`,`strictPort: true`])},{path:`src/vite-env.d.ts`,requirement:`type the Tauri runtime, platform, development origin, and packaged app origin`,test:e=>$(e,[`PLATFORM: import("@coreframe/lib/shell").ShellPlatform`,`TAURI: boolean`,`TAURI_DEV_ORIGIN`,`VITE_APP_ORIGIN`])},{path:`react-router.config.ts`,requirement:`skip service-worker generation for non-browser hosts`,test:e=>$(e,[`resolveCoreframeHost`,`resolveCoreframeHost() === "browser"`])},{path:`src/api/client/app-origin.ts`,requirement:`resolve browser and packaged application origins through the Tauri runtime`,test:e=>$(e,[`@coreframe/tauri-js/client`,`browserOrigin: location?.origin`,`development: import.meta.env.DEV`,`packagedAppOrigin: import.meta.env.VITE_APP_ORIGIN`,`tauri: import.meta.env.TAURI`,`tauriDevelopmentOrigin: import.meta.env.TAURI_DEV_ORIGIN`])&&!e.includes(`resolveAppOrigin(import.meta.env`)},{path:`src/api/client/auth-fetch.ts`,requirement:`call the selected framework authentication composition`,test:e=>$(e,[`createAuthenticatedFetch`,`refreshAccess`,`sessionHint: authSessionHint`])},{path:`src/api/client/auth-session-hint.ts`,requirement:`keep native session hints in memory until the credential broker revalidates`,test:e=>$(e,[`import.meta.env.PLATFORM !== "web"`,`persistence: browserPersistence`,`return false`])},{path:`src/api/client/tauri-auth.ts`,requirement:`compose native API and Better Auth transports behind the virtual auth contract`,test:e=>$(e,[`createAuthenticatedFetch`,`createTauriAuthenticatedFetch`,`authSessionHint: options.sessionHint`,`mintAccessToken`,`createAuthClient`,`createAuthFetch`,`onSessionChange: options.onSessionChange`])},{path:`src/web/auth/client.ts`,requirement:`call the selected framework Better Auth composition`,test:e=>$(e,[`createAuthClient as createCoreframeAuthClient`,`createCoreframeAuthClient`,`authFetch`,`customFetchImpl`])},{path:`src/api/worker/middleware/auth.ts`,requirement:`mint and accept bearer access tokens only across the fixed native origin boundary`,test:e=>$(e,[`appendTauriAppOrigins`,`createTauriAccessTokenResponse`,`isTauriAppOrigin`,`readTauriBearerToken`])},{path:`src/api/worker/fetch.ts`,requirement:`apply native CORS at every Worker response boundary`,test:e=>$(e,[`handleTauriCorsPreflight`,`applyTauriCors`])},{path:`coreframe.config.ts`,requirement:`enable web and desktop development platforms`,test:e=>$(e,[`platforms: ["web", "desktop"]`])&&!e.includes(`"ios"`)&&!e.includes(`"android"`)},{path:`src/web/entry.client.tsx`,requirement:`attach native development logs and skip service-worker registration in Tauri`,test:e=>$(e,[`import "./dev/tauri-log.ts"`,`import.meta.env.TAURI`])},{path:`.env.example`,requirement:`document the packaged VITE_APP_ORIGIN build value`,test:e=>e.includes(`VITE_APP_ORIGIN`)},{path:`.gitignore`,requirement:`ignore the Tauri Cargo target directory`,test:e=>e.includes(`src-tauri/target`)},{path:`.oxfmtrc.json`,requirement:`ignore generated Tauri schemas and target output`,test:e=>$(e,[`src-tauri/gen/schemas`,`src-tauri/target`])},{path:`src-tauri/AGENTS.md`,requirement:`route native work to owner-local rules and documentation`,test:e=>$(e,[`.agents/rules/tauri.md`,`.agents/references/authentication.md`,`.agents/references/deployment.md`,`src-tauri/docs/deployment.md`])},{path:`src-tauri/.agents/rules/tauri.md`,requirement:`install the owner-local durable Tauri native-boundary rule`,test:e=>$(e,[`## Native Boundary`,`## Security`,`## Documentation`])},{path:`.agents/rules/integrations.yaml`,requirement:`route cross-boundary Tauri work to the owner-local native rule`,test:e=>e.includes(`src-tauri/.agents/rules/tauri.md`)},{path:`src-tauri/docs/authentication.md`,requirement:`document the native credential broker and bearer-token boundary`,test:e=>$(e,[`@coreframe/tauri-js`,`@coreframe/tauri-plugin-auth-session`,`VITE_APP_ORIGIN`])},{path:`src-tauri/docs/development.md`,requirement:`document native development asset delivery and Leylines scopes`,test:e=>$(e,[`dev.tauri`,`browser.tauri`,`managed asset`])},{path:`src-tauri/docs/deployment.md`,requirement:`document native release topology, signing, token recovery, and provider setup`,test:e=>$(e,[`VITE_APP_ORIGIN`,`native-auth`,`access-token signing-secret`])},{path:`src-tauri/docs/privacy-security.md`,requirement:`record the shipped Tauri remote API and secure-storage boundary`,test:e=>$(e,[`## Remote API Boundary`,`platform secure storage`])},{path:`.github/workflows/tauri-release-artifacts.yml`,requirement:`provide a desktop-only Tauri release-artifact workflow`,test:e=>$(e,[`Build Tauri Release Artifacts`,`pnpm exec tauri`])&&!e.toLowerCase().includes(`ios`)&&!e.toLowerCase().includes(`android`)}],ti=[`CoreframeTemplateProject7A91C`,`coreframe-template-project-7a91c`,`coreframe_template_project_7a91c`,`com.example.coreframetemplateproject7a91c`];function ni(e){let t=[];for(let n of ei){let r=L(e,n.path);if(!J(r)){t.push(`${n.path} is missing; it must ${n.requirement}.`);continue}let i=Y(r,`utf8`);n.test(i)||t.push(`${n.path} must ${n.requirement}.`)}let n=L(e,`src-tauri/tauri.conf.json`);J(n)?ri(n,t):t.push(`src-tauri/tauri.conf.json is missing.`);for(let n of[`src-tauri/Cargo.toml`,`src-tauri/src/main.rs`,`src-tauri/tauri.conf.json`]){let r=L(e,n);J(r)&&ti.some(e=>Y(r,`utf8`).includes(e))&&t.push(`${n} must replace the Coreframe template identity sentinel.`)}return t}function ri(e,t){let n;try{n=JSON.parse(Y(e,`utf8`))}catch{t.push(`src-tauri/tauri.conf.json must contain valid JSON.`);return}(typeof n.identifier!=`string`||!/^[a-z0-9]+(?:\.[a-z0-9]+){2,}$/.test(n.identifier)||n.identifier.startsWith(`com.example.`))&&t.push(`src-tauri/tauri.conf.json must use an organization-owned reverse-domain identifier.`)}function $(e,t){return t.every(t=>e.includes(t))}function ii({name:e,...t}){let n=zr(t),r=`recipes/${e}/recipe.yaml`,i=si(Cr(Br(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(`
6
- `)}`);return{name:e,ref:n.ref}}function ai(e){console.log(`Verified Coreframe recipe ${e.name} from ${e.ref}.`)}function oi(e,t){for(let n of e){let e=`recipes/${n}/recipe.yaml`,r=si(Cr(Br(t.repositoryRoot,t.ref,e),e).verifier,t.projectRoot);if(r.length>0)throw Error(`Recipe ${n} is required but is not fully applied:\n${r.map(e=>`- ${e}`).join(`
7
- `)}\nApply and verify ${n} before continuing.`)}}function si(e,t){if(!e)throw Error(`Required recipe does not declare a verifier.`);if(e===`tauri`)return ni(t);if(e===`flutter`)return Zr(t);throw Error(`Unknown recipe verifier ${JSON.stringify(e)}.`)}function ci({cwd:e=process.cwd(),fetch:t=!0,name:n,remote:r=`template`,target:i}){wr(n);let a=zr({cwd:e,fetch:t,remote:r,target:i}),{projectRoot:o,ref:s,repositoryRoot:c}=a,l=`recipes/${n}`,u=`${l}/recipe.yaml`,d=Cr(Br(c,s,u),u);oi(d.requires,a);let f=Br(c,s,`${l}/RECIPE.md`),p=Hr(c,s,`${l}/files`),m=Hr(c,s,`${l}/patches`),h=Hr(c,s,`${l}/.agents`),g=new Map,_=new Map,v=[],y=[],b=[],x=[],S=[],C=[];for(let e of p){let t=e.slice(`${l}/files/`.length);if(hi(t,`Recipe file ${e}`),t.startsWith(`.agents/`))throw Error(`Recipe file ${e} must be stored in the recipe's .agents directory.`);g.set(t,Vr(c,s,e)),_.set(t,e)}for(let e of h){let t=e.slice(`${l}/`.length);if(fi(t,`Recipe asset ${e}`),g.has(t))throw Error(`Recipe declares ${t} as both a file and an agent asset.`);g.set(t,Vr(c,s,e)),_.set(t,e)}for(let e of m){let t=gi(e,l);if(g.has(t))throw Error(`Recipe declares ${t} as both a file and a patch.`);let n=Vr(c,s,e);_i(n.toString(`utf8`),t,e),mi(o,t),vi(o,n,!1)?(v.push({contents:n,destinationPath:t}),x.push(t)):vi(o,n,!0)?S.push(t):b.push({destination:t,source:e})}let w=new Map;for(let[e,t]of g){let r=xi(mi(o,e));if(r===void 0)w.set(e,t),y.push(e);else if(r.equals(t))S.push(e);else if(e.startsWith(`.agents/`))throw Error(`Recipe ${n} cannot replace modified ${e}. Reconcile that agent asset manually.`);else b.push({destination:e,source:_.get(e)})}let T=new Map;for(let e of d.routes){if(fi(e.router,`Recipe route router`),pi(e.path,`Recipe route path`),g.has(e.router))throw Error(`Recipe cannot replace its destination router ${e.router}.`);if(!g.has(e.path)&&!J(mi(o,e.path)))throw Error(`Recipe route target ${e.path} does not exist.`);let t=T.get(e.router)??ui(Si(mi(o,e.router),e.router),e.router);T.set(e.router,t);let r=t.routes.find(t=>t.path===e.path);if(r){if(r.when!==e.when)throw Error(`Recipe ${n} route ${e.path} conflicts with the existing trigger in ${e.router}.`);continue}t.routes.push({path:e.path,when:e.when})}for(let[e,t]of T){t.routes.sort((e,t)=>e.path<t.path?-1:+(e.path>t.path));let n=Si(mi(o,e),e),r=Ye(t,{lineWidth:0});r===n?S.push(e):(w.set(e,r),C.push(e))}for(let{destinationPath:e}of v)if(w.has(e))throw Error(`Recipe cannot both write and patch ${e}.`);for(let[e,t]of w){let n=mi(o,e);He(I(n),{recursive:!0}),qe(n,t)}return v.length>0&&yi(o,v.map(({contents:e})=>e)),{created:y.sort(),instructions:f,mergeRequired:b.sort((e,t)=>e.destination.localeCompare(t.destination)),name:n,patched:x.sort(),ref:s,unchanged:[...new Set(S)].sort(),updated:C.sort()}}function li(e){console.log(`Prepared Coreframe recipe ${e.name} from ${e.ref}.`);for(let t of e.created)console.log(`created: ${t}`);for(let t of e.updated)console.log(`updated: ${t}`);for(let t of e.patched)console.log(`patched: ${t}`);for(let t of e.mergeRequired)console.log(`merge-required: ${t.destination} (source: ${e.ref}:${t.source})`);for(let t of e.unchanged)console.log(`unchanged: ${t}`);console.log(`\nContinue by following ${e.ref}:recipes/${e.name}/RECIPE.md:\n`),console.log(e.instructions.trimEnd())}function ui(e,t){let n=di(e,t);if(!Ci(n)||!wi(n,[`routes`,`rules`])||!Array.isArray(n.rules)||!n.rules.every(Ti)||!Array.isArray(n.routes))throw Error(`${t} must contain only string rules and a routes array.`);let r=n.routes.map((e,n)=>{if(!Ci(e)||!wi(e,[`path`,`when`])||!Ti(e.path)||!Ti(e.when))throw Error(`${t} route ${n+1} must contain path and when strings.`);return{path:e.path,when:e.when}}),i=r.map(e=>e.path);if(new Set(i).size!==i.length)throw Error(`${t} contains duplicate route paths.`);return{rules:n.rules,routes:r}}function di(e,t){try{return Je(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function fi(e,t){if(!e.startsWith(`.agents/`))throw Error(`${t} must be a normalized project-relative path beneath .agents/.`);hi(e,t)}function pi(e,t){if(hi(e,t),!/(?:^|\/)\.agents\/rules\/.+\.md$/u.test(e))throw Error(`${t} must point to a Markdown rule beneath an .agents/rules directory.`)}function mi(e,t){hi(t,`Recipe destination`);let n=L(e,t),r=e;for(let e of t.split(`/`))if(r=L(r,e),J(r)&&Ve(r).isSymbolicLink())throw Error(`Recipe destination ${t} crosses symbolic link ${r}.`);return n}function hi(e,t){if(e.length===0||le(e)||e===`..`||e.startsWith(`../`)||e.includes(`\\`)||R.normalize(e)!==e)throw Error(`${t} must be a normalized project-relative path.`)}function gi(e,t){let n=e.slice(`${t}/patches/`.length);if(!n.endsWith(`.patch`))throw Error(`Recipe patch ${e} must use a .patch suffix.`);let r=n.slice(0,-6);return hi(r,`Recipe patch ${e}`),r}function _i(e,t,n){let r=e.match(/^diff --git .+$/gmu)??[],i=e.match(/^--- .+$/gmu)??[],a=e.match(/^\+\+\+ .+$/gmu)??[];if(r.length!==1||r[0]!==`diff --git a/${t} b/${t}`||i.length!==1||a.length!==1||i[0]!==`--- a/${t}`||a[0]!==`+++ b/${t}`||/^(?:deleted file mode |GIT binary patch$|new file mode |rename from |rename to )/mu.test(e))throw Error(`Recipe patch ${n} must modify only ${t}.`)}function vi(e,t,n){let r=[`apply`,`--check`,`--whitespace=nowarn`];return n&&r.push(`--reverse`),r.push(`-`),q(`git`,r,{cwd:e,input:t}).status===0}function yi(e,t){let n=q(`git`,[`apply`,`--whitespace=nowarn`,`-`],{cwd:e,input:Buffer.concat(t.flatMap(e=>[e,Buffer.from(e.at(-1)===10?``:`
8
- `)])),encoding:`utf8`});if(n.status!==0){let e=n.stderr.trim()||n.stdout.trim();throw Error(`Could not apply recipe patches.${e?`\n${e}`:``}`)}}function bi(e){return xi(e)?.toString(`utf8`)}function xi(e){try{return Y(e)}catch(e){if(Ei(e)&&e.code===`ENOENT`)return;throw e}}function Si(e,t){let n=bi(e);if(n===void 0)throw Error(`Required file ${t} does not exist.`);return n}function Ci(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function wi(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function Ti(e){return typeof e==`string`&&e.length>0}function Ei(e){return e instanceof Error&&`code`in e}function Di(e={}){let{ref:t,repositoryRoot:n}=zr(e),r=Hr(n,t,`recipes`).filter(e=>/^recipes\/[^/]+\/recipe\.yaml$/u.test(e)).map(e=>{let r=e.split(`/`)[1];return wr(r),{description:Cr(Br(n,t,e),e).description,name:r}});return r.sort((e,t)=>e.name.localeCompare(t.name)),{recipes:r,ref:t}}function Oi(e){console.log(`Coreframe recipes at ${e.ref}:`);for(let t of e.recipes)console.log(`${t.name} — ${t.description}`)}const ki=`.agents/skills/coreframe-upgrade/SKILL.md`;function Ai(e,t={}){return q(`git`,e,t)}function ji(e){return e.stderr.toString(`utf8`).trim()||e.stdout.toString(`utf8`).trim()}function Mi(e,t){let n=Rr(e,t),r=Ai([`show`,n],{encoding:`utf8`});if(r.status!==0){let e=ji(r);throw Error(`Could not read ${n}.${e?` ${e}`:``}`)}return r.stdout.toString()}function Ni(){let e=Ai([`rev-parse`,`--show-toplevel`],{encoding:`utf8`});if(e.status!==0){let t=ji(e);throw Error(`Could not find git repository root.${t?` ${t}`:``}`)}return e.stdout.toString().trim()}function Pi(e,t){let n=Ue(L(Me(),`coreframe-upgrade-skill-`)),r=L(n,`SKILL.md`);try{qe(r,t);let n=ji(Ai([`--no-pager`,`diff`,`--no-index`,`--color=never`,`--`,e,r]));n&&console.log(n)}finally{Ge(n,{force:!0,recursive:!0})}}function Fi({apply:e,target:t}){let n=L(Ni(),ki),r=Ir(t);if(!J(n))throw Error(`Local ${ki} does not exist.`);let i=Y(n,`utf8`),a=Mi(t,ki);return i===a?(console.log(`Coreframe upgrade skill matches ${r}:template/${ki}.`),0):e?(qe(n,a),console.error(`Updated ${ki} from ${r}:template. Reread it before continuing the upgrade.`),20):(console.error(`Coreframe upgrade skill differs from ${r}:template/${ki}.`),console.error(`Run again with --apply to update it, then reread ${ki} before continuing.`),Pi(n,a),20)}const Ii=[{matches:e=>e===`drizzle`||e.startsWith(`drizzle/`),reason:`project-owned migration history`},{matches:e=>e===`drizzle-hold`||e.startsWith(`drizzle-hold/`),reason:`project-owned migration history`},{matches:e=>e===`src/web/routes.ts`||e.startsWith(`src/web/app/routes/`),reason:`downstream-owned demonstration routes`},{matches:e=>e===`pnpm-lock.yaml`||e===`src-tauri/Cargo.lock`,reason:`downstream-owned dependency lockfile`}],Li=new Set([`100644`,`100755`,`120000`]);function Ri(e,t={}){return q(`git`,e,t)}function zi(e){let t=Ri(e,{encoding:`utf8`});if(t.status!==0){let n=t.stderr.toString().trim()||t.stdout.toString().trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout.toString()}function Bi(e){let t=Ri(e);if(t.status!==0){let n=t.stderr.toString(`utf8`).trim()||t.stdout.toString(`utf8`).trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout}function Vi(){return zi([`rev-parse`,`--show-toplevel`]).trim()}function Hi(e){let t=L(e,`package.json`);if(!J(t))throw Error(`Missing --base <git-ref>, and package.json does not exist.`);let n=JSON.parse(Y(t,`utf8`)).engines?.coreframe;if(typeof n!=`string`||n.length===0)throw Error(`Missing --base <git-ref>, and package.json engines.coreframe is not set.`);return n}function Ui(e){let t=[],n=0;for(let r=0;r<e.length;r+=1)e[r]===0&&(t.push(e.subarray(n,r).toString(`utf8`)),n=r+1);return t.filter(e=>e.length>0)}function Wi(e,t){let n=Ui(Bi([`diff`,`--name-status`,`-z`,`--no-renames`,Lr(e),Lr(t),`--`])),r=[];for(let e=0;e<n.length;e+=2){let t=n[e],i=n[e+1];if(!t||!i)throw Error(`Could not parse git diff --name-status output.`);r.push({path:i,status:t})}return r}function Gi(e,t){let n=Bi([`ls-tree`,`-z`,Lr(e),`--`,t]);if(n.length===0)return null;let r=Ui(n)[0],i=r.indexOf(` `);if(i===-1)throw Error(`Could not parse git ls-tree output for ${e}:${t}.`);let[a,o,s]=r.slice(0,i).split(` `);if(!a||!o||!s)throw Error(`Could not parse git ls-tree metadata for ${e}:${t}.`);return{mode:a,object:s,path:t,type:o}}function Ki(e){return Bi([`cat-file`,`blob`,e.object])}function qi(e,t){let n=z(e,t),r=e.endsWith(ue)?e:`${e}${ue}`;if(n!==e&&!n.startsWith(r))throw Error(`Refusing to access path outside repository: ${t}`);return n}function Ji(e){try{return Ve(e),!0}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!1;throw e}}function Yi(e){return(e.mode&73)!=0}function Xi(e){return e===null||e.type===`blob`&&Li.has(e.mode)}function Zi(e){return Ii.find(t=>t.matches(e))?.reason}function Qi(e,t,n){let r=qi(e,t);if(n===null)return{matches:!Ji(r)};if(!Xi(n))return{matches:!1,reason:`unsupported template entry mode ${n.mode} ${n.type}`};let i;try{i=Ve(r)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return{matches:!1,reason:`path is missing from worktree`};throw e}let a=Ki(n);return n.mode===`120000`?i.isSymbolicLink()?{matches:Buffer.from(We(r),`utf8`).equals(a)}:{matches:!1,reason:`worktree path is not a symlink`}:i.isFile()?(n.mode===`100755`?Yi(i):!Yi(i))?{matches:Y(r).equals(a)}:{matches:!1,reason:`worktree executable bit differs from template`}:{matches:!1,reason:`worktree path is not a regular file`}}function $i(e){Ji(e)&&Ge(e,{force:!0,recursive:!1})}function ea(e,t,n){let r=qi(e,t);if(n===null){$i(r);return}if(He(I(r),{recursive:!0}),n.mode===`120000`){$i(r),Ke(Ki(n).toString(`utf8`),r);return}let i=Ji(r)?Ve(r):null;i&&!i.isFile()&&$i(r),qe(r,Ki(n)),Be(r,n.mode===`100755`?493:420)}function ta(e,t){return e===null&&t!==null?`add`:e!==null&&t===null?`delete`:`update`}function na(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t){let t=e.reason?` (${e.reason})`:``;console.log(` ${e.action}: ${e.path}${t}`)}console.log(``)}}function ra(e){let t=Vi(),n=Ir(e.base??Hi(t)),r=Ir(e.target),i=Wi(n,r),a=[],o=[],s=[],c=[];for(let e of i){let i=Zi(e.path);if(i){o.push({action:`ignored`,path:e.path,reason:i});continue}let l=Gi(n,e.path),u=Gi(r,e.path),d=ta(l,u);if(!Xi(l)||!Xi(u)){s.push({action:d,path:e.path,reason:`unsupported template entry type`});continue}if(Qi(t,e.path,u).matches){c.push({action:`unchanged`,path:e.path});continue}let f=Qi(t,e.path,l);if(!f.matches){s.push({action:d,path:e.path,reason:f.reason??`downstream differs from base template`});continue}a.push({action:d,path:e.path,targetEntry:u})}if(e.apply)for(let e of a)ea(t,e.path,e.targetEntry??null);console.log(`Coreframe template fast-forward: ${n} -> ${r}`),console.log(``),na(e.apply?`Applied clean template updates`:`Would apply clean template updates`,a),na(`Ignored downstream-owned paths`,o),na(`Skipped for agent review`,s),c.length>0&&console.log(`${c.length} changed template path(s) already matched the target state.`),i.length===0&&console.log(`No template file changes found in the requested range.`),!e.apply&&a.length>0&&(console.log(``),console.log(`Run with --apply to write the ${a.length} clean update(s).`))}const ia=[`dependencies`,`devDependencies`];function aa(e){let t=q(`git`,e,{encoding:`utf8`});if(t.status!==0){let n=t.stderr.trim()||t.stdout.trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout}function oa(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}: ${e instanceof Error?e.message:e}`)}}function sa(e,t){let n=`${Ir(e)}:${t}`;return oa(aa([`show`,n]),n)}function ca(e){return e.startsWith(`@coreframe/`)}function la(e){return e.startsWith(`file:`)||e.startsWith(`link:`)||e.startsWith(`workspace:`)}function ua(e){return e.startsWith(`file:`)||e.startsWith(`link:`)}function da(e,t){let n=e.indexOf(`:`),r=e.slice(n+1),i=R.normalize(R.join(`template`,r,`package.json`));if(r.length===0||R.isAbsolute(r)||i===`..`||i.startsWith(`../`))throw Error(`Invalid local template dependency for ${t}: ${e}`);return i}function fa(e){let t=sa(e,`template/package.json`),n=[],r=new Set;for(let i of ia)for(let[a,o]of Object.entries(t[i]??{})){if(!ca(a)||!ua(o))continue;if(r.has(a))throw Error(`Target template declares ${a} more than once.`);let t=da(o,a),s=sa(e,t);if(s.name!==a||typeof s.version!=`string`)throw Error(`${Ir(e)}:${t} must declare ${a} with a version.`);n.push({group:i,name:a,spec:`^${s.version}`}),r.add(a)}return n}function pa(e,t){for(let n of ia){let r=e[n]?.[t];if(r)return{group:n,spec:r}}}function ma(e,t,n){let r=t.match(/\n([\t ]+)"/u)?.[1]??` `,i=t.endsWith(`
5
+ `)}async function nn({apiOrigin:e,cwd:t=process.cwd(),environment:n=process.env,platform:r=`web`,profile:i=!1,simulator:a=!1,prepareClient:o=N,runCommand:s=an}={}){rn(r,{profile:i,simulator:a});let c={...n};delete c.COREFRAME_FLUTTER_DEVELOPMENT,delete c.COREFRAME_PLATFORM,delete c.TAURI_ENV_PLATFORM;let l=r===`web`?void 0:P(e??n.COREFRAME_API_ORIGIN);for(let e of Qt(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(en(t,{profile:i})):r===`ios`&&console.log(tn(t,{profile:i,simulator:a}))}function rn(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 an(e,t,{cwd:n,env:r}){await B(e,t,{cwd:n,env:r,stdio:`inherit`})}function on(e,t,n,r){return{kind:`command`,command:e,args:t,cwd:n,...r===void 0?{}:{environment:r}}}const sn=r(f,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in a packaged Flutter client.`,async from(e){return P(e)}}),cn=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(Zt)),displayName:`platform`,description:`Build target: web, iOS, Android, or macOS. Defaults to web.`}),apiOrigin:c({long:`api-origin`,type:l(sn),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})=>nn({apiOrigin:e,platform:t,profile:n,simulator:r})}),ln=/^[a-f0-9]{64}$/,un=/^[a-f0-9]{40}$/,dn=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function fn(e){if(!ln.test(e))throw Error(`Invalid SHA-256 digest "${e}".`);return e}function pn(e){if(!un.test(e))throw Error(`Invalid full Git revision "${e}".`);return e}function mn(e,t){if(!dn.test(e))throw Error(`${t} must contain only letters, numbers, dots, underscores, or hyphens.`);return e}function hn(e){return`projects/${mn(e,`Project ID`)}/i18n/v1`}function gn(e,t){return fn(t),`${hn(e)}/objects/sha256/${t.slice(0,2)}/${t}`}function _n(e,t){return pn(t),`${hn(e)}/commits/${t}.json`}function vn(e,t){return yn(t),`${hn(e)}/releases/${encodeURIComponent(t)}.json`}function yn(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 Z(e,t){if(!t||t.startsWith(`/`)||t.includes(`\0`))throw Error(`Unsafe i18n artifact path "${t}".`);let n=z(e),r=z(n,t);if(r!==n&&!r.startsWith(`${n}${ue}`))throw Error(`Unsafe i18n artifact path "${t}".`);return r}function Q(e,t,n){return`${e.directory}/${t}/${n}.json`}function bn(e,t,n){return`${e.directory}/${t}/${n}.mjs`}async function xn(e){await B(`pnpm`,[`exec`,`lingui`,`extract`],{cwd:e,stdio:`inherit`})}async function Sn({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=Z(t,Q(e,n,a)),s=await Dn(o),c=Object.fromEntries(Object.entries(s).filter(([,e])=>!e.obsolete)),l=L(r,`${n}-${a}.json`);await H(I(l),{recursive:!0}),await xe(o,l),i.push({path:o,backup:l}),await On(o,c)}await B(`pnpm`,[`exec`,`lingui`,`compile`,...n?[`--strict`]:[]],{cwd:t,stdio:`inherit`})}finally{try{for(let{path:e,backup:t}of i)await xe(t,e)}finally{for(let n of e.locales)for(let r of e.catalogs)await W(Z(t,bn(e,n,r)),{force:!0})}}}async function Cn({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 Dn(Z(t,Q(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)=>Nn(e).localeCompare(Nn(t)))}async function wn({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 kn(await An({args:e.generator.args??[],command:e.generator.command,cwd:t,env:r,input:JSON.stringify(i)}))}async function Tn({config:e,cwd:t,missing:n,response:r}){let i=new Map(n.map(e=>[Nn(e),e])),a=new Map;for(let e of r.translations){let t=Nn(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 Ne(`@lingui/message-utils/compileMessage`,t);for(let e of n){let t=a.get(Nn(e));jn({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=Z(t,Q(e,n,r)),o=await Dn(i),s=!1;for(let[e,t]of Object.entries(o)){let i=a.get(Nn({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 On(i,o)}}async function En({config:e,cwd:t}){let n=await Cn({config:e,cwd:t});if(n.length>0)throw Error(`I18n catalogs remain incomplete: ${n.length} translations are missing.`);let r=await Ne(`@lingui/message-utils/compileMessage`,t);for(let n of e.locales)if(n!==e.sourceLocale)for(let i of e.catalogs){let a=await Dn(Z(t,Q(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}.`);jn({compileMessage:r,id:e,locale:n,source:t.message,translation:t.translation})}}}async function Dn(e){let t=JSON.parse(await U(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 On(e,t){await H(I(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;await G(n,`${JSON.stringify(t,null,2)}\n`),await De(n,e)}function kn(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 An({args:e,command:t,cwd:n,env:r,input:i}){return B(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 jn({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=Mn(a),c=Mn(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 Mn(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 Nn(e){return`${e.locale}\0${e.catalog}\0${e.id}`}function Pn(e){return Re(`sha256`).update(e).digest(`hex`)}async function Fn(e){return Pn(await U(e))}function In(e){return Buffer.from(`${JSON.stringify(e,null,2)}\n`)}async function Ln({bucket:e,digest:t,projectId:n,source:r,store:i}){if(fn(t),await Fn(r)!==t)throw Error(`I18n object source does not match declared SHA-256 digest ${t}.`);let a=gn(n,t);await i.has(e,a)||await i.upload(e,a,r,`application/octet-stream`);let o=`${r}.${process.pid}.${ze()}.verify`;try{if(await i.download(e,a,o),await Fn(o)!==t)throw Error(`Existing immutable i18n object ${a} failed integrity verification.`)}finally{await W(o,{force:!0})}}async function Rn({bucket:e,key:t,reference:n,store:r,temporaryDirectory:i}){let a=In(n),o=L(i,`reference-${ze()}.json`);if(await r.has(e,t))try{if(await r.download(e,t,o),!(await U(o)).equals(a))throw Error(`Immutable i18n reference ${t} already resolves to different snapshot data.`);return}finally{await W(o,{force:!0})}await G(o,a,{flag:`wx`});try{await r.upload(e,t,o,`application/json`)}finally{await W(o,{force:!0})}let s=L(i,`reference-${ze()}.verify.json`);try{if(await r.download(e,t,s),!(await U(s)).equals(a))throw Error(`Uploaded immutable i18n reference ${t} failed verification.`)}finally{await W(s,{force:!0})}}async function zn({bucket:e,manifest:t,projectId:n,store:r,temporaryDirectory:i}){let a=In(t),o=Pn(a),s=L(i,`manifest-${o}.json`);await G(s,a,{flag:`wx`});try{await Ln({bucket:e,digest:o,projectId:n,source:s,store:r})}finally{await W(s,{force:!0})}return o}async function Bn({bucket:e,key:t,store:n,temporaryDirectory:r}){if(!await n.has(e,t))return;let i=L(r,`reference-${ze()}.json`);try{await n.download(e,t,i);let r=JSON.parse(await U(i,`utf8`));if(r.version!==1||typeof r.revision!=`string`||typeof r.snapshot!=`string`)throw Error(`Invalid i18n reference at ${t}.`);return pn(r.revision),fn(r.snapshot),r}finally{await W(i,{force:!0})}}async function Vn({bucket:e,projectId:t,revision:n,store:r,temporaryDirectory:i}){let a=await Bn({bucket:e,key:_n(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 Hn({bucket:e,projectId:t,reference:n,store:r,tag:i,temporaryDirectory:a}){await Rn({bucket:e,key:_n(t,n.revision),reference:n,store:r,temporaryDirectory:a}),i&&await Rn({bucket:e,key:vn(t,i),reference:n,store:r,temporaryDirectory:a})}async function Un({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:a}){fn(n);let o=L(z(t),`v1`,`sha256`,n.slice(0,2),n);if(await Gn(o,n)===!1){await H(I(o),{recursive:!0});let t=`${o}.${process.pid}.${ze()}.tmp`;try{if(await i.download(e,gn(r,n),t),await Fn(t)!==n)throw Error(`Downloaded i18n object failed SHA-256 verification: ${n}.`);await W(o,{force:!0}),await De(t,o)}finally{await W(t,{force:!0})}}await H(I(a),{recursive:!0});let s=`${a}.${process.pid}.${ze()}.tmp`;try{if(await xe(o,s),await Fn(s)!==n)throw Error(`Cached i18n object failed SHA-256 verification: ${n}.`);await W(a,{force:!0}),await De(s,a)}finally{await W(s,{force:!0})}}async function Wn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,temporaryDirectory:a}){let o=L(a,`manifest-${n}.json`);await Un({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:o});let s=JSON.parse(await U(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}.`);pn(s.revision),s.baseline!==void 0&&fn(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}.`);fn(e.digest)}return s}async function Gn(e,t){try{return(await Oe(e)).isFile()&&await Fn(e)===t}catch{return!1}}async function Kn({cwd:e=process.cwd(),env:t=process.env}={}){if((await Ie({cwd:e})).i18n){if(t.COREFRAME_I18N_RELEASE_REVISION){await Yn({cwd:e,env:t,revision:t.COREFRAME_I18N_RELEASE_REVISION});return}await xn(e)}}async function qn({cwd:e=process.cwd(),projectConfig:t}={}){let n=t??await Ie({cwd:e});if(!n.i18n)return;let r=Xn(n.i18n),i=Z(e,r.directory);try{if(!(await Oe(i)).isDirectory())throw Error(`I18n catalog path is not a directory: ${i}.`)}catch(t){if(t.code!==`ENOENT`)throw t;await xn(e);return}for(let t of r.locales)for(let n of r.catalogs)try{if(!(await Oe(Z(e,Q(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 xn(e);return}}async function Jn({cwd:e=process.cwd(),env:t=process.env,store:n,tag:r}){yn(r);let i=await Zn({cwd:e,env:t,store:n});await ar(e);let a=await ir(e);await or(e,r,a);let o=await we(L(Me(),`coreframe-i18n-prepare-`));try{let n=await Vn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,revision:a,store:i.store,temporaryDirectory:o});if(n){let e=await Wn({bucket:i.assets.sourceBucket,cacheRoot:i.cacheRoot,digest:n.snapshot,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return rr(i,e,a),await $n(i,e),await Hn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,reference:n,store:i.store,tag:r,temporaryDirectory:o}),{reused:!0,snapshot:n.snapshot}}return await nr(i,o,async()=>{let n=await Qn(i,a,o);n||await tr(i),await xn(e);let s=await Cn({config:i.config,cwd:e}),c=await wn({config:i.config,cwd:e,env:t,messages:s});await Tn({config:i.config,cwd:e,missing:s,response:c}),await En({config:i.config,cwd:e}),await Sn({config:i.config,cwd:e,strict:!0,temporaryDirectory:o});let l=await er(i),u={...n?{baseline:n}:{},catalogs:i.config.catalogs,files:l,generator:s.length>0?i.config.generator?.id??`unconfigured`:`none`,linguiVersion:await sr(e),locales:i.config.locales,projectId:i.assets.projectId,revision:a,sourceLocale:i.config.sourceLocale,version:1},d=await zn({bucket:i.assets.sourceBucket,manifest:u,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return await Hn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,reference:{revision:a,snapshot:d,version:1},store:i.store,tag:r,temporaryDirectory:o}),{reused:!1,snapshot:d}})}finally{await W(o,{force:!0,recursive:!0})}}async function Yn({cwd:e=process.cwd(),env:t=process.env,revision:n,store:r}={}){let i=await Ie({cwd:e});if(!i.i18n)return;let a=await Zn({cwd:e,env:t,store:r,projectConfig:i}),o=pn(n??await ir(e)),s=await we(L(Me(),`coreframe-i18n-materialize-`));try{let e=await Vn({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 Wn({bucket:a.assets.sourceBucket,cacheRoot:a.cacheRoot,digest:e.snapshot,projectId:a.assets.projectId,store:a.store,temporaryDirectory:s});return rr(a,t,o),await $n(a,t),{revision:o,snapshot:e.snapshot}}finally{await W(s,{force:!0,recursive:!0})}}function Xn(e){let t=mn(e.sourceLocale,`Source locale`),n=[...new Set(e.locales.map(e=>mn(e,`Locale`)))],r=[...new Set(e.catalogs.map(e=>mn(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 Zn({cwd:e=process.cwd(),env:t=process.env,projectConfig:n,store:r}){let i=n??await Ie({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:z(e,`.coreframe`,`i18n`,`cache`),config:Xn(i.i18n),cwd:z(e),env:t,store:r??ve({config:a,env:t})}}async function Qn(e,t,n){let{stdout:r}=await B(`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 Vn({bucket:e.assets.sourceBucket,projectId:e.assets.projectId,revision:pn(t),store:e.store,temporaryDirectory:n});if(!r)continue;let i=await Wn({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:r.snapshot,projectId:e.assets.projectId,store:e.store,temporaryDirectory:n});return rr(e,i,t),await $n(e,i),r.snapshot}}async function $n(e,t){for(let n of t.files)if(await Un({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:n.digest,projectId:e.assets.projectId,store:e.store,target:Z(e.cwd,n.path)}),(await Oe(Z(e.cwd,n.path))).size!==n.size)throw Error(`Materialized i18n artifact size does not match manifest: ${n.path}.`)}async function er(e){let t=[];for(let n of e.config.locales)for(let r of e.config.catalogs){let i=Q(e.config,n,r),a=Z(e.cwd,i),o=await Fn(a);await Ln({bucket:e.assets.sourceBucket,digest:o,projectId:e.assets.projectId,source:a,store:e.store}),t.push({digest:o,path:i,size:(await Oe(a)).size})}return t.sort((e,t)=>e.path.localeCompare(t.path))}async function tr(e){let{stdout:t}=await B(`git`,[`rev-parse`,`--show-prefix`],{cwd:e.cwd,stdin:`ignore`}),n=t.trim(),{stdout:r}=await B(`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 Ne(`@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 B(`git`,[`show`,`${i}:${s}`],{cwd:e.cwd,stdin:`ignore`});await On(Z(e.cwd,Q(e.config,t,r)),a.parse(n)),o=!0}catch{}}return o}async function nr(e,t,n){let r=[];for(let n of e.config.locales)for(let i of e.config.catalogs){let a=Q(e.config,n,i),o=Z(e.cwd,a);try{await ye(o)}catch{continue}let s=L(t,`previous-catalogs`,a);await H(I(s),{recursive:!0}),await De(o,s),r.push({backup:s,path:o})}try{let e=await n();return await W(L(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 W(Z(e.cwd,Q(e.config,t,n)),{force:!0});for(let{backup:e,path:t}of r)await H(I(t),{recursive:!0}),await De(e,t);throw t}}function rr(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=>Q(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 ir(e){let{stdout:t}=await B(`git`,[`rev-parse`,`HEAD`],{cwd:e,stdin:`ignore`});return pn(t.trim())}async function ar(e){let{stdout:t}=await B(`git`,[`status`,`--porcelain`],{cwd:e,stdin:`ignore`});if(t.trim())throw Error(`Tagged i18n preparation requires a clean Git tree.`)}async function or(e,t,n){let{stdout:r}=await B(`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 sr(e){let{stdout:t}=await B(`pnpm`,[`exec`,`lingui`,`--version`],{cwd:e,stdin:`ignore`});return t.trim()}const cr=[`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(` `),lr=r(f,{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}}),ur=r(f,{displayName:`profile`,async from(e){return ge(e)}}),dr=r(f,{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}}),fr=r(f,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in the packaged Flutter client.`,async from(e){return P(e)}}),pr=p({name:`assets`,cmds:{configure:n({name:`configure`,description:`Store a Backblaze B2 private build-object key in the operating system credential store. ${cr}`,args:{profile:u({type:ur,displayName:`profile`,description:`Credential profile named by coreframe.config.ts.`})},handler:async({profile:e})=>{V.note(cr,`Required B2 key access`);let t=await V.text({message:`Backblaze B2 application key ID`,validate:e=>e?.trim()?void 0:`The application key ID is required.`});if(V.isCancel(t))throw Error(`Asset credential configuration was cancelled.`);let n=await V.password({message:`Backblaze B2 application key`,validate:e=>e?void 0:`The application key is required.`});if(V.isCancel(n))throw Error(`Asset credential configuration was cancelled.`);await _e({applicationKey:n,applicationKeyId:t.trim(),profile:e}),console.log(`Stored Coreframe asset credential profile "${e}".`)}}),add:n({name:`add`,args:{file:u({type:f,displayName:`file`,description:`Source raster image, SVG, MP3, MP4, or Lottie JSON to add to the asset library.`}),id:c({long:`id`,type:f,description:`Logical asset ID, such as blog/my-post/hero.`}),alt:c({long:`alt`,type:l(f),description:`Required alt text for raster image and SVG assets.`}),pack:c({long:`pack`,type:l(dr),description:`Place the asset in a named, lazily loaded pack.`}),variantWidths:c({long:`widths`,type:l(lr),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})=>me(await de({alt:e,file:t,id:n,pack:i,variantWidths:a}),r)}),build:n({name:`build`,args:{id:c({long:`id`,type:l(f),description:`Build only one logical asset ID.`}),pack:c({long:`pack`,type:l(dr),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})=>me(await fe({id:e,pack:n}),t)}),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(dr),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 pe({fix:e,pack:n});me(r,t),r.ok||(process.exitCode=1)}}),publish:n({name:`publish`,args:{pack:c({long:`pack`,type:l(dr),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 he({pack:t});me(n,e),n.ok||(process.exitCode=1)}}),status:n({name:`status`,args:{pack:c({long:`pack`,type:l(dr),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 pe({pack:t});me(n,e),n.ok||(process.exitCode=1)}})}}),mr=p({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:fr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e})=>ce({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})=>oe({check:e})}),prepare:n({name:`prepare`,description:`Build and package the React client for one Flutter platform.`,args:{platform:u({type:s(M),displayName:`platform`,description:`Flutter platform whose packaged client should be prepared.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:fr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>N({apiOrigin:e,platform:t})}),check:n({name:`check`,description:`Reject missing, stale, modified, or incorrectly targeted Flutter assets.`,args:{platform:u({type:s(M),displayName:`platform`,description:`Flutter platform whose packaged client should be checked.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:fr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>j({apiOrigin:e,platform:t})})}}),hr=p({name:`i18n`,cmds:{build:n({name:`build`,description:`Extract source messages or materialize an exact release catalog snapshot.`,args:{},handler:async()=>{await Kn()}}),materialize:n({name:`materialize`,description:`Materialize the immutable i18n snapshot for an exact commit.`,args:{revision:c({long:`revision`,type:l(f),description:`Full commit SHA. Defaults to the checked-out commit.`})},handler:async({revision:e})=>{let t=await Yn({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.`,args:{tag:c({long:`tag`,type:f,description:`Pushed v* release tag that points to the checked-out commit.`})},handler:async({tag:e})=>{let t=await Jn({tag:e});console.log(`${t.reused?`Reused`:`Published`} i18n snapshot ${t.snapshot}.`)}})}}),gr=K.platform===`win32`?`react-router.cmd`:`react-router`,_r=K.platform===`win32`?`panda.cmd`:`panda`;async function vr(e=K.cwd()){await xr(e),await br(e,[`typegen`])}async function yr(e=K.cwd(),t=K.env,n){if((t.COREFRAME_PLATFORM??t.TAURI_ENV_PLATFORM??`web`)!==`web`)return;let r=F.resolve(e,`.coreframe/dashboard-build`),i=F.join(r,`client`),a=F.resolve(e,`dist/client/__dashboard`);await W(r,{force:!0,recursive:!0}),await Sr(e,_r,[`build`],t),await br(e,[`build`,...n?[`--mode`,n]:[]],t),await W(a,{force:!0,recursive:!0}),await H(F.dirname(a),{recursive:!0}),await Se(i,a,{recursive:!0})}async function br(e,t,n=K.env){await Sr(e,gr,t,n)}async function xr(e){await W(F.resolve(e,`dashboard/.react-router`),{force:!0,recursive:!0})}async function Sr(e,t,n,r=K.env){await B(t,n,{cwd:F.resolve(e,`dashboard`),env:{...r,PATH:F.resolve(e,`node_modules/.bin`)+F.delimiter+(r.PATH??r.Path??``)},stdio:`inherit`})}const Cr=p({name:`dashboard`,cmds:{build:n({name:`build`,args:{mode:c({long:`mode`,type:l(f),description:`Vite environment mode used for the dashboard build.`})},handler:({mode:e})=>yr(void 0,void 0,e)}),typegen:n({name:`typegen`,args:{},handler:()=>vr()})}}),wr=/^[a-z0-9]+(?:-[a-z0-9]+)*$/u;function Tr(e,t){let n=Dr(e,t);if(!Or(n)||!kr(n,[`description`,`requires`,`routes`,`verifier`])||!jr(n.description)||n.requires!==void 0&&(!Array.isArray(n.requires)||!n.requires.every(jr))||n.verifier!==void 0&&!jr(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=>Er(e));if(new Set(r).size!==r.length)throw Error(`${t} contains duplicate recipe requirements.`);let i=n.routes.map((e,n)=>{if(!Or(e)||!Ar(e,[`path`,`router`,`when`])||!jr(e.path)||!jr(e.router)||!jr(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 Er(e){if(!wr.test(e))throw Error(`Recipe names use lowercase letters, numbers, and single hyphens.`);return e}function Dr(e,t){try{return Ye(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function Or(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function kr(e,t){return Object.keys(e).every(e=>t.includes(e))}function Ar(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function jr(e){return typeof e==`string`&&e.length>0}const Mr=`https://github.com/airlock-labs/coreframe.git`;function Nr(e,t){return q(`git`,e,{cwd:t,encoding:`utf8`})}function Pr(e,t){let n=Nr(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 Fr(e,t){let n=Nr([`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 Ir({cwd:e=process.cwd(),fetch:t=!0,remote:n=`template`}={}){if(n.length===0)throw Error(`Remote name must not be empty.`);Pr([`rev-parse`,`--show-toplevel`],e);let r=Fr(n,e);if(r===null)Pr([`remote`,`add`,n,Mr],e),console.log(`Added ${n} remote: ${Mr}`);else if(r===Mr)console.log(`${n} remote already points at ${Mr}`);else throw Error(`${n} remote points at ${r}, not ${Mr}.\nChoose the intended template source before continuing, then update or rename the remote manually.`);t&&(Pr([`fetch`,n,`--tags`,`--prune`],e),console.log(`Fetched ${n}.`))}const Lr=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u;function Rr(e){return Lr.test(e)?`v${e}`:e}function zr(e){return`${Rr(e)}:template`}function Br(e,t){return`${zr(e)}/${t}`}function Vr({cwd:e=process.cwd(),fetch:t=!0,remote:n=`template`,target:r}={}){let i=Gr(e),a=Yr(i,[`rev-parse`,`--show-toplevel`]),o=Rr(r??Kr(i));return Ir({cwd:a,fetch:t,remote:n}),{projectRoot:i,ref:o,repositoryRoot:a}}function Hr(e,t,n){return Ur(e,t,n).toString(`utf8`)}function Ur(e,t,n){let r=`${t}:${n}`,i=q(`git`,[`show`,r],{cwd:e,encoding:`buffer`});if(i.status!==0)throw Error(`Could not read ${r}. ${Xr([`show`,r],i)}`);return i.stdout}function Wr(e,t,n){let r=q(`git`,[`ls-tree`,`-r`,`--name-only`,`-z`,t,`--`,n],{cwd:e,encoding:`buffer`});if(r.status!==0)throw Error(Xr([`ls-tree`,t,n],r));return r.stdout.toString(`utf8`).split(`\0`).filter(Boolean)}function Gr(e){let t=z(e);for(;;){let e=L(t,`package.json`),n=Jr(e);if(n!==void 0&&qr(n,e).engines?.coreframe)return t;let r=I(t);if(r===t)throw Error(`Could not find a package.json with engines.coreframe.`);t=r}}function Kr(e){let t=L(e,`package.json`),n=Jr(t);if(n===void 0)throw Error(`Required file package.json does not exist.`);let r=qr(n,t).engines?.coreframe;if(!r)throw Error(`package.json must declare an exact engines.coreframe recipe baseline.`);return r}function qr(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function Jr(e){try{return Y(e,`utf8`)}catch(e){if(Zr(e)&&e.code===`ENOENT`)return;throw e}}function Yr(e,t){let n=q(`git`,t,{cwd:e,encoding:`utf8`});if(n.status!==0)throw Error(Xr(t,n));return n.stdout.trim()}function Xr(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 Zr(e){return e instanceof Error&&`code`in e}const Qr=[{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:ti},{path:`src/api/client/app-origin.ts`,requirement:`allow the Flutter shell to provide its exact API origin`,test:e=>ei(e,[`@coreframe/flutter-js/client`,`resolveAppOrigin`,`browserOrigin: location?.origin`])},{path:`src/api/worker/auth-config.ts`,requirement:`trust the exact Flutter authentication origins`,test:e=>ei(e,[`appendFlutterAuthOrigins`,`appendFlutterAuthOrigins([], development)`])},{path:`src/api/worker/middleware/auth.ts`,requirement:`broker Flutter access tokens and accept Flutter bearer origins`,test:e=>ei(e,[`createFlutterAccessTokenResponse`,`isFlutterAuthOrigin(origin, import.meta.env.DEV)`,`readFlutterBearerToken(request, import.meta.env.DEV, developmentOrigin)`,`native && ctx.request.method !== "GET"`])&&!e.includes(`isNativeOrigin`)},{path:`src/api/worker/middleware/flutter-cors.ts`,requirement:`provide the Flutter packaged-origin CORS boundary`,test:e=>ei(e,[`applyFlutterCors`,`handleFlutterCorsPreflight`,`flutterCorsMiddleware`])},{path:`src/api/worker/middleware/index.ts`,requirement:`apply Flutter CORS to ordinary Worker responses`,test:e=>e.includes(`flutterCorsMiddleware`)},{path:`src/web/app/flutter-shell/application.ts`,requirement:`configure the Flutter shell's app-owned query and session hooks`,test:e=>ei(e,[`configureShellQueryFocus`,`authSessionHint`])},{path:`src/web/entry.client.tsx`,requirement:`load the package-owned Flutter development tools only for non-browser development`,test:e=>ei(e,[`@coreframe/vite/flutter-devtools`,`import.meta.env.PLATFORM !== "web"`])}];function $r(e){let t=[];for(let n of Qr){let r=L(e,n.path);if(!J(r)){t.push(`${n.path} is missing; it must ${n.requirement}.`);continue}let i=Y(r,`utf8`);n.test(i)||t.push(`${n.path} must ${n.requirement}.`)}return t}function ei(e,t){return t.every(t=>e.includes(t))}function ti(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`,`macos`].some(e=>n.has(e))}const ni=[{path:`package.json`,requirement:`declare the Tauri CLI, plugin-log, and Coreframe Tauri runtime packages`,test:e=>$(e,[`"@tauri-apps/cli"`,`"@tauri-apps/plugin-log"`,`"@coreframe/tauri-js"`,`"@coreframe/tauri-plugin-auth-session"`])},{path:`src-tauri/Cargo.toml`,requirement:`declare Tauri, plugin-log, and Coreframe auth-session Rust dependencies`,test:e=>$(e,[`tauri-build`,`tauri-plugin-log`,`coreframe-tauri-plugin-auth-session`])},{path:`src-tauri/src/main.rs`,requirement:`launch the project-owned Tauri Rust library`,test:e=>e.includes(`::run();`)},{path:`src-tauri/src/lib.rs`,requirement:`register plugin-log and the Coreframe auth-session broker`,test:e=>$(e,[`tauri_plugin_log::Builder`,`coreframe_tauri_plugin_auth_session::init`,`VITE_APP_ORIGIN`])},{path:`src-tauri/build.rs`,requirement:`forward VITE_APP_ORIGIN and TAURI_DEV_HOST into the Rust build`,test:e=>$(e,[`VITE_APP_ORIGIN`,`TAURI_DEV_HOST`])},{path:`src-tauri/capabilities/default.json`,requirement:`grant log and auth-session permissions to the main window`,test:e=>$(e,[`"windows": ["main"]`,`"log:default"`,`"coreframe-tauri-plugin-auth-session:default"`])},{path:`vite.config.ts`,requirement:`define the Tauri runtime and platform environment and fixed native dev server`,test:e=>$(e,[`env.host === "tauri"`,`"import.meta.env.TAURI"`,`"import.meta.env.PLATFORM"`,`TAURI_DEV_HOST`,`strictPort: true`])},{path:`src/vite-env.d.ts`,requirement:`type the Tauri runtime, platform, development origin, and packaged app origin`,test:e=>$(e,[`PLATFORM: import("@coreframe/lib/shell").ShellPlatform`,`TAURI: boolean`,`TAURI_DEV_ORIGIN`,`VITE_APP_ORIGIN`])},{path:`react-router.config.ts`,requirement:`skip service-worker generation for non-browser hosts`,test:e=>$(e,[`resolveCoreframeHost`,`resolveCoreframeHost() === "browser"`])},{path:`src/api/client/app-origin.ts`,requirement:`resolve browser and packaged application origins through the Tauri runtime`,test:e=>$(e,[`@coreframe/tauri-js/client`,`browserOrigin: location?.origin`,`development: import.meta.env.DEV`,`packagedAppOrigin: import.meta.env.VITE_APP_ORIGIN`,`tauri: import.meta.env.TAURI`,`tauriDevelopmentOrigin: import.meta.env.TAURI_DEV_ORIGIN`])&&!e.includes(`resolveAppOrigin(import.meta.env`)},{path:`src/api/client/auth-fetch.ts`,requirement:`call the selected framework authentication composition`,test:e=>$(e,[`createAuthenticatedFetch`,`refreshAccess`,`sessionHint: authSessionHint`])},{path:`src/api/client/auth-session-hint.ts`,requirement:`keep native session hints in memory until the credential broker revalidates`,test:e=>$(e,[`import.meta.env.PLATFORM !== "web"`,`persistence: browserPersistence`,`return false`])},{path:`src/api/client/tauri-auth.ts`,requirement:`compose native API and Better Auth transports behind the virtual auth contract`,test:e=>$(e,[`createAuthenticatedFetch`,`createTauriAuthenticatedFetch`,`authSessionHint: options.sessionHint`,`mintAccessToken`,`createAuthClient`,`createAuthFetch`,`onSessionChange: options.onSessionChange`])},{path:`src/web/auth/client.ts`,requirement:`call the selected framework Better Auth composition`,test:e=>$(e,[`createAuthClient as createCoreframeAuthClient`,`createCoreframeAuthClient`,`authFetch`,`customFetchImpl`])},{path:`src/api/worker/middleware/auth.ts`,requirement:`mint and accept bearer access tokens only across the fixed native origin boundary`,test:e=>$(e,[`appendTauriAppOrigins`,`createTauriAccessTokenResponse`,`isTauriAppOrigin`,`readTauriBearerToken`])},{path:`src/api/worker/fetch.ts`,requirement:`apply native CORS at every Worker response boundary`,test:e=>$(e,[`handleTauriCorsPreflight`,`applyTauriCors`])},{path:`coreframe.config.ts`,requirement:`enable web and desktop development platforms`,test:e=>$(e,[`platforms: ["web", "desktop"]`])&&!e.includes(`"ios"`)&&!e.includes(`"android"`)},{path:`src/web/entry.client.tsx`,requirement:`attach native development logs and skip service-worker registration in Tauri`,test:e=>$(e,[`import "./dev/tauri-log.ts"`,`import.meta.env.TAURI`])},{path:`.env.example`,requirement:`document the packaged VITE_APP_ORIGIN build value`,test:e=>e.includes(`VITE_APP_ORIGIN`)},{path:`.gitignore`,requirement:`ignore the Tauri Cargo target directory`,test:e=>e.includes(`src-tauri/target`)},{path:`.oxfmtrc.json`,requirement:`ignore generated Tauri schemas and target output`,test:e=>$(e,[`src-tauri/gen/schemas`,`src-tauri/target`])},{path:`src-tauri/AGENTS.md`,requirement:`route native work to owner-local rules and documentation`,test:e=>$(e,[`.agents/rules/tauri.md`,`.agents/references/authentication.md`,`.agents/references/deployment.md`,`src-tauri/docs/deployment.md`])},{path:`src-tauri/.agents/rules/tauri.md`,requirement:`install the owner-local durable Tauri native-boundary rule`,test:e=>$(e,[`## Native Boundary`,`## Security`,`## Documentation`])},{path:`.agents/rules/integrations.yaml`,requirement:`route cross-boundary Tauri work to the owner-local native rule`,test:e=>e.includes(`src-tauri/.agents/rules/tauri.md`)},{path:`src-tauri/docs/authentication.md`,requirement:`document the native credential broker and bearer-token boundary`,test:e=>$(e,[`@coreframe/tauri-js`,`@coreframe/tauri-plugin-auth-session`,`VITE_APP_ORIGIN`])},{path:`src-tauri/docs/development.md`,requirement:`document native development asset delivery and Leylines scopes`,test:e=>$(e,[`dev.tauri`,`browser.tauri`,`managed asset`])},{path:`src-tauri/docs/deployment.md`,requirement:`document native release topology, signing, token recovery, and provider setup`,test:e=>$(e,[`VITE_APP_ORIGIN`,`native-auth`,`access-token signing-secret`])},{path:`src-tauri/docs/privacy-security.md`,requirement:`record the shipped Tauri remote API and secure-storage boundary`,test:e=>$(e,[`## Remote API Boundary`,`platform secure storage`])},{path:`.github/workflows/tauri-release-artifacts.yml`,requirement:`provide a desktop-only Tauri release-artifact workflow`,test:e=>$(e,[`Build Tauri Release Artifacts`,`pnpm exec tauri`])&&!e.toLowerCase().includes(`ios`)&&!e.toLowerCase().includes(`android`)}],ri=[`CoreframeTemplateProject7A91C`,`coreframe-template-project-7a91c`,`coreframe_template_project_7a91c`,`com.example.coreframetemplateproject7a91c`];function ii(e){let t=[];for(let n of ni){let r=L(e,n.path);if(!J(r)){t.push(`${n.path} is missing; it must ${n.requirement}.`);continue}let i=Y(r,`utf8`);n.test(i)||t.push(`${n.path} must ${n.requirement}.`)}let n=L(e,`src-tauri/tauri.conf.json`);J(n)?ai(n,t):t.push(`src-tauri/tauri.conf.json is missing.`);for(let n of[`src-tauri/Cargo.toml`,`src-tauri/src/main.rs`,`src-tauri/tauri.conf.json`]){let r=L(e,n);J(r)&&ri.some(e=>Y(r,`utf8`).includes(e))&&t.push(`${n} must replace the Coreframe template identity sentinel.`)}return t}function ai(e,t){let n;try{n=JSON.parse(Y(e,`utf8`))}catch{t.push(`src-tauri/tauri.conf.json must contain valid JSON.`);return}(typeof n.identifier!=`string`||!/^[a-z0-9]+(?:\.[a-z0-9]+){2,}$/.test(n.identifier)||n.identifier.startsWith(`com.example.`))&&t.push(`src-tauri/tauri.conf.json must use an organization-owned reverse-domain identifier.`)}function $(e,t){return t.every(t=>e.includes(t))}function oi({name:e,...t}){let n=Vr(t),r=`recipes/${e}/recipe.yaml`,i=li(Tr(Hr(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(`
6
+ `)}`);return{name:e,ref:n.ref}}function si(e){console.log(`Verified Coreframe recipe ${e.name} from ${e.ref}.`)}function ci(e,t){for(let n of e){let e=`recipes/${n}/recipe.yaml`,r=li(Tr(Hr(t.repositoryRoot,t.ref,e),e).verifier,t.projectRoot);if(r.length>0)throw Error(`Recipe ${n} is required but is not fully applied:\n${r.map(e=>`- ${e}`).join(`
7
+ `)}\nApply and verify ${n} before continuing.`)}}function li(e,t){if(!e)throw Error(`Required recipe does not declare a verifier.`);if(e===`tauri`)return ii(t);if(e===`flutter`)return $r(t);throw Error(`Unknown recipe verifier ${JSON.stringify(e)}.`)}function ui({cwd:e=process.cwd(),fetch:t=!0,name:n,remote:r=`template`,target:i}){Er(n);let a=Vr({cwd:e,fetch:t,remote:r,target:i}),{projectRoot:o,ref:s,repositoryRoot:c}=a,l=`recipes/${n}`,u=`${l}/recipe.yaml`,d=Tr(Hr(c,s,u),u);ci(d.requires,a);let f=Hr(c,s,`${l}/RECIPE.md`),p=Wr(c,s,`${l}/files`),m=Wr(c,s,`${l}/patches`),h=Wr(c,s,`${l}/.agents`),g=new Map,_=new Map,v=[],y=[],b=[],x=[],S=[],C=[];for(let e of p){let t=e.slice(`${l}/files/`.length);if(_i(t,`Recipe file ${e}`),t.startsWith(`.agents/`))throw Error(`Recipe file ${e} must be stored in the recipe's .agents directory.`);g.set(t,Ur(c,s,e)),_.set(t,e)}for(let e of h){let t=e.slice(`${l}/`.length);if(mi(t,`Recipe asset ${e}`),g.has(t))throw Error(`Recipe declares ${t} as both a file and an agent asset.`);g.set(t,Ur(c,s,e)),_.set(t,e)}for(let e of m){let t=vi(e,l);if(g.has(t))throw Error(`Recipe declares ${t} as both a file and a patch.`);let n=Ur(c,s,e);yi(n.toString(`utf8`),t,e),gi(o,t),bi(o,n,!1)?(v.push({contents:n,destinationPath:t}),x.push(t)):bi(o,n,!0)?S.push(t):b.push({destination:t,source:e})}let w=new Map;for(let[e,t]of g){let r=Ci(gi(o,e));if(r===void 0)w.set(e,t),y.push(e);else if(r.equals(t))S.push(e);else if(e.startsWith(`.agents/`))throw Error(`Recipe ${n} cannot replace modified ${e}. Reconcile that agent asset manually.`);else b.push({destination:e,source:_.get(e)})}let T=new Map;for(let e of d.routes){if(mi(e.router,`Recipe route router`),hi(e.path,`Recipe route path`),g.has(e.router))throw Error(`Recipe cannot replace its destination router ${e.router}.`);if(!g.has(e.path)&&!J(gi(o,e.path)))throw Error(`Recipe route target ${e.path} does not exist.`);let t=T.get(e.router)??fi(wi(gi(o,e.router),e.router),e.router);T.set(e.router,t);let r=t.routes.find(t=>t.path===e.path);if(r){if(r.when!==e.when)throw Error(`Recipe ${n} route ${e.path} conflicts with the existing trigger in ${e.router}.`);continue}t.routes.push({path:e.path,when:e.when})}for(let[e,t]of T){t.routes.sort((e,t)=>e.path<t.path?-1:+(e.path>t.path));let n=wi(gi(o,e),e),r=Xe(t,{lineWidth:0});r===n?S.push(e):(w.set(e,r),C.push(e))}for(let{destinationPath:e}of v)if(w.has(e))throw Error(`Recipe cannot both write and patch ${e}.`);for(let[e,t]of w){let n=gi(o,e);He(I(n),{recursive:!0}),Je(n,t)}return v.length>0&&xi(o,v.map(({contents:e})=>e)),{created:y.sort(),instructions:f,mergeRequired:b.sort((e,t)=>e.destination.localeCompare(t.destination)),name:n,patched:x.sort(),ref:s,unchanged:[...new Set(S)].sort(),updated:C.sort()}}function di(e){console.log(`Prepared Coreframe recipe ${e.name} from ${e.ref}.`);for(let t of e.created)console.log(`created: ${t}`);for(let t of e.updated)console.log(`updated: ${t}`);for(let t of e.patched)console.log(`patched: ${t}`);for(let t of e.mergeRequired)console.log(`merge-required: ${t.destination} (source: ${e.ref}:${t.source})`);for(let t of e.unchanged)console.log(`unchanged: ${t}`);console.log(`\nContinue by following ${e.ref}:recipes/${e.name}/RECIPE.md:\n`),console.log(e.instructions.trimEnd())}function fi(e,t){let n=pi(e,t);if(!Ti(n)||!Ei(n,[`routes`,`rules`])||!Array.isArray(n.rules)||!n.rules.every(Di)||!Array.isArray(n.routes))throw Error(`${t} must contain only string rules and a routes array.`);let r=n.routes.map((e,n)=>{if(!Ti(e)||!Ei(e,[`path`,`when`])||!Di(e.path)||!Di(e.when))throw Error(`${t} route ${n+1} must contain path and when strings.`);return{path:e.path,when:e.when}}),i=r.map(e=>e.path);if(new Set(i).size!==i.length)throw Error(`${t} contains duplicate route paths.`);return{rules:n.rules,routes:r}}function pi(e,t){try{return Ye(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function mi(e,t){if(!e.startsWith(`.agents/`))throw Error(`${t} must be a normalized project-relative path beneath .agents/.`);_i(e,t)}function hi(e,t){if(_i(e,t),!/(?:^|\/)\.agents\/rules\/.+\.md$/u.test(e))throw Error(`${t} must point to a Markdown rule beneath an .agents/rules directory.`)}function gi(e,t){_i(t,`Recipe destination`);let n=L(e,t),r=e;for(let e of t.split(`/`))if(r=L(r,e),J(r)&&Ve(r).isSymbolicLink())throw Error(`Recipe destination ${t} crosses symbolic link ${r}.`);return n}function _i(e,t){if(e.length===0||le(e)||e===`..`||e.startsWith(`../`)||e.includes(`\\`)||R.normalize(e)!==e)throw Error(`${t} must be a normalized project-relative path.`)}function vi(e,t){let n=e.slice(`${t}/patches/`.length);if(!n.endsWith(`.patch`))throw Error(`Recipe patch ${e} must use a .patch suffix.`);let r=n.slice(0,-6);return _i(r,`Recipe patch ${e}`),r}function yi(e,t,n){let r=e.match(/^diff --git .+$/gmu)??[],i=e.match(/^--- .+$/gmu)??[],a=e.match(/^\+\+\+ .+$/gmu)??[];if(r.length!==1||r[0]!==`diff --git a/${t} b/${t}`||i.length!==1||a.length!==1||i[0]!==`--- a/${t}`||a[0]!==`+++ b/${t}`||/^(?:deleted file mode |GIT binary patch$|new file mode |rename from |rename to )/mu.test(e))throw Error(`Recipe patch ${n} must modify only ${t}.`)}function bi(e,t,n){let r=[`apply`,`--check`,`--whitespace=nowarn`];return n&&r.push(`--reverse`),r.push(`-`),q(`git`,r,{cwd:e,input:t}).status===0}function xi(e,t){let n=q(`git`,[`apply`,`--whitespace=nowarn`,`-`],{cwd:e,input:Buffer.concat(t.flatMap(e=>[e,Buffer.from(e.at(-1)===10?``:`
8
+ `)])),encoding:`utf8`});if(n.status!==0){let e=n.stderr.trim()||n.stdout.trim();throw Error(`Could not apply recipe patches.${e?`\n${e}`:``}`)}}function Si(e){return Ci(e)?.toString(`utf8`)}function Ci(e){try{return Y(e)}catch(e){if(Oi(e)&&e.code===`ENOENT`)return;throw e}}function wi(e,t){let n=Si(e);if(n===void 0)throw Error(`Required file ${t} does not exist.`);return n}function Ti(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ei(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function Di(e){return typeof e==`string`&&e.length>0}function Oi(e){return e instanceof Error&&`code`in e}function ki(e={}){let{ref:t,repositoryRoot:n}=Vr(e),r=Wr(n,t,`recipes`).filter(e=>/^recipes\/[^/]+\/recipe\.yaml$/u.test(e)).map(e=>{let r=e.split(`/`)[1];return Er(r),{description:Tr(Hr(n,t,e),e).description,name:r}});return r.sort((e,t)=>e.name.localeCompare(t.name)),{recipes:r,ref:t}}function Ai(e){console.log(`Coreframe recipes at ${e.ref}:`);for(let t of e.recipes)console.log(`${t.name} — ${t.description}`)}const ji=`.agents/skills/coreframe-upgrade/SKILL.md`;function Mi(e,t={}){return q(`git`,e,t)}function Ni(e){return e.stderr.toString(`utf8`).trim()||e.stdout.toString(`utf8`).trim()}function Pi(e,t){let n=Br(e,t),r=Mi([`show`,n],{encoding:`utf8`});if(r.status!==0){let e=Ni(r);throw Error(`Could not read ${n}.${e?` ${e}`:``}`)}return r.stdout.toString()}function Fi(){let e=Mi([`rev-parse`,`--show-toplevel`],{encoding:`utf8`});if(e.status!==0){let t=Ni(e);throw Error(`Could not find git repository root.${t?` ${t}`:``}`)}return e.stdout.toString().trim()}function Ii(e,t){let n=Ue(L(Me(),`coreframe-upgrade-skill-`)),r=L(n,`SKILL.md`);try{Je(r,t);let n=Ni(Mi([`--no-pager`,`diff`,`--no-index`,`--color=never`,`--`,e,r]));n&&console.log(n)}finally{Ge(n,{force:!0,recursive:!0})}}function Li({apply:e,target:t}){let n=L(Fi(),ji),r=Rr(t);if(!J(n))throw Error(`Local ${ji} does not exist.`);let i=Y(n,`utf8`),a=Pi(t,ji);return i===a?(console.log(`Coreframe upgrade skill matches ${r}:template/${ji}.`),0):e?(Je(n,a),console.error(`Updated ${ji} from ${r}:template. Reread it before continuing the upgrade.`),20):(console.error(`Coreframe upgrade skill differs from ${r}:template/${ji}.`),console.error(`Run again with --apply to update it, then reread ${ji} before continuing.`),Ii(n,a),20)}const Ri=[{matches:e=>e===`drizzle`||e.startsWith(`drizzle/`),reason:`project-owned migration history`},{matches:e=>e===`drizzle-hold`||e.startsWith(`drizzle-hold/`),reason:`project-owned migration history`},{matches:e=>e===`src/web/routes.ts`||e.startsWith(`src/web/app/routes/`),reason:`downstream-owned demonstration routes`},{matches:e=>e===`pnpm-lock.yaml`||e===`src-tauri/Cargo.lock`,reason:`downstream-owned dependency lockfile`}],zi=new Set([`100644`,`100755`,`120000`]);function Bi(e,t={}){return q(`git`,e,t)}function Vi(e){let t=Bi(e,{encoding:`utf8`});if(t.status!==0){let n=t.stderr.toString().trim()||t.stdout.toString().trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout.toString()}function Hi(e){let t=Bi(e);if(t.status!==0){let n=t.stderr.toString(`utf8`).trim()||t.stdout.toString(`utf8`).trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout}function Ui(){return Vi([`rev-parse`,`--show-toplevel`]).trim()}function Wi(e){let t=L(e,`package.json`);if(!J(t))throw Error(`Missing --base <git-ref>, and package.json does not exist.`);let n=JSON.parse(Y(t,`utf8`)).engines?.coreframe;if(typeof n!=`string`||n.length===0)throw Error(`Missing --base <git-ref>, and package.json engines.coreframe is not set.`);return n}function Gi(e){let t=[],n=0;for(let r=0;r<e.length;r+=1)e[r]===0&&(t.push(e.subarray(n,r).toString(`utf8`)),n=r+1);return t.filter(e=>e.length>0)}function Ki(e,t){let n=Gi(Hi([`diff`,`--name-status`,`-z`,`--no-renames`,zr(e),zr(t),`--`])),r=[];for(let e=0;e<n.length;e+=2){let t=n[e],i=n[e+1];if(!t||!i)throw Error(`Could not parse git diff --name-status output.`);r.push({path:i,status:t})}return r}function qi(e,t){let n=Hi([`ls-tree`,`-z`,zr(e),`--`,t]);if(n.length===0)return null;let r=Gi(n)[0],i=r.indexOf(` `);if(i===-1)throw Error(`Could not parse git ls-tree output for ${e}:${t}.`);let[a,o,s]=r.slice(0,i).split(` `);if(!a||!o||!s)throw Error(`Could not parse git ls-tree metadata for ${e}:${t}.`);return{mode:a,object:s,path:t,type:o}}function Ji(e){return Hi([`cat-file`,`blob`,e.object])}function Yi(e,t){let n=z(e,t),r=e.endsWith(ue)?e:`${e}${ue}`;if(n!==e&&!n.startsWith(r))throw Error(`Refusing to access path outside repository: ${t}`);return n}function Xi(e){try{return Ve(e),!0}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!1;throw e}}function Zi(e){return(e.mode&73)!=0}function Qi(e){return e===null||e.type===`blob`&&zi.has(e.mode)}function $i(e){return Ri.find(t=>t.matches(e))?.reason}function ea(e,t,n){let r=Yi(e,t);if(n===null)return{matches:!Xi(r)};if(!Qi(n))return{matches:!1,reason:`unsupported template entry mode ${n.mode} ${n.type}`};let i;try{i=Ve(r)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return{matches:!1,reason:`path is missing from worktree`};throw e}let a=Ji(n);return n.mode===`120000`?i.isSymbolicLink()?{matches:Buffer.from(We(r),`utf8`).equals(a)}:{matches:!1,reason:`worktree path is not a symlink`}:i.isFile()?(n.mode===`100755`?Zi(i):!Zi(i))?{matches:Y(r).equals(a)}:{matches:!1,reason:`worktree executable bit differs from template`}:{matches:!1,reason:`worktree path is not a regular file`}}function ta(e){Xi(e)&&Ge(e,{force:!0,recursive:!1})}function na(e,t,n){let r=Yi(e,t);if(n===null){ta(r);return}if(He(I(r),{recursive:!0}),n.mode===`120000`){ta(r),Ke(Ji(n).toString(`utf8`),r);return}let i=Xi(r)?Ve(r):null;i&&!i.isFile()&&ta(r),Je(r,Ji(n)),Be(r,n.mode===`100755`?493:420)}function ra(e,t){return e===null&&t!==null?`add`:e!==null&&t===null?`delete`:`update`}function ia(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t){let t=e.reason?` (${e.reason})`:``;console.log(` ${e.action}: ${e.path}${t}`)}console.log(``)}}function aa(e){let t=Ui(),n=Rr(e.base??Wi(t)),r=Rr(e.target),i=Ki(n,r),a=[],o=[],s=[],c=[];for(let e of i){let i=$i(e.path);if(i){o.push({action:`ignored`,path:e.path,reason:i});continue}let l=qi(n,e.path),u=qi(r,e.path),d=ra(l,u);if(!Qi(l)||!Qi(u)){s.push({action:d,path:e.path,reason:`unsupported template entry type`});continue}if(ea(t,e.path,u).matches){c.push({action:`unchanged`,path:e.path});continue}let f=ea(t,e.path,l);if(!f.matches){s.push({action:d,path:e.path,reason:f.reason??`downstream differs from base template`});continue}a.push({action:d,path:e.path,targetEntry:u})}if(e.apply)for(let e of a)na(t,e.path,e.targetEntry??null);console.log(`Coreframe template fast-forward: ${n} -> ${r}`),console.log(``),ia(e.apply?`Applied clean template updates`:`Would apply clean template updates`,a),ia(`Ignored downstream-owned paths`,o),ia(`Skipped for agent review`,s),c.length>0&&console.log(`${c.length} changed template path(s) already matched the target state.`),i.length===0&&console.log(`No template file changes found in the requested range.`),!e.apply&&a.length>0&&(console.log(``),console.log(`Run with --apply to write the ${a.length} clean update(s).`))}const oa=[`dependencies`,`devDependencies`];function sa(e){let t=q(`git`,e,{encoding:`utf8`});if(t.status!==0){let n=t.stderr.trim()||t.stdout.trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout}function ca(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}: ${e instanceof Error?e.message:e}`)}}function la(e,t){let n=`${Rr(e)}:${t}`;return ca(sa([`show`,n]),n)}function ua(e){return e.startsWith(`@coreframe/`)}function da(e){return e.startsWith(`file:`)||e.startsWith(`link:`)||e.startsWith(`workspace:`)}function fa(e){return e.startsWith(`file:`)||e.startsWith(`link:`)}function pa(e,t){let n=e.indexOf(`:`),r=e.slice(n+1),i=R.normalize(R.join(`template`,r,`package.json`));if(r.length===0||R.isAbsolute(r)||i===`..`||i.startsWith(`../`))throw Error(`Invalid local template dependency for ${t}: ${e}`);return i}function ma(e){let t=la(e,`template/package.json`),n=[],r=new Set;for(let i of oa)for(let[a,o]of Object.entries(t[i]??{})){if(!ua(a)||!fa(o))continue;if(r.has(a))throw Error(`Target template declares ${a} more than once.`);let t=pa(o,a),s=la(e,t);if(s.name!==a||typeof s.version!=`string`)throw Error(`${Rr(e)}:${t} must declare ${a} with a version.`);n.push({group:i,name:a,spec:`^${s.version}`}),r.add(a)}return n}function ha(e,t){for(let n of oa){let r=e[n]?.[t];if(r)return{group:n,spec:r}}}function ga(e,t,n){let r=t.match(/\n([\t ]+)"/u)?.[1]??` `,i=t.endsWith(`
9
9
  `)?`
10
- `:``;qe(e,`${JSON.stringify(n,null,r)}${i}`)}function ha(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t)console.log(` ${e}`);console.log(``)}}function ga(e){let t=z(aa([`rev-parse`,`--show-toplevel`]).trim(),`package.json`),n=Y(t,`utf8`),r=oa(n,t),i=Ir(e.target),a=fa(i),o=new Set(a.map(({name:e})=>e)),s=[],c=[],l=[],u=0;for(let e of a){let t=pa(r,e.name);if(!t){c.push(`missing: ${e.name} ${e.spec} (${e.group})`);continue}if(la(t.spec)){l.push(`linked: ${e.name} ${t.spec}`);continue}if(t.spec===e.spec){u+=1;continue}s.push({...e,currentGroup:t.group,currentSpec:t.spec})}let d=ia.flatMap(e=>Object.entries(r[e]??{}).filter(([e])=>ca(e)&&!o.has(e)).map(([t,n])=>`review: ${t} ${n} (${e})`));if(e.apply&&s.length>0){for(let e of s)r[e.currentGroup][e.name]=e.spec;ma(t,n,r)}console.log(`Coreframe package sync: ${i}`),console.log(``),ha(e.apply?`Updated Coreframe packages`:`Would update Coreframe packages`,s.map(({currentSpec:e,name:t,spec:n})=>`update: ${t} ${e} -> ${n}`)),ha(`Missing target Coreframe packages`,c),ha(`Locally linked Coreframe packages`,l),ha(`Downstream-only Coreframe packages`,d),u>0&&console.log(`${u} Coreframe package(s) already match the target versions.`),s.length===0?console.log(`No Coreframe package version updates found.`):e.apply||(console.log(``),console.log(`Run with --apply to write the ${s.length} package update(s).`))}const _a={...f,displayName:`recipe`,description:`Coreframe recipe name, such as yam-db.`,async from(e){return wr(e)}},va=p({name:`upgrade`,cmds:{"ensure-template-remote":n({name:`ensure-template-remote`,args:{remote:c({long:`remote`,type:f,defaultValue:()=>`template`,description:`Remote name to ensure.`}),noFetch:i({long:`no-fetch`,description:`Do not fetch the remote after ensuring it exists.`,defaultValue:()=>!1})},handler:({noFetch:e,remote:t})=>Pr({fetch:!e,remote:t})}),"check-skill-current":n({name:`check-skill-current`,args:{target:c({long:`target`,type:f,description:`Target Coreframe template git ref.`}),apply:i({long:`apply`,description:`Replace the local upgrade skill with the target version when it differs.`,defaultValue:()=>!1})},handler:({apply:e,target:t})=>{process.exitCode=Fi({apply:e,target:t})}}),"fast-forward-template-files":n({name:`fast-forward-template-files`,args:{target:c({long:`target`,type:f,description:`Target Coreframe template git ref.`}),base:c({long:`base`,type:l(f),description:`Previous Coreframe template git ref. Defaults to package.json engines.coreframe.`}),apply:i({long:`apply`,description:`Write clean fast-forwards to the worktree.`,defaultValue:()=>!1})},handler:({apply:e,base:t,target:n})=>ra({apply:e,base:t,target:n})}),"sync-coreframe-packages":n({name:`sync-coreframe-packages`,args:{target:c({long:`target`,type:f,description:`Target Coreframe template git ref.`}),apply:i({long:`apply`,description:`Update existing published Coreframe dependency specifications.`,defaultValue:()=>!1})},handler:({apply:e,target:t})=>ga({apply:e,target:t})})}}),ya=p({name:`recipes`,cmds:{apply:n({name:`apply`,args:{recipe:u({type:_a,displayName:`recipe`,description:`Recipe to prepare and apply.`}),target:c({long:`target`,type:l(f),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:f,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:i({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,recipe:t,remote:n,target:r})=>li(ci({fetch:!e,name:t,remote:n,target:r}))}),list:n({name:`list`,args:{target:c({long:`target`,type:l(f),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:f,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:i({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,remote:t,target:n})=>Oi(Di({fetch:!e,remote:t,target:n}))}),verify:n({name:`verify`,args:{recipe:u({type:_a,displayName:`recipe`,description:`Recipe adoption to verify.`}),target:c({long:`target`,type:l(f),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:f,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:i({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,recipe:t,remote:n,target:r})=>ai(ii({fetch:!e,name:t,remote:n,target:r}))})}}),ba=p({name:`db`,cmds:{ensure:n({name:`ensure`,args:{},handler:b}),generate:n({name:`generate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit generate.`})},handler:({args:e})=>O(`generate`,e)}),migrate:n({name:`migrate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit migrate.`})},handler:({args:e})=>O(`migrate`,e)}),"migrate-held":n({name:`migrate-held`,args:{local:i({long:`local`,description:`Run held migrations against the Coreframe-managed local PostgreSQL database.`,defaultValue:()=>!1})},handler:({local:e})=>T({target:e?`local`:`deployment`})}),"migrate-local":n({name:`migrate-local`,args:{},handler:E}),"migrations-check":n({name:`migrations-check`,args:{},handler:h}),reset:n({name:`reset`,args:{},handler:ee}),seed:n({name:`seed`,args:{},handler:()=>ne()}),"schema-check":n({name:`schema-check`,args:{seed:i({long:`seed`,description:`Run the configured project seed against the throwaway database.`,defaultValue:()=>!1})},handler:({seed:e})=>g({seed:e})}),setup:n({name:`setup`,args:{},handler:()=>k()}),studio:n({name:`studio`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit studio.`})},handler:({args:e})=>O(`studio`,e)})}}),xa=`package.json`;async function Sa(e=process.argv.slice(2),t=process.env){let n=Ca(e);ja(n);let{packageJson:r,source:i}=await dt(xa),a=await Ie(),o=ht(a.deploy??{},n.environment,t);Ia(t,[`POSTHOG_API_KEY`,`POSTHOG_PROJECT_ID`]);let s=await Ma(o,n.environment,()=>et({env:t})),c=_t({args:n,config:n.environment===`production`?o.tauriRelease:{},env:t});Fa(n.environment,c.enabled),await wt(c);let l=await ft({environment:n.environment}),u=l.values.DASHBOARD_PASSWORD??await La(t,n.environment);Tt(await tt({environment:n.environment}),n.environment,{availableNames:[...Object.keys(l.values),...u?[`DASHBOARD_PASSWORD`]:[]]});let d=await ot({environment:n.environment}),f=await Aa();await qn({env:t,revision:f});let p=f.slice(0,12),m=gt(n.environment,r.version,p),h=mt(r.name,m),g={...Ba(t,n.environment,h,r.name,m),COREFRAME_I18N_RELEASE_REVISION:f},_=n.environment===`production`,b=!1,x={files:[]};V.intro(`Deploy ${h} to ${n.environment}`);let S=Object.keys(l.values).sort();S.length>0&&V.note(S.join(`
11
- `),`Pending Worker secret updates`),d.provisioned&&V.log.info(`Provisioning Coreframe-managed access-token signing material.`),await Pa(n);let C=a.database?.dialect??`postgres`,T;switch(C){case`postgres`:T=await v({env:t});break;case`sqlite`:T=await y({env:t});break;default:throw Error(`Unsupported database dialect "${C}".`)}let E=await Da(T),D=await te(E);if(D.length>0)throw Error(`Pending deploy migrations contain unsafe SQL. Move unsafe statements to held migrations.\n${w(D)}`);let ee=await ka(n,E);try{_&&(await Dt(xa,r,m),x=await Ot(c,m)),V.log.step(`Running pre-deploy build`),await B(`pnpm`,[`build`],{env:Va(g),stdio:`inherit`});let e=c.enabled?await st({env:Va(g),plan:c,releaseName:h,version:m}):void 0;V.log.step(`Running release build and uploading PostHog source maps`),b=!0,await B(`pnpm`,[`build`],{env:g,stdio:`inherit`}),ee&&(V.log.step(`Running deploy-safe database migrations`),await B(`pnpm`,[`db`,`migrate`],{env:g,stdio:`inherit`})),V.log.step(`Deploying Worker and static assets to Cloudflare`);let t={...u?{DASHBOARD_PASSWORD:u}:{},...d.value?{[Xe]:d.value}:{},...l.values},i=Object.keys(t).length>0?await Ra(t):void 0,f=await nt({coreframeConfig:a,environment:n.environment,contributions:{generatedValues:{DEPLOY_ENV:n.environment,POSTHOG_RELEASE:h}}});try{await B(`pnpm`,[`exec`,`wrangler`,`deploy`,`--config`,f.path,`--env`,n.environment,`--strict`,`--keep-vars`,`--tag`,h,`--message`,`Deploy ${h}`,...i?[`--secrets-file`,i.path]:[]],{env:g,stdio:`inherit`}),await Ze(l),await Et({environment:n.environment})}finally{await f.dispose(),await i?.dispose()}let p={environment:n.environment,releaseName:h,url:s,version:m};o.afterWorkerDeploy&&(V.log.step(`Running required after-Worker deploy hook`),await bt(o,p)),n.skipPostDeployChecks||(V.log.step(`Running post-deploy checks`),await xt(o,p)),e&&(V.log.step(`Uploading Tauri release artifacts to Backblaze B2`),await Ct(c,e)),V.outro(`Deployed ${h} to ${n.environment}`)}catch(e){throw!b&&_&&(await G(xa,i),await vt(x)),e}}function Ca(e){return{environment:wa(e[0]),runMigrations:e.includes(`--run-migrations`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),tauriLocalPlatforms:Ta(e,`--tauri-local-platform`).map(e=>at(e)),tauriWorkflowName:Ea(e,`--tauri-workflow-name`),tauriWorkflowPlatforms:Ta(e,`--tauri-workflow-platform`).map(e=>at(e)),tauriWorkflowRef:Ea(e,`--tauri-workflow-ref`),yes:e.includes(`--yes`)}}function wa(e){if(e&&Qe.includes(e))return e;throw Error(`Deploy environment must be one of: ${Qe.join(`, `)}.`)}function Ta(e,t){let n=[];for(let r=0;r<e.length;r+=1){let i=e[r];if(i===t){let i=e[r+1];if(!i||i.startsWith(`--`))throw Error(`${t} requires a value.`);n.push(...i.split(`,`).filter(Boolean)),r+=1;continue}i.startsWith(`${t}=`)&&n.push(...i.slice(t.length+1).split(`,`).filter(Boolean))}return n}function Ea(e,t){let n=Ta(e,t);if(n.length>1)throw Error(`${t} can only be provided once.`);return n[0]}async function Da(e){try{return await Oa(e)}finally{await e.close?.()}}async function Oa(e){return x(await _(),await D(e))}async function ka(e,t){if(t.length===0)return V.log.info(`No pending deploy migrations.`),!1;if(V.note(C(t),`Pending deploy migrations`),e.runMigrations)return!0;if(e.skipMigrations)return!1;if(!process.stdout.isTTY)throw Error(`Pending migrations require --run-migrations or --skip-migrations in noninteractive deploys.`);let n=await V.confirm({initialValue:!0,message:`Run these deploy-safe database migrations before Cloudflare deploy?`});if(V.isCancel(n))throw V.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`);return n}async function Aa(){let{stdout:e}=await B(`git`,[`status`,`--porcelain`],{stdin:`ignore`});if(e.trim().length>0)throw Error(`Deploy requires a clean git tree.`);let{stdout:t}=await B(`git`,[`rev-parse`,`HEAD`],{stdin:`ignore`});return t.trim()}function ja(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations or --skip-migrations.`)}async function Ma(e,t,n=et){return e.url?Na(e.url,t):t===`staging`&&e.stagingHostname?Na(await n(),t):Na(void 0,t)}function Na(e,t){if(!e)throw Error(`Missing ${t} deploy URL. Set DEPLOY_URL or deploy.environments.${t}.url in coreframe.config.ts.`);let n;try{n=new URL(e)}catch{throw Error(`Invalid ${t} deploy URL "${e}". Expected an HTTP(S) URL.`)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw Error(`Invalid ${t} deploy URL "${e}". Expected an HTTP(S) URL.`);return n.toString()}async function Pa(e){if(e.environment!==`production`||e.yes)return;if(!process.stdout.isTTY)throw Error(`Production deploys require --yes in noninteractive environments.`);let t=await V.confirm({initialValue:!1,message:`Deploy to production?`});if(V.isCancel(t)||!t)throw V.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`)}function Fa(e,t){if(e===`staging`&&t)throw Error(`Tauri releases can only be published from production deploys.`)}function Ia(e,t){let n=t.filter(t=>!e[t]);if(n.length>0)throw Error(`Missing required deploy environment variables: ${n.join(`, `)}`);return Object.fromEntries(t.map(t=>[t,e[t]]))}async function La(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(n)return n;let r;try{r=Rt(await U(`.env`,`utf8`))}catch(e){throw za(e)&&e.code===`ENOENT`?Error(`Missing ${t} dashboard password. Set DASHBOARD_PASSWORD in ".env".`):e}let i=r.DASHBOARD_PASSWORD?.trim();if(!i)throw Error(`Missing ${t} dashboard password. Set DASHBOARD_PASSWORD in ".env".`);return i}async function Ra(e){let t=await we(L(Me(),`coreframe-deploy-secrets-`)),n=L(t,`secrets.json`);return await G(n,JSON.stringify(e),{mode:384}),{path:n,dispose:()=>W(t,{force:!0,recursive:!0})}}function za(e){return e instanceof Error&&`code`in e}function Ba(e,t,n,r,i){return{...e,CLOUDFLARE_ENV:t,DEPLOY_ENV:t,POSTHOG_RELEASE:n,POSTHOG_RELEASE_NAME:e.POSTHOG_RELEASE_NAME??r,POSTHOG_RELEASE_VERSION:e.POSTHOG_RELEASE_VERSION??i}}function Va(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}const Ha={access:ye,chmod:be,mkdir:H,mkdtemp:we,readFile:U,readFileSync:Y,rm:W,writeFile:G},Ua={getAvailablePort:Ga},Wa={homedir:Ae,kill:K.kill,networkInterfaces:je,tmpdir:Me};async function Ga(){let e=Gt();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())})}}async function Ka(){let e=await Ja();return typeof e.mobileDevHost==`string`?{mobileDevHost:e.mobileDevHost}:{}}async function qa(e){let t=await Ja(),n=Ya();await Ha.mkdir(F.dirname(n),{recursive:!0}),await Ha.writeFile(n,`${JSON.stringify({...t,...e},void 0,2)}\n`)}async function Ja(){try{let e=await Ha.readFile(Ya(),`utf8`),t=JSON.parse(e);return Xa(t)?t:{}}catch{return{}}}function Ya(){return F.join(Wa.homedir(),`.coreframe`,`preferences.json`)}function Xa(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function Za({env:e=K.env,interactive:t=K.stdin.isTTY===!0,platform:n,target:r}){let i=await no(n,e).catch(()=>[]),a=r?bo(i,r):void 0;if(a)return a;if(!r&&i.length>0)return to(i,n,t);let o=r?bo(await io(e).catch(()=>[]),r):void 0;if(o&&o.platform===n)return ao(o,n,e,t);let s=await ro(n,e),c=r?bo(s,r):void 0;if(c)return c;if(!r&&s.length>0)return to(s,n,t);let l=n===`ios`?`iOS`:`Android`;throw Error(r?`Could not find a ${l} device matching "${r}".`:`No connected ${l} devices or available ${l} ${n===`ios`?`simulators`:`emulators`} were detected.`)}async function Qa(e){let{device:t,host:n,interactive:r=K.stdin.isTTY===!0}=e;if(!t.physical&&n===void 0)return;if(typeof n==`string`&&n!==`0.0.0.0`&&n!==`::`)return n;let i=So();if(i.length===0)throw Error(`No external IP address was detected. Pass one explicitly with --host.`);let a=await $a();if(a&&i.includes(a))return a;if(i.length===1)return await eo(i[0]),i[0];if(!r)throw Error(`Multiple external IP addresses were detected (${i.join(`, `)}). Pass one explicitly with --host.`);let o=await V.select({message:`Which IP address should the mobile device use to reach the development server?`,options:i.map(e=>({label:e,value:e}))});if(V.isCancel(o))throw Error(`Mobile development IP selection was cancelled.`);return await eo(o),o}async function $a(){return(await Ka()).mobileDevHost}async function eo(e){try{await qa({mobileDevHost:e})}catch(e){V.log.warn(`Could not remember the mobile development IP address: ${e instanceof Error?e.message:String(e)}`)}}async function to(e,t,n){if(e.length===1)return e[0];if(!n)throw Error(`Multiple ${t===`ios`?`iOS`:`Android`} devices were detected. Pass a device name explicitly.`);let r=await V.select({message:`Which ${t===`ios`?`iOS`:`Android`} device should Coreframe use?`,options:e.map(e=>({label:e.label,value:e,hint:e.id}))});if(V.isCancel(r))throw Error(`Mobile development device selection was cancelled.`);return r}async function no(e,t){return e===`android`?so(t):lo(t)}async function ro(e,t){return e===`android`?co(t):uo(t)}async function io(e){let{stdout:t}=await B(`flutter`,[`emulators`],{env:e});return t.split(/\r?\n/).flatMap(e=>{let[t,n,,r]=e.split(/\s*•\s*/).map(e=>e.trim());return t&&n&&(r===`android`||r===`ios`)?[{id:t,label:n,name:n,physical:!1,platform:r}]:[]})}async function ao(e,t,n,r){let i=await oo(t,n).catch(()=>[]),{stdout:a}=await B(`flutter`,[`emulators`,`--launch`,e.id],{env:n});if(/No emulator found|More than one emulator matches/i.test(a))throw Error(a.trim());let o=Date.now()+3e4;do{let a=await oo(t,n).catch(()=>[]),o=bo(a,e.id);if(o)return o;let s=a.filter(e=>!i.some(t=>t.id===e.id));if(s.length>0)return to(s,t,r);if(a.length===1)return a[0];await Kt(250)}while(Date.now()<o);let s=t===`ios`?`iOS simulator`:`Android emulator`;throw Error(`Flutter launched "${e.id}", but no ${s} became available.`)}async function oo(e,t){return e===`ios`?uo(t,`booted`):(await so(t)).filter(e=>!e.physical)}async function so(e){let t=await po(e,`platform-tools`,K.platform===`win32`?`adb.exe`:`adb`),{stdout:n}=await B(t,[`devices`],{env:e}),r=n.split(/\r?\n/).map(e=>e.match(/^(\S+)\s+device(?:\s|$)/)?.[1]).filter(e=>e!==void 0);return(await Promise.all(r.map(async n=>{let r=await ho(t,e,n,`ro.product.model`),i=n.startsWith(`emulator-`),a=i?await _o(t,e,n,r):await vo(t,e,n,r);return{id:n,label:a===r?a:`${a} (${r})`,name:a,physical:!i}}))).sort(Co)}async function co(e){let{stdout:t}=await B(await po(e,`emulator`,K.platform===`win32`?`emulator.exe`:`emulator`),[`-list-avds`],{env:e});return t.split(/\r?\n/).map(e=>e.trim()).filter(e=>e.length>0&&!/^(INFO|WARNING|ERROR)\s+\|/.test(e)).map(e=>({id:e,label:e,name:e,physical:!1}))}async function lo(e){let t=await Ha.mkdtemp(F.join(Wa.tmpdir(),`coreframe-ios-devices-`)),n=F.join(t,`devices.json`);try{return await Ha.writeFile(n,``),await B(`xcrun`,[`devicectl`,`list`,`devices`,`--json-output`,n],{env:e}),(JSON.parse(await Ha.readFile(n,`utf8`)).result?.devices??[]).filter(fo).map(e=>({id:e.hardwareProperties.udid,label:`${e.deviceProperties.name} (${e.hardwareProperties.productType})`,name:e.deviceProperties.name,physical:!0})).sort(Co)}finally{await Ha.rm(t,{force:!0,recursive:!0})}}async function uo(e,t=`available`){let{stdout:n}=await B(`xcrun`,[`simctl`,`list`,`--json`,`devices`,t],{env:e}),r=JSON.parse(n);return Object.entries(r.devices??{}).filter(([e])=>e.includes(`iOS-`)).flatMap(([,e])=>e).flatMap(e=>e.name&&e.udid?[{id:e.udid,label:e.name,name:e.name,physical:!1}]:[]).sort(Co)}function fo(e){return e.connectionProperties?.tunnelState!==`unavailable`&&typeof e.hardwareProperties?.platform==`string`&&(e.hardwareProperties.platform.includes(`iOS`)||e.hardwareProperties.platform.includes(`xrOS`))&&typeof e.deviceProperties?.name==`string`&&typeof e.hardwareProperties.productType==`string`&&typeof e.hardwareProperties.udid==`string`}async function po(e,t,n){let r=e.ANDROID_HOME??e.ANDROID_SDK_ROOT,i=r?[r]:mo(e);for(let e of i){let r=F.join(e,t,n);try{return await Ha.access(r),r}catch{}}return n}function mo(e){return K.platform===`darwin`?[F.join(Wa.homedir(),`Library`,`Android`,`sdk`)]:K.platform===`win32`&&e.LOCALAPPDATA?[F.join(e.LOCALAPPDATA,`Android`,`Sdk`)]:[F.join(Wa.homedir(),`Android`,`Sdk`)]}async function ho(e,t,n,r){return(await go(e,t,[`-s`,n,`shell`,`getprop`,r])).trim()}async function go(e,t,n){return(await B(e,n,{env:t,timeout:3e3})).stdout}async function _o(e,t,n,r){return go(e,t,[`-s`,n,`emu`,`avd`,`name`]).then(e=>e.split(/\r?\n/)[0]?.trim()||r).catch(()=>r)}async function vo(e,t,n,r){return go(e,t,[`-s`,n,`shell`,`dumpsys`,`bluetooth_manager`]).then(e=>yo(e)||r).catch(()=>r)}function yo(e){return e.match(/\bname: (.+)/)?.[1]?.trim()}function bo(e,t){let n=e.map(e=>({device:e,score:Math.max(xo(t,e.name),xo(t,e.id))})).sort((e,t)=>t.score-e.score)[0];return n&&n.score>0?n.device:void 0}function xo(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(r===n)return 1e4;let i=r.indexOf(n);if(i>=0)return 5e3-i;let a=0,o=0;for(let e of n){let t=r.indexOf(e,o);if(t<0)return 0;a+=t===o?2:1,o=t+1}return a}function So(){return[...new Set(Object.values(Wa.networkInterfaces()).flatMap(e=>e??[]).filter(e=>!e.internal&&e.family===`IPv4`).map(e=>e.address))].sort()}function Co(e,t){return e.label.localeCompare(t.label)}const wo=`COREFRAME_FLUTTER_DEVELOPMENT`,To=[`filtered`,`full`];function Eo({enabled:e,env:t=K.env,input:n=K.stdin,onInterrupt:r,onQuit:i,onRestart:a,output:o=K.stdout}){if(!e)return()=>void 0;let s=n.readableFlowing,c=n.isRaw,l=e=>{for(let t of e.toString())t===``?r():t===`R`?a():t===`q`?i():t===`h`?o.write(`
10
+ `:``;Je(e,`${JSON.stringify(n,null,r)}${i}`)}function _a(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t)console.log(` ${e}`);console.log(``)}}function va(e){let t=z(sa([`rev-parse`,`--show-toplevel`]).trim(),`package.json`),n=Y(t,`utf8`),r=ca(n,t),i=Rr(e.target),a=ma(i),o=new Set(a.map(({name:e})=>e)),s=[],c=[],l=[],u=0;for(let e of a){let t=ha(r,e.name);if(!t){c.push(`missing: ${e.name} ${e.spec} (${e.group})`);continue}if(da(t.spec)){l.push(`linked: ${e.name} ${t.spec}`);continue}if(t.spec===e.spec){u+=1;continue}s.push({...e,currentGroup:t.group,currentSpec:t.spec})}let d=oa.flatMap(e=>Object.entries(r[e]??{}).filter(([e])=>ua(e)&&!o.has(e)).map(([t,n])=>`review: ${t} ${n} (${e})`));if(e.apply&&s.length>0){for(let e of s)r[e.currentGroup][e.name]=e.spec;ga(t,n,r)}console.log(`Coreframe package sync: ${i}`),console.log(``),_a(e.apply?`Updated Coreframe packages`:`Would update Coreframe packages`,s.map(({currentSpec:e,name:t,spec:n})=>`update: ${t} ${e} -> ${n}`)),_a(`Missing target Coreframe packages`,c),_a(`Locally linked Coreframe packages`,l),_a(`Downstream-only Coreframe packages`,d),u>0&&console.log(`${u} Coreframe package(s) already match the target versions.`),s.length===0?console.log(`No Coreframe package version updates found.`):e.apply||(console.log(``),console.log(`Run with --apply to write the ${s.length} package update(s).`))}const ya={...f,displayName:`recipe`,description:`Coreframe recipe name, such as yam-db.`,async from(e){return Er(e)}},ba=p({name:`upgrade`,cmds:{"ensure-template-remote":n({name:`ensure-template-remote`,args:{remote:c({long:`remote`,type:f,defaultValue:()=>`template`,description:`Remote name to ensure.`}),noFetch:i({long:`no-fetch`,description:`Do not fetch the remote after ensuring it exists.`,defaultValue:()=>!1})},handler:({noFetch:e,remote:t})=>Ir({fetch:!e,remote:t})}),"check-skill-current":n({name:`check-skill-current`,args:{target:c({long:`target`,type:f,description:`Target Coreframe template git ref.`}),apply:i({long:`apply`,description:`Replace the local upgrade skill with the target version when it differs.`,defaultValue:()=>!1})},handler:({apply:e,target:t})=>{process.exitCode=Li({apply:e,target:t})}}),"fast-forward-template-files":n({name:`fast-forward-template-files`,args:{target:c({long:`target`,type:f,description:`Target Coreframe template git ref.`}),base:c({long:`base`,type:l(f),description:`Previous Coreframe template git ref. Defaults to package.json engines.coreframe.`}),apply:i({long:`apply`,description:`Write clean fast-forwards to the worktree.`,defaultValue:()=>!1})},handler:({apply:e,base:t,target:n})=>aa({apply:e,base:t,target:n})}),"sync-coreframe-packages":n({name:`sync-coreframe-packages`,args:{target:c({long:`target`,type:f,description:`Target Coreframe template git ref.`}),apply:i({long:`apply`,description:`Update existing published Coreframe dependency specifications.`,defaultValue:()=>!1})},handler:({apply:e,target:t})=>va({apply:e,target:t})})}}),xa=p({name:`recipes`,cmds:{apply:n({name:`apply`,args:{recipe:u({type:ya,displayName:`recipe`,description:`Recipe to prepare and apply.`}),target:c({long:`target`,type:l(f),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:f,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:i({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,recipe:t,remote:n,target:r})=>di(ui({fetch:!e,name:t,remote:n,target:r}))}),list:n({name:`list`,args:{target:c({long:`target`,type:l(f),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:f,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:i({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,remote:t,target:n})=>Ai(ki({fetch:!e,remote:t,target:n}))}),verify:n({name:`verify`,args:{recipe:u({type:ya,displayName:`recipe`,description:`Recipe adoption to verify.`}),target:c({long:`target`,type:l(f),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:f,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:i({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,recipe:t,remote:n,target:r})=>si(oi({fetch:!e,name:t,remote:n,target:r}))})}}),Sa=p({name:`db`,cmds:{ensure:n({name:`ensure`,args:{},handler:b}),generate:n({name:`generate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit generate.`})},handler:({args:e})=>O(`generate`,e)}),migrate:n({name:`migrate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit migrate.`})},handler:({args:e})=>O(`migrate`,e)}),"migrate-held":n({name:`migrate-held`,args:{local:i({long:`local`,description:`Run held migrations against the Coreframe-managed local PostgreSQL database.`,defaultValue:()=>!1})},handler:({local:e})=>T({target:e?`local`:`deployment`})}),"migrate-local":n({name:`migrate-local`,args:{},handler:E}),"migrations-check":n({name:`migrations-check`,args:{},handler:h}),reset:n({name:`reset`,args:{},handler:ee}),seed:n({name:`seed`,args:{},handler:()=>ne()}),"schema-check":n({name:`schema-check`,args:{seed:i({long:`seed`,description:`Run the configured project seed against the throwaway database.`,defaultValue:()=>!1})},handler:({seed:e})=>g({seed:e})}),setup:n({name:`setup`,args:{},handler:()=>k()}),studio:n({name:`studio`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit studio.`})},handler:({args:e})=>O(`studio`,e)})}}),Ca=`package.json`;async function wa(e=process.argv.slice(2),t=process.env){let n=Ta(e);Na(n);let{packageJson:r,source:i}=await ft(Ca),a=await Ie(),o=gt(a.deploy??{},n.environment,t);Ra(t,[`POSTHOG_API_KEY`,`POSTHOG_PROJECT_ID`]);let s=await Pa(o,n.environment,()=>tt({env:t})),c=vt({args:n,config:n.environment===`production`?o.tauriRelease:{},env:t});La(n.environment,c.enabled),await Tt(c);let l=await pt({environment:n.environment}),u=l.values.DASHBOARD_PASSWORD??await za(t,n.environment);Et(await nt({environment:n.environment}),n.environment,{availableNames:[...Object.keys(l.values),...u?[`DASHBOARD_PASSWORD`]:[]]});let d=await st({environment:n.environment}),f=await Ma();await Yn({env:t,revision:f});let p=f.slice(0,12),m=_t(n.environment,r.version,p),h=ht(r.name,m),g={...Ha(t,n.environment,h,r.name,m),COREFRAME_I18N_RELEASE_REVISION:f},_=n.environment===`production`,b=!1,x={files:[]};V.intro(`Deploy ${h} to ${n.environment}`);let S=Object.keys(l.values).sort();S.length>0&&V.note(S.join(`
11
+ `),`Pending Worker secret updates`),d.provisioned&&V.log.info(`Provisioning Coreframe-managed access-token signing material.`),await Ia(n);let C=a.database?.dialect??`postgres`,T;switch(C){case`postgres`:T=await v({env:t});break;case`sqlite`:T=await y({env:t});break;default:throw Error(`Unsupported database dialect "${C}".`)}let E=await ka(T),D=await te(E);if(D.length>0)throw Error(`Pending deploy migrations contain unsafe SQL. Move unsafe statements to held migrations.\n${w(D)}`);let ee=await ja(n,E);try{_&&(await Ot(Ca,r,m),x=await kt(c,m)),V.log.step(`Running pre-deploy build`),await B(`pnpm`,[`build`],{env:Ua(g),stdio:`inherit`});let e=c.enabled?await ct({env:Ua(g),plan:c,releaseName:h,version:m}):void 0;V.log.step(`Running release build and uploading PostHog source maps`),b=!0,await B(`pnpm`,[`build`],{env:g,stdio:`inherit`}),ee&&(V.log.step(`Running deploy-safe database migrations`),await B(`pnpm`,[`db`,`migrate`],{env:g,stdio:`inherit`})),V.log.step(`Deploying Worker and static assets to Cloudflare`);let t={...u?{DASHBOARD_PASSWORD:u}:{},...d.value?{[Ze]:d.value}:{},...l.values},i=Object.keys(t).length>0?await Ba(t):void 0,f=await rt({coreframeConfig:a,environment:n.environment,contributions:{generatedValues:{DEPLOY_ENV:n.environment,POSTHOG_RELEASE:h}}});try{await B(`pnpm`,[`exec`,`wrangler`,`deploy`,`--config`,f.path,`--env`,n.environment,`--strict`,`--keep-vars`,`--tag`,h,`--message`,`Deploy ${h}`,...i?[`--secrets-file`,i.path]:[]],{env:g,stdio:`inherit`}),await Qe(l),await Dt({environment:n.environment})}finally{await f.dispose(),await i?.dispose()}let p={environment:n.environment,releaseName:h,url:s,version:m};o.afterWorkerDeploy&&(V.log.step(`Running required after-Worker deploy hook`),await xt(o,p)),n.skipPostDeployChecks||(V.log.step(`Running post-deploy checks`),await St(o,p)),e&&(V.log.step(`Uploading Tauri release artifacts to Backblaze B2`),await wt(c,e)),V.outro(`Deployed ${h} to ${n.environment}`)}catch(e){throw!b&&_&&(await G(Ca,i),await yt(x)),e}}function Ta(e){return{environment:Ea(e[0]),runMigrations:e.includes(`--run-migrations`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),tauriLocalPlatforms:Da(e,`--tauri-local-platform`).map(e=>ot(e)),tauriWorkflowName:Oa(e,`--tauri-workflow-name`),tauriWorkflowPlatforms:Da(e,`--tauri-workflow-platform`).map(e=>ot(e)),tauriWorkflowRef:Oa(e,`--tauri-workflow-ref`),yes:e.includes(`--yes`)}}function Ea(e){if(e&&$e.includes(e))return e;throw Error(`Deploy environment must be one of: ${$e.join(`, `)}.`)}function Da(e,t){let n=[];for(let r=0;r<e.length;r+=1){let i=e[r];if(i===t){let i=e[r+1];if(!i||i.startsWith(`--`))throw Error(`${t} requires a value.`);n.push(...i.split(`,`).filter(Boolean)),r+=1;continue}i.startsWith(`${t}=`)&&n.push(...i.slice(t.length+1).split(`,`).filter(Boolean))}return n}function Oa(e,t){let n=Da(e,t);if(n.length>1)throw Error(`${t} can only be provided once.`);return n[0]}async function ka(e){try{return await Aa(e)}finally{await e.close?.()}}async function Aa(e){return x(await _(),await D(e))}async function ja(e,t){if(t.length===0)return V.log.info(`No pending deploy migrations.`),!1;if(V.note(C(t),`Pending deploy migrations`),e.runMigrations)return!0;if(e.skipMigrations)return!1;if(!process.stdout.isTTY)throw Error(`Pending migrations require --run-migrations or --skip-migrations in noninteractive deploys.`);let n=await V.confirm({initialValue:!0,message:`Run these deploy-safe database migrations before Cloudflare deploy?`});if(V.isCancel(n))throw V.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`);return n}async function Ma(){let{stdout:e}=await B(`git`,[`status`,`--porcelain`],{stdin:`ignore`});if(e.trim().length>0)throw Error(`Deploy requires a clean git tree.`);let{stdout:t}=await B(`git`,[`rev-parse`,`HEAD`],{stdin:`ignore`});return t.trim()}function Na(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations or --skip-migrations.`)}async function Pa(e,t,n=tt){return e.url?Fa(e.url,t):t===`staging`&&e.stagingHostname?Fa(await n(),t):Fa(void 0,t)}function Fa(e,t){if(!e)throw Error(`Missing ${t} deploy URL. Set DEPLOY_URL or deploy.environments.${t}.url in coreframe.config.ts.`);let n;try{n=new URL(e)}catch{throw Error(`Invalid ${t} deploy URL "${e}". Expected an HTTP(S) URL.`)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw Error(`Invalid ${t} deploy URL "${e}". Expected an HTTP(S) URL.`);return n.toString()}async function Ia(e){if(e.environment!==`production`||e.yes)return;if(!process.stdout.isTTY)throw Error(`Production deploys require --yes in noninteractive environments.`);let t=await V.confirm({initialValue:!1,message:`Deploy to production?`});if(V.isCancel(t)||!t)throw V.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`)}function La(e,t){if(e===`staging`&&t)throw Error(`Tauri releases can only be published from production deploys.`)}function Ra(e,t){let n=t.filter(t=>!e[t]);if(n.length>0)throw Error(`Missing required deploy environment variables: ${n.join(`, `)}`);return Object.fromEntries(t.map(t=>[t,e[t]]))}async function za(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(n)return n;let r;try{r=zt(await U(`.env`,`utf8`))}catch(e){throw Va(e)&&e.code===`ENOENT`?Error(`Missing ${t} dashboard password. Set DASHBOARD_PASSWORD in ".env".`):e}let i=r.DASHBOARD_PASSWORD?.trim();if(!i)throw Error(`Missing ${t} dashboard password. Set DASHBOARD_PASSWORD in ".env".`);return i}async function Ba(e){let t=await we(L(Me(),`coreframe-deploy-secrets-`)),n=L(t,`secrets.json`);return await G(n,JSON.stringify(e),{mode:384}),{path:n,dispose:()=>W(t,{force:!0,recursive:!0})}}function Va(e){return e instanceof Error&&`code`in e}function Ha(e,t,n,r,i){return{...e,CLOUDFLARE_ENV:t,DEPLOY_ENV:t,POSTHOG_RELEASE:n,POSTHOG_RELEASE_NAME:e.POSTHOG_RELEASE_NAME??r,POSTHOG_RELEASE_VERSION:e.POSTHOG_RELEASE_VERSION??i}}function Ua(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}const Wa={access:ye,chmod:be,mkdir:H,mkdtemp:we,readFile:U,readFileSync:Y,rm:W,writeFile:G},Ga={getAvailablePort:qa},Ka={homedir:Ae,kill:K.kill,networkInterfaces:je,tmpdir:Me};async function qa(){let e=qt();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())})}}async function Ja(){let e=await Xa();return typeof e.mobileDevHost==`string`?{mobileDevHost:e.mobileDevHost}:{}}async function Ya(e){let t=await Xa(),n=Za();await Wa.mkdir(F.dirname(n),{recursive:!0}),await Wa.writeFile(n,`${JSON.stringify({...t,...e},void 0,2)}\n`)}async function Xa(){try{let e=await Wa.readFile(Za(),`utf8`),t=JSON.parse(e);return Qa(t)?t:{}}catch{return{}}}function Za(){return F.join(Ka.homedir(),`.coreframe`,`preferences.json`)}function Qa(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function $a({env:e=K.env,interactive:t=K.stdin.isTTY===!0,platform:n,target:r}){let i=await io(n,e).catch(()=>[]),a=r?So(i,r):void 0;if(a)return a;if(!r&&i.length>0)return ro(i,n,t);let o=r?So(await oo(e).catch(()=>[]),r):void 0;if(o&&o.platform===n)return so(o,n,e,t);let s=await ao(n,e),c=r?So(s,r):void 0;if(c)return c;if(!r&&s.length>0)return ro(s,n,t);let l=n===`ios`?`iOS`:`Android`;throw Error(r?`Could not find a ${l} device matching "${r}".`:`No connected ${l} devices or available ${l} ${n===`ios`?`simulators`:`emulators`} were detected.`)}async function eo(e){let{device:t,host:n,interactive:r=K.stdin.isTTY===!0}=e;if(!t.physical&&n===void 0)return;if(typeof n==`string`&&n!==`0.0.0.0`&&n!==`::`)return n;let i=wo();if(i.length===0)throw Error(`No external IP address was detected. Pass one explicitly with --host.`);let a=await to();if(a&&i.includes(a))return a;if(i.length===1)return await no(i[0]),i[0];if(!r)throw Error(`Multiple external IP addresses were detected (${i.join(`, `)}). Pass one explicitly with --host.`);let o=await V.select({message:`Which IP address should the mobile device use to reach the development server?`,options:i.map(e=>({label:e,value:e}))});if(V.isCancel(o))throw Error(`Mobile development IP selection was cancelled.`);return await no(o),o}async function to(){return(await Ja()).mobileDevHost}async function no(e){try{await Ya({mobileDevHost:e})}catch(e){V.log.warn(`Could not remember the mobile development IP address: ${e instanceof Error?e.message:String(e)}`)}}async function ro(e,t,n){if(e.length===1)return e[0];if(!n)throw Error(`Multiple ${t===`ios`?`iOS`:`Android`} devices were detected. Pass a device name explicitly.`);let r=await V.select({message:`Which ${t===`ios`?`iOS`:`Android`} device should Coreframe use?`,options:e.map(e=>({label:e.label,value:e,hint:e.id}))});if(V.isCancel(r))throw Error(`Mobile development device selection was cancelled.`);return r}async function io(e,t){return e===`android`?lo(t):fo(t)}async function ao(e,t){return e===`android`?uo(t):po(t)}async function oo(e){let{stdout:t}=await B(`flutter`,[`emulators`],{env:e});return t.split(/\r?\n/).flatMap(e=>{let[t,n,,r]=e.split(/\s*•\s*/).map(e=>e.trim());return t&&n&&(r===`android`||r===`ios`)?[{id:t,label:n,name:n,physical:!1,platform:r}]:[]})}async function so(e,t,n,r){let i=await co(t,n).catch(()=>[]),{stdout:a}=await B(`flutter`,[`emulators`,`--launch`,e.id],{env:n});if(/No emulator found|More than one emulator matches/i.test(a))throw Error(a.trim());let o=Date.now()+3e4;do{let a=await co(t,n).catch(()=>[]),o=So(a,e.id);if(o)return o;let s=a.filter(e=>!i.some(t=>t.id===e.id));if(s.length>0)return ro(s,t,r);if(a.length===1)return a[0];await Jt(250)}while(Date.now()<o);let s=t===`ios`?`iOS simulator`:`Android emulator`;throw Error(`Flutter launched "${e.id}", but no ${s} became available.`)}async function co(e,t){return e===`ios`?po(t,`booted`):(await lo(t)).filter(e=>!e.physical)}async function lo(e){let t=await ho(e,`platform-tools`,K.platform===`win32`?`adb.exe`:`adb`),{stdout:n}=await B(t,[`devices`],{env:e}),r=n.split(/\r?\n/).map(e=>e.match(/^(\S+)\s+device(?:\s|$)/)?.[1]).filter(e=>e!==void 0);return(await Promise.all(r.map(async n=>{let r=await _o(t,e,n,`ro.product.model`),i=n.startsWith(`emulator-`),a=i?await yo(t,e,n,r):await bo(t,e,n,r);return{id:n,label:a===r?a:`${a} (${r})`,name:a,physical:!i}}))).sort(To)}async function uo(e){let{stdout:t}=await B(await ho(e,`emulator`,K.platform===`win32`?`emulator.exe`:`emulator`),[`-list-avds`],{env:e});return t.split(/\r?\n/).map(e=>e.trim()).filter(e=>e.length>0&&!/^(INFO|WARNING|ERROR)\s+\|/.test(e)).map(e=>({id:e,label:e,name:e,physical:!1}))}async function fo(e){let t=await Wa.mkdtemp(F.join(Ka.tmpdir(),`coreframe-ios-devices-`)),n=F.join(t,`devices.json`);try{return await Wa.writeFile(n,``),await B(`xcrun`,[`devicectl`,`list`,`devices`,`--json-output`,n],{env:e}),(JSON.parse(await Wa.readFile(n,`utf8`)).result?.devices??[]).filter(mo).map(e=>({id:e.hardwareProperties.udid,label:`${e.deviceProperties.name} (${e.hardwareProperties.productType})`,name:e.deviceProperties.name,physical:!0})).sort(To)}finally{await Wa.rm(t,{force:!0,recursive:!0})}}async function po(e,t=`available`){let{stdout:n}=await B(`xcrun`,[`simctl`,`list`,`--json`,`devices`,t],{env:e}),r=JSON.parse(n);return Object.entries(r.devices??{}).filter(([e])=>e.includes(`iOS-`)).flatMap(([,e])=>e).flatMap(e=>e.name&&e.udid?[{id:e.udid,label:e.name,name:e.name,physical:!1}]:[]).sort(To)}function mo(e){return e.connectionProperties?.tunnelState!==`unavailable`&&typeof e.hardwareProperties?.platform==`string`&&(e.hardwareProperties.platform.includes(`iOS`)||e.hardwareProperties.platform.includes(`xrOS`))&&typeof e.deviceProperties?.name==`string`&&typeof e.hardwareProperties.productType==`string`&&typeof e.hardwareProperties.udid==`string`}async function ho(e,t,n){let r=e.ANDROID_HOME??e.ANDROID_SDK_ROOT,i=r?[r]:go(e);for(let e of i){let r=F.join(e,t,n);try{return await Wa.access(r),r}catch{}}return n}function go(e){return K.platform===`darwin`?[F.join(Ka.homedir(),`Library`,`Android`,`sdk`)]:K.platform===`win32`&&e.LOCALAPPDATA?[F.join(e.LOCALAPPDATA,`Android`,`Sdk`)]:[F.join(Ka.homedir(),`Android`,`Sdk`)]}async function _o(e,t,n,r){return(await vo(e,t,[`-s`,n,`shell`,`getprop`,r])).trim()}async function vo(e,t,n){return(await B(e,n,{env:t,timeout:3e3})).stdout}async function yo(e,t,n,r){return vo(e,t,[`-s`,n,`emu`,`avd`,`name`]).then(e=>e.split(/\r?\n/)[0]?.trim()||r).catch(()=>r)}async function bo(e,t,n,r){return vo(e,t,[`-s`,n,`shell`,`dumpsys`,`bluetooth_manager`]).then(e=>xo(e)||r).catch(()=>r)}function xo(e){return e.match(/\bname: (.+)/)?.[1]?.trim()}function So(e,t){let n=e.map(e=>({device:e,score:Math.max(Co(t,e.name),Co(t,e.id))})).sort((e,t)=>t.score-e.score)[0];return n&&n.score>0?n.device:void 0}function Co(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(r===n)return 1e4;let i=r.indexOf(n);if(i>=0)return 5e3-i;let a=0,o=0;for(let e of n){let t=r.indexOf(e,o);if(t<0)return 0;a+=t===o?2:1,o=t+1}return a}function wo(){return[...new Set(Object.values(Ka.networkInterfaces()).flatMap(e=>e??[]).filter(e=>!e.internal&&e.family===`IPv4`).map(e=>e.address))].sort()}function To(e,t){return e.label.localeCompare(t.label)}async function Eo(e,t){if(!e)return()=>void 0;await H(F.dirname(e),{recursive:!0}),await G(e,``,{flag:`a`});let n=await U(e,`utf8`).catch(()=>void 0),r=0,i=!1,a=qe(e,{persistent:!1},()=>{if(i)return;let a=++r;U(e,`utf8`).then(e=>{i||a!==r||e===n||(n=e,t())},()=>void 0)});return()=>{i=!0,a.close()}}const Do=`COREFRAME_FLUTTER_DEVELOPMENT`,Oo=[`filtered`,`full`];function ko({enabled:e,env:t=K.env,input:n=K.stdin,onInterrupt:r,onQuit:i,onRestart:a,output:o=K.stdout}){if(!e)return()=>void 0;let s=n.readableFlowing,c=n.isRaw,l=e=>{for(let t of e.toString())t===``?r():t===`R`?a():t===`q`?i():t===`h`?o.write(`
12
12
  Coreframe Flutter commands:
13
13
  R Restart the Flutter process.
14
14
  h Show this help.
15
15
  q Quit.
16
16
  `):t===`c`&&o.write(`\x1Bc`)};return n.setRawMode?.(!0),n.resume(),n.on(`data`,l),t.CI!==`true`&&o.write(`
17
17
  Coreframe: Press "R" to restart the Flutter process.
18
- `),()=>{n.off(`data`,l),c||n.setRawMode?.(!1),s!==!0&&n.pause()}}function Do(e=!1){return e?`debug`:`profile`}function Oo({device:e,mode:t,platform:n}){if(t===`profile`&&!e.physical)throw Error(`Flutter profile mode is unavailable on ${n===`ios`?`iOS simulator`:`Android emulator`}s. Re-run with --flutter-debug or select a physical device.`)}function ko({device:e,mode:t,serverUrl:n,verbose:r}){return[`run`,`--${t}`,`-d`,e.id,`--dart-define=COREFRAME_DEV_SERVER_URL=${n}`,...r?[`--verbose`]:[]]}function Ao({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 jo(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=Gt(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 jo(e,t){let n=Date.now()+1e4,r;for(;!t();)try{return await Mo(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 Mo({host:e=`127.0.0.1`,port:t}){return new Promise((n,r)=>{let i=Wt({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 No={command:Yo,isRunning:Bo,stop(e){try{K.kill(e,`SIGTERM`)}catch(e){if(!Uo(e))throw e}},waitForExit:Vo};async function Po({confirmStop:e=Lo,cwd:t=K.cwd(),interactive:n=K.stdin.isTTY===!0,pid:r=K.pid,platform:i=`web`,processes:a=No}={}){let o=await Qo(t,i),s=o.file,c={pid:r,platform:i,repository:o.repository,token:ze()},l=`${JSON.stringify(c)}\n`,u=`${s}.${c.token}.tmp`,d=await Go({confirmStop:e,file:F.resolve(t,`.coreframe/dev.lock`),interactive:n,owner:c,processes:a});if(d===void 0)return;let f=d;await H(F.dirname(s),{recursive:!0}),await G(u,l,{flag:`wx`,mode:384});try{for(;;){try{return await Ce(u,s),{owner:c,async release(){await zo(s,l)},takeoverApproved:f}}catch(e){if(!Ho(e))throw e}let t=await Io({confirmStop:e,file:s,interactive:n,owner:c,processes:a});if(t===void 0)return;f||=t}}finally{await ke(u).catch(()=>void 0)}}async function Fo({cwd:e=K.cwd(),platform:t=`web`}={}){let{file:n}=await Qo(e,t);return(await Ro(n))?.owner}async function Io({confirmStop:e,file:t,interactive:n,owner:r,processes:i}){let a=await Ro(t);if(!a||!ns(a.owner,r)||!i.isRunning(a.owner.pid))return await zo(t,a?.source),!1;if(!n)throw Error(`Coreframe dev is already running for this project (PID ${a.owner.pid}). Stop it before starting another.`);if(await e(a.owner.pid))return i.stop(a.owner.pid),await i.waitForExit(a.owner.pid),await zo(t,a.source),!0}async function Lo(e){let t=await V.confirm({initialValue:!1,message:`Coreframe dev is already running for this project (PID ${e}). Stop it and start here?`});return V.isCancel(t)||!t?(V.cancel(`Keeping the existing Coreframe dev process.`),!1):!0}async function Ro(e){try{let t=await U(e,`utf8`),n=JSON.parse(t);return!Number.isSafeInteger(n.pid)||Number(n.pid)<=0||typeof n.platform!=`string`||n.platform.length===0||typeof n.repository!=`string`||n.repository.length===0||typeof n.token!=`string`||n.token.length===0?void 0:{owner:n,source:t}}catch{return}}async function zo(e,t){let n=await U(e,`utf8`).catch(()=>void 0);(t===void 0||n===t)&&await ke(e).catch(()=>void 0)}function Bo(e){try{return K.kill(e,0),!0}catch(e){return!Uo(e)}}async function Vo(e){let t=Date.now()+1e4;for(;Bo(e);){if(Date.now()>=t)throw Error(`Coreframe dev process ${e} did not stop within 10 seconds.`);await new Promise(e=>setTimeout(e,50))}}function Ho(e){return Wo(e)&&e.code===`EEXIST`}function Uo(e){return Wo(e)&&e.code===`ESRCH`}function Wo(e){return e instanceof Error}async function Go({confirmStop:e,file:t,interactive:n,owner:r,processes:i}){let a=await Ko(t);if(!a||!i.isRunning(a.owner.pid))return await zo(t,a?.source),!1;let o=i.command?.(a.owner.pid);if(!o||!qo(o,r.platform))return!1;if(!n)throw Error(`Coreframe dev is already running for this project (PID ${a.owner.pid}). Stop it before starting another.`);if(await e(a.owner.pid))return i.stop(a.owner.pid),await i.waitForExit(a.owner.pid),await zo(t,a.source),!0}async function Ko(e){try{let t=await U(e,`utf8`),n=JSON.parse(t);return!Number.isSafeInteger(n.pid)||Number(n.pid)<=0||typeof n.token!=`string`||n.token.length===0?void 0:{owner:n,source:t}}catch{return}}function qo(e,t){let n=e.trim().split(/\s+/u),r=n.findIndex(e=>{let t=e.split(/[\\/]/u).at(-1);return t===`coreframe`||t===`coreframe.js`||t===`coreframe.ts`});if(r<0)return!1;let i=n.indexOf(`dev`,r+1);return i<0?!1:Jo(n.slice(i+1))===t}function Jo(e){let t=new Set([`android`,`desktop`,`ios`,`macos`,`web`]),n=new Set([`--debug`,`--host`,`--port`]),r=!1;for(let i of e){if(r){r=!1;continue}if(n.has(i)){r=!0;continue}if(!i.startsWith(`-`))return t.has(i)?i:`web`}return`web`}function Yo(e){let t=K.platform===`win32`?Zo(e):Xo(e);if(t.status===0)return t.stdout.trim()||void 0}function Xo(e){return q(`ps`,[`-p`,String(e),`-o`,`command=`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]})}function Zo(e){return q(`powershell.exe`,[`-NoProfile`,`-NonInteractive`,`-Command`,`(Get-CimInstance Win32_Process -Filter 'ProcessId = ${e}').CommandLine`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]})}async function Qo(e,t){let n=await $o(F.resolve(e)),r=n.gitCommonDir?F.join(n.path,`coreframe-dev`):F.join(n.path,`.coreframe`);return{file:F.join(r,`dev.${t}.lock`),repository:n.path}}async function $o(e){let t=es(e);return t?{gitCommonDir:!0,path:await ts(F.resolve(e,t))}:{gitCommonDir:!1,path:await ts(e)}}function es(e){let t=q(`git`,[`rev-parse`,`--git-common-dir`],{cwd:e,encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]});if(t.status===0)return t.stdout.trim()||void 0}async function ts(e){return Ee(e).catch(()=>F.resolve(e))}function ns(e,t){return e.platform===t.platform&&e.repository===t.repository}function rs(e,t){let n={...e};return t===`desktop`?delete n.COREFRAME_PLATFORM:t===`web`||t===`webext`?n.COREFRAME_PLATFORM=`web`:n.COREFRAME_PLATFORM=t,n}const is=K.platform===`win32`?`portless.cmd`:`portless`,as=RegExp(`\x1B\\[[0-?]*[ -/]*[@-~]`,`g`),os=/^Proxy is already running on port \d+\.$/,ss=/^To restart: portless proxy stop(?: (?:-p|--port) \d+)? && portless proxy start(?: (?:-p|--port) \d+)?$/;function cs(e){let t=e.split(/(\r\n|\n)/),n=[];for(let e=0;e<t.length;){let r=t[e],i=t[e+2];if(r!==void 0&&i!==void 0&&os.test(r.replace(as,``).trim())&&ss.test(i.replace(as,``).trim())){e+=t[e+3]===void 0?3:4;continue}n.push(t[e]??``),e+=1}return n.join(``)}function ls(e){let t=cs(e);t&&K.stdout.write(t.endsWith(`
19
- `)?t:`${t}\n`)}async function us({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||t.TAURI_ENV_PLATFORM!==void 0||(await qt()).isAgent?!1:Pt(e)}async function ds({cwd:e,env:t,lan:n=!1}){let r=F.join(`node_modules`,`.bin`,is),i=[`proxy`,`start`,...n?[`--lan`]:[]];try{let{stdout:n}=await B(F.resolve(e,r),i,{cwd:e,env:t,stdin:`inherit`,stdout:`pipe`,stderr:`inherit`});ls(n)}catch(e){throw typeof e==`object`&&e&&`stdout`in e&&typeof e.stdout==`string`&&ls(e.stdout),e}}function fs({host:e,lan:t=!1,port:n}){return[...t?[`--lan`]:[],`run`,...n===void 0?[]:[`--app-port`,String(n)],`react-router`,`dev`,...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e]]}async function ps({cwd:e=K.cwd(),platform:t}){let n=await ms({cwd:e});if(!n||!Cs(n.platform)||!ws(n.platform,t)||!Es(n.owner.pid))return;let r=await Fo({cwd:e,platform:n.platform});if(!(!r||!Ds(n.owner,r))&&!(n.postgres?.pid!==void 0&&!Es(n.postgres.pid)))return n}async function ms({cwd:e=K.cwd()}={}){let t;try{t=JSON.parse(await U(_s(e),`utf8`))}catch{return}return vs(t)&&t.cwd===F.resolve(e)?t:void 0}async function hs({cwd:e=K.cwd(),owner:t,platform:n,postgres:r,vitePort:i}){let a=_s(e),o=F.dirname(a),s=`${a}.${ze()}.tmp`,c={cwd:F.resolve(e),owner:t,platform:n,...r?{postgres:r}:void 0,version:1,vite:{port:i}};await H(o,{recursive:!0});try{await G(s,`${JSON.stringify(c)}\n`,{flag:`wx`,mode:384}),await De(s,a)}finally{await ke(s).catch(()=>void 0)}}async function gs({cwd:e=K.cwd(),owner:t}){let n=_s(e),r=await ms({cwd:e});!r||!Ds(r.owner,t)||await ke(n).catch(()=>void 0)}function _s(e){return F.resolve(e,`.coreframe/dev.session.json`)}function vs(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.version===1&&typeof t.cwd==`string`&&ys(t.owner)&&xs(t.platform)&&Ts(t.vite?.port)&&(t.postgres===void 0||bs(t.postgres))}function ys(e){if(!e||typeof e!=`object`)return!1;let t=e,n=t.pid;return typeof n==`number`&&Number.isSafeInteger(n)&&n>0&&typeof t.token==`string`}function bs(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.dataDir==`string`&&(t.pid===void 0||Number.isSafeInteger(t.pid)&&t.pid>0)}function xs(e){return e===`android`||e===`desktop`||e===`ios`||e===`macos`||e===`web`}function Ss(e){return e===`android`||e===`ios`||e===`macos`}function Cs(e){return e===`web`||Ss(e)}function ws(e,t){return t===void 0?Ss(e):e===t}function Ts(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>0&&e<=65535}function Es(e){try{return K.kill(e,0),!0}catch(e){return e instanceof Error&&e.code===`EPERM`}}function Ds(e,t){return e.pid===t.pid&&e.token===t.token}const Os=K.platform===`win32`?`pnpm.cmd`:`pnpm`,ks=K.platform===`win32`?`portless.cmd`:`portless`,As=K.platform===`win32`?`react-router.cmd`:`react-router`;async function js({cwd:e=K.cwd(),debug:t,device:n,env:r=K.env,flutterDebug:i=!1,flutterOutput:a=`filtered`,host:o,https:s=!1,interactive:c=K.stdin.isTTY===!0,lan:l=!1,managed:u=!1,noManaged:d=!1,platform:f=`web`,portless:p,fresh:m=!1,reuseVite:h=!1,verbose:g=!1,webPort:_,supervisor:v}){let y=At({env:r}),b=Ls(f)?f:void 0,x=Do(i);if(i&&b===void 0)throw Error(`The --flutter-debug option is only supported for Flutter development platforms (iOS, Android, and macOS).`);let S=Rs(f),C=f===`ios`||f===`android`?f:void 0,w=C?await Za({env:r,interactive:c,platform:C,target:n}):void 0;C&&w&&Oo({device:w,mode:x,platform:C});let T=C&&w?await Qa({device:w,host:o,interactive:c,platform:C}):void 0,E=b?!0:o,D=await y.measure(`config`,()=>Ie({cwd:e})),ee=await y.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(u||c&&!d)&&await Nt(e));await y.measure(`i18n`,()=>Gn({cwd:e,projectConfig:D}));let O=await y.measure(`routing`,async()=>p??await us({cwd:e,env:r,platform:f})),te=await y.measure(`https`,async()=>s&&!O?Ft({cwd:e}):void 0),ne=rs(r,f),k={...ne,...y.environment,...ee?{[Vt]:`1`,[Ht]:`1`}:void 0,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...b?{COREFRAME_PLATFORM:b}:void 0,...te?{[jt]:te.cert,[Mt]:te.key}:void 0},A=!1,re,ie,j,M,oe,N,se,P,ce=new Promise(e=>{P=e}),I=new Map,le=[`postgres`,`sqlite`,S];for(let e of le){let t=e===`postgres`||e===`sqlite`?e:e.startsWith(`vite:flutter`)?`flutter`:`web`,n=X({label:t}),r=X({color:`red`,label:t});n.pipe(K.stdout,{end:!1}),r.pipe(K.stderr,{end:!1}),I.set(e,{stderr:r,stdout:n})}let L=v.onEvent(e=>{e.event===`log`?(I.get(e.resource)?.[e.stream])?.write(e.data):e.event===`service`&&e.resource===S&&(e.state===`failed`||e.state===`stopped`)&&(e.state===`failed`&&(se=Error(e.error??`${S} development failed.`)),R())}),R=()=>{A||(A=!0,P(),j?.kill(`SIGTERM`),ie?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0))},z=e=>{re??=e,R()},ue=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>z(e);return K.on(e,t),{handler:t,signal:e}}),B=async e=>{let t=Ut(e);j=t;try{await t.expectSuccess()}catch(e){if(!A)throw e}finally{j===t&&(j=void 0)}};try{if(await v.subscribe(le),Is(D)){let e=await v.acquirePostgres({config:D,env:k});M=e.leaseId,k={...k,...e.env}}if(D.database?.dialect===`sqlite`){let e=await v.acquireSqlite({config:D,env:k});oe=e.leaseId,k={...k,...e.env}}(Is(D)||D.database?.dialect===`sqlite`)&&await y.measure(`schema`,()=>B({name:`db`,command:Os,args:[`db`,`ensure`],cwd:e,env:k,prefix:!1}));let t=Fs(_??r.COREFRAME_WEB_PORT),n=await v.status(),i=n.resources?.find(e=>e.resource===S),o=i!==void 0&&!m&&t===void 0?void 0:t??(h?5173:await Ua.getAvailablePort()),u=o??i?.endpoint?.port??5173;if(o!==void 0&&n.resources?.some(e=>e.resource!==S&&e.endpoint?.port===u)){if(t!==void 0)throw Error(`Port ${u} is already used by another Coreframe development shell.`);u=await Ua.getAvailablePort()}if(!h){let t={...k,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[k.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:F.join(e,`node_modules`,`.bin`)+F.delimiter+(k.PATH??``)},n=[{args:O?fs({host:E,lan:l,port:u}):[`dev`,...E===void 0?[]:[`--host`,E===!0?`0.0.0.0`:E],`--port`,String(u),...f===`web`||b?[`--strictPort`]:[]],command:O?ks:As,cwd:e,env:t},{args:[`exec`,`panda`,`dev`,`--no-color`],command:Os,cwd:e,env:k}],r=await v.acquireVite({configFingerprint:Ps({cwd:e,host:E,lan:l,https:s,portless:O,resource:S}),endpoint:{host:E===!0?`0.0.0.0`:E??`127.0.0.1`,port:u},processes:n,resource:S},m);N=r.leaseId,u=r.endpoint.port}if(y.report(),A)return;if(f===`web`?await Promise.race([Ns(v,S,()=>se),ce]):(await ae({cwd:e}),await Ms({cwd:e,env:ne,interactive:c,mobileHost:T,platform:f,port:u,requestStop:R,selectedDevice:w,mode:x,output:a,handleShutdown:z,isStopping:()=>A,setActiveNative:e=>{ie=e},verbose:g})),se)throw se}finally{R(),N&&await v.release(N).catch(()=>void 0),M&&await v.release(M).catch(()=>void 0),oe&&await v.release(oe).catch(()=>void 0),L();for(let{handler:e,signal:t}of ue)K.off(t,e);for(let e of I.values())e.stdout.end(),e.stderr.end();re&&(K.exitCode??=re===`SIGINT`?130:143),v.close()}}async function Ms({cwd:e,env:t,interactive:n,mobileHost:r,platform:i,port:a,requestStop:o,selectedDevice:s,mode:c,output:l,handleShutdown:u,isStopping:d,setActiveNative:f,verbose:p}){for(;;){let m=!1,h=i===`android`&&l===`filtered`&&!p?await se():void 0,g=n&&c===`profile`,_=B(`flutter`,ko({device:s??{id:`macos`},mode:c,serverUrl:zs(i,r,a),verbose:p}),{cwd:F.join(e,`src-flutter`),env:{...t,[wo]:`1`},stdio:h?[g?`pipe`:`inherit`,`pipe`,`pipe`]:g?[`pipe`,`inherit`,`inherit`]:`inherit`});f(_);let v=Eo({enabled:g,env:t,onInterrupt:()=>u(`SIGINT`),onQuit:o,onRestart:()=>{m||d()||(m=!0,t.CI!==`true`&&K.stdout.write(`
18
+ `),()=>{n.off(`data`,l),c||n.setRawMode?.(!1),s!==!0&&n.pause()}}function Ao(e=!1){return e?`debug`:`profile`}function jo({device:e,mode:t,platform:n}){if(t===`profile`&&!e.physical)throw Error(`Flutter profile mode is unavailable on ${n===`ios`?`iOS simulator`:`Android emulator`}s. Re-run with --flutter-debug or select a physical device.`)}function Mo({device:e,mode:t,serverUrl:n,verbose:r}){return[`run`,`--${t}`,`-d`,e.id,`--dart-define=COREFRAME_DEV_SERVER_URL=${n}`,...r?[`--verbose`]:[]]}function No({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 Po(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=qt(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 Po(e,t){let n=Date.now()+1e4,r;for(;!t();)try{return await Fo(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 Fo({host:e=`127.0.0.1`,port:t}){return new Promise((n,r)=>{let i=Kt({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 Io={command:Qo,isRunning:Uo,stop(e){try{K.kill(e,`SIGTERM`)}catch(e){if(!Ko(e))throw e}},waitForExit:Wo};async function Lo({confirmStop:e=Bo,cwd:t=K.cwd(),interactive:n=K.stdin.isTTY===!0,pid:r=K.pid,platform:i=`web`,processes:a=Io}={}){let o=await ts(t,i),s=o.file,c={pid:r,platform:i,repository:o.repository,token:ze()},l=`${JSON.stringify(c)}\n`,u=`${s}.${c.token}.tmp`,d=await Jo({confirmStop:e,file:F.resolve(t,`.coreframe/dev.lock`),interactive:n,owner:c,processes:a});if(d===void 0)return;let f=d;await H(F.dirname(s),{recursive:!0}),await G(u,l,{flag:`wx`,mode:384});try{for(;;){try{return await Ce(u,s),{owner:c,async release(){await Ho(s,l)},takeoverApproved:f}}catch(e){if(!Go(e))throw e}let t=await zo({confirmStop:e,file:s,interactive:n,owner:c,processes:a});if(t===void 0)return;f||=t}}finally{await ke(u).catch(()=>void 0)}}async function Ro({cwd:e=K.cwd(),platform:t=`web`}={}){let{file:n}=await ts(e,t);return(await Vo(n))?.owner}async function zo({confirmStop:e,file:t,interactive:n,owner:r,processes:i}){let a=await Vo(t);if(!a||!as(a.owner,r)||!i.isRunning(a.owner.pid))return await Ho(t,a?.source),!1;if(!n)throw Error(`Coreframe dev is already running for this project (PID ${a.owner.pid}). Stop it before starting another.`);if(await e(a.owner.pid))return i.stop(a.owner.pid),await i.waitForExit(a.owner.pid),await Ho(t,a.source),!0}async function Bo(e){let t=await V.confirm({initialValue:!1,message:`Coreframe dev is already running for this project (PID ${e}). Stop it and start here?`});return V.isCancel(t)||!t?(V.cancel(`Keeping the existing Coreframe dev process.`),!1):!0}async function Vo(e){try{let t=await U(e,`utf8`),n=JSON.parse(t);return!Number.isSafeInteger(n.pid)||Number(n.pid)<=0||typeof n.platform!=`string`||n.platform.length===0||typeof n.repository!=`string`||n.repository.length===0||typeof n.token!=`string`||n.token.length===0?void 0:{owner:n,source:t}}catch{return}}async function Ho(e,t){let n=await U(e,`utf8`).catch(()=>void 0);(t===void 0||n===t)&&await ke(e).catch(()=>void 0)}function Uo(e){try{return K.kill(e,0),!0}catch(e){return!Ko(e)}}async function Wo(e){let t=Date.now()+1e4;for(;Uo(e);){if(Date.now()>=t)throw Error(`Coreframe dev process ${e} did not stop within 10 seconds.`);await new Promise(e=>setTimeout(e,50))}}function Go(e){return qo(e)&&e.code===`EEXIST`}function Ko(e){return qo(e)&&e.code===`ESRCH`}function qo(e){return e instanceof Error}async function Jo({confirmStop:e,file:t,interactive:n,owner:r,processes:i}){let a=await Yo(t);if(!a||!i.isRunning(a.owner.pid))return await Ho(t,a?.source),!1;let o=i.command?.(a.owner.pid);if(!o||!Xo(o,r.platform))return!1;if(!n)throw Error(`Coreframe dev is already running for this project (PID ${a.owner.pid}). Stop it before starting another.`);if(await e(a.owner.pid))return i.stop(a.owner.pid),await i.waitForExit(a.owner.pid),await Ho(t,a.source),!0}async function Yo(e){try{let t=await U(e,`utf8`),n=JSON.parse(t);return!Number.isSafeInteger(n.pid)||Number(n.pid)<=0||typeof n.token!=`string`||n.token.length===0?void 0:{owner:n,source:t}}catch{return}}function Xo(e,t){let n=e.trim().split(/\s+/u),r=n.findIndex(e=>{let t=e.split(/[\\/]/u).at(-1);return t===`coreframe`||t===`coreframe.js`||t===`coreframe.ts`});if(r<0)return!1;let i=n.indexOf(`dev`,r+1);return i<0?!1:Zo(n.slice(i+1))===t}function Zo(e){let t=new Set([`android`,`desktop`,`ios`,`macos`,`web`]),n=new Set([`--debug`,`--host`,`--port`]),r=!1;for(let i of e){if(r){r=!1;continue}if(n.has(i)){r=!0;continue}if(!i.startsWith(`-`))return t.has(i)?i:`web`}return`web`}function Qo(e){let t=K.platform===`win32`?es(e):$o(e);if(t.status===0)return t.stdout.trim()||void 0}function $o(e){return q(`ps`,[`-p`,String(e),`-o`,`command=`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]})}function es(e){return q(`powershell.exe`,[`-NoProfile`,`-NonInteractive`,`-Command`,`(Get-CimInstance Win32_Process -Filter 'ProcessId = ${e}').CommandLine`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]})}async function ts(e,t){let n=await ns(F.resolve(e)),r=n.gitCommonDir?F.join(n.path,`coreframe-dev`):F.join(n.path,`.coreframe`);return{file:F.join(r,`dev.${t}.lock`),repository:n.path}}async function ns(e){let t=rs(e);return t?{gitCommonDir:!0,path:await is(F.resolve(e,t))}:{gitCommonDir:!1,path:await is(e)}}function rs(e){let t=q(`git`,[`rev-parse`,`--git-common-dir`],{cwd:e,encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]});if(t.status===0)return t.stdout.trim()||void 0}async function is(e){return Ee(e).catch(()=>F.resolve(e))}function as(e,t){return e.platform===t.platform&&e.repository===t.repository}function os(e,t){let n={...e};return t===`desktop`?delete n.COREFRAME_PLATFORM:t===`web`||t===`webext`?n.COREFRAME_PLATFORM=`web`:n.COREFRAME_PLATFORM=t,n}const ss=K.platform===`win32`?`portless.cmd`:`portless`,cs=RegExp(`\x1B\\[[0-?]*[ -/]*[@-~]`,`g`),ls=/^Proxy is already running on port \d+\.$/,us=/^To restart: portless proxy stop(?: (?:-p|--port) \d+)? && portless proxy start(?: (?:-p|--port) \d+)?$/;function ds(e){let t=e.split(/(\r\n|\n)/),n=[];for(let e=0;e<t.length;){let r=t[e],i=t[e+2];if(r!==void 0&&i!==void 0&&ls.test(r.replace(cs,``).trim())&&us.test(i.replace(cs,``).trim())){e+=t[e+3]===void 0?3:4;continue}n.push(t[e]??``),e+=1}return n.join(``)}function fs(e){let t=ds(e);t&&K.stdout.write(t.endsWith(`
19
+ `)?t:`${t}\n`)}async function ps({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||t.TAURI_ENV_PLATFORM!==void 0||(await Yt()).isAgent?!1:Ft(e)}async function ms({cwd:e,env:t,lan:n=!1}){let r=F.join(`node_modules`,`.bin`,ss),i=[`proxy`,`start`,...n?[`--lan`]:[]];try{let{stdout:n}=await B(F.resolve(e,r),i,{cwd:e,env:t,stdin:`inherit`,stdout:`pipe`,stderr:`inherit`});fs(n)}catch(e){throw typeof e==`object`&&e&&`stdout`in e&&typeof e.stdout==`string`&&fs(e.stdout),e}}function hs({host:e,lan:t=!1,port:n}){return[...t?[`--lan`]:[],`run`,...n===void 0?[]:[`--app-port`,String(n)],`react-router`,`dev`,...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e]]}async function gs({cwd:e=K.cwd(),platform:t}){let n=await _s({cwd:e});if(!n||!Es(n.platform)||!Ds(n.platform,t)||!ks(n.owner.pid))return;let r=await Ro({cwd:e,platform:n.platform});if(!(!r||!As(n.owner,r))&&!(n.postgres?.pid!==void 0&&!ks(n.postgres.pid)))return n}async function _s({cwd:e=K.cwd()}={}){let t;try{t=JSON.parse(await U(bs(e),`utf8`))}catch{return}return xs(t)&&t.cwd===F.resolve(e)?t:void 0}async function vs({cwd:e=K.cwd(),owner:t,platform:n,postgres:r,vitePort:i}){let a=bs(e),o=F.dirname(a),s=`${a}.${ze()}.tmp`,c={cwd:F.resolve(e),owner:t,platform:n,...r?{postgres:r}:void 0,version:1,vite:{port:i}};await H(o,{recursive:!0});try{await G(s,`${JSON.stringify(c)}\n`,{flag:`wx`,mode:384}),await De(s,a)}finally{await ke(s).catch(()=>void 0)}}async function ys({cwd:e=K.cwd(),owner:t}){let n=bs(e),r=await _s({cwd:e});!r||!As(r.owner,t)||await ke(n).catch(()=>void 0)}function bs(e){return F.resolve(e,`.coreframe/dev.session.json`)}function xs(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.version===1&&typeof t.cwd==`string`&&Ss(t.owner)&&ws(t.platform)&&Os(t.vite?.port)&&(t.postgres===void 0||Cs(t.postgres))}function Ss(e){if(!e||typeof e!=`object`)return!1;let t=e,n=t.pid;return typeof n==`number`&&Number.isSafeInteger(n)&&n>0&&typeof t.token==`string`}function Cs(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.dataDir==`string`&&(t.pid===void 0||Number.isSafeInteger(t.pid)&&t.pid>0)}function ws(e){return e===`android`||e===`desktop`||e===`ios`||e===`macos`||e===`web`}function Ts(e){return e===`android`||e===`ios`||e===`macos`}function Es(e){return e===`web`||Ts(e)}function Ds(e,t){return t===void 0?Ts(e):e===t}function Os(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>0&&e<=65535}function ks(e){try{return K.kill(e,0),!0}catch(e){return e instanceof Error&&e.code===`EPERM`}}function As(e,t){return e.pid===t.pid&&e.token===t.token}const js=K.platform===`win32`?`pnpm.cmd`:`pnpm`,Ms=K.platform===`win32`?`portless.cmd`:`portless`,Ns=K.platform===`win32`?`react-router.cmd`:`react-router`;async function Ps({cwd:e=K.cwd(),debug:t,device:n,env:r=K.env,flutterDebug:i=!1,flutterOutput:a=`filtered`,host:o,https:s=!1,interactive:c=K.stdin.isTTY===!0,lan:l=!1,managed:u=!1,noManaged:d=!1,platform:f=`web`,portless:p,fresh:m=!1,reuseVite:h=!1,verbose:g=!1,webPort:_,supervisor:v}){let y=jt({env:r}),b=Bs(f)?f:void 0,x=Ao(i);if(i&&b===void 0)throw Error(`The --flutter-debug option is only supported for Flutter development platforms (iOS, Android, and macOS).`);let S=Vs(f),C=f===`ios`||f===`android`?f:void 0,w=C?await $a({env:r,interactive:c,platform:C,target:n}):void 0;C&&w&&jo({device:w,mode:x,platform:C});let T=C&&w?await eo({device:w,host:o,interactive:c,platform:C}):void 0,E=b?!0:o,D=await y.measure(`config`,()=>Ie({cwd:e})),ee=await y.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(u||c&&!d)&&await Pt(e));await y.measure(`i18n`,()=>qn({cwd:e,projectConfig:D}));let O=await y.measure(`routing`,async()=>p??await ps({cwd:e,env:r,platform:f})),te=await y.measure(`https`,async()=>s&&!O?It({cwd:e}):void 0),ne=os(r,f),k={...ne,...y.environment,...ee?{[Ht]:`1`,[Ut]:`1`}:void 0,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...b?{COREFRAME_PLATFORM:b,[Wt]:F.resolve(e,`.coreframe`,`managed-dev-flutter-restart`)}:void 0,...te?{[Mt]:te.cert,[Nt]:te.key}:void 0},A=!1,re,ie,j,M,oe,N,se,P,ce=new Promise(e=>{P=e}),I=new Map,le=[`postgres`,`sqlite`,S];for(let e of le){let t=e===`postgres`||e===`sqlite`?e:e.startsWith(`vite:flutter`)?`flutter`:`web`,n=X({label:t}),r=X({color:`red`,label:t});n.pipe(K.stdout,{end:!1}),r.pipe(K.stderr,{end:!1}),I.set(e,{stderr:r,stdout:n})}let L=v.onEvent(e=>{e.event===`log`?(I.get(e.resource)?.[e.stream])?.write(e.data):e.event===`service`&&e.resource===S&&(e.state===`failed`||e.state===`stopped`)&&(e.state===`failed`&&(se=Error(e.error??`${S} development failed.`)),R())}),R=()=>{A||(A=!0,P(),j?.kill(`SIGTERM`),ie?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0))},z=e=>{re??=e,R()},ue=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>z(e);return K.on(e,t),{handler:t,signal:e}}),B=async e=>{let t=Gt(e);j=t;try{await t.expectSuccess()}catch(e){if(!A)throw e}finally{j===t&&(j=void 0)}};try{if(await v.subscribe(le),zs(D)){let e=await v.acquirePostgres({config:D,env:k});M=e.leaseId,k={...k,...e.env}}if(D.database?.dialect===`sqlite`){let e=await v.acquireSqlite({config:D,env:k});oe=e.leaseId,k={...k,...e.env}}(zs(D)||D.database?.dialect===`sqlite`)&&await y.measure(`schema`,()=>B({name:`db`,command:js,args:[`db`,`ensure`],cwd:e,env:k,prefix:!1}));let t=Rs(_??r.COREFRAME_WEB_PORT),n=await v.status(),i=n.resources?.find(e=>e.resource===S),o=i!==void 0&&!m&&t===void 0?void 0:t??(h?5173:await Ga.getAvailablePort()),u=o??i?.endpoint?.port??5173;if(o!==void 0&&n.resources?.some(e=>e.resource!==S&&e.endpoint?.port===u)){if(t!==void 0)throw Error(`Port ${u} is already used by another Coreframe development shell.`);u=await Ga.getAvailablePort()}if(!h){let t={...k,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[k.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:F.join(e,`node_modules`,`.bin`)+F.delimiter+(k.PATH??``)},n=[{args:O?hs({host:E,lan:l,port:u}):[`dev`,...E===void 0?[]:[`--host`,E===!0?`0.0.0.0`:E],`--port`,String(u),...f===`web`||b?[`--strictPort`]:[]],command:O?Ms:Ns,cwd:e,env:t},{args:[`exec`,`panda`,`dev`,`--no-color`],command:js,cwd:e,env:k}],r=await v.acquireVite({configFingerprint:Ls({cwd:e,host:E,lan:l,https:s,portless:O,resource:S}),endpoint:{host:E===!0?`0.0.0.0`:E??`127.0.0.1`,port:u},processes:n,resource:S},m);N=r.leaseId,u=r.endpoint.port}if(y.report(),A)return;if(f===`web`?await Promise.race([Is(v,S,()=>se),ce]):(await ae({cwd:e}),await Fs({cwd:e,env:ne,interactive:c,mobileHost:T,platform:f,port:u,requestStop:R,selectedDevice:w,mode:x,output:a,flutterRestartFile:k[Wt],handleShutdown:z,isStopping:()=>A,setActiveNative:e=>{ie=e},verbose:g})),se)throw se}finally{R(),N&&await v.release(N).catch(()=>void 0),M&&await v.release(M).catch(()=>void 0),oe&&await v.release(oe).catch(()=>void 0),L();for(let{handler:e,signal:t}of ue)K.off(t,e);for(let e of I.values())e.stdout.end(),e.stderr.end();re&&(K.exitCode??=re===`SIGINT`?130:143),v.close()}}async function Fs({cwd:e,env:t,interactive:n,mobileHost:r,platform:i,port:a,requestStop:o,selectedDevice:s,mode:c,output:l,flutterRestartFile:u,handleShutdown:d,isStopping:f,setActiveNative:p,verbose:m}){let h,g=!1,_=()=>{g||f()||!h||(g=!0,t.CI!==`true`&&K.stdout.write(`
20
20
  Restarting Flutter process...
21
- `),_.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0))}});try{if(await Promise.all([_,h?.capture(_)]),!m||d())return}catch(e){if(m&&!d())continue;if(d()||i===`desktop`||!n)throw e;let t=await V.confirm({initialValue:!0,message:`Flutter failed. Retry?`});if(V.isCancel(t)||!t){o();return}}finally{v(),f(void 0)}}}async function Ns(e,t,n){await e.waitForServiceExit(t);let r=n();if(r)throw r}function Ps({cwd:e,host:t,lan:n,https:r,portless:i,resource:a}){return Re(`sha256`).update(JSON.stringify({cwd:F.resolve(e),host:t??null,lan:n,https:r,portless:i,resource:a})).digest(`hex`)}function Fs(e){if(e===void 0)return;let t=Number(e);if(!Number.isInteger(t)||t<=0||t>65535)throw Error(`COREFRAME_WEB_PORT must be a valid TCP port.`);return t}function Is(e){return(e.database?.dialect??`postgres`)===`postgres`}function Ls(e){return e===`android`||e===`ios`||e===`macos`}function Rs(e){if(e===`web`)return`vite:web`;if(Ls(e))return`vite:flutter:${e}`;throw Error(`Unsupported supervised development platform: ${e}.`)}function zs(e,t,n){let r=t??(e===`android`?`10.0.2.2`:`127.0.0.1`);return`http://${r.includes(`:`)&&!r.startsWith(`[`)?`[${r}]`:r}:${n}`}const Bs=`extension:dev`;function Vs(e){if(!J(L(e,`src-webext/wxt.config.ts`)))throw Error("No WXT configuration found at src-webext/wxt.config.ts. Apply the wxt recipe or add that convention before running `coreframe dev webext`.");let t=L(e,`package.json`),n;try{n=JSON.parse(Y(t,`utf8`))}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}if(!n||typeof n!=`object`||!(`scripts`in n)||!n.scripts||typeof n.scripts!=`object`||!(`extension:dev`in n.scripts)||typeof n.scripts[`extension:dev`]!=`string`)throw Error(`package.json must define scripts.${Bs} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function Hs({host:e,port:t}){let n=[...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e],...t===void 0?[]:[`--port`,String(t)]];return[`run`,Bs,...n.length>0?[`--`,...n]:[]]}const Us=[`web`,`webext`,`desktop`,`ios`,`android`,`macos`],Ws=[`managed-dev-overlay`],Gs=F.resolve(`node_modules`,`.bin`),Ks=K.platform===`win32`?`pnpm.cmd`:`pnpm`,qs=K.platform===`win32`?`portless.cmd`:`portless`,Js=K.platform===`win32`?`react-router.cmd`:`react-router`;async function Ys({cwd:e=K.cwd(),debug:t,device:n,env:r=K.env,flutterDebug:i=!1,flutterOutput:a=`filtered`,host:o,https:s=!1,interactive:c=K.stdin.isTTY===!0,lan:l=!1,managed:u=!1,noManaged:d=!1,platform:f=`web`,fresh:p=!1,reuseVite:m=!1,supervisor:h,verbose:g=!1,webPort:_}={}){let v=At({env:r}),y=r.PATH??r.Path??``,b=f===`ios`||f===`android`||f===`macos`?f:void 0,x=Do(i),S=f===`web`||b!==void 0;if(p&&m)throw Error(`Cannot use --fresh and --reuse-vite together.`);let C=!p&&(b||f===`web`)?await v.measure(`dev-session`,()=>ps({cwd:e,platform:f})):void 0,w=m||C!==void 0,T=f===`desktop`?void 0:oc(_??r.COREFRAME_WEB_PORT);if(C&&T!==void 0&&T!==C.vite.port)throw Error(`The active development session uses port ${C.vite.port}. Omit --port or use that port when reusing it.`);let E,D,ee,O,te,ne,k,A,ie,j,M=!1,oe,N=r,P,ce;if(u&&d)throw Error(`Cannot use --managed and --no-managed together.`);if(t===`managed-dev-overlay`&&u)throw Error(`Cannot use --managed with --debug managed-dev-overlay.`);if(i&&b===void 0)throw Error(`The --flutter-debug option is only supported for Flutter development platforms (iOS, Android, and macOS).`);if(a===`full`&&b===void 0)throw Error(`The --flutter-output option is only supported for Flutter development platforms (iOS, Android, and macOS).`);if(m&&b===void 0)throw Error(`The --reuse-vite option is only supported for Flutter development platforms (iOS, Android, and macOS).`);if(f===`webext`){if(u||d||t!==void 0||g)throw Error(`Managed development, debug features, and verbose native output are only supported for the main web or native development platforms.`);Vs(e)}if(s&&f!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(n!==void 0&&f!==`ios`&&f!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);if(f===`web`&&r.TAURI_ENV_PLATFORM!==void 0&&r.COREFRAME_TAURI_DEV!==`1`)throw Error("Direct Tauri development is not supported. Run `pnpm dev desktop` instead.");let I=await v.measure(`routing`,()=>us({cwd:e,env:r,platform:f}));if(I&&await v.measure(`portless`,()=>ds({cwd:e,env:r,lan:l})),S&&r.COREFRAME_DEV_SUPERVISOR!==`0`){let v=h??await kt({cwd:e,env:r});if(v)return js({cwd:e,debug:t,device:n,env:r,flutterDebug:i,flutterOutput:a,fresh:p,host:o,https:s,interactive:c,lan:l,managed:u,noManaged:d,platform:f,portless:I,reuseVite:m,supervisor:v,verbose:g,webPort:_})}let le=w?void 0:await v.measure(`dev-lock`,()=>Po({cwd:e,interactive:c,platform:f}));if(!w&&!le)return;let L=f===`ios`||f===`android`||f===`macos`?C?.vite.port??T??(m?5173:await Ua.getAvailablePort()):f===`web`||f===`webext`?C?.vite.port??T:void 0,R=()=>{M||(M=!0,D?.kill(`SIGTERM`),ne?.kill(`SIGTERM`),k?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),A?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),j?.close().catch(()=>void 0),ie?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),E?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),z().catch(()=>void 0))},z=()=>O?(te??=O[Symbol.asyncDispose](),te):Promise.resolve(),ue=e=>{oe??=e,R()},de=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>ue(e);return K.on(e,t),{handler:t,signal:e}}),fe=async e=>{let t=Ut(e);D=t;try{await t.expectSuccess()}catch(e){if(!M)throw e}finally{D===t&&(D=void 0)}};try{let i=f===`ios`||f===`android`?f:void 0,p=i?await Za({env:r,interactive:c,platform:i,target:n}):void 0;i&&p&&Oo({device:p,mode:x,platform:i});let m=i&&p?await Qa({device:p,host:o,interactive:c,platform:i}):void 0,h=b?!0:o,_={},S=!1,C;w||([_,S]=await Promise.all([v.measure(`config`,()=>Ie({cwd:e})),v.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(u||c&&!d)&&await Nt(e))]),await v.measure(`i18n`,()=>Gn({cwd:e,projectConfig:_})),C=f!==`webext`&&Xs(e)?await Ua.getAvailablePort():void 0);let T=w?void 0:await v.measure(`https`,async()=>s&&!I?Ft({cwd:e}):void 0),D=rs(r,f);N={...D,...v.environment,...S?{[Vt]:`1`}:void 0,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...f===`desktop`?{COREFRAME_TAURI_DEV:`1`,TAURI_ENV_PLATFORM:ic()}:void 0,...b?{COREFRAME_PLATFORM:b}:void 0,...T?{[jt]:T.cert,[Mt]:T.key}:void 0,...C?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${C}`}:void 0};let te=async()=>{if(!C)return;let t,n=async(e,n)=>{try{await e,M||t?.fail(Error(`The dashboard development server stopped unexpectedly.`))}catch(e){M||t?.fail(e)}finally{await n.outputTasks,n.stdout.end(),n.stderr.end(),await Promise.allSettled([Bt(n.stdout),Bt(n.stderr)]),ie===e&&(ie=void 0)}};t=Ao({port:C,start:async()=>{if(M)throw Error(`The dashboard development server was stopped before it started.`);let t=await Ua.getAvailablePort();if(M)throw Error(`The dashboard development server was stopped before it started.`);let r=X({label:`dashboard`}),i=X({color:`red`,label:`dashboard`});r.pipe(K.stdout,{end:!1}),i.pipe(K.stderr,{end:!1});let a=B(Js,[`dev`,`--host`,`127.0.0.1`,`--port`,String(t)],{cwd:F.resolve(e,`dashboard`),env:{...N,PATH:F.resolve(e,`node_modules/.bin`)+F.delimiter+y},stdin:`inherit`});ie=a;let o=Promise.allSettled([Zs(a.stdout,r),Zs(a.stderr,i)]);return n(a,{outputTasks:o,stderr:i,stdout:r}),{host:`127.0.0.1`,port:t}}}),j=t;try{await t.listen(),await t.wait()}finally{await t.close(),j===t&&(j=void 0)}},oe=async()=>{let t=X({label:`web`}),n=X({color:`red`,label:`web`});t.pipe(K.stdout,{end:!1}),n.pipe(K.stderr,{end:!1}),k=B(I?qs:Js,I?fs({host:h,lan:l,port:L}):ac({host:h,port:L,strictPort:b!==void 0}),{cwd:e,env:{...N,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[N.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:Gs+F.delimiter+y},stdin:`inherit`});let r=Promise.allSettled([Zs(k.stdout,t),Zs(k.stderr,n)]);try{await k;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!M)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([Bt(t),Bt(n)]),k=void 0}},z=async()=>{let t=X({label:`webext`}),n=X({color:`red`,label:`webext`});t.pipe(K.stdout,{end:!1}),n.pipe(K.stderr,{end:!1}),A=B(Ks,Hs({host:o,port:L}),{cwd:e,env:N,stdin:`inherit`});let r=Promise.allSettled([Zs(A.stdout,t),Zs(A.stderr,n)]);try{await A;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!M)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([Bt(t),Bt(n)]),A=void 0}},de=async t=>{for(;!M;){let n=!1,i=f===`android`&&a===`filtered`&&!g?await se():void 0,o=c&&x===`profile`,s=f===`desktop`?B(Ks,nc(),{cwd:e,env:D,stdio:`inherit`}):B(`flutter`,ko({device:p??{id:`macos`},mode:x,serverUrl:rc(f,m,L),verbose:g}),{cwd:F.join(e,`src-flutter`),env:{...D,[wo]:`1`},stdio:i?[o?`pipe`:`inherit`,`pipe`,`pipe`]:o?[`pipe`,`inherit`,`inherit`]:`inherit`});E=s;let l=Eo({enabled:f!==`desktop`&&o,env:r,onInterrupt:()=>ue(`SIGINT`),onQuit:R,onRestart:()=>{n||M||(n=!0,r.CI!==`true`&&K.stdout.write(`
21
+ `),h.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0))},v=Eo(u,_);try{for(;;){g=!1;let u=i===`android`&&l===`filtered`&&!m?await se():void 0,v=n&&c===`profile`,y=B(`flutter`,Mo({device:s??{id:`macos`},mode:c,serverUrl:Hs(i,r,a),verbose:m}),{cwd:F.join(e,`src-flutter`),env:{...t,[Do]:`1`},stdio:u?[v?`pipe`:`inherit`,`pipe`,`pipe`]:v?[`pipe`,`inherit`,`inherit`]:`inherit`});p(y),h=y;let b=ko({enabled:v,env:t,onInterrupt:()=>d(`SIGINT`),onQuit:o,onRestart:_});try{if(await Promise.all([y,u?.capture(y)]),!g||f())return}catch(e){if(g&&!f())continue;if(f()||i===`desktop`||!n)throw e;let t=await V.confirm({initialValue:!0,message:`Flutter failed. Retry?`});if(V.isCancel(t)||!t){o();return}}finally{b(),p(void 0),h===y&&(h=void 0)}}}finally{(await v)()}}async function Is(e,t,n){await e.waitForServiceExit(t);let r=n();if(r)throw r}function Ls({cwd:e,host:t,lan:n,https:r,portless:i,resource:a}){return Re(`sha256`).update(JSON.stringify({cwd:F.resolve(e),host:t??null,lan:n,https:r,portless:i,resource:a})).digest(`hex`)}function Rs(e){if(e===void 0)return;let t=Number(e);if(!Number.isInteger(t)||t<=0||t>65535)throw Error(`COREFRAME_WEB_PORT must be a valid TCP port.`);return t}function zs(e){return(e.database?.dialect??`postgres`)===`postgres`}function Bs(e){return e===`android`||e===`ios`||e===`macos`}function Vs(e){if(e===`web`)return`vite:web`;if(Bs(e))return`vite:flutter:${e}`;throw Error(`Unsupported supervised development platform: ${e}.`)}function Hs(e,t,n){let r=t??(e===`android`?`10.0.2.2`:`127.0.0.1`);return`http://${r.includes(`:`)&&!r.startsWith(`[`)?`[${r}]`:r}:${n}`}const Us=`extension:dev`;function Ws(e){if(!J(L(e,`src-webext/wxt.config.ts`)))throw Error("No WXT configuration found at src-webext/wxt.config.ts. Apply the wxt recipe or add that convention before running `coreframe dev webext`.");let t=L(e,`package.json`),n;try{n=JSON.parse(Y(t,`utf8`))}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}if(!n||typeof n!=`object`||!(`scripts`in n)||!n.scripts||typeof n.scripts!=`object`||!(`extension:dev`in n.scripts)||typeof n.scripts[`extension:dev`]!=`string`)throw Error(`package.json must define scripts.${Us} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function Gs({host:e,port:t}){let n=[...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e],...t===void 0?[]:[`--port`,String(t)]];return[`run`,Us,...n.length>0?[`--`,...n]:[]]}const Ks=[`web`,`webext`,`desktop`,`ios`,`android`,`macos`],qs=[`managed-dev-overlay`],Js=F.resolve(`node_modules`,`.bin`),Ys=K.platform===`win32`?`pnpm.cmd`:`pnpm`,Xs=K.platform===`win32`?`portless.cmd`:`portless`,Zs=K.platform===`win32`?`react-router.cmd`:`react-router`;async function Qs({cwd:e=K.cwd(),debug:t,device:n,env:r=K.env,flutterDebug:i=!1,flutterOutput:a=`filtered`,host:o,https:s=!1,interactive:c=K.stdin.isTTY===!0,lan:l=!1,managed:u=!1,noManaged:d=!1,platform:f=`web`,fresh:p=!1,reuseVite:m=!1,supervisor:h,verbose:g=!1,webPort:_}={}){let v=jt({env:r}),y=r.PATH??r.Path??``,b=f===`ios`||f===`android`||f===`macos`?f:void 0,x=Ao(i),S=f===`web`||b!==void 0;if(p&&m)throw Error(`Cannot use --fresh and --reuse-vite together.`);let C=!p&&(b||f===`web`)?await v.measure(`dev-session`,()=>gs({cwd:e,platform:f})):void 0,w=m||C!==void 0,T=f===`desktop`?void 0:lc(_??r.COREFRAME_WEB_PORT);if(C&&T!==void 0&&T!==C.vite.port)throw Error(`The active development session uses port ${C.vite.port}. Omit --port or use that port when reusing it.`);let E,D,ee,O,te,ne,k,A,ie,j,M=!1,oe,N=r,P,ce;if(u&&d)throw Error(`Cannot use --managed and --no-managed together.`);if(t===`managed-dev-overlay`&&u)throw Error(`Cannot use --managed with --debug managed-dev-overlay.`);if(i&&b===void 0)throw Error(`The --flutter-debug option is only supported for Flutter development platforms (iOS, Android, and macOS).`);if(a===`full`&&b===void 0)throw Error(`The --flutter-output option is only supported for Flutter development platforms (iOS, Android, and macOS).`);if(m&&b===void 0)throw Error(`The --reuse-vite option is only supported for Flutter development platforms (iOS, Android, and macOS).`);if(f===`webext`){if(u||d||t!==void 0||g)throw Error(`Managed development, debug features, and verbose native output are only supported for the main web or native development platforms.`);Ws(e)}if(s&&f!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(n!==void 0&&f!==`ios`&&f!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);if(f===`web`&&r.TAURI_ENV_PLATFORM!==void 0&&r.COREFRAME_TAURI_DEV!==`1`)throw Error("Direct Tauri development is not supported. Run `pnpm dev desktop` instead.");let I=await v.measure(`routing`,()=>ps({cwd:e,env:r,platform:f}));if(I&&await v.measure(`portless`,()=>ms({cwd:e,env:r,lan:l})),S&&r.COREFRAME_DEV_SUPERVISOR!==`0`){let v=h??await At({cwd:e,env:r});if(v)return Ps({cwd:e,debug:t,device:n,env:r,flutterDebug:i,flutterOutput:a,fresh:p,host:o,https:s,interactive:c,lan:l,managed:u,noManaged:d,platform:f,portless:I,reuseVite:m,supervisor:v,verbose:g,webPort:_})}let le=w?void 0:await v.measure(`dev-lock`,()=>Lo({cwd:e,interactive:c,platform:f}));if(!w&&!le)return;let L=f===`ios`||f===`android`||f===`macos`?C?.vite.port??T??(m?5173:await Ga.getAvailablePort()):f===`web`||f===`webext`?C?.vite.port??T:void 0,R=()=>{M||(M=!0,D?.kill(`SIGTERM`),ne?.kill(`SIGTERM`),k?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),A?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),j?.close().catch(()=>void 0),ie?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),E?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),z().catch(()=>void 0))},z=()=>O?(te??=O[Symbol.asyncDispose](),te):Promise.resolve(),ue=e=>{oe??=e,R()},de=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>ue(e);return K.on(e,t),{handler:t,signal:e}}),fe=async e=>{let t=Gt(e);D=t;try{await t.expectSuccess()}catch(e){if(!M)throw e}finally{D===t&&(D=void 0)}};try{let i=f===`ios`||f===`android`?f:void 0,p=i?await $a({env:r,interactive:c,platform:i,target:n}):void 0;i&&p&&jo({device:p,mode:x,platform:i});let m=i&&p?await eo({device:p,host:o,interactive:c,platform:i}):void 0,h=b?!0:o,_={},S=!1,C;w||([_,S]=await Promise.all([v.measure(`config`,()=>Ie({cwd:e})),v.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(u||c&&!d)&&await Pt(e))]),await v.measure(`i18n`,()=>qn({cwd:e,projectConfig:_})),C=f!==`webext`&&$s(e)?await Ga.getAvailablePort():void 0);let T=w?void 0:await v.measure(`https`,async()=>s&&!I?It({cwd:e}):void 0),D=os(r,f);N={...D,...v.environment,...S?{[Ht]:`1`}:void 0,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...f===`desktop`?{COREFRAME_TAURI_DEV:`1`,TAURI_ENV_PLATFORM:sc()}:void 0,...b&&(S||w)?{COREFRAME_PLATFORM:b,[Wt]:F.resolve(e,`.coreframe`,`managed-dev-flutter-restart`)}:void 0,...T?{[Mt]:T.cert,[Nt]:T.key}:void 0,...C?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${C}`}:void 0};let te=async()=>{if(!C)return;let t,n=async(e,n)=>{try{await e,M||t?.fail(Error(`The dashboard development server stopped unexpectedly.`))}catch(e){M||t?.fail(e)}finally{await n.outputTasks,n.stdout.end(),n.stderr.end(),await Promise.allSettled([Vt(n.stdout),Vt(n.stderr)]),ie===e&&(ie=void 0)}};t=No({port:C,start:async()=>{if(M)throw Error(`The dashboard development server was stopped before it started.`);let t=await Ga.getAvailablePort();if(M)throw Error(`The dashboard development server was stopped before it started.`);let r=X({label:`dashboard`}),i=X({color:`red`,label:`dashboard`});r.pipe(K.stdout,{end:!1}),i.pipe(K.stderr,{end:!1});let a=B(Zs,[`dev`,`--host`,`127.0.0.1`,`--port`,String(t)],{cwd:F.resolve(e,`dashboard`),env:{...N,PATH:F.resolve(e,`node_modules/.bin`)+F.delimiter+y},stdin:`inherit`});ie=a;let o=Promise.allSettled([ec(a.stdout,r),ec(a.stderr,i)]);return n(a,{outputTasks:o,stderr:i,stdout:r}),{host:`127.0.0.1`,port:t}}}),j=t;try{await t.listen(),await t.wait()}finally{await t.close(),j===t&&(j=void 0)}},oe=async()=>{let t=X({label:`web`}),n=X({color:`red`,label:`web`});t.pipe(K.stdout,{end:!1}),n.pipe(K.stderr,{end:!1}),k=B(I?Xs:Zs,I?hs({host:h,lan:l,port:L}):cc({host:h,port:L,strictPort:b!==void 0}),{cwd:e,env:{...N,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[N.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:Js+F.delimiter+y},stdin:`inherit`});let r=Promise.allSettled([ec(k.stdout,t),ec(k.stderr,n)]);try{await k;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!M)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([Vt(t),Vt(n)]),k=void 0}},z=async()=>{let t=X({label:`webext`}),n=X({color:`red`,label:`webext`});t.pipe(K.stdout,{end:!1}),n.pipe(K.stderr,{end:!1}),A=B(Ys,Gs({host:o,port:L}),{cwd:e,env:N,stdin:`inherit`});let r=Promise.allSettled([ec(A.stdout,t),ec(A.stderr,n)]);try{await A;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!M)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([Vt(t),Vt(n)]),A=void 0}},de=async t=>{let n,i=!1,o=()=>{i||M||!n||(i=!0,r.CI!==`true`&&K.stdout.write(`
22
22
  Restarting Flutter process...
23
- `),s.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0))}});try{if(await Promise.all([s,i?.capture(s)]),!n||M)return}catch(e){if(n&&!M)continue;if(f===`desktop`||M||!c)throw e;let r=await V.confirm({initialValue:!0,message:`Flutter failed. Retry?`});if(V.isCancel(r)||!r){V.log.warn(t?`Flutter stopped. Web development is still running.`:`Flutter stopped.`),t&&await t;return}}finally{l(),E===s&&(E=void 0)}}},pe=async()=>{if(w){if(f===`web`)return;await ae({cwd:e}),await de();return}if(f===`web`){await oe();return}let t=oe().then(()=>{if(!M)throw Error(`The Vite development server stopped while ${f===`desktop`?`Tauri`:`Flutter`} was still running.`)});f!==`desktop`&&await ae({cwd:e});try{await Promise.race([t,de(t)])}finally{R(),await Promise.allSettled([t,E]),E=void 0}},me=async()=>{let t=Ut({name:`panda`,command:Ks,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:N});ne=t;try{if(await t.expectSuccess(),!M)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!M)throw e}finally{ne===t&&(ne=void 0)}},he=async()=>{if(f===`webext`){await z();return}if(w){await pe();return}let e=me(),t=pe(),n=C?te():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),M&&await t}finally{R(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}},ge=async()=>{w||!le?.owner||L===void 0||(await hs({cwd:e,owner:le.owner,platform:f,postgres:ce,vitePort:L}),P=le.owner)};if(S&&(N={...N,[Ht]:`1`}),M)return;if(f===`webext`){v.report(),await he();return}if(w){v.report(),await he();return}if(_.database?.dialect===`sqlite`&&(await v.measure(`database`,async()=>{let t=await re({config:_,cwd:e,env:r,tursoOutput:K.stdout,useSupervisorLease:!0});O=t,N={...N,...t.env}}),await v.measure(`schema`,()=>fe({name:`db`,command:Ks,args:[`db`,`ensure`],cwd:e,env:N,prefix:!1})),M))return;if(tc(_)){let t=X({label:`postgres`});t.pipe(K.stdout,{end:!1});try{let n=await v.measure(`database`,()=>ec({config:_,cwd:e,env:N,failIfRunning:!0,interactive:c,isStopping:()=>M,postgresOutput:t,takeoverApproved:le?.takeoverApproved??!1,useSupervisorLease:!0}));if(!n)return;ee=n,N=n.env,ce=await $s(n.env);try{M||await v.measure(`schema`,()=>fe({name:`db`,command:Ks,args:[`db`,`ensure`],cwd:e,env:N,prefix:!1})),M||(await ge(),v.report(),await he())}finally{await n[Symbol.asyncDispose](),ee===n&&(ee=void 0)}}finally{t.end()}return}await ge(),v.report(),await he()}finally{R(),P&&=(await gs({cwd:e,owner:P}),void 0);let t;try{await ee?.[Symbol.asyncDispose]()}catch(e){t=e}finally{await z();for(let{handler:e,signal:t}of de)K.off(t,e);oe&&(K.exitCode??=oe===`SIGINT`?130:143)}Qs(t),await le?.release()}}function Xs(e){return J(F.resolve(e,`dashboard/dashboard.config.ts`))}async function Zs(e,t){for await(let n of e)t.write(`${n}\n`)||await zt(t,`drain`)}function Qs(e){if(e)throw e}async function $s(e){let t=e.PGDATA;if(!t)return;let n=Number((await Ha.readFile(F.join(t,`postmaster.pid`),`utf8`).catch(()=>``)).split(/\r?\n/,1)[0]);return{dataDir:F.resolve(t),...Number.isSafeInteger(n)&&n>0?{pid:n}:void 0}}async function ec({interactive:e,isStopping:t,takeoverApproved:n,...r}){try{return await A(r)}catch(i){if(!(i instanceof m)||!e)throw i;if(!n){let e=await V.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${i.pid}). Stop it and start here?`});if(V.isCancel(e)||!e){V.cancel(`Keeping the existing PostgreSQL process.`);return}}return await ie(i),t()?void 0:A(r)}}function tc(e){return(e.database?.dialect??`postgres`)===`postgres`}function nc(){return[`exec`,`tauri`,`dev`,`--config`,JSON.stringify({build:{beforeDevCommand:``}})]}function rc(e,t,n){let r=t??(e===`android`?`10.0.2.2`:`127.0.0.1`);return`http://${r.includes(`:`)&&!r.startsWith(`[`)?`[${r}]`:r}:${n}`}function ic(){return K.platform===`win32`?`windows`:K.platform}function ac({host:e,port:t,strictPort:n=!1}){return[`dev`,...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e],...t===void 0?[]:[`--port`,String(t)],...n?[`--strictPort`]:[]]}function oc(e){if(e===void 0)return;let t=Number(e);if(!Number.isInteger(t)||t<=0||t>65535)throw Error(`COREFRAME_WEB_PORT must be a valid TCP port.`);return t}async function sc(e={}){let t=e.cwd??K.cwd(),n=`scripts/preview.ts`,r={},i=!0;try{await ye(F.resolve(t,n))}catch(e){if(e.code===`ENOENT`)i=!1;else throw e}if(i){let e=await Pe(n,t);if(!e.default||typeof e.default!=`object`)throw Error(`scripts/preview.ts must default-export preview hooks.`);for(let t of[`beforeBuild`,`afterBuild`])if(e.default[t]!==void 0&&typeof e.default[t]!=`function`)throw Error(`scripts/preview.ts ${t} must be a function.`);r=e.default}return Jt({...e,cwd:t},r)}const cc=`worker-configuration.d.ts`;async function lc({check:e=!1,cwd:t=process.cwd()}={}){let n=await Ie({cwd:t}),r=await rt({coreframeConfig:n,cwd:t}),i=z(t,cc),a=z(t,`.coreframe-worker-types-${ze()}.d.ts`);try{try{await B(`pnpm`,[`exec`,`wrangler`,`types`,a,`--config`,r.path,`--strict-vars=false`,`--include-runtime=false`],{cwd:t,stdio:[`ignore`,`pipe`,`pipe`]})}catch(e){throw uc(e),e}let o=dc(await U(a,`utf8`)),s=Le(r.config),c=Fe(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${fc(c)}\n`;if(e){if(await U(i,`utf8`).catch(()=>``)!==l)throw Error(`${cc} is stale. Run "coreframe worker typegen" and commit the result.`);return{changed:!1,path:i}}let u=await U(i,`utf8`).catch(()=>``);return u!==l&&await G(i,l),{changed:u!==l,path:i}}finally{await r.dispose(),await W(a,{force:!0})}}function uc(e){if(typeof e!=`object`||!e||!(`output`in e))return;let{output:t}=e;typeof t!=`string`||t===``||process.stderr.write(t.endsWith(`
24
- `)?t:`${t}\n`)}function dc(e){return e.split(/\r?\n/).filter(e=>!e.startsWith(`// Generated by Wrangler by running `)).join(`
25
- `)}function fc(e){return[`// Coreframe application string inventory declaration-merges with Wrangler's generated Env.`,`interface Env {`,...e.map(e=>` /** ${e.description.replaceAll(`*/`,`*\\/`)} */\n ${JSON.stringify(e.name)}?: string`),`}`].join(`
26
- `)}const pc=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),mc=[`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`,`react-router.config.ts`,`src/web`],hc=[`dashboard`,`node_modules/@coreframe/dashboard/dist/package/app`,`node_modules/@coreframe/dashboard/package.json`,`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`],gc=[`coreframe.config.ts`,`node_modules/@coreframe/config/dist`,`node_modules/@coreframe/config/package.json`,`node_modules/@coreframe/deploy/dist`,`node_modules/@coreframe/deploy/package.json`,`node_modules/wrangler/package.json`,`package.json`,`pnpm-lock.yaml`,`src/api`,`wrangler.jsonc`],_c=`.coreframe/typegen.json`,vc=[`web`,`dashboard`,`worker`];async function yc({checkWorker:e=!1,cwd:t=K.cwd(),runners:n={}}={}){let r=await Cc(t)??{generators:{},schemaVersion:1},i=[];return i.push(await xc({cwd:t,inputPaths:mc,name:`web`,outputPath:`.react-router`,run:()=>(n.web??Sc)(t),state:r})),i.push(await xc({cwd:t,inputPaths:hc,name:`dashboard`,outputPath:`dashboard/.react-router`,run:()=>(n.dashboard??gr)(t),state:r})),i.push(await xc({cwd:t,inputPaths:gc,name:`worker`,outputPath:`worker-configuration.d.ts`,run:()=>(n.worker??lc)({check:e,cwd:t}),state:r})),i}function bc(e){return`${{dashboard:`Dashboard route types`,web:`Web route types`,worker:`Worker types`}[e.name]} ${e.changed?`generated`:`unchanged`}.`}async function xc({cwd:e,inputPaths:t,name:n,outputPath:r,run:i,state:a}){let o=await Tc(e,t),s=await Ec(e,r),c=a.generators[n];if(s&&c?.inputFingerprint===o&&c.outputFingerprint===s)return{changed:!1,name:n,ran:!1};await i();let l=await Ec(e,r);if(!l)throw Error(`Coreframe ${n} typegen did not produce ${r}.`);return a.generators[n]={inputFingerprint:o,outputFingerprint:l},await wc(e,a),{changed:s!==l,name:n,ran:!0}}async function Sc(e){let t=K.platform===`win32`?`react-router.cmd`:`react-router`,n=K.env;await B(t,[`typegen`],{cwd:e,env:{...n,PATH:F.resolve(e,`node_modules/.bin`)+F.delimiter+(n.PATH??n.Path??``)},stdio:`inherit`})}async function Cc(e){try{let t=JSON.parse(await U(F.resolve(e,_c),`utf8`));if(!Ac(t)||t.schemaVersion!==1)return;let n={};if(!Ac(t.generators))return;for(let e of vc){let r=t.generators[e];Ac(r)&&typeof r.inputFingerprint==`string`&&typeof r.outputFingerprint==`string`&&(n[e]={inputFingerprint:r.inputFingerprint,outputFingerprint:r.outputFingerprint})}return{generators:n,schemaVersion:1}}catch{return}}async function wc(e,t){let n=F.resolve(e,_c);await H(F.dirname(n),{recursive:!0}),await G(n,`${JSON.stringify(t)}\n`,{mode:384})}async function Tc(e,t){let n=Re(`sha256`);for(let r of[...t].sort()){let t=F.resolve(e,r),i=await Oc(t);if(!i){n.update(`missing:${r}\0`);continue}if(i.isDirectory()){n.update(`directory:${r}\0`);for(let r of await Dc(t)){let i=F.join(t,r),a=F.relative(e,i).split(F.sep).join(`/`);n.update(`${a}\0`),n.update(await U(i))}continue}i.isFile()&&(n.update(`file:${r}\0`),n.update(await U(t)))}return n.digest(`hex`)}async function Ec(e,t){if(await Oc(F.resolve(e,t)))return Tc(e,[t])}async function Dc(e){let t=[];async function n(e,r){let i=await Te(e,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i)if(a.isDirectory()){if(pc.has(a.name))continue;await n(F.join(e,a.name),F.join(r,a.name))}else a.isFile()&&t.push(F.join(r,a.name))}return await n(e,``),t.sort()}async function Oc(e){try{return await Oe(e)}catch(e){if(kc(e))return;throw e}}function kc(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}function Ac(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const jc=F.resolve(`node_modules`,`.bin`);K.env.PATH=jc+F.delimiter+K.env.PATH;const Mc=K.platform===`win32`?`tsc.cmd`:`tsc`,Nc=[{name:`scripts`,path:`scripts/tsconfig.json`},{name:`shared`,path:`src/shared/tsconfig.json`},{name:`api`,path:`src/api/tsconfig.json`},{name:`worker`,path:`src/api/worker/tsconfig.json`},{name:`web`,path:`src/web/tsconfig.json`},{name:`dashboard`,path:`dashboard/tsconfig.json`}];async function Pc(){await yc({checkWorker:!0});let e=[];for(let t of Nc)try{await ye(t.path),e.push(t)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let t=e.map(e=>Ut({name:e.name,command:Mc,args:[`-p`,e.path]})),n=(await Promise.all(t.map(e=>e.wait()))).filter(e=>e.exitCode!==0);n.length>0&&(K.exitCode=n[0].exitCode)}const Fc=r(s(Ws),{displayName:`feature`,from:async e=>e}),Ic=r(s(To),{displayName:`filtered|full`,from:async e=>e}),Lc=[`Cookies and sessions are origin-scoped.`,`Exact-host passkeys may require re-registration unless a stable eligible parent RP ID was configured in advance.`,`External OAuth callbacks such as Google may need updating.`,`Database data and private backend resources are unchanged.`],Rc=n({name:`deploy`,args:{environment:u({type:s(Qe),displayName:`environment`,description:`Deploy to the staging or production environment.`}),runMigrations:i({long:`run-migrations`,description:`Run pending deploy-safe database migrations before deploying.`,defaultValue:()=>!1}),skipMigrations:i({long:`skip-migrations`,description:`Deploy without running pending deploy-safe database migrations.`,defaultValue:()=>!1}),skipPostDeployChecks:i({long:`skip-post-deploy-checks`,description:`Skip post-deploy checks after Cloudflare deployment.`,defaultValue:()=>!1}),tauriLocalPlatforms:a({long:`tauri-local-platform`,type:t(s(St)),description:`Build one Tauri release platform locally. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowName:c({long:`tauri-workflow-name`,type:l(f),description:`GitHub Actions workflow file or name for remote Tauri release builds.`}),tauriWorkflowPlatforms:a({long:`tauri-workflow-platform`,type:t(s(St)),description:`Build one Tauri release platform with GitHub Actions. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowRef:c({long:`tauri-workflow-ref`,type:l(f),description:`Git ref used when dispatching remote Tauri release builds.`}),yes:i({long:`yes`,short:`y`,description:`Approve the production deployment confirmation.`,defaultValue:()=>!1})},handler:({environment:e,runMigrations:t,skipMigrations:n,skipPostDeployChecks:r,tauriLocalPlatforms:i,tauriWorkflowName:a,tauriWorkflowPlatforms:o,tauriWorkflowRef:s,yes:c})=>Sa([e,...t?[`--run-migrations`]:[],...n?[`--skip-migrations`]:[],...r?[`--skip-post-deploy-checks`]:[],...i.flatMap(e=>[`--tauri-local-platform`,e]),...a?[`--tauri-workflow-name`,a]:[],...o.flatMap(e=>[`--tauri-workflow-platform`,e]),...s?[`--tauri-workflow-ref`,s]:[],...c?[`--yes`]:[]])}),zc=p({name:`staging`,cmds:{reassign:n({name:`reassign`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await pt();if(e){console.log(JSON.stringify({...t,notices:Lc}));return}console.log(t.url),console.error(`Staging hostname reassigned. ${Lc.join(` `)}`)}}),url:n({name:`url`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await et();console.log(e?JSON.stringify({url:t}):t)}})}}),Bc=p({name:`secrets`,cmds:{"rotate-access-token":n({name:`rotate-access-token`,args:{environment:u({type:s(Qe),displayName:`environment`,description:`Worker environment whose access JWTs should be invalidated.`}),yes:i({long:`yes`,short:`y`,description:`Confirm immediate signing-secret replacement and invalidation of outstanding access JWTs.`,defaultValue:()=>!1})},handler:async({environment:e,yes:t})=>{if(!t)throw Error(`Access-token signing-secret rotation requires --yes because it immediately invalidates outstanding access JWTs.`);await yt({environment:e}),console.log(`Rotated Coreframe access-token signing material for ${e}. Clients must remint outstanding access JWTs.`)}}),status:n({name:`status`,args:{environment:u({type:l(s(Qe)),displayName:`environment`,description:`Inspect staging, production, or both when omitted.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({environment:e,json:t})=>{let n=await tt({environment:e});console.log(t?JSON.stringify(n):Kc(n))}}),set:n({name:`set`,args:{environment:u({type:s(Qe),displayName:`environment`,description:`Worker environment to update on its next deploy.`}),name:u({type:l(f),displayName:`name`,description:`Declared Worker secret name; omit to configure known secrets.`}),bulk:i({long:`bulk`,description:`Queue known secrets from pasted or piped dotenv-formatted contents.`,defaultValue:()=>!1})},handler:async({environment:e,name:t,bulk:n})=>{if(n&&t)throw Error(`Use either a secret name or --bulk, not both.`);if(t){await ct({environment:e,name:t,value:await qc(t)}),console.log(`Queued ${t} for ${e}. Run coreframe deploy ${e} to apply.`);return}let r=await ut(),i=n?await Yc(r):await Jc(r,e);await lt({environment:e,values:i});let a=Object.keys(i).sort();console.log(a.length>0?`Queued ${a.join(`, `)} for ${e}. Run coreframe deploy ${e} to apply.`:`No ${e} Worker secret updates were queued.`)}}),discard:n({name:`discard`,args:{environment:u({type:s(Qe),displayName:`environment`,description:`Worker environment with a queued secret update.`}),name:u({type:f,displayName:`name`,description:`Declared Worker secret name.`})},handler:async({environment:e,name:t})=>{let n=await $e({environment:e,name:t});console.log(n?`Discarded the queued ${t} update for ${e}.`:`No ${t} update is queued for ${e}.`)}})}}),Vc=n({name:`typecheck`,args:{},handler:Pc}),Hc=p({name:`worker`,cmds:{typegen:n({name:`typegen`,args:{check:i({long:`check`,description:`Fail when the committed primary Worker declarations are stale.`,defaultValue:()=>!1})},handler:async({check:e})=>{let t=await lc({check:e});console.log(e?`${Zc(t.path)} is current.`:`${Zc(t.path)} ${t.changed?`generated`:`is unchanged`}.`)}})}}),Uc=n({name:`dev`,args:{debug:c({long:`debug`,type:l(Fc),description:`Launch a development feature in isolated debug mode.`}),flutterDebug:i({long:`flutter-debug`,description:`Run Flutter in debug mode instead of profile mode.`,defaultValue:()=>!1}),flutterOutput:c({long:`flutter-output`,type:Ic,description:`Choose filtered Android diagnostics (default) or full standard Flutter output.`,defaultValue:()=>`filtered`}),https:i({long:`https`,description:`Serve the web app over locally trusted HTTPS.`,defaultValue:()=>!1}),fresh:i({long:`fresh`,description:`Start a new directory-scoped development session instead of attaching to one.`,defaultValue:()=>!1}),host:c({long:`host`,type:l(f),implicitValue:`0.0.0.0`,description:`Host address for the web development server. Pass without an address to use 0.0.0.0.`}),lan:i({long:`lan`,description:`Expose the Portless development proxy to devices on the local network.`,defaultValue:()=>!1}),managed:i({long:`managed`,description:`Run managed checkout synchronization even without an interactive terminal.`,defaultValue:()=>!1}),noManaged:i({long:`no-managed`,description:`Run without managed checkout synchronization for this invocation.`,defaultValue:()=>!1}),reuseVite:i({long:`reuse-vite`,description:`Use an existing Vite development server instead of starting another one for Flutter.`,defaultValue:()=>!1}),stop:i({long:`stop`,description:`Stop the Vite development server for the selected platform.`,defaultValue:()=>!1}),platform:u({type:l(s(Us)),displayName:`platform`,description:`Development target platform. Defaults to web.`}),device:u({type:l(f),displayName:`device`,description:`Device name or ID for iOS or Android development.`}),port:c({long:`port`,type:l(o),description:`Port for the web development server.`}),verbose:i({long:`verbose`,description:`Show the full native development output.`,defaultValue:()=>!1})},handler:({debug:e,device:t,fresh:n,flutterDebug:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noManaged:l,platform:u,port:d,reuseVite:f,stop:p,verbose:m})=>p?It({cwd:K.cwd(),resource:Wc(u??`web`)}):Ys({debug:e,device:t,fresh:n,flutterDebug:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noManaged:l,platform:u??`web`,reuseVite:f,verbose:m,webPort:d})});function Wc(e){if(e===`web`)return`vite:web`;if(e===`ios`||e===`android`||e===`macos`)return`vite:flutter:${e}`;throw Error(`The --stop option is only supported for web, iOS, Android, and macOS development targets.`)}const Gc=n({name:`preview`,args:{host:c({long:`host`,type:l(f),description:`Host address for the preview server.`}),port:c({long:`port`,type:l(o),description:`Port for the preview server.`})},handler:({host:e,port:t})=>sc({host:e,port:t})});function Kc(e){if(e.entries.length===0)return`No Worker environment values are declared in coreframe.config.ts.`;let t=e.entries.map(e=>[e.name,e.kind,e.local===`override`?`override`:`built-in default`,e.deployed.staging.replaceAll(`_`,` `),e.deployed.production.replaceAll(`_`,` `)]),n=[`Name`,`Kind`,`Local`,`Staging`,`Production`],r=n.map((e,n)=>Math.max(e.length,...t.map(e=>e[n].length))),i=e=>e.map((e,t)=>e.padEnd(r[t])).join(` `).trimEnd();return[i(n),i(r.map(e=>`-`.repeat(e))),...t].join(`
27
- `)}async function qc(e){if(!K.stdin.isTTY){let e=``;for await(let t of K.stdin)e+=t.toString();return e.replace(/\r?\n$/,``)}let t=await V.password({message:`Enter the new value for ${e}`});if(V.isCancel(t))throw V.cancel(`Secret update cancelled.`),Error(`Secret update cancelled.`);return t}async function Jc(e,t){if(!K.stdin.isTTY)throw Error(`Interactive secret setup requires a terminal. Provide a secret name or use --bulk with piped dotenv contents.`);if(e.length===0)throw Error(`No Worker secrets are declared in coreframe.config.ts.`);let n={};for(let r of e){let e=r.requiredIn.includes(t),i=await V.password({message:`${r.name}: ${r.description}${e?` (required)`:` (optional; leave blank to skip)`}`,validate:n=>e&&!n?.trim()?`${r.name} is required in ${t}.`:void 0});if(V.isCancel(i))throw V.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);i.trim()&&(n[r.name]=i)}return n}async function Yc(e){if(e.length===0)throw Error(`No Worker secrets are declared in coreframe.config.ts.`);let t=K.stdin.isTTY?await V.multiline({message:`Paste dotenv-formatted Worker secrets. Press Enter twice to submit.`,validate:e=>e?.trim()?void 0:`Paste at least one dotenv entry.`}):await Xc();if(V.isCancel(t))throw V.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);let{ignoredNames:n,values:r}=it(t,e);return n.length>0&&V.log.info(`Ignored non-secret or undeclared names: ${n.join(`, `)}.`),r}async function Xc(){let e=``;for await(let t of K.stdin)e+=t.toString();return e}function Zc(e){return e.split(/[\\/]/).at(-1)??e}const Qc=n({name:`typegen`,description:`Generate Coreframe route and Worker type declarations.`,args:{},handler:async()=>{let e=await yc();for(let t of e)console.log(bc(t))}});function $c(e,{formatMessage:t,temporaryDirectory:n=Me(),write:r=e=>console.error(e)}={}){let i=al(e),a=cl(tl(e,t),i);try{let t=L(Ue(L(n,`coreframe-error-`)),`error.log`);return qe(t,`${cl(nl(e),i)}\n`,{mode:384}),r(`Error: ${a}\nFull diagnostic: ${t}`),t}catch{r(`Error: ${a}\nThe full diagnostic could not be written to the temporary directory.`);return}}function el(t,n={}){let r=typeof t==`function`?t:()=>e.run(e.binary(t),process.argv),i=!1,a=e=>{i||(i=!0,$c(e,n),process.exit(1))};process.once(`uncaughtException`,a),process.once(`unhandledRejection`,a),Promise.resolve().then(r).catch(a)}function tl(e,t){try{return t?.(e)||(e instanceof Error?e.message:String(e)).split(/\r?\n/,1)[0]||`Unknown error`}catch{return`Unknown error`}}function nl(e){try{let t=rl(e);if(!(e instanceof Error)||!il(t))return Lt(t,{customInspect:!1,depth:10});let n=typeof t.stack==`string`?t.stack:`${e.name}: ${e.message}`;return delete t.name,delete t.message,delete t.stack,`${n}${Reflect.ownKeys(t).length?`\n${Lt(t,{customInspect:!1,depth:10})}`:``}`}catch{return`The thrown value could not be inspected.`}}function rl(e,t=new WeakMap){if((typeof e!=`object`||!e)&&typeof e!=`function`)return e;let n=e,r=t.get(n);if(r)return r;if(typeof e==`function`)return`[Function${e.name?`: ${e.name}`:``}]`;let i=Array.isArray(e)?[]:{};t.set(n,i),e instanceof Error&&(i.name=e.name,i.message=e.message,i.stack=e.stack??`${e.name}: ${e.message}`);for(let r of Reflect.ownKeys(n)){if(typeof r!=`string`||r.toLowerCase()===`env`||Array.isArray(e)&&r===`length`||e instanceof Error&&(r===`name`||r===`message`||r===`stack`))continue;let a=Object.getOwnPropertyDescriptor(n,r);!a||!(`value`in a)||Object.defineProperty(i,r,{configurable:!0,enumerable:!0,value:rl(a.value,t),writable:!0})}return i}function il(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function al(e,t=new WeakSet){let n=new Set;function r(e){if((typeof e!=`object`||!e)&&typeof e!=`function`)return;let i=e;if(!t.has(i)){t.add(i);for(let e of Reflect.ownKeys(i)){if(typeof e!=`string`)continue;let t=Object.getOwnPropertyDescriptor(i,e);!t||!(`value`in t)||(e.toLowerCase()===`env`?ol(t.value,n):r(t.value))}}}try{r(e)}catch{}return n}function ol(e,t){if(!(typeof e!=`object`||!e))for(let n of Reflect.ownKeys(e)){let r=Object.getOwnPropertyDescriptor(e,n);typeof n==`string`&&sl(n)&&r&&`value`in r&&typeof r.value==`string`&&r.value&&t.add(r.value)}}function sl(e){return/(?:^|_)(?:AUTH|CERT|COOKIE|CREDENTIALS?|DATABASE_URL|DSN|KEY|PASS(?:WORD)?|PRIVATE|SECRET|SESSION|TOKEN)(?:_|$)/i.test(e)}function cl(e,t){return[...t].sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[redacted environment value]`),e)}const ll=p({name:`coreframe`,cmds:{build:on,dashboard:xr,assets:dr,flutter:fr,i18n:pr,deploy:Rc,staging:zc,secrets:Bc,typegen:Qc,typecheck:Vc,worker:Hc,dev:Uc,preview:Gc,upgrade:va,recipes:ya,db:ba}});import.meta.main&&el(ll,{formatMessage:process.argv[2]===`db`?S:void 0});export{ll as coreframeCli};
23
+ `),n.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0))},s=Eo(N[Wt],o);try{for(;!M;){i=!1;let s=f===`android`&&a===`filtered`&&!g?await se():void 0,l=c&&x===`profile`,u=f===`desktop`?B(Ys,ac(),{cwd:e,env:D,stdio:`inherit`}):B(`flutter`,Mo({device:p??{id:`macos`},mode:x,serverUrl:oc(f,m,L),verbose:g}),{cwd:F.join(e,`src-flutter`),env:{...D,[Do]:`1`},stdio:s?[l?`pipe`:`inherit`,`pipe`,`pipe`]:l?[`pipe`,`inherit`,`inherit`]:`inherit`});E=u,n=u;let d=ko({enabled:f!==`desktop`&&l,env:r,onInterrupt:()=>ue(`SIGINT`),onQuit:R,onRestart:o});try{if(await Promise.all([u,s?.capture(u)]),!i||M)return}catch(e){if(i&&!M)continue;if(f===`desktop`||M||!c)throw e;let n=await V.confirm({initialValue:!0,message:`Flutter failed. Retry?`});if(V.isCancel(n)||!n){V.log.warn(t?`Flutter stopped. Web development is still running.`:`Flutter stopped.`),t&&await t;return}}finally{d(),E===u&&(E=void 0),n===u&&(n=void 0)}}}finally{(await s)()}},pe=async()=>{if(w){if(f===`web`)return;await ae({cwd:e}),await de();return}if(f===`web`){await oe();return}let t=oe().then(()=>{if(!M)throw Error(`The Vite development server stopped while ${f===`desktop`?`Tauri`:`Flutter`} was still running.`)});f!==`desktop`&&await ae({cwd:e});try{await Promise.race([t,de(t)])}finally{R(),await Promise.allSettled([t,E]),E=void 0}},me=async()=>{let t=Gt({name:`panda`,command:Ys,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:N});ne=t;try{if(await t.expectSuccess(),!M)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!M)throw e}finally{ne===t&&(ne=void 0)}},he=async()=>{if(f===`webext`){await z();return}if(w){await pe();return}let e=me(),t=pe(),n=C?te():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),M&&await t}finally{R(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}},ge=async()=>{w||!le?.owner||L===void 0||(await vs({cwd:e,owner:le.owner,platform:f,postgres:ce,vitePort:L}),P=le.owner)};if(S&&(N={...N,[Ut]:`1`}),M)return;if(f===`webext`){v.report(),await he();return}if(w){v.report(),await he();return}if(_.database?.dialect===`sqlite`&&(await v.measure(`database`,async()=>{let t=await re({config:_,cwd:e,env:r,tursoOutput:K.stdout,useSupervisorLease:!0});O=t,N={...N,...t.env}}),await v.measure(`schema`,()=>fe({name:`db`,command:Ys,args:[`db`,`ensure`],cwd:e,env:N,prefix:!1})),M))return;if(ic(_)){let t=X({label:`postgres`});t.pipe(K.stdout,{end:!1});try{let n=await v.measure(`database`,()=>rc({config:_,cwd:e,env:N,failIfRunning:!0,interactive:c,isStopping:()=>M,postgresOutput:t,takeoverApproved:le?.takeoverApproved??!1,useSupervisorLease:!0}));if(!n)return;ee=n,N=n.env,ce=await nc(n.env);try{M||await v.measure(`schema`,()=>fe({name:`db`,command:Ys,args:[`db`,`ensure`],cwd:e,env:N,prefix:!1})),M||(await ge(),v.report(),await he())}finally{await n[Symbol.asyncDispose](),ee===n&&(ee=void 0)}}finally{t.end()}return}await ge(),v.report(),await he()}finally{R(),P&&=(await ys({cwd:e,owner:P}),void 0);let t;try{await ee?.[Symbol.asyncDispose]()}catch(e){t=e}finally{await z();for(let{handler:e,signal:t}of de)K.off(t,e);oe&&(K.exitCode??=oe===`SIGINT`?130:143)}tc(t),await le?.release()}}function $s(e){return J(F.resolve(e,`dashboard/dashboard.config.ts`))}async function ec(e,t){for await(let n of e)t.write(`${n}\n`)||await Bt(t,`drain`)}function tc(e){if(e)throw e}async function nc(e){let t=e.PGDATA;if(!t)return;let n=Number((await Wa.readFile(F.join(t,`postmaster.pid`),`utf8`).catch(()=>``)).split(/\r?\n/,1)[0]);return{dataDir:F.resolve(t),...Number.isSafeInteger(n)&&n>0?{pid:n}:void 0}}async function rc({interactive:e,isStopping:t,takeoverApproved:n,...r}){try{return await A(r)}catch(i){if(!(i instanceof m)||!e)throw i;if(!n){let e=await V.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${i.pid}). Stop it and start here?`});if(V.isCancel(e)||!e){V.cancel(`Keeping the existing PostgreSQL process.`);return}}return await ie(i),t()?void 0:A(r)}}function ic(e){return(e.database?.dialect??`postgres`)===`postgres`}function ac(){return[`exec`,`tauri`,`dev`,`--config`,JSON.stringify({build:{beforeDevCommand:``}})]}function oc(e,t,n){let r=t??(e===`android`?`10.0.2.2`:`127.0.0.1`);return`http://${r.includes(`:`)&&!r.startsWith(`[`)?`[${r}]`:r}:${n}`}function sc(){return K.platform===`win32`?`windows`:K.platform}function cc({host:e,port:t,strictPort:n=!1}){return[`dev`,...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e],...t===void 0?[]:[`--port`,String(t)],...n?[`--strictPort`]:[]]}function lc(e){if(e===void 0)return;let t=Number(e);if(!Number.isInteger(t)||t<=0||t>65535)throw Error(`COREFRAME_WEB_PORT must be a valid TCP port.`);return t}async function uc(e={}){let t=e.cwd??K.cwd(),n=`scripts/preview.ts`,r={},i=!0;try{await ye(F.resolve(t,n))}catch(e){if(e.code===`ENOENT`)i=!1;else throw e}if(i){let e=await Pe(n,t);if(!e.default||typeof e.default!=`object`)throw Error(`scripts/preview.ts must default-export preview hooks.`);for(let t of[`beforeBuild`,`afterBuild`])if(e.default[t]!==void 0&&typeof e.default[t]!=`function`)throw Error(`scripts/preview.ts ${t} must be a function.`);r=e.default}return Xt({...e,cwd:t},r)}const dc=`worker-configuration.d.ts`;async function fc({check:e=!1,cwd:t=process.cwd()}={}){let n=await Ie({cwd:t}),r=await it({coreframeConfig:n,cwd:t}),i=z(t,dc),a=z(t,`.coreframe-worker-types-${ze()}.d.ts`);try{try{await B(`pnpm`,[`exec`,`wrangler`,`types`,a,`--config`,r.path,`--strict-vars=false`,`--include-runtime=false`],{cwd:t,stdio:[`ignore`,`pipe`,`pipe`]})}catch(e){throw pc(e),e}let o=mc(await U(a,`utf8`)),s=Le(r.config),c=Fe(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${hc(c)}\n`;if(e){if(await U(i,`utf8`).catch(()=>``)!==l)throw Error(`${dc} is stale. Run "coreframe worker typegen" and commit the result.`);return{changed:!1,path:i}}let u=await U(i,`utf8`).catch(()=>``);return u!==l&&await G(i,l),{changed:u!==l,path:i}}finally{await r.dispose(),await W(a,{force:!0})}}function pc(e){if(typeof e!=`object`||!e||!(`output`in e))return;let{output:t}=e;typeof t!=`string`||t===``||process.stderr.write(t.endsWith(`
24
+ `)?t:`${t}\n`)}function mc(e){return e.split(/\r?\n/).filter(e=>!e.startsWith(`// Generated by Wrangler by running `)).join(`
25
+ `)}function hc(e){return[`// Coreframe application string inventory declaration-merges with Wrangler's generated Env.`,`interface Env {`,...e.map(e=>` /** ${e.description.replaceAll(`*/`,`*\\/`)} */\n ${JSON.stringify(e.name)}?: string`),`}`].join(`
26
+ `)}const gc=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),_c=[`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`,`react-router.config.ts`,`src/web`],vc=[`dashboard`,`node_modules/@coreframe/dashboard/dist/package/app`,`node_modules/@coreframe/dashboard/package.json`,`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`],yc=[`coreframe.config.ts`,`node_modules/@coreframe/config/dist`,`node_modules/@coreframe/config/package.json`,`node_modules/@coreframe/deploy/dist`,`node_modules/@coreframe/deploy/package.json`,`node_modules/wrangler/package.json`,`package.json`,`pnpm-lock.yaml`,`src/api`,`wrangler.jsonc`],bc=`.coreframe/typegen.json`,xc=[`web`,`dashboard`,`worker`];async function Sc({checkWorker:e=!1,cwd:t=K.cwd(),runners:n={}}={}){let r=await Ec(t)??{generators:{},schemaVersion:1},i=[];return i.push(await wc({cwd:t,inputPaths:_c,name:`web`,outputPath:`.react-router`,run:()=>(n.web??Tc)(t),state:r})),i.push(await wc({cwd:t,inputPaths:vc,name:`dashboard`,outputPath:`dashboard/.react-router`,run:()=>(n.dashboard??vr)(t),state:r})),i.push(await wc({cwd:t,inputPaths:yc,name:`worker`,outputPath:`worker-configuration.d.ts`,run:()=>(n.worker??fc)({check:e,cwd:t}),state:r})),i}function Cc(e){return`${{dashboard:`Dashboard route types`,web:`Web route types`,worker:`Worker types`}[e.name]} ${e.changed?`generated`:`unchanged`}.`}async function wc({cwd:e,inputPaths:t,name:n,outputPath:r,run:i,state:a}){let o=await Oc(e,t),s=await kc(e,r),c=a.generators[n];if(s&&c?.inputFingerprint===o&&c.outputFingerprint===s)return{changed:!1,name:n,ran:!1};await i();let l=await kc(e,r);if(!l)throw Error(`Coreframe ${n} typegen did not produce ${r}.`);return a.generators[n]={inputFingerprint:o,outputFingerprint:l},await Dc(e,a),{changed:s!==l,name:n,ran:!0}}async function Tc(e){let t=K.platform===`win32`?`react-router.cmd`:`react-router`,n=K.env;await B(t,[`typegen`],{cwd:e,env:{...n,PATH:F.resolve(e,`node_modules/.bin`)+F.delimiter+(n.PATH??n.Path??``)},stdio:`inherit`})}async function Ec(e){try{let t=JSON.parse(await U(F.resolve(e,bc),`utf8`));if(!Nc(t)||t.schemaVersion!==1)return;let n={};if(!Nc(t.generators))return;for(let e of xc){let r=t.generators[e];Nc(r)&&typeof r.inputFingerprint==`string`&&typeof r.outputFingerprint==`string`&&(n[e]={inputFingerprint:r.inputFingerprint,outputFingerprint:r.outputFingerprint})}return{generators:n,schemaVersion:1}}catch{return}}async function Dc(e,t){let n=F.resolve(e,bc);await H(F.dirname(n),{recursive:!0}),await G(n,`${JSON.stringify(t)}\n`,{mode:384})}async function Oc(e,t){let n=Re(`sha256`);for(let r of[...t].sort()){let t=F.resolve(e,r),i=await jc(t);if(!i){n.update(`missing:${r}\0`);continue}if(i.isDirectory()){n.update(`directory:${r}\0`);for(let r of await Ac(t)){let i=F.join(t,r),a=F.relative(e,i).split(F.sep).join(`/`);n.update(`${a}\0`),n.update(await U(i))}continue}i.isFile()&&(n.update(`file:${r}\0`),n.update(await U(t)))}return n.digest(`hex`)}async function kc(e,t){if(await jc(F.resolve(e,t)))return Oc(e,[t])}async function Ac(e){let t=[];async function n(e,r){let i=await Te(e,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i)if(a.isDirectory()){if(gc.has(a.name))continue;await n(F.join(e,a.name),F.join(r,a.name))}else a.isFile()&&t.push(F.join(r,a.name))}return await n(e,``),t.sort()}async function jc(e){try{return await Oe(e)}catch(e){if(Mc(e))return;throw e}}function Mc(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}function Nc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Pc=F.resolve(`node_modules`,`.bin`);K.env.PATH=Pc+F.delimiter+K.env.PATH;const Fc=K.platform===`win32`?`tsc.cmd`:`tsc`,Ic=[{name:`scripts`,path:`scripts/tsconfig.json`},{name:`shared`,path:`src/shared/tsconfig.json`},{name:`api`,path:`src/api/tsconfig.json`},{name:`worker`,path:`src/api/worker/tsconfig.json`},{name:`web`,path:`src/web/tsconfig.json`},{name:`dashboard`,path:`dashboard/tsconfig.json`}];async function Lc(){await Sc({checkWorker:!0});let e=[];for(let t of Ic)try{await ye(t.path),e.push(t)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let t=e.map(e=>Gt({name:e.name,command:Fc,args:[`-p`,e.path]})),n=(await Promise.all(t.map(e=>e.wait()))).filter(e=>e.exitCode!==0);n.length>0&&(K.exitCode=n[0].exitCode)}const Rc=r(s(qs),{displayName:`feature`,from:async e=>e}),zc=r(s(Oo),{displayName:`filtered|full`,from:async e=>e}),Bc=[`Cookies and sessions are origin-scoped.`,`Exact-host passkeys may require re-registration unless a stable eligible parent RP ID was configured in advance.`,`External OAuth callbacks such as Google may need updating.`,`Database data and private backend resources are unchanged.`],Vc=n({name:`deploy`,args:{environment:u({type:s($e),displayName:`environment`,description:`Deploy to the staging or production environment.`}),runMigrations:i({long:`run-migrations`,description:`Run pending deploy-safe database migrations before deploying.`,defaultValue:()=>!1}),skipMigrations:i({long:`skip-migrations`,description:`Deploy without running pending deploy-safe database migrations.`,defaultValue:()=>!1}),skipPostDeployChecks:i({long:`skip-post-deploy-checks`,description:`Skip post-deploy checks after Cloudflare deployment.`,defaultValue:()=>!1}),tauriLocalPlatforms:a({long:`tauri-local-platform`,type:t(s(Ct)),description:`Build one Tauri release platform locally. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowName:c({long:`tauri-workflow-name`,type:l(f),description:`GitHub Actions workflow file or name for remote Tauri release builds.`}),tauriWorkflowPlatforms:a({long:`tauri-workflow-platform`,type:t(s(Ct)),description:`Build one Tauri release platform with GitHub Actions. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowRef:c({long:`tauri-workflow-ref`,type:l(f),description:`Git ref used when dispatching remote Tauri release builds.`}),yes:i({long:`yes`,short:`y`,description:`Approve the production deployment confirmation.`,defaultValue:()=>!1})},handler:({environment:e,runMigrations:t,skipMigrations:n,skipPostDeployChecks:r,tauriLocalPlatforms:i,tauriWorkflowName:a,tauriWorkflowPlatforms:o,tauriWorkflowRef:s,yes:c})=>wa([e,...t?[`--run-migrations`]:[],...n?[`--skip-migrations`]:[],...r?[`--skip-post-deploy-checks`]:[],...i.flatMap(e=>[`--tauri-local-platform`,e]),...a?[`--tauri-workflow-name`,a]:[],...o.flatMap(e=>[`--tauri-workflow-platform`,e]),...s?[`--tauri-workflow-ref`,s]:[],...c?[`--yes`]:[]])}),Hc=p({name:`staging`,cmds:{reassign:n({name:`reassign`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await mt();if(e){console.log(JSON.stringify({...t,notices:Bc}));return}console.log(t.url),console.error(`Staging hostname reassigned. ${Bc.join(` `)}`)}}),url:n({name:`url`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await tt();console.log(e?JSON.stringify({url:t}):t)}})}}),Uc=p({name:`secrets`,cmds:{"rotate-access-token":n({name:`rotate-access-token`,args:{environment:u({type:s($e),displayName:`environment`,description:`Worker environment whose access JWTs should be invalidated.`}),yes:i({long:`yes`,short:`y`,description:`Confirm immediate signing-secret replacement and invalidation of outstanding access JWTs.`,defaultValue:()=>!1})},handler:async({environment:e,yes:t})=>{if(!t)throw Error(`Access-token signing-secret rotation requires --yes because it immediately invalidates outstanding access JWTs.`);await bt({environment:e}),console.log(`Rotated Coreframe access-token signing material for ${e}. Clients must remint outstanding access JWTs.`)}}),status:n({name:`status`,args:{environment:u({type:l(s($e)),displayName:`environment`,description:`Inspect staging, production, or both when omitted.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({environment:e,json:t})=>{let n=await nt({environment:e});console.log(t?JSON.stringify(n):Yc(n))}}),set:n({name:`set`,args:{environment:u({type:s($e),displayName:`environment`,description:`Worker environment to update on its next deploy.`}),name:u({type:l(f),displayName:`name`,description:`Declared Worker secret name; omit to configure known secrets.`}),bulk:i({long:`bulk`,description:`Queue known secrets from pasted or piped dotenv-formatted contents.`,defaultValue:()=>!1})},handler:async({environment:e,name:t,bulk:n})=>{if(n&&t)throw Error(`Use either a secret name or --bulk, not both.`);if(t){await lt({environment:e,name:t,value:await Xc(t)}),console.log(`Queued ${t} for ${e}. Run coreframe deploy ${e} to apply.`);return}let r=await dt(),i=n?await Qc(r):await Zc(r,e);await ut({environment:e,values:i});let a=Object.keys(i).sort();console.log(a.length>0?`Queued ${a.join(`, `)} for ${e}. Run coreframe deploy ${e} to apply.`:`No ${e} Worker secret updates were queued.`)}}),discard:n({name:`discard`,args:{environment:u({type:s($e),displayName:`environment`,description:`Worker environment with a queued secret update.`}),name:u({type:f,displayName:`name`,description:`Declared Worker secret name.`})},handler:async({environment:e,name:t})=>{let n=await et({environment:e,name:t});console.log(n?`Discarded the queued ${t} update for ${e}.`:`No ${t} update is queued for ${e}.`)}})}}),Wc=n({name:`typecheck`,args:{},handler:Lc}),Gc=p({name:`worker`,cmds:{typegen:n({name:`typegen`,args:{check:i({long:`check`,description:`Fail when the committed primary Worker declarations are stale.`,defaultValue:()=>!1})},handler:async({check:e})=>{let t=await fc({check:e});console.log(e?`${el(t.path)} is current.`:`${el(t.path)} ${t.changed?`generated`:`is unchanged`}.`)}})}}),Kc=n({name:`dev`,args:{debug:c({long:`debug`,type:l(Rc),description:`Launch a development feature in isolated debug mode.`}),flutterDebug:i({long:`flutter-debug`,description:`Run Flutter in debug mode instead of profile mode.`,defaultValue:()=>!1}),flutterOutput:c({long:`flutter-output`,type:zc,description:`Choose filtered Android diagnostics (default) or full standard Flutter output.`,defaultValue:()=>`filtered`}),https:i({long:`https`,description:`Serve the web app over locally trusted HTTPS.`,defaultValue:()=>!1}),fresh:i({long:`fresh`,description:`Start a new directory-scoped development session instead of attaching to one.`,defaultValue:()=>!1}),host:c({long:`host`,type:l(f),implicitValue:`0.0.0.0`,description:`Host address for the web development server. Pass without an address to use 0.0.0.0.`}),lan:i({long:`lan`,description:`Expose the Portless development proxy to devices on the local network.`,defaultValue:()=>!1}),managed:i({long:`managed`,description:`Run managed checkout synchronization even without an interactive terminal.`,defaultValue:()=>!1}),noManaged:i({long:`no-managed`,description:`Run without managed checkout synchronization for this invocation.`,defaultValue:()=>!1}),reuseVite:i({long:`reuse-vite`,description:`Use an existing Vite development server instead of starting another one for Flutter.`,defaultValue:()=>!1}),stop:i({long:`stop`,description:`Stop the Vite development server for the selected platform.`,defaultValue:()=>!1}),platform:u({type:l(s(Ks)),displayName:`platform`,description:`Development target platform. Defaults to web.`}),device:u({type:l(f),displayName:`device`,description:`Device name or ID for iOS or Android development.`}),port:c({long:`port`,type:l(o),description:`Port for the web development server.`}),verbose:i({long:`verbose`,description:`Show the full native development output.`,defaultValue:()=>!1})},handler:({debug:e,device:t,fresh:n,flutterDebug:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noManaged:l,platform:u,port:d,reuseVite:f,stop:p,verbose:m})=>p?Lt({cwd:K.cwd(),resource:qc(u??`web`)}):Qs({debug:e,device:t,fresh:n,flutterDebug:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noManaged:l,platform:u??`web`,reuseVite:f,verbose:m,webPort:d})});function qc(e){if(e===`web`)return`vite:web`;if(e===`ios`||e===`android`||e===`macos`)return`vite:flutter:${e}`;throw Error(`The --stop option is only supported for web, iOS, Android, and macOS development targets.`)}const Jc=n({name:`preview`,args:{host:c({long:`host`,type:l(f),description:`Host address for the preview server.`}),port:c({long:`port`,type:l(o),description:`Port for the preview server.`})},handler:({host:e,port:t})=>uc({host:e,port:t})});function Yc(e){if(e.entries.length===0)return`No Worker environment values are declared in coreframe.config.ts.`;let t=e.entries.map(e=>[e.name,e.kind,e.local===`override`?`override`:`built-in default`,e.deployed.staging.replaceAll(`_`,` `),e.deployed.production.replaceAll(`_`,` `)]),n=[`Name`,`Kind`,`Local`,`Staging`,`Production`],r=n.map((e,n)=>Math.max(e.length,...t.map(e=>e[n].length))),i=e=>e.map((e,t)=>e.padEnd(r[t])).join(` `).trimEnd();return[i(n),i(r.map(e=>`-`.repeat(e))),...t].join(`
27
+ `)}async function Xc(e){if(!K.stdin.isTTY){let e=``;for await(let t of K.stdin)e+=t.toString();return e.replace(/\r?\n$/,``)}let t=await V.password({message:`Enter the new value for ${e}`});if(V.isCancel(t))throw V.cancel(`Secret update cancelled.`),Error(`Secret update cancelled.`);return t}async function Zc(e,t){if(!K.stdin.isTTY)throw Error(`Interactive secret setup requires a terminal. Provide a secret name or use --bulk with piped dotenv contents.`);if(e.length===0)throw Error(`No Worker secrets are declared in coreframe.config.ts.`);let n={};for(let r of e){let e=r.requiredIn.includes(t),i=await V.password({message:`${r.name}: ${r.description}${e?` (required)`:` (optional; leave blank to skip)`}`,validate:n=>e&&!n?.trim()?`${r.name} is required in ${t}.`:void 0});if(V.isCancel(i))throw V.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);i.trim()&&(n[r.name]=i)}return n}async function Qc(e){if(e.length===0)throw Error(`No Worker secrets are declared in coreframe.config.ts.`);let t=K.stdin.isTTY?await V.multiline({message:`Paste dotenv-formatted Worker secrets. Press Enter twice to submit.`,validate:e=>e?.trim()?void 0:`Paste at least one dotenv entry.`}):await $c();if(V.isCancel(t))throw V.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);let{ignoredNames:n,values:r}=at(t,e);return n.length>0&&V.log.info(`Ignored non-secret or undeclared names: ${n.join(`, `)}.`),r}async function $c(){let e=``;for await(let t of K.stdin)e+=t.toString();return e}function el(e){return e.split(/[\\/]/).at(-1)??e}const tl=n({name:`typegen`,description:`Generate Coreframe route and Worker type declarations.`,args:{},handler:async()=>{let e=await Sc();for(let t of e)console.log(Cc(t))}});function nl(e,{formatMessage:t,temporaryDirectory:n=Me(),write:r=e=>console.error(e)}={}){let i=cl(e),a=dl(il(e,t),i);try{let t=L(Ue(L(n,`coreframe-error-`)),`error.log`);return Je(t,`${dl(al(e),i)}\n`,{mode:384}),r(`Error: ${a}\nFull diagnostic: ${t}`),t}catch{r(`Error: ${a}\nThe full diagnostic could not be written to the temporary directory.`);return}}function rl(t,n={}){let r=typeof t==`function`?t:()=>e.run(e.binary(t),process.argv),i=!1,a=e=>{i||(i=!0,nl(e,n),process.exit(1))};process.once(`uncaughtException`,a),process.once(`unhandledRejection`,a),Promise.resolve().then(r).catch(a)}function il(e,t){try{return t?.(e)||(e instanceof Error?e.message:String(e)).split(/\r?\n/,1)[0]||`Unknown error`}catch{return`Unknown error`}}function al(e){try{let t=ol(e);if(!(e instanceof Error)||!sl(t))return Rt(t,{customInspect:!1,depth:10});let n=typeof t.stack==`string`?t.stack:`${e.name}: ${e.message}`;return delete t.name,delete t.message,delete t.stack,`${n}${Reflect.ownKeys(t).length?`\n${Rt(t,{customInspect:!1,depth:10})}`:``}`}catch{return`The thrown value could not be inspected.`}}function ol(e,t=new WeakMap){if((typeof e!=`object`||!e)&&typeof e!=`function`)return e;let n=e,r=t.get(n);if(r)return r;if(typeof e==`function`)return`[Function${e.name?`: ${e.name}`:``}]`;let i=Array.isArray(e)?[]:{};t.set(n,i),e instanceof Error&&(i.name=e.name,i.message=e.message,i.stack=e.stack??`${e.name}: ${e.message}`);for(let r of Reflect.ownKeys(n)){if(typeof r!=`string`||r.toLowerCase()===`env`||Array.isArray(e)&&r===`length`||e instanceof Error&&(r===`name`||r===`message`||r===`stack`))continue;let a=Object.getOwnPropertyDescriptor(n,r);!a||!(`value`in a)||Object.defineProperty(i,r,{configurable:!0,enumerable:!0,value:ol(a.value,t),writable:!0})}return i}function sl(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function cl(e,t=new WeakSet){let n=new Set;function r(e){if((typeof e!=`object`||!e)&&typeof e!=`function`)return;let i=e;if(!t.has(i)){t.add(i);for(let e of Reflect.ownKeys(i)){if(typeof e!=`string`)continue;let t=Object.getOwnPropertyDescriptor(i,e);!t||!(`value`in t)||(e.toLowerCase()===`env`?ll(t.value,n):r(t.value))}}}try{r(e)}catch{}return n}function ll(e,t){if(!(typeof e!=`object`||!e))for(let n of Reflect.ownKeys(e)){let r=Object.getOwnPropertyDescriptor(e,n);typeof n==`string`&&ul(n)&&r&&`value`in r&&typeof r.value==`string`&&r.value&&t.add(r.value)}}function ul(e){return/(?:^|_)(?:AUTH|CERT|COOKIE|CREDENTIALS?|DATABASE_URL|DSN|KEY|PASS(?:WORD)?|PRIVATE|SECRET|SESSION|TOKEN)(?:_|$)/i.test(e)}function dl(e,t){return[...t].sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[redacted environment value]`),e)}const fl=p({name:`coreframe`,cmds:{build:cn,dashboard:Cr,assets:pr,flutter:mr,i18n:hr,deploy:Vc,staging:Hc,secrets:Uc,typegen:tl,typecheck:Wc,worker:Gc,dev:Kc,preview:Jc,upgrade:ba,recipes:xa,db:Sa}});import.meta.main&&rl(fl,{formatMessage:process.argv[2]===`db`?S:void 0});export{fl as coreframeCli};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coreframe/scripts",
3
- "version": "0.2.15",
3
+ "version": "0.2.17",
4
4
  "description": "Coreframe project workflow CLI and automation scripts",
5
5
  "repository": {
6
6
  "type": "git",
@@ -29,14 +29,14 @@
29
29
  "procband": "^0.3.8",
30
30
  "yaml": "^2.9.0",
31
31
  "@coreframe/assets": "^0.1.9",
32
- "@coreframe/config": "^0.1.6",
33
32
  "@coreframe/db": "^0.1.7",
33
+ "@coreframe/config": "^0.1.6",
34
34
  "@coreframe/deploy": "^0.1.6",
35
- "@coreframe/dev": "^0.1.9",
36
- "@coreframe/dev-contracts": "^0.1.4",
37
- "@coreframe/flutter-tools": "^0.1.12",
35
+ "@coreframe/dev": "^0.1.10",
36
+ "@coreframe/dev-contracts": "^0.1.5",
38
37
  "@coreframe/object-storage": "^0.1.3",
39
- "@coreframe/preview": "^0.1.5"
38
+ "@coreframe/flutter-tools": "^0.1.13",
39
+ "@coreframe/preview": "^0.1.6"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/node": "^26.1.0",