You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
"create a skill for X" used to fire create_skill silently and stage the result
with no explanation. Now the chat surface briefs the user first and confirms
before building, mirroring the auto-escalation "Start as Project?" offer:
- "create a skill that tells me the moon phase" → CODEC replies "I'll build a
skill for: <desc>. I'll stage it in your Skills tab for review — nothing runs
until you approve. Build it?" + a [Build it]/[Cancel] chip.
- Vague ("make a skill") → asks what it should do.
- [Build it] → POST /api/chat/build_skill → runs the real review-gate flow →
conversational outcome ("Done — generated **name**, staged in Skills, approve
there to activate").
Chat-surface only (routes/chat.py intercept before the pre-LLM hijack + a new
endpoint; chip in codec_chat.html mirroring renderEscalateChip). MCP/voice
create_skill paths untouched. No skills/*.py change → no manifest regen.
119 chat/skill tests pass, ruff clean.
Co-authored-by: Mickael Farina <farina.mickael@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
'<div style="font-weight:600;margin-bottom:6px">Build this skill?</div>'+
608
+
'<div style="font-size:12px;color:var(--text-dim);margin-bottom:8px">'+escHtml(_lastSkillDesc)+' — I\'ll generate it and stage it in your Skills tab for review. Nothing runs until you approve it there.</div>'+
try{varj=JSON.parse(payload);if(j.token){raw+=j.token;varps=parseScaffold(raw);if(thinkingEnabled&&ps.think){vartp2=makeToT(div,'Reveal train of thought',true);totSet(tp2,ps.think)}if(ps.answer){if(!answerStarted){bubble.innerHTML='';answerStarted=true}bubble.innerHTML=formatMsg(ps.answer)}scrollBottom()}if(j.escalate_project){renderEscalateChip(j.escalate_project,text)}if(j.error){raw+='\n\nError: '+j.error}}catch(pe){}
1494
+
try{varj=JSON.parse(payload);if(j.token){raw+=j.token;varps=parseScaffold(raw);if(thinkingEnabled&&ps.think){vartp2=makeToT(div,'Reveal train of thought',true);totSet(tp2,ps.think)}if(ps.answer){if(!answerStarted){bubble.innerHTML='';answerStarted=true}bubble.innerHTML=formatMsg(ps.answer)}scrollBottom()}if(j.escalate_project){renderEscalateChip(j.escalate_project,text)}if(j.skill_confirm){renderSkillConfirmChip(j.skill_confirm,text)}if(j.error){raw+='\n\nError: '+j.error}}catch(pe){}
0 commit comments