@okhay-p/mivra 0.1.0 → 0.1.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/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, "127.0.0.1");
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
- const record = `${JSON.stringify({ pid, startedAt: (/* @__PURE__ */ new Date()).toISOString() })}
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.`);