@lunora/cli 1.0.0-alpha.39 → 1.0.0-alpha.390

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/LICENSE.md +33 -0
  2. package/README.md +1 -1
  3. package/dist/bin.mjs +2 -10
  4. package/dist/index.d.mts +1019 -374
  5. package/dist/index.d.ts +1019 -374
  6. package/dist/index.mjs +1 -19
  7. package/dist/packem_chunks/dispatch.mjs +1 -0
  8. package/dist/packem_chunks/handler.mjs +1 -160
  9. package/dist/packem_chunks/handler10.mjs +1 -16
  10. package/dist/packem_chunks/handler11.mjs +1 -22
  11. package/dist/packem_chunks/handler12.mjs +1 -192
  12. package/dist/packem_chunks/handler13.mjs +3 -131
  13. package/dist/packem_chunks/handler14.mjs +1 -65
  14. package/dist/packem_chunks/handler15.mjs +1 -58
  15. package/dist/packem_chunks/handler16.mjs +1 -80
  16. package/dist/packem_chunks/handler17.mjs +7 -43
  17. package/dist/packem_chunks/handler18.mjs +1 -105
  18. package/dist/packem_chunks/handler19.mjs +1 -170
  19. package/dist/packem_chunks/handler2.mjs +1 -114
  20. package/dist/packem_chunks/handler20.mjs +3 -94
  21. package/dist/packem_chunks/handler21.mjs +3 -94
  22. package/dist/packem_chunks/handler22.mjs +1 -0
  23. package/dist/packem_chunks/handler23.mjs +2 -0
  24. package/dist/packem_chunks/handler24.mjs +2 -0
  25. package/dist/packem_chunks/handler25.mjs +99 -0
  26. package/dist/packem_chunks/handler26.mjs +9 -0
  27. package/dist/packem_chunks/handler27.mjs +1 -0
  28. package/dist/packem_chunks/handler3.mjs +1 -204
  29. package/dist/packem_chunks/handler4.mjs +3 -33
  30. package/dist/packem_chunks/handler5.mjs +1 -49
  31. package/dist/packem_chunks/handler6.mjs +1 -91
  32. package/dist/packem_chunks/handler7.mjs +1 -42
  33. package/dist/packem_chunks/handler8.mjs +2 -174
  34. package/dist/packem_chunks/handler9.mjs +1 -315
  35. package/dist/packem_chunks/runCodegenCommand.mjs +4 -52
  36. package/dist/packem_chunks/runDeployCommand.mjs +11 -594
  37. package/dist/packem_chunks/runDevCommand.mjs +2 -0
  38. package/dist/packem_chunks/runInitCommand.mjs +164 -1432
  39. package/dist/packem_chunks/runResetCommand.mjs +1 -41
  40. package/dist/packem_chunks/runRpcCommand.mjs +1 -68
  41. package/dist/packem_shared/COMMANDS-JClcR9JT.mjs +1 -0
  42. package/dist/packem_shared/DEFAULT_IMPORT_BATCH_SIZE-CyIsI3S1.mjs +1 -0
  43. package/dist/packem_shared/EXIT_CODE-D_XCixv8.mjs +1 -0
  44. package/dist/packem_shared/admin-token-VdUnvnKW.mjs +1 -0
  45. package/dist/packem_shared/admin-url-DJB8P6Jh.mjs +1 -0
  46. package/dist/packem_shared/binding-manifest-file-CQ1eQYy1.mjs +2 -0
  47. package/dist/packem_shared/buildRegistryIndex-Dc8D8AR6.mjs +1 -0
  48. package/dist/packem_shared/cap-error-body-YBKO32BF.mjs +1 -0
  49. package/dist/packem_shared/catalog-CahzmDLV.mjs +1 -0
  50. package/dist/packem_shared/cli-DwEpuZm9.mjs +2 -0
  51. package/dist/packem_shared/cli-manifest-CRet0egA.mjs +1 -0
  52. package/dist/packem_shared/cloudflare-credentials-BVmZnDZk.mjs +1 -0
  53. package/dist/packem_shared/codegen-error-AmH54ofi.mjs +3 -0
  54. package/dist/packem_shared/command-CAXl2A1S.mjs +1 -0
  55. package/dist/packem_shared/commands-DgUDxkA8.mjs +13 -0
  56. package/dist/packem_shared/createLogger-Cl18I8AX.mjs +2 -0
  57. package/dist/packem_shared/createRecordingSpawner-Ch7zuQQE.mjs +1 -0
  58. package/dist/packem_shared/deploy-target-DCWwiuAe.mjs +1 -0
  59. package/dist/packem_shared/diffSnapshots-htqNZT8Q.mjs +7 -0
  60. package/dist/packem_shared/docker-AqLAkOyY.mjs +1 -0
  61. package/dist/packem_shared/health-probe-Bw9JFfIy.mjs +1 -0
  62. package/dist/packem_shared/import-BRM1hs7j.mjs +12 -0
  63. package/dist/packem_shared/index-oHZBGBwB.mjs +1 -0
  64. package/dist/packem_shared/insertSchemaExtension-DuiV6cba.mjs +8 -0
  65. package/dist/packem_shared/lint-ignore-report-DKZagpqk.mjs +2 -0
  66. package/dist/packem_shared/mcp-config-file-CcDTeXIq.mjs +2 -0
  67. package/dist/packem_shared/open-url-EnKy--w-.mjs +1 -0
  68. package/dist/packem_shared/output-format-B4eQHi5y.mjs +2 -0
  69. package/dist/packem_shared/parseManifest-CwPTKdtS.mjs +1 -0
  70. package/dist/packem_shared/path-containment-CgxYZggb.mjs +1 -0
  71. package/dist/packem_shared/plan-Dl57T11P.mjs +5 -0
  72. package/dist/packem_shared/planDevCommand-D8sm56hO.mjs +1 -0
  73. package/dist/packem_shared/platform-diagnostics-Cn2g6Jh-.mjs +4 -0
  74. package/dist/packem_shared/prompt-cancelled-BvsNxg_Q.mjs +1 -0
  75. package/dist/packem_shared/render-lunora-error-C3OJY5wk.mjs +2 -0
  76. package/dist/packem_shared/resolve-BrsV4Qyc.mjs +5 -0
  77. package/dist/packem_shared/resolve-target-C_ZloTvd.mjs +1 -0
  78. package/dist/packem_shared/runAddCommand-DTvfp4h2.mjs +1 -0
  79. package/dist/packem_shared/runExportCommand-slAq5BCF.mjs +5 -0
  80. package/dist/packem_shared/runMigrateGenerateCommand-BwemPIOz.mjs +11 -0
  81. package/dist/packem_shared/schemaIrToSnapshot-BHuNOfgs.mjs +1 -0
  82. package/dist/packem_shared/secret-key-6bCftsxj.mjs +1 -0
  83. package/dist/packem_shared/shared-D-zCOmgY.mjs +1 -0
  84. package/dist/packem_shared/storage-DWhTX8eS.mjs +1 -0
  85. package/dist/packem_shared/tui-prompts-B3YwUhGw.mjs +4 -0
  86. package/dist/packem_shared/variables-CPYyJtsL.mjs +1 -0
  87. package/dist/packem_shared/wrangler-name-Dsk5K1f-.mjs +1 -0
  88. package/dist/packem_shared/wrangler-secrets-3chIVv3H.mjs +1 -0
  89. package/package.json +39 -19
  90. package/skills/README.md +35 -17
  91. package/skills/lunora/SKILL.md +154 -64
  92. package/skills/lunora-create-package/SKILL.md +97 -84
  93. package/skills/lunora-deploy/SKILL.md +175 -105
  94. package/skills/lunora-functions/SKILL.md +362 -56
  95. package/skills/lunora-migration-helper/SKILL.md +162 -137
  96. package/skills/lunora-performance-audit/SKILL.md +137 -95
  97. package/skills/lunora-quickstart/SKILL.md +137 -136
  98. package/skills/lunora-realtime/SKILL.md +140 -99
  99. package/skills/lunora-setup-auth/SKILL.md +162 -102
  100. package/skills/lunora-setup-hyperdrive/SKILL.md +114 -97
  101. package/skills/lunora-setup-hyperdrive-global/SKILL.md +93 -90
  102. package/skills/lunora-setup-mail/SKILL.md +85 -113
  103. package/skills/lunora-setup-scheduler/SKILL.md +132 -96
  104. package/skills/lunora-setup-storage/SKILL.md +189 -95
  105. package/dist/packem_chunks/planDevCommand.mjs +0 -541
  106. package/dist/packem_chunks/runMigrateGenerateCommand.mjs +0 -397
  107. package/dist/packem_shared/COMMANDS-B0ftFD_3.mjs +0 -948
  108. package/dist/packem_shared/DEFAULT_IMPORT_BATCH_SIZE-Ck-2bU08.mjs +0 -244
  109. package/dist/packem_shared/admin-url-4UzT-CI4.mjs +0 -19
  110. package/dist/packem_shared/api-spec-CtA6ilu4.mjs +0 -13
  111. package/dist/packem_shared/buildRegistryIndex-BcYe607_.mjs +0 -38
  112. package/dist/packem_shared/codegen-error-DJG-ghs_.mjs +0 -31
  113. package/dist/packem_shared/command-D3lB_4Az.mjs +0 -19
  114. package/dist/packem_shared/commands-B-gR09Z_.mjs +0 -845
  115. package/dist/packem_shared/createLogger-B40gPzQo.mjs +0 -78
  116. package/dist/packem_shared/createRecordingSpawner-DxI3mebw.mjs +0 -43
  117. package/dist/packem_shared/detect-package-manager-DYp7n3mJ.mjs +0 -61
  118. package/dist/packem_shared/diffSnapshots-BeDvvNiF.mjs +0 -161
  119. package/dist/packem_shared/docker-hMQ97KSQ.mjs +0 -21
  120. package/dist/packem_shared/insertSchemaExtension-DAqbfr9Z.mjs +0 -64
  121. package/dist/packem_shared/open-url-Dfq6fAyT.mjs +0 -41
  122. package/dist/packem_shared/output-format-wUvAN6AL.mjs +0 -17
  123. package/dist/packem_shared/parseArgs-YXFuKdEk.mjs +0 -56
  124. package/dist/packem_shared/parseManifest--vZf2FY1.mjs +0 -94
  125. package/dist/packem_shared/prompt-cancelled-APzX1Im-.mjs +0 -9
  126. package/dist/packem_shared/resolve-target-qbsJ_5sF.mjs +0 -16
  127. package/dist/packem_shared/runAddCommand-bnY6-HKb.mjs +0 -4
  128. package/dist/packem_shared/schema-drift-gate-BtBt0as0.mjs +0 -79
  129. package/dist/packem_shared/schemaIrToSnapshot-DdsljJT-.mjs +0 -43
  130. package/dist/packem_shared/storage-BIsph-Vk.mjs +0 -84
  131. package/dist/packem_shared/tui-prompts-BjEN8XgP.mjs +0 -658
  132. package/dist/packem_shared/wrangler-name-cy4yhm9j.mjs +0 -12
  133. package/dist/packem_shared/wrangler-secrets-P2_ZUR-k.mjs +0 -47
