@coreframe/scripts 0.2.34-next.0 → 0.2.34-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/coreframe.js +1 -0
- package/dist/coreframe.js +16 -16
- package/package.json +10 -10
package/bin/coreframe.js
CHANGED
package/dist/coreframe.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
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,restPositionals as f,string as p,subcommands as m}from"@alloc/cmd-ts";import{ProjectPostgresAlreadyRunningError as h,checkDeployMigrations as g,checkSchemaPush as _,collectDeployMigrationFiles as v,createLocalPostgresDb as ee,createProjectPostgresDatabaseAdapter as y,createProjectSqliteDatabaseAdapter as b,createProjectSqliteDrizzleDatabase as x,ensureLocalDb as S,filterPendingMigrations as C,formatDbErrorMessage as w,formatMigrationList as te,formatMigrationScanFailures as ne,migrateHeldMigrations as re,migrateLocalDb as ie,readAppliedMigrationNames as
|
|
3
|
-
`)}function
|
|
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,restPositionals as f,string as p,subcommands as m}from"@alloc/cmd-ts";import{ProjectPostgresAlreadyRunningError as h,checkDeployMigrations as g,checkSchemaPush as _,collectDeployMigrationFiles as v,createLocalPostgresDb as ee,createProjectPostgresDatabaseAdapter as y,createProjectSqliteDatabaseAdapter as b,createProjectSqliteDrizzleDatabase as x,ensureLocalDb as S,filterPendingMigrations as C,formatDbErrorMessage as w,formatMigrationList as te,formatMigrationScanFailures as ne,migrateHeldMigrations as re,migrateLocalDb as ie,readAppliedMigrationNames as T,resetLocalDb as ae,runDrizzleKitCommand as E,scanDeployMigrationFiles as oe,seedLocalDb as se,setupLocalDb as ce,startProjectPostgres as D,startProjectTurso as le,stopProjectPostgres as ue}from"@coreframe/db";import{checkFlutterClient as O,classifyFlutterDevOutputLine as de,ensureFlutterDevAssetDirectories as fe,flutterPlatforms as k,generateFlutterNativeBridge as A,prepareFlutterClient as pe,prepareFlutterDevOutput as me,productionApiOrigin as j,runFlutterAcceptance as he}from"@coreframe/flutter-tools";import M,{dirname as N,isAbsolute as ge,join as P,posix as _e,resolve as F,sep as ve}from"node:path";import I from"nano-spawn";import*as L from"@clack/prompts";import{addAsset as ye,backupAssets as be,buildAssets as xe,checkAssets as Se,printAssetResult as Ce,publishAssets as we}from"@coreframe/assets";import{assertAssetCredentialProfile as Te,configureAssetCredentials as Ee,createB2PrivateObjectStore as De}from"@coreframe/object-storage";import{access as Oe,chmod as ke,copyFile as Ae,cp as je,mkdir as R,mkdtemp as Me,readFile as z,readdir as Ne,rename as Pe,rm as B,stat as V,writeFile as H}from"node:fs/promises";import{homedir as Fe,networkInterfaces as Ie,tmpdir as Le}from"node:os";import{importProjectDependency as Re,importProjectModule as ze,normalizeWorkerEnvironment as Be,readProjectConfig as U,wranglerEnvironmentNames as Ve}from"@coreframe/config";import{createHash as He,randomUUID as W}from"node:crypto";import G from"node:process";import{chmodSync as Ue,existsSync as K,lstatSync as We,mkdirSync as Ge,mkdtempSync as Ke,readFileSync as q,readlinkSync as qe,rmSync as Je,symlinkSync as Ye,watch as Xe,writeFileSync as Ze}from"node:fs";import{finished as Qe}from"node:stream/promises";import{createPrefixStream as $e,supervise as et}from"procband";import{createConnection as tt,createServer as nt}from"node:net";import{inspectDevelopmentJobStates as rt}from"@coreframe/jobs";import{spawnSync as J}from"node:child_process";import{parse as it,stringify as at}from"yaml";import{accessTokenSigningSecretName as ot,clearAppliedPendingWorkerSecrets as st,deployEnvironments as ct,discardPendingWorkerSecret as lt,discoverStagingUrl as ut,inspectWorkerEnvironment as dt,materializeBuiltClientDeployConfig as ft,materializePrimaryWorkerConfig as pt,materializePrimaryWorkerTypeConfig as mt,parseDeclaredWorkerSecretEnv as ht,prepareAccessTokenSigningSecret as gt,queueWorkerSecret as _t,queueWorkerSecrets as vt,readDeclaredWorkerSecrets as yt,readPackageJson as bt,readPendingWorkerSecretSnapshot as xt,reassignStagingHostname as St,releaseName as Ct,resolveDeployConfig as wt,resolveReleaseVersion as Tt,rotateAccessTokenSigningSecret as Et,runAfterWorkerDeploy as Dt,runPostDeployChecks as Ot,validateWorkerEnvironmentForDeploy as kt,verifyAccessTokenSigningSecret as At,writePackageVersion as jt}from"@coreframe/deploy";import{inspect as Mt,parseEnv as Nt}from"node:util";import{once as Pt}from"node:events";import{connectDevSupervisor as Ft,createDevStartupTiming as It,devHttpsCertEnv as Lt,devHttpsKeyEnv as Rt,isManagedDevCheckout as zt,isPrimaryCheckout as Bt,prepareDevHttps as Vt}from"@coreframe/dev";import{devJobsEnv as Ht,devSessionIdEnv as Ut}from"@coreframe/dev-contracts/dev-jobs";import{managedDevEnv as Wt,managedDevFlutterRestartFileEnv as Gt}from"@coreframe/dev-contracts/managed-dev";import{openScopedLogs as Kt}from"leylines";import{setTimeout as qt}from"node:timers/promises";import{determineAgent as Jt}from"@vercel/detect-agent";import{runPreview as Yt}from"@coreframe/preview";const Xt=`FLUTTER_XCODE_COREFRAME_BUNDLE_IDENTIFIER_SUFFIX`,Zt=`COREFRAME_FLUTTER_DEVELOPMENT`,Qt=[`filtered`,`full`];function $t(e,{noCodesign:t=!1}={}){return{...e,[Xt]:`.dev`,[Zt]:`1`,...t?{FLUTTER_XCODE_CODE_SIGNING_ALLOWED:`NO`,FLUTTER_XCODE_CODE_SIGNING_REQUIRED:`NO`,FLUTTER_XCODE_CODE_SIGN_IDENTITY:``}:void 0}}function en(e=!1){return e?`debug`:`profile`}function tn({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 nn({device:e,flutterDriver:t,mode:n,serverUrl:r,verbose:i}){return[`run`,`--machine`,`--${n}`,`-d`,e.id,`--dart-define=COREFRAME_DEV_SERVER_URL=${r}`,...t?[`--dart-define=ENABLE_FLUTTER_DRIVER=true`]:[],...i?[`--verbose`]:[]]}const rn=[`web`,...k];function an(e=`web`,{apiOrigin:t,cwd:n=process.cwd(),profile:r=!1,simulator:i=!1}={}){if(fn(e,{profile:r,simulator:i}),e===`web`)return[mn(`pnpm`,[`build`],n,{COREFRAME_PLATFORM:`web`})];let a=j(t);return[{kind:`prepare`,platform:e},mn(`flutter`,on(e,a,{profile:r,simulator:i}),F(n,`src-flutter`),{COREFRAME_API_ORIGIN:a})]}function on(e,t,{noCodesign:n=e===`macos`,profile:r=!1,simulator:i=!1}={}){fn(e,{profile:r,simulator:i});let a=j(t);return[`build`,e===`android`?`apk`:e,r?`--profile`:`--release`,...i?[`--simulator`]:[],...n?[`--no-codesign`]:[],`--dart-define=COREFRAME_API_ORIGIN=${a}`]}function sn(e,{profile:t=!1}={}){let n=t?`profile`:`release`,r=F(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 cn(e,{profile:t=!1,simulator:n=!1}={}){let r=t?`profile`:`release`,i=F(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
|
-
`)}function
|
|
6
|
-
`)}function
|
|
7
|
-
`)}async function un({apiOrigin:e,cwd:t=process.cwd(),environment:n=process.env,platform:r=`web`,profile:i=!1,simulator:a=!1,prepareClient:o=pe,runCommand:s=fn}={}){dn(r,{profile:i,simulator:a});let c={...n};delete c[Yt],delete c[Xt],delete c.COREFRAME_PLATFORM,delete c.TAURI_ENV_PLATFORM;let l=r===`web`?void 0:j(e??n.COREFRAME_API_ORIGIN);for(let e of rn(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(on(t,{profile:i})):r===`ios`?console.log(sn(t,{profile:i,simulator:a})):r===`windows`?console.log(cn(t)):r===`linux`&&console.log(ln(t))}function dn(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 fn(e,t,{cwd:n,env:r}){await I(e,t,{cwd:n,env:r,stdio:`inherit`})}function pn(e,t,n,r){return{kind:`command`,command:e,args:t,cwd:n,...r===void 0?{}:{environment:r}}}const mn=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in a packaged Flutter client.`,async from(e){return j(e)}}),hn=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(nn)),displayName:`platform`,description:`Build target: web, iOS, Android, macOS, Windows, or Linux. Defaults to web.`}),apiOrigin:c({long:`api-origin`,type:l(mn),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})=>un({apiOrigin:e,platform:t,profile:n,simulator:r})}),gn=/^[a-f0-9]{64}$/,_n=/^[a-f0-9]{40}$/,vn=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function yn(e){if(!gn.test(e))throw Error(`Invalid SHA-256 digest "${e}".`);return e}function bn(e){if(!_n.test(e))throw Error(`Invalid full Git revision "${e}".`);return e}function xn(e,t){if(!vn.test(e))throw Error(`${t} must contain only letters, numbers, dots, underscores, or hyphens.`);return e}function Sn(e){return`projects/${xn(e,`Project ID`)}/i18n/v1`}function Cn(e,t){return yn(t),`${Sn(e)}/objects/sha256/${t.slice(0,2)}/${t}`}function wn(e,t){return bn(t),`${Sn(e)}/commits/${t}.json`}function Tn(e,t){return En(t),`${Sn(e)}/releases/${encodeURIComponent(t)}.json`}function En(e){if(!e.startsWith(`v`)||e.length<2||e.length>128||/\s/.test(e)||e.includes(`..`))throw Error(`Release tag "${e}" must be a valid v-prefixed tag.`);return e}function Y(e,t){if(!t||t.startsWith(`/`)||t.includes(`\0`))throw Error(`Unsafe i18n artifact path "${t}".`);let n=F(e),r=F(n,t);if(r!==n&&!r.startsWith(`${n}${ve}`))throw Error(`Unsafe i18n artifact path "${t}".`);return r}function X(e,t,n){return`${e.directory}/${t}/${n}.json`}function Dn(e,t,n){return`${e.directory}/${t}/${n}.mjs`}async function On(e){await I(`pnpm`,[`exec`,`lingui`,`extract`],{cwd:e,stdio:`inherit`})}async function kn({config:e,cwd:t,strict:n,temporaryDirectory:r}){let i=[];try{for(let n of e.locales)for(let a of e.catalogs){let o=Y(t,X(e,n,a)),s=await Pn(o),c=Object.fromEntries(Object.entries(s).filter(([,e])=>!e.obsolete)),l=P(r,`${n}-${a}.json`);await z(N(l),{recursive:!0}),await ke(o,l),i.push({path:o,backup:l}),await Fn(o,c)}await I(`pnpm`,[`exec`,`lingui`,`compile`,...n?[`--strict`]:[]],{cwd:t,stdio:`inherit`})}finally{try{for(let{path:e,backup:t}of i)await ke(t,e)}finally{for(let n of e.locales)for(let r of e.catalogs)await V(Y(t,Dn(e,n,r)),{force:!0})}}}async function An({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 Pn(Y(t,X(e,r,i)));for(let[e,t]of Object.entries(a)){if(t.obsolete||t.translation?.trim())continue;let a=t.message;if(typeof a!=`string`||!a)throw Error(`Missing source message metadata for ${r}:${e}.`);n.push({catalog:i,comments:t.comments?.filter(e=>typeof e==`string`)??[],context:t.context,id:e,locale:r,message:a,origins:t.origin?.map(([e,t])=>t?`${e}:${t}`:e)??[],placeholders:Object.keys(t.placeholders??{}).sort()})}}return n.sort((e,t)=>Bn(e).localeCompare(Bn(t)))}async function jn({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 In(await Ln({args:e.generator.args??[],command:e.generator.command,cwd:t,env:r,input:JSON.stringify(i)}))}async function Mn({config:e,cwd:t,missing:n,response:r}){let i=new Map(n.map(e=>[Bn(e),e])),a=new Map;for(let e of r.translations){let t=Bn(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 Re(`@lingui/message-utils/compileMessage`,t);for(let e of n){let t=a.get(Bn(e));Rn({compileMessage:s,id:e.id,locale:e.locale,source:e.message,translation:t})}for(let n of e.locales)if(n!==e.sourceLocale)for(let r of e.catalogs){let i=Y(t,X(e,n,r)),o=await Pn(i),s=!1;for(let[e,t]of Object.entries(o)){let i=a.get(Bn({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 Fn(i,o)}}async function Nn({config:e,cwd:t}){let n=await An({config:e,cwd:t});if(n.length>0)throw Error(`I18n catalogs remain incomplete: ${n.length} translations are missing.`);let r=await Re(`@lingui/message-utils/compileMessage`,t);for(let n of e.locales)if(n!==e.sourceLocale)for(let i of e.catalogs){let a=await Pn(Y(t,X(e,n,i)));for(let[e,t]of Object.entries(a))if(!t.obsolete){if(typeof t.message!=`string`||typeof t.translation!=`string`)throw Error(`Incomplete source metadata for active translation ${n}:${e}.`);Rn({compileMessage:r,id:e,locale:n,source:t.message,translation:t.translation})}}}async function Pn(e){let t=JSON.parse(await B(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 Fn(e,t){await z(N(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;await H(n,`${JSON.stringify(t,null,2)}\n`),await Ne(n,e)}function In(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 Ln({args:e,command:t,cwd:n,env:r,input:i}){return I(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 Rn({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=zn(a),c=zn(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 zn(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 Bn(e){return`${e.locale}\0${e.catalog}\0${e.id}`}function Vn(e){return He(`sha256`).update(e).digest(`hex`)}async function Hn(e){return Vn(await B(e))}function Un(e){return Buffer.from(`${JSON.stringify(e,null,2)}\n`)}async function Wn({bucket:e,digest:t,projectId:n,source:r,store:i}){if(yn(t),await Hn(r)!==t)throw Error(`I18n object source does not match declared SHA-256 digest ${t}.`);let a=Cn(n,t);await i.has(e,a)||await i.upload(e,a,r,`application/octet-stream`);let o=`${r}.${process.pid}.${W()}.verify`;try{if(await i.download(e,a,o),await Hn(o)!==t)throw Error(`Existing immutable i18n object ${a} failed integrity verification.`)}finally{await V(o,{force:!0})}}async function Gn({bucket:e,key:t,reference:n,store:r,temporaryDirectory:i}){let a=Un(n),o=P(i,`reference-${W()}.json`);if(await r.has(e,t))try{if(await r.download(e,t,o),!(await B(o)).equals(a))throw Error(`Immutable i18n reference ${t} already resolves to different snapshot data.`);return}finally{await V(o,{force:!0})}await H(o,a,{flag:`wx`});try{await r.upload(e,t,o,`application/json`)}finally{await V(o,{force:!0})}let s=P(i,`reference-${W()}.verify.json`);try{if(await r.download(e,t,s),!(await B(s)).equals(a))throw Error(`Uploaded immutable i18n reference ${t} failed verification.`)}finally{await V(s,{force:!0})}}async function Kn({bucket:e,manifest:t,projectId:n,store:r,temporaryDirectory:i}){let a=Un(t),o=Vn(a),s=P(i,`manifest-${o}.json`);await H(s,a,{flag:`wx`});try{await Wn({bucket:e,digest:o,projectId:n,source:s,store:r})}finally{await V(s,{force:!0})}return o}async function qn({bucket:e,key:t,store:n,temporaryDirectory:r}){if(!await n.has(e,t))return;let i=P(r,`reference-${W()}.json`);try{await n.download(e,t,i);let r=JSON.parse(await B(i,`utf8`));if(r.version!==1||typeof r.revision!=`string`||typeof r.snapshot!=`string`)throw Error(`Invalid i18n reference at ${t}.`);return bn(r.revision),yn(r.snapshot),r}finally{await V(i,{force:!0})}}async function Jn({bucket:e,projectId:t,revision:n,store:r,temporaryDirectory:i}){let a=await qn({bucket:e,key:wn(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 Yn({bucket:e,projectId:t,reference:n,store:r,tag:i,temporaryDirectory:a}){await Gn({bucket:e,key:wn(t,n.revision),reference:n,store:r,temporaryDirectory:a}),i&&await Gn({bucket:e,key:Tn(t,i),reference:n,store:r,temporaryDirectory:a})}async function Xn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:a}){yn(n);let o=P(F(t),`v1`,`sha256`,n.slice(0,2),n);if(await Qn(o,n)===!1){await z(N(o),{recursive:!0});let t=`${o}.${process.pid}.${W()}.tmp`;try{if(await i.download(e,Cn(r,n),t),await Hn(t)!==n)throw Error(`Downloaded i18n object failed SHA-256 verification: ${n}.`);await V(o,{force:!0}),await Ne(t,o)}finally{await V(t,{force:!0})}}await z(N(a),{recursive:!0});let s=`${a}.${process.pid}.${W()}.tmp`;try{if(await ke(o,s),await Hn(s)!==n)throw Error(`Cached i18n object failed SHA-256 verification: ${n}.`);await V(a,{force:!0}),await Ne(s,a)}finally{await V(s,{force:!0})}}async function Zn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,temporaryDirectory:a}){let o=P(a,`manifest-${n}.json`);await Xn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:o});let s=JSON.parse(await B(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}.`);bn(s.revision),s.baseline!==void 0&&yn(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}.`);yn(e.digest)}return s}async function Qn(e,t){try{return(await Pe(e)).isFile()&&await Hn(e)===t}catch{return!1}}async function $n({cwd:e=process.cwd(),env:t=process.env}={}){if((await U({cwd:e})).i18n){if(t.COREFRAME_I18N_RELEASE_REVISION){await nr({cwd:e,env:t,revision:t.COREFRAME_I18N_RELEASE_REVISION});return}await On(e)}}async function er({cwd:e=process.cwd(),projectConfig:t}={}){let n=t??await U({cwd:e});if(!n.i18n)return;let r=rr(n.i18n),i=Y(e,r.directory);try{if(!(await Pe(i)).isDirectory())throw Error(`I18n catalog path is not a directory: ${i}.`)}catch(t){if(t.code!==`ENOENT`)throw t;await On(e);return}for(let t of r.locales)for(let n of r.catalogs)try{if(!(await Pe(Y(e,X(r,t,n)))).isFile())throw Error(`I18n catalog path is not a file: ${t}/${n}.json.`)}catch(t){if(t.code!==`ENOENT`)throw t;await On(e);return}}async function tr({cwd:e=process.cwd(),env:t=process.env,store:n,tag:r}){En(r);let i=await ir({cwd:e,env:t,store:n});await fr(e);let a=await dr(e);await pr(e,r,a);let o=await je(P(Le(),`coreframe-i18n-prepare-`));try{let n=await Jn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,revision:a,store:i.store,temporaryDirectory:o});if(n){let e=await Zn({bucket:i.assets.sourceBucket,cacheRoot:i.cacheRoot,digest:n.snapshot,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return ur(i,e,a),await or(i,e),await Yn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,reference:n,store:i.store,tag:r,temporaryDirectory:o}),{reused:!0,snapshot:n.snapshot}}return await lr(i,o,async()=>{let n=await ar(i,a,o);n||await cr(i),await On(e);let s=await An({config:i.config,cwd:e}),c=await jn({config:i.config,cwd:e,env:t,messages:s});await Mn({config:i.config,cwd:e,missing:s,response:c}),await Nn({config:i.config,cwd:e}),await kn({config:i.config,cwd:e,strict:!0,temporaryDirectory:o});let l=await sr(i),u={...n?{baseline:n}:{},catalogs:i.config.catalogs,files:l,generator:s.length>0?i.config.generator?.id??`unconfigured`:`none`,linguiVersion:await mr(e),locales:i.config.locales,projectId:i.assets.projectId,revision:a,sourceLocale:i.config.sourceLocale,version:1},d=await Kn({bucket:i.assets.sourceBucket,manifest:u,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return await Yn({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 V(o,{force:!0,recursive:!0})}}async function nr({cwd:e=process.cwd(),env:t=process.env,revision:n,store:r}={}){let i=await U({cwd:e});if(!i.i18n)return;let a=await ir({cwd:e,env:t,store:r,projectConfig:i}),o=bn(n??await dr(e)),s=await je(P(Le(),`coreframe-i18n-materialize-`));try{let e=await Jn({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 Zn({bucket:a.assets.sourceBucket,cacheRoot:a.cacheRoot,digest:e.snapshot,projectId:a.assets.projectId,store:a.store,temporaryDirectory:s});return ur(a,t,o),await or(a,t),{revision:o,snapshot:e.snapshot}}finally{await V(s,{force:!0,recursive:!0})}}function rr(e){let t=xn(e.sourceLocale,`Source locale`),n=[...new Set(e.locales.map(e=>xn(e,`Locale`)))],r=[...new Set(e.catalogs.map(e=>xn(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 ir({cwd:e=process.cwd(),env:t=process.env,projectConfig:n,store:r}){let i=n??await U({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:F(e,`.coreframe`,`i18n`,`cache`),config:rr(i.i18n),cwd:F(e),env:t,store:r??Ee({config:a,env:t})}}async function ar(e,t,n){let{stdout:r}=await I(`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 Jn({bucket:e.assets.sourceBucket,projectId:e.assets.projectId,revision:bn(t),store:e.store,temporaryDirectory:n});if(!r)continue;let i=await Zn({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:r.snapshot,projectId:e.assets.projectId,store:e.store,temporaryDirectory:n});return ur(e,i,t),await or(e,i),r.snapshot}}async function or(e,t){for(let n of t.files)if(await Xn({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:n.digest,projectId:e.assets.projectId,store:e.store,target:Y(e.cwd,n.path)}),(await Pe(Y(e.cwd,n.path))).size!==n.size)throw Error(`Materialized i18n artifact size does not match manifest: ${n.path}.`)}async function sr(e){let t=[];for(let n of e.config.locales)for(let r of e.config.catalogs){let i=X(e.config,n,r),a=Y(e.cwd,i),o=await Hn(a);await Wn({bucket:e.assets.sourceBucket,digest:o,projectId:e.assets.projectId,source:a,store:e.store}),t.push({digest:o,path:i,size:(await Pe(a)).size})}return t.sort((e,t)=>e.path.localeCompare(t.path))}async function cr(e){let{stdout:t}=await I(`git`,[`rev-parse`,`--show-prefix`],{cwd:e.cwd,stdin:`ignore`}),n=t.trim(),{stdout:r}=await I(`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 Re(`@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 I(`git`,[`show`,`${i}:${s}`],{cwd:e.cwd,stdin:`ignore`});await Fn(Y(e.cwd,X(e.config,t,r)),a.parse(n)),o=!0}catch{}}return o}async function lr(e,t,n){let r=[];for(let n of e.config.locales)for(let i of e.config.catalogs){let a=X(e.config,n,i),o=Y(e.cwd,a);try{await De(o)}catch{continue}let s=P(t,`previous-catalogs`,a);await z(N(s),{recursive:!0}),await Ne(o,s),r.push({backup:s,path:o})}try{let e=await n();return await V(P(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 V(Y(e.cwd,X(e.config,t,n)),{force:!0});for(let{backup:e,path:t}of r)await z(N(t),{recursive:!0}),await Ne(e,t);throw t}}function ur(e,t,n){if(t.revision!==n||t.projectId!==e.assets.projectId||t.sourceLocale!==e.config.sourceLocale||JSON.stringify(t.locales)!==JSON.stringify(e.config.locales)||JSON.stringify(t.catalogs)!==JSON.stringify(e.config.catalogs))throw Error(`I18n snapshot does not match commit or project configuration.`);let r=e.config.locales.flatMap(t=>e.config.catalogs.map(n=>X(e.config,t,n))),i=t.files.map(e=>e.path);if(new Set(i).size!==i.length||JSON.stringify(i.sort())!==JSON.stringify(r.sort()))throw Error(`I18n snapshot has an incomplete or unexpected artifact set.`)}async function dr(e){let{stdout:t}=await I(`git`,[`rev-parse`,`HEAD`],{cwd:e,stdin:`ignore`});return bn(t.trim())}async function fr(e){let{stdout:t}=await I(`git`,[`status`,`--porcelain`],{cwd:e,stdin:`ignore`});if(t.trim())throw Error(`Tagged i18n preparation requires a clean Git tree.`)}async function pr(e,t,n){let{stdout:r}=await I(`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 mr(e){let{stdout:t}=await I(`pnpm`,[`exec`,`lingui`,`--version`],{cwd:e,stdin:`ignore`});return t.trim()}const hr=[`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(` `),gr=r(p,{displayName:`widths`,description:`Comma-separated responsive variant widths.`,async from(e){let t=e.split(`,`).map(e=>Number(e));if(t.length===0||t.some(e=>!Number.isInteger(e)||e<=0)||t.some((e,n)=>n>0&&e<=t[n-1]))throw Error(`Widths must be positive, unique, strictly ascending integers.`);return t}}),_r=r(p,{displayName:`profile`,async from(e){return we(e)}}),vr=r(p,{displayName:`pack`,description:`Asset pack name, such as training-videos.`,async from(e){if(!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e))throw Error(`Asset pack names must use lowercase hyphen-separated segments.`);return e}}),yr=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in the packaged Flutter client.`,async from(e){return j(e)}}),br=m({name:`assets`,cmds:{configure:n({name:`configure`,description:`Store a Backblaze B2 private build-object key in the operating system credential store. ${hr}`,args:{profile:u({type:_r,displayName:`profile`,description:`Credential profile named by coreframe.config.ts.`})},handler:async({profile:e})=>{L.note(hr,`Required B2 key access`);let t=await L.text({message:`Backblaze B2 application key ID`,validate:e=>e?.trim()?void 0:`The application key ID is required.`});if(L.isCancel(t))throw Error(`Asset credential configuration was cancelled.`);let n=await L.password({message:`Backblaze B2 application key`,validate:e=>e?void 0:`The application key is required.`});if(L.isCancel(n))throw Error(`Asset credential configuration was cancelled.`);await Te({applicationKey:n,applicationKeyId:t.trim(),profile:e}),console.log(`Stored Coreframe asset credential profile "${e}".`)}}),add:n({name:`add`,args:{file:u({type:p,displayName:`file`,description:`Source raster image, SVG, MP3, MP4, or Lottie JSON to add to the asset library.`}),id:c({long:`id`,type:p,description:`Logical asset ID, such as blog/my-post/hero.`}),alt:c({long:`alt`,type:l(p),description:`Required alt text for raster image and SVG assets.`}),pack:c({long:`pack`,type:l(vr),description:`Place the asset in a named, lazily loaded pack.`}),variantWidths:c({long:`widths`,type:l(gr),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})=>R(await ye({alt:e,file:t,id:n,pack:i,variantWidths:a}),r,{kind:`add`,assetId:n})}),backup:n({name:`backup`,description:`Back up every object in both configured asset buckets to a new Git branch.`,args:{branch:c({long:`branch`,type:p,description:`Name of the new local Git branch that will contain the backup.`})},handler:async({branch:e})=>{let t=await be({branch:e});console.log(`Backed up ${t.objects} objects (${t.bytes} bytes) to branch "${t.branch}" at ${t.commit}.`)}}),build:n({name:`build`,args:{id:c({long:`id`,type:l(p),description:`Build only one logical asset ID.`}),pack:c({long:`pack`,type:l(vr),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})=>R(await xe({id:e,pack:n}),t,{kind:`build`})}),check:n({name:`check`,args:{fix:i({long:`fix`,description:`Migrate asset state and build missing generated output when possible.`,defaultValue:()=>!1}),pack:c({long:`pack`,type:l(vr),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 Se({fix:e,pack:n});R(r,t,{kind:`check`}),r.ok||(process.exitCode=1)}}),publish:n({name:`publish`,args:{pack:c({long:`pack`,type:l(vr),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 Ce({pack:t});R(n,e,{kind:`publish`}),n.ok||(process.exitCode=1)}}),status:n({name:`status`,args:{pack:c({long:`pack`,type:l(vr),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 Se({pack:t});R(n,e,{kind:`status`}),n.ok||(process.exitCode=1)}})}}),xr=m({name:`flutter`,cmds:{acceptance:n({name:`acceptance`,description:`Run the complete packaged Flutter conformance gate on macOS.`,args:{apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:yr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e})=>he({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})=>A({check:e})}),prepare:n({name:`prepare`,description:`Build and package the React client for one Flutter platform.`,args:{platform:u({type:s(k),displayName:`platform`,description:`Flutter platform whose packaged client should be prepared.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:yr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>pe({apiOrigin:e,platform:t})}),check:n({name:`check`,description:`Reject missing, stale, modified, or incorrectly targeted Flutter assets.`,args:{platform:u({type:s(k),displayName:`platform`,description:`Flutter platform whose packaged client should be checked.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:yr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>O({apiOrigin:e,platform:t})})}}),Sr=m({name:`i18n`,cmds:{build:n({name:`build`,description:`Extract source messages or materialize an exact release catalog snapshot.`,args:{},handler:async()=>{await $n()}}),materialize:n({name:`materialize`,description:`Materialize the immutable i18n snapshot for an exact commit.`,args:{revision:c({long:`revision`,type:l(p),description:`Full commit SHA. Defaults to the checked-out commit.`})},handler:async({revision:e})=>{let t=await nr({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:p,description:`Pushed v* release tag that points to the checked-out commit.`})},handler:async({tag:e})=>{let t=await tr({tag:e});console.log(`${t.reused?`Reused`:`Published`} i18n snapshot ${t.snapshot}.`)}})}}),Cr=G.platform===`win32`?`react-router.cmd`:`react-router`,wr=G.platform===`win32`?`panda.cmd`:`panda`;async function Tr(e=G.cwd()){await Or(e),await Dr(e,[`typegen`])}async function Er(e=G.cwd(),t=G.env,n){if((t.COREFRAME_PLATFORM??`web`)!==`web`)return;let r=M.resolve(e,`.coreframe/dashboard-build`),i=M.join(r,`client`),a=M.resolve(e,`dist/client/__dashboard`);if(await V(r,{force:!0,recursive:!0}),(await U({cwd:e})).deploy?.mode===`client`){await V(a,{force:!0,recursive:!0});return}await kr(e,wr,[`build`],t),await Dr(e,[`build`,...n?[`--mode`,n]:[]],t),await V(a,{force:!0,recursive:!0}),await z(M.dirname(a),{recursive:!0}),await Ae(i,a,{recursive:!0})}async function Dr(e,t,n=G.env){await kr(e,Cr,t,n)}async function Or(e){await V(M.resolve(e,`dashboard/.react-router`),{force:!0,recursive:!0})}async function kr(e,t,n,r=G.env){await I(t,n,{cwd:M.resolve(e,`dashboard`),env:{...r,PATH:M.resolve(e,`node_modules/.bin`)+M.delimiter+(r.PATH??r.Path??``)},stdio:`inherit`})}const Z={access:De,chmod:Oe,mkdir:z,mkdtemp:je,readFile:B,readFileSync:q,rm:V,writeFile:H},Ar={getAvailablePort:Mr},jr={homedir:Fe,kill:G.kill,networkInterfaces:Ie,tmpdir:Le};async function Mr(){let e=nt();try{await new Promise((t,n)=>{e.once(`error`,n),e.listen(0,`127.0.0.1`,t)});let t=e.address();if(!t||typeof t==`string`)throw Error(`Could not allocate an available TCP port.`);return t.port}finally{e.listening&&await new Promise((t,n)=>{e.close(e=>e?n(e):t())})}}function Nr({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 Pr(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=nt(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 Pr(e,t){let n=Date.now()+1e4,r;for(;!t();)try{return await Fr(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 Fr({host:e=`127.0.0.1`,port:t}){return new Promise((n,r)=>{let i=tt({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 Ir=G.platform===`win32`?`react-router.cmd`:`react-router`;function Lr(e){return K(M.resolve(e,`dashboard/dashboard.config.ts`))}function Rr({cwd:e,env:t,port:n}){let r=t.PATH??t.Path??``,i,a,o=!1,s,c,l=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>{d()};return G.on(e,t),{handler:t,signal:e}}),u=async(e,t)=>{try{await e,o||a?.fail(Error(`The dashboard development server stopped unexpectedly.`))}catch(e){o||a?.fail(e)}finally{await t.outputTasks,t.stdout.end(),t.stderr.end(),await Promise.allSettled([Qe(t.stdout),Qe(t.stderr)]),i===e&&(i=void 0)}};a=Nr({port:n,start:async()=>{if(o)throw Error(`The dashboard development server was stopped before it started.`);let n=await Ar.getAvailablePort();if(o)throw Error(`The dashboard development server was stopped before it started.`);let a=$e({label:`dashboard`}),s=$e({color:`red`,label:`dashboard`});a.pipe(G.stdout,{end:!1}),s.pipe(G.stderr,{end:!1});let l=I(Ir,[`dev`,`--host`,`127.0.0.1`,`--port`,String(n)],{cwd:M.resolve(e,`dashboard`),env:{...t,PATH:M.resolve(e,`node_modules/.bin`)+M.delimiter+r},stdin:`inherit`});i=l;let d=Promise.allSettled([Br(l.stdout,a),Br(l.stderr,s)]);return c=u(l,{outputTasks:d,stderr:s,stdout:a}),{host:`127.0.0.1`,port:n}}});let d=async()=>s||(s=(async()=>{o=!0,await a?.close(),i?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),await c;for(let{handler:e,signal:t}of l)G.off(t,e)})(),s);return{close:d,listen:()=>a.listen(),wait:()=>a.wait()}}async function zr({cwd:e=G.cwd(),env:t=G.env,port:n}){let r=Rr({cwd:e,env:t,port:n});try{await r.listen(),await r.wait()}finally{await r.close()}}async function Br(e,t){for await(let n of e)t.write(`${n}\n`)||await new Promise(e=>t.once(`drain`,e))}const Vr=m({name:`dashboard`,cmds:{dev:n({name:`dev`,args:{port:c({long:`port`,type:o,description:`Local TCP port for the dashboard proxy.`})},handler:({port:e})=>zr({port:e})}),build:n({name:`build`,args:{mode:c({long:`mode`,type:l(p),description:`Vite environment mode used for the dashboard build.`})},handler:({mode:e})=>Er(void 0,void 0,e)}),typegen:n({name:`typegen`,args:{},handler:()=>Tr()})}});function Hr(){var e=typeof SuppressedError==`function`?SuppressedError:function(e,t){var n=Error();return n.name=`SuppressedError`,n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(t!=null){if(Object(t)!==t)throw TypeError(`using declarations can only be used with objects, functions, null, or undefined.`);if(e)var r=t[Symbol.asyncDispose||Symbol.for(`Symbol.asyncDispose`)];if(r===void 0&&(r=t[Symbol.dispose||Symbol.for(`Symbol.dispose`)],e))var i=r;if(typeof r!=`function`)throw TypeError(`Object is not disposable.`);i&&(r=function(){try{i.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,i=this.e,a=0;function o(){for(;r=n.pop();)try{if(!r.a&&a===1)return a=0,n.push(r),Promise.resolve().then(o);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(o,s)}else a|=1}catch(e){return s(e)}if(a===1)return i===t?Promise.resolve():Promise.reject(i);if(i!==t)throw i}function s(n){return i=i===t?n:new e(n,i),o()}return o()}}}async function Ur({all:e,cwd:t=process.cwd(),ids:n=[],matches:r=[],now:i=new Date}={}){let a=await Yr(t),o=await Xr(a.config,t,async e=>a.module.developmentJobs.createStateAdmin(e).list()),s=rt({jobs:a.module.developmentJobs.jobs,now:i,records:o??[]}),c=qr(s,{all:e,ids:n,matches:r},{defaultAll:!0});return{database:{dialect:a.dialect,state:o?`existing`:`missing`},jobs:s.filter(e=>c.has(e.id)),version:1}}async function Wr({all:e,breakLeases:t=!1,cwd:n=process.cwd(),dryRun:r=!1,ids:i=[],json:a=!1,matches:o=[],now:s=new Date,yes:c=!1}){let l=await Ur({all:!0,cwd:n,now:s}),u=qr(l.jobs,{all:e,ids:i,matches:o},{defaultAll:!1}),d=l.jobs.filter(e=>u.has(e.id)),f=d.filter(e=>e.lease===`active`);if(r)return{database:l.database,dryRun:!0,jobs:d.map(e=>({id:e.id,status:e.lease===`active`&&!t?`blocked-active-lease`:e.persisted?`would-reset`:`no-state`})),version:1};if(f.length>0&&!t)throw Error(`Cannot reset active development job ${ei(f.map(e=>e.id))}. Wait for the lease to expire or pass --break-leases.`);if((t||e||o.length>0||d.length>1)&&!c){if(a||!process.stdin.isTTY)throw Error(`This reset requires --yes when prompts are unavailable.`);let e=await L.confirm({message:`Reset local development state for ${d.length} job${d.length===1?``:`s`}?`});if(L.isCancel(e)||!e)throw Error(`Development job state reset was cancelled.`)}if(l.database.state===`missing`)return{database:l.database,dryRun:!1,jobs:d.map(e=>({id:e.id,status:`no-state`})),version:1};let p=await Yr(n),m=await Xr(p.config,n,async e=>p.module.developmentJobs.createStateAdmin(e).reset({breakLeases:t,jobIds:[...u],now:s}));if(!m)throw Error(`The local database disappeared before development job state was reset.`);if(m.activeLeaseIds.length>0&&!t)throw Error(`Cannot reset active development job ${ei(m.activeLeaseIds)}. Wait for the lease to expire or pass --break-leases.`);let h=new Set(m.resetIds);return{database:l.database,dryRun:!1,jobs:d.map(e=>({id:e.id,status:h.has(e.id)?`reset`:`no-state`})),version:1}}function Gr(e){let t=$r(e.database);return e.jobs.length===0?`${t}No local development jobs are configured.`:`${t}${ti([`Job`,`Status`,`Last success`,`Next eligible`,`Lease`],e.jobs.map(e=>[e.id,e.lease===`active`?`running`:e.registration===`orphaned`?`orphaned`:e.eligibility,Qr(e.lastSucceededAt),Qr(e.nextEligibleAt),e.lease===`none`?`-`:`${e.lease} until ${Qr(e.leaseUntil)}`]))}`}function Kr(e){let t=$r(e.database);return e.jobs.length===0?`${t}No local development job state matched.`:`${t}${ti([`Job`,`Result`],e.jobs.map(e=>[e.id,e.status.replaceAll(`-`,` `)]))}`}function qr(e,{all:t=!1,ids:n=[],matches:r=[]},{defaultAll:i}){if(t&&(n.length>0||r.length>0))throw Error(`Use --all or explicit job selectors, not both.`);if(!t&&n.length===0&&r.length===0){if(i)return new Set(e.map(e=>e.id));throw Error(`Select one or more jobs by ID or --match, or pass --all.`)}let a=new Set(e.map(e=>e.id)),o=n.filter(e=>!a.has(e));if(o.length>0)throw Error(`Unknown development job ${ei(o)}.`);let s=new Set(t?a:n);for(let t of r){let n=Jr(t),r=e.filter(e=>n.test(e.id));if(r.length===0)throw Error(`Development job pattern ${JSON.stringify(t)} matched no jobs.`);for(let e of r)s.add(e.id)}return s}function Jr(e){if(!e)throw Error(`Development job patterns must not be empty.`);let t=[...e].map(e=>e===`*`?`.*`:e===`?`?`.`:e.replace(/[\\^$.[\]{}()+|]/gu,`\\$&`)).join(``);return RegExp(`^${t}$`,`u`)}async function Yr(e){let t=await U({cwd:e}),n=t.jobs?.entry;if(!n)throw Error(`coreframe.config.ts must configure jobs.entry before managing development job state.`);let r=await ze(n,e);if(!r.developmentJobs||!Array.isArray(r.developmentJobs.jobs)||typeof r.developmentJobs.createStateAdmin!=`function`)throw Error(`${n} must export developmentJobs with jobs and createStateAdmin properties.`);return{config:t,dialect:t.database?.dialect??`postgres`,module:r}}async function Xr(e,t,n){try{var r=Hr();let a=e.database?.dialect??`postgres`,o=a===`sqlite`?M.resolve(t,`.coreframe/turso.db`):M.resolve(t,`.coreframe/postgres/PG_VERSION`);try{await Pe(o)}catch(e){if(ni(e)&&e.code===`ENOENT`)return;throw e}if(a===`sqlite`)try{var i=Hr();let r=await x({cwd:t,env:i.a(await ue({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Zr(n,r)}finally{r.$client.close()}}catch(e){i.e=e}finally{await i.d()}let s=await ee({cwd:t,env:r.a(await E({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Zr(n,s)}finally{await s.$client.end()}}catch(e){r.e=e}finally{await r.d()}}async function Zr(e,t){try{return await e(t)}catch(e){throw ri(e)?Error(`The local development job state table is missing. Run coreframe db migrate-local, then retry.`,{cause:e}):e}}function Qr(e){return e?.toISOString()??`-`}function $r(e){return e.state===`missing`?`Local ${e.dialect} database is missing; no database was created.\n\n`:``}function ei(e){return e.map(e=>JSON.stringify(e)).join(`, `)}function ti(e,t){let n=e.map((e,n)=>Math.max(e.length,...t.map(e=>e[n].length))),r=e=>e.map((e,t)=>e.padEnd(n[t])).join(` `).trimEnd();return[r(e),r(n.map(e=>`-`.repeat(e))),...t.map(r)].join(`
|
|
8
|
-
`)}function
|
|
9
|
-
`)}`);return{name:e,ref:n.ref}}function
|
|
10
|
-
`)}\nApply and verify ${n} before continuing.`)}}function
|
|
11
|
-
`)])),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
|
|
5
|
+
`)}function ln(e){return[`Windows release build succeeded.`,``,`The unpackaged application bundle is at ${JSON.stringify(F(e,`src-flutter/build/windows/x64/runner/Release`))}.`,`Create and sign an installer with the Windows packaging workflow for distribution.`].join(`
|
|
6
|
+
`)}function un(e){return[`Linux release build succeeded.`,``,`The application bundle is at ${JSON.stringify(F(e,`src-flutter/build/linux/x64/release/bundle`))}.`,`Package the bundle with the Linux distribution format used by your release process.`].join(`
|
|
7
|
+
`)}async function dn({apiOrigin:e,cwd:t=process.cwd(),environment:n=process.env,platform:r=`web`,profile:i=!1,simulator:a=!1,prepareClient:o=pe,runCommand:s=pn}={}){fn(r,{profile:i,simulator:a});let c={...n};delete c[Xt],delete c[Zt],delete c.COREFRAME_PLATFORM,delete c.TAURI_ENV_PLATFORM;let l=r===`web`?void 0:j(e??n.COREFRAME_API_ORIGIN);for(let e of an(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(sn(t,{profile:i})):r===`ios`?console.log(cn(t,{profile:i,simulator:a})):r===`windows`?console.log(ln(t)):r===`linux`&&console.log(un(t))}function fn(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 pn(e,t,{cwd:n,env:r}){await I(e,t,{cwd:n,env:r,stdio:`inherit`})}function mn(e,t,n,r){return{kind:`command`,command:e,args:t,cwd:n,...r===void 0?{}:{environment:r}}}const hn=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in a packaged Flutter client.`,async from(e){return j(e)}}),gn=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(rn)),displayName:`platform`,description:`Build target: web, iOS, Android, macOS, Windows, or Linux. Defaults to web.`}),apiOrigin:c({long:`api-origin`,type:l(hn),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})=>dn({apiOrigin:e,platform:t,profile:n,simulator:r})}),_n=/^[a-f0-9]{64}$/,vn=/^[a-f0-9]{40}$/,yn=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function bn(e){if(!_n.test(e))throw Error(`Invalid SHA-256 digest "${e}".`);return e}function xn(e){if(!vn.test(e))throw Error(`Invalid full Git revision "${e}".`);return e}function Sn(e,t){if(!yn.test(e))throw Error(`${t} must contain only letters, numbers, dots, underscores, or hyphens.`);return e}function Cn(e){return`projects/${Sn(e,`Project ID`)}/i18n/v1`}function wn(e,t){return bn(t),`${Cn(e)}/objects/sha256/${t.slice(0,2)}/${t}`}function Tn(e,t){return xn(t),`${Cn(e)}/commits/${t}.json`}function En(e,t){return Dn(t),`${Cn(e)}/releases/${encodeURIComponent(t)}.json`}function Dn(e){if(!e.startsWith(`v`)||e.length<2||e.length>128||/\s/.test(e)||e.includes(`..`))throw Error(`Release tag "${e}" must be a valid v-prefixed tag.`);return e}function Y(e,t){if(!t||t.startsWith(`/`)||t.includes(`\0`))throw Error(`Unsafe i18n artifact path "${t}".`);let n=F(e),r=F(n,t);if(r!==n&&!r.startsWith(`${n}${ve}`))throw Error(`Unsafe i18n artifact path "${t}".`);return r}function X(e,t,n){return`${e.directory}/${t}/${n}.json`}function On(e,t,n){return`${e.directory}/${t}/${n}.mjs`}async function kn(e){await I(`pnpm`,[`exec`,`lingui`,`extract`],{cwd:e,stdio:`inherit`})}async function An({config:e,cwd:t,strict:n,temporaryDirectory:r}){let i=[];try{for(let n of e.locales)for(let a of e.catalogs){let o=Y(t,X(e,n,a)),s=await Fn(o),c=Object.fromEntries(Object.entries(s).filter(([,e])=>!e.obsolete)),l=P(r,`${n}-${a}.json`);await R(N(l),{recursive:!0}),await Ae(o,l),i.push({path:o,backup:l}),await In(o,c)}await I(`pnpm`,[`exec`,`lingui`,`compile`,...n?[`--strict`]:[]],{cwd:t,stdio:`inherit`})}finally{try{for(let{path:e,backup:t}of i)await Ae(t,e)}finally{for(let n of e.locales)for(let r of e.catalogs)await B(Y(t,On(e,n,r)),{force:!0})}}}async function jn({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 Fn(Y(t,X(e,r,i)));for(let[e,t]of Object.entries(a)){if(t.obsolete||t.translation?.trim())continue;let a=t.message;if(typeof a!=`string`||!a)throw Error(`Missing source message metadata for ${r}:${e}.`);n.push({catalog:i,comments:t.comments?.filter(e=>typeof e==`string`)??[],context:t.context,id:e,locale:r,message:a,origins:t.origin?.map(([e,t])=>t?`${e}:${t}`:e)??[],placeholders:Object.keys(t.placeholders??{}).sort()})}}return n.sort((e,t)=>Vn(e).localeCompare(Vn(t)))}async function Mn({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 Ln(await Rn({args:e.generator.args??[],command:e.generator.command,cwd:t,env:r,input:JSON.stringify(i)}))}async function Nn({config:e,cwd:t,missing:n,response:r}){let i=new Map(n.map(e=>[Vn(e),e])),a=new Map;for(let e of r.translations){let t=Vn(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 Re(`@lingui/message-utils/compileMessage`,t);for(let e of n){let t=a.get(Vn(e));zn({compileMessage:s,id:e.id,locale:e.locale,source:e.message,translation:t})}for(let n of e.locales)if(n!==e.sourceLocale)for(let r of e.catalogs){let i=Y(t,X(e,n,r)),o=await Fn(i),s=!1;for(let[e,t]of Object.entries(o)){let i=a.get(Vn({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 In(i,o)}}async function Pn({config:e,cwd:t}){let n=await jn({config:e,cwd:t});if(n.length>0)throw Error(`I18n catalogs remain incomplete: ${n.length} translations are missing.`);let r=await Re(`@lingui/message-utils/compileMessage`,t);for(let n of e.locales)if(n!==e.sourceLocale)for(let i of e.catalogs){let a=await Fn(Y(t,X(e,n,i)));for(let[e,t]of Object.entries(a))if(!t.obsolete){if(typeof t.message!=`string`||typeof t.translation!=`string`)throw Error(`Incomplete source metadata for active translation ${n}:${e}.`);zn({compileMessage:r,id:e,locale:n,source:t.message,translation:t.translation})}}}async function Fn(e){let t=JSON.parse(await z(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 In(e,t){await R(N(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;await H(n,`${JSON.stringify(t,null,2)}\n`),await Pe(n,e)}function Ln(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 Rn({args:e,command:t,cwd:n,env:r,input:i}){return I(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 zn({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=Bn(a),c=Bn(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 Bn(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 Vn(e){return`${e.locale}\0${e.catalog}\0${e.id}`}function Hn(e){return He(`sha256`).update(e).digest(`hex`)}async function Un(e){return Hn(await z(e))}function Wn(e){return Buffer.from(`${JSON.stringify(e,null,2)}\n`)}async function Gn({bucket:e,digest:t,projectId:n,source:r,store:i}){if(bn(t),await Un(r)!==t)throw Error(`I18n object source does not match declared SHA-256 digest ${t}.`);let a=wn(n,t);await i.has(e,a)||await i.upload(e,a,r,`application/octet-stream`);let o=`${r}.${process.pid}.${W()}.verify`;try{if(await i.download(e,a,o),await Un(o)!==t)throw Error(`Existing immutable i18n object ${a} failed integrity verification.`)}finally{await B(o,{force:!0})}}async function Kn({bucket:e,key:t,reference:n,store:r,temporaryDirectory:i}){let a=Wn(n),o=P(i,`reference-${W()}.json`);if(await r.has(e,t))try{if(await r.download(e,t,o),!(await z(o)).equals(a))throw Error(`Immutable i18n reference ${t} already resolves to different snapshot data.`);return}finally{await B(o,{force:!0})}await H(o,a,{flag:`wx`});try{await r.upload(e,t,o,`application/json`)}finally{await B(o,{force:!0})}let s=P(i,`reference-${W()}.verify.json`);try{if(await r.download(e,t,s),!(await z(s)).equals(a))throw Error(`Uploaded immutable i18n reference ${t} failed verification.`)}finally{await B(s,{force:!0})}}async function qn({bucket:e,manifest:t,projectId:n,store:r,temporaryDirectory:i}){let a=Wn(t),o=Hn(a),s=P(i,`manifest-${o}.json`);await H(s,a,{flag:`wx`});try{await Gn({bucket:e,digest:o,projectId:n,source:s,store:r})}finally{await B(s,{force:!0})}return o}async function Jn({bucket:e,key:t,store:n,temporaryDirectory:r}){if(!await n.has(e,t))return;let i=P(r,`reference-${W()}.json`);try{await n.download(e,t,i);let r=JSON.parse(await z(i,`utf8`));if(r.version!==1||typeof r.revision!=`string`||typeof r.snapshot!=`string`)throw Error(`Invalid i18n reference at ${t}.`);return xn(r.revision),bn(r.snapshot),r}finally{await B(i,{force:!0})}}async function Yn({bucket:e,projectId:t,revision:n,store:r,temporaryDirectory:i}){let a=await Jn({bucket:e,key:Tn(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 Xn({bucket:e,projectId:t,reference:n,store:r,tag:i,temporaryDirectory:a}){await Kn({bucket:e,key:Tn(t,n.revision),reference:n,store:r,temporaryDirectory:a}),i&&await Kn({bucket:e,key:En(t,i),reference:n,store:r,temporaryDirectory:a})}async function Zn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:a}){bn(n);let o=P(F(t),`v1`,`sha256`,n.slice(0,2),n);if(await $n(o,n)===!1){await R(N(o),{recursive:!0});let t=`${o}.${process.pid}.${W()}.tmp`;try{if(await i.download(e,wn(r,n),t),await Un(t)!==n)throw Error(`Downloaded i18n object failed SHA-256 verification: ${n}.`);await B(o,{force:!0}),await Pe(t,o)}finally{await B(t,{force:!0})}}await R(N(a),{recursive:!0});let s=`${a}.${process.pid}.${W()}.tmp`;try{if(await Ae(o,s),await Un(s)!==n)throw Error(`Cached i18n object failed SHA-256 verification: ${n}.`);await B(a,{force:!0}),await Pe(s,a)}finally{await B(s,{force:!0})}}async function Qn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,temporaryDirectory:a}){let o=P(a,`manifest-${n}.json`);await Zn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:o});let s=JSON.parse(await z(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}.`);xn(s.revision),s.baseline!==void 0&&bn(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}.`);bn(e.digest)}return s}async function $n(e,t){try{return(await V(e)).isFile()&&await Un(e)===t}catch{return!1}}async function er({cwd:e=process.cwd(),env:t=process.env}={}){if((await U({cwd:e})).i18n){if(t.COREFRAME_I18N_RELEASE_REVISION){await rr({cwd:e,env:t,revision:t.COREFRAME_I18N_RELEASE_REVISION});return}await kn(e)}}async function tr({cwd:e=process.cwd(),projectConfig:t}={}){let n=t??await U({cwd:e});if(!n.i18n)return;let r=ir(n.i18n),i=Y(e,r.directory);try{if(!(await V(i)).isDirectory())throw Error(`I18n catalog path is not a directory: ${i}.`)}catch(t){if(t.code!==`ENOENT`)throw t;await kn(e);return}for(let t of r.locales)for(let n of r.catalogs)try{if(!(await V(Y(e,X(r,t,n)))).isFile())throw Error(`I18n catalog path is not a file: ${t}/${n}.json.`)}catch(t){if(t.code!==`ENOENT`)throw t;await kn(e);return}}async function nr({cwd:e=process.cwd(),env:t=process.env,store:n,tag:r}){Dn(r);let i=await ar({cwd:e,env:t,store:n});await pr(e);let a=await fr(e);await mr(e,r,a);let o=await Me(P(Le(),`coreframe-i18n-prepare-`));try{let n=await Yn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,revision:a,store:i.store,temporaryDirectory:o});if(n){let e=await Qn({bucket:i.assets.sourceBucket,cacheRoot:i.cacheRoot,digest:n.snapshot,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return dr(i,e,a),await sr(i,e),await Xn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,reference:n,store:i.store,tag:r,temporaryDirectory:o}),{reused:!0,snapshot:n.snapshot}}return await ur(i,o,async()=>{let n=await or(i,a,o);n||await lr(i),await kn(e);let s=await jn({config:i.config,cwd:e}),c=await Mn({config:i.config,cwd:e,env:t,messages:s});await Nn({config:i.config,cwd:e,missing:s,response:c}),await Pn({config:i.config,cwd:e}),await An({config:i.config,cwd:e,strict:!0,temporaryDirectory:o});let l=await cr(i),u={...n?{baseline:n}:{},catalogs:i.config.catalogs,files:l,generator:s.length>0?i.config.generator?.id??`unconfigured`:`none`,linguiVersion:await hr(e),locales:i.config.locales,projectId:i.assets.projectId,revision:a,sourceLocale:i.config.sourceLocale,version:1},d=await qn({bucket:i.assets.sourceBucket,manifest:u,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return await Xn({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 B(o,{force:!0,recursive:!0})}}async function rr({cwd:e=process.cwd(),env:t=process.env,revision:n,store:r}={}){let i=await U({cwd:e});if(!i.i18n)return;let a=await ar({cwd:e,env:t,store:r,projectConfig:i}),o=xn(n??await fr(e)),s=await Me(P(Le(),`coreframe-i18n-materialize-`));try{let e=await Yn({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 Qn({bucket:a.assets.sourceBucket,cacheRoot:a.cacheRoot,digest:e.snapshot,projectId:a.assets.projectId,store:a.store,temporaryDirectory:s});return dr(a,t,o),await sr(a,t),{revision:o,snapshot:e.snapshot}}finally{await B(s,{force:!0,recursive:!0})}}function ir(e){let t=Sn(e.sourceLocale,`Source locale`),n=[...new Set(e.locales.map(e=>Sn(e,`Locale`)))],r=[...new Set(e.catalogs.map(e=>Sn(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 ar({cwd:e=process.cwd(),env:t=process.env,projectConfig:n,store:r}){let i=n??await U({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:F(e,`.coreframe`,`i18n`,`cache`),config:ir(i.i18n),cwd:F(e),env:t,store:r??De({config:a,env:t})}}async function or(e,t,n){let{stdout:r}=await I(`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 Yn({bucket:e.assets.sourceBucket,projectId:e.assets.projectId,revision:xn(t),store:e.store,temporaryDirectory:n});if(!r)continue;let i=await Qn({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:r.snapshot,projectId:e.assets.projectId,store:e.store,temporaryDirectory:n});return dr(e,i,t),await sr(e,i),r.snapshot}}async function sr(e,t){for(let n of t.files)if(await Zn({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:n.digest,projectId:e.assets.projectId,store:e.store,target:Y(e.cwd,n.path)}),(await V(Y(e.cwd,n.path))).size!==n.size)throw Error(`Materialized i18n artifact size does not match manifest: ${n.path}.`)}async function cr(e){let t=[];for(let n of e.config.locales)for(let r of e.config.catalogs){let i=X(e.config,n,r),a=Y(e.cwd,i),o=await Un(a);await Gn({bucket:e.assets.sourceBucket,digest:o,projectId:e.assets.projectId,source:a,store:e.store}),t.push({digest:o,path:i,size:(await V(a)).size})}return t.sort((e,t)=>e.path.localeCompare(t.path))}async function lr(e){let{stdout:t}=await I(`git`,[`rev-parse`,`--show-prefix`],{cwd:e.cwd,stdin:`ignore`}),n=t.trim(),{stdout:r}=await I(`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 Re(`@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 I(`git`,[`show`,`${i}:${s}`],{cwd:e.cwd,stdin:`ignore`});await In(Y(e.cwd,X(e.config,t,r)),a.parse(n)),o=!0}catch{}}return o}async function ur(e,t,n){let r=[];for(let n of e.config.locales)for(let i of e.config.catalogs){let a=X(e.config,n,i),o=Y(e.cwd,a);try{await Oe(o)}catch{continue}let s=P(t,`previous-catalogs`,a);await R(N(s),{recursive:!0}),await Pe(o,s),r.push({backup:s,path:o})}try{let e=await n();return await B(P(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 B(Y(e.cwd,X(e.config,t,n)),{force:!0});for(let{backup:e,path:t}of r)await R(N(t),{recursive:!0}),await Pe(e,t);throw t}}function dr(e,t,n){if(t.revision!==n||t.projectId!==e.assets.projectId||t.sourceLocale!==e.config.sourceLocale||JSON.stringify(t.locales)!==JSON.stringify(e.config.locales)||JSON.stringify(t.catalogs)!==JSON.stringify(e.config.catalogs))throw Error(`I18n snapshot does not match commit or project configuration.`);let r=e.config.locales.flatMap(t=>e.config.catalogs.map(n=>X(e.config,t,n))),i=t.files.map(e=>e.path);if(new Set(i).size!==i.length||JSON.stringify(i.sort())!==JSON.stringify(r.sort()))throw Error(`I18n snapshot has an incomplete or unexpected artifact set.`)}async function fr(e){let{stdout:t}=await I(`git`,[`rev-parse`,`HEAD`],{cwd:e,stdin:`ignore`});return xn(t.trim())}async function pr(e){let{stdout:t}=await I(`git`,[`status`,`--porcelain`],{cwd:e,stdin:`ignore`});if(t.trim())throw Error(`Tagged i18n preparation requires a clean Git tree.`)}async function mr(e,t,n){let{stdout:r}=await I(`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 hr(e){let{stdout:t}=await I(`pnpm`,[`exec`,`lingui`,`--version`],{cwd:e,stdin:`ignore`});return t.trim()}const gr=[`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(` `),_r=r(p,{displayName:`widths`,description:`Comma-separated responsive variant widths.`,async from(e){let t=e.split(`,`).map(e=>Number(e));if(t.length===0||t.some(e=>!Number.isInteger(e)||e<=0)||t.some((e,n)=>n>0&&e<=t[n-1]))throw Error(`Widths must be positive, unique, strictly ascending integers.`);return t}}),vr=r(p,{displayName:`profile`,async from(e){return Te(e)}}),yr=r(p,{displayName:`pack`,description:`Asset pack name, such as training-videos.`,async from(e){if(!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e))throw Error(`Asset pack names must use lowercase hyphen-separated segments.`);return e}}),br=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in the packaged Flutter client.`,async from(e){return j(e)}}),xr=m({name:`assets`,cmds:{configure:n({name:`configure`,description:`Store a Backblaze B2 private build-object key in the operating system credential store. ${gr}`,args:{profile:u({type:vr,displayName:`profile`,description:`Credential profile named by coreframe.config.ts.`})},handler:async({profile:e})=>{L.note(gr,`Required B2 key access`);let t=await L.text({message:`Backblaze B2 application key ID`,validate:e=>e?.trim()?void 0:`The application key ID is required.`});if(L.isCancel(t))throw Error(`Asset credential configuration was cancelled.`);let n=await L.password({message:`Backblaze B2 application key`,validate:e=>e?void 0:`The application key is required.`});if(L.isCancel(n))throw Error(`Asset credential configuration was cancelled.`);await Ee({applicationKey:n,applicationKeyId:t.trim(),profile:e}),console.log(`Stored Coreframe asset credential profile "${e}".`)}}),add:n({name:`add`,args:{file:u({type:p,displayName:`file`,description:`Source raster image, SVG, MP3, MP4, or Lottie JSON to add to the asset library.`}),id:c({long:`id`,type:p,description:`Logical asset ID, such as blog/my-post/hero.`}),alt:c({long:`alt`,type:l(p),description:`Required alt text for raster image and SVG assets.`}),pack:c({long:`pack`,type:l(yr),description:`Place the asset in a named, lazily loaded pack.`}),variantWidths:c({long:`widths`,type:l(_r),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})=>Ce(await ye({alt:e,file:t,id:n,pack:i,variantWidths:a}),r,{kind:`add`,assetId:n})}),backup:n({name:`backup`,description:`Back up every object in both configured asset buckets to a new Git branch.`,args:{branch:c({long:`branch`,type:p,description:`Name of the new local Git branch that will contain the backup.`})},handler:async({branch:e})=>{let t=await be({branch:e});console.log(`Backed up ${t.objects} objects (${t.bytes} bytes) to branch "${t.branch}" at ${t.commit}.`)}}),build:n({name:`build`,args:{id:c({long:`id`,type:l(p),description:`Build only one logical asset ID.`}),pack:c({long:`pack`,type:l(yr),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})=>Ce(await xe({id:e,pack:n}),t,{kind:`build`})}),check:n({name:`check`,args:{fix:i({long:`fix`,description:`Migrate asset state and build missing generated output when possible.`,defaultValue:()=>!1}),pack:c({long:`pack`,type:l(yr),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 Se({fix:e,pack:n});Ce(r,t,{kind:`check`}),r.ok||(process.exitCode=1)}}),publish:n({name:`publish`,args:{pack:c({long:`pack`,type:l(yr),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 we({pack:t});Ce(n,e,{kind:`publish`}),n.ok||(process.exitCode=1)}}),status:n({name:`status`,args:{pack:c({long:`pack`,type:l(yr),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 Se({pack:t});Ce(n,e,{kind:`status`}),n.ok||(process.exitCode=1)}})}}),Sr=m({name:`flutter`,cmds:{acceptance:n({name:`acceptance`,description:`Run the complete packaged Flutter conformance gate on macOS.`,args:{apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:br,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e})=>he({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})=>A({check:e})}),prepare:n({name:`prepare`,description:`Build and package the React client for one Flutter platform.`,args:{platform:u({type:s(k),displayName:`platform`,description:`Flutter platform whose packaged client should be prepared.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:br,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>pe({apiOrigin:e,platform:t})}),check:n({name:`check`,description:`Reject missing, stale, modified, or incorrectly targeted Flutter assets.`,args:{platform:u({type:s(k),displayName:`platform`,description:`Flutter platform whose packaged client should be checked.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:br,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>O({apiOrigin:e,platform:t})})}}),Cr=m({name:`i18n`,cmds:{build:n({name:`build`,description:`Extract source messages or materialize an exact release catalog snapshot.`,args:{},handler:async()=>{await er()}}),materialize:n({name:`materialize`,description:`Materialize the immutable i18n snapshot for an exact commit.`,args:{revision:c({long:`revision`,type:l(p),description:`Full commit SHA. Defaults to the checked-out commit.`})},handler:async({revision:e})=>{let t=await rr({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:p,description:`Pushed v* release tag that points to the checked-out commit.`})},handler:async({tag:e})=>{let t=await nr({tag:e});console.log(`${t.reused?`Reused`:`Published`} i18n snapshot ${t.snapshot}.`)}})}}),wr=G.platform===`win32`?`react-router.cmd`:`react-router`,Tr=G.platform===`win32`?`panda.cmd`:`panda`;async function Er(e=G.cwd()){await kr(e),await Or(e,[`typegen`])}async function Dr(e=G.cwd(),t=G.env,n){if((t.COREFRAME_PLATFORM??`web`)!==`web`)return;let r=M.resolve(e,`.coreframe/dashboard-build`),i=M.join(r,`client`),a=M.resolve(e,`dist/client/__dashboard`);if(await B(r,{force:!0,recursive:!0}),(await U({cwd:e})).deploy?.mode===`client`){await B(a,{force:!0,recursive:!0});return}await Ar(e,Tr,[`build`],t),await Or(e,[`build`,...n?[`--mode`,n]:[]],t),await B(a,{force:!0,recursive:!0}),await R(M.dirname(a),{recursive:!0}),await je(i,a,{recursive:!0})}async function Or(e,t,n=G.env){await Ar(e,wr,t,n)}async function kr(e){await B(M.resolve(e,`dashboard/.react-router`),{force:!0,recursive:!0})}async function Ar(e,t,n,r=G.env){await I(t,n,{cwd:M.resolve(e,`dashboard`),env:{...r,PATH:M.resolve(e,`node_modules/.bin`)+M.delimiter+(r.PATH??r.Path??``)},stdio:`inherit`})}const Z={access:Oe,chmod:ke,mkdir:R,mkdtemp:Me,readFile:z,readFileSync:q,rm:B,writeFile:H},jr={getAvailablePort:Nr},Mr={homedir:Fe,kill:G.kill,networkInterfaces:Ie,tmpdir:Le};async function Nr(){let e=nt();try{await new Promise((t,n)=>{e.once(`error`,n),e.listen(0,`127.0.0.1`,t)});let t=e.address();if(!t||typeof t==`string`)throw Error(`Could not allocate an available TCP port.`);return t.port}finally{e.listening&&await new Promise((t,n)=>{e.close(e=>e?n(e):t())})}}function Pr({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 Fr(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=nt(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 Fr(e,t){let n=Date.now()+1e4,r;for(;!t();)try{return await Ir(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 Ir({host:e=`127.0.0.1`,port:t}){return new Promise((n,r)=>{let i=tt({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 Lr=G.platform===`win32`?`react-router.cmd`:`react-router`;function Rr(e){return K(M.resolve(e,`dashboard/dashboard.config.ts`))}function zr({cwd:e,env:t,port:n}){let r=t.PATH??t.Path??``,i,a,o=!1,s,c,l=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>{d()};return G.on(e,t),{handler:t,signal:e}}),u=async(e,t)=>{try{await e,o||a?.fail(Error(`The dashboard development server stopped unexpectedly.`))}catch(e){o||a?.fail(e)}finally{await t.outputTasks,t.stdout.end(),t.stderr.end(),await Promise.allSettled([Qe(t.stdout),Qe(t.stderr)]),i===e&&(i=void 0)}};a=Pr({port:n,start:async()=>{if(o)throw Error(`The dashboard development server was stopped before it started.`);let n=await jr.getAvailablePort();if(o)throw Error(`The dashboard development server was stopped before it started.`);let a=$e({label:`dashboard`}),s=$e({color:`red`,label:`dashboard`});a.pipe(G.stdout,{end:!1}),s.pipe(G.stderr,{end:!1});let l=I(Lr,[`dev`,`--host`,`127.0.0.1`,`--port`,String(n)],{cwd:M.resolve(e,`dashboard`),env:{...t,PATH:M.resolve(e,`node_modules/.bin`)+M.delimiter+r},stdin:`inherit`});i=l;let d=Promise.allSettled([Vr(l.stdout,a),Vr(l.stderr,s)]);return c=u(l,{outputTasks:d,stderr:s,stdout:a}),{host:`127.0.0.1`,port:n}}});let d=async()=>s||(s=(async()=>{o=!0,await a?.close(),i?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),await c;for(let{handler:e,signal:t}of l)G.off(t,e)})(),s);return{close:d,listen:()=>a.listen(),wait:()=>a.wait()}}async function Br({cwd:e=G.cwd(),env:t=G.env,port:n}){let r=zr({cwd:e,env:t,port:n});try{await r.listen(),await r.wait()}finally{await r.close()}}async function Vr(e,t){for await(let n of e)t.write(`${n}\n`)||await new Promise(e=>t.once(`drain`,e))}const Hr=m({name:`dashboard`,cmds:{dev:n({name:`dev`,args:{port:c({long:`port`,type:o,description:`Local TCP port for the dashboard proxy.`})},handler:({port:e})=>Br({port:e})}),build:n({name:`build`,args:{mode:c({long:`mode`,type:l(p),description:`Vite environment mode used for the dashboard build.`})},handler:({mode:e})=>Dr(void 0,void 0,e)}),typegen:n({name:`typegen`,args:{},handler:()=>Er()})}});function Ur(){var e=typeof SuppressedError==`function`?SuppressedError:function(e,t){var n=Error();return n.name=`SuppressedError`,n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(t!=null){if(Object(t)!==t)throw TypeError(`using declarations can only be used with objects, functions, null, or undefined.`);if(e)var r=t[Symbol.asyncDispose||Symbol.for(`Symbol.asyncDispose`)];if(r===void 0&&(r=t[Symbol.dispose||Symbol.for(`Symbol.dispose`)],e))var i=r;if(typeof r!=`function`)throw TypeError(`Object is not disposable.`);i&&(r=function(){try{i.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,i=this.e,a=0;function o(){for(;r=n.pop();)try{if(!r.a&&a===1)return a=0,n.push(r),Promise.resolve().then(o);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(o,s)}else a|=1}catch(e){return s(e)}if(a===1)return i===t?Promise.resolve():Promise.reject(i);if(i!==t)throw i}function s(n){return i=i===t?n:new e(n,i),o()}return o()}}}async function Wr({all:e,cwd:t=process.cwd(),ids:n=[],matches:r=[],now:i=new Date}={}){let a=await Xr(t),o=await Zr(a.config,t,async e=>a.module.developmentJobs.createStateAdmin(e).list()),s=rt({jobs:a.module.developmentJobs.jobs,now:i,records:o??[]}),c=Jr(s,{all:e,ids:n,matches:r},{defaultAll:!0});return{database:{dialect:a.dialect,state:o?`existing`:`missing`},jobs:s.filter(e=>c.has(e.id)),version:1}}async function Gr({all:e,breakLeases:t=!1,cwd:n=process.cwd(),dryRun:r=!1,ids:i=[],json:a=!1,matches:o=[],now:s=new Date,yes:c=!1}){let l=await Wr({all:!0,cwd:n,now:s}),u=Jr(l.jobs,{all:e,ids:i,matches:o},{defaultAll:!1}),d=l.jobs.filter(e=>u.has(e.id)),f=d.filter(e=>e.lease===`active`);if(r)return{database:l.database,dryRun:!0,jobs:d.map(e=>({id:e.id,status:e.lease===`active`&&!t?`blocked-active-lease`:e.persisted?`would-reset`:`no-state`})),version:1};if(f.length>0&&!t)throw Error(`Cannot reset active development job ${ti(f.map(e=>e.id))}. Wait for the lease to expire or pass --break-leases.`);if((t||e||o.length>0||d.length>1)&&!c){if(a||!process.stdin.isTTY)throw Error(`This reset requires --yes when prompts are unavailable.`);let e=await L.confirm({message:`Reset local development state for ${d.length} job${d.length===1?``:`s`}?`});if(L.isCancel(e)||!e)throw Error(`Development job state reset was cancelled.`)}if(l.database.state===`missing`)return{database:l.database,dryRun:!1,jobs:d.map(e=>({id:e.id,status:`no-state`})),version:1};let p=await Xr(n),m=await Zr(p.config,n,async e=>p.module.developmentJobs.createStateAdmin(e).reset({breakLeases:t,jobIds:[...u],now:s}));if(!m)throw Error(`The local database disappeared before development job state was reset.`);if(m.activeLeaseIds.length>0&&!t)throw Error(`Cannot reset active development job ${ti(m.activeLeaseIds)}. Wait for the lease to expire or pass --break-leases.`);let h=new Set(m.resetIds);return{database:l.database,dryRun:!1,jobs:d.map(e=>({id:e.id,status:h.has(e.id)?`reset`:`no-state`})),version:1}}function Kr(e){let t=ei(e.database);return e.jobs.length===0?`${t}No local development jobs are configured.`:`${t}${ni([`Job`,`Status`,`Last success`,`Next eligible`,`Lease`],e.jobs.map(e=>[e.id,e.lease===`active`?`running`:e.registration===`orphaned`?`orphaned`:e.eligibility,$r(e.lastSucceededAt),$r(e.nextEligibleAt),e.lease===`none`?`-`:`${e.lease} until ${$r(e.leaseUntil)}`]))}`}function qr(e){let t=ei(e.database);return e.jobs.length===0?`${t}No local development job state matched.`:`${t}${ni([`Job`,`Result`],e.jobs.map(e=>[e.id,e.status.replaceAll(`-`,` `)]))}`}function Jr(e,{all:t=!1,ids:n=[],matches:r=[]},{defaultAll:i}){if(t&&(n.length>0||r.length>0))throw Error(`Use --all or explicit job selectors, not both.`);if(!t&&n.length===0&&r.length===0){if(i)return new Set(e.map(e=>e.id));throw Error(`Select one or more jobs by ID or --match, or pass --all.`)}let a=new Set(e.map(e=>e.id)),o=n.filter(e=>!a.has(e));if(o.length>0)throw Error(`Unknown development job ${ti(o)}.`);let s=new Set(t?a:n);for(let t of r){let n=Yr(t),r=e.filter(e=>n.test(e.id));if(r.length===0)throw Error(`Development job pattern ${JSON.stringify(t)} matched no jobs.`);for(let e of r)s.add(e.id)}return s}function Yr(e){if(!e)throw Error(`Development job patterns must not be empty.`);let t=[...e].map(e=>e===`*`?`.*`:e===`?`?`.`:e.replace(/[\\^$.[\]{}()+|]/gu,`\\$&`)).join(``);return RegExp(`^${t}$`,`u`)}async function Xr(e){let t=await U({cwd:e}),n=t.jobs?.entry;if(!n)throw Error(`coreframe.config.ts must configure jobs.entry before managing development job state.`);let r=await ze(n,e);if(!r.developmentJobs||!Array.isArray(r.developmentJobs.jobs)||typeof r.developmentJobs.createStateAdmin!=`function`)throw Error(`${n} must export developmentJobs with jobs and createStateAdmin properties.`);return{config:t,dialect:t.database?.dialect??`postgres`,module:r}}async function Zr(e,t,n){try{var r=Ur();let a=e.database?.dialect??`postgres`,o=a===`sqlite`?M.resolve(t,`.coreframe/turso.db`):M.resolve(t,`.coreframe/postgres/PG_VERSION`);try{await V(o)}catch(e){if(ri(e)&&e.code===`ENOENT`)return;throw e}if(a===`sqlite`)try{var i=Ur();let r=await x({cwd:t,env:i.a(await le({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Qr(n,r)}finally{r.$client.close()}}catch(e){i.e=e}finally{await i.d()}let s=await ee({cwd:t,env:r.a(await D({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Qr(n,s)}finally{await s.$client.end()}}catch(e){r.e=e}finally{await r.d()}}async function Qr(e,t){try{return await e(t)}catch(e){throw ii(e)?Error(`The local development job state table is missing. Run coreframe db migrate-local, then retry.`,{cause:e}):e}}function $r(e){return e?.toISOString()??`-`}function ei(e){return e.state===`missing`?`Local ${e.dialect} database is missing; no database was created.\n\n`:``}function ti(e){return e.map(e=>JSON.stringify(e)).join(`, `)}function ni(e,t){let n=e.map((e,n)=>Math.max(e.length,...t.map(e=>e[n].length))),r=e=>e.map((e,t)=>e.padEnd(n[t])).join(` `).trimEnd();return[r(e),r(n.map(e=>`-`.repeat(e))),...t.map(r)].join(`
|
|
8
|
+
`)}function ri(e){return e instanceof Error&&`code`in e}function ii(e){let t=e;for(;t instanceof Error;){let e=t.message.toLowerCase();if(e.includes(`coreframe_dev_job_state`)&&(e.includes(`does not exist`)||e.includes(`no such table`)))return!0;t=t.cause}return!1}const ai={ids:f({type:p,displayName:`job`,description:`Exact local development job IDs.`}),matches:a({type:t(p),long:`match`,description:`Select job IDs with an anchored * and ? glob. Repeat to add patterns.`,defaultValue:()=>[]})},oi=m({name:`jobs`,cmds:{status:n({name:`status`,description:`Inspect local development job cooldown and lease state.`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1}),...ai},handler:async({ids:e,json:t,matches:n})=>{let r=await Wr({ids:e,matches:n});console.log(t?JSON.stringify(r):Kr(r))}}),reset:n({name:`reset`,description:`Make local development jobs eligible for their next startup check.`,args:{all:i({long:`all`,description:`Select every configured and orphaned development job.`,defaultValue:()=>!1}),breakLeases:i({long:`break-leases`,description:`Invalidate active job leases. The original invocation may keep running.`,defaultValue:()=>!1}),dryRun:i({long:`dry-run`,description:`Show the reset without changing local state.`,defaultValue:()=>!1}),json:i({long:`json`,description:`Print machine-readable JSON without prompting.`,defaultValue:()=>!1}),yes:i({long:`yes`,short:`y`,description:`Confirm a multi-job, pattern, all-job, or lease-breaking reset.`,defaultValue:()=>!1}),...ai},handler:async({all:e,breakLeases:t,dryRun:n,ids:r,json:i,matches:a,yes:o})=>{let s=await Gr({all:e,breakLeases:t,dryRun:n,ids:r,json:i,matches:a,yes:o});console.log(i?JSON.stringify(s):qr(s))}})}}),si=/^[a-z0-9]+(?:-[a-z0-9]+)*$/u;function ci(e,t){let n=ui(e,t);if(!di(n)||!fi(n,[`description`,`requires`,`routes`,`verifier`])||!mi(n.description)||n.requires!==void 0&&(!Array.isArray(n.requires)||!n.requires.every(mi))||n.verifier!==void 0&&!mi(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=>li(e));if(new Set(r).size!==r.length)throw Error(`${t} contains duplicate recipe requirements.`);let i=n.routes.map((e,n)=>{if(!di(e)||!pi(e,[`path`,`router`,`when`])||!mi(e.path)||!mi(e.router)||!mi(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 li(e){if(!si.test(e))throw Error(`Recipe names use lowercase letters, numbers, and single hyphens.`);return e}function ui(e,t){try{return it(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function di(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function fi(e,t){return Object.keys(e).every(e=>t.includes(e))}function pi(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function mi(e){return typeof e==`string`&&e.length>0}const hi=`https://github.com/coreframe-js/coreframe.git`;function gi(e,t){return J(`git`,e,{cwd:t,encoding:`utf8`})}function _i(e,t){let n=gi(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 vi(e,t){let n=gi([`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 yi({cwd:e=process.cwd(),fetch:t=!0,remote:n=`template`}={}){if(n.length===0)throw Error(`Remote name must not be empty.`);_i([`rev-parse`,`--show-toplevel`],e);let r=vi(n,e);if(r===null)_i([`remote`,`add`,n,hi],e),console.log(`Added ${n} remote: ${hi}`);else if(r===hi)console.log(`${n} remote already points at ${hi}`);else throw Error(`${n} remote points at ${r}, not ${hi}.\nChoose the intended template source before continuing, then update or rename the remote manually.`);t&&(_i([`fetch`,n,`--tags`,`--prune`],e),console.log(`Fetched ${n}.`))}const bi=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u;function Q(e){return bi.test(e)?`v${e}`:e}function xi(e){return`${Q(e)}:template`}function Si(e,t){return`${xi(e)}/${t}`}function Ci({cwd:e=process.cwd(),fetch:t=!0,remote:n=`template`,target:r}={}){let i=Di(e),a=ji(i,[`rev-parse`,`--show-toplevel`]),o=Q(r??Oi(i));return yi({cwd:a,fetch:t,remote:n}),{projectRoot:i,ref:o,repositoryRoot:a}}function wi(e,t,n){return Ti(e,t,n).toString(`utf8`)}function Ti(e,t,n){let r=`${t}:${n}`,i=J(`git`,[`show`,r],{cwd:e,encoding:`buffer`});if(i.status!==0)throw Error(`Could not read ${r}. ${Mi([`show`,r],i)}`);return i.stdout}function Ei(e,t,n){let r=J(`git`,[`ls-tree`,`-r`,`--name-only`,`-z`,t,`--`,n],{cwd:e,encoding:`buffer`});if(r.status!==0)throw Error(Mi([`ls-tree`,t,n],r));return r.stdout.toString(`utf8`).split(`\0`).filter(Boolean)}function Di(e){let t=F(e);for(;;){let e=P(t,`package.json`),n=Ai(e);if(n!==void 0&&ki(n,e).engines?.coreframe)return t;let r=N(t);if(r===t)throw Error(`Could not find a package.json with engines.coreframe.`);t=r}}function Oi(e){let t=P(e,`package.json`),n=Ai(t);if(n===void 0)throw Error(`Required file package.json does not exist.`);let r=ki(n,t).engines?.coreframe;if(!r)throw Error(`package.json must declare an exact engines.coreframe recipe baseline.`);return r}function ki(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function Ai(e){try{return q(e,`utf8`)}catch(e){if(Ni(e)&&e.code===`ENOENT`)return;throw e}}function ji(e,t){let n=J(`git`,t,{cwd:e,encoding:`utf8`});if(n.status!==0)throw Error(Mi(t,n));return n.stdout.trim()}function Mi(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 Ni(e){return e instanceof Error&&`code`in e}const Pi=[{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:Ui},{path:`src-flutter/pubspec.yaml`,requirement:`declare flutter_driver as a Flutter SDK dependency`,test:Wi},{path:`src-flutter/lib/main.dart`,requirement:`gate Flutter Driver behind kDebugMode and ENABLE_FLUTTER_DRIVER before starting Coreframe`,test:Gi},{path:`src/web/app/flutter-shell/application.ts`,requirement:`configure the Flutter shell's app-owned query and session hooks`,test:e=>Hi(e,[`configureShellQueryFocus`,`initializeShellClient`,`authSessionHint`,`authClient.signOut()`,`clearSession`])},{path:`src/web/entry.client.tsx`,requirement:`load the package-owned Flutter development tools only for non-browser development`,test:e=>Hi(e,[`@coreframe/vite/flutter-devtools`,`import.meta.env.PLATFORM !== "web"`])}],Fi=`src-flutter/lib/application.dart`,Ii=`src/api/worker/auth-origin.ts`;function Li(e){let t=[];for(let n of Pi){let r=P(e,n.path);if(!K(r)){t.push(`${n.path} is missing; it must ${n.requirement}.`);continue}let i=q(r,`utf8`);n.test(i)||t.push(`${n.path} must ${n.requirement}.`)}let n=Ri(e,t),r=zi(e,t);return n!==void 0&&r!==void 0&&n!==r&&t.push(`${Fi} loopbackPort (${n}) must match ${Ii} FLUTTER_LOOPBACK_ORIGIN (${r}).`),t}function Ri(e,t){let n=Bi(e,Fi,t);if(n===void 0)return;let r=n.match(/^\s*loopbackPort\s*:\s*(\d+)\s*,?\s*$/m)?.[1],i=n.match(/^\s*loopbackPort\s*:\s*([A-Za-z_]\w*)\s*,?\s*$/m)?.[1],a=i?n.match(RegExp(`^\\s*(?:static\\s+)?const\\s+${i}\\s*=\\s*(\\d+)\\s*;\\s*$`,`m`))?.[1]:void 0,o=Vi(r??a);return o===void 0&&t.push(`${Fi} must configure loopbackPort as a fixed integer port.`),o}function zi(e,t){let n=Bi(e,Ii,t);if(n===void 0)return;let r=Vi(n.match(/^\s*export\s+const\s+FLUTTER_LOOPBACK_ORIGIN\s*=\s*["']http:\/\/localhost:(\d+)["']\s*;?\s*$/m)?.[1]);return r===void 0&&t.push(`${Ii} must define FLUTTER_LOOPBACK_ORIGIN as an exact localhost origin with a fixed integer port.`),r}function Bi(e,t,n){let r=P(e,t);if(!K(r)){n.push(`${t} is missing; it must define the Flutter loopback origin contract.`);return}return q(r,`utf8`)}function Vi(e){if(!e)return;let t=Number(e);return Number.isInteger(t)&&t>=1&&t<=65535?t:void 0}function Hi(e,t){return t.every(t=>e.includes(t))}function Ui(e){let t=e.match(/\bplatforms\s*:\s*\[([\s\S]*?)\]/)?.[1];if(!t)return!1;let n=new Set([...t.matchAll(/(["'`])([^"'`]*)\1/g)].map(e=>e[2]));return n.has(`web`)&&[`ios`,`android`,`linux`,`macos`,`windows`].some(e=>n.has(e))}function Wi(e){try{let t=it(e);if(!Ki(t)||!Ki(t.dependencies))return!1;let n=t.dependencies.flutter_driver;return Ki(n)&&n.sdk===`flutter`}catch{return!1}}function Gi(e){let t=/const\s+(\w+)\s*=\s*kDebugMode\s*&&\s*bool\.fromEnvironment\(\s*['"]ENABLE_FLUTTER_DRIVER['"]\s*\)/u.exec(e),n=e.indexOf(`enableFlutterDriverExtension()`),r=e.indexOf(`runCoreframeApplication(`),i=t?RegExp(`if\\s*\\(\\s*${t[1]}\\s*\\)\\s*\\{[^{}]*enableFlutterDriverExtension\\(\\)[^{}]*\\}`,`u`):void 0;return e.includes(`package:flutter_driver/driver_extension.dart`)&&i?.test(e)===!0&&n>=0&&r>=0&&n<r}function Ki(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function qi({name:e,...t}){let n=Ci(t),r=`recipes/${e}/recipe.yaml`,i=Xi(ci(wi(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(`
|
|
9
|
+
`)}`);return{name:e,ref:n.ref}}function Ji(e){console.log(`Verified Coreframe recipe ${e.name} from ${e.ref}.`)}function Yi(e,t){for(let n of e){let e=`recipes/${n}/recipe.yaml`,r=Xi(ci(wi(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(`
|
|
10
|
+
`)}\nApply and verify ${n} before continuing.`)}}function Xi(e,t){if(!e)throw Error(`Required recipe does not declare a verifier.`);if(e===`flutter`)return Li(t);throw Error(`Unknown recipe verifier ${JSON.stringify(e)}.`)}function Zi({cwd:e=process.cwd(),fetch:t=!0,name:n,remote:r=`template`,target:i}){li(n);let a=Ci({cwd:e,fetch:t,remote:r,target:i}),{projectRoot:o,ref:s,repositoryRoot:c}=a,l=`recipes/${n}`,u=`${l}/recipe.yaml`,d=ci(wi(c,s,u),u);Yi(d.requires,a);let f=wi(c,s,`${l}/RECIPE.md`),p=Ei(c,s,`${l}/files`),m=Ei(c,s,`${l}/patches`),h=Ei(c,s,`${l}/.agents`),g=new Map,_=new Map,v=[],ee=[],y=[],b=[],x=[],S=[];for(let e of p){let t=e.slice(`${l}/files/`.length);if(ia(t,`Recipe file ${e}`),t.startsWith(`.agents/`))throw Error(`Recipe file ${e} must be stored in the recipe's .agents directory.`);g.set(t,Ti(c,s,e)),_.set(t,e)}for(let e of h){let t=e.slice(`${l}/`.length);if(ta(t,`Recipe asset ${e}`),g.has(t))throw Error(`Recipe declares ${t} as both a file and an agent asset.`);g.set(t,Ti(c,s,e)),_.set(t,e)}for(let e of m){let t=aa(e,l);if(g.has(t))throw Error(`Recipe declares ${t} as both a file and a patch.`);let n=Ti(c,s,e);oa(n.toString(`utf8`),t,e),ra(o,t),sa(o,n,!1)?(v.push({contents:n,destinationPath:t}),b.push(t)):sa(o,n,!0)?x.push(t):y.push({destination:t,source:e})}let C=new Map;for(let[e,t]of g){let r=ua(ra(o,e));if(r===void 0)C.set(e,t),ee.push(e);else if(r.equals(t))x.push(e);else if(e.startsWith(`.agents/`))throw Error(`Recipe ${n} cannot replace modified ${e}. Reconcile that agent asset manually.`);else y.push({destination:e,source:_.get(e)})}let w=new Map;for(let e of d.routes){if(ta(e.router,`Recipe route router`),na(e.path,`Recipe route path`),g.has(e.router))throw Error(`Recipe cannot replace its destination router ${e.router}.`);if(!g.has(e.path)&&!K(ra(o,e.path)))throw Error(`Recipe route target ${e.path} does not exist.`);let t=w.get(e.router)??$i(da(ra(o,e.router),e.router),e.router);w.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 w){t.routes.sort((e,t)=>e.path<t.path?-1:+(e.path>t.path));let n=da(ra(o,e),e),r=at(t,{lineWidth:0});r===n?x.push(e):(C.set(e,r),S.push(e))}for(let{destinationPath:e}of v)if(C.has(e))throw Error(`Recipe cannot both write and patch ${e}.`);for(let[e,t]of C){let n=ra(o,e);Ge(N(n),{recursive:!0}),Ze(n,t)}return v.length>0&&ca(o,v.map(({contents:e})=>e)),{created:ee.sort(),instructions:f,mergeRequired:y.sort((e,t)=>e.destination.localeCompare(t.destination)),name:n,patched:b.sort(),ref:s,unchanged:[...new Set(x)].sort(),updated:S.sort()}}function Qi(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 $i(e,t){let n=ea(e,t);if(!fa(n)||!pa(n,[`routes`,`rules`])||!Array.isArray(n.rules)||!n.rules.every(ma)||!Array.isArray(n.routes))throw Error(`${t} must contain only string rules and a routes array.`);let r=n.routes.map((e,n)=>{if(!fa(e)||!pa(e,[`path`,`when`])||!ma(e.path)||!ma(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 ea(e,t){try{return it(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function ta(e,t){if(!e.startsWith(`.agents/`))throw Error(`${t} must be a normalized project-relative path beneath .agents/.`);ia(e,t)}function na(e,t){if(ia(e,t),!/(?:^|\/)\.agents\/rules\/.+\.md$/u.test(e))throw Error(`${t} must point to a Markdown rule beneath an .agents/rules directory.`)}function ra(e,t){ia(t,`Recipe destination`);let n=P(e,t),r=e;for(let e of t.split(`/`))if(r=P(r,e),K(r)&&We(r).isSymbolicLink())throw Error(`Recipe destination ${t} crosses symbolic link ${r}.`);return n}function ia(e,t){if(e.length===0||ge(e)||e===`..`||e.startsWith(`../`)||e.includes(`\\`)||_e.normalize(e)!==e)throw Error(`${t} must be a normalized project-relative path.`)}function aa(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 ia(r,`Recipe patch ${e}`),r}function oa(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 sa(e,t,n){let r=[`apply`,`--check`,`--whitespace=nowarn`];return n&&r.push(`--reverse`),r.push(`-`),J(`git`,r,{cwd:e,input:t}).status===0}function ca(e,t){let n=J(`git`,[`apply`,`--whitespace=nowarn`,`-`],{cwd:e,input:Buffer.concat(t.flatMap(e=>[e,Buffer.from(e.at(-1)===10?``:`
|
|
11
|
+
`)])),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 la(e){return ua(e)?.toString(`utf8`)}function ua(e){try{return q(e)}catch(e){if(ha(e)&&e.code===`ENOENT`)return;throw e}}function da(e,t){let n=la(e);if(n===void 0)throw Error(`Required file ${t} does not exist.`);return n}function fa(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function pa(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function ma(e){return typeof e==`string`&&e.length>0}function ha(e){return e instanceof Error&&`code`in e}function ga(e={}){let{ref:t,repositoryRoot:n}=Ci(e),r=Ei(n,t,`recipes`).filter(e=>/^recipes\/[^/]+\/recipe\.yaml$/u.test(e)).map(e=>{let r=e.split(`/`)[1];return li(r),{description:ci(wi(n,t,e),e).description,name:r}});return r.sort((e,t)=>e.name.localeCompare(t.name)),{recipes:r,ref:t}}function _a(e){console.log(`Coreframe recipes at ${e.ref}:`);for(let t of e.recipes)console.log(`${t.name} — ${t.description}`)}const va=`.agents/skills/coreframe-upgrade/SKILL.md`;function ya(e,t={}){return J(`git`,e,t)}function ba(e){return e.stderr.toString(`utf8`).trim()||e.stdout.toString(`utf8`).trim()}function xa(e,t){let n=Si(e,t),r=ya([`show`,n],{encoding:`utf8`});if(r.status!==0){let e=ba(r);throw Error(`Could not read ${n}.${e?` ${e}`:``}`)}return r.stdout.toString()}function Sa(){let e=ya([`rev-parse`,`--show-toplevel`],{encoding:`utf8`});if(e.status!==0){let t=ba(e);throw Error(`Could not find git repository root.${t?` ${t}`:``}`)}return e.stdout.toString().trim()}function Ca(e,t){let n=Ke(P(Le(),`coreframe-upgrade-skill-`)),r=P(n,`SKILL.md`);try{Ze(r,t);let n=ba(ya([`--no-pager`,`diff`,`--no-index`,`--color=never`,`--`,e,r]));n&&console.log(n)}finally{Je(n,{force:!0,recursive:!0})}}function wa({apply:e,target:t}){let n=P(Sa(),va),r=Q(t);if(!K(n))throw Error(`Local ${va} does not exist.`);let i=q(n,`utf8`),a=xa(t,va);return i===a?(console.log(`Coreframe upgrade skill matches ${r}:template/${va}.`),0):e?(Ze(n,a),console.error(`Updated ${va} from ${r}:template. Reread it before continuing the upgrade.`),20):(console.error(`Coreframe upgrade skill differs from ${r}:template/${va}.`),console.error(`Run again with --apply to update it, then reread ${va} before continuing.`),Ca(n,a),20)}const Ta=[{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-flutter/pubspec.lock`,reason:`downstream-owned dependency lockfile`}],Ea=[{matches:e=>e===`src-tauri`||e.startsWith(`src-tauri/`),reason:`legacy Tauri shell removed by breaking host migration`}],Da=new Set([`100644`,`100755`,`120000`]);function Oa(e,t={}){return J(`git`,e,t)}function ka(e){let t=Oa(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 Aa(e){let t=Oa(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 ja(){return ka([`rev-parse`,`--show-toplevel`]).trim()}function Ma(e){let t=P(e,`package.json`);if(!K(t))throw Error(`Missing --base <git-ref>, and package.json does not exist.`);let n=JSON.parse(q(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 Na(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 Pa(e,t){let n=Na(Aa([`diff`,`--name-status`,`-z`,`--no-renames`,xi(e),xi(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 Fa(e,t){let n=Aa([`ls-tree`,`-z`,`-r`,xi(e),`--`,t]);if(n.length===0)return null;let r=Na(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 Ia(e){return Aa([`cat-file`,`blob`,e.object])}function La(e,t){let n=F(e,t),r=e.endsWith(ve)?e:`${e}${ve}`;if(n!==e&&!n.startsWith(r))throw Error(`Refusing to access path outside repository: ${t}`);return n}function Ra(e){try{return We(e),!0}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!1;throw e}}function za(e){return(e.mode&73)!=0}function Ba(e){return e===null||e.type===`blob`&&Da.has(e.mode)}function Va(e){return Ta.find(t=>t.matches(e))?.reason}function Ha(e){return Ea.find(t=>t.matches(e))?.reason}function Ua(e,t,n){let r=La(e,t);if(n===null)return{matches:!Ra(r)};if(!Ba(n))return{matches:!1,reason:`unsupported template entry mode ${n.mode} ${n.type}`};let i;try{i=We(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=Ia(n);return n.mode===`120000`?i.isSymbolicLink()?{matches:Buffer.from(qe(r),`utf8`).equals(a)}:{matches:!1,reason:`worktree path is not a symlink`}:i.isFile()?(n.mode===`100755`?za(i):!za(i))?{matches:q(r).equals(a)}:{matches:!1,reason:`worktree executable bit differs from template`}:{matches:!1,reason:`worktree path is not a regular file`}}function Wa(e){Ra(e)&&Je(e,{force:!0,recursive:!1})}function Ga(e,t,n){let r=La(e,t);if(n===null){Wa(r);return}if(Ge(N(r),{recursive:!0}),n.mode===`120000`){Wa(r),Ye(Ia(n).toString(`utf8`),r);return}let i=Ra(r)?We(r):null;i&&!i.isFile()&&Wa(r),Ze(r,Ia(n)),Ue(r,n.mode===`100755`?493:420)}function Ka(e,t){return e===null&&t!==null?`add`:e!==null&&t===null?`delete`:`update`}function qa(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 Ja(e){let t=ja(),n=Q(e.base??Ma(t)),r=Q(e.target),i=Pa(n,r),a=[],o=[],s=[],c=[];for(let e of i){let i=Va(e.path);if(i){o.push({action:`ignored`,path:e.path,reason:i});continue}let l=Fa(n,e.path),u=Fa(r,e.path),d=Ka(l,u),f=u===null?Ha(e.path):void 0;if(f){a.push({action:d,path:e.path,reason:f,targetEntry:u});continue}if(!Ba(l)||!Ba(u)){s.push({action:d,path:e.path,reason:`unsupported template entry type`});continue}if(Ua(t,e.path,u).matches){c.push({action:`unchanged`,path:e.path});continue}let p=Ua(t,e.path,l);if(!p.matches){s.push({action:d,path:e.path,reason:p.reason??`downstream differs from base template`});continue}a.push({action:d,path:e.path,targetEntry:u})}if(e.apply)for(let e of a)Ga(t,e.path,e.targetEntry??null);console.log(`Coreframe template fast-forward: ${n} -> ${r}`),console.log(``),qa(e.apply?`Applied clean template updates`:`Would apply clean template updates`,a),qa(`Ignored downstream-owned paths`,o),qa(`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 Ya=[`dependencies`,`devDependencies`];function Xa(e){let t=J(`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 Za(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}: ${e instanceof Error?e.message:e}`)}}function Qa(e,t){let n=`${Q(e)}:${t}`;return Za(Xa([`show`,n]),n)}function $a(e){return e.startsWith(`@coreframe/`)}function eo(e){return e.startsWith(`file:`)||e.startsWith(`link:`)||e.startsWith(`workspace:`)}function to(e){return e.startsWith(`file:`)||e.startsWith(`link:`)}function no(e,t){let n=e.indexOf(`:`),r=e.slice(n+1),i=_e.normalize(_e.join(`template`,r,`package.json`));if(r.length===0||_e.isAbsolute(r)||i===`..`||i.startsWith(`../`))throw Error(`Invalid local template dependency for ${t}: ${e}`);return i}function ro(e){let t=Qa(e,`template/package.json`),n=[],r=new Set;for(let i of Ya)for(let[a,o]of Object.entries(t[i]??{})){if(!$a(a)||!to(o))continue;if(r.has(a))throw Error(`Target template declares ${a} more than once.`);let t=no(o,a),s=Qa(e,t);if(s.name!==a||typeof s.version!=`string`)throw Error(`${Q(e)}:${t} must declare ${a} with a version.`);n.push({group:i,name:a,spec:`^${s.version}`}),r.add(a)}return n}function io(e,t){for(let n of Ya){let r=e[n]?.[t];if(r)return{group:n,spec:r}}}function ao(e,t,n){let r=t.match(/\n([\t ]+)"/u)?.[1]??` `,i=t.endsWith(`
|
|
12
12
|
`)?`
|
|
13
|
-
`:``;Ze(e,`${JSON.stringify(n,null,r)}${i}`)}function
|
|
14
|
-
`),`Pending Worker secret updates`),c?.accessTokenSigningSecret.provisioned&&L.log.info(`Provisioning Coreframe-managed access-token signing material.`),await Eo(n);let _=o.mode===`full`?await _o(a,n,t):!1;try{m&&await jt(fo,r,d),L.log.step(`Running pre-deploy build`),await I(`pnpm`,[`build`],{env:Mo(p),stdio:`inherit`}),L.log.step(`Running release build and uploading PostHog source maps`),h=!0,await I(`pnpm`,[`build`],{env:p,stdio:`inherit`}),_&&(L.log.step(`Running deploy-safe database migrations`),await I(`pnpm`,[`db`,`migrate`],{env:p,stdio:`inherit`})),L.log.step(o.mode===`full`?`Deploying Worker and static assets to Cloudflare`:`Deploying static assets to Cloudflare`);let e={...c?.dashboardPassword?{DASHBOARD_PASSWORD:c.dashboardPassword}:{},...c?.accessTokenSigningSecret.value?{[ot]:c.accessTokenSigningSecret.value}:{},...c?.pendingWorkerSecrets.values},t=Object.keys(e).length>0?await ko(e):void 0,i=o.mode===`full`?await pt({coreframeConfig:a,environment:n.environment,contributions:{generatedValues:{DEPLOY_ENV:n.environment,POSTHOG_RELEASE:f}}}):await ft(process.cwd());try{await I(`pnpm`,[`exec`,`wrangler`,`deploy`,`--config`,i.path,...o.mode===`full`?[`--env`,n.environment]:[],`--strict`,`--keep-vars`,`--tag`,f,`--message`,`Deploy ${f}`,...t?[`--secrets-file`,t.path]:[]],{env:p,stdio:`inherit`}),c&&(await st(c.pendingWorkerSecrets),await At({environment:n.environment}))}finally{await i.dispose(),await t?.dispose()}let l={environment:n.environment,releaseName:f,url:s,version:d};o.mode===`full`&&o.afterWorkerDeploy&&(L.log.step(`Running required after-Worker deploy hook`),await Dt(o,l)),n.skipPostDeployChecks||(L.log.step(`Running post-deploy checks`),await Ot(o,l)),L.outro(`Deployed ${f} to ${n.environment}`)}catch(e){throw!h&&m&&await H(fo,i),e}}function mo(e){return{environment:ho(e[0]),runMigrations:e.includes(`--run-migrations`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),yes:e.includes(`--yes`)}}function ho(e){if(e&&ct.includes(e))return e;throw Error(`Deploy environment must be one of: ${ct.join(`, `)}.`)}async function go(e,t){let n=await xt({environment:e}),r=n.values.DASHBOARD_PASSWORD??await Oo(t,e);return kt(await dt({environment:e}),e,{availableNames:[...Object.keys(n.values),...r?[`DASHBOARD_PASSWORD`]:[]]}),{accessTokenSigningSecret:await gt({environment:e}),dashboardPassword:r,pendingWorkerSecrets:n}}async function _o(e,t,n){let r=e.database?.dialect??`postgres`,i;switch(r){case`postgres`:i=await y({env:n});break;case`sqlite`:i=await b({env:n});break;default:throw Error(`Unsupported database dialect "${r}".`)}let a=await vo(i),o=await se(a);if(o.length>0)throw Error(`Pending deploy migrations contain unsafe SQL. Move unsafe statements to held migrations.\n${ne(o)}`);return bo(t,a)}async function vo(e){try{return await yo(e)}finally{await e.close?.()}}async function yo(e){return C(await v(),await ae(e))}async function bo(e,t){if(t.length===0)return L.log.info(`No pending deploy migrations.`),!1;if(L.note(te(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 L.confirm({initialValue:!0,message:`Run these deploy-safe database migrations before Cloudflare deploy?`});if(L.isCancel(n))throw L.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`);return n}async function xo(){let{stdout:e}=await I(`git`,[`status`,`--porcelain`],{stdin:`ignore`});if(e.trim().length>0)throw Error(`Deploy requires a clean git tree.`);let{stdout:t}=await I(`git`,[`rev-parse`,`HEAD`],{stdin:`ignore`});return t.trim()}function So(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations or --skip-migrations.`)}function Co(e,t){if(t===`client`&&(e.runMigrations||e.skipMigrations))throw Error(`Migration flags are not available when deploy.mode is "client".`)}async function wo(e,t,n=ut){return e.url?To(e.url,t):t===`staging`&&e.stagingHostname?To(await n(),t):To(void 0,t)}function To(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 Eo(e){if(e.environment!==`production`||e.yes)return;if(!process.stdout.isTTY)throw Error(`Production deploys require --yes in noninteractive environments.`);let t=await L.confirm({initialValue:!1,message:`Deploy to production?`});if(L.isCancel(t)||!t)throw L.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`)}function Do(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 Oo(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(n)return n;let r;try{r=Nt(await B(`.env`,`utf8`))}catch(e){throw Ao(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 ko(e){let t=await je(P(Le(),`coreframe-deploy-secrets-`)),n=P(t,`secrets.json`);return await H(n,JSON.stringify(e),{mode:384}),{path:n,dispose:()=>V(t,{force:!0,recursive:!0})}}function Ao(e){return e instanceof Error&&`code`in e}function jo(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 Mo(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}async function No(){let e=await Fo();return typeof e.mobileDevHost==`string`?{mobileDevHost:e.mobileDevHost}:{}}async function Po(e){let t=await Fo(),n=Io();await Z.mkdir(M.dirname(n),{recursive:!0}),await Z.writeFile(n,`${JSON.stringify({...t,...e},void 0,2)}\n`)}async function Fo(){try{let e=await Z.readFile(Io(),`utf8`),t=JSON.parse(e);return Lo(t)?t:{}}catch{return{}}}function Io(){return M.join(jr.homedir(),`.coreframe`,`preferences.json`)}function Lo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function Ro({env:e=G.env,interactive:t=G.stdin.isTTY===!0,platform:n,target:r}){let i=await Go(n,e).catch(()=>[]),a=r?ls(i,r):void 0;if(a)return a;if(!r&&i.length>0)return Wo(i,n,t);let o=r?ls(await qo(e).catch(()=>[]),r):void 0;if(o&&o.platform===n)return Jo(o,n,e,t);let s=await Ko(n,e),c=r?ls(s,r):void 0;if(c)return c;if(!r&&s.length>0)return Wo(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 zo(e){let{device:t,host:n,interactive:r=G.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=ds();if(i.length===0)throw Error(`No external IP address was detected. Pass one explicitly with --host.`);let a=await Ho();if(a&&i.includes(a))return a;if(i.length===1)return await Uo(i[0]),i[0];if(!r)throw Error(`Multiple external IP addresses were detected (${i.join(`, `)}). Pass one explicitly with --host.`);let o=await L.select({message:`Which IP address should the mobile device use to reach the development server?`,options:i.map(e=>({label:e,value:e}))});if(L.isCancel(o))throw Error(`Mobile development IP selection was cancelled.`);return await Uo(o),o}async function Bo({device:e,env:t=G.env,host:n,interactive:r,platform:i,port:a}){if(i===`android`&&e.physical&&n===void 0)try{return await ns(e.id,a,t)}catch{L.log.warn(`Could not establish Android ADB port forwarding. Using the LAN development address instead.`)}return{close:async()=>void 0,serverUrl:Vo(i,await zo({device:e,host:n,interactive:r,platform:i}),a),viteHost:!0}}function Vo(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}`}async function Ho(){return(await No()).mobileDevHost}async function Uo(e){try{await Po({mobileDevHost:e})}catch(e){L.log.warn(`Could not remember the mobile development IP address: ${e instanceof Error?e.message:String(e)}`)}}async function Wo(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 L.select({message:`Which ${t===`ios`?`iOS`:`Android`} device should Coreframe use?`,options:e.map(e=>({label:e.label,value:e,hint:e.id}))});if(L.isCancel(r))throw Error(`Mobile development device selection was cancelled.`);return r}async function Go(e,t){return e===`android`?Xo(t):Qo(t)}async function Ko(e,t){return e===`android`?Zo(t):$o(t)}async function qo(e){let{stdout:t}=await I(`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 Jo(e,t,n,r){let i=await Yo(t,n).catch(()=>[]),{stdout:a}=await I(`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 Yo(t,n).catch(()=>[]),o=ls(a,e.id);if(o)return o;let s=a.filter(e=>!i.some(t=>t.id===e.id));if(s.length>0)return Wo(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 Yo(e,t){return e===`ios`?$o(t,`booted`):(await Xo(t)).filter(e=>!e.physical)}async function Xo(e){let t=await ts(e,`platform-tools`,G.platform===`win32`?`adb.exe`:`adb`),{stdout:n}=await I(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 is(t,e,n,`ro.product.model`),i=n.startsWith(`emulator-`),a=i?await os(t,e,n,r):await ss(t,e,n,r);return{id:n,label:a===r?a:`${a} (${r})`,name:a,physical:!i}}))).sort(fs)}async function Zo(e){let{stdout:t}=await I(await ts(e,`emulator`,G.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 Qo(e){let t=await Z.mkdtemp(M.join(jr.tmpdir(),`coreframe-ios-devices-`)),n=M.join(t,`devices.json`);try{return await Z.writeFile(n,``),await I(`xcrun`,[`devicectl`,`list`,`devices`,`--json-output`,n],{env:e}),(JSON.parse(await Z.readFile(n,`utf8`)).result?.devices??[]).filter(es).map(e=>({id:e.hardwareProperties.udid,label:`${e.deviceProperties.name} (${e.hardwareProperties.productType})`,name:e.deviceProperties.name,physical:!0})).sort(fs)}finally{await Z.rm(t,{force:!0,recursive:!0})}}async function $o(e,t=`available`){let{stdout:n}=await I(`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(fs)}function es(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 ts(e,t,n){let r=e.ANDROID_HOME??e.ANDROID_SDK_ROOT,i=r?[r]:rs(e);for(let e of i){let r=M.join(e,t,n);try{return await Z.access(r),r}catch{}}return n}async function ns(e,t,n){let r=await ts(n,`platform-tools`,G.platform===`win32`?`adb.exe`:`adb`),{stdout:i}=await I(r,[`-s`,e,`reverse`,`tcp:0`,`tcp:${t}`],{env:n,timeout:3e3}),a=Number(i.trim());if(!Number.isInteger(a)||a<1||a>65535)throw Error(`ADB did not return a valid reverse TCP port.`);let o=`tcp:${a}`,s=!1;return{async close(){s||(s=!0,await I(r,[`-s`,e,`reverse`,`--remove`,o],{env:n,timeout:3e3}).catch(()=>void 0))},serverUrl:`http://127.0.0.1:${a}`,viteHost:`127.0.0.1`}}function rs(e){return G.platform===`darwin`?[M.join(jr.homedir(),`Library`,`Android`,`sdk`)]:G.platform===`win32`&&e.LOCALAPPDATA?[M.join(e.LOCALAPPDATA,`Android`,`Sdk`)]:[M.join(jr.homedir(),`Android`,`Sdk`)]}async function is(e,t,n,r){return(await as(e,t,[`-s`,n,`shell`,`getprop`,r])).trim()}async function as(e,t,n){return(await I(e,n,{env:t,timeout:3e3})).stdout}async function os(e,t,n,r){return as(e,t,[`-s`,n,`emu`,`avd`,`name`]).then(e=>e.split(/\r?\n/)[0]?.trim()||r).catch(()=>r)}async function ss(e,t,n,r){return as(e,t,[`-s`,n,`shell`,`dumpsys`,`bluetooth_manager`]).then(e=>cs(e)||r).catch(()=>r)}function cs(e){return e.match(/\bname: (.+)/)?.[1]?.trim()}function ls(e,t){let n=e.map(e=>({device:e,score:Math.max(us(t,e.name),us(t,e.id))})).sort((e,t)=>t.score-e.score)[0];return n&&n.score>0?n.device:void 0}function us(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 ds(){return[...new Set(Object.values(jr.networkInterfaces()).flatMap(e=>e??[]).filter(e=>!e.internal&&e.family===`IPv4`).map(e=>e.address))].sort()}function fs(e,t){return e.label.localeCompare(t.label)}var ps=class{#e;#t=new Map;#n=new Set;#r;#i;#a;#o;#s=0;constructor({onEvent:e,verbose:t=!1,write:n}){this.#e=e,this.#r=t,this.#i=n}async handleLine(e){let t;try{t=JSON.parse(e)}catch{return $(e,`debug`)}if(!Array.isArray(t))return $(e,`debug`);let n=[];for(let e of t){if(!vs(e)){n.push(...$(JSON.stringify(e),`debug`));continue}if(e.id!==void 0&&(`result`in e||`error`in e)){this.#c(e);continue}if(typeof e.event!=`string`)continue;let t={event:e.event,params:vs(e.params)?e.params:{}};this.#l(t),await this.#e?.(t),n.push(...hs(t,this.#r))}return n}async restart({debounce:e=!1,fullRestart:t,reason:n}){let r=await this.#d();if(!r.supportsRestart)throw Error(`The running Flutter application does not support hot restart or reload.`);let i=await this.#u(`app.restart`,{appId:r.id,debounce:e,fullRestart:t,reason:n});if(!vs(i)||typeof i.code!=`number`)throw Error(`Flutter returned an invalid restart response.`);let a={code:i.code,message:typeof i.message==`string`?i.message:``};if(a.code!==0)throw Error(a.message||`Flutter restart failed with code ${a.code}.`);return a}async stop(){let e=await this.#d();if(await this.#u(`app.stop`,{appId:e.id})!==!0)throw Error(`Flutter did not stop the running application.`)}close(e=Error(`The Flutter machine connection closed.`)){if(this.#o)return;let t=bs(e);this.#o=t;for(let e of this.#t.values())e.reject(t);this.#t.clear(),this.#f(t)}#c(e){let t=String(e.id),n=this.#t.get(t);n&&(this.#t.delete(t),`error`in e?n.reject(Error(ys(e.error))):n.resolve(e.result))}#l({event:e,params:t}){let n=typeof t.appId==`string`?t.appId:void 0;if(e===`app.start`&&n){this.#a={id:n,started:!1,supportsRestart:t.supportsRestart===!0};return}if(e===`app.started`&&n&&this.#a?.id===n){let e={...this.#a,started:!0};this.#a=e;for(let t of this.#n)t.resolve(e);this.#n.clear();return}e===`app.stop`&&n&&this.#a?.id===n&&(this.#a=void 0,this.#f(Error(`The Flutter application stopped before it was ready.`)))}async#u(e,t){if(this.#o)throw this.#o;let n=String(++this.#s),r,i,a=new Promise((e,t)=>{r=t,i=e});this.#t.set(n,{reject:r,resolve:i});try{await this.#i(`${JSON.stringify([{id:n,method:e,params:t}])}\n`)}catch(e){this.#t.delete(n),r(bs(e))}return a}#d(){return this.#o?Promise.reject(this.#o):this.#a?.started?Promise.resolve(this.#a):new Promise((e,t)=>{this.#n.add({reject:t,resolve:e})})}#f(e){for(let t of this.#n)t.reject(e);this.#n.clear()}};async function*ms(e,t){try{for await(let n of e)yield*await t.handleLine(n)}catch(e){throw t.close(e),e}finally{t.close()}}function hs({event:e,params:t},n){if(e===`daemon.log`||e===`app.log`)return $(_s(t.log),t.error===!0?`error`:`debug`);if(e===`daemon.logMessage`){let e=gs(t.level);return!n&&e===`debug`?[]:[...$(_s(t.message),e),...n?$(_s(t.stackTrace),e):[]]}return e===`daemon.showMessage`?$(_s(t.message),gs(t.level)):e===`app.warning`?$(_s(t.warning),`warn`):e===`app.progress`&&t.finished!==!0?$(_s(t.message),`debug`):e===`app.stop`&&t.error!==void 0?$(ys(t.error),`error`):[]}function $(e,t){return e===void 0?[]:e.split(/\r?\n/u).map(e=>({level:t,message:e}))}function gs(e){return e===`error`?`error`:e===`warning`||e===`warn`?`warn`:`debug`}function _s(e){return typeof e==`string`&&e.length>0?e:void 0}function vs(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ys(e){if(typeof e==`string`)return e;if(vs(e)&&typeof e.message==`string`)return e.message;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function bs(e){return e instanceof Error?e:Error(ys(e))}async function xs(e,t){if(!e)return()=>void 0;Ge(M.dirname(e),{recursive:!0}),Ze(e,``,{flag:`a`});let n;try{n=q(e,`utf8`)}catch{n=void 0}let r=0,i=!1,a=Xe(e,{persistent:!1},()=>{if(i)return;let a=++r;B(e,`utf8`).then(e=>{i||a!==r||e===n||(n=e,t())},()=>void 0)});return()=>{i=!0,a.close()}}function Ss(e,t){let n={...e};return t===`web`||t===`webext`?n.COREFRAME_PLATFORM=`web`:n.COREFRAME_PLATFORM=t,n}const Cs=G.platform===`win32`?`portless.cmd`:`portless`,ws=RegExp(`\x1B\\[[0-?]*[ -/]*[@-~]`,`g`),Ts=/^Proxy is already running on port (\d+)\.$/,Es=/^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],a=r?.replace(ws,``).trim().match(Ts);if(a?.[1]!==void 0&&i!==void 0&&Es.test(i.replace(ws,``).trim())){n.push(`Portless proxy is running on port ${a[1]}.`),t[e+1]!==void 0&&n.push(t[e+1]),e+=t[e+3]===void 0?3:4;continue}n.push(t[e]??``),e+=1}return n.join(``)}function Os(e){let t=Ds(e);t&&G.stdout.write(t.endsWith(`
|
|
15
|
-
`)?t:`${t}\n`)}async function ks({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||(await qt()).isAgent?!1:Bt(e)}async function As({cwd:e,env:t,lan:n=!1}){let r=M.join(`node_modules`,`.bin`,Cs),i=[`proxy`,`start`,...n?[`--lan`]:[]];try{let{stdout:n}=await I(M.resolve(e,r),i,{cwd:e,env:t,stdin:`inherit`,stdout:`pipe`,stderr:`inherit`});Os(n)}catch(e){throw typeof e==`object`&&e&&`stdout`in e&&typeof e.stdout==`string`&&Os(e.stdout),e}}function js({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]]}const Ms=M.join(`.coreframe`,`dev`,`session.json`);async function Ns({appOrigin:e,cwd:t,device:n,flutterMcp:r,flutterMode:i,id:a,localOrigin:o,now:s=new Date,pid:c=process.pid,platform:l}){let u=M.resolve(t,Ms),d=M.dirname(u),f={version:2,id:a,pid:c,projectRoot:M.resolve(t),startedAt:s.toISOString(),platform:l,vite:{localOrigin:o,appOrigin:e},logs:{path:M.resolve(t,`.leylines`,`logs.sqlite`),scopes:{browser:`browser`,...i===void 0?void 0:{flutter:`dev.flutter`},vite:`dev.vite`}},...i===void 0?void 0:{flutter:{mode:i,mcp:r,state:`starting`,...n===void 0?void 0:{device:n}}}},p=Promise.resolve(),m=()=>{let e=`${JSON.stringify(f,void 0,2)}\n`;return p=p.then(async()=>{await z(d,{recursive:!0});let t=M.join(d,`.session-${a}.json`);await H(t,e,{mode:384}),await Oe(t,384),await Ne(t,u)}),p};return await m(),{path:u,async recordFlutterEvent({event:e,params:t}){let n=f.flutter;if(!n)return;let r=Is(t.appId),i;if(e===`daemon.connected`){let e=Ls(t.pid),r=Is(t.version);i={...Ps(n),state:`starting`,...e===void 0?void 0:{daemonPid:e},...r===void 0?void 0:{protocolVersion:r}}}else if(e===`app.start`&&r)i={...Ps(n),appId:r,state:`starting`,supportsRestart:t.supportsRestart===!0};else if(e===`app.started`&&r===n.appId)i={...n,state:`running`};else if(e===`app.debugPort`&&r===n.appId){let e=Is(t.wsUri);e&&(i={...n,vmServiceWsUri:e})}else if(e===`app.devTools`&&r===n.appId){let e=Is(t.uri);e&&(i={...n,devToolsUri:e})}else if(e===`app.dtd`&&r===n.appId){let e=Is(t.uri);e&&(i={...n,dtdUri:e})}else e===`app.stop`&&r===n.appId&&(i=Fs(n));i&&(f={...f,flutter:i},await m())},async recordFlutterExit(){!f.flutter||f.flutter.state===`stopped`||(f={...f,flutter:Fs(f.flutter)},await m())},async close(){await p;try{JSON.parse(await B(u,`utf8`)).id===a&&await V(u,{force:!0})}catch(e){if(e.code!==`ENOENT`)throw e}}}}function Ps(e){return{mode:e.mode,mcp:e.mcp,...e.device===void 0?void 0:{device:e.device},...e.daemonPid===void 0?void 0:{daemonPid:e.daemonPid},...e.protocolVersion===void 0?void 0:{protocolVersion:e.protocolVersion}}}function Fs(e){return{...Ps(e),state:`stopped`,...e.appId===void 0?void 0:{appId:e.appId},...e.supportsRestart===void 0?void 0:{supportsRestart:e.supportsRestart}}}function Is(e){return typeof e==`string`?e:void 0}function Ls(e){return typeof e==`number`?e:void 0}const Rs=`extension:dev`;function zs(e){if(!K(P(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=P(e,`package.json`),n;try{n=JSON.parse(q(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.${Rs} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function Bs({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`,Rs,...n.length>0?[`--`,...n]:[]]}const Vs=[`web`,`webext`,`ios`,`android`,`macos`,`windows`,`linux`],Hs=[`managed-dev-overlay`],Us=M.resolve(`node_modules`,`.bin`),Ws=G.platform===`win32`?`pnpm.cmd`:`pnpm`,Gs=G.platform===`win32`?`portless.cmd`:`portless`,Ks=G.platform===`win32`?`react-router.cmd`:`react-router`,qs=`Lost connection to device.`;async function Js({cwd:e=G.cwd(),debug:t,device:n,env:r=G.env,flutterDebug:i=!1,flutterMcp:a=!1,flutterOutput:o=`filtered`,host:s,https:c=!1,interactive:l=G.stdin.isTTY===!0,lan:u=!1,managed:d=!1,noCodesign:f=!1,noManaged:p=!1,noDevJobs:m=!1,platform:h=`web`,verbose:g=!1,webPort:_}={}){let v=It({env:r}),ee=r.PATH??r.Path??``,y=sc(h)?h:void 0,b=$t(i||a),x=oc(_??r.COREFRAME_WEB_PORT),S,C,w,te,ne,re,ie,ae,oe,T,se,ce,le,E=!1,D,O=r;if(d&&p)throw Error(`Cannot use --managed and --no-managed together.`);if(t===`managed-dev-overlay`&&d)throw Error(`Cannot use --managed with --debug managed-dev-overlay.`);if(i&&y===void 0)throw Error(`The --flutter-debug option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(a&&y===void 0)throw Error(`The --flutter-mcp option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(f&&h!==`macos`)throw Error(`The --no-codesign option is only supported for macOS Flutter development.`);if(o===`full`&&y===void 0)throw Error(`The --flutter-output option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(h===`webext`){if(d||p||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.`);zs(e)}if(c&&h!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(n!==void 0&&h!==`ios`&&h!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);let de=await v.measure(`routing`,()=>ks({cwd:e,env:r,platform:h}));de&&await v.measure(`portless`,()=>As({cwd:e,env:r,lan:u}));let k=y===void 0?h===`web`?x??await Ar.getAvailablePort():h===`webext`?x:void 0:x??await Ar.getAvailablePort(),A,pe=new Promise(e=>{A=e}),j=()=>{E||(E=!0,A(),C?.kill(`SIGTERM`),re?.kill(`SIGTERM`),ie?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),ae?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),oe?.close().catch(()=>void 0),S?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),he().catch(()=>void 0))},he=()=>te?(ne??=te[Symbol.asyncDispose](),ne):Promise.resolve(),N=e=>{D??=e,j()},ge=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>N(e);return G.on(e,t),{handler:t,signal:e}}),P=async e=>{let t=et(e);C=t;try{await t.expectSuccess()}catch(e){if(!E)throw e}finally{C===t&&(C=void 0)}};try{se=y?Gt({path:M.resolve(e,`.leylines`,`logs.sqlite`)}):void 0;let i=h===`ios`||h===`android`?h:void 0,_=i?await Ro({env:r,interactive:l,platform:i,target:n}):void 0;i&&_&&en({device:_,mode:b,platform:i});let x=y?se?.logger({scope:`dev.flutter`,properties:{platform:y,..._?{deviceId:_.id}:void 0}}):void 0;T=i&&_&&k!==void 0?await Bo({device:_,env:r,host:s,interactive:l,platform:i,port:k}):void 0;let C=T?.viteHost??(y?i?!0:`127.0.0.1`:s),ne=k===void 0?void 0:`${c?`https`:`http`}://127.0.0.1:${k}`,D=y===void 0?ne:T?.serverUrl??Vo(y,void 0,k),A={},he=!1,N;[A,he]=await Promise.all([v.measure(`config`,()=>U({cwd:e})),v.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(d||l&&!p)&&await zt(e))]),await v.measure(`i18n`,()=>er({cwd:e,projectConfig:A})),N=h!==`webext`&&Lr(e)?await Ar.getAvailablePort():void 0;let ge=await v.measure(`https`,async()=>c&&!de?Vt({cwd:e}):void 0),_e=Ss(r,h);O={..._e,...v.environment,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...!m&&h!==`webext`?{[Ht]:W()}:void 0,...y?{COREFRAME_PLATFORM:y,[Wt]:M.resolve(e,`.coreframe`,`managed-dev-flutter-restart`)}:void 0,...ge?{[Lt]:ge.cert,[Rt]:ge.key}:void 0,...N?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${N}`}:void 0},ne!==void 0&&D!==void 0&&(ce=await Ns({appOrigin:D,cwd:e,device:_,flutterMcp:a,flutterMode:y===void 0?void 0:b,id:W(),localOrigin:ne,platform:h}));let F=async()=>{if(!N)return;let t=Rr({cwd:e,env:O,port:N});oe=t;try{await t.listen(),await t.wait()}finally{await t.close(),oe===t&&(oe=void 0)}},ve=async()=>{let t=$e({label:`web`}),n=$e({color:`red`,label:`web`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),ie=I(de?Gs:Ks,de?js({host:C,lan:u,port:k}):ac({host:C,port:k,strictPort:h===`web`||y!==void 0}),{cwd:e,env:{...O,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[O.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:Us+M.delimiter+ee},stdin:`inherit`});let r=Promise.allSettled([tc(ie.stdout,t),tc(ie.stderr,n)]);try{await ie;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!E)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([Qe(t),Qe(n)]),ie=void 0}},ye=async()=>{let t=$e({label:`webext`}),n=$e({color:`red`,label:`webext`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),ae=I(Ws,Bs({host:s,port:k}),{cwd:e,env:O,stdin:`inherit`});let r=Promise.allSettled([tc(ae.stdout,t),tc(ae.stderr,n)]);try{await ae;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!E)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([Qe(t),Qe(n)]),ae=void 0}},be=async t=>{let n,r,i=!1,s,c=xs(O[Wt],()=>{if(E||!n||!r||s||b!==`debug`&&i)return;let e=n,t=r;s=(async()=>{if(b===`debug`){await t.restart({debounce:!0,fullRestart:!0,reason:`manual`});return}i=!0;try{await t.stop()}catch(t){let n=t instanceof Error?t.message:String(t);x?.write(`warn`,`Flutter stop failed; terminating it: ${n}`,{properties:{stream:`control`}}),G.stderr.write(`Flutter stop failed; terminating it: ${n}\n`),await e.nodeChildProcess.then(e=>e.kill(`SIGTERM`))}})().catch(e=>{let t=e instanceof Error?e.message:String(e);x?.write(`error`,`Flutter restart failed: ${t}`,{properties:{stream:`control`}}),G.stderr.write(`Flutter restart failed: ${t}\n`)}).finally(()=>{s=void 0})});try{for(;!E;){i=!1;let s=!1,c=h===`android`&&o===`filtered`&&!g?await me():void 0,u=I(`flutter`,tn({device:_??{id:h},flutterDriver:a,mode:b,serverUrl:D,verbose:g}),{cwd:M.join(e,`src-flutter`),env:Qt(_e,{noCodesign:f}),stdio:[`pipe`,`pipe`,`pipe`]}),d=new ps({onEvent:async e=>{Zs(e.params.message)&&(s=!0),await ce?.recordFlutterEvent(e)},verbose:g,write:async e=>{let t=await u.nodeChildProcess;if(!t.stdin)throw Error(`Flutter machine input is unavailable.`);t.stdin.write(e)===!1&&await Pt(t.stdin,`drain`)}}),p=e=>Xs(ms(e,d),()=>s=!0);S=u,n=u,r=d;try{let e=!1;try{let e=c?c.capture(ec(p(u),x,`output`)):Promise.all([$s(p(u.stdout),G.stdout,x,`stdout`),Ys(u.stderr,G.stderr,x,`stderr`)]);await Promise.all([u,e])}catch{e=!0}if(i&&!E)continue;if(E)return;let n=l?await L.confirm({initialValue:!0,message:s?`${qs} Restart Flutter?`:e?`Flutter failed. Retry?`:`Flutter exited unexpectedly. Restart Flutter?`}):!1;if(L.isCancel(n)||!n){if(!e&&!s){L.log.warn(`Flutter exited unexpectedly.`);return}L.log.warn(t?`Flutter stopped. Web development is still running.`:`Flutter stopped.`),await(t??pe);return}}finally{S===u&&(S=void 0),n===u&&(n=void 0),r===d&&(r=void 0),d.close(),ce?.recordFlutterExit().catch(e=>{let t=e instanceof Error?e.message:String(e);x?.write(`error`,`Failed to record Flutter exit: ${t}`,{properties:{stream:`control`}})})}}}finally{(await c)()}},xe=async()=>{if(h===`web`){await ve();return}let t=ve().then(()=>{if(!E)throw Error(`The Vite development server stopped while Flutter was still running.`)});await fe({cwd:e});try{await Promise.race([t,be(t)])}finally{j(),await Promise.allSettled([t,S]),S=void 0}},Se=async()=>{let t=et({name:`panda`,command:Ws,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:O});re=t;try{if(await t.expectSuccess(),!E)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!E)throw e}finally{re===t&&(re=void 0)}},R=async()=>{if(h===`webext`){await ye();return}let e=Se(),t=xe(),n=N?F():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),E&&await t}finally{j(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}};if(he&&(O={...O,[Ut]:`1`},r.COREFRAME_DEV_SUPERVISOR!==`0`&&(le=await v.measure(`supervisor`,()=>Ft({cwd:e,env:r})))),E)return;if(h===`webext`){v.report(),await R();return}if(A.database?.dialect===`sqlite`&&(await v.measure(`database`,async()=>{let t=await ue({config:A,cwd:e,env:r,tursoOutput:G.stdout,useSupervisorLease:!0});te=t,O={...O,...t.env}}),await v.measure(`schema`,()=>P({name:`db`,command:Ws,args:[`db`,`ensure`],cwd:e,env:O,prefix:!1})),E))return;if(ic(A)){let t=$e({label:`postgres`});t.pipe(G.stdout,{end:!1});try{let n=await v.measure(`database`,()=>rc({config:A,cwd:e,env:O,failIfRunning:!0,interactive:l,isStopping:()=>E,postgresOutput:t,useSupervisorLease:!0}));if(!n)return;w=n,O={...O,...n.env};try{E||await v.measure(`schema`,()=>P({name:`db`,command:Ws,args:[`db`,`ensure`],cwd:e,env:O,prefix:!1})),E||(v.report(),await R())}finally{await n[Symbol.asyncDispose](),w===n&&(w=void 0)}}finally{t.end()}return}v.report(),await R()}finally{j(),await T?.close(),T=void 0;let e;try{await w?.[Symbol.asyncDispose]()}catch(t){e=t}finally{try{await he()}finally{try{await ce?.close()}finally{le?.close(),se?.close();for(let{handler:e,signal:t}of ge)G.off(t,e)}}D&&(G.exitCode??=D===`SIGINT`?130:143)}nc(e)}}async function Ys(e,t,n,r){for await(let i of Qs(e,n,r))t.write(`${i}\n`)||await Pt(t,`drain`)}async function*Xs(e,t){for await(let n of e)Zs(n.message)&&t(),yield n}function Zs(e){return typeof e==`string`&&e.trim()===qs}async function*Qs(e,t,n){for await(let r of e){let e=de(r);e.message&&t?.write(e.level,e.message,{properties:{stream:n}}),yield r}}async function $s(e,t,n,r){for await(let i of ec(e,n,r))t.write(`${i}\n`)||await Pt(t,`drain`)}async function*ec(e,t,n){for await(let r of e)r.message&&t?.write(r.level,r.message,{properties:{stream:n}}),yield r.message}async function tc(e,t){for await(let n of e)t.write(`${n}\n`)||await Pt(t,`drain`)}function nc(e){if(e)throw e}async function rc({interactive:e,isStopping:t,...n}){try{return await E(n)}catch(r){if(!(r instanceof h)||!e)throw r;let i=await L.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${r.pid}). Stop it and start here?`});if(L.isCancel(i)||!i){L.cancel(`Keeping the existing PostgreSQL process.`);return}return await D(r),t()?void 0:E(n)}}function ic(e){return(e.database?.dialect??`postgres`)===`postgres`}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}function sc(e){return e===`android`||e===`ios`||e===`linux`||e===`macos`||e===`windows`}async function cc(e={}){let t=e.cwd??G.cwd(),n=`scripts/preview.ts`,r={},i=!0;try{await De(M.resolve(t,n))}catch(e){if(e.code===`ENOENT`)i=!1;else throw e}if(i){let e=await ze(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 lc=`worker-configuration.d.ts`;async function uc({check:e=!1,cwd:t=process.cwd()}={}){let n=await U({cwd:t}),r=await mt({coreframeConfig:n,cwd:t}),i=F(t,lc),a=F(t,`.coreframe-worker-types-${W()}.d.ts`);try{try{await I(`pnpm`,[`exec`,`wrangler`,`types`,a,`--config`,r.path,`--strict-vars=false`,`--include-runtime=false`],{cwd:t,stdio:[`ignore`,`pipe`,`pipe`]})}catch(e){throw dc(e),e}let o=fc(await B(a,`utf8`)),s=Ve(r.config),c=Be(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${pc(c)}\n`;if(e){if(await B(i,`utf8`).catch(()=>``)!==l)throw Error(`${lc} is stale. Run "coreframe worker typegen" and commit the result.`);return{changed:!1,path:i}}let u=await B(i,`utf8`).catch(()=>``);return u!==l&&await H(i,l),{changed:u!==l,path:i}}finally{await r.dispose(),await V(a,{force:!0})}}function dc(e){if(typeof e!=`object`||!e||!(`output`in e))return;let{output:t}=e;typeof t!=`string`||t===``||process.stderr.write(t.endsWith(`
|
|
16
|
-
`)?t:`${t}\n`)}function
|
|
17
|
-
`)}function
|
|
18
|
-
`)}const mc=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),hc=[`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`,`react-router.config.ts`,`src/web`],gc=[`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`],_c=[`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`],vc=`.coreframe/typegen.json`,yc=[`web`,`dashboard`,`worker`];async function bc({checkWorker:e=!1,cwd:t=G.cwd(),runners:n={}}={}){let r=await wc(t)??{generators:{},schemaVersion:1},i=[];return i.push(await Sc({cwd:t,inputPaths:hc,name:`web`,outputPath:`.react-router`,run:()=>(n.web??Cc)(t),state:r})),i.push(await Sc({cwd:t,inputPaths:gc,name:`dashboard`,outputPath:`dashboard/.react-router`,run:()=>(n.dashboard??Tr)(t),state:r})),i.push(await Sc({cwd:t,inputPaths:_c,name:`worker`,outputPath:`worker-configuration.d.ts`,run:()=>(n.worker??uc)({check:e,cwd:t}),state:r})),i}function xc(e){return`${{dashboard:`Dashboard route types`,web:`Web route types`,worker:`Worker types`}[e.name]} ${e.changed?`generated`:`unchanged`}.`}async function Sc({cwd:e,inputPaths:t,name:n,outputPath:r,run:i,state:a}){let o=await Ec(e,t),s=await Dc(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 Dc(e,r);if(!l)throw Error(`Coreframe ${n} typegen did not produce ${r}.`);return a.generators[n]={inputFingerprint:o,outputFingerprint:l},await Tc(e,a),{changed:s!==l,name:n,ran:!0}}async function Cc(e){let t=G.platform===`win32`?`react-router.cmd`:`react-router`,n=G.env;await I(t,[`typegen`],{cwd:e,env:{...n,PATH:M.resolve(e,`node_modules/.bin`)+M.delimiter+(n.PATH??n.Path??``)},stdio:`inherit`})}async function wc(e){try{let t=JSON.parse(await B(M.resolve(e,vc),`utf8`));if(!jc(t)||t.schemaVersion!==1)return;let n={};if(!jc(t.generators))return;for(let e of yc){let r=t.generators[e];jc(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 Tc(e,t){let n=M.resolve(e,vc);await z(M.dirname(n),{recursive:!0}),await H(n,`${JSON.stringify(t)}\n`,{mode:384})}async function Ec(e,t){let n=He(`sha256`);for(let r of[...t].sort()){let t=M.resolve(e,r),i=await kc(t);if(!i){n.update(`missing:${r}\0`);continue}if(i.isDirectory()){n.update(`directory:${r}\0`);for(let r of await Oc(t)){let i=M.join(t,r),a=M.relative(e,i).split(M.sep).join(`/`);n.update(`${a}\0`),n.update(await B(i))}continue}i.isFile()&&(n.update(`file:${r}\0`),n.update(await B(t)))}return n.digest(`hex`)}async function Dc(e,t){if(await kc(M.resolve(e,t)))return Ec(e,[t])}async function Oc(e){let t=[];async function n(e,r){let i=await Me(e,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i)if(a.isDirectory()){if(mc.has(a.name))continue;await n(M.join(e,a.name),M.join(r,a.name))}else a.isFile()&&t.push(M.join(r,a.name))}return await n(e,``),t.sort()}async function kc(e){try{return await Pe(e)}catch(e){if(Ac(e))return;throw e}}function Ac(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}function jc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Mc=M.resolve(`node_modules`,`.bin`);G.env.PATH=Mc+M.delimiter+G.env.PATH;const Nc=G.platform===`win32`?`tsc.cmd`:`tsc`,Pc=[{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 Fc(){await bc({checkWorker:!0});let e=[];for(let t of Pc)try{await De(t.path),e.push(t)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let t=e.map(e=>et({name:e.name,command:Nc,args:[`-p`,e.path]})),n=(await Promise.all(t.map(e=>e.wait()))).filter(e=>e.exitCode!==0);n.length>0&&(G.exitCode=n[0].exitCode)}const Ic=r(s(Hs),{displayName:`feature`,from:async e=>e}),Lc=r(s(Zt),{displayName:`filtered|full`,from:async e=>e}),Rc=[`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.`],zc=n({name:`deploy`,args:{environment:u({type:s(ct),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}),yes:i({long:`yes`,short:`y`,description:`Approve the production deployment confirmation.`,defaultValue:()=>!1})},handler:({environment:e,runMigrations:t,skipMigrations:n,skipPostDeployChecks:r,yes:i})=>po([e,...t?[`--run-migrations`]:[],...n?[`--skip-migrations`]:[],...r?[`--skip-post-deploy-checks`]:[],...i?[`--yes`]:[]])}),Bc=m({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 St();if(e){console.log(JSON.stringify({...t,notices:Rc}));return}console.log(t.url),console.error(`Staging hostname reassigned. ${Rc.join(` `)}`)}}),url:n({name:`url`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await ut();console.log(e?JSON.stringify({url:t}):t)}})}}),Vc=m({name:`secrets`,cmds:{"rotate-access-token":n({name:`rotate-access-token`,args:{environment:u({type:s(ct),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 Et({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(ct)),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 dt({environment:e});console.log(t?JSON.stringify(n):qc(n))}}),set:n({name:`set`,args:{environment:u({type:s(ct),displayName:`environment`,description:`Worker environment to update on its next deploy.`}),name:u({type:l(p),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 _t({environment:e,name:t,value:await Jc(t)}),console.log(`Queued ${t} for ${e}. Run coreframe deploy ${e} to apply.`);return}let r=await yt(),i=n?await Xc(r):await Yc(r,e);await vt({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(ct),displayName:`environment`,description:`Worker environment with a queued secret update.`}),name:u({type:p,displayName:`name`,description:`Declared Worker secret name.`})},handler:async({environment:e,name:t})=>{let n=await lt({environment:e,name:t});console.log(n?`Discarded the queued ${t} update for ${e}.`:`No ${t} update is queued for ${e}.`)}})}}),Hc=n({name:`typecheck`,args:{},handler:Fc}),Uc=m({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 uc({check:e});console.log(e?`${Qc(t.path)} is current.`:`${Qc(t.path)} ${t.changed?`generated`:`is unchanged`}.`)}})}}),Wc=n({name:`dev`,args:{debug:c({long:`debug`,type:l(Ic),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}),flutterMcp:i({long:`flutter-mcp`,description:`Enable the app-side Flutter MCP QA bridge and imply Flutter debug mode.`,defaultValue:()=>!1}),flutterOutput:c({long:`flutter-output`,type:Lc,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}),host:c({long:`host`,type:l(p),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}),noCodesign:i({long:`no-codesign`,description:`Disable Xcode code signing for macOS Flutter development.`,defaultValue:()=>!1}),noManaged:i({long:`no-managed`,description:`Run without managed checkout synchronization for this invocation.`,defaultValue:()=>!1}),noDevJobs:i({long:`no-dev-jobs`,description:`Skip automatic local development jobs for this invocation.`,defaultValue:()=>!1}),simulator:i({long:`simulator`,description:`Run iOS in Flutter debug mode on the Apple iOS Simulator.`,defaultValue:()=>!1}),platform:u({type:l(s(Vs)),displayName:`platform`,description:`Development target platform. Defaults to web.`}),device:u({type:l(p),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,flutterDebug:n,flutterMcp:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noCodesign:l,noManaged:u,noDevJobs:d,platform:f,port:p,simulator:m,verbose:h})=>{let g=Gc({device:t,flutterDebug:n,platform:f,simulator:m});return Js({debug:e,device:g.device,flutterDebug:g.flutterDebug,flutterMcp:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noCodesign:l,noManaged:u,noDevJobs:d,platform:f??`web`,verbose:h,webPort:p})}});function Gc({device:e,flutterDebug:t,platform:n,simulator:r}){if(!r)return{device:e,flutterDebug:t};if(n!==`ios`)throw Error(`The --simulator flag is only supported for the iOS development target.`);if(e!==void 0)throw Error(`The --simulator flag cannot be combined with an explicit device.`);return{device:`apple_ios_simulator`,flutterDebug:!0}}const Kc=n({name:`preview`,args:{host:c({long:`host`,type:l(p),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})=>cc({host:e,port:t})});function qc(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(`
|
|
19
|
-
`)}async function
|
|
13
|
+
`:``;Ze(e,`${JSON.stringify(n,null,r)}${i}`)}function oo(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t)console.log(` ${e}`);console.log(``)}}function so(e){let t=F(Xa([`rev-parse`,`--show-toplevel`]).trim(),`package.json`),n=q(t,`utf8`),r=Za(n,t),i=Q(e.target),a=ro(i),o=new Set(a.map(({name:e})=>e)),s=[],c=[],l=[],u=0;for(let e of a){let t=io(r,e.name);if(!t){c.push(`missing: ${e.name} ${e.spec} (${e.group})`);continue}if(eo(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=Ya.flatMap(e=>Object.entries(r[e]??{}).filter(([e])=>$a(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;ao(t,n,r)}console.log(`Coreframe package sync: ${i}`),console.log(``),oo(e.apply?`Updated Coreframe packages`:`Would update Coreframe packages`,s.map(({currentSpec:e,name:t,spec:n})=>`update: ${t} ${e} -> ${n}`)),oo(`Missing target Coreframe packages`,c),oo(`Locally linked Coreframe packages`,l),oo(`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 co={...p,displayName:`recipe`,description:`Coreframe recipe name, such as yam-db.`,async from(e){return li(e)}},lo=m({name:`upgrade`,cmds:{"ensure-template-remote":n({name:`ensure-template-remote`,args:{remote:c({long:`remote`,type:p,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})=>yi({fetch:!e,remote:t})}),"check-skill-current":n({name:`check-skill-current`,args:{target:c({long:`target`,type:p,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=wa({apply:e,target:t})}}),"fast-forward-template-files":n({name:`fast-forward-template-files`,args:{target:c({long:`target`,type:p,description:`Target Coreframe template git ref.`}),base:c({long:`base`,type:l(p),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})=>Ja({apply:e,base:t,target:n})}),"sync-coreframe-packages":n({name:`sync-coreframe-packages`,args:{target:c({long:`target`,type:p,description:`Target Coreframe template git ref.`}),apply:i({long:`apply`,description:`Update existing published Coreframe dependency specifications.`,defaultValue:()=>!1})},handler:({apply:e,target:t})=>so({apply:e,target:t})})}}),uo=m({name:`recipes`,cmds:{apply:n({name:`apply`,args:{recipe:u({type:co,displayName:`recipe`,description:`Recipe to prepare and apply.`}),target:c({long:`target`,type:l(p),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:p,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})=>Qi(Zi({fetch:!e,name:t,remote:n,target:r}))}),list:n({name:`list`,args:{target:c({long:`target`,type:l(p),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:p,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})=>_a(ga({fetch:!e,remote:t,target:n}))}),verify:n({name:`verify`,args:{recipe:u({type:co,displayName:`recipe`,description:`Recipe adoption to verify.`}),target:c({long:`target`,type:l(p),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:p,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})=>Ji(qi({fetch:!e,name:t,remote:n,target:r}))})}}),fo=m({name:`db`,cmds:{ensure:n({name:`ensure`,args:{},handler:S}),generate:n({name:`generate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit generate.`})},handler:({args:e})=>E(`generate`,e)}),migrate:n({name:`migrate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit migrate.`})},handler:({args:e})=>E(`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})=>re({target:e?`local`:`deployment`})}),"migrate-local":n({name:`migrate-local`,args:{},handler:ie}),"migrations-check":n({name:`migrations-check`,args:{},handler:g}),reset:n({name:`reset`,args:{},handler:ae}),seed:n({name:`seed`,args:{},handler:()=>se()}),"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})=>_({seed:e})}),setup:n({name:`setup`,args:{},handler:()=>ce()}),studio:n({name:`studio`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit studio.`})},handler:({args:e})=>E(`studio`,e)})}}),po=`package.json`;async function mo(e=process.argv.slice(2),t=process.env){let n=ho(e);Co(n);let{packageJson:r,source:i}=await bt(po),a=await U(),o=wt(a.deploy,n.environment,t);wo(n,o.mode),Oo(t,[`POSTHOG_API_KEY`,`POSTHOG_PROJECT_ID`]);let s=await To(o,n.environment,()=>ut({env:t})),c=o.mode===`full`?await _o(n.environment,t):void 0,l=await So();await rr({env:t,revision:l});let u=l.slice(0,12),d=Tt(n.environment,r.version,u),f=Ct(r.name,d),p={...Mo(t,n.environment,f,r.name,d),COREFRAME_I18N_RELEASE_REVISION:l},m=n.environment===`production`,h=!1;L.intro(`Deploy ${f} to ${n.environment}`);let g=Object.keys(c?.pendingWorkerSecrets.values??{}).sort();g.length>0&&L.note(g.join(`
|
|
14
|
+
`),`Pending Worker secret updates`),c?.accessTokenSigningSecret.provisioned&&L.log.info(`Provisioning Coreframe-managed access-token signing material.`),await Do(n);let _=o.mode===`full`?await vo(a,n,t):!1;try{m&&await jt(po,r,d),L.log.step(`Running pre-deploy build`),await I(`pnpm`,[`build`],{env:No(p),stdio:`inherit`}),L.log.step(`Running release build and uploading PostHog source maps`),h=!0,await I(`pnpm`,[`build`],{env:p,stdio:`inherit`}),_&&(L.log.step(`Running deploy-safe database migrations`),await I(`pnpm`,[`db`,`migrate`],{env:p,stdio:`inherit`})),L.log.step(o.mode===`full`?`Deploying Worker and static assets to Cloudflare`:`Deploying static assets to Cloudflare`);let e={...c?.dashboardPassword?{DASHBOARD_PASSWORD:c.dashboardPassword}:{},...c?.accessTokenSigningSecret.value?{[ot]:c.accessTokenSigningSecret.value}:{},...c?.pendingWorkerSecrets.values},t=Object.keys(e).length>0?await Ao(e):void 0,i=o.mode===`full`?await pt({coreframeConfig:a,environment:n.environment,contributions:{generatedValues:{DEPLOY_ENV:n.environment,POSTHOG_RELEASE:f}}}):await ft(process.cwd());try{await I(`pnpm`,[`exec`,`wrangler`,`deploy`,`--config`,i.path,...o.mode===`full`?[`--env`,n.environment]:[],`--strict`,`--keep-vars`,`--tag`,f,`--message`,`Deploy ${f}`,...t?[`--secrets-file`,t.path]:[]],{env:p,stdio:`inherit`}),c&&(await st(c.pendingWorkerSecrets),await At({environment:n.environment}))}finally{await i.dispose(),await t?.dispose()}let l={environment:n.environment,releaseName:f,url:s,version:d};o.mode===`full`&&o.afterWorkerDeploy&&(L.log.step(`Running required after-Worker deploy hook`),await Dt(o,l)),n.skipPostDeployChecks||(L.log.step(`Running post-deploy checks`),await Ot(o,l)),L.outro(`Deployed ${f} to ${n.environment}`)}catch(e){throw!h&&m&&await H(po,i),e}}function ho(e){return{environment:go(e[0]),runMigrations:e.includes(`--run-migrations`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),yes:e.includes(`--yes`)}}function go(e){if(e&&ct.includes(e))return e;throw Error(`Deploy environment must be one of: ${ct.join(`, `)}.`)}async function _o(e,t){let n=await xt({environment:e}),r=n.values.DASHBOARD_PASSWORD??await ko(t,e);return kt(await dt({environment:e}),e,{availableNames:[...Object.keys(n.values),...r?[`DASHBOARD_PASSWORD`]:[]]}),{accessTokenSigningSecret:await gt({environment:e}),dashboardPassword:r,pendingWorkerSecrets:n}}async function vo(e,t,n){let r=e.database?.dialect??`postgres`,i;switch(r){case`postgres`:i=await y({env:n});break;case`sqlite`:i=await b({env:n});break;default:throw Error(`Unsupported database dialect "${r}".`)}let a=await yo(i),o=await oe(a);if(o.length>0)throw Error(`Pending deploy migrations contain unsafe SQL. Move unsafe statements to held migrations.\n${ne(o)}`);return xo(t,a)}async function yo(e){try{return await bo(e)}finally{await e.close?.()}}async function bo(e){return C(await v(),await T(e))}async function xo(e,t){if(t.length===0)return L.log.info(`No pending deploy migrations.`),!1;if(L.note(te(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 L.confirm({initialValue:!0,message:`Run these deploy-safe database migrations before Cloudflare deploy?`});if(L.isCancel(n))throw L.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`);return n}async function So(){let{stdout:e}=await I(`git`,[`status`,`--porcelain`],{stdin:`ignore`});if(e.trim().length>0)throw Error(`Deploy requires a clean git tree.`);let{stdout:t}=await I(`git`,[`rev-parse`,`HEAD`],{stdin:`ignore`});return t.trim()}function Co(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations or --skip-migrations.`)}function wo(e,t){if(t===`client`&&(e.runMigrations||e.skipMigrations))throw Error(`Migration flags are not available when deploy.mode is "client".`)}async function To(e,t,n=ut){return e.url?Eo(e.url,t):t===`staging`&&e.stagingHostname?Eo(await n(),t):Eo(void 0,t)}function Eo(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 Do(e){if(e.environment!==`production`||e.yes)return;if(!process.stdout.isTTY)throw Error(`Production deploys require --yes in noninteractive environments.`);let t=await L.confirm({initialValue:!1,message:`Deploy to production?`});if(L.isCancel(t)||!t)throw L.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`)}function Oo(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 ko(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(n)return n;let r;try{r=Nt(await z(`.env`,`utf8`))}catch(e){throw jo(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 Ao(e){let t=await Me(P(Le(),`coreframe-deploy-secrets-`)),n=P(t,`secrets.json`);return await H(n,JSON.stringify(e),{mode:384}),{path:n,dispose:()=>B(t,{force:!0,recursive:!0})}}function jo(e){return e instanceof Error&&`code`in e}function Mo(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 No(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}async function Po(){let e=await Io();return typeof e.mobileDevHost==`string`?{mobileDevHost:e.mobileDevHost}:{}}async function Fo(e){let t=await Io(),n=Lo();await Z.mkdir(M.dirname(n),{recursive:!0}),await Z.writeFile(n,`${JSON.stringify({...t,...e},void 0,2)}\n`)}async function Io(){try{let e=await Z.readFile(Lo(),`utf8`),t=JSON.parse(e);return Ro(t)?t:{}}catch{return{}}}function Lo(){return M.join(Mr.homedir(),`.coreframe`,`preferences.json`)}function Ro(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function zo({env:e=G.env,interactive:t=G.stdin.isTTY===!0,platform:n,target:r}){let i=await Ko(n,e).catch(()=>[]),a=r?us(i,r):void 0;if(a)return a;if(!r&&i.length>0)return Go(i,n,t);let o=r?us(await Jo(e).catch(()=>[]),r):void 0;if(o&&o.platform===n)return Yo(o,n,e,t);let s=await qo(n,e),c=r?us(s,r):void 0;if(c)return c;if(!r&&s.length>0)return Go(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 Bo(e){let{device:t,host:n,interactive:r=G.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=fs();if(i.length===0)throw Error(`No external IP address was detected. Pass one explicitly with --host.`);let a=await Uo();if(a&&i.includes(a))return a;if(i.length===1)return await Wo(i[0]),i[0];if(!r)throw Error(`Multiple external IP addresses were detected (${i.join(`, `)}). Pass one explicitly with --host.`);let o=await L.select({message:`Which IP address should the mobile device use to reach the development server?`,options:i.map(e=>({label:e,value:e}))});if(L.isCancel(o))throw Error(`Mobile development IP selection was cancelled.`);return await Wo(o),o}async function Vo({device:e,env:t=G.env,host:n,interactive:r,platform:i,port:a}){if(i===`android`&&e.physical&&n===void 0)try{return await rs(e.id,a,t)}catch{L.log.warn(`Could not establish Android ADB port forwarding. Using the LAN development address instead.`)}return{close:async()=>void 0,serverUrl:Ho(i,await Bo({device:e,host:n,interactive:r,platform:i}),a),viteHost:!0}}function Ho(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}`}async function Uo(){return(await Po()).mobileDevHost}async function Wo(e){try{await Fo({mobileDevHost:e})}catch(e){L.log.warn(`Could not remember the mobile development IP address: ${e instanceof Error?e.message:String(e)}`)}}async function Go(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 L.select({message:`Which ${t===`ios`?`iOS`:`Android`} device should Coreframe use?`,options:e.map(e=>({label:e.label,value:e,hint:e.id}))});if(L.isCancel(r))throw Error(`Mobile development device selection was cancelled.`);return r}async function Ko(e,t){return e===`android`?Zo(t):$o(t)}async function qo(e,t){return e===`android`?Qo(t):es(t)}async function Jo(e){let{stdout:t}=await I(`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 Yo(e,t,n,r){let i=await Xo(t,n).catch(()=>[]),{stdout:a}=await I(`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 Xo(t,n).catch(()=>[]),o=us(a,e.id);if(o)return o;let s=a.filter(e=>!i.some(t=>t.id===e.id));if(s.length>0)return Go(s,t,r);if(a.length===1)return a[0];await qt(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 Xo(e,t){return e===`ios`?es(t,`booted`):(await Zo(t)).filter(e=>!e.physical)}async function Zo(e){let t=await ns(e,`platform-tools`,G.platform===`win32`?`adb.exe`:`adb`),{stdout:n}=await I(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 as(t,e,n,`ro.product.model`),i=n.startsWith(`emulator-`),a=i?await ss(t,e,n,r):await cs(t,e,n,r);return{id:n,label:a===r?a:`${a} (${r})`,name:a,physical:!i}}))).sort(ps)}async function Qo(e){let{stdout:t}=await I(await ns(e,`emulator`,G.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 $o(e){let t=await Z.mkdtemp(M.join(Mr.tmpdir(),`coreframe-ios-devices-`)),n=M.join(t,`devices.json`);try{return await Z.writeFile(n,``),await I(`xcrun`,[`devicectl`,`list`,`devices`,`--json-output`,n],{env:e}),(JSON.parse(await Z.readFile(n,`utf8`)).result?.devices??[]).filter(ts).map(e=>({id:e.hardwareProperties.udid,label:`${e.deviceProperties.name} (${e.hardwareProperties.productType})`,name:e.deviceProperties.name,physical:!0})).sort(ps)}finally{await Z.rm(t,{force:!0,recursive:!0})}}async function es(e,t=`available`){let{stdout:n}=await I(`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(ps)}function ts(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 ns(e,t,n){let r=e.ANDROID_HOME??e.ANDROID_SDK_ROOT,i=r?[r]:is(e);for(let e of i){let r=M.join(e,t,n);try{return await Z.access(r),r}catch{}}return n}async function rs(e,t,n){let r=await ns(n,`platform-tools`,G.platform===`win32`?`adb.exe`:`adb`),{stdout:i}=await I(r,[`-s`,e,`reverse`,`tcp:0`,`tcp:${t}`],{env:n,timeout:3e3}),a=Number(i.trim());if(!Number.isInteger(a)||a<1||a>65535)throw Error(`ADB did not return a valid reverse TCP port.`);let o=`tcp:${a}`,s=!1;return{async close(){s||(s=!0,await I(r,[`-s`,e,`reverse`,`--remove`,o],{env:n,timeout:3e3}).catch(()=>void 0))},serverUrl:`http://127.0.0.1:${a}`,viteHost:`127.0.0.1`}}function is(e){return G.platform===`darwin`?[M.join(Mr.homedir(),`Library`,`Android`,`sdk`)]:G.platform===`win32`&&e.LOCALAPPDATA?[M.join(e.LOCALAPPDATA,`Android`,`Sdk`)]:[M.join(Mr.homedir(),`Android`,`Sdk`)]}async function as(e,t,n,r){return(await os(e,t,[`-s`,n,`shell`,`getprop`,r])).trim()}async function os(e,t,n){return(await I(e,n,{env:t,timeout:3e3})).stdout}async function ss(e,t,n,r){return os(e,t,[`-s`,n,`emu`,`avd`,`name`]).then(e=>e.split(/\r?\n/)[0]?.trim()||r).catch(()=>r)}async function cs(e,t,n,r){return os(e,t,[`-s`,n,`shell`,`dumpsys`,`bluetooth_manager`]).then(e=>ls(e)||r).catch(()=>r)}function ls(e){return e.match(/\bname: (.+)/)?.[1]?.trim()}function us(e,t){let n=e.map(e=>({device:e,score:Math.max(ds(t,e.name),ds(t,e.id))})).sort((e,t)=>t.score-e.score)[0];return n&&n.score>0?n.device:void 0}function ds(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 fs(){return[...new Set(Object.values(Mr.networkInterfaces()).flatMap(e=>e??[]).filter(e=>!e.internal&&e.family===`IPv4`).map(e=>e.address))].sort()}function ps(e,t){return e.label.localeCompare(t.label)}var ms=class{#e;#t=new Map;#n=new Set;#r;#i;#a;#o;#s=0;constructor({onEvent:e,verbose:t=!1,write:n}){this.#e=e,this.#r=t,this.#i=n}async handleLine(e){let t;try{t=JSON.parse(e)}catch{return $(e,`debug`)}if(!Array.isArray(t))return $(e,`debug`);let n=[];for(let e of t){if(!ys(e)){n.push(...$(JSON.stringify(e),`debug`));continue}if(e.id!==void 0&&(`result`in e||`error`in e)){this.#c(e);continue}if(typeof e.event!=`string`)continue;let t={event:e.event,params:ys(e.params)?e.params:{}};this.#l(t),await this.#e?.(t),n.push(...gs(t,this.#r))}return n}async restart({debounce:e=!1,fullRestart:t,reason:n}){let r=await this.#d();if(!r.supportsRestart)throw Error(`The running Flutter application does not support hot restart or reload.`);let i=await this.#u(`app.restart`,{appId:r.id,debounce:e,fullRestart:t,reason:n});if(!ys(i)||typeof i.code!=`number`)throw Error(`Flutter returned an invalid restart response.`);let a={code:i.code,message:typeof i.message==`string`?i.message:``};if(a.code!==0)throw Error(a.message||`Flutter restart failed with code ${a.code}.`);return a}async stop(){let e=await this.#d();if(await this.#u(`app.stop`,{appId:e.id})!==!0)throw Error(`Flutter did not stop the running application.`)}close(e=Error(`The Flutter machine connection closed.`)){if(this.#o)return;let t=xs(e);this.#o=t;for(let e of this.#t.values())e.reject(t);this.#t.clear(),this.#f(t)}#c(e){let t=String(e.id),n=this.#t.get(t);n&&(this.#t.delete(t),`error`in e?n.reject(Error(bs(e.error))):n.resolve(e.result))}#l({event:e,params:t}){let n=typeof t.appId==`string`?t.appId:void 0;if(e===`app.start`&&n){this.#a={id:n,started:!1,supportsRestart:t.supportsRestart===!0};return}if(e===`app.started`&&n&&this.#a?.id===n){let e={...this.#a,started:!0};this.#a=e;for(let t of this.#n)t.resolve(e);this.#n.clear();return}e===`app.stop`&&n&&this.#a?.id===n&&(this.#a=void 0,this.#f(Error(`The Flutter application stopped before it was ready.`)))}async#u(e,t){if(this.#o)throw this.#o;let n=String(++this.#s),r,i,a=new Promise((e,t)=>{r=t,i=e});this.#t.set(n,{reject:r,resolve:i});try{await this.#i(`${JSON.stringify([{id:n,method:e,params:t}])}\n`)}catch(e){this.#t.delete(n),r(xs(e))}return a}#d(){return this.#o?Promise.reject(this.#o):this.#a?.started?Promise.resolve(this.#a):new Promise((e,t)=>{this.#n.add({reject:t,resolve:e})})}#f(e){for(let t of this.#n)t.reject(e);this.#n.clear()}};async function*hs(e,t){try{for await(let n of e)yield*await t.handleLine(n)}catch(e){throw t.close(e),e}finally{t.close()}}function gs({event:e,params:t},n){if(e===`daemon.log`||e===`app.log`)return $(vs(t.log),t.error===!0?`error`:`debug`);if(e===`daemon.logMessage`){let e=_s(t.level);return!n&&e===`debug`?[]:[...$(vs(t.message),e),...n?$(vs(t.stackTrace),e):[]]}return e===`daemon.showMessage`?$(vs(t.message),_s(t.level)):e===`app.warning`?$(vs(t.warning),`warn`):e===`app.progress`&&t.finished!==!0?$(vs(t.message),`debug`):e===`app.stop`&&t.error!==void 0?$(bs(t.error),`error`):[]}function $(e,t){return e===void 0?[]:e.split(/\r?\n/u).map(e=>({level:t,message:e}))}function _s(e){return e===`error`?`error`:e===`warning`||e===`warn`?`warn`:`debug`}function vs(e){return typeof e==`string`&&e.length>0?e:void 0}function ys(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function bs(e){if(typeof e==`string`)return e;if(ys(e)&&typeof e.message==`string`)return e.message;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function xs(e){return e instanceof Error?e:Error(bs(e))}async function Ss(e,t){if(!e)return()=>void 0;Ge(M.dirname(e),{recursive:!0}),Ze(e,``,{flag:`a`});let n;try{n=q(e,`utf8`)}catch{n=void 0}let r=0,i=!1,a=Xe(e,{persistent:!1},()=>{if(i)return;let a=++r;z(e,`utf8`).then(e=>{i||a!==r||e===n||(n=e,t())},()=>void 0)});return()=>{i=!0,a.close()}}function Cs(e,t){let n={...e};return t===`web`||t===`webext`?n.COREFRAME_PLATFORM=`web`:n.COREFRAME_PLATFORM=t,n}const ws=G.platform===`win32`?`portless.cmd`:`portless`,Ts=RegExp(`\x1B\\[[0-?]*[ -/]*[@-~]`,`g`),Es=/^Proxy is already running on port (\d+)\.$/,Ds=/^To restart: portless proxy stop(?: (?:-p|--port) \d+)? && portless proxy start(?: (?:-p|--port) \d+)?$/;function Os(e){let t=e.split(/(\r\n|\n)/),n=[];for(let e=0;e<t.length;){let r=t[e],i=t[e+2],a=r?.replace(Ts,``).trim().match(Es);if(a?.[1]!==void 0&&i!==void 0&&Ds.test(i.replace(Ts,``).trim())){n.push(`Portless proxy is running on port ${a[1]}.`),t[e+1]!==void 0&&n.push(t[e+1]),e+=t[e+3]===void 0?3:4;continue}n.push(t[e]??``),e+=1}return n.join(``)}function ks(e){let t=Os(e);t&&G.stdout.write(t.endsWith(`
|
|
15
|
+
`)?t:`${t}\n`)}async function As({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||(await Jt()).isAgent?!1:Bt(e)}async function js({cwd:e,env:t,lan:n=!1}){let r=M.join(`node_modules`,`.bin`,ws),i=[`proxy`,`start`,...n?[`--lan`]:[]];try{let{stdout:n}=await I(M.resolve(e,r),i,{cwd:e,env:t,stdin:`inherit`,stdout:`pipe`,stderr:`inherit`});ks(n)}catch(e){throw typeof e==`object`&&e&&`stdout`in e&&typeof e.stdout==`string`&&ks(e.stdout),e}}function Ms({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]]}const Ns=M.join(`.coreframe`,`dev`,`session.json`);async function Ps({appOrigin:e,cwd:t,device:n,flutterMcp:r,flutterMode:i,id:a,localOrigin:o,now:s=new Date,pid:c=process.pid,platform:l}){let u=M.resolve(t,Ns),d=M.dirname(u),f={version:2,id:a,pid:c,projectRoot:M.resolve(t),startedAt:s.toISOString(),platform:l,vite:{localOrigin:o,appOrigin:e},logs:{path:M.resolve(t,`.leylines`,`logs.sqlite`),scopes:{browser:`browser`,...i===void 0?void 0:{flutter:`dev.flutter`},vite:`dev.vite`}},...i===void 0?void 0:{flutter:{mode:i,mcp:r,state:`starting`,...n===void 0?void 0:{device:n}}}},p=Promise.resolve(),m=()=>{let e=`${JSON.stringify(f,void 0,2)}\n`;return p=p.then(async()=>{await R(d,{recursive:!0});let t=M.join(d,`.session-${a}.json`);await H(t,e,{mode:384}),await ke(t,384),await Pe(t,u)}),p};return await m(),{path:u,async recordFlutterEvent({event:e,params:t}){let n=f.flutter;if(!n)return;let r=Ls(t.appId),i;if(e===`daemon.connected`){let e=Rs(t.pid),r=Ls(t.version);i={...Fs(n),state:`starting`,...e===void 0?void 0:{daemonPid:e},...r===void 0?void 0:{protocolVersion:r}}}else if(e===`app.start`&&r)i={...Fs(n),appId:r,state:`starting`,supportsRestart:t.supportsRestart===!0};else if(e===`app.started`&&r===n.appId)i={...n,state:`running`};else if(e===`app.debugPort`&&r===n.appId){let e=Ls(t.wsUri);e&&(i={...n,vmServiceWsUri:e})}else if(e===`app.devTools`&&r===n.appId){let e=Ls(t.uri);e&&(i={...n,devToolsUri:e})}else if(e===`app.dtd`&&r===n.appId){let e=Ls(t.uri);e&&(i={...n,dtdUri:e})}else e===`app.stop`&&r===n.appId&&(i=Is(n));i&&(f={...f,flutter:i},await m())},async recordFlutterExit(){!f.flutter||f.flutter.state===`stopped`||(f={...f,flutter:Is(f.flutter)},await m())},async close(){await p;try{JSON.parse(await z(u,`utf8`)).id===a&&await B(u,{force:!0})}catch(e){if(e.code!==`ENOENT`)throw e}}}}function Fs(e){return{mode:e.mode,mcp:e.mcp,...e.device===void 0?void 0:{device:e.device},...e.daemonPid===void 0?void 0:{daemonPid:e.daemonPid},...e.protocolVersion===void 0?void 0:{protocolVersion:e.protocolVersion}}}function Is(e){return{...Fs(e),state:`stopped`,...e.appId===void 0?void 0:{appId:e.appId},...e.supportsRestart===void 0?void 0:{supportsRestart:e.supportsRestart}}}function Ls(e){return typeof e==`string`?e:void 0}function Rs(e){return typeof e==`number`?e:void 0}const zs=`extension:dev`;function Bs(e){if(!K(P(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=P(e,`package.json`),n;try{n=JSON.parse(q(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.${zs} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function Vs({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`,zs,...n.length>0?[`--`,...n]:[]]}const Hs=[`web`,`webext`,`ios`,`android`,`macos`,`windows`,`linux`],Us=[`managed-dev-overlay`],Ws=M.resolve(`node_modules`,`.bin`),Gs=G.platform===`win32`?`pnpm.cmd`:`pnpm`,Ks=G.platform===`win32`?`portless.cmd`:`portless`,qs=G.platform===`win32`?`react-router.cmd`:`react-router`,Js=`Lost connection to device.`;async function Ys({cwd:e=G.cwd(),debug:t,device:n,env:r=G.env,flutterDebug:i=!1,flutterMcp:a=!1,flutterOutput:o=`filtered`,host:s,https:c=!1,interactive:l=G.stdin.isTTY===!0,lan:u=!1,managed:d=!1,noCodesign:f=!1,noManaged:p=!1,noDevJobs:m=!1,platform:h=`web`,verbose:g=!1,webPort:_}={}){let v=It({env:r}),ee=r.PATH??r.Path??``,y=cc(h)?h:void 0,b=en(i||a),x=sc(_??r.COREFRAME_WEB_PORT),S,C,w,te,ne,re,ie,T,ae,E,oe,se,ce,D=!1,ue,O=r;if(d&&p)throw Error(`Cannot use --managed and --no-managed together.`);if(t===`managed-dev-overlay`&&d)throw Error(`Cannot use --managed with --debug managed-dev-overlay.`);if(i&&y===void 0)throw Error(`The --flutter-debug option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(a&&y===void 0)throw Error(`The --flutter-mcp option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(f&&h!==`macos`)throw Error(`The --no-codesign option is only supported for macOS Flutter development.`);if(o===`full`&&y===void 0)throw Error(`The --flutter-output option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(h===`webext`){if(d||p||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.`);Bs(e)}if(c&&h!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(n!==void 0&&h!==`ios`&&h!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);let de=await v.measure(`routing`,()=>As({cwd:e,env:r,platform:h}));de&&await v.measure(`portless`,()=>js({cwd:e,env:r,lan:u}));let k=y===void 0?h===`web`?x??await jr.getAvailablePort():h===`webext`?x:void 0:x??await jr.getAvailablePort(),A,pe=new Promise(e=>{A=e}),j=()=>{D||(D=!0,A(),C?.kill(`SIGTERM`),re?.kill(`SIGTERM`),ie?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),T?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),ae?.close().catch(()=>void 0),S?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),he().catch(()=>void 0))},he=()=>te?(ne??=te[Symbol.asyncDispose](),ne):Promise.resolve(),N=e=>{ue??=e,j()},ge=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>N(e);return G.on(e,t),{handler:t,signal:e}}),P=async e=>{let t=et(e);C=t;try{await t.expectSuccess()}catch(e){if(!D)throw e}finally{C===t&&(C=void 0)}};try{oe=y?Kt({path:M.resolve(e,`.leylines`,`logs.sqlite`)}):void 0;let i=h===`ios`||h===`android`?h:void 0,_=i?await zo({env:r,interactive:l,platform:i,target:n}):void 0;i&&_&&tn({device:_,mode:b,platform:i});let x=y?oe?.logger({scope:`dev.flutter`,properties:{platform:y,..._?{deviceId:_.id}:void 0}}):void 0;E=i&&_&&k!==void 0?await Vo({device:_,env:r,host:s,interactive:l,platform:i,port:k}):void 0;let C=E?.viteHost??(y?i?!0:`127.0.0.1`:s),ne=k===void 0?void 0:`${c?`https`:`http`}://127.0.0.1:${k}`,ue=y===void 0?ne:E?.serverUrl??Ho(y,void 0,k),A={},he=!1,N;[A,he]=await Promise.all([v.measure(`config`,()=>U({cwd:e})),v.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(d||l&&!p)&&await zt(e))]),await v.measure(`i18n`,()=>tr({cwd:e,projectConfig:A})),N=h!==`webext`&&Rr(e)?await jr.getAvailablePort():void 0;let ge=await v.measure(`https`,async()=>c&&!de?Vt({cwd:e}):void 0),_e=Cs(r,h),F=W();O={..._e,[Ut]:F,...v.environment,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...!m&&h!==`webext`?{[Ht]:W()}:void 0,...y?{COREFRAME_PLATFORM:y,[Gt]:M.resolve(e,`.coreframe`,`managed-dev-flutter-restart`)}:void 0,...ge?{[Lt]:ge.cert,[Rt]:ge.key}:void 0,...N?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${N}`}:void 0},ne!==void 0&&ue!==void 0&&(se=await Ps({appOrigin:ue,cwd:e,device:_,flutterMcp:a,flutterMode:y===void 0?void 0:b,id:F,localOrigin:ne,platform:h}));let ve=async()=>{if(!N)return;let t=zr({cwd:e,env:O,port:N});ae=t;try{await t.listen(),await t.wait()}finally{await t.close(),ae===t&&(ae=void 0)}},ye=async()=>{let t=$e({label:`web`}),n=$e({color:`red`,label:`web`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),ie=I(de?Ks:qs,de?Ms({host:C,lan:u,port:k}):oc({host:C,port:k,strictPort:h===`web`||y!==void 0}),{cwd:e,env:{...O,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[O.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:Ws+M.delimiter+ee},stdin:`inherit`});let r=Promise.allSettled([nc(ie.stdout,t),nc(ie.stderr,n)]);try{await ie;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!D)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([Qe(t),Qe(n)]),ie=void 0}},be=async()=>{let t=$e({label:`webext`}),n=$e({color:`red`,label:`webext`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),T=I(Gs,Vs({host:s,port:k}),{cwd:e,env:O,stdin:`inherit`});let r=Promise.allSettled([nc(T.stdout,t),nc(T.stderr,n)]);try{await T;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!D)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([Qe(t),Qe(n)]),T=void 0}},xe=async t=>{let n,r,i=!1,s,c=Ss(O[Gt],()=>{if(D||!n||!r||s||b!==`debug`&&i)return;let e=n,t=r;s=(async()=>{if(b===`debug`){await t.restart({debounce:!0,fullRestart:!0,reason:`manual`});return}i=!0;try{await t.stop()}catch(t){let n=t instanceof Error?t.message:String(t);x?.write(`warn`,`Flutter stop failed; terminating it: ${n}`,{properties:{stream:`control`}}),G.stderr.write(`Flutter stop failed; terminating it: ${n}\n`),await e.nodeChildProcess.then(e=>e.kill(`SIGTERM`))}})().catch(e=>{let t=e instanceof Error?e.message:String(e);x?.write(`error`,`Flutter restart failed: ${t}`,{properties:{stream:`control`}}),G.stderr.write(`Flutter restart failed: ${t}\n`)}).finally(()=>{s=void 0})});try{for(;!D;){i=!1;let s=!1,c=h===`android`&&o===`filtered`&&!g?await me():void 0,u=I(`flutter`,nn({device:_??{id:h},flutterDriver:a,mode:b,serverUrl:ue,verbose:g}),{cwd:M.join(e,`src-flutter`),env:$t(_e,{noCodesign:f}),stdio:[`pipe`,`pipe`,`pipe`]}),d=new ms({onEvent:async e=>{Qs(e.params.message)&&(s=!0),await se?.recordFlutterEvent(e)},verbose:g,write:async e=>{let t=await u.nodeChildProcess;if(!t.stdin)throw Error(`Flutter machine input is unavailable.`);t.stdin.write(e)===!1&&await Pt(t.stdin,`drain`)}}),p=e=>Zs(hs(e,d),()=>s=!0);S=u,n=u,r=d;try{let e=!1;try{let e=c?c.capture(tc(p(u),x,`output`)):Promise.all([ec(p(u.stdout),G.stdout,x,`stdout`),Xs(u.stderr,G.stderr,x,`stderr`)]);await Promise.all([u,e])}catch{e=!0}if(i&&!D)continue;if(D)return;let n=l?await L.confirm({initialValue:!0,message:s?`${Js} Restart Flutter?`:e?`Flutter failed. Retry?`:`Flutter exited unexpectedly. Restart Flutter?`}):!1;if(L.isCancel(n)||!n){if(!e&&!s){L.log.warn(`Flutter exited unexpectedly.`);return}L.log.warn(t?`Flutter stopped. Web development is still running.`:`Flutter stopped.`),await(t??pe);return}}finally{S===u&&(S=void 0),n===u&&(n=void 0),r===d&&(r=void 0),d.close(),se?.recordFlutterExit().catch(e=>{let t=e instanceof Error?e.message:String(e);x?.write(`error`,`Failed to record Flutter exit: ${t}`,{properties:{stream:`control`}})})}}}finally{(await c)()}},Se=async()=>{if(h===`web`){await ye();return}let t=ye().then(()=>{if(!D)throw Error(`The Vite development server stopped while Flutter was still running.`)});await fe({cwd:e});try{await Promise.race([t,xe(t)])}finally{j(),await Promise.allSettled([t,S]),S=void 0}},Ce=async()=>{let t=et({name:`panda`,command:Gs,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:O});re=t;try{if(await t.expectSuccess(),!D)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!D)throw e}finally{re===t&&(re=void 0)}},we=async()=>{if(h===`webext`){await be();return}let e=Ce(),t=Se(),n=N?ve():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),D&&await t}finally{j(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}};if(he&&(O={...O,[Wt]:`1`},r.COREFRAME_DEV_SUPERVISOR!==`0`&&(ce=await v.measure(`supervisor`,()=>Ft({cwd:e,env:r})))),D)return;if(h===`webext`){v.report(),await we();return}if(A.database?.dialect===`sqlite`&&(await v.measure(`database`,async()=>{let t=await le({config:A,cwd:e,env:r,tursoOutput:G.stdout,useSupervisorLease:!0});te=t,O={...O,...t.env}}),await v.measure(`schema`,()=>P({name:`db`,command:Gs,args:[`db`,`ensure`],cwd:e,env:O,prefix:!1})),D))return;if(ac(A)){let t=$e({label:`postgres`});t.pipe(G.stdout,{end:!1});try{let n=await v.measure(`database`,()=>ic({config:A,cwd:e,env:O,failIfRunning:!0,interactive:l,isStopping:()=>D,postgresOutput:t,useSupervisorLease:!0}));if(!n)return;w=n,O={...O,...n.env};try{D||await v.measure(`schema`,()=>P({name:`db`,command:Gs,args:[`db`,`ensure`],cwd:e,env:O,prefix:!1})),D||(v.report(),await we())}finally{await n[Symbol.asyncDispose](),w===n&&(w=void 0)}}finally{t.end()}return}v.report(),await we()}finally{j(),await E?.close(),E=void 0;let e;try{await w?.[Symbol.asyncDispose]()}catch(t){e=t}finally{try{await he()}finally{try{await se?.close()}finally{ce?.close(),oe?.close();for(let{handler:e,signal:t}of ge)G.off(t,e)}}ue&&(G.exitCode??=ue===`SIGINT`?130:143)}rc(e)}}async function Xs(e,t,n,r){for await(let i of $s(e,n,r))t.write(`${i}\n`)||await Pt(t,`drain`)}async function*Zs(e,t){for await(let n of e)Qs(n.message)&&t(),yield n}function Qs(e){return typeof e==`string`&&e.trim()===Js}async function*$s(e,t,n){for await(let r of e){let e=de(r);e.message&&t?.write(e.level,e.message,{properties:{stream:n}}),yield r}}async function ec(e,t,n,r){for await(let i of tc(e,n,r))t.write(`${i}\n`)||await Pt(t,`drain`)}async function*tc(e,t,n){for await(let r of e)r.message&&t?.write(r.level,r.message,{properties:{stream:n}}),yield r.message}async function nc(e,t){for await(let n of e)t.write(`${n}\n`)||await Pt(t,`drain`)}function rc(e){if(e)throw e}async function ic({interactive:e,isStopping:t,...n}){try{return await D(n)}catch(r){if(!(r instanceof h)||!e)throw r;let i=await L.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${r.pid}). Stop it and start here?`});if(L.isCancel(i)||!i){L.cancel(`Keeping the existing PostgreSQL process.`);return}return await ue(r),t()?void 0:D(n)}}function ac(e){return(e.database?.dialect??`postgres`)===`postgres`}function oc({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 sc(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 cc(e){return e===`android`||e===`ios`||e===`linux`||e===`macos`||e===`windows`}async function lc(e={}){let t=e.cwd??G.cwd(),n=`scripts/preview.ts`,r={},i=!0;try{await Oe(M.resolve(t,n))}catch(e){if(e.code===`ENOENT`)i=!1;else throw e}if(i){let e=await ze(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 Yt({...e,cwd:t},r)}const uc=`worker-configuration.d.ts`;async function dc({check:e=!1,cwd:t=process.cwd()}={}){let n=await U({cwd:t}),r=await mt({coreframeConfig:n,cwd:t}),i=F(t,uc),a=F(t,`.coreframe-worker-types-${W()}.d.ts`);try{try{await I(`pnpm`,[`exec`,`wrangler`,`types`,a,`--config`,r.path,`--strict-vars=false`,`--include-runtime=false`],{cwd:t,stdio:[`ignore`,`pipe`,`pipe`]})}catch(e){throw fc(e),e}let o=pc(await z(a,`utf8`)),s=Ve(r.config),c=Be(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${mc(c)}\n`;if(e){if(await z(i,`utf8`).catch(()=>``)!==l)throw Error(`${uc} is stale. Run "coreframe worker typegen" and commit the result.`);return{changed:!1,path:i}}let u=await z(i,`utf8`).catch(()=>``);return u!==l&&await H(i,l),{changed:u!==l,path:i}}finally{await r.dispose(),await B(a,{force:!0})}}function fc(e){if(typeof e!=`object`||!e||!(`output`in e))return;let{output:t}=e;typeof t!=`string`||t===``||process.stderr.write(t.endsWith(`
|
|
16
|
+
`)?t:`${t}\n`)}function pc(e){return e.split(/\r?\n/).filter(e=>!e.startsWith(`// Generated by Wrangler by running `)).join(`
|
|
17
|
+
`)}function mc(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(`
|
|
18
|
+
`)}const hc=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),gc=[`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`,`react-router.config.ts`,`src/web`],_c=[`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`],vc=[`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`],yc=`.coreframe/typegen.json`,bc=[`web`,`dashboard`,`worker`];async function xc({checkWorker:e=!1,cwd:t=G.cwd(),runners:n={}}={}){let r=await Tc(t)??{generators:{},schemaVersion:1},i=[];return i.push(await Cc({cwd:t,inputPaths:gc,name:`web`,outputPath:`.react-router`,run:()=>(n.web??wc)(t),state:r})),i.push(await Cc({cwd:t,inputPaths:_c,name:`dashboard`,outputPath:`dashboard/.react-router`,run:()=>(n.dashboard??Er)(t),state:r})),i.push(await Cc({cwd:t,inputPaths:vc,name:`worker`,outputPath:`worker-configuration.d.ts`,run:()=>(n.worker??dc)({check:e,cwd:t}),state:r})),i}function Sc(e){return`${{dashboard:`Dashboard route types`,web:`Web route types`,worker:`Worker types`}[e.name]} ${e.changed?`generated`:`unchanged`}.`}async function Cc({cwd:e,inputPaths:t,name:n,outputPath:r,run:i,state:a}){let o=await Dc(e,t),s=await Oc(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 Oc(e,r);if(!l)throw Error(`Coreframe ${n} typegen did not produce ${r}.`);return a.generators[n]={inputFingerprint:o,outputFingerprint:l},await Ec(e,a),{changed:s!==l,name:n,ran:!0}}async function wc(e){let t=G.platform===`win32`?`react-router.cmd`:`react-router`,n=G.env;await I(t,[`typegen`],{cwd:e,env:{...n,PATH:M.resolve(e,`node_modules/.bin`)+M.delimiter+(n.PATH??n.Path??``)},stdio:`inherit`})}async function Tc(e){try{let t=JSON.parse(await z(M.resolve(e,yc),`utf8`));if(!Mc(t)||t.schemaVersion!==1)return;let n={};if(!Mc(t.generators))return;for(let e of bc){let r=t.generators[e];Mc(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 Ec(e,t){let n=M.resolve(e,yc);await R(M.dirname(n),{recursive:!0}),await H(n,`${JSON.stringify(t)}\n`,{mode:384})}async function Dc(e,t){let n=He(`sha256`);for(let r of[...t].sort()){let t=M.resolve(e,r),i=await Ac(t);if(!i){n.update(`missing:${r}\0`);continue}if(i.isDirectory()){n.update(`directory:${r}\0`);for(let r of await kc(t)){let i=M.join(t,r),a=M.relative(e,i).split(M.sep).join(`/`);n.update(`${a}\0`),n.update(await z(i))}continue}i.isFile()&&(n.update(`file:${r}\0`),n.update(await z(t)))}return n.digest(`hex`)}async function Oc(e,t){if(await Ac(M.resolve(e,t)))return Dc(e,[t])}async function kc(e){let t=[];async function n(e,r){let i=await Ne(e,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i)if(a.isDirectory()){if(hc.has(a.name))continue;await n(M.join(e,a.name),M.join(r,a.name))}else a.isFile()&&t.push(M.join(r,a.name))}return await n(e,``),t.sort()}async function Ac(e){try{return await V(e)}catch(e){if(jc(e))return;throw e}}function jc(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}function Mc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Nc=M.resolve(`node_modules`,`.bin`);G.env.PATH=Nc+M.delimiter+G.env.PATH;const Pc=G.platform===`win32`?`tsc.cmd`:`tsc`,Fc=[{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 Ic(){await xc({checkWorker:!0});let e=[];for(let t of Fc)try{await Oe(t.path),e.push(t)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let t=e.map(e=>et({name:e.name,command:Pc,args:[`-p`,e.path]})),n=(await Promise.all(t.map(e=>e.wait()))).filter(e=>e.exitCode!==0);n.length>0&&(G.exitCode=n[0].exitCode)}const Lc=r(s(Us),{displayName:`feature`,from:async e=>e}),Rc=r(s(Qt),{displayName:`filtered|full`,from:async e=>e}),zc=[`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.`],Bc=n({name:`deploy`,args:{environment:u({type:s(ct),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}),yes:i({long:`yes`,short:`y`,description:`Approve the production deployment confirmation.`,defaultValue:()=>!1})},handler:({environment:e,runMigrations:t,skipMigrations:n,skipPostDeployChecks:r,yes:i})=>mo([e,...t?[`--run-migrations`]:[],...n?[`--skip-migrations`]:[],...r?[`--skip-post-deploy-checks`]:[],...i?[`--yes`]:[]])}),Vc=m({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 St();if(e){console.log(JSON.stringify({...t,notices:zc}));return}console.log(t.url),console.error(`Staging hostname reassigned. ${zc.join(` `)}`)}}),url:n({name:`url`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await ut();console.log(e?JSON.stringify({url:t}):t)}})}}),Hc=m({name:`secrets`,cmds:{"rotate-access-token":n({name:`rotate-access-token`,args:{environment:u({type:s(ct),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 Et({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(ct)),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 dt({environment:e});console.log(t?JSON.stringify(n):Jc(n))}}),set:n({name:`set`,args:{environment:u({type:s(ct),displayName:`environment`,description:`Worker environment to update on its next deploy.`}),name:u({type:l(p),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 _t({environment:e,name:t,value:await Yc(t)}),console.log(`Queued ${t} for ${e}. Run coreframe deploy ${e} to apply.`);return}let r=await yt(),i=n?await Zc(r):await Xc(r,e);await vt({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(ct),displayName:`environment`,description:`Worker environment with a queued secret update.`}),name:u({type:p,displayName:`name`,description:`Declared Worker secret name.`})},handler:async({environment:e,name:t})=>{let n=await lt({environment:e,name:t});console.log(n?`Discarded the queued ${t} update for ${e}.`:`No ${t} update is queued for ${e}.`)}})}}),Uc=n({name:`typecheck`,args:{},handler:Ic}),Wc=m({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 dc({check:e});console.log(e?`${$c(t.path)} is current.`:`${$c(t.path)} ${t.changed?`generated`:`is unchanged`}.`)}})}}),Gc=n({name:`dev`,args:{debug:c({long:`debug`,type:l(Lc),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}),flutterMcp:i({long:`flutter-mcp`,description:`Enable the app-side Flutter MCP QA bridge and imply Flutter debug mode.`,defaultValue:()=>!1}),flutterOutput:c({long:`flutter-output`,type:Rc,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}),host:c({long:`host`,type:l(p),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}),noCodesign:i({long:`no-codesign`,description:`Disable Xcode code signing for macOS Flutter development.`,defaultValue:()=>!1}),noManaged:i({long:`no-managed`,description:`Run without managed checkout synchronization for this invocation.`,defaultValue:()=>!1}),noDevJobs:i({long:`no-dev-jobs`,description:`Skip automatic local development jobs for this invocation.`,defaultValue:()=>!1}),simulator:i({long:`simulator`,description:`Run iOS in Flutter debug mode on the Apple iOS Simulator.`,defaultValue:()=>!1}),platform:u({type:l(s(Hs)),displayName:`platform`,description:`Development target platform. Defaults to web.`}),device:u({type:l(p),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,flutterDebug:n,flutterMcp:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noCodesign:l,noManaged:u,noDevJobs:d,platform:f,port:p,simulator:m,verbose:h})=>{let g=Kc({device:t,flutterDebug:n,platform:f,simulator:m});return Ys({debug:e,device:g.device,flutterDebug:g.flutterDebug,flutterMcp:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noCodesign:l,noManaged:u,noDevJobs:d,platform:f??`web`,verbose:h,webPort:p})}});function Kc({device:e,flutterDebug:t,platform:n,simulator:r}){if(!r)return{device:e,flutterDebug:t};if(n!==`ios`)throw Error(`The --simulator flag is only supported for the iOS development target.`);if(e!==void 0)throw Error(`The --simulator flag cannot be combined with an explicit device.`);return{device:`apple_ios_simulator`,flutterDebug:!0}}const qc=n({name:`preview`,args:{host:c({long:`host`,type:l(p),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})=>lc({host:e,port:t})});function Jc(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(`
|
|
19
|
+
`)}async function Yc(e){if(!G.stdin.isTTY){let e=``;for await(let t of G.stdin)e+=t.toString();return e.replace(/\r?\n$/,``)}let t=await L.password({message:`Enter the new value for ${e}`});if(L.isCancel(t))throw L.cancel(`Secret update cancelled.`),Error(`Secret update cancelled.`);return t}async function Xc(e,t){if(!G.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 L.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(L.isCancel(i))throw L.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);i.trim()&&(n[r.name]=i)}return n}async function Zc(e){if(e.length===0)throw Error(`No Worker secrets are declared in coreframe.config.ts.`);let t=G.stdin.isTTY?await L.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 Qc();if(L.isCancel(t))throw L.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);let{ignoredNames:n,values:r}=ht(t,e);return n.length>0&&L.log.info(`Ignored non-secret or undeclared names: ${n.join(`, `)}.`),r}async function Qc(){let e=``;for await(let t of G.stdin)e+=t.toString();return e}function $c(e){return e.split(/[\\/]/).at(-1)??e}const el=n({name:`typegen`,description:`Generate Coreframe route and Worker type declarations.`,args:{},handler:async()=>{let e=await xc();for(let t of e)console.log(Sc(t))}});function tl(e,{formatMessage:t,temporaryDirectory:n=Le(),write:r=e=>console.error(e)}={}){let i=sl(e),a=ul(rl(e,t),i);try{let t=P(Ke(P(n,`coreframe-error-`)),`error.log`);return Ze(t,`${ul(il(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 nl(t,n={}){let r=typeof t==`function`?t:()=>e.run(e.binary(t),process.argv),i=!1,a=e=>{i||(i=!0,tl(e,n),process.exit(1))};process.once(`uncaughtException`,a),process.once(`unhandledRejection`,a),Promise.resolve().then(r).catch(a)}function rl(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 il(e){try{let t=al(e);if(!(e instanceof Error)||!ol(t))return Mt(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${Mt(t,{customInspect:!1,depth:10})}`:``}`}catch{return`The thrown value could not be inspected.`}}function al(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:al(a.value,t),writable:!0})}return i}function ol(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function sl(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`?cl(t.value,n):r(t.value))}}}try{r(e)}catch{}return n}function cl(e,t){if(!(typeof e!=`object`||!e))for(let n of Reflect.ownKeys(e)){let r=Object.getOwnPropertyDescriptor(e,n);typeof n==`string`&&ll(n)&&r&&`value`in r&&typeof r.value==`string`&&r.value&&t.add(r.value)}}function ll(e){return/(?:^|_)(?:AUTH|CERT|COOKIE|CREDENTIALS?|DATABASE_URL|DSN|KEY|PASS(?:WORD)?|PRIVATE|SECRET|SESSION|TOKEN)(?:_|$)/i.test(e)}function ul(e,t){return[...t].sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[redacted environment value]`),e)}const dl=m({name:`coreframe`,cmds:{build:gn,dashboard:Hr,assets:xr,flutter:Sr,i18n:Cr,jobs:oi,deploy:Bc,staging:Vc,secrets:Hc,typegen:el,typecheck:Uc,worker:Wc,dev:Gc,preview:qc,upgrade:lo,recipes:uo,db:fo}});import.meta.main&&nl(dl,{formatMessage:process.argv[2]===`db`?w:void 0});export{dl as coreframeCli};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coreframe/scripts",
|
|
3
|
-
"version": "0.2.34-next.
|
|
3
|
+
"version": "0.2.34-next.2",
|
|
4
4
|
"description": "Coreframe project workflow CLI and automation scripts",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,16 +29,16 @@
|
|
|
29
29
|
"nano-spawn": "^2.1.0",
|
|
30
30
|
"procband": "^0.3.9",
|
|
31
31
|
"yaml": "^2.9.0",
|
|
32
|
-
"@coreframe/assets": "^0.1.18-next.
|
|
33
|
-
"@coreframe/
|
|
34
|
-
"@coreframe/
|
|
35
|
-
"@coreframe/
|
|
36
|
-
"@coreframe/dev
|
|
37
|
-
"@coreframe/
|
|
38
|
-
"@coreframe/
|
|
32
|
+
"@coreframe/assets": "^0.1.18-next.1",
|
|
33
|
+
"@coreframe/config": "^0.1.15-next.1",
|
|
34
|
+
"@coreframe/deploy": "^0.1.15-next.1",
|
|
35
|
+
"@coreframe/db": "^0.1.20-next.1",
|
|
36
|
+
"@coreframe/dev": "^0.1.23-next.1",
|
|
37
|
+
"@coreframe/dev-contracts": "^0.1.10-next.1",
|
|
38
|
+
"@coreframe/flutter-tools": "^0.1.25-next.2",
|
|
39
|
+
"@coreframe/jobs": "^0.1.2-next.1",
|
|
39
40
|
"@coreframe/object-storage": "^0.1.5-next.0",
|
|
40
|
-
"@coreframe/
|
|
41
|
-
"@coreframe/preview": "^0.1.20-next.0"
|
|
41
|
+
"@coreframe/preview": "^0.1.20-next.1"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/node": "^26.1.0",
|