CodeQL flags is_dir on an admin-supplied path unless realpath is contained with startswith first. Keep the denylist, and stat the directory only inside that guard.
Co-authored-by: Cursor <cursoragent@cursor.com>
CodeQL treats a "pypi.org" substring as an incomplete URL check, and SHA-256 of the OAuth verifier as password hashing. Label only the parsed hostname, and verify S256 with the RFC 7636 vector.
Co-authored-by: Cursor <cursoragent@cursor.com>
Default stays persistent (localStorage). Unchecking keeps the JWT in
sessionStorage for this tab only; SSO popups post the token back so the
opener can store it correctly.
Co-authored-by: Cursor <cursoragent@cursor.com>
Improve team streaming visibility (live speakers, generating footer, IM
dispatch/wrap-up), relax ACP tool enable under sandbox while locking
runners, strip channel think tags per show_thinking, and clarify provider
CLI usage in the assistant skill. Includes self-update/UpdateConfig WIP
from the same working tree.
Co-authored-by: Cursor <cursoragent@cursor.com>
Persist member file refs and tool history on team walls, open docks by producer agent, and inject truncated member answers into host follow-up so wrap-up can follow their advice.
Co-authored-by: Cursor <cursoragent@cursor.com>
Apply the remaining working-tree changes: connectors empty-state layout,
plus the knowledge, HITL, captcha, workspace, user-cache, and SSRF
adjustments with matching tests.
Co-authored-by: Cursor <cursoragent@cursor.com>
The harness-* libraries are now published as octop-harness, octop-gateway,
octop-memory, and octop-browser.
Co-authored-by: Cursor <cursoragent@cursor.com>
Managing skills and subagents already covers install and copy, so the extra add actions only duplicated that entry.
Co-authored-by: Cursor <cursoragent@cursor.com>
Digits-only sed left VER as the whole pyproject line for 1.0.2b1, so
native upload and GHCR wait both failed and no .fpk was attached.
Co-authored-by: Cursor <cursoragent@cursor.com>
Team rooms used a hardcoded "#管理团队" / "#Manage team" string instead of
the agent name already passed into WelcomeScreen.
Co-authored-by: Cursor <cursoragent@cursor.com>
Align skill packages, knowledge bases, browser, and desktop idle tips
with borderless layout and shared mascot sizing; move desktop Check/
Connect into the guide; and use Route for chat model Auto to avoid the
skills Sparkles collision.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep tool-approval bypass on the conversation (allow this tool / allow all)
without changing global security settings. Also let expert create carry
welcome quick prompts, and replace the login forgot-password tip with a
platform-specific CLI dialog.
Co-authored-by: Cursor <cursoragent@cursor.com>
When the chat dock is open the floating workspace/browser/terminal
buttons disappear; expose the same actions from a title-bar + menu and
keep the popup mask from closing while that menu is open.
Co-authored-by: Cursor <cursoragent@cursor.com>
aglob("**/*") skips hidden paths, so downloads only packed a few root files.
Walk the local tree (and als/aglob fallbacks) so archives include the full workspace.
Co-authored-by: Cursor <cursoragent@cursor.com>
The 32px buttons were clipping selected labels. Match the other toolbar icons, keep the selection in the tooltip, and show provider logos in the model picker.
Co-authored-by: Cursor <cursoragent@cursor.com>
Snapshot avatars only cover custom uploads; persist bundled/remote icon_url in the manifest so published cards no longer fall back to the default Lucide icon.
Co-authored-by: Cursor <cursoragent@cursor.com>
Open workspace in the same right/bottom/popup tabs as browser and file
changes, and send Help & Feedback to https://octop.cloud.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep the login form quiet: show a Forgot password? control first, then
expand admin-first help with the host CLI command as secondary detail.
Co-authored-by: Cursor <cursoragent@cursor.com>
Allow editing AGENTS.md, picking marketplace or other-expert skills, and
adding subagents in the create/edit drawers. Default is a blank AGENTS.md
template; marketplace or copy failures warn instead of aborting create.
Co-authored-by: Cursor <cursoragent@cursor.com>
Tencent mirror resolved URLs plus replace-registry-host=always made CI
fetch registry.npmjs.org/npm/<pkg> and 404 on Release npm ci.
Co-authored-by: Cursor <cursoragent@cursor.com>
Stop .openBrowserPrompt from filling the message column under the turn
grid, and raise the harness-browser floor to >=0.7.9 for the Windows CDP
profile writability fixes.
Co-authored-by: Cursor <cursoragent@cursor.com>
Move ACP into Personalization → Tools as a sub-tab alongside built-in and
plugin tools, while restoring the standalone Control ACP sidebar page so
both surfaces stay available. Also leave scrollbar clearance on card-list
scrollers and tighten horizontal card gaps across dashboard grids.
Co-authored-by: Cursor <cursoragent@cursor.com>
Peek only the first tar member for manifest flags and run list_backup_files
off the event loop so Backup/Restore stays responsive with multi-GB files.
Closes#674
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep automatic update reminders on the latest stable release, pin upgrades
to the confirmed version, and require --allow-prerelease for CLI beta installs.
Co-authored-by: Cursor <cursoragent@cursor.com>
Refresh dropped message times because live projection never copied
checkpoint_ts. Stamp the current turn, fall back to created_at, keep
the user avatar lined up with the text bubble, and move copy/edit
beside the timestamp. README now matches shipped knowledge, plugin,
and PostgreSQL surfaces.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep message bodies on the 960px input track and place expert/user
avatars in extra side gutters, with one expert avatar per turn.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep partial tokens and stream errors in thread history after a stop or
provider failure, and drive cron empty-state cards from manifest
task_examples. Backup skips stale workspace paths instead of creating them.
Co-authored-by: Cursor <cursoragent@cursor.com>
Admins can set storage-root and token quota when creating a user, and
cronjob_create now requires a display name with prompt-prefix fallback.
Co-authored-by: Cursor <cursoragent@cursor.com>
Allow experts and skill packages to carry composer defaults so that
installed/created agents start with the author's chosen knowledge bases
and MCP servers. Defaults are persisted as agent profile columns and
validated against the installing user. Adds the per-user policy resource
table (migration 014) and wires the dashboard composer fields plus
locale strings.
- Add knowledge_base_ids and mcp_servers to the agent profile schema
- Validate KB/MCP ids on expert/skill-package install and create paths
- Persist defaults via migrate.py helper and 014_user_policy migration
- Surface composer default fields in the dashboard expert/skill UI
Create and edit skill packages and knowledge bases from a right drawer. Move edit/delete onto each list card, and let knowledge bases attach into the current chat.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add a `user_policies` table (migration v14) backing per-user `workspace_root_dir`
(restricts local backend roots) and `token_quota` (lifetime token limit). Token
quota is enforced in the agent runtime via TokenQuotaMiddleware. Extract slash
command parsing into infra/gateway/slash/parser.py and expose policies on the
users API. Frontend adds admin policy UI, storage/chat/experts restyle, and a
shared TabLabel / PageLoading component.
- Add Didi (滴滴) MCP connector: catalog entry, remote spec builder,
credential validation, and dashboard logo asset.
- Report upgrade progress while the upgrade task runs (backend polls
the task with a timeout loop instead of blocking silently) and
retry the frontend progress poll a few times before surfacing an
error, instead of failing on the first transient fetch error.
- Desktop launcher: detect when the bundled portable runtime is newer
than the installed one and replace it in place (extract to a
side-by-side dir, swap, keep a previous copy for rollback on
failure) instead of only extracting on first launch.
- Fix wording in sync-main-to-develop.yml (sync direction was
described backwards: "develop onto main" -> "main into develop").
Migrate immediately after overlay and repair folded v13 connectors schema so existing backups stay usable. Refuse newer schema versions with BACKUP_SCHEMA_INCOMPATIBLE. Also drop the knowledge-bases Beta nav badge.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Relocate voice and search engine settings from Advanced to Models
page/permission category (nav, routes, permission gates).
- Add /admin/voice/providers/test-configuration endpoint and
VoiceManager.test_configuration() to probe unsaved provider values
before saving.
- Redirect legacy /admin/advanced?tab=voice|search links to the new
Models page location.
Replace the legacy shared/default Playwright session router with
per-user harness-browser profiles (`user-<id>`) so concurrent users no
longer share one Chrome session, cookie jar, or recording. The backend
now always derives the profile from the authenticated user (or the IM
thread's agent owner) instead of trusting client-supplied profile/session
ids, and a BrowserProfileMiddleware pins tool-selected profiles to the
same boundary. Also dedupes ThreadRegistry's session-refresh logic.
Parse more text and spreadsheet types, add optional local/remote OCR for images and scanned PDFs, and surface upload progress so indexing no longer appears stuck.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace raw JSON tool-approval dumps with localized summaries, an attention icon, and message-consistent spacing.
Co-authored-by: Cursor <cursoragent@cursor.com>
Default backups skip chat history so archives stay smaller. Restore only
replaces packed config, workspaces, skill packages, plugins, and knowledge
files, and preserves live chats when they were not included.
Co-authored-by: Cursor <cursoragent@cursor.com>
Passwordless sudo can install the engine, but /etc/docker/daemon.json and
systemctl restart still need elevation; otherwise the Tencent mirror step
silently skips.
Co-authored-by: Cursor <cursoragent@cursor.com>
Reserve a toolbar spacer so right-dock and popup actions no longer sit
under frameless caption buttons, hide the PWA install entry inside the
Wails shell, restyle the splash as a card with a progress bar, and add
Windows settings-window height so DWM does not clip the bottom inset.
Co-authored-by: Cursor <cursoragent@cursor.com>
GitHub Release assets mixed unversioned Octop-<plat>.zip with Octop-Desktop-*
and PEP wheels. Name public files Octop-<kind>-<os>-<arch>-<version>.<ext>,
gzip the Linux desktop tarball, and keep the zip payload directory plus the
macOS .app Resources name stable so the Wails shell still unpacks them.
Co-authored-by: Cursor <cursoragent@cursor.com>
The FnOS FPK workflow kept a stray env block when the rolling-release step was
removed, so GitHub rejected the whole file and Release's dispatch failed with
"'env' is already defined" — silently, because that job is continue-on-error.
CI also ran the full suite three times per release (release PR, main push, sync
PR) on identical trees. Drop the main push build, since PR checks already run on
the merge result, and skip the post-release sync PR, which is auto-merged before
its checks even start.
Release now passes the tag to the sync workflow so the branch is named after the
version instead of the constant "manual", which every release force-pushed over.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep thinking/tool process open during live generation so users can follow it, then collapse when the turn finishes. History stays collapsed.
Co-authored-by: Cursor <cursoragent@cursor.com>
os.geteuid() does not exist on Windows, breaking mypy in CI. Reuse the existing octop.infra.utils.posix_compat.geteuid() shim like the rest of the codebase.
The dashboard is loaded from a remote origin, so Wails never injects
runtime.js. Arm wails:drag ourselves, put window controls on the right, and
drop InvisibleTitleBarHeight. Expert profile skill/subagent cards now show
the icon beside the title, with status or slug on the same row.
Co-authored-by: Cursor <cursoragent@cursor.com>
- scripts/build-fpk.sh: emit Octop-fnos-docker-<ver>.fpk / Octop-fnos-native-<ver>.fpk (variant in the name, not a bare -native suffix).
- fnos-build-fpk.yml: FPK_NAME_PREFIX is now Octop-fnos; stop passing FPK_ITER; the release tag is fnos-<ver> (no -NN iteration, no -vanilla) and the rolling fnos-vanilla-latest release is no longer produced.
- fnos/README.md: document the new versioned artifact names.
Configure MacWindow.InvisibleTitleBarHeight (32px) on the frameless desktop
window so macOS keeps a draggable region beneath the custom title bar.
Only affects the macOS build; other platforms are unchanged.
- 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.