@buoy-gg/core 7.0.57 → 7.0.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/buoy.js CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
- "use strict";const http=require("node:http");const fs=require("node:fs");const path=require("node:path");const crypto=require("node:crypto");const{spawn}=require("node:child_process");const SITE=process.env.BUOY_SITE_URL||"https://buoy.gg";const LOGIN_TIMEOUT_MS=5*60*1e3;const ESC="\x1B[";const color=e=>n=>`${ESC}${e}m${n}${ESC}0m`;const cyan=color(36);const green=color(32);const red=color(31);const dim=color(2);const bold=color(1);function log(e){process.stdout.write(`${e}
2
+ "use strict";const http=require("node:http");const fs=require("node:fs");const path=require("node:path");const crypto=require("node:crypto");const{spawn}=require("node:child_process");const SITE=process.env.BUOY_SITE_URL||"https://buoy.gg";const LOGIN_TIMEOUT_MS=5*60*1e3;const ESC="\x1B[";const color=e=>n=>`${ESC}${e}m${n}${ESC}0m`;const cyan=color(36);const green=color(32);const red=color(31);const dim=color(2);const bold=color(1);const yellow=color(33);function log(e){process.stdout.write(`${e}
3
3
  `)}function fail(e){process.stderr.write(`${red("x")} ${e}
4
- `);process.exit(1)}function openBrowser(e){const n=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open";const o=process.platform==="win32"?["/c","start","",e]:[e];try{spawn(n,o,{stdio:"ignore",detached:true}).unref()}catch{}}function detectEnvVarName(e){let n=null;try{const o=path.join(e,"package.json");if(fs.existsSync(o)){const s=JSON.parse(fs.readFileSync(o,"utf8"));const t=Object.assign({},s.dependencies,s.devDependencies);if(t.expo)return"EXPO_PUBLIC_BUOY_KEY";if(t.next)n="NEXT_PUBLIC_BUOY_KEY";else if(t.vite)n="VITE_BUOY_KEY"}if(fs.existsSync(path.join(e,"app.config.js"))||fs.existsSync(path.join(e,"app.config.ts"))){return"EXPO_PUBLIC_BUOY_KEY"}const i=path.join(e,"app.json");if(fs.existsSync(i)){const s=JSON.parse(fs.readFileSync(i,"utf8"));if(s&&s.expo)return"EXPO_PUBLIC_BUOY_KEY"}}catch{}return n||"BUOY_KEY"}function envFileFor(e,n){if(!["EXPO_PUBLIC_BUOY_KEY","VITE_BUOY_KEY","NEXT_PUBLIC_BUOY_KEY"].includes(e))return".env.local";return n==="pro"||n==="business"?".env.local":".env.development.local"}function removeEnvVar(e,n,o){const i=path.join(e,o);let s;try{s=fs.readFileSync(i,"utf8")}catch{return false}const t=new RegExp("^"+n+"=.*\\n?","m");if(!t.test(s))return false;fs.writeFileSync(i,s.replace(t,""),{mode:384});return true}function writeEnvVar(e,n,o,i=".env.local"){const s=path.join(e,i);let t="";try{t=fs.readFileSync(s,"utf8")}catch{}const a=`${n}=${o}`;const r=new RegExp("^"+n+"=.*$","m");if(r.test(t)){t=t.replace(r,a)}else{if(t&&!t.endsWith("\n"))t+="\n";t+=`${a}
5
- `}fs.writeFileSync(s,t,{mode:384});return s}function ensureGitignored(e,n=".env.local"){const o=path.join(e,".gitignore");let i="";try{i=fs.readFileSync(o,"utf8")}catch{return false}const s=new RegExp("^"+n.replace(/\./g,"\\.")+"$","m");if(s.test(i)||/^\.env\*|^\*\.local$|^\.env\*\.local$/m.test(i))return false;if(i&&!i.endsWith("\n"))i+="\n";i+=`
4
+ `);process.exit(1)}function openBrowser(e){const n=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open";const s=process.platform==="win32"?["/c","start","",e]:[e];try{const t=spawn(n,s,{stdio:"ignore",detached:true});t.on("error",()=>{});t.unref()}catch{}}function detectEnvVarName(e){let n=null;try{const s=path.join(e,"package.json");if(fs.existsSync(s)){const o=JSON.parse(fs.readFileSync(s,"utf8"));const i=Object.assign({},o.dependencies,o.devDependencies);if(i.expo)return"EXPO_PUBLIC_BUOY_KEY";if(i.next)n="NEXT_PUBLIC_BUOY_KEY";else if(i.vite)n="VITE_BUOY_KEY"}if(fs.existsSync(path.join(e,"app.config.js"))||fs.existsSync(path.join(e,"app.config.ts"))){return"EXPO_PUBLIC_BUOY_KEY"}const t=path.join(e,"app.json");if(fs.existsSync(t)){const o=JSON.parse(fs.readFileSync(t,"utf8"));if(o&&o.expo)return"EXPO_PUBLIC_BUOY_KEY"}}catch{}return n||"BUOY_KEY"}function envFileFor(e,n){if(!["EXPO_PUBLIC_BUOY_KEY","VITE_BUOY_KEY","NEXT_PUBLIC_BUOY_KEY"].includes(e))return".env.local";return n==="pro"||n==="business"?".env.local":".env.development.local"}function removeEnvVar(e,n,s){const t=path.join(e,s);let o;try{o=fs.readFileSync(t,"utf8")}catch{return false}const i=new RegExp("^"+n+"=.*\\n?","m");if(!i.test(o))return false;fs.writeFileSync(t,o.replace(i,""),{mode:384});return true}function writeEnvVar(e,n,s,t=".env.local"){const o=path.join(e,t);let i="";try{i=fs.readFileSync(o,"utf8")}catch{}const c=`${n}=${s}`;const r=new RegExp("^"+n+"=.*$","m");if(r.test(i)){i=i.replace(r,c)}else{if(i&&!i.endsWith("\n"))i+="\n";i+=`${c}
5
+ `}fs.writeFileSync(o,i,{mode:384});return o}function ensureGitignored(e,n=".env.local"){const s=path.join(e,".gitignore");let t="";try{t=fs.readFileSync(s,"utf8")}catch{return false}const o=new RegExp("^"+n.replace(/\./g,"\\.")+"$","m");if(o.test(t)||/^\.env\*|^\*\.local$|^\.env\*\.local$/m.test(t))return false;if(t&&!t.endsWith("\n"))t+="\n";t+=`
6
6
  # Buoy license key (per developer - do not commit)
7
7
  ${n}
8
- `;fs.writeFileSync(o,i);return true}function awaitKeyFromBrowser(){return new Promise((e,n)=>{const o=crypto.randomBytes(16).toString("hex");const i=http.createServer((s,t)=>{if(s.headers.origin===SITE){t.setHeader("Access-Control-Allow-Origin",SITE);t.setHeader("Access-Control-Allow-Headers","Content-Type");t.setHeader("Access-Control-Allow-Methods","POST, OPTIONS");t.setHeader("Access-Control-Allow-Private-Network","true")}if(s.method==="OPTIONS"){t.writeHead(204).end();return}if(s.method!=="POST"){t.writeHead(405).end();return}let a="";s.on("data",r=>{a+=r;if(a.length>4096)s.destroy()});s.on("end",()=>{let r={};try{r=JSON.parse(a)}catch{}if(r.state!==o||typeof r.key!=="string"||!r.key){t.writeHead(400).end();return}t.writeHead(200,{"Content-Type":"application/json"});t.end('{"ok":true}');i.close();e({key:r.key.trim(),tier:r.tier||"free",email:r.email||""})})});i.on("error",n);i.listen(0,"127.0.0.1",()=>{const{port:s}=i.address();const t=`${SITE}/cli/login?port=${s}&state=${o}`;log("");log(` Opening ${cyan(t)}`);log(dim(" If your browser did not open, paste that URL into a browser on this computer."));log("");log(dim(" Waiting for you to finish signing in..."));openBrowser(t)});setTimeout(()=>{i.close();n(new Error("Timed out waiting for the browser (5 minutes)."))},LOGIN_TIMEOUT_MS).unref()})}function loadSessionClient(){try{const e=require("@buoy-gg/license/headless");if(typeof e.createNodeSession!=="function")return null;return e}catch{return null}}function cliSession(e){return e.createNodeSession({audience:e.CLI_AUDIENCE,signinOrigin:SITE,openBrowser:n=>{log(`${cyan(">")} Opening ${dim(n.split("?")[0])} to sign in...`);log(dim(` If nothing opens, visit:
9
- ${n}`));openBrowser(n)}})}async function signInAndGetDevToken(){const e=loadSessionClient();if(!e)return null;const n=cliSession(e);if(!await n.isAvailable())return null;await n.signIn();const o=await n.devToken();if(!o.ok){throw new Error(`This computer is signed in to Buoy, but no dev token was made: ${o.detail}`)}return{key:o.token,tier:o.tier,email:"",devToken:true}}async function login(){const e=process.cwd();let n;try{n=await signInAndGetDevToken()||await awaitKeyFromBrowser()}catch(c){fail(`${c.message}
10
- No env file was changed.`);return}const o=detectEnvVarName(e);const i=envFileFor(o,n.devToken?"free":n.tier);const s=writeEnvVar(e,o,n.key,i);const t=i!==".env.local"&&removeEnvVar(e,o,".env.local");const a=ensureGitignored(e,i);const r=path.relative(e,s)||i;log("");log(`${green("OK")} Signed in${n.email?" as "+bold(n.email):""} - ${bold(n.tier)} tier`);log(` Wrote ${cyan(o)} to ${cyan(r)}`);if(n.devToken){log(dim(" It is a dev token: it works in dev builds and sims for 30 days. Then run npx buoy login again."));log(dim(" This computer is signed in to Buoy too. The MCP uses it. Sign out: npx buoy logout"))}if(t)log(dim(` Removed the old ${o} line from .env.local`));if(i===".env.development.local"){log(dim(" This file is loaded in development, keeping the key out of production builds."))}if(a)log(dim(` Added ${i} to .gitignore`));log("");log(" Use it in your app:");log("");if(o==="VITE_BUOY_KEY"){log(cyan(" <FloatingDevTools modules={modules} licenseKey={import.meta.env.VITE_BUOY_KEY} />"));log("");log(dim(" Keep your existing tool modules and providers, then reload the web app."))}else if(o==="NEXT_PUBLIC_BUOY_KEY"){log(cyan(" <FloatingDevTools modules={modules} licenseKey={process.env.NEXT_PUBLIC_BUOY_KEY} />"));log("");log(dim(" Restart next dev so it picks up the new variable."))}else{log(cyan(` Buoy.init({ licenseKey: ${o} });`));log("");log(dim(" Swift: pass the key through BuoyConfig.licenseKey in your development build."));log(dim(" Bare React Native does not load .env.local automatically; wire your existing env loader."))}log("")}async function logout(){const e=loadSessionClient();if(!e)fail("This version of Buoy cannot sign in or out. Update @buoy-gg/core.");const n=cliSession(e);const o=await n.load();await n.signOut();log(o.state==="active"?`${green("OK")} Signed out of Buoy on this computer.`:"This computer was not signed in.");log(dim(" Keys in your env files are not changed."))}async function whoami(){const e=loadSessionClient();if(!e)fail("This version of Buoy cannot sign in. Update @buoy-gg/core.");const n=await cliSession(e).load();if(n.state!=="active"){log("Not signed in. Run: npx buoy login");return}log(`${green("Signed in")} - ${bold(n.claims.tier)} plan${n.grace?dim(" (offline, using the grace period)"):""}`)}function help(){log(`
8
+ `;fs.writeFileSync(s,t);return true}const KEY_NAMES=["BUOY_LICENSE_KEY","BUOY_KEY","EXPO_PUBLIC_BUOY_KEY","VITE_BUOY_KEY","NEXT_PUBLIC_BUOY_KEY","REACT_APP_BUOY_KEY"];function findProjectKey(e,n=process.env){for(const s of KEY_NAMES){if(n[s]!==void 0){const t=n[s].trim();return t?{name:s,source:"environment",value:t}:null}}for(const s of[".env.development.local",".env.local",".env"]){let t;try{t=fs.readFileSync(path.join(e,s),"utf8")}catch{continue}const o=new Map;for(const i of t.split(/\r?\n/)){const c=i.match(/^\s*(?:export\s+)?([A-Z_][A-Z_0-9]*)\s*=\s*(.*)$/);if(!c)continue;const r=c[2].trim();const l=r.match(/^(['"])(.*?)\1\s*(?:#.*)?$/);o.set(c[1],l?l[2]:r.split("#")[0].trim())}for(const i of KEY_NAMES){if(!o.has(i))continue;const c=o.get(i).trim();return c?{name:i,source:s,value:c}:null}}return null}function awaitKeyFromBrowser(){return new Promise((e,n)=>{const s=crypto.randomBytes(16).toString("hex");const t=http.createServer((o,i)=>{if(o.headers.origin===SITE){i.setHeader("Access-Control-Allow-Origin",SITE);i.setHeader("Access-Control-Allow-Headers","Content-Type");i.setHeader("Access-Control-Allow-Methods","POST, OPTIONS");i.setHeader("Access-Control-Allow-Private-Network","true")}if(o.method==="OPTIONS"){i.writeHead(204).end();return}if(o.method!=="POST"){i.writeHead(405).end();return}let c="";o.on("data",r=>{c+=r;if(c.length>4096)o.destroy()});o.on("end",()=>{let r={};try{r=JSON.parse(c)}catch{}if(r.state!==s||typeof r.key!=="string"||!r.key){i.writeHead(400).end();return}i.writeHead(200,{"Content-Type":"application/json"});i.end('{"ok":true}');t.close();e({key:r.key.trim(),tier:r.tier||"free",email:r.email||""})})});t.on("error",n);t.listen(0,"127.0.0.1",()=>{const{port:o}=t.address();const i=`${SITE}/cli/login?port=${o}&state=${s}`;log("");log(` Opening ${cyan(i)}`);log(dim(" If your browser did not open, paste that URL into a browser on this computer."));log("");log(dim(" Waiting for you to finish signing in..."));openBrowser(i)});setTimeout(()=>{t.close();n(new Error("Timed out waiting for the browser (5 minutes)."))},LOGIN_TIMEOUT_MS).unref()})}function loadSessionClient(){try{const e=require("@buoy-gg/license/headless");if(typeof e.createNodeSession!=="function")return null;return e}catch{return null}}function cliSession(e){return e.createNodeSession({audience:e.CLI_AUDIENCE,signinOrigin:SITE,openBrowser:n=>{log(`${cyan(">")} Opening ${dim(n.split("?")[0])} to sign in...`);log(dim(` If nothing opens, visit:
9
+ ${n}`));openBrowser(n)}})}async function checkSignIn(e){if(typeof e.checkAvailability==="function")return e.checkAvailability();return await e.isAvailable()?{state:"enabled"}:{state:"unknown"}}async function signInAndGetDevToken(e=loadSessionClient()){if(!e)return{fallback:{state:"unsupported",computerSignedIn:false}};const n=cliSession(e);const s=await checkSignIn(n);if(s.state!=="enabled"){const o=await n.load().catch(()=>null);return{fallback:{...s,computerSignedIn:Boolean(o&&o.state==="active")}}}await n.signIn();const t=await n.devToken();if(!t.ok){throw new Error(`This computer is signed in to Buoy, but no dev token was made: ${t.detail}`)}return{result:{key:t.token,tier:t.tier,email:"",devToken:true}}}function fallbackWarning(e){if(!e)return null;if(e.state==="unknown"){return[`${yellow("!")} This computer could not be signed in. Node may not reach ${SITE}.`," A VPN, proxy or firewall may block it outside your browser."," Update @buoy-gg/license to see the exact reason."]}if(e.state!=="unreachable")return null;const n=[`${yellow("!")} Node could not reach ${SITE} (${e.detail}).`," A VPN, proxy or firewall may block it outside your browser."," The browser can still sign in this project, but not this computer."];if(e.hint)n.push(` ${e.hint}`);return n}function projectOnlyNotes(e,n){const s=e&&e.computerSignedIn?[" This login signed in only this project."," This computer keeps its earlier sign-in, which the MCP uses."," That may be a different account. Check with `npx buoy whoami`."]:[" Only this project is signed in. This computer is not,"," so `npx buoy whoami` will say so.",` The MCP reads the key from ${n} when it runs in this folder.`];if(e&&(e.state==="unreachable"||e.state==="unknown")){s.push(` The MCP checks keys with ${SITE} too, so it needs that to work.`)}return s}async function login(){const e=process.cwd();let n;let s=null;try{const a=await signInAndGetDevToken();if(a.result){n=a.result}else{s=a.fallback;const d=fallbackWarning(s);if(d){log("");d.forEach(p=>log(p))}n=await awaitKeyFromBrowser()}}catch(a){fail(`${a.message}
10
+ No env file was changed.`);return}const t=detectEnvVarName(e);const o=envFileFor(t,n.devToken?"free":n.tier);const i=writeEnvVar(e,t,n.key,o);const c=o===".env.local"?".env.development.local":".env.local";const r=removeEnvVar(e,t,c);const l=ensureGitignored(e,o);const u=path.relative(e,i)||o;log("");log(`${green("OK")} Signed in${n.email?" as "+bold(n.email):""} - ${bold(n.tier)} tier`);log(` Wrote ${cyan(t)} to ${cyan(u)}`);if(n.devToken){log(dim(" It is a dev token: it works in dev builds and sims for 30 days. Then run npx buoy login again."));log(dim(" This computer is signed in to Buoy too. The MCP uses it. Sign out: npx buoy logout"))}else{projectOnlyNotes(s,u).forEach(a=>log(dim(a)))}if(r)log(dim(` Removed the old ${t} line from ${c}`));if(o===".env.development.local"){log(dim(" This file is loaded in development, keeping the key out of production builds."))}if(l)log(dim(` Added ${o} to .gitignore`));log("");log(" Use it in your app:");log("");if(t==="VITE_BUOY_KEY"){log(cyan(" <FloatingDevTools modules={modules} licenseKey={import.meta.env.VITE_BUOY_KEY} />"));log("");log(dim(" Keep your existing tool modules and providers, then reload the web app."))}else if(t==="NEXT_PUBLIC_BUOY_KEY"){log(cyan(" <FloatingDevTools modules={modules} licenseKey={process.env.NEXT_PUBLIC_BUOY_KEY} />"));log("");log(dim(" Restart next dev so it picks up the new variable."))}else{log(cyan(` Buoy.init({ licenseKey: ${t} });`));log("");log(dim(" Swift: pass the key through BuoyConfig.licenseKey in your development build."));log(dim(" Bare React Native does not load .env.local automatically; wire your existing env loader."))}log("")}async function logout(){const e=loadSessionClient();if(!e)fail("This version of Buoy cannot sign in or out. Update @buoy-gg/core.");const n=cliSession(e);const s=await n.load();await n.signOut();log(s.state==="active"?`${green("OK")} Signed out of Buoy on this computer.`:"This computer was not signed in.");log(dim(" Keys in your env files are not changed."))}async function whoami(e=process.cwd(),n=loadSessionClient()){if(!n)fail("This version of Buoy cannot sign in. Update @buoy-gg/core.");const s=await cliSession(n).load();const t=findProjectKey(e);const o=t&&typeof n.isDevToken==="function"&&n.isDevToken(t.value)?"a dev token":"a key";const i=t&&(t.source==="environment"?"your shell environment":t.source);const c=o==="a dev token"&&typeof n.checkDevToken==="function"?n.checkDevToken(t.value):null;const r=c&&!c.ok?c.message:null;if(s.state==="active"){log(`${green("Signed in")} - ${bold(s.claims.tier)} plan${s.grace?dim(" (offline, using the grace period)"):""}`);if(t)log(dim(` This project has ${o} in ${i} (${t.name}).`));if(r)log(` ${yellow("!")} ${r}`);return}if(!t){log("Not signed in. Run: npx buoy login");return}log("Not signed in on this computer.");log(`${green("This project")} has ${o} in ${cyan(i)} (${t.name}).`);if(r)log(` ${yellow("!")} ${r}`);log(dim(" Your app uses that key. The MCP can too, when it runs in this folder."));log(dim(" To sign in this computer as well, run npx buoy login when Node can reach buoy.gg."))}function help(){log(`
11
11
  ${bold("buoy")} - React Buoy CLI
12
12
 
13
13
  ${bold("Usage")}
@@ -18,18 +18,20 @@ ${n}
18
18
  ${bold("Commands")}
19
19
  login Sign in and write a dev token to an env file
20
20
  logout Sign this computer out of Buoy
21
- whoami Show whether this computer is signed in
21
+ whoami Show whether this computer and this project are signed in
22
22
  help Show this message
23
23
 
24
24
  ${bold("Notes")}
25
25
  Run login from your app directory and click Allow in the browser. You get
26
26
  a dev token that works in dev builds for 30 days. Expo uses
27
27
  EXPO_PUBLIC_BUOY_KEY, Vite uses VITE_BUOY_KEY and Next.js uses
28
- NEXT_PUBLIC_BUOY_KEY, all in .env.development.local. Other projects get
29
- BUOY_KEY in .env.local and must pass it in with their own env loader.
28
+ NEXT_PUBLIC_BUOY_KEY. Dev tokens go in .env.development.local. Other
29
+ projects get BUOY_KEY in .env.local and pass it in with their own loader.
30
+ If Node can't reach buoy.gg, login signs in only this project. It writes
31
+ your account key instead, and a Pro or Business key goes in .env.local.
30
32
  For test and store builds, use Sign in with Buoy or a key instead.
31
33
  This command does not install tools or verify a Desktop connection.
32
34
 
33
35
  Docs: ${SITE}/buoy/latest/docs/installation
34
- `)}if(require.main===module){const e=process.argv[2];if(e==="login"){login()}else if(e==="logout"){logout().catch(n=>fail(n.message))}else if(e==="whoami"){whoami().catch(n=>fail(n.message))}else if(!e||e==="help"||e==="--help"||e==="-h"){help()}else{fail(`Unknown command: ${e}
35
- Run \`npx buoy help\` to see what is available.`)}}module.exports={detectEnvVarName,envFileFor,writeEnvVar,removeEnvVar,ensureGitignored,awaitKeyFromBrowser,signInAndGetDevToken};
36
+ `)}if(require.main===module){const e=process.argv[2];if(e==="login"){login().catch(n=>fail(n.message))}else if(e==="logout"){logout().catch(n=>fail(n.message))}else if(e==="whoami"){whoami().catch(n=>fail(n.message))}else if(!e||e==="help"||e==="--help"||e==="-h"){help()}else{fail(`Unknown command: ${e}
37
+ Run \`npx buoy help\` to see what is available.`)}}module.exports={detectEnvVarName,envFileFor,writeEnvVar,removeEnvVar,ensureGitignored,awaitKeyFromBrowser,signInAndGetDevToken,fallbackWarning,projectOnlyNotes,findProjectKey,whoami,KEY_NAMES};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.SDK_VERSION=void 0;const SDK_VERSION=exports.SDK_VERSION="7.0.57";
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.SDK_VERSION=void 0;const SDK_VERSION=exports.SDK_VERSION="7.0.59";
@@ -1 +1 @@
1
- "use strict";export const SDK_VERSION="7.0.57";
1
+ "use strict";export const SDK_VERSION="7.0.59";
@@ -9,5 +9,5 @@
9
9
  * Drift is prevented by a test that fails when this disagrees with
