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.
- package/bin/jun.js +118 -23
- package/dist/browser-mcp-server.js +42 -0
- package/dist/index.js +55 -55
- package/dist/mcp-server.js +1 -1
- package/package.json +2 -2
- package/ui-dist/assets/BrowserPage-vw54Zy8i.js +1 -0
- package/ui-dist/assets/{DashboardPage-BvNlgB4B.js → DashboardPage-Fae7MOCk.js} +1 -1
- package/ui-dist/assets/{FilesPage-C1IqnxpR.js → FilesPage-DGMWNSyG.js} +1 -1
- package/ui-dist/assets/LogsPage-ChoGgfAX.js +1 -0
- package/ui-dist/assets/McpPage-CZ_0PAsI.js +1 -0
- package/ui-dist/assets/MemoriesPage-j2hFZJtC.js +1 -0
- package/ui-dist/assets/{RunsPage-BpBj82Ux.js → RunsPage-CK9pwAgz.js} +4 -4
- package/ui-dist/assets/SchedulesPage-BdOov1_M.js +1 -0
- package/ui-dist/assets/{SettingsPage-C5vG-RLn.js → SettingsPage-BawGPDde.js} +1 -1
- package/ui-dist/assets/SkillsPage-BoDc74ND.js +1 -0
- package/ui-dist/assets/architecture-7EHR7CIX-4fzAtq46.js +1 -0
- package/ui-dist/assets/{architectureDiagram-3BPJPVTR-CQ1UyWn-.js → architectureDiagram-3BPJPVTR-BP2MZYle.js} +1 -1
- package/ui-dist/assets/{blockDiagram-GPEHLZMM-DO2WH3yT.js → blockDiagram-GPEHLZMM-Af1ue8xv.js} +1 -1
- package/ui-dist/assets/{c4Diagram-AAUBKEIU-CDcDkAFN.js → c4Diagram-AAUBKEIU-AY7PqfkW.js} +1 -1
- package/ui-dist/assets/channel-COgxKgTn.js +1 -0
- package/ui-dist/assets/{checkbox-BO9cBKlP.js → checkbox-B77q6yf0.js} +1 -1
- package/ui-dist/assets/{chunk-2J33WTMH-CxE9IMxF.js → chunk-2J33WTMH-h9HiYY_u.js} +1 -1
- package/ui-dist/assets/{chunk-3OPIFGDE-CWe0ghtO.js → chunk-3OPIFGDE-BhRd3oVg.js} +1 -1
- package/ui-dist/assets/{chunk-5ZQYHXKU-D9lXR7-a.js → chunk-5ZQYHXKU-3UMjEqrw.js} +1 -1
- package/ui-dist/assets/{chunk-727SXJPM-1INZms_u.js → chunk-727SXJPM-BcWt_3lo.js} +1 -1
- package/ui-dist/assets/{chunk-AQP2D5EJ-Bo5P94jR.js → chunk-AQP2D5EJ-Cpch5yeN.js} +1 -1
- package/ui-dist/assets/{chunk-BO2N2NFS-Bb9QKS7r.js → chunk-BO2N2NFS-tci6_YFK.js} +4 -4
- package/ui-dist/assets/{chunk-CSCIHK7Q-BXW0kTPy.js → chunk-CSCIHK7Q-B7WJrDNL.js} +3 -3
- package/ui-dist/assets/{chunk-KSCS5N6A-su0hRnFY.js → chunk-KSCS5N6A-C_P0C3_7.js} +1 -1
- package/ui-dist/assets/{chunk-L5ZTLDWV-CLjULdtO.js → chunk-L5ZTLDWV-CgJ4GCaj.js} +1 -1
- package/ui-dist/assets/{chunk-LZXEDZCA-DSupe1kd.js → chunk-LZXEDZCA-C2PsTcer.js} +2 -2
- package/ui-dist/assets/{chunk-ND2GUHAM-DVaKW6-I.js → chunk-ND2GUHAM-CSipvS6t.js} +1 -1
- package/ui-dist/assets/{chunk-NZK2D7GU-DP_luiUT.js → chunk-NZK2D7GU-BmtPBmfa.js} +1 -1
- package/ui-dist/assets/{chunk-O5CBEL6O-DJ6oobwT.js → chunk-O5CBEL6O-DHg6U4bD.js} +1 -1
- package/ui-dist/assets/{chunk-WU5MYG2G-BJCNi6Df.js → chunk-WU5MYG2G-Jao3JHnT.js} +1 -1
- package/ui-dist/assets/classDiagram-4FO5ZUOK-CxJD7YbT.js +1 -0
- package/ui-dist/assets/classDiagram-v2-Q7XG4LA2-CxJD7YbT.js +1 -0
- package/ui-dist/assets/{collapsible-0tqcZUWD.js → collapsible-CP1QD5GK.js} +1 -1
- package/ui-dist/assets/{dagre-BM42HDAG-CRyL8hRI.js → dagre-BM42HDAG-CmyaiNOn.js} +1 -1
- package/ui-dist/assets/{diagram-2AECGRRQ-DyjpW-BD.js → diagram-2AECGRRQ-C8X3Dn_F.js} +1 -1
- package/ui-dist/assets/{diagram-5GNKFQAL-CBTUCxgf.js → diagram-5GNKFQAL-D7FdDkBI.js} +1 -1
- package/ui-dist/assets/{diagram-KO2AKTUF-C7inOR0g.js → diagram-KO2AKTUF-DTvmbX9D.js} +1 -1
- package/ui-dist/assets/{diagram-LMA3HP47-CfCMRg_H.js → diagram-LMA3HP47-C4ytoinJ.js} +1 -1
- package/ui-dist/assets/{diagram-OG6HWLK6-DLl3GKVl.js → diagram-OG6HWLK6-Ck8n45l9.js} +1 -1
- package/ui-dist/assets/{dialog-gLEpdaG1.js → dialog-CPRWiMQj.js} +1 -1
- package/ui-dist/assets/{erDiagram-TEJ5UH35-D3SsdlGo.js → erDiagram-TEJ5UH35-DEdyi5kb.js} +1 -1
- package/ui-dist/assets/eventmodeling-FCH6USID-CZSE8Xfh.js +1 -0
- package/ui-dist/assets/{flowDiagram-I6XJVG4X-BIZoa3Ff.js → flowDiagram-I6XJVG4X-DJh6JTpP.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-6RSMTGT7-DoIzzrgl.js → ganttDiagram-6RSMTGT7-40CbH6vs.js} +1 -1
- package/ui-dist/assets/{gitGraph-WXDBUCRP-tT7WczwY.js → gitGraph-WXDBUCRP-Bb8N_3_Z.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-PVQCEYII-CwoMoyS1.js → gitGraphDiagram-PVQCEYII-CYO8lsXs.js} +1 -1
- package/ui-dist/assets/{highlighted-body-OFNGDK62-X8dg_vaO.js → highlighted-body-OFNGDK62-C9QojPJP.js} +1 -1
- package/ui-dist/assets/index-CZzHSXB1.css +2 -0
- package/ui-dist/assets/index-CqEDC1ie.js +12 -0
- package/ui-dist/assets/{info-J43DQDTF-Da0djCPL.js → info-J43DQDTF-CuL2NM7A.js} +1 -1
- package/ui-dist/assets/{infoDiagram-5YYISTIA-D-OHDMDH.js → infoDiagram-5YYISTIA-BPLgO20D.js} +1 -1
- package/ui-dist/assets/{input-BPTmfk5i.js → input-B0qeLI2E.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-YF4QCWOH-Bzg0E0Z1.js → ishikawaDiagram-YF4QCWOH-CvaXogtI.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-JHISSGLW-rmeE-f4I.js → journeyDiagram-JHISSGLW-C1J-v-pE.js} +1 -1
- package/ui-dist/assets/{kanban-definition-UN3LZRKU-DSy_xosI.js → kanban-definition-UN3LZRKU-CRmhIHz7.js} +1 -1
- package/ui-dist/assets/katex--eycYE9W.js +1 -0
- package/ui-dist/assets/{line-6Sq5fd7W.js → line-BdBKXCG0.js} +1 -1
- package/ui-dist/assets/mermaid-GHXKKRXX-CvI11iBs.js +1 -0
- package/ui-dist/assets/{mermaid-parser.core-C6nlL4jI.js → mermaid-parser.core-BS-vIFlR.js} +2 -2
- package/ui-dist/assets/{mindmap-definition-RKZ34NQL-CSJ0pwqG.js → mindmap-definition-RKZ34NQL-1LEnd-Xo.js} +1 -1
- package/ui-dist/assets/{packet-YPE3B663-CJYSZVBB.js → packet-YPE3B663-BYcxKrId.js} +1 -1
- package/ui-dist/assets/pause-h76ixDr5.js +1 -0
- package/ui-dist/assets/{pie-LRSECV5Y-B7FDQxHq.js → pie-LRSECV5Y-DYSxmFzY.js} +1 -1
- package/ui-dist/assets/{pieDiagram-4H26LBE5-BYco3Xpn.js → pieDiagram-4H26LBE5-EqE8umht.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-W4KKPZXB-BSzj1BbK.js → quadrantDiagram-W4KKPZXB-CEBlRqkN.js} +1 -1
- package/ui-dist/assets/{radar-GUYGQ44K-CIqNKREz.js → radar-GUYGQ44K-DloreDUf.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-4Y6WPE33-DTMmHobs.js → requirementDiagram-4Y6WPE33-BtG32uo4.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-5OEKKPKP-v48Pd1Sj.js → sankeyDiagram-5OEKKPKP-LFkiQmlj.js} +1 -1
- package/ui-dist/assets/{select-jBmyVjXL.js → select-CF2SUxSi.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-3UESZ5HK-Cutc-QJ-.js → sequenceDiagram-3UESZ5HK-BFABrHKQ.js} +1 -1
- package/ui-dist/assets/{stateDiagram-AJRCARHV-C9wjw5vE.js → stateDiagram-AJRCARHV-UZadGigl.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-BHNVJYJU-BeslXd68.js +1 -0
- package/ui-dist/assets/{tabs-BUCI-mwA.js → tabs-CpVOS0Mr.js} +1 -1
- package/ui-dist/assets/textarea-5JHEEgU-.js +1 -0
- package/ui-dist/assets/{timeline-definition-PNZ67QCA-Be0sJR3F.js → timeline-definition-PNZ67QCA-B0GbqI20.js} +1 -1
- package/ui-dist/assets/trash-2-D4CnL8wv.js +1 -0
- package/ui-dist/assets/{treeView-BLDUP644-BuO1c41a.js → treeView-BLDUP644-COM1up3U.js} +1 -1
- package/ui-dist/assets/{treemap-LRROVOQU-DnqRpBrL.js → treemap-LRROVOQU-CWvutEBH.js} +1 -1
- package/ui-dist/assets/{useCompositeListItem-BMeUcGkY.js → useCompositeListItem-CJiAiQsj.js} +1 -1
- package/ui-dist/assets/{vennDiagram-CIIHVFJN-BU-tyhcP.js → vennDiagram-CIIHVFJN-BU2bLP3c.js} +1 -1
- package/ui-dist/assets/{wardley-L42UT6IY-C4lBe1D1.js → wardley-L42UT6IY-DiQe6mxF.js} +1 -1
- package/ui-dist/assets/{wardleyDiagram-YWT4CUSO-Ba4GgkxA.js → wardleyDiagram-YWT4CUSO-D4BuSn5f.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-2RQKCTM6-BZYGoMGR.js → xychartDiagram-2RQKCTM6-CcKf_YnL.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/BrowserPage-Bw1kBIM_.js +0 -1
- package/ui-dist/assets/McpPage-BgXcKazm.js +0 -1
- package/ui-dist/assets/MemoriesPage-DYOob4W0.js +0 -1
- package/ui-dist/assets/SchedulesPage-mIWaXymg.js +0 -1
- package/ui-dist/assets/SkillsPage-DuFQfdSR.js +0 -1
- package/ui-dist/assets/architecture-7EHR7CIX-BMNBOS2i.js +0 -1
- package/ui-dist/assets/channel-BMSobhoT.js +0 -1
- package/ui-dist/assets/classDiagram-4FO5ZUOK-C8buBHXm.js +0 -1
- package/ui-dist/assets/classDiagram-v2-Q7XG4LA2-C8buBHXm.js +0 -1
- package/ui-dist/assets/eventmodeling-FCH6USID-Dl7jZkr1.js +0 -1
- package/ui-dist/assets/index-C_NJsn6Z.css +0 -2
- package/ui-dist/assets/index-DXYsuK0q.js +0 -12
- package/ui-dist/assets/katex-BNbsei-7.js +0 -1
- package/ui-dist/assets/mermaid-GHXKKRXX-eP_ygZe4.js +0 -1
- package/ui-dist/assets/stateDiagram-v2-BHNVJYJU-0qv-iPvr.js +0 -1
- 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
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
|
60
|
-
|
|
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
|
-
|
|
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
|
-
|
|
69
|
-
|
|
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) {
|