AI Intent Router:
- Wired /api/v1/ai/intent and /api/v1/ai/capabilities into app.js
- Pattern matching works offline, no API key needed
- Handles: deploy, recommend, diagnose, backup, health, list
- AI chat floating button on dashboard (🤖)
- Suggestion chips: Deploy Plex, Stream movies, Block ads, System health
- Deploy buttons in chat launch the app selector
TOTP Fix:
- secureFetch() was missing credentials: same-origin
- Session cookie was not being sent on API calls
- Added credentials: same-origin to all fetch calls
- Users no longer prompted for TOTP on every action
Nesting Guard:
- Fixed logging module path (../utils/logging not ./logging)
- Switched to console.log to avoid module export mismatch
MCP Server:
- 551-line JSON-RPC server ready at src/mcp/mcp-server.js
- Configurable via DASHCADDY_URL + DASHCADDY_API_KEY env vars
39 lines
1.4 KiB
JavaScript
39 lines
1.4 KiB
JavaScript
/**
|
|
* Recursive data nesting guard.
|
|
*
|
|
* In past versions, a buggy update/restore path created data/data/data/...
|
|
* directories — each containing a full recursive copy of the parent.
|
|
* This module runs at startup, detects and removes nested duplicates.
|
|
*
|
|
* Add to app.js: require('./utilities/nesting-guard')();
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
module.exports = function nestingGuard() {
|
|
try {
|
|
const paths = require('../config/paths');
|
|
const dataDir = paths.dataDir;
|
|
const dataDataPath = path.join(dataDir, 'data');
|
|
|
|
// If data/data exists, it's a recursive duplicate — remove it
|
|
if (fs.existsSync(dataDataPath)) {
|
|
const stat = fs.statSync(dataDataPath);
|
|
if (stat.isDirectory()) {
|
|
// Verify it's truly a duplicate (contains config.json like the parent)
|
|
const markerFile = path.join(dataDataPath, 'config.json');
|
|
const parentMarker = path.join(dataDir, 'config.json');
|
|
if (fs.existsSync(markerFile) && fs.existsSync(parentMarker)) {
|
|
console.log('[nesting-guard] Removing recursive data nesting: ' + dataDataPath);
|
|
fs.rmSync(dataDataPath, { recursive: true, force: true });
|
|
console.log('[nesting-guard] Recursive nesting removed');
|
|
}
|
|
}
|
|
}
|
|
} catch (e) {
|
|
// Non-fatal — don't crash startup over cleanup
|
|
console.warn('[nesting-guard] Skipped: ' + e.message);
|
|
}
|
|
};
|