10
10
  * package.json, so a version bump that forgets this file cannot ship.
11
11
  */
12
- export declare const SDK_VERSION = "7.0.57";
12
+ export declare const SDK_VERSION = "7.0.59";
13
13
  //# sourceMappingURL=version.d.ts.map
@@ -9,5 +9,5 @@
9
9
  * Drift is prevented by a test that fails when this disagrees with
10
10
  * package.json, so a version bump that forgets this file cannot ship.
11
11
  */
12
- export declare const SDK_VERSION = "7.0.57";
12
+ export declare const SDK_VERSION = "7.0.59";
13
13
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-gg/core",
3
- "version": "7.0.57",
3
+ "version": "7.0.59",
4
4
  "description": "Floating developer menu and account setup for React Native. Add tool packages and configure Desktop or MCP connections separately.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -61,10 +61,10 @@
61
61
  ],
62
62
  "dependencies": {
63
63
  "react-devtools-core": "6.1.5",
64
- "@buoy-gg/floating-tools-core": "^7.0.57",
65
- "@buoy-gg/license": "^7.0.57",
66
- "@buoy-gg/shared-ui": "^7.0.57",
67
- "@buoy-gg/floating-tools-react": "^7.0.57"
64
+ "@buoy-gg/floating-tools-react": "^7.0.59",
65
+ "@buoy-gg/license": "^7.0.59",
66
+ "@buoy-gg/floating-tools-core": "^7.0.59",
67
+ "@buoy-gg/shared-ui": "^7.0.59"
68
68
  },
69
69
  "peerDependencies": {
70
70
  "react": "*"