vibora 9.0.4 → 9.1.0

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/dist/index.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <link rel="icon" type="image/png" href="/logo.png" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Vibora - Harness Attention. Ship.</title>
8
- <script type="module" crossorigin src="/assets/index-s4vGtpm_.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-iX1eFSbf.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-C4UPW6KM.css">
10
10
  </head>
11
11
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibora",
3
- "version": "9.0.4",
3
+ "version": "9.1.0",
4
4
  "description": "Harness Attention. Orchestrate Agents. Ship.",
5
5
  "license": "PolyForm-Shield-1.0.0",
6
6
  "repository": {
package/server/index.js CHANGED
@@ -173703,7 +173703,8 @@ app4.get("/read", (c) => {
173703
173703
  mimeType,
173704
173704
  size: stat.size,
173705
173705
  lineCount: 0,
173706
- truncated: false
173706
+ truncated: false,
173707
+ mtime: stat.mtime.toISOString()
173707
173708
  });
173708
173709
  }
173709
173710
  const buffer = fs5.readFileSync(resolvedPath);
@@ -173713,7 +173714,8 @@ app4.get("/read", (c) => {
173713
173714
  mimeType: "application/octet-stream",
173714
173715
  size: stat.size,
173715
173716
  lineCount: 0,
173716
- truncated: false
173717
+ truncated: false,
173718
+ mtime: stat.mtime.toISOString()
173717
173719
  });
173718
173720
  }
173719
173721
  const fullContent = buffer.toString("utf-8");
@@ -173728,12 +173730,50 @@ app4.get("/read", (c) => {
173728
173730
  mimeType,
173729
173731
  size: stat.size,
173730
173732
  lineCount: totalLines,
173731
- truncated
173733
+ truncated,
173734
+ mtime: stat.mtime.toISOString()
173732
173735
  });
173733
173736
  } catch (err) {
173734
173737
  return c.json({ error: err instanceof Error ? err.message : "Failed to read file" }, 500);
173735
173738
  }
173736
173739
  });
173740
+ app4.get("/file-stat", (c) => {
173741
+ const filePath = c.req.query("path");
173742
+ const root = c.req.query("root");
173743
+ if (!filePath) {
173744
+ return c.json({ error: "path parameter is required" }, 400);
173745
+ }
173746
+ if (!root) {
173747
+ return c.json({ error: "root parameter is required" }, 400);
173748
+ }
173749
+ const resolvedRoot = path7.resolve(root);
173750
+ const resolvedPath = path7.resolve(resolvedRoot, filePath);
173751
+ if (!isPathWithinRoot(resolvedPath, resolvedRoot)) {
173752
+ return c.json({ error: "Access denied: path outside root" }, 403);
173753
+ }
173754
+ try {
173755
+ if (!fs5.existsSync(resolvedPath)) {
173756
+ return c.json({
173757
+ path: filePath,
173758
+ mtime: "",
173759
+ size: 0,
173760
+ exists: false
173761
+ });
173762
+ }
173763
+ const stat = fs5.statSync(resolvedPath);
173764
+ if (!stat.isFile()) {
173765
+ return c.json({ error: "Path is not a file" }, 400);
173766
+ }
173767
+ return c.json({
173768
+ path: filePath,
173769
+ mtime: stat.mtime.toISOString(),
173770
+ size: stat.size,
173771
+ exists: true
173772
+ });
173773
+ } catch (err) {
173774
+ return c.json({ error: err instanceof Error ? err.message : "Failed to stat file" }, 500);
173775
+ }
173776
+ });
173737
173777
  app4.get("/image", (c) => {
173738
173778
  const filePath = c.req.query("path");
173739
173779
  const root = c.req.query("root");