Repository navigation
chore: release main - #206
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
release-please--branches--main
branch
11 times, most recently
from
October 23, 2026 22:31
676291a to
9e13af4
Compare
5 of 6 tasks
github-actions
Bot
force-pushed
the
release-please--branches--main
branch
2 times, most recently
from
October 26, 2026 19:34
113da14 to
dd71eab
Compare
github-actions
Bot
force-pushed
the
release-please--branches--main
branch
3 times, most recently
from
October 27, 2026 14:43
b2fd1ee to
0f4eca2
Compare
apucacao
added a commit
that referenced
this pull request
Oct 27, 2026
<!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## What The OpenCode handler now honors `config["tools"]` and `tool_handlers`, matching the contract every other handler follows. Previously `_stream_impl` did `del tool_handlers` and never read `config["tools"]`, so the AI Config's tool catalog did nothing and every caller, including a judge, silently inherited whatever `opencode.json` already configured. This is a behavior change for current callers: a variation with no tools, including every judge, now gets a model with no tools. The `!` in the title is that break. The package is still 0.x, so release-please treats it as a minor. ## How - **Offered set.** The intersection of `config["tools"]` and the keys present in `tool_handlers`. A `NativeTool` is allowed by its provider tool name. A plain callable is served from a per-call loopback MCP bridge registered with `POST /mcp`. HTTP 200 is not enough: the body is the status map, and registration raises unless `response.json()[name]["status"]` is `"connected"`. - **Bridge transport.** The bridge keeps its `GET` open as a live `text/event-stream` instead of answering `405`. OpenCode's MCP client (confirmed live against the `opencode` 1.18.4 linux-x64 binary) opens that `GET` right after `initialize` and marks the server connection `"failed"` on anything but a live stream, never sending `tools/list`. The spec allows `405` there; this client does not treat it as optional. - **Permission.** The session ruleset always starts with deny `*`, then allows only the offered permissions. `write` and `apply_patch` are not their own permissions. OpenCode remaps both onto `edit`, so `OpenCodeWrite` and `OpenCodeApplyPatch` are the same grant as `OpenCodeEdit`, and the ruleset sends `edit` once. An empty offered set still denies everything. `skill` is denied unless it is offered. - **Spans.** One `chat` per assistant message, one `execute_tool` per tool call, named after the AI Config key. A second completed `message.updated` for an id already recorded does not open another `chat` span. A consumer who stops reading marks `launchdarkly.stream.abandoned`. A `CancelledError` marks `launchdarkly.run.cancelled` instead. - **Sentinels.** `OpenCodeBash`, `OpenCodeRead`, `OpenCodeEdit`, `OpenCodeWrite`, `OpenCodeGlob`, `OpenCodeGrep`, `OpenCodeTask`, `OpenCodeSkill`, `OpenCodeTodoWrite`, `OpenCodeWebFetch`, `OpenCodeWebSearch`, `OpenCodeApplyPatch`. There is no `OpenCodeList`. - **Client version.** `packages/client` stays at `0.4.0`; the earlier hand-bump to `0.4.1` is reverted so it does not fight release PR #206 and `$ld:ai:sdk:info` does not report a version that was never published. `launchdarkly-ai-opencode-agents` still depends on `launchdarkly-ai-server>=0.4.1`, so a git pin of this SHA is not installable by a strict resolver until the client is actually released. ## Live OpenCode 1.18.4 The `opencode` 1.18.4 linux-x64 binary runs here. A handler call with one plain callable, `get_weather`, against that binary now **completes**: the model called the bridged tool (`CALLED [{'city': 'Oslo'}]`), and the final answer is "The weather in Oslo is sunny." The earlier run failed with `POST /mcp` reporting `{"status": "failed", "error": "SSE error: Non-200 status code (405)"}` because the bridge answered its `GET` with a bare `405`; OpenCode's client treats that as a dead connection and never sends `tools/list`. Traced live with a logging stand-in server: OpenCode sends `POST initialize`, `POST notifications/initialized`, then `GET` with `Accept: text/event-stream` — and only sends `POST tools/list` once that `GET` comes back as a live stream. The bridge now opens that stream (`200`, `Content-Type: text/event-stream`, an immediate `: connected` comment, then periodic keepalives) and holds it until `stop()`. ## Verification ``` uv run pytest packages/opencode-agents tests/test_cross_handler_parity.py -q # 223 passed, 17 skipped uv run mypy packages/opencode-agents/src # Success: no issues found in 8 source files uv run python scripts/api_report.py --check # 15 API reports are current ``` `test_tool_bridge.py::test_get_opens_a_live_sse_stream_not_405` reads a live chunk from the `GET` (not just the status line) and would have caught the `405` regression. <!-- CURSOR_AGENT_PR_BODY_END --> <div><a href="https://cursor.com/agents/bc-0ea0785c-1d2e-5568-8089-f53a982e1b7f?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a> <a href="https://cursor.com/background-agent?bcId=bc-0ea0785c-1d2e-5568-8089-f53a982e1b7f&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a> </div> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>
github-actions
Bot
force-pushed
the
release-please--branches--main
branch
from
October 27, 2026 14:55
0f4eca2 to
24585c8
Compare
github-actions
Bot
force-pushed
the
release-please--branches--main
branch
from
October 27, 2026 15:17
24585c8 to
4138892
Compare
apucacao
approved these changes
Oct 27, 2026
Contributor
Author
XieX
added a commit
that referenced
this pull request
Oct 27, 2026
launchdarkly-ai-server 0.5.0 (#206) shipped FDv2SkillStore from the package root, so the old name stays importable until the next major release, matching the JS aliases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
XieX
added a commit
that referenced
this pull request
Oct 27, 2026
## Summary Renames the exported `FDv2SkillStore` class to `LaunchDarklySkillStore`. It's one of three companion PRs, with launchdarkly/js-ai-sdk#172 and the spec change in launchdarkly/ai-sdks-monorepo#95. **Why.** The base LaunchDarkly SDKs keep "FDv2" out of their public type names. Python's `ldclient` uses `DataSystemConfig` and keeps the `FDv2` class under `ldclient/impl/`. Go's `NewFDv2` is in `internal/datasystem`. FDv2 is also still Early Access: the [Python](https://launchdarkly.com/changelog/introducing-fdv2-for-python-sdk/) and [.NET](https://launchdarkly.com/changelog/flag-delivery-v2-dotnet-sdk/) changelogs and the data saving mode docs say so. A type named after the protocol version would date the API. The new name says where the content comes from, and it pairs with `InMemorySkillStore`. **What changes.** The class name, everywhere it appears: the root export, `__all__`, the API report, error messages, docstrings, both READMEs, `agents.md`, the Claude Agents package's example, and tests. **What stays.** The `skills_fdv2` module, the `FDV2_*` wire-kind constants, and prose that describes the FDv2 channel itself. Those name the protocol, which is accurate. **`FDv2SkillStore` stays as a deprecated alias.** 0.5.0 (#206, released 2026-10-27) exports `FDv2SkillStore` from the root, so the old name is kept as `FDv2SkillStore = LaunchDarklySkillStore` and stays in `__all__` until the next major release, matching the JS aliases. It's a plain alias rather than a warning shim, because `warnings.deprecated` needs Python 3.13 and the package supports 3.12. A test asserts `FDv2SkillStore is LaunchDarklySkillStore`. The title keeps `!`: the class's own name (`__name__`, reprs, the API report) changes, and the old name goes away in the next major release. ## Testing - `pytest packages/client/tests packages/claude-agents/tests`: 2170 passed, 1 skipped - `make typecheck`, `ruff check`, `ruff format --check` and `make api-report-check` all pass - `uv.lock` is unchanged 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Overview** > **Breaking rename:** the public Agent Skills delivery store class is now **`LaunchDarklySkillStore`** instead of **`FDv2SkillStore`**. Imports from `launchdarkly_ai_server`, `__all__`, the API report, and companion packages (e.g. Claude Agents examples) are updated accordingly. > > **Unchanged:** implementation still lives in `skills_fdv2.py`, FDv2 wire/protocol naming in internals, and store behavior (FDv2 poll/stream channel, lifecycle, diagnostics). Docstrings and user-facing errors now say `LaunchDarklySkillStore`. > > **No shim:** there is no deprecated alias—callers must switch the symbol name (aligned with JS AI SDK and monorepo spec changes). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit a3d82cb. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.
🤖 I have created a release beep boop
launchdarkly-ai-server: 0.5.0
0.5.0 (2026-10-27)
⚠ BREAKING CHANGES
Experimental
Features
Bug Fixes
launchdarkly-ai-python: 0.4.0
0.4.0 (2026-10-27)
⚠ BREAKING CHANGES
Features
launchdarkly-ai-claude-agents: 0.3.0
0.3.0 (2026-10-27)
⚠ BREAKING CHANGES
Features
Bug Fixes
launchdarkly-ai-claude-messages: 0.3.0
0.3.0 (2026-10-27)
⚠ BREAKING CHANGES
Bug Fixes
launchdarkly-ai-openai-agents: 0.3.0
0.3.0 (2026-10-27)
⚠ BREAKING CHANGES
Bug Fixes
launchdarkly-ai-vercel-agents: 0.2.0
0.2.0 (2026-10-27)
⚠ BREAKING CHANGES
Bug Fixes
launchdarkly-ai-litellm-agents: 0.2.0
0.2.0 (2026-10-27)
⚠ BREAKING CHANGES
Bug Fixes
launchdarkly-ai-openai-messages: 0.3.0
0.3.0 (2026-10-27)
⚠ BREAKING CHANGES
Bug Fixes
launchdarkly-ai-vercel-messages: 0.2.0
0.2.0 (2026-10-27)
⚠ BREAKING CHANGES
Bug Fixes
launchdarkly-ai-litellm-messages: 0.2.0
0.2.0 (2026-10-27)
⚠ BREAKING CHANGES
Bug Fixes
launchdarkly-ai-langchain-agents: 0.3.0
0.3.0 (2026-10-27)
⚠ BREAKING CHANGES
Bug Fixes
launchdarkly-ai-langchain-messages: 0.3.0
0.3.0 (2026-10-27)
⚠ BREAKING CHANGES
Bug Fixes
launchdarkly-ai-opencode-agents: 0.3.0
0.3.0 (2026-10-27)
⚠ BREAKING CHANGES
Experimental
Features
Bug Fixes
launchdarkly-ai-typesafe: 0.2.0
0.2.0 (2026-10-27)
⚠ BREAKING CHANGES
Bug Fixes
This PR was generated with Release Please. See documentation.
Note
Overview
This is a Release Please cut that bumps versions across the monorepo (notably
launchdarkly-ai-server0.5.0,launchdarkly-ai-python0.4.0, and matching minor bumps on provider adapters). The edits are manifest entries,pyproject.toml/__version__strings, and new CHANGELOG sections for 2026-10-27.The release notes capture several breaking runtime changes already on
main: Agent Skills move from experimental to core (launchdarkly_ai_server.skills), AI Config model parameters are now forwarded to every provider handler (configs that previously ignored them will behave differently), Claude Agents defaults built-in tools off and stops loading host settings, and OpenCode Agents now honor AI Config tools. The core client also documents judge fixes (outputFormatnot sent to providers), URI trimming ininit_client, skills watcher/store fixes, and experimental evaluation trace export.Reviewed by Cursor Bugbot for commit 4138892. Bugbot is set up for automated code reviews on this repo. Configure here.