aboutsummaryrefslogtreecommitdiff
path: root/modules/core/module-loader.js
Commit message (Collapse)AuthorAgeFilesLines
* fix(newos4): define VirtualFS.emptyTrash() — empty-trash threw since ↵Agando2026-10-231-1/+1
| | | | | | | | 2026-10-18 Report RPT-20261018-164646-89352963 ("this.fs.emptyTrash is not a function") was filed by the auto-filer and never fixed: terminal.js:1777 called a method VirtualFS never defined, so 'empty-trash --confirm' threw instead of emptying. Added emptyTrash() returning true only when it removed something. Verified live on v4.6.54: put -> rm -> empty-trash --confirm => 'Trash emptied.'; second run => 'Trash is already empty.'; .trash entries 0.
* fix(newos4-debug): idempotent ingest, admin-gated reads, honest counts ↵Agando2026-10-231-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (v4.6.52-53) Root cause: _syncToBackend() re-sent the whole error DB with cumulative counts every 300s, and ingest.php did count += client count per batch. 33 real signatures had accumulated 116,696 "occurrences" (one self-referential row alone: 46,133). Backend - ingest.php: per-(session,hash) synced map, adds only the delta, resets prev when the client count shrank (cleared localStorage), caps delta at 5000, bounds synced at 500 hashes and sessions at 200, normalises timestamps to +00:00, 30-day retention that also purges dropped hashes from every synced map, returns `accepted` (entries) next to `ingested` (occurrences). - stats.php/dashboard.php: total_errors = occurrences, unique_errors = signatures, last-ingest card. The two numbers were inconsistent by ~3,500x. - health.php: reports self_referential count and status=degraded instead of ok. - Pruned live data: 33 -> 23 records, 116,696 -> 58,759 occurrences, max cluster 110,226 -> 52,387 (archive kept in data/debug/archive/). - nginx: stats/errors/clusters/dashboard/agent-replies now behind auth_request /_wx11_admin_auth (302 without a session); ingest/report/health stay public for telemetry. Verified: reads 302, ingest 200, report 400. Client - module-debug-supervisor.js: sends only hashes whose count changed (persisted webx11_debug_synced), records synced counts only after success, stops auto-filing aborts/timeouts and debug-pipeline requests as bug reports (2 of the last 5 reports were "user aborted a request"). Verified with a scratch php -S copy: same batch POSTed 3x -> count stays 5; count=99999 -> clamped to 1000; retention dropped 10 legacy rows.
* fix(newos4): dashboard shows the real world model and stops dying after 10 s ↵Agando2026-10-221-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | (v4.6.51) Two defects, both verified live before/after: 1. The World Model panel always said "Not synthesized yet". The page had a renderer for data.worldModel and _collectDashboardData() never set it -- the model was right there in WorldModelModule._model. Now collected and mapped to the renderer's exact keys (model has modules.loaded/skills.count/memory.nodes, the page reads modules/skills/memoryNodes), plus changesSinceLastSnapshot and the recent-error sample, with an honest "not synthesized" fallback. 2. The page discarded any payload older than 10 s and its own 5 s auto-refresh then showed "Cannot connect to newOS4". Stale payloads are now rendered with their age ("Data as of 1:20:14 AM - 3m ago"), labelled amber past 5 min. Also: the Refresh button wrote a localStorage key nobody read -> the terminal now listens for it and re-collects (page says "No terminal tab answered" when no terminal tab is open); storage events repaint instantly; the dead /api/dashboard fetch (404 on all three paths, 5 s stall) is gone; `dashboard --watch` / `--stop` re-collects every 5 s; header says the data is this browser's instance. Verified v4.6.51: panel rows "Synthesized 34s ago / v4.6.51 / 46-22 / 136-3 / 1 nodes 0 edges / OK / none recorded"; 130 s-old payload still renders with "- 3m ago" and no banner (previously "Cannot connect"); storage event moves the footer 13s -> 0s; watch timer advances the payload, --stop clears it; mobile 360/390 px all OK; 0 console errors.
* feat(newos4): world-model-ask answers with the LLM, grounded in the model ↵Agando2026-10-221-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | (v4.6.50) `world-model-ask` was a 10-keyword lookup: any real question returned "Unknown query. Try: modules, skills, ...". The documented example ("what changed since yesterday") compared nothing — it restated the current snapshot. - _modelDigest(): whitelisted snapshot (measured 942-965 chars on fixtures, ~3.3 KB live) + recent error sample + changesSinceLastSnapshot - _buildAskPrompt(): "answer only from this JSON, never invent numbers, name the command that would produce missing data" - ask(): connects Ollama on demand, answers via chat(), falls back to the facts path with a visible warning; --facts keeps the instant lookup - _diffSincePrev(): keeps one previous snapshot in /system/world-model.prev.json so "what changed" is a real diff (files 136 -> 140) - world_model_query tool returns the snapshot (digest or detail:full) instead of ten canned strings; no nested LLM call inside a tool call - help text now says what it does; node test modules/test/test-world-model-ask.js (11 assertions, runs the real class) Verified live v4.6.50: facts "Loaded 46 modules" | LLM "The snapshot does not contain information regarding the cause of memory growth ... use world-model-refresh" | diff "files 136 -> 140" | tool snapshot 3,334 bytes.
* fix(newos4): coreutils flags + loop-guard arg key, both found by the agent's ↵Agando2026-10-221-1/+1
| | | | | | | | | | | | | | | | | | | | live run (v4.6.49) Agent session surfaced two real defects: 1. The A4 prompt told it to use grep -n / sed -n 'N,Mp' / wc -l / head -N — none of those flags parsed: grep treated '-n' as the pattern (6/6 variants failed), wc read '-l' as a filename, head looked for a file named '-2', sed had no range parser. Fixed the tools, not just the text: grep now accepts -n/-i/-c/-v/-l (line numbers were already printed), wc accepts -l/-w/-c, head accepts -N and -n N, sed accepts Np and N,Mp, tail no longer prints a blank line for a trailing newline. Prompt re-ranked to the working forms. 2. Loop guard keyed calls by tool name plus the raw arguments field. When arguments was already an object (parsed upstream), the key became 'run_command:[object Object]', collapsing distinct batched commands into one signature and producing false "called 3x" warnings. Now the key is JSON.stringify(arguments) whenever it is not a string (3 sites: sig, _sigR, _sigD). Verified live v4.6.49: grep -n/-c, wc -l, head -2, sed -n '2,3p', tail -n 1 all correct.
* fix(newos4): GLM review follow-ups for AI read/context (v4.6.47)Agando2026-10-211-1/+1
| | | | | | | | | | | | | - loop guard: a mutation unblocks the replay but no longer erases the repeat counter (identical mutating calls could loop forever) - tool traces are per agent tag, flushed in a catch as well as on success, ring-buffered (first 2 + last 10) so verification reads survive - read_file notes are metadata only (path/range/next_offset); no file bodies, no secrets, and web_search/web_fetch output is excluded from durable context (injection surface) - trace is role:'system' (was 'assistant' — the model re-read it as its own answer) - surrogate-safe pagination, 500 floor / 16000 cap, prompt limits aligned - prompt now names checks that exist in the in-page terminal (test, grep -n, wc -l) - compressed summary capped at 4000 chars; denied-destructive tool result carries tool_call_id
* feat(newos4): AI paged file reads, durable tool traces, 12k context budget, ↵Agando2026-10-211-1/+1
| | | | | | | | | | read/tool/verify prompt rules (v4.6.46) - read_file: offset/limit + JSON {total_chars,truncated,next_offset} (was a hard 8000-char cut with no resume) - tool results now leave a per-turn trace that is persisted into session context and survives compression - maxContextTokens 2000 -> 12000; compression keeps 8 exchanges and 400 chars/msg - system prompt: page big files, prefer grep -n / sed -n / head, re-read + verify after every edit - verified in the live browser: 30k file pages 0->8000->16000, prompt section present, v4.6.46 served
* fix(newos4): download link uses the user's space; WebDAV share copies ↵Agando2026-10-211-1/+1
| | | | | | | | | | | | verified file links; preview fullscreen+share; files->WebDAV upload button (v4.6.45) - download: URL built from _resolveSpaceName() (config url = logged-in user), not the page space - WebDAV browser 🔗: shares selected FILES only, URL-encoded, HEAD-verified (200) before claiming success; folders offer a tar fallback instead of a guaranteed-403 link - file manager preview: ⛶ fullscreen + 🔗 copy-link toolbar (was none) - file manager toolbar: ☁ WebDAV publishes selected/current file via webdav-push - modules/test/test-download-url.js: 4 PASS - rebuild bundles, bump v4.6.44 -> v4.6.45 (loader + 3 script tags)
* fix(newos4): stop agent accumulation on reload — stable role ids + boot ↵Agando2026-10-181-1/+1
| | | | | | | | | | reconciliation - spawnAgent() accepts an idHint and is idempotent; boot team uses agent-<role> - _reanimateFromVFS() adopts newest dir per default role, fs.rm()s duplicates/orphans - _bootAgents() awaits async VFS hydration before reconciling, then spawns only gaps - scripts/test-agents-reload.js: 5-boot regression + hydration-race test - v4.6.44 bundle rebuild + cache-bust
* newOS4 v4.6.40: review fixes (bug diagnostics, trash tree, dir paste, stale ↵Agando2026-10-181-1/+1
| | | | capture, preview)
* newOS4 v4.6.38: auto-file fatal errors with 3/day quota (A5)Agando2026-10-181-1/+1
|
* newOS4 v4.6.37: bug-report pipeline (report.php, bug command, HTML ↵Agando2026-10-181-1/+1
| | | | generator, telemetry-loop fix)
* newOS4 v4.6.36: fix CourseModule print-capture swallowing all command outputAgando2026-10-181-1/+1
|
* newOS4 v4.6.35: file manager multi-select + safe paste/rename/delete (Part B)Agando2026-10-181-1/+1
|
* newOS4 v4.6.34: running tool ledger in the prompt (D4)Agando2026-10-181-1/+1
|
* newOS4 v4.6.33: progress-based turn budget (D3)Agando2026-10-181-1/+1
|
* newOS4 v4.6.31: tool-result memo cache with epoch invalidation (D2)Agando2026-10-181-1/+1
|
* newOS4 v4.6.30: per-agent session isolation (D1)Agando2026-10-181-1/+1
|
* newOS4 v4.6.29: progress-aware loop guard + agent attributionAgando2026-10-181-1/+1
|
* newOS4 v4.6.28: cache-bust course.js after review fixesAgando2026-10-181-1/+1
|
* newOS4: interactive AI course (terminal module, portal, atlas, telemetry, ↵Agando2026-10-181-2/+2
| | | | daily maintenance+cron) + free store card
* auto: 2026-07-29_20:45 changesAgando2026-10-151-1/+1
|
* auto: 2026-07-29_20:45 changesAgando2026-10-081-1/+1
|
* newOS4 v4.6.18: nginx dav trailing-slash semanticsAgando2026-10-021-1/+1
| | | | | | | | | | | Discovered by dav-health-check.sh E2E (10/10 pass now): - nginx dav module REQUIRES trailing slash on MKCOL (no-slash → 409) and on directory DELETE (no-slash → 409/404); existing dir + slash MKCOL → 405 (the real 'already exists' signal) - _normalizeRemotePath now PRESERVES trailing slashes (collection ops) - _ensureDir MKCOLs with trailing slash - _deleteFile retries with slash on 409/404 (collection delete) - health-check expectations corrected (405 = existing, slash required)
* newOS4 webdav path fix + WebX11 resilience package (2026-10-02)Agando2026-10-021-1/+1
| | | | | | | | | | | | | | | | | | | | Root cause fixes (mindtech incident): - webdav.js: _normalizeRemotePath strips full URLs/space prefixes, applied to all request entry points + _absoluteUrl for MOVE/COPY Destinations - _ensureDir: __list__ existence fast-path (kills MKCOL 409 storms) - dashboard-files.js: updateFilesJson parses __list__ autoindex (no more '#' entries), ensureSpaceExists only re-inits on genuine 404 - 20-test regression suite: scripts/test-webdav-paths.mjs Resilience: - dav-auth-check.py: server-side WebDAV write auth microservice (nginx auth_request on 8904) — anonymous/wrong-token writes now 401 - fail2ban-telegram.py: ban alerts + auto-unban for known space users - backup-spaces.sh: daily hardlink snapshots, 14-day retention - space-health-check.py: junk dirs / myfiles.json / version drift / session sanity → Telegram alerts - dashboard-files.js: visible 503 error panel with Retry + auto-retry - v4.6.16: main.html + module-loader LATEST_VER aligned (was drifted)
* feat: register kanban in module-loader, bump to v4.6.11Agando2026-07-291-1/+1
|
* auto: 2026-07-09_06:00 changesAgando2026-07-091-1/+1
|
* auto: 2026-07-02_06:00 changesAgando2026-07-021-2/+2
|
* auto: 2026-06-25_06:00 changesAgando2026-06-251-1/+1
|
* auto: 2026-06-23_06:00 changesAgando2026-06-231-5/+7
|
* auto: 2026-06-22_18:00 changesAgando2026-06-221-1/+1
|
* auto: 2026-06-19_18:01 changesAgando2026-06-191-1/+1
|
* auto: 2026-06-18_18:00 changesAgando2026-06-181-1/+1
|
* auto: 2026-06-18_06:00 changesAgando2026-06-181-1/+1
|
* auto: 2026-06-17_06:01 changesAgando2026-06-171-1/+1
|
* auto: 2026-06-16_06:00 changesAgando2026-06-161-2/+2
|
* auto: 2026-06-15_06:00 changesAgando2026-06-151-1/+1
|
* auto: 2026-06-14_06:00 changesAgando2026-06-141-2/+2
|
* auto: 2026-06-13_18:00 changesAgando2026-06-131-143/+24
|
* auto: 2026-06-13_06:00 changesAgando2026-06-131-1/+1
|
* auto: 2026-06-11_18:00 changesAgando2026-06-111-1/+13
|
* auto: 2026-06-10_18:00 changesAgando2026-06-101-1/+1
|
* auto: 2026-06-10_06:00 changesAgando2026-06-101-2/+2
|
* auto: 2026-06-09_18:00 changesAgando2026-06-091-1/+2
|
* auto: 2026-06-09_06:00 changesAgando2026-06-091-3/+2
|
* auto: 2026-06-08_18:00 changesAgando2026-06-081-2/+2
|
* auto: 2026-06-07_18:00 changesAgando2026-06-071-1/+1
|
* auto: 2026-06-06_18:01 changesAgando2026-06-061-1/+1
|
* auto: 2026-06-06_06:00 changesAgando2026-06-061-3/+2
|
* auto: 2026-06-05_18:01 changesAgando2026-06-051-1/+5
|