| Files | Last commit | Last update |
|---|---|---|
fix(opencode): keep sign-in alive through rate limits (#5844) Retry plain token-poll throttles within the existing authorization attempt, honor Retry-After, and keep browser wakeups inside the server cooldown. Stop polling at expiry and retain terminal denial/error behavior. Add actionable V2 capability checks and Git-only installation guidance without upgrading the host. Cover polling boundaries in unit tests and extend the browser sign-in journey with a one-shot HTTP 429 witness. | 29 days ago | |
feat(opencode-plugin): OpenWork models and MCP in OpenCode 2 (#5838) * feat(den): let the OpenCode plugin sign in as its own device client Behind opencodePlugin (cloud and self-hosted, off). Den accepts the openwork-opencode-plugin device client only while the flag is on; the /device page names it "OpenWork - OpenCode Plugin" and, for that client only, returns the browser to a loopback return_to after Approve or Deny. The redirect carries the outcome only; the client still gets its session by polling Den. * feat(opencode-plugin): OpenWork Cloud models and MCP in OpenCode 2 New opencode-openwork package: an OpenCode 2 plugin that registers the openwork integration (opencode auth login openwork, browser or code device sign-in) and, on every start, injects the member's AI Gateway providers with their gateway key and the openwork-cloud and openwork-direct-* MCP servers from Den. Adds a docs page and a tag-driven npm publish workflow (opencode-openwork-v*). * test(evals): OpenCode signs in to OpenWork and returns from the browser * fix(opencode-plugin): keep tokens on HTTPS and pin the device return page The plugin only sends the Den session, device token or MCP token over HTTPS, or plain HTTP to a Den on this machine, and trims base URLs without a backtracking pattern. Den web returns the browser only to http://127.0.0.1:<port>/openwork/callback for the plugin's client, so a crafted link cannot aim it at other local services. * fix(opencode-plugin): never publish another account's cached inventory On start the plugin used the cached gateway key and MCP token without checking they belong to the signed-in account. After an account switch while OpenCode was closed, it could publish the previous account's credentials until the first refresh. The cache is now used only when it was fetched for the active connection. | 29 days ago | |
feat(opencode-plugin): OpenWork models and MCP in OpenCode 2 (#5838) * feat(den): let the OpenCode plugin sign in as its own device client Behind opencodePlugin (cloud and self-hosted, off). Den accepts the openwork-opencode-plugin device client only while the flag is on; the /device page names it "OpenWork - OpenCode Plugin" and, for that client only, returns the browser to a loopback return_to after Approve or Deny. The redirect carries the outcome only; the client still gets its session by polling Den. * feat(opencode-plugin): OpenWork Cloud models and MCP in OpenCode 2 New opencode-openwork package: an OpenCode 2 plugin that registers the openwork integration (opencode auth login openwork, browser or code device sign-in) and, on every start, injects the member's AI Gateway providers with their gateway key and the openwork-cloud and openwork-direct-* MCP servers from Den. Adds a docs page and a tag-driven npm publish workflow (opencode-openwork-v*). * test(evals): OpenCode signs in to OpenWork and returns from the browser * fix(opencode-plugin): keep tokens on HTTPS and pin the device return page The plugin only sends the Den session, device token or MCP token over HTTPS, or plain HTTP to a Den on this machine, and trims base URLs without a backtracking pattern. Den web returns the browser only to http://127.0.0.1:<port>/openwork/callback for the plugin's client, so a crafted link cannot aim it at other local services. * fix(opencode-plugin): never publish another account's cached inventory On start the plugin used the cached gateway key and MCP token without checking they belong to the signed-in account. After an account switch while OpenCode was closed, it could publish the previous account's credentials until the first refresh. The cache is now used only when it was fetched for the active connection. | 29 days ago | |
feat(remote-sessions): register native clients as offload targets (#5853) * feat(remote-sessions): register clients with recoverable offloads * test(remote-sessions): prove native recovery on the selected host * test(remote-sessions): await native plugin activation and clean up safely * test(remote-sessions): isolate native config from repository defaults * test(remote-sessions): verify native home is outside the checkout * test(remote-sessions): provide native folder plugin entrypoint * fix(opencode): use native model query shapes and expose runner health * fix(remote-sessions): bind runners to verified members and build types * test(opencode): wait for the unload cancellation witness * fix(remote-sessions): restrict registered admission to opted-in clients | 28 days ago | |
refactor(features): remove completed GA rollout flags (#6771) * refactor(features): retire completed GA rollout gates * fix(evals): repair inherited proof type errors * test(den): pin the upload relay fixture clock and verify expiry * test(den): arrange API security fixtures with hashed sessions * test(library): verify compact lists and wait for detail breadcrumbs | 8 days ago | |
feat(desktop): sync v2 provider models live from Den (#6111) * feat(features): declare live provider sync rollout off * feat(den): stream member inventory revisions behind live sync * feat(plugin): reconcile provider inventory over shared live streams * feat(app): consume live v2 provider events without sync pokes * test(providers): prove native reload and document ownership boundaries * feat(server): give live v2 gateway state one plugin owner * test(evals): prove live Den changes reach an open model picker * fix(den): scope live revisions to caller-visible inventory * fix(providers): secure shared live sync and prove lifecycle recovery * fix(providers): keep Den bearer outside the engine and repair CI * fix(providers): isolate reusable keys and shared subscription credentials | 21 days ago | |
fix(provider-sync): keep providers on unknown session checks (#6535) * test(provider-sync): reproduce providers dropped on a failed local session check * fix(provider-sync): keep providers when the local session check fails A slow, failed or malformed desktop session check was treated as a sign-out: every provider was withdrawn and the cache deleted, so a turn that resolved its model in that window failed with ModelUnavailableError. The check is now tri-state (session / signed_out / unknown). Only a 2xx JSON null is a sign-out; unknown keeps the session, providers, cache and inventory stream and retries on the next tick. * perf(provider-sync): share the local session check across Locations Every open Location polled the local session endpoint once a second on its own, so N Locations meant N loopback requests per second, which is what pushed those checks past their 1.5 s timeout under load. One poll per endpoint and capability now serves the whole process and fans each answer out to every Location; the last Location to unload stops it. * test(provider-sync): reproduce stalled session checks in the native engine Run the shipping V2 engine, production provider plugin, credential broker, and local session bridge with a loopback hop that stalls /session beyond the plugin timeout. On origin/dev the engine catalog loses the model and the turn fails; on the fixed branch the model stays available and answers. | 12 days ago | |
refactor(features): remove completed GA rollout flags (#6771) * refactor(features): retire completed GA rollout gates * fix(evals): repair inherited proof type errors * test(den): pin the upload relay fixture clock and verify expiry * test(den): arrange API security fixtures with hashed sessions * test(library): verify compact lists and wait for detail breadcrumbs | 8 days ago | |
fix(opencode): keep sign-in alive through rate limits (#5844) Retry plain token-poll throttles within the existing authorization attempt, honor Retry-After, and keep browser wakeups inside the server cooldown. Stop polling at expiry and retain terminal denial/error behavior. Add actionable V2 capability checks and Git-only installation guidance without upgrading the host. Cover polling boundaries in unit tests and extend the browser sign-in journey with a one-shot HTTP 429 witness. | 29 days ago | |
refactor(features): remove completed GA rollout flags (#6771) * refactor(features): retire completed GA rollout gates * fix(evals): repair inherited proof type errors * test(den): pin the upload relay fixture clock and verify expiry * test(den): arrange API security fixtures with hashed sessions * test(library): verify compact lists and wait for detail breadcrumbs | 8 days ago | |
feat(desktop): sync v2 provider models live from Den (#6111) * feat(features): declare live provider sync rollout off * feat(den): stream member inventory revisions behind live sync * feat(plugin): reconcile provider inventory over shared live streams * feat(app): consume live v2 provider events without sync pokes * test(providers): prove native reload and document ownership boundaries * feat(server): give live v2 gateway state one plugin owner * test(evals): prove live Den changes reach an open model picker * fix(den): scope live revisions to caller-visible inventory * fix(providers): secure shared live sync and prove lifecycle recovery * fix(providers): keep Den bearer outside the engine and repair CI * fix(providers): isolate reusable keys and shared subscription credentials | 21 days ago | |
fix(opencode-plugin): fetch the provider inventory once per change, not once per workspace (#6391) * fix(opencode-plugin): fetch the provider inventory once per change, not once per workspace OpenCode loads one plugin instance per workspace location. They already share one inventory change stream, but each change reached every location and each one fetched the full gateway inventory itself: the provider list plus one connect call per provider. A desktop with many locations sent the same inventory reads to Den many times over for a single change, and every Den deploy is a change for every desktop. Locations that ask at the same time now share one fetch per session and credential scope. A location only takes a fetch that started after it asked, so a change is never answered with inventory read before it. Aborting one location's request leaves the shared fetch running for the others, and a failed fetch is never reused. Like the inventory stream, only an immutable capability is global; credentials stay in a closure. Signed-off-by: Jalil <reachjalil@gmail.com> * fix(opencode-plugin): order shared inventory fetches by ticket, not by clock Comparing millisecond timestamps let a Location that asked after a denial join a fetch that started before it when both landed in the same millisecond, which the denial-fencing tests caught on Node 24. Each Location now takes a ticket from a strictly increasing counter when it decides to refresh and joins only a fetch started after that ticket. Finished fetches are no longer reused; only a fetch still in flight is shared, which is all one change fanning out to every Location needs. Signed-off-by: Jalil <reachjalil@gmail.com> --------- Signed-off-by: Jalil <reachjalil@gmail.com> | 16 days ago | |
fix(opencode-plugin): fetch the provider inventory once per change, not once per workspace (#6391) * fix(opencode-plugin): fetch the provider inventory once per change, not once per workspace OpenCode loads one plugin instance per workspace location. They already share one inventory change stream, but each change reached every location and each one fetched the full gateway inventory itself: the provider list plus one connect call per provider. A desktop with many locations sent the same inventory reads to Den many times over for a single change, and every Den deploy is a change for every desktop. Locations that ask at the same time now share one fetch per session and credential scope. A location only takes a fetch that started after it asked, so a change is never answered with inventory read before it. Aborting one location's request leaves the shared fetch running for the others, and a failed fetch is never reused. Like the inventory stream, only an immutable capability is global; credentials stay in a closure. Signed-off-by: Jalil <reachjalil@gmail.com> * fix(opencode-plugin): order shared inventory fetches by ticket, not by clock Comparing millisecond timestamps let a Location that asked after a denial join a fetch that started before it when both landed in the same millisecond, which the denial-fencing tests caught on Node 24. Each Location now takes a ticket from a strictly increasing counter when it decides to refresh and joins only a fetch started after that ticket. Finished fetches are no longer reused; only a fetch still in flight is shared, which is all one change fanning out to every Location needs. Signed-off-by: Jalil <reachjalil@gmail.com> --------- Signed-off-by: Jalil <reachjalil@gmail.com> | 16 days ago | |
feat(desktop): sync v2 provider models live from Den (#6111) * feat(features): declare live provider sync rollout off * feat(den): stream member inventory revisions behind live sync * feat(plugin): reconcile provider inventory over shared live streams * feat(app): consume live v2 provider events without sync pokes * test(providers): prove native reload and document ownership boundaries * feat(server): give live v2 gateway state one plugin owner * test(evals): prove live Den changes reach an open model picker * fix(den): scope live revisions to caller-visible inventory * fix(providers): secure shared live sync and prove lifecycle recovery * fix(providers): keep Den bearer outside the engine and repair CI * fix(providers): isolate reusable keys and shared subscription credentials | 21 days ago | |
feat(opencode-plugin): OpenWork models and MCP in OpenCode 2 (#5838) * feat(den): let the OpenCode plugin sign in as its own device client Behind opencodePlugin (cloud and self-hosted, off). Den accepts the openwork-opencode-plugin device client only while the flag is on; the /device page names it "OpenWork - OpenCode Plugin" and, for that client only, returns the browser to a loopback return_to after Approve or Deny. The redirect carries the outcome only; the client still gets its session by polling Den. * feat(opencode-plugin): OpenWork Cloud models and MCP in OpenCode 2 New opencode-openwork package: an OpenCode 2 plugin that registers the openwork integration (opencode auth login openwork, browser or code device sign-in) and, on every start, injects the member's AI Gateway providers with their gateway key and the openwork-cloud and openwork-direct-* MCP servers from Den. Adds a docs page and a tag-driven npm publish workflow (opencode-openwork-v*). * test(evals): OpenCode signs in to OpenWork and returns from the browser * fix(opencode-plugin): keep tokens on HTTPS and pin the device return page The plugin only sends the Den session, device token or MCP token over HTTPS, or plain HTTP to a Den on this machine, and trims base URLs without a backtracking pattern. Den web returns the browser only to http://127.0.0.1:<port>/openwork/callback for the plugin's client, so a crafted link cannot aim it at other local services. * fix(opencode-plugin): never publish another account's cached inventory On start the plugin used the cached gateway key and MCP token without checking they belong to the signed-in account. After an account switch while OpenCode was closed, it could publish the previous account's credentials until the first refresh. The cache is now used only when it was fetched for the active connection. | 29 days ago | |
feat(opencode-plugin): OpenWork models and MCP in OpenCode 2 (#5838) * feat(den): let the OpenCode plugin sign in as its own device client Behind opencodePlugin (cloud and self-hosted, off). Den accepts the openwork-opencode-plugin device client only while the flag is on; the /device page names it "OpenWork - OpenCode Plugin" and, for that client only, returns the browser to a loopback return_to after Approve or Deny. The redirect carries the outcome only; the client still gets its session by polling Den. * feat(opencode-plugin): OpenWork Cloud models and MCP in OpenCode 2 New opencode-openwork package: an OpenCode 2 plugin that registers the openwork integration (opencode auth login openwork, browser or code device sign-in) and, on every start, injects the member's AI Gateway providers with their gateway key and the openwork-cloud and openwork-direct-* MCP servers from Den. Adds a docs page and a tag-driven npm publish workflow (opencode-openwork-v*). * test(evals): OpenCode signs in to OpenWork and returns from the browser * fix(opencode-plugin): keep tokens on HTTPS and pin the device return page The plugin only sends the Den session, device token or MCP token over HTTPS, or plain HTTP to a Den on this machine, and trims base URLs without a backtracking pattern. Den web returns the browser only to http://127.0.0.1:<port>/openwork/callback for the plugin's client, so a crafted link cannot aim it at other local services. * fix(opencode-plugin): never publish another account's cached inventory On start the plugin used the cached gateway key and MCP token without checking they belong to the signed-in account. After an account switch while OpenCode was closed, it could publish the previous account's credentials until the first refresh. The cache is now used only when it was fetched for the active connection. | 29 days ago | |
feat(opencode-plugin): OpenWork models and MCP in OpenCode 2 (#5838) * feat(den): let the OpenCode plugin sign in as its own device client Behind opencodePlugin (cloud and self-hosted, off). Den accepts the openwork-opencode-plugin device client only while the flag is on; the /device page names it "OpenWork - OpenCode Plugin" and, for that client only, returns the browser to a loopback return_to after Approve or Deny. The redirect carries the outcome only; the client still gets its session by polling Den. * feat(opencode-plugin): OpenWork Cloud models and MCP in OpenCode 2 New opencode-openwork package: an OpenCode 2 plugin that registers the openwork integration (opencode auth login openwork, browser or code device sign-in) and, on every start, injects the member's AI Gateway providers with their gateway key and the openwork-cloud and openwork-direct-* MCP servers from Den. Adds a docs page and a tag-driven npm publish workflow (opencode-openwork-v*). * test(evals): OpenCode signs in to OpenWork and returns from the browser * fix(opencode-plugin): keep tokens on HTTPS and pin the device return page The plugin only sends the Den session, device token or MCP token over HTTPS, or plain HTTP to a Den on this machine, and trims base URLs without a backtracking pattern. Den web returns the browser only to http://127.0.0.1:<port>/openwork/callback for the plugin's client, so a crafted link cannot aim it at other local services. * fix(opencode-plugin): never publish another account's cached inventory On start the plugin used the cached gateway key and MCP token without checking they belong to the signed-in account. After an account switch while OpenCode was closed, it could publish the previous account's credentials until the first refresh. The cache is now used only when it was fetched for the active connection. | 29 days ago | |
feat(remote-sessions): answer a remote task's question from the chat (#6753) * feat(remote-sessions): pending requests on reads and an answer action Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(remote-sessions): OpenCode plugin answers pending permissions; wire types for answers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(desktop): read and answer a remote task's pending question or permission natively Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den): remote-session:answer capability and POST /v1/remote-sessions/answer behind remoteSessionAnswers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(app): answer a remote task's question or permission from its panel and row Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(evals): proof that a person answers a remote task's question from the chat Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * docs: remote-session answers feature doc, architecture and route notes Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * fix(app): readable chord hints on the answer card Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> --------- Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> | 9 days ago | |
feat(remote-sessions): answer a remote task's question from the chat (#6753) * feat(remote-sessions): pending requests on reads and an answer action Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(remote-sessions): OpenCode plugin answers pending permissions; wire types for answers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(desktop): read and answer a remote task's pending question or permission natively Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den): remote-session:answer capability and POST /v1/remote-sessions/answer behind remoteSessionAnswers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(app): answer a remote task's question or permission from its panel and row Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(evals): proof that a person answers a remote task's question from the chat Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * docs: remote-session answers feature doc, architecture and route notes Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * fix(app): readable chord hints on the answer card Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> --------- Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> | 9 days ago | |
feat(remote-sessions): answer a remote task's question from the chat (#6753) * feat(remote-sessions): pending requests on reads and an answer action Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(remote-sessions): OpenCode plugin answers pending permissions; wire types for answers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(desktop): read and answer a remote task's pending question or permission natively Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den): remote-session:answer capability and POST /v1/remote-sessions/answer behind remoteSessionAnswers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(app): answer a remote task's question or permission from its panel and row Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(evals): proof that a person answers a remote task's question from the chat Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * docs: remote-session answers feature doc, architecture and route notes Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * fix(app): readable chord hints on the answer card Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> --------- Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> | 9 days ago | |
refactor(features): remove completed GA rollout flags (#6771) * refactor(features): retire completed GA rollout gates * fix(evals): repair inherited proof type errors * test(den): pin the upload relay fixture clock and verify expiry * test(den): arrange API security fixtures with hashed sessions * test(library): verify compact lists and wait for detail breadcrumbs | 8 days ago | |
refactor(features): remove completed GA rollout flags (#6771) * refactor(features): retire completed GA rollout gates * fix(evals): repair inherited proof type errors * test(den): pin the upload relay fixture clock and verify expiry * test(den): arrange API security fixtures with hashed sessions * test(library): verify compact lists and wait for detail breadcrumbs | 8 days ago | |
fix(plugin): keep Fast mode for live-synced OpenAI models (#6120) Live provider sync builds v2 models in the bundled plugin, which only translated a catalog model's reasoning efforts. The managed engine config it replaced also turns an OpenAI catalog model's priority-processing mode into Fast variants (default plus one per effort), so Fast mode disappeared from the picker for those models once live sync took over. Mirror the shared rule (packages/types cloud-model-fast): same variant ids, same conditions (provider @ai-sdk/openai, unchanged model package, exact service_tier priority mode, no catalog-declared Fast variants). Signed-off-by: Benjamin Shafii <ben@prologe.io> | 21 days ago | |
fix(plugin): keep Fast mode for live-synced OpenAI models (#6120) Live provider sync builds v2 models in the bundled plugin, which only translated a catalog model's reasoning efforts. The managed engine config it replaced also turns an OpenAI catalog model's priority-processing mode into Fast variants (default plus one per effort), so Fast mode disappeared from the picker for those models once live sync took over. Mirror the shared rule (packages/types cloud-model-fast): same variant ids, same conditions (provider @ai-sdk/openai, unchanged model package, exact service_tier priority mode, no catalog-declared Fast variants). Signed-off-by: Benjamin Shafii <ben@prologe.io> | 21 days ago | |
feat(remote-sessions): answer a remote task's question from the chat (#6753) * feat(remote-sessions): pending requests on reads and an answer action Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(remote-sessions): OpenCode plugin answers pending permissions; wire types for answers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(desktop): read and answer a remote task's pending question or permission natively Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den): remote-session:answer capability and POST /v1/remote-sessions/answer behind remoteSessionAnswers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(app): answer a remote task's question or permission from its panel and row Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(evals): proof that a person answers a remote task's question from the chat Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * docs: remote-session answers feature doc, architecture and route notes Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * fix(app): readable chord hints on the answer card Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> --------- Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> | 9 days ago | |
feat(remote-sessions): answer a remote task's question from the chat (#6753) * feat(remote-sessions): pending requests on reads and an answer action Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(remote-sessions): OpenCode plugin answers pending permissions; wire types for answers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(desktop): read and answer a remote task's pending question or permission natively Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den): remote-session:answer capability and POST /v1/remote-sessions/answer behind remoteSessionAnswers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(app): answer a remote task's question or permission from its panel and row Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(evals): proof that a person answers a remote task's question from the chat Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * docs: remote-session answers feature doc, architecture and route notes Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * fix(app): readable chord hints on the answer card Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> --------- Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> | 9 days ago | |
feat(remote-sessions): register native clients as offload targets (#5853) * feat(remote-sessions): register clients with recoverable offloads * test(remote-sessions): prove native recovery on the selected host * test(remote-sessions): await native plugin activation and clean up safely * test(remote-sessions): isolate native config from repository defaults * test(remote-sessions): verify native home is outside the checkout * test(remote-sessions): provide native folder plugin entrypoint * fix(opencode): use native model query shapes and expose runner health * fix(remote-sessions): bind runners to verified members and build types * test(opencode): wait for the unload cancellation witness * fix(remote-sessions): restrict registered admission to opted-in clients | 28 days ago | |
feat(remote-sessions): register native clients as offload targets (#5853) * feat(remote-sessions): register clients with recoverable offloads * test(remote-sessions): prove native recovery on the selected host * test(remote-sessions): await native plugin activation and clean up safely * test(remote-sessions): isolate native config from repository defaults * test(remote-sessions): verify native home is outside the checkout * test(remote-sessions): provide native folder plugin entrypoint * fix(opencode): use native model query shapes and expose runner health * fix(remote-sessions): bind runners to verified members and build types * test(opencode): wait for the unload cancellation witness * fix(remote-sessions): restrict registered admission to opted-in clients | 28 days ago | |
feat(desktop): sync v2 provider models live from Den (#6111) * feat(features): declare live provider sync rollout off * feat(den): stream member inventory revisions behind live sync * feat(plugin): reconcile provider inventory over shared live streams * feat(app): consume live v2 provider events without sync pokes * test(providers): prove native reload and document ownership boundaries * feat(server): give live v2 gateway state one plugin owner * test(evals): prove live Den changes reach an open model picker * fix(den): scope live revisions to caller-visible inventory * fix(providers): secure shared live sync and prove lifecycle recovery * fix(providers): keep Den bearer outside the engine and repair CI * fix(providers): isolate reusable keys and shared subscription credentials | 21 days ago | |
feat(remote-sessions): register native clients as offload targets (#5853) * feat(remote-sessions): register clients with recoverable offloads * test(remote-sessions): prove native recovery on the selected host * test(remote-sessions): await native plugin activation and clean up safely * test(remote-sessions): isolate native config from repository defaults * test(remote-sessions): verify native home is outside the checkout * test(remote-sessions): provide native folder plugin entrypoint * fix(opencode): use native model query shapes and expose runner health * fix(remote-sessions): bind runners to verified members and build types * test(opencode): wait for the unload cancellation witness * fix(remote-sessions): restrict registered admission to opted-in clients | 28 days ago | |
feat(opencode-plugin): OpenWork models and MCP in OpenCode 2 (#5838) * feat(den): let the OpenCode plugin sign in as its own device client Behind opencodePlugin (cloud and self-hosted, off). Den accepts the openwork-opencode-plugin device client only while the flag is on; the /device page names it "OpenWork - OpenCode Plugin" and, for that client only, returns the browser to a loopback return_to after Approve or Deny. The redirect carries the outcome only; the client still gets its session by polling Den. * feat(opencode-plugin): OpenWork Cloud models and MCP in OpenCode 2 New opencode-openwork package: an OpenCode 2 plugin that registers the openwork integration (opencode auth login openwork, browser or code device sign-in) and, on every start, injects the member's AI Gateway providers with their gateway key and the openwork-cloud and openwork-direct-* MCP servers from Den. Adds a docs page and a tag-driven npm publish workflow (opencode-openwork-v*). * test(evals): OpenCode signs in to OpenWork and returns from the browser * fix(opencode-plugin): keep tokens on HTTPS and pin the device return page The plugin only sends the Den session, device token or MCP token over HTTPS, or plain HTTP to a Den on this machine, and trims base URLs without a backtracking pattern. Den web returns the browser only to http://127.0.0.1:<port>/openwork/callback for the plugin's client, so a crafted link cannot aim it at other local services. * fix(opencode-plugin): never publish another account's cached inventory On start the plugin used the cached gateway key and MCP token without checking they belong to the signed-in account. After an account switch while OpenCode was closed, it could publish the previous account's credentials until the first refresh. The cache is now used only when it was fetched for the active connection. | 29 days ago | |
feat(remote-sessions): answer a remote task's question from the chat (#6753) * feat(remote-sessions): pending requests on reads and an answer action Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(remote-sessions): OpenCode plugin answers pending permissions; wire types for answers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(desktop): read and answer a remote task's pending question or permission natively Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den): remote-session:answer capability and POST /v1/remote-sessions/answer behind remoteSessionAnswers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(app): answer a remote task's question or permission from its panel and row Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(evals): proof that a person answers a remote task's question from the chat Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * docs: remote-session answers feature doc, architecture and route notes Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * fix(app): readable chord hints on the answer card Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> --------- Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> | 9 days ago |
| Files | Last commit | Last update |
|---|---|---|
| 29 days ago | ||
| 29 days ago | ||
| 29 days ago | ||
| 28 days ago | ||
| 8 days ago | ||
| 21 days ago | ||
| 12 days ago | ||
| 8 days ago | ||
| 29 days ago | ||
| 8 days ago | ||
| 21 days ago | ||
| 16 days ago | ||
| 16 days ago | ||
| 21 days ago | ||
| 29 days ago | ||
| 29 days ago | ||
| 29 days ago | ||
| 9 days ago | ||
| 9 days ago | ||
| 9 days ago | ||
| 8 days ago | ||
| 8 days ago | ||
| 21 days ago | ||
| 21 days ago | ||
| 9 days ago | ||
| 9 days ago | ||
| 28 days ago | ||
| 28 days ago | ||
| 21 days ago | ||
| 28 days ago | ||
| 29 days ago | ||
| 9 days ago |