Project Monitor agent: LLM-powered project status reports with wiki+Gitea integration
This commit is contained in:
@@ -61,8 +61,9 @@ body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;b
|
||||
.config-section h3{font-size:.95rem;margin-bottom:1rem}
|
||||
.config-grid{display:grid;grid-template-columns:1fr 1fr;gap:.75rem}
|
||||
.config-field label{display:block;font-size:.75rem;font-weight:500;color:var(--text-dim);text-transform:uppercase;letter-spacing:.04em;margin-bottom:.3rem}
|
||||
.config-field input,.config-field select{width:100%;padding:.5rem .65rem;background:var(--surface);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:.85rem;outline:none}
|
||||
.config-field input:focus,.config-field select:focus{border-color:var(--accent)}
|
||||
.config-field input,.config-field select,.config-field textarea{width:100%;padding:.5rem .65rem;background:var(--surface);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:.85rem;outline:none;font-family:inherit}
|
||||
.config-field input:focus,.config-field select:focus,.config-field textarea:focus{border-color:var(--accent)}
|
||||
.config-field textarea{min-height:80px;resize:vertical}
|
||||
.config-actions{display:flex;gap:.5rem;margin-top:1rem;align-items:center}
|
||||
.btn-save{padding:.5rem 1.25rem;background:var(--accent);color:#fff;border:none;border-radius:6px;font-size:.85rem;cursor:pointer}
|
||||
.btn-save:hover{background:var(--accent-hover)}
|
||||
@@ -187,9 +188,13 @@ function buildConfigForm(inst){
|
||||
if(f.type==='select'){
|
||||
html+=`<div class="config-field"><label>${f.label}</label><select id="cfg-${f.key.replace(/\./g,'-')}">${(f.options||[]).map(o=>`<option value="${o}" ${val===o?'selected':''}>${o}</option>`).join('')}</select></div>`;
|
||||
} else {
|
||||
const inputType=f.type==='number'?'number':f.type==='password'?'password':'text';
|
||||
const step=f.step?`step="${f.step}"`:'';
|
||||
html+=`<div class="config-field"><label>${f.label}</label><input type="${inputType}" ${step} id="cfg-${f.key.replace(/\./g,'-')}" value="${val}" placeholder="${f.placeholder||''}"></div>`;
|
||||
if(f.type==='textarea'){
|
||||
html+=`<div class="config-field" style="grid-column:1/-1"><label>${f.label}</label><textarea id="cfg-${f.key.replace(/\./g,'-')}" placeholder="${f.placeholder||''}">${val}</textarea></div>`;
|
||||
} else {
|
||||
const inputType=f.type==='number'?'number':f.type==='password'?'password':'text';
|
||||
const step=f.step?`step="${f.step}"`:'';
|
||||
html+=`<div class="config-field"><label>${f.label}</label><input type="${inputType}" ${step} id="cfg-${f.key.replace(/\./g,'-')}" value="${val}" placeholder="${f.placeholder||''}"></div>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,7 +281,7 @@ async function saveInstanceConfig(id){
|
||||
}
|
||||
const el=document.getElementById('cfg-'+f.key.replace(/\./g,'-'));
|
||||
if(!el)continue;
|
||||
let val=el.value;
|
||||
let val=el.tagName==='TEXTAREA'?el.value:el.value;
|
||||
if(f.type==='number')val=parseFloat(val)||0;
|
||||
setNestedVal(config,f.key,val);
|
||||
}
|
||||
@@ -340,7 +345,7 @@ async function showCatalog(){
|
||||
<div class="catalog-grid">
|
||||
${catalog.map(c=>`<div class="catalog-card">
|
||||
<div style="display:flex;justify-content:space-between;align-items:start;margin-bottom:.3rem"><h4>${c.name}</h4><span class="badge ${c.category}">${c.category}</span></div>
|
||||
<div class="cat-desc">${c.description}${c.is_sub_agent?' (sub-agent)':''}</div>
|
||||
<div class="cat-desc">${c.description}${c.is_sub_agent?' (sub-agent)':''}${c.requires_llm?' <span class="badge" style="background:rgba(108,92,231,.15);color:var(--accent)">requires LLM</span>':''}</div>
|
||||
<div class="cat-footer">
|
||||
<span style="font-size:.75rem;color:var(--text-dim)">${c.supports_schedule?'Schedulable':'Manual/sub-agent'}</span>
|
||||
${c.enabled?'<button class="btn-enable enabled">Enabled</button>':`<button class="btn-enable" onclick="enableAgent('${c.id}','${c.name}')">Enable</button>`}
|
||||
@@ -353,6 +358,7 @@ async function showCatalog(){
|
||||
async function enableAgent(catalogId,name){
|
||||
const res=await fetch(API+'/api/instances',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({catalog_id:catalogId,name:name})});
|
||||
if(res.ok){closeModal();refresh()}
|
||||
else{const err=await res.json();alert(err.detail||'Failed to enable agent')}
|
||||
}
|
||||
|
||||
// --- LLM Settings ---
|
||||
|
||||
Reference in New Issue
Block a user