limixbot 0.3.18 → 0.3.19

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 (51) hide show
  1. package/dist/assets/{ActivityPanel-CiVMRvA-.js → ActivityPanel-D0V5shGd.js} +1 -1
  2. package/dist/assets/{App-B612vSUv.js → App-DXv-5ZTc.js} +8 -8
  3. package/dist/assets/{AppEventEditor-Id4kTgLa.js → AppEventEditor-mJOa46It.js} +1 -1
  4. package/dist/assets/{BotSettingsDialog-DdTKCtEA.js → BotSettingsDialog-DOF82zFt.js} +1 -1
  5. package/dist/assets/{BrowserPanel-thqBHOQl.js → BrowserPanel-Cbp7LssC.js} +1 -1
  6. package/dist/assets/{BrowserProfilesManager-J8hqmwv5.js → BrowserProfilesManager-LC4INRs7.js} +1 -1
  7. package/dist/assets/{CloudAddDialog-BNroQCqt.js → CloudAddDialog-DywJ4txo.js} +1 -1
  8. package/dist/assets/{ComputerFilesPane-BXUVfqmc.js → ComputerFilesPane-BjzS9ZTa.js} +1 -1
  9. package/dist/assets/{ComputerPanel-BGE1fw6l.js → ComputerPanel-DGPKl9mx.js} +2 -2
  10. package/dist/assets/{DataPanel-CQWnhToC.js → DataPanel-CowhAHcc.js} +1 -1
  11. package/dist/assets/{FilesView-CYEcHPlb.js → FilesView-Di6bZ56Z.js} +1 -1
  12. package/dist/assets/{GrokMoveDialog-GD3YuWYi.js → GrokMoveDialog-BXwNEoZf.js} +1 -1
  13. package/dist/assets/{InspectorPanel-B_-Xse3K.js → InspectorPanel-gvViZQrp.js} +1 -1
  14. package/dist/assets/{KeyboardShortcutsModal-BAsXL39B.js → KeyboardShortcutsModal-C6gDEGpK.js} +1 -1
  15. package/dist/assets/{LiveDesktop-CLu-oUdB.js → LiveDesktop-BklBBcgn.js} +1 -1
  16. package/dist/assets/{LocalVmWorkspace-CrRurzrY.js → LocalVmWorkspace-D1xWHo1G.js} +1 -1
  17. package/dist/assets/{MacLocalControl-Jp0LjT_C.js → MacLocalControl-BfwVFZRa.js} +1 -1
  18. package/dist/assets/{MarkdownFilePreview-ceD2tKz1.js → MarkdownFilePreview-Cy-DECsV.js} +1 -1
  19. package/dist/assets/{NewBotDialog-C_M8t6Ri.js → NewBotDialog-CRCIYvfv.js} +1 -1
  20. package/dist/assets/{PhoneAppDialog-VezYkaXY.js → PhoneAppDialog-CmcHLaYr.js} +1 -1
  21. package/dist/assets/{PluginsPanel-Bcsv8kad.js → PluginsPanel-C46LU5EJ.js} +1 -1
  22. package/dist/assets/{ProIntroduction-BeqDgqS2.js → ProIntroduction-DuPsMUld.js} +1 -1
  23. package/dist/assets/{RemoteAgentSettingsPanel-Gc-vYBxb.js → RemoteAgentSettingsPanel-BauS0Y0t.js} +1 -1
  24. package/dist/assets/{RoomPanel-DBJbvMf1.js → RoomPanel-BiaRLuVx.js} +1 -1
  25. package/dist/assets/{RoutinesPage-C8O6H_m9.js → RoutinesPage-BeldL46G.js} +1 -1
  26. package/dist/assets/{SettingsModal-C28PTR8i.js → SettingsModal-DBLLYSR2.js} +1 -1
  27. package/dist/assets/{ShareTeamDialog-CSfZehTH.js → ShareTeamDialog-uEP_ILfa.js} +1 -1
  28. package/dist/assets/{SignedInSites-BaywJMFM.js → SignedInSites-BgqjFXnz.js} +1 -1
  29. package/dist/assets/{TeamLibraryPanel-DNEOuAa6.js → TeamLibraryPanel-Bd7HFgTR.js} +1 -1
  30. package/dist/assets/{TeamMapPage-CRIOLuDD.js → TeamMapPage-DslnWFG2.js} +1 -1
  31. package/dist/assets/{TriggersPage-D_HBWqEe.js → TriggersPage-BK73CwJR.js} +1 -1
  32. package/dist/assets/{VisibilitySection-C_Lg0Sxb.js → VisibilitySection-CZVuYCfP.js} +1 -1
  33. package/dist/assets/{WebhookTrigger-Cpp-PlPP.js → WebhookTrigger-DXr8EYFe.js} +1 -1
  34. package/dist/assets/{WorksOnGrid-DxsV4-UT.js → WorksOnGrid-DJJIaPGa.js} +1 -1
  35. package/dist/assets/{core-DUBJa6se.js → core-DIFUUeI5.js} +1 -1
  36. package/dist/assets/{import-name-w5H0_aIa.js → import-name-CFjzsLGq.js} +1 -1
  37. package/dist/assets/{index-CJ71uySw.js → index-BBObcTo5.js} +2 -2
  38. package/dist/assets/{index-B6hNR0We.js → index-D2Hr2dxf.js} +1 -1
  39. package/dist/assets/{mcp-servers-DT3QTM7h.js → mcp-servers-5_CMZE0a.js} +1 -1
  40. package/dist/assets/{new-bot-Wr7msRe_.js → new-bot-BNUINkXW.js} +1 -1
  41. package/dist/assets/{org-library-BTDDXkLR.js → org-library-D71rjidw.js} +1 -1
  42. package/dist/assets/{package-format-ByePhvES.js → package-format-Bc1BWLbR.js} +1 -1
  43. package/dist/assets/{remote-desktop-panel-CMGlHR7t.js → remote-desktop-panel-CG1BY1IR.js} +1 -1
  44. package/dist/index.html +1 -1
  45. package/dist-server/index.js +675 -673
  46. package/dist-server/openmausbot.js +240 -236
  47. package/dist-server/package.json +1 -1
  48. package/dist-server/pair-cli.js +240 -236
  49. package/dist-server/server/drivers/antigravity.js +11 -0
  50. package/dist-server/server/limix-agy-cli.js +65 -0
  51. package/package.json +1 -1
