junhost 0.1.2 → 0.2.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.
Files changed (105) hide show
  1. package/bin/jun.js +118 -23
  2. package/dist/browser-mcp-server.js +42 -0
  3. package/dist/index.js +55 -55
  4. package/dist/mcp-server.js +1 -1
  5. package/package.json +2 -2
  6. package/ui-dist/assets/BrowserPage-vw54Zy8i.js +1 -0
  7. package/ui-dist/assets/{DashboardPage-BvNlgB4B.js → DashboardPage-Fae7MOCk.js} +1 -1
  8. package/ui-dist/assets/{FilesPage-C1IqnxpR.js → FilesPage-DGMWNSyG.js} +1 -1
  9. package/ui-dist/assets/LogsPage-ChoGgfAX.js +1 -0
  10. package/ui-dist/assets/McpPage-CZ_0PAsI.js +1 -0
  11. package/ui-dist/assets/MemoriesPage-j2hFZJtC.js +1 -0
  12. package/ui-dist/assets/{RunsPage-BpBj82Ux.js → RunsPage-CK9pwAgz.js} +4 -4
  13. package/ui-dist/assets/SchedulesPage-BdOov1_M.js +1 -0
  14. package/ui-dist/assets/{SettingsPage-C5vG-RLn.js → SettingsPage-BawGPDde.js} +1 -1
  15. package/ui-dist/assets/SkillsPage-BoDc74ND.js +1 -0
  16. package/ui-dist/assets/architecture-7EHR7CIX-4fzAtq46.js +1 -0
  17. package/ui-dist/assets/{architectureDiagram-3BPJPVTR-CQ1UyWn-.js → architectureDiagram-3BPJPVTR-BP2MZYle.js} +1 -1
  18. package/ui-dist/assets/{blockDiagram-GPEHLZMM-DO2WH3yT.js → blockDiagram-GPEHLZMM-Af1ue8xv.js} +1 -1
  19. package/ui-dist/assets/{c4Diagram-AAUBKEIU-CDcDkAFN.js → c4Diagram-AAUBKEIU-AY7PqfkW.js} +1 -1
  20. package/ui-dist/assets/channel-COgxKgTn.js +1 -0
  21. package/ui-dist/assets/{checkbox-BO9cBKlP.js → checkbox-B77q6yf0.js} +1 -1
  22. package/ui-dist/assets/{chunk-2J33WTMH-CxE9IMxF.js → chunk-2J33WTMH-h9HiYY_u.js} +1 -1
  23. package/ui-dist/assets/{chunk-3OPIFGDE-CWe0ghtO.js → chunk-3OPIFGDE-BhRd3oVg.js} +1 -1
  24. package/ui-dist/assets/{chunk-5ZQYHXKU-D9lXR7-a.js → chunk-5ZQYHXKU-3UMjEqrw.js} +1 -1
  25. package/ui-dist/assets/{chunk-727SXJPM-1INZms_u.js → chunk-727SXJPM-BcWt_3lo.js} +1 -1
  26. package/ui-dist/assets/{chunk-AQP2D5EJ-Bo5P94jR.js → chunk-AQP2D5EJ-Cpch5yeN.js} +1 -1
  27. package/ui-dist/assets/{chunk-BO2N2NFS-Bb9QKS7r.js → chunk-BO2N2NFS-tci6_YFK.js} +4 -4
  28. package/ui-dist/assets/{chunk-CSCIHK7Q-BXW0kTPy.js → chunk-CSCIHK7Q-B7WJrDNL.js} +3 -3
  29. package/ui-dist/assets/{chunk-KSCS5N6A-su0hRnFY.js → chunk-KSCS5N6A-C_P0C3_7.js} +1 -1
  30. package/ui-dist/assets/{chunk-L5ZTLDWV-CLjULdtO.js → chunk-L5ZTLDWV-CgJ4GCaj.js} +1 -1
  31. package/ui-dist/assets/{chunk-LZXEDZCA-DSupe1kd.js → chunk-LZXEDZCA-C2PsTcer.js} +2 -2
  32. package/ui-dist/assets/{chunk-ND2GUHAM-DVaKW6-I.js → chunk-ND2GUHAM-CSipvS6t.js} +1 -1
  33. package/ui-dist/assets/{chunk-NZK2D7GU-DP_luiUT.js → chunk-NZK2D7GU-BmtPBmfa.js} +1 -1
  34. package/ui-dist/assets/{chunk-O5CBEL6O-DJ6oobwT.js → chunk-O5CBEL6O-DHg6U4bD.js} +1 -1
  35. package/ui-dist/assets/{chunk-WU5MYG2G-BJCNi6Df.js → chunk-WU5MYG2G-Jao3JHnT.js} +1 -1
  36. package/ui-dist/assets/classDiagram-4FO5ZUOK-CxJD7YbT.js +1 -0
  37. package/ui-dist/assets/classDiagram-v2-Q7XG4LA2-CxJD7YbT.js +1 -0
  38. package/ui-dist/assets/{collapsible-0tqcZUWD.js → collapsible-CP1QD5GK.js} +1 -1
  39. package/ui-dist/assets/{dagre-BM42HDAG-CRyL8hRI.js → dagre-BM42HDAG-CmyaiNOn.js} +1 -1
  40. package/ui-dist/assets/{diagram-2AECGRRQ-DyjpW-BD.js → diagram-2AECGRRQ-C8X3Dn_F.js} +1 -1
  41. package/ui-dist/assets/{diagram-5GNKFQAL-CBTUCxgf.js → diagram-5GNKFQAL-D7FdDkBI.js} +1 -1
  42. package/ui-dist/assets/{diagram-KO2AKTUF-C7inOR0g.js → diagram-KO2AKTUF-DTvmbX9D.js} +1 -1
  43. package/ui-dist/assets/{diagram-LMA3HP47-CfCMRg_H.js → diagram-LMA3HP47-C4ytoinJ.js} +1 -1
  44. package/ui-dist/assets/{diagram-OG6HWLK6-DLl3GKVl.js → diagram-OG6HWLK6-Ck8n45l9.js} +1 -1
  45. package/ui-dist/assets/{dialog-gLEpdaG1.js → dialog-CPRWiMQj.js} +1 -1
  46. package/ui-dist/assets/{erDiagram-TEJ5UH35-D3SsdlGo.js → erDiagram-TEJ5UH35-DEdyi5kb.js} +1 -1
  47. package/ui-dist/assets/eventmodeling-FCH6USID-CZSE8Xfh.js +1 -0
  48. package/ui-dist/assets/{flowDiagram-I6XJVG4X-BIZoa3Ff.js → flowDiagram-I6XJVG4X-DJh6JTpP.js} +1 -1
  49. package/ui-dist/assets/{ganttDiagram-6RSMTGT7-DoIzzrgl.js → ganttDiagram-6RSMTGT7-40CbH6vs.js} +1 -1
  50. package/ui-dist/assets/{gitGraph-WXDBUCRP-tT7WczwY.js → gitGraph-WXDBUCRP-Bb8N_3_Z.js} +1 -1
  51. package/ui-dist/assets/{gitGraphDiagram-PVQCEYII-CwoMoyS1.js → gitGraphDiagram-PVQCEYII-CYO8lsXs.js} +1 -1
  52. package/ui-dist/assets/{highlighted-body-OFNGDK62-X8dg_vaO.js → highlighted-body-OFNGDK62-C9QojPJP.js} +1 -1
  53. package/ui-dist/assets/index-CZzHSXB1.css +2 -0
  54. package/ui-dist/assets/index-CqEDC1ie.js +12 -0
  55. package/ui-dist/assets/{info-J43DQDTF-Da0djCPL.js → info-J43DQDTF-CuL2NM7A.js} +1 -1
  56. package/ui-dist/assets/{infoDiagram-5YYISTIA-D-OHDMDH.js → infoDiagram-5YYISTIA-BPLgO20D.js} +1 -1
  57. package/ui-dist/assets/{input-BPTmfk5i.js → input-B0qeLI2E.js} +1 -1
  58. package/ui-dist/assets/{ishikawaDiagram-YF4QCWOH-Bzg0E0Z1.js → ishikawaDiagram-YF4QCWOH-CvaXogtI.js} +1 -1
  59. package/ui-dist/assets/{journeyDiagram-JHISSGLW-rmeE-f4I.js → journeyDiagram-JHISSGLW-C1J-v-pE.js} +1 -1
  60. package/ui-dist/assets/{kanban-definition-UN3LZRKU-DSy_xosI.js → kanban-definition-UN3LZRKU-CRmhIHz7.js} +1 -1
  61. package/ui-dist/assets/katex--eycYE9W.js +1 -0
  62. package/ui-dist/assets/{line-6Sq5fd7W.js → line-BdBKXCG0.js} +1 -1
  63. package/ui-dist/assets/mermaid-GHXKKRXX-CvI11iBs.js +1 -0
  64. package/ui-dist/assets/{mermaid-parser.core-C6nlL4jI.js → mermaid-parser.core-BS-vIFlR.js} +2 -2
  65. package/ui-dist/assets/{mindmap-definition-RKZ34NQL-CSJ0pwqG.js → mindmap-definition-RKZ34NQL-1LEnd-Xo.js} +1 -1
  66. package/ui-dist/assets/{packet-YPE3B663-CJYSZVBB.js → packet-YPE3B663-BYcxKrId.js} +1 -1
  67. package/ui-dist/assets/pause-h76ixDr5.js +1 -0
  68. package/ui-dist/assets/{pie-LRSECV5Y-B7FDQxHq.js → pie-LRSECV5Y-DYSxmFzY.js} +1 -1
  69. package/ui-dist/assets/{pieDiagram-4H26LBE5-BYco3Xpn.js → pieDiagram-4H26LBE5-EqE8umht.js} +1 -1
  70. package/ui-dist/assets/{quadrantDiagram-W4KKPZXB-BSzj1BbK.js → quadrantDiagram-W4KKPZXB-CEBlRqkN.js} +1 -1
  71. package/ui-dist/assets/{radar-GUYGQ44K-CIqNKREz.js → radar-GUYGQ44K-DloreDUf.js} +1 -1
  72. package/ui-dist/assets/{requirementDiagram-4Y6WPE33-DTMmHobs.js → requirementDiagram-4Y6WPE33-BtG32uo4.js} +1 -1
  73. package/ui-dist/assets/{sankeyDiagram-5OEKKPKP-v48Pd1Sj.js → sankeyDiagram-5OEKKPKP-LFkiQmlj.js} +1 -1
  74. package/ui-dist/assets/{select-jBmyVjXL.js → select-CF2SUxSi.js} +1 -1
  75. package/ui-dist/assets/{sequenceDiagram-3UESZ5HK-Cutc-QJ-.js → sequenceDiagram-3UESZ5HK-BFABrHKQ.js} +1 -1
  76. package/ui-dist/assets/{stateDiagram-AJRCARHV-C9wjw5vE.js → stateDiagram-AJRCARHV-UZadGigl.js} +1 -1
  77. package/ui-dist/assets/stateDiagram-v2-BHNVJYJU-BeslXd68.js +1 -0
  78. package/ui-dist/assets/{tabs-BUCI-mwA.js → tabs-CpVOS0Mr.js} +1 -1
  79. package/ui-dist/assets/textarea-5JHEEgU-.js +1 -0
  80. package/ui-dist/assets/{timeline-definition-PNZ67QCA-Be0sJR3F.js → timeline-definition-PNZ67QCA-B0GbqI20.js} +1 -1
  81. package/ui-dist/assets/trash-2-D4CnL8wv.js +1 -0
  82. package/ui-dist/assets/{treeView-BLDUP644-BuO1c41a.js → treeView-BLDUP644-COM1up3U.js} +1 -1
  83. package/ui-dist/assets/{treemap-LRROVOQU-DnqRpBrL.js → treemap-LRROVOQU-CWvutEBH.js} +1 -1
  84. package/ui-dist/assets/{useCompositeListItem-BMeUcGkY.js → useCompositeListItem-CJiAiQsj.js} +1 -1
  85. package/ui-dist/assets/{vennDiagram-CIIHVFJN-BU-tyhcP.js → vennDiagram-CIIHVFJN-BU2bLP3c.js} +1 -1
  86. package/ui-dist/assets/{wardley-L42UT6IY-C4lBe1D1.js → wardley-L42UT6IY-DiQe6mxF.js} +1 -1
  87. package/ui-dist/assets/{wardleyDiagram-YWT4CUSO-Ba4GgkxA.js → wardleyDiagram-YWT4CUSO-D4BuSn5f.js} +1 -1
  88. package/ui-dist/assets/{xychartDiagram-2RQKCTM6-BZYGoMGR.js → xychartDiagram-2RQKCTM6-CcKf_YnL.js} +1 -1
  89. package/ui-dist/index.html +2 -2
  90. package/ui-dist/assets/BrowserPage-Bw1kBIM_.js +0 -1
  91. package/ui-dist/assets/McpPage-BgXcKazm.js +0 -1
  92. package/ui-dist/assets/MemoriesPage-DYOob4W0.js +0 -1
  93. package/ui-dist/assets/SchedulesPage-mIWaXymg.js +0 -1
  94. package/ui-dist/assets/SkillsPage-DuFQfdSR.js +0 -1
  95. package/ui-dist/assets/architecture-7EHR7CIX-BMNBOS2i.js +0 -1
  96. package/ui-dist/assets/channel-BMSobhoT.js +0 -1
  97. package/ui-dist/assets/classDiagram-4FO5ZUOK-C8buBHXm.js +0 -1
  98. package/ui-dist/assets/classDiagram-v2-Q7XG4LA2-C8buBHXm.js +0 -1
  99. package/ui-dist/assets/eventmodeling-FCH6USID-Dl7jZkr1.js +0 -1
  100. package/ui-dist/assets/index-C_NJsn6Z.css +0 -2
  101. package/ui-dist/assets/index-DXYsuK0q.js +0 -12
  102. package/ui-dist/assets/katex-BNbsei-7.js +0 -1
  103. package/ui-dist/assets/mermaid-GHXKKRXX-eP_ygZe4.js +0 -1
  104. package/ui-dist/assets/stateDiagram-v2-BHNVJYJU-0qv-iPvr.js +0 -1
  105. package/ui-dist/assets/textarea-BkUbRqKD.js +0 -1
