Append english_output_guard when lang=en, strengthen ops/generalist EN role prompts,
pass NETX_TOOL_LANG into netx tools, and map Chinese protocol buckets to English.
Co-authored-by: Cursor <cursoragent@cursor.com>
Detect language from user message before UI hint, load ops ROLE_SYSTEM.en.md when en, and wire user_text through WS/HTTP/worker paths.
Co-authored-by: Cursor <cursoragent@cursor.com>
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>
Ignore skills/_workspace/generalist/knowledge-base-manager/ and remove SKILL.md from the index; file remains on disk for local use only.
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>
Apply strict:true to every tools[].function by default; disable with
AIA_TOOL_FUNCTION_STRICT=0. Keep AIA_DEEPSEEK_STRICT_TOOL_MODE=0 as legacy opt-out when primary unset.
Co-authored-by: Cursor <cursoragent@cursor.com>
Match DeepSeek Tool Calls docs: set strict:true on each tools[].function.
Remove non-documented strict_tool_mode extra_body. Keep AIA_DEEPSEEK_STRICT_TOOL_MODE=0 to opt out.
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>
Merge strict_tool_mode: true into extra_body when tools are used and the
endpoint/model looks like DeepSeek. Opt out with AIA_DEEPSEEK_STRICT_TOOL_MODE=0.
Add unit tests.
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>
- _buildRenderRows: include assistant content for event_type=tool_call as
assistant_text items with assistantEventType=tool_call (was omitted).
- Tag other assistant_text slices with assistantEventType for clarity.
- _buildAggregatedAssistantBubble: for tool_call slices, add non-redundant
main-channel text to the reasoning fold under reasoning.processNotes;
skip when already covered by reasoning blocks (whitespace-normalized
substring). Inline markdown for those process lines is omitted to avoid
duplicate display. Bump chat.js cache query.
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>
The reasoning/tool collapsed bundle is gated by adminChatShowToolOutput,
which was only read from localStorage with default false. A fresh browser
therefore hid persisted reasoning in the fold while streaming still showed
tokens. Default to true and bump chat.html asset version so deployments pick
up the script.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Parse reasoning_summary_text (and related) SSE events in OpenAI Responses
streaming; forward deltas to on_token and return reasoning_content on
LLMResponse so thinking-mode rows get event_payload in the store.
- When emitting chat/final from turn_runner, include event_type/event_payload
and merge reasoning_content from earlier assistant rows in the same
turn_uuid so the collapsed reasoning fold matches what streamed.
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>
Replace the hardcoded absolute workspace path in the session-bootstrap self-check command with a repo-relative path so the command works in any cloned location.
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>