Commit Graph

606 Commits

Author SHA1 Message Date
operator-main ac6d7bf2d3 BOX-API-SPEC: Add UI/API design principle\n\nUI surfaces allow agent creativity but clearly steer toward API.\nThe UI teaches, the API is the source of truth. 2026-10-04 03:00:03 +00:00
operator-main e7aae05dbd BOX-API-SPEC: Add rich scheduling and DM metadata appendices\n\nAppendix A: Rich Linux scheduling (systemd, cron, at) with unified API.\nAppendix B: DM + metadata JSON (wire format, types, API endpoints). 2026-10-04 02:59:40 +00:00
operator-main b1247c530b Add BOX-API-SPEC.md: agentic timer management interface\n\nSpec for box.muse-dev.online API to manage systemd timers on bl.\nCovers: endpoints (list/create/start/stop/delete), auth (ops bearer),\nbackend (SSH to bl), rate limiting, web UI. 2026-10-04 02:57:55 +00:00
operator-main 372e9612db Add JOB-SPEC.md: hosted job scheduler and distributor\n\nSpec for cron-driven job system that injects prompts via DM.\nCovers: job YAML format, scheduler (systemd timers), dispatcher,\nagent handler convention, collector, sidechat integration,\nlogging, rate limiting. 2026-10-04 02:55:51 +00:00
operator-main 70b82f5a8b Add sidechat_manager.py: robust sidebar operations with retry and logging\n\n- ensure_sidebar() with exponential backoff (2s, 4s, 6s)\n- list_sidechats() with heuristic parsing\n- log_sidechat_op() for audit trail to sidechat-log.jsonl\nAddresses flaky NOSIDEBAR errors from hardcoded sleeps. 2026-10-04 02:49:38 +00:00
operator-main 89b9fdb9f8 Add DM-SPEC.md (work orders + server-side logging spec)\n\nCopied from frontdoor repo per 646 request. Spec covers:\n- Work orders as first-class DM kind\n- Server-level DM logging (append-only)\n- Box visibility via DMs tab 2026-10-04 02:42:23 +00:00
operator-main 7c591c73bc Add shared rate_limiter.py module\n\nModular rate limiter any .py script can use:\n from rate_limiter import rate_limit_wait\n rate_limit_wait(agent)\n\nToken bucket per agent: 1 op/3s sustained, burst 5, max 20/min.\nState in /tmp/netvm-rate-limit.json. 2026-10-04 02:40:56 +00:00
operator-main c48fbc03f6 muse-chat-api: Dont block sends on dialogs without IPs\n\ncheck_approvals was raising APPROVAL_NEEDED for false positives\n(dialogs without IP addresses, likely chat content misidentified).\nOnly IP-based permission dialogs should block. Others are ignored. 2026-10-04 02:32:38 +00:00
operator-main d82bf58e78 DM: signed-DM pipeline (dm-sign.sh) + attribution unification + honest docs
- New bin/dm-sign.sh: produce signed DMs (ssh-keygen -Y sign, namespace
  dm) in the [from:X] [id:Y] wire format that dm.py verify-sig checks.
  dm.py referenced it in usage but it never existed.
- dm.py: rewrite stale docstring/argparse (claimed verification was
  removed / delivery unconfirmed — it does recipient-side read-back with
  3 retries); unify all attribution on [from:X]/[id:Y] (was three
  formats: [from X], [X], [from:X]); fix dm_thread double-attribution;
  --no-verify kept as a documented no-op; raw mode sends verbatim and
  reuses the embedded [id:Y] for the audit log; navigation/send/park
  now all target the recipient browser (fixes cross-operator side-chat
  sends); drop dead --from-sender flag.
- Register dm-signers/operator-main.pub.
- Round-trip verified: sign (operator-main) -> send --raw via opm
  loopback -> read-back SENT+VERIFIED -> verify-sig GOOD.
