Commit graph

1904 commits

Author SHA1 Message Date
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
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
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
PRAKHAR PANDEY
1a71b38f2e
Merge pull request #637 from prakhar1605/feat/out-of-credits-warning
feat: add out-of-credits warning to sidebar plan badge
2026-07-06 14:11:18 +05:30
Ramnique Singh
1050614295
Merge pull request #674 from rowboatlabs/code-mode-fixes
Code mode fixes
2026-07-06 14:06:41 +05:30
Ramnique Singh
3bbed55735 feat(x): ephemeral CodeRunFeed for codex streaming + settle-time durable batch
The runs->turns migration broke codex live streaming in copilot chat: the
turns bridge's publish shim forwarded only tool-output-stream and silently
dropped code-run-event / code-run-permission-request (the latter would
deadlock a turn under policy 'ask'). An interim fix persisted every stream
event as durable tool_progress, but that wrote each text chunk to the turn
file — unsustainable.

Final architecture — live and durable paths split:

- Live (ephemeral, bypasses the turn runtime): code_agent_run broadcasts
  each ACP event on a new CodeRunFeed (core DI singleton), forwarded by
  main over a dedicated codeRun:events channel, buffered per toolCallId in
  a module-level renderer store and rendered by CodingRunBlock. The buffer
  survives session switches; nothing is persisted.

- Durable (one line per run): when the run settles (success, error, or
  cancel), code_agent_run publishes a single code-run-events-batch with
  the whole ordered timeline, consecutive same-role message chunks
  coalesced (display-lossless — the timeline concatenates them anyway).
  The turns bridge maps it to tool_progress {kind:'code-run-events'};
  turn-view derives the replay timeline from it, so reloads keep history.

- Permissions stay durable per-ask (request + resolved marker): the
  renderer overlay resets on session switch, so an ephemeral-only ask
  would strand a blocked turn with no card to answer. Pending = requests
  minus resolutions (handles concurrent asks), cleared on tool result.

The legacy code-section path (runs bus per-event) is untouched; its
per-event ctx.publish remains and is a no-op under the turns shim.

Also: repaired the two code_agent_run tests broken by the earlier cwd
existence check (they used a nonexistent /repo), and added coverage for
feed broadcast, batch coalescing, partial-batch-on-failure, bridge
durability routing, and pending-permission derivation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:04:33 +05:30
arkml
092f6e0d1a
Merge pull request #667 from rowboatlabs/local_models2
Local models2
2026-07-06 13:58:23 +05:30
PRAKHAR PANDEY
c75d55ed31
Merge branch 'dev' into feat/out-of-credits-warning 2026-07-06 13:54:20 +05:30
Arjun
fd49334c33 move local-model concurrency to a turn-level defer lock
Review feedback: drop the model-layer scheduler (per-call-site
interactive/classifier/background priorities, local-provider hostname
heuristic) in favor of app-level orchestration:

- deferBackgroundTasks flag in models.json, surfaced as a settings
  toggle; auto-enabled once (UI logic) when the user connects Ollama
- ChatActivity counter marked by both chat runtimes (sessions layer and
  legacy AgentRuntime.trigger)
- startWhenPossible/runWhenPossible wrappers around the headless agent
  runner; all background invocations (knowledge pipeline, live notes,
  background tasks, scheduled + prebuilt agents) go through them and
  wait for chat-idle when the flag is set

createLanguageModel keeps only the Ollama context-window middleware;
the LM Studio capability probe now keys off the provider flavor instead
of hostname sniffing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 13:38:39 +05:30
Arjun
c1fd4e6221 allow byok even when logged in 2026-07-06 13:32:13 +05:30
Arjun
0b55dc3300 fix ollama model effort level 2026-07-06 13:31:13 +05:30
Arjun
db7df256ca fix ollama model selection issue 2026-07-06 13:31:13 +05:30
Arjun
799d7584b8 make local models work well 2026-07-06 13:31:13 +05:30
Ramnique Singh
7c06af04a7 fix(x): unblock codex code-mode (bad cwd + revoked engine cert)
code_agent_run failed with a misleading "spawn <Electron> ENOENT" that
read as "Codex isn't installed". Two stacked causes:

1. cwd wasn't expanded/validated: a `~` or non-existent path was passed
   straight to child_process.spawn, which reports ENOENT against the
   command (Electron) rather than the missing directory. Now expandHome +
   resolve + existence-check with a clear error.

2. Apple revoked the signing cert on the pinned @openai/codex@0.128.0, so
   macOS Gatekeeper trashed the binary on launch and the ACP adapter died
   mid-handshake. Bump the ACP stack off the revoked build:
   codex-acp 0.0.44 -> 1.1.0, claude-agent-acp 0.39 -> 0.55, sdk 0.22 ->
   1.1, regen engine-manifest (codex 0.142.5 / claude 0.3.198). Removed the
   two now-obsolete patches (contextCompaction upstreamed; the codex
   windowsHide patch targeted bin/codex.js, which we bypass via CODEX_PATH).

Bump fallout handled:
- client.ts setModel: sdk 1.x dropped unstable_setSessionModel; model is now
  a config option -> setSessionConfigOption({configId:'model'}).
- engine-provisioner: codex 0.142 moved its binary (codex/ -> bin/) and rg
  (path/ -> codex-path/); probe both layouts.
- pnpm override vscode-jsonrpc to 8.2.0: codex-acp 1.1 pulls jsonrpc 9.x
  whose restrictive exports break langium's deep import in the renderer
  (blank screen). codex-acp is the only 9.x consumer and works on 8.x
  (handshake verified), so pin the workspace to 8.x.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 12:57:02 +05:30
Ramnique Singh
596edcd788
Merge pull request #673 from rowboatlabs/feats
Feats
2026-07-06 10:58:41 +05:30
Ramnique Singh
c1b5291f7d approve baileys build 2026-07-06 10:56:34 +05:30
Ramnique Singh
4a2fe30153 fix(x): surface coding tool errors 2026-07-06 10:56:23 +05:30
arkml
36c0cca3f9
Merge pull request #672 from rowboatlabs/call_mic_mute
Add in-call mic mute: pauses all input (mic audio + frame capture)
2026-07-06 00:33:45 +05:30