Skip to content

domain-skills: manus + perplexity — task workflows#179

Open
muqsitnawaz wants to merge 4 commits intobrowser-use:mainfrom
muqsitnawaz:skill/manus-perplexity
Open

domain-skills: manus + perplexity — task workflows#179
muqsitnawaz wants to merge 4 commits intobrowser-use:mainfrom
muqsitnawaz:skill/manus-perplexity

Conversation

@muqsitnawaz
Copy link
Copy Markdown

@muqsitnawaz muqsitnawaz commented Apr 24, 2026

Adds two new domain skills for long-running agent products.

manus/tasks.md

  • URL patterns: /app/<taskId> for a run, /share/<taskId> for a public link (same 22-char id).
  • Private API: Connect RPC at api.manus.im, pattern /<package>.v<N>.<Service>/<Method>. Lists the services + methods observed on the wire (SessionService/{ListSessions,GetSession,ShareSession,UpdateReadPosition}, etc.).
  • Composer: the input is TipTap/ProseMirror (div.ProseMirror[contenteditable="true"]) — .value setting does nothing, placeholder lives on the inner <p> via data-placeholder.
  • Submission: coordinate-locate + type_text() + Enter / send-button click; the submit button is disabled while the editor is empty.
  • Task state: only durable DOM marker for completion is the literal text Task completed; response body lives in a Shiki-rendered markdown block.
  • Share: clicking Share fires SessionService/ShareSession, popover uses Floating UI portal. The Copy-link button writes via document.execCommand('copy') rather than navigator.clipboard.writeText — the share URL is https://manus.im/share/<taskId>, derivable from the path.

perplexity/computer.md

  • URL patterns: /computer/tasks dashboard, /computer/tasks/<slug>-<id> detail, same URL + ?view=thread for public share (no separate /share path).
  • Wire format note: __NEXT_DATA__ is null on detail pages and there are no visible api.perplexity.ai fetches on page load — task state hydrates via streaming RSC. wss://suggest.perplexity.ai/suggest/ws is typeahead only, not the task stream.
  • Composer: Lexical ([data-ask-input-container] + [data-lexical-editor="true"]) — distinct from Manus. Same contenteditable caveats.
  • Dashboard: CSS-grid table with proper ARIA (div[role="row"] / div[role="cell"]), rows are clickable but not <a>.
  • Detail page: tool invocations use group/tool-wrapper, the Todo panel is a floating popover with plan items, LM-rendered markdown blocks carry data-renderer="lm".
  • Artifacts: persistent URLs on pplx-res.cloudinary.com, presigned (expiring) URLs on CloudFront — archive via Cloudinary when possible.
  • Share: privacy levels carry stable data-testid="access-level-{private,specific-people,public}" hooks; Copy Link button uses navigator.clipboard.writeText (not execCommand).

Process notes

  • Both skills were built by driving the live sites through browser-harness end-to-end (Manus task submitted and completed + shared; Perplexity Computer dashboard, an existing completed task, and the share popover were explored).
  • No raw pixel coordinates in code examples (per SKILL.md) — selectors compute bounding rects at runtime.
  • No user-specific ids, session cookies, or presigned tokens are included.

Summary by cubic

Adds two domain skills for Manus and Perplexity Computer to run long tasks end-to-end with durable, coordinate-free selectors and stable URL/ID patterns. Improves robustness for editor mounting, ID parsing (including trailing slashes), and completion detection.

  • New Features

    • Manus: api.manus.im Connect RPC map; TipTap composer selectors; /app/<taskId> and /share/<taskId>; completion via “Task completed”; Share popover copies via document.execCommand('copy').
    • Perplexity Computer: /computer/tasks dashboard and /computer/tasks/<slug>-<id> detail; Lexical composer; ARIA role="row"/"cell" task list; tool steps via group/tool-wrapper; LM blocks data-renderer="lm"; artifacts on Cloudinary vs presigned CloudFront; share is ?view=thread using navigator.clipboard.writeText with data-testid privacy controls.
  • Refinements

    • Connect transport: request JSON is wrapped in Uint8Array, but on-the-wire content is JSON.
    • Composer handling: no pixel clicks; compute rects, and add a bounded retry for late TipTap mount on Manus.
    • Perplexity IDs: extract the 22-char id from the URL pathname (trailing-slash safe) to avoid ?view=thread/hash corruption.
    • Todo checks: scope to the Radix popover via aria-controls; all_todo_done() returns None when closed/hydrating and True only when all icons are #pplx-icon-check.
    • Removed real task IDs/slugs and tightened SKILL.md compliance.

Written for commit 106075e. Summary will update on new commits.

- manus/tasks.md: Connect RPC endpoints at api.manus.im, TipTap composer,
  task URL pattern /app/<id>, share URL pattern /share/<id>, task-completion
  selectors, share popover + copy-link flow (execCommand path).
- perplexity/computer.md: dashboard vs detail URLs under /computer/tasks,
  Lexical composer with [data-ask-input-container] + [data-lexical-editor]
  markers, ARIA grid task list (role=row / role=cell), Todo + Usage panels,
  tool-invocation rows (group/tool-wrapper), artifact URLs (pplx-res
  Cloudinary vs presigned CloudFront), share popover with
  data-testid=access-level-{private,specific-people,public} and the
  ?view=thread share URL pattern.
@browser-harness-review
Copy link
Copy Markdown

browser-harness-review Bot commented Apr 24, 2026

✅ Skill review passed

Reviewed 2 file(s) — no findings.

Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 2 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="domain-skills/manus/tasks.md">

