Commit Graph
118 Commits
Author SHA1 Message Date
Rohit Prasad be7c25093a Merge pull request #471 from andrewyng/issue/ope-51-ask_user-upgrades
Enhancements to forms shown by agent for asking Qs from User
2026-08-07 19:16:21 -07:00
Rohit P 53d5fc498f Merge branch 'main' into issue/ope-51-ask_user-upgrades 2026-08-01 09:45:03 -07:00
Rohit Prasad 01b6f83b39 Merge pull request #393 from andrewyng/issue/ope-46
Add ResponsesAPI for OpenAI newer models
2026-08-01 09:26:17 -07:00
Rohit P 997b2a9548 Merge branch 'main' into issue/ope-46 2026-08-01 08:58:04 -07:00
Devika Verma 70e4610a3e Add support for Skills (#391)
Global & per-workspace skill.
Per-persona skills will be improved later as we re-design that abstraction, as per roadmap.
2026-08-01 08:50:53 -07:00
Rohit Prasad e0cb129d20 Merge pull request #356 from andrewyng/rpMacIntelBuild
ci: build macOS Intel
2026-07-30 15:40:32 -07:00
Rohit C Prasad bfabfaadd4 ci: build macOS Intel on macos-15-intel 2026-07-30 15:38:28 -07:00
Rohit C Prasad ae7256f6b9 Prepare app release 0.1.7: version bump v0.1.7 2026-07-30 13:29:07 -07:00
Rohit Prasad 907752b20f Merge pull request #354 from andrewyng/rpArtifactWalkAndContextBar
fix: artifact walk enters OS app-data dirs; context bar off by default
2026-07-30 13:27:27 -07:00
Rohit C Prasad 25dc283d9b fix: stop artifact walk entering OS app-data dirs; context bar off by default
The artifacts scan used rglob and filtered after descending, so a home directory
workspace walked into ~/Library and triggered the macOS App Data consent prompt on
every turn. Walk with pruning instead, and skip Library / AppData in search too.

The composer chip now shows the session total by default, with the context window
bar behind a Settings toggle.
2026-07-30 13:10:30 -07:00
Rohit Prasad 11d9f72e51 Merge pull request #353 from andrewyng/rpSsrfFollowup
security: block CGNAT range and guard browser_open_url
2026-07-30 12:00:24 -07:00
Rohit C Prasad e5c56998ab security: block CGNAT range and guard browser_open_url
Follow up to #290. Add RFC 6598 shared space (100.64.0.0/10, used by
Tailscale) to the address guard, and run the same guard on the Playwright
browser_open_url before navigating.
2026-07-30 11:57:31 -07:00
Rohit Prasad 7e69398b15 Merge pull request #290 from Mr-Neutr0n/security/block-ssrf-in-url-tools
security: block loopback/private/metadata addresses in model-supplied URL fetches
2026-07-30 11:55:49 -07:00
Rohit Prasad 38e1f03021 Merge pull request #161 from psssnikhil/fix/inbox-reply-word-boundaries
fix(inbox): match approval keywords as whole words, not substrings
2026-07-30 11:40:43 -07:00
Rohit Prasad 98445fee11 Merge pull request #352 from andrewyng/rpMcpGlobalWins
mcp: global config wins on name clash with a trusted workspace
2026-07-30 11:25:12 -07:00
Rohit C Prasad 6217dbcb37 mcp: global config wins on name clash with a trusted workspace
Follow-up to #215: a trusted repo can no longer redefine a global server
by reusing its name.
2026-07-30 11:24:06 -07:00
Rohit Prasad 5071451d9c Merge pull request #351 from andrewyng/rpCompactionPolish
Compaction - progress signal, capped user-message list, long-paste clamp; Kimi K3 via Together
2026-07-30 11:22:01 -07:00
Rohit Prasad cca04218ec Merge pull request #215 from HaoChiBao/security/workspace-mcp-trust-gate
security: gate workspace MCP config behind WorkspaceTrustStore (#213)
2026-07-30 11:21:03 -07:00
Rohit C Prasad fe034c8b70 models: Kimi K3 via Together (1M window, vision); right-align the more/less toggle
Toggle also loses its underline.
2026-07-30 10:32:47 -07:00
Rohit C Prasad 1e819e0159 transcript: clamp long user messages with a more…/less… toggle
Pastes over 1200 chars collapse in the bubble; copy still gets the full text.
2026-07-30 10:25:32 -07:00
Rohit C Prasad f9f51c97c6 compaction: live progress signal + user-message cap
COMPACTING event drives a 'Compacting context…' transient in the GUI.
Cap the compacted block's user-message list at 40 with an honest omitted count.
2026-07-30 06:24:39 -07:00
Devika Verma b303823934 Merge pull request #347 from andrewyng/review/ope-27
Auto-compaction after context window usage threshold
2026-07-30 05:47:49 -07:00
Devika Verma 330010cc66 compaction: harden the smoke against per-turn event loops (OPE-27)
The live smoke exposed a harness trap: driving each turn through its own
asyncio.run() binds the engine asyncio primitives to the first loop, and
every later stream silently takes the interrupted path - full provider
replies persisted as empty assistant messages. The scripted smoke had
the same latent artifact and did not assert reply content, so it stayed
green. Now the whole scenario runs on ONE loop (like the real server)
and every turn asserts a real reply.
2026-07-29 18:00:38 +05:30
Devika Verma 0bf9b87800 compaction: repeated-compaction smoke through the manager (OPE-27 4/4)
A long multi-turn session driven through the real SessionManager with a
forced 3k-token cap: repeated compactions advance the boundary, later
summaries fold the previous one in, the provider verifiably receives the
compacted view (summary block + verbatim tail, bounded) while the
canonical transcript keeps every turn, state survives a mid-conversation
rebuild, and the persisted record round-trips the final boundary.

Scripted stand-in for the live-model smoke: intent survival across a
real summarizer (prompt tuning) still needs a configured provider key.
2026-07-29 16:23:26 +05:30
Devika Verma 4fa8acffed compaction: Settings overrides + GUI divider (OPE-27 3/4)
Settings -> Models grows a Context compaction card next to Token savings:
the trigger % of the context window (10-95), the absolute token cap
(clamped 10k-2M), and the summarizer-model pin (default: the session's
own model). POST /v1/settings/compaction persists them; engines read the
knobs live per check, so changes apply to running sessions immediately.

The "context compacted" divider rides the existing notice machinery: the
persisted `compacted` notice replays on reload (itemsFromMessages) and
the live COMPACTED event appends the same info notice mid-turn. The
transcript itself stays intact - outbound-only by construction.

Covered by vitest (marker replay), a settings-card e2e (defaults +
clamped POSTs + model pin), and a mid-session divider e2e driven by the
fixtures' scripted `compacted` event.
2026-07-29 16:20:24 +05:30
Devika Verma f08a3c425b compaction: engine hook, failure policy, persistence (OPE-27 2/4)
Minimal engine footprint: a checkpoint at each iteration top (between tool
turns and before a new turn), the usage signal captured per round-trip
(context_tokens; chars/4 estimate when never reported), and
_outbound_messages consulting the boundary. The summarizer runs off-loop
through the normal provider router, so the Settings model pin is just an
id.

Failure policy per spec: retry once in both modes; attended sessions get
the Retry / Trim-oldest-10% prompt (via the ask_user plumbing, gated by an
is_attended callback the WS surface wires); unattended runs auto-trim and
continue — never parked on internal bookkeeping. Raw context-overflow 400s
from the main model route into the same policy, progress-guarded so a
still-overflowing model terminates in the error path.

CompactionState persists on the session record (new sqlite column, same
defensive parse as grants), so reloads keep the compacted view. A
persisted compacted notice + a new COMPACTED event mark the spot for
the GUI divider (rendered in commit 3).
2026-07-29 16:13:14 +05:30
Devika Verma 028d42eb3b compaction: pure module + tests (OPE-27 1/4)
Trigger math (usage signal, chars/4 estimate fallback, min(80% x window,
250k cap) with overridable knobs), boundary picking that never splits a
turn (user-message starts preferred, iteration starts inside a giant tool
loop), the 8-section summarizer prompt with the continuation contract,
mechanical working-state extraction from tool records, deterministic
user-message preservation, the trim-oldest fallback, outbound-view
application, and context-overflow detection. Injectable provider seam;
no engine changes yet.
2026-07-29 16:05:30 +05:30
Devika Verma 70cd1fa3d4 ask_user upgrades: rich options, grouped questions, option previews (OPE-51)
Options accept {label, description, recommended, preview} objects (plain
strings unchanged — old sessions render as today's pills), and `questions`
groups up to 4 questions into one call, rendered as a stepper via the
header chips. Any option preview switches the card to a two-pane layout:
options left, monospace pane right, following hover/focus.

Grouped calls resolve with a JSON map keyed by header-or-question and
return {answers: {...}} to the agent (single stays {answer: ...});
a grouped item's first question doubles as its title/options so channel
mirrors and legacy surfaces degrade sensibly. Channel buttons use option
labels; grouped items mirror as text with the open-the-app hint.
2026-07-29 15:52:05 +05:30
Devika Verma 55362abbc9 Merge branch 'main' of https://github.com/andrewyng/openworker into issue/ope-46 2026-07-29 12:07:07 +05:30
Mr-Neutr0n ff86735cf0 security: block loopback/private/metadata addresses in model-supplied URL fetches
web_fetch and browser_read_url take a URL straight from the model. The model's
input is untrusted by design - both tools' own descriptions call fetched
content "data to evaluate, not instructions" - and web_fetch is
requires_approval=False, so nothing prompts the user before the request goes
out.

Neither validated the address. Verified against a scratch server on loopback:

    web_fetch("http://127.0.0.1:9931/")
    -> {"text": "Directory listing for /\n.git/\n.github/..."}

No prompt, no error. The same call reaches http://169.254.169.254/ for cloud
metadata when OpenWorker runs on a VM, an Ollama instance on :11434, or any
service on the user's LAN. It cannot reach OpenWorker's own sidecar, which
requires COWORKER_API_TOKEN.

Adds coworker/web/guard.py: resolve the host and refuse when any answer lands
in loopback, private, link-local (which covers the metadata endpoint),
multicast or reserved space. Checking every resolved address means a name with
one public and one private A record is refused rather than raced.

Redirects are the usual bypass, so follow_redirects is off and the chain is
walked here with each hop checked before it is requested. _request grows an
opt-in check_addresses flag used only by browser_read_url; the hardcoded vendor
endpoints the rest of the connectors call skip the guard and its DNS lookup.

Not covered, and stated in the module docstring: DNS rebinding. The name is
resolved by the guard and again by the client when it connects, so a near-zero
TTL record can change in between. Closing that needs connection-level IP
pinning. The hop check is the cheap 90%.

Tests: tests/test_url_address_guard.py - literals, IPv4-mapped IPv6 loopback,
names resolving into private space, split-horizon answers, non-http schemes,
redirect into loopback proven not to be requested, and a bounded redirect
loop.
2026-07-29 02:22:10 +05:30
Rohit Prasad f96ad4c8e6 Merge pull request #304 from andrewyng/rpTokenMetering
Token usage metering: per-session usage in the app + Anthropic prompt caching
2026-07-28 12:34:12 -07:00
Rohit C Prasad 8674e301a8 Pin mcp<2 — 2.0.0 removed streamablehttp_client
CI installs latest mcp; today's 2.0.0 release breaks every MCP-client import.
2026-07-28 11:58:31 -07:00
Rohit C Prasad 27311cd97f Usage popover: 'Uncached input' when a cache split exists
Input rows then read as components: uncached + cache reads + cache
writes = Total input; plain 'Input' stays for cacheless backends.
2026-07-28 11:48:21 -07:00
Rohit C Prasad d1524b3376 Usage popover: label rows as session totals
Section header 'Session totals' + pluralized cache rows make the
cumulative semantics explicit.
2026-07-28 11:42:44 -07:00
Rohit C Prasad a35b505659 Usage popover: add cumulative Total input row
Fresh + cache read + cache write — the session's billed input volume;
shown only when a cache split exists.
2026-07-28 11:39:15 -07:00
Rohit C Prasad 92c1833223 Usage popover: one field per line
Stacked label/value rows instead of the wrapped inline stats; values are
session sums per model (fresh input split from the cache rows).
2026-07-28 11:30:57 -07:00
Devika Verma a7df344248 Gitignore .env for local BYO-key smoke runs 2026-07-28 20:52:28 +05:30
Devika Verma 0de0da16c4 Docs: reflect the Responses/Chat-Completions provider split
openai_provider is now the compat workhorse (vendors, resellers, Ollama,
custom endpoints); the effort pin stays for GPT-5.6 reached through a
custom endpoint. base.py lists the current provider set.
2026-07-28 20:50:00 +05:30
Devika Verma 9d3f6d389d Route native OpenAI (blank endpoint) to the Responses provider
_build_openai: no custom base_url -> OpenAIResponsesProvider; a custom
endpoint (Azure /openai/v1, vLLM, compat gateways) keeps the Chat
Completions OpenAIProvider, as do Ollama and every compat vendor. Verify
path (raw GET /models) and matrix ids are untouched.
2026-07-28 20:48:43 +05:30
Devika Verma 26b4c80b32 OpenAI Responses provider: reasoning + tools for native OpenAI models
/v1/chat/completions rejects function tools with any reasoning_effort
other than none on GPT-5.6, so native OpenAI has run with reasoning OFF.
OpenAIResponsesProvider speaks /v1/responses instead: reasoning + tools
at real effort, streamed reasoning summaries into the existing
reasoning_delta plumbing, and CoT continuity across tool round-trips via
store:false + encrypted reasoning replayed through a new _openai message
sidecar (same extras contract as _anthropic/_gemini). Not routed yet.
2026-07-28 20:45:31 +05:30
Rohit C Prasad 8991d303e0 Enable prompt caching on the Anthropic provider
Two ephemeral breakpoints per request (last system block, final message's
last block) so append-only history re-reads the prior turns' cache;
outbound-only, persisted history stays clean.
2026-07-27 22:47:30 -07:00
Rohit C Prasad 7a108b25f9 Show per-session token usage in the composer
Quiet chip (context-fill meter + session total) opening a per-model
input/output/cache breakdown popover; accumulation from live events,
rebuilt from persisted sidecars on load; unit + e2e coverage.
2026-07-27 21:15:30 -07:00
Rohit C Prasad 979badbd3c Meter token usage across all model providers
Normalized TokenUsage (input/output/cache split) captured in every provider's
stream and complete paths, persisted as an assistant-message sidecar and sent
on the assistant_message event; matrix gains verified context-window sizes.
2026-07-27 21:01:31 -07:00
Rohit Prasad 3766805d10 Merge pull request #259 from andrewyng/rpModelProviders
Add AWS Bedrock, Google Vertex AI, and OpenRouter model providers
2026-07-27 20:41:54 -07:00
Rohit Prasad d3863966c9 Update README with badge from trendshift 2026-07-27 15:15:54 -07:00
Rohit C Prasad 33d3efd3b2 Vertex: countTokens verify, global-location host, honest region help
Model listing 403/404s under plain ADC; countTokens is free and proves
project+location+API in one call. Verified live: Gemini (global), Qwen MaaS (us-south1).
2026-07-27 12:58:16 -07:00
Rohit C Prasad f281b29ff1 Provider auth redesign: joined segments, method panels, Vertex methods
Segmented track + inset per-method panel with its own Test & save footer.
Vertex gains the same treatment: Google Cloud login (default), service account,
and API key (express mode, Gemini-only with a clear error elsewhere).
2026-07-26 21:10:59 -07:00
Rohit C Prasad b3a2b130d2 Vendor Bedrock, Vertex, and OpenRouter brand marks
Same MIT lobe-icons set as the existing gallery logos.
2026-07-26 21:04:49 -07:00
James Yang 29adb8d406 Polish workspace MCP trust gate: shared helper and tighter tests.
Extract _mcp_workspace_trusted for the three load sites, drop the unused spawn payload from the regression test, and remove a stray blank line.
2026-07-26 17:46:31 -04:00
James Yang 8cfd5b5bfe Gate workspace MCP config behind WorkspaceTrustStore.
Untrusted repos must not define stdio MCP servers that spawn at session open. Skip <.coworker/mcp.json> until the workspace is trusted, matching allowed_commands consent.

Fixes #213
2026-07-26 17:41:56 -04:00