127 Commits
Author SHA1 Message Date
Pandaandleoxyang b515e75957 feat(search): add DeepSeek Search configuration (#2180)
Co-authored-by: leoxyang <leoxyang@tencent.com>
2026-10-20 10:40:00 +08:00
Pandaandleoxyang 03500d41c5 feat(models): support OpenAI Responses API selection (#1984)
Co-authored-by: leoxyang <leoxyang@tencent.com>
2026-10-20 10:39:14 +08:00
58327d2ebb feat(skills): shared packages, file tree editor, and BOM-safe frontmatter (#2226)
* feat(skills): shared packages, file tree editor, and BOM-safe frontmatter

Add skill-package sharing (private by default), package skill file-tree APIs
aligned with personalization, and strip UTF-8 BOM when parsing SKILL.md.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(tests): bump backup schema assertions to v22

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 21:16:08 +08:00
liukewiaandjubaoliang abcd46d4f7 feat(onnx): enable offline loading of ONNX models without Hugging Face API (#2114)
- Added a new function to resolve local model snapshots for ONNX models, allowing complete offline loading.
- Updated the embedding model builder to utilize local snapshots when available, enhancing performance and reducing external dependencies.
- Added a unit test to verify the correct usage of local snapshots in the embedding process.

Co-authored-by: jubaoliang <jubaoliang@gmail.com>
2026-10-16 22:41:20 +08:00
bobbangaandjubaoliang 7ea4e47497 feat(experts): add Chinese-first business process expert (#2084)
* feat(experts): add Chinese-first business process expert

* docs(experts): consolidate business process attribution

* fix(experts): use supported business process icons

* fix(experts): complete business operations template integration

---------

Co-authored-by: jubaoliang <jubaoliang@gmail.com>
2026-10-16 21:22:09 +08:00
薄生 8b0793c69a feat(memory): add manual profile context and conflict review (#2103)
* feat(memory): add strong memory editor and surface task failures

* fix(memory): explain session snapshot lifetime in strong memory UI

* feat(memory): add owner profile editor and manual conflict review

* test: verify fault history, turn recovery and memory isolation

* fix: persist terminal failures and release stalled chat turns

* fix(deps): require released memory runtime packages

Require octop-memory 1.0.2, octop-harness 1.0.4 and octop-gateway 1.0.3 for manual document review and terminal stream cleanup. Remove the obsolete harness Git pin and refresh the lockfile so CI installs the matching released APIs.
2026-10-16 20:56:13 +08:00
53fab69f4f feat: add a decision model for skills, tools, and teams (#2098)
* feat: add a decision model for skills, tools, and teams

Let a small model shortlist what the chat model sees, including a local Laya install, and show the result on the turn.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: stop Laya through the POSIX-safe kill helper

Windows mypy does not see os.killpg, so process-group shutdown goes through the shared helper.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: compare the Laya install command without a POSIX path

Windows quotes the interpreter, so the displayed command is checked against the same argv list.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: show Laya readiness and wait for local decisions

Pin the local-CPU timeout fix and distinguish a ready Laya service from the service currently enabled for decisions.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat: save each decision service and pick the default on the card

Clicking a card selects the default. Endpoint and key stay in the drawer
so Jev, Laya, and custom can be kept at once.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-16 16:42:26 +08:00
Pandaandleoxyang 4140ce04f6 feat(agents): add health-aware model failover (#2107)
Co-authored-by: leoxyang <leoxyang@tencent.com>
2026-10-16 15:22:16 +08:00
Bosheng0422 94fb10aebf fix(memory): flush restore backups with a writable handle on Windows 2026-10-14 21:27:33 +08:00
Bosheng0422 ca363e8cd6 feat(memory): add expert-scoped storage maintenance and backup recovery 2026-10-14 19:57:26 +08:00
Bosheng0422 e9d01401e7 fix: bound local knowledge indexing memory and service restarts 2026-10-13 16:03:03 +08:00
seed30 95e1fc125b fix(skills): skip a skillset skill whose package is not published
Importing a SkillHub skillset failed the whole package when one skill zip returned 404. Missing skills are skipped, and the import still fails when every skill is missing.
2026-10-12 20:44:18 +08:00
jubaoliang 97f459ed1b fix(experts): start SQLite when libpq is unavailable (#1934)
Windows ARM64 portable builds omit psycopg-binary, so a top-level psycopg
import crashed startup even when PostgreSQL was not in use.
2026-10-12 14:19:45 +08:00
jubaoliang 815ded9aa0 fix(teams): keep member answers on the room through approval (#1928)
Member speech waits until the host turn is idle, a tool approval pauses that member instead of ending the job, and the live reply stays visible after the user approves. The same change accepts custom role ids and shows long model names in the composer.
2026-10-12 14:14:13 +08:00
薄生 544ea757d5 Merge pull request #1382 from haiyu614/fix/1360-memory-extract-options
feat(memory): configurable distillation call limits (budget, timeouts)
2026-10-10 17:43:42 +08:00
Bosheng0422 b5b3d49ad9 merge develop into fix/delete-persisted-conversation-data 2026-10-10 15:45:15 +08:00
Bosheng0422andCursor d1eeaaa1a2 test(agents): exercise plan-path rewrite without Windows drive paths
pytest tmp dirs on Windows are drive paths, which workspace_plan_path leaves unchanged, so the container-root assertions never matched.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-10 15:44:10 +08:00
Bosheng0422andCursor 69f2419411 fix(chat): shrink the database after a conversation is deleted
Deleting a conversation left the SQLite file the same size. Compact it immediately, or after the expert is idle.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-10 14:58:43 +08:00
7f19f9222e fix: preserve desktop listen config and accept folder drops in chat (#1874)
Desktop startup was saving a hardcoded bind address and could launch a second Octop when the preferred port was busy. Chat uploads dropped folders, shared peer experts are no longer offered for delete, and the state backend stays available only for experts that already use it.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-10 14:42:37 +08:00
薄生 5708981715 Merge branch 'develop' into fix/1360-memory-extract-options 2026-10-10 14:13:58 +08:00
薄生 d3ef0215ef Merge branch 'develop' into fix/delete-persisted-conversation-data 2026-10-10 10:54:16 +08:00
Bosheng0422 9ba836e0b1 delete conversation and expert data 2026-10-09 21:01:08 +08:00
Bosheng0422andCursor 2bc28caff5 test(agents): exercise plan-path rewrite without Windows drive paths
pytest tmp dirs on Windows are drive paths, which workspace_plan_path leaves unchanged, so the container-root assertions never matched.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-09 16:50:55 +08:00
Bosheng0422andCursor 020f2efb4c fix(chat): delete checkpoint data when a conversation or user is removed
Keep the thread when checkpoint cleanup fails, sweep orphan checkpoints from the CLI, and remove an owned agent's workspace when its user is deleted. Skip FnOS process-tree tests where /proc is absent.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-09 15:48:04 +08:00
e9deb58206 fix: harden Docker bootstrap, Bridge sessions, and desktop/provider UX (#1825)
Avoid silent random admin passwords, keep Bridge links alive under load,
and stop custom providers from sending stream_options that MindIE rejects.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-09 07:04:56 +08:00
0568fdd07c fix(hitl): honor allow-all session bypass for later tool approvals (#1617)
LangGraph evaluates interrupt `when` without the HITL thread ContextVar,
so persisted allow_all/allow_tools never skipped execute. Resolve thread
id from the runnable config and auto-resume leftover dashboard cards.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-05 07:47:05 +08:00
10760445d3 fix: keep hung remote backends from blocking boot (#1586)
* 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>
2026-10-04 19:31:59 +08:00
82784d2bc9 fix: give the model a concrete retry failure instead of a generic toast (#1545)
Turn exhausted model-call retries into a recovery prompt with the real
cause, unwrap that wrapper in stream/UI classification, and keep
background inbox jobs marked failed when the installed harness can see
the [model_call_failed] mark.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 19:33:43 +08:00
Dang Zitouandjubaoliang 02241f0ada fix(agents): propagate exhausted model retries as failures (#1012)
Co-authored-by: jubaoliang <jubaoliang@gmail.com>
2026-10-02 21:21:20 +08:00
haiyu614 b84c12d93f feat(memory): configurable distillation call limits (budget, timeouts)
Session-end memory extraction calls the aux model non-streaming with a
fixed 120s light-tier read timeout. Nothing bounded what the model may
generate, so a reasoning-heavy local model chains past the timeout and
extraction degrades every time (TencentCloud/Octop#1360).

Expose the aux call options end to end:

- PUT/GET .../memory/extract-config gains extract_max_tokens,
  extract_light_timeout_s, extract_heavy_timeout_s and
  extract_extra_body (thinking controls for OpenAI-compatible
  endpoints). Numeric 0 and {} reset to automatic; values are clamped
  (timeouts >= 30s, tokens <= 65536).
- AgentManager._memory_extract_settings forwards them as
  HarnessAgentConfig fields, gated on the installed harness knowing
  them, so hot reload keeps working against older releases.
- Memory settings page gains a "提炼调用参数" card (token budget +
  light/heavy wait limits) with copy distinguishing the wait limit from
  the idle trigger; locales updated.

Requires the companion octop-harness (config/runtime/client plumbing)
and octop-memory (default extraction budget) changes; safe to merge
independently since values stay dormant until the harness supports
them.
2026-09-30 19:40:32 +08:00
XiaoChen a02e3e18e7 fix(skills): fetch SkillHub rankings through the shared capped HTTP client (#1308)
`_fetch_ranking_json` was the only fetch in this module that hand-rolled
`urllib.request.urlopen` instead of calling `_http_request`.

`response.read()` therefore buffered the whole body with no size limit, where
`_http_request` checks `Content-Length` and then reads in `HTTP_READ_CHUNK`
slices up to `MAX_HTTP_BYTES` — the search path already passes a cap.

Its `except` ladder also stopped at `HTTPError`/`URLError`/`TimeoutError`, so a
mid-stream `ConnectionResetError` or an `http.client.HTTPException` escaped as a
raw exception. The endpoint that serves rankings (`routers/skills.py::
_hub_rankings`, used by `GET /skills/hub/rankings` and
`GET /agents/{id}/skills/hub/rankings`) only maps `SkillHubMarketError` to 502
and `SkillHubMarketTimeout` to 504, so an upstream hiccup became an opaque 500.

Rankings now go through `_http_request` like `_fetch_search_json` and
`_download_skillhub_package` already do. The 4 MiB JSON cap is named
`_MAX_JSON_BYTES` and used by both JSON fetches instead of repeating the literal.

`_Response` in `tests/unit/agents/test_skillhub_market.py` is the stub that
`test_fetch_ranking_json_uses_showcase_endpoint` hands back from `urlopen`, so it
has to accept the `size` argument `_http_request` passes. It now wraps the
payload in `io.BytesIO` and reads exactly like `_BytesResponse` next door, which
also makes the read loop stop on the first empty chunk instead of spinning.
2026-09-30 15:13:09 +08:00
XiaoChen 98793fb762 fix(wechat-ops): scope the publisher token cache to its AppID (#1332)
The cache file is shared by every official account but the record only held
the token and its expiry, so the reuse check looked at time alone. After
switching WECHAT_APP_ID the publisher kept sending the previous account's
token for up to two hours: draft/add succeeded against the wrong account, the
command exited 0, and it still printed a successful publish. Tag each record
with the AppID it was issued for and refuse to reuse a token that was not
fetched for the account currently configured.
2026-09-30 15:12:46 +08:00
HUANG Chengandjubaoliang bd73bb60aa fix(plugins): offload oversized octop_ui payloads to ToolMessage.artifact (#1032) (#1116)
Plugin tools returning large octop_ui payloads (e.g. a bangumi season
with 1200+ episodes, ~228KB JSON) blew up the LLM context because the
same tool-result string served both the model and the UI.

Add OctopUiOffloadMiddleware at the innermost agent middleware layer:
when a ToolMessage content is a >=4000-char string carrying a non-empty
octop_ui renderer and data (and no file:// media refs), the payload is
moved in-place to ToolMessage.artifact and the model-visible content is
replaced by a compact result that keeps title/summary. Tool id,
tool_call_id, name and status are preserved.

Frontend restores rendering from artifact: ToolCallData.artifact,
closeToolCall extraction, history replay path, and resolvePluginUiData
prefers explicit data over data_ref. serialize.py surfaces artifact on
tool_result blocks; history recorder backfills artifact as fallback.

Spec: docs/octop-ui-payload-offload.md

Co-authored-by: jubaoliang <jubaoliang@gmail.com>
2026-09-25 23:06:19 +08:00
347dee56f4 refactor(infra): group agents modules and clarify package ownership (#1164)
* refactor(agents): group thin modules into domain subpackages

Move plugin helpers, memory, settings stores, persona/MBTI, and avatar
bootstrap code under plugins/, memory/, settings/, persona/, and experts/
while keeping top-level import shims so existing call sites stay stable.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor(agents): drop compatibility shims after subpackage move

Call sites already import the new package paths; remove the top-level
re-export stubs so the agents tree only shows real modules.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor(agents): move thread helpers into threads/

Group artifact shaping, fork, and context breakdown under
agents/threads so top-level only keeps lifecycle/config adapters.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor(agents): fold profile/runtime/tool catalog into settings/

Move the remaining config-surface helpers under settings/ and drop the
skill_package id-list aliases in favor of dump/parse_id_list.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor(agents): group workspace_dir and execute_env under workspace/

Keep path resolution and harness execute-env injection together as one
workspace package; leave only manager and conversation_mode at top level.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor(infra): fix history/SkillHub ownership and drop thin providers/

Move history_projection under history/, share SkillHub host/limits and
route expert skill downloads through skills.skillhub_market, and fold
Codex OAuth helpers into agents.providers to remove the tiny providers/
package.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs: sync AGENTS.md and guides with infra/agents layout

Reflect subpackages (settings/workspace/threads/persona, history/, skills/)
and drop stale runtime.py / mbti_profiles paths after the agents reorg.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-25 22:32:41 +08:00
jubaoliangandCursor 1d2b2558fb feat(chat): team artifacts, fan-in tool trail, and host wrap-up context
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>
2026-09-25 14:48:45 +08:00
2209cdc90f chore(deps): switch runtime packages to octop-* 1.0.0 (#1136)
Replace orcakit-harness-agent / harness-* with octop-harness, octop-gateway, octop-memory, and octop-browser, and align docs, UI copy, and generated paths.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-25 06:44:24 +08:00
jubaoliangandCursor 5e34c8a001 fix: connectors empty layout and restore prior control-plane behaviors
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>
2026-09-24 22:40:47 +08:00
689216e4b6 feat: admin user batch policies, token UX, default FS root, and media push hardening (#1114)
* feat: admin user batch policies, token UX, default FS root, and media push hardening

Add admin user batch enable/disable/delete and resource policies (token quota,
max experts), improve token inputs with K/M presets, default unrestricted
local backends to host filesystem root, and tighten gateway tool-media push
with clearer path-outside-root stream errors.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(workspace): treat Windows drive roots as host-root sentinels

Default FS-root backends use C:/ on Windows; treating that as a scoped
jail put workspaces under the drive root and broke bootstrap/invite tests.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-24 17:22:49 +08:00
0559b0cf5d fix(agents): HITL 会话跳过策略不再按进程缓存 (#1090)
threads.hitl_policy 是策略的唯一事实来源:每次判定都回查该行。
octop run --workers N(或 CLI 与服务并发)共用一个库时,进程内缓存会让
另一个进程撤销的跳过继续自动放行工具调用,也会让新授予的跳过不生效;
写库失败时缓存里还会留下一个从未落库的豁免策略。

Co-authored-by: sxh313 <250161920+sxh313@users.noreply.github.com>
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
2026-09-24 15:09:58 +08:00
694a8cea8d feat(teams): 主持人先改写再派工,成员回复同步到 IM 通道 (#1064)
用户原话不再原样转给成员;通道原先只看得到主持人短答,成员收口后补推带说话人的完整消息。

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-23 22:48:26 +08:00
4ea7963b2d fix(acp): 沙箱环境下禁用向外委托 Runner (#1061)
* fix(acp): block outbound runners under directory sandbox

Host-spawned acp_runner would bypass a scoped root_dir jail; gate the
per-agent tool in API/runtime and gray the ACP UI while inbound octop acp stays available.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(acp): allow workspace-scoped local roots for outbound runners

Windows rewrites host `/` to the agent workspace; treating that as a
directory sandbox made ACP enable/round-trip fail on win32 CI.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-23 22:48:13 +08:00
21760bbf56 fix(agents): serialize harness execution per thread for turns and HITL resume (#782) (#960)
Dashboard turns are queued per thread by the channel debounce lock, but
POST /chat/hitl/resume (and cron delivery) drive the same LangGraph
checkpoint without that lock. A resume racing an in-flight turn on the
same thread runs two concurrent harness executions whose checkpoint
writes interleave.

Acquire a per-(agent_id, thread_id) lock in AgentManager.stream and
AgentManager.resume_hitl — the single chokepoint every driver (dashboard,
IM, cron, team speaker, resume) routes through — so one thread's
checkpoint is only ever executed once at a time.

Co-authored-by: Dang Zitou <dengzitao888@163.com>
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-22 17:26:42 +08:00
jubaoliangandCursor 69f31656c3 feat(chat): add per-thread HITL allow policy
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>
2026-09-22 17:14:28 +08:00
Pandaandleoxyang c24a1a1cb0 feat(media): add multi-provider configuration and routing UI (#951)
* feat(media): add multi-provider generation settings

* chore(deps): sync harness-agent lock to 1.0.13

---------

Co-authored-by: leoxyang <leoxyang@tencent.com>
2026-09-22 16:16:29 +08:00
IronMurphyandsclfcz 2e7490e3d9 fix(agents): 配置更新不再丢掉 workspace_dir (#953)
PATCH /agents/{id} 用客户端提交的 config 整体替换存储的 config。只提交部分字段的
客户端(PATCH 语义允许,第三方脚本/集成常见)因此会丢掉 workspace_dir:
resolve_workspace_dir() 于是回退到 classic 布局 <root>/agents/<id>,而 scoped /
容器 agent 的真实工作区在别处 —— agent 看不到自己的 skills、会话与产出文件。

实测(同一实例):
  ① 创建后 workspace_dir = <root>/sandbox-root/scoped-ws/AGT001
  ② PATCH {"model": ...} 后  → workspace_dir 丢失
  ③ resolve_workspace_dir() → <root>/agents/AGT001(工作区被换掉)

修法与既有的 system_files_path 保护同源:_preserve_system_files_path 泛化为
_preserve_internal_layout,用户面更新路径(update / update_config_json)额外
pin_workspace_dir=True;内部 persist(persist_harness_config,供 create 与
resolve_workspace_dir 回填使用)不 pin,否则 scoped agent 在创建时就写不进工作区。

Co-authored-by: sclfcz <hepanshuo@gmail.com>
2026-09-22 16:11:55 +08:00
XiaoChen 282d88dd83 fix(experts): read skill frontmatter with the shared parser
`collect_skill_context()` is the only caller that feeds the expert-manifest
generator prompt, and it parsed frontmatter with a private copy instead of
`octop.infra.utils.frontmatter.parse_frontmatter`. The private copy only
accepted a literal `---\n` first line and split each line on `:`.

Two shapes the shared parser handles therefore reached the prompt as a skill
with no description:

* `description: >-` folded blocks collapsed to the literal `'>-'` — the style
  the bundled expert skills already use;
* a frontmatter fence behind an HTML comment was not recognised at all, and the
  raw `---` fence stayed inside the excerpt.

6 of the 34 SKILL.md files in this tree parse differently between the two
parsers. The value is part of the generator prompt whose output is written back
into the cached expert manifest.json, so it is not cosmetic.
2026-09-22 11:56:00 +08:00
jubaoliangandCursor 04ac1835b0 fix(experts): keep public portrait when publishing without upload
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>
2026-09-22 10:49:47 +08:00
jubaoliangandCursor ae7dfc8b0f feat(chat): add Ask / Plan / Craft conversation modes (#934)
* feat(chat): add Ask / Plan / Craft conversation modes

Keep mode sticky per thread, enforce Ask/Plan in harness-agent, and let Plan write a workspace plan before Craft executes it.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Update pyproject.toml
2026-09-21 22:18:28 +08:00
薄生 e512f05bf5 Feature/memory slim tool (#865)
* harness agent upgrade for cache polish

* format

* feat(memory): add coordinated memory slim commands and progress UI

* build(deps): require harness-memory 0.9.11

* fix(deps): restore harness-memory 0.9.11 floor after merge

* fix(agents): await async shutdown to drain SQLite workers

Use HarnessAgentManager.aclose() during shutdown so SQLite cleanup
finishes before the event loop closes, preventing background threads
from raising "Event loop is closed".

Add a real SQLite regression test and preserve the existing ordering
that waits for memory slimming to finish before closing agents.

Validation: make all — 3582 passed, 17 skipped.
2026-09-21 15:44:19 +08:00
jubaoliangandCursor f843e5f704 feat(experts): compose prompts and skills when creating experts
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>
2026-09-21 12:59:17 +08:00