aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* feat(newos4): operator steering queue for the maintenance jobsAgando2026-10-231-0/+99
| | | | newos4-steer.py add|list|done|clear appends directives under flock with unique ids; both cron jobs read it first and mark entries consumed. Verified: two adds with distinct ids, done only affects the named entry.
* feat(newos4-debug): dashboard triage + thread panels, mobile layout, gate ↵Agando2026-10-231-12/+163
| | | | | | | | | | | | | | | | | | | | | | error.php - Triage card reads admin/docs/newos4-triage-latest.json defensively: missing/unreadable renders as a warning pill, never as zeros (a zero here reads as "nothing is wrong"). Freshness pill goes stale past 26h so a dead collector cannot look healthy. - Maintenance thread merges in-app `feedback` reports (kind=maintenance) with agent replies from data/maintenance/replies.json into one chronological view. - Mobile: <=640px single column, smaller type, .table-scroll wrappers, Type column hidden, max-width clamp. verify-mobile.py: 360/390px, light+dark -> ALL VIEWPORTS OK, page width == viewport (no horizontal overflow). - "Last ingest" now uses max(ingested_at) instead of end($errors): after the prune the array is not chronological and the header contradicted the triage card by 3 days. - Auto-refresh only fires while the tab is visible (was an unconditional 30s reload). - Fixed triage checks parsing: digest ships {exit, findings[]}, not a list of strings — the first render fataled on stripos(array). Verified 15,167 B render, 0 PHP errors. nginx (not in git): error.php added to the admin-gated read regex alongside stats|errors|clusters|dashboard|agent-replies — error.php?hash= was still serving stacks to anonymous callers. All six now answer 302 without a session.
* fix(newos4): unmeasured skills are untracked, world-model writes verified, ↵Agando2026-10-235-7/+153
| | | | | | | | | | | | | | | | | | | | | | | skill audit External review packet (os4-external-review-v4.6.51.html) triaged against the code: 2 findings confirmed and fixed, 4 could not be reproduced and were recorded as such. - module-memory-graph.js: getStaleSkills() treated a missing lastUsed as 999 days unused, so skill-audit recommended archiving every skill (22 of 22). Skills with no usage telemetry are now collected by getUntrackedSkills() and never counted stale. Live: "Stale: 0" + "Untracked: 22 (no usage telemetry — NOT stale)". - module-world-model.js: _saveToVFS() ignored fsWriteJSON()'s return value and promoted whatever a truthy read returned. Now write -> read-back -> byte compare -> promote, with every return checked. Regression test modules/test/test-world-model-save.js (red on the old code: promoted=true with errs=[]; green now). - scripts/newos4-skill-audit.py: 5 mechanical probes (version x3, read_file paging + context budget, selection symbols, required scripts, extKeys) + skill presence; exits non-zero on drift. 7/7 pass today. Weekly job cb6bc2a16216 runs it Mondays. Not reproduced (recorded in admin/docs/newos4-external-review-verification-2026-10-23.md): world_model_query empty-payload throw (live call returns JSON), pipes-as-command-names, ls skills empty (23 entries via fs.readDir), ~66 agent dirs (4 live).
* feat(newos4): maintenance agent channel — triage engine, two-way replies, cronAgando2026-10-236-2/+304
| | | | | | | | | | | | | | | | | | | | | - scripts/newos4-triage.py: deterministic collector (records vs occurrences, real vs noise vs self-referential, new reports since last run, checker WARN/FAIL). Untrusted strings are sanitised and prefixed DATA| before they can reach an agent prompt; state + output written under flock with mode 644. - scripts/newos4-reply.py: appends one reply to data/maintenance/replies.json under flock. Hermes writes here instead of POSTing with an admin cookie, so an expired session can never look like a delivered reply. - api/debug/agent-replies.php: GET/POST (admin-gated by nginx) half of the thread. - api/debug/report.php: accepts thread + kind=maintenance so in-app feedback is distinguishable from operator bug reports. - terminal: `feedback <message>` and `feedback-inbox` commands; help.html rows added (help coverage 357/357, modules-index regenerated). Live proof: `feedback "…"` filed RPT-20261023-123825-781fba86 with thread thr-glmfwae2 and kind=maintenance; agent-replies GET returned the posted reply, POST returned 201; triage first run reported 9 new reports, second run 0. Cron: newos4-maintenance (7e3b326daa4c) daily 07:15, newos4-skills-weekly (cb6bc2a16216) Mondays 06:30.
* fix(newos4-debug): idempotent ingest, admin-gated reads, honest counts ↵Agando2026-10-239-36/+365
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (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.
* docs(newos4): clear the help.html command backlog, and make it detectableAgando2026-10-223-35/+155
| | | | | | | | | | | | | | | | | | | | | | | | | | help.html had not been touched since 2026-08-02. Auditing the page against the code found 74 commands the runtime registers but the docs never mentioned, and 4 rows documenting commands that no longer exist. Documented (by section): terminal 11 (dashboard --watch/--stop, usage, ps, top, df, free, history, run, sysmsg, view_module), a2a 6, AI 14 (webxai/webx/wx, context*/smart-ask, commit-*, ai-model/ai-ignore), vaultmind 4, debug 2, filesystem 2, sessions 1, memory-graph 3, modules 4, neural-vfs 1, agents 3, web 1, voice 3, config 3, extras 8 (kanban, three, course, gzip, wget, gui-*), vault 2 (encrypt/decrypt), skills 5, webdav 1, plus an alias row for h/s/ll. Removed ghost rows: commands, check, sandbox-kill, webdav-explorer -- none are registered anywhere in modules/; the sandbox prose no longer promises sandbox-kill. New check: scripts/newos4-maintain.py check_help_coverage() derives the command list from terminal.js (_baseWhitelist, internals, cmd === dispatch) plus every commands['...'] registration in modules/ and compares it with help.html, so the next gap shows up in the daily maintenance run instead of rotting for 11 weeks. Verified: html.parser 0 errors (before the fix my own insertion broke the page -- a signature containing <script> opened a script element), 355/355 commands documented, maintenance OK, 449 command rows in the DOM, 360/390 px 4/4 OK, perms fixed (atlas.json, course.js were 664).
* fix(newos4): dashboard shows the real world model and stops dying after 10 s ↵Agando2026-10-226-88/+192
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | (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-226-30/+287
| | | | | | | | | | | | | | | | | | | | | | | | | | (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-225-52/+196
| | | | | | | | | | | | | | | | | | | | 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-214-50/+144
| | | | | | | | | | | | | - 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-214-36/+143
| | | | | | | | | | 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-218-33/+263
| | | | | | | | | | | | 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-185-94/+372
| | | | | | | | | | 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-189-45/+77
| | | | capture, preview)
* newOS4 v4.6.38: auto-file fatal errors with 3/day quota (A5)Agando2026-10-184-4/+108
|
* newOS4: regenerate course atlas (adds bug command)Agando2026-10-181-11/+21
|
* newOS4 v4.6.37: bug-report pipeline (report.php, bug command, HTML ↵Agando2026-10-1810-7/+380
| | | | generator, telemetry-loop fix)
* newOS4 v4.6.36: fix CourseModule print-capture swallowing all command outputAgando2026-10-183-6/+20
|
* newOS4 v4.6.35: file manager multi-select + safe paste/rename/delete (Part B)Agando2026-10-184-166/+324
|
* newOS4 v4.6.34: running tool ledger in the prompt (D4)Agando2026-10-184-4/+36
|
* newOS4 v4.6.33: progress-based turn budget (D3)Agando2026-10-184-4/+48
|
* newOS4 v4.6.31: tool-result memo cache with epoch invalidation (D2)Agando2026-10-184-6/+74
|
* newOS4 v4.6.30: per-agent session isolation (D1)Agando2026-10-185-16/+40
|
* newOS4 v4.6.29: progress-aware loop guard + agent attributionAgando2026-10-185-48/+188
|
* course: fix P0 content errors + completion/mobile/keyboard UX (review A)Agando2026-10-187-64/+115
|
* course: weekly telemetry report script + Monday 09:00 cronAgando2026-10-181-0/+66
|
* course: exclude auto-open from lesson_open telemetry, add session counts, ↵Agando2026-10-182-7/+9
| | | | filter synthetic sids
* newOS4 v4.6.28: cache-bust course.js after review fixesAgando2026-10-182-4/+4
|
* newOS4 course: post-exec review fixes (telemetry detail sanitize, skill-sync ↵Agando2026-10-183-6/+20
| | | | retry, atlas check)
* newOS4 course: first daily lesson generated, atlas 345 commands, ↵Agando2026-10-186-38/+120
| | | | modules-index refreshed
* newOS4: interactive AI course (terminal module, portal, atlas, telemetry, ↵Agando2026-10-1831-927/+7391
| | | | daily maintenance+cron) + free store card
* newos4: floating-ui-designer v3 — repair 12 escape-mangled JS sites, ↵Agando2026-10-175-4/+1487
| | | | rebuild 344-cmd registry (124->344), quoting/import/preset UX fixes; add Node harness + registry generator; floating-ui skill JSON de-piped
* auto: 2026-07-29_20:45 changesAgando2026-10-153-5/+11
|
* auto: 2026-07-29_20:45 changesAgando2026-10-085-11/+430
|
* newOS4 v4.6.18: nginx dav trailing-slash semanticsAgando2026-10-024-12/+29
| | | | | | | | | | | 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-024-30/+225
| | | | | | | | | | | | | | | | | | | | 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)
* fix: sequential safe-tool execution — parallel fan-out corrupted ↵Agando2026-09-292-8/+14
| | | | print-capture attribution + shadow diff pairing
* newOS4 v4.6.15: reentrant print-capture stack, AI tail -f block, read-only ↵Agando2026-09-298-61/+303
| | | | sed in safeRead, security test harness (21 checks)
* fix: regex captures full command name + suggestion in unknown-cmd tool errorAgando2026-09-292-2/+2
|
* fix: parse per-call captured output for unknown-cmd error (race-free under ↵Agando2026-09-293-14/+8
| | | | Promise.all)
* newOS4 v4.6.14: race-safe AI loop guard (depth counter), cover _capture* ↵Agando2026-09-294-19/+47
| | | | entry points, structured JSON tool error
* newOS4 v4.6.13: typo suggestion bar (one-tap fix), consistent unknown-cmd ↵Agando2026-09-294-31/+93
| | | | messages, AI loop guard
* newOS4 v4.6.12: rebuilt bundles with tail -f and sedAgando2026-09-292-15/+162
|
* newOS4: Ctrl+C/Esc stops tail -f follow; security whitelist gains sedAgando2026-09-291-7/+22
|
* newOS4: sed command (s///, /pat/d, Nd, -i, -n, pipe input) + help entriesAgando2026-09-292-3/+94
|
* test: exact-delta assertions for tail -f follow/stop semanticsAgando2026-09-291-1/+2
|
* newOS4: tail -n/-N flags + live follow mode (-f) with test harnessAgando2026-09-292-4/+281
|
* auto: 2026-07-29_20:45 changesAgando2026-08-067-313/+2676
|
* fix: add kanban to packages.json, update cache version to 2026-07-29Agando2026-07-293-4/+10
|
* feat: register kanban in module-loader, bump to v4.6.11Agando2026-07-292-3/+3
|