From 88ad8ed2fbbda61920b11a79df29acb58928b5af Mon Sep 17 00:00:00 2001 From: Agando Date: Sun, 18 Oct 2026 14:05:18 +0200 Subject: newOS4: interactive AI course (terminal module, portal, atlas, telemetry, daily maintenance+cron) + free store card --- api/course/event.php | 40 + course.html | 252 +++ course/atlas.json | 3768 ++++++++++++++++++++++++++++++++++ course/changelog.jsonl | 0 course/chapters/01-orientation.json | 132 ++ course/chapters/02-architecture.json | 131 ++ course/chapters/03-commands.json | 119 ++ course/chapters/04-ai.json | 128 ++ course/chapters/05-modules.json | 115 ++ course/chapters/06-files-cloud.json | 132 ++ course/chapters/07-automation.json | 134 ++ course/chapters/08-build.json | 117 ++ course/course.json | 156 ++ course/faq.json | 3 + course/feed.json | 4 + course/projects/daily-digest.json | 38 + course/projects/notes-bot.json | 39 + course/projects/sync-backup.json | 38 + main.html | 12 +- modules-index.json | 1997 ++++++++++-------- modules/core/core-bundle.js | 12 +- modules/core/module-loader.js | 4 +- modules/core/terminal.js | 12 +- modules/ext/course.js | 323 +++ packages.json | 32 +- scripts/course-daily-update.py | 138 ++ scripts/course-insights.py | 57 + scripts/course-validate.py | 95 + scripts/gen-course-atlas.py | 113 + scripts/newos4-maintain.py | 118 ++ scripts/test-course.mjs | 59 + 31 files changed, 7391 insertions(+), 927 deletions(-) create mode 100644 api/course/event.php create mode 100644 course.html create mode 100644 course/atlas.json create mode 100644 course/changelog.jsonl create mode 100644 course/chapters/01-orientation.json create mode 100644 course/chapters/02-architecture.json create mode 100644 course/chapters/03-commands.json create mode 100644 course/chapters/04-ai.json create mode 100644 course/chapters/05-modules.json create mode 100644 course/chapters/06-files-cloud.json create mode 100644 course/chapters/07-automation.json create mode 100644 course/chapters/08-build.json create mode 100644 course/course.json create mode 100644 course/faq.json create mode 100644 course/feed.json create mode 100644 course/projects/daily-digest.json create mode 100644 course/projects/notes-bot.json create mode 100644 course/projects/sync-backup.json create mode 100644 modules/ext/course.js create mode 100644 scripts/course-daily-update.py create mode 100644 scripts/course-insights.py create mode 100644 scripts/course-validate.py create mode 100644 scripts/gen-course-atlas.py create mode 100644 scripts/newos4-maintain.py create mode 100644 scripts/test-course.mjs diff --git a/api/course/event.php b/api/course/event.php new file mode 100644 index 0000000..696d1c5 --- /dev/null +++ b/api/course/event.php @@ -0,0 +1,40 @@ + 'POST only']); exit; } + +$raw = file_get_contents('php://input'); +if ($raw === false || strlen($raw) === 0) { http_response_code(400); echo json_encode(['error' => 'empty body']); exit; } +if (strlen($raw) > 4096) { http_response_code(413); echo json_encode(['error' => 'payload too large']); exit; } +$p = json_decode($raw, true); +if (!is_array($p)) { http_response_code(400); echo json_encode(['error' => 'invalid json']); exit; } + +$sid = isset($p['sid']) ? substr(preg_replace('/[^a-zA-Z0-9_-]/', '', (string)$p['sid']), 0, 64) : ''; +$type = isset($p['type']) ? (string)$p['type'] : ''; +$allowed = ['lesson_open','lesson_complete','exercise_fail','question','project_open','project_view','quiz_answer']; +if (strlen($sid) < 8 || !in_array($type, $allowed, true)) { http_response_code(400); echo json_encode(['error' => 'sid/type invalid']); exit; } + +$ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; +$dir = __DIR__ . '/../../data/course'; +if (!is_dir($dir)) { mkdir($dir, 0775, true); } +$rlFile = $dir . '/.rl-' . substr(hash('sha256', $ip), 0, 16) . '-' . date('YmdH'); +$hits = file_exists($rlFile) ? (int)file_get_contents($rlFile) : 0; +if ($hits > 120) { http_response_code(429); echo json_encode(['error' => 'rate limited']); exit; } +file_put_contents($rlFile, (string)($hits + 1), LOCK_EX); +if (random_int(1, 50) === 1) { + foreach (glob($dir . '/.rl-*') as $f) { if (filemtime($f) < time() - 172800) @unlink($f); } +} + +$detail = isset($p['detail']) && is_array($p['detail']) ? array_slice($p['detail'], 0, 8, true) : []; +foreach ($detail as $k => $v) { if (is_string($v)) $detail[$k] = substr($v, 0, 300); } +$row = ['ts' => gmdate('c'), 'type' => $type, 'sid' => $sid, + 'version' => substr((string)($p['version'] ?? ''), 0, 40), 'detail' => $detail]; +$out = $dir . '/events-' . date('Ym') . '.jsonl'; +$fp = fopen($out, 'a'); +if ($fp && flock($fp, LOCK_EX)) { fwrite($fp, json_encode($row, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n"); flock($fp, LOCK_UN); fclose($fp); } +http_response_code(200); +echo json_encode(['ok' => true]); diff --git a/course.html b/course.html new file mode 100644 index 0000000..c61a901 --- /dev/null +++ b/course.html @@ -0,0 +1,252 @@ + + + + + + +newOS4 — Interactive Course + + + +
+

📚 newOS4 Course

+ loading… + 0 XP +
+ + + ⌨ Terminal + Help + Modules +
+
+ +

Loading course…

+ +
+ + + diff --git a/course/atlas.json b/course/atlas.json new file mode 100644 index 0000000..e1c6a4e --- /dev/null +++ b/course/atlas.json @@ -0,0 +1,3768 @@ +{ + "version": "2026-10-18T12:01:30Z", + "source_hash": "3295c562f4c4dd30", + "commands": { + "a2a-ack": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "a2a-ack — Acknowledge a message with result", + "builtin": false, + "example": "a2a-ack" + }, + "a2a-list": { + "module": "module-orchestrator", + "file": "modules/core/module-orchestrator.js", + "tier": "core-bundle", + "category": "agents", + "desc": "a2a-list — Show pending A2A messages across all agents", + "builtin": false, + "example": "a2a-list" + }, + "a2a-poll": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "a2a-poll [agentId] — Poll for messages addressed to an agent (default: current or \"user\")", + "builtin": false, + "example": "a2a-poll" + }, + "a2a-post": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "a2a-post — Post an A2A message", + "builtin": false, + "example": "a2a-post" + }, + "a2a-prune": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "a2a-prune — Clean up expired and old completed messages", + "builtin": false, + "example": "a2a-prune" + }, + "a2a-reject": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "a2a-reject — Reject a message with error", + "builtin": false, + "example": "a2a-reject" + }, + "a2a-send": { + "module": "module-orchestrator", + "file": "modules/core/module-orchestrator.js", + "tier": "core-bundle", + "category": "agents", + "desc": "a2a-send — Send an A2A message to an agent's inbox", + "builtin": false, + "example": "a2a-send" + }, + "a2a-status": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "a2a-status — Show scratchpad stats per agent", + "builtin": false, + "example": "a2a-status" + }, + "agent-list": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "module-agent-registry.js — VFS-backed agent directory with A2A contracts", + "builtin": false, + "example": "agent-list" + }, + "agent-loops": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "agent-loops [name|new|edit|delete|clone|export|reset] — Manage agent loop profiles", + "builtin": false, + "example": "agent-loops" + }, + "agent-register": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "module-agent-registry.js — VFS-backed agent directory with A2A contracts", + "builtin": false, + "example": "agent-register" + }, + "agent-status": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "module-agent-registry.js — VFS-backed agent directory with A2A contracts", + "builtin": false, + "example": "agent-status" + }, + "agent-unregister": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "module-agent-registry.js — VFS-backed agent directory with A2A contracts", + "builtin": false, + "example": "agent-unregister" + }, + "ai": { + "module": "module-ollama", + "file": "modules/core/module-ollama.js", + "tier": "core-bundle", + "category": "ai", + "desc": "Extracted from newOS4 index.html — WebX11AIAssistantModule (Full Agent Loop)", + "builtin": false, + "example": "ai" + }, + "ai-allow": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "ai-allow — Confirm pending AI action", + "builtin": false, + "example": "ai-allow" + }, + "ai-clear": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "ai-clear — Clear conversation context", + "builtin": false, + "example": "ai-clear" + }, + "ai-compress": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "ai-compress — command from module-aiassist", + "builtin": false, + "example": "ai-compress" + }, + "ai-config": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "ai-config [key] [value] — View or set AI loop config (max-turns, max-context, confirm-timeout(0=disabled))", + "builtin": false, + "example": "ai-config" + }, + "ai-context": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "ai-context — Show current conversation context", + "builtin": false, + "example": "ai-context" + }, + "ai-deny": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "ai-deny — Deny pending AI action", + "builtin": false, + "example": "ai-deny" + }, + "ai-ignore": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "ai-ignore — Suppress validator warnings for this session", + "builtin": false, + "example": "ai-ignore" + }, + "ai-model": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "ai-model [model] — Show or set AI model", + "builtin": false, + "example": "ai-model" + }, + "ai-stop": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "ai-stop — Cancel current AI operation", + "builtin": false, + "example": "ai-stop" + }, + "ai-system": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "ai-system — Set system prompt", + "builtin": false, + "example": "ai-system" + }, + "alias": { + "module": "alias", + "file": "modules/ext/alias.js", + "tier": "critical-ext-bundle", + "category": "general", + "desc": "List, set, or show aliases (usage: alias [name=value])", + "builtin": false, + "example": "alias" + }, + "analyze": { + "module": "media", + "file": "modules/ext/media.js", + "tier": "ext-auto", + "category": "general", + "desc": "analyze — Analyze image/audio/video. Flags: --frames N, --spectrogram, --beats, --scene", + "builtin": false, + "example": "analyze" + }, + "archive-list": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "archive-list — command from module-aiassist", + "builtin": false, + "example": "archive-list" + }, + "archive-read": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "archive-read — command from module-aiassist", + "builtin": false, + "example": "archive-read" + }, + "ask": { + "module": "module-ollama", + "file": "modules/core/module-ollama.js", + "tier": "core-bundle", + "category": "ai", + "desc": "Extracted from newOS4 index.html — WebX11AIAssistantModule (Full Agent Loop)", + "builtin": false, + "example": "ask" + }, + "base64": { + "module": "busybox", + "file": "modules/ext/busybox.js", + "tier": "critical-ext-bundle", + "category": "shell", + "desc": "base64 [-d] — Base64 encode/decode", + "builtin": false, + "example": "base64" + }, + "basename": { + "module": "busybox", + "file": "modules/ext/busybox.js", + "tier": "critical-ext-bundle", + "category": "shell", + "desc": "basename — Strip directory from path", + "builtin": false, + "example": "basename" + }, + "bench": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "bench [profile] [--tasks=ids] [--repeat=N] — Run benchmark suite on a profile", + "builtin": false, + "example": "bench" + }, + "bench-compare": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "bench-compare — Compare benchmark results of two profiles", + "builtin": false, + "example": "bench-compare" + }, + "bug-report": { + "module": "module-system", + "file": "modules/core/module-system.js", + "tier": "core-bundle", + "category": "system", + "desc": "bug-report — Generate a markdown bug report to /tmp/ for debugging", + "builtin": false, + "example": "bug-report" + }, + "cal": { + "module": "busybox", + "file": "modules/ext/busybox.js", + "tier": "critical-ext-bundle", + "category": "shell", + "desc": "cal [month] [year] — Display an ASCII calendar", + "builtin": false, + "example": "cal" + }, + "calc": { + "module": "calc", + "file": "modules/ext/calc.js", + "tier": "ext-auto", + "category": "general", + "desc": "calc or calc to — Evaluate expressions or convert between units", + "builtin": false, + "example": "calc" + }, + "cat": { + "module": "module-fs", + "file": "modules/core/module-fs.js", + "tier": "core-bundle", + "category": "filesystem", + "desc": "cat — Display file contents", + "builtin": false, + "example": "cat" + }, + "cd": { + "module": "module-fs", + "file": "modules/core/module-fs.js", + "tier": "core-bundle", + "category": "filesystem", + "desc": "cd — Change current directory; cd / to go to root", + "builtin": false, + "example": "cd" + }, + "chat": { + "module": "module-chatstudio", + "file": "modules/core/module-chatstudio.js", + "tier": "core-bundle", + "category": "ai", + "desc": "Toggle the ChatStudio overlay (inside: /setapi, /setmodel, /ask, /help)", + "builtin": false, + "example": "chat" + }, + "checkpoint": { + "module": "module-system", + "file": "modules/core/module-system.js", + "tier": "core-bundle", + "category": "system", + "desc": "checkpoint [name] — Create a VFS snapshot (name defaults to ISO timestamp)", + "builtin": false, + "example": "checkpoint" + }, + "checkpoint-del": { + "module": "module-system", + "file": "modules/core/module-system.js", + "tier": "core-bundle", + "category": "system", + "desc": "checkpoint-del — Delete a VFS checkpoint", + "builtin": false, + "example": "checkpoint-del" + }, + "checkpoint-list": { + "module": "module-system", + "file": "modules/core/module-system.js", + "tier": "core-bundle", + "category": "system", + "desc": "checkpoint-list — List all VFS checkpoints", + "builtin": false, + "example": "checkpoint-list" + }, + "clear": { + "module": "terminal", + "file": "modules/core/terminal.js", + "tier": "core-bundle", + "category": "system", + "desc": "Extracted from newOS4 index.html — WebX11Terminal", + "builtin": true, + "example": "clear" + }, + "cmd-allow": { + "module": "terminal", + "file": "modules/core/terminal.js", + "tier": "core-bundle", + "category": "system", + "desc": "Extracted from newOS4 index.html — WebX11Terminal", + "builtin": true, + "example": "cmd-allow" + }, + "cmd-deny": { + "module": "terminal", + "file": "modules/core/terminal.js", + "tier": "core-bundle", + "category": "system", + "desc": "Extracted from newOS4 index.html — WebX11Terminal", + "builtin": true, + "example": "cmd-deny" + }, + "commit-approve": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "commit-approve — command from module-aiassist", + "builtin": false, + "example": "commit-approve" + }, + "commit-deny": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "commit-deny — command from module-aiassist", + "builtin": false, + "example": "commit-deny" + }, + "commit-status": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "commit-status — command from module-aiassist", + "builtin": false, + "example": "commit-status" + }, + "config": { + "module": "module-config", + "file": "modules/core/module-config.js", + "tier": "core-bundle", + "category": "system", + "desc": "config [key] — Show all config or a specific key", + "builtin": false, + "example": "config" + }, + "config-delete": { + "module": "module-config", + "file": "modules/core/module-config.js", + "tier": "core-bundle", + "category": "system", + "desc": "config-delete — Delete a configuration key", + "builtin": false, + "example": "config-delete" + }, + "config-export": { + "module": "module-config", + "file": "modules/core/module-config.js", + "tier": "core-bundle", + "category": "system", + "desc": "config-export — Export all config as JSON", + "builtin": false, + "example": "config-export" + }, + "config-list": { + "module": "module-config", + "file": "modules/core/module-config.js", + "tier": "core-bundle", + "category": "system", + "desc": "config-list — List all configuration keys", + "builtin": false, + "example": "config-list" + }, + "config-reset": { + "module": "module-config", + "file": "modules/core/module-config.js", + "tier": "core-bundle", + "category": "system", + "desc": "config-reset — Reset all configuration to defaults", + "builtin": false, + "example": "config-reset" + }, + "config-set": { + "module": "module-config", + "file": "modules/core/module-config.js", + "tier": "core-bundle", + "category": "system", + "desc": "config-set — Set a configuration value", + "builtin": false, + "example": "config-set" + }, + "consensus": { + "module": "module-orchestrator", + "file": "modules/core/module-orchestrator.js", + "tier": "core-bundle", + "category": "agents", + "desc": "consensus — Start a consensus round: spawn 3 agents, debate the question, resolve by majority", + "builtin": false, + "example": "consensus" + }, + "consensus-history": { + "module": "module-orchestrator", + "file": "modules/core/module-orchestrator.js", + "tier": "core-bundle", + "category": "agents", + "desc": "consensus-history — Show past consensus rounds and their resolutions", + "builtin": false, + "example": "consensus-history" + }, + "consensus-status": { + "module": "module-orchestrator", + "file": "modules/core/module-orchestrator.js", + "tier": "core-bundle", + "category": "agents", + "desc": "consensus-status — Show current/active consensus round status", + "builtin": false, + "example": "consensus-status" + }, + "context": { + "module": "module-smartctx", + "file": "modules/core/module-smartctx.js", + "tier": "core-bundle", + "category": "ai", + "desc": "context [name] — Set or view current context profile", + "builtin": false, + "example": "context" + }, + "context-auto": { + "module": "module-smartctx", + "file": "modules/core/module-smartctx.js", + "tier": "core-bundle", + "category": "ai", + "desc": "context-auto [on|off] — Toggle auto-routing (detects intent from user input)", + "builtin": false, + "example": "context-auto" + }, + "context-delete": { + "module": "module-smartctx", + "file": "modules/core/module-smartctx.js", + "tier": "core-bundle", + "category": "ai", + "desc": "context-delete — Delete a context profile", + "builtin": false, + "example": "context-delete" + }, + "context-new": { + "module": "module-smartctx", + "file": "modules/core/module-smartctx.js", + "tier": "core-bundle", + "category": "ai", + "desc": "context-new — Create a new context profile", + "builtin": false, + "example": "context-new" + }, + "contexts": { + "module": "module-smartctx", + "file": "modules/core/module-smartctx.js", + "tier": "core-bundle", + "category": "ai", + "desc": "contexts — List all available context profiles", + "builtin": false, + "example": "contexts" + }, + "contract-list": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "module-agent-registry.js — VFS-backed agent directory with A2A contracts", + "builtin": false, + "example": "contract-list" + }, + "contract-register": { + "module": "module-agent-registry", + "file": "modules/core/module-agent-registry.js", + "tier": "core-bundle", + "category": "agents", + "desc": "module-agent-registry.js — VFS-backed agent directory with A2A contracts", + "builtin": false, + "example": "contract-register" + }, + "cp": { + "module": "module-fs", + "file": "modules/core/module-fs.js", + "tier": "core-bundle", + "category": "filesystem", + "desc": "cp — Copy file or directory", + "builtin": false, + "example": "cp" + }, + "cron-clear": { + "module": "cron", + "file": "modules/ext/cron.js", + "tier": "ext-auto", + "category": "automation", + "desc": "cron-clear — Stop all cron jobs", + "builtin": false, + "example": "cron-clear" + }, + "cron-every": { + "module": "cron", + "file": "modules/ext/cron.js", + "tier": "ext-auto", + "category": "automation", + "desc": "cron-every — Schedule a command to run every N seconds", + "builtin": false, + "example": "cron-every" + }, + "cron-list": { + "module": "cron", + "file": "modules/ext/cron.js", + "tier": "ext-auto", + "category": "automation", + "desc": "cron-list — List all active cron jobs", + "builtin": false, + "example": "cron-list" + }, + "cron-stop": { + "module": "cron", + "file": "modules/ext/cron.js", + "tier": "ext-auto", + "category": "automation", + "desc": "cron-stop — Stop a specific cron job", + "builtin": false, + "example": "cron-stop" + }, + "cut": { + "module": "busybox", + "file": "modules/ext/busybox.js", + "tier": "critical-ext-bundle", + "category": "shell", + "desc": "cut -f [-d] — Extract column from file", + "builtin": false, + "example": "cut" + }, + "dashboard": { + "module": "terminal", + "file": "modules/core/terminal.js", + "tier": "core-bundle", + "category": "system", + "desc": "dashboard — command from terminal", + "builtin": true, + "example": "dashboard" + }, + "date": { + "module": "busybox", + "file": "modules/ext/busybox.js", + "tier": "critical-ext-bundle", + "category": "shell", + "desc": "date — Show current date/time (ISO, local, UTC, timestamp)", + "builtin": false, + "example": "date" + }, + "debug": { + "module": "debug-panel", + "file": "modules/ext/debug-panel.js", + "tier": "ext-auto", + "category": "dev", + "desc": "debug — Toggle the debug console panel", + "builtin": false, + "example": "debug" + }, + "debug-ai": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "debug-ai — Toggle AI tool-call debug panel", + "builtin": false, + "example": "debug-ai" + }, + "debug-ai-last": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "debug-ai-last — command from module-aiassist", + "builtin": false, + "example": "debug-ai-last" + }, + "debug-ai-log": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "debug-ai-log — command from module-aiassist", + "builtin": false, + "example": "debug-ai-log" + }, + "debug-ai-send": { + "module": "module-aiassist", + "file": "modules/core/module-aiassist.js", + "tier": "core-bundle", + "category": "ai", + "desc": "debug-ai-send — command from module-aiassist", + "builtin": false, + "example": "debug-ai-send" + }, + "debug-analyze": { + "module": "module-debug-supervisor", + "file": "modules/core/module-debug-supervisor.js", + "tier": "core-bundle", + "category": "general", + "desc": "debug-analyze — Deep analysis of a specific error", + "builtin": false, + "example": "debug-analyze" + }, + "debug-fix": { + "module": "module-debug-supervisor", + "file": "modules/core/module-debug-supervisor.js", + "tier": "core-bundle", + "category": "general", + "desc": "debug-fix — Suggest and optionally apply fix for an error", + "builtin": false, + "example": "debug-fix" + }, + "debug-health": { + "module": "module-debug-supervisor", + "file": "modules/core/module-debug-supervisor.js", + "tier": "core-bundle", + "category": "general", + "desc": "debug-health — Check supervisor module health status", + "builtin": false, + "example": "debug-health" + }, + "debug-history": { + "module": "module-debug-supervisor", + "file": "modules/core/module-debug-supervisor.js", + "tier": "core-bundle", + "category": "general", + "desc": "debug-history [n] — Show last N errors (default: 20)", + "builtin": false, + "example": "debug-history" + }, + "debug-stats": { + "module": "module-debug-supervisor", + "file": "modules/core/module-debug-supervisor.js", + "tier": "core-bundle", + "category": "general", + "desc": "debug-stats — Show error summary (total, unique, clusters, top issues)", + "builtin": false, + "example": "debug-stats" + }, + "debug-sync": { + "module": "module-debug-supervisor", + "file": "modules/core/module-debug-supervisor.js", + "tier": "core-bundle", + "category": "general", + "desc": "debug-sync [url] — Sync errors to backend API (or set sync URL)", + "builtin": false, + "example": "debug-sync" + }, + "debug-sync-url": { + "module": "module-debug-supervisor", + "file": "modules/core/module-debug-supervisor.js", + "tier": "core-bundle", + "category": "general", + "desc": "debug-sync-url [url] — View or set the backend sync endpoint", + "builtin": false, + "example": "debug-sync-url" + }, + "debug-trends": { + "module": "module-debug-supervisor", + "file": "modules/core/module-debug-supervisor.js", + "tier": "core-bundle", + "category": "general", + "desc": "debug-trends [days] — Error frequency over time (default: 7)", + "builtin": false, + "example": "debug-trends" + }, + "decrypt": { + "module": "cryptogzip", + "file": "modules/ext/cryptogzip.js", + "tier": "ext-auto", + "category": "system", + "desc": "decrypt — Decrypt a .enc file", + "builtin": false, + "example": "decrypt" + }, + "diff": { + "module": "diff", + "file": "modules/ext/diff.js", + "tier": "critical-ext-bundle", + "category": "editor", + "desc": "Show differences between two VFS files or compare module source (usage: diff or diff --module )", + "builtin": false, + "example": "diff" + }, + "dirname": { + "module": "busybox", + "file": "modules/ext/busybox.js", + "tier": "critical-ext-bundle", + "category": "shell", + "desc": "dirname — Strip filename from path", + "builtin": false, + "example": "dirname" + }, + "doctor": { + "module": "module-system", + "file": "modules/core/module-system.js", + "tier": "core-bundle", + "category": "system", + "desc": "doctor — Run all health checks, rank issues, show top 3 warnings", + "builtin": false, + "example": "doctor" + }, + "download": { + "module": "module-fs", + "file": "modules/core/module-fs.js", + "tier": "core-bundle", + "category": "filesystem", + "desc": "download — Download a file to your device", + "builtin": false, + "example": "download" + }, + "du": { + "module": "module-fs", + "file": "modules/core/module-fs.js", + "tier": "core-bundle", + "category": "filesystem", + "desc": "du [path] — Estimate file/directory size", + "builtin": false, + "example": "du" + }, + "echo": { + "module": "module-system", + "file": "modules/core/module-system.js", + "tier": "core-bundle", + "category": "system", + "desc": "echo — Print text to the terminal", + "builtin": false, + "example": "echo" + }, + "edit": { + "module": "editor", + "file": "modules/ext/editor.js", + "tier": "critical-ext-bundle", + "category": "editor", + "desc": "Open the code editor for a VFS file (usage: edit )", + "builtin": false, + "example": "edit" + }, + "empty-trash": { + "module": "module-fs", + "file": "modules/core/module-fs.js", + "tier": "core-bundle", + "category": "filesystem", + "desc": "empty-trash — Permanently delete all trash items", + "builtin": false, + "example": "empty-trash" + }, + "encrypt": { + "module": "cryptogzip", + "file": "modules/ext/cryptogzip.js", + "tier": "ext-auto", + "category": "system", + "desc": "encrypt — AES-256-GCM encrypt a file", + "builtin": false, + "example": "encrypt" + }, + "env": { + "module": "busybox", + "file": "modules/ext/busybox.js", + "tier": "critical-ext-bundle", + "category": "shell", + "desc": "env — List environment variables (webx11_ keys + user profile)", + "builtin": false, + "example": "env" + }, + "errors": { + "module": "module-system", + "file": "modules/core/module-system.js", + "tier": "core-bundle", + "category": "system", + "desc": "errors [n] — Show last n ERROR log entries (default: 20)", + "builtin": false, + "example": "errors" + }, + "expand": { + "module": "busybox", + "file": "modules/ext/busybox.js", + "tier": "critical-ext-bundle", + "category": "shell", + "desc": "expand — Convert tabs to spaces (default 4) in file", + "builtin": false, + "example": "expand" + }, + "export": { + "module": "shell", + "file": "modules/ext/shell.js", + "tier": "critical-ext-bundle", + "category": "shell", + "desc": "export = — Set a shell variable", + "builtin": false, + "example": "export" + }, + "extract": { + "module": "module-fetcher", + "file": "modules/core/module-fetcher.js", + "tier": "core-bundle", + "category": "web", + "desc": "extract — Extract readable article content (title + body text) from a URL", + "builtin": false, + "example": "extract" + }, + "factory-reset": { + "module": "module-system", + "file": "modules/core/module-system.js", + "tier": "core-bundle", + "category": "system", + "desc": "factory-reset — Alias for reset all", + "builtin": false, + "example": "factory-reset" + }, + "factory-reset-old": { + "module": "module-system", + "file": "modules/core/module-system.js", + "tier": "core-bundle", + "category": "system", + "desc": "factory-reset-old — command from module-system", + "builtin": false, + "example": "factory-reset-old" + }, + "fetch": { + "module": "module-fetcher", + "file": "modules/core/module-fetcher.js", + "tier": "core-bundle", + "category": "web", + "desc": "fetch [--post=BODY] [--type=CT] [--raw] — Fetch URL (raw HTML/text); --post enables POST with body, --type sets Content-Type, --raw shows untruncated content", + "builtin": false, + "example": "fetch" + }, + "files": { + "module": "filemgr", + "file": "modules/ext/filemgr.js", + "tier": "critical-ext-bundle", + "category": "filesystem", + "desc": "files — Open the file manager overlay with VFS directory listing, preview, encrypt, zip", + "builtin": false, + "example": "files" + }, + "find": { + "module": "finder", + "file": "modules/ext/finder.js", + "tier": "critical-ext-bundle", + "category": "filesystem", + "desc": "Recursively search VFS files/directories by name (usage: find )", + "builtin": false, + "example": "find" + }, + "floating-add": { + "module": "floating", + "file": "modules/ext/floating.js", + "tier": "ext-auto", + "category": "ui", + "desc": "floating-add btn|menu|panel