Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
4471 commits
Select commit Hold shift + click to select a range
5013ebb
chore(aur): update PKGBUILD for 0.18.18 (#3617)
benjaminshafii Aug 7, 2026
103f00e
fix(server): materialize cloud providers before the first workspace e…
benjaminshafii Aug 7, 2026
79d7544
fix(release): route command through release scripts (#3622)
benjaminshafii Aug 7, 2026
a2beee4
fix(chat): add assistant copy context menu (#3615)
benjaminshafii Aug 7, 2026
42042c5
test(evals): preserve Electron readiness logs (#3618)
benjaminshafii Aug 7, 2026
6ec315f
chore(aur): update PKGBUILD for 0.18.18 (#3623)
benjaminshafii Aug 7, 2026
2ff1f2c
fix(den): avoid marketplace seed lock on reads (#3620)
OmarMcAdam Aug 7, 2026
cd8b900
fix(evals): bootstrap the isolated Den instead of pushing its schema …
reachjalil Aug 7, 2026
ed1b6ad
feat(landing): V5 redesign — Cowork parity table, Connect & Cloud pag…
benjaminshafii Aug 8, 2026
71bc6e7
feat(gmail): expose Bcc header on message read paths (#3630)
benjaminshafii Aug 8, 2026
5294cfe
feat(app): streamline gateway boot (#3631)
benjaminshafii Aug 9, 2026
46344cd
fix(app): reduce mobile layout shifts on gateway web (#3632)
benjaminshafii Aug 9, 2026
948aff2
feat(automations): ship Automations out of preview (#3635)
benjaminshafii Aug 9, 2026
28582f3
feat(app): autosave markdown artifacts and add right-click formatting…
benjaminshafii Aug 9, 2026
316d364
fix(server): never dispose a live engine from provider sync (#3634)
benjaminshafii Aug 9, 2026
195f8e0
fix(attachments): prevent gateway upload hangs (#3637)
benjaminshafii Aug 9, 2026
72e01d9
fix(den-api): clamp config object projections to fit MySQL TEXT colum…
benjaminshafii Aug 9, 2026
539607d
fix(automations): resolve chat proposal models into Den's provider na…
benjaminshafii Aug 9, 2026
fc8b43b
chore(agents): strict test-scenario protocol for orchestrator, trim e…
benjaminshafii Aug 9, 2026
5542292
Codemode scripts: confined multi-tool scripts on Den, savable and reu…
benjaminshafii Aug 10, 2026
4984e60
fix(ci): confirm safe migrations from the toggle response, not `branc…
benjaminshafii Aug 10, 2026
2db84f3
fix(deps): patch high-severity Dependabot alerts (nanoid, js-yaml, do…
benjaminshafii Aug 10, 2026
1755085
feat(mcp): add OpenWork-managed local OAuth gateway (#3652)
reachjalil Aug 10, 2026
6d80c36
fix(desktop): mirror undici so the packaged embedded server boots (#3…
benjaminshafii Aug 10, 2026
a6f9202
fix(app): defer edit-resend revert to send time with rollback and res…
benjaminshafii Aug 10, 2026
9ffa25a
fix(app): summarize and clamp HTML error pages in chat errors (#3661)
benjaminshafii Aug 10, 2026
f2aa33c
fix(labs): expose handshakes() on the mock MCP handle (#3662)
benjaminshafii Aug 10, 2026
2889d1d
Unstick the invite sign-in step (#3649)
benjaminshafii Aug 10, 2026
5307148
fix(deps): patch Babel packages (#3655)
OmarMcAdam Aug 10, 2026
3905283
fix(den): index connector sync event status lookup (#3624)
OmarMcAdam Aug 10, 2026
090af7a
fix(mcp): skip empty managed vault writes (#3676)
reachjalil Aug 10, 2026
73233a9
perf(automations): stop idle runner database heartbeats (#3675)
reachjalil Aug 10, 2026
8eebd3f
perf(den): batch connector sync target checks (#3674)
reachjalil Aug 10, 2026
8bb790b
fix(den-api): type batched connector-target ids as branded ids (#3677)
benjaminshafii Aug 10, 2026
97cfd0d
feat: save Code Mode scripts and automate validated results (#3656)
reachjalil Aug 10, 2026
ebe795c
feat: add durable Dynamic Artifact lifecycle for saved Scripts (#3658)
reachjalil Aug 10, 2026
a5b4381
Add Den Redis session cache (#3679)
OmarMcAdam Aug 10, 2026
f23b24f
Allow trusted internal Redis without TLS (#3680)
OmarMcAdam Aug 10, 2026
4f60f3f
feat(release): release:rollback stop-the-bleed script + post-publish …
benjaminshafii Aug 11, 2026
45b6433
ci: clean-revert fast lane — machine-verified auto-approval for exact…
benjaminshafii Aug 11, 2026
ade1d3d
docs+ci: emergency-change policy + tag-first release audit trail (#3666)
benjaminshafii Aug 11, 2026
fcb88af
fix(den-api): invalidate the org members cache when a membership is c…
benjaminshafii Aug 11, 2026
504feb4
Revert "fix(chat): add assistant copy context menu (#3615)" (#3682)
benjaminshafii Aug 11, 2026
bf9ccf5
chore: bump version to 0.18.19 (#3683)
benjaminshafii Aug 11, 2026
81b254e
fix(codemode): put native providers in the script tree and stop the u…
benjaminshafii Aug 11, 2026
6392eb0
One capability set, three verbs: collapse search/execute/script onto …
benjaminshafii Aug 11, 2026
9f0ac67
fix(app): surface failed automatic session titles (#3685)
reachjalil Aug 11, 2026
cb8ba50
fix(app): recover gracefully from interrupted sessions (#3686)
reachjalil Aug 11, 2026
1520438
feat(evals): org-lifecycle, self-host onboarding, and semi-airgapped …
benjaminshafii Aug 11, 2026
93dda74
Strengthen signup password validation (#3669)
OmarMcAdam Aug 11, 2026
180212e
fix(den-api): add nosniff security header (#3690)
OmarMcAdam Aug 11, 2026
87c1bb6
Pause Automations when their model becomes unavailable (#3688)
reachjalil Aug 11, 2026
6864d2c
fix(den-api): add hsts security header (#3691)
OmarMcAdam Aug 11, 2026
309ee00
fix(server,desktop,app): harden managed engine lifecycle tracking (#3…
reachjalil Aug 11, 2026
2ccf389
fix(app): preserve response text selection (#3694)
reachjalil Aug 11, 2026
9a83e36
fix(server): stop runtime-store reads from creating the runtime DB (#…
reachjalil Aug 11, 2026
d222126
fix(den): strip internal response headers (#3695)
OmarMcAdam Aug 11, 2026
bf689df
fix(observability): reduce sentry span volume (#3699)
OmarMcAdam Aug 11, 2026
29ed19e
feat(desktop): add reliable version recovery (#3697)
benjaminshafii Aug 11, 2026
a973f4a
feat(server): keep live sessions running through engine rollover (#3696)
reachjalil Aug 11, 2026
6b127f6
fix(app): keep session header actions right-aligned (#3702)
reachjalil Aug 11, 2026
517c272
fix(app): keep interrupted-session errors compact (#3701)
reachjalil Aug 11, 2026
b845491
fix(app,server): make org LLM provider sync reach desktops — four lay…
benjaminshafii Aug 11, 2026
5110b2f
Add MCP Apps provider foundation for Dynamic Artifacts (#3689)
reachjalil Aug 12, 2026
8362ddd
chore(release): v0.18.20 (#3710)
benjaminshafii Aug 12, 2026
7f5fd0f
fix(app): show assigned models before workspace creation (#3714)
reachjalil Aug 12, 2026
300f152
fix(app): hydrate assigned models without workspace (#3717)
reachjalil Aug 12, 2026
9cf771d
ci: sign Windows releases with Azure (#3719)
OmarMcAdam Aug 12, 2026
3615417
fix(app): clear cloud providers on logout (#3720)
reachjalil Aug 12, 2026
26ab243
fix(app): show truthful model sync status (#3718)
reachjalil Aug 12, 2026
8b502a4
ci: pin Azure signing actions (#3721)
OmarMcAdam Aug 12, 2026
aa98c4b
feat(evals): pnpm evals CLI, repo-wide fast gate, spec briefs, Dayton…
benjaminshafii Aug 12, 2026
361dbd6
fix(evals): match SHA-pinned Azure signing action in windows spec (#3…
benjaminshafii Aug 12, 2026
f81e4ce
fix(app): keep failed local MCP setup visible (#3725)
reachjalil Aug 12, 2026
2d83760
fix(app): separate workspace MCPs from OpenWork Connect (#3728)
reachjalil Aug 12, 2026
d927056
Clear stale provider models after logout (#3723)
reachjalil Aug 12, 2026
396a6e3
chore: bump version to 0.18.21 (#3731)
reachjalil Aug 12, 2026
ee2fbf7
ci: allow Azure signing config from secrets (#3733)
OmarMcAdam Aug 12, 2026
de02b0d
fix(server): reclaim cloud provider env ownership (#3735)
reachjalil Aug 12, 2026
e6bc968
chore(release): v0.18.22 (#3736)
reachjalil Aug 12, 2026
0459764
fix(server): stabilize local MCP OAuth start (#3740)
reachjalil Aug 12, 2026
db8bb21
fix(den-api): rank capability results by relevance (#3737)
reachjalil Aug 12, 2026
159af2b
fix(cloud): let desktop-initiated sign-ins choose the organization (#…
reachjalil Aug 12, 2026
3fe1478
feat: run web automations in OpenWork Cloud (#3716)
reachjalil Aug 12, 2026
62aec5d
feat(artifacts): serve immutable agent-generated MCP App views (#3715)
reachjalil Aug 12, 2026
4422823
Host standard MCP Apps inline in desktop conversations (#3700)
reachjalil Aug 12, 2026
46a6b87
chore: bump version to 0.18.23 (#3738)
OmarMcAdam Aug 12, 2026
2d22b95
fix(app): keep desktop session and route state through local server r…
reachjalil Aug 12, 2026
48ef320
fix(desktop): package MCP validation dependencies (#3742)
reachjalil Aug 12, 2026
9271c76
fix(desktop): package MCP validation runtime (#3743)
reachjalil Aug 12, 2026
0306526
fix(desktop): package complete MCP runtime (#3744)
reachjalil Aug 12, 2026
6610c22
fix(automations): bind runner tokens to public proxy (#3746)
reachjalil Aug 12, 2026
20aa5bf
fix(artifacts): isolate generated view handshake (#3748)
reachjalil Aug 12, 2026
51902a9
fix(artifacts): complete stable MCP Apps interoperability (#3749)
reachjalil Aug 12, 2026
286d05d
fix(dev): reliable headless web with same-origin Den sign-in (#3732)
benjaminshafii Aug 13, 2026
476bb5c
fix(artifacts): expose MCP App handshake diagnostics (#3754)
reachjalil Aug 13, 2026
a19e8fb
fix(dev): run headless server from source (#3752)
benjaminshafii Aug 13, 2026
cc9883d
fix(server): preserve live sessions across workspace switches (#3755)
reachjalil Aug 13, 2026
f0801b4
feat(den-web): reorganize the org sidebar into Work, Manage, Observab…
benjaminshafii Aug 13, 2026
4ed88da
Fix generated Artifact MCP App discovery and initialization (#3760)
reachjalil Aug 13, 2026
84debb7
feat(analytics): org model-usage analytics — ledger fields, telemetry…
benjaminshafii Aug 13, 2026
fa246ee
fix(automations): bind runner credentials to the Den Web proxy origin…
reachjalil Aug 13, 2026
670d1ff
feat(app): make the web session usable on phones and tablets (#3773)
benjaminshafii Aug 13, 2026
15410cb
fix(app): keep workspace New task plus clickable over long names (#3772)
reachjalil Aug 13, 2026
3961fb4
feat(den-web): download the app on join success instead of routing to…
benjaminshafii Aug 13, 2026
052d05d
fix(app): show one wait indicator on gateway boot (#3774)
benjaminshafii Aug 13, 2026
dc8d5f9
feat(den-api): temporary file slots with upload URLs for URL-acceptin…
reachjalil Aug 13, 2026
3a53087
feat(app): fold the welcome server-URL door into the join-organizatio…
benjaminshafii Aug 13, 2026
1628f3e
feat(den-web): member dashboard downloads the detected-OS installer (…
benjaminshafii Aug 13, 2026
956122a
fix(automations): allow reverting to an earlier revision (#3776)
reachjalil Aug 13, 2026
103e066
feat(desktop): the three build flavors own sign-in policy — drop the …
benjaminshafii Aug 13, 2026
1e71632
Revert "feat(den-api): temporary file slots with upload URLs for URL-…
benjaminshafii Aug 13, 2026
80bfe49
feat(programs): keep Code Mode Programs inside Plugins (#3759)
reachjalil Aug 13, 2026
c95b067
feat(mcp): render standard MCP Apps through Connect (#3758)
reachjalil Aug 14, 2026
8899e0f
feat(mcp): install external MCP Apps through Connect (#3782)
reachjalil Aug 14, 2026
996fee7
feat(den-web): confirm the app is running as its own install step (#3…
benjaminshafii Aug 14, 2026
911dc80
feat(desktop): add blank-slate test profiles (#3783)
benjaminshafii Aug 14, 2026
ebdc180
chore: update nanoid to 3.3.18 (#3786)
OmarMcAdam Aug 14, 2026
acd8e33
Fix packaged MCP App sandbox origin (#3791)
reachjalil Aug 14, 2026
6a3174b
chore(den-web): remove hero title badges from dashboard pages (#3792)
benjaminshafii Aug 14, 2026
6f8d722
feat(desktop): add signed-in sentry telemetry (#3789)
OmarMcAdam Aug 14, 2026
c020fc9
fix(den-api): enforce password policy (#3794)
OmarMcAdam Aug 14, 2026
c084d9b
fix(desktop): give the macOS sidebar toggle more room from the window…
OmarMcAdam Aug 14, 2026
08fb6af
fix(den-gateway): allow pruned image patches (#3796)
OmarMcAdam Aug 14, 2026
2633397
fix(den-api): bound cloud wake/provision with a hard deadline (#3799)
benjaminshafii Aug 15, 2026
12c561a
feat(app): enterprise gate becomes a sign-in door with a server field…
benjaminshafii Aug 15, 2026
56cfee2
feat(ci): prune old Daytona dev snapshots after each publish (#3802)
benjaminshafii Aug 15, 2026
9084d32
feat(enterprise): workspace-address onboarding — token-free /install …
benjaminshafii Aug 15, 2026
607d20c
ci(daytona): redeploy den-api only when the snapshot pin moves (#3803)
benjaminshafii Aug 15, 2026
368aa23
fix(den-gateway): pool upstream connections and retry connect-phase f…
benjaminshafii Aug 15, 2026
7b76a2b
test(evals): cover degraded networks and enterprise TLS (#3797)
benjaminshafii Aug 15, 2026
73ebae7
fix(mcp): recover managed-MCP vault when OS secure storage changes (#…
benjaminshafii Aug 15, 2026
18eeeda
ci(daytona): move the dev snapshot pin to the nightly run and protect…
benjaminshafii Aug 15, 2026
0e0e135
fix(den-api): pool sandbox preview fetches and cool down failed mater…
benjaminshafii Aug 15, 2026
83a982d
fix(server): self-heal a dead managed engine and prevent dispose orph…
benjaminshafii Aug 15, 2026
d936f11
feat(evals): Connect MCP connector claims in the mega journey + night…
benjaminshafii Aug 15, 2026
091b863
feat(release): commit-free tag-driven releases — pure GHA + GitHub Re…
benjaminshafii Aug 15, 2026
9a1b796
feat(ci): Slow Specs Sweep — every slow spec on Blacksmith via Dayton…
benjaminshafii Aug 15, 2026
9de4660
fix(ci): correct the Daytona CLI sha256 pin (truncated-download artif…
benjaminshafii Aug 16, 2026
b031d2a
fix(opencode): update session loop runtime (#3826)
benjaminshafii Aug 16, 2026
15ee4b4
fix(den-api): avoid MCP readiness row locks (#3830)
OmarMcAdam Aug 16, 2026
f2165fc
fix(den-api): avoid MCP read locks (#3831)
OmarMcAdam Aug 16, 2026
3ca4f3f
fix(desktop): log session abort sources (#3832)
OmarMcAdam Aug 16, 2026
0ab8e41
fix(den-api): recover automation runner identity conflicts (#3833)
OmarMcAdam Aug 16, 2026
3f7bb34
fix(server): handle managed engine loopback failures (#3834)
OmarMcAdam Aug 16, 2026
6a26047
fix(server): guard missing opencode base URL (#3835)
OmarMcAdam Aug 16, 2026
e2bf2c0
fix(den-api): log automation runner registration failures (#3836)
OmarMcAdam Aug 16, 2026
c0a9856
fix(den-api): tolerate runner touch failures (#3837)
OmarMcAdam Aug 16, 2026
98768a2
fix(server): handle inaccessible workspace paths (#3838)
OmarMcAdam Aug 16, 2026
02b030a
fix(server): tolerate closed stdout pipe (#3839)
OmarMcAdam Aug 16, 2026
818fd4c
fix(server): surface invalid skill frontmatter (#3840)
OmarMcAdam Aug 16, 2026
06a8c49
fix(desktop): ignore stdio EPIPE (#3841)
OmarMcAdam Aug 16, 2026
31cdc2e
fix(server): harden engine client, frontmatter, and workspace boot pa…
benjaminshafii Aug 16, 2026
57c71ee
rename(den): Marketplace becomes Collections across Den Web and deskt…
benjaminshafii Aug 16, 2026
33b8c96
fix(server): classify engine header timeouts (#3842)
OmarMcAdam Aug 16, 2026
5de9413
fix(server): log opencode proxy api errors (#3843)
OmarMcAdam Aug 16, 2026
e015724
fix(server): let malformed frontmatter throw again for visible skill …
benjaminshafii Aug 16, 2026
42d9db3
fix(server): handle opencode errors without responses (#3844)
OmarMcAdam Aug 16, 2026
5fa049c
fix(desktop): type stdio error handlers for the electron typecheck (#…
benjaminshafii Aug 16, 2026
7b5a649
ci: add openwork-tests-required merge gate for branch rulesets (#3847)
benjaminshafii Aug 16, 2026
34fbb70
perf(den-api): cache external MCP tool lists and bound capability sea…
benjaminshafii Aug 16, 2026
de7c298
test(evals): prove desktop survives intermittent Den connection loss …
benjaminshafii Aug 17, 2026
a3a08ba
docs: add Downloads page with live stable and alpha channels (#3850)
benjaminshafii Aug 17, 2026
9ce683d
fix(mcp): hide provider tools when MCP Apps are disabled (#3851)
reachjalil Aug 17, 2026
bb1bb86
fix(evals): pin the mega journey to the workspace OpenAI provider row…
benjaminshafii Aug 17, 2026
0ac7921
fix(mcp): surface managed MCP connect failures in the Library UI (#3852)
benjaminshafii Aug 17, 2026
5a842a2
fix: keep startup and provider sync from stalling or aborting live se…
benjaminshafii Aug 17, 2026
577e00d
feat(release): one-click release cuts — diff-warden creates the tag (…
benjaminshafii Aug 17, 2026
2b33b1a
docs: add v0.18.26 release notes (#3858)
benjaminshafii Aug 17, 2026
2521846
fix(release): sign Windows builds by default (#3859)
benjaminshafii Aug 17, 2026
9f44257
fix(den-web): keep the org switcher on screen when Settings expands (…
reachjalil Aug 17, 2026
9e8187b
fix(desktop): add app version to Sentry events (#3863)
OmarMcAdam Aug 17, 2026
cac3995
fix(scim): make Okta's SCIM client work end to end; prove SSO and SCI…
benjaminshafii Aug 17, 2026
dd239f9
docs: add public cloud deployment guides (#3865)
OmarMcAdam Aug 17, 2026
802906b
feat(den): bootstrap initial private admin (#3868)
OmarMcAdam Aug 17, 2026
f82d5f2
chore(agents): remove voiceover workflow (#3869)
benjaminshafii Aug 17, 2026
36e84e0
fix(evals): await complete mega model marker (#3864)
benjaminshafii Aug 17, 2026
21df4f5
test(server): keep MCP sync reconciliation local (#3871)
benjaminshafii Aug 17, 2026
ede4371
fix(evals): stabilize slow spec sweep (#3872)
benjaminshafii Aug 17, 2026
24572ee
Add the Den foundation for a private MCP App host (#3870)
reachjalil Aug 17, 2026
ecf5549
feat(app): unify Library with composer Connections (#3866)
benjaminshafii Aug 17, 2026
b3219ac
Move native MCP Apps into Desktop's private host (#3861)
reachjalil Aug 17, 2026
ea71cae
fix(den): stop routine reauth prompts (#3873)
benjaminshafii Aug 18, 2026
5e537ed
feat(admin): manage model usage and admins (#3874)
benjaminshafii Aug 18, 2026
503ac32
chore: remove the Telegram integration (#3877)
benjaminshafii Aug 18, 2026
c0249f0
fix(desktop): bound Windows workspace roots (#3883)
benjaminshafii Aug 18, 2026
79a0df0
fix(server): classify managed MCP handshake failures (#3884)
benjaminshafii Aug 18, 2026
2dd0909
fix(uploads): enforce safe filename boundaries (#3882)
benjaminshafii Aug 18, 2026
ebea430
fix(server): contain expected runtime failures (#3880)
benjaminshafii Aug 18, 2026
cf58a4c
test(evals): speed up the full slow-spec sweep (#3878)
benjaminshafii Aug 18, 2026
86fdc52
test(evals): prove Den providers through LiteLLM (#3890)
benjaminshafii Aug 18, 2026
a0d5260
ci(evals): add soft spec impact snapshot (#3889)
benjaminshafii Aug 18, 2026
7382fdb
fix(sso): configure Okta SAML callback and add setup docs (#3891)
OmarMcAdam Aug 18, 2026
7043a8c
fix(den): gate SSO on domain verification (#3892)
OmarMcAdam Aug 18, 2026
5cfb4fa
test(evals): run LiteLLM provider proof on Daytona (#3893)
benjaminshafii Aug 18, 2026
d1463ba
feat(app): sequential queue, compact model picker, denser sidebar (#3…
benjaminshafii Aug 18, 2026
50935ba
fix(evals): clear slow sweep failures (#3888)
benjaminshafii Aug 18, 2026
f033cc5
ci(evals): alert developers on slow test failures (#3896)
benjaminshafii Aug 18, 2026
9316abc
fix(evals): support queued composer follow-ups (#3898)
benjaminshafii Aug 18, 2026
4fb0a6c
test(evals): verify SSO before SCIM lifecycle (#3901)
benjaminshafii Aug 18, 2026
1453c1a
docs: add v0.18.27-v0.18.30 release notes (#3902)
benjaminshafii Aug 18, 2026
d51e766
ci: run matching slow specs on PRs (#3899)
benjaminshafii Aug 18, 2026
01cd244
ci: cut release workflow runtime by more than half (#3904)
benjaminshafii Aug 18, 2026
a9c304f
fix(den): enforce TypeIDs for linked accounts (#3906)
OmarMcAdam Aug 18, 2026
be1c132
fix(den): accept SAML replay reservation IDs (#3908)
OmarMcAdam Aug 19, 2026
0fdc85f
docs: clarify Okta SCIM live validation (#3909)
OmarMcAdam Aug 19, 2026
ab878c3
fix(desktop): bound workspace archive decompression (#3910)
benjaminshafii Aug 19, 2026
8db3984
refactor(evals): standardize E2E and evidence terminology (#3907)
benjaminshafii Aug 19, 2026
3015941
fix(ci): restore npm trusted publishing (#3911)
benjaminshafii Aug 19, 2026
07bbc6c
fix(desktop): back off failed automation reconnects (#3912)
benjaminshafii Aug 19, 2026
a6dc6a3
fix(server): bound cloud MCP health probes (#3913)
benjaminshafii Aug 19, 2026
c6cc113
fix(den): bound GitHub token minting (#3914)
benjaminshafii Aug 19, 2026
8602171
fix(ci): prepare npm package from recovery tags (#3916)
benjaminshafii Aug 19, 2026
466d0a1
fix(desktop): recover rejected automation credentials (#3921)
benjaminshafii Aug 19, 2026
b8b6f2b
test(evals): prove OpenCode MCP OAuth flow (#3919)
benjaminshafii Aug 19, 2026
35932c4
feat(app): Library Add kind picker (radio rows) (#3905)
benjaminshafii Aug 19, 2026
9fe1b9d
docs: add gcp deployment prompt template (#3923)
OmarMcAdam Aug 19, 2026
86e727e
fix(ci): use supported runner for npm OIDC (#3918)
benjaminshafii Aug 19, 2026
a11515f
Retire legacy MCP App surfaces (#3862)
reachjalil Aug 19, 2026
33b8d64
fix(mcp): close unused agent SSE listener (#3928)
OmarMcAdam Aug 19, 2026
6575801
fix(desktop): reduce automation runner polling (#3931)
OmarMcAdam Aug 19, 2026
29e76ce
fix(den-db): index slow auth queries (#3933)
OmarMcAdam Aug 19, 2026
dc561a5
fix(den-db): index connector target ordering (#3934)
OmarMcAdam Aug 19, 2026
6a4c46b
chore(den-api): log session refresh failures (#3935)
OmarMcAdam Aug 19, 2026
5963921
Add first-party skill-created MCP App (#3927)
benjaminshafii Aug 19, 2026
3573b50
fix(den): cache hot auth lookups (#3932)
OmarMcAdam Aug 19, 2026
01f94e4
fix(den): tolerate OAuth reconnect bursts (#3938)
benjaminshafii Aug 19, 2026
64b84a5
fix(den): preserve thrown HTTPException status on operational routes …
benjaminshafii Aug 19, 2026
65be5ac
fix(den): key OAuth token limits by client with failure budget (#3941)
benjaminshafii Aug 19, 2026
ff5d298
fix(mcp): tolerate newer protocol-version headers (#3944)
benjaminshafii Aug 19, 2026
2871390
fix(app): recover local server before managed MCP setup (#3936)
reachjalil Aug 20, 2026
301f6a3
fix(evals): honor explicit local-only placement (#3937)
reachjalil Aug 20, 2026
5bc8b48
fix(automations): recover desktop occurrences instead of missing them…
reachjalil Aug 20, 2026
221be74
feat(den): scope MCP token liveness to OAuth grants (#3946)
benjaminshafii Aug 20, 2026
1b7fe88
fix(app): bound managed MCP server recovery (#3949)
reachjalil Aug 20, 2026
53513ef
refactor(mcp): remove program selection tools (#3950)
benjaminshafii Aug 20, 2026
b290ff0
fix(automations): report Desktop outcomes and open their execution th…
reachjalil Aug 20, 2026
74549a4
feat(mcp): first-party MCP App cards for every Connect steering flow …
benjaminshafii Aug 20, 2026
b21b807
fix(ci): isolate Daytona regression concurrency (#3940)
benjaminshafii Aug 20, 2026
2a01148
fix(automations): open Desktop execution threads (#3951)
reachjalil Aug 20, 2026
77b80bd
feat(mcp): card needs_connection tool failures and steer into the pro…
benjaminshafii Aug 20, 2026
0bcccab
fix(desktop): keep server credentials coherent (#3954)
benjaminshafii Aug 20, 2026
6c78403
fix(mcp): render connection cards on failed calls (#3955)
benjaminshafii Aug 20, 2026
9b2820b
fix(evals): build MCP app before Daytona Den startup (#3956)
benjaminshafii Aug 20, 2026
171cf58
fix(mcp): keep apps outside collapsed work (#3957)
benjaminshafii Aug 20, 2026
3b9dccd
ci: limit alpha releases to app changes (#3958)
benjaminshafii Aug 20, 2026
edb7f78
refactor(den): rename Programs to Workflows (#3952)
benjaminshafii Aug 20, 2026
ae2b54c
docs: align vocabulary with product — MCP Gateway, Library, connector…
benjaminshafii Aug 20, 2026
8cfade4
docs(roadmap): mark Code Mode, live artifacts, MCP Apps, and OpenWork…
benjaminshafii Aug 20, 2026
71693de
fix(workflows): preserve resolved plugin wire type (#3963)
benjaminshafii Aug 20, 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
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
38 changes: 38 additions & 0 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Full Electron + Den dev environment for Daytona sandboxes.
#
# Clones the repo from GitHub, installs deps, and provides
# Xvfb + noVNC so you can see/steer the real Electron app
# from your browser.

FROM node:20-bookworm

# System deps for Electron / Chromium + virtual display + utils
RUN apt-get update && apt-get install -y --no-install-recommends \
git unzip dbus dbus-x11 \
libgtk-3-0 libnotify-dev libnss3 libxss1 libasound2 \
libxtst6 libatk-bridge2.0-0 libdrm2 libgbm1 libxrandr2 \
libxcomposite1 libxdamage1 libxfixes3 libcups2 \
libpango-1.0-0 libcairo2 \
xvfb x11vnc novnc websockify fluxbox xterm \
default-mysql-client \
&& rm -rf /var/lib/apt/lists/*

# pnpm + bun
RUN corepack enable && corepack prepare pnpm@latest --activate
RUN npm install -g bun

# noVNC index
RUN ln -sf /usr/share/novnc/vnc.html /usr/share/novnc/index.html

ENV DISPLAY=:99
ENV ELECTRON_DISABLE_SANDBOX=1
ENV PNPM_HOME=/root/.local/share/pnpm
ENV PATH=$PNPM_HOME:$PATH

# Clone and install
ARG REPO_URL=https://github.com/different-ai/openwork.git
ARG BRANCH=dev
WORKDIR /workspace
RUN git clone --depth 1 --branch $BRANCH $REPO_URL . && pnpm install --frozen-lockfile || pnpm install

EXPOSE 3005 5173 6080 8788 9825
36 changes: 36 additions & 0 deletions .devcontainer/Dockerfile.daytona-server
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Daytona image for the OpenWork Den server stack.
#
# This intentionally does not run Docker inside Daytona. The sandbox runs the
# same services as packaging/docker/docker-compose.den-dev.yml directly:
# MySQL, Den API, Den Web, and the worker proxy.
FROM daytonaio/sandbox:0.6.0

USER root

RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
ca-certificates \
curl \
default-mysql-client \
default-mysql-server \
git \
procps \
sudo \
&& /usr/local/share/nvm/current/bin/npm install -g pnpm@10.27.0 bun \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /root/.cache /root/.npm /tmp/*

WORKDIR /workspace

RUN git clone --depth 1 --branch dev https://github.com/different-ai/openwork.git . \
&& mkdir -p /workspace/.openwork-daytona \
&& sha256sum /workspace/pnpm-lock.yaml | cut -d ' ' -f 1 > /workspace/.openwork-daytona/pnpm-lock.sha256 \
&& git gc --prune=now \
&& rm -rf /home/daytona/.cache /home/daytona/.npm /home/daytona/.local/share/pnpm/store \
/workspace/node_modules

RUN chown -R daytona:daytona /workspace \
&& printf 'daytona ALL=(ALL) NOPASSWD:ALL\n' >/etc/sudoers.d/daytona-openwork \
&& chmod 0440 /etc/sudoers.d/daytona-openwork

USER daytona
29 changes: 29 additions & 0 deletions .devcontainer/Dockerfile.daytona-vnc
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Daytona VNC/Computer Use image with OpenWork preinstalled.
#
# Use this for Electron/noVNC tests instead of the generic devcontainer image.
# The base image already contains the desktop stack Daytona expects:
# Xvfb, XFCE, x11vnc, noVNC, websockify, and dbus-x11.
FROM daytonaio/sandbox:0.6.0

USER root

RUN apt-get update \
&& apt-get install -y --no-install-recommends ffmpeg \
&& rm -rf /var/lib/apt/lists/*

RUN /usr/local/share/nvm/current/bin/npm install -g pnpm@10.27.0 bun

WORKDIR /workspace

RUN git clone --depth 1 --branch dev https://github.com/different-ai/openwork.git . \
&& mkdir -p /workspace/.openwork-daytona \
&& sha256sum /workspace/pnpm-lock.yaml | cut -d ' ' -f 1 > /workspace/.openwork-daytona/pnpm-lock.sha256 \
&& /usr/local/share/nvm/current/bin/npm cache clean --force \
&& git gc --prune=now \
&& rm -rf /root/.cache /root/.npm \
/home/daytona/.cache /home/daytona/.npm /home/daytona/.local/share/pnpm/store \
/workspace/node_modules /tmp/*

RUN chown -R daytona:daytona /workspace

USER daytona
159 changes: 159 additions & 0 deletions .devcontainer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
# Daytona / Dev Container Setup

Full-stack dev environment that runs the **real Electron app** + Den stack in a cloud sandbox. You see and steer the desktop app through your browser via noVNC.

## What's included

| Service | Port | Description |
|---------|------|-------------|
| **Desktop App (noVNC)** | 6080 | The real Electron app rendered in a virtual display, accessible in your browser |
| **Den Web** | 3005 | Admin dashboard for managing orgs, restrictions, providers |
| **Den API** | 8788 | Control plane API |
| **CDP Debug** | 9825 | Chrome DevTools Protocol — for app and browser automation |
| **Vite HMR** | 5173 | Hot module replacement for the React UI |
| **MySQL** | 3306 | Database (internal) |

## Quick start with Daytona Electron/noVNC

```bash
bash .devcontainer/create-daytona-openwork-snapshot.sh # one-time / refresh when deps change
bash .devcontainer/test-on-daytona.sh [branch-or-commit]
```

The test script creates a sandbox from the reusable `openwork-eval-vnc` snapshot
when present, checks out the target ref, skips `pnpm install` if the lockfile is
unchanged, starts XFCE/noVNC, Vite, and Electron, then prints the noVNC and CDP
URLs. If the snapshot is missing, it fails fast and tells you to create it. The
snapshot intentionally does not bake `node_modules`; installs use the reusable
`openwork-eval-pnpm-store` volume so the image stays under Daytona's 20 GB limit.

For provider evals, create/populate the reusable Daytona secrets volume once:

```bash
bash .devcontainer/setup-daytona-secrets-volume.sh .newtoken
bash .devcontainer/setup-daytona-secrets-volume.sh .anthropic anthropic.env
```

Future Daytona test sandboxes mount `openwork-eval-secrets:/daytona-secrets`
and source every `/daytona-secrets/*.env` file automatically before Electron
starts. Use this volume for provider keys and other eval-only secrets; never
commit those files into the repo.

For downloadable eval artifacts or optional video recording, use:

```bash
bash .devcontainer/test-on-daytona.sh [branch-or-commit] --artifacts-volume
bash .devcontainer/test-on-daytona.sh [branch-or-commit] --record-video
```

The artifacts flow mounts `openwork-eval-artifacts:/daytona-artifacts`, starts a
static download server on port 8090, and prints a Daytona preview URL. Recording
writes mp4 files to `/daytona-artifacts/recordings` and prints the direct video
URL. Screenshots write png files to `/daytona-artifacts/screenshots` for quick
AI/human validation checkpoints. Stop recording with
`.devcontainer/stop-daytona-recording.sh` so ffmpeg finalizes the file cleanly.

Do not use the generic `daytona create https://github.com/different-ai/openwork`
flow for Electron/noVNC tests. The default resource size is too small and the
generic image path does not guarantee the desktop stack we need.

## Quick start with Daytona server

```bash
bash .devcontainer/create-daytona-openwork-server-snapshot.sh # one-time / refresh when deps change
bash .devcontainer/test-server-on-daytona.sh [branch-or-commit]
```

The server helper creates a separate public Daytona sandbox for the Den stack:
MySQL, Den API, Den Web, and the worker proxy. It prints public preview URLs and
the exact Electron command to point a desktop sandbox at that server:

```bash
bash .devcontainer/test-on-daytona.sh [branch-or-commit] \
--den-base-url https://3005-...daytonaproxy... \
--den-api-base-url https://8788-...daytonaproxy...
```

This keeps the architecture simple: the server sandbox owns cloud auth, orgs,
policies, workers, and persistence; the Electron sandbox stays a real desktop
client and talks to the server through public Daytona preview URLs.

## How it works

1. `.devcontainer/Dockerfile.daytona-vnc` starts from `daytonaio/sandbox:0.6.0`,
which includes Daytona's expected desktop packages: Xvfb, XFCE, x11vnc,
noVNC, websockify, and dbus-x11.
2. `.devcontainer/create-daytona-openwork-snapshot.sh` bakes that image into
`openwork-eval-vnc` without `node_modules`.
3. `/opt/openwork-daytona/start-daytona-vnc.sh` starts Xvfb, XFCE, x11vnc, and
noVNC on display `:99`.
4. `test-on-daytona.sh` installs dependencies through the reusable
`openwork-eval-pnpm-store` volume when `node_modules` is missing or the
lockfile changed.
5. Vite serves the React UI on port 5173.
6. `/opt/openwork-daytona/start-daytona-electron.sh` sources optional secrets,
applies Daytona-safe Chromium flags, and starts Electron on display `:99`.
7. **CDP on port 9825** enables Chrome MCP and browser-tool automation.
8. Optional artifact capture mounts `/daytona-artifacts`, serves it on port 8090,
records display `:99` with ffmpeg when `--record-video` is passed, and can
capture screenshot checkpoints with `.devcontainer/capture-daytona-screenshot.sh`.

## Validation Evidence

Use three layers of evidence for Daytona UI work:

- **CDP assertions:** use browser tools against port 9825 to inspect text, URL,
state, and accessibility snapshots. This is the primary AI validation path.
- **Screenshots:** run `daytona exec "$SANDBOX" -- 'bash .devcontainer/capture-daytona-screenshot.sh'` after important states. These png files live in `/daytona-artifacts/screenshots`.
- **Recordings:** start with `--record-video --recording-name <name>` for flows
that need PR evidence. These mp4 files live in `/daytona-artifacts/recordings`.

Recordings prove the flow to humans. CDP assertions and screenshots give the AI
fast checkpoints to decide whether behavior is correct before reporting success.

## AI Skills

The Daytona toolbox is exposed to opencode through focused skills:

- `daytona-dev`: overview of the Daytona setup and when to use each piece.
- `daytona-cloud-server`: Den Web/API, worker proxy, marketplace, cloud auth, and org policy flows.
- `daytona-secrets-volume`: add and verify provider keys or eval-only secrets in `/daytona-secrets`.
- `daytona-electron-test`: run and drive the real Electron app through CDP/noVNC.
- `daytona-recording-artifacts`: screenshots, recordings, before/after videos, and PR evidence.
- `run-evals`: orchestrates evals and pulls in the relevant Daytona skill based on the flow.

## Testing the customization system

1. Open **Den Web** (port 3005) in a separate tab
2. Sign up → create org → Org Settings → UI Customization
3. Set overrides → Save
4. In the **Electron app** (noVNC on port 6080):
- Cloud → developer mode → base URL `http://localhost:3005`
- Sign in → Settings → see the desktop policy banner

## Architecture

```
Your Browser
├── :6080 noVNC ──▶ x11vnc ──▶ XFCE/Xvfb ──▶ Electron App
│ │
│ ├── CDP :9825 (automatable)
│ └── Vite HMR :5173
├── :3005 Den Web (Next.js)
└── :8788 Den API (Hono) ──▶ MySQL :3306
```

With a separate server sandbox, the Electron box uses Daytona preview URLs for
Den Web/API instead of `localhost`, while the server sandbox still keeps its
internal service graph local.

## Automation

The Electron app exposes CDP on port 9825. You can:

- Connect Playwright: `const browser = await chromium.connectOverCDP('ws://localhost:9825')`
- Connect Chrome MCP for AI agent testing
- Take screenshots, run UI tests, etc.
63 changes: 63 additions & 0 deletions .devcontainer/capture-daytona-screenshot.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#!/usr/bin/env bash
set -euo pipefail

# Capture a single Daytona Electron display frame as a PNG artifact. Screenshots
# are for quick AI/human validation; videos are still the durable PR evidence.

OUTPUT="/daytona-artifacts/screenshots/daytona-screenshot-$(date +%Y%m%d-%H%M%S).png"
SIZE="1920x1080"

while [ "$#" -gt 0 ]; do
case "$1" in
--output)
shift
OUTPUT="${1:?missing output path}"
;;
--size)
shift
SIZE="${1:?missing screenshot size}"
;;
--help|-h)
printf '%s\n' \
"Usage: capture-daytona-screenshot.sh [--output PATH] [--size WxH]" \
"" \
"Captures DISPLAY, defaulting to :99, and writes a PNG file."
exit 0
;;
--*)
echo "Unknown option: $1" >&2
exit 1
;;
*)
echo "Unexpected argument: $1" >&2
exit 1
;;
esac
shift
done

if ! command -v ffmpeg >/dev/null 2>&1; then
echo "ERROR: ffmpeg is required for Daytona screenshots." >&2
exit 1
fi

if [[ ! "$SIZE" =~ ^[0-9]+x[0-9]+$ ]]; then
echo "ERROR: screenshot size must use WxH format, for example 1920x1080" >&2
exit 1
fi

FINAL_OUTPUT="$OUTPUT"
CAPTURE_OUTPUT="$OUTPUT"
if [[ "$OUTPUT" = /daytona-artifacts/* ]]; then
CAPTURE_OUTPUT="/tmp/daytona-screenshot-$(basename "$OUTPUT")"
fi

mkdir -p "$(dirname "$CAPTURE_OUTPUT")"
ffmpeg -y -f x11grab -video_size "$SIZE" -i "${DISPLAY:-:99}" -frames:v 1 "$CAPTURE_OUTPUT" >/tmp/daytona-screenshot.log 2>&1

if [ "$CAPTURE_OUTPUT" != "$FINAL_OUTPUT" ]; then
mkdir -p "$(dirname "$FINAL_OUTPUT")"
cp "$CAPTURE_OUTPUT" "$FINAL_OUTPUT"
fi

echo "Screenshot saved: $FINAL_OUTPUT"
34 changes: 34 additions & 0 deletions .devcontainer/create-daytona-openwork-server-snapshot.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/usr/bin/env bash
set -euo pipefail

# Build/refresh the reusable Daytona snapshot used by Den server sandboxes.

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SNAPSHOT_NAME="${DAYTONA_SERVER_SNAPSHOT:-openwork-server}"
REGION="${DAYTONA_TARGET:-us}"

snapshot_id() {
daytona snapshot list -f json | node -e 'const name = process.argv[1]; let input = ""; process.stdin.on("data", (chunk) => input += chunk); process.stdin.on("end", () => { const snapshot = JSON.parse(input).find((item) => item.name === name); if (snapshot) process.stdout.write(snapshot.id || snapshot.name); });' "$1"
}

existing_snapshot_id="$(snapshot_id "$SNAPSHOT_NAME")"
if [ -n "$existing_snapshot_id" ]; then
echo "==> Deleting existing snapshot: $SNAPSHOT_NAME"
daytona snapshot delete "$existing_snapshot_id" >/dev/null <<< "y"
for _ in $(seq 1 60); do
if [ -z "$(snapshot_id "$SNAPSHOT_NAME")" ]; then
break
fi
sleep 5
done
fi

echo "==> Creating Daytona server snapshot: $SNAPSHOT_NAME"
daytona snapshot create "$SNAPSHOT_NAME" \
--dockerfile "$ROOT_DIR/.devcontainer/Dockerfile.daytona-server" \
--cpu 4 \
--memory 8 \
--disk 10 \
--region "$REGION"

echo "Snapshot ready: $SNAPSHOT_NAME"
33 changes: 33 additions & 0 deletions .devcontainer/create-daytona-openwork-snapshot.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/usr/bin/env bash
set -euo pipefail

# Build/refresh the reusable Daytona VNC snapshot used by eval sandboxes from
# the prebuilt GHCR image. The image is built by GitHub Actions on dev pushes.

SNAPSHOT_NAME="${DAYTONA_EVAL_SNAPSHOT:-openwork-eval-vnc}"
IMAGE="${DAYTONA_EVAL_IMAGE:-ghcr.io/different-ai/openwork-eval-vnc:dev}"
REGION="${DAYTONA_TARGET:-us}"

existing_snapshot_id="$(daytona snapshot list -f json | node -e 'const name = process.argv[1]; let input = ""; process.stdin.on("data", (chunk) => input += chunk); process.stdin.on("end", () => { const snapshot = JSON.parse(input).find((item) => item.name === name); if (snapshot) process.stdout.write(snapshot.id || snapshot.name); });' "$SNAPSHOT_NAME")"

if [ -n "$existing_snapshot_id" ]; then
echo "==> Deleting existing snapshot: $SNAPSHOT_NAME"
daytona snapshot delete "$existing_snapshot_id" >/dev/null <<< "y"
for _ in $(seq 1 60); do
if ! daytona snapshot list -f json | node -e 'const name = process.argv[1]; let input = ""; process.stdin.on("data", (chunk) => input += chunk); process.stdin.on("end", () => { const snapshot = JSON.parse(input).find((item) => item.name === name); process.exit(snapshot ? 1 : 0); });' "$SNAPSHOT_NAME"; then
sleep 5
else
break
fi
done
fi

echo "==> Creating Daytona eval snapshot: $SNAPSHOT_NAME"
daytona snapshot create "$SNAPSHOT_NAME" \
--image "$IMAGE" \
--cpu 4 \
--memory 8 \
--disk 10 \
--region "$REGION"

echo "Snapshot ready: $SNAPSHOT_NAME"
Loading