@okhay-p/mivra 0.1.0 → 0.1.2
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/README.md
CHANGED
|
@@ -28,4 +28,10 @@ Options: `--port <n>` to use one port only, `--no-open` to skip the browser. `MI
|
|
|
28
28
|
|
|
29
29
|
Only a browser on the same computer can change API keys. Mivra listens on `127.0.0.1` only.
|
|
30
30
|
|
|
31
|
+
Or run it with Docker, keeping data in a volume:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
docker run -d -p 127.0.0.1:4096:4096 -v mivra-data:/data -e OPENROUTER_API_KEY=sk-or-... ghcr.io/okhay-p/mivra
|
|
35
|
+
```
|
|
36
|
+
|
|
31
37
|
Source, issues and design decisions: <https://github.com/okhay-p/mivra>
|
package/dist/cli.js
CHANGED
|
@@ -17,6 +17,7 @@ var RETIRED = ["MIVRA_MODEL", "MIVRA_REASONING_EFFORT"];
|
|
|
17
17
|
function loadConfig(env = process.env) {
|
|
18
18
|
return {
|
|
19
19
|
port: Number(env.MIVRA_PORT ?? 4096),
|
|
20
|
+
host: env.MIVRA_HOST?.trim() || "127.0.0.1",
|
|
20
21
|
portExplicit: env.MIVRA_PORT !== void 0 && env.MIVRA_PORT !== "",
|
|
21
22
|
dataDir: env.MIVRA_DATA_DIR ?? join(homedir(), ".mivra"),
|
|
22
23
|
allowedHosts: (env.MIVRA_ALLOWED_HOSTS ?? "").split(",").map((h) => h.trim()).filter(Boolean),
|
|
@@ -11063,7 +11064,7 @@ var PortInUseError = class extends Error {
|
|
|
11063
11064
|
first;
|
|
11064
11065
|
last;
|
|
11065
11066
|
};
|
|
11066
|
-
async function listenOnFreePort(server, first, attempts2) {
|
|
11067
|
+
async function listenOnFreePort(server, first, attempts2, host = "127.0.0.1") {
|
|
11067
11068
|
for (let port = first; port < first + attempts2; port++) {
|
|
11068
11069
|
try {
|
|
11069
11070
|
await new Promise((resolve, reject) => {
|
|
@@ -11077,7 +11078,7 @@ async function listenOnFreePort(server, first, attempts2) {
|
|
|
11077
11078
|
};
|
|
11078
11079
|
server.once("error", onError);
|
|
11079
11080
|
server.once("listening", onListening);
|
|
11080
|
-
server.listen(port,
|
|
11081
|
+
server.listen(port, host);
|
|
11081
11082
|
});
|
|
11082
11083
|
return server.address().port;
|
|
11083
11084
|
} catch (error) {
|
|
@@ -11133,7 +11134,7 @@ async function startServer({ config, webDist: webDist2, migrationsFolder, portFa
|
|
|
11133
11134
|
}
|
|
11134
11135
|
serveWeb(app, webDist2, token);
|
|
11135
11136
|
const server = createAdaptorServer({ fetch: app.fetch });
|
|
11136
|
-
const port = await listenOnFreePort(server, config.port, portFallback && !config.portExplicit ? PORT_ATTEMPTS : 1);
|
|
11137
|
+
const port = await listenOnFreePort(server, config.port, portFallback && !config.portExplicit ? PORT_ATTEMPTS : 1, config.host);
|
|
11137
11138
|
return {
|
|
11138
11139
|
port,
|
|
11139
11140
|
url: `http://127.0.0.1:${port}`,
|
|
@@ -11285,9 +11286,11 @@ async function answers(url, timeoutMs = 2e3) {
|
|
|
11285
11286
|
return false;
|
|
11286
11287
|
}
|
|
11287
11288
|
}
|
|
11289
|
+
var ownStart;
|
|
11288
11290
|
function isStale(state, now = Date.now()) {
|
|
11289
11291
|
if (!state) return true;
|
|
11290
11292
|
if (!isAlive(state.pid)) return true;
|
|
11293
|
+
if (state.pid === process.pid && state.startedAt !== ownStart) return true;
|
|
11291
11294
|
return !state.url && now - Date.parse(state.startedAt) > STARTING_LIMIT_MS;
|
|
11292
11295
|
}
|
|
11293
11296
|
async function running(dataDir) {
|
|
@@ -11303,7 +11306,8 @@ function removeIfUnchanged(dataDir, state) {
|
|
|
11303
11306
|
}
|
|
11304
11307
|
function claim(dataDir, pid = process.pid) {
|
|
11305
11308
|
mkdirSync4(dataDir, { recursive: true });
|
|
11306
|
-
|
|
11309
|
+
ownStart = (/* @__PURE__ */ new Date()).toISOString();
|
|
11310
|
+
const record = `${JSON.stringify({ pid, startedAt: ownStart })}
|
|
11307
11311
|
`;
|
|
11308
11312
|
for (let attempt = 0; attempt < 3; attempt++) {
|
|
11309
11313
|
try {
|
|
@@ -11480,7 +11484,7 @@ ${error.message}`);
|
|
|
11480
11484
|
}
|
|
11481
11485
|
throw error;
|
|
11482
11486
|
}
|
|
11483
|
-
writeState(config.dataDir, { pid: process.pid, port: server.port, url: server.url, startedAt: (/* @__PURE__ */ new Date()).toISOString() });
|
|
11487
|
+
writeState(config.dataDir, { pid: process.pid, port: server.port, url: server.url, startedAt: readState(config.dataDir)?.startedAt ?? (/* @__PURE__ */ new Date()).toISOString() });
|
|
11484
11488
|
if (server.port !== config.port) err(`Port ${config.port} is in use, so Mivra is on ${server.port}.`);
|
|
11485
11489
|
out(`Mivra is running at ${server.url}`);
|
|
11486
11490
|
out(env.MIVRA_DETACHED === "1" ? `Data: ${config.dataDir}` : `Data: ${config.dataDir}. Press Ctrl+C to stop.`);
|