[{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56550”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56550/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56550/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56550/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56550”,“id”:5903172834,“node_id”:“PR_kwDOOiiGL88AAAABJEz4Ew”,“number”:56550,“title”:“feat(plugin): expose session instruction entries to plugins”,“user”:{“login”:“kitlangton”,“id”:7587245,“node_id”:“MDQ6VXNlcjc1ODcyNDU=”,“avatar_url”:“https://avatars.githubusercontent.com/u/7587245?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/kitlangton”,“html_url”:“https://github.com/kitlangton”,“followers_url”:“https://api.github.com/users/kitlangton/followers”,“following_url”:“https://api.github.com/users/kitlangton/following{/other_user}”,“gists_url”:“https://api.github.com/users/kitlangton/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/kitlangton/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/kitlangton/subscriptions”,“organizations_url”:“https://api.github.com/users/kitlangton/orgs”,“repos_url”:“https://api.github.com/users/kitlangton/repos”,“events_url”:“https://api.github.com/users/kitlangton/events{/privacy}”,“received_events_url”:“https://api.github.com/users/kitlangton/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:0,“created_at”:“2026-10-17T21:15:40Z”,“updated_at”:“2026-10-17T21:17:23Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56550”,“html_url”:“https://github.com/anomalyco/opencode/pull/56550”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56550.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56550.patch”,“merged_at”:null},“body”:”## Why\n\nOpenCode V2 already supports durable, keyed per-session instruction entries (session.instructions.entry.{list,put,remove}), which render as <context key=\"...\"> blocks and announce updates or removals at the next step boundary without queuing inbox work or waking execution. However, SessionDomain on the plugin context omitted instructions, leaving plugins without access to the keyed-context API. As a result, plugins such as GenUI fell back to session.synthetic to persist session reminders, which admits a steered inbox item and triggered an unintended extra model turn.\n\n## What Changes\n\nBoth Effect and Promise plugins can now manage keyed session instruction entries through ctx.session.instructions.entry:\n\nts\nawait ctx.session.instructions.entry.put({\n sessionID,\n key: \"deploy-target\",\n value: \"production\",\n})\n\nconst entries = await ctx.session.instructions.entry.list({ sessionID })\n\nawait ctx.session.instructions.entry.remove({\n sessionID,\n key: \"deploy-target\",\n})\n\n\n| Method | Input | Output | Behavior |\n| --- | --- | --- | --- |\n| ctx.session.instructions.entry.list | { sessionID } | ReadonlyArray<InstructionEntry.Info> | Lists active instruction entries attached to the session; fails with Session.NotFoundError when the session does not exist. |\n| ctx.session.instructions.entry.put | { sessionID, key, value } | void | Attaches or replaces a keyed JSON instruction entry (api/<key>), announced at the next step boundary without enqueuing inbox work; preserves Session.NotFoundError and InstructionEntry.ValueTooLargeError. |\n| ctx.session.instructions.entry.remove | { sessionID, key } | void | Marks the keyed entry removed so the next step boundary announces its removal; fails with Session.NotFoundError when the session does not exist. |\n\n### Surface Naming Convention\n\nAlthough the underlying HTTP routes live under /api/experimental/session/:sessionID/instructions/entries, the endpoints belong to the server.session protocol group (session.instructions.entry.{list,put,remove}) and are generated onto SessionApi[\"instructions\"][\"entry\"]. Following the existing convention in SessionDomain—where session.wait (/api/experimental/session/:sessionID/wait) is picked directly from SessionApi onto ctx.session.wait, while ctx.experimental is reserved for the separate server.experimental HTTP group and experimental.ws.* for plugin-only hook names—instructions is picked directly onto SessionDomain.\n\n## Scope\n\nThis PR exposes ctx.session.instructions.entry.{list,put,remove} on the Effect and Promise plugin contexts, wires PluginHost to InstructionEntry.Service, and documents the plugin surface. Migrating GenUI or Plan mode onto instruction entries is handled separately.\n\n## Verification\n\nsh\ntaskpolicy -c utility bun --cwd packages/core test test/plugin/session-instructions.test.ts\ntaskpolicy -c utility bun --cwd packages/plugin typecheck\ntaskpolicy -c utility bun --cwd packages/core typecheck\n\n\n- packages/core/test/plugin/session-instructions.test.ts: 2 passed (verifies both Effect and Promise plugins can put, list, update, and remove entries observed by the next model request without enqueuing inbox items, plus Session.NotFoundError, InstructionEntry.ValueTooLargeError, and invalid key rejection).\n- packages/plugin and packages/core typechecks passed with 0 errors (and the pre-push workspace sdk-docs, oxlint, ast-grep, and turbo typecheck hooks passed across all 34 packages).\n\n---\n\n_Added by the opencode bot (AI-generated).\n\nPublic API: adds ctx.session.instructions.entry.{list,put,remove} to the Effect and Promise plugin contexts (backwards compatible)\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56550/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56550/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56548”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56548/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56548/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56548/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56548”,“id”:5903137814,“node_id”:“PR_kwDOOiiGL88AAAABJEyJEA”,“number”:56548,“title”:“fix(genui): stop GenUI reminder from triggering an extra turn”,“user”:{“login”:“kitlangton”,“id”:7587245,“node_id”:“MDQ6VXNlcjc1ODcyNDU=”,“avatar_url”:“https://avatars.githubusercontent.com/u/7587245?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/kitlangton”,“html_url”:“https://github.com/kitlangton”,“followers_url”:“https://api.github.com/users/kitlangton/followers”,“following_url”:“https://api.github.com/users/kitlangton/following{/other_user}”,“gists_url”:“https://api.github.com/users/kitlangton/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/kitlangton/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/kitlangton/subscriptions”,“organizations_url”:“https://api.github.com/users/kitlangton/orgs”,“repos_url”:“https://api.github.com/users/kitlangton/repos”,“events_url”:“https://api.github.com/users/kitlangton/events{/privacy}”,“received_events_url”:“https://api.github.com/users/kitlangton/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:0,“created_at”:“2026-10-17T21:11:19Z”,“updated_at”:“2026-10-17T21:11:26Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56548”,“html_url”:“https://github.com/anomalyco/opencode/pull/56548”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56548.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56548.patch”,“merged_at”:null},“body”:”## Why\n\nIn the OpenCode app, sending a first prompt with Generated UI enabled (metadata.genui = true) caused the assistant to reply twice to a single prompt. In session ses_eb4805506ffdExxfN3euuGJzSR, the user sent \"hi\" at 1792268020571, assistant 1 completed at 1792268021922, a synthetic message containing the GenUI <system-reminder> was delivered at 1792268021930, and assistant 2 started at 1792268021939 and greeted the user a second time.\n\nGenUISession’s context hook both spliced Message.user(enter) into event.messages and called ctx.session.synthetic({ sessionID, text, resume: false }). Because Session.synthetic admits a \"steer\" inbox item and resume: false only skips execution.wake(), the already-active runner promoted the synthetic item in advanceToStep after step 1 finished, running an extra model step and persisting the reminder after the assistant’s reply (diverging from the order the model saw).\n\n## What Changes\n\nMake the GenUISession context hook side-effect free by providing GenUI guidance as a system part (event.system.push(SystemPart.make(...))), matching packages/core/src/tool/plugin/opencode.ts:\n\n- Before: On a context hook call, GenUISession scanned event.messages for enter/leave <system-reminder> user messages, spliced a user message into event.messages, and called ctx.session.synthetic({ sessionID, text, resume: false }), queuing a steered synthetic message while a step was already running.\n- After: The prompt hook records whether the latest prompt had metadata.genui === true (and session.deleted cleans up the map entry). On context, if GenUI is offered for the session, GenUISession pushes SystemPart.make(instructions) onto event.system and keeps genui_render; otherwise it deletes genui_render from event.tools and adds nothing. It never mutates event.messages or enqueues synthetic inbox items.\n\nmermaid\nsequenceDiagram\n participant A as App\n participant R as Runner\n participant H as GenUISession (context hook)\n participant M as Model\n\n Note over A,M: Before\n A->>R: prompt (\"hi\", metadata.genui = true)\n R->>H: context hook\n H->>R: splice Message.user(enter) + session.synthetic(resume: false)\n R->>M: step 1 (user: enter, user: \"hi\")\n M-->>R: greeting 1\n R->>R: advanceToStep promotes steered synthetic item\n R->>M: step 2 (persisted synthetic reminder)\n M-->>A: greeting 2\n\n Note over A,M: After\n A->>R: prompt (\"hi\", metadata.genui = true)\n R->>H: context hook\n H->>R: event.system.push(SystemPart.make(instructions))\n R->>M: step 1 (system includes GenUI guidance, user: \"hi\")\n M-->>A: greeting 1\n\n\n## Scope\n\nThis PR keeps the fix small in packages/plugin-genui/src/session.ts using existing event.system support on the context hook, plus unit and runner regression tests. A separate follow-up PR will move GenUI onto keyed session instruction entries once plugins can access them.\n\n## Verification\n\nsh\ntaskpolicy -c utility bun test test/session.test.ts # in packages/plugin-genui\ntaskpolicy -c utility bun test # in packages/plugin-genui\ntaskpolicy -c utility bun run typecheck # in packages/plugin-genui\ntaskpolicy -c utility bun test test/session-runner.test.ts -t \"runs one model request with system guidance when a prompt enables GenUI\" # in packages/core\ntaskpolicy -c utility bun run typecheck # in packages/core\n\n\n- packages/plugin-genui tests (17 pass, 0 fail) verify that the context hook adds the system part and genui_render when metadata.genui is true, removes genui_render and adds no system part when false or unknown, and never mutates event.messages or calls session.synthetic.\n- packages/core/test/session-runner.test.ts scenario verifies that a prompt with metadata: { genui: true } executes exactly 1 model request with the GenUI guidance in request.system and persists only the user message.\n- Package typechecks pass with tsgo.\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56548/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56548/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56545”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56545/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56545/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56545/events”,“html_url”:“https://github.com/anomalyco/opencode/issues/56545”,“id”:5902988160,“node_id”:“I_kwDOOiiGL88AAAABX9hzgA”,“number”:56545,“title”:“bash: recursive file-reading commands (grep -r, rg, ls -R) bypass filename-pattern deny rules”,“user”:{“login”:“devfpittelo”,“id”:327061373,“node_id”:“U_kgDOE36PfQ”,“avatar_url”:“https://avatars.githubusercontent.com/u/327061373?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/devfpittelo”,“html_url”:“https://github.com/devfpittelo”,“followers_url”:“https://api.github.com/users/devfpittelo/followers”,“following_url”:“https://api.github.com/users/devfpittelo/following{/other_user}”,“gists_url”:“https://api.github.com/users/devfpittelo/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/devfpittelo/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/devfpittelo/subscriptions”,“organizations_url”:“https://api.github.com/users/devfpittelo/orgs”,“repos_url”:“https://api.github.com/users/devfpittelo/repos”,“events_url”:“https://api.github.com/users/devfpittelo/events{/privacy}”,“received_events_url”:“https://api.github.com/users/devfpittelo/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:53:43Z”,“updated_at”:“2026-10-17T20:54:55Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“sub_issues_summary”:{“total”:0,“completed”:0,“percent_completed”:0},“issue_dependencies_summary”:{“blocked_by”:0,“total_blocked_by”:0,“blocking”:0,“total_blocking”:0},“body”:”## Summary\n\npermission.bash deny rules are matched against the command string. Recursive file-reading commands (grep -r <pattern> <dir>, rg <pattern> <dir>, ls -R <dir>, find <dir> -type f) only name the directory in their command text, so they read and return the full contents of files whose names match deny patterns (e.g. *.env*, *.pem*, *.key*) without any rule matching.\n\nA direct cat .env is correctly denied. grep -r \"API_KEY\" . returns the contents of .env — allowed, because no deny pattern matches the command string.\n\nThis is the bash-tool sibling of the grep/glob tool gap tracked (and auto-closed as stale) in #17073, with duplicates #35503 / #35684, and related to the wrapper-matching gap in #54008.\n\n## Reproduction (synthetic files, no real secrets)\n\n1. Configure:\n jsonc\n \"permission\": {\n \"bash\": {\n \"*\": \"allow\",\n \"*.env*\": \"deny\",\n \"*.key*\": \"deny\"\n }\n }\n \n2. Create secrets/fake-credentials.env and secrets/server.key (synthetic content).\n3. cat secrets/fake-credentials.env → denied ✔ (command string matches *.env*).\n4. grep -r \"SYNTHETIC\" secrets/ → allowed, returns the full contents of both files ✘ — the command string (grep -r \"SYNTHETIC\" secrets/) matches no deny pattern, yet the operation reads deny-matched files.\n\nVerified 2026-10-17 on a live session (files created out-of-band via the file-write tool, then read by an allowed recursive grep).\n\n## Expected behavior\n\nEither:\n- (a) deny rules are also evaluated against the files a command will actually read (requires intercepting recursive reads — heavy), or\n- (b) a documented, supported post-execution redaction/filter hook exists so configurations can strip deny-matched files’ content from tool output before the model sees it (the approach proven by the community plugin opencode-env-protect and requested in #17073), or\n- (c) the limitation is documented explicitly next to the bash permission docs: filename-pattern denies are command-string matches only and do NOT protect file contents reached via recursive reads.\n\n## Actual behavior\n\nRecursive reads silently bypass filename-pattern deny rules; denied-file contents enter the model context.\n\n## Security impact\n\nConfigurations that rely on *.env* / *.key* / *.pem* bash denies as a secret-exfiltration guard have a false sense of protection: an agent (or a prompt-injected agent) can exfiltrate secret file contents with a single allowed recursive grep, never naming the file.\n\n## Suggested fix direction\n\nPost-execution output filtering keyed on the same permission patterns (option b) is the smallest change that closes the class: after a bash command completes, scan its output for content sourced from files matching deny patterns and redact/filter. This also covers #17073’s grep/glob tool variant with one mechanism.\n\n## Environment\n\n- OpenCode: current release channel (verified 2026-10-17)\n- OS: Linux (Arch, bash)\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56545/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56545/timeline”,“performed_via_github_app”:null,“state_reason”:null,“pinned_comment”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56543”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56543/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56543/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56543/events”,“html_url”:“https://github.com/anomalyco/opencode/issues/56543”,“id”:5902957848,“node_id”:“I_kwDOOiiGL88AAAABX9f9GA”,“number”:56543,“title”:“Free-tier models intermittently fail with “OpenCode’s free tier can only be used from within OpenCode” when using the official desktop app”,“user”:{“login”:“mohshi63-afk”,“id”:228303631,“node_id”:“U_kgDODZujDw”,“avatar_url”:“https://avatars.githubusercontent.com/u/228303631?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/mohshi63-afk”,“html_url”:“https://github.com/mohshi63-afk”,“followers_url”:“https://api.github.com/users/mohshi63-afk/followers”,“following_url”:“https://api.github.com/users/mohshi63-afk/following{/other_user}”,“gists_url”:“https://api.github.com/users/mohshi63-afk/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/mohshi63-afk/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/mohshi63-afk/subscriptions”,“organizations_url”:“https://api.github.com/users/mohshi63-afk/orgs”,“repos_url”:“https://api.github.com/users/mohshi63-afk/repos”,“events_url”:“https://api.github.com/users/mohshi63-afk/events{/privacy}”,“received_events_url”:“https://api.github.com/users/mohshi63-afk/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:12585677396,“node_id”:“LA_kwDOOiiGL88AAAAC7ioyVA”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/pending%20close”,“name”:“pending close”,“color”:“54c4e1”,“default”:false,“description”:"",“archived_at”:null,“archived_by”:null},{“id”:12585938172,“node_id”:“LA_kwDOOiiGL88AAAAC7i4s_A”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/triaging”,“name”:“triaging”,“color”:“ededed”,“default”:false,“description”:"",“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:50:19Z”,“updated_at”:“2026-10-17T20:51:04Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“sub_issues_summary”:{“total”:0,“completed”:0,“percent_completed”:0},“issue_dependencies_summary”:{“blocked_by”:0,“total_blocked_by”:0,“blocking”:0,“total_blocking”:0},“body”:”### Description\n\n\n## Description\n\nWhile using the official OpenCode desktop app on Windows, requests to the free models intermittently fail with:\n\n\nAI_APICallError: OpenCode's free tier can only be used from within OpenCode. Download it at https://opencode.ai and keep building.\n\n\nI am using OpenCode itself (the official desktop app), not a custom client, script, or third-party tool, so this message should not be triggered. The error is intermittent: the same models respond successfully in the same sessions before and after the failures.\n\n## Environment\n\n- OS: Windows (PowerShell shell)\n- Client: official OpenCode desktop app\n- Versions seen in the logs on the day of the issue (several instances were running at different times): 1.18.28, 1.19.1, 1.19.3, 2.0.32\n- Provider: opencode (free models)\n\n## Affected models (all free models I used)\n\n| Model | Failures |\n|---|---|\n| glm-5.3-flash-free | 16 |\n| deepseek-v4.1-flash-free | 12 |\n| space-bunny-free | 4 |\n| nemotron-3.5-super-vl-free | 2 |\n\nTotal: 77 log lines containing this error (34 of them are stream error entries).\n\n## Timing\n\n- All occurrences are on 2026-10-17, between 07:26 UTC and 20:22 UTC, in several clusters (about 07:00–10:00 and 15:00–20:00 UTC).\n- Seen across 12 different app runs and on all four versions listed above, so it does not look tied to a specific build.\n- Also seen with agent=compaction, so it is not limited to the main chat agent.\n\n## Steps to reproduce\n\nNot deterministic. I just use the free models in the desktop app, and after some time requests start failing with the error above. Retrying later sometimes works again.\n\n### Plugins\n\n_No response\n\n### OpenCode version\n\n1.18.28, 1.19.1, 1.19.3, 2.0.32\n\n### Steps to reproduce\n\n_No response_\n\n### Screenshot and/or share link\n\n<img width=“811” height=“411” alt=“Image” src=“https://github.com/user-attachments/assets/acdc1d49-e09b-45a5-8ceb-505d75f5d9fd” />\n\n### Operating System\n\n_No response_\n\n### Terminal\n\n_No response_”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56543/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56543/timeline”,“performed_via_github_app”:null,“state_reason”:null,“pinned_comment”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56541”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56541/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56541/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56541/events”,“html_url”:“https://github.com/anomalyco/opencode/issues/56541”,“id”:5902887399,“node_id”:“I_kwDOOiiGL88AAAABX9bp5w”,“number”:56541,“title”:“models: free model muse-spark-1.3-contributor-free removed from catalog without notice”,“user”:{“login”:“anshchaudhary289-prog”,“id”:230107862,“node_id”:“U_kgDODbcq1g”,“avatar_url”:“https://avatars.githubusercontent.com/u/230107862?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/anshchaudhary289-prog”,“html_url”:“https://github.com/anshchaudhary289-prog”,“followers_url”:“https://api.github.com/users/anshchaudhary289-prog/followers”,“following_url”:“https://api.github.com/users/anshchaudhary289-prog/following{/other_user}”,“gists_url”:“https://api.github.com/users/anshchaudhary289-prog/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/anshchaudhary289-prog/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/anshchaudhary289-prog/subscriptions”,“organizations_url”:“https://api.github.com/users/anshchaudhary289-prog/orgs”,“repos_url”:“https://api.github.com/users/anshchaudhary289-prog/repos”,“events_url”:“https://api.github.com/users/anshchaudhary289-prog/events{/privacy}”,“received_events_url”:“https://api.github.com/users/anshchaudhary289-prog/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:42:27Z”,“updated_at”:“2026-10-17T20:43:40Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“sub_issues_summary”:{“total”:0,“completed”:0,“percent_completed”:0},“issue_dependencies_summary”:{“blocked_by”:0,“total_blocked_by”:0,“blocking”:0,“total_blocking”:0},“body”:”## Summary\n\nThe free model opencode/muse-spark-1.3-contributor-free (“Muse Spark 1.3 Free”, family muse-free) was available and working on v1.18.32–1.18.35, but is absent from the catalog on v2.0.32 and can no longer be selected or invoked. There is no error, changelog entry, or in-app notice explaining the removal, so users cannot tell whether it was retired intentionally, is temporarily unavailable, or is a regression in catalog loading.\n\n## Environment\n\n- opencode version: 2.0.32\n- OS: Microsoft Windows [Version 10.0.19045.7807] (win32 x64)\n- Terminal: Unavailable: TERM_PROGRAM, COLORTERM, and WT_SESSION are unset; TERM=xterm-256color\n- Shell: C:\\Windows\\system32\\cmd.exe (ComSpec)\n- Install/channel: release, installed via npm (@opencode/cli@2.0.32 global)\n- Active plugins: none configured in ~/.config/opencode/opencode.jsonc; @opencode-ai/plugin@1.18.25 is present as a dependency only\n\n## Reproduction\n\n1. On opencode v1.18.32–v1.18.35, select model opencode/muse-spark-1.3-contributor-free (variant high) and send a message. It responds normally at cost: 0.\n2. Update opencode to v2.0.32.\n3. Run:\n\n sh\n opencode run --model opencode/muse-spark-1.3-contributor-free#high \"Reply with exactly: ok\"\n \n\n4. Observe the model is missing from the model picker and the invocation fails.\n\n## Expected Behavior\n\nEither the model remains listed (for example as deprecated, possibly still routable during a deprecation window), or its removal comes with an explicit notice — a changelog entry, release note, or in-app message naming muse-spark-1.3-contributor-free and stating whether it is retired permanently or coming back.\n\nA clear error such as “this model has been retired, use X instead” would also be acceptable.\n\n## Actual Behavior\n\nThe model does not appear in the catalog, and forcing it fails immediately during client-side catalog validation (no network request is made):\n\ntext\nError: Model unavailable: opencode/muse-spark-1.3-contributor-free\n\n\nopencode --version reports v2.0.32.\n\n## Additional Context\n\nThe last successful use was on 2026-10-11 18:34 (session “Checking what’s new in laptop”, opencode v1.18.35). Earlier usage spans 2026-09-27 through 2026-10-03 on v1.18.32/v1.18.34. All sessions used providerID: opencode, variant: high, cost: 0.\n\nMetadata captured from the locally cached catalog snapshot (from the session store) while the model was live:\n\njson\n{\n \"id\": \"muse-spark-1.3-contributor-free\",\n \"name\": \"Muse Spark 1.3 Free\",\n \"description\": \"Muse Spark 1.3 is a multimodal reasoning model from Meta for coding and agentic workflows.\",\n \"family\": \"muse-free\",\n \"attachment\": true,\n \"reasoning\": true,\n \"reasoning_options\": [{ \"type\": \"effort\", \"values\": [\"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] }],\n \"tool_call\": true,\n \"structured_output\": true,\n \"temperature\": true,\n \"release_date\": \"2026-09-02\",\n \"last_updated\": \"2026-09-02\",\n \"modalities\": { \"input\": [\"text\", \"image\", \"video\", \"pdf\", \"audio\"], \"output\": [\"text\"] },\n \"open_weights\": false,\n \"limit\": { \"context\": 1048576, \"output\": 131072 },\n \"provider\": { \"npm\": \"@ai-sdk/openai\" },\n \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 }\n}\n\n\nRelated model ids that also appeared in the catalog previously: muse-spark-1.2-contributor-free (“Muse Spark 1.2 Free”, released 2026-08-05) and an earlier muse-spark-1.1. If the intent is that the free Muse Spark tier rotates, a deprecation notice plus a documented successor id in the catalog would avoid this confusion.\n\nFrequency: consistently reproducible on v2.0.32 (100% of attempts).\n\nWorkarounds tried: none succeeded. The failure occurs before any request is sent, so no auth, network, or region workaround applies.\n\nRelated change: the disappearance lines up with the 1.18.x to 2.0.x upgrade; the model was present and working in the last 1.18.x sessions and absent after updating.\n\nRequest: please confirm whether muse-spark-1.3-contributor-free was retired intentionally, and if so whether a replacement free Muse model will be offered.\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56541/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56541/timeline”,“performed_via_github_app”:null,“state_reason”:null,“pinned_comment”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56540”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56540/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56540/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56540/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56540”,“id”:5902881784,“node_id”:“PR_kwDOOiiGL88AAAABJElZyQ”,“number”:56540,“title”:“fix(core): lower unparseable streaming tool arguments to an object”,“user”:{“login”:“argszero”,“id”:52026,“node_id”:“MDQ6VXNlcjUyMDI2”,“avatar_url”:“https://avatars.githubusercontent.com/u/52026?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/argszero”,“html_url”:“https://github.com/argszero”,“followers_url”:“https://api.github.com/users/argszero/followers”,“following_url”:“https://api.github.com/users/argszero/following{/other_user}”,“gists_url”:“https://api.github.com/users/argszero/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/argszero/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/argszero/subscriptions”,“organizations_url”:“https://api.github.com/users/argszero/orgs”,“repos_url”:“https://api.github.com/users/argszero/repos”,“events_url”:“https://api.github.com/users/argszero/events{/privacy}”,“received_events_url”:“https://api.github.com/users/argszero/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:41:48Z”,“updated_at”:“2026-10-17T20:44:03Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56540”,“html_url”:“https://github.com/anomalyco/opencode/pull/56540”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56540.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56540.patch”,“merged_at”:null},“body”:”### Issue for this PR\n\nCloses #56127\n\n### Type of change\n\n- [x] Bug fix\n- [ ] New feature\n- [ ] Refactor / code improvement\n- [ ] Documentation\n\n### What does this PR do?\n\ntoLLMMessages lowered a tool call still in streaming state to the raw argument text when that text was not valid JSON. The Anthropic lowerer copies input onto the wire unchanged, so the request carried tool_use.input: \"not-json\" and Anthropic rejected it with 400 tool_use.input: Input should be an object.\n\nThe streaming state stores the accumulated argument text as a String while every other tool state stores a record, so lowering now decodes the text as a JSON object and falls back to {} when it cannot: unparseable text, a truncated stream, or valid JSON that is not an object (an array, a number, null) all lower to an empty object rather than a non-object value. Nothing else changes — a streaming call whose arguments do parse still lowers to the parsed object, and running, completed and error states are untouched.\n\n### How did you verify your code works?\n\nRegression test lowers unparseable streaming tool arguments to an object in packages/core/test/session-runner-message.test.ts lowers one assistant message containing five tool parts through toLLMMessages:\n\n| state | raw input | lowered tool-call.input |\n|---|---|---|\n| streaming | not-json | {} |\n| streaming | [\"pwd\"] | {} |\n| streaming | {\"command\":\"pwd\" (truncated) | {} |\n| streaming | {\"command\":\"pwd\"} | { command: \"pwd\" } |\n| running | { command: \"pwd\" } | { command: \"pwd\" } |\n\nIt fails on the base with the string and array inputs passed through as raw text (29 pass / 1 fail before the fix, 30 pass / 0 fail after).\n\n- bun test test/session-runner-message.test.ts — 30 pass\n- bun test test/session-runner-message.test.ts test/session-generate.test.ts test/session-runner-retry.test.ts — 36 pass\n- bun run typecheck in packages/core — clean\n- oxlint on both changed files — 0 warnings, 0 errors\n\nThe test asserts the lowering boundary, which is where the defect lives: the Anthropic lowerer copies input verbatim, so an object here is what makes tool_use.input an object on the wire. It does not contact a live provider.\n\nAI-assisted implementation and tests; reviewed before publication.\n\n### Screenshots / recordings\n\nNot applicable; message lowering only.\n\n### Checklist\n\n- [x] I have tested my changes locally\n- [x] I have not included unrelated changes in this PR\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56540/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56540/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56539”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56539/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56539/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56539/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56539”,“id”:5902868515,“node_id”:“PR_kwDOOiiGL88AAAABJEkwEQ”,“number”:56539,“title”:“fix(cli): start local service with read-only config”,“user”:{“login”:“harshitsharmaaaa”,“id”:144056261,“node_id”:“U_kgDOCJYfxQ”,“avatar_url”:“https://avatars.githubusercontent.com/u/144056261?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/harshitsharmaaaa”,“html_url”:“https://github.com/harshitsharmaaaa”,“followers_url”:“https://api.github.com/users/harshitsharmaaaa/followers”,“following_url”:“https://api.github.com/users/harshitsharmaaaa/following{/other_user}”,“gists_url”:“https://api.github.com/users/harshitsharmaaaa/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/harshitsharmaaaa/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/harshitsharmaaaa/subscriptions”,“organizations_url”:“https://api.github.com/users/harshitsharmaaaa/orgs”,“repos_url”:“https://api.github.com/users/harshitsharmaaaa/repos”,“events_url”:“https://api.github.com/users/harshitsharmaaaa/events{/privacy}”,“received_events_url”:“https://api.github.com/users/harshitsharmaaaa/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10172891050,“node_id”:“LA_kwDOOiiGL88AAAACXln_qg”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/needs:compliance”,“name”:“needs:compliance”,“color”:“ac0a16”,“default”:false,“description”:“This means the issue will auto-close after 2 hours.”,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:3,“created_at”:“2026-10-17T20:40:13Z”,“updated_at”:“2026-10-17T20:48:05Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56539”,“html_url”:“https://github.com/anomalyco/opencode/pull/56539”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56539.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56539.patch”,“merged_at”:null},“body”:”### Issue for this PR\n\nCloses #\n\n### Type of change\n\n- [x] Bug fix\n- [ ] New feature\n- [ ] Refactor / code improvement\n- [ ] Documentation\n\n### What does this PR do?\n\nFixes local service startup when the configuration directory is read-only.\n\nThe service can generate a password when no password is configured, but startup may fail when it attempts to persist that password in a configuration directory that cannot be written to.\n\nThis change allows the local service to continue with an ephemeral password when password persistence fails, provided no remote configuration requires the persistence operation to succeed. The password remains available for the running service without requiring a write to the read-only configuration directory.\n\nA regression test has been added to packages/cli/test/service-lifecycle.test.ts to cover starting and stopping a local service with a read-only configuration directory.\n\n### How did you verify your code works?\n\n- Added a lifecycle regression test covering service startup with a read-only configuration directory.\n- Verified that the service starts successfully and its registration contains the expected port.\n- Verified that the service can be stopped cleanly.\n\n### Screenshots / recordings\n\nNot applicable. This change affects CLI service startup behavior and does not introduce UI changes.\n\n### Checklist\n\n- [x] I have tested my changes locally\n- [x] I have not included unrelated changes in this PR\n\n---\n\n_Added by the opencode bot (AI-generated).\n\nFixes #56359\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56539/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56539/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56537”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56537/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56537/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56537/events”,“html_url”:“https://github.com/anomalyco/opencode/issues/56537”,“id”:5902795952,“node_id”:“I_kwDOOiiGL88AAAABX9WEsA”,“number”:56537,“title”:“plugin: prepare-stage NpmInstallFailedError - embedded npm fails where system npm succeeds”,“user”:{“login”:“shiux99”,“id”:14370398,“node_id”:“MDQ6VXNlcjE0MzcwMzk4”,“avatar_url”:“https://avatars.githubusercontent.com/u/14370398?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/shiux99”,“html_url”:“https://github.com/shiux99”,“followers_url”:“https://api.github.com/users/shiux99/followers”,“following_url”:“https://api.github.com/users/shiux99/following{/other_user}”,“gists_url”:“https://api.github.com/users/shiux99/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/shiux99/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/shiux99/subscriptions”,“organizations_url”:“https://api.github.com/users/shiux99/orgs”,“repos_url”:“https://api.github.com/users/shiux99/repos”,“events_url”:“https://api.github.com/users/shiux99/events{/privacy}”,“received_events_url”:“https://api.github.com/users/shiux99/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:12585677396,“node_id”:“LA_kwDOOiiGL88AAAAC7ioyVA”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/pending%20close”,“name”:“pending close”,“color”:“54c4e1”,“default”:false,“description”:"",“archived_at”:null,“archived_by”:null},{“id”:12585938172,“node_id”:“LA_kwDOOiiGL88AAAAC7i4s_A”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/triaging”,“name”:“triaging”,“color”:“ededed”,“default”:false,“description”:"",“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:31:49Z”,“updated_at”:“2026-10-17T20:32:29Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“sub_issues_summary”:{“total”:0,“completed”:0,“percent_completed”:0},“issue_dependencies_summary”:{“blocked_by”:0,“total_blocked_by”:0,“blocking”:0,“total_blocking”:0},“body”:”## Summary\n\nPlugin reconciliation fails to install the TUI plugin opencode-sdd-engram-manage at startup: the embedded npm installer reports NpmInstallFailedError at stage=prepare, so the plugin never loads and the error repeats on every launch. System npm (11.16.0) installs the exact same package and version successfully on the same machine.\n\n## Environment\n\n- opencode version: v2.0.32\n- OS: Microsoft Windows NT 10.0.26300.0 (win32 x64)\n- Terminal: TERM=xterm-256color, TERM_PROGRAM unset\n- Shell: C:\WINDOWS\system32\cmd.exe (commands run via PowerShell)\n- Install/channel: npm package @opencode/cli, latest (node v24.18.0, npm 11.16.0)\n- Active plugins:\n - TUI (~/.config/opencode/tui.json): opencode-sdd-engram-manage, opencode-subagent-statusline\n - CLI (~/.config/opencode/cli.json): opencode-sdd-engram-manage, opencode-subagent-statusline\n - Local plugins (~/.config/opencode/plugins/): engram.ts, model-variants.ts, skill-registry.ts\n\n## Reproduction\n\n1. Add \"opencode-sdd-engram-manage\" to the plugins list in ~/.config/opencode/cli.json (and plugin in tui.json).\n2. Launch opencode so plugin reconciliation runs (role=cli).\n3. Check ~/.local/share/opencode/log/opencode.log for:\n\n \n timestamp=2026-10-17T18:24:57.155Z level=WARN message=\"plugin operation failed\" component=plugin id=3 stage=prepare durationMs=2646 error=NpmInstallFailedError reconciliation=1 target=opencode-sdd-engram-manage install=true role=cli\n timestamp=2026-10-17T18:25:42.653Z level=WARN message=\"plugin operation failed\" component=plugin id=21 stage=prepare durationMs=351 error=NpmInstallFailedError reconciliation=2 target=opencode-sdd-engram-manage install=true role=cli\n \n\n4. Reproduces consistently on every launch (observed across multiple reconciliation passes).\n\n## Expected Behavior\n\nReconciliation installs the package into ~/.cache/opencode/npm/opencode-sdd-engram-manage@latest/<epoch>/ and the plugin loads.\n\n## Actual Behavior\n\nNpmInstallFailedError at stage=prepare with install=true. During diagnosis the underlying failure surfaced from the embedded installer’s reify path as unable to resolve dependency tree (Npm.reify), while npm install opencode-sdd-engram-manage@1.7.0 succeeded on the same machine (added 131 packages; only benign warnings: EBADENGINE for @opentui/core@0.6.6 wanting node >=26.4.0, and msgpackr-extract install-script approval). The staging directory was left empty afterwards, so the plugin could not load — it was absent from opencode plugin list.\n\n## Additional Context\n\n- The log’s WARN line records only error=NpmInstallFailedError without the underlying cause, which made the root cause hard to attribute from logs alone.\n- Workaround: install manually with system npm into the exact staging layout opencode expects (~/.cache/opencode/npm/<name>@latest/<epoch>/ containing package.json with {\"dependencies\": {\"<name>\": \"<version>\"}}, package-lock.json, and node_modules), then pin the exact version in config (\"opencode-sdd-engram-manage@1.7.0\"). With this, opencode plugin check reports (current) and reconciliation no longer attempts a reinstall.\n- Related: an older background dependency install failed NpmInstallFailedError appears in the same log (2026-06-28, @opencode-ai/plugin@local) — same error surface, different cause (invalid version spec).\n- Not tested on other platforms.\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56537/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56537/timeline”,“performed_via_github_app”:null,“state_reason”:null,“pinned_comment”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56535”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56535/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56535/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56535/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56535”,“id”:5902752324,“node_id”:“PR_kwDOOiiGL88AAAABJEe-7Q”,“number”:56535,“title”:“fix(console): render FAQ answers in the server HTML”,“user”:{“login”:“kitlangton”,“id”:7587245,“node_id”:“MDQ6VXNlcjc1ODcyNDU=”,“avatar_url”:“https://avatars.githubusercontent.com/u/7587245?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/kitlangton”,“html_url”:“https://github.com/kitlangton”,“followers_url”:“https://api.github.com/users/kitlangton/followers”,“following_url”:“https://api.github.com/users/kitlangton/following{/other_user}”,“gists_url”:“https://api.github.com/users/kitlangton/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/kitlangton/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/kitlangton/subscriptions”,“organizations_url”:“https://api.github.com/users/kitlangton/orgs”,“repos_url”:“https://api.github.com/users/kitlangton/repos”,“events_url”:“https://api.github.com/users/kitlangton/events{/privacy}”,“received_events_url”:“https://api.github.com/users/kitlangton/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:0,“created_at”:“2026-10-17T20:26:29Z”,“updated_at”:“2026-10-17T20:31:56Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56535”,“html_url”:“https://github.com/anomalyco/opencode/pull/56535”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56535.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56535.patch”,“merged_at”:null},“body”:”### Why\n\nThe FAQ answers on the homepage, /zen, /go, /download, /enterprise and /brand only exist after someone clicks the question. Kobalte’s Collapsible.Content doesn’t render while closed, so the server HTML has 8 faq-question nodes and no answers. Search engines, link unfurlers and no-JS readers see the questions without the answers.\n\n### What Changes\n\n- Faq mounts the collapsible with forceMount, so every answer is in the server HTML.\n- A shared faq.css hides closed answers ([data-slot=\"faq-answer\"][data-closed]), so the page looks and behaves the same as before.\n\n### Verification\n\nsh\ncd packages/console/app && bun run typecheck\nbunx vite dev --port 5199\ncurl -s \"http://[::1]:5199/\" | grep -o \"Not necessarily, OpenCode comes with\"\n\n\nThe homepage HTML now includes the answer text. In a browser on the dev server, all answers start out display: none. Clicking a question shows its answer (block), clicking again hides it, and the console shows no errors.\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56535/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56535/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56534”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56534/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56534/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56534/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56534”,“id”:5902752086,“node_id”:“PR_kwDOOiiGL88AAAABJEe-JQ”,“number”:56534,“title”:“fix: add v2 docs to the sitemap and fix its broken entries”,“user”:{“login”:“kitlangton”,“id”:7587245,“node_id”:“MDQ6VXNlcjc1ODcyNDU=”,“avatar_url”:“https://avatars.githubusercontent.com/u/7587245?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/kitlangton”,“html_url”:“https://github.com/kitlangton”,“followers_url”:“https://api.github.com/users/kitlangton/followers”,“following_url”:“https://api.github.com/users/kitlangton/following{/other_user}”,“gists_url”:“https://api.github.com/users/kitlangton/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/kitlangton/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/kitlangton/subscriptions”,“organizations_url”:“https://api.github.com/users/kitlangton/orgs”,“repos_url”:“https://api.github.com/users/kitlangton/repos”,“events_url”:“https://api.github.com/users/kitlangton/events{/privacy}”,“received_events_url”:“https://api.github.com/users/kitlangton/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:0,“created_at”:“2026-10-17T20:26:27Z”,“updated_at”:“2026-10-17T21:11:29Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:true,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56534”,“html_url”:“https://github.com/anomalyco/opencode/pull/56534”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56534.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56534.patch”,“merged_at”:null},“body”:”### Why\n\nopencode.ai/sitemap.xml lists 594 v1 docs URLs and no v2 docs, even though the header now links to the v2 docs. Of those URLs, 33 /docs/uk/* entries return 404 because there are no Ukrainian v1 docs, and most of the rest omit the trailing slash their canonical URLs use. /download, /changelog and the legal pages are missing. The v2 docs also serve every page both with and without a trailing slash, and each form declares itself canonical.\n\n### What Changes\n\nConsole sitemap (packages/console/app)\n\n- Adds /download and both legal pages for each locale, plus /changelog once.\n- v1 docs URLs end with / to match their canonicals, and duplicate URLs are dropped.\n- uk now maps to the English v1 docs, so Ukrainian visitors following a docs link no longer hit /docs/uk/… 404s, and the sitemap stops listing those URLs.\n- robots.txt advertises https://opencode.ai/v2/sitemap.xml.\n\nv2 docs (services/www)\n\n- New prerendered /v2/sitemap.xml built from the docs navigation, the same source llms.txt uses.\n- Canonical URLs come from docsHref(slug) rather than the request path, so /v2/docs/agents and /v2/docs/agents/ both point at /v2/docs/agents/, the form the sidebar links to.\n- The prerendered API page is served from static assets, which redirect /v2/docs/api/ → /v2/docs/api, so docsHref(\"api\") drops the trailing slash. Its canonical URL, sidebar link and sitemap entry all use the URL that returns 200.\n\n### Scope\n\nv1 docs stay in the sitemap. Whether to drop them in favor of v2 is a separate decision. #55448 (multi-language v2 docs) will need to add locale URLs to the new sitemap.\n\n### Verification\n\nsh\ncd packages/console/app && bun run typecheck && bun test && bun script/generate-sitemap.ts\ncd services/www && bun typecheck && bun run check:generated && bun run build\n\n\n- Console sitemap: 706 URLs, no /docs/uk/, every docs URL ends with /, and spot-checked URLs return 200 on opencode.ai.\n- dist/client/v2/sitemap.xml: 62 URLs. All 62 paths return 200 on opencode.ai with no redirect. (Local builds use the dev.opencode.ai host; production builds use opencode.ai, as llms.txt does.)\n- astro dev: /v2/docs/agents, /v2/docs/agents/, /v2/docs and /v2/docs/build/plugins all render a trailing-slash canonical. The built API page’s canonical is https://opencode.ai/v2/docs/api.\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56534/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56534/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56533”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56533/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56533/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56533/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56533”,“id”:5902751720,“node_id”:“PR_kwDOOiiGL88AAAABJEe8_A”,“number”:56533,“title”:“fix(console): give each marketing page a single meta description”,“user”:{“login”:“kitlangton”,“id”:7587245,“node_id”:“MDQ6VXNlcjc1ODcyNDU=”,“avatar_url”:“https://avatars.githubusercontent.com/u/7587245?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/kitlangton”,“html_url”:“https://github.com/kitlangton”,“followers_url”:“https://api.github.com/users/kitlangton/followers”,“following_url”:“https://api.github.com/users/kitlangton/following{/other_user}”,“gists_url”:“https://api.github.com/users/kitlangton/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/kitlangton/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/kitlangton/subscriptions”,“organizations_url”:“https://api.github.com/users/kitlangton/orgs”,“repos_url”:“https://api.github.com/users/kitlangton/repos”,“events_url”:“https://api.github.com/users/kitlangton/events{/privacy}”,“received_events_url”:“https://api.github.com/users/kitlangton/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:0,“created_at”:“2026-10-17T20:26:24Z”,“updated_at”:“2026-10-17T20:30:43Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56533”,“html_url”:“https://github.com/anomalyco/opencode/pull/56533”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56533.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56533.patch”,“merged_at”:null},“body”:”### Why\n\napp.tsx adds a site-wide <meta name=\"description\">, and the marketing pages add their own on top, so /go, /download, /enterprise, /brand and the legal pages all ship two descriptions, with the generic “OpenCode - The open source coding agent.” first. /zen only gets the generic one.\n\n### What Changes\n\n| Page | Before | After |\n| --- | --- | --- |\n| / | generic (from app.tsx) | same text, now set by the page |\n| /zen | generic only | Zen hero copy (zen.hero.body, localized) |\n| /go, /download, /enterprise, /brand, legal | generic + page description | page description only |\n\n### Verification\n\nsh\ncd packages/console/app && bun run typecheck\nbunx vite dev --port 5199\nfor p in / /zen /go /download /enterprise /brand /de/zen; do curl -s \"http://[::1]:5199$p\" | grep -o '<meta[^>]*name=\"description\"[^>]*>'; done\n\n\nBefore the change, the local dev server reproduced the duplicates seen on opencode.ai. After it, each page above has exactly one description, and /de/zen gets the German Zen copy.\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56533/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56533/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56532”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56532/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56532/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56532/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56532”,“id”:5902751424,“node_id”:“PR_kwDOOiiGL88AAAABJEe8Dw”,“number”:56532,“title”:“docs(console): align card fee and billing wording with the billing page”,“user”:{“login”:“kitlangton”,“id”:7587245,“node_id”:“MDQ6VXNlcjc1ODcyNDU=”,“avatar_url”:“https://avatars.githubusercontent.com/u/7587245?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/kitlangton”,“html_url”:“https://github.com/kitlangton”,“followers_url”:“https://api.github.com/users/kitlangton/followers”,“following_url”:“https://api.github.com/users/kitlangton/following{/other_user}”,“gists_url”:“https://api.github.com/users/kitlangton/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/kitlangton/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/kitlangton/subscriptions”,“organizations_url”:“https://api.github.com/users/kitlangton/orgs”,“repos_url”:“https://api.github.com/users/kitlangton/repos”,“events_url”:“https://api.github.com/users/kitlangton/events{/privacy}”,“received_events_url”:“https://api.github.com/users/kitlangton/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:0,“created_at”:“2026-10-17T20:26:22Z”,“updated_at”:“2026-10-17T21:11:27Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:true,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56532”,“html_url”:“https://github.com/anomalyco/opencode/pull/56532”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56532.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56532.patch”,“merged_at”:null},“body”:”### Why\n\nThe Console docs give two different card fees. console/models says 4.4% + $0.30 and console/billing says 4.6% + $0.31. The billing page is the one that matches the site: the Zen page charges $1.23 per $20 top-up (4.6% × 20 + 0.31), and billing’s own example works out ($50 → $52.61). console/models also still describes the old Auto-reload and Monthly limits settings, and console/go names a Use balance toggle that the billing page calls Extra usage.\n\n### What Changes\n\n- console/models: the fee callout now says 4.6% + $0.31 per purchase.\n- console/models: the outdated Auto-reload / Monthly limits sections become one short section linking to Auto-recharge and Budgets.\n- console/go: Use balance → Extra usage on the Overview credits card, matching console/billing.\n\n### Scope\n\nThe stale model tables in console/models are left alone because #55943 already edits that list.\n\n### Verification\n\nsh\nrg -n \"4\\.4%|Use balance|Auto-reload\" services/www/src/docs/content\n\n\nNo matches remain.\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56532/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56532/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56531”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56531/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56531/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56531/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56531”,“id”:5902751023,“node_id”:“PR_kwDOOiiGL88AAAABJEe6vQ”,“number”:56531,“title”:“fix(console): send localized changelog URLs to the changelog worker”,“user”:{“login”:“kitlangton”,“id”:7587245,“node_id”:“MDQ6VXNlcjc1ODcyNDU=”,“avatar_url”:“https://avatars.githubusercontent.com/u/7587245?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/kitlangton”,“html_url”:“https://github.com/kitlangton”,“followers_url”:“https://api.github.com/users/kitlangton/followers”,“following_url”:“https://api.github.com/users/kitlangton/following{/other_user}”,“gists_url”:“https://api.github.com/users/kitlangton/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/kitlangton/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/kitlangton/subscriptions”,“organizations_url”:“https://api.github.com/users/kitlangton/orgs”,“repos_url”:“https://api.github.com/users/kitlangton/repos”,“events_url”:“https://api.github.com/users/kitlangton/events{/privacy}”,“received_events_url”:“https://api.github.com/users/kitlangton/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:0,“created_at”:“2026-10-17T20:26:19Z”,“updated_at”:“2026-10-17T20:30:56Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56531”,“html_url”:“https://github.com/anomalyco/opencode/pull/56531”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56531.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56531.patch”,“merged_at”:null},“body”:”### Why\n\nThe changelog worker owns opencode.ai/changelog and shows v2 release notes. Localized URLs such as /zh/changelog don’t match its route, so they fall through to the old SolidStart page, which shows v1.19.3 notes in English. The footer on every localized page links there, so localized visitors see a changelog that’s months out of date.\n\n### What Changes\n\n| Request | Before | After |\n| --- | --- | --- |\n| /de/changelog, /zh/changelog/ | 200, legacy v1 changelog | 301 → /changelog |\n| Footer “Changelog” on /de/* | /de/changelog | /changelog |\n| /de/changelog.json, /de/download | unchanged | unchanged |\n\nlanguage.route() now leaves /changelog unprefixed, and the middleware redirects a locale-prefixed changelog before stripping the locale. The legacy changelog route no longer emits hreflang alternates, since they would all point at the same URL.\n\n### Verification\n\nsh\ncd packages/console/app && bun run typecheck && bun test test/language.test.ts\nbunx vite dev --port 5199\ncurl -s -o /dev/null -w \"%{http_code} %{redirect_url}\\n\" http://[::1]:5199/de/changelog\n\n\nAgainst the local dev server: /de/changelog and /zh/changelog/ return 301 to /changelog; /de/download, /changelog and /de/changelog.json return 200.\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56531/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56531/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56530”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56530/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56530/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56530/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56530”,“id”:5902750696,“node_id”:“PR_kwDOOiiGL88AAAABJEe5uw”,“number”:56530,“title”:“fix(console): point marketing docs links to the v2 docs”,“user”:{“login”:“kitlangton”,“id”:7587245,“node_id”:“MDQ6VXNlcjc1ODcyNDU=”,“avatar_url”:“https://avatars.githubusercontent.com/u/7587245?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/kitlangton”,“html_url”:“https://github.com/kitlangton”,“followers_url”:“https://api.github.com/users/kitlangton/followers”,“following_url”:“https://api.github.com/users/kitlangton/following{/other_user}”,“gists_url”:“https://api.github.com/users/kitlangton/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/kitlangton/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/kitlangton/subscriptions”,“organizations_url”:“https://api.github.com/users/kitlangton/orgs”,“repos_url”:“https://api.github.com/users/kitlangton/repos”,“events_url”:“https://api.github.com/users/kitlangton/events{/privacy}”,“received_events_url”:“https://api.github.com/users/kitlangton/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:0,“created_at”:“2026-10-17T20:26:16Z”,“updated_at”:“2026-10-17T21:11:28Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:true,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56530”,“html_url”:“https://github.com/anomalyco/opencode/pull/56530”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56530.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56530.patch”,“merged_at”:null},“body”:”### Why\n\nThe header sends people to the v2 docs, but the homepage “Read docs” button, the footer, the FAQ answers, the 404 page and the changelog footer still link to the v1 docs at /docs, which tell you to install v1. The /download FAQ had also drifted from the homepage FAQ: it says you “probably” need a paid AI subscription and doesn’t mention the free models.\n\n### What Changes\n\n| Where | Before | After |\n| --- | --- | --- |\n| Homepage “Read docs”, footer “Docs”, 404 “Docs”, changelog footer | /docs (localized v1) | /v2/docs |\n| FAQ “intro” link | /docs | /v2/docs |\n| FAQ “local models” | /docs/providers/#lm-studio | /v2/docs/providers/#runtimes |\n| FAQ “existing subscriptions” | /docs/providers/#directory | /v2/docs/providers/ |\n| FAQ “web” | /docs/web, /docs/cli/#web | /v2/docs/cli/web/ |\n| /download FAQ “Do I need extra AI subscriptions?” and “How much does it cost?” | separate download.faq.* copy | same answers as the homepage (home.faq.a3, home.faq.a6) |\n\nThe unused download.faq.* strings are removed from all 18 locales.\n\n### Scope\n\nThe v2 docs are English-only for now, so localized visitors now get English v2 docs instead of localized v1 docs (#55448 adds translations). Links with no v2 page yet stay on v1: the homepage privacy link (/docs/enterprise/) and the IDE, GitHub and GitLab cards on /download.\n\n### Verification\n\nsh\ncd packages/console/app && bun run typecheck && bun test\nfor p in /v2/docs /v2/docs/providers/ /v2/docs/cli/web/; do curl -s -o /dev/null -w \"$p %{http_code}\\n\" https://opencode.ai$p; done\n\n\nTypecheck passes, 50 tests pass, every new link target returns 200 on opencode.ai, and #runtimes exists on the providers page.\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56530/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56530/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56529”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56529/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56529/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56529/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56529”,“id”:5902750119,“node_id”:“PR_kwDOOiiGL88AAAABJEe36g”,“number”:56529,“title”:“fix(console): link header GitHub item to the repository root”,“user”:{“login”:“kitlangton”,“id”:7587245,“node_id”:“MDQ6VXNlcjc1ODcyNDU=”,“avatar_url”:“https://avatars.githubusercontent.com/u/7587245?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/kitlangton”,“html_url”:“https://github.com/kitlangton”,“followers_url”:“https://api.github.com/users/kitlangton/followers”,“following_url”:“https://api.github.com/users/kitlangton/following{/other_user}”,“gists_url”:“https://api.github.com/users/kitlangton/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/kitlangton/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/kitlangton/subscriptions”,“organizations_url”:“https://api.github.com/users/kitlangton/orgs”,“repos_url”:“https://api.github.com/users/kitlangton/repos”,“events_url”:“https://api.github.com/users/kitlangton/events{/privacy}”,“received_events_url”:“https://api.github.com/users/kitlangton/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:0,“created_at”:“2026-10-17T20:26:12Z”,“updated_at”:“2026-10-17T20:28:55Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56529”,“html_url”:“https://github.com/anomalyco/opencode/pull/56529”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56529.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56529.patch”,“merged_at”:null},“body”:”### Why\n\nThe GitHub item in the opencode.ai header links to github.com/anomalyco/opencode/tree/v2. That branch was retired on 2026-10-10 and is now about 1,600 commits behind dev, so visitors land on stale code. The footer and the homepage FAQ already link to the repository root.\n\n### What Changes\n\n| Link | Before | After |\n| --- | --- | --- |\n| Header GitHub (desktop and mobile) | …/opencode/tree/v2 | …/opencode |\n\n### Verification\n\nsh\ncd packages/console/app && bun run typecheck\n\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56529/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56529/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56528”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56528/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56528/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56528/events”,“html_url”:“https://github.com/anomalyco/opencode/issues/56528”,“id”:5902748352,“node_id”:“I_kwDOOiiGL88AAAABX9TKwA”,“number”:56528,“title”:“Agent switch corrupts the session sequence counter → session permanently wedged (UNIQUE constraint on session_message.seq)”,“user”:{“login”:“hgn389”,“id”:170797638,“node_id”:“U_kgDOCi4qRg”,“avatar_url”:“https://avatars.githubusercontent.com/u/170797638?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/hgn389”,“html_url”:“https://github.com/hgn389”,“followers_url”:“https://api.github.com/users/hgn389/followers”,“following_url”:“https://api.github.com/users/hgn389/following{/other_user}”,“gists_url”:“https://api.github.com/users/hgn389/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/hgn389/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/hgn389/subscriptions”,“organizations_url”:“https://api.github.com/users/hgn389/orgs”,“repos_url”:“https://api.github.com/users/hgn389/repos”,“events_url”:“https://api.github.com/users/hgn389/events{/privacy}”,“received_events_url”:“https://api.github.com/users/hgn389/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:12585677396,“node_id”:“LA_kwDOOiiGL88AAAAC7ioyVA”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/pending%20close”,“name”:“pending close”,“color”:“54c4e1”,“default”:false,“description”:"",“archived_at”:null,“archived_by”:null},{“id”:12585938172,“node_id”:“LA_kwDOOiiGL88AAAAC7i4s_A”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/triaging”,“name”:“triaging”,“color”:“ededed”,“default”:false,“description”:"",“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:25:59Z”,“updated_at”:“2026-10-17T20:26:46Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“sub_issues_summary”:{“total”:0,“completed”:0,“percent_completed”:0},“issue_dependencies_summary”:{“blocked_by”:0,“total_blocked_by”:0,“blocking”:0,“total_blocking”:0},“body”:”### Description\n\n# Agent switch corrupts the session sequence counter → session permanently wedged (UNIQUE constraint on session_message.seq)\n\n## Environment\n- OpenCode CLI/server: v2.0.32 (TUI + web-login server, opencode serve)\n- Storage: SQLite (opencode-web-login-v1.db), WAL mode\n- Schema: session_message has a unique index (session_id, seq); the sequence counter lives in event_sequence(aggregate_id) -> seq; pending inputs queue in session_inbox\n- State affected: long-running session (single directory, ~1600 seq messages)\n\n## Summary\nSwitching the agent on an existing long-running session reset the session’s sequence counter to 0 instead of continuing past the highest already-used seq. The newly generated messages then march upward from seq 0 until they hit an already-occupied seq, where the insert fails permanently:\n\n SQLiteError: UNIQUE constraint failed: session_message.session_id, session_message.seq\n\nOnce this starts, every operation on the session fails with HTTP 500 (agent switch, model switch, inbox promote / drain) and the session becomes unrecoverable via the UI. Restarting the server does not help — the counter is rehydrated from the corrupted low value and the session keeps failing.\n\n## Impact\n- Session is permanently stuck; every user action returns 500\n- Pending user messages can sit in session_inbox without being delivered (or get dropped on enqueue/retry)\n- Compaction enters a retry loop: it keeps re-attempting, burning one seq per attempt, and wedges at the first occupied seq\n- Data itself is not lost, but the session is unusable until the counter is repaired manually\n\n## Reproduction\n1. Use a session that has accumulated many messages (original projection seq space occupied up to N, e.g. N=1605).\n2. Switch agent (e.g. build → plan).\n3. (Aggravating factor observed, likely race) a second opencode serve --service instance running concurrently, sharing the same SQLite DB.\n4. Observe:\n - agent-switched message is inserted with seq=0 while projection max seq is 1605 (counter reset, not continued)\n - promoting the next queued message fails with UNIQUE constraint failed: session_message.session_id, session_message.seq\n - POST /api/session/{id}/model → 500 with the same error, repeatedly\n\n## Evidence\n\nTimeline (all messages logged with exact timestamps):\n\n- 14:42:57 — previous round completes normally (idle, succeeded)\n- 17:21:21 — user switches agent build → plan; record agent-switched written at seq=0; queued user message gets enqueued_seq=1 in session_inbox; SessionRunner.drain → SessionInbox.promote → SessionInbox.publish fails with:\n Failed to drain Session\n cause: SQLiteError: UNIQUE constraint failed: session_message.session_id, session_message.seq\n Session state becomes suspended, message never delivered.\n- 17:40:15-17:40:43 — three attempts to switch model:\n POST /api/session/…/model → 500\n at Session.switchModel\n UNIQUE constraint failed: session_message.session_id, session_message.seq\n- Counter state after corruption:\n event_sequence.seq = 76 <- cursor points into an already-occupied low range\n session_message: min seq 0, max seq 1605 (all seqs 0..1605 occupied by pre-reset history)\n- 18:43:32 — server restart does NOT fix it. The runner rehydrates from the low counter and keeps writing LOW seqs (8, 9, 10, 17, 19, 22, 23, 26, 29, 34, 35, … up to 74), then wedges permanently at the first occupied seq (77):\n compaction seq 23, 26, 29, … 74 -> next attempt 77 -> UNIQUE violation, no progress\n\nRoot-cause smoking gun: the agent-switched record exists at seq=0 while other records of the same session occupy seq 0–1605 with strictly increasing timestamps after seq 0 — the counter was reset to 0 at agent-switch time, instead of max(session_message.seq)+1.\n\nRelevant code path (from the stack trace):\n SessionRunner.drain -> SessionInbox.promote -> SessionInbox.publish\n -> insert into session_message (unique index on (session_id, seq)) FAILS\n Session.switchModel -> same insert, same failure\n\n## Workaround / Fix that unblocked me\nRepairing the counter to be above the occupied range restored the session immediately (no code change needed):\n\n — event_sequence.seq for the session: 76 -> (MAX(seq)+1) per session_message\n UPDATE event_sequence\n SET seq = (SELECT MAX(seq)+1 FROM session_message WHERE session_id = ?)\n WHERE aggregate_id = ?;\n\nafter which a server restart rehydrates the counter correctly and:\n- the queued message is delivered normally\n- the compaction retry loop completes\n- model switching works again\n- zero UNIQUE errors in the log after the restart\n\n## Suggested fix\nEither of:\n1. On session (re)load / agent switch, recompute the counter as max(seq)+1 over session_message for that session (and assert event_sequence.seq > max(session_message.seq) when rehydrating — if lower, self-heal instead of failing inserts forever).\n2. Make the projection insert resilient: on UNIQUE(seq) collision, re-derive seq = COALESCE(MAX(seq), -1) + 1 for the session instead of hard-failing the whole runner and wedging the session in an unrecoverable suspended state.\n\nThe self-healing on rehydration seems especially important: currently a corrupted counter is reloaded on every restart and the session remains dead forever.\n\n### Plugins\n\n_No response\n\n### OpenCode version\n\n_No response_\n\n### Steps to reproduce\n\n_No response_\n\n### Screenshot and/or share link\n\n_No response_\n\n### Operating System\n\n_No response_\n\n### Terminal\n\n_No response_”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56528/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56528/timeline”,“performed_via_github_app”:null,“state_reason”:null,“pinned_comment”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56527”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56527/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56527/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56527/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56527”,“id”:5902705793,“node_id”:“PR_kwDOOiiGL88AAAABJEcrjA”,“number”:56527,“title”:“fix(core): support older Git in untracked diff batching”,“user”:{“login”:“langgexyz”,“id”:4607589,“node_id”:“MDQ6VXNlcjQ2MDc1ODk=”,“avatar_url”:“https://avatars.githubusercontent.com/u/4607589?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/langgexyz”,“html_url”:“https://github.com/langgexyz”,“followers_url”:“https://api.github.com/users/langgexyz/followers”,“following_url”:“https://api.github.com/users/langgexyz/following{/other_user}”,“gists_url”:“https://api.github.com/users/langgexyz/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/langgexyz/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/langgexyz/subscriptions”,“organizations_url”:“https://api.github.com/users/langgexyz/orgs”,“repos_url”:“https://api.github.com/users/langgexyz/repos”,“events_url”:“https://api.github.com/users/langgexyz/events{/privacy}”,“received_events_url”:“https://api.github.com/users/langgexyz/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10172891050,“node_id”:“LA_kwDOOiiGL88AAAACXln_qg”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/needs:compliance”,“name”:“needs:compliance”,“color”:“ac0a16”,“default”:false,“description”:“This means the issue will auto-close after 2 hours.”,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:3,“created_at”:“2026-10-17T20:20:56Z”,“updated_at”:“2026-10-17T21:03:12Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56527”,“html_url”:“https://github.com/anomalyco/opencode/pull/56527”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56527.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56527.patch”,“merged_at”:null},“body”:”## Summary\n- Retry batched untracked-file staging without git add --sparse when the installed Git rejects that option.\n- Preserve the per-file fallback when compatible batch staging still fails.\n\n## Evidence\n- On Apple Git 2.50.1, git add --sparse exits 129 (unknown option 'sparse'). The batch then silently fell back to per-file commands, spawning 137 Git processes for 40 untracked files.\n- The existing batching regression test now passes on this Git version.\n\n## Verification\n- bun script/test.ts --test-name-pattern 'batches untracked files without spawning Git per file or touching the index' — pass.\n- bun run typecheck in packages/core — pass.\n- bun script/test.ts in packages/core — 6,646 pass, 43 skip, 0 fail.\n\n\n---\n\n_Added by the opencode bot (AI-generated).\n\nRelated: #52953\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56527/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56527/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56526”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56526/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56526/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56526/events”,“html_url”:“https://github.com/anomalyco/opencode/issues/56526”,“id”:5902688295,“node_id”:“I_kwDOOiiGL88AAAABX9PgJw”,“number”:56526,“title”:“oauth”,“user”:{“login”:“ahm22004”,“id”:94788163,“node_id”:“U_kgDOBaZaQw”,“avatar_url”:“https://avatars.githubusercontent.com/u/94788163?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/ahm22004”,“html_url”:“https://github.com/ahm22004”,“followers_url”:“https://api.github.com/users/ahm22004/followers”,“following_url”:“https://api.github.com/users/ahm22004/following{/other_user}”,“gists_url”:“https://api.github.com/users/ahm22004/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/ahm22004/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/ahm22004/subscriptions”,“organizations_url”:“https://api.github.com/users/ahm22004/orgs”,“repos_url”:“https://api.github.com/users/ahm22004/repos”,“events_url”:“https://api.github.com/users/ahm22004/events{/privacy}”,“received_events_url”:“https://api.github.com/users/ahm22004/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:12585938172,“node_id”:“LA_kwDOOiiGL88AAAAC7i4s_A”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/triaging”,“name”:“triaging”,“color”:“ededed”,“default”:false,“description”:"",“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:6,“created_at”:“2026-10-17T20:18:49Z”,“updated_at”:“2026-10-17T21:06:08Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“sub_issues_summary”:{“total”:0,“completed”:0,“percent_completed”:0},“issue_dependencies_summary”:{“blocked_by”:0,“total_blocked_by”:0,“blocking”:0,“total_blocking”:0},“body”:“how can opencode desktop oauth on opencode console, then req api key to connect?”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56526/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56526/timeline”,“performed_via_github_app”:null,“state_reason”:null,“pinned_comment”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56524”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56524/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56524/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56524/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56524”,“id”:5902655687,“node_id”:“PR_kwDOOiiGL88AAAABJEaNAQ”,“number”:56524,“title”:“fix(core): store tool output in workspace environments”,“user”:{“login”:“Dante-dan”,“id”:19773791,“node_id”:“MDQ6VXNlcjE5NzczNzkx”,“avatar_url”:“https://avatars.githubusercontent.com/u/19773791?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/Dante-dan”,“html_url”:“https://github.com/Dante-dan”,“followers_url”:“https://api.github.com/users/Dante-dan/followers”,“following_url”:“https://api.github.com/users/Dante-dan/following{/other_user}”,“gists_url”:“https://api.github.com/users/Dante-dan/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/Dante-dan/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/Dante-dan/subscriptions”,“organizations_url”:“https://api.github.com/users/Dante-dan/orgs”,“repos_url”:“https://api.github.com/users/Dante-dan/repos”,“events_url”:“https://api.github.com/users/Dante-dan/events{/privacy}”,“received_events_url”:“https://api.github.com/users/Dante-dan/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:14:59Z”,“updated_at”:“2026-10-17T20:17:47Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56524”,“html_url”:“https://github.com/anomalyco/opencode/pull/56524”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56524.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56524.patch”,“merged_at”:null},“body”:”### Issue for this PR\n\nCloses #56466\n\n### Type of change\n\n- [x] Bug fix\n- [ ] New feature\n- [ ] Refactor / code improvement\n- [ ] Documentation\n\n### What does this PR do?\n\nShell capture and truncated tool output now use the Location’s environment filesystem. Workspace drivers can choose temporary storage and stream writes through their filesystem overrides, so large captures stay out of the host isolate. Local and process-backed drivers stream directly to disk; workspace retention also runs in the owning filesystem.\n\n### How did you verify your code works?\n\n- Workspace regression covers 2 MB of streamed shell output, range reads, removal, truncated tool output, and lazy storage access; passed ten repetitions.\n- The issue’s seq 1 2000000 reproducer passes with the command cwd set to an existing host directory: workspace storage contains the output and the host file is absent.\n- bun run check and the unchanged pre-push check: 34/34 tasks passed.\n- Final seven-file suite: 189 passed, 30 skipped, 7 failed. All seven also fail on the exact dev base on this Mac (Bash compatibility and the ready-file watcher timeout). Environment conformance covers streamed writes and truncation.\n\n### Screenshots / recordings\n\nNot applicable.\n\n### Checklist\n\n- [x] I have tested my changes locally\n- [x] I have not included unrelated changes in this PR\n\n\n---\n\n_Added by the opencode bot (AI-generated).\n\nRelated: #56391, #44552\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56524/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56524/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56523”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56523/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56523/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56523/events”,“html_url”:“https://github.com/anomalyco/opencode/issues/56523”,“id”:5902600267,“node_id”:“I_kwDOOiiGL88AAAABX9KISw”,“number”:56523,“title”:“OpenCode Zen Free Models Rate Limit After Opening Multiple Sessions”,“user”:{“login”:“MarkChristopherAlcantara”,“id”:168482736,“node_id”:“U_kgDOCgrXsA”,“avatar_url”:“https://avatars.githubusercontent.com/u/168482736?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/MarkChristopherAlcantara”,“html_url”:“https://github.com/MarkChristopherAlcantara”,“followers_url”:“https://api.github.com/users/MarkChristopherAlcantara/followers”,“following_url”:“https://api.github.com/users/MarkChristopherAlcantara/following{/other_user}”,“gists_url”:“https://api.github.com/users/MarkChristopherAlcantara/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/MarkChristopherAlcantara/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/MarkChristopherAlcantara/subscriptions”,“organizations_url”:“https://api.github.com/users/MarkChristopherAlcantara/orgs”,“repos_url”:“https://api.github.com/users/MarkChristopherAlcantara/repos”,“events_url”:“https://api.github.com/users/MarkChristopherAlcantara/events{/privacy}”,“received_events_url”:“https://api.github.com/users/MarkChristopherAlcantara/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:12585677396,“node_id”:“LA_kwDOOiiGL88AAAAC7ioyVA”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/pending%20close”,“name”:“pending close”,“color”:“54c4e1”,“default”:false,“description”:"",“archived_at”:null,“archived_by”:null},{“id”:12585938172,“node_id”:“LA_kwDOOiiGL88AAAAC7i4s_A”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/triaging”,“name”:“triaging”,“color”:“ededed”,“default”:false,“description”:"",“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:08:47Z”,“updated_at”:“2026-10-17T20:11:00Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“sub_issues_summary”:{“total”:0,“completed”:0,“percent_completed”:0},“issue_dependencies_summary”:{“blocked_by”:0,“total_blocked_by”:0,“blocking”:0,“total_blocking”:0},“body”:”### Description\n\nI’m experiencing a rate limit issue with all OpenCode Zen built-in free models.\n\nBefore the issue started, I had one session running and actively working. While that session was still running, I opened a second session and started sending messages there as well.\n\nAfter that, all free models started returning this error:\n\n”Rate limit exceeded. Please try again later.”\n\nI tried switching between different free models, but the error persisted across all of them.\n\nCould running two sessions simultaneously have caused me to reach a shared usage limit? If so, could you please tell me when my free usage will reset?\n\nI’d also appreciate confirmation of whether this is a temporary rate limit or an account-specific restriction.\n\nThank you for your help\n\n### Plugins\n\n_No response_\n\n### OpenCode version\n\n_No response_\n\n### Steps to reproduce\n\n_No response_\n\n### Screenshot and/or share link\n\n_No response_\n\n### Operating System\n\n_No response_\n\n### Terminal\n\n_No response_”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56523/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56523/timeline”,“performed_via_github_app”:null,“state_reason”:null,“pinned_comment”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56521”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56521/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56521/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56521/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56521”,“id”:5902554403,“node_id”:“PR_kwDOOiiGL88AAAABJEVIzA”,“number”:56521,“title”:“fix(core): hide subagent tools at the configured depth limit”,“user”:{“login”:“rudycelekli”,“id”:47457359,“node_id”:“MDQ6VXNlcjQ3NDU3MzU5”,“avatar_url”:“https://avatars.githubusercontent.com/u/47457359?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/rudycelekli”,“html_url”:“https://github.com/rudycelekli”,“followers_url”:“https://api.github.com/users/rudycelekli/followers”,“following_url”:“https://api.github.com/users/rudycelekli/following{/other_user}”,“gists_url”:“https://api.github.com/users/rudycelekli/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/rudycelekli/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/rudycelekli/subscriptions”,“organizations_url”:“https://api.github.com/users/rudycelekli/orgs”,“repos_url”:“https://api.github.com/users/rudycelekli/repos”,“events_url”:“https://api.github.com/users/rudycelekli/events{/privacy}”,“received_events_url”:“https://api.github.com/users/rudycelekli/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:03:59Z”,“updated_at”:“2026-10-17T20:11:18Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56521”,“html_url”:“https://github.com/anomalyco/opencode/pull/56521”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56521.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56521.patch”,“merged_at”:null},“body”:”### Issue for this PR\nCloses #53356\n\n### Type of change\n- [x] Bug fix\n\n### What does this PR do?\nRemove the subagent tool from context, compaction, and generation hooks when session ancestry reaches the configured depth. Retain the registered execution guard.\n\n### How did you verify your code works?\nActual PluginSupervisor, Session ancestry, Tool registry, and PluginHooks: nine regression failures and six controls before; all 15 matrix cases pass after. Full Core suite/typecheck and root check pass in isolated native Linux CI. This Mac did not run this candidate because disk is below reserve.\n\nSource-bound qualification.\n\n### Screenshots / recordings\nNo visual UI code changed; behavior is asserted directly.\n\n### Checklist\n- [x] I have tested my changes in isolated native CI checkouts (details above)\n- [x] I have not included unrelated changes in this PR\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56521/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56521/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56520”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56520/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56520/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56520/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56520”,“id”:5902553502,“node_id”:“PR_kwDOOiiGL88AAAABJEVFyw”,“number”:56520,“title”:“fix(core): bound hung formatter execution”,“user”:{“login”:“rudycelekli”,“id”:47457359,“node_id”:“MDQ6VXNlcjQ3NDU3MzU5”,“avatar_url”:“https://avatars.githubusercontent.com/u/47457359?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/rudycelekli”,“html_url”:“https://github.com/rudycelekli”,“followers_url”:“https://api.github.com/users/rudycelekli/followers”,“following_url”:“https://api.github.com/users/rudycelekli/following{/other_user}”,“gists_url”:“https://api.github.com/users/rudycelekli/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/rudycelekli/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/rudycelekli/subscriptions”,“organizations_url”:“https://api.github.com/users/rudycelekli/orgs”,“repos_url”:“https://api.github.com/users/rudycelekli/repos”,“events_url”:“https://api.github.com/users/rudycelekli/events{/privacy}”,“received_events_url”:“https://api.github.com/users/rudycelekli/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:03:55Z”,“updated_at”:“2026-10-17T20:12:19Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56520”,“html_url”:“https://github.com/anomalyco/opencode/pull/56520”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56520.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56520.patch”,“merged_at”:null},“body”:”### Issue for this PR\nCloses #45908\n\n### Type of change\n- [x] Bug fix\n\n### What does this PR do?\nApply the existing process-runner deadline to formatters so a hung child terminates after two minutes and returns the existing failure result. No new configuration setting.\n\n### How did you verify your code works?\nA real hung child proves the deadline is scheduled, then controlled clock expiry verifies failure and child termination without a two-minute sleep. Baseline fails; 10 repetitions and 27 related tests pass. Hosted full Core suite/typecheck and root check pass.\n\nSource-bound qualification.\n\n### Screenshots / recordings\nNo visual UI code changed; behavior is asserted directly.\n\n### Checklist\n- [x] I have tested my changes locally\n- [x] I have not included unrelated changes in this PR\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56520/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56520/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56519”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56519/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56519/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56519/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56519”,“id”:5902552923,“node_id”:“PR_kwDOOiiGL88AAAABJEVD_g”,“number”:56519,“title”:“fix(core): preserve notices for unsupported attachments”,“user”:{“login”:“rudycelekli”,“id”:47457359,“node_id”:“MDQ6VXNlcjQ3NDU3MzU5”,“avatar_url”:“https://avatars.githubusercontent.com/u/47457359?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/rudycelekli”,“html_url”:“https://github.com/rudycelekli”,“followers_url”:“https://api.github.com/users/rudycelekli/followers”,“following_url”:“https://api.github.com/users/rudycelekli/following{/other_user}”,“gists_url”:“https://api.github.com/users/rudycelekli/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/rudycelekli/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/rudycelekli/subscriptions”,“organizations_url”:“https://api.github.com/users/rudycelekli/orgs”,“repos_url”:“https://api.github.com/users/rudycelekli/repos”,“events_url”:“https://api.github.com/users/rudycelekli/events{/privacy}”,“received_events_url”:“https://api.github.com/users/rudycelekli/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:03:51Z”,“updated_at”:“2026-10-17T20:12:56Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56519”,“html_url”:“https://github.com/anomalyco/opencode/pull/56519”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56519.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56519.patch”,“merged_at”:null},“body”:”### Issue for this PR\nCloses #41722\n\n### Type of change\n- [x] Bug fix\n\n### What does this PR do?\nKeep unsupported user attachments visible as a format notice in model context, including attachment-only prompts. Do not forward unsupported binary data.\n\n### How did you verify your code works?\nNine regressions fail before; 90 repeated focused passes and 319 related tests pass after. Tests cover AVIF/TIFF/ZIP, identifiers, durable prompt admission, and three native provider request compilers. Hosted full Core suite/typecheck and root check pass.\n\nSource-bound qualification.\n\n### Screenshots / recordings\nNo visual UI code changed; behavior is asserted directly.\n\n### Checklist\n- [x] I have tested my changes locally\n- [x] I have not included unrelated changes in this PR\n\n\n---\n\n_Added by the opencode bot (AI-generated).\n\nRelated: #54600\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56519/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56519/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56518”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56518/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56518/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56518/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56518”,“id”:5902552284,“node_id”:“PR_kwDOOiiGL88AAAABJEVB6A”,“number”:56518,“title”:“fix(core): surface malformed glob errors from ripgrep”,“user”:{“login”:“rudycelekli”,“id”:47457359,“node_id”:“MDQ6VXNlcjQ3NDU3MzU5”,“avatar_url”:“https://avatars.githubusercontent.com/u/47457359?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/rudycelekli”,“html_url”:“https://github.com/rudycelekli”,“followers_url”:“https://api.github.com/users/rudycelekli/followers”,“following_url”:“https://api.github.com/users/rudycelekli/following{/other_user}”,“gists_url”:“https://api.github.com/users/rudycelekli/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/rudycelekli/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/rudycelekli/subscriptions”,“organizations_url”:“https://api.github.com/users/rudycelekli/orgs”,“repos_url”:“https://api.github.com/users/rudycelekli/repos”,“events_url”:“https://api.github.com/users/rudycelekli/events{/privacy}”,“received_events_url”:“https://api.github.com/users/rudycelekli/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:03:47Z”,“updated_at”:“2026-10-17T20:10:44Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56518”,“html_url”:“https://github.com/anomalyco/opencode/pull/56518”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56518.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56518.patch”,“merged_at”:null},“body”:”### Issue for this PR\nCloses #47474\n\n### Type of change\n- [x] Bug fix\n\n### What does this PR do?\nReport ripgrep’s malformed-glob diagnostics instead of presenting an empty successful search. Keep valid no-match searches and other exit-2 partial results intact.\n\n### How did you verify your code works?\nReal ripgrep and production search-tool regressions: two failures before; 29 owning tests, 34 related tests, and 290 repeated passes after. Hosted strict baseline, full Core suite, Core typecheck, and root check pass.\n\nSource-bound qualification.\n\n### Screenshots / recordings\nNo visual UI code changed; behavior is asserted directly.\n\n### Checklist\n- [x] I have tested my changes locally\n- [x] I have not included unrelated changes in this PR\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56518/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56518/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56517”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56517/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56517/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56517/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56517”,“id”:5902551733,“node_id”:“PR_kwDOOiiGL88AAAABJEVAOA”,“number”:56517,“title”:“docs: explain XDG global configuration for CLI and desktop”,“user”:{“login”:“rudycelekli”,“id”:47457359,“node_id”:“MDQ6VXNlcjQ3NDU3MzU5”,“avatar_url”:“https://avatars.githubusercontent.com/u/47457359?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/rudycelekli”,“html_url”:“https://github.com/rudycelekli”,“followers_url”:“https://api.github.com/users/rudycelekli/followers”,“following_url”:“https://api.github.com/users/rudycelekli/following{/other_user}”,“gists_url”:“https://api.github.com/users/rudycelekli/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/rudycelekli/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/rudycelekli/subscriptions”,“organizations_url”:“https://api.github.com/users/rudycelekli/orgs”,“repos_url”:“https://api.github.com/users/rudycelekli/repos”,“events_url”:“https://api.github.com/users/rudycelekli/events{/privacy}”,“received_events_url”:“https://api.github.com/users/rudycelekli/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:03:43Z”,“updated_at”:“2026-10-17T20:09:31Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56517”,“html_url”:“https://github.com/anomalyco/opencode/pull/56517”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56517.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56517.patch”,“merged_at”:null},“body”:”### Issue for this PR\nCloses #53559\n\n### Type of change\n- [x] Documentation\n\n### What does this PR do?\nDocument server-side XDG_CONFIG_HOME, OPENCODE_CONFIG_DIR precedence, global AGENTS.md placement, and the distinction between client and server environments. Carries forward @Ahmedhamdy796’s #54070 for the current V2 layout.\n\n### How did you verify your code works?\nLocally: generated-file check and diff check pass. Website typecheck/generated checks/build pass before and after; actual global-roots tests and root check pass.\n\nSource-bound qualification.\n\n### Screenshots / recordings\nDocumentation-only; rendered pages captured in the qualification artifact.\n\n### Checklist\n- [x] I have tested my changes locally\n- [x] I have not included unrelated changes in this PR\n\n\n---\n\n_Added by the opencode bot (AI-generated).\n\nRelated: #32825\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56517/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56517/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56516”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56516/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56516/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56516/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56516”,“id”:5902551176,“node_id”:“PR_kwDOOiiGL88AAAABJEU-dQ”,“number”:56516,“title”:“fix(tui): preserve directory completion separators”,“user”:{“login”:“rudycelekli”,“id”:47457359,“node_id”:“MDQ6VXNlcjQ3NDU3MzU5”,“avatar_url”:“https://avatars.githubusercontent.com/u/47457359?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/rudycelekli”,“html_url”:“https://github.com/rudycelekli”,“followers_url”:“https://api.github.com/users/rudycelekli/followers”,“following_url”:“https://api.github.com/users/rudycelekli/following{/other_user}”,“gists_url”:“https://api.github.com/users/rudycelekli/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/rudycelekli/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/rudycelekli/subscriptions”,“organizations_url”:“https://api.github.com/users/rudycelekli/orgs”,“repos_url”:“https://api.github.com/users/rudycelekli/repos”,“events_url”:“https://api.github.com/users/rudycelekli/events{/privacy}”,“received_events_url”:“https://api.github.com/users/rudycelekli/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:03:39Z”,“updated_at”:“2026-10-17T20:09:57Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56516”,“html_url”:“https://github.com/anomalyco/opencode/pull/56516”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56516.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56516.patch”,“merged_at”:null},“body”:”### Issue for this PR\nCloses #56109\n\n### Type of change\n- [x] Bug fix\n\n### What does this PR do?\nKeep the existing forward slash when completing /cd directories on Windows. Preserve the native separator behavior and literal-backslash filenames on POSIX.\n\n### How did you verify your code works?\nMac: real production renderer controls, 20 repeated passes and 15 existing autocomplete tests. Native Windows: baseline fails and the fixed renderer passes. Linux full TUI suite, both-platform related tests/typechecks, and root check pass.\n\nSource-bound qualification.\n\n### Screenshots / recordings\nActual production terminal recordings: before, after, and native prompt/frame receipts. Capture run also preserves Linux literal-backslash controls. A separate test-only diagnostic collected frames; the source-bound qualification uses the submitted patch.\n\n### Checklist\n- [x] I have tested my changes locally\n- [x] I have not included unrelated changes in this PR\n\n\n---\n\n_Added by the opencode bot (AI-generated).\n\nRelated: #50132\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56516/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56516/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56515”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56515/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56515/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56515/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56515”,“id”:5902525528,“node_id”:“PR_kwDOOiiGL88AAAABJETu9g”,“number”:56515,“title”:“docs: explain OTLP log and trace export configuration”,“user”:{“login”:“rudycelekli”,“id”:47457359,“node_id”:“MDQ6VXNlcjQ3NDU3MzU5”,“avatar_url”:“https://avatars.githubusercontent.com/u/47457359?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/rudycelekli”,“html_url”:“https://github.com/rudycelekli”,“followers_url”:“https://api.github.com/users/rudycelekli/followers”,“following_url”:“https://api.github.com/users/rudycelekli/following{/other_user}”,“gists_url”:“https://api.github.com/users/rudycelekli/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/rudycelekli/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/rudycelekli/subscriptions”,“organizations_url”:“https://api.github.com/users/rudycelekli/orgs”,“repos_url”:“https://api.github.com/users/rudycelekli/repos”,“events_url”:“https://api.github.com/users/rudycelekli/events{/privacy}”,“received_events_url”:“https://api.github.com/users/rudycelekli/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:00:35Z”,“updated_at”:“2026-10-17T20:02:41Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56515”,“html_url”:“https://github.com/anomalyco/opencode/pull/56515”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56515.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56515.patch”,“merged_at”:null},“body”:”### Issue for this PR\nCloses #47195\n\n### Type of change\n- [x] Documentation\n\n### What does this PR do?\nDocument the implemented OTLP/HTTP endpoint, collector headers, resource attributes, and separate CLI/server environments. Include a foreground-server example and explain the automatically appended signal paths.\n\n### How did you verify your code works?\n- Checked the current observability implementation and CLI wiring. Locally: bun run check:generated and git diff --check pass.\n- Source-bound Linux qualification: website typecheck/generated checks/build pass before and after; existing real HTTP-collector span-export regression and root bun run check pass.\n\n### Screenshots / recordings\nDocumentation-only; rendered troubleshooting page captured in qualification artifact.\n\n### Checklist\n- [x] I have tested my changes locally\n- [x] I have not included unrelated changes in this PR\n\n\n---\n\n_Added by the opencode bot (AI-generated).\n\nRelated: #55004\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56515/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56515/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56514”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56514/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56514/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56514/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56514”,“id”:5902525221,“node_id”:“PR_kwDOOiiGL88AAAABJETuBQ”,“number”:56514,“title”:“fix(core): inherit supported reasoning variants in commands”,“user”:{“login”:“rudycelekli”,“id”:47457359,“node_id”:“MDQ6VXNlcjQ3NDU3MzU5”,“avatar_url”:“https://avatars.githubusercontent.com/u/47457359?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/rudycelekli”,“html_url”:“https://github.com/rudycelekli”,“followers_url”:“https://api.github.com/users/rudycelekli/followers”,“following_url”:“https://api.github.com/users/rudycelekli/following{/other_user}”,“gists_url”:“https://api.github.com/users/rudycelekli/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/rudycelekli/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/rudycelekli/subscriptions”,“organizations_url”:“https://api.github.com/users/rudycelekli/orgs”,“repos_url”:“https://api.github.com/users/rudycelekli/repos”,“events_url”:“https://api.github.com/users/rudycelekli/events{/privacy}”,“received_events_url”:“https://api.github.com/users/rudycelekli/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T20:00:33Z”,“updated_at”:“2026-10-17T20:11:55Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56514”,“html_url”:“https://github.com/anomalyco/opencode/pull/56514”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56514.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56514.patch”,“merged_at”:null},“body”:”### Issue for this PR\nCloses #43474\n\n### Type of change\n- [x] Bug fix\n\n### What does this PR do?\nCarry the selected session reasoning variant into a command or agent-selected model when that destination supports it. Explicit command/agent variants still win; unsupported, stale, and unknown destinations retain their normal fallback.\n\n### How did you verify your code works?\n- Real command execution matrix: three regressions fail before, seven controls pass; 100 repeated focused passes and 43 related tests pass after.\n- Source-bound Linux qualification: strict baseline, focused/related tests, full Core suite, Core typecheck, and root bun run check pass.\n- An earlier full-suite run hit an unrelated PowerShell test timeout; this unchanged-source rerun passes. Initial incorrect fallback expectations were corrected before submission.\n\n### Screenshots / recordings\nNo visual UI change; command execution results are asserted directly.\n\n### Checklist\n- [x] I have tested my changes locally\n- [x] I have not included unrelated changes in this PR\n\n\n---\n\n_Added by the opencode bot (AI-generated).\n\nRelated: #43179\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56514/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56514/timeline”,“performed_via_github_app”:null,“state_reason”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56513”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56513/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56513/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56513/events”,“html_url”:“https://github.com/anomalyco/opencode/issues/56513”,“id”:5902515139,“node_id”:“I_kwDOOiiGL88AAAABX9E7ww”,“number”:56513,“title”:“cli: device OAuth URL duplicates /console segment, Console page hangs on “connecting"",“user”:{“login”:“d4nnABR”,“id”:135668885,“node_id”:“U_kgDOCBYklQ”,“avatar_url”:“https://avatars.githubusercontent.com/u/135668885?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/d4nnABR”,“html_url”:“https://github.com/d4nnABR”,“followers_url”:“https://api.github.com/users/d4nnABR/followers”,“following_url”:“https://api.github.com/users/d4nnABR/following{/other_user}”,“gists_url”:“https://api.github.com/users/d4nnABR/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/d4nnABR/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/d4nnABR/subscriptions”,“organizations_url”:“https://api.github.com/users/d4nnABR/orgs”,“repos_url”:“https://api.github.com/users/d4nnABR/repos”,“events_url”:“https://api.github.com/users/d4nnABR/events{/privacy}”,“received_events_url”:“https://api.github.com/users/d4nnABR/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:11349138546,“node_id”:“LA_kwDOOiiGL88AAAACpHYccg”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/2.0”,“name”:“2.0”,“color”:“ec68e7”,“default”:false,“description”:"",“archived_at”:null,“archived_by”:null},{“id”:12585677396,“node_id”:“LA_kwDOOiiGL88AAAAC7ioyVA”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/pending%20close”,“name”:“pending close”,“color”:“54c4e1”,“default”:false,“description”:"",“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T19:59:19Z”,“updated_at”:“2026-10-17T20:05:27Z”,“closed_at”:null,“assignee”:null,“author_association”:“NONE”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“sub_issues_summary”:{“total”:0,“completed”:0,“percent_completed”:0},“issue_dependencies_summary”:{“blocked_by”:0,“total_blocked_by”:0,“blocking”:0,“total_blocking”:0},“body”:”## Summary\n\nThe CLI device-flow OAuth URL for the opencode integration duplicates the /console path segment (/console/console/device). The OpenCode Console SPA is mounted under /console/, so the extra segment matches no route and the page sits on the loading/“connecting” screen forever. The result is that opencode auth login opencode never completes via the Console account method.\n\n## Environment\n\n- opencode version: opencode2 v0.0.0-beta-17823\n- OS: Linux 7.2.5-3-omarchy (x86_64), Hyprland/Omarchy desktop\n- Terminal: TERM_PROGRAM=herdr, TERM=xterm-256color, COLORTERM=truecolor\n- Shell: /usr/bin/bash\n- Install/channel: beta (@opencode-ai/cli installed globally via mise, Node 25.9.0)\n- Active plugins: /home/tars/.config/opencode/plugins/herdr-agent-state.js; TUI plugin ~/.config/opencode/herdr-opencode/tui.js (herdr)\n\n## Reproduction\n\n1. Run opencode auth login opencode (or /connect → OpenCode → OpenCode Console account, method id device).\n2. OpenCode starts a device OAuth attempt and returns an authorization URL of the form:\n https://opencode.ai/console/console/device?user_code=<code>&client_id=opencode-cli\n3. The browser opens that URL and the Console page stays on the loading/“connecting” state indefinitely; the login attempt never completes.\n\nEquivalent direct API call:\n\nsh\ncurl -s -X POST http://127.0.0.1:<port>/api/integration/opencode/connect/oauth \\\n -H 'Content-Type: application/json' \\\n -d '{\"methodID\":\"device\"}'\n\n\nResponse (redacted):\n\njson\n{\n \"data\": {\n \"attemptID\": \"con_...\",\n \"url\": \"https://opencode.ai/console/console/device?user_code=<code>&client_id=opencode-cli\",\n \"instructions\": \"Enter code: <code>\",\n \"mode\": \"auto\"\n }\n}\n\n\n## Expected Behavior\n\nThe returned URL should point at the Console device page with a single /console segment, e.g.\nhttps://opencode.ai/console/device?user_code=<code>&client_id=opencode-cli, and the browser flow should complete.\n\n## Actual Behavior\n\n- The CLI/API returns https://opencode.ai/console/console/device?....\n- That URL serves the Console SPA shell (<title>OpenCode Console</title>, assets under /console/assets/), but the router is mounted with base /console/ and only defines a path:\"/device\" route (defined in https://opencode.ai/console/assets/index-*.js). The remaining path console/device matches no route, so the page never leaves the loading state.\n- opencode auth login opencode produces no further log output after args=[\"auth\",\"login\",\"opencode\"]; the flow hangs even though the browser tab is open.\n- Reproduced consistently across 4 attempts (server log entries at 19:42:30, 19:44:32, 19:46:50 and 19:47:16 UTC).\n\n## Additional Context\n\n- Manually rewriting the URL from /console/console/device to /console/device makes the flow succeed: the attempt transitions pending → complete, the credential is stored, and requests work.\n- The opencode integration advertises the method as {\"id\":\"device\",\"type\":\"oauth\",\"label\":\"OpenCode Console account\"}, so this affects the only account-based (non-API-key) method for first-party OpenCode.\n- Console SPA evidence: page HTML loads /console/assets/index-*.js; the bundle contains the router base \"/console/\" and a path:\"/device\" route, plus /device/code and /device/token API routes.\n- Workaround for users: after the CLI opens the bad URL, replace the duplicated /console with a single one (or visit https://opencode.ai/console/device and enter the displayed code).\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56513/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56513/timeline”,“performed_via_github_app”:null,“state_reason”:null,“pinned_comment”:null},{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56511”,“repository_url”:“https://api.github.com/repos/anomalyco/opencode”,“labels_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56511/labels{/name}”,“comments_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56511/comments”,“events_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56511/events”,“html_url”:“https://github.com/anomalyco/opencode/pull/56511”,“id”:5902481296,“node_id”:“PR_kwDOOiiGL88AAAABJERkKg”,“number”:56511,“title”:“fix(core): enforce Code Mode deny policies”,“user”:{“login”:“Dante-dan”,“id”:19773791,“node_id”:“MDQ6VXNlcjE5NzczNzkx”,“avatar_url”:“https://avatars.githubusercontent.com/u/19773791?v=4”,“gravatar_id”:"",“url”:“https://api.github.com/users/Dante-dan”,“html_url”:“https://github.com/Dante-dan”,“followers_url”:“https://api.github.com/users/Dante-dan/followers”,“following_url”:“https://api.github.com/users/Dante-dan/following{/other_user}”,“gists_url”:“https://api.github.com/users/Dante-dan/gists{/gist_id}”,“starred_url”:“https://api.github.com/users/Dante-dan/starred{/owner}{/repo}”,“subscriptions_url”:“https://api.github.com/users/Dante-dan/subscriptions”,“organizations_url”:“https://api.github.com/users/Dante-dan/orgs”,“repos_url”:“https://api.github.com/users/Dante-dan/repos”,“events_url”:“https://api.github.com/users/Dante-dan/events{/privacy}”,“received_events_url”:“https://api.github.com/users/Dante-dan/received_events”,“type”:“User”,“user_view_type”:“public”,“site_admin”:false},“labels”:[{“id”:10093391757,“node_id”:“LA_kwDOOiiGL88AAAACWZzvjQ”,“url”:“https://api.github.com/repos/anomalyco/opencode/labels/contributor”,“name”:“contributor”,“color”:“ededed”,“default”:false,“description”:null,“archived_at”:null,“archived_by”:null}],“state”:“open”,“locked”:false,“assignees”:[],“milestone”:null,“comments”:1,“created_at”:“2026-10-17T19:55:14Z”,“updated_at”:“2026-10-17T19:58:17Z”,“closed_at”:null,“assignee”:null,“author_association”:“CONTRIBUTOR”,“issue_field_values”:[],“type”:null,“active_lock_reason”:null,“draft”:false,“pull_request”:{“url”:“https://api.github.com/repos/anomalyco/opencode/pulls/56511”,“html_url”:“https://github.com/anomalyco/opencode/pull/56511”,“diff_url”:“https://github.com/anomalyco/opencode/pull/56511.diff”,“patch_url”:“https://github.com/anomalyco/opencode/pull/56511.patch”,“merged_at”:null},“body”:”### Issue for this PR\n\nCloses #56349\n\n### Type of change\n\n- [x] Bug fix\n- [ ] New feature\n- [ ] Refactor / code improvement\n- [x] Documentation\n\n### What does this PR do?\n\nCode Mode can run without requesting a permission, so tool.use denies never reached it. Check the tool-wide execute, execute:*, and * policies before its runtime starts, preserving last-match and organization precedence. This also prevents denied calls from reaching nested tools or HTTP requests.\n\n### How did you verify your code works?\n\n- Policy and tool registry suites: 570 passed across 10 runs; the four new policy tests fail against the original implementation.\n- bun run check passed (34 tasks), including the package typechecks.\n- Website typecheck, generated-file check, and full build/link validation passed.\n- Formatting and git diff --check passed.\n\nUsed Bun 1.4.2 and Node 22.22.3. The Linux binary reproduction was not rerun; these tests exercise the real repository registry and policy plugin.\n\n### Screenshots / recordings\n\nNo UI changes.\n\n### Checklist\n\n- [x] I have tested my changes locally\n- [x] I have not included unrelated changes in this PR\n\n\n---\n\n_Added by the opencode bot (AI-generated).\n\nRelated: #54595, #47177, #55232, #54044\n”,“closed_by”:null,“reactions”:{“url”:“https://api.github.com/repos/anomalyco/opencode/issues/56511/reactions”,“total_count”:0,“+1”:0,“-1”:0,“laugh”:0,“hooray”:0,“confused”:0,“heart”:0,“rocket”:0,“eyes”:0},“timeline_url”:“https://api.github.com/repos/anomalyco/opencode/issues/56511/timeline”,“performed_via_github_app”:null,“state_reason”:null}]