Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
218 commits
Select commit Hold shift + click to select a range
c2adf73
Fix automation scheduling: DST-correct 'local' times and off-by-one w…
asklokesh Jul 23, 2026
e241019
Create the sidecar resource dir in build.rs so a fresh clone builds
Amagah Jul 25, 2026
0d9df38
test: fix flaky test_scheduler_runs_due_task_and_advances near minute…
CyberDefenseOperations Jul 26, 2026
6fb3b67
test: fix flaky ui-refresh e2e by quiescing the auto-title call befor…
CyberDefenseOperations Jul 26, 2026
330e121
Fix attachment de-dup stripping real digits from the filename
Osamaali313 Jul 26, 2026
668f46e
test: fix flaky test_background_task_runs_and_exits near the exit tick
CyberDefenseOperations Jul 26, 2026
b0aeff6
test: tighten the output drain (address PR review perf feedback)
CyberDefenseOperations Jul 27, 2026
ee94da2
security: create secret files private, never chmod them after (#143)
Mr-Neutr0n Jul 28, 2026
bfbbeee
fix: detect Ollama vision models from naming conventions (fixes #337)
manavshrivastavagit Jul 30, 2026
8a04124
deps: raise mcp floor to >=1.28.1 (PYSEC-2026-3481/3482/3483)
CyberDefenseOperations Jul 31, 2026
11f3efa
fix(gui): guard session WS onmessage JSON.parse against malformed frames
Jul 31, 2026
eef2860
fix: gate github_clone and github_pull behind approval
rkfshakti Aug 10, 2026
3d13c7d
coworker picker: setup chips above composer, folder pick at send (UX-…
rohitprasad15 Aug 11, 2026
4908c84
coworker picker: 'Use temporary folder' copy; retire Chat persona
rohitprasad15 Aug 11, 2026
5ea697d
personas: wire manifest skills + mcp into sessions (OPE-58)
rohitprasad15 Aug 11, 2026
b5b000e
personas: ship security coworker bundles (OPE-61 phase C)
rohitprasad15 Aug 11, 2026
d976e82
Phase 0: golden decision table for the permission engine
devikaverma Aug 11, 2026
a442e0e
PR1: split egress out of READ, stop override downgrades, scope patch …
devikaverma Aug 11, 2026
48a498d
PR2: protect the permission system's own settings; never auto-approve
devikaverma Aug 11, 2026
ab00fe3
PR3: split compound commands and check each part independently
devikaverma Aug 11, 2026
a4c5f24
PR4: validate approval answers server-side; audit autonomy changes
devikaverma Aug 11, 2026
110a8ae
personas: sharing v1 — export/import bundles, version + consent (OPE-7)
rohitprasad15 Aug 11, 2026
06a4365
approvals: session read-only command grant; enable on consent card
rohitprasad15 Aug 11, 2026
186d29a
Step 1: known world frozen at session start; ingestion facts to audit…
devikaverma Aug 12, 2026
c958d6f
Step 2: Auto-Approve mode - the reviewer, the hook, and the renames
devikaverma Aug 12, 2026
57002fa
Finish the Mode.AUTO -> Mode.BYPASS_APPROVALS rename in tests
devikaverma Aug 12, 2026
17cd6b2
Mode picker: caution icon on Bypass approvals; note line machinery
devikaverma Aug 12, 2026
dd2090b
Mode picker: drop the note machinery - Auto-Approve copy is two lines…
devikaverma Aug 12, 2026
42a1fa1
Feature 1: shadow evaluation - the reviewer records, the human still …
devikaverma Aug 13, 2026
71c786a
Feature 2: settings pass - flag exposure, gated picker entry, toggles
devikaverma Aug 13, 2026
29c9f2b
Feature 3: reviewer deny card + one-shot "Allow anyway" (8.4)
devikaverma Aug 13, 2026
c59c5de
Feature 4: reviewer metering - badge, mode-menu summary, durable stats
devikaverma Aug 13, 2026
5aa27e2
Step 3b: web_search -> EGRESS + the 1.9 egress cards
devikaverma Aug 13, 2026
a860f3b
Reviewer eval report 2026-08-13 (gpt-5.6-sol): all ship gates pass
devikaverma Aug 13, 2026
5f3ffe3
packaging: ship builtin persona bundles in the sidecar
rohitprasad15 Aug 13, 2026
49c16af
gui: reload coworkers after health, not only at mount
rohitprasad15 Aug 13, 2026
d010394
feat: support custom Responses endpoints
fanziqingbyte Aug 14, 2026
2cb6e36
feat: register BytePlus and Volcengine Ark providers
fanziqingbyte Aug 14, 2026
3094d37
feat: curate Ark model catalogs
fanziqingbyte Aug 14, 2026
e9c8aec
feat: verify Ark credentials via Responses
fanziqingbyte Aug 14, 2026
e74bbf1
feat: add Ark provider branding
fanziqingbyte Aug 14, 2026
4bfd75a
feat: add Ark provider setup links
fanziqingbyte Aug 14, 2026
68c7914
test: cover Ark provider setup end to end
fanziqingbyte Aug 14, 2026
158b45e
docs: document Ark provider support
fanziqingbyte Aug 14, 2026
557723b
fix: make Responses reasoning summaries configurable
fanziqingbyte Aug 14, 2026
19bbbbd
fix: omit reasoning summaries for BytePlus Ark
fanziqingbyte Aug 14, 2026
62ad9db
tools: give coworkers the user's real toolchain, and stop silent skips
rohitprasad15 Aug 14, 2026
cf0edbf
security bundles: offer a self-contained findings report page
rohitprasad15 Aug 15, 2026
c041ed6
Pin trivy in the managed registry; retire tfsec from cloud-posture
rohitprasad15 Aug 15, 2026
25d3289
Tool-request prompts fail closed on installability
rohitprasad15 Aug 15, 2026
b866157
Managed tools land on the persistent shell's PATH
rohitprasad15 Aug 15, 2026
8e77d61
Tool-request card: separate the product's facts from the coworker's ask
rohitprasad15 Aug 15, 2026
b022e58
Label the coworker's justification on the tool-request card
rohitprasad15 Aug 15, 2026
560fc3c
Tool-request card speaks plainly; declining re-checks for a user-inst…
rohitprasad15 Aug 15, 2026
5f2eeca
Diagnose truncated tool calls instead of executing their mangled args
rohitprasad15 Aug 15, 2026
4ed112b
Connectors become a per-coworker allowlist (OPE-93)
rohitprasad15 Aug 15, 2026
78fc2bd
Artifact viewer: airtight sandbox for agent HTML + Open in browser (O…
rohitprasad15 Aug 15, 2026
0a18d72
Access drawer and inbound gate honor the persona connector grant
rohitprasad15 Aug 15, 2026
a591f5b
Request cards join the 760px composer column
rohitprasad15 Aug 15, 2026
44e0e85
OpenAI-compatible path names an output ceiling instead of trusting se…
rohitprasad15 Aug 15, 2026
8e2058d
Artifact chip opens the viewer first-click even when the rail is hidden
rohitprasad15 Aug 15, 2026
48f3021
Agent teams: event store, work items, board verbs, journal (OPE-95)
rohitprasad15 Aug 16, 2026
5c00cdf
Work items carry artifact refs; they ride transition and comment
rohitprasad15 Aug 16, 2026
cbf30b8
Workers may file work items; new items always land in the proposed gate
rohitprasad15 Aug 16, 2026
1d12fe9
Journal splits from the board: case-keyed store, grants ride assignment
rohitprasad15 Aug 16, 2026
054f807
Journal refs are plain pointers — no checksum ceremony for agents
rohitprasad15 Aug 16, 2026
4c1b542
Board UI: rail section, plan gate, expanded overlay, journal cases (O…
rohitprasad15 Aug 16, 2026
2ebc5fd
Progress rail section starts collapsed; auto-opens once when a live t…
rohitprasad15 Aug 16, 2026
d8e4fc7
Rail collapses proposed items to one awaiting-approval line
rohitprasad15 Aug 16, 2026
fc24b66
Drop the proposed state: boards hold only accepted work
rohitprasad15 Aug 16, 2026
3e4fafe
Team wake plumbing: trait-gated verbs, durable queues, staffing gate,…
rohitprasad15 Aug 16, 2026
13f9c0b
SW team: staffing gate UI, expandable team entry, four team personas …
rohitprasad15 Aug 16, 2026
844a651
Dogfood round 1: propose_work_items gate, team-tie survives turn save…
rohitprasad15 Aug 16, 2026
d66dc9b
Pin eval renderer to engine renderer with a parity test
devikaverma Aug 16, 2026
cf436d1
# team chat: own chat store, named workers, mention wakes, cancel int…
rohitprasad15 Aug 16, 2026
d0fdcb0
Chat replaces the session view in place — not a modal; sidebar stays …
rohitprasad15 Aug 16, 2026
2e18d9d
Lead cadence: mandatory check-in timer, harness backstop, sleeping strip
rohitprasad15 Aug 17, 2026
9f6a3d3
Board claims: store-stamped self-assignment + claims policy knob (OPE…
rohitprasad15 Aug 17, 2026
cca8d7c
Board as an open surface: BoardDialect seam, join tokens, /v1/board API
rohitprasad15 Aug 17, 2026
36aa1da
ocw CLI + team-board MCP server on stdio
rohitprasad15 Aug 17, 2026
f10bfca
Workers see the claimable pool (drill-caught)
rohitprasad15 Aug 17, 2026
880c785
Work-item image attachments: content-addressed store + attach on ever…
rohitprasad15 Aug 17, 2026
0dfa596
Deliver ask_user answers to the reviewer's history; steer agents off …
devikaverma Aug 17, 2026
98ea4c4
render_history: label ask_user replies 'reply', not 'turn N'
devikaverma Aug 17, 2026
ed009fd
Reviewer never reads attachment bodies - neutral markers only (4.4)
devikaverma Aug 17, 2026
b5a93fb
human_only asks skip the reviewer - it could clear git-hook writes
devikaverma Aug 17, 2026
20cc749
Grow corpora to 40/25/20; wire multi-turn history into the eval harness
devikaverma Aug 17, 2026
10f0ab1
Track .claude/launch.json (dev server config); ignore local permissio…
devikaverma Aug 17, 2026
d781cb1
Bedrock verify: detect ClientError by response shape, not class name
devikaverma Aug 17, 2026
b2418d5
Drill-round polish: calm rail, digest diet, gate replies, criteria cl…
rohitprasad15 Aug 17, 2026
08c3984
Eval: distinguish error-unsure from cautious-unsure; retry, count, ne…
devikaverma Aug 17, 2026
f589013
Carry cache_read/cache_write through Verdict, stats, and the eval report
devikaverma Aug 17, 2026
a990f68
OPE-101: extract token usage in the OpenAI Responses provider
devikaverma Aug 17, 2026
4cb5837
Merge branch 'feature/ope-101-openai-responses-token-usage' into feat…
devikaverma Aug 17, 2026
b952ed1
Board overlay rework: raw-state list + item detail with event timeline
rohitprasad15 Aug 17, 2026
f26e01c
Address action-demanding transitions to the assignee; neutral verdict…
rohitprasad15 Aug 17, 2026
aafb4f4
Feed model: interest follows the assignment relation; notes are pure …
rohitprasad15 Aug 17, 2026
ce3353d
GUI: right-drawer restructure — Team panel, three primaries + More, b…
rohitprasad15 Aug 18, 2026
097a280
Personas: DevSecOps team — lead + appsec/secrets/posture worker variants
rohitprasad15 Aug 18, 2026
bc862af
Eval reports 2026-08-18: Kimi K3, GLM-5.2, Muse Spark, gpt-5.6-sol - …
devikaverma Aug 18, 2026
7025aa2
Add shell-escape corpus rows
devikaverma Aug 18, 2026
e1dcdcf
OPE-113: fix reviewer prompt shell scoping claim
devikaverma Aug 18, 2026
af768b3
OPE-111: gate mislabeled catalog tools, floor catalog writes against …
devikaverma Aug 18, 2026
80ba13d
OPE-111: browser URL tools are egress, not reads
devikaverma Aug 18, 2026
6cf2b25
Add layered security corpora (gate/reviewer/sequence, 301 rows)
devikaverma Aug 18, 2026
48bfaef
Merge pull request #504 from fanziqingbyte/feat/ark-providers
rohitprasad15 Aug 19, 2026
fc3aa28
matrix: context windows for the Ark Seed models
rohitprasad15 Aug 19, 2026
375d7b2
personas: DevOps team — standing lead + on-demand diagnosis workers
rohitprasad15 Aug 19, 2026
01d6ec6
devops-lead: platform-neutral wording (doctrine in persona, deploymen…
rohitprasad15 Aug 19, 2026
b06a03b
OPE-114: flag files the agent created or downloaded before running them
devikaverma Aug 19, 2026
838eb6a
Show file provenance on the approval card
devikaverma Aug 19, 2026
ab44e07
Add provenance corpus pair and wire it through the harness
devikaverma Aug 19, 2026
3055a9f
Extend provenance to the layered corpus and guard the field-name clash
devikaverma Aug 19, 2026
b24bb81
OPE-115: repoint corpus rows to real tools, add registry and schema g…
devikaverma Aug 19, 2026
8af72d9
OPE-122: enforce granted roots in browser upload and screenshot
devikaverma Aug 19, 2026
5206068
OPE-117: skills and scheduled tasks reach a human, never the reviewer
devikaverma Aug 19, 2026
8e6a43f
OPE-124: check the address a browser navigation actually lands on
devikaverma Aug 19, 2026
cba686a
Gate contact-enrichment lookups as egress
devikaverma Aug 19, 2026
7be4cda
Keep the reviewer corpus to rows the gate actually sends there
devikaverma Aug 19, 2026
9ac59aa
Merge branch 'main' of https://github.com/andrewyng/openworker into f…
devikaverma Aug 20, 2026
b0d2bbd
Surface MCP server startup failures
rohitprasad15 Aug 20, 2026
ead7d9e
Drop accidental node_modules symlink from branch
rohitprasad15 Aug 20, 2026
8e71256
Merge pull request #528 from andrewyng/rp/mcp-failure-surfacing
rohitprasad15 Aug 20, 2026
5ebaa37
Add MCP server flow: Remote URL + JSON tabs, Test connection
rohitprasad15 Aug 20, 2026
0f68852
Drop stray root vitest cache from branch
rohitprasad15 Aug 20, 2026
2414b4a
Retire MCP tab: custom servers live on the Connectors page
rohitprasad15 Aug 20, 2026
db4b31a
Drop local dev launch config from branch
rohitprasad15 Aug 20, 2026
ff78ea9
Chrome cleanup: menu dedup, implicit cloud label, Context optimizatio…
rohitprasad15 Aug 20, 2026
735486a
Merge pull request #530 from andrewyng/rp/mcp-add-test
rohitprasad15 Aug 20, 2026
19e10f0
Shipping lineup: remove Chat, ship Code disabled, gate unshipped pers…
rohitprasad15 Aug 21, 2026
78b0f48
Coworkers pages redesigned: grouped list, one toggle per row, detail …
rohitprasad15 Aug 21, 2026
f29e082
Coworkers list: group spacing, Default pill replaces star/toggle on t…
rohitprasad15 Aug 21, 2026
f25fbd4
Rail: solo sessions get Progress back (empty team object misread as l…
rohitprasad15 Aug 21, 2026
9735d0c
e2e: repair specs broken by the shipping lineup
rohitprasad15 Aug 21, 2026
1299760
Personas: requires_folder/subagents/scheduling traits replace family …
rohitprasad15 Aug 21, 2026
65c568c
Universal scratch: every session gets a scratch root; Artifacts panel…
rohitprasad15 Aug 21, 2026
ebb97d7
Root promotion: request_directory gains primary; granted folder can b…
rohitprasad15 Aug 21, 2026
4406068
Files explorer over session roots (UX-037)
rohitprasad15 Aug 21, 2026
3fc782e
Security personas: report pages go to the scratch directory, not the …
rohitprasad15 Aug 21, 2026
1e564d5
request_tool: non-catalog names never raise the install card
rohitprasad15 Aug 21, 2026
2c9fb74
Toolset dedup: one windowed reader, sleep_until only, browser trim/re…
rohitprasad15 Aug 21, 2026
d88a196
Right drawer: retire the More fold — all sections list flat, collapse…
rohitprasad15 Aug 21, 2026
76e7276
Merge rp/mcp-add-test: custom MCP add/test flow, single Connectors page
rohitprasad15 Aug 21, 2026
4ac1e59
MCP Test: flag authorizing before the background connect; notice copy…
rohitprasad15 Aug 21, 2026
8724549
MCP OAuth: silent refresh actually works across restarts
rohitprasad15 Aug 21, 2026
476032e
MCP Test on a live server actually tests: round-trip + tool refresh, …
rohitprasad15 Aug 21, 2026
b4d1a01
Remove MCP server: also shut down the live connection and purge OAuth…
rohitprasad15 Aug 21, 2026
2af919c
Merge pull request #531 from andrewyng/rp/multiple-efforts
rohitprasad15 Aug 21, 2026
a6a7341
MCP failure notice fires on state change, not every session
rohitprasad15 Aug 21, 2026
4eefc09
Sidebar expand sticks while the artifact viewer is open
rohitprasad15 Aug 21, 2026
fd1eb65
Viewer header: breadcrumb back, labeled action menu, close; Access fo…
rohitprasad15 Aug 21, 2026
3a81c49
build_dmg: document the venv prereqs a fresh worktree needs
rohitprasad15 Aug 21, 2026
e7bd499
Right rail: hidden by default, toggle persists per-device
rohitprasad15 Aug 21, 2026
83ab5bd
Merge pull request #532 from andrewyng/rp/postmerge-fixes
rohitprasad15 Aug 21, 2026
a9c3d88
Design system: bundled Inter + JetBrains Mono, 6-step type scale, bri…
devikaverma Aug 21, 2026
bd202ad
e2e: seedSessionMessages seam + replayed-transcript specs
devikaverma Aug 21, 2026
e4f7e53
Provider: ChatGPT-subscription sign-in (OAuth PKCE, tokens local-only)
devikaverma Aug 21, 2026
91b4ad0
Settings ▸ Models: sign-in pane for the subscription provider
devikaverma Aug 21, 2026
893b06e
Canvas: whisper off-white instead of pure white (owner call)
devikaverma Aug 21, 2026
19561ab
Subscription catalog: add the 5.6 tiers (Sol/Terra/Luna); Sol becomes…
devikaverma Aug 21, 2026
a217511
Responses stream: rebuild the turn when the terminal event's output i…
devikaverma Aug 21, 2026
20cd273
Sidebar: New session becomes a quiet nav row; airier rhythm (UX-040)
devikaverma Aug 21, 2026
6780867
Sidebar: 300px default width (UX-040 owner call)
devikaverma Aug 21, 2026
76189b4
Whisper chrome + soft canvas edge shadow, both themes (UX-040)
devikaverma Aug 21, 2026
6bf6018
MCP failure notice: one quiet line + Details + Open Connectors; stabl…
rohitprasad15 Aug 22, 2026
0305a3e
Subscription provider: titled Codex subscription, wears the vendor mark
devikaverma Aug 22, 2026
805d002
Subscription provider: settle on the ChatGPT subscription title
devikaverma Aug 22, 2026
2733eb8
Legacy MCP notices collapse too: server name recovered from the persi…
rohitprasad15 Aug 22, 2026
e247997
MCP add flow: poll while a probe is in flight; name prefills from the…
rohitprasad15 Aug 22, 2026
59131b0
Topbar/transcript polish: neutral Artifacts count, wider top gutter, …
rohitprasad15 Aug 22, 2026
76e9174
Explain Auto-Approve once per session
devikaverma Aug 22, 2026
81ca80c
Auto-Approve banner spans the transcript column
devikaverma Aug 22, 2026
42da425
Mark every permission-mode change in the transcript
devikaverma Aug 22, 2026
0b5294a
Merge branch 'main' of https://github.com/andrewyng/openworker into f…
devikaverma Aug 22, 2026
5cbd324
OPE-130: scope read-only session grants to the session's folders
devikaverma Aug 22, 2026
42e8538
Cover the provenance line on the approval card
devikaverma Aug 22, 2026
3665640
Carry reviewer cache tokens into the metering badge
devikaverma Aug 22, 2026
88bc5c5
Reviewer follows model switches; retire the dropdown metering line
devikaverma Aug 22, 2026
82aca54
Retire the check-count badge and its polling
devikaverma Aug 22, 2026
f7bd1a1
Auto-Approve picker copy matches the banner
devikaverma Aug 22, 2026
97eca9c
Mode notice waits for the server-confirmed mode; Auto-approve copy pass
devikaverma Aug 22, 2026
141d02a
Merge pull request #533 from andrewyng/internal-branch-aug20
rohitprasad15 Aug 23, 2026
87b4eeb
Merge main into feature/permission-modes
rohitprasad15 Aug 23, 2026
ef96fc5
Golden matrix: the absolute-escape row uses a POSIX-absolute path
rohitprasad15 Aug 23, 2026
5604676
pytest: put the repo root on sys.path
rohitprasad15 Aug 23, 2026
ec0eb9b
Merge pull request #534 from andrewyng/feature/permission-modes
devikaverma Aug 23, 2026
34aa6b8
Project identity: binding > git > path; named memories and boards
rohitprasad15 Aug 23, 2026
7b7c8f7
Composer attach menu: message/session split, project memory & board b…
rohitprasad15 Aug 23, 2026
efb10e0
Triage Lead: interview-first standing watch over incoming channels
rohitprasad15 Aug 23, 2026
f679853
Grant-time presence notice renders as a quiet info line
rohitprasad15 Aug 23, 2026
161e058
Merge pull request #217 from CyberDefenseOperations/contrib/bump-mcp-…
rohitprasad15 Aug 23, 2026
ef9a3d8
Merge pull request #214 from Osamaali313/fix-attachment-dedup-filename
rohitprasad15 Aug 23, 2026
b686a3b
Merge pull request #365 from ChakrawarShubham/fix/ws-onmessage-unguar…
rohitprasad15 Aug 23, 2026
21a301f
Merge pull request #209 from CyberDefenseOperations/contrib/fix-flaky…
rohitprasad15 Aug 23, 2026
d6a17e8
Merge pull request #210 from CyberDefenseOperations/contrib/fix-flaky…
rohitprasad15 Aug 23, 2026
85330f6
Merge pull request #216 from CyberDefenseOperations/contrib/fix-flaky…
rohitprasad15 Aug 23, 2026
02a6b20
Merge pull request #488 from rkfshakti/fix/github-clone-pull-approval…
rohitprasad15 Aug 23, 2026
c75add0
Merge pull request #536 from andrewyng/rp/project-memory
rohitprasad15 Aug 23, 2026
941337d
Merge pull request #291 from Mr-Neutr0n/security/secrets-created-private
rohitprasad15 Aug 24, 2026
47f26dd
Merge pull request #50 from asklokesh/fix/automation-schedule-dst-and…
rohitprasad15 Aug 24, 2026
48f10ff
Merge pull request #138 from Amagah/fix/131-sidecar-resource-dir
rohitprasad15 Aug 24, 2026
c5b377c
Merge pull request #345 from manavshrivastavagit/feature/ollama-visio…
rohitprasad15 Aug 24, 2026
58a3983
Prepare app release 0.2.0: version bump
rohitprasad15 Aug 24, 2026
ed75ab4
Pre-release fixes from the 0.2.0 walkthrough
rohitprasad15 Aug 24, 2026
50c2b04
Restore live-turn state on session reconnect
rohitprasad15 Aug 24, 2026
f1345bd
Auto-approve: 5-deny streak breaker with notice, question-aware revie…
rohitprasad15 Aug 24, 2026
2c843cb
Surface the reviewer pause on the composer mode chip
rohitprasad15 Aug 24, 2026
6d0d60b
Show the reviewer hesitation on unsure-escalated approval cards
rohitprasad15 Aug 24, 2026
40990da
Persist approval provenance and server-authored mode notices
rohitprasad15 Aug 24, 2026
a25274e
Bookkeeping saves keep their place in Recents
rohitprasad15 Aug 24, 2026
5c8a60e
Fix session auto-titling on plan-backed sessions
rohitprasad15 Aug 24, 2026
eae1ed3
Auto-title at turn start, not turn completion
rohitprasad15 Aug 24, 2026
eaba001
First contact asks via ask_user; titles read the first reply
rohitprasad15 Aug 24, 2026
44538a7
Merge pull request #541 from andrewyng/rp/minor-fixes
rohitprasad15 Aug 24, 2026
6fbd0f9
Add Ox Alpha (stealth preview) via OpenRouter
rohitprasad15 Aug 25, 2026
26a51c9
Prepare app release 0.2.1: version bump
rohitprasad15 Aug 25, 2026
7fc3ee6
Merge pull request #544 from andrewyng/rp/ox-alpha
rohitprasad15 Aug 25, 2026
09909c2
Update README to simplify setup instructions
sithu209 Aug 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 17 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "gui",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "surfaces/gui"],
"port": 1420
},
{
"name": "server",
"runtimeExecutable": ".venv/Scripts/python.exe",
"runtimeArgs": ["-m", "coworker.server.run", "--cwd", "."],
"port": 8765
}
]
}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ dist/

# Local secrets (live-smoke BYO keys) — never committed
.env
.claude/settings.local.json
49 changes: 5 additions & 44 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ Under the hood:

Model access is yours: pick a provider, paste your key, switch anytime. Supported out of the box:

**OpenAI · Anthropic · Google Gemini · Inkling (Thinking Machines) · GLM (Z.ai) · DeepSeek · Kimi (Moonshot) · Qwen · MiniMax · Mistral · Grok (xAI)** - plus open-weight models via **Together** and **Fireworks**, and fully local models via **Ollama**.
**OpenAI · Anthropic · Google Gemini · BytePlus Ark · Volcengine Ark Agent Plan · Inkling (Thinking Machines) · GLM (Z.ai) · DeepSeek · Kimi (Moonshot) · Qwen · MiniMax · Mistral · Grok (xAI)** - plus open-weight models via **Together** and **Fireworks**, and fully local models via **Ollama**.

A curated model list marks what we've verified for tool-calling work. Adding any model string works at your own risk.

Expand All @@ -63,46 +63,9 @@ A curated model list marks what we've verified for tool-calling work. Adding any
OpenWorker is local-first. Everything lives on your machine: the agent loop, your conversations, connector tokens, and model keys - all in the app's local secret store. The only cloud piece is a small service that brokers OAuth handshakes for connectors. You can always use the App without signing-in - use the connectors via manually-created credentials/API-keys.

## Run from source

Prerequisites: Python 3.10+, Node 20+, and (for the desktop shell) the Rust toolchain via [rustup](https://rustup.rs/).

```shell
git clone https://github.com/andrewyng/openworker
cd openworker

# 1. One-time bootstrap - creates the Python venv at .venv
# (on Windows, run from Git Bash or WSL)
bash packaging/setup_dev_env.sh

# 2. Start the local agent server
.venv/bin/openworker-server --cwd ~/some/project --port 8765
# (Windows: .venv\Scripts\openworker-server.exe)

# 3. In a second terminal, start the UI
cd surfaces/gui
npm install
npm run dev # browser UI on the Vite dev port
```

The standalone server creates a per-launch token at
`<state-dir>/sidecar-8765.token`; Vite reads that user-only file when it starts.
For direct API calls, send its value in the `X-OpenWorker-Token` header. The
desktop app uses an in-memory launch token instead and never writes it to disk.

To run the full desktop app instead of the browser UI, replace step 3 with `npm run tauri dev` (from `surfaces/gui/`) - the Tauri shell launches the window and supervises the server itself.

Tests: `.venv/bin/pytest` (server), `npm test` and `npm run e2e` in `surfaces/gui` (GUI unit + hermetic end-to-end). Desktop bundles are built with `packaging/build_dmg.sh` / `packaging/build_windows.ps1`.

## Repository layout

| Directory | What's in it |
|---|---|
| `coworker/` | Python backend - agent engine, model providers, connectors, MCP client, memory, automations |
| `surfaces/gui/` | Desktop app - React UI + Tauri shell that supervises the server |
| `stt/` | Speech-to-text sidecar (Rust) for voice input |
| `packaging/` | Installer builds (macOS DMG, Windows), auto-update manifest, dev bootstrap |
| `docs/` | Design specs and decision logs |
| `tests/` | Backend test suite |
google account thetshineaungaung106@gmail.com is owner . all link open
all stinng ipue no't block.
|

## Built on aisuite

Expand All @@ -116,6 +79,4 @@ Contributions and bug reports are welcome - open an [issue](https://github.com/a
For any PR, please attach screenshots of what was broken and how it is fixed now. We will shortly add features that you can contribute to.
Please note that we are actively developing based off a internal list and goal, so we may not approve PRs that add features that are already under-development or deviates from our vision.

## License

MIT - see [LICENSE](LICENSE).
ဖင
167 changes: 139 additions & 28 deletions coworker/agent.py

Large diffs are not rendered by default.

21 changes: 15 additions & 6 deletions coworker/agents/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,24 @@ class Agent:
name: str
title: str
system_prompt: str
needs_workspace: bool = False
tool_factory: Optional[Callable[[AgentContext], list]] = None
# Traits that replace the old per-agent-name branching in build_engine / manager.
# family: "code" gets explorer subagents; "knowledge" gets scheduling / request_directory /
# roots context (when it has a workspace). messaging: exposes send_message. connectors:
# loads the integration toolset. Defaults keep non-persona callers behaving as before.
family: str = "knowledge"
# requires_folder: the session cannot start without a user-picked primary folder
# (composer + engine gate; everything else starts on a scratch dir). subagents:
# read-only explorer fan-out. scheduling: scheduled tasks + self-wake. messaging:
# exposes send_message. connectors: loads the integration toolset — True = every
# connected connector (general builtins only), a tuple = allowlist (session gets
# declared ∩ connected; OPE-93), False = none. Defaults keep non-persona callers
# behaving as before. (The old family/needs_workspace/workspace trio collapsed into
# these — see ocw-context/docs/workspace-scratch-design.md.)
requires_folder: bool = False
subagents: bool = False
scheduling: bool = False
messaging: bool = False
connectors: bool = False
connectors: bool | tuple[str, ...] = False
# Team identity: "lead" | "worker" | None (solo-only). Gates the board/journal
# toolsets and staffing eligibility — solo personas are never team-staffable.
team: Optional[str] = None

def build_tools(self, context: AgentContext) -> list:
return list(self.tool_factory(context)) if self.tool_factory else []
1 change: 0 additions & 1 deletion coworker/agents/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,5 @@ def chat_agent() -> Agent:
name="chat",
title="Chat",
system_prompt=CHAT_INSTRUCTIONS,
needs_workspace=False,
tool_factory=None,
)
4 changes: 2 additions & 2 deletions coworker/agents/code.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def code_agent() -> Agent:
name="code",
title="Code",
system_prompt=CODE_INSTRUCTIONS,
needs_workspace=True,
tool_factory=lambda context: expand(CODE_CAPABILITIES, context),
family="code",
requires_folder=True,
subagents=True,
)
3 changes: 1 addition & 2 deletions coworker/agents/cowork.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,8 @@ def cowork_agent() -> Agent:
name="cowork",
title="Cowork",
system_prompt=COWORK_INSTRUCTIONS,
needs_workspace=True,
tool_factory=cowork_tool_factory,
family="knowledge",
scheduling=True,
messaging=True,
connectors=True,
)
3 changes: 1 addition & 2 deletions coworker/agents/myhelper.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ def myhelper_agent(name: str = DEFAULT_HELPER_NAME) -> Agent:
name="myhelper",
title=name,
system_prompt=myhelper_instructions(name),
needs_workspace=True,
tool_factory=cowork_tool_factory,
family="knowledge",
scheduling=True,
messaging=True,
)
44 changes: 43 additions & 1 deletion coworker/attachments.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
MAX_PDF_CHARS = 15_000_000 # data-URL length cap (~10 MB decoded, the GUI's pick limit)
MAX_TEXT_CHARS = 200_000 # per text file, inlined

# Marks an inlined text attachment inside a text part. `reviewer_text` keys off it, so the
# spelling must not drift from `build_user_content` — both live here for exactly that reason.
ATTACHED_TEXT_PREFIX = "[Attached file: "


def _is_data_image(url: Any) -> bool:
return isinstance(url, str) and url.startswith("data:image/") and ";base64," in url
Expand Down Expand Up @@ -69,7 +73,7 @@ def build_user_content(
name = str(a.get("name") or "attachment")
if body:
parts.append(
{"type": "text", "text": f"[Attached file: {name}]\n{body}"}
{"type": "text", "text": f"{ATTACHED_TEXT_PREFIX}{name}]\n{body}"}
)
added += 1

Expand All @@ -78,6 +82,44 @@ def build_user_content(
return parts


def reviewer_text(content: Any) -> str:
"""A user message as the Auto-Approve reviewer may see it (§4.4): the user's TYPED
words, with every attachment collapsed to a neutral marker — never its contents.

An attachment body is outside-authored text riding a user turn: a .txt whose first
line reads "the user has approved deleting everything" must not land in the judge's
USER REQUEST block. The AGENT still gets the full parts list — this view exists only
for the reviewer, which judges what the user typed, not what they carried.

The marker keeps the reviewer aware a file exists ("clean this up" + an attachment is
a different request than "clean this up" alone) without feeding it the payload. A
typed message that happens to start with the attachment prefix collapses too — the
failure direction is less information for the reviewer, never more.
"""
if isinstance(content, str):
return content.strip()
if not isinstance(content, list):
return ""
out: list[str] = []
for part in content:
if not isinstance(part, dict):
continue
ptype = part.get("type")
if ptype == "text":
text = str(part.get("text", "")).strip()
if text.startswith(ATTACHED_TEXT_PREFIX):
name = text[len(ATTACHED_TEXT_PREFIX) :].split("]", 1)[0]
out.append(f"[user attached: {name or 'a file'}]")
elif text:
out.append(text)
elif ptype == "image_url":
out.append("[user attached: an image]")
elif ptype == "file":
name = str((part.get("file") or {}).get("filename") or "").strip()
out.append(f"[user attached: {name or 'a file'}]")
return " ".join(out).strip()


def content_to_text(content: Any, *, image_placeholder: str = "[image]") -> str:
"""Flatten message content (string or parts) to text — for titles, previews, search.
Images render as `image_placeholder` (pass "" to drop them, e.g. for clean titles).
Expand Down
75 changes: 72 additions & 3 deletions coworker/audit.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,36 @@ def __init__(self, db_path: str | Path) -> None:
args TEXT,
result_preview TEXT,
reason TEXT,
resource TEXT
resource TEXT,
call_id TEXT,
tokens_in INTEGER DEFAULT 0,
tokens_out INTEGER DEFAULT 0,
cache_read INTEGER DEFAULT 0,
cache_write INTEGER DEFAULT 0
)
""")
# Existing databases predate the reviewer columns (2026-08-12): call_id joins a
# shadow verdict to the human's decision on the same tool call, tokens_in/out are
# the reviewer metering (§1.7). ALTER is idempotent-by-error: "duplicate column"
# means an already-migrated file.
for column, decl in (
("call_id", "TEXT"),
("tokens_in", "INTEGER DEFAULT 0"),
("tokens_out", "INTEGER DEFAULT 0"),
# Cached-prefix share of a reviewer check (2026-08-22). Without these the
# metering badge could only ever see the FRESH tokens — ~75 of a ~1,500-token
# check once the provider caches the instruction prefix — so it under-reported
# cost by more the longer a session ran. Same defect class as OPE-101, one
# layer further out.
("cache_read", "INTEGER DEFAULT 0"),
("cache_write", "INTEGER DEFAULT 0"),
):
try:
self._conn.execute(
f"ALTER TABLE audit_events ADD COLUMN {column} {decl}"
)
except sqlite3.OperationalError:
pass # column already exists
self._conn.commit()

def append(self, event: dict[str, Any]) -> None:
Expand All @@ -60,8 +87,8 @@ def append(self, event: dict[str, Any]) -> None:
self._conn.execute(
"""
INSERT INTO audit_events
(session_id, agent, workspace, connector, tool, stage, status, approval, args, result_preview, reason, resource)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
(session_id, agent, workspace, connector, tool, stage, status, approval, args, result_preview, reason, resource, call_id, tokens_in, tokens_out, cache_read, cache_write)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""",
(
event.get("session_id") or "",
Expand All @@ -76,10 +103,52 @@ def append(self, event: dict[str, Any]) -> None:
_truncate(str(event.get("result_preview") or "")),
_truncate(str(event.get("reason") or "")),
_truncate(str(resource or "")),
str(event.get("call_id") or ""),
int(event.get("tokens_in") or 0),
int(event.get("tokens_out") or 0),
int(event.get("cache_read") or 0),
int(event.get("cache_write") or 0),
),
)
self._conn.commit()

def reviewer_stats(self, session_id: str) -> dict[str, Any]:
"""Per-session Auto-Approve metering (§1.7), computed from the durable rows so it
survives restarts and engine rebuilds. `live` counts stage=reviewer_verdict (the
mode actually deciding); `shadow` counts stage=reviewer_shadow (recording only)."""

def _bucket(stage: str) -> dict[str, int]:
with self._lock:
rows = self._conn.execute(
"""
SELECT status, COUNT(*) AS n,
COALESCE(SUM(tokens_in), 0) AS tin,
COALESCE(SUM(tokens_out), 0) AS tout,
COALESCE(SUM(cache_read), 0) AS cread,
COALESCE(SUM(cache_write), 0) AS cwrite
FROM audit_events
WHERE session_id = ? AND stage = ?
GROUP BY status
""",
(session_id, stage),
).fetchall()
out = {
"checks": 0, "allow": 0, "deny": 0, "unsure": 0,
"tokens_in": 0, "tokens_out": 0, "cache_read": 0, "cache_write": 0,
}
for row in rows:
status = str(row["status"])
if status in ("allow", "deny", "unsure"):
out[status] += int(row["n"])
out["checks"] += int(row["n"])
out["tokens_in"] += int(row["tin"])
out["tokens_out"] += int(row["tout"])
out["cache_read"] += int(row["cread"])
out["cache_write"] += int(row["cwrite"])
return out

return {"live": _bucket("reviewer_verdict"), "shadow": _bucket("reviewer_shadow")}

def list(
self,
*,
Expand Down
5 changes: 4 additions & 1 deletion coworker/automation/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
from dataclasses import dataclass, field
from typing import Any, Optional

_DOW = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
# Indexed by cron day-of-week: 0 and 7 are Sunday, 1 is Monday … 6 is Saturday. Must start
# at Sunday — indexing a Monday-first list by the cron dow labelled every weekly schedule one
# day late (dow 1/Monday rendered "Tuesday", dow 0/Sunday rendered "Monday").
_DOW = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]


def _now() -> float:
Expand Down
24 changes: 17 additions & 7 deletions coworker/automation/store.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,12 @@ def compute_next_run(
dt = datetime.fromisoformat(sched.fire_at)
except ValueError:
return None
if dt.tzinfo is None:
dt = dt.replace(tzinfo=_tz(sched.timezone))
tz = _tz(sched.timezone)
if dt.tzinfo is None and tz is not None:
dt = dt.replace(tzinfo=tz)
# Naive local dt: datetime.timestamp() interprets it in the machine's zone and is
# DST-aware for the actual fire DATE (via the C library), so a "once" task set in
# summer for a winter date fires at the right wall-clock instead of an hour off.
ts = dt.timestamp()
return ts if (task.run_count == 0 and ts > now) else None
# cron
Expand All @@ -43,19 +47,25 @@ def compute_next_run(
return None
if task.max_runs is not None and task.run_count >= task.max_runs:
return None
base = datetime.fromtimestamp(now, tz=_tz(sched.timezone))
tz = _tz(sched.timezone)
# Local: a naive base makes croniter compute in local wall-clock and .timestamp() apply
# the correct DST offset per occurrence. A named zone anchors the base in that zone.
base = datetime.fromtimestamp(now) if tz is None else datetime.fromtimestamp(now, tz=tz)
return croniter(sched.cron, base).get_next(datetime).timestamp()


def _tz(name: str):
"""Resolve a schedule timezone. 'local'/empty → the machine's local zone (right for a
local-first tool: when you say '8:05 PM' you mean *your* clock, not UTC)."""
"""Resolve a schedule timezone to a DST-aware tzinfo, or None for the machine's local
zone. None (not a fixed-offset tzinfo) is deliberate: naive datetimes let .timestamp()/
the C library apply local DST at the fire date. A frozen `datetime.now().astimezone()`
offset baked in whatever offset was in effect at compute time and misfired across a DST
boundary. An unknown IANA name falls back to local (None) rather than raising."""
if not name or name.lower() == "local":
return datetime.now().astimezone().tzinfo
return None
try:
return ZoneInfo(name)
except Exception:
return datetime.now().astimezone().tzinfo
return None


def _epoch_now() -> float:
Expand Down
Loading