omnius 1.0.256 β 1.0.257
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.js +243 -3
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -678640,15 +678640,28 @@ body { display:flex; flex-direction:column; height:100vh; margin:0; overflow:hid
|
|
|
678640
678640
|
<div id="activity-feed" style="font-size:0.72rem"></div>
|
|
678641
678641
|
</div>
|
|
678642
678642
|
<div id="projects-panel" style="display:none;flex:1;overflow-y:auto;padding:12px 16px">
|
|
678643
|
-
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:
|
|
678643
|
+
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px">
|
|
678644
678644
|
<h3 style="color:var(--color-brand);font-size:0.7rem;margin:0">Projects</h3>
|
|
678645
|
-
<div style="
|
|
678645
|
+
<div style="display:flex;gap:6px;align-items:center">
|
|
678646
|
+
<input id="project-search" type="text" placeholder="Filter projectsβ¦" style="background:var(--color-bg);border:1px solid var(--color-border);color:var(--color-fg);padding:3px 8px;border-radius:3px;font-size:0.65rem;width:140px;font-family:inherit" oninput="filterProjects()">
|
|
678647
|
+
<button id="scan-btn" onclick="scanProjects()" style="background:var(--color-bg);border:1px solid var(--color-border);color:var(--color-fg-subtle);padding:3px 10px;border-radius:3px;font-size:0.65rem;cursor:pointer;font-family:inherit">π Scan</button>
|
|
678648
|
+
<button id="add-project-btn" onclick="showAddProject()" style="background:var(--color-bg);border:1px solid var(--color-border);color:var(--color-fg-subtle);padding:3px 10px;border-radius:3px;font-size:0.65rem;cursor:pointer;font-family:inherit">+ Add</button>
|
|
678649
|
+
</div>
|
|
678646
678650
|
</div>
|
|
678651
|
+
<div style="font-size:0.65rem;color:var(--color-fg-subtle);margin-bottom:10px">Every folder where you have run <code style="color:var(--color-brand)">omnius</code> is registered here. Click to switch workspace.</div>
|
|
678647
678652
|
<div id="projects-current" style="background:var(--color-bg);border-left:2px solid var(--color-brand);padding:8px 12px;margin-bottom:12px;font-size:0.72rem;color:var(--color-fg)">
|
|
678648
678653
|
<span style="color:var(--color-fg-subtle)">current:</span> <span id="projects-current-name" style="color:var(--color-brand)">(none)</span>
|
|
678649
678654
|
<span id="projects-current-root" style="color:var(--color-fg-subtle);margin-left:8px"></span>
|
|
678650
678655
|
</div>
|
|
678651
678656
|
<div id="projects-list" style="font-size:0.72rem"></div>
|
|
678657
|
+
<div id="add-project-form" style="display:none;margin-top:10px;padding:10px;background:var(--color-bg);border:1px solid var(--color-border);border-radius:4px">
|
|
678658
|
+
<div style="font-size:0.7rem;color:var(--color-brand);margin-bottom:6px">Add Project</div>
|
|
678659
|
+
<input id="add-project-path" type="text" placeholder="/absolute/path/to/project" style="background:var(--color-bg-input);border:1px solid var(--color-border);color:var(--color-fg);padding:4px 8px;border-radius:3px;font-size:0.65rem;width:100%;margin-bottom:6px;font-family:inherit">
|
|
678660
|
+
<div style="display:flex;gap:6px">
|
|
678661
|
+
<button onclick="addProject()" style="background:var(--color-brand);border:none;color:#fff;padding:4px 12px;border-radius:3px;font-size:0.65rem;cursor:pointer;font-family:inherit">Register</button>
|
|
678662
|
+
<button onclick="hideAddProject()" style="background:var(--color-bg);border:1px solid var(--color-border);color:var(--color-fg-subtle);padding:4px 12px;border-radius:3px;font-size:0.65rem;cursor:pointer;font-family:inherit">Cancel</button>
|
|
678663
|
+
</div>
|
|
678664
|
+
</div>
|
|
678652
678665
|
</div>
|
|
678653
678666
|
|
|
678654
678667
|
<!-- Voice tab β voicechat toggle + clone management. AudioWorklet drives mic capture; WebAudio handles TTS playback. -->
|
|
@@ -681442,6 +681455,127 @@ async function loadProjects() {
|
|
|
681442
681455
|
}
|
|
681443
681456
|
window.loadProjects = loadProjects;
|
|
681444
681457
|
|
|
681458
|
+
// βββ Scan for Omnius instances on the filesystem βββ
|
|
681459
|
+
async function scanProjects() {
|
|
681460
|
+
const btn = document.getElementById('scan-btn');
|
|
681461
|
+
if (!btn) return;
|
|
681462
|
+
btn.textContent = 'Scanningβ¦';
|
|
681463
|
+
btn.disabled = true;
|
|
681464
|
+
try {
|
|
681465
|
+
const resp = await fetch('/v1/projects/scan', { headers: headers() });
|
|
681466
|
+
if (!resp.ok) {
|
|
681467
|
+
alert('Scan failed: HTTP ' + resp.status);
|
|
681468
|
+
return;
|
|
681469
|
+
}
|
|
681470
|
+
const data = await resp.json();
|
|
681471
|
+
if (!data.projects || data.projects.length === 0) {
|
|
681472
|
+
alert('No Omnius instances found under ' + data.base);
|
|
681473
|
+
return;
|
|
681474
|
+
}
|
|
681475
|
+
const unregistered = data.projects.filter((p: any) => !p.registered);
|
|
681476
|
+
const registered = data.projects.filter((p: any) => p.registered);
|
|
681477
|
+
let html = '<div style="margin-bottom:8px;font-size:0.65rem;color:var(--color-fg-subtle)">Found ' + data.count + ' Omnius instance(s) under <code>' + data.base + '</code></div>';
|
|
681478
|
+
if (registered.length > 0) {
|
|
681479
|
+
html += '<div style="font-size:0.65rem;color:var(--color-fg-subtle);margin-bottom:4px">Already registered:</div>';
|
|
681480
|
+
registered.forEach((p: any) => {
|
|
681481
|
+
html += '<div style="padding:4px 8px;margin:2px 0;font-size:0.65rem;color:var(--color-fg-subtle)">β ' + p.name + ' β ' + p.root + '</div>';
|
|
681482
|
+
});
|
|
681483
|
+
}
|
|
681484
|
+
if (unregistered.length > 0) {
|
|
681485
|
+
html += '<div style="font-size:0.65rem;color:var(--color-fg-subtle);margin:8px 0 4px">Not registered β click to add:</div>';
|
|
681486
|
+
unregistered.forEach((p: any) => {
|
|
681487
|
+
html += '<div class="scan-row" data-root="' + encodeURIComponent(p.root) + '" data-name="' + encodeURIComponent(p.name) + '" style="padding:4px 8px;margin:2px 0;font-size:0.65rem;color:var(--color-brand);cursor:pointer;border:1px dashed var(--color-border);border-radius:3px">' +
|
|
681488
|
+
p.name + ' <span style="color:var(--color-fg-faint)">(' + p.root + ')</span>' +
|
|
681489
|
+
' <span style="color:var(--color-success);font-size:0.6rem">[click to register]</span></div>';
|
|
681490
|
+
});
|
|
681491
|
+
document.querySelectorAll('.scan-row').forEach((el: any) => {
|
|
681492
|
+
el.addEventListener('click', async () => {
|
|
681493
|
+
const root = decodeURIComponent(el.getAttribute('data-root') || '');
|
|
681494
|
+
const name = decodeURIComponent(el.getAttribute('data-name') || '');
|
|
681495
|
+
if (!root) return;
|
|
681496
|
+
el.style.opacity = '0.5';
|
|
681497
|
+
try {
|
|
681498
|
+
const r = await fetch('/v1/projects/register', {
|
|
681499
|
+
method: 'POST',
|
|
681500
|
+
headers: { 'Content-Type': 'application/json', ...headers() },
|
|
681501
|
+
body: JSON.stringify({ root, name }),
|
|
681502
|
+
});
|
|
681503
|
+
if (!r.ok) {
|
|
681504
|
+
const err = await r.json().catch(() => ({ message: 'HTTP ' + r.status }));
|
|
681505
|
+
alert('Register failed: ' + (err.message || err.error || 'unknown'));
|
|
681506
|
+
el.style.opacity = '1';
|
|
681507
|
+
return;
|
|
681508
|
+
}
|
|
681509
|
+
el.textContent = 'β ' + name + ' β registered';
|
|
681510
|
+
el.style.color = 'var(--color-success)';
|
|
681511
|
+
el.style.cursor = 'default';
|
|
681512
|
+
el.style.borderColor = 'var(--color-success)';
|
|
681513
|
+
await loadProjects();
|
|
681514
|
+
} catch (e) {
|
|
681515
|
+
alert('Register failed: ' + (e && e.message ? e.message : String(e)));
|
|
681516
|
+
el.style.opacity = '1';
|
|
681517
|
+
}
|
|
681518
|
+
});
|
|
681519
|
+
});
|
|
681520
|
+
}
|
|
681521
|
+
document.getElementById('projects-list').innerHTML = html;
|
|
681522
|
+
} catch (e) {
|
|
681523
|
+
document.getElementById('projects-list').innerHTML =
|
|
681524
|
+
'<div style="color:var(--color-error)">Scan failed: ' + (e && e.message ? e.message : String(e)) + '</div>';
|
|
681525
|
+
} finally {
|
|
681526
|
+
btn.textContent = 'π Scan';
|
|
681527
|
+
btn.disabled = false;
|
|
681528
|
+
}
|
|
681529
|
+
}
|
|
681530
|
+
window.scanProjects = scanProjects;
|
|
681531
|
+
|
|
681532
|
+
// βββ Manual add project βββ
|
|
681533
|
+
function showAddProject() {
|
|
681534
|
+
const form = document.getElementById('add-project-form');
|
|
681535
|
+
if (form) form.style.display = 'block';
|
|
681536
|
+
}
|
|
681537
|
+
function hideAddProject() {
|
|
681538
|
+
const form = document.getElementById('add-project-form');
|
|
681539
|
+
if (form) form.style.display = 'none';
|
|
681540
|
+
}
|
|
681541
|
+
async function addProject() {
|
|
681542
|
+
const input = document.getElementById('add-project-path');
|
|
681543
|
+
if (!input) return;
|
|
681544
|
+
const root = input.value.trim();
|
|
681545
|
+
if (!root) { alert('Please enter a path.'); return; }
|
|
681546
|
+
try {
|
|
681547
|
+
const r = await fetch('/v1/projects/register', {
|
|
681548
|
+
method: 'POST',
|
|
681549
|
+
headers: { 'Content-Type': 'application/json', ...headers() },
|
|
681550
|
+
body: JSON.stringify({ root, name: root.split('/').pop() }),
|
|
681551
|
+
});
|
|
681552
|
+
if (!r.ok) {
|
|
681553
|
+
const err = await r.json().catch(() => ({ message: 'HTTP ' + r.status }));
|
|
681554
|
+
alert('Register failed: ' + (err.message || err.error || 'unknown'));
|
|
681555
|
+
return;
|
|
681556
|
+
}
|
|
681557
|
+
hideAddProject();
|
|
681558
|
+
input.value = '';
|
|
681559
|
+
await loadProjects();
|
|
681560
|
+
} catch (e) {
|
|
681561
|
+
alert('Register failed: ' + (e && e.message ? e.message : String(e)));
|
|
681562
|
+
}
|
|
681563
|
+
}
|
|
681564
|
+
window.showAddProject = showAddProject;
|
|
681565
|
+
window.hideAddProject = hideAddProject;
|
|
681566
|
+
window.addProject = addProject;
|
|
681567
|
+
|
|
681568
|
+
// βββ Filter projects by search text βββ
|
|
681569
|
+
function filterProjects() {
|
|
681570
|
+
const query = (document.getElementById('project-search') as HTMLInputElement)?.value.toLowerCase() || '';
|
|
681571
|
+
document.querySelectorAll('.proj-row').forEach((el: any) => {
|
|
681572
|
+
const root = (el.getAttribute('data-root') || '').toLowerCase();
|
|
681573
|
+
const name = (el.textContent || '').toLowerCase();
|
|
681574
|
+
el.style.display = (!query || root.includes(query) || name.includes(query)) ? '' : 'none';
|
|
681575
|
+
});
|
|
681576
|
+
}
|
|
681577
|
+
window.filterProjects = filterProjects;
|
|
681578
|
+
|
|
681445
681579
|
// Token counter
|
|
681446
681580
|
let totalTokens = 0;
|
|
681447
681581
|
function updateTokenCounter(n) { totalTokens += n; document.getElementById('token-counter').textContent = totalTokens.toLocaleString() + ' tokens'; }
|
|
@@ -691124,7 +691258,7 @@ async function handleRequest(req3, res, ollamaUrl, verbose, runtimeDefaults = {}
|
|
|
691124
691258
|
const dir = path12.dirname(cssEntry);
|
|
691125
691259
|
const fullPath = path12.join(dir, entry.path);
|
|
691126
691260
|
if (fs11.existsSync(fullPath)) {
|
|
691127
|
-
const stat8 =
|
|
691261
|
+
const stat8 = statSync52(fullPath);
|
|
691128
691262
|
res.writeHead(200, {
|
|
691129
691263
|
"Content-Type": entry.ct,
|
|
691130
691264
|
"Content-Length": String(stat8.size),
|
|
@@ -691482,6 +691616,112 @@ async function handleRequest(req3, res, ollamaUrl, verbose, runtimeDefaults = {}
|
|
|
691482
691616
|
jsonResponse(res, 200, entry);
|
|
691483
691617
|
return;
|
|
691484
691618
|
}
|
|
691619
|
+
if (pathname === "/v1/projects/scan" && method === "GET") {
|
|
691620
|
+
const scanRoot = urlObj.searchParams.get("root");
|
|
691621
|
+
const base3 = scanRoot && scanRoot.trim() ? resolve62(scanRoot.trim()) : homedir54();
|
|
691622
|
+
try {
|
|
691623
|
+
let walk3 = function(dir, depth) {
|
|
691624
|
+
if (depth > 6) return;
|
|
691625
|
+
let entries;
|
|
691626
|
+
try {
|
|
691627
|
+
entries = readdirSync50(dir, { withFileTypes: true });
|
|
691628
|
+
} catch {
|
|
691629
|
+
return;
|
|
691630
|
+
}
|
|
691631
|
+
for (const e2 of entries) {
|
|
691632
|
+
if (!e2.isDirectory()) continue;
|
|
691633
|
+
const child = join159(dir, e2.name);
|
|
691634
|
+
const omniusDir = join159(child, ".omnius");
|
|
691635
|
+
try {
|
|
691636
|
+
if (statSync52(omniusDir).isDirectory()) {
|
|
691637
|
+
const name10 = e2.name;
|
|
691638
|
+
const prefsFile = join159(omniusDir, "config.json");
|
|
691639
|
+
let lastSeen = 0;
|
|
691640
|
+
try {
|
|
691641
|
+
lastSeen = statSync52(prefsFile).mtimeMs;
|
|
691642
|
+
} catch {
|
|
691643
|
+
}
|
|
691644
|
+
if (!lastSeen) {
|
|
691645
|
+
try {
|
|
691646
|
+
lastSeen = statSync52(omniusDir).mtimeMs;
|
|
691647
|
+
} catch {
|
|
691648
|
+
}
|
|
691649
|
+
}
|
|
691650
|
+
found.push({ root: resolve62(child), name: name10, lastSeen, omniusDir });
|
|
691651
|
+
}
|
|
691652
|
+
} catch {
|
|
691653
|
+
}
|
|
691654
|
+
walk3(child, depth + 1);
|
|
691655
|
+
}
|
|
691656
|
+
};
|
|
691657
|
+
var walk2 = walk3;
|
|
691658
|
+
const found = [];
|
|
691659
|
+
walk3(base3, 0);
|
|
691660
|
+
found.sort((a2, b) => b.lastSeen - a2.lastSeen);
|
|
691661
|
+
const registered = listProjects().map((p2) => p2.root);
|
|
691662
|
+
jsonResponse(res, 200, {
|
|
691663
|
+
base: base3,
|
|
691664
|
+
count: found.length,
|
|
691665
|
+
projects: found.map((p2) => ({ ...p2, registered: registered.includes(p2.root) }))
|
|
691666
|
+
});
|
|
691667
|
+
} catch (e2) {
|
|
691668
|
+
jsonResponse(res, 500, { error: "scan_failed", message: e2.message });
|
|
691669
|
+
}
|
|
691670
|
+
return;
|
|
691671
|
+
}
|
|
691672
|
+
if (pathname === "/v1/projects/scan" && method === "GET") {
|
|
691673
|
+
const scanRoot = urlObj.searchParams.get("root");
|
|
691674
|
+
const base3 = scanRoot && scanRoot.trim() ? resolve62(scanRoot.trim()) : homedir54();
|
|
691675
|
+
try {
|
|
691676
|
+
let walk3 = function(dir, depth) {
|
|
691677
|
+
if (depth > 6) return;
|
|
691678
|
+
let entries;
|
|
691679
|
+
try {
|
|
691680
|
+
entries = readdirSync50(dir, { withFileTypes: true });
|
|
691681
|
+
} catch {
|
|
691682
|
+
return;
|
|
691683
|
+
}
|
|
691684
|
+
for (const e2 of entries) {
|
|
691685
|
+
if (!e2.isDirectory()) continue;
|
|
691686
|
+
const child = join159(dir, e2.name);
|
|
691687
|
+
const omniusDir = join159(child, ".omnius");
|
|
691688
|
+
try {
|
|
691689
|
+
if (statSync52(omniusDir).isDirectory()) {
|
|
691690
|
+
const name10 = e2.name;
|
|
691691
|
+
const prefsFile = join159(omniusDir, "config.json");
|
|
691692
|
+
let lastSeen = 0;
|
|
691693
|
+
try {
|
|
691694
|
+
lastSeen = statSync52(prefsFile).mtimeMs;
|
|
691695
|
+
} catch {
|
|
691696
|
+
}
|
|
691697
|
+
if (!lastSeen) {
|
|
691698
|
+
try {
|
|
691699
|
+
lastSeen = statSync52(omniusDir).mtimeMs;
|
|
691700
|
+
} catch {
|
|
691701
|
+
}
|
|
691702
|
+
}
|
|
691703
|
+
found.push({ root: resolve62(child), name: name10, lastSeen, omniusDir });
|
|
691704
|
+
}
|
|
691705
|
+
} catch {
|
|
691706
|
+
}
|
|
691707
|
+
walk3(child, depth + 1);
|
|
691708
|
+
}
|
|
691709
|
+
};
|
|
691710
|
+
var walk2 = walk3;
|
|
691711
|
+
const found = [];
|
|
691712
|
+
walk3(base3, 0);
|
|
691713
|
+
found.sort((a2, b) => b.lastSeen - a2.lastSeen);
|
|
691714
|
+
const registered = listProjects().map((p2) => p2.root);
|
|
691715
|
+
jsonResponse(res, 200, {
|
|
691716
|
+
base: base3,
|
|
691717
|
+
count: found.length,
|
|
691718
|
+
projects: found.map((p2) => ({ ...p2, registered: registered.includes(p2.root) }))
|
|
691719
|
+
});
|
|
691720
|
+
} catch (e2) {
|
|
691721
|
+
jsonResponse(res, 500, { error: "scan_failed", message: e2.message });
|
|
691722
|
+
}
|
|
691723
|
+
return;
|
|
691724
|
+
}
|
|
691485
691725
|
if (pathname === "/v1/projects/preferences") {
|
|
691486
691726
|
const queriedRoot = urlObj.searchParams.get("root");
|
|
691487
691727
|
let targetRoot = null;
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omnius",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.257",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "omnius",
|
|
9
|
-
"version": "1.0.
|
|
9
|
+
"version": "1.0.257",
|
|
10
10
|
"bundleDependencies": [
|
|
11
11
|
"image-to-ascii"
|
|
12
12
|
],
|
package/package.json
CHANGED