Commit Graph
25 Commits
Author SHA1 Message Date
Devika Verma 805d002031 Subscription provider: settle on the ChatGPT subscription title 2026-08-21 17:36:22 -07:00
Devika Verma 0305a3ee80 Subscription provider: titled Codex subscription, wears the vendor mark 2026-08-21 17:28:43 -07:00
Devika Verma 76189b4b55 Whisper chrome + soft canvas edge shadow, both themes (UX-040) 2026-08-21 16:59:28 -07:00
Devika Verma 6780867f20 Sidebar: 300px default width (UX-040 owner call) 2026-08-21 16:53:59 -07:00
Devika Verma 20cd2732a0 Sidebar: New session becomes a quiet nav row; airier rhythm (UX-040) 2026-08-21 16:49:39 -07:00
Devika Verma a217511d50 Responses stream: rebuild the turn when the terminal event's output is empty
Some backends only stream output items and never repeat them on completed;
collect output_item.done as the fallback so text and tool calls survive.
2026-08-21 16:27:25 -07:00
Devika Verma 19561abeb6 Subscription catalog: add the 5.6 tiers (Sol/Terra/Luna); Sol becomes the recommended model 2026-08-21 16:10:51 -07:00
Devika Verma 893b06ea37 Canvas: whisper off-white instead of pure white (owner call) 2026-08-21 16:10:51 -07:00
Devika Verma 91b4ad0702 Settings ▸ Models: sign-in pane for the subscription provider
OAuth providers render connect/sign-out instead of a key form; card shows account.
Fixture rows + flow mock; e2e covers sign-in, sign-out, gallery state.
2026-08-21 15:23:15 -07:00
Devika Verma e4f7e53ebb Provider: ChatGPT-subscription sign-in (OAuth PKCE, tokens local-only)
Browser sign-in on the registered loopback port; tokens in the SecretStore profile.
Rides the Responses provider for conversion/streaming; refresh-on-expiry and on-401.
REST: signin (background + status poll), status, signout; oauth rows in providers list.
2026-08-21 15:18:45 -07:00
Devika Verma bd202ad125 e2e: seedSessionMessages seam + replayed-transcript specs
Seeds rich history per session so the reopen path is testable.
Covers replayed tool groups, filter counts, connector cards, tail-error Retry.
2026-08-21 15:17:14 -07:00
Devika Verma a9c3d884af Design system: bundled Inter + JetBrains Mono, 6-step type scale, bright canvas
Canvas/chrome surface tokens (content brightest, chrome tinted; dark lifts canvas).
Sweep of off-scale font sizes in styles.css and Tailwind arbitrary values.
Light-mode contrast fixes for muted/faint/warn ink.
2026-08-21 15:17:14 -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
Devika Verma 964da79ad6 Merge branch 'main' of https://github.com/andrewyng/openworker into feature/memory 2026-07-29 12:04:52 +05:30
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
Devika Verma ef59b0f39a Memory V1: remembered facts, your instructions, one screen
Coworkers remember durable things you tell them and use them in future sessions.
One Settings screen lists everything remembered - edit, delete, or stop new saves; standing instructions ride along.
Knowledge is session-stable, the save switch is per-message; sqlite gains a summary column via in-place migration.
2026-07-28 20:32:14 +05:30