Commit graph

1606 commits

Author SHA1 Message Date
Ramnique Singh
b7b84e94e0
Merge pull request #541 from rowboatlabs/dev
Dev
2026-05-09 00:34:29 +05:30
Ramnique Singh
dabca3da19 feat: live notes — single objective per note replaces multi-track model
Folds the multi-`track:`-array model into one `live:` block per note: a single
persistent objective the live-note agent maintains, plus an optional triggers
object (`cronExpr` / `windows` / `eventMatchCriteria`, each independently
optional). A note is now passive or live — no per-track scopes, no section
ownership contract, no `once` trigger. The agent owns the whole body and makes
patch-style incremental edits per run.

Highlights:
- Schema: `track:` array → single `live:` object (`packages/shared/src/live-note.ts`).
- Runtime: scheduler / event processor / runner under `core/knowledge/live-note/`,
  with split `lastAttemptAt` (every run, drives 5-min backoff) vs `lastRunAt`
  (success only, anchors cycles). `throwOnError` on agent runs surfaces LLM /
  billing failures into `lastRunError`.
- Today.md: regenerated by template v2 (single objective covering overview /
  calendar / emails / what-you-missed / priorities; existing files renamed to
  `Today.md.bkp.<stamp>`).
- Renderer: `LiveNoteSidebar` mounts inside the editor row (no chat overlap,
  auto-closes on note switch); toolbar Radio button becomes a status pill;
  `LiveNotesView` replaces background-agents view.
- Copilot: new `live-note` skill with act-first stance, default folder/cadence
  pickers, and a non-negotiable rule to extend an existing objective rather
  than add a second one. Shared `KNOWLEDGE_NOTE_STYLE_GUIDE` enforces
  terse-and-scannable writing across `doc-collab` and the live-note agent.
- Analytics: `track_block` use-case → `live_note_agent`; trigger
  (`manual` / `cron` / `window` / `event`) becomes the Pass-2 sub-use-case,
  alongside `routing` for Pass 1. Legacy run files with the old value are
  read-mapped via `LegacyStartEvent` so they stay openable in the runs list.

Hard cutover — no back-compat shims for legacy `track:` frontmatter arrays.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 00:30:43 +05:30
Ramnique Singh
0bf7a55611
Merge pull request #539 from rowboatlabs/feat/knowledge-file-viewer
feat: render html, image, video, audio, and pdf in knowledge view
2026-05-09 00:30:14 +05:30
Arjun
cc176898df fix onboarding tip 2026-05-08 18:10:26 +05:30
Gagancreates
66e22bd779 chore: ignore test-fixtures dir 2026-05-08 17:04:25 +05:30
Gagancreates
8e10d8bff3 chore: stop tracking test fixture 2026-05-08 17:03:58 +05:30
Gagancreates
c5ee363122 feat: show unsupported file panel instead of raw bytes 2026-05-08 16:55:12 +05:30
Gagancreates
89f56a8059 docs: note srcdoc relative-asset limitation in html viewer 2026-05-08 16:46:22 +05:30
Gagancreates
385ed3377f refactor: extract getViewerType helper to share extension list 2026-05-08 16:45:47 +05:30
Gagancreates
60e5b2cbc7 chore: drop planning docs from repo 2026-05-08 16:45:37 +05:30
Ramnique Singh
a1e4002533
Merge pull request #540 from rowboatlabs/dev
Dev
2026-05-08 13:21:51 +05:30
Ramnique Singh
3b09296291 fix: route Google reconnect through rowboat flow when signed in
The Reconnect button on the Google account row always opened the BYOK
client-ID modal, even for users signed into Rowboat — who should get
the managed-credentials browser flow instead. The non-reconnect Connect
button already branched correctly via useConnectors.handleConnect; the
reconnect path bypassed it. Adds a handleReconnect helper that mirrors
the same branching, and routes both call sites (popover and settings)
through it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 13:21:05 +05:30
Ramnique Singh
acff502f42 fix: stop Gmail sync from throwing "No refresh token is set" in rowboat mode
In rowboat OAuth mode the OAuth2Client is built without a refresh_token
because refreshes go through the api. google-auth-library's default
5-minute eagerRefreshThresholdMillis caused it to attempt a refresh
whenever a Gmail call landed within 5 minutes of token expiry, throwing
"No refresh token is set." before our proactive 60s-margin refresh
could run. Disabling the eager window lets our getClient() refresh path
own all refreshes as the comment intends.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 13:21:05 +05:30
Ramnique Singh
f5bba5e271 Merge branch 'main' into dev 2026-05-08 13:20:33 +05:30
Gagancreates
0250ca638e chore: reduce viewer cache limit from 5 to 3 2026-05-08 03:13:17 +05:30
Gagancreates
d9d936b7e8 fix: stop reordering cached paths to keep iframe state alive 2026-05-08 03:05:38 +05:30
Gagancreates
49a50279da perf: keep recent html and pdf viewers mounted to preserve state 2026-05-08 03:00:40 +05:30
gagan
4b7911c8ea
fix: context-aware folder/note creation in knowledge panel (#538)
* fix: context-aware folder/note creation with folder highlight and inline rename

* fix: clear folder highlight when a note is opened
2026-05-08 02:42:55 +05:30
Gagancreates
a4cd6abb3a feat: render audio files with native player 2026-05-08 02:11:06 +05:30
Gagancreates
b3519433eb feat: render pdf files via chromium pdfium plugin 2026-05-08 02:07:16 +05:30
Gagancreates
b24113b78e feat: render video files with native controls and seeking 2026-05-08 02:03:55 +05:30
Gagancreates
0d9cf71947 feat: serve workspace files via app:// protocol and add image viewer 2026-05-08 01:54:35 +05:30
Gagancreates
ede98f5378 perf: cache html content by mtime and size in lru of 20 2026-05-08 01:54:26 +05:30
Gagancreates
754561d893 feat: add error, empty, and oversize states to html viewer 2026-05-08 00:59:33 +05:30
Gagancreates
9014c79f2c feat: render html files in knowledge view via sandboxed iframe 2026-05-08 00:40:05 +05:30
Ramnique Singh
62a07618e0
Merge pull request #537 from rowboatlabs/dev
Dev
2026-05-07 18:18:23 +05:30
Ramnique Singh
eb6a7ac466
Merge pull request #536 from rowboatlabs/tracks-in-fm
feat: tracks — frontmatter directives, sidebar UI, multi-trigger
2026-05-07 18:17:56 +05:30
Ramnique Singh
db6757514c feat: tracks — frontmatter directives, sidebar UI, multi-trigger
Recasts the old "track blocks" as "tracks" — directives stored in a
note's frontmatter rather than inline YAML fences and HTML-comment
target regions. The motivation is UX: the inline anatomy made notes
feel like config, leaked into the editing surface, and competed with
the writing flow. Frontmatter is invisible to the body editor, so
moving directives there reclaims the body as just markdown the user
wrote.

The runtime agent now edits the note body freely via standard
workspace tools rather than rewriting a constrained target region.
Each track's instruction names an H2 section to own; the agent
finds or creates that section, updates only its content, and
self-heals position on subsequent runs.

Triggers are now a unified array per track. cron / window / once /
event in any combination, including multi-trigger setups (the
flagship example: a priorities track that rebuilds at three
day-windows and reacts to incoming gmail / calendar events).
window is forgiving — fires once per day anywhere inside its
band — so users opening the app late in the morning still get the
morning run.

The chip-in-editor is gone. Tracks are managed from a right-side
sidebar opened by a Radio-icon button at the top-right of the
editor toolbar. Cmd+K is no longer a Copilot entry point — search-
only — pending a more intuitive invocation surface later.

Today.md ships as the flagship demo of what tracks can do, with a
versioned migration system so future template updates roll out
cleanly to existing users (existing body preserved, old version
backed up).

Copilot is tuned to listen for any signal that the user wants
something dynamic — not just the literal word "track". Strong
phrasings get acted on directly; one-off questions about decaying
information are answered first and then offered as a track. New or
edited tracks run once by default so the user immediately sees
content.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 18:17:26 +05:30
Ramnique Singh
4709e6eb89
Merge pull request #533 from rowboatlabs/coding2
Coding2
2026-05-07 16:37:43 +05:30
arkml
a48887da61
can set a work directory in assistant chats (#534) 2026-05-06 23:14:00 +05:30
Arjun
d515c423ee show the terminal view 2026-05-06 22:24:33 +05:30
Arjun
a18f5dc3dd coding with acpx 2026-05-06 22:24:33 +05:30
Arjun
d6651c4bf8 fix build issues 2026-05-06 22:22:27 +05:30
gagan
0e3d058c29
feat: Gmail-style email block with inbox container layout (#531)
* feat: restyle email block with Gmail-style layout and avatar

* style: apply Google Sans/Roboto font to email block

* feat: add Gmail inbox-style multi-email block with accordion rows

* style: fix sender name casing, weight, and email display in expanded view

* feat: emails inbox block with container layout, two-line rows, Gmail title style
2026-05-06 21:41:26 +05:30
gagan
3630032d21
feat/today-minimal-polish (#532)
* feat: remove emoji headings and polish track block chip styling

- Strip emojis from Today.md section headings (new + existing files via migration)
- Track chip: full-width card style matching email blocks, colored icons per track type
- Larger, taller chip with muted gray background for light/dark mode

* feat: increase track chip icon and text size

* feat: make track block icons configurable via yaml

* fix: migrate missing icon fields in existing Today.md on startup
2026-05-06 19:41:28 +05:30
Arjun
37c1627d79 fix browser cleanup 2026-05-06 17:50:56 +05:30
gagan
0bb58e55ac
feat: minimal Today.md UI polish - no emoji headings, better track chip (#528)
* feat: remove emoji headings and polish track block chip styling

- Strip emojis from Today.md section headings (new + existing files via migration)
- Track chip: full-width card style matching email blocks, colored icons per track type
- Larger, taller chip with muted gray background for light/dark mode

* feat: increase track chip icon and text size

* feat: make track block icons configurable via yaml
2026-05-06 14:34:53 +05:30
Arjun
f26d57e8eb fix sync resume modal copy 2026-05-06 13:10:20 +05:30
Arjun
5e47bd4309 fix shell path issue on mac 2026-05-06 13:02:01 +05:30
arkml
72ed4bd6d9
pull browser-harness skills (#519)
use browser-harness skill without eval or http-fetch
2026-05-06 12:25:10 +05:30
arkml
e54b5cd27f
Background agents (#530)
a common place to track and add background agents
2026-05-06 11:59:37 +05:30
Arjun
7b119fbfcd refine note-writing instructions for self-reference and relationship phrasing 2026-05-05 19:56:57 +05:30
Arjun
c6083de054 show errors in activity tab for knowledge graph 2026-05-05 19:21:32 +05:30
Arjun
c382e3ee8a use gemini as default kg model 2026-05-05 16:08:57 +05:30
Ramnique Singh
d4850dace7 feat: native google sign-in for signed-in users
Signed-in users can now connect Gmail and Calendar directly through
Rowboat instead of going through Composio. Cleaner connection, no
third-party in the data path.

How it works:
- Click "Connect Google" anywhere it appears (sidebar, onboarding,
  settings) and the system browser opens to a Rowboat-hosted page.
  Authorize Google there and the app picks up the connection
  automatically — no client id or secret to paste.
- Token refresh happens through Rowboat's backend, so Google
  credentials never need to live on the user's machine.
- Disconnect cleanly revokes access on Google's side too.

Migration for existing Composio users:
- A one-time modal explains that we've moved off Composio and asks the
  user to reconnect Google directly.
- Their old Composio Gmail / Calendar connections are disconnected
  automatically when the modal first appears.
- All previously-synced emails and calendar events are preserved on
  disk — the new connection picks up where Composio left off rather
  than re-downloading the last week from scratch.
- "I'll do this later" dismisses the modal permanently; the user can
  still reconnect anytime via the connectors UI. (Sync stops in the
  meantime; nothing is deleted.)

Other coverage:
- BYOK mode (users who paste their own Google client id + secret) is
  unchanged — same modal, same local OAuth flow, same behavior.
- Composio integrations for non-Google services (Slack, Linear, etc.)
  are unaffected. Only the Gmail and Calendar paths moved.
- The "Connect Google" button label and connection state now apply
  uniformly to Gmail + Calendar (one OAuth grant covers both).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 14:29:13 +05:30
Arjun
a76f8bae14 fix sticky browser issue 2026-05-05 11:41:08 +05:30
Arjun
0bd234ddf6 fix browser reload issue 2026-05-04 17:28:04 +05:30
Arjun
93feee15a0 fixed collapsed sidebar issue on chat 2026-05-04 17:20:19 +05:30
arkml
1c2b2ac1fc
feat: native desktop notifications + rowboat:// deep links
Adds INotificationService with an Electron implementation, plus a deep-link
dispatcher (rowboat://) for routing notification clicks back into the app.

Notifications:
- New `notify-user` skill + builtin tool. Title, message, optional primary
    link, optional secondary actions. Supports https:// (opens in browser) and
    rowboat:// (opens in app) targets.
- ElectronNotificationService holds strong refs to active Notification
    instances so click handlers survive GC (otherwise macOS click silently
    no-ops).
- Calendar meeting notifier fires 1-min warnings with "take notes" /
    "join + take notes" actions backed by deep links.

Deep links (rowboat://):
- forge.config.cjs declares the protocol; main.ts wires single-instance
    lock, setAsDefaultProtocolClient, open-url (mac), second-instance (win/
    linux), and first-launch argv extraction.
- New deeplink.ts dispatcher with dispatchUrl(url): main-handled actions
    (rowboat://action?type=...) vs renderer navigation (rowboat://open?...)
    via app:openUrl IPC. Includes pending-URL buffering for first-launch
    delivery before the renderer is ready.
- Renderer parseDeepLink supports file / chat / graph / task /
    suggested-topics targets.
- New app:consumePendingDeepLink IPC for renderer one-time drain on mount.

Refactor: extractConferenceLink moved out of calendar-block.tsx into
shared lib/calendar-event.ts (used by both the block and the take-notes
deep-link handler)
2026-05-04 15:47:30 +05:30
Ramnique Singh
9ed54e2b94
Merge pull request #525 from rowboatlabs/feat/tool-call-grouping
feat: group consecutive tool calls into collapsible summary
2026-04-29 11:07:50 +05:30