* fix(backend): decode grep and shell output off the host code page
Chinese Windows decodes ripgrep and execute pipes as cp936, which crashes grep and silently drops UTF-8 command output. Patch both at startup so an Octop release fixes#1959 without a new harness build.
Co-authored-by: Cursor <cursoragent@cursor.com>
* test(backend): expect the locale code page to win over GBK text
GitHub Windows is cp1252, which accepts the GBK bytes of 中文测试, so those tests were asserting a Chinese round-trip the decoder must not produce. Keep a GBK-only byte that cp1252 rejects.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Agent grep with path=None walks from backend root `/`. Without ripgrep,
deepagents' readline() on /proc/pagemap can grow RSS until the kernel
OOM-kills Octop. Install rg in the images and replace the fallback at
process start with a walk that skips virtual filesystems and bounds each
read (#2101).
* fix: keep hung remote backends from blocking boot
S3/Postgres still use the old harness protocol and a per-call event loop, so one stuck List/Get can prevent HTTP from coming up. Run that I/O on a dedicated worker with timeouts, fail the one expert, and remap leftover unwritable workspace paths.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: avoid MagicMock workspace_dir in boot timeout test
Windows rejects the mock's stringified path when the fake harness mkdirs workspace_dir. Register the agent with an empty config instead.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: adapt S3/Postgres backends and restore admin storage browse
Published octop-harness 1.0.1 plus Octop-side spec mapping and protocol
wrap stop expert start and Admin tree listing from failing on the older
deepagents_backends surface. Browse now caches the backend session and
can preview or download files.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: keep Windows paths valid in storage browse fixtures
f-string JSON turns backslashes into illegal escapes, so row_to_backend_spec
sees an incomplete filesystem config on Windows CI.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: write browse fixture bytes without Windows newline translation
Path.write_text() converts LF to CRLF on Windows, so download assertions
saw b'# hello\r\n'.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
- api: answer a missing /assets/<hash>.js with 404 instead of the SPA
shell, so the browser no longer rejects index.html as a module script
("not a valid JavaScript MIME type") and hides a stale shell left
behind by an upgrade.
- dashboard: extend the stale-chunk reload regex to also match MIME
rejection errors surfaced by WebKit / Chrome / Firefox.
- desktop: split the macOS icon onto an 824/1024 canvas (icons.icns) and
add applyAppIcon / applyTrayIcon so the Dock glyph is not oversized.
- agents: hand harness an absolute workspace_dir on Windows, where the
agent-facing /.octop/workspaces/<id> form has no drive letter.
* fix: harden agent delete cleanup and warn about workspace loss
Preserve backend type when neutralizing Windows host-root specs, run
workspace rmtree off the event loop, and warn in dashboard/CLI that
delete permanently removes the agent workspace.
* style: reformat offline agent delete exception log line
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
* docs: adopt develop integration and main-first release flow (#48)
Document the branching model for agents and contributors, and align the
publish skill so tags are cut on main only after the release PR merges.
* Fix/codex oauth device flow (#54)
* fix(skills): hot-persist skills_disabled without agent rebuild (#47)
Avoid scheduling a full harness reload when enabling/disabling skills or
finishing SkillHub install, which raced list fetches with AGENT_NOT_FOUND.
Also move the experts template "installed" badge to the card footer.
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
* fix: replace ChatGPT/Codex OAuth PKCE flow with device code flow
The PKCE browser-redirect flow used a dynamically built redirect_uri
(Octop's own callback URL), but OpenAI's shared Codex CLI OAuth client
only whitelists the exact http://localhost:1455/auth/callback used by
the local CLI, so every login attempt failed with
authorize_hydra_invalid_request regardless of deployment domain.
Switch to the device code flow instead: no redirect_uri is involved,
so it works no matter how/where Octop is hosted. The backend now
requests a user_code + verification URL and polls in the background;
the frontend shows the code and lets the user open the verification
page instead of doing a popup + postMessage dance.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* style: format codex OAuth device flow
---------
Co-authored-by: jubaoliang <jubaoliang@gmail.com>
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* feat(skills): use SkillHub HTTP APIs with source-neutral installs (#55)
* fix(skills): hot-persist skills_disabled without agent rebuild (#47)
Avoid scheduling a full harness reload when enabling/disabling skills or
finishing SkillHub install, which raced list fetches with AGENT_NOT_FOUND.
Also move the experts template "installed" badge to the card footer.
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
* fix(skills): fetch SkillHub rankings over HTTP
* fix(skills): preserve SkillHub display metadata
* feat(skills): use HTTP for SkillHub search and install
* refactor(skills): support source-neutral packages
---------
Co-authored-by: jubaoliang <jubaoliang@gmail.com>
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: leoxyang <leoxyang@tencent.com>
* Fix/remote browser drag (#50)
* feat(browser): support real remote drag with shared canvas pointer
Forward CDP mousedown/mousemove/mouseup (with clickCount) so remote
browser and desktop can drag instead of pan-to-scroll, and share a
connecting indicator while the stream starts.
* fix(chat): restore loading earlier messages on scroll up
Keep the load-older gate armed across virtual list updates, release
the in-flight latch when history declines to start, and expose a
clickable fallback when the list does not overflow.
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(workspace): clarify path semantics with from_workspace
Add from_workspace so workspace UI keeps leading-slash relative paths
while chat/tool downloads can pass host-absolute send_file paths
through BackendWorkspace, with a host download allowlist.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(workspace): preserve chat document path semantics
* fix(workspace): harden file URL and host path checks on Windows
Preserve Unix-style file:// paths instead of url2pathname backslashes,
decode percent-encoded segments, and deny POSIX system roots like /etc
before Path.resolve() on Windows.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(workspace): decode Windows file URLs to native paths
Unquote percent-encoded segments in file:///C:/… URLs and normalize
via Path so send_file enrichment matches str(Path.resolve()) on Windows.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(yuanbao): persist endpoints and require gateway 0.8.7 (#56)
* chore(yuanbao): persist default channel endpoints
* chore(deps): require harness-gateway 0.8.7
* docs: note Yuanbao channel update
---------
Co-authored-by: leoxyang <leoxyang@tencent.com>
* fix: route context history via harness and real /compact (#57)
Keep deepagents conversation offloads in the agent workspace via
harness-agent≥0.9.12, map catalog context_window into model caps for
UI/summarization, and make /compact force summarization on the current
thread instead of resetting it.
* chore: release 0.9.13
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: 薄生 <67680641+Bosheng0422@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Panda <163635413+Pandakingxbc@users.noreply.github.com>
Co-authored-by: leoxyang <leoxyang@tencent.com>
root_dir='/' resolves to the process current-drive root on Windows, which
breaks workspace seeding when the agent home lives on another drive.
Co-authored-by: Cursor <cursoragent@cursor.com>