Files
dashcaddy/dashcaddy-api/src/utilities/nesting-guard.js
T
Krystie 3da8463cef
CI / Test & Lint (push) Canceled after 0s
CI / Security audit (push) Canceled after 0s
feat: AI intent router live + TOTP repeat-auth fix
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
2026-08-13 03:33:28 -07:00

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);
}
};