@coreframe/scripts 0.2.34-next.3 → 0.2.34-next.4

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.
@@ -205,6 +205,11 @@ declare const coreframeCli: Partial<import("@alloc/cmd-ts/dist/cjs/argparser").R
205
205
  environment: "staging" | "production" | undefined;
206
206
  json: boolean;
207
207
  };
208
+ } | {
209
+ command: "pull";
210
+ args: {
211
+ force: boolean;
212
+ };
208
213
  } | {
209
214
  command: "rotate-access-token";
210
215
  args: {
@@ -555,6 +560,11 @@ declare const coreframeCli: Partial<import("@alloc/cmd-ts/dist/cjs/argparser").R
555
560
  environment: "staging" | "production" | undefined;
556
561
  json: boolean;
557
562
  };
563
+ } | {
564
+ command: "pull";
565
+ args: {
566
+ force: boolean;
567
+ };
558
568
  } | {
559
569
  command: "rotate-access-token";
560
570
  args: {
@@ -848,6 +858,9 @@ declare const coreframeCli: Partial<import("@alloc/cmd-ts/dist/cjs/argparser").R
848
858
  value: {
849
859
  command: "status";
850
860
  value: Promise<void>;
861
+ } | {
862
+ command: "pull";
863
+ value: Promise<void>;
851
864
  } | {
852
865
  command: "rotate-access-token";
853
866
  value: Promise<void>;
@@ -1092,6 +1105,9 @@ declare const coreframeCli: Partial<import("@alloc/cmd-ts/dist/cjs/argparser").R
1092
1105
  value: {
1093
1106
  command: "status";
1094
1107
  value: Promise<void>;
1108
+ } | {
1109
+ command: "pull";
1110
+ value: Promise<void>;
1095
1111
  } | {
1096
1112
  command: "rotate-access-token";
1097
1113
  value: Promise<void>;
package/dist/coreframe.js CHANGED
@@ -1,21 +1,21 @@
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 _,createLocalPostgresDb as v,createProjectSqliteDrizzleDatabase as ee,ensureLocalDb as y,formatDbErrorMessage as b,formatMigrationList as x,inspectDeploymentMigrations as S,migrateHeldMigrations as C,migrateLocalDb as w,resetLocalDb as te,resolveDeploymentDatabase as T,runDrizzleKitCommand as ne,seedLocalDb as re,setupLocalDb as ie,startProjectPostgres as ae,startProjectTurso as oe,stopProjectPostgres as se}from"@coreframe/db";import{checkFlutterClient as ce,classifyFlutterDevOutputLine as le,ensureFlutterDevAssetDirectories as ue,flutterPlatforms as de,generateFlutterNativeBridge as E,prepareFlutterClient as D,prepareFlutterDevOutput as fe,productionApiOrigin as O,runFlutterAcceptance as pe}from"@coreframe/flutter-tools";import k,{dirname as A,isAbsolute as j,join as M,posix as N,resolve as P,sep as F}from"node:path";import I from"nano-spawn";import*as L from"@clack/prompts";import{addAsset as me,backupAssets as he,buildAssets as ge,checkAssets as _e,printAssetResult as ve,publishAssets as ye}from"@coreframe/assets";import{assertAssetCredentialProfile as be,configureAssetCredentials as xe,createB2PrivateObjectStore as Se}from"@coreframe/object-storage";import{access as Ce,chmod as we,copyFile as Te,cp as Ee,mkdir as R,mkdtemp as De,readFile as z,readdir as Oe,rename as ke,rm as B,stat as Ae,writeFile as V}from"node:fs/promises";import{homedir as je,networkInterfaces as Me,tmpdir as Ne}from"node:os";import{importProjectDependency as Pe,importProjectModule as Fe,normalizeWorkerEnvironment as Ie,readProjectConfig as H,wranglerEnvironmentNames as Le}from"@coreframe/config";import{createHash as Re,randomUUID as U}from"node:crypto";import W from"node:process";import{chmodSync as ze,existsSync as G,lstatSync as Be,mkdirSync as Ve,mkdtempSync as He,readFileSync as K,readlinkSync as Ue,rmSync as We,symlinkSync as Ge,watch as Ke,writeFileSync as qe}from"node:fs";import{finished as Je}from"node:stream/promises";import{createPrefixStream as Ye,supervise as Xe}from"procband";import{createConnection as Ze,createServer as Qe}from"node:net";import{inspectDevelopmentJobStates as $e}from"@coreframe/jobs";import{spawnSync as q}from"node:child_process";import{parse as et,stringify as tt}from"yaml";import{accessTokenSigningSecretName as nt,clearAppliedPendingWorkerSecrets as rt,deployEnvironments as it,discardPendingWorkerSecret as at,discoverStagingUrl as ot,inspectWorkerEnvironment as st,materializeBuiltClientDeployConfig as ct,materializePrimaryWorkerConfig as lt,materializePrimaryWorkerTypeConfig as ut,parseDeclaredWorkerSecretEnv as dt,prepareAccessTokenSigningSecret as ft,queueWorkerSecret as pt,queueWorkerSecrets as mt,readDeclaredWorkerSecrets as ht,readPackageJson as gt,readPendingWorkerSecretSnapshot as _t,reassignStagingHostname as vt,releaseName as yt,resolveDeployConfig as bt,resolveReleaseVersion as xt,rotateAccessTokenSigningSecret as St,runAfterWorkerDeploy as Ct,runPostDeployChecks as wt,validateWorkerEnvironmentForDeploy as Tt,verifyAccessTokenSigningSecret as Et,writePackageVersion as Dt}from"@coreframe/deploy";import{inspect as Ot,parseEnv as kt}from"node:util";import{once as At}from"node:events";import{connectDevSupervisor as jt,createDevStartupTiming as Mt,devHttpsCertEnv as Nt,devHttpsKeyEnv as Pt,isManagedDevCheckout as Ft,isPrimaryCheckout as It,prepareDevHttps as Lt}from"@coreframe/dev";import{devJobsEnv as Rt,devSessionIdEnv as zt}from"@coreframe/dev-contracts/dev-jobs";import{managedDevEnv as Bt,managedDevFlutterRestartFileEnv as Vt}from"@coreframe/dev-contracts/managed-dev";import{openScopedLogs as Ht}from"leylines";import{setTimeout as Ut}from"node:timers/promises";import{determineAgent as Wt}from"@vercel/detect-agent";import{runPreview as Gt}from"@coreframe/preview";const Kt=`FLUTTER_XCODE_COREFRAME_BUNDLE_IDENTIFIER_SUFFIX`,qt=`COREFRAME_FLUTTER_DEVELOPMENT`,Jt=[`filtered`,`full`];function Yt(e,{noCodesign:t=!1}={}){return{...e,[Kt]:`.dev`,[qt]:`1`,...t?{FLUTTER_XCODE_CODE_SIGNING_ALLOWED:`NO`,FLUTTER_XCODE_CODE_SIGNING_REQUIRED:`NO`,FLUTTER_XCODE_CODE_SIGN_IDENTITY:``}:void 0}}function Xt(e=!1){return e?`debug`:`profile`}function Zt({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 Qt({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 $t=[`web`,...de];function en(e=`web`,{apiOrigin:t,cwd:n=process.cwd(),profile:r=!1,simulator:i=!1}={}){if(cn(e,{profile:r,simulator:i}),e===`web`)return[un(`pnpm`,[`build`],n,{COREFRAME_PLATFORM:`web`})];let a=O(t);return[{kind:`prepare`,platform:e},un(`flutter`,tn(e,a,{profile:r,simulator:i}),P(n,`src-flutter`),{COREFRAME_API_ORIGIN:a})]}function tn(e,t,{noCodesign:n=e===`macos`,profile:r=!1,simulator:i=!1}={}){cn(e,{profile:r,simulator:i});let a=O(t);return[`build`,e===`android`?`apk`:e,r?`--profile`:`--release`,...i?[`--simulator`]:[],...n?[`--no-codesign`]:[],`--dart-define=COREFRAME_API_ORIGIN=${a}`]}function nn(e,{profile:t=!1}={}){let n=t?`profile`:`release`,r=P(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(`
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 _,createLocalPostgresDb as v,createProjectSqliteDrizzleDatabase as y,ensureLocalDb as b,formatDbErrorMessage as x,formatMigrationList as S,inspectDeploymentMigrations as C,migrateHeldMigrations as w,migrateLocalDb as T,resetLocalDb as ee,resolveDeploymentDatabase as te,runDrizzleKitCommand as ne,seedLocalDb as re,setupLocalDb as ie,startProjectPostgres as ae,startProjectTurso as oe,stopProjectPostgres as se}from"@coreframe/db";import{checkFlutterClient as ce,classifyFlutterDevOutputLine as le,ensureFlutterDevAssetDirectories as ue,flutterPlatforms as de,generateFlutterNativeBridge as E,prepareFlutterClient as D,prepareFlutterDevOutput as fe,productionApiOrigin as O,runFlutterAcceptance as pe}from"@coreframe/flutter-tools";import k,{dirname as A,isAbsolute as j,join as M,posix as N,resolve as P,sep as F}from"node:path";import I from"nano-spawn";import*as L from"@clack/prompts";import{addAsset as me,backupAssets as he,buildAssets as ge,checkAssets as _e,printAssetResult as ve,publishAssets as ye}from"@coreframe/assets";import{assertAssetCredentialProfile as be,configureAssetCredentials as xe,createB2PrivateObjectStore as Se}from"@coreframe/object-storage";import{access as Ce,chmod as we,copyFile as Te,cp as Ee,mkdir as R,mkdtemp as De,readFile as z,readdir as Oe,rename as B,rm as V,stat as ke,writeFile as H}from"node:fs/promises";import{homedir as Ae,networkInterfaces as je,tmpdir as Me}from"node:os";import{importProjectDependency as Ne,importProjectModule as Pe,normalizeWorkerEnvironment as Fe,readProjectConfig as U,resolveProjectSecrets as Ie,wranglerEnvironmentNames as Le}from"@coreframe/config";import{createHash as Re,randomUUID as W}from"node:crypto";import G from"node:process";import{chmodSync as ze,existsSync as K,lstatSync as Be,mkdirSync as Ve,mkdtempSync as He,readFileSync as q,readlinkSync as Ue,rmSync as We,symlinkSync as Ge,watch as Ke,writeFileSync as qe}from"node:fs";import{finished as Je}from"node:stream/promises";import{createPrefixStream as Ye,supervise as Xe}from"procband";import{createConnection as Ze,createServer as Qe}from"node:net";import{inspectDevelopmentJobStates as $e}from"@coreframe/jobs";import{spawnSync as J}from"node:child_process";import{parse as et,stringify as tt}from"yaml";import{accessTokenSigningSecretName as nt,clearAppliedPendingWorkerSecrets as rt,deployEnvironments as it,discardPendingWorkerSecret as at,discoverStagingUrl as ot,inspectWorkerEnvironment as st,materializeBuiltClientDeployConfig as ct,materializePrimaryWorkerConfig as lt,materializePrimaryWorkerTypeConfig as ut,parseDeclaredWorkerSecretEnv as dt,prepareAccessTokenSigningSecret as ft,queueWorkerSecret as pt,queueWorkerSecrets as mt,readDeclaredWorkerSecrets as ht,readPackageJson as gt,readPendingWorkerSecretSnapshot as _t,reassignStagingHostname as vt,releaseName as yt,resolveDeployConfig as bt,resolveReleaseVersion as xt,rotateAccessTokenSigningSecret as St,runAfterWorkerDeploy as Ct,runPostDeployChecks as wt,validateWorkerEnvironmentForDeploy as Tt,verifyAccessTokenSigningSecret as Et,writePackageVersion as Dt}from"@coreframe/deploy";import{inspect as Ot,parseEnv as kt}from"node:util";import{once as At}from"node:events";import{connectDevSupervisor as jt,createDevStartupTiming as Mt,devHttpsCertEnv as Nt,devHttpsKeyEnv as Pt,isManagedDevCheckout as Ft,isPrimaryCheckout as It,prepareDevHttps as Lt}from"@coreframe/dev";import{devJobsEnv as Rt,devSessionIdEnv as zt}from"@coreframe/dev-contracts/dev-jobs";import{managedDevEnv as Bt,managedDevFlutterRestartFileEnv as Vt}from"@coreframe/dev-contracts/managed-dev";import{openScopedLogs as Ht}from"leylines";import{setTimeout as Ut}from"node:timers/promises";import{determineAgent as Wt}from"@vercel/detect-agent";import{runPreview as Gt}from"@coreframe/preview";const Kt=`FLUTTER_XCODE_COREFRAME_BUNDLE_IDENTIFIER_SUFFIX`,qt=`COREFRAME_FLUTTER_DEVELOPMENT`,Jt=[`filtered`,`full`];function Yt(e,{noCodesign:t=!1}={}){return{...e,[Kt]:`.dev`,[qt]:`1`,...t?{FLUTTER_XCODE_CODE_SIGNING_ALLOWED:`NO`,FLUTTER_XCODE_CODE_SIGNING_REQUIRED:`NO`,FLUTTER_XCODE_CODE_SIGN_IDENTITY:``}:void 0}}function Xt(e=!1){return e?`debug`:`profile`}function Zt({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 Qt({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 $t=[`web`,...de];function en(e=`web`,{apiOrigin:t,cwd:n=process.cwd(),profile:r=!1,simulator:i=!1}={}){if(cn(e,{profile:r,simulator:i}),e===`web`)return[un(`pnpm`,[`build`],n,{COREFRAME_PLATFORM:`web`})];let a=O(t);return[{kind:`prepare`,platform:e},un(`flutter`,tn(e,a,{profile:r,simulator:i}),P(n,`src-flutter`),{COREFRAME_API_ORIGIN:a})]}function tn(e,t,{noCodesign:n=e===`macos`,profile:r=!1,simulator:i=!1}={}){cn(e,{profile:r,simulator:i});let a=O(t);return[`build`,e===`android`?`apk`:e,r?`--profile`:`--release`,...i?[`--simulator`]:[],...n?[`--no-codesign`]:[],`--dart-define=COREFRAME_API_ORIGIN=${a}`]}function nn(e,{profile:t=!1}={}){let n=t?`profile`:`release`,r=P(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
3
  `)}function rn(e,{profile:t=!1,simulator:n=!1}={}){let r=t?`profile`:`release`,i=P(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
5
  `)}function an(e){return[`Windows release build succeeded.`,``,`The unpackaged application bundle is at ${JSON.stringify(P(e,`src-flutter/build/windows/x64/runner/Release`))}.`,`Create and sign an installer with the Windows packaging workflow for distribution.`].join(`
6
6
  `)}function on(e){return[`Linux release build succeeded.`,``,`The application bundle is at ${JSON.stringify(P(e,`src-flutter/build/linux/x64/release/bundle`))}.`,`Package the bundle with the Linux distribution format used by your release process.`].join(`
7
- `)}async function sn({apiOrigin:e,cwd:t=process.cwd(),environment:n=process.env,platform:r=`web`,profile:i=!1,simulator:a=!1,prepareClient:o=D,runCommand:s=ln}={}){cn(r,{profile:i,simulator:a});let c={...n};delete c[Kt],delete c[qt],delete c.COREFRAME_PLATFORM,delete c.TAURI_ENV_PLATFORM;let l=r===`web`?void 0:O(e??n.COREFRAME_API_ORIGIN);for(let e of en(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(nn(t,{profile:i})):r===`ios`?console.log(rn(t,{profile:i,simulator:a})):r===`windows`?console.log(an(t)):r===`linux`&&console.log(on(t))}function cn(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 ln(e,t,{cwd:n,env:r}){await I(e,t,{cwd:n,env:r,stdio:`inherit`})}function un(e,t,n,r){return{kind:`command`,command:e,args:t,cwd:n,...r===void 0?{}:{environment:r}}}const dn=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in a packaged Flutter client.`,async from(e){return O(e)}}),fn=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($t)),displayName:`platform`,description:`Build target: web, iOS, Android, macOS, Windows, or Linux. Defaults to web.`}),apiOrigin:c({long:`api-origin`,type:l(dn),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})=>sn({apiOrigin:e,platform:t,profile:n,simulator:r})}),pn=/^[a-f0-9]{64}$/,mn=/^[a-f0-9]{40}$/,hn=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function gn(e){if(!pn.test(e))throw Error(`Invalid SHA-256 digest "${e}".`);return e}function _n(e){if(!mn.test(e))throw Error(`Invalid full Git revision "${e}".`);return e}function vn(e,t){if(!hn.test(e))throw Error(`${t} must contain only letters, numbers, dots, underscores, or hyphens.`);return e}function yn(e){return`projects/${vn(e,`Project ID`)}/i18n/v1`}function bn(e,t){return gn(t),`${yn(e)}/objects/sha256/${t.slice(0,2)}/${t}`}function xn(e,t){return _n(t),`${yn(e)}/commits/${t}.json`}function Sn(e,t){return Cn(t),`${yn(e)}/releases/${encodeURIComponent(t)}.json`}function Cn(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 J(e,t){if(!t||t.startsWith(`/`)||t.includes(`\0`))throw Error(`Unsafe i18n artifact path "${t}".`);let n=P(e),r=P(n,t);if(r!==n&&!r.startsWith(`${n}${F}`))throw Error(`Unsafe i18n artifact path "${t}".`);return r}function Y(e,t,n){return`${e.directory}/${t}/${n}.json`}function wn(e,t,n){return`${e.directory}/${t}/${n}.mjs`}async function Tn(e){await I(`pnpm`,[`exec`,`lingui`,`extract`],{cwd:e,stdio:`inherit`})}async function En({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=J(t,Y(e,n,a)),s=await jn(o),c=Object.fromEntries(Object.entries(s).filter(([,e])=>!e.obsolete)),l=M(r,`${n}-${a}.json`);await R(A(l),{recursive:!0}),await Te(o,l),i.push({path:o,backup:l}),await Mn(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 Te(t,e)}finally{for(let n of e.locales)for(let r of e.catalogs)await B(J(t,wn(e,n,r)),{force:!0})}}}async function Dn({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 jn(J(t,Y(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)=>Ln(e).localeCompare(Ln(t)))}async function On({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 Nn(await Pn({args:e.generator.args??[],command:e.generator.command,cwd:t,env:r,input:JSON.stringify(i)}))}async function kn({config:e,cwd:t,missing:n,response:r}){let i=new Map(n.map(e=>[Ln(e),e])),a=new Map;for(let e of r.translations){let t=Ln(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 Pe(`@lingui/message-utils/compileMessage`,t);for(let e of n){let t=a.get(Ln(e));Fn({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=J(t,Y(e,n,r)),o=await jn(i),s=!1;for(let[e,t]of Object.entries(o)){let i=a.get(Ln({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 Mn(i,o)}}async function An({config:e,cwd:t}){let n=await Dn({config:e,cwd:t});if(n.length>0)throw Error(`I18n catalogs remain incomplete: ${n.length} translations are missing.`);let r=await Pe(`@lingui/message-utils/compileMessage`,t);for(let n of e.locales)if(n!==e.sourceLocale)for(let i of e.catalogs){let a=await jn(J(t,Y(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}.`);Fn({compileMessage:r,id:e,locale:n,source:t.message,translation:t.translation})}}}async function jn(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 Mn(e,t){await R(A(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;await V(n,`${JSON.stringify(t,null,2)}\n`),await ke(n,e)}function Nn(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 Pn({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 Fn({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=In(a),c=In(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 In(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 Ln(e){return`${e.locale}\0${e.catalog}\0${e.id}`}function Rn(e){return Re(`sha256`).update(e).digest(`hex`)}async function zn(e){return Rn(await z(e))}function Bn(e){return Buffer.from(`${JSON.stringify(e,null,2)}\n`)}async function Vn({bucket:e,digest:t,projectId:n,source:r,store:i}){if(gn(t),await zn(r)!==t)throw Error(`I18n object source does not match declared SHA-256 digest ${t}.`);let a=bn(n,t);await i.has(e,a)||await i.upload(e,a,r,`application/octet-stream`);let o=`${r}.${process.pid}.${U()}.verify`;try{if(await i.download(e,a,o),await zn(o)!==t)throw Error(`Existing immutable i18n object ${a} failed integrity verification.`)}finally{await B(o,{force:!0})}}async function Hn({bucket:e,key:t,reference:n,store:r,temporaryDirectory:i}){let a=Bn(n),o=M(i,`reference-${U()}.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 V(o,a,{flag:`wx`});try{await r.upload(e,t,o,`application/json`)}finally{await B(o,{force:!0})}let s=M(i,`reference-${U()}.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 Un({bucket:e,manifest:t,projectId:n,store:r,temporaryDirectory:i}){let a=Bn(t),o=Rn(a),s=M(i,`manifest-${o}.json`);await V(s,a,{flag:`wx`});try{await Vn({bucket:e,digest:o,projectId:n,source:s,store:r})}finally{await B(s,{force:!0})}return o}async function Wn({bucket:e,key:t,store:n,temporaryDirectory:r}){if(!await n.has(e,t))return;let i=M(r,`reference-${U()}.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 _n(r.revision),gn(r.snapshot),r}finally{await B(i,{force:!0})}}async function Gn({bucket:e,projectId:t,revision:n,store:r,temporaryDirectory:i}){let a=await Wn({bucket:e,key:xn(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 Kn({bucket:e,projectId:t,reference:n,store:r,tag:i,temporaryDirectory:a}){await Hn({bucket:e,key:xn(t,n.revision),reference:n,store:r,temporaryDirectory:a}),i&&await Hn({bucket:e,key:Sn(t,i),reference:n,store:r,temporaryDirectory:a})}async function qn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:a}){gn(n);let o=M(P(t),`v1`,`sha256`,n.slice(0,2),n);if(await Yn(o,n)===!1){await R(A(o),{recursive:!0});let t=`${o}.${process.pid}.${U()}.tmp`;try{if(await i.download(e,bn(r,n),t),await zn(t)!==n)throw Error(`Downloaded i18n object failed SHA-256 verification: ${n}.`);await B(o,{force:!0}),await ke(t,o)}finally{await B(t,{force:!0})}}await R(A(a),{recursive:!0});let s=`${a}.${process.pid}.${U()}.tmp`;try{if(await Te(o,s),await zn(s)!==n)throw Error(`Cached i18n object failed SHA-256 verification: ${n}.`);await B(a,{force:!0}),await ke(s,a)}finally{await B(s,{force:!0})}}async function Jn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,temporaryDirectory:a}){let o=M(a,`manifest-${n}.json`);await qn({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}.`);_n(s.revision),s.baseline!==void 0&&gn(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}.`);gn(e.digest)}return s}async function Yn(e,t){try{return(await Ae(e)).isFile()&&await zn(e)===t}catch{return!1}}async function Xn({cwd:e=process.cwd(),env:t=process.env}={}){if((await H({cwd:e})).i18n){if(t.COREFRAME_I18N_RELEASE_REVISION){await $n({cwd:e,env:t,revision:t.COREFRAME_I18N_RELEASE_REVISION});return}await Tn(e)}}async function Zn({cwd:e=process.cwd(),projectConfig:t}={}){let n=t??await H({cwd:e});if(!n.i18n)return;let r=er(n.i18n),i=J(e,r.directory);try{if(!(await Ae(i)).isDirectory())throw Error(`I18n catalog path is not a directory: ${i}.`)}catch(t){if(t.code!==`ENOENT`)throw t;await Tn(e);return}for(let t of r.locales)for(let n of r.catalogs)try{if(!(await Ae(J(e,Y(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 Tn(e);return}}async function Qn({cwd:e=process.cwd(),env:t=process.env,store:n,tag:r}){Cn(r);let i=await tr({cwd:e,env:t,store:n});await lr(e);let a=await cr(e);await ur(e,r,a);let o=await De(M(Ne(),`coreframe-i18n-prepare-`));try{let n=await Gn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,revision:a,store:i.store,temporaryDirectory:o});if(n){let e=await Jn({bucket:i.assets.sourceBucket,cacheRoot:i.cacheRoot,digest:n.snapshot,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return sr(i,e,a),await rr(i,e),await Kn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,reference:n,store:i.store,tag:r,temporaryDirectory:o}),{reused:!0,snapshot:n.snapshot}}return await or(i,o,async()=>{let n=await nr(i,a,o);n||await ar(i),await Tn(e);let s=await Dn({config:i.config,cwd:e}),c=await On({config:i.config,cwd:e,env:t,messages:s});await kn({config:i.config,cwd:e,missing:s,response:c}),await An({config:i.config,cwd:e}),await En({config:i.config,cwd:e,strict:!0,temporaryDirectory:o});let l=await ir(i),u={...n?{baseline:n}:{},catalogs:i.config.catalogs,files:l,generator:s.length>0?i.config.generator?.id??`unconfigured`:`none`,linguiVersion:await dr(e),locales:i.config.locales,projectId:i.assets.projectId,revision:a,sourceLocale:i.config.sourceLocale,version:1},d=await Un({bucket:i.assets.sourceBucket,manifest:u,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return await Kn({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 $n({cwd:e=process.cwd(),env:t=process.env,revision:n,store:r}={}){let i=await H({cwd:e});if(!i.i18n)return;let a=await tr({cwd:e,env:t,store:r,projectConfig:i}),o=_n(n??await cr(e)),s=await De(M(Ne(),`coreframe-i18n-materialize-`));try{let e=await Gn({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 Jn({bucket:a.assets.sourceBucket,cacheRoot:a.cacheRoot,digest:e.snapshot,projectId:a.assets.projectId,store:a.store,temporaryDirectory:s});return sr(a,t,o),await rr(a,t),{revision:o,snapshot:e.snapshot}}finally{await B(s,{force:!0,recursive:!0})}}function er(e){let t=vn(e.sourceLocale,`Source locale`),n=[...new Set(e.locales.map(e=>vn(e,`Locale`)))],r=[...new Set(e.catalogs.map(e=>vn(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 tr({cwd:e=process.cwd(),env:t=process.env,projectConfig:n,store:r}){let i=n??await H({cwd:e});if(!i.i18n)throw Error(`Missing i18n configuration in coreframe.config.ts.`);if(!i.assets)throw Error(`I18n snapshots require the existing private build bucket configured under assets.`);let a=i.assets;return{assets:a,cacheRoot:P(e,`.coreframe`,`i18n`,`cache`),config:er(i.i18n),cwd:P(e),env:t,store:r??Se({config:a,env:t})}}async function nr(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 Gn({bucket:e.assets.sourceBucket,projectId:e.assets.projectId,revision:_n(t),store:e.store,temporaryDirectory:n});if(!r)continue;let i=await Jn({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:r.snapshot,projectId:e.assets.projectId,store:e.store,temporaryDirectory:n});return sr(e,i,t),await rr(e,i),r.snapshot}}async function rr(e,t){for(let n of t.files)if(await qn({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:n.digest,projectId:e.assets.projectId,store:e.store,target:J(e.cwd,n.path)}),(await Ae(J(e.cwd,n.path))).size!==n.size)throw Error(`Materialized i18n artifact size does not match manifest: ${n.path}.`)}async function ir(e){let t=[];for(let n of e.config.locales)for(let r of e.config.catalogs){let i=Y(e.config,n,r),a=J(e.cwd,i),o=await zn(a);await Vn({bucket:e.assets.sourceBucket,digest:o,projectId:e.assets.projectId,source:a,store:e.store}),t.push({digest:o,path:i,size:(await Ae(a)).size})}return t.sort((e,t)=>e.path.localeCompare(t.path))}async function ar(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 Pe(`@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 Mn(J(e.cwd,Y(e.config,t,r)),a.parse(n)),o=!0}catch{}}return o}async function or(e,t,n){let r=[];for(let n of e.config.locales)for(let i of e.config.catalogs){let a=Y(e.config,n,i),o=J(e.cwd,a);try{await Ce(o)}catch{continue}let s=M(t,`previous-catalogs`,a);await R(A(s),{recursive:!0}),await ke(o,s),r.push({backup:s,path:o})}try{let e=await n();return await B(M(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(J(e.cwd,Y(e.config,t,n)),{force:!0});for(let{backup:e,path:t}of r)await R(A(t),{recursive:!0}),await ke(e,t);throw t}}function sr(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=>Y(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 cr(e){let{stdout:t}=await I(`git`,[`rev-parse`,`HEAD`],{cwd:e,stdin:`ignore`});return _n(t.trim())}async function lr(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 ur(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 dr(e){let{stdout:t}=await I(`pnpm`,[`exec`,`lingui`,`--version`],{cwd:e,stdin:`ignore`});return t.trim()}const fr=[`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(` `),pr=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}}),mr=r(p,{displayName:`profile`,async from(e){return be(e)}}),hr=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}}),gr=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in the packaged Flutter client.`,async from(e){return O(e)}}),_r=m({name:`assets`,cmds:{configure:n({name:`configure`,description:`Store a Backblaze B2 private build-object key in the operating system credential store. ${fr}`,args:{profile:u({type:mr,displayName:`profile`,description:`Credential profile named by coreframe.config.ts.`})},handler:async({profile:e})=>{L.note(fr,`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 xe({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(hr),description:`Place the asset in a named, lazily loaded pack.`}),variantWidths:c({long:`widths`,type:l(pr),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})=>ve(await me({alt:e,file:t,id:n,pack:i,variantWidths:a}),r,{kind:`add`,assetId:n})}),backup:n({name:`backup`,description:`Back up every object in both configured asset buckets to a new Git branch.`,args:{branch:c({long:`branch`,type:p,description:`Name of the new local Git branch that will contain the backup.`})},handler:async({branch:e})=>{let t=await he({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(hr),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})=>ve(await ge({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(hr),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 _e({fix:e,pack:n});ve(r,t,{kind:`check`}),r.ok||(process.exitCode=1)}}),publish:n({name:`publish`,args:{pack:c({long:`pack`,type:l(hr),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 ye({pack:t});ve(n,e,{kind:`publish`}),n.ok||(process.exitCode=1)}}),status:n({name:`status`,args:{pack:c({long:`pack`,type:l(hr),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 _e({pack:t});ve(n,e,{kind:`status`}),n.ok||(process.exitCode=1)}})}}),vr=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:gr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e})=>pe({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})=>E({check:e})}),prepare:n({name:`prepare`,description:`Build and package the React client for one Flutter platform.`,args:{platform:u({type:s(de),displayName:`platform`,description:`Flutter platform whose packaged client should be prepared.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:gr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>D({apiOrigin:e,platform:t})}),check:n({name:`check`,description:`Reject missing, stale, modified, or incorrectly targeted Flutter assets.`,args:{platform:u({type:s(de),displayName:`platform`,description:`Flutter platform whose packaged client should be checked.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:gr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>ce({apiOrigin:e,platform:t})})}}),yr=m({name:`i18n`,cmds:{build:n({name:`build`,description:`Extract source messages or materialize an exact release catalog snapshot.`,args:{},handler:async()=>{await Xn()}}),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 $n({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 Qn({tag:e});console.log(`${t.reused?`Reused`:`Published`} i18n snapshot ${t.snapshot}.`)}})}}),br=W.platform===`win32`?`react-router.cmd`:`react-router`,xr=W.platform===`win32`?`panda.cmd`:`panda`;async function Sr(e=W.cwd()){await Tr(e),await wr(e,[`typegen`])}async function Cr(e=W.cwd(),t=W.env,n){if((t.COREFRAME_PLATFORM??`web`)!==`web`)return;let r=k.resolve(e,`.coreframe/dashboard-build`),i=k.join(r,`client`),a=k.resolve(e,`dist/client/__dashboard`);if(await B(r,{force:!0,recursive:!0}),(await H({cwd:e})).deploy?.mode===`client`){await B(a,{force:!0,recursive:!0});return}await Er(e,xr,[`build`],t),await wr(e,[`build`,...n?[`--mode`,n]:[]],t),await B(a,{force:!0,recursive:!0}),await R(k.dirname(a),{recursive:!0}),await Ee(i,a,{recursive:!0})}async function wr(e,t,n=W.env){await Er(e,br,t,n)}async function Tr(e){await B(k.resolve(e,`dashboard/.react-router`),{force:!0,recursive:!0})}async function Er(e,t,n,r=W.env){await I(t,n,{cwd:k.resolve(e,`dashboard`),env:{...r,PATH:k.resolve(e,`node_modules/.bin`)+k.delimiter+(r.PATH??r.Path??``)},stdio:`inherit`})}const X={access:Ce,chmod:we,mkdir:R,mkdtemp:De,readFile:z,readFileSync:K,rm:B,writeFile:V},Dr={getAvailablePort:kr},Or={homedir:je,kill:W.kill,networkInterfaces:Me,tmpdir:Ne};async function kr(){let e=Qe();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 Ar({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 jr(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=Qe(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 jr(e,t){let n=Date.now()+1e4,r;for(;!t();)try{return await Mr(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 Mr({host:e=`127.0.0.1`,port:t}){return new Promise((n,r)=>{let i=Ze({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 Nr=W.platform===`win32`?`react-router.cmd`:`react-router`;function Pr(e){return G(k.resolve(e,`dashboard/dashboard.config.ts`))}function Fr({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 W.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([Je(t.stdout),Je(t.stderr)]),i===e&&(i=void 0)}};a=Ar({port:n,start:async()=>{if(o)throw Error(`The dashboard development server was stopped before it started.`);let n=await Dr.getAvailablePort();if(o)throw Error(`The dashboard development server was stopped before it started.`);let a=Ye({label:`dashboard`}),s=Ye({color:`red`,label:`dashboard`});a.pipe(W.stdout,{end:!1}),s.pipe(W.stderr,{end:!1});let l=I(Nr,[`dev`,`--host`,`127.0.0.1`,`--port`,String(n)],{cwd:k.resolve(e,`dashboard`),env:{...t,PATH:k.resolve(e,`node_modules/.bin`)+k.delimiter+r},stdin:`inherit`});i=l;let d=Promise.allSettled([Lr(l.stdout,a),Lr(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)W.off(t,e)})(),s);return{close:d,listen:()=>a.listen(),wait:()=>a.wait()}}async function Ir({cwd:e=W.cwd(),env:t=W.env,port:n}){let r=Fr({cwd:e,env:t,port:n});try{await r.listen(),await r.wait()}finally{await r.close()}}async function Lr(e,t){for await(let n of e)t.write(`${n}\n`)||await new Promise(e=>t.once(`drain`,e))}const Rr=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})=>Ir({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})=>Cr(void 0,void 0,e)}),typegen:n({name:`typegen`,args:{},handler:()=>Sr()})}}),zr=`.coreframe/releases/extensions`,Br=`.coreframe/releases/production`;async function Vr({cwd:e=process.cwd()}={}){if(!(await H({cwd:e})).extension)return[];let t=await qr(e),n=await ni(e);await Yr(e,t,[`prepare`]),(t.stores.chrome||t.stores.edge)&&await Yr(e,t,[`zip`,`--browser`,`chrome`]),t.stores.firefox&&await Yr(e,t,[`zip`,`--browser`,`firefox`]);let r=Jr(e,t.wxt.outputDirectory??`.output`,`outputDirectory`),i=await Oe(r),a=[];return(t.stores.chrome||t.stores.edge)&&a.push({label:t.stores.chrome&&t.stores.edge?`Chrome/Edge extension`:t.stores.chrome?`Chrome extension`:`Edge extension`,path:k.relative(e,k.join(r,ui(i,`-${n}-chrome.zip`)))}),t.stores.firefox&&a.push({label:`Firefox extension`,path:k.relative(e,k.join(r,ui(i,`-${n}-firefox.zip`)))},{label:`Firefox extension sources`,path:k.relative(e,k.join(r,ui(i,`-${n}-sources.zip`)))}),a}async function Hr({cwd:e=process.cwd()}={}){let t=await qr(e),n=await ti(e),r=await mi(e,n.version);if(r){if(r.revision!==n.revision)throw Error(`Extension version ${n.version} is already packaged from a different Git revision.`);return await ci(e,r),r}await Yr(e,t,[`prepare`]),(t.stores.chrome||t.stores.edge)&&await Yr(e,t,[`zip`,`--browser`,`chrome`]),t.stores.firefox&&await Yr(e,t,[`zip`,`--browser`,`firefox`]);let i=Jr(e,t.wxt.outputDirectory??`.output`,`outputDirectory`),a=await Oe(i),o=t.stores.chrome||t.stores.edge?ui(a,`-${n.version}-chrome.zip`):void 0,s=t.stores.firefox?ui(a,`-${n.version}-firefox.zip`):void 0,c=t.stores.firefox?ui(a,`-${n.version}-sources.zip`):void 0,l=fi(e,n.version);await R(l,{recursive:!0});let u={};if(o){let e=await si(i,l,o);t.stores.chrome&&(u.chrome=e),t.stores.edge&&(u.edge=e)}s&&(u.firefox=await si(i,l,s)),c&&(u.firefoxSources=await si(i,l,c));let d={...n,artifacts:u,stores:Object.fromEntries(di(t).map(e=>[e,`packaged`]))};return await hi(e,d),d}async function Ur({cwd:e=process.cwd(),dryRun:t=!1}={}){let n=await qr(e);if(!n.stores.chrome)throw Error(`extension submit requires the Chrome store to be enabled.`);let r=await ri(e);if(await ci(e,r),r.stores.chrome===`released`)throw Error(`This extension release is already published.`);if(!t&&r.stores.chrome===`submitted`)return r;let i=li(r,`chrome`);return await Xr(e,[...t?[`--dry-run`]:[],`--chrome-zip`,i.path,`--chrome-api-version`,`v2`,`--chrome-publish-type`,`STAGED_PUBLISH`,...Zr(n)]),t||(r.stores.chrome=`submitted`,await hi(e,r)),r}async function Wr({cwd:e=process.cwd()}={}){let t=await qr(e),n=await ri(e);return await ci(e,n),await Xr(e,[`status`,...Qr(t)]),n}async function Gr({cwd:e=process.cwd()}={}){let t=await qr(e),n=await ri(e);if(await ci(e,n),t.stores.chrome&&n.stores.chrome!==`submitted`)throw Error(`Chrome must be submitted and approved before post-deploy release.`);await ai(e,n),t.stores.chrome&&n.stores.chrome!==`released`&&(await Xr(e,[`set-deploy-percentage`,`--chrome-deploy-percentage`,`100`,...Zr(t)]),n.stores.chrome=`released`,await hi(e,n));for(let r of[`edge`,`firefox`])!t.stores[r]||n.stores[r]!==`packaged`||(await Xr(e,r===`edge`?$r(t,n):ei(t,n)),n.stores[r]=`submitted`,await hi(e,n));return n}async function Kr(e,{cwd:t=process.cwd()}={}){let n=k.resolve(t,Br);await R(n,{recursive:!0}),await gi(k.join(n,`${oi(e.revision)}.json`),e)}async function qr(e){let t=(await H({cwd:e})).extension;if(!t)throw Error(`Configure extension in coreframe.config.ts before using this command.`);if(Jr(e,t.wxt.config,`config`),!di(t).length)throw Error(`extension.stores must enable at least one store.`);return t}function Jr(e,t,n){let r=k.resolve(e),i=k.resolve(r,t);if(!t||k.isAbsolute(t)||i!==r&&!i.startsWith(`${r}${k.sep}`))throw Error(`extension.wxt.${n} must be a project-relative path inside the project.`);return i}async function Yr(e,t,n){await I(`pnpm`,[`exec`,`wxt`,...n,`--config`,t.wxt.config],{cwd:e,stdio:`inherit`})}async function Xr(e,t){await I(`pnpm`,[`exec`,`wxt`,`submit`,...t],{cwd:e,stdio:`inherit`})}function Zr(e){let t=e.stores.chrome;return t?[...t.extensionId?[`--chrome-extension-id`,t.extensionId]:[],...t.publisherId?[`--chrome-publisher-id`,t.publisherId]:[]]:[]}function Qr(e){return[...Zr(e),...e.stores.edge?.productId?[`--edge-product-id`,e.stores.edge.productId]:[],...e.stores.firefox?.extensionId?[`--firefox-extension-id`,e.stores.firefox.extensionId]:[]]}function $r(e,t){return[`--edge-zip`,li(t,`edge`).path,...e.stores.edge?.productId?[`--edge-product-id`,e.stores.edge.productId]:[]]}function ei(e,t){return[`--firefox-zip`,li(t,`firefox`).path,`--firefox-sources-zip`,li(t,`firefoxSources`).path,...e.stores.firefox?.extensionId?[`--firefox-extension-id`,e.stores.firefox.extensionId]:[],`--firefox-channel`,e.stores.firefox?.channel??`listed`]}async function ti(e){return{version:await ni(e),revision:(await I(`git`,[`rev-parse`,`HEAD`],{cwd:e})).stdout.trim()}}async function ni(e){let t=JSON.parse(await z(k.resolve(e,`package.json`),`utf8`));if(typeof t.version!=`string`||!t.version)throw Error(`package.json must contain an extension release version.`);return t.version}async function ri(e){let t=await ti(e),n=await mi(e,t.version)??await ii(e,t.revision);if(!n)throw Error(`Package extension version ${t.version} before continuing.`);if(n.revision!==t.revision)throw Error(`The packaged extension was built from a different Git revision.`);return n}async function ii(e,t){let n;try{n=await Oe(k.resolve(e,zr))}catch(e){if(e.code===`ENOENT`)return;throw e}let r=(await Promise.all(n.map(t=>mi(e,t)))).filter(e=>e?.revision===t);if(r.length>1)throw Error(`Multiple extension releases are recorded for the current Git revision.`);return r[0]}async function ai(e,t){let n;try{n=JSON.parse(await z(k.resolve(e,Br,`${oi(t.revision)}.json`),`utf8`))}catch{throw Error(`No successful production deployment is recorded for ${t.version}.`)}if(n.revision!==t.revision)throw Error(`The successful production deployment does not match the packaged extension.`)}function oi(e){if(!/^[a-f0-9]{40}$/i.test(e))throw Error(`Unsafe Git revision: ${e}`);return e}async function si(e,t,n){let r=k.join(e,n),i=k.join(t,n),a=await z(r);try{if(!(await z(i)).equals(a))throw Error(`Immutable extension artifact already exists: ${i}`)}catch(e){if(e.code===`ENOENT`)await V(i,a,{flag:`wx`});else throw e}return{path:i,sha256:_i(a),size:a.byteLength}}async function ci(e,t){for(let n of new Set(Object.values(t.artifacts))){if(!n)continue;let t=await z(k.resolve(e,n.path));if(t.byteLength!==n.size||_i(t)!==n.sha256)throw Error(`Extension artifact integrity check failed: ${n.path}`)}}function li(e,t){let n=e.artifacts[t];if(!n)throw Error(`Missing required ${t} extension artifact.`);return n}function ui(e,t){let n=e.filter(e=>e.endsWith(t));if(n.length!==1)throw Error(`Expected exactly one WXT *${t} artifact.`);return n[0]}function di(e){return[`chrome`,`edge`,`firefox`].filter(t=>!!e.stores[t])}function fi(e,t){return k.resolve(e,zr,pi(t))}function pi(e){if(!/^[A-Za-z0-9._+-]+$/.test(e))throw Error(`Unsafe extension version: ${e}`);return e}async function mi(e,t){try{return JSON.parse(await z(k.join(fi(e,t),`release.json`),`utf8`))}catch(e){if(e.code===`ENOENT`)return;throw e}}async function hi(e,t){let n=k.join(fi(e,t.version),`release.json`);await R(k.dirname(n),{recursive:!0}),await gi(n,t)}async function gi(e,t){let n=`${e}.${process.pid}.tmp`;await V(n,`${JSON.stringify(t,null,2)}\n`,{mode:384}),await import(`node:fs/promises`).then(({rename:t})=>t(n,e))}function _i(e){return Re(`sha256`).update(e).digest(`hex`)}const vi=m({name:`extension`,cmds:{package:n({name:`package`,args:{},handler:()=>Hr()}),submit:n({name:`submit`,args:{dryRun:i({long:`dry-run`,description:`Validate store authentication without uploading or submitting.`,defaultValue:()=>!1})},handler:({dryRun:e})=>Ur({dryRun:e})}),status:n({name:`status`,args:{},handler:()=>Wr()}),release:n({name:`release`,args:{},handler:()=>Gr()})}});function yi(){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 bi({all:e,cwd:t=process.cwd(),ids:n=[],matches:r=[],now:i=new Date}={}){let a=await Ei(t),o=await Di(a.config,t,async e=>a.module.developmentJobs.createStateAdmin(e).list()),s=$e({jobs:a.module.developmentJobs.jobs,now:i,records:o??[]}),c=wi(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 xi({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 bi({all:!0,cwd:n,now:s}),u=wi(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 ${ji(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 Ei(n),m=await Di(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 ${ji(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 Si(e){let t=Ai(e.database);return e.jobs.length===0?`${t}No local development jobs are configured.`:`${t}${Mi([`Job`,`Status`,`Last success`,`Next eligible`,`Lease`],e.jobs.map(e=>[e.id,e.lease===`active`?`running`:e.registration===`orphaned`?`orphaned`:e.eligibility,ki(e.lastSucceededAt),ki(e.nextEligibleAt),e.lease===`none`?`-`:`${e.lease} until ${ki(e.leaseUntil)}`]))}`}function Ci(e){let t=Ai(e.database);return e.jobs.length===0?`${t}No local development job state matched.`:`${t}${Mi([`Job`,`Result`],e.jobs.map(e=>[e.id,e.status.replaceAll(`-`,` `)]))}`}function wi(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 ${ji(o)}.`);let s=new Set(t?a:n);for(let t of r){let n=Ti(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 Ti(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 Ei(e){let t=await H({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 Fe(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 Di(e,t,n){try{var r=yi();let a=e.database?.dialect??`postgres`,o=a===`sqlite`?k.resolve(t,`.coreframe/turso.db`):k.resolve(t,`.coreframe/postgres/PG_VERSION`);try{await Ae(o)}catch(e){if(Ni(e)&&e.code===`ENOENT`)return;throw e}if(a===`sqlite`)try{var i=yi();let r=await ee({cwd:t,env:i.a(await oe({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Oi(n,r)}finally{r.$client.close()}}catch(e){i.e=e}finally{await i.d()}let s=await v({cwd:t,env:r.a(await ae({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Oi(n,s)}finally{await s.$client.end()}}catch(e){r.e=e}finally{await r.d()}}async function Oi(e,t){try{return await e(t)}catch(e){throw Pi(e)?Error(`The local development job state table is missing. Run coreframe db migrate-local, then retry.`,{cause:e}):e}}function ki(e){return e?.toISOString()??`-`}function Ai(e){return e.state===`missing`?`Local ${e.dialect} database is missing; no database was created.\n\n`:``}function ji(e){return e.map(e=>JSON.stringify(e)).join(`, `)}function Mi(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 Ni(e){return e instanceof Error&&`code`in e}function Pi(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 Fi={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:()=>[]})},Ii=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}),...Fi},handler:async({ids:e,json:t,matches:n})=>{let r=await bi({ids:e,matches:n});console.log(t?JSON.stringify(r):Si(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}),...Fi},handler:async({all:e,breakLeases:t,dryRun:n,ids:r,json:i,matches:a,yes:o})=>{let s=await xi({all:e,breakLeases:t,dryRun:n,ids:r,json:i,matches:a,yes:o});console.log(i?JSON.stringify(s):Ci(s))}})}});async function Li({dryRun:e=!1,environment:t,yes:n=!1,cwd:r=process.cwd(),env:i=process.env,interactive:a=!!process.stdout.isTTY}){let o=await T({config:await H({cwd:r}),environment:t,cwd:r,env:i});try{let i;try{i=await S(o,r)}catch(e){throw o.redact(e)}if(L.note([`Environment: ${o.environment}`,`Dialect: ${o.dialect}`,`Target: ${o.identifier}`].join(`
9
- `),`Deployment database`),L.note(x(i),`Pending deploy migrations`),e||i.length===0)return{applied:!1,dialect:o.dialect,environment:t,identifier:o.identifier,pending:i};if(!n){if(!a)throw Error(`Noninteractive deployment migrations require --yes.`);let e=await L.confirm({initialValue:!1,message:`Apply ${i.length} migration${i.length===1?``:`s`} to ${t}?`});if(L.isCancel(e)||!e)throw Error(`Deployment migration cancelled.`)}try{await o.apply()}catch(e){throw o.redact(e)}return L.log.success(`Applied ${i.length} deployment migration${i.length===1?``:`s`}.`),{applied:!0,dialect:o.dialect,environment:t,identifier:o.identifier,pending:i}}finally{await o.close()}}const Ri=/^[a-z0-9]+(?:-[a-z0-9]+)*$/u;function zi(e,t){let n=Vi(e,t);if(!Hi(n)||!Ui(n,[`description`,`requires`,`routes`,`verifier`])||!Gi(n.description)||n.requires!==void 0&&(!Array.isArray(n.requires)||!n.requires.every(Gi))||n.verifier!==void 0&&!Gi(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=>Bi(e));if(new Set(r).size!==r.length)throw Error(`${t} contains duplicate recipe requirements.`);let i=n.routes.map((e,n)=>{if(!Hi(e)||!Wi(e,[`path`,`router`,`when`])||!Gi(e.path)||!Gi(e.router)||!Gi(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 Bi(e){if(!Ri.test(e))throw Error(`Recipe names use lowercase letters, numbers, and single hyphens.`);return e}function Vi(e,t){try{return et(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function Hi(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ui(e,t){return Object.keys(e).every(e=>t.includes(e))}function Wi(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function Gi(e){return typeof e==`string`&&e.length>0}const Ki=`https://github.com/coreframe-js/coreframe.git`;function qi(e,t){return q(`git`,e,{cwd:t,encoding:`utf8`})}function Ji(e,t){let n=qi(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 Yi(e,t){let n=qi([`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 Xi({cwd:e=process.cwd(),fetch:t=!0,remote:n=`template`}={}){if(n.length===0)throw Error(`Remote name must not be empty.`);Ji([`rev-parse`,`--show-toplevel`],e);let r=Yi(n,e);if(r===null)Ji([`remote`,`add`,n,Ki],e),console.log(`Added ${n} remote: ${Ki}`);else if(r===Ki)console.log(`${n} remote already points at ${Ki}`);else throw Error(`${n} remote points at ${r}, not ${Ki}.\nChoose the intended template source before continuing, then update or rename the remote manually.`);t&&(Ji([`fetch`,n,`--tags`,`--prune`],e),console.log(`Fetched ${n}.`))}const Zi=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u;function Z(e){return Zi.test(e)?`v${e}`:e}function Qi(e){return`${Z(e)}:template`}function $i(e,t){return`${Qi(e)}/${t}`}function ea({cwd:e=process.cwd(),fetch:t=!0,remote:n=`template`,target:r}={}){let i=ia(e),a=ca(i,[`rev-parse`,`--show-toplevel`]),o=Z(r??aa(i));return Xi({cwd:a,fetch:t,remote:n}),{projectRoot:i,ref:o,repositoryRoot:a}}function ta(e,t,n){return na(e,t,n).toString(`utf8`)}function na(e,t,n){let r=`${t}:${n}`,i=q(`git`,[`show`,r],{cwd:e,encoding:`buffer`});if(i.status!==0)throw Error(`Could not read ${r}. ${la([`show`,r],i)}`);return i.stdout}function ra(e,t,n){let r=q(`git`,[`ls-tree`,`-r`,`--name-only`,`-z`,t,`--`,n],{cwd:e,encoding:`buffer`});if(r.status!==0)throw Error(la([`ls-tree`,t,n],r));return r.stdout.toString(`utf8`).split(`\0`).filter(Boolean)}function ia(e){let t=P(e);for(;;){let e=M(t,`package.json`),n=sa(e);if(n!==void 0&&oa(n,e).engines?.coreframe)return t;let r=A(t);if(r===t)throw Error(`Could not find a package.json with engines.coreframe.`);t=r}}function aa(e){let t=M(e,`package.json`),n=sa(t);if(n===void 0)throw Error(`Required file package.json does not exist.`);let r=oa(n,t).engines?.coreframe;if(!r)throw Error(`package.json must declare an exact engines.coreframe recipe baseline.`);return r}function oa(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function sa(e){try{return K(e,`utf8`)}catch(e){if(ua(e)&&e.code===`ENOENT`)return;throw e}}function ca(e,t){let n=q(`git`,t,{cwd:e,encoding:`utf8`});if(n.status!==0)throw Error(la(t,n));return n.stdout.trim()}function la(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 ua(e){return e instanceof Error&&`code`in e}const da=[{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:ba},{path:`src-flutter/pubspec.yaml`,requirement:`declare flutter_driver as a Flutter SDK dependency`,test:xa},{path:`src-flutter/lib/main.dart`,requirement:`gate Flutter Driver behind kDebugMode and ENABLE_FLUTTER_DRIVER before starting Coreframe`,test:Sa},{path:`src/web/app/flutter-shell/application.ts`,requirement:`configure the Flutter shell's app-owned query and session hooks`,test:e=>ya(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=>ya(e,[`@coreframe/vite/flutter-devtools`,`import.meta.env.PLATFORM !== "web"`])}],fa=`src-flutter/lib/application.dart`,pa=`src/api/worker/auth-origin.ts`;function ma(e){let t=[];for(let n of da){let r=M(e,n.path);if(!G(r)){t.push(`${n.path} is missing; it must ${n.requirement}.`);continue}let i=K(r,`utf8`);n.test(i)||t.push(`${n.path} must ${n.requirement}.`)}let n=ha(e,t),r=ga(e,t);return n!==void 0&&r!==void 0&&n!==r&&t.push(`${fa} loopbackPort (${n}) must match ${pa} FLUTTER_LOOPBACK_ORIGIN (${r}).`),t}function ha(e,t){let n=_a(e,fa,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=va(r??a);return o===void 0&&t.push(`${fa} must configure loopbackPort as a fixed integer port.`),o}function ga(e,t){let n=_a(e,pa,t);if(n===void 0)return;let r=va(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(`${pa} must define FLUTTER_LOOPBACK_ORIGIN as an exact localhost origin with a fixed integer port.`),r}function _a(e,t,n){let r=M(e,t);if(!G(r)){n.push(`${t} is missing; it must define the Flutter loopback origin contract.`);return}return K(r,`utf8`)}function va(e){if(!e)return;let t=Number(e);return Number.isInteger(t)&&t>=1&&t<=65535?t:void 0}function ya(e,t){return t.every(t=>e.includes(t))}function ba(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 xa(e){try{let t=et(e);if(!Ca(t)||!Ca(t.dependencies))return!1;let n=t.dependencies.flutter_driver;return Ca(n)&&n.sdk===`flutter`}catch{return!1}}function Sa(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 Ca(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function wa({name:e,...t}){let n=ea(t),r=`recipes/${e}/recipe.yaml`,i=Da(zi(ta(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(`
7
+ `)}async function sn({apiOrigin:e,cwd:t=process.cwd(),environment:n=process.env,platform:r=`web`,profile:i=!1,simulator:a=!1,prepareClient:o=D,runCommand:s=ln}={}){cn(r,{profile:i,simulator:a});let c={...n};delete c[Kt],delete c[qt],delete c.COREFRAME_PLATFORM,delete c.TAURI_ENV_PLATFORM;let l=r===`web`?void 0:O(e??n.COREFRAME_API_ORIGIN);for(let e of en(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(nn(t,{profile:i})):r===`ios`?console.log(rn(t,{profile:i,simulator:a})):r===`windows`?console.log(an(t)):r===`linux`&&console.log(on(t))}function cn(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 ln(e,t,{cwd:n,env:r}){await I(e,t,{cwd:n,env:r,stdio:`inherit`})}function un(e,t,n,r){return{kind:`command`,command:e,args:t,cwd:n,...r===void 0?{}:{environment:r}}}const dn=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in a packaged Flutter client.`,async from(e){return O(e)}}),fn=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($t)),displayName:`platform`,description:`Build target: web, iOS, Android, macOS, Windows, or Linux. Defaults to web.`}),apiOrigin:c({long:`api-origin`,type:l(dn),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})=>sn({apiOrigin:e,platform:t,profile:n,simulator:r})}),pn=/^[a-f0-9]{64}$/,mn=/^[a-f0-9]{40}$/,hn=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function gn(e){if(!pn.test(e))throw Error(`Invalid SHA-256 digest "${e}".`);return e}function _n(e){if(!mn.test(e))throw Error(`Invalid full Git revision "${e}".`);return e}function vn(e,t){if(!hn.test(e))throw Error(`${t} must contain only letters, numbers, dots, underscores, or hyphens.`);return e}function yn(e){return`projects/${vn(e,`Project ID`)}/i18n/v1`}function bn(e,t){return gn(t),`${yn(e)}/objects/sha256/${t.slice(0,2)}/${t}`}function xn(e,t){return _n(t),`${yn(e)}/commits/${t}.json`}function Sn(e,t){return Cn(t),`${yn(e)}/releases/${encodeURIComponent(t)}.json`}function Cn(e){if(!e.startsWith(`v`)||e.length<2||e.length>128||/\s/.test(e)||e.includes(`..`))throw Error(`Release tag "${e}" must be a valid v-prefixed tag.`);return e}function Y(e,t){if(!t||t.startsWith(`/`)||t.includes(`\0`))throw Error(`Unsafe i18n artifact path "${t}".`);let n=P(e),r=P(n,t);if(r!==n&&!r.startsWith(`${n}${F}`))throw Error(`Unsafe i18n artifact path "${t}".`);return r}function X(e,t,n){return`${e.directory}/${t}/${n}.json`}function wn(e,t,n){return`${e.directory}/${t}/${n}.mjs`}async function Tn(e){await I(`pnpm`,[`exec`,`lingui`,`extract`],{cwd:e,stdio:`inherit`})}async function En({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 jn(o),c=Object.fromEntries(Object.entries(s).filter(([,e])=>!e.obsolete)),l=M(r,`${n}-${a}.json`);await R(A(l),{recursive:!0}),await Te(o,l),i.push({path:o,backup:l}),await Mn(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 Te(t,e)}finally{for(let n of e.locales)for(let r of e.catalogs)await V(Y(t,wn(e,n,r)),{force:!0})}}}async function Dn({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 jn(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)=>Ln(e).localeCompare(Ln(t)))}async function On({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 Nn(await Pn({args:e.generator.args??[],command:e.generator.command,cwd:t,env:r,input:JSON.stringify(i)}))}async function kn({config:e,cwd:t,missing:n,response:r}){let i=new Map(n.map(e=>[Ln(e),e])),a=new Map;for(let e of r.translations){let t=Ln(e);if(!i.has(t))throw Error(`Translation generator returned unexpected entry ${e.locale}:${e.catalog}:${e.id}.`);if(a.has(t))throw Error(`Translation generator returned duplicate entry ${e.locale}:${e.catalog}:${e.id}.`);if(!e.translation.trim())throw Error(`Translation generator returned an empty entry ${e.locale}:${e.id}.`);a.set(t,e.translation)}let o=[...i.keys()].filter(e=>!a.has(e));if(o.length>0)throw Error(`Translation generator omitted ${o.length} required entries.`);let s=await Ne(`@lingui/message-utils/compileMessage`,t);for(let e of n){let t=a.get(Ln(e));Fn({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 jn(i),s=!1;for(let[e,t]of Object.entries(o)){let i=a.get(Ln({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 Mn(i,o)}}async function An({config:e,cwd:t}){let n=await Dn({config:e,cwd:t});if(n.length>0)throw Error(`I18n catalogs remain incomplete: ${n.length} translations are missing.`);let r=await Ne(`@lingui/message-utils/compileMessage`,t);for(let n of e.locales)if(n!==e.sourceLocale)for(let i of e.catalogs){let a=await jn(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}.`);Fn({compileMessage:r,id:e,locale:n,source:t.message,translation:t.translation})}}}async function jn(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 Mn(e,t){await R(A(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;await H(n,`${JSON.stringify(t,null,2)}\n`),await B(n,e)}function Nn(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 Pn({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 Fn({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=In(a),c=In(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 In(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 Ln(e){return`${e.locale}\0${e.catalog}\0${e.id}`}function Rn(e){return Re(`sha256`).update(e).digest(`hex`)}async function zn(e){return Rn(await z(e))}function Bn(e){return Buffer.from(`${JSON.stringify(e,null,2)}\n`)}async function Vn({bucket:e,digest:t,projectId:n,source:r,store:i}){if(gn(t),await zn(r)!==t)throw Error(`I18n object source does not match declared SHA-256 digest ${t}.`);let a=bn(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 zn(o)!==t)throw Error(`Existing immutable i18n object ${a} failed integrity verification.`)}finally{await V(o,{force:!0})}}async function Hn({bucket:e,key:t,reference:n,store:r,temporaryDirectory:i}){let a=Bn(n),o=M(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 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=M(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 V(s,{force:!0})}}async function Un({bucket:e,manifest:t,projectId:n,store:r,temporaryDirectory:i}){let a=Bn(t),o=Rn(a),s=M(i,`manifest-${o}.json`);await H(s,a,{flag:`wx`});try{await Vn({bucket:e,digest:o,projectId:n,source:s,store:r})}finally{await V(s,{force:!0})}return o}async function Wn({bucket:e,key:t,store:n,temporaryDirectory:r}){if(!await n.has(e,t))return;let i=M(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 _n(r.revision),gn(r.snapshot),r}finally{await V(i,{force:!0})}}async function Gn({bucket:e,projectId:t,revision:n,store:r,temporaryDirectory:i}){let a=await Wn({bucket:e,key:xn(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 Kn({bucket:e,projectId:t,reference:n,store:r,tag:i,temporaryDirectory:a}){await Hn({bucket:e,key:xn(t,n.revision),reference:n,store:r,temporaryDirectory:a}),i&&await Hn({bucket:e,key:Sn(t,i),reference:n,store:r,temporaryDirectory:a})}async function qn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,target:a}){gn(n);let o=M(P(t),`v1`,`sha256`,n.slice(0,2),n);if(await Yn(o,n)===!1){await R(A(o),{recursive:!0});let t=`${o}.${process.pid}.${W()}.tmp`;try{if(await i.download(e,bn(r,n),t),await zn(t)!==n)throw Error(`Downloaded i18n object failed SHA-256 verification: ${n}.`);await V(o,{force:!0}),await B(t,o)}finally{await V(t,{force:!0})}}await R(A(a),{recursive:!0});let s=`${a}.${process.pid}.${W()}.tmp`;try{if(await Te(o,s),await zn(s)!==n)throw Error(`Cached i18n object failed SHA-256 verification: ${n}.`);await V(a,{force:!0}),await B(s,a)}finally{await V(s,{force:!0})}}async function Jn({bucket:e,cacheRoot:t,digest:n,projectId:r,store:i,temporaryDirectory:a}){let o=M(a,`manifest-${n}.json`);await qn({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}.`);_n(s.revision),s.baseline!==void 0&&gn(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}.`);gn(e.digest)}return s}async function Yn(e,t){try{return(await ke(e)).isFile()&&await zn(e)===t}catch{return!1}}async function Xn({cwd:e=process.cwd(),env:t=process.env}={}){if((await U({cwd:e})).i18n){if(t.COREFRAME_I18N_RELEASE_REVISION){await $n({cwd:e,env:t,revision:t.COREFRAME_I18N_RELEASE_REVISION});return}await Tn(e)}}async function Zn({cwd:e=process.cwd(),projectConfig:t}={}){let n=t??await U({cwd:e});if(!n.i18n)return;let r=er(n.i18n),i=Y(e,r.directory);try{if(!(await ke(i)).isDirectory())throw Error(`I18n catalog path is not a directory: ${i}.`)}catch(t){if(t.code!==`ENOENT`)throw t;await Tn(e);return}for(let t of r.locales)for(let n of r.catalogs)try{if(!(await ke(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 Tn(e);return}}async function Qn({cwd:e=process.cwd(),env:t=process.env,store:n,tag:r}){Cn(r);let i=await tr({cwd:e,env:t,store:n});await lr(e);let a=await cr(e);await ur(e,r,a);let o=await De(M(Me(),`coreframe-i18n-prepare-`));try{let n=await Gn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,revision:a,store:i.store,temporaryDirectory:o});if(n){let e=await Jn({bucket:i.assets.sourceBucket,cacheRoot:i.cacheRoot,digest:n.snapshot,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return sr(i,e,a),await rr(i,e),await Kn({bucket:i.assets.sourceBucket,projectId:i.assets.projectId,reference:n,store:i.store,tag:r,temporaryDirectory:o}),{reused:!0,snapshot:n.snapshot}}return await or(i,o,async()=>{let n=await nr(i,a,o);n||await ar(i),await Tn(e);let s=await Dn({config:i.config,cwd:e}),c=await On({config:i.config,cwd:e,env:t,messages:s});await kn({config:i.config,cwd:e,missing:s,response:c}),await An({config:i.config,cwd:e}),await En({config:i.config,cwd:e,strict:!0,temporaryDirectory:o});let l=await ir(i),u={...n?{baseline:n}:{},catalogs:i.config.catalogs,files:l,generator:s.length>0?i.config.generator?.id??`unconfigured`:`none`,linguiVersion:await dr(e),locales:i.config.locales,projectId:i.assets.projectId,revision:a,sourceLocale:i.config.sourceLocale,version:1},d=await Un({bucket:i.assets.sourceBucket,manifest:u,projectId:i.assets.projectId,store:i.store,temporaryDirectory:o});return await Kn({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 $n({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 tr({cwd:e,env:t,store:r,projectConfig:i}),o=_n(n??await cr(e)),s=await De(M(Me(),`coreframe-i18n-materialize-`));try{let e=await Gn({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 Jn({bucket:a.assets.sourceBucket,cacheRoot:a.cacheRoot,digest:e.snapshot,projectId:a.assets.projectId,store:a.store,temporaryDirectory:s});return sr(a,t,o),await rr(a,t),{revision:o,snapshot:e.snapshot}}finally{await V(s,{force:!0,recursive:!0})}}function er(e){let t=vn(e.sourceLocale,`Source locale`),n=[...new Set(e.locales.map(e=>vn(e,`Locale`)))],r=[...new Set(e.catalogs.map(e=>vn(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 tr({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:P(e,`.coreframe`,`i18n`,`cache`),config:er(i.i18n),cwd:P(e),env:t,store:r??Se({config:a,env:t})}}async function nr(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 Gn({bucket:e.assets.sourceBucket,projectId:e.assets.projectId,revision:_n(t),store:e.store,temporaryDirectory:n});if(!r)continue;let i=await Jn({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:r.snapshot,projectId:e.assets.projectId,store:e.store,temporaryDirectory:n});return sr(e,i,t),await rr(e,i),r.snapshot}}async function rr(e,t){for(let n of t.files)if(await qn({bucket:e.assets.sourceBucket,cacheRoot:e.cacheRoot,digest:n.digest,projectId:e.assets.projectId,store:e.store,target:Y(e.cwd,n.path)}),(await ke(Y(e.cwd,n.path))).size!==n.size)throw Error(`Materialized i18n artifact size does not match manifest: ${n.path}.`)}async function ir(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 zn(a);await Vn({bucket:e.assets.sourceBucket,digest:o,projectId:e.assets.projectId,source:a,store:e.store}),t.push({digest:o,path:i,size:(await ke(a)).size})}return t.sort((e,t)=>e.path.localeCompare(t.path))}async function ar(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 Ne(`@lingui/format-po`,e.cwd)).formatter({lineNumbers:!1}),o=!1;for(let t of e.config.locales)for(let r of e.config.catalogs){let s=`${n}${`${e.config.directory}/${t}/${r}.po`}`;try{let{stdout:n}=await I(`git`,[`show`,`${i}:${s}`],{cwd:e.cwd,stdin:`ignore`});await Mn(Y(e.cwd,X(e.config,t,r)),a.parse(n)),o=!0}catch{}}return o}async function or(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 Ce(o)}catch{continue}let s=M(t,`previous-catalogs`,a);await R(A(s),{recursive:!0}),await B(o,s),r.push({backup:s,path:o})}try{let e=await n();return await V(M(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 R(A(t),{recursive:!0}),await B(e,t);throw t}}function sr(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 cr(e){let{stdout:t}=await I(`git`,[`rev-parse`,`HEAD`],{cwd:e,stdin:`ignore`});return _n(t.trim())}async function lr(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 ur(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 dr(e){let{stdout:t}=await I(`pnpm`,[`exec`,`lingui`,`--version`],{cwd:e,stdin:`ignore`});return t.trim()}const fr=[`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(` `),pr=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}}),mr=r(p,{displayName:`profile`,async from(e){return be(e)}}),hr=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}}),gr=r(p,{displayName:`origin`,description:`Exact production HTTPS API origin embedded in the packaged Flutter client.`,async from(e){return O(e)}}),_r=m({name:`assets`,cmds:{configure:n({name:`configure`,description:`Store a Backblaze B2 private build-object key in the operating system credential store. ${fr}`,args:{profile:u({type:mr,displayName:`profile`,description:`Credential profile named by coreframe.config.ts.`})},handler:async({profile:e})=>{L.note(fr,`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 xe({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(hr),description:`Place the asset in a named, lazily loaded pack.`}),variantWidths:c({long:`widths`,type:l(pr),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})=>ve(await me({alt:e,file:t,id:n,pack:i,variantWidths:a}),r,{kind:`add`,assetId:n})}),backup:n({name:`backup`,description:`Back up every object in both configured asset buckets to a new Git branch.`,args:{branch:c({long:`branch`,type:p,description:`Name of the new local Git branch that will contain the backup.`})},handler:async({branch:e})=>{let t=await he({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(hr),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})=>ve(await ge({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(hr),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 _e({fix:e,pack:n});ve(r,t,{kind:`check`}),r.ok||(process.exitCode=1)}}),publish:n({name:`publish`,args:{pack:c({long:`pack`,type:l(hr),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 ye({pack:t});ve(n,e,{kind:`publish`}),n.ok||(process.exitCode=1)}}),status:n({name:`status`,args:{pack:c({long:`pack`,type:l(hr),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 _e({pack:t});ve(n,e,{kind:`status`}),n.ok||(process.exitCode=1)}})}}),vr=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:gr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e})=>pe({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})=>E({check:e})}),prepare:n({name:`prepare`,description:`Build and package the React client for one Flutter platform.`,args:{platform:u({type:s(de),displayName:`platform`,description:`Flutter platform whose packaged client should be prepared.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:gr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>D({apiOrigin:e,platform:t})}),check:n({name:`check`,description:`Reject missing, stale, modified, or incorrectly targeted Flutter assets.`,args:{platform:u({type:s(de),displayName:`platform`,description:`Flutter platform whose packaged client should be checked.`}),apiOrigin:c({long:`api-origin`,env:`COREFRAME_API_ORIGIN`,type:gr,description:`Defaults to COREFRAME_API_ORIGIN.`})},handler:({apiOrigin:e,platform:t})=>ce({apiOrigin:e,platform:t})})}}),yr=m({name:`i18n`,cmds:{build:n({name:`build`,description:`Extract source messages or materialize an exact release catalog snapshot.`,args:{},handler:async()=>{await Xn()}}),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 $n({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 Qn({tag:e});console.log(`${t.reused?`Reused`:`Published`} i18n snapshot ${t.snapshot}.`)}})}}),br=G.platform===`win32`?`react-router.cmd`:`react-router`,xr=G.platform===`win32`?`panda.cmd`:`panda`;async function Sr(e=G.cwd()){await Tr(e),await wr(e,[`typegen`])}async function Cr(e=G.cwd(),t=G.env,n){if((t.COREFRAME_PLATFORM??`web`)!==`web`)return;let r=k.resolve(e,`.coreframe/dashboard-build`),i=k.join(r,`client`),a=k.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 Er(e,xr,[`build`],t),await wr(e,[`build`,...n?[`--mode`,n]:[]],t),await V(a,{force:!0,recursive:!0}),await R(k.dirname(a),{recursive:!0}),await Ee(i,a,{recursive:!0})}async function wr(e,t,n=G.env){await Er(e,br,t,n)}async function Tr(e){await V(k.resolve(e,`dashboard/.react-router`),{force:!0,recursive:!0})}async function Er(e,t,n,r=G.env){await I(t,n,{cwd:k.resolve(e,`dashboard`),env:{...r,PATH:k.resolve(e,`node_modules/.bin`)+k.delimiter+(r.PATH??r.Path??``)},stdio:`inherit`})}const Z={access:Ce,chmod:we,mkdir:R,mkdtemp:De,readFile:z,readFileSync:q,rm:V,writeFile:H},Dr={getAvailablePort:kr},Or={homedir:Ae,kill:G.kill,networkInterfaces:je,tmpdir:Me};async function kr(){let e=Qe();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 Ar({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 jr(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=Qe(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 jr(e,t){let n=Date.now()+1e4,r;for(;!t();)try{return await Mr(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 Mr({host:e=`127.0.0.1`,port:t}){return new Promise((n,r)=>{let i=Ze({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 Nr=G.platform===`win32`?`react-router.cmd`:`react-router`;function Pr(e){return K(k.resolve(e,`dashboard/dashboard.config.ts`))}function Fr({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([Je(t.stdout),Je(t.stderr)]),i===e&&(i=void 0)}};a=Ar({port:n,start:async()=>{if(o)throw Error(`The dashboard development server was stopped before it started.`);let n=await Dr.getAvailablePort();if(o)throw Error(`The dashboard development server was stopped before it started.`);let a=Ye({label:`dashboard`}),s=Ye({color:`red`,label:`dashboard`});a.pipe(G.stdout,{end:!1}),s.pipe(G.stderr,{end:!1});let l=I(Nr,[`dev`,`--host`,`127.0.0.1`,`--port`,String(n)],{cwd:k.resolve(e,`dashboard`),env:{...t,PATH:k.resolve(e,`node_modules/.bin`)+k.delimiter+r},stdin:`inherit`});i=l;let d=Promise.allSettled([Lr(l.stdout,a),Lr(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 Ir({cwd:e=G.cwd(),env:t=G.env,port:n}){let r=Fr({cwd:e,env:t,port:n});try{await r.listen(),await r.wait()}finally{await r.close()}}async function Lr(e,t){for await(let n of e)t.write(`${n}\n`)||await new Promise(e=>t.once(`drain`,e))}const Rr=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})=>Ir({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})=>Cr(void 0,void 0,e)}),typegen:n({name:`typegen`,args:{},handler:()=>Sr()})}}),zr=`.coreframe/releases/extensions`,Br=`.coreframe/releases/production`;async function Vr({cwd:e=process.cwd()}={}){if(!(await U({cwd:e})).extension)return[];let t=await qr(e),n=await ni(e);await Yr(e,t,[`prepare`]),(t.stores.chrome||t.stores.edge)&&await Yr(e,t,[`zip`,`--browser`,`chrome`]),t.stores.firefox&&await Yr(e,t,[`zip`,`--browser`,`firefox`]);let r=Jr(e,t.wxt.outputDirectory??`.output`,`outputDirectory`),i=await Oe(r),a=[];return(t.stores.chrome||t.stores.edge)&&a.push({label:t.stores.chrome&&t.stores.edge?`Chrome/Edge extension`:t.stores.chrome?`Chrome extension`:`Edge extension`,path:k.relative(e,k.join(r,ui(i,`-${n}-chrome.zip`)))}),t.stores.firefox&&a.push({label:`Firefox extension`,path:k.relative(e,k.join(r,ui(i,`-${n}-firefox.zip`)))},{label:`Firefox extension sources`,path:k.relative(e,k.join(r,ui(i,`-${n}-sources.zip`)))}),a}async function Hr({cwd:e=process.cwd()}={}){let t=await qr(e),n=await ti(e),r=await mi(e,n.version);if(r){if(r.revision!==n.revision)throw Error(`Extension version ${n.version} is already packaged from a different Git revision.`);return await ci(e,r),r}await Yr(e,t,[`prepare`]),(t.stores.chrome||t.stores.edge)&&await Yr(e,t,[`zip`,`--browser`,`chrome`]),t.stores.firefox&&await Yr(e,t,[`zip`,`--browser`,`firefox`]);let i=Jr(e,t.wxt.outputDirectory??`.output`,`outputDirectory`),a=await Oe(i),o=t.stores.chrome||t.stores.edge?ui(a,`-${n.version}-chrome.zip`):void 0,s=t.stores.firefox?ui(a,`-${n.version}-firefox.zip`):void 0,c=t.stores.firefox?ui(a,`-${n.version}-sources.zip`):void 0,l=fi(e,n.version);await R(l,{recursive:!0});let u={};if(o){let e=await si(i,l,o);t.stores.chrome&&(u.chrome=e),t.stores.edge&&(u.edge=e)}s&&(u.firefox=await si(i,l,s)),c&&(u.firefoxSources=await si(i,l,c));let d={...n,artifacts:u,stores:Object.fromEntries(di(t).map(e=>[e,`packaged`]))};return await hi(e,d),d}async function Ur({cwd:e=process.cwd(),dryRun:t=!1}={}){let n=await qr(e);if(!n.stores.chrome)throw Error(`extension submit requires the Chrome store to be enabled.`);let r=await ri(e);if(await ci(e,r),r.stores.chrome===`released`)throw Error(`This extension release is already published.`);if(!t&&r.stores.chrome===`submitted`)return r;let i=li(r,`chrome`);return await Xr(e,[...t?[`--dry-run`]:[],`--chrome-zip`,i.path,`--chrome-api-version`,`v2`,`--chrome-publish-type`,`STAGED_PUBLISH`,...Zr(n)]),t||(r.stores.chrome=`submitted`,await hi(e,r)),r}async function Wr({cwd:e=process.cwd()}={}){let t=await qr(e),n=await ri(e);return await ci(e,n),await Xr(e,[`status`,...Qr(t)]),n}async function Gr({cwd:e=process.cwd()}={}){let t=await qr(e),n=await ri(e);if(await ci(e,n),t.stores.chrome&&n.stores.chrome!==`submitted`)throw Error(`Chrome must be submitted and approved before post-deploy release.`);await ai(e,n),t.stores.chrome&&n.stores.chrome!==`released`&&(await Xr(e,[`set-deploy-percentage`,`--chrome-deploy-percentage`,`100`,...Zr(t)]),n.stores.chrome=`released`,await hi(e,n));for(let r of[`edge`,`firefox`])!t.stores[r]||n.stores[r]!==`packaged`||(await Xr(e,r===`edge`?$r(t,n):ei(t,n)),n.stores[r]=`submitted`,await hi(e,n));return n}async function Kr(e,{cwd:t=process.cwd()}={}){let n=k.resolve(t,Br);await R(n,{recursive:!0}),await gi(k.join(n,`${oi(e.revision)}.json`),e)}async function qr(e){let t=(await U({cwd:e})).extension;if(!t)throw Error(`Configure extension in coreframe.config.ts before using this command.`);if(Jr(e,t.wxt.config,`config`),!di(t).length)throw Error(`extension.stores must enable at least one store.`);return t}function Jr(e,t,n){let r=k.resolve(e),i=k.resolve(r,t);if(!t||k.isAbsolute(t)||i!==r&&!i.startsWith(`${r}${k.sep}`))throw Error(`extension.wxt.${n} must be a project-relative path inside the project.`);return i}async function Yr(e,t,n){await I(`pnpm`,[`exec`,`wxt`,...n,`--config`,t.wxt.config],{cwd:e,stdio:`inherit`})}async function Xr(e,t){await I(`pnpm`,[`exec`,`wxt`,`submit`,...t],{cwd:e,stdio:`inherit`})}function Zr(e){let t=e.stores.chrome;return t?[...t.extensionId?[`--chrome-extension-id`,t.extensionId]:[],...t.publisherId?[`--chrome-publisher-id`,t.publisherId]:[]]:[]}function Qr(e){return[...Zr(e),...e.stores.edge?.productId?[`--edge-product-id`,e.stores.edge.productId]:[],...e.stores.firefox?.extensionId?[`--firefox-extension-id`,e.stores.firefox.extensionId]:[]]}function $r(e,t){return[`--edge-zip`,li(t,`edge`).path,...e.stores.edge?.productId?[`--edge-product-id`,e.stores.edge.productId]:[]]}function ei(e,t){return[`--firefox-zip`,li(t,`firefox`).path,`--firefox-sources-zip`,li(t,`firefoxSources`).path,...e.stores.firefox?.extensionId?[`--firefox-extension-id`,e.stores.firefox.extensionId]:[],`--firefox-channel`,e.stores.firefox?.channel??`listed`]}async function ti(e){return{version:await ni(e),revision:(await I(`git`,[`rev-parse`,`HEAD`],{cwd:e})).stdout.trim()}}async function ni(e){let t=JSON.parse(await z(k.resolve(e,`package.json`),`utf8`));if(typeof t.version!=`string`||!t.version)throw Error(`package.json must contain an extension release version.`);return t.version}async function ri(e){let t=await ti(e),n=await mi(e,t.version)??await ii(e,t.revision);if(!n)throw Error(`Package extension version ${t.version} before continuing.`);if(n.revision!==t.revision)throw Error(`The packaged extension was built from a different Git revision.`);return n}async function ii(e,t){let n;try{n=await Oe(k.resolve(e,zr))}catch(e){if(e.code===`ENOENT`)return;throw e}let r=(await Promise.all(n.map(t=>mi(e,t)))).filter(e=>e?.revision===t);if(r.length>1)throw Error(`Multiple extension releases are recorded for the current Git revision.`);return r[0]}async function ai(e,t){let n;try{n=JSON.parse(await z(k.resolve(e,Br,`${oi(t.revision)}.json`),`utf8`))}catch{throw Error(`No successful production deployment is recorded for ${t.version}.`)}if(n.revision!==t.revision)throw Error(`The successful production deployment does not match the packaged extension.`)}function oi(e){if(!/^[a-f0-9]{40}$/i.test(e))throw Error(`Unsafe Git revision: ${e}`);return e}async function si(e,t,n){let r=k.join(e,n),i=k.join(t,n),a=await z(r);try{if(!(await z(i)).equals(a))throw Error(`Immutable extension artifact already exists: ${i}`)}catch(e){if(e.code===`ENOENT`)await H(i,a,{flag:`wx`});else throw e}return{path:i,sha256:_i(a),size:a.byteLength}}async function ci(e,t){for(let n of new Set(Object.values(t.artifacts))){if(!n)continue;let t=await z(k.resolve(e,n.path));if(t.byteLength!==n.size||_i(t)!==n.sha256)throw Error(`Extension artifact integrity check failed: ${n.path}`)}}function li(e,t){let n=e.artifacts[t];if(!n)throw Error(`Missing required ${t} extension artifact.`);return n}function ui(e,t){let n=e.filter(e=>e.endsWith(t));if(n.length!==1)throw Error(`Expected exactly one WXT *${t} artifact.`);return n[0]}function di(e){return[`chrome`,`edge`,`firefox`].filter(t=>!!e.stores[t])}function fi(e,t){return k.resolve(e,zr,pi(t))}function pi(e){if(!/^[A-Za-z0-9._+-]+$/.test(e))throw Error(`Unsafe extension version: ${e}`);return e}async function mi(e,t){try{return JSON.parse(await z(k.join(fi(e,t),`release.json`),`utf8`))}catch(e){if(e.code===`ENOENT`)return;throw e}}async function hi(e,t){let n=k.join(fi(e,t.version),`release.json`);await R(k.dirname(n),{recursive:!0}),await gi(n,t)}async function gi(e,t){let n=`${e}.${process.pid}.tmp`;await H(n,`${JSON.stringify(t,null,2)}\n`,{mode:384}),await import(`node:fs/promises`).then(({rename:t})=>t(n,e))}function _i(e){return Re(`sha256`).update(e).digest(`hex`)}const vi=m({name:`extension`,cmds:{package:n({name:`package`,args:{},handler:()=>Hr()}),submit:n({name:`submit`,args:{dryRun:i({long:`dry-run`,description:`Validate store authentication without uploading or submitting.`,defaultValue:()=>!1})},handler:({dryRun:e})=>Ur({dryRun:e})}),status:n({name:`status`,args:{},handler:()=>Wr()}),release:n({name:`release`,args:{},handler:()=>Gr()})}});function yi(){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 bi({all:e,cwd:t=process.cwd(),ids:n=[],matches:r=[],now:i=new Date}={}){let a=await Ei(t),o=await Di(a.config,t,async e=>a.module.developmentJobs.createStateAdmin(e).list()),s=$e({jobs:a.module.developmentJobs.jobs,now:i,records:o??[]}),c=wi(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 xi({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 bi({all:!0,cwd:n,now:s}),u=wi(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 ${ji(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 Ei(n),m=await Di(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 ${ji(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 Si(e){let t=Ai(e.database);return e.jobs.length===0?`${t}No local development jobs are configured.`:`${t}${Mi([`Job`,`Status`,`Last success`,`Next eligible`,`Lease`],e.jobs.map(e=>[e.id,e.lease===`active`?`running`:e.registration===`orphaned`?`orphaned`:e.eligibility,ki(e.lastSucceededAt),ki(e.nextEligibleAt),e.lease===`none`?`-`:`${e.lease} until ${ki(e.leaseUntil)}`]))}`}function Ci(e){let t=Ai(e.database);return e.jobs.length===0?`${t}No local development job state matched.`:`${t}${Mi([`Job`,`Result`],e.jobs.map(e=>[e.id,e.status.replaceAll(`-`,` `)]))}`}function wi(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 ${ji(o)}.`);let s=new Set(t?a:n);for(let t of r){let n=Ti(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 Ti(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 Ei(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 Pe(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 Di(e,t,n){try{var r=yi();let a=e.database?.dialect??`postgres`,o=a===`sqlite`?k.resolve(t,`.coreframe/turso.db`):k.resolve(t,`.coreframe/postgres/PG_VERSION`);try{await ke(o)}catch(e){if(Ni(e)&&e.code===`ENOENT`)return;throw e}if(a===`sqlite`)try{var i=yi();let r=await y({cwd:t,env:i.a(await oe({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Oi(n,r)}finally{r.$client.close()}}catch(e){i.e=e}finally{await i.d()}let s=await v({cwd:t,env:r.a(await ae({config:e,cwd:t,useSupervisorLease:!0})).env});try{return await Oi(n,s)}finally{await s.$client.end()}}catch(e){r.e=e}finally{await r.d()}}async function Oi(e,t){try{return await e(t)}catch(e){throw Pi(e)?Error(`The local development job state table is missing. Run coreframe db migrate-local, then retry.`,{cause:e}):e}}function ki(e){return e?.toISOString()??`-`}function Ai(e){return e.state===`missing`?`Local ${e.dialect} database is missing; no database was created.\n\n`:``}function ji(e){return e.map(e=>JSON.stringify(e)).join(`, `)}function Mi(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 Ni(e){return e instanceof Error&&`code`in e}function Pi(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 Fi={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:()=>[]})},Ii=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}),...Fi},handler:async({ids:e,json:t,matches:n})=>{let r=await bi({ids:e,matches:n});console.log(t?JSON.stringify(r):Si(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}),...Fi},handler:async({all:e,breakLeases:t,dryRun:n,ids:r,json:i,matches:a,yes:o})=>{let s=await xi({all:e,breakLeases:t,dryRun:n,ids:r,json:i,matches:a,yes:o});console.log(i?JSON.stringify(s):Ci(s))}})}});async function Li({dryRun:e=!1,environment:t,yes:n=!1,cwd:r=process.cwd(),env:i=process.env,interactive:a=!!process.stdout.isTTY}){let o=await te({config:await U({cwd:r}),environment:t,cwd:r,env:i});try{let i;try{i=await C(o,r)}catch(e){throw o.redact(e)}if(L.note([`Environment: ${o.environment}`,`Dialect: ${o.dialect}`,`Target: ${o.identifier}`].join(`
9
+ `),`Deployment database`),L.note(S(i),`Pending deploy migrations`),e||i.length===0)return{applied:!1,dialect:o.dialect,environment:t,identifier:o.identifier,pending:i};if(!n){if(!a)throw Error(`Noninteractive deployment migrations require --yes.`);let e=await L.confirm({initialValue:!1,message:`Apply ${i.length} migration${i.length===1?``:`s`} to ${t}?`});if(L.isCancel(e)||!e)throw Error(`Deployment migration cancelled.`)}try{await o.apply()}catch(e){throw o.redact(e)}return L.log.success(`Applied ${i.length} deployment migration${i.length===1?``:`s`}.`),{applied:!0,dialect:o.dialect,environment:t,identifier:o.identifier,pending:i}}finally{await o.close()}}const Ri=/^[a-z0-9]+(?:-[a-z0-9]+)*$/u;function zi(e,t){let n=Vi(e,t);if(!Hi(n)||!Ui(n,[`description`,`requires`,`routes`,`verifier`])||!Gi(n.description)||n.requires!==void 0&&(!Array.isArray(n.requires)||!n.requires.every(Gi))||n.verifier!==void 0&&!Gi(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=>Bi(e));if(new Set(r).size!==r.length)throw Error(`${t} contains duplicate recipe requirements.`);let i=n.routes.map((e,n)=>{if(!Hi(e)||!Wi(e,[`path`,`router`,`when`])||!Gi(e.path)||!Gi(e.router)||!Gi(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 Bi(e){if(!Ri.test(e))throw Error(`Recipe names use lowercase letters, numbers, and single hyphens.`);return e}function Vi(e,t){try{return et(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function Hi(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ui(e,t){return Object.keys(e).every(e=>t.includes(e))}function Wi(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function Gi(e){return typeof e==`string`&&e.length>0}const Ki=`https://github.com/coreframe-js/coreframe.git`;function qi(e,t){return J(`git`,e,{cwd:t,encoding:`utf8`})}function Ji(e,t){let n=qi(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 Yi(e,t){let n=qi([`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 Xi({cwd:e=process.cwd(),fetch:t=!0,remote:n=`template`}={}){if(n.length===0)throw Error(`Remote name must not be empty.`);Ji([`rev-parse`,`--show-toplevel`],e);let r=Yi(n,e);if(r===null)Ji([`remote`,`add`,n,Ki],e),console.log(`Added ${n} remote: ${Ki}`);else if(r===Ki)console.log(`${n} remote already points at ${Ki}`);else throw Error(`${n} remote points at ${r}, not ${Ki}.\nChoose the intended template source before continuing, then update or rename the remote manually.`);t&&(Ji([`fetch`,n,`--tags`,`--prune`],e),console.log(`Fetched ${n}.`))}const Zi=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u;function Q(e){return Zi.test(e)?`v${e}`:e}function Qi(e){return`${Q(e)}:template`}function $i(e,t){return`${Qi(e)}/${t}`}function ea({cwd:e=process.cwd(),fetch:t=!0,remote:n=`template`,target:r}={}){let i=ia(e),a=ca(i,[`rev-parse`,`--show-toplevel`]),o=Q(r??aa(i));return Xi({cwd:a,fetch:t,remote:n}),{projectRoot:i,ref:o,repositoryRoot:a}}function ta(e,t,n){return na(e,t,n).toString(`utf8`)}function na(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}. ${la([`show`,r],i)}`);return i.stdout}function ra(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(la([`ls-tree`,t,n],r));return r.stdout.toString(`utf8`).split(`\0`).filter(Boolean)}function ia(e){let t=P(e);for(;;){let e=M(t,`package.json`),n=sa(e);if(n!==void 0&&oa(n,e).engines?.coreframe)return t;let r=A(t);if(r===t)throw Error(`Could not find a package.json with engines.coreframe.`);t=r}}function aa(e){let t=M(e,`package.json`),n=sa(t);if(n===void 0)throw Error(`Required file package.json does not exist.`);let r=oa(n,t).engines?.coreframe;if(!r)throw Error(`package.json must declare an exact engines.coreframe recipe baseline.`);return r}function oa(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function sa(e){try{return q(e,`utf8`)}catch(e){if(ua(e)&&e.code===`ENOENT`)return;throw e}}function ca(e,t){let n=J(`git`,t,{cwd:e,encoding:`utf8`});if(n.status!==0)throw Error(la(t,n));return n.stdout.trim()}function la(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 ua(e){return e instanceof Error&&`code`in e}const da=[{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:ba},{path:`src-flutter/pubspec.yaml`,requirement:`declare flutter_driver as a Flutter SDK dependency`,test:xa},{path:`src-flutter/lib/main.dart`,requirement:`gate Flutter Driver behind kDebugMode and ENABLE_FLUTTER_DRIVER before starting Coreframe`,test:Sa},{path:`src/web/app/flutter-shell/application.ts`,requirement:`configure the Flutter shell's app-owned query and session hooks`,test:e=>ya(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=>ya(e,[`@coreframe/vite/flutter-devtools`,`import.meta.env.PLATFORM !== "web"`])}],fa=`src-flutter/lib/application.dart`,pa=`src/api/worker/auth-origin.ts`;function ma(e){let t=[];for(let n of da){let r=M(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=ha(e,t),r=ga(e,t);return n!==void 0&&r!==void 0&&n!==r&&t.push(`${fa} loopbackPort (${n}) must match ${pa} FLUTTER_LOOPBACK_ORIGIN (${r}).`),t}function ha(e,t){let n=_a(e,fa,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=va(r??a);return o===void 0&&t.push(`${fa} must configure loopbackPort as a fixed integer port.`),o}function ga(e,t){let n=_a(e,pa,t);if(n===void 0)return;let r=va(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(`${pa} must define FLUTTER_LOOPBACK_ORIGIN as an exact localhost origin with a fixed integer port.`),r}function _a(e,t,n){let r=M(e,t);if(!K(r)){n.push(`${t} is missing; it must define the Flutter loopback origin contract.`);return}return q(r,`utf8`)}function va(e){if(!e)return;let t=Number(e);return Number.isInteger(t)&&t>=1&&t<=65535?t:void 0}function ya(e,t){return t.every(t=>e.includes(t))}function ba(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 xa(e){try{let t=et(e);if(!Ca(t)||!Ca(t.dependencies))return!1;let n=t.dependencies.flutter_driver;return Ca(n)&&n.sdk===`flutter`}catch{return!1}}function Sa(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 Ca(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function wa({name:e,...t}){let n=ea(t),r=`recipes/${e}/recipe.yaml`,i=Da(zi(ta(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(`
10
10
  `)}`);return{name:e,ref:n.ref}}function Ta(e){console.log(`Verified Coreframe recipe ${e.name} from ${e.ref}.`)}function Ea(e,t){for(let n of e){let e=`recipes/${n}/recipe.yaml`,r=Da(zi(ta(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(`
11
- `)}\nApply and verify ${n} before continuing.`)}}function Da(e,t){if(!e)throw Error(`Required recipe does not declare a verifier.`);if(e===`flutter`)return ma(t);throw Error(`Unknown recipe verifier ${JSON.stringify(e)}.`)}function Oa({cwd:e=process.cwd(),fetch:t=!0,name:n,remote:r=`template`,target:i}){Bi(n);let a=ea({cwd:e,fetch:t,remote:r,target:i}),{projectRoot:o,ref:s,repositoryRoot:c}=a,l=`recipes/${n}`,u=`${l}/recipe.yaml`,d=zi(ta(c,s,u),u);Ea(d.requires,a);let f=ta(c,s,`${l}/RECIPE.md`),p=ra(c,s,`${l}/files`),m=ra(c,s,`${l}/patches`),h=ra(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(Fa(t,`Recipe file ${e}`),t.startsWith(`.agents/`))throw Error(`Recipe file ${e} must be stored in the recipe's .agents directory.`);g.set(t,na(c,s,e)),_.set(t,e)}for(let e of h){let t=e.slice(`${l}/`.length);if(Ma(t,`Recipe asset ${e}`),g.has(t))throw Error(`Recipe declares ${t} as both a file and an agent asset.`);g.set(t,na(c,s,e)),_.set(t,e)}for(let e of m){let t=Ia(e,l);if(g.has(t))throw Error(`Recipe declares ${t} as both a file and a patch.`);let n=na(c,s,e);La(n.toString(`utf8`),t,e),Pa(o,t),Ra(o,n,!1)?(v.push({contents:n,destinationPath:t}),b.push(t)):Ra(o,n,!0)?x.push(t):y.push({destination:t,source:e})}let C=new Map;for(let[e,t]of g){let r=Va(Pa(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(Ma(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)&&!G(Pa(o,e.path)))throw Error(`Recipe route target ${e.path} does not exist.`);let t=w.get(e.router)??Aa(Ha(Pa(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=Ha(Pa(o,e),e),r=tt(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=Pa(o,e);Ve(A(n),{recursive:!0}),qe(n,t)}return v.length>0&&za(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 ka(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 Aa(e,t){let n=ja(e,t);if(!Ua(n)||!Wa(n,[`routes`,`rules`])||!Array.isArray(n.rules)||!n.rules.every(Ga)||!Array.isArray(n.routes))throw Error(`${t} must contain only string rules and a routes array.`);let r=n.routes.map((e,n)=>{if(!Ua(e)||!Wa(e,[`path`,`when`])||!Ga(e.path)||!Ga(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 ja(e,t){try{return et(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function Ma(e,t){if(!e.startsWith(`.agents/`))throw Error(`${t} must be a normalized project-relative path beneath .agents/.`);Fa(e,t)}function Na(e,t){if(Fa(e,t),!/(?:^|\/)\.agents\/rules\/.+\.md$/u.test(e))throw Error(`${t} must point to a Markdown rule beneath an .agents/rules directory.`)}function Pa(e,t){Fa(t,`Recipe destination`);let n=M(e,t),r=e;for(let e of t.split(`/`))if(r=M(r,e),G(r)&&Be(r).isSymbolicLink())throw Error(`Recipe destination ${t} crosses symbolic link ${r}.`);return n}function Fa(e,t){if(e.length===0||j(e)||e===`..`||e.startsWith(`../`)||e.includes(`\\`)||N.normalize(e)!==e)throw Error(`${t} must be a normalized project-relative path.`)}function Ia(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 Fa(r,`Recipe patch ${e}`),r}function La(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 Ra(e,t,n){let r=[`apply`,`--check`,`--whitespace=nowarn`];return n&&r.push(`--reverse`),r.push(`-`),q(`git`,r,{cwd:e,input:t}).status===0}function za(e,t){let n=q(`git`,[`apply`,`--whitespace=nowarn`,`-`],{cwd:e,input:Buffer.concat(t.flatMap(e=>[e,Buffer.from(e.at(-1)===10?``:`
12
- `)])),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 Ba(e){return Va(e)?.toString(`utf8`)}function Va(e){try{return K(e)}catch(e){if(Ka(e)&&e.code===`ENOENT`)return;throw e}}function Ha(e,t){let n=Ba(e);if(n===void 0)throw Error(`Required file ${t} does not exist.`);return n}function Ua(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Wa(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function Ga(e){return typeof e==`string`&&e.length>0}function Ka(e){return e instanceof Error&&`code`in e}function qa(e={}){let{ref:t,repositoryRoot:n}=ea(e),r=ra(n,t,`recipes`).filter(e=>/^recipes\/[^/]+\/recipe\.yaml$/u.test(e)).map(e=>{let r=e.split(`/`)[1];return Bi(r),{description:zi(ta(n,t,e),e).description,name:r}});return r.sort((e,t)=>e.name.localeCompare(t.name)),{recipes:r,ref:t}}function Ja(e){console.log(`Coreframe recipes at ${e.ref}:`);for(let t of e.recipes)console.log(`${t.name} — ${t.description}`)}const Q=`.agents/skills/coreframe-upgrade/SKILL.md`;function Ya(e,t={}){return q(`git`,e,t)}function Xa(e){return e.stderr.toString(`utf8`).trim()||e.stdout.toString(`utf8`).trim()}function Za(e,t){let n=$i(e,t),r=Ya([`show`,n],{encoding:`utf8`});if(r.status!==0){let e=Xa(r);throw Error(`Could not read ${n}.${e?` ${e}`:``}`)}return r.stdout.toString()}function Qa(){let e=Ya([`rev-parse`,`--show-toplevel`],{encoding:`utf8`});if(e.status!==0){let t=Xa(e);throw Error(`Could not find git repository root.${t?` ${t}`:``}`)}return e.stdout.toString().trim()}function $a(e,t){let n=He(M(Ne(),`coreframe-upgrade-skill-`)),r=M(n,`SKILL.md`);try{qe(r,t);let n=Xa(Ya([`--no-pager`,`diff`,`--no-index`,`--color=never`,`--`,e,r]));n&&console.log(n)}finally{We(n,{force:!0,recursive:!0})}}function eo({apply:e,target:t}){let n=M(Qa(),Q),r=Z(t);if(!G(n))throw Error(`Local ${Q} does not exist.`);let i=K(n,`utf8`),a=Za(t,Q);return i===a?(console.log(`Coreframe upgrade skill matches ${r}:template/${Q}.`),0):e?(qe(n,a),console.error(`Updated ${Q} from ${r}:template. Reread it before continuing the upgrade.`),20):(console.error(`Coreframe upgrade skill differs from ${r}:template/${Q}.`),console.error(`Run again with --apply to update it, then reread ${Q} before continuing.`),$a(n,a),20)}const to=[{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`}],no=[{matches:e=>e===`src-tauri`||e.startsWith(`src-tauri/`),reason:`legacy Tauri shell removed by breaking host migration`}],ro=new Set([`100644`,`100755`,`120000`]);function io(e,t={}){return q(`git`,e,t)}function ao(e){let t=io(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 oo(e){let t=io(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 so(){return ao([`rev-parse`,`--show-toplevel`]).trim()}function co(e){let t=M(e,`package.json`);if(!G(t))throw Error(`Missing --base <git-ref>, and package.json does not exist.`);let n=JSON.parse(K(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 lo(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 uo(e,t){let n=lo(oo([`diff`,`--name-status`,`-z`,`--no-renames`,Qi(e),Qi(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 fo(e,t){let n=oo([`ls-tree`,`-z`,`-r`,Qi(e),`--`,t]);if(n.length===0)return null;let r=lo(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 po(e){return oo([`cat-file`,`blob`,e.object])}function mo(e,t){let n=P(e,t),r=e.endsWith(F)?e:`${e}${F}`;if(n!==e&&!n.startsWith(r))throw Error(`Refusing to access path outside repository: ${t}`);return n}function ho(e){try{return Be(e),!0}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!1;throw e}}function go(e){return(e.mode&73)!=0}function _o(e){return e===null||e.type===`blob`&&ro.has(e.mode)}function vo(e){return to.find(t=>t.matches(e))?.reason}function yo(e){return no.find(t=>t.matches(e))?.reason}function bo(e,t,n){let r=mo(e,t);if(n===null)return{matches:!ho(r)};if(!_o(n))return{matches:!1,reason:`unsupported template entry mode ${n.mode} ${n.type}`};let i;try{i=Be(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=po(n);return n.mode===`120000`?i.isSymbolicLink()?{matches:Buffer.from(Ue(r),`utf8`).equals(a)}:{matches:!1,reason:`worktree path is not a symlink`}:i.isFile()?(n.mode===`100755`?go(i):!go(i))?{matches:K(r).equals(a)}:{matches:!1,reason:`worktree executable bit differs from template`}:{matches:!1,reason:`worktree path is not a regular file`}}function xo(e){ho(e)&&We(e,{force:!0,recursive:!1})}function So(e,t,n){let r=mo(e,t);if(n===null){xo(r);return}if(Ve(A(r),{recursive:!0}),n.mode===`120000`){xo(r),Ge(po(n).toString(`utf8`),r);return}let i=ho(r)?Be(r):null;i&&!i.isFile()&&xo(r),qe(r,po(n)),ze(r,n.mode===`100755`?493:420)}function Co(e,t){return e===null&&t!==null?`add`:e!==null&&t===null?`delete`:`update`}function wo(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 To(e){let t=so(),n=Z(e.base??co(t)),r=Z(e.target),i=uo(n,r),a=[],o=[],s=[],c=[];for(let e of i){let i=vo(e.path);if(i){o.push({action:`ignored`,path:e.path,reason:i});continue}let l=fo(n,e.path),u=fo(r,e.path),d=Co(l,u),f=u===null?yo(e.path):void 0;if(f){a.push({action:d,path:e.path,reason:f,targetEntry:u});continue}if(!_o(l)||!_o(u)){s.push({action:d,path:e.path,reason:`unsupported template entry type`});continue}if(bo(t,e.path,u).matches){c.push({action:`unchanged`,path:e.path});continue}let p=bo(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)So(t,e.path,e.targetEntry??null);console.log(`Coreframe template fast-forward: ${n} -> ${r}`),console.log(``),wo(e.apply?`Applied clean template updates`:`Would apply clean template updates`,a),wo(`Ignored downstream-owned paths`,o),wo(`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 Eo=[`dependencies`,`devDependencies`];function Do(e){let t=q(`git`,e,{encoding:`utf8`});if(t.status!==0){let n=t.stderr.trim()||t.stdout.trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout}function Oo(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}: ${e instanceof Error?e.message:e}`)}}function ko(e,t){let n=`${Z(e)}:${t}`;return Oo(Do([`show`,n]),n)}function Ao(e){return e.startsWith(`@coreframe/`)}function jo(e){return e.startsWith(`file:`)||e.startsWith(`link:`)||e.startsWith(`workspace:`)}function Mo(e){return e.startsWith(`file:`)||e.startsWith(`link:`)}function No(e,t){let n=e.indexOf(`:`),r=e.slice(n+1),i=N.normalize(N.join(`template`,r,`package.json`));if(r.length===0||N.isAbsolute(r)||i===`..`||i.startsWith(`../`))throw Error(`Invalid local template dependency for ${t}: ${e}`);return i}function Po(e){let t=ko(e,`template/package.json`),n=[],r=new Set;for(let i of Eo)for(let[a,o]of Object.entries(t[i]??{})){if(!Ao(a)||!Mo(o))continue;if(r.has(a))throw Error(`Target template declares ${a} more than once.`);let t=No(o,a),s=ko(e,t);if(s.name!==a||typeof s.version!=`string`)throw Error(`${Z(e)}:${t} must declare ${a} with a version.`);n.push({group:i,name:a,spec:`^${s.version}`}),r.add(a)}return n}function Fo(e,t){for(let n of Eo){let r=e[n]?.[t];if(r)return{group:n,spec:r}}}function Io(e,t,n){let r=t.match(/\n([\t ]+)"/u)?.[1]??` `,i=t.endsWith(`
11
+ `)}\nApply and verify ${n} before continuing.`)}}function Da(e,t){if(!e)throw Error(`Required recipe does not declare a verifier.`);if(e===`flutter`)return ma(t);throw Error(`Unknown recipe verifier ${JSON.stringify(e)}.`)}function Oa({cwd:e=process.cwd(),fetch:t=!0,name:n,remote:r=`template`,target:i}){Bi(n);let a=ea({cwd:e,fetch:t,remote:r,target:i}),{projectRoot:o,ref:s,repositoryRoot:c}=a,l=`recipes/${n}`,u=`${l}/recipe.yaml`,d=zi(ta(c,s,u),u);Ea(d.requires,a);let f=ta(c,s,`${l}/RECIPE.md`),p=ra(c,s,`${l}/files`),m=ra(c,s,`${l}/patches`),h=ra(c,s,`${l}/.agents`),g=new Map,_=new Map,v=[],y=[],b=[],x=[],S=[],C=[];for(let e of p){let t=e.slice(`${l}/files/`.length);if(Fa(t,`Recipe file ${e}`),t.startsWith(`.agents/`))throw Error(`Recipe file ${e} must be stored in the recipe's .agents directory.`);g.set(t,na(c,s,e)),_.set(t,e)}for(let e of h){let t=e.slice(`${l}/`.length);if(Ma(t,`Recipe asset ${e}`),g.has(t))throw Error(`Recipe declares ${t} as both a file and an agent asset.`);g.set(t,na(c,s,e)),_.set(t,e)}for(let e of m){let t=Ia(e,l);if(g.has(t))throw Error(`Recipe declares ${t} as both a file and a patch.`);let n=na(c,s,e);La(n.toString(`utf8`),t,e),Pa(o,t),Ra(o,n,!1)?(v.push({contents:n,destinationPath:t}),x.push(t)):Ra(o,n,!0)?S.push(t):b.push({destination:t,source:e})}let w=new Map;for(let[e,t]of g){let r=Va(Pa(o,e));if(r===void 0)w.set(e,t),y.push(e);else if(r.equals(t))S.push(e);else if(e.startsWith(`.agents/`))throw Error(`Recipe ${n} cannot replace modified ${e}. Reconcile that agent asset manually.`);else b.push({destination:e,source:_.get(e)})}let T=new Map;for(let e of d.routes){if(Ma(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(Pa(o,e.path)))throw Error(`Recipe route target ${e.path} does not exist.`);let t=T.get(e.router)??Aa(Ha(Pa(o,e.router),e.router),e.router);T.set(e.router,t);let r=t.routes.find(t=>t.path===e.path);if(r){if(r.when!==e.when)throw Error(`Recipe ${n} route ${e.path} conflicts with the existing trigger in ${e.router}.`);continue}t.routes.push({path:e.path,when:e.when})}for(let[e,t]of T){t.routes.sort((e,t)=>e.path<t.path?-1:+(e.path>t.path));let n=Ha(Pa(o,e),e),r=tt(t,{lineWidth:0});r===n?S.push(e):(w.set(e,r),C.push(e))}for(let{destinationPath:e}of v)if(w.has(e))throw Error(`Recipe cannot both write and patch ${e}.`);for(let[e,t]of w){let n=Pa(o,e);Ve(A(n),{recursive:!0}),qe(n,t)}return v.length>0&&za(o,v.map(({contents:e})=>e)),{created:y.sort(),instructions:f,mergeRequired:b.sort((e,t)=>e.destination.localeCompare(t.destination)),name:n,patched:x.sort(),ref:s,unchanged:[...new Set(S)].sort(),updated:C.sort()}}function ka(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 Aa(e,t){let n=ja(e,t);if(!Ua(n)||!Wa(n,[`routes`,`rules`])||!Array.isArray(n.rules)||!n.rules.every(Ga)||!Array.isArray(n.routes))throw Error(`${t} must contain only string rules and a routes array.`);let r=n.routes.map((e,n)=>{if(!Ua(e)||!Wa(e,[`path`,`when`])||!Ga(e.path)||!Ga(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 ja(e,t){try{return et(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function Ma(e,t){if(!e.startsWith(`.agents/`))throw Error(`${t} must be a normalized project-relative path beneath .agents/.`);Fa(e,t)}function Na(e,t){if(Fa(e,t),!/(?:^|\/)\.agents\/rules\/.+\.md$/u.test(e))throw Error(`${t} must point to a Markdown rule beneath an .agents/rules directory.`)}function Pa(e,t){Fa(t,`Recipe destination`);let n=M(e,t),r=e;for(let e of t.split(`/`))if(r=M(r,e),K(r)&&Be(r).isSymbolicLink())throw Error(`Recipe destination ${t} crosses symbolic link ${r}.`);return n}function Fa(e,t){if(e.length===0||j(e)||e===`..`||e.startsWith(`../`)||e.includes(`\\`)||N.normalize(e)!==e)throw Error(`${t} must be a normalized project-relative path.`)}function Ia(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 Fa(r,`Recipe patch ${e}`),r}function La(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 Ra(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 za(e,t){let n=J(`git`,[`apply`,`--whitespace=nowarn`,`-`],{cwd:e,input:Buffer.concat(t.flatMap(e=>[e,Buffer.from(e.at(-1)===10?``:`
12
+ `)])),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 Ba(e){return Va(e)?.toString(`utf8`)}function Va(e){try{return q(e)}catch(e){if(Ka(e)&&e.code===`ENOENT`)return;throw e}}function Ha(e,t){let n=Ba(e);if(n===void 0)throw Error(`Required file ${t} does not exist.`);return n}function Ua(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Wa(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function Ga(e){return typeof e==`string`&&e.length>0}function Ka(e){return e instanceof Error&&`code`in e}function qa(e={}){let{ref:t,repositoryRoot:n}=ea(e),r=ra(n,t,`recipes`).filter(e=>/^recipes\/[^/]+\/recipe\.yaml$/u.test(e)).map(e=>{let r=e.split(`/`)[1];return Bi(r),{description:zi(ta(n,t,e),e).description,name:r}});return r.sort((e,t)=>e.name.localeCompare(t.name)),{recipes:r,ref:t}}function Ja(e){console.log(`Coreframe recipes at ${e.ref}:`);for(let t of e.recipes)console.log(`${t.name} — ${t.description}`)}const Ya=`.agents/skills/coreframe-upgrade/SKILL.md`;function Xa(e,t={}){return J(`git`,e,t)}function Za(e){return e.stderr.toString(`utf8`).trim()||e.stdout.toString(`utf8`).trim()}function Qa(e,t){let n=$i(e,t),r=Xa([`show`,n],{encoding:`utf8`});if(r.status!==0){let e=Za(r);throw Error(`Could not read ${n}.${e?` ${e}`:``}`)}return r.stdout.toString()}function $a(){let e=Xa([`rev-parse`,`--show-toplevel`],{encoding:`utf8`});if(e.status!==0){let t=Za(e);throw Error(`Could not find git repository root.${t?` ${t}`:``}`)}return e.stdout.toString().trim()}function eo(e,t){let n=He(M(Me(),`coreframe-upgrade-skill-`)),r=M(n,`SKILL.md`);try{qe(r,t);let n=Za(Xa([`--no-pager`,`diff`,`--no-index`,`--color=never`,`--`,e,r]));n&&console.log(n)}finally{We(n,{force:!0,recursive:!0})}}function to({apply:e,target:t}){let n=M($a(),Ya),r=Q(t);if(!K(n))throw Error(`Local ${Ya} does not exist.`);let i=q(n,`utf8`),a=Qa(t,Ya);return i===a?(console.log(`Coreframe upgrade skill matches ${r}:template/${Ya}.`),0):e?(qe(n,a),console.error(`Updated ${Ya} from ${r}:template. Reread it before continuing the upgrade.`),20):(console.error(`Coreframe upgrade skill differs from ${r}:template/${Ya}.`),console.error(`Run again with --apply to update it, then reread ${Ya} before continuing.`),eo(n,a),20)}const no=[{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`}],ro=[{matches:e=>e===`src-tauri`||e.startsWith(`src-tauri/`),reason:`legacy Tauri shell removed by breaking host migration`}],io=new Set([`100644`,`100755`,`120000`]);function ao(e,t={}){return J(`git`,e,t)}function oo(e){let t=ao(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 so(e){let t=ao(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 co(){return oo([`rev-parse`,`--show-toplevel`]).trim()}function lo(e){let t=M(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 uo(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 fo(e,t){let n=uo(so([`diff`,`--name-status`,`-z`,`--no-renames`,Qi(e),Qi(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 po(e,t){let n=so([`ls-tree`,`-z`,`-r`,Qi(e),`--`,t]);if(n.length===0)return null;let r=uo(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 mo(e){return so([`cat-file`,`blob`,e.object])}function ho(e,t){let n=P(e,t),r=e.endsWith(F)?e:`${e}${F}`;if(n!==e&&!n.startsWith(r))throw Error(`Refusing to access path outside repository: ${t}`);return n}function go(e){try{return Be(e),!0}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!1;throw e}}function _o(e){return(e.mode&73)!=0}function vo(e){return e===null||e.type===`blob`&&io.has(e.mode)}function yo(e){return no.find(t=>t.matches(e))?.reason}function bo(e){return ro.find(t=>t.matches(e))?.reason}function xo(e,t,n){let r=ho(e,t);if(n===null)return{matches:!go(r)};if(!vo(n))return{matches:!1,reason:`unsupported template entry mode ${n.mode} ${n.type}`};let i;try{i=Be(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=mo(n);return n.mode===`120000`?i.isSymbolicLink()?{matches:Buffer.from(Ue(r),`utf8`).equals(a)}:{matches:!1,reason:`worktree path is not a symlink`}:i.isFile()?(n.mode===`100755`?_o(i):!_o(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 So(e){go(e)&&We(e,{force:!0,recursive:!1})}function Co(e,t,n){let r=ho(e,t);if(n===null){So(r);return}if(Ve(A(r),{recursive:!0}),n.mode===`120000`){So(r),Ge(mo(n).toString(`utf8`),r);return}let i=go(r)?Be(r):null;i&&!i.isFile()&&So(r),qe(r,mo(n)),ze(r,n.mode===`100755`?493:420)}function wo(e,t){return e===null&&t!==null?`add`:e!==null&&t===null?`delete`:`update`}function To(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 Eo(e){let t=co(),n=Q(e.base??lo(t)),r=Q(e.target),i=fo(n,r),a=[],o=[],s=[],c=[];for(let e of i){let i=yo(e.path);if(i){o.push({action:`ignored`,path:e.path,reason:i});continue}let l=po(n,e.path),u=po(r,e.path),d=wo(l,u),f=u===null?bo(e.path):void 0;if(f){a.push({action:d,path:e.path,reason:f,targetEntry:u});continue}if(!vo(l)||!vo(u)){s.push({action:d,path:e.path,reason:`unsupported template entry type`});continue}if(xo(t,e.path,u).matches){c.push({action:`unchanged`,path:e.path});continue}let p=xo(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)Co(t,e.path,e.targetEntry??null);console.log(`Coreframe template fast-forward: ${n} -> ${r}`),console.log(``),To(e.apply?`Applied clean template updates`:`Would apply clean template updates`,a),To(`Ignored downstream-owned paths`,o),To(`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 Do=[`dependencies`,`devDependencies`];function Oo(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 ko(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}: ${e instanceof Error?e.message:e}`)}}function Ao(e,t){let n=`${Q(e)}:${t}`;return ko(Oo([`show`,n]),n)}function jo(e){return e.startsWith(`@coreframe/`)}function Mo(e){return e.startsWith(`file:`)||e.startsWith(`link:`)||e.startsWith(`workspace:`)}function No(e){return e.startsWith(`file:`)||e.startsWith(`link:`)}function Po(e,t){let n=e.indexOf(`:`),r=e.slice(n+1),i=N.normalize(N.join(`template`,r,`package.json`));if(r.length===0||N.isAbsolute(r)||i===`..`||i.startsWith(`../`))throw Error(`Invalid local template dependency for ${t}: ${e}`);return i}function Fo(e){let t=Ao(e,`template/package.json`),n=[],r=new Set;for(let i of Do)for(let[a,o]of Object.entries(t[i]??{})){if(!jo(a)||!No(o))continue;if(r.has(a))throw Error(`Target template declares ${a} more than once.`);let t=Po(o,a),s=Ao(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 Do){let r=e[n]?.[t];if(r)return{group:n,spec:r}}}function Lo(e,t,n){let r=t.match(/\n([\t ]+)"/u)?.[1]??` `,i=t.endsWith(`
13
13
  `)?`
14
- `:``;qe(e,`${JSON.stringify(n,null,r)}${i}`)}function Lo(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t)console.log(` ${e}`);console.log(``)}}function Ro(e){let t=P(Do([`rev-parse`,`--show-toplevel`]).trim(),`package.json`),n=K(t,`utf8`),r=Oo(n,t),i=Z(e.target),a=Po(i),o=new Set(a.map(({name:e})=>e)),s=[],c=[],l=[],u=0;for(let e of a){let t=Fo(r,e.name);if(!t){c.push(`missing: ${e.name} ${e.spec} (${e.group})`);continue}if(jo(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=Eo.flatMap(e=>Object.entries(r[e]??{}).filter(([e])=>Ao(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;Io(t,n,r)}console.log(`Coreframe package sync: ${i}`),console.log(``),Lo(e.apply?`Updated Coreframe packages`:`Would update Coreframe packages`,s.map(({currentSpec:e,name:t,spec:n})=>`update: ${t} ${e} -> ${n}`)),Lo(`Missing target Coreframe packages`,c),Lo(`Locally linked Coreframe packages`,l),Lo(`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 zo={...p,displayName:`recipe`,description:`Coreframe recipe name, such as yam-db.`,async from(e){return Bi(e)}},Bo=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})=>Xi({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=eo({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})=>To({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})=>Ro({apply:e,target:t})})}}),Vo=m({name:`recipes`,cmds:{apply:n({name:`apply`,args:{recipe:u({type:zo,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})=>ka(Oa({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})=>Ja(qa({fetch:!e,remote:t,target:n}))}),verify:n({name:`verify`,args:{recipe:u({type:zo,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})=>Ta(wa({fetch:!e,name:t,remote:n,target:r}))})}}),Ho=m({name:`db`,cmds:{ensure:n({name:`ensure`,args:{},handler:y}),generate:n({name:`generate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit generate.`})},handler:({args:e})=>ne(`generate`,e)}),migrate:n({name:`migrate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit migrate.`})},handler:({args:e})=>ne(`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})=>C({target:e?`local`:`deployment`})}),"migrate-deployment":n({name:`migrate-deployment`,args:{environment:c({long:`environment`,type:{...p,displayName:`staging|production`,async from(e){if(e===`staging`||e===`production`)return e;throw Error(`Environment must be staging or production.`)}},description:`Deployment database environment to migrate.`}),dryRun:i({long:`dry-run`,description:`Inspect without applying migrations.`,defaultValue:()=>!1}),yes:i({long:`yes`,short:`y`,description:`Apply without interactive confirmation.`,defaultValue:()=>!1})},handler:({dryRun:e,environment:t,yes:n})=>Li({dryRun:e,environment:t,yes:n})}),"migrate-local":n({name:`migrate-local`,args:{},handler:w}),"migrations-check":n({name:`migrations-check`,args:{},handler:g}),reset:n({name:`reset`,args:{},handler:te}),seed:n({name:`seed`,args:{},handler:()=>re()}),"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:()=>ie()}),studio:n({name:`studio`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit studio.`})},handler:({args:e})=>ne(`studio`,e)})}}),Uo=`package.json`;async function Wo(e=process.argv.slice(2),t=process.env){let n=Go(e);Zo(n);let{packageJson:r,source:i}=await gt(Uo),a=await H(),o=bt(a.deploy,n.environment,t);Qo(n,o.mode),ns(t,[`POSTHOG_API_KEY`,`POSTHOG_PROJECT_ID`]);let s=await $o(o,n.environment,()=>ot({env:t})),c=o.mode===`full`?await qo(n.environment,t):void 0,l=await Xo();await $n({env:t,revision:l});let u=l.slice(0,12),d=xt(n.environment,r.version,u),f=yt(r.name,d),p={...os(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(`
15
- `),`Pending Worker secret updates`),c?.accessTokenSigningSecret.provisioned&&L.log.info(`Provisioning Coreframe-managed access-token signing material.`),await ts(n);let _=o.mode===`full`?await Jo(a,n,t):void 0;try{if(m&&await Dt(Uo,r,d),L.log.step(`Running pre-deploy build`),await I(`pnpm`,[`build`],{env:ss(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`);try{await _.apply()}catch(e){throw _.redact(e)}}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?{[nt]:c.accessTokenSigningSecret.value}:{},...c?.pendingWorkerSecrets.values},t=Object.keys(e).length>0?await is(e):void 0,i=o.mode===`full`?await lt({coreframeConfig:a,environment:n.environment,contributions:{generatedValues:{DEPLOY_ENV:n.environment,POSTHOG_RELEASE:f}}}):await ct(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 rt(c.pendingWorkerSecrets),await Et({environment:n.environment}))}finally{await i.dispose(),await t?.dispose()}let u={environment:n.environment,releaseName:f,url:s,version:d};o.mode===`full`&&o.afterWorkerDeploy&&(L.log.step(`Running required after-Worker deploy hook`),await Ct(o,u)),n.skipPostDeployChecks||(L.log.step(`Running post-deploy checks`),await wt(o,u)),m&&a.extension&&!n.skipPostDeployChecks&&await Kr({version:d,releaseName:f,revision:l}),L.outro(`Deployed ${f} to ${n.environment}`)}catch(e){throw!h&&m&&await V(Uo,i),e}finally{await _?.close()}}function Go(e){return{environment:Ko(e[0]),runMigrations:e.includes(`--run-migrations`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),yes:e.includes(`--yes`)}}function Ko(e){if(e&&it.includes(e))return e;throw Error(`Deploy environment must be one of: ${it.join(`, `)}.`)}async function qo(e,t){let n=await _t({environment:e}),r=n.values.DASHBOARD_PASSWORD??await rs(t,e);return Tt(await st({environment:e}),e,{availableNames:[...Object.keys(n.values),...r?[`DASHBOARD_PASSWORD`]:[]]}),{accessTokenSigningSecret:await ft({environment:e}),dashboardPassword:r,pendingWorkerSecrets:n}}async function Jo(e,t,n){let r=await T({config:e,environment:t.environment,env:n});try{let e=await S(r);return L.note([`Environment: ${r.environment}`,`Dialect: ${r.dialect}`,`Target: ${r.identifier}`].join(`
16
- `),`Deployment database`),await Yo(t,e)?r:(await r.close(),void 0)}catch(e){throw await r.close(),r.redact(e)}}async function Yo(e,t){if(t.length===0)return L.log.info(`No pending deploy migrations.`),!1;if(L.note(x(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 Zo(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations or --skip-migrations.`)}function Qo(e,t){if(t===`client`&&(e.runMigrations||e.skipMigrations))throw Error(`Migration flags are not available when deploy.mode is "client".`)}async function $o(e,t,n=ot){return e.url?es(e.url,t):t===`staging`&&e.stagingHostname?es(await n(),t):es(void 0,t)}function es(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 ts(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 ns(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 rs(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(n)return n;let r;try{r=kt(await z(`.env`,`utf8`))}catch(e){throw as(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 is(e){let t=await De(M(Ne(),`coreframe-deploy-secrets-`)),n=M(t,`secrets.json`);return await V(n,JSON.stringify(e),{mode:384}),{path:n,dispose:()=>B(t,{force:!0,recursive:!0})}}function as(e){return e instanceof Error&&`code`in e}function os(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 ss(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}async function cs(){let e=await us();return typeof e.mobileDevHost==`string`?{mobileDevHost:e.mobileDevHost}:{}}async function ls(e){let t=await us(),n=ds();await X.mkdir(k.dirname(n),{recursive:!0}),await X.writeFile(n,`${JSON.stringify({...t,...e},void 0,2)}\n`)}async function us(){try{let e=await X.readFile(ds(),`utf8`),t=JSON.parse(e);return fs(t)?t:{}}catch{return{}}}function ds(){return k.join(Or.homedir(),`.coreframe`,`preferences.json`)}function fs(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function ps({env:e=W.env,interactive:t=W.stdin.isTTY===!0,platform:n,target:r}){let i=await bs(n,e).catch(()=>[]),a=r?Rs(i,r):void 0;if(a)return a;if(!r&&i.length>0)return ys(i,n,t);let o=r?Rs(await Ss(e).catch(()=>[]),r):void 0;if(o&&o.platform===n)return Cs(o,n,e,t);let s=await xs(n,e),c=r?Rs(s,r):void 0;if(c)return c;if(!r&&s.length>0)return ys(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 ms(e){let{device:t,host:n,interactive:r=W.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=Bs();if(i.length===0)throw Error(`No external IP address was detected. Pass one explicitly with --host.`);let a=await _s();if(a&&i.includes(a))return a;if(i.length===1)return await vs(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 vs(o),o}async function hs({device:e,env:t=W.env,host:n,interactive:r,platform:i,port:a}){if(i===`android`&&e.physical&&n===void 0)try{return await js(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:gs(i,await ms({device:e,host:n,interactive:r,platform:i}),a),viteHost:!0}}function gs(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 _s(){return(await cs()).mobileDevHost}async function vs(e){try{await ls({mobileDevHost:e})}catch(e){L.log.warn(`Could not remember the mobile development IP address: ${e instanceof Error?e.message:String(e)}`)}}async function ys(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 bs(e,t){return e===`android`?Ts(t):Ds(t)}async function xs(e,t){return e===`android`?Es(t):Os(t)}async function Ss(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 Cs(e,t,n,r){let i=await ws(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 ws(t,n).catch(()=>[]),o=Rs(a,e.id);if(o)return o;let s=a.filter(e=>!i.some(t=>t.id===e.id));if(s.length>0)return ys(s,t,r);if(a.length===1)return a[0];await Ut(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 ws(e,t){return e===`ios`?Os(t,`booted`):(await Ts(t)).filter(e=>!e.physical)}async function Ts(e){let t=await As(e,`platform-tools`,W.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 Ns(t,e,n,`ro.product.model`),i=n.startsWith(`emulator-`),a=i?await Fs(t,e,n,r):await Is(t,e,n,r);return{id:n,label:a===r?a:`${a} (${r})`,name:a,physical:!i}}))).sort(Vs)}async function Es(e){let{stdout:t}=await I(await As(e,`emulator`,W.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 Ds(e){let t=await X.mkdtemp(k.join(Or.tmpdir(),`coreframe-ios-devices-`)),n=k.join(t,`devices.json`);try{return await X.writeFile(n,``),await I(`xcrun`,[`devicectl`,`list`,`devices`,`--json-output`,n],{env:e}),(JSON.parse(await X.readFile(n,`utf8`)).result?.devices??[]).filter(ks).map(e=>({id:e.hardwareProperties.udid,label:`${e.deviceProperties.name} (${e.hardwareProperties.productType})`,name:e.deviceProperties.name,physical:!0})).sort(Vs)}finally{await X.rm(t,{force:!0,recursive:!0})}}async function Os(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(Vs)}function ks(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 As(e,t,n){let r=e.ANDROID_HOME??e.ANDROID_SDK_ROOT,i=r?[r]:Ms(e);for(let e of i){let r=k.join(e,t,n);try{return await X.access(r),r}catch{}}return n}async function js(e,t,n){let r=await As(n,`platform-tools`,W.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 Ms(e){return W.platform===`darwin`?[k.join(Or.homedir(),`Library`,`Android`,`sdk`)]:W.platform===`win32`&&e.LOCALAPPDATA?[k.join(e.LOCALAPPDATA,`Android`,`Sdk`)]:[k.join(Or.homedir(),`Android`,`Sdk`)]}async function Ns(e,t,n,r){return(await Ps(e,t,[`-s`,n,`shell`,`getprop`,r])).trim()}async function Ps(e,t,n){return(await I(e,n,{env:t,timeout:3e3})).stdout}async function Fs(e,t,n,r){return Ps(e,t,[`-s`,n,`emu`,`avd`,`name`]).then(e=>e.split(/\r?\n/)[0]?.trim()||r).catch(()=>r)}async function Is(e,t,n,r){return Ps(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 Rs(e,t){let n=e.map(e=>({device:e,score:Math.max(zs(t,e.name),zs(t,e.id))})).sort((e,t)=>t.score-e.score)[0];return n&&n.score>0?n.device:void 0}function zs(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 Bs(){return[...new Set(Object.values(Or.networkInterfaces()).flatMap(e=>e??[]).filter(e=>!e.internal&&e.family===`IPv4`).map(e=>e.address))].sort()}function Vs(e,t){return e.label.localeCompare(t.label)}var Hs=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(!qs(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:qs(e.params)?e.params:{}};this.#l(t),await this.#e?.(t),n.push(...Ws(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(!qs(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=Ys(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(Js(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(Ys(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*Us(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 Ws({event:e,params:t},n){if(e===`daemon.log`||e===`app.log`)return $(Ks(t.log),t.error===!0?`error`:`debug`);if(e===`daemon.logMessage`){let e=Gs(t.level);return!n&&e===`debug`?[]:[...$(Ks(t.message),e),...n?$(Ks(t.stackTrace),e):[]]}return e===`daemon.showMessage`?$(Ks(t.message),Gs(t.level)):e===`app.warning`?$(Ks(t.warning),`warn`):e===`app.progress`&&t.finished!==!0?$(Ks(t.message),`debug`):e===`app.stop`&&t.error!==void 0?$(Js(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 Ks(e){return typeof e==`string`&&e.length>0?e:void 0}function qs(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Js(e){if(typeof e==`string`)return e;if(qs(e)&&typeof e.message==`string`)return e.message;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function Ys(e){return e instanceof Error?e:Error(Js(e))}async function Xs(e,t){if(!e)return()=>void 0;Ve(k.dirname(e),{recursive:!0}),qe(e,``,{flag:`a`});let n;try{n=K(e,`utf8`)}catch{n=void 0}let r=0,i=!1,a=Ke(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 Zs(e,t){let n={...e};return t===`web`||t===`webext`?n.COREFRAME_PLATFORM=`web`:n.COREFRAME_PLATFORM=t,n}const Qs=W.platform===`win32`?`portless.cmd`:`portless`,$s=RegExp(`\x1B\\[[0-?]*[ -/]*[@-~]`,`g`),ec=/^Proxy is already running on port (\d+)\.$/,tc=/^To restart: portless proxy stop(?: (?:-p|--port) \d+)? && portless proxy start(?: (?:-p|--port) \d+)?$/;function nc(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($s,``).trim().match(ec);if(a?.[1]!==void 0&&i!==void 0&&tc.test(i.replace($s,``).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 rc(e){let t=nc(e);t&&W.stdout.write(t.endsWith(`
17
- `)?t:`${t}\n`)}async function ic({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||(await Wt()).isAgent?!1:It(e)}async function ac({cwd:e,env:t,lan:n=!1}){let r=k.join(`node_modules`,`.bin`,Qs),i=[`proxy`,`start`,...n?[`--lan`]:[]];try{let{stdout:n}=await I(k.resolve(e,r),i,{cwd:e,env:t,stdin:`inherit`,stdout:`pipe`,stderr:`inherit`});rc(n)}catch(e){throw typeof e==`object`&&e&&`stdout`in e&&typeof e.stdout==`string`&&rc(e.stdout),e}}function oc({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 sc=k.join(`.coreframe`,`dev`,`session.json`);async function cc({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=k.resolve(t,sc),d=k.dirname(u),f={version:2,id:a,pid:c,projectRoot:k.resolve(t),startedAt:s.toISOString(),platform:l,vite:{localOrigin:o,appOrigin:e},logs:{path:k.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=k.join(d,`.session-${a}.json`);await V(t,e,{mode:384}),await we(t,384),await ke(t,u)}),p};return await m(),{path:u,async recordFlutterEvent({event:e,params:t}){let n=f.flutter;if(!n)return;let r=dc(t.appId),i;if(e===`daemon.connected`){let e=fc(t.pid),r=dc(t.version);i={...lc(n),state:`starting`,...e===void 0?void 0:{daemonPid:e},...r===void 0?void 0:{protocolVersion:r}}}else if(e===`app.start`&&r)i={...lc(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=dc(t.wsUri);e&&(i={...n,vmServiceWsUri:e})}else if(e===`app.devTools`&&r===n.appId){let e=dc(t.uri);e&&(i={...n,devToolsUri:e})}else if(e===`app.dtd`&&r===n.appId){let e=dc(t.uri);e&&(i={...n,dtdUri:e})}else e===`app.stop`&&r===n.appId&&(i=uc(n));i&&(f={...f,flutter:i},await m())},async recordFlutterExit(){!f.flutter||f.flutter.state===`stopped`||(f={...f,flutter:uc(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 lc(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 uc(e){return{...lc(e),state:`stopped`,...e.appId===void 0?void 0:{appId:e.appId},...e.supportsRestart===void 0?void 0:{supportsRestart:e.supportsRestart}}}function dc(e){return typeof e==`string`?e:void 0}function fc(e){return typeof e==`number`?e:void 0}const pc=`extension:dev`;function mc(e){if(!G(M(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=M(e,`package.json`),n;try{n=JSON.parse(K(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.${pc} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function hc({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`,pc,...n.length>0?[`--`,...n]:[]]}const gc=[`web`,`webext`,`ios`,`android`,`macos`,`windows`,`linux`],_c=[`managed-dev-overlay`],vc=k.resolve(`node_modules`,`.bin`),yc=W.platform===`win32`?`pnpm.cmd`:`pnpm`,bc=W.platform===`win32`?`portless.cmd`:`portless`,xc=W.platform===`win32`?`react-router.cmd`:`react-router`,Sc=`Lost connection to device.`;async function Cc({cwd:e=W.cwd(),debug:t,device:n,env:r=W.env,flutterDebug:i=!1,flutterMcp:a=!1,flutterOutput:o=`filtered`,host:s,https:c=!1,interactive:l=W.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=Mt({env:r}),ee=r.PATH??r.Path??``,y=Ic(h)?h:void 0,b=Xt(i||a),x=Fc(_??r.COREFRAME_WEB_PORT),S,C,w,te,T,ne,re,ie,ae,se,ce,le,de,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.`);mc(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 pe=await v.measure(`routing`,()=>ic({cwd:e,env:r,platform:h}));pe&&await v.measure(`portless`,()=>ac({cwd:e,env:r,lan:u}));let A=y===void 0?h===`web`?x??await Dr.getAvailablePort():h===`webext`?x:void 0:x??await Dr.getAvailablePort(),j,M=new Promise(e=>{j=e}),N=()=>{E||(E=!0,j(),C?.kill(`SIGTERM`),ne?.kill(`SIGTERM`),re?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),ie?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),ae?.close().catch(()=>void 0),S?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),P().catch(()=>void 0))},P=()=>te?(T??=te[Symbol.asyncDispose](),T):Promise.resolve(),F=e=>{D??=e,N()},me=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>F(e);return W.on(e,t),{handler:t,signal:e}}),he=async e=>{let t=Xe(e);C=t;try{await t.expectSuccess()}catch(e){if(!E)throw e}finally{C===t&&(C=void 0)}};try{ce=y?Ht({path:k.resolve(e,`.leylines`,`logs.sqlite`)}):void 0;let i=h===`ios`||h===`android`?h:void 0,_=i?await ps({env:r,interactive:l,platform:i,target:n}):void 0;i&&_&&Zt({device:_,mode:b,platform:i});let x=y?ce?.logger({scope:`dev.flutter`,properties:{platform:y,..._?{deviceId:_.id}:void 0}}):void 0;se=i&&_&&A!==void 0?await hs({device:_,env:r,host:s,interactive:l,platform:i,port:A}):void 0;let C=se?.viteHost??(y?i?!0:`127.0.0.1`:s),T=A===void 0?void 0:`${c?`https`:`http`}://127.0.0.1:${A}`,D=y===void 0?T:se?.serverUrl??gs(y,void 0,A),j={},P=!1,F;[j,P]=await Promise.all([v.measure(`config`,()=>H({cwd:e})),v.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(d||l&&!p)&&await Ft(e))]),await v.measure(`i18n`,()=>Zn({cwd:e,projectConfig:j})),F=h!==`webext`&&Pr(e)?await Dr.getAvailablePort():void 0;let me=await v.measure(`https`,async()=>c&&!pe?Lt({cwd:e}):void 0),ge=Zs(r,h),_e=U();O={...ge,[zt]:_e,...v.environment,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...!m&&h!==`webext`?{[Rt]:U()}:void 0,...y?{COREFRAME_PLATFORM:y,[Vt]:k.resolve(e,`.coreframe`,`managed-dev-flutter-restart`)}:void 0,...me?{[Nt]:me.cert,[Pt]:me.key}:void 0,...F?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${F}`}:void 0},T!==void 0&&D!==void 0&&(le=await cc({appOrigin:D,cwd:e,device:_,flutterMcp:a,flutterMode:y===void 0?void 0:b,id:_e,localOrigin:T,platform:h}));let ve=async()=>{if(!F)return;let t=Fr({cwd:e,env:O,port:F});ae=t;try{await t.listen(),await t.wait()}finally{await t.close(),ae===t&&(ae=void 0)}},ye=async()=>{let t=Ye({label:`web`}),n=Ye({color:`red`,label:`web`});t.pipe(W.stdout,{end:!1}),n.pipe(W.stderr,{end:!1}),re=I(pe?bc:xc,pe?oc({host:C,lan:u,port:A}):Pc({host:C,port:A,strictPort:h===`web`||y!==void 0}),{cwd:e,env:{...O,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[O.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:vc+k.delimiter+ee},stdin:`inherit`});let r=Promise.allSettled([Ac(re.stdout,t),Ac(re.stderr,n)]);try{await re;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([Je(t),Je(n)]),re=void 0}},be=async()=>{let t=Ye({label:`webext`}),n=Ye({color:`red`,label:`webext`});t.pipe(W.stdout,{end:!1}),n.pipe(W.stderr,{end:!1}),ie=I(yc,hc({host:s,port:A}),{cwd:e,env:O,stdin:`inherit`});let r=Promise.allSettled([Ac(ie.stdout,t),Ac(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([Je(t),Je(n)]),ie=void 0}},xe=async t=>{let n,r,i=!1,s,c=Xs(O[Vt],()=>{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`}}),W.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`}}),W.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 fe():void 0,u=I(`flutter`,Qt({device:_??{id:h},flutterDriver:a,mode:b,serverUrl:D,verbose:g}),{cwd:k.join(e,`src-flutter`),env:Yt(ge,{noCodesign:f}),stdio:[`pipe`,`pipe`,`pipe`]}),d=new Hs({onEvent:async e=>{Ec(e.params.message)&&(s=!0),await le?.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 At(t.stdin,`drain`)}}),p=e=>Tc(Us(e,d),()=>s=!0);S=u,n=u,r=d;try{let e=!1;try{let e=c?c.capture(kc(p(u),x,`output`)):Promise.all([Oc(p(u.stdout),W.stdout,x,`stdout`),wc(u.stderr,W.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?`${Sc} 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??M);return}}finally{S===u&&(S=void 0),n===u&&(n=void 0),r===d&&(r=void 0),d.close(),le?.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(!E)throw Error(`The Vite development server stopped while Flutter was still running.`)});await ue({cwd:e});try{await Promise.race([t,xe(t)])}finally{N(),await Promise.allSettled([t,S]),S=void 0}},Ce=async()=>{let t=Xe({name:`panda`,command:yc,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:O});ne=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{ne===t&&(ne=void 0)}},we=async()=>{if(h===`webext`){await be();return}let e=Ce(),t=Se(),n=F?ve():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),E&&await t}finally{N(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}};if(P&&(O={...O,[Bt]:`1`},r.COREFRAME_DEV_SUPERVISOR!==`0`&&(de=await v.measure(`supervisor`,()=>jt({cwd:e,env:r})))),E)return;if(h===`webext`){v.report(),await we();return}if(j.database?.dialect===`sqlite`&&(await v.measure(`database`,async()=>{let t=await oe({config:j,cwd:e,env:r,tursoOutput:W.stdout,useSupervisorLease:!0});te=t,O={...O,...t.env}}),await v.measure(`schema`,()=>he({name:`db`,command:yc,args:[`db`,`ensure`],cwd:e,env:O,prefix:!1})),E))return;if(Nc(j)){let t=Ye({label:`postgres`});t.pipe(W.stdout,{end:!1});try{let n=await v.measure(`database`,()=>Mc({config:j,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`,()=>he({name:`db`,command:yc,args:[`db`,`ensure`],cwd:e,env:O,prefix:!1})),E||(v.report(),await we())}finally{await n[Symbol.asyncDispose](),w===n&&(w=void 0)}}finally{t.end()}return}v.report(),await we()}finally{N(),await se?.close(),se=void 0;let e;try{await w?.[Symbol.asyncDispose]()}catch(t){e=t}finally{try{await P()}finally{try{await le?.close()}finally{de?.close(),ce?.close();for(let{handler:e,signal:t}of me)W.off(t,e)}}D&&(W.exitCode??=D===`SIGINT`?130:143)}jc(e)}}async function wc(e,t,n,r){for await(let i of Dc(e,n,r))t.write(`${i}\n`)||await At(t,`drain`)}async function*Tc(e,t){for await(let n of e)Ec(n.message)&&t(),yield n}function Ec(e){return typeof e==`string`&&e.trim()===Sc}async function*Dc(e,t,n){for await(let r of e){let e=le(r);e.message&&t?.write(e.level,e.message,{properties:{stream:n}}),yield r}}async function Oc(e,t,n,r){for await(let i of kc(e,n,r))t.write(`${i}\n`)||await At(t,`drain`)}async function*kc(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 Ac(e,t){for await(let n of e)t.write(`${n}\n`)||await At(t,`drain`)}function jc(e){if(e)throw e}async function Mc({interactive:e,isStopping:t,...n}){try{return await ae(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 se(r),t()?void 0:ae(n)}}function Nc(e){return(e.database?.dialect??`postgres`)===`postgres`}function Pc({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 Fc(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 Ic(e){return e===`android`||e===`ios`||e===`linux`||e===`macos`||e===`windows`}async function Lc(e={}){let t=e.cwd??W.cwd(),n=`scripts/preview.ts`,r={},i=!0;try{await Ce(k.resolve(t,n))}catch(e){if(e.code===`ENOENT`)i=!1;else throw e}if(i){let e=await Fe(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}let a=r.afterBuild;return r={...r,async afterBuild(e){await a?.(e);for(let n of await Vr({cwd:t}))await e.stageArtifact({label:n.label,pathname:`/__preview/extensions/${k.basename(n.path)}`,source:n.path})}},Gt({...e,cwd:t},r)}const Rc=`worker-configuration.d.ts`;async function zc({check:e=!1,cwd:t=process.cwd()}={}){let n=await H({cwd:t}),r=await ut({coreframeConfig:n,cwd:t}),i=P(t,Rc),a=P(t,`.coreframe-worker-types-${U()}.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 Bc(e),e}let o=Vc(await z(a,`utf8`)),s=Le(r.config),c=Ie(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${Hc(c)}\n`;if(e){if(await z(i,`utf8`).catch(()=>``)!==l)throw Error(`${Rc} 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 V(i,l),{changed:u!==l,path:i}}finally{await r.dispose(),await B(a,{force:!0})}}function Bc(e){if(typeof e!=`object`||!e||!(`output`in e))return;let{output:t}=e;typeof t!=`string`||t===``||process.stderr.write(t.endsWith(`
18
- `)?t:`${t}\n`)}function Vc(e){return e.split(/\r?\n/).filter(e=>!e.startsWith(`// Generated by Wrangler by running `)).join(`
19
- `)}function Hc(e){return[`// Coreframe application string inventory declaration-merges with Wrangler's generated Env.`,`interface Env {`,...e.map(e=>` /** ${e.description.replaceAll(`*/`,`*\\/`)} */\n ${JSON.stringify(e.name)}?: string`),`}`].join(`
20
- `)}const Uc=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),Wc=[`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`],Kc=[`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`],qc=`.coreframe/typegen.json`,Jc=[`web`,`dashboard`,`worker`];async function Yc({checkWorker:e=!1,cwd:t=W.cwd(),runners:n={}}={}){let r=await $c(t)??{generators:{},schemaVersion:1},i=[];return i.push(await Zc({cwd:t,inputPaths:Wc,name:`web`,outputPath:`.react-router`,run:()=>(n.web??Qc)(t),state:r})),i.push(await Zc({cwd:t,inputPaths:Gc,name:`dashboard`,outputPath:`dashboard/.react-router`,run:()=>(n.dashboard??Sr)(t),state:r})),i.push(await Zc({cwd:t,inputPaths:Kc,name:`worker`,outputPath:`worker-configuration.d.ts`,run:()=>(n.worker??zc)({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 Zc({cwd:e,inputPaths:t,name:n,outputPath:r,run:i,state:a}){let o=await tl(e,t),s=await nl(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 nl(e,r);if(!l)throw Error(`Coreframe ${n} typegen did not produce ${r}.`);return a.generators[n]={inputFingerprint:o,outputFingerprint:l},await el(e,a),{changed:s!==l,name:n,ran:!0}}async function Qc(e){let t=W.platform===`win32`?`react-router.cmd`:`react-router`,n=W.env;await I(t,[`typegen`],{cwd:e,env:{...n,PATH:k.resolve(e,`node_modules/.bin`)+k.delimiter+(n.PATH??n.Path??``)},stdio:`inherit`})}async function $c(e){try{let t=JSON.parse(await z(k.resolve(e,qc),`utf8`));if(!ol(t)||t.schemaVersion!==1)return;let n={};if(!ol(t.generators))return;for(let e of Jc){let r=t.generators[e];ol(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 el(e,t){let n=k.resolve(e,qc);await R(k.dirname(n),{recursive:!0}),await V(n,`${JSON.stringify(t)}\n`,{mode:384})}async function tl(e,t){let n=Re(`sha256`);for(let r of[...t].sort()){let t=k.resolve(e,r),i=await il(t);if(!i){n.update(`missing:${r}\0`);continue}if(i.isDirectory()){n.update(`directory:${r}\0`);for(let r of await rl(t)){let i=k.join(t,r),a=k.relative(e,i).split(k.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 nl(e,t){if(await il(k.resolve(e,t)))return tl(e,[t])}async function rl(e){let t=[];async function n(e,r){let i=await Oe(e,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i)if(a.isDirectory()){if(Uc.has(a.name))continue;await n(k.join(e,a.name),k.join(r,a.name))}else a.isFile()&&t.push(k.join(r,a.name))}return await n(e,``),t.sort()}async function il(e){try{return await Ae(e)}catch(e){if(al(e))return;throw e}}function al(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}function ol(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const sl=k.resolve(`node_modules`,`.bin`);W.env.PATH=sl+k.delimiter+W.env.PATH;const cl=W.platform===`win32`?`tsc.cmd`:`tsc`,ll=[{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 ul(){await Yc({checkWorker:!0});let e=[];for(let t of ll)try{await Ce(t.path),e.push(t)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let t=e.map(e=>Xe({name:e.name,command:cl,args:[`-p`,e.path]})),n=(await Promise.all(t.map(e=>e.wait()))).filter(e=>e.exitCode!==0);n.length>0&&(W.exitCode=n[0].exitCode)}const dl=r(s(_c),{displayName:`feature`,from:async e=>e}),fl=r(s(Jt),{displayName:`filtered|full`,from:async e=>e}),pl=[`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.`],ml=n({name:`deploy`,args:{environment:u({type:s(it),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})=>Wo([e,...t?[`--run-migrations`]:[],...n?[`--skip-migrations`]:[],...r?[`--skip-post-deploy-checks`]:[],...i?[`--yes`]:[]])}),hl=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 vt();if(e){console.log(JSON.stringify({...t,notices:pl}));return}console.log(t.url),console.error(`Staging hostname reassigned. ${pl.join(` `)}`)}}),url:n({name:`url`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await ot();console.log(e?JSON.stringify({url:t}):t)}})}}),gl=m({name:`secrets`,cmds:{"rotate-access-token":n({name:`rotate-access-token`,args:{environment:u({type:s(it),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 St({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(it)),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 st({environment:e});console.log(t?JSON.stringify(n):Sl(n))}}),set:n({name:`set`,args:{environment:u({type:s(it),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 pt({environment:e,name:t,value:await Cl(t)}),console.log(`Queued ${t} for ${e}. Run coreframe deploy ${e} to apply.`);return}let r=await ht(),i=n?await Tl(r):await wl(r,e);await mt({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(it),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 at({environment:e,name:t});console.log(n?`Discarded the queued ${t} update for ${e}.`:`No ${t} update is queued for ${e}.`)}})}}),_l=n({name:`typecheck`,args:{},handler:ul}),vl=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 zc({check:e});console.log(e?`${Dl(t.path)} is current.`:`${Dl(t.path)} ${t.changed?`generated`:`is unchanged`}.`)}})}}),yl=n({name:`dev`,args:{debug:c({long:`debug`,type:l(dl),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:fl,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(gc)),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=bl({device:t,flutterDebug:n,platform:f,simulator:m});return Cc({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 bl({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 xl=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 Sl(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(`
21
- `)}async function Cl(e){if(!W.stdin.isTTY){let e=``;for await(let t of W.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 wl(e,t){if(!W.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 Tl(e){if(e.length===0)throw Error(`No Worker secrets are declared in coreframe.config.ts.`);let t=W.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 El();if(L.isCancel(t))throw L.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);let{ignoredNames:n,values:r}=dt(t,e);return n.length>0&&L.log.info(`Ignored non-secret or undeclared names: ${n.join(`, `)}.`),r}async function El(){let e=``;for await(let t of W.stdin)e+=t.toString();return e}function Dl(e){return e.split(/[\\/]/).at(-1)??e}const Ol=n({name:`typegen`,description:`Generate Coreframe route and Worker type declarations.`,args:{},handler:async()=>{let e=await Yc();for(let t of e)console.log(Xc(t))}});function kl(e,{formatMessage:t,temporaryDirectory:n=Ne(),write:r=e=>console.error(e)}={}){let i=Fl(e),a=Rl(jl(e,t),i);try{let t=M(He(M(n,`coreframe-error-`)),`error.log`);return qe(t,`${Rl(Ml(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 Al(t,n={}){let r=typeof t==`function`?t:()=>e.run(e.binary(t),process.argv),i=!1,a=e=>{i||(i=!0,kl(e,n),process.exit(1))};process.once(`uncaughtException`,a),process.once(`unhandledRejection`,a),Promise.resolve().then(r).catch(a)}function jl(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 Ml(e){try{let t=Nl(e);if(!(e instanceof Error)||!Pl(t))return Ot(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${Ot(t,{customInspect:!1,depth:10})}`:``}`}catch{return`The thrown value could not be inspected.`}}function Nl(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:Nl(a.value,t),writable:!0})}return i}function Pl(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Fl(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`?Il(t.value,n):r(t.value))}}}try{r(e)}catch{}return n}function Il(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 Rl(e,t){return[...t].sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[redacted environment value]`),e)}const zl=m({name:`coreframe`,cmds:{build:fn,dashboard:Rr,assets:_r,flutter:vr,i18n:yr,jobs:Ii,deploy:ml,extension:vi,staging:hl,secrets:gl,typegen:Ol,typecheck:_l,worker:vl,dev:yl,preview:xl,upgrade:Bo,recipes:Vo,db:Ho}});import.meta.main&&Al(zl,{formatMessage:process.argv[2]===`db`?b:void 0});export{zl as coreframeCli};
14
+ `:``;qe(e,`${JSON.stringify(n,null,r)}${i}`)}function Ro(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t)console.log(` ${e}`);console.log(``)}}function zo(e){let t=P(Oo([`rev-parse`,`--show-toplevel`]).trim(),`package.json`),n=q(t,`utf8`),r=ko(n,t),i=Q(e.target),a=Fo(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(Mo(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=Do.flatMap(e=>Object.entries(r[e]??{}).filter(([e])=>jo(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;Lo(t,n,r)}console.log(`Coreframe package sync: ${i}`),console.log(``),Ro(e.apply?`Updated Coreframe packages`:`Would update Coreframe packages`,s.map(({currentSpec:e,name:t,spec:n})=>`update: ${t} ${e} -> ${n}`)),Ro(`Missing target Coreframe packages`,c),Ro(`Locally linked Coreframe packages`,l),Ro(`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 Bo={...p,displayName:`recipe`,description:`Coreframe recipe name, such as yam-db.`,async from(e){return Bi(e)}},Vo=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})=>Xi({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=to({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})=>Eo({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})=>zo({apply:e,target:t})})}}),Ho=m({name:`recipes`,cmds:{apply:n({name:`apply`,args:{recipe:u({type:Bo,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})=>ka(Oa({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})=>Ja(qa({fetch:!e,remote:t,target:n}))}),verify:n({name:`verify`,args:{recipe:u({type:Bo,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})=>Ta(wa({fetch:!e,name:t,remote:n,target:r}))})}}),Uo=m({name:`db`,cmds:{ensure:n({name:`ensure`,args:{},handler:b}),generate:n({name:`generate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit generate.`})},handler:({args:e})=>ne(`generate`,e)}),migrate:n({name:`migrate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit migrate.`})},handler:({args:e})=>ne(`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})=>w({target:e?`local`:`deployment`})}),"migrate-deployment":n({name:`migrate-deployment`,args:{environment:c({long:`environment`,type:{...p,displayName:`staging|production`,async from(e){if(e===`staging`||e===`production`)return e;throw Error(`Environment must be staging or production.`)}},description:`Deployment database environment to migrate.`}),dryRun:i({long:`dry-run`,description:`Inspect without applying migrations.`,defaultValue:()=>!1}),yes:i({long:`yes`,short:`y`,description:`Apply without interactive confirmation.`,defaultValue:()=>!1})},handler:({dryRun:e,environment:t,yes:n})=>Li({dryRun:e,environment:t,yes:n})}),"migrate-local":n({name:`migrate-local`,args:{},handler:T}),"migrations-check":n({name:`migrations-check`,args:{},handler:g}),reset:n({name:`reset`,args:{},handler:ee}),seed:n({name:`seed`,args:{},handler:()=>re()}),"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:()=>ie()}),studio:n({name:`studio`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit studio.`})},handler:({args:e})=>ne(`studio`,e)})}}),Wo=`package.json`;async function Go(e=process.argv.slice(2),t=process.env){let n=Ko(e);es(n);let{packageJson:r,source:i}=await gt(Wo),a=await U(),o=await Ie({config:a,env:t,target:n.environment}),s=o?{...t,...o}:t,c=bt(a.deploy,n.environment,s);ts(n,c.mode),as(s,[`POSTHOG_API_KEY`,`POSTHOG_PROJECT_ID`]);let l=await ns(c,n.environment,()=>ot({env:s})),u=c.mode===`full`?await Yo(a,n.environment,s,o):void 0,d=await $o();await $n({env:s,revision:d});let f=d.slice(0,12),p=xt(n.environment,r.version,f),m=yt(r.name,p),h={...ls(s,n.environment,m,r.name,p),COREFRAME_I18N_RELEASE_REVISION:d},g=n.environment===`production`,_=!1;L.intro(`Deploy ${m} to ${n.environment}`);let v=Object.keys(u?.pendingWorkerSecrets.values??{}).sort();v.length>0&&L.note(v.join(`
15
+ `),`Pending Worker secret updates`),u?.accessTokenSigningSecret.provisioned&&L.log.info(`Provisioning Coreframe-managed access-token signing material.`),await is(n);let y=c.mode===`full`?await Zo(a,n,s):void 0;try{if(g&&await Dt(Wo,r,p),L.log.step(`Running pre-deploy build`),await I(`pnpm`,[`build`],{env:us(h),stdio:`inherit`}),L.log.step(`Running release build and uploading PostHog source maps`),_=!0,await I(`pnpm`,[`build`],{env:h,stdio:`inherit`}),y){L.log.step(`Running deploy-safe database migrations`);try{await y.apply()}catch(e){throw y.redact(e)}}L.log.step(c.mode===`full`?`Deploying Worker and static assets to Cloudflare`:`Deploying static assets to Cloudflare`);let e={...u?.dashboardPassword?{DASHBOARD_PASSWORD:u.dashboardPassword}:{},...u?.accessTokenSigningSecret.value?{[nt]:u.accessTokenSigningSecret.value}:{},...u?.providerWorkerSecrets,...u?.pendingWorkerSecrets.values},t=Object.keys(e).length>0?await ss(e):void 0,i=c.mode===`full`?await lt({coreframeConfig:a,environment:n.environment,contributions:{generatedValues:{DEPLOY_ENV:n.environment,POSTHOG_RELEASE:m}}}):await ct(process.cwd());try{await I(`pnpm`,[`exec`,`wrangler`,`deploy`,`--config`,i.path,...c.mode===`full`?[`--env`,n.environment]:[],`--strict`,`--keep-vars`,`--tag`,m,`--message`,`Deploy ${m}`,...t?[`--secrets-file`,t.path]:[]],{env:h,stdio:`inherit`}),u&&(await rt(u.pendingWorkerSecrets),await Et({env:s,environment:n.environment}))}finally{await i.dispose(),await t?.dispose()}let o={environment:n.environment,releaseName:m,url:l,version:p};c.mode===`full`&&c.afterWorkerDeploy&&(L.log.step(`Running required after-Worker deploy hook`),await Ct(c,o)),n.skipPostDeployChecks||(L.log.step(`Running post-deploy checks`),await wt(c,o)),g&&a.extension&&!n.skipPostDeployChecks&&await Kr({version:p,releaseName:m,revision:d}),L.outro(`Deployed ${m} to ${n.environment}`)}catch(e){throw!_&&g&&await H(Wo,i),e}finally{await y?.close()}}function Ko(e){return{environment:qo(e[0]),runMigrations:e.includes(`--run-migrations`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),yes:e.includes(`--yes`)}}function qo(e){if(e&&it.includes(e))return e;throw Error(`Deploy environment must be one of: ${it.join(`, `)}.`)}const Jo=new Set([`CLOUDFLARE_API_TOKEN`,`DOPPLER_TOKEN`,`POSTHOG_API_KEY`,`POSTHOG_PROJECT_ID`]);async function Yo(e,t,n,r){let i=await _t({environment:t}),a=Fe(e.worker?.environment),o=r?a.filter(e=>e.kind===`secret`&&e.requiredIn.includes(t)).map(e=>e.name).filter(e=>!r[e]?.trim()):[];if(o.length>0)throw Error(`The configured secrets provider is missing required ${t} Worker secrets: ${o.sort().join(`, `)}.`);let s=r?Object.fromEntries(a.flatMap(e=>e.kind===`secret`&&e.name!==nt&&e.name!==`DASHBOARD_PASSWORD`&&!Jo.has(e.name)&&r[e.name]!==void 0?[[e.name,r[e.name]]]:[])):{},c=new Set([...Object.keys(s),...r?.DASHBOARD_PASSWORD===void 0?[]:[`DASHBOARD_PASSWORD`]]),l=Object.keys(i.values).filter(e=>c.has(e));if(l.length>0)throw Error(`Queued manual Worker secret updates conflict with provider values for ${t}: ${l.sort().join(`, `)}. Discard the queued updates before deploying.`);for(let e of Jo)if(r?.[e]!==void 0&&a.some(t=>t.name===e))throw Error(`${e} is a deployment credential and cannot be declared as a Worker environment value.`);let u=r?Xo(r,t):i.values.DASHBOARD_PASSWORD??await os(n,t);return Tt(await st({env:n,environment:t}),t,{availableNames:[...Object.keys(i.values),...Object.keys(s),...u?[`DASHBOARD_PASSWORD`]:[]]}),{accessTokenSigningSecret:await ft({env:n,environment:t}),dashboardPassword:u,pendingWorkerSecrets:i,providerWorkerSecrets:s}}function Xo(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(!n)throw Error(`The configured secrets provider is missing DASHBOARD_PASSWORD for ${t}.`);return n}async function Zo(e,t,n){let r=await te({config:e,environment:t.environment,env:n});try{let e=await C(r);return L.note([`Environment: ${r.environment}`,`Dialect: ${r.dialect}`,`Target: ${r.identifier}`].join(`
16
+ `),`Deployment database`),await Qo(t,e)?r:(await r.close(),void 0)}catch(e){throw await r.close(),r.redact(e)}}async function Qo(e,t){if(t.length===0)return L.log.info(`No pending deploy migrations.`),!1;if(L.note(S(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 $o(){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 es(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations or --skip-migrations.`)}function ts(e,t){if(t===`client`&&(e.runMigrations||e.skipMigrations))throw Error(`Migration flags are not available when deploy.mode is "client".`)}async function ns(e,t,n=ot){return e.url?rs(e.url,t):t===`staging`&&e.stagingHostname?rs(await n(),t):rs(void 0,t)}function rs(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 is(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 as(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 os(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(n)return n;let r;try{r=kt(await z(`.env`,`utf8`))}catch(e){throw cs(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 ss(e){let t=await De(M(Me(),`coreframe-deploy-secrets-`)),n=M(t,`secrets.json`);return await H(n,JSON.stringify(e),{mode:384}),{path:n,dispose:()=>V(t,{force:!0,recursive:!0})}}function cs(e){return e instanceof Error&&`code`in e}function ls(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 us(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}async function ds(){let e=await ps();return typeof e.mobileDevHost==`string`?{mobileDevHost:e.mobileDevHost}:{}}async function fs(e){let t=await ps(),n=ms();await Z.mkdir(k.dirname(n),{recursive:!0}),await Z.writeFile(n,`${JSON.stringify({...t,...e},void 0,2)}\n`)}async function ps(){try{let e=await Z.readFile(ms(),`utf8`),t=JSON.parse(e);return hs(t)?t:{}}catch{return{}}}function ms(){return k.join(Or.homedir(),`.coreframe`,`preferences.json`)}function hs(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function gs({env:e=G.env,interactive:t=G.stdin.isTTY===!0,platform:n,target:r}){let i=await Cs(n,e).catch(()=>[]),a=r?Vs(i,r):void 0;if(a)return a;if(!r&&i.length>0)return Ss(i,n,t);let o=r?Vs(await Ts(e).catch(()=>[]),r):void 0;if(o&&o.platform===n)return Es(o,n,e,t);let s=await ws(n,e),c=r?Vs(s,r):void 0;if(c)return c;if(!r&&s.length>0)return Ss(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 _s(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=Us();if(i.length===0)throw Error(`No external IP address was detected. Pass one explicitly with --host.`);let a=await bs();if(a&&i.includes(a))return a;if(i.length===1)return await xs(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 xs(o),o}async function vs({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 Ps(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:ys(i,await _s({device:e,host:n,interactive:r,platform:i}),a),viteHost:!0}}function ys(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 bs(){return(await ds()).mobileDevHost}async function xs(e){try{await fs({mobileDevHost:e})}catch(e){L.log.warn(`Could not remember the mobile development IP address: ${e instanceof Error?e.message:String(e)}`)}}async function Ss(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 Cs(e,t){return e===`android`?Os(t):As(t)}async function ws(e,t){return e===`android`?ks(t):js(t)}async function Ts(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 Es(e,t,n,r){let i=await Ds(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 Ds(t,n).catch(()=>[]),o=Vs(a,e.id);if(o)return o;let s=a.filter(e=>!i.some(t=>t.id===e.id));if(s.length>0)return Ss(s,t,r);if(a.length===1)return a[0];await Ut(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 Ds(e,t){return e===`ios`?js(t,`booted`):(await Os(t)).filter(e=>!e.physical)}async function Os(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 Is(t,e,n,`ro.product.model`),i=n.startsWith(`emulator-`),a=i?await Rs(t,e,n,r):await zs(t,e,n,r);return{id:n,label:a===r?a:`${a} (${r})`,name:a,physical:!i}}))).sort(Ws)}async function ks(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 As(e){let t=await Z.mkdtemp(k.join(Or.tmpdir(),`coreframe-ios-devices-`)),n=k.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(Ms).map(e=>({id:e.hardwareProperties.udid,label:`${e.deviceProperties.name} (${e.hardwareProperties.productType})`,name:e.deviceProperties.name,physical:!0})).sort(Ws)}finally{await Z.rm(t,{force:!0,recursive:!0})}}async function js(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(Ws)}function Ms(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]:Fs(e);for(let e of i){let r=k.join(e,t,n);try{return await Z.access(r),r}catch{}}return n}async function Ps(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 Fs(e){return G.platform===`darwin`?[k.join(Or.homedir(),`Library`,`Android`,`sdk`)]:G.platform===`win32`&&e.LOCALAPPDATA?[k.join(e.LOCALAPPDATA,`Android`,`Sdk`)]:[k.join(Or.homedir(),`Android`,`Sdk`)]}async function Is(e,t,n,r){return(await Ls(e,t,[`-s`,n,`shell`,`getprop`,r])).trim()}async function Ls(e,t,n){return(await I(e,n,{env:t,timeout:3e3})).stdout}async function Rs(e,t,n,r){return Ls(e,t,[`-s`,n,`emu`,`avd`,`name`]).then(e=>e.split(/\r?\n/)[0]?.trim()||r).catch(()=>r)}async function zs(e,t,n,r){return Ls(e,t,[`-s`,n,`shell`,`dumpsys`,`bluetooth_manager`]).then(e=>Bs(e)||r).catch(()=>r)}function Bs(e){return e.match(/\bname: (.+)/)?.[1]?.trim()}function Vs(e,t){let n=e.map(e=>({device:e,score:Math.max(Hs(t,e.name),Hs(t,e.id))})).sort((e,t)=>t.score-e.score)[0];return n&&n.score>0?n.device:void 0}function Hs(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 Us(){return[...new Set(Object.values(Or.networkInterfaces()).flatMap(e=>e??[]).filter(e=>!e.internal&&e.family===`IPv4`).map(e=>e.address))].sort()}function Ws(e,t){return e.label.localeCompare(t.label)}var Gs=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(!Xs(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:Xs(e.params)?e.params:{}};this.#l(t),await this.#e?.(t),n.push(...qs(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(!Xs(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=Qs(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(Zs(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(Qs(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*Ks(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 qs({event:e,params:t},n){if(e===`daemon.log`||e===`app.log`)return $(Ys(t.log),t.error===!0?`error`:`debug`);if(e===`daemon.logMessage`){let e=Js(t.level);return!n&&e===`debug`?[]:[...$(Ys(t.message),e),...n?$(Ys(t.stackTrace),e):[]]}return e===`daemon.showMessage`?$(Ys(t.message),Js(t.level)):e===`app.warning`?$(Ys(t.warning),`warn`):e===`app.progress`&&t.finished!==!0?$(Ys(t.message),`debug`):e===`app.stop`&&t.error!==void 0?$(Zs(t.error),`error`):[]}function $(e,t){return e===void 0?[]:e.split(/\r?\n/u).map(e=>({level:t,message:e}))}function Js(e){return e===`error`?`error`:e===`warning`||e===`warn`?`warn`:`debug`}function Ys(e){return typeof e==`string`&&e.length>0?e:void 0}function Xs(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Zs(e){if(typeof e==`string`)return e;if(Xs(e)&&typeof e.message==`string`)return e.message;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function Qs(e){return e instanceof Error?e:Error(Zs(e))}async function $s(e,t){if(!e)return()=>void 0;Ve(k.dirname(e),{recursive:!0}),qe(e,``,{flag:`a`});let n;try{n=q(e,`utf8`)}catch{n=void 0}let r=0,i=!1,a=Ke(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 ec(e,t){let n={...e};return t===`web`||t===`webext`?n.COREFRAME_PLATFORM=`web`:n.COREFRAME_PLATFORM=t,n}const tc=G.platform===`win32`?`portless.cmd`:`portless`,nc=RegExp(`\x1B\\[[0-?]*[ -/]*[@-~]`,`g`),rc=/^Proxy is already running on port (\d+)\.$/,ic=/^To restart: portless proxy stop(?: (?:-p|--port) \d+)? && portless proxy start(?: (?:-p|--port) \d+)?$/;function ac(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(nc,``).trim().match(rc);if(a?.[1]!==void 0&&i!==void 0&&ic.test(i.replace(nc,``).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 oc(e){let t=ac(e);t&&G.stdout.write(t.endsWith(`
17
+ `)?t:`${t}\n`)}async function sc({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||(await Wt()).isAgent?!1:It(e)}async function cc({cwd:e,env:t,lan:n=!1}){let r=k.join(`node_modules`,`.bin`,tc),i=[`proxy`,`start`,...n?[`--lan`]:[]];try{let{stdout:n}=await I(k.resolve(e,r),i,{cwd:e,env:t,stdin:`inherit`,stdout:`pipe`,stderr:`inherit`});oc(n)}catch(e){throw typeof e==`object`&&e&&`stdout`in e&&typeof e.stdout==`string`&&oc(e.stdout),e}}function lc({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 uc=k.join(`.coreframe`,`dev`,`session.json`);async function dc({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=k.resolve(t,uc),d=k.dirname(u),f={version:2,id:a,pid:c,projectRoot:k.resolve(t),startedAt:s.toISOString(),platform:l,vite:{localOrigin:o,appOrigin:e},logs:{path:k.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=k.join(d,`.session-${a}.json`);await H(t,e,{mode:384}),await we(t,384),await B(t,u)}),p};return await m(),{path:u,async recordFlutterEvent({event:e,params:t}){let n=f.flutter;if(!n)return;let r=mc(t.appId),i;if(e===`daemon.connected`){let e=hc(t.pid),r=mc(t.version);i={...fc(n),state:`starting`,...e===void 0?void 0:{daemonPid:e},...r===void 0?void 0:{protocolVersion:r}}}else if(e===`app.start`&&r)i={...fc(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=mc(t.wsUri);e&&(i={...n,vmServiceWsUri:e})}else if(e===`app.devTools`&&r===n.appId){let e=mc(t.uri);e&&(i={...n,devToolsUri:e})}else if(e===`app.dtd`&&r===n.appId){let e=mc(t.uri);e&&(i={...n,dtdUri:e})}else e===`app.stop`&&r===n.appId&&(i=pc(n));i&&(f={...f,flutter:i},await m())},async recordFlutterExit(){!f.flutter||f.flutter.state===`stopped`||(f={...f,flutter:pc(f.flutter)},await m())},async close(){await p;try{JSON.parse(await z(u,`utf8`)).id===a&&await V(u,{force:!0})}catch(e){if(e.code!==`ENOENT`)throw e}}}}function fc(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 pc(e){return{...fc(e),state:`stopped`,...e.appId===void 0?void 0:{appId:e.appId},...e.supportsRestart===void 0?void 0:{supportsRestart:e.supportsRestart}}}function mc(e){return typeof e==`string`?e:void 0}function hc(e){return typeof e==`number`?e:void 0}const gc=`extension:dev`;function _c(e){if(!K(M(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=M(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.${gc} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function vc({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`,gc,...n.length>0?[`--`,...n]:[]]}const yc=[`web`,`webext`,`ios`,`android`,`macos`,`windows`,`linux`],bc=[`managed-dev-overlay`],xc=k.resolve(`node_modules`,`.bin`),Sc=G.platform===`win32`?`pnpm.cmd`:`pnpm`,Cc=G.platform===`win32`?`portless.cmd`:`portless`,wc=G.platform===`win32`?`react-router.cmd`:`react-router`,Tc=`Lost connection to device.`;async function Ec({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=Mt({env:r}),y=r.PATH??r.Path??``,b=zc(h)?h:void 0,x=Xt(i||a),S=Rc(_??r.COREFRAME_WEB_PORT),C,w,T,ee,te,ne,re,ie,ae,se,ce,le,de,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&&b===void 0)throw Error(`The --flutter-debug option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(a&&b===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`&&b===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.`);_c(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 pe=await v.measure(`routing`,()=>sc({cwd:e,env:r,platform:h}));pe&&await v.measure(`portless`,()=>cc({cwd:e,env:r,lan:u}));let A=b===void 0?h===`web`?S??await Dr.getAvailablePort():h===`webext`?S:void 0:S??await Dr.getAvailablePort(),j,M=new Promise(e=>{j=e}),N=()=>{E||(E=!0,j(),w?.kill(`SIGTERM`),ne?.kill(`SIGTERM`),re?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),ie?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),ae?.close().catch(()=>void 0),C?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),P().catch(()=>void 0))},P=()=>ee?(te??=ee[Symbol.asyncDispose](),te):Promise.resolve(),F=e=>{D??=e,N()},me=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>F(e);return G.on(e,t),{handler:t,signal:e}}),he=async e=>{let t=Xe(e);w=t;try{await t.expectSuccess()}catch(e){if(!E)throw e}finally{w===t&&(w=void 0)}};try{ce=b?Ht({path:k.resolve(e,`.leylines`,`logs.sqlite`)}):void 0;let i=h===`ios`||h===`android`?h:void 0,_=i?await gs({env:r,interactive:l,platform:i,target:n}):void 0;i&&_&&Zt({device:_,mode:x,platform:i});let S=b?ce?.logger({scope:`dev.flutter`,properties:{platform:b,..._?{deviceId:_.id}:void 0}}):void 0;se=i&&_&&A!==void 0?await vs({device:_,env:r,host:s,interactive:l,platform:i,port:A}):void 0;let w=se?.viteHost??(b?i?!0:`127.0.0.1`:s),te=A===void 0?void 0:`${c?`https`:`http`}://127.0.0.1:${A}`,D=b===void 0?te:se?.serverUrl??ys(b,void 0,A),j={},P=!1,F;[j,P]=await Promise.all([v.measure(`config`,()=>U({cwd:e})),v.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(d||l&&!p)&&await Ft(e))]),await v.measure(`i18n`,()=>Zn({cwd:e,projectConfig:j})),F=h!==`webext`&&Pr(e)?await Dr.getAvailablePort():void 0;let me=await v.measure(`https`,async()=>c&&!pe?Lt({cwd:e}):void 0),ge=ec(r,h),_e=W();O={...ge,[zt]:_e,...v.environment,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...!m&&h!==`webext`?{[Rt]:W()}:void 0,...b?{COREFRAME_PLATFORM:b,[Vt]:k.resolve(e,`.coreframe`,`managed-dev-flutter-restart`)}:void 0,...me?{[Nt]:me.cert,[Pt]:me.key}:void 0,...F?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${F}`}:void 0},te!==void 0&&D!==void 0&&(le=await dc({appOrigin:D,cwd:e,device:_,flutterMcp:a,flutterMode:b===void 0?void 0:x,id:_e,localOrigin:te,platform:h}));let ve=async()=>{if(!F)return;let t=Fr({cwd:e,env:O,port:F});ae=t;try{await t.listen(),await t.wait()}finally{await t.close(),ae===t&&(ae=void 0)}},ye=async()=>{let t=Ye({label:`web`}),n=Ye({color:`red`,label:`web`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),re=I(pe?Cc:wc,pe?lc({host:w,lan:u,port:A}):Lc({host:w,port:A,strictPort:h===`web`||b!==void 0}),{cwd:e,env:{...O,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[O.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:xc+k.delimiter+y},stdin:`inherit`});let r=Promise.allSettled([Nc(re.stdout,t),Nc(re.stderr,n)]);try{await re;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([Je(t),Je(n)]),re=void 0}},be=async()=>{let t=Ye({label:`webext`}),n=Ye({color:`red`,label:`webext`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),ie=I(Sc,vc({host:s,port:A}),{cwd:e,env:O,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(!E)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([Je(t),Je(n)]),ie=void 0}},xe=async t=>{let n,r,i=!1,s,c=$s(O[Vt],()=>{if(E||!n||!r||s||x!==`debug`&&i)return;let e=n,t=r;s=(async()=>{if(x===`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);S?.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);S?.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 fe():void 0,u=I(`flutter`,Qt({device:_??{id:h},flutterDriver:a,mode:x,serverUrl:D,verbose:g}),{cwd:k.join(e,`src-flutter`),env:Yt(ge,{noCodesign:f}),stdio:[`pipe`,`pipe`,`pipe`]}),d=new Gs({onEvent:async e=>{kc(e.params.message)&&(s=!0),await le?.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 At(t.stdin,`drain`)}}),p=e=>Oc(Ks(e,d),()=>s=!0);C=u,n=u,r=d;try{let e=!1;try{let e=c?c.capture(Mc(p(u),S,`output`)):Promise.all([jc(p(u.stdout),G.stdout,S,`stdout`),Dc(u.stderr,G.stderr,S,`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?`${Tc} 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??M);return}}finally{C===u&&(C=void 0),n===u&&(n=void 0),r===d&&(r=void 0),d.close(),le?.recordFlutterExit().catch(e=>{let t=e instanceof Error?e.message:String(e);S?.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(!E)throw Error(`The Vite development server stopped while Flutter was still running.`)});await ue({cwd:e});try{await Promise.race([t,xe(t)])}finally{N(),await Promise.allSettled([t,C]),C=void 0}},Ce=async()=>{let t=Xe({name:`panda`,command:Sc,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:O});ne=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{ne===t&&(ne=void 0)}},we=async()=>{if(h===`webext`){await be();return}let e=Ce(),t=Se(),n=F?ve():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),E&&await t}finally{N(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}};if(P&&(O={...O,[Bt]:`1`},r.COREFRAME_DEV_SUPERVISOR!==`0`&&(de=await v.measure(`supervisor`,()=>jt({cwd:e,env:r})))),E)return;if(h===`webext`){v.report(),await we();return}if(j.database?.dialect===`sqlite`&&(await v.measure(`database`,async()=>{let t=await oe({config:j,cwd:e,env:r,tursoOutput:G.stdout,useSupervisorLease:!0});ee=t,O={...O,...t.env}}),await v.measure(`schema`,()=>he({name:`db`,command:Sc,args:[`db`,`ensure`],cwd:e,env:O,prefix:!1})),E))return;if(Ic(j)){let t=Ye({label:`postgres`});t.pipe(G.stdout,{end:!1});try{let n=await v.measure(`database`,()=>Fc({config:j,cwd:e,env:O,failIfRunning:!0,interactive:l,isStopping:()=>E,postgresOutput:t,useSupervisorLease:!0}));if(!n)return;T=n,O={...O,...n.env};try{E||await v.measure(`schema`,()=>he({name:`db`,command:Sc,args:[`db`,`ensure`],cwd:e,env:O,prefix:!1})),E||(v.report(),await we())}finally{await n[Symbol.asyncDispose](),T===n&&(T=void 0)}}finally{t.end()}return}v.report(),await we()}finally{N(),await se?.close(),se=void 0;let e;try{await T?.[Symbol.asyncDispose]()}catch(t){e=t}finally{try{await P()}finally{try{await le?.close()}finally{de?.close(),ce?.close();for(let{handler:e,signal:t}of me)G.off(t,e)}}D&&(G.exitCode??=D===`SIGINT`?130:143)}Pc(e)}}async function Dc(e,t,n,r){for await(let i of Ac(e,n,r))t.write(`${i}\n`)||await At(t,`drain`)}async function*Oc(e,t){for await(let n of e)kc(n.message)&&t(),yield n}function kc(e){return typeof e==`string`&&e.trim()===Tc}async function*Ac(e,t,n){for await(let r of e){let e=le(r);e.message&&t?.write(e.level,e.message,{properties:{stream:n}}),yield r}}async function jc(e,t,n,r){for await(let i of Mc(e,n,r))t.write(`${i}\n`)||await At(t,`drain`)}async function*Mc(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 At(t,`drain`)}function Pc(e){if(e)throw e}async function Fc({interactive:e,isStopping:t,...n}){try{return await ae(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 se(r),t()?void 0:ae(n)}}function Ic(e){return(e.database?.dialect??`postgres`)===`postgres`}function Lc({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 Rc(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 zc(e){return e===`android`||e===`ios`||e===`linux`||e===`macos`||e===`windows`}async function Bc(e={}){let t=e.cwd??G.cwd(),n=`scripts/preview.ts`,r={},i=!0;try{await Ce(k.resolve(t,n))}catch(e){if(e.code===`ENOENT`)i=!1;else throw e}if(i){let e=await Pe(n,t);if(!e.default||typeof e.default!=`object`)throw Error(`scripts/preview.ts must default-export preview hooks.`);for(let t of[`beforeBuild`,`afterBuild`])if(e.default[t]!==void 0&&typeof e.default[t]!=`function`)throw Error(`scripts/preview.ts ${t} must be a function.`);r=e.default}let a=r.afterBuild;return r={...r,async afterBuild(e){await a?.(e);for(let n of await Vr({cwd:t}))await e.stageArtifact({label:n.label,pathname:`/__preview/extensions/${k.basename(n.path)}`,source:n.path})}},Gt({...e,cwd:t},r)}const Vc=`# coreframe secrets: managed start`,Hc=`# coreframe secrets: managed end`,Uc=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/u;async function Wc({cwd:e=process.cwd(),env:t=process.env,force:n=!1}={}){let r=await U({cwd:e});if(!r.secrets?.adapter)throw Error(`coreframe.config.ts does not configure a secrets adapter.`);await Gc(e);let i=await Ie({config:r,cwd:e,env:t,target:`development`}),a=k.resolve(e,`.env`),o=await nl(a),{managed:s,user:c}=Kc(o),l=qc(c),u=Object.keys(i).filter(e=>l.has(e)).sort();if(u.length>0&&!n)throw Error(`Refusing to replace existing .env values: ${u.join(`, `)}. Re-run with --force to replace them.`);let d=tl(n?Jc(c,new Set(u)):c,$c(i));return d===o&&s!==void 0?(await il(a),Object.keys(i).sort()):(await rl(a,d),Object.keys(i).sort())}async function Gc(e){try{await I(`git`,[`check-ignore`,`--quiet`,`.env`],{cwd:e,stdin:`ignore`,stdout:`ignore`,stderr:`ignore`})}catch{throw Error(`Refusing to write development secrets because ".env" is not git-ignored. Add .env to .gitignore.`)}}function Kc(e){let t=Yc(e),n=e.match(/.*(?:\r?\n|$)/gu)??[],r=[],i=0;for(let e of n){let n=e.replace(/\r?\n$/u,``);(n===Vc||n===Hc)&&(t.some(e=>i>=e.start&&i<e.end)||r.push({end:i+e.length,kind:n===Vc?`start`:`end`,start:i})),i+=e.length}let a=r.filter(e=>e.kind===`start`),o=r.filter(e=>e.kind===`end`);if(a.length===0&&o.length===0)return{managed:void 0,user:e};if(a.length!==1||o.length!==1||o[0].start<a[0].start)throw Error(`The Coreframe-managed secrets section in .env is malformed.`);let s=a[0].start,c=o[0].end;return{managed:e.slice(s,c),user:e.slice(0,s)+e.slice(c)}}function qc(e){return new Set(Yc(e).map(e=>e.name))}function Jc(e,t){let n=e;for(let r of Yc(e).filter(e=>t.has(e.name)).reverse())n=n.slice(0,r.start)+n.slice(r.end);return n}function Yc(e){let t=e.match(/.*(?:\r?\n|$)/gu)??[],n=[],r=0,i,a;for(let e of t)if(e){if(a)i&&Zc(e,i,!1)&&(n.push({...a,end:r+e.length}),a=void 0,i=void 0);else{let t=Uc.exec(e);if(t?.[1]){a={name:t[1],start:r};let o=e.slice(t[0].length);i=Xc(o),(!i||Zc(o,i,!0))&&(n.push({...a,end:r+e.length}),a=void 0,i=void 0)}}r+=e.length}if(a)throw Error(`Existing .env value ${a.name} has an unterminated quoted value.`);return n}function Xc(e){let t=e.trimStart()[0];return t===`'`||t===`"`||t==="`"?t:void 0}function Zc(e,t,n){let r=!n;for(let n=0;n<e.length;n+=1)if(e[n]===t){if(!r){r=!0;continue}if(t!==`"`||Qc(e,n)%2==0)return!0}return!1}function Qc(e,t){let n=0;for(;t-n-1>=0&&e[t-n-1]===`\\`;)n+=1;return n}function $c(e){let t=Object.entries(e).sort(([e],[t])=>e.localeCompare(t));return t.length===0?``:`${Vc}\n${t.map(([e,t])=>`${e}=${el(t)}\n`).join(``)}${Hc}\n`}function el(e){if(!e.includes(`'`))return`'${e}'`;if(!e.includes("`"))return`\`${e}\``;if(!e.includes(`"`)&&!/[\\\n\r]/u.test(e))return`"${e}"`;throw Error(`A development secret cannot be represented safely in .env.`)}function tl(e,t){let n=e.replace(/[\r\n]+$/u,``);return t?n?`${n}\n\n${t}`:t:n?`${n}\n`:``}async function nl(e){try{return await z(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return``;throw e}}async function rl(e,t){let n=`${e}.${process.pid}.${W()}.tmp`;try{await H(n,t,{flag:`wx`,mode:384}),await B(n,e)}finally{await V(n,{force:!0})}await il(e)}async function il(e){process.platform!==`win32`&&await we(e,384)}const al=`worker-configuration.d.ts`;async function ol({check:e=!1,cwd:t=process.cwd()}={}){let n=await U({cwd:t}),r=await ut({coreframeConfig:n,cwd:t}),i=P(t,al),a=P(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 sl(e),e}let o=cl(await z(a,`utf8`)),s=Le(r.config),c=Fe(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${ll(c)}\n`;if(e){if(await z(i,`utf8`).catch(()=>``)!==l)throw Error(`${al} 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 V(a,{force:!0})}}function sl(e){if(typeof e!=`object`||!e||!(`output`in e))return;let{output:t}=e;typeof t!=`string`||t===``||process.stderr.write(t.endsWith(`
18
+ `)?t:`${t}\n`)}function cl(e){return e.split(/\r?\n/).filter(e=>!e.startsWith(`// Generated by Wrangler by running `)).join(`
19
+ `)}function ll(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(`
20
+ `)}const ul=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),dl=[`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`,`react-router.config.ts`,`src/web`],fl=[`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`],pl=[`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`],ml=`.coreframe/typegen.json`,hl=[`web`,`dashboard`,`worker`];async function gl({checkWorker:e=!1,cwd:t=G.cwd(),runners:n={}}={}){let r=await bl(t)??{generators:{},schemaVersion:1},i=[];return i.push(await vl({cwd:t,inputPaths:dl,name:`web`,outputPath:`.react-router`,run:()=>(n.web??yl)(t),state:r})),i.push(await vl({cwd:t,inputPaths:fl,name:`dashboard`,outputPath:`dashboard/.react-router`,run:()=>(n.dashboard??Sr)(t),state:r})),i.push(await vl({cwd:t,inputPaths:pl,name:`worker`,outputPath:`worker-configuration.d.ts`,run:()=>(n.worker??ol)({check:e,cwd:t}),state:r})),i}function _l(e){return`${{dashboard:`Dashboard route types`,web:`Web route types`,worker:`Worker types`}[e.name]} ${e.changed?`generated`:`unchanged`}.`}async function vl({cwd:e,inputPaths:t,name:n,outputPath:r,run:i,state:a}){let o=await Sl(e,t),s=await Cl(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 Cl(e,r);if(!l)throw Error(`Coreframe ${n} typegen did not produce ${r}.`);return a.generators[n]={inputFingerprint:o,outputFingerprint:l},await xl(e,a),{changed:s!==l,name:n,ran:!0}}async function yl(e){let t=G.platform===`win32`?`react-router.cmd`:`react-router`,n=G.env;await I(t,[`typegen`],{cwd:e,env:{...n,PATH:k.resolve(e,`node_modules/.bin`)+k.delimiter+(n.PATH??n.Path??``)},stdio:`inherit`})}async function bl(e){try{let t=JSON.parse(await z(k.resolve(e,ml),`utf8`));if(!Dl(t)||t.schemaVersion!==1)return;let n={};if(!Dl(t.generators))return;for(let e of hl){let r=t.generators[e];Dl(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 xl(e,t){let n=k.resolve(e,ml);await R(k.dirname(n),{recursive:!0}),await H(n,`${JSON.stringify(t)}\n`,{mode:384})}async function Sl(e,t){let n=Re(`sha256`);for(let r of[...t].sort()){let t=k.resolve(e,r),i=await Tl(t);if(!i){n.update(`missing:${r}\0`);continue}if(i.isDirectory()){n.update(`directory:${r}\0`);for(let r of await wl(t)){let i=k.join(t,r),a=k.relative(e,i).split(k.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 Cl(e,t){if(await Tl(k.resolve(e,t)))return Sl(e,[t])}async function wl(e){let t=[];async function n(e,r){let i=await Oe(e,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i)if(a.isDirectory()){if(ul.has(a.name))continue;await n(k.join(e,a.name),k.join(r,a.name))}else a.isFile()&&t.push(k.join(r,a.name))}return await n(e,``),t.sort()}async function Tl(e){try{return await ke(e)}catch(e){if(El(e))return;throw e}}function El(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}function Dl(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Ol=k.resolve(`node_modules`,`.bin`);G.env.PATH=Ol+k.delimiter+G.env.PATH;const kl=G.platform===`win32`?`tsc.cmd`:`tsc`,Al=[{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 jl(){await gl({checkWorker:!0});let e=[];for(let t of Al)try{await Ce(t.path),e.push(t)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let t=e.map(e=>Xe({name:e.name,command:kl,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 Ml=r(s(bc),{displayName:`feature`,from:async e=>e}),Nl=r(s(Jt),{displayName:`filtered|full`,from:async e=>e}),Pl=[`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.`],Fl=n({name:`deploy`,args:{environment:u({type:s(it),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})=>Go([e,...t?[`--run-migrations`]:[],...n?[`--skip-migrations`]:[],...r?[`--skip-post-deploy-checks`]:[],...i?[`--yes`]:[]])}),Il=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 vt();if(e){console.log(JSON.stringify({...t,notices:Pl}));return}console.log(t.url),console.error(`Staging hostname reassigned. ${Pl.join(` `)}`)}}),url:n({name:`url`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await ot();console.log(e?JSON.stringify({url:t}):t)}})}}),Ll=m({name:`secrets`,cmds:{pull:n({name:`pull`,args:{force:i({long:`force`,description:`Replace existing .env values also supplied by the configured provider.`,defaultValue:()=>!1})},handler:async({force:e})=>{let t=await Wc({force:e});console.log(t.length>0?`Refreshed ${t.length} development secrets in .env.`:`Removed the empty managed secrets section from .env.`)}}),"rotate-access-token":n({name:`rotate-access-token`,args:{environment:u({type:s(it),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 St({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(it)),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 st({environment:e});console.log(t?JSON.stringify(n):Ul(n))}}),set:n({name:`set`,args:{environment:u({type:s(it),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 pt({environment:e,name:t,value:await Wl(t)}),console.log(`Queued ${t} for ${e}. Run coreframe deploy ${e} to apply.`);return}let r=await ht(),i=n?await Kl(r):await Gl(r,e);await mt({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(it),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 at({environment:e,name:t});console.log(n?`Discarded the queued ${t} update for ${e}.`:`No ${t} update is queued for ${e}.`)}})}}),Rl=n({name:`typecheck`,args:{},handler:jl}),zl=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 ol({check:e});console.log(e?`${Jl(t.path)} is current.`:`${Jl(t.path)} ${t.changed?`generated`:`is unchanged`}.`)}})}}),Bl=n({name:`dev`,args:{debug:c({long:`debug`,type:l(Ml),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:Nl,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(yc)),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=Vl({device:t,flutterDebug:n,platform:f,simulator:m});return Ec({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 Vl({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 Hl=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})=>Bc({host:e,port:t})});function Ul(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(`
21
+ `)}async function Wl(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 Gl(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 Kl(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 ql();if(L.isCancel(t))throw L.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);let{ignoredNames:n,values:r}=dt(t,e);return n.length>0&&L.log.info(`Ignored non-secret or undeclared names: ${n.join(`, `)}.`),r}async function ql(){let e=``;for await(let t of G.stdin)e+=t.toString();return e}function Jl(e){return e.split(/[\\/]/).at(-1)??e}const Yl=n({name:`typegen`,description:`Generate Coreframe route and Worker type declarations.`,args:{},handler:async()=>{let e=await gl();for(let t of e)console.log(_l(t))}});function Xl(e,{formatMessage:t,temporaryDirectory:n=Me(),write:r=e=>console.error(e)}={}){let i=nu(e),a=au(Ql(e,t),i);try{let t=M(He(M(n,`coreframe-error-`)),`error.log`);return qe(t,`${au($l(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 Zl(t,n={}){let r=typeof t==`function`?t:()=>e.run(e.binary(t),process.argv),i=!1,a=e=>{i||(i=!0,Xl(e,n),process.exit(1))};process.once(`uncaughtException`,a),process.once(`unhandledRejection`,a),Promise.resolve().then(r).catch(a)}function Ql(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 $l(e){try{let t=eu(e);if(!(e instanceof Error)||!tu(t))return Ot(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${Ot(t,{customInspect:!1,depth:10})}`:``}`}catch{return`The thrown value could not be inspected.`}}function eu(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:eu(a.value,t),writable:!0})}return i}function tu(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function nu(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`?ru(t.value,n):r(t.value))}}}try{r(e)}catch{}return n}function ru(e,t){if(!(typeof e!=`object`||!e))for(let n of Reflect.ownKeys(e)){let r=Object.getOwnPropertyDescriptor(e,n);typeof n==`string`&&iu(n)&&r&&`value`in r&&typeof r.value==`string`&&r.value&&t.add(r.value)}}function iu(e){return/(?:^|_)(?:AUTH|CERT|COOKIE|CREDENTIALS?|DATABASE_URL|DSN|KEY|PASS(?:WORD)?|PRIVATE|SECRET|SESSION|TOKEN)(?:_|$)/i.test(e)}function au(e,t){return[...t].sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[redacted environment value]`),e)}const ou=m({name:`coreframe`,cmds:{build:fn,dashboard:Rr,assets:_r,flutter:vr,i18n:yr,jobs:Ii,deploy:Fl,extension:vi,staging:Il,secrets:Ll,typegen:Yl,typecheck:Rl,worker:zl,dev:Bl,preview:Hl,upgrade:Vo,recipes:Ho,db:Uo}});import.meta.main&&Zl(ou,{formatMessage:process.argv[2]===`db`?x:void 0});export{ou as coreframeCli};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coreframe/scripts",
3
- "version": "0.2.34-next.3",
3
+ "version": "0.2.34-next.4",
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.2",
33
- "@coreframe/config": "^0.1.15-next.2",
34
- "@coreframe/db": "^0.1.20-next.2",
35
- "@coreframe/deploy": "^0.1.15-next.2",
36
- "@coreframe/dev": "^0.1.23-next.2",
32
+ "@coreframe/assets": "^0.1.18-next.3",
33
+ "@coreframe/config": "^0.1.15-next.3",
34
+ "@coreframe/db": "^0.1.20-next.3",
35
+ "@coreframe/deploy": "^0.1.15-next.3",
36
+ "@coreframe/dev": "^0.1.23-next.3",
37
37
  "@coreframe/dev-contracts": "^0.1.10-next.1",
38
- "@coreframe/flutter-tools": "^0.1.25-next.3",
39
- "@coreframe/preview": "^0.1.20-next.2",
38
+ "@coreframe/flutter-tools": "^0.1.25-next.4",
39
+ "@coreframe/jobs": "^0.1.2-next.1",
40
40
  "@coreframe/object-storage": "^0.1.5-next.0",
41
- "@coreframe/jobs": "^0.1.2-next.1"
41
+ "@coreframe/preview": "^0.1.20-next.3"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/node": "^26.1.0",