Browser companion plugin for AI coding assistants — Chrome automation MCP, in-page hint messaging, and persistent project memory across Claude Code sessions.
Drift inferred · capture-to-capture
tool count over time
tools
-
browser_act_and_observe
Perform one action (click/type/navigate/press_key/click_at) and classify the result: WORKS / NO-OP / ERROR / NAVIGATES. A NO-OP (clickable but nothing changed) is a dead control = defect. Returns urlC
-
browser_assert
Verify url-contains, url-equals, title-contains, element-exists, element-missing, text-contains, text-equals. Returns {ok, got}.
-
browser_assert_no_errors
One-call health gate: ok=false if any console error/uncaught exception or any >=400/failed request happened since the page loaded (sinceNavigation default, or sinceMs, with ignoreUrlContains). Failed-
-
browser_audit_interactives
Enumerate every actionable control on the page (scope:"all"\
-
browser_clear_emulation
Reset viewport overrides.
-
browser_click
Click by selector (CDP). Pass intent to cache the selector for next time.
-
browser_click_at
Click at pixel coords (CDP).
-
browser_close_tab
Close a specific session tab.
-
browser_console_messages
accepts sinceNavigation:true to scope to the
-
browser_emulate_viewport
Device Mode via CDP. Presets + custom width/height/DPR/UA.
-
browser_forget_selector
Drop a cached entry.
-
browser_links
Compact visible links with text, href, selector ref, and box.
-
browser_list_selectors
Inspect the cache.
-
browser_list_tabs
List session tabs + CDP attachment state.
-
browser_navigate
Navigate primary tab, wait for load.
-
browser_network_requests
accepts sinceNavigation, sinceMs, and
-
browser_open_tab
Open new tab inside the session group.
-
browser_page_assets
Hash the live page assets (script/css/document) with sha256 + a pageHash. Confirm the live bundle hash == the built hash so you never test a stale cached deploy.
-
browser_playbook_dashboard
Generate a self-contained HTML dashboard from the library; opens in the active browser session.
-
browser_playbook_delete
Remove a playbook + workflow + screenshots.
-
browser_playbook_diff_accept
Bless a run's per-step screenshots as the new visual reference; bumps playbook_version.
-
browser_playbook_export
Export one or more playbooks to a single JSON bundle file. Includes embedded base64 screenshots.
-
browser_playbook_get
Return one playbook with meta + body sections + workflow JSON.
-
browser_playbook_import
Import a playbook bundle (file / inline JSON / https URL). Supports overwrite + rewriteOrigin (e.g., staging → production).
-
browser_playbook_list
List playbooks under .continuum/playbooks/, filter by origin/tag/verifiable.
-
browser_playbook_match
Score-match playbooks against a URL, intent, or task description.
-
browser_playbook_propose_update
Given a successful trace, create or update the matching playbook. Inputs and steps auto-inferred.
-
browser_playbook_run
Replay a playbook (with self-heal) using provided inputs; recursively executes composes/next chains; returns verdict + evidence.
-
browser_playbook_save
Create/update a playbook (validates frontmatter and required sections).
-
browser_playbook_secret_check
Validate that a playbook's type: secret inputs are resolvable (env or .continuum/secrets/). Returns availability only — never values.
-
browser_playbook_seed_from_codebase
Static-analyze the project's frontend (Next.js / Vite / CRA) and emit draft playbooks per route + form. Solves cold-start on in-house apps.
-
browser_press_key
Real keyboard event (CDP).
-
browser_recall_selector
"Do I already know how to find X on this site?" Returns cached selector or null.
-
browser_request_attention
Post an OS notification asking the human to look (captcha, choice, or "done — come look"). Click focuses the window.
-
browser_run_history
Last N runs of a workflow.
-
browser_screenshot
PNG/JPEG (viewport / fullPage / elementRef).
-
browser_scroll
Absolute {x,y} or relative {deltaX,deltaY}.
-
browser_session_end
Detach debugger, ungroup or close session tabs.
-
browser_session_health
accepts heal:true to re-attach the debugger to
-
browser_session_start
New tab group + primary tab. Pass newWindow:true to spawn a fresh window. Posts a click-to-focus notification instead of stealing focus.
-
browser_set_storage
Deterministic auth/state seeding — set localStorage, sessionStorage, and cookies (or clear) in one call so a flow starts from a known logged-in state.
-
browser_snapshot
ARIA tree with stable refs + pixel boxes. Defaults to compact, viewport-only, redacted, depth-limited, and 12KB capped.
-
browser_snapshot_node
Return one compact subtree from the stored snapshot by ref, text, or query path.
-
browser_snapshot_query
Search the stored snapshot by text/name/role/ref/tag and return tiny excerpts.
-
browser_text
Compact visible text lines, optionally filtered by query. Use before snapshot for reading/searching content.
-
browser_type
Focus + clear + insertText. Pass intent to cache.
-
browser_upload_file
Attach a file to a page target via a strategy chain: direct (DOM.setFileInputFiles) → intercept (file-chooser dialog) → drop (synthesized DataTransfer + DragEvent) → paste (synthesized ClipboardEvent)
-
browser_upload_stage
Stage a file into the per-project library at .continuum/uploads/. Accepts path, https url, dataUrl, or base64. Returns a stable stashId (sha256-based, idempotent) reusable across many uploads.
-
browser_wait
Sleep up to 60s.
-
browser_wait_for_response
Block until a matching network response arrives (urlGlob/urlContains, method, statusGte/statusLt, timeoutMs). Proves a write actually persisted instead of guessing from the UI.
-
browser_window_resize
Resize/move/maximize the actual window (only safe with newWindow).
-
browser_workflow_run
Replay. Cached selector → self-heal by role+name → screenshot on miss.
-
browser_workflow_save
Persist current session's auto-traced actions as a named workflow.
analyzed commit 9f05329 · analyzer v33 · 2w ago
skills & prompt files 2
danger signals3
- dynamic code execution new Function() DevZonayed-Mochi-9f05329/server/dist/comms.bundle.mjs :2952
const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode); - dynamic code execution new Function() DevZonayed-Mochi-9f05329/server/dist/server.bundle.mjs :2949
const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode); - over-broad OAuth scope https://mail.google.com/ DevZonayed-Mochi-9f05329/server/_playbooks.test.mjs :183
body: "## Summary\nx\n## Preconditions\nx\n## Steps\nNavigate https://mail.google.com/mail/u/0/#inbox\n## Verification\nx\n## Selectors used\n\n## Recent runs\n\n## Screenshots\n",
code files: 138
filesystem 78
- fs DevZonayed-Mochi-9f05329/install.js :11
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/hooks/pre_tool_use.js :12
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/hooks/session_end.js :8
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/hooks/session_start.js :2
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/hooks/stop.js :14
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/hooks/user_prompt_submit.js :10
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/archive.js :6
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/comms_config.js :7
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/comms_import.js :16
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/comms_state.js :1
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/comms_store.js :8
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/dream_finalize.js :20
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/feedback.js :11
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/hint_formatter.js :10
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/install_id.js :10
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/paths.js :2
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/recall.js :16
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/rename_cli.js :5
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/render_archive.js :14
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/status.js :5
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/telemetry_cli.js :6
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/telemetry_config.js :11
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/telemetry_emit.js :42
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/telemetry_log.js :10
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/verification_ledger.js :23
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/verification_log.js :9
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/continuum/lib/write_link.js :14
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/plugins/continuum/tests/run-popup-synthetic.mjs :10
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/plugins/continuum/tests/run-telemetry-all.mjs :4
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/plugins/continuum/tests/run-telemetry-config.mjs :5
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/plugins/continuum/tests/run-telemetry-emit.mjs :5
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/plugins/continuum/tests/run-telemetry-install-id.mjs :4
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/plugins/continuum/tests/run-telemetry-log.mjs :5
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/plugins/qa/lib/qa_coverage.js :32
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/plugins/qa/lib/qa_coverage.test.mjs :15
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/server/_codebase_seed.test.mjs :4
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_comment_merge.test.mjs :10
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/server/_comms_build_config.test.mjs :4
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/server/_comms_bundle_smoke.test.mjs :19
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/server/_comms_ci_verify.test.mjs :5
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/server/_comms_mcp_entry.test.mjs :4
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/server/_comms_server.test.mjs :5
import fs from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/_comms_smoke.mjs :5
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_comms_state_meta.test.mjs :12
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_comms_wa_capture.test.mjs :5
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_comms_wa_lifecycle.test.mjs :5
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_comms_wa_lock.test.mjs :5
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_fixtures/playbooks/server.mjs :2
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_fixtures/upload/server.mjs :2
import fs from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/_multi-client.mjs :7
import { mkdtempSync } from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/server/_playbook_bundles.test.mjs :4
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_playbook_dashboard.test.mjs :4
import fs from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/_playbook_e2e.mjs :7
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_playbook_wire.test.mjs :4
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_playbooks.test.mjs :4
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_secrets.test.mjs :4
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_telemetry_ci_verify.test.mjs :3
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/server/_upload_e2e.mjs :9
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_upload_wire.test.mjs :5
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_uploads.test.mjs :5
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/server/_visual_diff.test.mjs :4
import fs from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/src/bridge.js :25
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/server/src/chrome-launcher.js :6
import { existsSync } from "node:fs"; - fs DevZonayed-Mochi-9f05329/server/src/codebase-seed.js :3
import fs from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/src/comms/whatsapp.js :6
import fs from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/src/memory.js :16
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/server/src/playbook-bundles.js :3
import fs from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/src/playbook-dashboard.js :3
import fs from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/src/playbooks.js :3
import fs from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/src/secrets.js :3
import fs from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/src/tools.js :12
import fsp from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/src/uploads.js :5
import fs from "node:fs/promises"; - fs DevZonayed-Mochi-9f05329/server/src/visual-diff.js :3
import fs from "node:fs/promises"; - fs (weak) DevZonayed-Mochi-9f05329/telemetry-server/_docker.test.mjs :3
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/telemetry-server/_server.test.mjs :3
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/telemetry-server/_server_pkg.test.mjs :3
import fs from "node:fs"; - fs (weak) DevZonayed-Mochi-9f05329/telemetry-server/_store.test.mjs :3
import fs from "node:fs"; - fs DevZonayed-Mochi-9f05329/telemetry-server/store.mjs :5
import fs from "node:fs";
shell / exec 14
- shell DevZonayed-Mochi-9f05329/install.js :13
import { spawnSync } from "node:child_process"; - shell DevZonayed-Mochi-9f05329/plugins/continuum/hooks/session_start.js :5
import { execSync } from "node:child_process"; - shell DevZonayed-Mochi-9f05329/plugins/continuum/lib/dream_finalize.js :22
import { execSync } from "node:child_process"; - shell DevZonayed-Mochi-9f05329/plugins/continuum/lib/feedback.js :14
import { execSync } from "node:child_process"; - shell DevZonayed-Mochi-9f05329/plugins/continuum/lib/write_link.js :17
import { execSync } from "node:child_process"; - shell (weak) DevZonayed-Mochi-9f05329/plugins/continuum/tests/run-popup-synthetic.mjs :7
import { spawn, spawnSync } from "node:child_process"; - shell (weak) DevZonayed-Mochi-9f05329/plugins/continuum/tests/run-telemetry-all.mjs :3
import { spawnSync } from "node:child_process"; - shell (weak) DevZonayed-Mochi-9f05329/plugins/qa/lib/qa_coverage.test.mjs :14
import { spawnSync } from "node:child_process"; - shell (weak) DevZonayed-Mochi-9f05329/server/_comms_bundle_smoke.test.mjs :23
import { spawn, spawnSync } from "node:child_process"; - shell DevZonayed-Mochi-9f05329/server/_comms_smoke.mjs :2
import { spawn } from "node:child_process"; - shell DevZonayed-Mochi-9f05329/server/_integration.mjs :7
import { spawn } from "node:child_process"; - shell DevZonayed-Mochi-9f05329/server/src/bridge.js :27
import { exec } from "node:child_process"; - shell DevZonayed-Mochi-9f05329/server/src/chrome-launcher.js :5
import { spawn } from "node:child_process"; - shell DevZonayed-Mochi-9f05329/server/src/secrets.js :6
import { execSync as _execSync } from "node:child_process";
network 14
- net DevZonayed-Mochi-9f05329/extension/background.js :912
const resp = await fetch(chrome.runtime.getURL(`icons/mochi-${s}.png`)); - net DevZonayed-Mochi-9f05329/plugins/continuum/lib/broker.js :22
const res = await fetch(`${url}${path}`, { ...opts, signal: ctrl.signal }); - net DevZonayed-Mochi-9f05329/plugins/continuum/lib/telemetry_emit.js :8
// deps.fetch — injected fetch (defaults to global fetch) so tests mock it. - net (weak) DevZonayed-Mochi-9f05329/plugins/continuum/tests/run-popup-synthetic.mjs :76
const r = await fetch(`${BASE}${p}`, opts); - net DevZonayed-Mochi-9f05329/server/_claude_sessions.mjs :42
const r = await (await fetch(`${BASE}/claude/sessions`)).json(); - net (weak) DevZonayed-Mochi-9f05329/server/_fixtures/playbooks/server.mjs :1
import http from "node:http"; - net (weak) DevZonayed-Mochi-9f05329/server/_fixtures/upload/server.mjs :1
import http from "node:http"; - net DevZonayed-Mochi-9f05329/server/_integration.mjs :378
const osResp = await fetch(`http://127.0.0.1:${TEST_PORT}/os/open-notification-settings`, { method: "POST" }); - net (weak) DevZonayed-Mochi-9f05329/server/_uploads.test.mjs :159
import http from "node:http"; - net DevZonayed-Mochi-9f05329/server/src/bridge.js :24
import http from "node:http"; - net DevZonayed-Mochi-9f05329/server/src/playbook-bundles.js :5
import { request as undiciRequest } from "undici"; - net DevZonayed-Mochi-9f05329/server/src/uploads.js :7
import { request as undiciRequest } from "undici"; - net (weak) DevZonayed-Mochi-9f05329/telemetry-server/_server.test.mjs :29
fetch(base + p, { method: "POST", headers: { "content-type": "application/json", ...headers }, body: JSON.stringify(body) }); - net DevZonayed-Mochi-9f05329/telemetry-server/server.mjs :6
import http from "node:http";
secrets 2
- secrets (weak) DevZonayed-Mochi-9f05329/server/_playbook_wire.test.mjs :89
process.env.MOCHI_TEST_SECRET = "topsecret"; - secrets (weak) DevZonayed-Mochi-9f05329/server/_secrets.test.mjs :67
process.env.GMAIL_PASSWORD = "x";
install hooks 1
- postinstall DevZonayed-Mochi-9f05329/package.json :14
cd server && npm install
perm:untrusted 1
- untrusted DevZonayed-Mochi-9f05329/server/_claude_sessions.mjs :42
const r = await (await fetch(`${BASE}/claude/sessions`)).json();