Skip to content

feat(aside): first-class Aside agentic-browser support - #98

Draft
intertwine wants to merge 1 commit into
mainfrom
feat/aside-first-class
Draft

feat(aside): first-class Aside agentic-browser support#98
intertwine wants to merge 1 commit into
mainfrom
feat/aside-first-class

Conversation

@intertwine

Copy link
Copy Markdown
Owner

Summary

Promotes Aside (agentic browser) from an ad-hoc --source cowork impersonation to a first-class observe source, alongside Claude Code / Codex / Grok / Cowork / Hermes.

Key realization: Aside persists a native per-session transcript at
~/.aside/u/<idx>/agents/<agent>/sessions/<date>_<id>/messages.jsonl, but with its own schema (keyed by role not type, epoch-ms timestamps, assistant content = list of text/thinking/toolCall blocks, no per-message UUID). That is why the Cowork/Claude parser ignored it. This PR gives Aside its own parser + count-based cursor (the Codex/Grok strategy).

What is in here

  • transcripts/aside.py — native parser: drops thinking, summarizes toolCall against Aside's real lowercase tool names, skips toolResult/system-message, ms to ISO-8601, discovery via u/*/agents/*/sessions/*/messages.jsonl (plus ASIDE_HOME override).
  • observe.pyobserve_aside_transcript + observe_all_aside (count cursor, rotation-safe). No om backfill wiring, matching the Grok precedent.
  • config.pyConfig.aside_home + aside_sessions_root.
  • cli.py--source aside (observe enum + --transcript dispatch + source detection + scan loop), an Aside section in om status, --for help text.
  • aside/skills/om/SKILL.md — Aside-side warm-start + write-back skill, shipped in the wheel (verified hatchling ships asset trees; uses the native --source aside flow, no hand-built transcript).
  • Docs: docs/integrations.md section, README Agent Support row, plans/aside-first-class-integration.md.
  • Tests: TestAsideParser, TestAsideObserver (8 new).

Design decisions needing scrutiny

  1. Observe-first peer, no installer. Aside has no native hook surface (daemon + skills), so there is no om install --aside; warm start is skill-driven via om context --for aside. Modeled on the manual Hermes path. Right shape, or do we want a thin installer that drops the skill into the Aside agent dir?
  2. Count-based cursor (no UUIDs). Same as Codex/Grok. Reset-to-0 when stored index > current message count (rotation/truncation). Attack this.
  3. No backfill (Grok parity) — intentional, but call it if you disagree.
  4. No version bump. 0.9.0 will batch the larger interim post-0.8.0 work; this rides along.

Adversarial review requested — please try to break:

  • Parser edge cases: empty/whitespace lines, invalid JSON, list-typed user content, unknown block types, missing/string/negative/huge timestamp, an assistant turn that is only thinking (should drop) vs only a toolCall (should summarize), gigantic transcripts.
  • Privacy: confirm thinking blocks and raw toolResult bodies never reach observations. Do toolCall.arguments summaries risk leaking secrets (e.g. tokens in a bash command)? Should we redact?
  • Discovery glob: multi-user (u/1, u/2) and multi-agent layouts; symlinks; non-main agents; does the find_recent 24h window match expectations?
  • Cursor/idempotency: interleaved toolResult/system-message records vs the count cursor; re-running observe; concurrent writes while a session is live.
  • Cross-platform: is ~/.aside correct on Windows/Linux, or do we need an app-support equivalent like Cowork?
  • Source detection: _detect_transcript_source ordering vs other roots.
  • Packaging: confirm the skill ships and is not accidentally excluded.

Validation

  • ruff check . pass; ruff format --check pass
  • pytest tests/test_transcripts.py tests/test_observe.py tests/test_cli_observe.py tests/test_cli_install.py tests/test_cli_doctor.py tests/test_config.py -> 159 passed
  • om observe --source aside --dry-run works; om status shows the Aside section (discovers real sessions).

HOLD — do not merge

Opened as draft for peer adversarial review. Do not merge yet, and do not bump the version here (0.9.0 will batch the interim work).

Add Aside as a first-class observe source alongside Claude/Codex/Grok/Cowork/Hermes.

- transcripts/aside.py: native messages.jsonl parser (role-keyed, ms->ISO
  timestamps, toolCall summaries, thinking dropped, toolResult/system skipped);
  count-based cursor (no per-message UUID, matching Codex/Grok); discovery via
  u/*/agents/*/sessions/*/messages.jsonl with ASIDE_HOME override.
- observe.py: observe_aside_transcript + observe_all_aside (count cursor,
  rotation-safe). No backfill wiring, matching the Grok precedent.
- config.py: Config.aside_home + aside_sessions_root.
- cli.py: --source aside in observe enum + transcript dispatch + source
  detection + scan loop; Aside section in om status; --for help text.
- aside/skills/om/SKILL.md: Aside-side warm-start + write-back skill, shipped
  in the wheel (uses the native --source aside flow; no hand-built transcript).
- docs/integrations.md + README Agent Support row; plans/ first-class plan.
- tests: TestAsideParser, TestAsideObserver.

Aside has no native hook surface (daemon + skills), so it is an observe-first
peer like manual Hermes: write-back via om observe --source aside; warm start
via the shipped Aside om skill calling om context --for aside. No om install --aside.
@intertwine intertwine mentioned this pull request Jul 1, 2026
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