Commit graph

1930 commits

Author SHA1 Message Date
Ramnique Singh
7000f34c48 test(core): fix type errors in the elision test suite
The resolver helper's inline policy type predated middlePaneContent and
no longer satisfied ElisionPolicy; use the exported type. Coerce message
content to string where the preview assertions call string methods.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 21:02:03 +05:30
Ramnique Singh
30570a9325 test(core): fill elision coverage gaps
The original suite covered the tool-result path well but left holes:
loadElisionPolicy had no tests at all (now: missing file, full config,
partial merge, unparseable JSON, and the all-or-nothing malformed-key
behavior — via an injectable config path so tests stay off the real
WorkDir), images/note policies had no idempotency or determinism tests
(the properties prefix caching depends on), the note floor boundary was
unpinned, resolveAgent delegation was unverified, and nothing exercised
a multi-turn reference chain or the per-resolve hot config reload.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 20:43:27 +05:30
Ramnique Singh
4b4e6af2ea docs(core): surface the config-relative recomposition caveat
Elision reads config/context.json at compose time, so the composed
payload is no longer a pure function of the durable log — inspecting an
old turn after a config edit can show different prefix bytes than were
transmitted. Document the exception against §8.3 and make the inspect
CLI print the policy in effect so divergence is visible instead of
silent. The gold fix (recording the applied policy on the turn) is
noted for when exact-bytes replay becomes a hard requirement.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 20:43:27 +05:30
Ramnique Singh
8a952a4b7e fix(core): guard against constructing an undecorated context resolver
TurnRepoContextResolver was still freely constructible, so a future
call site could silently lose elision. The factory now accepts an
injectable policy loader (also keeps tests off the machine's real
context.json), the raw class carries a do-not-construct note, and
factory-level tests pin both the decorator wiring and the default
policy behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 20:43:27 +05:30
Ramnique Singh
331a5eda4e feat(core): lower default tool-result elision threshold to 2500 chars
Real session data shows ~5k-char skill bodies are the most common
oversized historic result; the 10k default replayed them on every model
call for the life of the session. With the head preview in place the
model retains enough scent to re-load on demand, so the aggressive
default is the right trade. Still tunable via config/context.json.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 20:43:27 +05:30
Ramnique Singh
04348dcc41 feat(core): keep a head preview in elided tool results
A bare placeholder tells the model only the tool name and size; the
first 400 characters tell it what the output actually was (a skill
guide reads very differently from a fetched page), which is what it
needs to judge whether re-running the tool is worth it. The preview is
capped at the threshold so small thresholds still shrink content, and
the transform stays a pure per-message function (byte-stable prefixes).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 20:43:27 +05:30
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