@coreframe/vite 0.3.0-next.4 → 0.3.1

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.
@@ -7,16 +7,17 @@ type DevJobsResponse = {
7
7
  };
8
8
  type CoreframeDevJobsPluginOptions = {
9
9
  env?: NodeJS.ProcessEnv;
10
+ intervalMs?: number;
10
11
  post?: (input: {
11
12
  port: number;
12
13
  secure: boolean;
13
- signal: AbortSignal;
14
14
  token: string;
15
15
  }) => Promise<DevJobsResponse>;
16
- wait?: (milliseconds: number, signal: AbortSignal) => Promise<void>;
16
+ wait?: (milliseconds: number) => Promise<void>;
17
17
  };
18
18
  declare function coreframeDevJobsPlugin({
19
19
  env,
20
+ intervalMs,
20
21
  post,
21
22
  wait
22
23
  }?: CoreframeDevJobsPluginOptions): Plugin;
@@ -1 +1 @@
1
- import{request as e}from"node:http";import{request as t}from"node:https";import{devJobsEnv as n,devJobsPath as r,devJobsTokenHeader as i}from"@coreframe/dev-contracts/dev-jobs";function a({env:e=process.env,post:t=l,wait:r=u}={}){let i=e[n];return{apply:`serve`,name:`coreframe:dev-jobs`,configureServer(e){if(!i)return;let n=new AbortController;e.httpServer?.once(`listening`,()=>{let a=e.httpServer?.address();if(!a||typeof a==`string`){e.config.logger.warn(`Coreframe dev jobs could not determine the Vite server port.`);return}o({logger:e.config.logger,port:a.port,post:t,secure:!!e.config.server.https,signal:n.signal,token:i,wait:r})}),e.httpServer?.once(`close`,()=>{n.abort()})}}}async function o(e){for(;!e.signal.aborted;)await s(e),e.signal.aborted||await e.wait(6e4,e.signal)}async function s({logger:e,port:t,post:n,secure:r,signal:i,token:a,wait:o}){for(let s=1;s<=20;s+=1){if(i.aborted)return;try{let o=await n({port:t,secure:r,signal:i,token:a});if(i.aborted)return;if(o.statusCode>=200&&o.statusCode<300){c(o.body)&&e.info(`Coreframe development jobs checked.`);return}if(o.statusCode!==404&&o.statusCode!==502&&o.statusCode!==503){e.warn(`Coreframe development jobs failed with HTTP ${o.statusCode}. Retrying in one minute.`);return}}catch(t){if(i.aborted)return;if(s===20){let n=t instanceof Error?t.message:String(t);e.warn(`Coreframe development jobs are temporarily unavailable: ${n}. Retrying in one minute.`);return}}s<20&&await o(250,i)}e.warn(`Coreframe development jobs did not become available. Retrying in one minute.`)}function c(e){if(!e)return!1;try{let t=JSON.parse(e);return typeof t==`object`&&!!t&&`results`in t&&Array.isArray(t.results)&&t.results.length>0}catch{return!1}}function l({port:n,secure:a,signal:o,token:s}){return new Promise((c,l)=>{let u=(a?t:e)({hostname:`127.0.0.1`,method:`POST`,path:r,port:n,signal:o,...a?{rejectUnauthorized:!1}:void 0,headers:{[i]:s,"content-length":`0`}},e=>{let t=``;e.setEncoding(`utf8`),e.on(`data`,e=>{t+=e}),e.on(`end`,()=>{c({body:t,statusCode:e.statusCode??500})})});u.on(`error`,l),u.end()})}function u(e,t){return t.aborted?Promise.resolve():new Promise(n=>{let r=()=>{clearTimeout(i),t.removeEventListener(`abort`,r),n()},i=setTimeout(r,e);t.addEventListener(`abort`,r,{once:!0})})}export{a as coreframeDevJobsPlugin};
1
+ import{request as e}from"node:http";import{request as t}from"node:https";import{devJobsEnv as n,devJobsPath as r,devJobsTokenHeader as i}from"@coreframe/dev-contracts/dev-jobs";function a({env:e=process.env,intervalMs:t=3e4,post:r=s,wait:i=c}={}){let a=e[n];return{apply:`serve`,name:`coreframe:dev-jobs`,configureServer(e){if(!a)return;let n=!1,s=async()=>{for(;!n;){let s=e.httpServer?.address();if(!s||typeof s==`string`){e.config.logger.warn(`Coreframe dev jobs could not determine the Vite server port.`);return}await o({logger:e.config.logger,port:s.port,post:r,secure:!!e.config.server.https,token:a,wait:i,isClosed:()=>n}),n||await i(t)}};e.httpServer?.once(`listening`,()=>{s()}),e.httpServer?.once(`close`,()=>{n=!0})}}}async function o({isClosed:e,logger:t,port:n,post:r,secure:i,token:a,wait:o}){for(let s=1;s<=20;s+=1){if(e())return;try{let e=await r({port:n,secure:i,token:a});if(e.statusCode>=200&&e.statusCode<300){t.info(`Coreframe development jobs checked.`);return}if(e.statusCode!==404&&e.statusCode!==502&&e.statusCode!==503){t.warn(`Coreframe development jobs failed with HTTP ${e.statusCode}.`);return}}catch(e){if(s===20){let n=e instanceof Error?e.message:String(e);t.warn(`Coreframe development jobs could not start: ${n}`);return}}await o(250)}t.warn(`Coreframe development jobs did not become available.`)}function s({port:n,secure:a,token:o}){return new Promise((s,c)=>{let l=(a?t:e)({hostname:`127.0.0.1`,method:`POST`,path:r,port:n,...a?{rejectUnauthorized:!1}:void 0,headers:{[i]:o,"content-length":`0`}},e=>{let t=``;e.setEncoding(`utf8`),e.on(`data`,e=>{t+=e}),e.on(`end`,()=>{s({body:t,statusCode:e.statusCode??500})})});l.on(`error`,c),l.end()})}function c(e){return new Promise(t=>{setTimeout(t,e).unref()})}export{a as coreframeDevJobsPlugin};
@@ -6,8 +6,7 @@ type CoreframeDevelopmentControlsPluginOptions = {
6
6
  env?: NodeJS.ProcessEnv;
7
7
  };
8
8
  declare function coreframeDevelopmentControlsPlugin({
9
- enabled,
10
- env
9
+ enabled
11
10
  }?: CoreframeDevelopmentControlsPluginOptions): Plugin;
12
11
  //#endregion
13
12
  export { CoreframeDevelopmentControlsPluginOptions, coreframeDevelopmentControlsPlugin };
@@ -1 +1 @@
1
- import{mkdir as e,writeFile as t}from"node:fs/promises";import n from"node:path";import{randomUUID as r}from"node:crypto";import{developmentControlsEvents as i}from"@coreframe/dev-contracts/development-controls";import{managedDevFlutterRestartFileEnv as a}from"@coreframe/dev-contracts/managed-dev";function o({enabled:o=!0,env:s=process.env}={}){return{name:`coreframe:development-controls`,apply:`serve`,configureServer(c){if(!o)return;let l=!1,u=async(o,u)=>{if(l){u.send(i.actionResult,{error:o.action.type===`restart-flutter`?`A Flutter restart is already in progress.`:`A Vite restart is already in progress.`,requestId:o.requestId,state:`error`});return}l=!0,u.send(i.actionResult,{requestId:o.requestId,state:`busy`});try{if(o.action.type===`restart-flutter`){let i=s[a];if(!i)throw Error(`Flutter restart is unavailable for this development server.`);await e(n.dirname(i),{recursive:!0}),await t(i,`${r()}\n`,{mode:384})}else await c.restart();l=!1,u.send(i.actionResult,{requestId:o.requestId,state:`complete`})}catch(e){l=!1;let t=e instanceof Error?e.message:String(e),n=o.action.type===`restart-flutter`?`Flutter`:`Vite`;c.config.logger.error(`Coreframe ${n} restart failed: ${t}`,{error:e instanceof Error?e:void 0}),u.send(i.actionResult,{error:t,requestId:o.requestId,state:`error`})}};c.ws.on(i.action,u),c.httpServer?.once(`close`,()=>{c.ws.off(i.action,u)})}}}export{o as coreframeDevelopmentControlsPlugin};
1
+ import{developmentControlsEvents as e}from"@coreframe/dev-contracts/development-controls";function t({enabled:t=!0}={}){return{name:`coreframe:development-controls`,apply:`serve`,configureServer(n){if(!t)return;let r=!1,i=async(t,i)=>{if(r){i.send(e.actionResult,{error:`A Vite restart is already in progress.`,requestId:t.requestId,state:`error`});return}r=!0,i.send(e.actionResult,{requestId:t.requestId,state:`busy`});try{await n.restart(),r=!1,i.send(e.actionResult,{requestId:t.requestId,state:`complete`})}catch(a){r=!1;let o=a instanceof Error?a.message:String(a);n.config.logger.error(`Coreframe Vite restart failed: ${o}`,{error:a instanceof Error?a:void 0}),i.send(e.actionResult,{error:o,requestId:t.requestId,state:`error`})}};n.ws.on(e.action,i),n.httpServer?.once(`close`,()=>{n.ws.off(e.action,i)})}}}export{t as coreframeDevelopmentControlsPlugin};
@@ -2,7 +2,7 @@ import { ConfigEnv, PluginOption } from "vite";
2
2
  import { ShellPlatform } from "@coreframe/lib/shell";
3
3
 
4
4
  //#region plugins/index.d.ts
5
- type CoreframeHost = "browser" | "flutter";
5
+ type CoreframeHost = "browser";
6
6
  type CoreframePlatform = ShellPlatform;
7
7
  type CoreframeRunner = "vite" | "vitest" | "react-router-prerender";