package/bin/jun.js CHANGED
@@ -45,39 +45,134 @@ Environment:
45
45
  }
46
46
 
47
47
  async function doctor() {
48
- let ok = true;
49
- const report = (good, label, hint) => {
50
- console.log(`${good ? " ok " : "FAIL "} ${label}${good || !hint ? "" : ` — ${hint}`}`);
51
- if (!good) ok = false;
48
+ const os = await import("node:os");
49
+ const fs = await import("node:fs");
50
+ let failed = false;
51
+ let warned = false;
52
+ // ok | warn | fail, with an optional hint and an indented detail line.
53
+ const report = (state, label, hint, detail) => {
54
+ const tag = state === "ok" ? " ok " : state === "warn" ? " warn " : " FAIL ";
55
+ console.log(`${tag} ${label}${hint && state !== "ok" ? ` — ${hint}` : ""}`);
56
+ if (detail) console.log(` ${detail}`);
57
+ if (state === "fail") failed = true;
58
+ if (state === "warn") warned = true;
59
+ };
60
+ const probe = async (argv) => {
61
+ try {
62
+ const p = Bun.spawn(argv, { stdout: "pipe", stderr: "ignore" });
63
+ const out = await new Response(p.stdout).text();
64
+ await p.exited;
65
+ return { code: p.exitCode, out: out.trim() };
66
+ } catch {
67
+ return { code: -1, out: "" };
68
+ }
52
69
  };
53
70
 
54
- report(true, `bun ${Bun.version}`);
71
+ console.log("Runtime & prerequisites");
72
+ report("ok", `bun ${Bun.version}`);
73
+
74
+ // Codex's npm bin is a Node launcher (#!/usr/bin/env node) — without node on
75
+ // PATH, `codex app-server` dies with "env: node: No such file" (hit on a fresh
76
+ // VPS). So node is a hard requirement even though Jun itself runs on Bun.
77
+ const node = Bun.which("node");
78
+ if (node) report("ok", `node (${(await probe([node, "--version"])).out || node})`);
79
+ else report("fail", "node not found", "Codex's launcher needs it: apt install nodejs (or nvm)");
80
+
55
81
  const codex = Bun.which("codex");
56
- report(Boolean(codex), codex ? `codex CLI (${codex})` : "codex CLI not found", "install with: npm i -g @openai/codex");
57
82
  if (codex) {
83
+ const v = await probe([codex, "--version"]);
84
+ report("ok", `codex CLI — ${v.out || codex}`);
85
+ } else {
86
+ report("fail", "codex CLI not found", "install with: npm i -g @openai/codex");
87
+ }
88
+
89
+ const cloakRoot = path.join(os.homedir(), ".cloakbrowser");
90
+ let cloakChrome = null;
91
+ if (existsSync(cloakRoot)) {
92
+ const dir = fs.readdirSync(cloakRoot).filter((d) => d.startsWith("chromium-")).sort().pop();
93
+ if (dir) {
94
+ const exe = path.join(cloakRoot, dir, process.platform === "win32" ? "chrome.exe" : "chrome");
95
+ if (existsSync(exe)) cloakChrome = exe;
96
+ }
97
+ }
98
+ if (cloakChrome) report("ok", `stealth browser engine (cloakbrowser ${path.basename(path.dirname(cloakChrome))})`);
99
+ else report("warn", "stealth browser engine not downloaded", "fetched on first start (~535MB), or: bun x cloakbrowser install");
100
+
101
+ // The silent killer on Linux: the cloak binary downloads fine but won't launch
102
+ // because Chromium's system libs are missing (libatk/libnss/libgbm…), and
103
+ // agent-browser silently falls back to a blockable engine. Catch it via ldd.
104
+ if (process.platform === "linux" && cloakChrome) {
105
+ const ldd = await probe(["ldd", cloakChrome]);
106
+ const missing = ldd.out
107
+ .split("\n")
108
+ .filter((l) => l.includes("not found"))
109
+ .map((l) => l.trim().split(" ")[0]);
110
+ if (missing.length) {
111
+ report(
112
+ "fail",
113
+ `chromium system libs missing (${missing.length})`,
114
+ "apt install libnss3 libatk1.0-0t64 libatk-bridge2.0-0t64 libcups2t64 libgbm1 libasound2t64 libxkbcommon0 libpango-1.0-0 libxcomposite1 libxdamage1 libxrandr2 libatspi2.0-0",
115
+ missing.slice(0, 6).join(", ") + (missing.length > 6 ? " …" : ""),
116
+ );
117
+ } else {
118
+ report("ok", "chromium system libraries present");
119
+ }
120
+ }
121
+
122
+ // Live daemon checks — only if it's actually up on JUN_HOST:JUN_PORT.
123
+ const host = process.env.JUN_HOST ?? process.env.AGENTHOST_HOST ?? "127.0.0.1";
124
+ const port = Number(process.env.JUN_PORT ?? process.env.AGENTHOST_PORT ?? 8787);
125
+ const base = `http://${host === "0.0.0.0" ? "127.0.0.1" : host}:${port}`;
126
+ const getJson = async (p) => {
58
127
  try {
59
- const proc = Bun.spawn([codex, "--version"], { stdout: "pipe", stderr: "ignore" });
60
- const out = await new Response(proc.stdout).text();
61
- await proc.exited;
62
- console.log(` ${out.trim()}`);
128
+ const res = await fetch(`${base}${p}`, { signal: AbortSignal.timeout(4000) });
129
+ return res.ok ? await res.json() : null;
63
130
  } catch {
64
- /* version probe is best-effort */
131
+ return null;
132
+ }
133
+ };
134
+
135
+ console.log(`\nDaemon (${base})`);
136
+ const health = await getJson("/api/health");
137
+ if (!health) {
138
+ report("warn", "daemon not running (or unreachable)", `start it with: jun start — checked ${base}`);
139
+ } else {
140
+ const status = await getJson("/api/status");
141
+ report("ok", `daemon up — junhost ${status?.version ?? "?"}`);
142
+ if (status?.updateAvailable) {
143
+ report("warn", `update available: ${status.latestVersion}`, "run: jun upgrade");
144
+ }
145
+ if (status?.engine?.crashLooping) {
146
+ report(
147
+ "fail",
148
+ `Codex engine crash-looping (backoff ${Math.ceil((status.engine.backoffMs || 0) / 1000)}s)`,
149
+ `last exit code ${status.engine.lastExitCode} — check auth/memory, journalctl -u jun`,
150
+ );
151
+ }
152
+
153
+ const account = await getJson("/api/account");
154
+ if (account?.account) {
155
+ const a = account.account;
156
+ report("ok", `Codex signed in — ${a.email ?? a.type}${a.planType ? ` (${a.planType})` : ""}`);
157
+ } else if (account?.requiresOpenaiAuth) {
158
+ report("fail", "Codex NOT signed in", "open Settings and sign in (device-code), else runs fail with 401");
159
+ } else {
160
+ report("warn", "Codex auth status unknown");
161
+ }
162
+
163
+ const browser = await getJson("/api/browser/status");
164
+ const b = browser?.status;
165
+ if (b?.running) {
166
+ report("ok", `browser session running — ${b.url || "about:blank"}${b.streaming ? ", streaming" : ""}`);
167
+ } else {
168
+ report("warn", "browser session not running", "starts on demand from the Browser page");
65
169
  }
66
170
  }
67
171
 
68
- const os = await import("node:os");
69
- const cloakRoot = path.join(os.homedir(), ".cloakbrowser");
70
- const hasCloak =
71
- existsSync(cloakRoot) &&
72
- (await import("node:fs")).readdirSync(cloakRoot).some((d) => d.startsWith("chromium-"));
73
- report(
74
- true,
75
- hasCloak
76
- ? "stealth browser engine (cloakbrowser) installed"
77
- : "stealth browser engine not yet downloaded (fetched automatically on first start, ~535MB)",
172
+ console.log(
173
+ `\n${failed ? "✗ Problems found — fix the FAIL items above." : warned ? "✓ Healthy (some warnings)." : "✓ All good."}`,
78
174
  );
79
-
80
- process.exit(ok ? 0 : 1);
175
+ process.exit(failed ? 1 : 0);
81
176
  }
82
177
 
83
178
  switch (command) {