2026-10-04 02:31:37 +00:00
operator-main 6189793748 agent-health.sh: Verify CDP port liveness, not just API success\n\nThe watchdog only checked if the API responded, missing zombie\nbrowsers (process alive but CDP not listening). Now explicitly\nchecks via ss -tln in the netns before trying the API.\nAlso: kill by exact PIDs instead of unreliable pkill patterns,\nand warn if port still bound after kill. 2026-10-04 02:23:20 +00:00
operator-main 5dddedb667 muse-chat-api: Press chat button to refocus Main Chat\n\nUser confirmed pressing the chat button properly refocuses Main Chat.\nSimpler and more reliable than searching for Main chat text in sidebar. 2026-10-04 02:11:41 +00:00
operator-main c83fb7c294 muse-chat-api: Use fuzzy matching for Main chat button\n\nExact match was too fragile - if the UI text differs slightly,\nit returns NOTFOUND and the browser stays on the side chat.\nNow uses substring + shortest-first like cmd_sidechat_use. 2026-10-04 02:04:19 +00:00
operator-main 062e46a6f8 chat-state tap: per-node main+sidechat reporter for box
chat-state-check.py: polls each node Chromium via CDP, captures main
chat + up to 5 side chats (last 10 DOM-visible messages each, 500
chars). Structural React selectors; picks the most common non-empty
list across repeated renders.
chat-state-report.py: signs and POSTs the report to the board
/api/box/chat-state/report ingest (namespace health, 5-min timer).

Session: sidechat/box-console
2026-10-04 01:59:00 +00:00
operator-main e5c85c7940 muse-chat-api: Fix cmd_sidechat_main to click Main chat button\n\nWas navigating to https://muse.ai/ (landing page) which restores the\nlast-viewed chat (often a side chat like Manage Muse agents). Now opens\nthe sidebar and clicks the Main chat element directly. 2026-10-04 01:58:41 +00:00
operator-main 77d904d344 dm.py: Fix dm_thread to pass to_agent correctly\n\nWas calling dm_send(to_agent, target, attributed) which set the\nsender to the recipient and omitted the to_agent param. Now calls\ndm_send(from_agent, target, attributed, to_agent=to_agent). 2026-10-04 01:29:26 +00:00
operator-main d3c19425e8 muse-chat-api.py upload: verify via Remove-attachment button 2026-10-04 01:28:47 +00:00
operator-main c759ca353f muse-chat-api.py upload: ev1() skips CDP chatter on verify 2026-10-04 01:28:19 +00:00
operator-main 716b31a7e6 muse-chat-api.py upload: verify chip by own-text (React swaps the input) 2026-10-04 01:27:55 +00:00
operator-main 1c386ca6bb muse-chat-api.py: cdp_call skips CDP event chatter 2026-10-04 01:25:44 +00:00
operator-main 566edf20c6 muse-chat-api.py upload: --dry-run/--message as real argparse flags 2026-10-04 01:25:10 +00:00
operator-main b5f718a885 muse-chat-api.py: upload subcommand (CDP file attach)
Attach a file to the agent chat composer via DOM.setFileInputFiles.
--dry-run stages the attachment and verifies the preview chip without
sending; otherwise sends (optional --message caption) and verifies via
read-back. Supports the box console upload flow (v0.2).

Session: sidechat/box-console
2026-10-04 01:23:22 +00:00
operator-main f19aff9b79 Fix supervisor SIGKILL loop killing restarted browsers (opm/pip)
Root cause: agent-health.service runs Type=oneshot with the default
KillMode=control-group. restart_browser() spawned the replacement
chromium with nohup under the service, so systemd SIGKILLed it the
moment the service exited. Every 5-min tick: FAIL -> restart ->
RECOVERED -> SIGKILL at teardown. opm and pip were permanently dark
and dm.py read masked it (empty output, exit 0).

Fix: launch replacements via systemd-run --user --scope (backgrounded)
so the browser lives in a transient scope outside the service cgroup
and survives teardown. setsid does NOT escape either. Note:
systemd-run --scope waits for the scope even with --no-block
(verified 2026-10-03), hence the backgrounding. Same fix in
chromebox-watchdog.sh (timers currently off).

dm.py: dm_read() now uses run_full() and prints a WARNING to stderr
with rc + last error line instead of failing silently on empty reads.

Trailers: Session: sidechat/opm-blind-fix
2026-10-04 01:16:59 +00:00
operator 3a1f0107ba Add holdings logging to muse-auth.py (log_holdings/get_holdings, logs/auth-holdings.log) 2026-10-03 22:32:54 +00:00
operator 08f05263e6 dm.py: Add UUID, logging, and read-back verification. No trust required. 2026-10-03 21:36:42 +00:00
operator 027d7baa30 multi-account selection: --account-name hint, exit 3 NEEDS_HUMAN
onboard-driver.py accepts --account-name and forwards to muse-signin.py.
muse-signin.py detects Meta multi-account selection after OTP submit:
with a hint it clicks the matching display-name button (never the +1
collapsed entry); without a hint (or no match) it exits 3 so the queue
marks the job needs_human instead of stalling.
2026-10-03 21:30:32 +00:00
operator a7639e2341 propagation: single registry drives all node references
New bin/netvm-registry.py parses NODES.md (node -> cdp_port); every
consumer reads from it instead of hardcoding:
- onboard-driver.py: CDP_PORTS dict -> registry lookup (new nodes work)
- muse-signin.py: hardcoded 9410 -> --node/--cdp-port args
- muse-chat-api.py: hardcoded ACCOUNTS -> registry-built
- agent-health.sh: hardcoded muse/pip blocks -> loop over all active
  nodes (646 and opm now get health coverage too)