<violation number="1" location="domain-skills/manus/tasks.md:16">
P2: Connect protocol description is inaccurate/contradictory: it claims `application/json` requests are binary-encoded, but example and Connect docs indicate JSON payloads for unary JSON codec.</violation>
</file>

<file name="domain-skills/perplexity/computer.md">

<violation number="1" location="domain-skills/perplexity/computer.md:153">
P2: Todo completion detection uses a global icon query instead of scoping to the Todo panel, which can produce incorrect completion state.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

Comment thread domain-skills/manus/tasks.md Outdated
Comment thread domain-skills/perplexity/computer.md Outdated
manus/tasks.md
- Correct the Connect RPC transport description: the JS client wraps the
  JSON payload in a Uint8Array before fetch, so a naive fetch-hook logs
  it as <<bytes:N>> — the wire content matches content-type (JSON both
  ways), not a separate binary codec.
- Replace the raw click(750, 505) example with a computed rect from
  div.ProseMirror[contenteditable="true"] (SKILL.md: no pixel coords).
- Drop the specific-task prompt example ('reply with just the word PONG'
  → 'Reply with PONG') for a generic description of the auto-summary.
- Remove a real taskId from the URL-pattern docstring.

perplexity/computer.md
- Scope Todo-panel queries to the Radix popover. The Todo button has
  data-state / aria-expanded / aria-controls; the open panel is mounted
  with id === button.aria-controls. A global 'svg use' query across the
  whole document picks up tool-invocation icons, sidebar icons, and top-
  bar icons — scope-less completion detection is unreliable.
- Rewrite all_todo_done() to return None when the panel is closed or
  hydrating and True only when every row's icon is #pplx-icon-check.
- Remove a real slug and taskId from the URL-pattern docstring.
@muqsitnawaz
Copy link
Copy Markdown
Author

Thanks — both are fair. Pushed 253887b:

  • manus/tasks.md:16 — the Connect description was wrong. Connect's JSON codec sends JSON text both ways; my naive fetch-hook logged bodies as <<bytes:N>> because the JS client wraps the JSON in a Uint8Array before fetch, and I mis-read that as a separate binary encoding. Rewritten to explain the hook artifact and confirm the wire content matches content-type: application/json.
  • perplexity/computer.md:153 — agreed, the global svg use query was junk. The Todo button is a Radix trigger, so the panel id = button.aria-controls once data-state === "open". all_todo_done() now resolves the panel via that, scopes the icon query to it, and returns None / True instead of a boolean that lies when the panel is closed.

The same commit also cleans up three SKILL.md violations I missed in the first push (one raw click coord, one run-narration example, two real taskIds in the URL-pattern docstrings).

Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 issues found across 2 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="domain-skills/manus/tasks.md">

<violation number="1" location="domain-skills/manus/tasks.md:59">
P2: DOM-submit example dereferences a possibly missing editor element without a null guard or retry, so the helper can throw and block task submission.</violation>
</file>

<file name="domain-skills/perplexity/computer.md">

<violation number="1" location="domain-skills/perplexity/computer.md:13">
P2: ID extraction guidance is incorrect/ambiguous and can produce wrong task IDs (especially when query params are present).</violation>

<violation number="2" location="domain-skills/perplexity/computer.md:175">
P3: Documentation contradicts the helper implementation: hydration returns `false`, not `None`.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

Comment thread domain-skills/manus/tasks.md Outdated
Comment thread domain-skills/perplexity/computer.md Outdated
Comment thread domain-skills/perplexity/computer.md
- manus/tasks.md: ProseMirror composer can mount late; wrap the
  getBoundingClientRect lookup in a bounded retry + assertion so the
  helper doesn't null-deref and block submission.
- perplexity/computer.md: id extraction must parse the URL pathname
  before slicing — raw-href slicing corrupts when the URL carries
  ?view=thread or a hash fragment.
- perplexity/computer.md: all_todo_done() returned false on hydrate
  while the doc claimed None; unify on None so "can't tell" states
  (closed panel, empty panel) are distinguishable from "done=false".
@muqsitnawaz
Copy link
Copy Markdown
Author

Round 2 — pushed 01fdbd7. All three are fair:

  • manus/tasks.md:59 — the ProseMirror lookup had no retry and no null guard. On a cold Manus tab the editor mounts after the initial wait(1.5) about 1 in 5 runs, so ce.getBoundingClientRect() would throw on a null. Rewrapped in a bounded retry loop (10 × 0.5s) with a final assert rect so the failure mode is a clear message instead of a TypeError mid-script.
  • perplexity/computer.md:13 — "strip the trailing 22 chars" implicitly assumed the caller passed pathname, but the common case is pasting a full href with ?view=thread. Replaced with explicit URL-parse-then-slice and showed both JS (new URL(href).pathname.split('/').pop().slice(-22)) and Python (urlparse(href).path.rsplit('/', 1)[-1][-22:]) forms.
  • perplexity/computer.md:175 — real contradiction. The prose said the helper returns None on hydrate, the JS returned false. Changed the helper to return null when icons.length === 0, so callers can distinguish "panel closed or still hydrating" (None) from "panel mounted, some rows not yet checked" (False).

Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 2 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="domain-skills/perplexity/computer.md">

<violation number="1" location="domain-skills/perplexity/computer.md:15">
P2: ID extraction examples are brittle: they return an empty ID when the task URL has a trailing slash.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

Comment thread domain-skills/perplexity/computer.md Outdated
@muqsitnawaz
Copy link
Copy Markdown
Author

Pushed one more — trailing-slash handling in the id-extraction snippet (JS .filter(Boolean), Python .rstrip('/')). That's the last cubic chase from me; happy to keep iterating if a maintainer has substantive feedback. Ready for human review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant