Commit graph

2024 commits

Author SHA1 Message Date
Arjun
4fbca2dbad feat(core): elide historic middle-pane note snapshots from model context
Every user message sent while a note is open carries a full snapshot of
that note in userMessageContext, so a long chat over one open note
resends N full copies on every model call. The elision decorator now
rewrites prior-turn user messages to keep the pane kind and path but
replace note content above a small floor with a placeholder pointing at
the still-readable file. The current message's snapshot is untouched,
so "summarize this" keeps working; the system prompt already tells the
model later middle-pane context overrides earlier. Config:
elideHistoricMiddlePaneContent, default on.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 20:43:27 +05:30
Arjun
05d7fa41cf feat(core): elide historic video-mode frames from model context
Video-mode webcam and screen-share frames matter for the response they
were captured for; afterwards the assistant's own text carries the
takeaway and fresh frames arrive with every new call message, yet each
message's frames (~10k tokens) were resent on every subsequent model
call. The elision decorator now strips image parts from prior-turn user
messages, leaving a text part recording how many frames of each kind
were dropped. The current turn's just-captured frames are always sent
verbatim, and the policy generalizes the existing config
(elideHistoricImages, default on).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 20:43:26 +05:30
Arjun
99f196e16c feat(core): elide oversized historic tool results from model context
Tool results from prior turns (skill loads, file reads, HTTP fetches)
dominate resent context and are rarely needed verbatim. A decorator over
the context resolver now replaces prior-turn tool results above a size
threshold with a short placeholder telling the model to re-run the tool
if it needs the output. The current turn's in-flight results are always
sent verbatim, the durable log is untouched, and elision is a pure
per-message function so resolved prefixes stay byte-stable for provider
prefix caching.

Policy lives in config/context.json (elideHistoricToolResults, default
on; elideHistoricToolResultsThresholdChars, default 10000). The inspect
CLI composes through the same decorated resolver so debug output still
matches transmitted bytes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 20:43:26 +05:30
Ramnique Singh
26e2fde0a8
Merge pull request #687 from rowboatlabs/thinking
fix(x): separate reasoning from turn activity
2026-07-07 20:20:50 +05:30
Ramnique Singh
b659c75e4d fix(x): separate reasoning from turn activity
Show a generic animated Working status whenever an active turn can be stopped, and reserve the Thinking shimmer for model reasoning_start/reasoning_end windows.

Keep human-wait state separate so permission and ask-human controls remain interactive, and add renderer state and component coverage for the new behavior.
2026-07-07 19:26:31 +05:30
Ramnique Singh
50beb9f33e
Merge pull request #686 from rowboatlabs/dev
Dev changes
2026-07-07 18:56:10 +05:30
arkml
d10a28ca81
Merge pull request #685 from rowboatlabs/arkml-patch-19
Include demo video link in README
2026-07-07 18:54:03 +05:30
Arjun
abf54d4250 chore(x): drop the CI-trigger comment from main.ts
Removes the placeholder comment added in #684 to trigger the
path-filtered 'test' check; doubles as the trigger for this PR.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 18:45:25 +05:30
arkml
26799f2410
Include demo video link in README
Added a demo video link for Rowboat in the README.
2026-07-07 18:43:05 +05:30
PRAKHAR PANDEY
678130ab40
Merge pull request #651 from prakhar1605/feat/disk-skills
feat: disk-backed agent skills with live-reload
2026-07-07 17:17:36 +05:30
arkml
a303e0421c
Merge pull request #684 from rowboatlabs/readme-apps-fixes
Fix typos in README.md Apps section
2026-07-07 16:57:35 +05:30
Arjun
37d4b8d13a chore(x): trigger apps/x tests on this PR
Adds a harmless comment under apps/x/ so the path-filtered required
'test' check runs on this otherwise README-only PR.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 16:54:41 +05:30
arkml
a763ef02b6 Modify demo links in README.md
Updated demo links in README to include new app demo.
2026-07-07 16:45:07 +05:30
arkml
103d49419c Replace old screenshot with new image
Updated the screenshot in the README file with a new image.
2026-07-07 16:45:07 +05:30
arkml
539fec1ee0 Fix typos in README.md Apps section
Corrected typos in the Apps section and improved clarity.
2026-07-07 16:45:07 +05:30
arkml
0b15e913e5
Merge pull request #683 from rowboatlabs/default_model
feat(models): switch signed-in default model to Gemini 3.5 Flash
2026-07-07 16:37:35 +05:30
Arjun
0ccce7f1e2 feat(models): switch signed-in default model to Gemini 3.5 Flash
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 16:32:03 +05:30
gagan
98fe9106cb
Merge pull request #681 from rowboatlabs/feature/apps-bundled-agent-skill
Apps: ship bundled agents that actually work for installers
2026-07-07 15:26:17 +05:30
Gagan
3f7e915c4d feat(apps): show installed state on catalog cards
Cards for apps already installed from the catalog show a green
Installed badge (matched via the install record's registry name) that
opens the app, instead of a second Install button.
2026-07-07 15:22:27 +05:30
Gagan
043cdc7cb2 fix(apps): stop reinstall from yanking the user out of the agent dialog
Two races around the post-install prompt:

- AppsView kept a stale selectedFolder after the open app was
  uninstalled; on reinstall the 4s apps:list poll matched it again and
  instantly swapped in the app frame, unmounting the catalog and the
  enable-agents dialog mid-choice. Clear the selection when its app
  disappears from the list.

- Bundled agents materialized on the NEXT apps:list poll, not at
  install — so the dialog's bg-task:get/patch hit a task that didn't
  exist yet if the user acted within ~4s. Install handlers now call
  syncAppAgents synchronously.
2026-07-07 14:58:47 +05:30
Gagan
ec4ae4d5eb feat(apps): model picker in the post-install agent prompt
The enable dialog now lists the user's available models (models:list),
preselecting the host-pinned default from materialization. Turning the
agents on patches the chosen model/provider onto the task along with
active — so installers can route a bundled agent to a specific model
at the moment they opt in, without digging into bg-tasks.
2026-07-07 14:49:58 +05:30
Gagan
3fc4621dc1 fix(apps): pin the host default model on materialized bundled agents
Bundled agents can't ship a model override (the author's providers are
not the installer's), so materialized tasks ran on the bg-task category
default — gemini flash lite — which reliably mangles large app-set-data
payloads (invalid JSON string → contract rejection → the installed app
never gets data; observed with pr-dashboard's refresh agent).

Materialization now resolves getDefaultModelAndProvider() on the host
and pins that on the new task — the installer's machine picks the
strong model, the package still pins nothing. Existing tasks keep
their user-set model (update path unchanged).
2026-07-07 14:14:05 +05:30
Gagan
78defccb29 feat(apps): post-install prompt to enable bundled agents
Bundled agents install disabled (§8.3), but nothing told the installer
they exist — the app opened empty with the refresher buried in
bg-tasks. After an install that materialized agents, offer to turn
them on: 'Turn on & run now' activates each task and fires a first run
so the app opens with data; 'Not now' keeps them off.
2026-07-07 13:58:59 +05:30
Gagan
715d92e4ba fix(apps): route 'Publish update' through apps:publishUpdate
The detail panel's Publish update button opened the same dialog as
first publish, which hardcoded apps:publish — so updating an already
published app always failed with name_taken from the registry check.

The dialog now takes a published flag: it runs apps:publishUpdate with
a version-bump picker (patch/minor/major), shows a simple progress
state (the update path emits no step events), and links the new
release on success.
2026-07-07 13:48:13 +05:30
Gagan
a9a47e5a28 fix(apps): make agent bundling mandatory in the copilot apps skill
The skill treated mirroring the bg-task into agents/<slug>.yaml as
optional ('if the app should ship the agent'), so the copilot built
agent-backed apps (e.g. pr-dashboard) with the refresher as a loose
personal bg-task only. Publishing such an app ships a dead UI: data/
is user state and never packaged, and installers get no agent.

Bundling is now a required step with the failure mode spelled out.
2026-07-07 13:42:29 +05:30
arkml
2435e9ab22
Merge pull request #679 from rowboatlabs/onboarding_tour
Add product tour to onboarding
2026-07-07 03:02:58 +05:30
Arjun
e367ec889d build(x): graft vscode-jsonrpc onto langium via packageExtensions
langium imports vscode-jsonrpc/lib/common/events.js without declaring the
dependency, which fails to resolve under pnpm's strict layout and broke the
renderer's production (vite) build during forge packaging.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 02:45:09 +05:30
Arjun
8ce56c84ab fix(tour): correct apps stop copy — built by you, shareable, same tools
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 02:45:02 +05:30
Arjun
037ba76245 add tour to onboarding 2026-07-07 02:22:07 +05:30
Prakhar Pandey
3fffe12978 Merge remote-tracking branch 'upstream/dev' into feat/disk-skills 2026-07-06 22:37:30 +05:30
gagan
84c71b37af
Merge pull request #676 from rowboatlabs/feature/apps-m3
Rowboat Apps V1 — M3: publish, catalog, install, update
2026-07-06 21:14:10 +05:30
Gagan
b55417e97c fix(apps): pace device-flow polls in core — slow_down made auth spin forever
GitHub rate-limits the device-code token endpoint: a poll arriving even
slightly under the flow interval returns slow_down and permanently raises
the required interval. The renderer polled on a fixed 5s timer (exactly
the limit), so one jittery request tripped slow_down and every poll after
it was 'too fast' — GitHub answered slow_down forever and the dialog sat
on 'Waiting for authorization' even after the user approved.

Core now tracks lastTokenPollAt and skips the request until the flow's
current interval (base +1s margin) has elapsed, so slow_down bumps take
effect and the flow recovers. The renderer timer is just a heartbeat (2s).
2026-07-06 21:07:13 +05:30
Gagan
5a7fd1506c fix(apps): drop iframe auto-retry, add reopen hint to stuck overlay 2026-07-06 21:00:45 +05:30
Gagan
f2bc01ffa9 fix(apps): eliminate blank-app window on launch and add crash visibility
- start the apps server before createWindow instead of after the full
  service-init chain: the Apps view was reachable ~10s before port 3210
  was listening, so every app iframe opened to connection-refused
- retry EADDRINUSE binds (quick relaunch races left the server disabled
  for the whole session with no retry)
- app frame: auto-retry the iframe instead of a dead manual Retry, and
  surface when the apps server itself is down (new apps:serverStatus)
- log render-process-gone/child-process-gone reasons; renderer helper
  crashes were previously invisible in packaged builds
2026-07-06 20:52:31 +05:30
Gagan
5e0fc059e7 feat(apps): publish button in app toolbar + published links in detail
- toolbar (local apps): 'Publish' button; turns into a green 'Published'
  badge-check once published (click opens the detail panel)
- detail Source section: clickable repo + release links for published apps
2026-07-06 20:12:25 +05:30
Gagan
8e4f234d69 fix(apps): take bootstrap commit sha from the PUT response
Re-reading refs/heads/main immediately after the bootstrap commit can 409 on
a stale replica (GitHub eventual consistency) — the Contents API response
already carries the commit sha, so use it directly.
2026-07-06 20:07:09 +05:30
Gagan
1ed9cced59 fix(apps): re-report completed steps on publish resume
Resumed publishes skipped already-done steps without emitting progress, so
the dialog showed stale spinners for steps that finished in a prior attempt.
2026-07-06 20:04:43 +05:30
Prakhar Pandey
b8b4589ff2 test: unit tests for disk skills loader + catalog merge (11 cases) 2026-07-06 19:42:00 +05:30
Prakhar Pandey
43590ca6d9 Merge remote-tracking branch 'upstream/dev' into feat/disk-skills
# Conflicts:
#	apps/x/apps/main/src/main.ts
#	apps/x/packages/core/src/application/assistant/instructions.ts
2026-07-06 19:11:36 +05:30
Gagan
2bbb502661 chore(apps): drop unused STEPS array (lint) 2026-07-06 16:17:58 +05:30
Gagan
beaf6ebf69 fix(apps): bootstrap empty repos before the Git Data push
GitHub's Git Data API (blobs/trees/commits) returns 409 'Git Repository is
empty' on a repo with no commits — it cannot create the first commit. Ensure
main exists via a Contents API bootstrap commit (the generated README), then
chain the publish commit onto it.
2026-07-06 16:17:26 +05:30
gagan
24a1087e03
Merge pull request #677 from rowboatlabs/fix/baileys-build-approval
fix(x): resolve baileys build approval placeholder blocking package build
2026-07-06 16:13:55 +05:30
Gagan
684ec0b390 fix(apps): device-flow diagnostics + bounded identity retries
Verified the wire calls are correct (both endpoints behave with this client
id from a plain node run), so instrument the runtime path instead of
guessing:

- log every poll outcome ([GitHubAuth] lines) at the token exchange, the
  identity fetch, and the IPC handler
- identity failures now retry at most 3 polls then fail loudly with the HTTP
  status — never silently degrade to 'pending' forever
- explicit User-Agent on all GitHub calls (defensive)
2026-07-06 16:12:53 +05:30
Gagan
502aae3c14 fix(x): resolve baileys build approval placeholder blocking package build
The mobile-channels feature added baileys, whose install-time scripts
require build approval. A placeholder value ("set this to true or
false") was left in the allowBuilds block of pnpm-workspace.yaml. pnpm
11 treats an unresolved build decision as a hard error, causing
pnpm install to exit non-zero and abort Electron Forge's generateAssets
hook during npm run package.

Set baileys: true to match the onlyBuiltDependencies entry.
2026-07-06 16:11:38 +05:30
Gagan
0ca3606be5 fix(apps): device-flow poll stuck on 'Waiting for authorization'
GitHub's OAuth endpoints take form-encoded params; the JSON token request
produced an unrecognized error that fell through to 'pending' forever, so the
dialog never advanced after the user authorized.

- form-encode device/code and access_token requests
- unknown token-endpoint errors now fail loudly instead of spinning;
  incorrect_device_code maps to expired (restart offered)
- issued-token is remembered so a transient identity-fetch failure retries on
  the next poll instead of burning the consumed device code
- dialog catches hard poll failures and surfaces them
2026-07-06 15:54:06 +05:30
Gagan
815eac43db feat(apps): M3 UI — catalog, D18 install dialog, publish dialog, detail actions
- Catalog tab: registry search/list, stale-cache refresh, install flow with
  the D18 capability-disclosure dialog (plain-language capability lines +
  bundled agents, explicit confirm), install-from-URL with preview and
  'updates unavailable' notice for non-GitHub sources
- Publish dialog: GitHub device-flow sign-in (user code + polling), §11.2
  step progress via apps:progress pushes, success links, name_taken
  rename-and-retry hint
- App detail actions: check-for-update / update (new_capabilities and
  modified_files confirmation flows), rollback, uninstall (names data/ and
  bundled agents), publish / publish update
- docs/publishing-apps.md (§11.5): bundle format, two-asset requirement, tag
  convention, registry record, monorepo latest-release constraint
2026-07-06 15:34:54 +05:30
Gagan
35c781b8e4 feat(apps): M3 publisher — guided publish, updates, register-existing
- publisher (§11): resumable state machine persisted in .rowboat-publish.json
  (packaged → repo_created → source_pushed → release_created →
  assets_uploaded → registered → published); Git Data API single-commit
  source push with generated README/LICENSE/.gitignore when absent; both
  release assets uploaded (bundle + standalone manifest); fork+PR registry
  registration with rejected:<code> parsing and rename-retry surface
- publish update (§11.3): semver bump, package, push, release — no registry
- register existing release (§11.5) with client-side asset probe
- IPC: apps:publish/publishUpdate/registerExisting + apps:progress pushes
2026-07-06 15:08:36 +05:30
Gagan
6dea528fb4 feat(apps): M3 installer — catalog/URL installs, updates, rollback, uninstall
- installer (§12): streaming download with size cap, extraction guards
  (zip-slip, symlink entries, entry-count, uncompressed cap), bundle-identity
  check, D18 capability-mismatch check against the previewed manifest,
  defaults->data on first install, pinned per-file sha256, folder suffixing
- URL installs (§12.5): two-phase preview from the bundle's own manifest,
  10-min retained staging, GitHub-provenance detection for later updates
- update (§12.3): D18 scoped to the diff (new_capabilities), modified-file
  warning against pinned hashes, .previous/ swap with one-step rollback
- uninstall (§12.4) deletes app-owned bg-tasks; startup tmp cleanup
- IPC: apps:catalogIndex/Search/Detail, install, installFromUrl, uninstall,
  checkUpdate, update, rollback + analytics events
2026-07-06 15:02:00 +05:30
Gagan
d7af51c10b feat(apps): M3 groundwork — packager, GitHub device-flow auth, registry client
- env: GITHUB_OAUTH_CLIENT_ID (device flow enabled on the Rowboat OAuth app;
  overridable via ROWBOAT_GITHUB_CLIENT_ID)
- packager (§4.4): allowlist-only .rowboat-app ZIP (yazl), sorted entries,
  symlink skip, sha256
- github-auth (§10): device-code start/poll, identity fetch, token stored
  0600 with safeStorage encryption injected from main (core stays
  electron-free); githubAuth:* IPC + external open of the verification page
- registry client (§9.2): unauthenticated tarball index with 5-min cache and
  stale fallback, raw-record resolve, substring search, quota-free
  latestManifest via release-asset redirect with name-mismatch guard
- registry repo contents (docs/apps-registry): record JSON schema +
  validate-and-merge Action implementing §9.3 checks 1-7 with rejected:<code>
  comments and per-name concurrency
- fix: host-api copilot-run adapted to dev's ModelSelection {provider,model}
  (this is the same fix dev needs for Ramnique's packaging break)
- pnpm 11: blockExoticSubdeps=false (electron-forge has a git subdep)
2026-07-06 14:49:52 +05:30
gagan
b7d1019538
Merge pull request #665 from rowboatlabs/feature/apps-v1
Rowboat Apps V1 — M1 + M2 (spec implementation)
2026-07-06 14:18:11 +05:30