NODES.md: record opm node (9440).
2026-10-03 21:28:36 +00:00
operator 1191cbd86e Add muse-auth.py: login state detection, sign-in vs sign-up notes 2026-10-03 21:06:22 +00:00
operator 02cf10acc8 bulk onboarding step 1: netvm-provision-node.sh + CDP_PORT_OVERRIDE
One command provisions a full client node: Warp identity (operator-
authorized 2026-10-03), netns + tunnel, chrome-box profile, NODES.md
registry entry with next-free 94x0 CDP port. Idempotent per stage.
netvm-names.sh gains CDP_PORT_OVERRIDE (backwards compatible) so the
CDP relay and the browser share the assigned port.
2026-10-03 20:54:56 +00:00
operator 2006ecd5a2 Add opm (operator-main) to DM system on CDP 9440 2026-10-03 20:50:53 +00:00
operator 9d6805060e Remove wrongly-specced opp-dm.py and dev-dm.py; dm.py is the headless DM tool 2026-10-03 20:34:33 +00:00
operator 7272ccfeea opp-dm.py: fix to work from bl or container, verify writes 2026-10-03 20:28:18 +00:00
operator 3ad28cb679 opp-dm.py and dev-dm.py: separate operator vs developer DM systems 2026-10-03 20:25:21 +00:00
operator e934a31778 dm-listener: auto-route 646 Message commands 2026-10-03 20:00:43 +00:00
operator 9fde2232fd dm.py: Headless DM function class, separate from Chat 2026-10-03 19:48:09 +00:00
operator fced2e79a4 thread-listener: auto-execute 646 THREAD commands 2026-10-03 19:43:40 +00:00
operator 169b7d1f35 p2p-relay: add watermark to prevent duplicates 2026-10-03 19:25:42 +00:00
operator 828f67ffc8 p2p-relay: 646 to muse via headless 2026-10-03 19:21:04 +00:00
operator 667755e312 meta-acct: Accounts Center read API (list-linked, security-status, login-activity)\n\nImplements the read ops from META-ACCOUNTS-API.md via the agent browser\nsession. Key finding: phone-OTP login leaves a full Meta session -\naccountscenter.meta.com loads without redirect.\n\nAlso: 646 node fully registered (warp-646, CDP 9430, active). 2026-10-03 19:20:47 +00:00
operator 1b3faf0126 bridge: add P2P 646-muse channels 2026-10-03 19:19:30 +00:00
operator 75368424c2 bridge: add 646-reports to #ops 2026-10-03 19:17:39 +00:00
operator a8d456529f muse-chat-api: add sidechat use/main/list commands 2026-10-03 19:15:50 +00:00
operator 23bf83a09f bridge: add 646 test mapping for #ops 2026-10-03 19:02:21 +00:00
operator abd4497bd6 bridge: clean test mapping 2026-10-03 18:59:59 +00:00
operator 63b62b5f0c bridge.py: front-door to muse.ai metadata bridge CLI 2026-10-03 18:59:52 +00:00
operator a5a821f3b1 BRIDGE_SPEC.md: front-door to muse.ai metadata bridge v0.1 2026-10-03 18:58:25 +00:00
operator 5b9e6e55d7 muse-chat-api.py: remove stale 646 duplicate 2026-10-03 18:52:47 +00:00
operator e8c6362c3e muse-chat-api.py: add 646 2026-10-03 18:37:13 +00:00
operator f11da73efe SIDECHAT_SPEC.md: side chat data model v0.1 2026-10-03 18:18:56 +00:00
operator 00772e408c Fix GOLDEN PATH header (preserve docstring) 2026-10-03 18:06:42 +00:00
operator ed45611912 Add GOLDEN PATH headers to agent loops 2026-10-03 18:04:57 +00:00