@@ -5,6 +5,7 @@ import { antigravityManagedInstallAvailable, installAntigravityRuntime, resolveA
5
5
  import { resolveAntigravityReleaseAsset } from "./antigravity-release.js";
6
6
  import { VERIFICATION_TEMP_KEY, scheduleAntigravityTempSweep } from "./antigravity-temp.js";
7
7
  import { augmentedPath } from "../env-path.js";
8
+ import { agyCliFor, releaseAgyCli } from "../limix-agy-cli.js";
8
9
  import { bundledEngineCatalog } from "../model-manifest/bundled.js";
9
10
  import { currentEngineCatalog } from "../model-manifest/manifest.js";
10
11
  export const STATIC_ANTIGRAVITY_MODELS = bundledEngineCatalog("antigravity");
@@ -53,6 +54,9 @@ const support = {
53
54
  clientFileSystem: true,
54
55
  sanitizeToolPayload: true,
55
56
  resolveCommand: async (env, config, instanceId) => {
57
+ const agyCli = agyCliFor(instanceId, env);
58
+ if (agyCli)
59
+ return { command: agyCli, args: ["acp"] };
56
60
  const runtime = await resolveAntigravityRuntime(config.cli, env);
57
61
  const profile = await prepareAntigravityProfile({ instanceId, runtime, baseEnv: env });
58
62
  if (profile.tempDirectory)
@@ -64,6 +68,8 @@ const support = {
64
68
  };
65
69
  },
66
70
  resolveModels: async (env, config, instanceId) => {
71
+ if (agyCliFor(instanceId, env))
72
+ return currentEngineCatalog("antigravity");
67
73
  const runtime = await resolveAntigravityRuntime(config.cli, env);
68
74
  const profile = await prepareAntigravityProfile({ instanceId, runtime, baseEnv: env });
69
75
  if (!(await antigravityProfileAuthenticated(profile)))
@@ -80,6 +86,8 @@ const support = {
80
86
  authFailure: "fail",
81
87
  requireAuthenticationBeforeSpawn: true,
82
88
  isAuthenticated: async (env, config, instanceId) => {
89
+ if (agyCliFor(instanceId, env))
90
+ return true;
83
91
  try {
84
92
  const runtime = await resolveAntigravityRuntime(config.cli, env);
85
93
  const profile = await prepareAntigravityProfile({ instanceId, runtime, baseEnv: env });
@@ -90,6 +98,8 @@ const support = {
90
98
  }
91
99
  },
92
100
  snapshot: async (env, config, instanceId) => {
101
+ if (agyCliFor(instanceId, env))
102
+ return { state: "available", version: "Antigravity CLI", authenticated: true };
93
103
  try {
94
104
  const runtime = await resolveAntigravityRuntime(config.cli, env);
95
105
  const profile = await prepareAntigravityProfile({ instanceId, runtime, baseEnv: env });
@@ -180,6 +190,7 @@ export const AntigravityDriver = {
180
190
  signOut: async () => {
181
191
  auth.cancel();
182
192
  await removeAntigravitySignIn(input.instanceId);
193
+ releaseAgyCli(input.instanceId);
183
194
  },
184
195
  dispose: async () => {
185
196
  auth.cancel();
@@ -0,0 +1,65 @@
1
+ // Limix: the fast lane for Google Antigravity. The managed runtime (agy_acp_server, a PyInstaller one-file build)
2
+ // unpacks 0.3-1.3 GB into a temp folder on every launch. Google's Antigravity CLI (`agy`, default install
3
+ // %LOCALAPPDATA%\agy\bin\agy.exe) starts at once and serves the same protocol with `agy acp`. Its Google sign-in
4
+ // lives in the OS keyring, so one computer has ONE such account: the first Antigravity AI that asks gets the CLI
5
+ // lane; every other one keeps the managed runtime with its own profile. LIMIX_AGY_CLI=0 turns the lane off.
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
7
+ import { homedir } from "node:os";
8
+ import { delimiter, join } from "node:path";
9
+ import { DATA_DIR } from "./config.js";
10
+ const claimFile = () => join(DATA_DIR, "limix-agy-cli.json");
11
+ export function findAgyCli(env = process.env) {
12
+ if (env.LIMIX_AGY_CLI === "0")
13
+ return null;
14
+ const win = process.platform === "win32";
15
+ const name = win ? "agy.exe" : "agy";
16
+ const candidates = [];
17
+ const localAppData = env.LOCALAPPDATA ?? process.env.LOCALAPPDATA;
18
+ if (win && localAppData)
19
+ candidates.push(join(localAppData, "agy", "bin", name));
20
+ if (!win)
21
+ candidates.push(join(homedir(), ".local", "bin", name));
22
+ for (const dir of (env.PATH ?? env.Path ?? process.env.PATH ?? "").split(delimiter))
23
+ if (dir)
24
+ candidates.push(join(dir, name));
25
+ return candidates.find((candidate) => existsSync(candidate)) ?? null;
26
+ }
27
+ function claimedBy() {
28
+ try {
29
+ const value = JSON.parse(readFileSync(claimFile(), "utf8"));
30
+ return typeof value.instanceId === "string" ? value.instanceId : null;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ /** The CLI path when `instanceId` owns the CLI lane (claiming it when free), else null. */
37
+ export function agyCliFor(instanceId, env = process.env) {
38
+ const cli = findAgyCli(env);
39
+ if (!cli)
40
+ return null;
41
+ const owner = claimedBy();
42
+ if (owner && owner !== instanceId)
43
+ return null;
44
+ if (!owner) {
45
+ try {
46
+ mkdirSync(DATA_DIR, { recursive: true });
47
+ writeFileSync(claimFile(), JSON.stringify({ instanceId, cli, at: new Date().toISOString() }));
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ return cli;
54
+ }
55
+ /** Signing out of the AI that owns the lane frees it for the next one. */
56
+ export function releaseAgyCli(instanceId) {
57
+ if (claimedBy() !== instanceId)
58
+ return;
59
+ try {
60
+ writeFileSync(claimFile(), JSON.stringify({ instanceId: null }));
61
+ }
62
+ catch {
63
+ // a stale claim only keeps this AI on the CLI lane
64
+ }
65
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "limixbot",
3
- "version": "0.3.18",
3
+ "version": "0.3.19",
4
4
  "description": "Run the Limix Bot server anywhere and pair your devices to it (Leox ৹ Limix AI)",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",