8
8
  type CoreframeConfigEnv = ConfigEnv & {
@@ -14,7 +14,7 @@ type PluginFilter = (env: CoreframeConfigEnv) => boolean;
14
14
  type PluginSelector = (env: CoreframeConfigEnv) => PluginOption;
15
15
  type SelectablePlugin = PluginOption | PluginSelector;
16
16
  declare function extendConfigEnv(env: ConfigEnv, processEnv?: NodeJS.ProcessEnv): CoreframeConfigEnv;
17
- declare function resolveCoreframeHost(processEnv?: NodeJS.ProcessEnv, platform?: CoreframePlatform): CoreframeHost;
17
+ declare function resolveCoreframeHost(processEnv?: NodeJS.ProcessEnv): CoreframeHost;
18
18
  declare function resolveCoreframeRunner(processEnv?: NodeJS.ProcessEnv): CoreframeRunner;
19
19
  declare function resolveCoreframePlatform(processEnv?: NodeJS.ProcessEnv): CoreframePlatform;
20
20
  declare function selectPlugins(env: CoreframeConfigEnv, plugins: readonly SelectablePlugin[]): PluginOption[];
@@ -1 +1 @@
1
- function e(e,i=process.env){let a=r(i);return{...e,host:t(i,a),platform:a,runner:n(i)}}function t(e=process.env,t=r(e)){return t===`web`?`browser`:`flutter`}function n(e=process.env){return e.VITEST===`true`?`vitest`:e.IS_RR_BUILD_REQUEST===`yes`?`react-router-prerender`:`vite`}function r(e=process.env){let t=e.COREFRAME_PLATFORM??`web`,n=t===`darwin`?`macos`:t===`win32`?`windows`:t;if(n!==`web`&&n!==`ios`&&n!==`android`&&n!==`macos`&&n!==`windows`&&n!==`linux`)throw Error(`Unsupported Coreframe platform: ${JSON.stringify(t)}.`);return n}function i(e,t){return t.map(t=>u(e,t))}function a(e,t){return n=>e(n)?u(n,t):null}function o(e){return a(e=>e.command===`build`,e)}function s(e){return a(e=>e.command===`serve`,e)}function c(e,t){return a(t=>d(e,t.runner),t)}function l(e,t){return a(t=>!d(e,t.runner),t)}function u(e,t){return typeof t==`function`?t(e):t}function d(e,t){return(typeof e==`string`?[e]:e).includes(t)}export{a as apply,o as buildOnly,s as devOnly,l as exceptRunner,e as extendConfigEnv,t as resolveCoreframeHost,r as resolveCoreframePlatform,n as resolveCoreframeRunner,c as runnerOnly,i as selectPlugins};
1
+ function e(e,i=process.env){let a=r(i);return{...e,host:t(i),platform:a,runner:n(i)}}function t(e=process.env){return r(e),`browser`}function n(e=process.env){return e.VITEST===`true`?`vitest`:e.IS_RR_BUILD_REQUEST===`yes`?`react-router-prerender`:`vite`}function r(e=process.env){let t=e.COREFRAME_PLATFORM??`web`,n=t;if(n!==`web`)throw Error(`Unsupported Coreframe platform: ${JSON.stringify(t)}.`);return n}function i(e,t){return t.map(t=>u(e,t))}function a(e,t){return n=>e(n)?u(n,t):null}function o(e){return a(e=>e.command===`build`,e)}function s(e){return a(e=>e.command===`serve`,e)}function c(e,t){return a(t=>d(e,t.runner),t)}function l(e,t){return a(t=>!d(e,t.runner),t)}function u(e,t){return typeof t==`function`?t(e):t}function d(e,t){return(typeof e==`string`?[e]:e).includes(t)}export{a as apply,o as buildOnly,s as devOnly,l as exceptRunner,e as extendConfigEnv,t as resolveCoreframeHost,r as resolveCoreframePlatform,n as resolveCoreframeRunner,c as runnerOnly,i as selectPlugins};
@@ -11,14 +11,18 @@ type ManagedDevSupervisorConnector = (options: {
11
11
  type CoreframeManagedDevPluginOptions = {
12
12
  connectSupervisor?: ManagedDevSupervisorConnector;
13
13
  env?: NodeJS.ProcessEnv;
14
+ projectRoot?: string;
14
15
  recoverSupervisor?: ManagedDevSupervisorConnector;
15
16
  startSession?: typeof startManagedDevSession;
17
+ supervisorOnly?: boolean;
16
18
  };
17
19
  declare function coreframeManagedDevPlugin({
18
20
  connectSupervisor,
19
21
  env,
22
+ projectRoot,
20
23
  recoverSupervisor,
21
- startSession
24
+ startSession,
25
+ supervisorOnly
22
26
  }?: CoreframeManagedDevPluginOptions): Plugin;
23
27
  //#endregion
24
28
  export { CoreframeManagedDevPluginOptions, coreframeManagedDevPlugin };
@@ -1 +1 @@
1
- import{mkdir as e,writeFile as t}from"node:fs/promises";import n from"node:path";import{readProjectConfig as r}from"@coreframe/config";import{randomUUID as i}from"node:crypto";import{managedDevEnv as a,managedDevEvents as o,managedDevFlutterRestartFileEnv as s,managedDevSupervisorRecoveryErrorPrefix as c}from"@coreframe/dev-contracts/managed-dev";import{startManagedDevSession as l}from"@coreframe/dev/managed-dev";import{connectDevSupervisor as u,connectExistingDevSupervisor as d}from"@coreframe/dev/supervisor";const f=Symbol.for(`@coreframe/vite/managed-dev-session-states`),p=(()=>{let e=globalThis;return e[f]??=new Map})(),m=[100,500,2e3];function h({connectSupervisor:f,env:p=process.env,recoverSupervisor:h,startSession:v=l}={}){let x=p[a]===`1`,S=f??d,C=h??f??u,w,T,E,D,O,k,A,j,M,N=!1,P=!1,F=!1,I=!1,L=!1,R=new Map,z={mode:`waiting`,warnings:[]},B=()=>{let e=T;return D?.(),D=void 0,O?.(),O=void 0,T=void 0,E=void 0,e},V=()=>M??=(async()=>{L=!0,await A,await j,I=!1;let e=w,t=T,n=E;w=void 0,B(),e&&k&&await _(k,e),t&&(n&&await t.release(n).catch(()=>void 0),t.close())})();return{name:`coreframe:managed-dev`,apply:`serve`,config(){return{define:{"import.meta.env.COREFRAME_MANAGED_DEV":JSON.stringify(x)}}},configureServer(a){if(!x)return;let l=a.config.root;k=l;let u=!1,d=!1,f=()=>w?.getStatus()??z,h=()=>{L||a.ws.send(o.status,{status:f()})},M=()=>{d||L||(d=!0,queueMicrotask(()=>{d=!1,Promise.resolve(a.restart()).catch(e=>{let t=e instanceof Error?e.message:String(e);a.config.logger.error(`Coreframe managed development restart failed: ${t}`,{error:e instanceof Error?e:void 0})})}))},H=(e,t)=>{if(L||T!==e||!I||t.event!==`managed-dev`)return;if(t.kind===`status`){z=t.status,h();return}if(t.kind===`restart`){u=!0,R.size===0&&(u=!1,M());return}let n=R.get(t.requestId);!n||!t.codex||typeof t.codex!=`object`||n.send(o.codex,{...t.codex,requestId:t.requestId})},U=async e=>{let t,n=!1,r=e.onEvent(t=>H(e,t)),i=e.onClose(t=>{n=!0,!L&&T===e&&P&&!F&&!j&&(I=!1,W(t))});T=e,D=r,O=i;try{await e.subscribe([`managed-dev`]);let r=await e.acquireManagedDev({env:p});if(t=r.leaseId,n||L||T!==e)throw Error(`The development supervisor disconnected while managed development was attaching.`);E=r.leaseId,z=r.status,I=!0,P=!0,h()}catch(n){throw T===e?B():(r(),i()),t&&await e.release(t).catch(()=>void 0),e.close(),n}};function W(e,t=!1){if(L||!P)return Promise.resolve();if(j)return j;I=!1,N=!1,B()?.close(),z={message:t?`Managed development supervisor retrying connection.`:`Managed development supervisor disconnected. Reconnecting…`,mode:`waiting`,warnings:[]},h();let n=(async()=>{let t=e;for(let e=0;e<4;e+=1){if(L||(e>0&&await new Promise(t=>setTimeout(t,m[e-1]??2e3)),L))return;try{let e=await C({cwd:l,env:p,requiredResources:[`managed-dev`]});if(!e)throw Error(`No managed development supervisor is available.`);if(L){e.close();return}await U(e),N=!1;return}catch(n){t=n;let r=y(n);a.config.logger.error(`Coreframe managed development supervisor recovery attempt ${e+1} failed: ${r}`,{error:n instanceof Error?n:void 0}),e+1<4&&(z={message:`Managed development supervisor recovery is retrying (${e+2}/4).`,mode:`waiting`,warnings:[]},h())}}if(L)return;let n=y(t),r=`${c}4 attempts: ${n} Retry to reconnect managed development.`;N=!0,z={message:r,mode:`error`,warnings:[r]},a.config.logger.error(`Coreframe managed development supervisor recovery failed: ${n}`,{error:t instanceof Error?t:void 0}),h()})();return j=n,n.then(()=>{j===n&&(j=void 0)},()=>{j===n&&(j=void 0)}),n}let G=(e,t)=>{P&&T===e&&b(t)&&(I=!1,W(t))},K=async(e,t)=>{let n=T;if(n&&I)try{z=(await n.managedDevStatus()).status}catch(e){let t=e instanceof Error?e.message:String(e);a.config.logger.error(`Coreframe managed development status failed: ${t}`,{error:e instanceof Error?e:void 0}),G(n,e)}t.send(o.status,{status:f()})},q=async(e,t)=>{if(e.action.type===`retry-supervisor`){try{if(!P||!N)throw Error(`Managed development supervisor recovery is not available.`);await W(void 0,!0);let n=f();if(N)throw Error(n.message??`Managed development supervisor recovery failed.`);t.send(o.actionResult,{requestId:e.requestId,status:n})}catch(n){let r=y(n);a.config.logger.error(`Coreframe managed development action failed: ${r}`,{error:n instanceof Error?n:void 0}),t.send(o.actionResult,{error:r,requestId:e.requestId,status:f()})}return}let n;try{if(!I)throw Error(`Managed development is still initializing.`);let n=T;if(n){R.set(e.requestId,t);try{let r=await n.managedDevAction({action:e.action,requestId:e.requestId});r.status&&(z=r.status),t.send(o.actionResult,{...r,requestId:e.requestId}),!r.error&&u&&(u=!1,M())}catch(e){throw G(n,e),e}finally{R.delete(e.requestId)}return}let r=w;if(!r)throw Error(`Managed development is still initializing.`);let i=await r.action(e.action,{onCodexEvent:n=>t.send(o.codex,{...n,requestId:e.requestId})});t.send(o.actionResult,{requestId:e.requestId,...i}),u&&(u=!1,queueMicrotask(()=>{V().then(()=>a.restart()).catch(e=>{let t=e instanceof Error?e.message:String(e);a.config.logger.error(`Coreframe managed development restart failed: ${t}`,{error:e instanceof Error?e:void 0})})}));return}catch(e){n=e}let r=n instanceof Error?n.message:String(n);a.config.logger.error(`Coreframe managed development action failed: ${r}`,{error:n instanceof Error?n:void 0}),t.send(o.actionResult,{error:r,requestId:e.requestId,status:f()})};a.ws.on(o.statusRequest,K),a.ws.on(o.action,q),A=(async()=>{let o,c;try{if(F=!0,o=await S({cwd:l,env:p,requiredResources:[`managed-dev`]}),o){if(L){o.close();return}await U(o);return}let d=await r({cwd:l});if(L)return;if(c=await v({config:d,cwd:l,env:p,onRestart:()=>{u=!0},onFlutterRestart:async()=>{let r=p[s];if(r)try{await e(n.dirname(r),{recursive:!0}),await t(r,`${i()}\n`,{mode:384})}catch(e){let t=e instanceof Error?e.message:String(e);a.config.logger.error(`Coreframe Flutter restart request failed: ${t}`,{error:e instanceof Error?e:void 0})}},onStatusChange:e=>{z=e,h()}}),w=c,z=c.getStatus(),L){w=void 0,await c.close();return}if(await g(l,c),L){w=void 0,await _(l,c);return}I=!0}catch(e){if(o&&T===o&&(B(),o.close()),w===c&&(w=void 0),!L){let t=e instanceof Error?e.message:String(e);z={message:t,mode:`error`,warnings:[t]},a.config.logger.error(`Coreframe managed development initialization failed: ${t}`,{error:e instanceof Error?e:void 0}),h()}}finally{F=!1}})(),a.httpServer?.once(`close`,()=>{a.ws.off(o.statusRequest,K),a.ws.off(o.action,q),V()})},async closeBundle(){await V()}}}async function g(e,t){await v(e,async e=>{let n=e.session;e.session=void 0,await n?.close();try{await t.activate(),e.session=t}catch(e){throw await t.close(),e}})}async function _(e,t){await v(e,async e=>{e.session===t&&(e.session=void 0),await t.close()})}async function v(e,t){let n=p.get(e);n||(n={transition:Promise.resolve()},p.set(e,n));let r=n.transition,i;n.transition=new Promise(e=>{i=()=>e()}),await r;try{await t(n)}finally{i()}}function y(e){return e instanceof Error?e.message:String(e)}function b(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.retryable===!0||t.code===`LEASE_EXPIRED`||t.code===`SUPERVISOR_STOPPING`}export{h as coreframeManagedDevPlugin};
1
+ import{t as e}from"../managed-dev-B9iJaXCd.js";export{e as coreframeManagedDevPlugin};
@@ -1 +1 @@
1
- import{coreframeAssetsPlugin as e}from"./assets.js";import{coreframeDashboardPlugin as t}from"./dashboard.js";import{coreframeDevJobsPlugin as n}from"./dev-jobs.js";import{coreframeDevelopmentControlsPlugin as r}from"./development-controls.js";import{coreframeEnvironmentPlugin as i}from"./environment.js";import{coreframeFaviconPlugin as a}from"./favicon.js";import{coreframeFlutterDevToolsPlugin as o}from"./flutter-devtools.js";import{t as s}from"../icons-vb_lG-av.js";import{coreframeManagedDevPlugin as c}from"./managed-dev.js";import{coreframePreviewPlugin as l}from"./preview.js";import{coreframeStartupTimingPlugin as u}from"./startup-timing.js";import{t as d}from"../worktree-head-BZrhW1-Q.js";function f(f={}){return[u(),i(),l(f.config??{}),e(),...s(),r(),o(),n(),c(),d(),t(),...a(f.webManifest===void 0?void 0:{webManifest:f.webManifest})]}export{f as coreframeVitePreset};
1
+ import{coreframeAssetsPlugin as e}from"./assets.js";import{coreframeDashboardPlugin as t}from"./dashboard.js";import{coreframeDevJobsPlugin as n}from"./dev-jobs.js";import{coreframeDevelopmentControlsPlugin as r}from"./development-controls.js";import{coreframeEnvironmentPlugin as i}from"./environment.js";import{coreframeFaviconPlugin as a}from"./favicon.js";import{t as o}from"../icons-vb_lG-av.js";import{t as s}from"../managed-dev-B9iJaXCd.js";import{coreframePreviewPlugin as c}from"./preview.js";import{coreframeStartupTimingPlugin as l}from"./startup-timing.js";import{t as u}from"../worktree-head-BZrhW1-Q.js";function d(d={}){return[l(),i(),c(d.config??{}),e(),...o(),r(),n(),s(),u(),t(),...a(d.webManifest===void 0?void 0:{webManifest:d.webManifest})]}export{d as coreframeVitePreset};
@@ -1,79 +1,2 @@
1
- import { RouteConfigEntry, getAppDirectory } from "@react-router/dev/routes";
2
-
3
- //#region plugins/routes.d.ts
4
- type MobileRouteStack = string | {
5
- /** Stable finite stack identifier. */id: string; /** Marks this Flutter-wrapped DOM route as the stack root. */
6
- root?: boolean;
7
- };
8
- type MobileRouteLayerMetadata = {
9
- /** Absolute route compositor plane. Defaults to zero. */z?: number; /** Optional one-level named stack membership. */
10
- stack?: MobileRouteStack;
11
- };
12
- type NativeRouteRegistration = {
13
- /** `.native.tsx` module containing the route's non-DOM controller. */path: string; /** Symbolic Flutter shell transition selected when this route is presented. */
14
- transitionKey?: string; /** Status-bar foreground policy while this route is active. */
15
- statusBarForeground?: "automatic" | "light" | "dark";
16
- } & MobileRouteLayerMetadata;
17
- type MobileRouteRegistration = {
18
- /** Opts the ordinary DOM implementation into Flutter-owned physical presentation on mobile. */surface: "flutter-dom"; /** Symbolic Flutter shell transition selected when this route is presented. */
19
- transitionKey?: string; /** Optional opaque route backdrop used while platform transitions fade route content. */
20
- underlayColor?: string; /** Status-bar foreground policy while this route is active. */
21
- statusBarForeground?: "automatic" | "light" | "dark";
22
- } & MobileRouteLayerMetadata;
23
- declare const DEFAULT_MOBILE_TRANSITION_KEY: "platform";
24
- type CoreframeRouteConfigEntry = Omit<RouteConfigEntry, "children"> & {
25
- children?: CoreframeRouteConfigEntry[]; /** Selects native handling for this route on native hosts. */
26
- native?: NativeRouteRegistration; /** Selects an explicit mobile presentation policy without changing the DOM route projection. */
27
- mobile?: MobileRouteRegistration;
28
- };
29
- type RouteConfig = CoreframeRouteConfigEntry[] | Promise<CoreframeRouteConfigEntry[]>;
30
- type NativeRouteManifestEntry = {
31
- routeId: string;
32
- canonicalPath: string;
33
- caseSensitive: boolean;
34
- routeModulePath: string;
35
- controllerModulePath: string;
36
- transitionKey: string;
37
- };
38
- type MobileRouteManifestEntry = {
39
- routeId: string;
40
- canonicalPath: string;
41
- caseSensitive: boolean;
42
- routeModulePath: string;
43
- surface: "flutter-dom" | "native";
44
- transitionKey: string;
45
- z: number;
46
- stackId: string | null;
47
- stackRoot: boolean;
48
- underlayColor: string | null;
49
- statusBarForeground: "automatic" | "light" | "dark" | null;
50
- };
51
- type MobileStackManifestEntry = {
52
- id: string;
53
- rootRouteId: string;
54
- routeIds: readonly string[];
55
- };
56
- type CompiledRouteRegistrations = {
57
- routes: RouteConfigEntry[];
58
- nativeManifest: NativeRouteManifestEntry[];
59
- mobileManifest: MobileRouteManifestEntry[];
60
- stacks: MobileStackManifestEntry[];
61
- };
62
- type RouteOptions = Pick<CoreframeRouteConfigEntry, "id" | "index" | "caseSensitive" | "mobile" | "native">;
63
- type IndexOptions = Pick<CoreframeRouteConfigEntry, "id">;
64
- type LayoutOptions = Pick<CoreframeRouteConfigEntry, "id">;
65
- declare function route(path: string | null | undefined, file: string, children?: CoreframeRouteConfigEntry[]): CoreframeRouteConfigEntry;
66
- declare function route(path: string | null | undefined, file: string, options: RouteOptions, children?: CoreframeRouteConfigEntry[]): CoreframeRouteConfigEntry;
67
- declare function index(file: string, options?: IndexOptions): CoreframeRouteConfigEntry;
68
- declare function layout(file: string, children?: CoreframeRouteConfigEntry[]): CoreframeRouteConfigEntry;
69
- declare function layout(file: string, options: LayoutOptions, children?: CoreframeRouteConfigEntry[]): CoreframeRouteConfigEntry;
70
- declare function prefix(prefixPath: string, routes: CoreframeRouteConfigEntry[]): CoreframeRouteConfigEntry[];
71
- declare function relative(directory: string): {
72
- route(path: string | null | undefined, file: string, optionsOrChildren?: RouteOptions | CoreframeRouteConfigEntry[], children?: CoreframeRouteConfigEntry[]): CoreframeRouteConfigEntry;
73
- index(file: string, options?: IndexOptions): CoreframeRouteConfigEntry;
74
- layout(file: string, optionsOrChildren?: LayoutOptions | CoreframeRouteConfigEntry[], children?: CoreframeRouteConfigEntry[]): CoreframeRouteConfigEntry;
75
- prefix: typeof prefix;
76
- };
77
- declare function compileRouteRegistrations(config: readonly CoreframeRouteConfigEntry[]): CompiledRouteRegistrations;
78
- //#endregion
79
- export { CompiledRouteRegistrations, CoreframeRouteConfigEntry, DEFAULT_MOBILE_TRANSITION_KEY, MobileRouteManifestEntry, MobileRouteRegistration, MobileRouteStack, MobileStackManifestEntry, NativeRouteManifestEntry, NativeRouteRegistration, RouteConfig, compileRouteRegistrations, getAppDirectory, index, layout, prefix, relative, route };
1
+ import { RouteConfig, RouteConfigEntry, getAppDirectory, index, layout, prefix, relative, route } from "@react-router/dev/routes";
2
+ export { type RouteConfig, type RouteConfigEntry, getAppDirectory, index, layout, prefix, relative, route };
@@ -1 +1 @@
1
- import{getAppDirectory as e,index as t,layout as n,prefix as r,relative as i,route as a}from"@react-router/dev/routes";const o=`__coreframe_flutter_dom__`,s=`platform`,c=Symbol(`coreframe-route-registration`);function l(e,t,n,r){let i=Array.isArray(n)||n===void 0?void 0:n,o=Array.isArray(n)?n:r,s=i===void 0?void 0:{id:i.id,index:i.index,caseSensitive:i.caseSensitive},l=s===void 0?a(e,t,o):a(e,t,s,o);return i?.native!==void 0&&(l.native=i.native,l[c]={authoredControllerPath:i.native.path}),i?.mobile!==void 0&&(l.mobile=i.mobile),l}function u(e,n){return t(e,n)}function d(e,t,r){return Array.isArray(t)?n(e,t):t===void 0?n(e):n(e,t,r)}function f(e,t){return r(e,t)}function p(e){let t=i(e);return{route(e,n,r,i){let a=l(e,n,r,i);return a.file=t.route(null,n).file,a.native!==void 0&&(a.native={path:t.route(null,a.native.path).file}),a},index(e,n){return t.index(e,n)},layout(e,n,r){return Array.isArray(n)?t.layout(e,n):n===void 0?t.layout(e):t.layout(e,n,r)},prefix:f}}function m(e){if(!Array.isArray(e))throw Error(`Coreframe route config must be an array. Await asynchronous route config before compiling it.`);let t=[],n=[],r=new Map,i=new Map;return{routes:e.map((e,a)=>h(e,`/`,`routes[${a}]`,r,i,t,n)),nativeManifest:t,mobileManifest:n,stacks:_(n)}}function h(e,t,n,r,i,a,o){if(typeof e!=`object`||!e||typeof e.file!=`string`)throw Error(`Invalid Coreframe route registration at ${n}: expected a route helper result.`);if(e.id!==void 0){if(e.id.length===0||e.id.trim()!==e.id)throw Error(`Invalid route id ${JSON.stringify(e.id)} at ${n}: IDs must be non-empty and cannot have surrounding whitespace.`);let t=r.get(e.id);if(t!==void 0)throw Error(`Duplicate route id ${JSON.stringify(e.id)} at ${n}; it is already registered at ${t}.`);r.set(e.id,n)}let s=C(t,e.path);if(e.mobile!==void 0&&e.native!==void 0)throw Error(`Conflicting mobile surface policy for route ${JSON.stringify(e.id)} at ${n}: use either mobile.surface or native, not both.`);if(e.mobile!==void 0&&e.mobile.surface!==`flutter-dom`)throw Error(`Invalid mobile surface policy for route ${JSON.stringify(e.id)} at ${n}: expected "flutter-dom".`);if((e.mobile!==void 0||e.native!==void 0)&&(S(e,n),b(e.native?.statusBarForeground??e.mobile?.statusBarForeground,n)),e.native!==void 0){x(e,n);let t=v(e,n),r=e.id,c=w(s),l=i.get(c);if(l!==void 0)throw Error(`Ambiguous native route ${JSON.stringify(r)} at ${n}: canonical path ${JSON.stringify(s)} conflicts with native route ${JSON.stringify(l)}.`);i.set(c,r),a.push({routeId:r,canonicalPath:s,caseSensitive:e.caseSensitive===!0,routeModulePath:e.file,controllerModulePath:e.native.path,transitionKey:t}),o.push({routeId:r,canonicalPath:s,caseSensitive:e.caseSensitive===!0,routeModulePath:e.file,surface:`native`,transitionKey:t,underlayColor:null,statusBarForeground:e.native.statusBarForeground??null,...g(e,n)})}else if(e.mobile!==void 0){y(e.mobile.underlayColor,n);let t=v(e,n),r=e.id,a=w(s),c=i.get(a);if(c!==void 0)throw Error(`Ambiguous mobile route ${JSON.stringify(r)} at ${n}: canonical path ${JSON.stringify(s)} conflicts with mobile route ${JSON.stringify(c)}.`);i.set(a,r),o.push({routeId:r,canonicalPath:s,caseSensitive:e.caseSensitive===!0,routeModulePath:e.file,surface:`flutter-dom`,transitionKey:t,underlayColor:e.mobile.underlayColor??null,statusBarForeground:e.mobile.statusBarForeground??null,...g(e,n)})}let c={file:e.file};return`children`in e&&(c.children=e.children?.map((e,t)=>h(e,s,`${n}.children[${t}]`,r,i,a,o))),`path`in e&&(c.path=e.path),`id`in e&&(c.id=e.id),`index`in e&&(c.index=e.index),`caseSensitive`in e&&(c.caseSensitive=e.caseSensitive),c}function g(e,t){let n=e.native??e.mobile;if(n===void 0)return{stackId:null,stackRoot:!1,z:0};let r=n.z??0;if(typeof r!=`number`||!Number.isFinite(r))throw Error(`Invalid mobile route z ${JSON.stringify(r)} for route ${JSON.stringify(e.id)} at ${t}: z must be a finite number.`);let i=n.stack,a=typeof i==`object`?i:void 0,o=typeof i==`string`?i:a?.id,s=a?.root??!1;if(o===void 0&&s)throw Error(`Invalid mobile stack metadata for route ${JSON.stringify(e.id)} at ${t}: stackRoot requires a stack id.`);if(o!==void 0&&(typeof o!=`string`||o.length===0||o.trim()!==o))throw Error(`Invalid mobile stack id ${JSON.stringify(o)} for route ${JSON.stringify(e.id)} at ${t}: IDs must be non-empty and cannot have surrounding whitespace.`);if(typeof s!=`boolean`)throw Error(`Invalid mobile stack root flag for route ${JSON.stringify(e.id)} at ${t}: expected a boolean.`);return{stackId:o??null,stackRoot:s,z:r}}function _(e){let t=new Map;for(let n of e){if(n.stackId===null){if(n.stackRoot)throw Error(`Mobile route ${JSON.stringify(n.routeId)} marks a stack root without a stack.`);continue}let e=t.get(n.stackId)??[];e.push(n),t.set(n.stackId,e)}return[...t.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>{let n=t.filter(e=>e.stackRoot);if(n.length!==1)throw Error(`Mobile stack ${JSON.stringify(e)} must declare exactly one Flutter DOM root route.`);let r=n[0];if(r.surface!==`flutter-dom`)throw Error(`Mobile stack ${JSON.stringify(e)} root route ${JSON.stringify(r.routeId)} must use the Flutter DOM surface.`);return{id:e,rootRouteId:r.routeId,routeIds:t.map(({routeId:e})=>e).sort((e,t)=>e.localeCompare(t))}})}function v(e,t){let n=e.native?.transitionKey??e.mobile?.transitionKey;if(n===void 0)return s;if(typeof n!=`string`||n.length===0||n.trim()!==n)throw Error(`Invalid mobile transition key ${JSON.stringify(n)} for route ${JSON.stringify(e.id)} at ${t}: keys must be non-empty and cannot have surrounding whitespace.`);return n}function y(e,t){if(e!==void 0&&(typeof e!=`string`||!/^#[0-9A-Fa-f]{6}$/.test(e)))throw Error(`Invalid mobile underlay color ${JSON.stringify(e)} at ${t}: expected a solid #RRGGBB color.`)}function b(e,t){if(e!==void 0&&e!==`automatic`&&e!==`light`&&e!==`dark`)throw Error(`Invalid status bar foreground ${JSON.stringify(e)} at ${t}: expected "automatic", "light", or "dark".`)}function x(e,t){S(e,t);let n=e[c]?.authoredControllerPath??e.native?.path;if(typeof n!=`string`||n.trim()!==n||!n.startsWith(`.`)||n.includes(`\\`)||n.includes(`?`)||n.includes(`#`)||!n.endsWith(`.native.tsx`))throw Error(`Invalid native controller path ${JSON.stringify(n)} for route ${JSON.stringify(e.id)} at ${t}: expected a relative *.native.tsx module path without query, hash, or backslash characters.`)}function S(e,t){if(e.id===void 0)throw Error(`Mobile route at ${t} (${JSON.stringify(e.file)}) requires an explicit stable id.`);if(e.id===`root`)throw Error(`Mobile route at ${t} cannot use React Router's reserved id "root".`);if(e.id===o)throw Error(`Mobile route at ${t} cannot use Coreframe's reserved Flutter-DOM route id ${JSON.stringify(o)}.`);if(e.path===void 0&&e.index!==!0)throw Error(`Mobile route ${JSON.stringify(e.id)} at ${t} must have an addressable path or be an index route.`)}function C(e,t){if(t===void 0||t===``)return e;let n=(t.startsWith(`/`)?t:`${e===`/`?``:e}/${t}`).replace(/\/{2,}/g,`/`);return n.startsWith(`/`)?n:`/${n}`}function w(e){return e.split(`/`).map(e=>e.startsWith(`:`)?`:${e.endsWith(`?`)?`?`:``}`:e).join(`/`).toLowerCase()}export{s as DEFAULT_MOBILE_TRANSITION_KEY,m as compileRouteRegistrations,e as getAppDirectory,u as index,d as layout,f as prefix,p as relative,l as route};
1
+ import{getAppDirectory as e,index as t,layout as n,prefix as r,relative as i,route as a}from"@react-router/dev/routes";export{e as getAppDirectory,t as index,n as layout,r as prefix,i as relative,a as route};
@@ -1 +1 @@
1
- import{resolveCoreframeHost as e,resolveCoreframePlatform as t}from"./index.js";import{realpathSync as n}from"node:fs";import{extname as r,isAbsolute as i,relative as a,resolve as o,sep as s}from"node:path";import{parseSync as c}from"vite";const l={browser:{router:`@coreframe/lib/router`,shell:`@coreframe/lib/shell/dom`},flutter:{router:`@coreframe/flutter-js/router`,shell:`@coreframe/flutter-js/composition`}};function u(){let n=t(),r=n===`ios`||n===`android`?n:void 0,i=e(process.env,n),a=l[i],s=d(a.shell),u=process.cwd();return{name:`coreframe:shell`,enforce:`pre`,config(){return{define:{"import.meta.env.MOBILE_PLATFORM":r===void 0?`undefined`:JSON.stringify(r),"import.meta.env.PLATFORM":JSON.stringify(n)},resolve:{dedupe:[`react`,`react-dom`,`react-router`]},ssr:{noExternal:[`@coreframe/app`,s]}}},configResolved(e){u=e.root},transform(e,t){let n=f(t);if(!_(t,u)||n===void 0)return;let{module:r}=c(t,e,{lang:n});(r.staticImports.some(({moduleRequest:e})=>m(e.value))||r.staticExports.some(({entries:e})=>e.some(({moduleRequest:e})=>m(e?.value)))||r.dynamicImports.some(({moduleRequest:t})=>m(e.slice(t.start,t.end))))&&h(),i===`flutter`&&(r.staticImports.some(({moduleRequest:e})=>e.value===`react-router`)||r.staticExports.some(({entries:e})=>e.some(({moduleRequest:e})=>e?.value===`react-router`))||r.dynamicImports.some(({moduleRequest:t})=>p(e.slice(t.start,t.end))))&&g()},resolveId(e){if(e===`virtual:coreframe-internal/shell`)return this.resolve(a.shell,o(u,`vite.config.ts`),{skipSelf:!0});if(e===`virtual:coreframe-internal/router`)return this.resolve(a.router,o(u,`vite.config.ts`),{skipSelf:!0});if(e===`virtual:coreframe-internal/flutter/application`)return this.resolve(o(u,`src/web/app/flutter-shell/application.ts`),void 0,{skipSelf:!0});if(e===`virtual:coreframe-internal/flutter/native-bridge`)return this.resolve(o(u,`src/web/app/flutter-shell/generated/native-bridge.ts`),void 0,{skipSelf:!0});if(e===`virtual:coreframe-internal/flutter/native-pages`)return this.resolve(o(u,`src/web/app/flutter-shell/generated/native-pages.ts`),void 0,{skipSelf:!0});if(e===`virtual:coreframe-internal/flutter/native-surfaces`)return this.resolve(o(u,`src/web/app/flutter-shell/generated/native-surfaces.ts`),void 0,{skipSelf:!0})}}}function d(e){let t=e.split(`/`);return e.startsWith(`@`)?t.slice(0,2).join(`/`):t[0]}function f(e){let t=r(e.split(`?`,1)[0]);if(t===`.jsx`)return`jsx`;if(t===`.ts`||t===`.mts`||t===`.cts`)return`ts`;if(t===`.tsx`)return`tsx`;if(t===`.js`||t===`.mjs`||t===`.cjs`)return`js`}function p(e){return e===`"react-router"`||e===`'react-router'`||e==="`react-router`"}function m(e){return e!==void 0&&/^["'`]?virtual:coreframe/u.test(e)}function h(){throw Error(`Application modules must import Coreframe runtime APIs from "@coreframe/app" package entry points; "virtual:coreframe*" modules are framework-internal.`)}function g(){throw Error(`Flutter application modules must import React Router APIs from ${JSON.stringify(`@coreframe/app/router`)}; direct ${JSON.stringify(`react-router`)} imports bypass the native navigation contract. Importing ${JSON.stringify(`react-router/dom`)} remains supported.`)}function _(e,t){let r=e.split(`?`,1)[0];if(!i(r))return!1;let o=a(n(t),n(r)),c=o.split(s);return o!==``&&o!==`..`&&!o.startsWith(`..${s}`)&&!i(o)&&!c.includes(`node_modules`)&&c[0]!==`.react-router`}export{u as coreframeShellPlugin};
1
+ import{resolveCoreframePlatform as e}from"./index.js";import{realpathSync as t}from"node:fs";import{extname as n,isAbsolute as r,relative as i,resolve as a,sep as o}from"node:path";import{parseSync as s}from"vite";function c(){let t=e(),n={router:`@coreframe/lib/router`,shell:`@coreframe/lib/shell/dom`},r=process.cwd();return{name:`coreframe:shell`,enforce:`pre`,config(){return{define:{"import.meta.env.PLATFORM":JSON.stringify(t)},resolve:{dedupe:[`react`,`react-dom`,`react-router`]},ssr:{noExternal:[`@coreframe/app`,`@coreframe/lib`]}}},configResolved(e){r=e.root},transform(e,t){let n=l(t);if(!f(t,r)||n===void 0)return;let{module:i}=s(t,e,{lang:n});(i.staticImports.some(({moduleRequest:e})=>u(e.value))||i.staticExports.some(({entries:e})=>e.some(({moduleRequest:e})=>u(e?.value)))||i.dynamicImports.some(({moduleRequest:t})=>u(e.slice(t.start,t.end))))&&d()},resolveId(e){if(e===`virtual:coreframe-internal/shell`)return this.resolve(n.shell,a(r,`vite.config.ts`),{skipSelf:!0});if(e===`virtual:coreframe-internal/router`)return this.resolve(n.router,a(r,`vite.config.ts`),{skipSelf:!0})}}}function l(e){let t=n(e.split(`?`,1)[0]);if(t===`.jsx`)return`jsx`;if(t===`.ts`||t===`.mts`||t===`.cts`)return`ts`;if(t===`.tsx`)return`tsx`;if(t===`.js`||t===`.mjs`||t===`.cjs`)return`js`}function u(e){return e!==void 0&&/^["'`]?virtual:coreframe/u.test(e)}function d(){throw Error(`Application modules must import Coreframe runtime APIs from "@coreframe/app" package entry points; "virtual:coreframe*" modules are framework-internal.`)}function f(e,n){let a=e.split(`?`,1)[0];if(!r(a))return!1;let s=i(t(n),t(a)),c=s.split(o);return s!==``&&s!==`..`&&!s.startsWith(`..${o}`)&&!r(s)&&!c.includes(`node_modules`)&&c[0]!==`.react-router`}export{c as coreframeShellPlugin};
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- [data-isolet-root]{--overlay-font-body:"SN Pro Variable", system-ui, sans-serif;--overlay-font-monospace:"Google Sans Code Variable", ui-monospace, monospace;color-scheme:light dark;--oc-white:#fff;--oc-gray-0:#f8f9fa;--oc-gray-1:#f1f3f5;--oc-gray-2:#e9ecef;--oc-gray-3:#dee2e6;--oc-gray-4:#ced4da;--oc-gray-5:#adb5bd;--oc-gray-6:#868e96;--oc-gray-7:#495057;--oc-gray-8:#343a40;--oc-gray-9:#212529;--oc-red-0:#fff5f5;--oc-red-2:#ffc9c9;--oc-red-7:#f03e3e;--oc-red-9:#c92a2a;--oc-grape-0:#f8f0fc;--oc-grape-2:#eebefa;--oc-grape-7:#ae3ec9;--oc-grape-9:#862e9c;--oc-blue-0:#e7f5ff;--oc-blue-2:#a5d8ff;--oc-blue-4:#4dabf7;--oc-blue-6:#228be6;--oc-blue-7:#1c7ed6;--oc-blue-9:#1864ab;--oc-green-0:#ebfbee;--oc-green-2:#b2f2bb;--oc-green-7:#37b24d;--oc-green-9:#2b8a3e;--oc-yellow-0:#fff9db;--oc-yellow-2:#ffec99;--oc-yellow-7:#f59f00;--oc-yellow-9:#e67700;--overlay-background:var(--oc-white);--overlay-surface-subtle:var(--oc-gray-0);--overlay-surface-muted:var(--oc-gray-1);--overlay-border:var(--oc-gray-3);--overlay-border-strong:var(--oc-gray-4);--overlay-text:var(--oc-gray-9);--overlay-text-muted:var(--oc-gray-7);--overlay-text-subtle:var(--oc-gray-6);--overlay-accent:var(--oc-blue-6);--overlay-accent-hover:var(--oc-blue-7);--overlay-accent-soft:var(--oc-blue-0);--overlay-accent-border:var(--oc-blue-2);--overlay-accent-text:var(--oc-blue-9);--overlay-thought-soft:var(--oc-grape-0);--overlay-thought-border:var(--oc-grape-2);--overlay-thought-text:var(--oc-grape-9);--overlay-success-soft:var(--oc-green-0);--overlay-success-border:var(--oc-green-2);--overlay-success-text:var(--oc-green-9);--overlay-warning-soft:var(--oc-yellow-0);--overlay-warning-border:var(--oc-yellow-2);--overlay-warning-text:var(--oc-yellow-9);--overlay-danger-soft:var(--oc-red-0);--overlay-danger-border:var(--oc-red-2);--overlay-danger-text:var(--oc-red-9);color:var(--overlay-text);font:14px/1.45 var(--overlay-font-body)}.surface{--managed-dev-bottom-offset:0px;--managed-dev-right-offset:0px}.indicatorButton{appearance:none;bottom:calc(10px + env(safe-area-inset-bottom,0px) + var(--managed-dev-bottom-offset));cursor:pointer;pointer-events:auto;height:44px;right:calc(10px + env(safe-area-inset-right,0px) + var(--managed-dev-right-offset));background:0 0;border:0;justify-content:center;align-items:center;width:44px;padding:0;display:flex;position:fixed}.indicatorButton:focus-visible{outline:3px solid var(--overlay-accent-border);outline-offset:-3px}.indicatorDot{background:var(--managed-dev-indicator-color);box-shadow:inset 0 0 0 .5px color-mix(in srgb, var(--overlay-border) 30%, transparent);height:var(--managed-dev-indicator-size);width:var(--managed-dev-indicator-size);border-radius:50%;display:block;position:relative}.indicatorDot:before{border:max(1px, calc(var(--managed-dev-indicator-size) / 9)) solid var(--managed-dev-indicator-color);border-radius:inherit;content:"";animation:1.8s ease-out infinite radiate;position:absolute;inset:0}.dialog{background:var(--overlay-background);border:1px solid var(--overlay-border);box-shadow:0 18px 60px color-mix(in srgb, var(--oc-gray-9) 28%, transparent), 0 2px 8px color-mix(in srgb, var(--oc-gray-9) 12%, transparent);color:var(--overlay-text);box-sizing:border-box;height:auto;bottom:20px;left:unset;overscroll-behavior:contain;pointer-events:auto;border-radius:12px;width:min(520px,100vw - 18px);max-width:min(520px,100vw - 18px);max-height:none;margin:0;padding:12px 18px;position:fixed;right:20px;overflow:hidden}.dialog[open]{flex-direction:column;gap:12px;display:flex}.drawerBody{align-content:start;gap:16px;min-height:80px;display:grid;overflow:auto}.header{justify-content:space-between;align-items:center;gap:12px;display:flex}.headerActions{align-items:center;display:flex}.developmentControlsDropdown{display:flex;position:relative}.title{align-items:center;gap:8px;margin:0;font-size:16px;display:flex}.titleIcon{color:var(--overlay-accent);flex:none}.iconButton{color:inherit;cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;min-width:32px;min-height:32px;padding:4px;display:inline-flex}.iconButton:hover{background:var(--overlay-surface-muted);border-radius:8px}.iconButton:focus-visible,.scenarioButton:focus-visible,.sectionLink:focus-visible,.button:focus-visible,.message:focus-visible{outline:3px solid var(--overlay-accent-border);outline-offset:2px}.content{gap:12px;display:grid}.section{background:var(--overlay-surface-subtle);border:1px solid var(--overlay-border);border-radius:12px;gap:12px;padding:14px;display:grid}.sectionHeading{justify-content:space-between;align-items:start;gap:12px;display:flex}.sectionTitle{margin:0;font-size:13px}.sectionDescription{color:var(--overlay-text-muted);margin:3px 0 0;font-size:12px}.sectionLink{color:var(--overlay-accent-text);cursor:pointer;font:inherit;background:0 0;border:0;padding:2px;font-size:12px}.debugFooter{background:var(--overlay-thought-soft);border-top:.5px solid var(--overlay-thought-border);color:var(--overlay-thought-text);flex:none;margin:0 -18px -12px;padding:4px 18px;font-size:11px;line-height:1.3}.scenarioList{gap:7px;max-height:min(480px,100dvh - 210px);display:grid;overflow:auto}.scenarioButton{background:var(--overlay-surface-subtle);color:inherit;cursor:pointer;font:inherit;text-align:start;border:1px solid #0000;border-radius:10px;gap:3px;padding:10px;display:grid}.scenarioButton:hover{background:var(--overlay-accent-soft);border-color:var(--overlay-accent-border)}.scenarioLabel{font-weight:650}.scenarioDescription{color:var(--overlay-text-muted);font-size:12px}.paragraph{margin:0}.pendingCommits{background:var(--overlay-surface-subtle);border:1px solid var(--overlay-border);box-sizing:border-box;font:12px/1.5 var(--overlay-font-monospace);white-space:pre-wrap;border-radius:10px;max-height:190px;margin:0;padding:10px;overflow:auto}.codexOutput{background:var(--overlay-surface-subtle);border:1px solid var(--overlay-border);box-sizing:border-box;font:12px/1.5 var(--overlay-font-monospace);white-space:pre-wrap;word-break:break-word;border-radius:10px;max-height:280px;margin:0;padding:10px;overflow:auto}.codexWorking{color:var(--overlay-text-muted);font:12px/1.5 var(--overlay-font-monospace)}.codexWorkingSpinner{color:var(--overlay-accent)}.codexTranscript{gap:10px;max-height:360px;display:grid;overflow:auto}.codexMessage{border:1px solid #0000;border-radius:10px;gap:5px;padding:10px;display:grid}.codexMessageUser{background:var(--overlay-accent-soft);border-color:var(--overlay-accent-border)}.codexMessageThought{background:var(--overlay-thought-soft);border-color:var(--overlay-thought-border)}.codexMessageAgent{background:var(--overlay-success-soft);border-color:var(--overlay-success-border)}.codexMessageHeader{justify-content:space-between;align-items:baseline;gap:8px;display:flex}.codexMessageLabel{color:var(--overlay-text-muted);letter-spacing:.04em;text-transform:uppercase;margin:0;font-size:11px;font-weight:650}.codexMessageAge{color:var(--overlay-text-subtle);white-space:nowrap;font-size:11px}.codexMessageText,.codexWaiting{font:12px/1.5 var(--overlay-font-monospace);white-space:pre-wrap;word-break:break-word;margin:0}.codexWaiting{color:var(--overlay-text-subtle)}.rebaseProgress{gap:8px;display:grid}.rebaseProgressLabel{color:var(--overlay-text-muted);justify-content:space-between;align-items:baseline;font-size:12px;display:flex}.rebaseProgressLabel strong{color:var(--overlay-success-text)}.rebaseProgressTrack{background:var(--overlay-surface-muted);border-radius:999px;height:6px;overflow:hidden}.rebaseProgressFill{background:var(--overlay-success-text);border-radius:inherit;height:100%;transition:width .18s;display:block}.codexHistorySummary{cursor:pointer;font-size:12px;font-weight:600}.codexHistoryList{gap:8px;padding-top:8px;display:grid}.files{gap:7px;max-height:190px;display:grid;overflow:auto}.checkbox{overflow-wrap:anywhere;align-items:start;gap:8px;display:flex}.checkbox input{accent-color:var(--overlay-accent)}.filePath{font-family:var(--overlay-font-monospace)}.message{background:var(--overlay-surface-subtle);border:1px solid var(--overlay-border-strong);box-sizing:border-box;color:var(--overlay-text);font-family:var(--overlay-font-monospace);resize:vertical;border-radius:10px;width:100%;min-height:92px;padding:10px}.actions{flex-wrap:wrap;justify-content:end;gap:8px;display:flex}.developmentControls{background:var(--overlay-background);border:1px solid var(--overlay-border);box-shadow:0 10px 30px color-mix(in srgb, var(--oc-gray-9) 18%, transparent);box-sizing:border-box;z-index:1;border-radius:10px;gap:4px;min-width:170px;max-width:calc(100vw - 32px);margin:0;padding:4px;display:grid;position:absolute;top:calc(100% + 6px);right:0}.developmentControls .actions{justify-content:stretch;align-items:stretch;gap:0;width:100%;display:grid}.developmentControls .button{text-align:start;white-space:nowrap;justify-content:start;justify-self:stretch;width:100%;min-height:32px}.button{border:1px solid var(--overlay-border-strong);cursor:pointer;font:inherit;background:0 0;border-radius:999px;justify-content:center;align-items:center;gap:6px;padding:7px 11px;transition:opacity .14s;display:inline-flex}.button:hover:not(:disabled){background:var(--overlay-surface-muted)}.primary{background:var(--overlay-accent);border-color:var(--overlay-accent);color:var(--oc-white)}.primary:hover:not(:disabled){background:var(--overlay-accent-hover);border-color:var(--overlay-accent-hover)}.developmentControls .button{color:inherit;background:0 0;border:0}.developmentControls .button:hover:not(:disabled){background:var(--overlay-surface-muted)}.button:disabled{cursor:wait;opacity:.55}.buttonSpinner{animation:.7s linear infinite button-spin}.iconOnly{box-sizing:border-box;flex:0 0 32px;width:32px;min-width:32px;height:32px;padding:7px}.warning{color:var(--overlay-warning-text);white-space:pre-wrap}.checkFailure{background:var(--overlay-danger-soft);border:1px solid var(--overlay-danger-border);color:var(--overlay-danger-text);border-radius:10px;gap:10px;padding:10px;display:grid}.checkCommand{font-family:var(--overlay-font-monospace);margin:0;font-weight:600}.checkGuidance{margin:3px 0 0;font-size:12px}.setupFailure{background:var(--overlay-danger-soft);border:1px solid var(--overlay-danger-border);color:var(--overlay-danger-text);border-radius:10px;gap:10px;padding:10px;display:grid}.actionError{background:var(--overlay-warning-soft);border:1px solid var(--overlay-warning-border);color:var(--overlay-warning-text);white-space:pre-wrap;border-radius:10px;gap:10px;padding:10px;display:grid}.errorMessage{grid-template-columns:auto 1fr;align-items:start;gap:8px;display:grid}.actionSuccess{background:var(--overlay-success-soft);border:1px solid var(--overlay-success-border);color:var(--overlay-success-text);border-radius:10px;grid-template-columns:auto 1fr;align-items:start;gap:8px;padding:10px;display:grid}.errorIcon,.successIcon{margin-top:1px}@media (prefers-color-scheme:dark){[data-isolet-root]{--overlay-background:var(--oc-gray-9);--overlay-surface-subtle:var(--oc-gray-8);--overlay-surface-muted:var(--oc-gray-7);--overlay-border:var(--oc-gray-7);--overlay-border-strong:var(--oc-gray-6);--overlay-text:var(--oc-gray-0);--overlay-text-muted:var(--oc-gray-4);--overlay-text-subtle:var(--oc-gray-5);--overlay-accent:var(--oc-blue-6);--overlay-accent-hover:var(--oc-blue-7);--overlay-accent-soft:color-mix(in srgb, var(--oc-blue-9) 32%, var(--overlay-background));--overlay-accent-border:var(--oc-blue-7);--overlay-accent-text:var(--oc-blue-2);--overlay-thought-soft:color-mix(in srgb, var(--oc-grape-9) 30%, var(--overlay-background));--overlay-thought-border:var(--oc-grape-7);--overlay-thought-text:var(--oc-grape-2);--overlay-success-soft:color-mix(in srgb, var(--oc-green-9) 30%, var(--overlay-background));--overlay-success-border:var(--oc-green-7);--overlay-success-text:var(--oc-green-2);--overlay-warning-soft:color-mix(in srgb, var(--oc-yellow-9) 24%, var(--overlay-background));--overlay-warning-border:var(--oc-yellow-7);--overlay-warning-text:var(--oc-yellow-2);--overlay-danger-soft:color-mix(in srgb, var(--oc-red-9) 30%, var(--overlay-background));--overlay-danger-border:var(--oc-red-7);--overlay-danger-text:var(--oc-red-2)}}@keyframes radiate{0%{opacity:.75;transform:scale(1)}to{opacity:0;transform:scale(2.4)}}@keyframes button-spin{to{transform:rotate(1turn)}}@media (prefers-reduced-motion:reduce){.buttonSpinner{animation:none}}@media (width<=600px){.dialog{max-width:none;padding:calc(16px + env(safe-area-inset-top,0px)) calc(16px + env(safe-area-inset-right,0px)) calc(16px + env(safe-area-inset-bottom,0px)) calc(16px + env(safe-area-inset-left,0px));border-radius:0;width:auto;inset:0}.debugFooter{margin:0 calc(-16px - env(safe-area-inset-right,0px)) calc(-16px - env(safe-area-inset-bottom,0px)) calc(-16px - env(safe-area-inset-left,0px));padding:4px calc(16px + env(safe-area-inset-right,0px)) calc(4px + env(safe-area-inset-bottom,0px)) calc(16px + env(safe-area-inset-left,0px))}.button{min-height:44px}.checkbox{align-items:center;min-height:44px}.iconButton{min-width:44px;min-height:44px}.iconOnly{flex-basis:44px;width:44px;min-width:44px;height:44px}}@media (prefers-reduced-motion:reduce){.indicatorDot:before{opacity:.45;animation:none;transform:scale(1.65)}}
1
+ :host::backdrop{pointer-events:none!important;background:0 0!important}[data-isolet-root]{--overlay-font-body:"SN Pro Variable", system-ui, sans-serif;--overlay-font-monospace:"Google Sans Code Variable", ui-monospace, monospace;color-scheme:light dark;--oc-white:#fff;--oc-gray-0:#f8f9fa;--oc-gray-1:#f1f3f5;--oc-gray-2:#e9ecef;--oc-gray-3:#dee2e6;--oc-gray-4:#ced4da;--oc-gray-5:#adb5bd;--oc-gray-6:#868e96;--oc-gray-7:#495057;--oc-gray-8:#343a40;--oc-gray-9:#212529;--oc-red-0:#fff5f5;--oc-red-2:#ffc9c9;--oc-red-7:#f03e3e;--oc-red-9:#c92a2a;--oc-grape-0:#f8f0fc;--oc-grape-2:#eebefa;--oc-grape-7:#ae3ec9;--oc-grape-9:#862e9c;--oc-blue-0:#e7f5ff;--oc-blue-2:#a5d8ff;--oc-blue-4:#4dabf7;--oc-blue-6:#228be6;--oc-blue-7:#1c7ed6;--oc-blue-9:#1864ab;--oc-green-0:#ebfbee;--oc-green-2:#b2f2bb;--oc-green-7:#37b24d;--oc-green-9:#2b8a3e;--oc-yellow-0:#fff9db;--oc-yellow-2:#ffec99;--oc-yellow-7:#f59f00;--oc-yellow-9:#e67700;--overlay-background:var(--oc-white);--overlay-surface-subtle:var(--oc-gray-0);--overlay-surface-muted:var(--oc-gray-1);--overlay-border:var(--oc-gray-3);--overlay-border-strong:var(--oc-gray-4);--overlay-text:var(--oc-gray-9);--overlay-text-muted:var(--oc-gray-7);--overlay-text-subtle:var(--oc-gray-6);--overlay-accent:var(--oc-blue-6);--overlay-accent-hover:var(--oc-blue-7);--overlay-accent-soft:var(--oc-blue-0);--overlay-accent-border:var(--oc-blue-2);--overlay-accent-text:var(--oc-blue-9);--overlay-thought-soft:var(--oc-grape-0);--overlay-thought-border:var(--oc-grape-2);--overlay-thought-text:var(--oc-grape-9);--overlay-success-soft:var(--oc-green-0);--overlay-success-border:var(--oc-green-2);--overlay-success-text:var(--oc-green-9);--overlay-warning-soft:var(--oc-yellow-0);--overlay-warning-border:var(--oc-yellow-2);--overlay-warning-text:var(--oc-yellow-9);--overlay-danger-soft:var(--oc-red-0);--overlay-danger-border:var(--oc-red-2);--overlay-danger-text:var(--oc-red-9);--overlay-button-highlight:#ffffffb3;--overlay-button-shadow:#00000017;--overlay-button-hover:var(--overlay-background);--overlay-button-primary:#286fb4;--overlay-button-primary-hover:#307bbf;color:var(--overlay-text);font:14px/1.45 var(--overlay-font-body);-webkit-user-select:text;user-select:text}.surface{--managed-dev-bottom-offset:0px;--managed-dev-right-offset:0px}.indicatorButton{appearance:none;bottom:calc(10px + env(safe-area-inset-bottom,0px) + var(--managed-dev-bottom-offset));cursor:pointer;pointer-events:auto;height:44px;right:calc(10px + env(safe-area-inset-right,0px) + var(--managed-dev-right-offset));background:0 0;border:0;justify-content:center;align-items:center;width:44px;padding:0;display:flex;position:fixed}.indicatorButton:focus-visible{outline:3px solid var(--overlay-accent-border);outline-offset:-3px}.indicatorDot{background:var(--managed-dev-indicator-color);box-shadow:inset 0 0 0 .5px color-mix(in srgb, var(--overlay-border) 30%, transparent);height:var(--managed-dev-indicator-size);width:var(--managed-dev-indicator-size);border-radius:50%;display:block;position:relative}.dialog{background:var(--overlay-background);border:1px solid var(--overlay-border);box-shadow:0 8px 28px color-mix(in srgb, var(--oc-gray-9) 18%, transparent);color:var(--overlay-text);box-sizing:border-box;height:auto;bottom:20px;left:unset;overscroll-behavior:contain;pointer-events:auto;border-radius:12px;width:min(520px,100vw - 40px);max-width:min(520px,100vw - 40px);max-height:calc(100dvh - 40px);margin:0;padding:16px 18px;position:fixed;right:20px;overflow:hidden}.dialog[open]{flex-direction:column;gap:12px;display:flex}.drawerBody{align-content:start;gap:16px;min-width:0;min-height:0;display:grid;overflow:auto}.header{justify-content:space-between;align-items:center;gap:12px;display:flex}.copyFooter{flex:none;align-items:center;gap:8px;display:flex}.copyButton,.copyButton:hover{border-radius:50%}.headerActions{align-items:center;display:flex}.developmentControlsDropdown{display:flex;position:relative}.title{align-items:center;gap:8px;margin:0;font-size:16px;font-weight:600;display:flex}.titleIcon{color:var(--overlay-text-muted);flex:none}.iconButton{color:inherit;cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;min-width:32px;min-height:32px;padding:4px;display:inline-flex}.iconButton:hover{background:var(--overlay-surface-muted);border-radius:8px}.iconButton:focus-visible,.scenarioButton:focus-visible,.sectionLink:focus-visible,.button:focus-visible,.message:focus-visible{outline:3px solid var(--overlay-accent-border);outline-offset:2px}.content{gap:12px;display:grid}.section{background:var(--overlay-surface-subtle);border:1px solid var(--overlay-border);border-radius:12px;gap:12px;padding:14px;display:grid}.sectionHeading{justify-content:space-between;align-items:start;gap:12px;display:flex}.sectionTitle{margin:0;font-size:13px}.sectionDescription{color:var(--overlay-text-muted);margin:3px 0 0;font-size:12px}.sectionLink{color:var(--overlay-accent-text);cursor:pointer;font:inherit;background:0 0;border:0;padding:2px;font-size:12px}.debugFooter{background:var(--overlay-surface-subtle);border-top:1px solid var(--overlay-border);color:var(--overlay-text-muted);flex:none;margin:0 -18px -12px;padding:4px 18px;font-size:11px;line-height:1.3}.scenarioList{gap:7px;max-height:min(480px,100dvh - 210px);display:grid;overflow:auto}.scenarioButton{background:var(--overlay-surface-subtle);color:inherit;cursor:pointer;font:inherit;text-align:start;border:1px solid #0000;border-radius:6px;gap:3px;padding:10px;display:grid}.scenarioButton:hover{background:var(--overlay-accent-soft);border-color:var(--overlay-accent-border)}.scenarioLabel{font-weight:650}.scenarioDescription{color:var(--overlay-text-muted);font-size:12px}.paragraph{margin:0}.pendingCommits{background:var(--overlay-surface-subtle);border:1px solid var(--overlay-border);box-sizing:border-box;font:12px/1.5 var(--overlay-font-monospace);white-space:pre-wrap;border-radius:6px;max-height:190px;margin:0;padding:10px;overflow:auto}.codexOutput{background:var(--overlay-surface-subtle);border:1px solid var(--overlay-border);box-sizing:border-box;font:12px/1.5 var(--overlay-font-monospace);white-space:pre-wrap;word-break:break-word;border-radius:6px;max-height:280px;margin:0;padding:10px;overflow:auto}.codexWorking{color:var(--overlay-text-muted);align-items:center;gap:6px;font-size:12px;display:flex}.codexTranscript{gap:10px;max-height:360px;display:grid;overflow:auto}.codexMessage{border-bottom:1px solid var(--overlay-border);gap:5px;padding:8px 0;display:grid}.codexMessage:last-child{border-bottom:0}.codexMessageHeader{justify-content:space-between;align-items:baseline;gap:8px;display:flex}.codexMessageLabel{color:var(--overlay-text-muted);margin:0;font-size:11px;font-weight:650}.codexMessageAge{color:var(--overlay-text-subtle);white-space:nowrap;font-size:11px}.codexMessageText,.codexWaiting{font:13px/1.5 var(--overlay-font-body);white-space:pre-wrap;word-break:break-word;margin:0}.codexWaiting{color:var(--overlay-text-subtle)}.rebaseProgress{gap:8px;display:grid}.rebaseProgressLabel{color:var(--overlay-text-muted);justify-content:space-between;align-items:baseline;font-size:12px;display:flex}.rebaseProgressLabel strong{color:var(--overlay-text)}.rebaseProgressTrack{background:var(--overlay-surface-muted);border-radius:999px;height:6px;overflow:hidden}.rebaseProgressFill{background:var(--overlay-success-text);border-radius:inherit;height:100%;transition:width .18s;display:block}.codexHistorySummary{cursor:pointer;font-size:12px;font-weight:600}.codexHistoryList{gap:8px;padding-top:8px;display:grid}.files{gap:7px;max-height:190px;display:grid;overflow:auto}.checkbox{overflow-wrap:anywhere;align-items:start;gap:8px;display:flex}.checkbox input{accent-color:var(--overlay-accent)}.filePath{font-family:var(--overlay-font-monospace)}.message{background:var(--overlay-surface-subtle);border:1px solid var(--overlay-border-strong);box-sizing:border-box;color:var(--overlay-text);font-family:var(--overlay-font-monospace);resize:vertical;border-radius:6px;width:100%;min-height:92px;padding:10px}.codexSettings{justify-self:start}.codexSettingsPopover{z-index:2;box-sizing:border-box;background:var(--overlay-background);border:1px solid var(--overlay-border);border-radius:8px;gap:12px;width:220px;padding:12px;display:grid;position:fixed;box-shadow:0 4px 16px #0000002e}.codexSettingsPopover:before{content:"";z-index:-1;position:absolute;inset:-8px 0}.codexSettingsPopover>.sectionTitle{color:var(--overlay-text-muted);font-size:12px;font-weight:500}.modelToggle{background:var(--overlay-surface-subtle);border-radius:6px;gap:2px;padding:3px;display:flex}.modelToggle button{color:var(--overlay-text-muted);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;flex:1;padding:5px 8px;font-size:13px}.modelToggle button[aria-pressed=true]{background:var(--overlay-surface-muted);color:var(--overlay-text)}.modelToggle button:focus-visible,.effortControl input:focus-visible{outline:2px solid var(--overlay-accent);outline-offset:2px}.modelToggle button:disabled{cursor:default;opacity:.55}.effortControl{gap:4px;font-size:12px;display:grid}.effortControl>span{justify-content:space-between;display:flex}.effortControl input{appearance:none;cursor:pointer;background:0 0;width:100%;height:20px;margin:0}.effortControl input::-webkit-slider-runnable-track{background:linear-gradient(to right, var(--overlay-accent) var(--effort-progress), var(--overlay-border-strong) var(--effort-progress));border-radius:2px;height:4px}.effortControl input::-webkit-slider-thumb{appearance:none;background:var(--overlay-accent);border-radius:50%;width:12px;height:12px;margin-top:-4px}.effortControl input::-moz-range-track{background:var(--overlay-border-strong);border-radius:2px;height:4px}.effortControl input::-moz-range-progress{background:var(--overlay-accent);height:4px}.effortControl input::-moz-range-thumb{background:var(--overlay-accent);border:0;border-radius:50%;width:12px;height:12px}.effortControl input:disabled{cursor:default;opacity:.55}.effortEndpoints{color:var(--overlay-text-muted)}.actions{flex-wrap:wrap;justify-content:end;gap:8px;display:flex}.developmentControls{background:var(--overlay-background);border:1px solid var(--overlay-border);box-shadow:0 10px 30px color-mix(in srgb, var(--oc-gray-9) 18%, transparent);box-sizing:border-box;z-index:1;border-radius:6px;gap:4px;min-width:170px;max-width:calc(100vw - 32px);margin:0;padding:4px;display:grid;position:absolute;top:calc(100% + 6px);right:0}.recoveryBack{color:var(--overlay-text);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:6px 0;display:flex}.recoveryBack:focus-visible{outline:2px solid var(--overlay-accent);outline-offset:2px}.recoveryTitle{margin:0;font-size:18px}.developmentControls .actions{justify-content:stretch;align-items:stretch;gap:0;width:100%;display:grid}.developmentControls .button{text-align:start;white-space:nowrap;justify-content:start;justify-self:stretch;width:100%;min-height:32px}.button{--button-fill:var(--overlay-surface-subtle);appearance:none;background:linear-gradient(#ffffff0a, #00000008), var(--button-fill);border:1px solid var(--overlay-border);box-shadow:inset 0 1px 0 var(--overlay-button-highlight), 0 1px 2px var(--overlay-button-shadow);box-sizing:border-box;color:inherit;cursor:pointer;font:inherit;border-radius:8px;justify-content:center;align-items:center;gap:6px;min-height:34px;padding:7px 14px;font-weight:600;transition:background-color .14s,border-color .14s,box-shadow .14s,transform .1s,opacity .14s;display:inline-flex}.button:hover:not(:disabled){--button-fill:var(--overlay-button-hover);border-color:var(--overlay-border-strong)}.button:active:not(:disabled){box-shadow:inset 0 1px 2px var(--overlay-button-shadow);transform:translateY(1px)}.button>svg:not(.buttonSpinner){opacity:.8}.primary{--button-fill:var(--overlay-button-primary);background-color:var(--button-fill);border-color:color-mix(in srgb, var(--button-fill), black 15%);box-shadow:inset 0 1px 0 #fff3, 0 1px 2px var(--overlay-button-shadow);color:var(--oc-white)}.primary:hover:not(:disabled){--button-fill:var(--overlay-button-primary-hover);border-color:color-mix(in srgb, var(--button-fill), black 15%)}.developmentControls .button{box-shadow:none;color:inherit;font-weight:inherit;background:0 0;border:0;transform:none}.developmentControls .button:hover:not(:disabled){background:var(--overlay-surface-muted)}.developmentControls .button:active:not(:disabled){box-shadow:none;transform:none}.button:disabled{cursor:default;opacity:.55}.buttonSpinner{animation:1.4s linear infinite button-spin}.iconOnly{box-sizing:border-box;flex:0 0 34px;width:34px;min-width:34px;height:34px;padding:7px}.warning{color:var(--overlay-warning-text);white-space:pre-wrap}.checkFailure{background:var(--overlay-danger-soft);border:1px solid var(--overlay-danger-border);color:var(--overlay-danger-text);border-radius:6px;gap:10px;padding:10px;display:grid}.checkCommand{font-family:var(--overlay-font-monospace);margin:0;font-weight:600}.checkGuidance{margin:3px 0 0;font-size:12px}.setupFailure{background:var(--overlay-danger-soft);border:1px solid var(--overlay-danger-border);color:var(--overlay-danger-text);border-radius:6px;gap:10px;padding:10px;display:grid}.actionError{background:var(--overlay-warning-soft);border:1px solid var(--overlay-warning-border);color:var(--overlay-warning-text);white-space:pre-wrap;border-radius:6px;gap:10px;padding:10px;display:grid}.errorMessage{grid-template-columns:auto 1fr;align-items:start;gap:8px;display:grid}.actionSuccess{background:var(--overlay-surface-subtle);border:1px solid var(--overlay-border);color:var(--overlay-success-text);border-radius:6px;grid-template-columns:auto 1fr;align-items:start;gap:8px;padding:10px;display:grid}.errorIcon,.successIcon{margin-top:1px}@media (prefers-color-scheme:dark){[data-isolet-root]{--overlay-background:var(--oc-gray-9);--overlay-button-highlight:#ffffff1a;--overlay-button-shadow:#00000040;--overlay-button-hover:color-mix(in srgb, var(--overlay-surface-subtle), white 5%);--overlay-button-primary:#306fae;--overlay-button-primary-hover:#397dbb;--overlay-surface-subtle:var(--oc-gray-8);--overlay-surface-muted:var(--oc-gray-7);--overlay-border:var(--oc-gray-7);--overlay-border-strong:var(--oc-gray-6);--overlay-text:var(--oc-gray-0);--overlay-text-muted:var(--oc-gray-4);--overlay-text-subtle:var(--oc-gray-5);--overlay-accent:var(--oc-blue-6);--overlay-accent-hover:var(--oc-blue-7);--overlay-accent-soft:color-mix(in srgb, var(--oc-blue-9) 32%, var(--overlay-background));--overlay-accent-border:var(--oc-blue-7);--overlay-accent-text:var(--oc-blue-2);--overlay-thought-soft:color-mix(in srgb, var(--oc-grape-9) 30%, var(--overlay-background));--overlay-thought-border:var(--oc-grape-7);--overlay-thought-text:var(--oc-grape-2);--overlay-success-soft:color-mix(in srgb, var(--oc-green-9) 30%, var(--overlay-background));--overlay-success-border:var(--oc-green-7);--overlay-success-text:var(--oc-green-2);--overlay-warning-soft:color-mix(in srgb, var(--oc-yellow-9) 24%, var(--overlay-background));--overlay-warning-border:var(--oc-yellow-7);--overlay-warning-text:var(--oc-yellow-2);--overlay-danger-soft:color-mix(in srgb, var(--oc-red-9) 30%, var(--overlay-background));--overlay-danger-border:var(--oc-red-7);--overlay-danger-text:var(--oc-red-2)}}@keyframes button-spin{to{transform:rotate(1turn)}}@media (prefers-reduced-motion:reduce){.button{transition:none}.button:active:not(:disabled){transform:none}.buttonSpinner{animation:none}}@media (width<=600px){.dialog{max-width:none;max-height:100dvh;padding:calc(16px + env(safe-area-inset-top,0px)) calc(16px + env(safe-area-inset-right,0px)) calc(16px + env(safe-area-inset-bottom,0px)) calc(16px + env(safe-area-inset-left,0px));border-radius:0;width:auto;inset:0}.debugFooter{margin:0 calc(-16px - env(safe-area-inset-right,0px)) calc(-16px - env(safe-area-inset-bottom,0px)) calc(-16px - env(safe-area-inset-left,0px));padding:4px calc(16px + env(safe-area-inset-right,0px)) calc(4px + env(safe-area-inset-bottom,0px)) calc(16px + env(safe-area-inset-left,0px))}.button{min-height:44px}.checkbox{align-items:center;min-height:44px}.iconButton{min-width:44px;min-height:44px}.iconOnly{flex-basis:44px;width:44px;min-width:44px;height:44px}}.buttonContainer{min-width:0;display:inline-flex}.buttonContainer:focus-visible{outline:2px solid var(--overlay-accent);outline-offset:2px;border-radius:8px}.button:disabled{pointer-events:none}.developmentControls .buttonContainer{width:100%;display:flex}.disabledTooltip{z-index:2147483647;border:1px solid var(--overlay-border);background:var(--overlay-surface-subtle);max-width:min(280px,100vw - 24px);color:var(--overlay-text-muted);pointer-events:none;border-radius:6px;padding:6px 8px;font-size:11px;font-weight:400;line-height:1.4;position:fixed;transform:translateY(-100%)}.srOnly{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.activityList{gap:8px;min-width:0;display:grid}.activityRow{border-bottom:1px solid var(--overlay-border);min-width:0;margin:0;padding:10px 0}.activitySummary{cursor:pointer;overflow-wrap:anywhere;grid-template-columns:14px minmax(0,1fr) auto;align-items:center;gap:8px;font-size:13px;list-style:none;display:grid}.activitySummary::-webkit-details-marker{display:none}.activityDisclosure{color:var(--overlay-text-subtle)}.activityRow[open]>summary .activityDisclosure{transform:rotate(90deg)}.activityState{vertical-align:middle;color:var(--overlay-text-muted);display:inline-flex}.activityState[data-status=succeeded]{color:var(--overlay-success-text)}.activityState[data-status=failed]{color:var(--overlay-danger-text)}.activityStatus{color:var(--overlay-text-muted);font-variant-numeric:tabular-nums;white-space:nowrap;align-items:center;gap:6px;font-size:12px;display:inline-flex}.activityCommand{font-family:var(--overlay-font-monospace);white-space:pre-wrap;overflow-wrap:anywhere;margin-top:8px;font-size:12px;display:block}.activityMeta{color:var(--overlay-text-muted);margin-block:8px;font-size:12px}.activityOutput{white-space:pre-wrap;overflow-wrap:anywhere;max-height:200px;font-size:12px;overflow:auto}.content,.codexTranscript,.codexMessage,.checkMessage,.setupFailure,.actionError{overflow-wrap:anywhere;min-width:0}.pendingCommits,.codexOutput,.activityOutput{overflow-wrap:anywhere;tab-size:2}.codexOptionSelect:focus-visible,.checkbox input:focus-visible,.codexHistorySummary:focus-visible,.activitySummary:focus-visible{outline:2px solid var(--overlay-accent);outline-offset:2px}.activityRow:last-child{border-bottom:0}@media (prefers-reduced-motion:reduce){.rebaseProgressFill,.button{transition:none}}.notificationActions{flex-wrap:nowrap;justify-content:flex-start;align-items:center;gap:8px;padding:3px;display:flex;overflow-x:auto}.notificationActions:empty{display:none}.notificationActions>*{flex-shrink:0}.notificationActions>:first-child{margin-inline-start:auto}.notificationActions>.codexSettings{order:-1;margin-inline:0}.notificationActions>.copyFooter{order:-2;margin-inline:0 auto}.notificationActions .button{white-space:nowrap}.changeList{box-sizing:border-box;border-block:1px solid var(--overlay-border);gap:14px;min-height:0;max-height:min(240px,35dvh);padding-block:10px;display:grid;overflow:auto}.fileGroup{gap:8px;min-width:0;display:grid}.trackedFile{overflow-wrap:anywhere;align-items:baseline;gap:8px;display:flex}.fileStatus{font:600 12px/1.5 var(--overlay-font-monospace);text-align:center;flex:0 0 1.5em}.fileStatus[data-tone=added]{color:var(--overlay-success-text)}.fileStatus[data-tone=modified]{color:var(--overlay-warning-text)}.fileStatus[data-tone=deleted]{color:var(--overlay-danger-text)}.fileStatus[data-tone=renamed]{color:var(--overlay-accent-text)}.changeList .filePath{overflow-wrap:anywhere;min-width:0}.changeList:focus-visible{outline:2px solid var(--overlay-accent);outline-offset:2px}.completionReceipt{gap:16px;display:grid}.completionNote{color:var(--overlay-text-muted);margin:3px 0 0;font-size:13px}.completionDetails{font-size:13px}.completionDetailBody{border-top:1px solid var(--overlay-border);gap:14px;max-height:min(360px,50dvh);margin-top:12px;padding-top:12px;display:grid;overflow:auto}.completionMetadata{color:var(--overlay-text-muted);justify-content:space-between;gap:16px;font-size:12px;display:flex}.completionMetadata>:last-child{white-space:nowrap}.completionSteps{border-collapse:collapse;width:100%;font-size:13px}.completionSteps td{vertical-align:baseline;padding:5px 0}.completionSteps td:first-child{width:22px;color:var(--overlay-text-muted)}.completionSteps td:last-child{text-align:right;color:var(--overlay-text-muted);white-space:nowrap;font-size:12px}@media (width<=600px){.dialog.completionDialog{top:auto;left:8px;right:8px;bottom:calc(8px + env(safe-area-inset-bottom,0px));border-radius:12px;max-height:calc(100dvh - 16px)}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coreframe/vite",
3
- "version": "0.3.0-next.4",
3
+ "version": "0.3.1",
4
4
  "description": "Vite plugins and build integrations for Coreframe apps",
5
5
  "repository": {
6
6
  "type": "git",
@@ -32,14 +32,6 @@
32
32
  "types": "./dist/plugins/routes.d.ts",
33
33
  "default": "./dist/plugins/routes.js"
34
34
  },
35
- "./native": {
36
- "types": "./dist/plugins/native.d.ts",
37
- "default": "./dist/plugins/native.js"
38
- },
39
- "./flutter-devtools": {
40
- "types": "./dist/browser/flutter-devtools.d.ts",
41
- "default": "./dist/browser/flutter-devtools.js"
42
- },
43
35
  "./*": {
44
36
  "types": "./dist/plugins/*.d.ts",
45
37
  "default": "./dist/plugins/*.js"
@@ -57,28 +49,33 @@
57
49
  "obug": "^2.1.3",
58
50
  "unplugin": "^2.3.11",
59
51
  "vite-plugin-hashed-favicons": "^2.1.1",
60
- "@coreframe/assets": "^0.1.18-next.3",
61
- "@coreframe/config": "^0.1.15-next.3",
62
- "@coreframe/dashboard": "^0.4.0-next.4",
63
- "@coreframe/dev": "^0.1.23-next.3",
64
- "@coreframe/dev-contracts": "^0.1.10-next.1",
65
- "@coreframe/flutter-js": "^0.1.30-next.3",
66
- "@coreframe/flutter-tools": "^0.1.25-next.4",
67
- "@coreframe/lib": "^0.2.16-next.3"
52
+ "@coreframe/assets": "^0.1.24",
53
+ "@coreframe/config": "^0.2.1",
54
+ "@coreframe/dashboard": "^0.3.34",
55
+ "@coreframe/dev": "^0.2.1",
56
+ "@coreframe/dev-contracts": "^0.2.0",
57
+ "@coreframe/lib": "^0.3.0"
68
58
  },
69
59
  "devDependencies": {
60
+ "@pandacss/dev": "2.4.0",
61
+ "@pandacss/preset-base": "2.4.0",
62
+ "@pandacss/preset-panda": "2.4.0",
63
+ "@playwright/test": "^1.64.1",
64
+ "@tabler/icons-react": "^3.50.0",
70
65
  "@tsdown/css": "0.22.3",
71
66
  "@types/node": "^26.1.0",
72
67
  "@types/react": "19.2.18",
73
68
  "@types/react-dom": "19.2.4",
74
69
  "isolet-js": "0.0.7",
75
70
  "react": "19.2.8",
71
+ "react-aria-components": "^1.22.1",
76
72
  "react-dom": "19.2.8",
73
+ "react-json-view-lite": "^2.5.0",
77
74
  "state-launcher": "^0.3.0",
78
75
  "tsdown": "0.22.3",
79
76
  "typescript": "6.0.3",
80
77
  "unplugin-icons": "^23.0.1",
81
- "vite": "^8.1.0",
78
+ "vite": "^8.3.5",
82
79
  "vitest": "^4.1.9"
83
80
  },
84
81
  "peerDependencies": {
@@ -97,6 +94,7 @@
97
94
  "test": "vitest run --reporter=minimal",
98
95
  "typecheck": "tsc --noEmit -p tsconfig.json",
99
96
  "format": "oxlint --fix && oxfmt",
100
- "lint": "oxlint"
97
+ "lint": "oxlint",
98
+ "test:browser": "playwright test --config browser-tests/playwright.config.ts"
101
99
  }
102
100
  }
@@ -1,17 +0,0 @@
1
- //#region browser/flutter-devtools.d.ts
2
- type FlutterDevToolsHotContext = {
3
- off(event: string, listener: (data: unknown) => void): void;
4
- on<T>(event: string, listener: (data: T) => void): void;
5
- send(event: string, data?: unknown): void;
6
- };
7
- type FlutterDevToolsAuth = Readonly<{
8
- getIsSignedIn(): boolean;
9
- onSignIn(): void | Promise<void>;
10
- onSignOut(): void | Promise<void>;
11
- }>;
12
- /** Registers the app-owned authentication callbacks used by the native launcher. */
13
- declare function registerFlutterDevToolsAuth(auth: FlutterDevToolsAuth): () => void;
14
- /** Publishes the page-owned state-launcher registry through Vite to its Flutter host. */
15
- declare function installFlutterDevTools(hot?: FlutterDevToolsHotContext | undefined): () => void;
16
- //#endregion
17
- export { FlutterDevToolsAuth, installFlutterDevTools, registerFlutterDevToolsAuth };
@@ -1 +0,0 @@
1
- import{flutterDevToolsEvents as e,flutterDevToolsProtocolVersion as t}from"@coreframe/dev-contracts/flutter-devtools";import{createDevToolsClient as n}from"@coreframe/flutter-js/devtools";import{clearActiveState as r,getStateLauncherSnapshot as i,launchStateLauncherCommand as a,subscribeStateLauncher as o}from"state-launcher/headless";let s,c,l,u;function d(e){let t={auth:e,token:{}};return c=t,h(),()=>{c?.token===t.token&&(c=void 0,h())}}function f(t=y()){let r,i=()=>h();r=n({features:[`state-launcher`],onReady:(e,n)=>{u=n,m(t,n),i()}}),s=r,l=t,t&&t.on(e.stateLauncherRequest,c);let a=o(i);return()=>{let n=s===r?u:void 0;n&&t&&t.send(e.pageDisconnect,n),a(),t&&t.off(e.stateLauncherRequest,c),s===r&&(s=void 0,l=void 0,u=void 0),r.dispose()};function c(e){let n=u;!n||!_(n,e)||Promise.resolve().then(()=>p(e.request)).then(()=>g(t,n,e.request.requestId,`completed`),()=>g(t,n,e.request.requestId,`error`))}}async function p(e){if(e.action===`clear`){await r();return}if(e.action===`auth`){let t=c?.auth;if(!t)throw Error(`State launcher authentication is not configured.`);e.authAction===`signIn`?t.getIsSignedIn()||await t.onSignIn():t.getIsSignedIn()&&await t.onSignOut(),h();return}await a(e.id)}function m(n,r){n?.send(e.pageConnect,{...r,protocolVersion:t})}function h(){let t=l,n=u;if(!t||!n)return;let r=c?.auth,a=r?{isSignedIn:r.getIsSignedIn()}:null;t.send(e.stateLauncherState,{...v(n),state:{auth:a,snapshot:i()}})}function g(t,n,r,i){t?.send(e.stateLauncherResult,{...v(n),result:i===`completed`?{requestId:r,status:i}:{error:{code:`command-failed`,message:`The state launcher command failed.`},requestId:r,status:i}})}function _(e,t){return e.rootWebRuntimeId===t.rootWebRuntimeId&&e.shellSessionId===t.shellSessionId}function v(e){return{rootWebRuntimeId:e.rootWebRuntimeId,shellSessionId:e.shellSessionId}}function y(){return import.meta.hot}export{f as installFlutterDevTools,d as registerFlutterDevToolsAuth};
@@ -1,13 +0,0 @@
1
- import { Plugin } from "vite";
2
-
3
- //#region plugins/flutter-devtools.d.ts
4
- /** Inputs that control the Flutter development-tools broker. */
5
- type CoreframeFlutterDevToolsPluginOptions = {
6
- env?: NodeJS.ProcessEnv;
7
- };
8
- /** Pairs a Flutter shell and its page while keeping the native Vite connection independent. */
9
- declare function coreframeFlutterDevToolsPlugin({
10
- env
11
- }?: CoreframeFlutterDevToolsPluginOptions): Plugin;
12
- //#endregion
13
- export { CoreframeFlutterDevToolsPluginOptions, coreframeFlutterDevToolsPlugin };
@@ -1 +0,0 @@
1
- import{managedDevEnv as e}from"@coreframe/dev-contracts/managed-dev";import{flutterDevToolsEvents as t,flutterDevToolsProtocolVersion as n}from"@coreframe/dev-contracts/flutter-devtools";function r({env:r=process.env}={}){return{name:`coreframe:flutter-devtools`,apply:`serve`,configureServer(d){let p=new Map,m=new WeakMap,h=new Map,g=new WeakMap,_={managedDev:r[e]===`1`,protocolVersion:n},v=(e,n)=>{if(!i(e))return;D(n);let r=p.get(e.shellSessionId)??new Set;r.add(n),p.set(e.shellSessionId,r),m.set(n,e.shellSessionId),n.send(t.ready,_),T(e.shellSessionId,n)},y=(e,t)=>{let n=a(e);if(!n)return;O(t);let r=h.get(n.shellSessionId);r&&r.client!==t&&g.delete(r.client),h.set(n.shellSessionId,{client:t,identity:n}),g.set(t,n.shellSessionId),T(n.shellSessionId)},b=(e,t)=>{let n=o(e);!n||!k(t,n)||O(t)},x=(e,n)=>{let r=s(e);if(!r||!f(e)||!(`state`in e)||!A(n,r))return;let i=h.get(r.shellSessionId);i.state=e.state,E(r.shellSessionId,t.stateLauncherState,{...r,state:e.state})},S=(e,n)=>{let r=s(e);if(!r||!f(e)||!(`request`in e)||m.get(n)!==r.shellSessionId)return;let i=h.get(r.shellSessionId);if(!i||!u(i.identity,r)){n.send(t.stateLauncherConnection,{connected:!1});return}i.client.send(t.stateLauncherRequest,{...r,request:e.request})},C=(e,n)=>{let r=s(e);!r||!f(e)||!(`result`in e)||!A(n,r)||E(r.shellSessionId,t.stateLauncherResult,{...r,result:e.result})},w=(e,t)=>{D(t),O(t)};function T(e,n){let r=h.get(e),i=r?{connected:!0,identity:c(r.identity)}:{connected:!1};if(n){n.send(t.stateLauncherConnection,i),r?.state!==void 0&&n.send(t.stateLauncherState,{...c(r.identity),state:r.state});return}E(e,t.stateLauncherConnection,i),r?.state!==void 0&&E(e,t.stateLauncherState,{...c(r.identity),state:r.state})}function E(e,t,n){for(let r of p.get(e)??[])r.send(t,n)}function D(e){let t=m.get(e);if(!t)return;m.delete(e);let n=p.get(t);n?.delete(e),n?.size===0&&p.delete(t)}function O(e){let t=g.get(e);t&&(g.delete(e),h.get(t)?.client===e&&(h.delete(t),T(t)))}function k(e,t){let n=h.get(t.shellSessionId);return n?.client===e&&l(n.identity,t)}function A(e,t){let n=h.get(t.shellSessionId);return n?.client===e&&u(n.identity,t)}d.ws.on(t.nativeConnect,v),d.ws.on(t.pageConnect,y),d.ws.on(t.pageDisconnect,b),d.ws.on(t.stateLauncherRequest,S),d.ws.on(t.stateLauncherResult,C),d.ws.on(t.stateLauncherState,x),d.ws.on(`vite:client:disconnect`,w),d.httpServer?.once(`close`,()=>{d.ws.off(t.nativeConnect,v),d.ws.off(t.pageConnect,y),d.ws.off(t.pageDisconnect,b),d.ws.off(t.stateLauncherRequest,S),d.ws.off(t.stateLauncherResult,C),d.ws.off(t.stateLauncherState,x),d.ws.off(`vite:client:disconnect`,w)})}}}function i(e){return f(e)&&d(e,[`protocolVersion`,`shellSessionId`])&&e.protocolVersion===n&&p(e.shellSessionId)}function a(e){if(!(!f(e)||!d(e,[`applicationScopeId`,`protocolVersion`,`rootWebRuntimeId`,`shellSessionId`])||e.protocolVersion!==n))return o(e)}function o(e){if(!f(e))return;let t=e.applicationScopeId,n=s(e);if(!(!p(t)||n===void 0))return{applicationScopeId:t,...n}}function s(e){if(!f(e)||`applicationScopeId`in e&&!p(e.applicationScopeId))return;let t=e.rootWebRuntimeId,n=e.shellSessionId;if(!(!p(t)||!p(n)))return{rootWebRuntimeId:t,shellSessionId:n}}function c(e){return{rootWebRuntimeId:e.rootWebRuntimeId,shellSessionId:e.shellSessionId}}function l(e,t){return e.applicationScopeId===t.applicationScopeId&&e.rootWebRuntimeId===t.rootWebRuntimeId&&e.shellSessionId===t.shellSessionId}function u(e,t){return e.rootWebRuntimeId===t.rootWebRuntimeId&&e.shellSessionId===t.shellSessionId}function d(e,t){return Object.keys(e).length===t.length&&t.every(t=>t in e)}function f(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function p(e){return typeof e==`string`&&e.length>0&&e.length<=256}export{r as coreframeFlutterDevToolsPlugin};
@@ -1 +0,0 @@
1
- export * from "@coreframe/flutter-tools";
@@ -1 +0,0 @@
1
- export*from"@coreframe/flutter-tools";export{};