Resolve runtime language from ui_lang and chat.send lang instead of hardcoding zh.
Align generalist/ops prompts with user language and require host_name (not ne_id) in ops outputs.
Co-authored-by: Cursor <cursoragent@cursor.com>
Migrator: only refuse import when SQLite and PG both have rows for a table (PG seed rows ok when SQLite empty). Add unit test for conflict helper.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Add grep_tool: ripgrep with Python fallback; avoid --json with -l/-c.
- Add workspace_profile_tool: scan, languages, tests, packages, git, CI hints; tests.
- write_file: resolve relative paths via workspace root (no data/workspace prefix).
- Update path guard and local public tool tests for new write behavior.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Rename platform/ to svc/ to avoid shadowing stdlib platform.
- Replace from oclaw.* with from svc/runtime/interfaces; update -m CLI paths.
- tests/conftest: prepend repo root to sys.path (no parent-folder package name).
- CI: paths and offline_eval script under repo root.
- Ops scripts: PYTHONPATH must be repo root for python -m runtime.* (fixes gateway/WhatsApp sidecar startup).
- Fix default oclaw.json path in tabular/file attachment limits; stabilize attachment test config.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add dsml_tool_parse per upstream HF encoding README (invoke/parameter,
string true|false, JSON for non-strings). Normalize <||DSML|| gateways.
Wire into run_oclaw_direct_loop when AIA_DSML_TEXT_TOOLS is on or
base_url/model suggests DeepSeek; skip DSML repair retry in that mode.
Strip the first tool_calls block from persisted assistant body. Finalize
pass keeps DSML disabled so no tools run after the no-tool round.
Tests cover parser variants and direct_loop execution for DeepSeek URL
and forced env.
Co-authored-by: Cursor <cursoragent@cursor.com>
Non-thinking profiles previously wrote model reasoning only as separate
event_type=reasoning rows whose event_payload held chunk_index metadata, so
JSON inspection showed tool payloads but no reasoning_content key.
Store the full merged reasoning blob on the primary assistant row whenever
present (same shape as thinking mode). Update instruction-leak filtering to
scan event_payload.reasoning_content as well as legacy reasoning rows.
Co-authored-by: Cursor <cursoragent@cursor.com>
Expose netx_query_ume_ne_inventory and netx_get_ume_ne (GET /v1/ume/inventory/ne and /ne/{id}). Update ops playbook, ROLE_SYSTEM, env example comment, and unit tests.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add workspace_skills_layout_signature (hash of paths + mtimes + sizes) and fold it into get_executor_prompt_static and manager prebuild cache keys. Add tests for signature drift and cache invalidation.
Co-authored-by: Cursor <cursoragent@cursor.com>
Include skill_role_binding store JSON in executor and manager prompt cache signatures so skill catalog updates after binding edits without restart. Admin async prewarm now polls prewarm/status until not running before router() so parallel prompts fetch matches completed warm.
Co-authored-by: Cursor <cursoragent@cursor.com>
should_apply_workspace_role_filter no longer requires at least one bound skill. With binding enabled and an empty map, the catalog shows only public workspace skills per role (matches prewarm and runtime). Update Admin copy and add regression test.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add enabled_stored and enabled_env_present on skills binding GET/POST so UIs can explain when AIA_SKILL_ROLE_BINDING_ENABLED overrides SQLite. Add Admin hints for save-required and env override. Add skill_role_binding_enabled_stored/env_present helpers and a unit test.
Co-authored-by: Cursor <cursoragent@cursor.com>
Apply a global native tool_calls-only prompt rule to prevent DSML/textual protocol outputs, and expand start_web/stop_web to manage gateway, sidecars, and wiki worker without launching desktop.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Forward reasoning_content and non-stream reasoning to on_token in
OpenAI chat completions; Gemini thought parts to on_token.
- Stream bubble: always render session.tool panels; format tool_use_call
payloads and title as call · tool_name.
- Emit tool_use_call via on_tool_ui before tool execution so WS shows
invoke cards before tool_use_result.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Resolve legacy multimodal inputs from session history when the user sends
text-only (assistant images first, then user uploads); optional env toggles.
- Support relay_pointer image resolution in legacy lane collector.
- Align uvicorn WebSocket frame limit with MAX_PAYLOAD_BYTES; document
OCLAW_UVICORN_WS_MAX_SIZE and compatible-mode env knobs.
- Admin chat: encode attachments after bubble preview; FileReader-based
base64 for large files.
- Tests and docs for new behavior.
Co-authored-by: Cursor <cursoragent@cursor.com>
Set trust_env=False for netx tool HTTP clients so local netx endpoints are called directly instead of via host proxy settings.
Co-authored-by: Cursor <cursoragent@cursor.com>
Make start/stop scripts robust to directory renames, and improve stop hints when process termination is denied.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add a session-bootstrap content signature to the executor prompt cache key so identity/wiki updates invalidate cached system prompts and take effect on the next turn.
Co-authored-by: Cursor <cursoragent@cursor.com>
Expand memory wiki search with context-rich paginated results and bounded query expansion, and add default three-stage retrieval guidance for agents using memory_wiki_search.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Add runtime/plan_agent_v2 package and shims; gateway/direct_loop/WS wiring
- Admin chat: interaction mode and specialist only in user menu; session API stores memory_mode and execution_mode only
- POST /admin/api/chat/user-mode mirrors plan_agent_version to AIA_EXPERT_PLAN_AGENT_V2_ENABLED (v2 to 1, v1 to 0)
- Composer cleanup (hidden mode select, no reasoning toggle in meta bar); tests and _local/system.env.example
Co-authored-by: Cursor <cursoragent@cursor.com>