Commit Graph

235 Commits

Author SHA1 Message Date
operator b824f6d405 feat(box): add invite code handler, Settings RPA, and agent onboarding pipeline
- Support invite code discovery in main chat and redemption in settings menu
- Add Settings RPA primitives with Radix UI mouse dispatch and retry polling for async DOM
- Attribute 'has_redeemed' binary from the Additional tokens ticker / entrypoint visibility
- Unblock agent @646 by repairing warp-def/dev tunnels and redeeming REDCJ7 via dev (+1B tokens)
- Implement 'box onboard' pipeline to provision infra, authenticate, and auto-redeem queued codes
- Add 'box onboard feed-matrix' ranking all agents by work done over time, job count, and role
- Register 'InputType.SALVAGE' in loop modulation (CRITICAL priority, 600s timeout, 3 nudges to opm)
- Ingest recurring balance audits into canonical HEARTBEAT.md and TOOLS.md
2026-10-06 19:33:17 +00:00
operator 4998ffddb6 feat(tui): SGR mouse fallback, focus partition highlights, multi-trigger context menus & box tui
- bin/muse-tui.py:
  * Parse raw SGR 1006 (\033[<btn;x;yM/m) and Xterm mouse escape sequences in _handle_escape_sequence fallback.
  * Multi-trigger context menus: Button 3, Button 2, Ctrl/Shift/Alt+Click, double-click, click on active item, or click [⚡] / [sid] target.
  * Render permanent [⚡] action target across all sidebar thread rows.
  * Separate focus partitions for FLEET AGENTS and SIDECHATS with partition-specific wheel scrolling and keyboard navigation (j/k, Enter, h/l).
  * Space key support in NORMAL mode to open context menus.
  * Active pane highlighting and updated footer hints.
- bin/super-cli.py:
  * Add 'box tui' command dispatching directly to muse-tui.py --mode box.
- tests:
  * Add unit tests in test_context_menus.py, test_focus_highlight.py, and test_main_nav.py (51/51 passing).
2026-10-06 19:29:22 +00:00
Muse Sidechat 66c8900a58 feat: setup-fed watchdog supervision for all registry nodes
Close the def/dev supervision gap at the source: every node brought
up gets watched, and every supervisor enumerates the registry.

- bin/ensure-node-supervision.sh (new, idempotent): appends the
  NODES.md row (netvm-names port, honors CDP_PORT_OVERRIDE so it
  never fights provision's picker) and installs/enables
  chromebox-watchdog-<node>.timer. --all heals drift (registry +
  /etc/netvm identities). Template verified byte-identical to the
  installed def unit.
- netvm-node-up.sh: calls ensure (non-fatal) at the end. Provision
  and the onboarding pipeline reach it transitively.
- relay-health-check.sh, cdp-latency-check.sh: registry-driven
  watched_nodes() + LIB_ONLY guards (were hardcoded 4 nodes).
- tests/test_node_supervision.py (6): row add/idempotent/override,
  timer render, node-up wiring, both watched_nodes().
- CHROMEBOX-RUNBOOK.md: setup-fed supervision section.

Pairs with the registry-driven relay/chromebox watchdogs: new rows
are picked up on the next run with no per-node code edits.
2026-10-06 19:28:29 +00:00
Muse Sidechat c9143a558b fix: truthful fleet status in blind shells + agent-health circuit breaker
box fleet status / approvals check misreported every node as STOPPED /
CDP-unreachable from sandboxed shells (own PID+net namespaces: pgrep
blind, no route to 10.201.x.x, no sudo). Fleet was healthy throughout.

- bin/host_evidence.py (new): host watchdog evidence fallback. Recent
  timer runs (journal -o json, exact UNIT match) with no newer failure
  line in cdp-relay-watchdog.log / chromebox-watchdog.log (both
  silent-when-healthy) prove a node is up. def/dev have no watchdog
  coverage: browser verdict via chromebox-<node>.log freshness
  (alive-only), CDP verdict unknown.
- super-cli.py: effective status/source/evidence per node. Host
  evidence decides ONLY the fully-blind pattern (both local probes
  negative); live local signals always win. New UNKNOWN badge, [*]
  footnote; approvals UNREACHABLE splits into BLIND / OFFLINE(host
  agrees) / unreachable-evidence-inconclusive, with honest footer.
  proc_alive/cdp_ok keep local-probe meaning; status/source/evidence
  are new JSON fields.
- approvals.py: host_cdp_ok flag on the unreachable path.
- agent-health.sh: restart circuit breaker. 3 consecutive futile
  restarts (restart leaves agent still failing) opens the circuit:
  no more kills for 1800s, ALERT to log+journal, half-open probe
  after cooldown, reset on any success. Stops the def murder loop
  (57 restarts / 155 API FAILs for an account-layer failure).
- tests/test_fleet_status.py (25), tests/test_agent_health.py (6).
- CHROMEBOX-RUNBOOK.md: blind-shell status + futile-restart sections.

Tests: 98/98 focused green (agent_health + fleet_status +
completion + tool_calls). Live-verified: 4 ACTIVE [*] + 2 UNKNOWN.
2026-10-06 18:16:14 +00:00
Muse Sidechat a9f014f9fa feat: completion-enforcement loop (fallback, proof, emit-model, auditor)
Close the loop so dispatched work actually completes on bl:

- on_no_result fallback in followup-sweeper (op + job forms via
  exec-constrained registry / job-dispatch), seeded on the three
  autonomy-pulse jobs; fallback_due() dedupes the gravity path
- gravity.py: add __main__ entry (loop-remediator.timer was a no-op),
  300s re-arm budget, fallback firing + stamp/skip logic
- harvester: proof-of-result followups (result_has_evidence),
  acted-variant NACK, emit-model tool-hint wording
- envelope: RESPONSE RULE states the emit model (agents EMIT
  directives verbatim; runtime executes; works from bare containers)
- completion-audit.py + systemd 15-min timer: per-family funnel,
  swarm drain, followup backlog; digest DM when degraded, 6h heartbeat
- tests/test_completion.py (29 tests), JOB-SPEC.md docs

Tests: 67/67 focused green (completion + tool_calls).
2026-10-06 08:20:14 +00:00
operator b7e45010c3 feat(tui): clean transcript style, right-click context menus, rate limits & dual copy
- Add clean line-by-line transcript style toggle ('b' key / /clean / /boxed)
- Implement right-click context menus for chat list, fleet agent panel, and transcript
- Add cooldown mode lock bypass (2-second double-confirm force sync)
- Implement dual copy support: clean text (strip reply metadata) vs full context
- Add clickable [📋 Copy] and [📑+ Context] buttons to message headers
- Add unit test suites for transcript cleaning, context menus, rate limits, and copy actions
2026-10-06 07:55:27 +00:00
operator-main f2640397ed feat(messaging): balanced TOOL parsing, DM shorthand, box.exec, tools.list
- response-harvester: extract [TOOL]/[EXEC] JSON args with balanced-brace
  scanning (']' and nesting inside args no longer truncate calls); add
  [DM {...}] shorthand mapping to dm.send; native aliases (dm, box,
  tools) plus arg-synonym normalization; formatters and expanded hints.
- exec-constrained: new read-only box.exec op (27 allowlisted box-ctl
  reads) and tools.list op backed by --list-ops for dynamic discovery.
- prompt_envelope: advertise dm.send/box.exec/tools.list in every timer
  DM; add dm_call builder.
- lookup_engine + regex_patterns.json: canonical tool_call pattern
  accepts the DM engine, ']' in args, one nesting level.
- tests/test_tool_calls.py: 38 tests; docs/INBAND-MESSAGING-SPEC.md:
  accepted decision record (Final).
2026-10-06 07:29:16 +00:00
operator-main 345eb09559 fix(watchdog): eliminate SIGPIPE+pipefail phantom failures in health checks
echo "$list" | grep -q under set -o pipefail exits 141 whenever grep
matches before echo finishes writing, so healthy browsers were reported
'CDP up but no page target' and killed every 2 min fleet-wide (load 19+).
Use [[ == *glob* ]] (no pipe, no race) for the page/muse.ai stages, and
grep -c (reads to EOF, never early-exits) for the netns check.
2026-10-06 07:28:20 +00:00
operator 7444b52763 Fix split-brain swarm dispatch: narrow harvester SWARM_WORKER_POOL to [muse]
The 2026-10-05 fix note claimed dev/def were removed from the pool but the
code still listed [dev, def, muse]. The harvester's every-minute systemd
dispatch raced the pool daemon claiming slots as dev/def, which refuse on
attribution grounds (dev FAILs fast, def freezes until the 60-min reaper) -
the fleet-wide dev-FAIL-fast + def-frozen pattern on every swarm.

Pool now matches swarm_worker/daemon.py WORKER_POOL exactly: muse only,
the single fully authenticated auxiliary worker. Reporting/harvest paths
untouched.
2026-10-06 03:14:02 +00:00
operator 740648e973 approvals: stale-wait cleanup, key-decision notify, TTLs, key/browser isolation
- bin/approvals.py: responded-wait filtering + auto-mark, key-decision sidechat-first notify (notified flag, --message, --allow-main-chat), TTL defaults (input 30m / browser 30m / key 2h), cross-type guard (browser actions cannot resolve key requests), sweep_expired_key_requests; restores check_node_key_request fallback in inspect_node_approvals

- bin/box-ctl.py + bin/super-cli.py (approvals hunks only): --message/--allow-main-chat passthrough on allow/deny, clear/clear-all actions, def sidechat routing; restores sys.exit(1) on dismiss failure

- bin/fleet-alert-check.sh: TTL-aware state_machine (EXPIRED action), auto-deny expired browser approvals (fail closed), auto-dismiss expired input waits, targeted per-agent DM for input waits

- bin/job-dispatch.py + bin/gravity.py: KEY_APPROVAL excluded from auto-approval

Reviewed by 5 independent reviewers (all APPROVE/APPROVE WITH NOTES); integration gate GO (17/17 tests). TUI hunks in super-cli.py intentionally excluded.
2026-10-06 00:49:46 +00:00
operator adfcd2e602 feat(box): passkey fetch, agent key-approval flow, unified lookups, tmux agent UX
- box passkey [show|fetch] (+ muse passkey): documents VM-only passkey
  (/srv/box/passkey.txt, fallback /etc/netvm/passkey.txt on 34.139.37.135),
  probes VM over SSH with graceful fallback; --json supported. No secrets on bl.
- approvals: request_key_approval / check_node_key_request; KEY_APPROVAL status
  surfaced in `box approvals check`; allow/deny resolve + audit to box-ctl.jsonl;
  never auto-approved. New `box approvals request-key <node> --reason`.
- box lookup (summary|fleet|threads|unread|approvals|key|docs) and docs-lookup
  engine with lookup_internal/ database (docs_internal symlink).
- muse-tmux: non-TTY attach falls back to scrollback capture; prune NameError fix.
- box/muse passthrough for tmux/muse/docs; thread list/view alias + prefix resolve.
- Docs: AGENTS.md, AGENT-TOOLING.md, BOX-WEB-SURFACE-GUIDE.md, README.
- Tests: key-approval + passkey tests; sync stale sidechat UUIDs and manifest name.
- .gitignore runtime trackers (subagent-sessions, conversation-nudge-tracker).
2026-10-05 20:18:47 +00:00
operator 59c9965791 feat(swarm-worker): dispatch prose swarm slots to ephemeral Muse subagents
- daemon: route non-shell slot tasks to a fresh subagent session on dev/def/muse
  via muse_hybrid; add bin/ to sys.path so muse_hybrid/prompt_envelope import
  under the tmux supervisor
- prompt_envelope: add wrap_subagent_task() - plain task assignment without
  [TOOL tmux/swarm/cron] meta tags (subagents refused those as relayed test traffic)
- box-ctl/reporter: swarm-attach accepts optional session-id, stored as
  slot.subagent_session_id
- executor: _looks_like_shell requires an existing executable (prose like
  'verify ...' no longer misread as shell)
- poller: pick up pending swarms as well as running
- response-harvester: monitor running slot subagent sessions from swarms.json,
  allow '/' in RESULT/VERB job ids, archive ephemeral threads on any verdict
  (OK or FAIL), reap slot sessions for terminal swarms
2026-10-05 20:18:46 +00:00
operator fc765f270b fix(swarm-worker): isolate session to /tmp/tmux-muse.sock and filter terminal slots in poller 2026-10-05 19:21:10 +00:00
operator 45edc5432c feat(approvals): integrate approval-hold detection and auto-remediation into fleet alert, loop diagnostics, and muse API 2026-10-05 17:43:04 +00:00
operator d72b63bfd1 docs(netvm): document watchdog, swarm-worker, and alert relay in README; track approvals CLI 2026-10-05 17:42:01 +00:00
operator 4f4b8768b6 feat(alert): wire idempotent fleet-alert relay into check loop and stop stale chrome scopes 2026-10-05 17:41:04 +00:00
operator 9e833d0c4b feat(swarm): launch live swarm worker daemon under tmux supervisor 2026-10-05 17:29:16 +00:00
operator 7fc15eb127 feat(operators): amendment workflow and automated drive watchdog daemon 2026-10-05 17:15:50 +00:00
operator cc8702b38c feat(operators): agent markdown drive management via Hatch and SSH runbook 2026-10-05 16:51:56 +00:00
operator 9722879724 feat(tmux,envelope): add hybrid node/container execution to muse-tmux and naturalize prompt envelope to operator directive 2026-10-05 16:47:24 +00:00
operator f61ceb5f04 fix(envelope): strip host container key references from prompt envelope to eliminate agent refusal loops 2026-10-05 16:41:42 +00:00
operator-main a9ab825554 fix(netvm): hardcoded dev CDP port refs 9460 -> 9455
Follow-up to 8c39dc3: four scripts hardcoded dev's CDP port instead of
reading netvm-registry.py. Aligned with the corrected registry (9455).

Session: sidechat/dev-cdp-partition
2026-10-05 16:40:40 +00:00
operator-main 8c39dc3fad fix(netvm): dev CDP port 9460 -> 9455
NODES.md advertised dev's CDP on 9460, but the fleet-facing path is the
relay netvm-cdp-relay.py 10.201.36.2:9455 -> 127.0.0.1:9455, and
netvm-names.sh never pinned dev (hash default = 9455). The watchdog kept
relaunching dev's browser on 9460 while the relay sat orphaned on 9455.

- NODES.md: dev cdp_port 9460 -> 9455 (registry is the watchdog's source)
- bin/netvm-names.sh: pin def=9450, dev=9455 (was hash-default only)

Reported by 646 as xop-e09 partition; verified hop-by-hop before fix.

Session: sidechat/dev-cdp-partition
2026-10-05 16:39:49 +00:00
operator 1e86ed8a44 retention piece 1: immediate rotations for chat-history / job-log / followups (b67084660385)
- chat-history.jsonl rotates at 10MB or 7d -> logs/archive/*.jsonl.gz + .sha256
- job-log.jsonl rotates at 2MB or 14d -> same archive layout
- followups.json archives resolved>7d / escalated>30d -> followups.archive.jsonl (append-only)
- verify wrapper: sha256 -c, gzip -t, clean listing, spot-extract JSON + ts bounds
- driver + hourly systemd user timer (retention-rotations.timer)
- archive-only: nothing is ever deleted; thread backfill excluded (needs human-reviewed preview)
First run 2026-10-05 16:35Z: chat-history 29.7MB + job-log 4.7MB rotated and verified; followups 0 eligible of 163.
2026-10-05 16:37:14 +00:00
operator 1d2440c1f8 feat(envelope): inject Work Order header and shared tmux directives into prompt envelope 2026-10-05 16:31:35 +00:00
operator 1809a1a8e2 feat(cli): add 'box tmux' domain to manage headless sessions with auto-logging 2026-10-05 16:27:19 +00:00
operator 973dbc3636 feat(tmux): ensure automatic session logging to logs/tmux/<session>.log via pipe-pane 2026-10-05 16:24:34 +00:00
operator b828ce1985 fix(cli): resolve symlink path before looking up swarms.json in 'box swarm status' 2026-10-05 16:24:21 +00:00
operator 945e6bb481 feat(tmux): implement 2-hour inactivity session TTL reaper and prune command 2026-10-05 16:23:45 +00:00
operator c13ee20ea4 feat(cli): add prefix matching to 'box swarm status' 2026-10-05 16:23:07 +00:00
operator 0ca0fd0c1a feat(tmux): add shared muse tmux socket manager with CLI and agent [TOOL tmux.*] integration 2026-10-05 16:11:19 +00:00
operator 07c67e5da3 fix(cli): parse swarm object correctly in 'box swarm status' 2026-10-05 16:06:50 +00:00
operator ea2f208083 feat(netvm): auto-recover and bring up node netns if down when invoking muse-cli 2026-10-05 16:06:25 +00:00
operator 063ed2b47b fix(cli): treat leading non-flag argument as target account for precise error feedback 2026-10-05 16:05:50 +00:00
operator 983b5c668c feat(cli): add 'box swarm' domain (list, status, spawn, prune) 2026-10-05 16:04:56 +00:00
operator c74ebaa658 feat(loop): add main-loop brain module for opm sidechat thinking and operator steering 2026-10-05 16:02:58 +00:00
operator e912f25dd7 feat(muse-cli): streamlined account argument handling and extracted clean inner invocation wrapper 2026-10-05 16:02:46 +00:00
operator fd3ef5dc2d feat(auth): auto-launch background browser if CDP is down during cookie extraction 2026-10-05 15:59:58 +00:00
operator d529d9ebab feat(core): node veth idempotency, multi-node cdp ports, brain last ids persistence, and pulse interval variable 2026-10-05 15:59:18 +00:00
operator 7c6c3a8fbf feat(cli): add interactive chat REPL mode for native muse CLI 2026-10-05 15:58:33 +00:00
operator e44d6c77f4 fix(harvester): restore #!/usr/bin/env python3 shebang at top of response-harvester.py 2026-10-05 15:58:23 +00:00
operator 447e9c1cc7 feat(swarm): bridge swarm slot dispatch to native muse_hybrid subagent sessions 2026-10-05 15:56:59 +00:00
operator 7b1998f00e docs: add native interactive muse cli wrapper and documentation 2026-10-05 15:50:24 +00:00
operator 008b689bee fix(swarm): keep stuck-slot reaper & verified dispatch while reverting worker pool to dev, def, muse 2026-10-05 15:38:00 +00:00
operator 7f92679281 feat(cli): add 'box ssh' command suite (mint, list, show) with auto signers registration 2026-10-05 15:33:38 +00:00
operator 26535791e5 feat(auth): provision SSH signing keys for 646 and opm and register in allowed_signers 2026-10-05 15:27:34 +00:00
operator 36d572c451 feat(prompt): enable SSH-signed box read/respond commands for pip 2026-10-05 15:23:21 +00:00
operator 42ae62a047 feat(prompt): integrate box runtime block with SSH-signed work order read/respond paths 2026-10-05 15:22:39 +00:00
operator 97966ded73 fix(endpoints): point curl tool instruction to live https://exec.muse-dev.online/exec 2026-10-05 15:20:54 +00:00
operator 4193a2bd59 feat(swarm): add box swarm prune --stale-hours command and archive stale swarms 2026-10-05 15:18:51 +00:00