feat(app): default updateAutoDownload to true for new and unconfigured users#1663
Open
yashranaway wants to merge 2529 commits into
Open
feat(app): default updateAutoDownload to true for new and unconfigured users#1663yashranaway wants to merge 2529 commits into
yashranaway wants to merge 2529 commits into
Conversation
…t-ai#1446) * add pre-baked microsandbox image Bake openwork, openwork-server, and the pinned opencode binary into a single Docker image so micro-sandbox remote-connect smoke tests can boot quickly and be verified with curl and container health checks. * add Rust microsandbox example Add a standalone microsandbox SDK example that boots the OpenWork image, validates remote-connect endpoints, and streams sandbox logs so backend-only sandbox behavior can be exercised without Docker. * exclude Rust example build output Keep the standalone microsandbox example in git, but drop generated Cargo target artifacts so the branch only contains source, docs, and lockfile. * test * add microsandbox feature flag for sandbox creation Made-with: Cursor * refactor sandbox mode isolation Made-with: Cursor
* feat(i18n): add Spanish locale * chore(i18n): include Spanish in audit script * fix(i18n): retune Spanish locale for Spain * fix(i18n): update Spanish translations for clarity and consistency
* docs: add roadmap page to docs navigation * docs: move roadmap into top-level docs tab * roadmapp * roadmapppo
* feat(i18n): add Catalan locale Give Catalan speakers full UI coverage while keeping locale parity with the English source and existing locale audits. * fix(i18n): align Catalan product terminology Use the requested in-product terms for workspace, paquet, and sandbox while keeping the Catalan locale consistent around runtime, host, and deep link wording. * canvis de wording
…i#1465) * docs: rewrite intro with privacy-first positioning Lead with "privacy-first, open-source alternative to Claude Cowork" and cut the coding-agent framing. Reorganize the page into three scannable sections (Start / For teams / For developers), keep the existing self-host/orchestrator steps under a dedicated section below. * docs: regroup sidebar into outcome-based clusters Rename tabs "Cloud docs" → "Cloud" and "Cloud API" → "API" for shorter, clearer labels. Replace the generic "Desktop App" and "Tutorials" groups in Start here with two outcome-based clusters: "Connect your stack" (providers, MCPs, search) and "Do work with it" (browser, automations, skills, sharing). Reorganize the flat Cloud list into three clusters that map to real admin questions: "Share with your team" (templates, skill hubs, providers), "Run in the cloud" (shared workspaces, Slack), and "Manage access" (members & RBAC). Enterprise stays at the tail as a standalone contact-sales page. Slack moves from Start here to Cloud "Run in the cloud" since the Slack setup doc itself recommends pairing Slack with a remote workspace. * docs: surface changelog and roadmap on the intro Add a one-liner in the developers section pointing to the changelog and roadmap, and include both in the footer links. Developers evaluating the project want to see shipping velocity and direction. * docs(self-host): add dedicated self-host page with cloud/enterprise upsells Extract the openwork-orchestrator install steps out of the intro into a dedicated Self-host page. Keeps the intro short and gives self-hosters a direct, linkable entry point. The page includes two upsell paths: - Cloud, for readers who realize mid-read they don't want to run infra. Links into the team primitives (skill hubs, providers, RBAC, shared workspaces) that are hardest to replicate on your own box. - Enterprise, framed around concrete scale pressures (SSO, audit, allowlists, VPC, support) rather than a generic 'talk to sales' pitch. Links to the existing cloud-enterprise contact page. Add the page to the Start here tab as a top-level sibling of the intro so self-hosters find it immediately. * docs: move self-host below the outcome clusters Self-hosting is what people reach for after they've installed the desktop app and tried the basic flow, not before. Move it below "Connect your stack" and "Do work with it" so the sidebar reflects that progression. * docs: rename intro page title to "Introduction" "OpenWork" as a sidebar label is tautological — every page is about OpenWork. "Introduction" tells the reader what the page is, which is what a sidebar label is for. The in-page hero copy still carries the positioning. * docs: rewrite page titles as actions Sidebar labels should describe what the reader wants to do, not what the page is. Rename every page title to start with (or imply) a verb: - Introduction → Get started - How to connect ChatGPT to Openwork → Connect ChatGPT - How to get an Anthropic API key → Connect Anthropic - Adding a custom LLM provider/model → Connect a custom LLM - Adding a custom MCP → Add an MCP server - Enable Advanced Search with Exa → Enable Exa search - Controlling your browser with OpenWork → Control the browser - Automating Tasks → Automate tasks - Importing a skill → Import a skill - How to share your agents with others → Share your setup - Self-host OpenWork → Self-host - Missing Documentation? → Report missing docs Makes the sidebar scannable by intent: each label is a thing the reader is trying to accomplish. * docs: restore precision in provider titles "Connect X" flattened two different setup flows into one label. Readers scanning the sidebar need to know what they'll do before clicking: - Sign in with ChatGPT (OAuth, no key needed) - Add Anthropic API key (paste a secret from Anthropic) - Add a custom LLM (config, not auth) MCP and Exa labels already carry their own distinct verbs and are left unchanged. * docs: turn missing-docs into a question with two paths "Missing docs?" as a question invites the click. Inside, offer both the low-effort path (email us) and the contributor path (open a PR against the docs folder). Drops the "A message from the Openwork Developers" preamble, which was noise. * docs: reorganize into tab folders, rename files to match titles Mirrors the tab/group structure in docs.json so files are easier to locate. Filenames now track page titles (prefixes like how-to- and cloud- dropped since folders provide that context). Single-page groups stay flat at the tab root; roadmap and changelog remain at repo root as their own tabs. Cross-links in mdx files and docs.json redirects updated for the new paths. * docs: add roadmap/changelog folders, rename images, deprecate unused assets Moves roadmap.mdx and changelog.mdx into their own tab folders for consistency with the rest of the reorg, and removes the orphaned introduction.mdx. Renames CleanShot/Screenshot/image-* files to descriptive names based on content and updates the corresponding alt text. Unused images and a stray .mov land in images/deprecated/ rather than being deleted. docs.json gains /roadmap and /changelog redirects so old inbound URLs still resolve. * more clear get starter docs * docs: render get-started paths as Mintlify cards * no need to have the same title twice * edits * more concise
…ferent-ai#1466) The skill-destination modal shown when importing a shared skill rendered raw translation keys (e.g. 'share_skill_destination.add_to_workspace') for five strings in English and French. Those entries were stubbed with their own keys as values in a previous i18n cleanup and never replaced with real copy. Restore proper English copy (reusing the wording already present for the sibling '_desc' / 'confirm_button' / 'confirm_busy' keys that these hint/CTA keys supersede) and mirror it in French. Other locales already had real translations for these keys and are unaffected.
…-ai#1468) * feat(server-v2): add standalone runtime and SDK foundation * docs(server-v2): drop planning task checklists * build(server-v2): generate OpenAPI and SDK during dev * build(server-v2): generate API artifacts before builds * build(server-v2): drop duplicate root SDK generation * build(app): remove SDK generation hooks --------- Co-authored-by: src-opn <src-opn@users.noreply.github.com>
* chore(deps): pin opencode CLI and SDK to v1.4.9
- Bump constants.json opencodeVersion v1.2.27 -> v1.4.9 (CI source of
truth consumed by ci-tests, build-desktop, alpha/prerelease/release
workflows, and opencode-agents).
- Bump @opencode-ai/sdk across app, story-book, orchestrator,
opencode-router, server-v2, and refresh the lockfile so all workspaces
resolve to 1.4.9.
* refactor(app): adapt to @opencode-ai/sdk 1.4.9 type changes
- Move Model.reasoning reads to Model.capabilities.reasoning in
model-config.ts and model-behavior.ts (SDK flattened capabilities).
- Simplify utils/providers.ts to a pass-through; Provider now carries
source/options and Model.cost reshapes to {input, output, cache,
experimentalOver200K}, which the mapper no longer needs to translate.
- Cast session.todo() result to TodoItem[] (SDK Todo has no id).
- Update server-v2 test fixtures from 1.2.27 to 1.4.9.
Introduce a new /plugins route under the org dashboard that lists plugins (bundles of skills, hooks, MCP servers, agents, and commands) with a list view, per-plugin detail view, and tabbed cross-cutting views for all skills/hooks/MCPs. - Reuses existing dashboard primitives: DashboardPageTemplate, UnderlineTabs, DenInput, PaperMeshGradient cards. - Mirrors the skill-hubs list/detail patterns 1:1 for visual coherence. - Introduces @tanstack/react-query (scoped to the dashboard subtree) with a mock queryFn so the data layer can swap to a real API later with a one-line change. - Hidden by design: no sidebar nav entry. Reachable only via direct URL /o/<slug>/dashboard/plugins. Header title is mapped to 'Plugins' so navigating manually still feels coherent.
- Move packages/docs/changelog/changelog.mdx -> packages/docs/changelog.mdx - Move packages/docs/roadmap/roadmap.mdx -> packages/docs/roadmap.mdx - Update docs.json tab pages to reference flat paths - Replace old /changelog -> /changelog/changelog redirects with the inverse (/changelog/changelog -> /changelog and /roadmap/roadmap -> /roadmap) to preserve existing external links - Update intro footer links accordingly Canonical URLs become /docs/changelog and /docs/roadmap.
…ction (different-ai#1475) Introduce a new /integrations route under the org dashboard where users can simulate connecting GitHub or Bitbucket through a realistic OAuth- style wizard. The Plugins page now only shows its catalog once at least one integration is connected; connecting more providers unlocks more plugins. - Integrations list card per provider (GitHub, Bitbucket) with connect / disconnect actions, connected account chips, and repo pills. - Multi-step connect dialog: authorize -> select account -> select repos -> connecting -> connected. Dismissable, fully keyboard accessible, matches the existing OrgLimitDialog scrim/card frame. - Data layer uses TanStack Query mutations; connections live only in the React Query cache (in-memory, per user's request). Mutations invalidate both ['integrations', 'list'] and ['plugins'], so the Plugins page updates in place when you connect or disconnect. - plugin-data: each plugin now declares requiresProvider ('any' | 'github' | 'bitbucket'). The plugins queryFn reads the integration cache and filters accordingly; the catalog stays empty with zero connections. - plugins-screen: new 'Connect an integration' empty state with a CTA that deep-links to /integrations. - No sidebar entry added (hidden page per request). Header title is mapped to 'Integrations' so navigating manually still feels coherent. All data is mocked; the same hook surface (useIntegrations / useConnect Integration / useDisconnectIntegration / usePlugins) will back a real API with a one-line queryFn swap later.
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
…er doc (different-ai#1477) * docs: swap Ollama functional example for Infron LLM gateway Introduces the LLM gateway concept (single OpenAI-compatible endpoint, unified billing, fallbacks), replaces the Ollama walkthrough with an Infron config, and links out to Infron's signup + quickstart per their reciprocal doc in their OpenWork page. * docs: frame Infron as hosted gateway vs LiteLLM starting point Link to Infron's LiteLLM integration page as the canonical open-source gateway reference, and position Infron as the OpenRouter-style hosted gateway that sits on top: one key, unified billing, provider fallbacks. * docs: drop OpenRouter comparison, pitch Infron directly for dev ergonomics * docs: drop em dashes, loosen Infron pitch to devrel voice * docs: add Infron model picker + active session screenshots
…ai#1480) * security: harden release workflows against secret leakage Verify trusted refs before secret-bearing jobs, narrow secret scope, pin key actions, and remove the opencode agents workflow to reduce workflow attack surface. * security: drop third-party action pinning Keep the trusted ref gates and narrower secret exposure, but revert external GitHub Actions back to their tagged versions to avoid broad supply-chain hardening changes in this PR. * security: scope trusted release refs to dev Update the workflow trust gates to validate tags and manual refs only against origin/dev, matching this repository's actual protected branch layout. --------- Co-authored-by: src-opn <src-opn@users.noreply.github.com>
…erent-ai#1481) * docs: make start-here app-first Clarify the primary OpenWork CTA for new users, group self-hosting in one place, and add a missing languages page so localization contributions have a clear home. * docs: refine get started setup cards Add an enterprise card beside the cloud entrypoint and remove the self-hosting CTA from the get started page so the setup choices stay focused. * more clear initial cta * docs: clarify missing languages contribution path Reframe the page around the languages OpenWork already ships, then explain where to improve existing locale files and which files need updates to add a new language.
* docs: outline plugin architecture and connector design * feat(den-api): add plugin architecture admin and webhook foundation * refactor(den-api): rename plugin routes and split github connector env * fix(den-api): scope plugin connector records by organization --------- Co-authored-by: src-opn <src-opn@users.noreply.github.com>
* feat(den-api): add PATCH /v1/orgs/:orgId to rename organization - Owners can update the display name (2-120 chars) via a new PATCH route. - Slug stays immutable to keep dashboard URLs stable. - Adds updateOrganizationName helper in orgs.ts. * feat(den-web): rename organization from Members page - Adds an 'Organization' settings card above the Members tabs with inline rename for workspace owners. - Non-owners see a read-only summary explaining who can rename. - Wires a new updateOrganizationName mutation through OrgDashboardProvider that calls PATCH /v1/orgs/:orgId. * fix(den-api): tolerate missing apps/desktop/package.json in Docker build PR different-ai#1476 introduced a build step that reads apps/desktop/package.json to bake in a default latest-app-version, but packaging/docker/Dockerfile.den does not ship the Tauri desktop sources. As a result, the den-dev Docker stack fails to build after the PR landed. Gracefully fall back to 0.0.0 (matching the runtime default) when the file is absent, and allow a DEN_API_LATEST_APP_VERSION env override so deployers can still pin a real value. * docs(den-web): add rename organization screenshots Captured via Chrome MCP against packaging/docker/den-dev-up.sh: - before: Members page shows Organization card with Rename button. - editing: inline form with the current name pre-filled. - after: new name shown with success state, sidebar also updated. * refactor(den-web): extract DenCard primitive and drop drop shadows The dashboard has been inlining the same card style (rounded-[30px] + p-6 + shadow-[0_18px_48px_-34px_rgba(15,23,42,0.22)]) on every form surface. Per Den visual language we do not use drop shadows, so the repeated shadow class is both incorrect and a copy-paste risk. - Add ee/apps/den-web/app/(den)/_components/ui/card.tsx exporting DenCard with two size presets (comfortable + spacious). Shadows are explicitly omitted and the component is designed so they cannot be re-introduced via className (no tokens ever emit shadow utilities). - Replace all five inline cards in manage-members-screen.tsx with DenCard. - Replace the reused sibling card in api-keys-screen.tsx with DenCard. - Re-capture members-rename screenshots against the refactored UI.
…ing (different-ai#1483) * fix(den-api): surface invitation email send failures instead of swallowing Loops failures in sendDenOrganizationInvitationEmail and sendDenVerificationEmail were being caught and logged at warn level, so the HTTP handlers still returned 201 'Invitation created' even when no email ever left the process. Ben observed this with two live invitations: the DB row was pending, the UI showed it, but one of two recipients never received the email and clicking resend re-ran the same silent-failure path. Root cause (from an explore audit): - email.ts:129,132 swallowed non-2xx Loops responses and fetch throws. - invitations.ts awaited the send and unconditionally returned 2xx. - There is no 'skip email if user already exists' branch anywhere; the Slack hypothesis was wrong. The failure mode is provider-side and was invisible because of the swallow. Changes: - Introduce DenEmailSendError with a stable reason tagged union (loops_not_configured | loops_rejected | loops_network). - sendDenOrganizationInvitationEmail and sendDenVerificationEmail now throw DenEmailSendError on failure. Dev-mode short-circuit is preserved (still logs the payload and returns cleanly). - POST /v1/orgs/:orgId/invitations catches DenEmailSendError, logs via console.error with a stable [auth][invite_email_failed] prefix (greppable across deployments), and returns 502 invitation_email_failed with a human-readable message and the invitationId so the UI can correlate and offer a retry. The row is left pending intentionally so the next submit becomes a real resend. - Document the 502 response in the OpenAPI describeRoute. Operator note: if LOOPS_TRANSACTIONAL_ID_DEN_VERIFY_EMAIL is unset the signup OTP endpoint will now return a real error instead of silently stranding the user at the OTP screen forever. This is intentional; the previous behavior was a latent signup-breaking bug. * fix(den-api): tolerate missing apps/desktop/package.json in Docker build PR different-ai#1476 introduced a build step that reads apps/desktop/package.json to bake in a default latest-app-version, but packaging/docker/Dockerfile.den does not ship the Tauri desktop sources. As a result, the den-dev Docker stack fails to build after the PR landed. Gracefully fall back to 0.0.0 (matching the runtime default) when the file is absent, and allow a DEN_API_LATEST_APP_VERSION env override so deployers can still pin a real value. * test(den-api): add smoke script for invite email failure paths scripts/smoke-email-failures.mjs exercises the DenEmailSendError paths against the built dist/ of den-api. Ships with instructions so a reviewer can rerun it inside the docker-compose den-dev container with a single command. Also parameterises OPENWORK_DEV_MODE in the den compose service so the failure paths can be reached from outside the container when needed (defaults to 1; override with OPENWORK_DEV_MODE=0 at compose time).
Introduce org-scoped marketplaces so teams can curate and share groups of plugins with consistent access rules. This adds the schema, admin routes, RBAC updates, and PRD coverage needed for marketplace-backed plugin catalogs. Co-authored-by: src-opn <src-opn@users.noreply.github.com>
* feat(den): use Better Auth active org context * fix(app): switch Better Auth org only on explicit actions * refactor(den): flatten active org resource routes --------- Co-authored-by: src-opn <src-opn@users.noreply.github.com>
* refactor(app): remove hide_main_window function and update macOS window close behavior Eliminate the hide_main_window function to streamline window management. Update the macOS behavior to exit the application when the main window is closed, aligning it with the behavior on Windows and Linux. * surface openwork as main focused window onDock click
* Cleanup usage of I18n function
* Add skip pattern
* Cleanup I18n function usage across react-app
Drop translate/tr alias wrappers that just forwarded to t() with an explicit
locale arg, and migrate direct t(key, locale, ...) calls to the new
t(key, params?) signature. Also drop the now-unused language prop drilled
through McpAuthModal, AddMcpModal, ControlChromeSetupModal, and the
translate prop drilled through CreateWorkspaceLocalPanel — components
read the global locale via t() directly.
Default the i18n-audit script to include --aliases.
* Collapse single-key t() calls onto one line
The translate() → t() rename left multi-line wrappers around short string
literals. Re-flow them since the longer translate() name is gone.
* Fix useTranslate hook for new t() signature
Dev's redesign reintroduced tr/tx wrappers via a centralized useTranslate
hook, but the hook calls t(key, currentLocale(), params) — the old
3-argument signature. The current 2-argument t(key, params) silently
drops the third arg, so every tx() call would lose its substitutions
(e.g. {name}/{count} placeholders never get replaced).
Drop currentLocale() — t() uses the current locale by default — and pass
params straight through.
different-ai#1640) * I18n fixes: - Prune unused I18n keys - Add 4 missing translations to English only - Audit script should always print unused keys * Add I18n Audit to the CI
* Support I18n plurals and cleanup translation usage. Plurals are supported via the {count} interpolation key plus the suffixes _one, _other, etc. following the same conventions as I18next (without actually using I18next)
* Add plural audit check
* Add Russian locale * Include Russian locale in i18n audit * Fix plural placeholders in i18n locales * Russian language support, based off of DrMaks22 different-ai#1635 * Improve i18n-audit --prune script to include non-EN locale orphaned translations, and prune the Russian translations * I18n audit script: do not require {count} key for _zero and _one * Fix Russian plurals * Add missing Russian translations * Fix LANGUAGE_OPTIONS label vs. nativeName * Fix orphan check for plurals * Fix source scan --------- Co-authored-by: OpenAI Codex <codex@openai.com>
* Fix remote worker connection diagnostics * Add remote worker before screenshot * Clarify rejected remote worker tokens * chore(workspace): add remote diagnostics locale fallbacks * fix remote diagnostic edit and stale results * fix remote diagnostics edge cases
* fix(config): respect .opencode opencode.jsonc paths * fix(desktop): respect hidden opencode config paths in workspace init
…ai#1515) * fix(workspace): reload opencode.jsonc on initial activate The workspace the user is on at launch ignored permissions defined in opencode.jsonc until the user toggled to another workspace and back. Root cause: POST /workspaces/:id/activate never emitted a "config" reload event, and the app never called activateWorkspace either on initial mount or on workspace switch. The OpenCode engine therefore kept serving a stale config for the initial workspace. Changes: - Emit a synthetic config reload event on the activate route so the OpenCode engine re-reads opencode.jsonc (matching the pattern already used on config-mutating routes). - Call openworkClient.activateWorkspace after the initial workspace selection resolves, and again from the workspace-switch handler. Fire-and-forget transport; any error is non-fatal. Fixes different-ai#870 * fix(server): reload the engine when activating a workspace * fix(workspace): avoid reloading on every route refresh
* fix(settings): honor remote skills write capability * fix(settings): honor remote write capabilities
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
…ferent-ai#1540) * fix(messaging): auto-heal missing router agent file * fix(messaging): restart the router for messaging recovery
…nt-ai#1541) * fix(desktop): fall back to a writable sidecar cwd on Windows * fix(desktop): preserve engine workspace cwd
* Add workspace import preview * Harden workspace import preview * fix: preserve import state on replace failures * fix workspace import preview preconditions * fix stale workspace import approvals * clean import preview failure test
…serve (different-ai#1567) * feat(orchestrator): forward --opencode-log-level to managed opencode serve * fix(orchestrator): forward --opencode-log-level into sandbox entrypoint
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
|
@yashranaway is attempting to deploy a commit to the Different AI Team on Vercel. A member of the Team first needs to authorize it. |
71d8845 to
bb87ed2
Compare
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.
Refs #1095
Summary
falsetotrueso a fresh install opts in to downloading updates as soon as auto-check finds them.readStoredBoolean(KEY, true)returnstrueonly when no value has ever been written, so anyone who explicitly toggled the switch off keeps their stored"0"and stays opted out.trueby default) and the manual check / install flows remain unchanged.Verification
pnpm --filter @openwork/app typecheckcurrently fails on pre-existingorigin/deverrors insettings-route.tsxlines 1324-1557 (automations and messaging tabs in flight) andmessaging-view-state.ts; this branch only touches line 367.git diff --checkclean.Notes
falsewill move totrueon first run after this lands; this matches the issue's "existing users where safe" wording since auto-check was already on for them and only the download step changes.