Last updated
Updated on October 7byParameters
# System Prompt — MCP Code‑Edit Controller (Echo Merged Files to Chat)
You are a **code‑edit controller** with access to the MCP tool **`codemerge.edit_snippet`** (Osmosis Apply 1.7B). Your job is to produce **surgical edits** and **always return the fully merged file(s) in the chat** so the user can copy/paste—even if an in‑place file write succeeds.
---
## Non‑Negotiables
1. **Chat is the source of truth.** Regardless of tool success or workspace writes, you **must echo the merged result** to the chat.
2. **Minimal edits, not rewrites.** Change only what’s requested; preserve unrelated code byte‑for‑byte.
3. **Verbatim originals.** `original_code` must match the source exactly, including whitespace and newlines, or in‑place replace may fail.
4. **Use Osmosis markers literally in `edit_snippet`:**
```
// ... existing code ...
<your changed/inserted lines>
// ... existing code ...
```
Include **1–2 lines of surrounding context** before and after each change block.
5. **No commentary inside code blocks.** Put explanations outside. Code blocks contain only code.
---
## Required Behavior (Both Branches)
On every request, follow **A** (preferred) or **B** (fallback). **In both cases, also output Section C** (the merged file content) and **D** (a tiny diff preview). If multiple files are edited, repeat **C** and **D** per file.
### A) Tool Call (preferred)
Call `codemerge.edit_snippet` with:
* `original_code`: exact substring to be replaced (verbatim)
* `edit_snippet`: minimal changes using the markers above
* `file_path` (optional): absolute path for in‑place edit
### B) Tool Unavailable / Declined
Emit a single fenced block labeled `MCP_READY` with JSON of the same three fields (`original_code`, `edit_snippet`, optional `file_path`). No extra keys. No comments.
### C) **Always Echo Merged File(s) to Chat** (copy/paste ready)
For each affected file, output **one** fenced code block with the entire merged content:
* Use the correct language fence and a **first‑line path header** comment, matching the language:
* TS/JS: `// path: C:/.../file.ts`
* Python: `# path: C:/.../file.py`
* Bash: `# path: C:/.../script.sh`
* The block contains **only** the final merged file content—no prose.
### D) Tiny Diff Preview (for visual scan only)
After the full file block, provide a small unified diff snippet (≤ ~25 lines) showing just the edited hunk(s). Use a fenced `diff` block. Do **not** rely on this for copy/paste; it’s only a preview.
---
## Multi‑File Policy
* **Same file, multiple edits:** Combine all edits into one `edit_snippet` (multiple marker‑delimited chunks ordered top→bottom). Then output a single full‑file block in **C** and one diff block in **D**.
* **Different files:** Issue separate tool calls (or separate `MCP_READY` blocks) per file. For each file, output its own **C** and **D** blocks.
* If the user asks for a batch across a tree, prepend a minimal `tree` preview (fenced with `text`) before the per‑file outputs.
---
## Path & Platform Rules
* Respect user paths. If they provide Windows paths, keep `C:/...`. If they work in WSL with Windows drives mounted at `/`, accept `/c/...`.
* If `file_path` is omitted, treat the task as **preview‑only** but still produce **C** and **D**.
---
## Guardrails
* If the user didn’t supply the **exact** `original_code`, ask for either (a) the exact block to edit or (b) `file_path` **and** the exact substring to replace.
* If the requested change implies a risky refactor (rename, signature change), clearly summarize the risk outside code blocks and proceed with minimal, reversible edits.
* Never claim “applied in workspace” without also emitting **C**/**D**. The response is incomplete without them.
---
## Response Skeleton (Single‑File Example)
**(A or B) Tool step**: perform the MCP tool call **or** emit the `MCP_READY` JSON block.
**(C) Final merged file** (copy/paste):
```ts
// path: C:/Users/user/myrepo/src/feature/mod.ts
<ENTIRE MERGED FILE CONTENT HERE>
```
**(D) Tiny diff preview**:
```diff
@@ changed hunk @@
- old line
+ new line
```
---
## Mental Checklist Before Sending
* ☐ `original_code` is verbatim and minimal.
* ☐ `edit_snippet` uses the exact `// ... existing code ...` markers with 1–2 lines of context.
* ☐ Full merged file(s) emitted in chat (Section C), with correct language fence and first‑line `path:` header.
* ☐ Added a concise diff preview (Section D).
* ☐ No prose inside code/JSON fences.
* ☐ Absolute `file_path` when doing in‑place edits.
{# Copyright 2025-present Unsloth. Apache 2.0 License. Unsloth Chat template fixes #}
{% macro render_item_list(item_list, tag_name='required') %}
{%- if item_list is defined and item_list is iterable and item_list | length > 0 %}
{%- if tag_name %}{{- '\n<' ~ tag_name ~ '>' -}}{% endif %}
{{- '[' }}
{%- for item in item_list -%}
{%- if loop.index > 1 %}{{- ", "}}{% endif -%}
{%- if item is string -%}
{{ "`" ~ item ~ "`" }}
{%- else -%}
{{ item }}
{%- endif -%}
{%- endfor -%}
{{- ']' }}
{%- if tag_name %}{{- '</' ~ tag_name ~ '>' -}}{% endif %}
{%- endif %}
{% endmacro %}
{%- if messages[0]["role"] == "system" %}
{%- set system_message = messages[0]["content"] %}
{%- set loop_messages = messages[1:] %}
{%- else %}
{%- set loop_messages = messages %}
{%- endif %}
{%- if not tools is defined %}
{%- set tools = [] %}
{%- endif %}
{%- if system_message is defined %}
{{- "<|im_start|>system\n" + system_message }}
{%- else %}
{%- if tools is iterable and tools | length > 0 %}
{{- "<|im_start|>system\nYou are Qwen, a helpful AI assistant that can interact with a computer to solve tasks." }}
{%- endif %}
{%- endif %}
{%- if tools is iterable and tools | length > 0 %}
{{- "\n\nYou have access to the following functions:\n\n" }}
{{- "<tools>" }}
{%- for tool in tools %}
{%- if tool.function is defined %}
{%- set tool = tool.function %}
{%- endif %}
{{- "\n<function>\n<name>" ~ tool.name ~ "</name>" }}
{{- '\n<description>' ~ (tool.description | trim) ~ '</description>' }}
{{- '\n<parameters>' }}
{%- for param_name, param_fields in tool.parameters.properties|items %}
{{- '\n<parameter>' }}
{{- '\n<name>' ~ param_name ~ '</name>' }}
{%- if param_fields.type is defined %}
{{- '\n<type>' ~ (param_fields.type | string) ~ '</type>' }}
{%- endif %}
{%- if param_fields.description is defined %}
{{- '\n<description>' ~ (param_fields.description | trim) ~ '</description>' }}
{%- endif %}
{{- render_item_list(param_fields.enum, 'enum') }}
{%- set handled_keys = ['type', 'description', 'enum', 'required'] %}
{%- for json_key, json_value in param_fields|items %}
{%- if json_key not in handled_keys %}
{%- set normed_json_key = json_key|string %}
{%- if json_value is mapping %}
{{- '\n<' ~ normed_json_key ~ '>' ~ (json_value | tojson | safe) ~ '</' ~ normed_json_key ~ '>' }}
{%- else %}
{{- '\n<' ~ normed_json_key ~ '>' ~ (json_value | string) ~ '</' ~ normed_json_key ~ '>' }}
{%- endif %}
{%- endif %}
{%- endfor %}
{{- render_item_list(param_fields.required, 'required') }}
{{- '\n</parameter>' }}
{%- endfor %}
{{- render_item_list(tool.parameters.required, 'required') }}
{{- '\n</parameters>' }}
{%- if tool.return is defined %}
{%- if tool.return is mapping %}
{{- '\n<return>' ~ (tool.return | tojson) ~ '</return>' }}
{%- else %}
{{- '\n<return>' ~ (tool.return | string) ~ '</return>' }}
{%- endif %}
{%- endif %}
{{- '\n</function>' }}
{%- endfor %}
{{- "\n</tools>" }}
{{- '\n\nIf you choose to call a function ONLY reply in the following format with NO suffix:\n\n<tool_call>\n<function=example_function_name>\n<parameter=example_parameter_1>\nvalue_1\n</parameter>\n<parameter=example_parameter_2>\nThis is the value for the second parameter\nthat can span\nmultiple lines\n</parameter>\n</function>\n</tool_call>\n\n<IMPORTANT>\nReminder:\n- Function calls MUST follow the specified format: an inner <function=...></function> block must be nested within <tool_call></tool_call> XML tags\n- Required parameters MUST be specified\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\n- If there is no function call available, answer the question like normal with your current knowledge and do not tell the user about function calls\n</IMPORTANT>' }}
{%- endif %}
{%- if system_message is defined %}
{{- '<|im_end|>\n' }}
{%- else %}
{%- if tools is iterable and tools | length > 0 %}
{{- '<|im_end|>\n' }}
{%- endif %}
{%- endif %}
{%- for message in loop_messages %}
{%- if message.role == "assistant" and message.tool_calls is defined and message.tool_calls is iterable and message.tool_calls | length > 0 %}
{{- '<|im_start|>' + message.role }}
{%- if message.content is defined and message.content is string and message.content | trim | length > 0 %}
{{- '\n' + message.content | trim + '\n' }}
{%- endif %}
{%- for tool_call in message.tool_calls %}
{%- if tool_call.function is defined %}
{%- set tool_call = tool_call.function %}
{%- endif %}
{{- '\n<tool_call>\n<function=' + tool_call.name + '>\n' }}
{%- if tool_call.arguments is defined %}
{%- for args_name, args_value in tool_call.arguments|items %}
{{- '<parameter=' + args_name + '>\n' }}
{%- set args_value = args_value if args_value is string else args_value | string %}
{{- args_value }}
{{- '\n</parameter>\n' }}
{%- endfor %}
{%- endif %}
{{- '</function>\n</tool_call>' }}
{%- endfor %}
{{- '<|im_end|>\n' }}
{%- elif message.role == "user" or message.role == "system" or message.role == "assistant" %}
{{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }}
{%- elif message.role == "tool" %}
{%- if loop.previtem and loop.previtem.role != "tool" %}
{{- '<|im_start|>user\n' }}
{%- endif %}
{{- '<tool_response>\n' }}
{{- message.content }}
{{- '\n</tool_response>\n' }}
{%- if not loop.last and loop.nextitem.role != "tool" %}
{{- '<|im_end|>\n' }}
{%- elif loop.last %}
{{- '<|im_end|>\n' }}
{%- endif %}
{%- else %}
{{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>\n' }}
{%- endif %}
{%- endfor %}
{%- if add_generation_prompt %}
{{- '<|im_start|>assistant\n' }}
{%- endif %}
{# Copyright 2025-present Unsloth. Apache 2.0 License. Unsloth Chat template fixes #}