@@ -0,0 +1,2 @@
1
+ import{readServiceBindings as G,runCodegen as M}from"@lunora/codegen";import{runPostCodegenHook as X,detectAgentRules as F,updateDevServerState as W,readDevServerState as Y,DEV_DAEMON_ENV as x,detectAiAgent as J,readProjectRemotePreference as K,readLiveDevServerState as V,DEV_HANDOFF_ENV as k,clearDevServerState as z,claimDevServerState as Q,DEV_LOG_FILE_ENV as Z,inferLunoraBindings as q,resolveSchemaDirectory as ee,secretSourcesFromBindings as re,ensureDevVarsExample as te,ensureDevVariables as oe,isInteractive as ne,DEV_VARS_FILE as T,DEV_VARS_EXAMPLE_FILE as ae,fillDevSecrets as ie,DEV_BINDINGS_FILE as se,DEV_STATE_FILE as H,claimAgentRulesHint as ce,AGENT_RULES_HINT as de}from"@lunora/config";import{wranglerCodegenInputs as B,resolveRemoteEnabled as le,describeWithheldWorkersAi as ue}from"@lunora/config/cloudflare";import{p as fe,a as ge}from"../packem_shared/deploy-target-DCWwiuAe.mjs";import{w as ve}from"../packem_shared/binding-manifest-file-CQ1eQYy1.mjs";import{existsSync as me,watch as R}from"node:fs";import{join as we,dirname as he}from"node:path";import{a as Se}from"../packem_shared/codegen-error-AmH54ofi.mjs";import{a as ye}from"../packem_shared/platform-diagnostics-Cn2g6Jh-.mjs";import{d as pe}from"../packem_shared/command-CAXl2A1S.mjs";import{EXIT_CODE as D}from"../packem_shared/EXIT_CODE-D_XCixv8.mjs";import{forceJsonLogging as Ee}from"../packem_shared/createLogger-Cl18I8AX.mjs";import{createServer as be,request as ke}from"node:http";import{connect as De}from"node:net";import{pipeline as _e}from"node:stream";import{loadStudioAssets as A,studioAssetsStamp as P,renderStudioHtml as Te,resolveAdminToken as Re,requestPathname as $,transportRejectionReason as O,SCHEMA_EDIT_ENDPOINT as Ae,POLICY_SCAFFOLD_ENDPOINT as Pe,SEED_ENDPOINT as $e,sendStudioDocument as Oe,serveJsonHandler as Ce,isStandaloneModulePath as Le,readStandaloneAsset as Ne,assetContentType as Ie,handleSchemaEditRequest as je,handlePolicyScaffoldRequest as Me,handleSeedRequest as Fe,applyStudioAssetCache as We}from"@lunora/config/studio-host";import{c as xe}from"../packem_shared/tui-prompts-B3YwUhGw.mjs";import{setTimeout as Ve}from"node:timers/promises";import{r as He,d as Be,P as Ue,a as Ge,b as _,c as Xe,s as Ye,n as U,e as Je,f as Ke,g as ze,h as Qe,i as C,w as Ze,j as qe,k as er,t as rr,l as tr,m as or,o as nr}from"../packem_shared/plan-Dl57T11P.mjs";import{provisionBindings as ar}from"./runDeployCommand.mjs";const ir=100,sr=/(?:\.[cm]?[jt]sx?|(?:^|[/\\])tsconfig(?:\..+)?\.json)$/u,cr=300,L=/[/\\]/u,dr=(e,r,t)=>{const{apiSpec:o,logger:a,projectRoot:i,target:u}=e;try{const n=M({apiSpec:o,lunoraDirectory:r,projectRoot:i,target:u,...B(i)});a.success(`codegen: wrote ${r}/_generated (${t})`),ye(n.platformDiagnostics,a)}catch(n){return a.error(Se(n,t)),!1}return!0},lr=e=>{const r=e.lunoraDirectory??"lunora",t=we(e.projectRoot,r),o=e.debounceMs??ir;let a=!1,i=!1,u=!1,n,d=0,v=Promise.resolve(),h;const y=new Promise(f=>{h=f}),w=f=>{a||(n=f,!i&&(i=!0,v=(async()=>{try{for(;n!==void 0;){const g=n;if(n=void 0,!!dr(e,r,g)){u=!0;try{(await X({cwd:e.projectRoot,logger:e.logger,spawner:e.spawner,stdoutToStderr:e.jsonLogs})).ran&&(d=Date.now())}finally{u=!1}}}}catch(g){e.logger.error(`codegen watch: ${g instanceof Error?g.message:String(g)}`)}finally{i=!1,h()}})()))};w("startup");const c=f=>(e.logger.warn(`codegen watch unavailable (${f}) — schema edits will NOT auto-regenerate. Run \`lunora codegen\` manually after each edit.`),{close:()=>(a=!0,n=void 0,v),ready:y,watchAvailable:!1});let s,l;if(!me(t))return c(`no such directory: ${t}`);const m=f=>{if(u||Date.now()-d<cr){s&&(clearTimeout(s),s=void 0);return}s&&clearTimeout(s),s=setTimeout(()=>{w(`change: ${f??"?"}`)},o)},S=[];try{l=R(t,{recursive:!0},(f,g)=>{typeof g=="string"&&g.split(L).includes("_generated")||m(g)});for(const f of G(e.projectRoot).services)if(f.rpcEntrypoint!==void 0){const g=R(he(f.wranglerPath),{recursive:!0},(b,E)=>{typeof E=="string"&&sr.test(E)&&!E.split(L).includes("node_modules")&&m(E)});g.on("error",b=>{e.logger.warn(`codegen watch: stopped watching service "${f.name}" (${b.message})`),g.close()}),S.push(g)}}catch(f){l?.close();for(const g of S)g.close();return c(f instanceof Error?f.message:String(f))}const p=l;return{close:()=>{a=!0,n=void 0,s&&clearTimeout(s),p.close();for(const f of S)f.close();return v},ready:y,watchAvailable:!0}},N="/_lunora",I=3e4,j=(e,r,t)=>{const o=ke({headers:{...e.headers,host:t.host},hostname:t.hostname,method:e.method,path:e.url,port:t.port},a=>{r.writeHead(a.statusCode??502,a.headers),_e(a,r,()=>{})});o.setTimeout(I,()=>{o.destroy(new Error(`no response within ${String(I)}ms`))}),o.on("error",a=>{if(r.headersSent){r.destroy();return}r.statusCode=a.message.startsWith("no response within")?504:502,r.end(`lunora dev: worker unreachable (${a.message})`)}),r.on("close",()=>{r.writableFinished||o.destroy()}),e.pipe(o)},ur=5e3,fr=(e,r,t,o)=>{const a=De({host:o.hostname,port:Number(o.port)},()=>{a.setTimeout(0);const i=[`${e.method??"GET"} ${e.url??"/"} HTTP/1.1`];for(const[u,n]of Object.entries(e.headers))if(u!=="host")for(const d of Array.isArray(n)?n:[n])d!==void 0&&i.push(`${u}: ${d}`);i.push(`host: ${o.host}`,"",""),a.write(i.join(`\r
2
+ `)),t.length>0&&a.write(t),a.pipe(r),r.pipe(a)});a.setTimeout(ur,()=>a.destroy()),a.on("error",()=>r.destroy()),r.on("error",()=>a.destroy())},gr=async e=>{const r=e.host??"127.0.0.1",t=r==="127.0.0.1"||r==="localhost"||r==="::1",o=new URL(e.workerOrigin);let a=A(e.logger,import.meta.url),i=P(import.meta.url);const u=Te({adminToken:t?Re(e.cwd):void 0,basePath:"/",dataEditable:t,rulesInstalled:F(e.cwd).installed,runAsIdentity:t,schemaEditable:t,scriptSrc:"/studio.js",styleHref:"/styles.css"}),n=(c,s,l,m,S)=>{We(c,s,S,i)||(s.statusCode=200,s.setHeader("Content-Type",m),s.end(l))},d=(c,s,l)=>{c.statusCode=s,c.setHeader("Content-Type","text/plain"),c.end(l)},v=(c,s,l,m)=>{if(t){Ce(c,s,l,e.cwd,{apiSpec:e.apiSpec});return}d(s,403,m)},h=(c,s,l)=>{const m=c==="/styles.css",S=Le(c);if(!m&&!S)return!1;const p=P(import.meta.url);if(p!==i&&(a=A(e.logger,import.meta.url),i=p),a===void 0)return d(l,501,"Lunora studio assets not found — install and build @lunora/studio."),!0;if(m)return n(s,l,a.styles,"text/css; charset=utf-8","styles.css"),!0;const f=c.slice(c.lastIndexOf("/")+1),g=Ne(f,import.meta.url);return g===void 0?(d(l,404,"Not found"),!0):(n(s,l,g,Ie(f),f),!0)},y=Buffer.from(u),w=be((c,s)=>{const l=$(c.url??"/");if(t){const S=O(c,e.logger);if(S!==void 0){d(s,403,S);return}}if(l.startsWith(N)){if(!t){d(s,403,"Lunora studio: the worker admin proxy is only available on a loopback bind.");return}j(c,s,o);return}if(l===Ae){v(c,s,je,"Lunora schema editing is only available on loopback hosts in dev.");return}if(l===Pe){v(c,s,Me,"Lunora policy scaffolding is only available on loopback hosts in dev.");return}if(l===$e){v(c,s,Fe,"Lunora data seeding is only available on loopback hosts in dev.");return}if(h(l,c,s))return;const m=c.headers["sec-fetch-mode"];if(t&&typeof m=="string"&&m!=="navigate"){j(c,s,o);return}Oe(s,y)});return w.on("upgrade",(c,s,l)=>{if(!t||O(c,e.logger)!==void 0){s.destroy();return}$(c.url??"").startsWith(N)?fr(c,s,l,o):s.destroy()}),await new Promise((c,s)=>{w.once("error",l=>{l.code==="EADDRINUSE"?s(new Error(`studio port ${String(e.port)} is already in use — pass a different port with --port, or stop the process using it`,{cause:l})):s(l)}),w.listen(e.port,r,()=>{c()})}),{close:()=>new Promise(c=>{w.close(()=>{c()})}),url:`http://${r==="0.0.0.0"||r==="::"?"localhost":r}:${String(e.port)}`}},vr=async e=>{const{cwd:r,logger:t,origin:o,signal:a}=e,i=e.probe??Be,u=He(e.readyTimeoutMs),n=Date.now()+u,d=()=>a.aborted;for(;!d()&&Date.now()<n;){let v=!1;try{v=await i(o,a)}catch{}if(d()||Date.now()>=n)break;if(v)return W(r,{readyAt:new Date().toISOString()},{expectedPid:process.pid}),Y(r)?.readyAt!==void 0;try{await Ve(Ue,void 0,{signal:a})}catch{}}return d()||t.warn(`server did not answer on ${o} within ${String(Math.round(u/1e3))}s — .lunora/dev.json will have no readyAt, so anything polling for readiness will keep waiting. The server itself is unaffected; raise LUNORA_DEV_READY_TIMEOUT_MS if it is just slow to boot.`),!1},mr=(e,r,t,o)=>{e.info(""),e.success("Lunora dev"),e.info(` ➜ Worker: ${r.workerOrigin}`),t!==void 0&&e.info(` ➜ Studio: ${t}`),r.runsCodegenWatch&&e.info(" ➜ Codegen: watching lunora/"),o!==void 0&&e.info(` ➜ Supervisor: ${o} (needs) · ${H} (status)`),r.remote.enabled&&(r.remote.bindings.length>0?e.info(` ➜ Remote: ${r.remote.bindings.join(", ")} → deployed worker`):r.remote.reason!==void 0&&e.warn(` ➜ Remote: requested but inactive (${r.remote.reason}) — running fully local`));for(const a of r.remote.withheld)e.warn(` ➜ ${ue(a)}`);e.info("")},wr=(e,r)=>{F(r).installed||!ce()||(e.info(` ⓘ ${de}`),e.info(""))},hr=async(e,r)=>{try{const o=await q({projectRoot:r,schemaDir:ee(r)}),a=re(o),i=(e.ensureExample??te)(r,a);if(i.length>0){const u=a.map(n=>n.includes(":")?`${n.replace(":"," (")})`:n);e.logger.info(`Updated .dev.vars.example with secrets for: ${u.join(", ")} (${i.join(", ")})`)}}catch{}(await(e.ensureEnv??oe)({confirm:xe(),cwd:r,info:o=>{e.logger.info(o)}})).status==="declined"&&!ne()&&e.logger.info(`hint: ${T} was not scaffolded (non-interactive run). Copy ${ae} → ${T} and fill in secrets, or run \`lunora dev\` in an interactive terminal to scaffold automatically.`);try{(e.fillSecrets??ie)({cwd:r,info:o=>{e.logger.info(o)}})}catch{}},Sr=(e,r,t,o,a)=>{if(e.flavor!=="wrangler")return;o!==void 0&&W(r,{studioUrl:o});let i;try{i=nr(r,t)}catch{}return mr(t,e,o,a),i},yr=(e,r)=>{const t=Number(process.env[k]),o=Q(r,{background:process.env[x]==="1",logFile:process.env[Z],mode:"cli",pid:process.pid,startedAt:new Date().toISOString(),url:e.workerOrigin},Number.isInteger(t)&&t>0?{supersedePid:t}:void 0);return o.ok?void 0:o.existing},pr=e=>{const{cwd:r,destination:t,logger:o,plan:a}=e,i=t!==void 0,u=t??se,n=ve({destination:u,dev:{...a.flavor==="wrangler"?{origin:a.workerOrigin}:{},statusFile:H},logger:i?o:{...o,success:()=>{},warn:()=>{}},projectRoot:r});return n.error!==void 0?i?n:(o.debug?.(`skipped the default binding manifest: ${n.error}`),{}):{written:u}},Er=async(e,r,t,o)=>{if(r.studioEnabled)try{return await(e.startStudio??gr)({apiSpec:e.apiSpec,cwd:t,logger:{warnOnce:a=>{o.warn(a)}},port:r.studioPort,workerOrigin:r.workerOrigin})}catch(a){o.warn(`studio server failed to start (${a instanceof Error?a.message:String(a)}) — continuing without it`);return}},br=e=>{const r=[e.runsCodegenWatch?"codegen watch":void 0,e.studioEnabled?"studio":void 0].filter(o=>o!==void 0);return`--no-worker: not starting wrangler. ${r.length>0?`${r.join(" + ")} running`:"nothing else to run"}; your task runner owns the worker on ${e.workerOrigin}.`},kr=(e,r,t,o,a)=>{if(!(e.sidecar===void 0||!tr(r)))try{M({apiSpec:r.apiSpec,lunoraDirectory:"lunora",projectRoot:t,target:a,...B(t)})}catch(i){o.warn(`codegen (pre-sidecar) failed: ${i instanceof Error?i.message:String(i)} — the framework dev server will retry`)}},Dr=e=>e.flavor==="vite"?"starting vite dev (worker + studio + codegen run inside Vite via @lunora/vite)":`starting ${e.wrangler.tag} dev + studio`,_r=async(e,r,t,o,a)=>{try{return e.celldSession===!0?await or({logger:a,port:e.workerPort,projectRoot:o,start:r.startCelldSession}):t(e.wrangler,a)}catch(i){a.error(`could not start the worker: ${i instanceof Error?i.message:String(i)}`);return}},Tr=async e=>{const{logger:r}=e,t=e.cwd??process.cwd(),o=e.flavor??Je(t),a=ge(t,e.target);if(a.target===void 0)throw new Error(a.error??"unknown deploy target");const{target:i}=a,u=Ke(i,o,r);u==="wrangler"&&await ar(t,r,void 0,i,void 0);const n=await ze({...e,flavor:u,target:i}),d={remoteCleanup:n.remote.cleanup,serviceConfigCleanup:n.serviceConfigCleanup};try{const v=Number(process.env[k]),h=V(t);if(h!==void 0&&h.pid!==process.pid&&h.pid!==v)return _(r,h),{code:0,plan:n};const y=yr(n,t);if(y!==void 0)return _(r,y),{code:0,plan:n};(n.flavor==="vite"||n.flavor==="framework-worker")&&(n.wrangler.env={...n.wrangler.env,[k]:String(process.pid)}),await hr(e,t),r.info(Dr(n)),Qe(r,t),n.ipv4LoopbackForced&&r.info("no IPv6 loopback (::1) on this host — binding the worker to 127.0.0.1 (--ip) so wrangler dev doesn't crash. Pin `dev.ip` in wrangler.jsonc to override."),n.runsCodegenWatch&&(d.codegen=(e.startCodegen??lr)({apiSpec:e.apiSpec,jsonLogs:e.jsonLogs,logger:r,projectRoot:t,target:i})),d.studio=await Er(e,n,t,r);const w=pr({cwd:t,destination:e.emitBindings,logger:r,plan:n});if(w.error!==void 0)return r.error(w.error),{code:D.USAGE,plan:n};await d.codegen?.ready;const c=d.studio?.url;n.frameworkHint!==void 0&&r.warn(n.frameworkHint);const s=()=>{n.flavor==="wrangler"&&(d.readyProbe=new AbortController,vr({cwd:t,logger:r,origin:n.workerOrigin,probe:e.probeReady,signal:d.readyProbe.signal}))};if(!n.workerEnabled)return s(),r.info(br(n)),d.tunnel=C({cwd:t,logger:r,plan:n,tunnel:e.tunnel}),{code:await(e.waitForInterrupt??Ze)(r),plan:n};kr(n,e,t,r,i);const l=e.startWorker??qe,m=await _r(n,e,l,t,r);if(m===void 0)return{code:D.FAILURE,plan:n};const S=n.sidecar===void 0?void 0:l(n.sidecar,r);return s(),d.containerLogs=Sr(n,t,r,c,w.written),d.tunnel=C({cwd:t,logger:r,plan:n,tunnel:e.tunnel}),wr(r,t),{code:await er(m,S,r),plan:n}}finally{d.readyProbe?.abort(),z(t,process.pid),await rr(d)}},Rr=e=>({codegen:e.codegen===!1?!1:void 0,studio:e.studio===!1?!1:void 0,worker:e.worker===!1?!1:void 0}),Ar=e=>{if(e.local===!0&&e.remote===!0)return"`--local` and `--remote` are mutually exclusive — pass at most one.";const{entries:r,invalid:t}=U(e.allowMail);if(t.length>0)return`\`--allow-mail\` takes email addresses or '*@domain' — not ${t.map(o=>`"${o}"`).join(", ")}.`;if(r.length>0&&e.tunnel!==!0)return"`--allow-mail` only applies to a tunnel — add `--tunnel`."},Pr=e=>e.tunnel===!0?{allowMail:U(e.allowMail).entries}:void 0,zr=pe(async({argument:e,cwd:r,logger:t,options:o})=>{const a=o.json===!0,i=Ge({cwd:r,json:a,lines:o.lines,logger:t,subcommand:e[0]});if(i!==void 0)return i;const u=process.env[x]==="1",n=u?void 0:J(),d=a||n!==void 0;d&&Ee(),n!==void 0&&o.background!==!0&&t.info(`AI agent detected (${n.name} via ${n.variable}) — starting the dev server in background mode with JSON logs. Set LUNORA_AGENT_MODE=0 to opt out.`);const v=Ar(o);if(v!==void 0)return t.error(`dev: ${v}`),{code:D.USAGE};const h=Pr(o),y=o.local===!0?!1:le({configPreference:K(r),envValue:process.env.LUNORA_REMOTE,flag:o.remote});if(!u&&(o.background===!0||n!==void 0)){const w=V(r);return w!==void 0?(_(t,w),{code:0}):(h?.allowMail.length===0&&Xe(t),Ye({cwd:r,jsonLogs:d,logger:t,options:o,remote:y}))}return Tr({apiSpec:fe(o.apiSpec),cwd:r,emitBindings:o.emitBindings,inspectorPort:o.inspectorPort,jsonLogs:d,local:o.local,logger:t,port:o.port,remote:y,target:o.target,tunnel:h,workerPort:o.workerPort,...Rr(o)})});export{Ar as devFlagConflict,zr as execute,Rr as negatableDevFlags,Tr as runDevCommand};