fixing/merge-conflict - #1
Open
Pavitra-programmers wants to merge 4446 commits into
Open
Conversation
* fix(mcp): tolerate Slack-style OAuth MCP providers end to end
Slack's MCP server (mcp.slack.com) broke org connectors: its token endpoint
returns errors as HTTP 200 {"ok":false,...} with token_type "user", and its
/mcp endpoint rejects newer initialize protocol versions with HTTP 400 instead
of negotiating down. Our conformance-hardened client surfaced all of it as
generic, retryable:false failures with no provider detail.
- enterprise-mcp-client: token-response compat layer (maps ok:false bodies to
typed OAuth errors carrying the provider's real error string; normalizes
token_type to Bearer), one-shot initialize retry with protocol version
2025-06-18 on HTTP 400, bounded redacted response-body excerpts in
diagnostics
- sdk patch: additive ClientOptions.protocolVersion (cjs/esm/d.ts)
- den-api: provider detail (untrusted, redacted, bounded) surfaces in
connection diagnostics; StreamableHTTPError and OAuth error names allowlisted;
slack preset gains pinned issuer + least-privilege default scopes applied at
connection create/update when the admin specifies none
- enterprise-mcp-mock-server: slack-user-mcp profile with tokenResponseStyle
slack-user and versionNegotiation strict knobs (defaults preserve existing
behavior)
- evals: slack-style-mcp-connector.slow.test.ts proves connect-through-fallback,
provider error string in Den diagnostics, and standard-path regression guard
* fix(mcp): redact credential-shaped content inside provider excerpt values
Warden K5E-PRZ: key-based redaction let OAuth codes/secrets echoed in
free-text fields (e.g. error_description) reach member-facing diagnostics.
Redact sensitive key=value pairs, JWT/Slack/Bearer/GitHub token shapes, and
40+-char opaque runs inside all string values in both excerpt helpers;
provider error strings like invalid_refresh_token survive.
* fix(den-web): verify MCP connection before closing popup * fix(den): start oauth for public mcp endpoints
Co-authored-by: benjaminshafii <11430621+benjaminshafii@users.noreply.github.com>
* fix(den-web): contain and dismiss workspace switcher * fix(den-web): preserve workspace switcher interactions
…3603) The better-auth 1.6.11 -> 1.7.0-beta upgrade (#3584, #3588) shipped without the oauth-provider plugin's new schema. The drizzle adapter now throws 'The field "dpopBoundAccessTokens" does not exist in the "oauthClient" Drizzle schema' before any SQL runs, so every dynamic client registration (POST /api/auth/oauth2/register) returns a bare 500 with an empty body and third-party MCP clients (opencode, etc.) cannot authenticate. First-party clients were unaffected because /v1/mcp/token bypasses the plugin. Adds the missing columns (oauthClient client-metadata fields, access/refresh token issuance fields, consent resources) and the new oauthResource, oauthClientResource, and oauthClientAssertion tables, with migration 0056_oauth_provider_17_schema_sync. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Anything that exercises OpenWork without a UI — a load check, an automation harness, an agent-quality benchmark — has to re-implement the same sequence by hand: create a session, submit prompt_async, poll /session/status, poll messages, work out when the turn actually finished, then dig text back out of message parts. evals/flows/windows-workspace-session-performance.flow.mjs is one such copy. @openwork/headless-threads is that sequence, typed and tested once. The subtle part it now owns: a thread still reads idle in the gap between accepting a prompt and starting work, so waiting for "not busy" reports a turn finished before it began. Settling requires a non-running status and an assistant message that was not there when the turn was submitted. This is a client, not a runtime. No new chat engine, session store, model gateway, or server route — every call goes to a session surface the OpenWork server already serves, and turns go through the same workspace OpenCode mount the desktop app prompts through. A headless thread is an ordinary session with an ordinary native id, so it lists and opens in the app like any other. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* fix(ci): unbreak Den DB Migrate against pscale CLI v0.311+ pscale v0.311.0 (2026-08-05) changed `branch show --format json` output and exit codes, so the safe-migrations state read exits 2 and the workflow hard-fails before applying any DDL — which left migration 0056 unapplied while the code that needs it deployed (MCP outage on 2026-08-07). Pin the CLI to v0.310.0 (last green run), accept both JSON shapes in the state read, and fall back to attempting the disable toggle when the state cannot be read — the consecutive DDL probes below remain the real gate. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test(den-db): teach schema parity replay about 0056's seeded-table columns The better-auth tables predate the migration chain, so the parity test seeds them from the current schema export before replaying migrations. 0056 is the first migration to ALTER those seeded tables, which made the replay hit duplicate-column errors. Generalize the existing worker strip into a per-table column map covering the 0056 additions. Verified locally: all 5 tests in migration-schema-parity.test.ts pass against MySQL 8 with the strips in place. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci(den-db-migrate): also trigger on changes to the workflow itself A migrate run that fails on workflow bugs (like the pscale CLI pin fixed here) leaves pending migrations unapplied, and a workflow-only repair PR does not touch drizzle/** so the push trigger never re-fires. Trigger on the workflow file too so merging the repair re-applies pending migrations immediately; the run is idempotent via the drizzle journal. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ry (#3607) better-auth 1.7 validates every token-request `resource` parameter against the new oauthResource registry; validAudiences no longer whitelists issuance. With the registry empty, third-party MCP clients now fail the authorization-code exchange with invalid_target "requested resource https://api.openworklabs.com/mcp/agent is not configured" (reproduced end to end with opencode against prod after migration 0056 unblocked dynamic client registration). Pass the full accepted alias set (DEN_MCP_RESOURCES) as the oauthProvider `resources` option so the plugin seeds the registry idempotently at startup, restoring pre-1.7 acceptance behavior. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
… resource ACL (#3608) Two follow-ups to the 1.7 resource registry seed (#3607): 1. generateId returned false for the new oauth-provider models, so the drizzle adapter emitted `insert ... values (default, ...)` for oauthResource seeds and MySQL rejected every attempt (no default on id) — a 500 storm on all better-auth endpoints including discovery (DEN-API-1G/1H). Generate UUIDs for the three new models. 2. enforcePerClientResources defaults to true in 1.7, which would invalid_target every dynamically registered client (they never request resources at registration, so they hold no oauthClientResource links). Pin it to false to keep pre-1.7 behavior: registry + audience validation without a per-client ACL. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: OpenWork Release Bot <release-bot@users.noreply.github.com>
…xists (#3621) * fix(server): materialize cloud providers before the first workspace exists Cloud provider sync threw workspace_missing when a Den session landed before any workspace was created (fresh sign-in on a clean profile). Materialize providers and credentials globally right away and defer the engine runtime-config write + reload until the first workspace appears. Also drop the stale sharp .d.ts path mapping in den-api's tsconfig: it pointed at a path removed in sharp 0.35, which crashed tsx-run Den API boots that resolve tsconfig paths at runtime. Adds a server regression test and an app-driving testkit spec that signs in before any workspace exists, proves sync succeeds, then creates the first workspace and proves the managed model is selectable without a restart. * fix(evals): trust rotated Daytona preview origins in the Den eval stack Daytona now mints a fresh preview hostname on every preview-url call, so origins baked into DEN_BETTER_AUTH_TRUSTED_ORIGINS at boot go stale immediately and the testkit's Den seed proof fails with INVALID_ORIGIN. Trust the preview proxy domain by wildcard; local hosts are unaffected. * fix(deps): pin esbuild to 0.25.12 — 0.28.x breaks vite dev on fresh installs esbuild 0.28.1 (pinned repo-wide in #3588) refuses to lower plain destructuring for browser-name target lists, which are exactly Vite's optimizeDeps defaults — so every fresh install since the pin boots a dev server that dies with ~3000 esbuild errors and a blank renderer. Stale node_modules kept older 0.25.x binaries, which is why local checkouts still worked while every Daytona sandbox failed its Vite prewarm gate. 0.25.12 keeps the >=0.25.0 dev-server CORS fix that motivated the pin. * test(evals): deliver the Den session via the host API before the first workspace On the welcome route with zero workspaces the renderer never pushes its Den session to the local server, so the spec now performs the same PUT /den-session the desktop runtime does and asserts the sync run directly: pre-fix it returns failed/workspace_missing, post-fix applied|noop. * test(evals): steer to the first workspace without reloading the renderer location.reload() detached the CDP session and every later evaluate timed out. The server already emits onWorkspacesChanged, so re-navigate to the session route in a bounded loop until the composer appears. * test(evals): create the first workspace through the product, not the API An API-seeded workspace is a state the product never produces (no engine, no model catalog) and the session route never becomes the task UI. After sign-in the paved createAndSelectWorkspace path drives organization onboarding and the app's own workspace.create action.
* fix(chat): add assistant copy context menu * test(evals): support attached copy menu validation * test(evals): reload attached app provider state * test(evals): drive composer through user surface * test(evals): enter composer text through editor * test(evals): use trusted composer input * test(evals): use trusted assistant right click * test(evals): wait for new task readiness
) * feat(app): sequential queued follow-ups, compact model picker, denser sidebar Queued prompts were merged into one send; drain them one turn at a time, reorder/edit in the queue panel, and use a single stop icon while busy. Compact the model picker and tighten sidebar rhythm so labels line up with the icon column. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(app): arm queue busy-wait before drain send; prove sequential drain - Arm awaitingQueueBusyRef BEFORE the drain send resolves and disarm it on blocked/cancelled/failed sends: the engine's busy status can render before the send continuation runs, and arming late erased that observation and wedged the remaining queue (second item never drained). - Ground the busy-wait reset in liveStatus only: the client-side sending pulse could release the wait before the engine went busy and steer the next item into the still-starting turn. - Fix PR-introduced typecheck errors: import ComposerPart and narrow the paste part in session-surface buildDraft; drop the unsupported className prop from the compact model picker's Command root (origin/dev typechecks clean, PR head had 3 errors). - Add evals/specs/composer-queued-follow-ups-sequential.slow.test.ts: deterministic gated mock provider proves busy shows one round Stop control, Enter queues FIFO while busy, idle drains exactly one item per turn, and the final transcript is three separate user turns in FIFO order with no merged message (engine snapshot + provider requests + DOM). * test(evals): claim sequential-drain screenshots with vision expectations --------- Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(evals): clear slow sweep failures * test(evals): align slow specs with current contracts * fix(automations): trust rotated Daytona runner origins * test(evals): exercise shipped automation contracts * test(evals): await scheduled script receipt * fix(evals): retain Daytona preview origin trust * Revert "fix(evals): retain Daytona preview origin trust" This reverts commit 988fd44. * fix(den-web): preserve Daytona forwarded origin * test(evals): schedule after Daytona startup * test(evals): match shipped automation status label * test(evals): open the shipped automation receipt * test(evals): assert shipped inactive schedule state * test(evals): align automation lifecycle labels * test(evals): match rendered receipt heading * test(evals): align automation receipt schema * test(evals): respect unattended script boundary * test(evals): use OAuth mock for local managed MCP * test(evals): fix picker row selection and runs-list screenshot race * test(evals): expand collapsed provider group and match uppercase runs header * test(evals): make replacement model selection resilient and self-explaining * test(evals): click the automation picker's native button row * test(evals): stabilize receipt read and keep sidebar tail in frame * test(evals): recover the receipt from list, detail, or thread focus * test(evals): retry Daytona CLI transport failures in checkedExec
* ci: run matching slow specs on PRs * ci: isolate slow proof from Warden secrets * ci: gate PR slow specs on Warden clearance * ci: run newly added slow specs on PRs
* ci: accelerate release builds * ci: run benchmark jobs after skipped production resolver * ci: remove redundant release installs * ci: sign Windows releases in parallel * ci: collapse serial release publishing * test: cover parallel Windows release signing
* fix(ci): restore npm trusted publishing * fix(ci): isolate npm publish credentials
* fix(den): bound GitHub token minting * test(den): default empty retry witness env * test(den): isolate GitHub retry classifier
* fix(desktop): recover rejected automation credentials * test(evals): publish automation auth evidence * fix(evals): use current assertion evidence API
* test(evals): prove OpenCode MCP OAuth flow * fix(ci): install OpenCode before Daytona auth * ci(evals): install opencode CLI without lifecycle scripts before Daytona credentials
* feat(app): replace Library Add menu with kind-picker radio rows The Add dropdown boxed six actions as menu items. Open a picker that matches the Paper add-flow: radio rows, fill-only selection, then Continue into the existing create dialog. Soften Just me / Everyone on that form the same way. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(app): drop stacked borders on Library create fields Name, description, and prompt inputs stacked a hairline with a drop shadow or inset ring, so they read as a thick frame in the app. Use a fill well only, matching the Paper form. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(app): keep Library picker selection stable --------- Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ci): use supported runner for npm OIDC * fix(evals): use current evidence recorder API
Co-authored-by: Benjamin Shafii <benjamin.shafii@gmail.com>
* fix(mcp): close unused agent sse listener * fix(mcp): preserve agent get auth challenge * fix(mcp): close agent get probe compatibly
* fix(desktop): reduce automation runner polling * test(evals): update automation runner polling assertions
* feat(den): add skill-created MCP app * fix(den): package MCP app in Docker image
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Why
Issue
Scope
Out of scope
Testing
Ran
...Result
CI status
Manual verification
Evidence
N/A (docs-only)Risk
Rollback