diff --git a/.agents/skills/ohe-release-notes.md b/.agents/skills/ohe-release-notes.md new file mode 100644 index 00000000..f1055541 --- /dev/null +++ b/.agents/skills/ohe-release-notes.md @@ -0,0 +1,208 @@ +--- +name: ohe-release-notes +description: Generate consolidated OpenHands Enterprise release notes from multiple component repos +triggers: + - /ohe-release-notes +--- + +# OpenHands Enterprise Release Notes Generator + +Generate a consolidated release notes page for an OpenHands Enterprise release by collecting and +merging GitHub release notes from all component repositories into a single page under `enterprise/`. + +## When to use + +Use this skill when asked to create or update Enterprise release notes. The user provides version +ranges for four components. If any are missing, ask before proceeding. + +## Required inputs + +Ask the user for **all four** component version ranges and the **Enterprise release version**: + +| Input | Example | Description | +|----------------------------|--------------------------------|------------------------------------------------------------------| +| Enterprise release version | `0.24.0` | The version number for the `## X.X.X` heading | +| automations | `1.1.5 to 1.1.7` | Tags in `OpenHands/automation` repo | +| enterprise-server | `cloud-1.40.1 to cloud-1.46.2` | Tags in `OpenHands/OpenHands` repo | +| runtime-api | `0.3.1 to 0.5.0` | Tags in `OpenHands/runtime-api` repo (prefixed `v` in GitHub) | +| OpenHands-Cloud | `0.13.3 to 0.24.0` | Tags in `OpenHands/OpenHands-Cloud` repo (prefixed `openhands/`) | + +**software-agent-sdk** is derived automatically — you do NOT ask the user for it. See the +"Deriving the software-agent-sdk version range" section below. + +If the user omits any of the four inputs above, ask: + +> To generate the Enterprise release notes I need the previous and new version for each component: +> - **automations**: previous → new +> - **enterprise-server**: previous → new (tags are `cloud-X.Y.Z` in OpenHands/OpenHands) +> - **runtime-api**: previous → new (tags are `vX.Y.Z` in OpenHands/runtime-api) +> - **OpenHands-Cloud**: previous → new (tags are `openhands/X.Y.Z` in OpenHands/OpenHands-Cloud) +> - **Enterprise release version**: the version number for the heading (e.g. `0.25.0`) + +## Step-by-step procedure + +### 1. Identify releases in range + +For each component repo, list all GitHub releases and identify which fall **after** the previous +version and **up to and including** the new version. + +Use the GitHub API to list releases: + +```bash +curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ + "https://api.github.com/repos/{owner}/{repo}/releases?per_page=100" \ + | python3 -c "import json,sys; [print(r['tag_name']) for r in json.load(sys.stdin)]" +``` + +### 2. Fetch release notes + +For each release in range, fetch the body: + +```bash +curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ + "https://api.github.com/repos/{owner}/{repo}/releases/tags/{tag}" \ + | python3 -c "import json,sys; print(json.load(sys.stdin).get('body',''))" +``` + +### 2b. Derive the software-agent-sdk version range + +The `software-agent-sdk` version is pinned in the OpenHands-Cloud Helm chart. To find the range: + +1. Fetch `charts/openhands/values.yaml` from the OpenHands-Cloud repo at the **old** OpenHands-Cloud + tag (the "previous" version) and the **new** tag. +2. In each file, find the `global:` → `agentServerImage:` → `tag:` value (e.g. `1.34.0-python`). +3. Strip the `-python` suffix to get the SDK version number (e.g. `1.34.0`). +4. The SDK release range is everything after `v{old_version}` up to and including `v{new_version}` + in the `OpenHands/software-agent-sdk` repo. + +```bash +# Fetch the tag from a specific OpenHands-Cloud version +curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ + "https://api.github.com/repos/OpenHands/OpenHands-Cloud/contents/charts/openhands/values.yaml?ref=openhands/{version}" \ + | python3 -c " +import json, sys, base64 +data = json.load(sys.stdin) +content = base64.b64decode(data['content']).decode() +lines = content.split('\n') +in_global = False +in_agent = False +for line in lines: + if line.startswith('global:'): + in_global = True + if in_global and 'agentServerImage' in line: + in_agent = True + if in_agent and 'tag:' in line: + print(line.strip()) + break +" +``` + +### 3. Categorize by component + +Group bullet points **by component section**, with each section having its own Features, Bug Fixes, +and Maintenance sub-headings. The component sections are: + +1. **Enterprise Server** — from `OpenHands/OpenHands` +2. **Software Agent SDK** — from `OpenHands/software-agent-sdk` +3. **Runtime API** — from `OpenHands/runtime-api` +4. **OpenHands Cloud (Helm Chart)** — from `OpenHands/OpenHands-Cloud` + +Within each section, sort items into: +- **Features** — lines starting with `* feat` +- **Bug Fixes** — lines starting with `* fix` +- **Maintenance** — lines starting with `* chore`, `* ci`, `* build`, `* refactor`, `* test`, etc. + +### 4. Filter out noise + +Remove these automated/housekeeping lines that don't add value to customer-facing release notes: + +| Pattern | Reason | +|---------------------------------------------|------------------------------------------------------------| +| `chore(main): release X.X.X` | Automated release PRs | +| `chore: bump SDK packages to vX.X.X` | Automated dependency bumps | +| `chore: bump SDK and agent-server to X.X.X` | Automated dependency bumps | +| `fix(backport): ...` | Backport cherry-picks (the original fix is already listed) | +| `feat: bump agent-server to ...` | Version bump PRs, not user-facing features | +| `feat: bump image tag to ...` | Version bump PRs, not user-facing features | +| `feat(openhands): bump image tag to ...` | Version bump PRs, not user-facing features | +| `feat(runtime-api): bump image tag to ...` | Version bump PRs, not user-facing features | +| `Release vX.Y.Z` | Automated release PRs in software-agent-sdk | +| `Verify ... model` | Model verification entries in software-agent-sdk | + +### 5. Write the page + +Create or update `enterprise/release-notes.mdx`. Prepend the new release at the top of the file +(after the frontmatter), so the most recent release appears first. + +**Page structure:** + +```mdx +--- +title: Release Notes +description: Release notes for OpenHands Enterprise +icon: clipboard-list +--- + +## X.Y.Z + +### Enterprise Server + +#### Features +* feat: ... by @author in https://github.com/OpenHands/OpenHands/pull/... + +#### Bug Fixes +* fix: ... by @author in https://github.com/OpenHands/OpenHands/pull/... + +#### Maintenance +* ci: ... by @author in https://github.com/OpenHands/OpenHands/pull/... + +--- + +### Software Agent SDK + +#### Features +* feat: ... by @author in https://github.com/OpenHands/software-agent-sdk/pull/... + +#### Bug Fixes +* fix: ... by @author in https://github.com/OpenHands/software-agent-sdk/pull/... + +--- + +### Runtime API + +#### Features +* feat: ... by @author in https://github.com/OpenHands/runtime-api/pull/... + +--- + +### OpenHands Cloud (Helm Chart) + +#### Features +* feat: ... by @author in https://github.com/OpenHands/OpenHands-Cloud/pull/... + +#### Bug Fixes +* fix: ... by @author in https://github.com/OpenHands/OpenHands-Cloud/pull/... + +## (previous release heading, if any) +... +``` + +**Key formatting rules:** +- Split by component section — each component gets its own `### Heading` +- Within each component, group by `#### Features`, `#### Bug Fixes`, `#### Maintenance` +- Separate component sections with `---` horizontal rules +- Keep the exact bullet text from the original release notes (author, PR link) +- If a category has zero items after filtering, omit that sub-heading entirely + +### 6. Update navigation + +Ensure `enterprise/release-notes` is listed in `docs.json` under the Enterprise tab. It should +appear in the `"OpenHands Enterprise"` group. If it's already there (from a previous release), +no change is needed. + +### 7. Commit + +```bash +git add enterprise/release-notes.mdx docs.json +git commit -m "Add Enterprise X.Y.Z release notes" +``` diff --git a/docs.json b/docs.json index 907a13cb..16dd0bfd 100644 --- a/docs.json +++ b/docs.json @@ -483,7 +483,8 @@ "enterprise/docker-in-sandbox", "enterprise/analytics", "enterprise/external-postgres", - "enterprise/plugin-marketplace" + "enterprise/plugin-marketplace", + "enterprise/release-notes" ] }, { diff --git a/enterprise/release-notes.mdx b/enterprise/release-notes.mdx new file mode 100644 index 00000000..7e80a6bf --- /dev/null +++ b/enterprise/release-notes.mdx @@ -0,0 +1,154 @@ +--- +title: Release Notes +description: Release notes for OpenHands Enterprise +icon: clipboard-list +--- + +## 0.24.0 + +This release introduces a **Usage & Monitoring** dashboard, giving organization administrators visibility into AI spend and adoption across the organization. This dashboard provides high-level reports showing conversation counts, active sessions, and cost-per-conversation metrics, along with detailed conversation, user, and model-level breakdowns to help teams measure efficiency and ROI. + +The new **Budgets** feature -- also enabled for organization admins -- enables org-level spending limits with configurable alert thresholds (e.g., 80%, 90%, 100%) delivered via email or Slack. Default budgets and override budgets allow administrators to manage individual user spending limits. + +The **Settings → Agent** page enables the use of third-party agents -- like Claude Code or Codex -- on OpenHands Enterprise sandboxes through the ACP (Agent Canvas Protocol) framework. + +Several additional Jira Cloud and Data CEnter enhancements have been made to improve overall integration experience. + +### Enterprise Server + +#### Features +* feat: implement semantic file chunking using tree-sitter AST parsing by @ysinghc in https://github.com/OpenHands/OpenHands/pull/14699 +* feat(org): Add organization conversation admin dashboard by @saurya in https://github.com/OpenHands/OpenHands/pull/14846 +* feat(app-server): capture production workspace state — initial snapshot at start + archive before delete (APP-2403) by @simonrosenberg in https://github.com/OpenHands/OpenHands/pull/14953 +* feat(device-verify): align warning, button color, and add workspace dropdown by @tofarr in https://github.com/OpenHands/OpenHands/pull/15031 +* feat(enterprise/auth): add super roles via user.role_id with permission fallback by @chuckbutkus in https://github.com/OpenHands/OpenHands/pull/14937 +* feat(org): expose caller permissions on GET /organizations/{id}/me by @VascoSch92 in https://github.com/OpenHands/OpenHands/pull/15048 +* feat(api-keys): add optional active window (not_before & expires_at) by @tofarr in https://github.com/OpenHands/OpenHands/pull/15085 +* feat(app-server): add repo/branch to Laminar trace metadata by @simonrosenberg in https://github.com/OpenHands/OpenHands/pull/15059 +* feat: add parallel tool calls (tool_concurrency_limit) to agent settings by @VascoSch92 in https://github.com/OpenHands/OpenHands/pull/14929 +* feat(api-keys): make 'unbound' org scope an explicit, first-class option by @tofarr in https://github.com/OpenHands/OpenHands/pull/15096 +* feat(jira-dc): fix the integration panel so members get guidance, not the admin setup form by @ak684 in https://github.com/OpenHands/OpenHands/pull/15040 +* feat: Add dynamic marketplace support for plugin registration by @HeyItsChloe in https://github.com/OpenHands/OpenHands/pull/14887 +* feat(saas-auth): accept api_key cookie as a fallback credential by @tofarr in https://github.com/OpenHands/OpenHands/pull/15101 +* feat(enterprise/auth): super-admin management endpoint (grant/revoke/list) by @jpshackelford in https://github.com/OpenHands/OpenHands/pull/15006 +* feat: rename admin dashboard to usage & monitoring by @saurya in https://github.com/OpenHands/OpenHands/pull/15146 +* feat: add SMTP email service by @saurya in https://github.com/OpenHands/OpenHands/pull/15144 +* feat: track user login timestamps by @saurya in https://github.com/OpenHands/OpenHands/pull/15148 +* feat: surface email enabled for smtp/resend by @saurya in https://github.com/OpenHands/OpenHands/pull/15185 +* feat: pass repository metadata to observability traces by @neubig in https://github.com/OpenHands/OpenHands/pull/14431 +* feat(enterprise): Agent Profiles on the cloud/SaaS backend (#15044) by @simonrosenberg in https://github.com/OpenHands/OpenHands/pull/15060 +* feat(backend): Add Budgets dashboard and expand Usage Dashboard by @saurya in https://github.com/OpenHands/OpenHands/pull/15149 +* feat: budgets and usage monitoring UI by @saurya in https://github.com/OpenHands/OpenHands/pull/15186 +* feat: surface email enabled for smtp/resend by @saurya in https://github.com/OpenHands/OpenHands/pull/15214 +* feat(app-server): enrich final archive manifests and remove initial snapshots by @simonrosenberg in https://github.com/OpenHands/OpenHands/pull/15058 +* feat(enterprise): make BYOR key alias pattern configurable by @tofarr in https://github.com/OpenHands/OpenHands/pull/15232 + +#### Bug Fixes +* fix(jira): make Jira Cloud and Jira DC HTTP timeouts configurable and consistent by @ak684 in https://github.com/OpenHands/OpenHands/pull/15012 +* fix: Fix CVE-2026-44681: Update authlib to >=1.6.12 by @mamoodi in https://github.com/OpenHands/OpenHands/pull/14983 +* fix: don't switch LLM profile before the conversation UUID exists (avoids 422) by @ak684 in https://github.com/OpenHands/OpenHands/pull/14900 +* fix(enterprise): log automation HTTP response failures as errors by @wgu9 in https://github.com/OpenHands/OpenHands/pull/15004 +* fix(enterprise): add alembic migration for execution_status column by @tofarr in https://github.com/OpenHands/OpenHands/pull/15030 +* fix(jira-dc): more forgiving repo + mention resolution for Data Center by @ak684 in https://github.com/OpenHands/OpenHands/pull/15034 +* fix(device-verify): rename 'Workspace' dropdown to 'Organization' by @tofarr in https://github.com/OpenHands/OpenHands/pull/15057 +* fix(jira-dc): don't org-gate a personal-workspace Jira DC integration by @ak684 in https://github.com/OpenHands/OpenHands/pull/15036 +* fix: stream LLM tokens for cloud conversations and profile switches by @VascoSch92 in https://github.com/OpenHands/OpenHands/pull/15021 +* fix: set email person property in PostHog during onboarding completion by @lilagrc in https://github.com/OpenHands/OpenHands/pull/15070 +* fix: Timezones stored in the db do not have a timezone by @tofarr in https://github.com/OpenHands/OpenHands/pull/15092 +* fix: add test for InMemoryRateLimiter.__init__ to prevent duplicate assignment regression by @aivong-openhands in https://github.com/OpenHands/OpenHands/pull/14729 +* fix(frontend): stop streamed deltas rendering twice and fragmenting in V1 chat by @shanemort1982 in https://github.com/OpenHands/OpenHands/pull/15108 +* fix: crash when request.client is None in InMemoryRateLimiter by @rakshith1928 in https://github.com/OpenHands/OpenHands/pull/15119 +* fix(sandbox-spec): fall back to defaults when runtime-api has no warm runtimes by @tofarr in https://github.com/OpenHands/OpenHands/pull/15141 +* fix: settings page scroll layout by @saurya in https://github.com/OpenHands/OpenHands/pull/15147 +* fix(app_server): pass flat mcp_config shape to SDK Agent by @tofarr in https://github.com/OpenHands/OpenHands/pull/15159 +* fix: scroll settings sidebar so Skills is reachable in orgs by @hieptl in https://github.com/OpenHands/OpenHands/pull/15138 +* fix(frontend): read SDK 1.31.x flat mcp_config wire format by @tofarr in https://github.com/OpenHands/OpenHands/pull/15165 +* fix(app_server): derive agent server image from package version by @tofarr in https://github.com/OpenHands/OpenHands/pull/15168 +* fix(app-server): pass index columns as a list in migration 013 by @VascoSch92 in https://github.com/OpenHands/OpenHands/pull/15176 +* fix: default ENABLE_ACP on so ACP agent settings show in OH Cloud by @hieptl in https://github.com/OpenHands/OpenHands/pull/15183 +* fix: send authenticated marketplace URLs to agent-server by @hieptl in https://github.com/OpenHands/OpenHands/pull/15187 +* fix: prevent webhook-driven DB connection leaks by @tofarr in https://github.com/OpenHands/OpenHands/pull/15212 +* fix(frontend): mention SMTP env vars for budget alerts by @saurya in https://github.com/OpenHands/OpenHands/pull/15218 +* fix(enterprise): cascade-delete conversation_cost_events on conversation delete by @tofarr in https://github.com/OpenHands/OpenHands/pull/15220 +* fix: Enable LIFO database connection pooling by @tofarr in https://github.com/OpenHands/OpenHands/pull/15225 +* fix(app-server): preserve observability context metadata by @hxaxd in https://github.com/OpenHands/OpenHands/pull/15215 +* fix(app-server): preserve conversation created_at across lifecycle webhooks by @Sujit-1509 in https://github.com/OpenHands/OpenHands/pull/15243 +* fix(mcp): preserve SaaS credentials with encrypted storage by @simonrosenberg in https://github.com/OpenHands/OpenHands/pull/15257 +* fix(frontend): restore cross-domain PostHog tracking by aligning client/server distinct_id (WIP) by @lilagrc in https://github.com/OpenHands/OpenHands/pull/15100 +* fix(app-server): lower DB pool defaults and make them env-tunable by @dylan-openhands in https://github.com/OpenHands/OpenHands/pull/15270 +* fix(mcp): preserve MCP auth secrets stripped by settings GET round-trip by @jlav in https://github.com/OpenHands/OpenHands/pull/15285 + +#### Maintenance +* build: pin dependency versions exactly by @rbren in https://github.com/OpenHands/OpenHands/pull/14384 +* ci: add release ready gate by @enyst in https://github.com/OpenHands/OpenHands/pull/14987 +* ci: PLTF-2960 open a chart image-tag bump PR on cloud release by @aivong-openhands in https://github.com/OpenHands/OpenHands/pull/15166 +* ci: PLTF-2960 sync chart appVersion with cloud image tag by @aivong-openhands in https://github.com/OpenHands/OpenHands/pull/15219 +* ci: wait for the docker build before retagging images by @jlav in https://github.com/OpenHands/OpenHands/pull/15213 +* chore: Update README.md by @rbren in https://github.com/OpenHands/OpenHands/pull/15271 + +--- + +### Software Agent SDK + +#### Features +* feat(agent-server): expose repository metadata for workspace archives by @simonrosenberg in https://github.com/OpenHands/software-agent-sdk/pull/3932 +* feat: commit-history API — list commits and per-commit diffs by @hieptl in https://github.com/OpenHands/software-agent-sdk/pull/4075 +* feat(security): add ToolShieldLLMSecurityAnalyzer by @xli04 in https://github.com/OpenHands/software-agent-sdk/pull/2911 + +#### Bug Fixes +* fix(skills): match keyword triggers on whole words only by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/4008 +* fix(sdk): reconnect remote conversation websocket by @bozhnyukAlex in https://github.com/OpenHands/software-agent-sdk/pull/3987 +* fix(security): add a secret-disclosure consent rule to the agent security policy by @warmjademe in https://github.com/OpenHands/software-agent-sdk/pull/3823 +* fix(sdk): keep legacy history on resume when the stored tail is a non-tree artifact by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/4068 +* fix: support GPT-5.6 across Codex authentication by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/4056 +* fix: pick a display base ref that keeps committed work visible by @hieptl in https://github.com/OpenHands/software-agent-sdk/pull/4065 +* fix(mcp): validate secrets after parsing by @simonrosenberg in https://github.com/OpenHands/software-agent-sdk/pull/4099 +* fix(skills): make marketplaces additive to public skills by @rsd-darshan in https://github.com/OpenHands/software-agent-sdk/pull/4087 +* fix(mcp): preserve nested object properties in LLM-facing tool schema by @ixchio in https://github.com/OpenHands/software-agent-sdk/pull/4011 +* [codex] fix ACP prompt argument order by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/3996 + +#### Maintenance +* ci(version-bump-prs): make PR-creation steps independent by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/4051 +* ci: add release security-scan by @smolpaws in https://github.com/OpenHands/software-agent-sdk/pull/4042 +* chore(deps): bump MishaKav/pytest-coverage-comment from 1.7.2 to 1.10.0 by @dependabot[bot] in https://github.com/OpenHands/software-agent-sdk/pull/4046 +* chore(deps): bump docker/setup-buildx-action from 4.0.0 to 4.2.0 by @dependabot[bot] in https://github.com/OpenHands/software-agent-sdk/pull/4045 + +--- + +### Runtime API + +#### Features +* feat(logging): emit exc_info and stack_info as JSON arrays by @tofarr in https://github.com/OpenHands/runtime-api/pull/635 +* feat(cleanup): enrich final workspace archive manifests by @simonrosenberg in https://github.com/OpenHands/runtime-api/pull/630 + +#### Bug Fixes +* fix: prevent DetachedInstanceError on Runtime accessed after session close by @tofarr in https://github.com/OpenHands/runtime-api/pull/636 + +--- + +### OpenHands Cloud (Helm Chart) + +#### Features +* feat: upgrade embedded cluster to 2.19.2+k8s-1.34 by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/821 +* feat: upgrade embedded cluster to 2.19.2+k8s-1.35 by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/822 +* feat: upgrade embedded cluster to 2.19.2+k8s-1.36 by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/826 +* feat(sysbox): default sandbox isolation on the embedded cluster by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/770 +* feat: PLTF-3196 Configure global OpenHands resolver label by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/807 +* feat: PLTF-2960 sync metadata with image tag bumps by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/828 +* feat: Add replicated vendor portal links in release workflows by @dylan-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/833 +* feat: PLTF-3198 enable the Replicated SDK by default for helm installs by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/895 +* feat(replicated): add OEM User Creation Flow advanced option by @jpshackelford in https://github.com/OpenHands/OpenHands-Cloud/pull/914 + +#### Bug Fixes +* fix(postgres): raise embedded postgres memory limit to avoid OOM by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/829 +* fix: improve integrations-hub Datadog and probe configuration by @neubig in https://github.com/OpenHands/OpenHands-Cloud/pull/862 +* fix(openhands): stop warm-runtimes job pods matching the runtime-api Service selector by @ak684 in https://github.com/OpenHands/OpenHands-Cloud/pull/867 +* fix(openhands): mirror agentServerEnv into warm-runtime env so warm pools stay claimable by @ak684 in https://github.com/OpenHands/OpenHands-Cloud/pull/866 +* fix: set default agent-server tag back to 1.36.0-python by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/908 + +#### Maintenance +* ci: PLTF-2920 dispatch staging chart bumps after publish by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/801 +* refactor(openhands): rename gitlab webhook install cronjob by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/865 +* ci: PLTF-3193 dispatch development chart bumps after publish by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/843 +* test: PLTF-1257 helm-unittest setup by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/894 +* chore: add CODEOWNERS by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/878