principles-disciple 1.207.0 → 1.207.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.js +1 -1
- package/dist/openclaw.plugin.json +1 -2
- package/openclaw.plugin.json +1 -2
- package/package.json +1 -1
- package/scripts/sync-plugin.mjs +17 -8
- package/scripts/verify-build.mjs +19 -8
- package/dist/templates/langs/en/skills/ai-sprint-orchestration/runtime/.gitignore +0 -2
- package/templates/langs/en/skills/ai-sprint-orchestration/runtime/.gitignore +0 -2
package/dist/bundle.js
CHANGED
|
@@ -3162,7 +3162,7 @@ ${a.join(`
|
|
|
3162
3162
|
`)};try{let o=new I0({workspaceDir:t}),i=o.getWorkflow(n),a=o.getEvents(n);return o.dispose(),{text:n$n(n,i,a,t)}}catch(o){return{text:[`Workflow Debug: ${n}`,"============================","",`\u274C Error: ${String(o)}`,"",`Workspace: ${t}`].join(`
|
|
3163
3163
|
`)}}}import*as k0 from"fs";import*as jke from"path";import*as Zn from"fs";import*as na from"path";import{fileURLToPath as YFt}from"url";function HFt(e){return o$n(e)}function JFt(e,t){ZP(e,r=>{r[t.principleId]=t})}function o$n(e){return lo(e).trainingStore}import*as O2 from"fs";import*as zY from"path";var i$n="empathy_keywords.json";function XFt(e,t){let r=zY.join(e,i$n),n=zY.dirname(r);O2.existsSync(n)||O2.mkdirSync(n,{recursive:!0}),t.lastUpdated=new Date().toISOString(),Cr(r,JSON.stringify(t,null,2))}var a$n={name:"Principles Disciple Agent",version:"1.0.0"},s$n="pd-core-guidance-v2",QFt=new Set(["AGENTS.md","TOOLS.md"]);function c$n(){return`pd-core-guidance-version: ${s$n}`}function u$n(e,t){return!QFt.has(e)||t.includes(c$n())?!1:!!(t.includes("pd_spawn_agent")||!t.includes("subagents")||!t.includes("sessions_spawn"))}function ZFt(e,t,r="en"){try{let n=YFt(import.meta.url),o=na.dirname(n),i=na.resolve(o,"..","..","templates","workspace");Zn.existsSync(i)&&(e.logger.info(`[PD] Syncing workspace templates: ${t}...`),Dke(i,t,e));let a=na.resolve(o,"..","..","templates","langs",r,"core");if(Zn.existsSync(a)||(a=na.resolve(o,"..","..","templates","langs","zh","core")),Zn.existsSync(a)){e.logger.info(`[PD] Flattening ${r} core templates to workspace root...`);let d=Zn.readdirSync(a);for(let p of d){let m=na.join(a,p),f=na.join(t,p);if(!Zn.existsSync(f))Zn.copyFileSync(m,f),e.logger.info(`[PD] Initialized core file: ${p}`);else if(QFt.has(p)){let g=Zn.readFileSync(f,"utf8");u$n(p,g)&&e.logger.warn(`[PD] Outdated core guidance detected in ${p}. Review the latest template guidance for peer sessions, subagents, and sessions_spawn routing.`)}}}let s=na.resolve(o,"..","..","templates","langs",r,"pain"),c=na.join(t,qn.PAIN_SAMPLES);Zn.existsSync(s)&&(Zn.existsSync(c)||Zn.mkdirSync(c,{recursive:!0}),Dke(s,c,e));let u=na.join(t,qn.IDENTITY),l=na.join(u,"PROFILE.json");Zn.existsSync(l)||(Zn.existsSync(u)||Zn.mkdirSync(u,{recursive:!0}),Cr(l,JSON.stringify(a$n,null,2)),e.logger.info("[PD] Initialized PROFILE.json with identity metadata (contextInjection migrated to .pd/config.yaml)"))}catch(n){e.logger.error(`[PD] Failed to initialize workspace templates: ${String(n)}`)}}function Dke(e,t,r){let n=Zn.readdirSync(e);for(let o of n){let i=na.join(e,o),a=o==="okr"?na.join("memory","okr"):o,s=na.join(t,a);if(Zn.statSync(i).isDirectory())Zn.existsSync(s)||Zn.mkdirSync(s,{recursive:!0}),Dke(i,s,r);else if(!Zn.existsSync(s)){let u=na.dirname(s);Zn.existsSync(u)||Zn.mkdirSync(u,{recursive:!0}),Zn.copyFileSync(i,s),r.logger.info(`[PD] Copied: ${a}`)}}}var QO=fm.map(e=>({id:e.id,name:e.name,description:e.statement}));function ezt(e,t){try{let r=HFt(e);if(Object.keys(r).filter(a=>a!=="_tree").length>0)return!1;t.info(`[PD] Initializing core thinking models (${QO.length} principles) into training store`);for(let a of QO){let s={principleId:a.id,evaluability:"deterministic",applicableOpportunityCount:0,observedViolationCount:0,complianceRate:0,violationTrend:0,generatedSampleCount:0,approvedSampleCount:0,includedTrainRunIds:[],deployedCheckpointIds:[],internalizationStatus:"needs_training"};JFt(e,s);let c=new Date().toISOString(),u={id:a.id,version:1,text:a.description,coreAxiomId:a.id,triggerPattern:"",action:"",status:"active",priority:"P1",scope:"general",evaluability:"deterministic",valueScore:0,adherenceRate:0,painPreventedCount:0,derivedFromPainIds:[],ruleIds:[],conflictsWithPrincipleIds:[],createdAt:c,updatedAt:c,suggestedRules:[]};nb(e,u)}let o=QO[0]?.id??"T-01",i=QO[QO.length-1]?.id??"T-10";return t.info(`[PD] Initialized ${QO.length} core thinking models: ${o} through ${i}`),!0}catch(r){return t.error(`[PD] Failed to initialize core principles: ${String(r)}`),!1}}function tzt(e,t,r="en"){try{let n=YFt(import.meta.url),o=na.dirname(n);Zn.existsSync(t)||Zn.mkdirSync(t,{recursive:!0});let i=["pain_settings.json"];for(let u of i){let l=na.resolve(o,"..","..","templates",u),d=na.join(t,u);!Zn.existsSync(d)&&Zn.existsSync(l)&&(Zn.copyFileSync(l,d),e.logger.info(`[PD] Initialized ${u} in stateDir: ${d}`))}let a=na.resolve(o,"..","..","templates","langs",r,"pain_dictionary.json");Zn.existsSync(a)||(a=na.resolve(o,"..","..","templates","langs","en","pain_dictionary.json"));let s=na.join(t,"pain_dictionary.json");!Zn.existsSync(s)&&Zn.existsSync(a)&&(Zn.copyFileSync(a,s),e.logger.info(`[PD] Initialized pain dictionary in stateDir: ${s} (Lang: ${r})`));let c=na.join(t,"empathy_keywords.json");if(!Zn.existsSync(c)){let l=vO(r==="zh"||r==="en"?r:"en");XFt(t,l),e.logger.info(`[PD] Initialized empathy keyword store in stateDir: ${c}`)}}catch(n){e.logger.error(`[PD] Failed to initialize state templates: ${String(n)}`)}}import*as izt from"fs";var rzt="pain_diagnosis",nzt="medium";function ozt(e){return{id:e.id,taskKind:e.taskKind||rzt,priority:e.priority||nzt,source:e.source,traceId:e.traceId,task:e.task,score:e.score,reason:e.reason,timestamp:e.timestamp,enqueued_at:e.enqueued_at,started_at:e.started_at,completed_at:e.completed_at,assigned_session_key:e.assigned_session_key,trigger_text_preview:e.trigger_text_preview,status:e.status||"pending",resolution:e.resolution,session_id:e.session_id,agent_id:e.agent_id,retryCount:e.retryCount||0,maxRetries:e.maxRetries||3,lastError:e.lastError,resultRef:e.resultRef}}function $ke(e){return e&&typeof e=="object"&&!("taskKind"in e)}function WY(e){return e.map(t=>$ke(t)?ozt(t):t)}var Uke=["pain_diagnosis","sleep_reflection","model_eval","keyword_optimization"];function qY(e){let t=[];if(e===null||typeof e!="object"||Array.isArray(e))return["item is not an object"];let r=e;return(!r.id||typeof r.id!="string")&&t.push("missing/invalid id"),(!r.source||typeof r.source!="string")&&t.push("missing/invalid source"),typeof r.score!="number"&&t.push("missing/invalid score"),(!r.status||typeof r.status!="string")&&t.push("missing/invalid status"),!r.taskKind||typeof r.taskKind!="string"?t.push("missing/invalid taskKind"):Uke.includes(r.taskKind)||t.push(`invalid taskKind value '${r.taskKind}' (expected one of: ${Uke.join(", ")})`),typeof r.retryCount!="number"&&t.push("missing/invalid retryCount"),typeof r.maxRetries!="number"&&t.push("missing/invalid maxRetries"),t}var Fke=".lock",azt=50,szt=50,czt=3e4;async function zke(e,t,r,n=Fke){try{return await uzt(e,t,n)}catch(o){throw new D7(e,r,{cause:o})}}async function uzt(e,t,r=Fke){try{let n=await rIe(e,{lockSuffix:r,maxRetries:azt,baseRetryDelayMs:szt,lockStaleMs:czt});return()=>O7(n)}catch(n){let o=t?.warn;throw o?.(`[PD:EvolutionWorker] Failed to acquire lock for ${e}: ${String(n)}`),n}}function Wke(e){let t=[];try{t=JSON.parse(izt.readFileSync(e,"utf8"))}catch(n){n.code==="ENOENT"?t=[]:(console.warn(`[queue-io] Failed to load evolution queue (recovering with empty): ${String(n)}`),t=[])}return WY(t).filter(n=>{let o=qY(n);return o.length>0?(console.warn(`[queue-io] Dropping malformed queue item: ${o.join(", ")} | id=${n?.id??"N/A"}`),!1):!0})}function GY(e,t){Cr(e,JSON.stringify(t,null,2))}function lzt(e){let t=String(e);return t.includes("Plugin runtime subagent methods are only available during a gateway request")||t.includes("cannot start workflow for boot session")||t.includes("subagent runtime unavailable")||t.includes("subagent is not available")||t.includes("NocturnalWorkflowManager")&&t.includes("subagent runtime unavailable")||t.includes("gateway is not running")||t.includes("process isolation")||t.includes("subagent")&&t.toLowerCase().includes("connection")&&(t.includes("refused")||t.includes("reset")||t.includes("econnrefused"))}async function pzt(e,t,r,n){let o=n?` (${n})`:"";if(typeof e.patchSessionEntry!="function"||typeof e.getSessionEntry!="function"){r?.warn?.(`[PD:Watchdog] Cannot clean up session ${t}${o}: host does not expose row-scoped session helpers. The stale entry will be swept by OpenClaw's session GC.`);return}if(!e.getSessionEntry({sessionKey:t})){r?.debug?.(`[PD:Watchdog] Session ${t} already absent${o}; nothing to clean.`);return}await e.patchSessionEntry({sessionKey:t,replaceEntry:!0,preserveActivity:!1,update:()=>null}),r?.info?.(`[PD:Watchdog] Cleaned up stale session via row-scoped API${o}: ${t}`)}async function dzt(e,t,r){let n=[],o=Date.now(),i=t?.runtime?.subagent,a=t?.runtime?.agent?.session;try{let s=new I0({workspaceDir:e.workspaceDir});try{let c=s.listWorkflows(),u=3e5*2,l=c.filter(f=>f.state==="active"&&o-f.created_at>u);if(l.length>0)for(let f of l){let g=Math.round((o-f.created_at)/6e4);n.push(`stale_active: ${f.workflow_id} (${f.workflow_type}, ${g}min old)`);let y=s.getEvents(f.workflow_id),x=y[y.length-1],b=x?x.reason:"unknown";if(lzt(b)){r?.debug?.(`[PD:Watchdog] Skipping stale active workflow ${f.workflow_id}: expected subagent error (${b})`);continue}if(s.updateWorkflowState(f.workflow_id,"terminal_error"),s.recordEvent(f.workflow_id,"watchdog_timeout","active","terminal_error",`Stale active > ${u/6e4}s`,{ageMs:o-f.created_at}),f.child_session_key)try{i?(await i.deleteSession({sessionKey:f.child_session_key,deleteTranscript:!0}),r?.info?.(`[PD:Watchdog] Cleaned up stale session: ${f.child_session_key}`)):a&&await pzt(a,f.child_session_key,r)}catch(w){let L=String(w);if(L.includes("gateway request")&&a)try{await pzt(a,f.child_session_key,r,"after gateway error")}catch(W){r?.warn?.(`[PD:Watchdog] Fallback cleanup also failed for ${f.child_session_key}: ${String(W)}`)}else r?.warn?.(`[PD:Watchdog] Failed to cleanup session ${f.child_session_key}: ${L}`)}}let d=c.filter(f=>(f.state==="terminal_error"||f.state==="expired")&&f.cleanup_state==="pending");d.length>0&&n.push(`uncleared_terminal: ${d.length} workflows (will be swept next cycle)`);let p={};for(let f of c)p[f.state]=(p[f.state]||0)+1;let m=Object.entries(p).map(([f,g])=>`${f}=${g}`).join(", ");n.length===0?r?.debug?.(`[PD:Watchdog] OK \u2014 ${c.length} workflows (${m})`):r?.info?.(`[PD:Watchdog] ${n.length} anomalies \u2014 ${c.length} workflows (${m})`)}finally{s.dispose()}}catch(s){return r?.warn?.(`[PD:Watchdog] Failed to scan workflows: ${String(s)}`),{anomalies:-1,details:[],scanError:String(s)}}return{anomalies:n.length,details:n}}var Xh=null;var l$n=1440*60*1e3;function p$n(e,t){let r=Date.now()-l$n,n={},o=e.filter(s=>{if(s.status!=="failed")return!1;let c=new Date(s.timestamp||s.enqueued_at||0).getTime();if(!Number.isFinite(c)||c>r)return!1;let u=s.lastError||s.resolution||"unknown";return n[u]=(n[u]||0)+1,!0});if(o.length===0)return{purged:0,remaining:e.length,byReason:n};let i=new Set(o.map(s=>s.id));for(let s=e.length-1;s>=0;s--){let c=e[s];c&&i.has(c.id)&&e.splice(s,1)}let a=Object.entries(n).map(([s,c])=>`${c}x ${s}`).join("; ");return t?.info?.(`[PD:EvolutionWorker] Purged ${o.length} stale failed tasks (>24h): ${a}`),{purged:o.length,remaining:e.length,byReason:n}}async function d$n(e,t,r){if(!e.stateDir)return;let n;try{n=lo(e.stateDir)}catch(c){t?.warn?.(`[PD:EvolutionWorker] CompilationBackfill: failed to load ledger: ${String(c)}`);return}let o=jke.join(e.stateDir,"COMPILATION_BACKFILL_DONE");if(!k0.existsSync(o)){let c=0;for(let[u,l]of Object.entries(n.tree.principles)){if(l.compilationRetryCount!==void 0||l.evaluability==="manual_only")continue;if(Object.values(n.tree.implementations).some(p=>p.lifecycleState==="active"&&n.tree.rules[p.ruleId]?.principleId===u))try{ec(e.stateDir,u,{compilationRetryCount:void 0})}catch(p){It.log(e.workspaceDir,"BACKFILL_UPDATE_FAILED",`Failed to mark principle ${u} as done: ${String(p)}`);continue}else try{ec(e.stateDir,u,{compilationRetryCount:0}),c++}catch(p){It.log(e.workspaceDir,"BACKFILL_UPDATE_FAILED",`Failed to queue principle ${u}: ${String(p)}`);continue}}c>0&&It.log(e.workspaceDir,"COMPILE_BACKFILL_QUEUED",`Queued ${c} old principles for compilation`);try{Cr(o,new Date().toISOString())}catch(u){It.log(e.workspaceDir,"BACKFILL_MARKER_WRITE_FAILED",`Failed to write backfill marker: ${String(u)}`)}}let a=ws.get(e.workspaceDir),s=new tE(e.stateDir,a);n=lo(e.stateDir);for(let[c,u]of Object.entries(n.tree.principles)){let l=u.compilationRetryCount;if(l!==void 0&&!(l>=5))try{let d=s.compileOne(c);if(d.success)Gke({stateDir:e.stateDir,workspaceDir:e.workspaceDir,principleId:c,count:void 0,workerStatus:r}),It.log(e.workspaceDir,"COMPILE_SUCCESS",`Principle ${c} compiled successfully (attempt ${l+1})`);else{let p=l+1;p>=5?(mzt({stateDir:e.stateDir,workspaceDir:e.workspaceDir,principleId:c,updates:{evaluability:"manual_only",compilationRetryCount:void 0},workerStatus:r}),It.log(e.workspaceDir,"COMPILE_EXHAUSTED",`Principle ${c} compilation exhausted after 5 attempts: ${d.reason??"unknown"}`)):(Gke({stateDir:e.stateDir,workspaceDir:e.workspaceDir,principleId:c,count:p,workerStatus:r}),It.log(e.workspaceDir,"COMPILE_FAILED",`Principle ${c} compile failed: ${d.reason??"unknown"} (attempt ${p}/5)`))}}catch(d){let p=l+1;p>=5?(mzt({stateDir:e.stateDir,workspaceDir:e.workspaceDir,principleId:c,updates:{evaluability:"manual_only",compilationRetryCount:void 0},workerStatus:r}),It.log(e.workspaceDir,"COMPILE_EXHAUSTED",`Principle ${c} compilation exhausted after 5 attempts: threw ${String(d)}`)):(Gke({stateDir:e.stateDir,workspaceDir:e.workspaceDir,principleId:c,count:p,workerStatus:r}),It.log(e.workspaceDir,"COMPILE_FAILED",`Principle ${c} compile threw: ${String(d)} (attempt ${p}/5)`))}}}function Gke(e){let{stateDir:t,workspaceDir:r,principleId:n,count:o,workerStatus:i}=e;try{ec(t,n,{compilationRetryCount:o})}catch(a){let s=a instanceof Error?a.message:String(a);It.log(r,"WORKER_RETRY_UPDATE_FAILED",`Failed to update retry count for ${n}: ${s}`),i&&(i.errors.push({at:new Date().toISOString(),kind:"retry_count_update_failed",principleId:n,error:s}),jY(t,i))}}function mzt(e){let{stateDir:t,workspaceDir:r,principleId:n,updates:o,workerStatus:i}=e;try{ec(t,n,o)}catch(a){let s=a instanceof Error?a.message:String(a);It.log(r,"WORKER_PRINCIPLE_UPDATE_FAILED",`Failed to update principle ${n}: ${s}`),i&&(i.errors.push({at:new Date().toISOString(),kind:"principle_update_failed",principleId:n,error:s}),jY(t,i))}}async function m$n(e,t,r,n){let o=e.resolve("EVOLUTION_QUEUE");if(!k0.existsSync(o)){t?.debug?.("[PD:EvolutionWorker] No evolution queue file \u2014 nothing to process");return}let i=await zke(o,t,"processEvolutionQueue"),a=!1;try{let s=[];try{s=JSON.parse(k0.readFileSync(o,"utf8"))}catch(p){let m=`${o}.corrupted.${Date.now()}`;try{k0.renameSync(o,m),t&&t.error(`[PD:EvolutionWorker] Evolution queue corrupted and backed up to ${m}. All pending tasks have been preserved in the backup file. Parse error: ${String(p)}`),It.log(e.workspaceDir,"QUEUE_CORRUPTED",`Queue file backed up to ${m}. Error: ${String(p)}`)}catch(f){t&&t.error(`[PD:EvolutionWorker] Failed to backup corrupted queue: ${String(f)}`)}return}let c=WY(s),u=c.length;c=c.filter(p=>p.taskKind!=="pain_diagnosis"),c.length<u&&t?.info?.(`[PD:EvolutionWorker] Dropped ${u-c.length} legacy pain_diagnosis queue item(s); use PainSignalBridge/pd pain record`);let l=c.length;c=c.filter(p=>{let m=qY(p);return m.length>0?(t?.warn?.(`[PD:EvolutionWorker] Skipping malformed queue item: ${m.join(", ")} | ${JSON.stringify(p).slice(0,200)}`),It.log(e.workspaceDir,"QUEUE_ITEM_MALFORMED",`Skipped: ${m.join(", ")} | id=${p.id||"N/A"}`),!1):!0}),c.length<l&&t?.info?.(`[PD:EvolutionWorker] Filtered ${l-c.length} malformed queue item(s)`),(s.some($ke)||c.length<u||c.length<l)&&GY(o,c)}catch(s){t&&t.warn(`[PD:EvolutionWorker] Error processing evolution queue: ${String(s)}`)}finally{a||i()}}function jY(e,t){try{let r=jke.join(e,"worker-status.json");Cr(r,JSON.stringify(t,null,2))}catch(r){}}async function fzt(e,t,r,n){let o={total:0,pending:0,in_progress:0,completed_this_cycle:0,failed_this_cycle:0},i=[];try{let a=e.resolve("EVOLUTION_QUEUE");if(!k0.existsSync(a))return{queue:o,errors:i};let s=Wke(a),c=p$n(s,t);c.purged>0&&GY(a,s),o.total=s.length,o.pending=s.filter(u=>u.status==="pending").length,o.in_progress=s.filter(u=>u.status==="in_progress").length,o.failed_this_cycle=s.filter(u=>u.status==="failed").length,o.completed_this_cycle=s.filter(u=>u.status==="completed").length,t.info(`[PD:EvolutionWorker] Queue snapshot: total=${o.total} pending=${o.pending} in_progress=${o.in_progress} completed=${o.completed_this_cycle} failed=${o.failed_this_cycle} purged=${c.purged}`),await m$n(e,t,r,n)}catch(a){let s=`processEvolutionQueue failed: ${String(a)}`;i.push(s),t.error(`[PD:EvolutionWorker] ${s}`)}return{queue:o,errors:i}}var BY={id:"principles-evolution-worker",api:null,_startedWorkspaces:new Set,start(e){let t=e?.workspaceDir,r=e?.logger||console,{api:n}=this;if(!t){r&&r.warn("[PD:EvolutionWorker] workspaceDir not found in service config. Evolution cycle disabled.");return}let o=BY._startedWorkspaces;if(o.has(t)){e?.logger?.info?.(`[PD:EvolutionWorker] Already started for ${t}, skipping`);return}o.add(t);let i=Qt.fromHookContext({workspaceDir:t,...e.config});r&&r.info(`[PD:EvolutionWorker] Starting with workspaceDir=${i.workspaceDir}, stateDir=${i.stateDir}`),$Ut(i.stateDir);let{eventLog:a}=i,{config:s}=i,c=s.get("language")||"en";tzt({logger:r},i.stateDir,c),ezt(i.stateDir,r);let u=5e3,l=s.get("intervals.worker_poll_ms")||900*1e3,d=0;async function p(){let m=Date.now();d++;let f=n?.runtime?.subagent;r?.info?.(`[PD:DEBUG:SubagentCheck:Heartbeat] api_exists=${!!n}, subagent_exists=${!!f}, subagent.run_exists=${!!f?.run}, heartbeatCounter=${d}`),f?.run&&r?.info?.("[PD:DEBUG:SubagentCheck:Heartbeat] run entrypoint is callable");let g={timestamp:new Date().toISOString(),cycle_start_ms:m,duration_ms:0,pain_flag:{exists:!1,score:null,source:null,enqueued:!1,skipped_reason:null},queue:{total:0,pending:0,in_progress:0,completed_this_cycle:0,failed_this_cycle:0},errors:[]};try{d$n(i,r,g).catch(x=>{r?.error?.(`[PD:EvolutionWorker] CompilationBackfill threw: ${String(x)}`)}),r?.info?.(`[PD:EvolutionWorker] HEARTBEAT cycle=${new Date().toISOString()}`);let y=await fzt(i,r,a,n??void 0);g.queue=y.queue,y.errors&&g.errors.push(...y.errors);try{let x=n?.runtime?.subagent,b=new I0({workspaceDir:i.workspaceDir});try{let w=b.getExpiredWorkflows(3e5);for(let L of w){if(x&&L.child_session_key)try{await x.deleteSession({sessionKey:L.child_session_key,deleteTranscript:!0}),b.updateCleanupState(L.workflow_id,"completed"),r?.info?.(`[PD:EvolutionWorker] Cleaned up session ${L.child_session_key} for expired workflow ${L.workflow_id}`)}catch(W){let J=`Session cleanup failed for workflow ${L.workflow_id} (child_session=${L.child_session_key}): ${String(W)}`;b.updateCleanupState(L.workflow_id,"failed"),g.errors.push(J),r?.warn?.(`[PD:EvolutionWorker] ${J}`)}else if(L.child_session_key){let W=`Session cleanup unavailable for workflow ${L.workflow_id} (child_session=${L.child_session_key}): subagentRuntime not in gateway context`;b.updateCleanupState(L.workflow_id,"failed"),g.errors.push(W),r?.warn?.(`[PD:EvolutionWorker] ${W}`)}b.updateWorkflowState(L.workflow_id,"expired"),b.recordEvent(L.workflow_id,"swept",L.state,"expired","TTL expired",{}),r?.warn?.(`[PD:EvolutionWorker] Marked workflow ${L.workflow_id} as expired`)}}finally{b.dispose()}}catch(x){let b=`Failed to sweep expired workflows: ${String(x)}`;g.errors.push(b),r?.warn?.(`[PD:EvolutionWorker] ${b}`)}try{let x=await dzt(i,n,r);x.anomalies>0&&(r?.warn?.(`[PD:Watchdog] ${x.anomalies} anomalies: ${x.details.join("; ")}`),g.errors.push(...x.details))}catch(x){r?.warn?.(`[PD:Watchdog] Watchdog failed: ${String(x)}`)}i.dictionary.flush(),gIe(),g.duration_ms=Date.now()-m,jY(i.stateDir,g)}catch(y){let x=`Error in worker interval: ${String(y)}`;r&&r.error(`[PD:EvolutionWorker] ${x}`),jY(i.stateDir,{timestamp:new Date().toISOString(),cycle_start_ms:m,duration_ms:Date.now()-m,pain_flag:{exists:!1,score:null,source:null,enqueued:!1,skipped_reason:null},queue:{total:0,pending:0,in_progress:0,completed_this_cycle:0,failed_this_cycle:0},errors:[x]})}Xh=setTimeout(p,l),Xh.unref()}Xh=setTimeout(()=>{(async()=>{let m=await fzt(i,r,a,n??void 0);m.errors.length>0&&m.errors.forEach(f=>r?.error?.(`[PD:EvolutionWorker] Startup cycle error: ${f}`)),Xh=setTimeout(p,l),Xh.unref()})().catch(m=>{r&&r.error(`[PD:EvolutionWorker] Startup worker cycle failed: ${String(m)}`),Xh=setTimeout(p,l),Xh.unref()})},u),Xh.unref()},stop(e){e?.logger&&e.logger.info("[PD:EvolutionWorker] Stopping background service..."),Xh&&clearTimeout(Xh),gIe()}};import*as eP from"fs";import*as Vke from"path";var _zt="correction_keywords.json",hzt=.1,f$n=.9,bE=null;function h$n(){let e=new Date().toISOString();return{keywords:XX.map(r=>({...r,source:"seed",addedAt:e})),version:1,lastOptimizedAt:e}}function g$n(e){if(bE)return bE;let t=Vke.join(e,_zt);if(eP.existsSync(t))try{let n=eP.readFileSync(t,"utf-8");return bE=JSON.parse(n),bE}catch{}let r=h$n();return yzt(e,r),bE=r,bE}function yzt(e,t){let r=Vke.join(e,_zt);eP.mkdirSync(e,{recursive:!0}),Cr(r,JSON.stringify(t,null,2)),bE=null}var Bke=null,gzt=null;var ZO=class e{store;stateDir;constructor(t){this.stateDir=t,this.store=g$n(t)}match(t){let r=t.trim().toLowerCase().replace(/[.,!?;:,。!?;:]/g,""),n=[],o=0;for(let l of this.store.keywords)if(r.includes(l.term.toLowerCase())){let d=l.truePositiveCount??0,p=l.falsePositiveCount??0,m=d+p>0?d/(d+p):1,f=l.weight*m;o+=f,n.push(l.term)}let i=Math.min(1,o),a=n.length>0,s=Math.min(1,n.length/3),c=Math.min(1,i/.8),u=Math.max(s,c);return{matched:a,matchedTerms:n.slice(0,5),score:i,confidence:u}}recordHits(t){for(let r of t){let n=this.store.keywords.findIndex(i=>i.term.toLowerCase()===r.toLowerCase());if(n<0)continue;let o=this.store.keywords[n];o&&(this.store.keywords[n]={...o,hitCount:(o.hitCount??0)+1,lastHitAt:new Date().toISOString()})}}recordTruePositive(t){let r=this.store.keywords.find(o=>o.term.toLowerCase()===t.toLowerCase());if(!r)return;r.truePositiveCount=(r.truePositiveCount??0)+1;let n=this.store.keywords.findIndex(o=>o.term.toLowerCase()===t.toLowerCase());n>=0&&(this.store.keywords[n]={...r}),this.flush()}recordFalsePositive(t){let r=this.store.keywords.find(o=>o.term.toLowerCase()===t.toLowerCase());if(!r)return;r.falsePositiveCount=(r.falsePositiveCount??0)+1,r.weight=Math.max(hzt,r.weight*.8),r.lastHitAt=new Date().toISOString();let n=this.store.keywords.findIndex(o=>o.term.toLowerCase()===t.toLowerCase());n>=0&&(this.store.keywords[n]={...r}),this.flush()}add(t){if(this.store.keywords.length>=JX)throw new Error("Correction keyword store limit reached (200 terms)");let r={...t,addedAt:new Date().toISOString()};this.store.keywords.push(r),this.flush()}updateWeight(t,r){let n=this.store.keywords.find(i=>i.term.toLowerCase()===t.toLowerCase());if(!n)throw new Error(`Keyword not found: ${t}`);n.weight=Math.max(hzt,Math.min(f$n,r));let o=this.store.keywords.findIndex(i=>i.term.toLowerCase()===t.toLowerCase());o>=0&&(this.store.keywords[o]={...n}),this.flush()}remove(t){let r=this.store.keywords.findIndex(n=>n.term.toLowerCase()===t.toLowerCase());if(r<0)throw new Error(`Keyword not found: ${t}`);this.store.keywords.splice(r,1),this.flush()}getStore(){return this.store}getLastOptimizedAt(){return this.store.lastOptimizedAt}flush(){yzt(this.stateDir,this.store)}static get(t){return(!Bke||gzt!==t)&&(Bke=new e(t),gzt=t),Bke}};var VY=class e{stateDir;workspaceDir;logger;constructor(t,r,n){this.stateDir=t,this.workspaceDir=r,this.logger=n}applyResult(t){let r=ZO.get(this.stateDir),n=t.updates??{};if(!t.updated||Object.keys(n).length===0){this.logger?.info?.("[KeywordOptimizationService] No updates to apply");return}for(let[o,i]of Object.entries(n))try{switch(i.action){case"add":{let a=o.trim().toLowerCase(),s=r.getStore().keywords.find(u=>u.term.toLowerCase()===a);if(s){this.logger?.info?.(`[KeywordOptimizationService] ADD skipped: "${o}" already exists as "${s.term}"`);break}let c=i.weight!==void 0?Math.max(.1,Math.min(.9,i.weight)):.5;r.add({term:a,weight:c,source:"llm"}),this.logger?.info?.(`[KeywordOptimizationService] ADD term="${a}" weight=${c}`);break}case"update":{i.weight!==void 0&&(r.updateWeight(o,i.weight),this.logger?.info?.(`[KeywordOptimizationService] UPDATE term="${o}" weight=${i.weight}`));break}case"remove":{r.remove(o),this.logger?.info?.(`[KeywordOptimizationService] REMOVE term="${o}"`);break}}}catch(a){this.logger?.warn?.(`[KeywordOptimizationService] ${i.action.toUpperCase()} failed for term="${o}": ${String(a)}`)}if(t.fpAnalysisStatus==="completed"&&t.fpTerms&&t.fpTerms.length>0){let i=[...new Set(t.fpTerms.map(a=>a.trim().toLowerCase()).filter(a=>a.length>0))].slice(0,20);for(let a of i)try{r.recordFalsePositive(a),this.logger?.info?.(`[KeywordOptimizationService] FP recorded for term="${a}" (weight x0.8)`)}catch(s){this.logger?.warn?.(`[KeywordOptimizationService] recordFalsePositive failed for term="${a}": ${String(s)}`)}}}async buildTrajectoryHistory(t){let r=[],n=ws.get(this.workspaceDir);for(let o of t.slice(0,10)){try{let i=n.listUserTurnsForSession(o);for(let a of i)if(a.correctionDetected&&r.push({sessionId:o,timestamp:a.createdAt??new Date().toISOString(),term:a.correctionCue??"unknown",userMessage:""}),r.length>=50)break}catch(i){this.logger?.warn?.(`[KeywordOptimizationService] Failed to read trajectory for session ${o}: ${String(i)}`)}if(r.length>=50)break}return r}static _instances=new Map;static get(t,r,n){let o=`${t}::${r}`;return e._instances.has(o)||e._instances.set(o,new e(t,r,n)),e._instances.get(o)}static reset(){e._instances.clear()}};var ey=null,P2=!1,Kke=new Set,_$n=900*1e3,y$n=1e4,x$n=20,S$n=5;function b$n(e,t){try{let r=r2(e.workspaceDir,"correction_observer","correctionObserver",t);if(!r.enabled)return r.readiness==="config_malformed"?t?.warn?.(`[PD:CorrectionObserver] Config malformed: ${r.reason}. ${r.nextAction}`):t?.debug?.(`[PD:CorrectionObserver] ${r.reason}`),null;if(r.readiness==="needs_setup")return t?.info?.(`[PD:CorrectionObserver] ${r.reason}. ${r.nextAction}`),null;if(r.runtimeProfileType==="pi-ai"){let n=new cp({provider:r.provider??"anthropic",model:r.model??"anthropic/claude-3-5-sonnet",apiKeyEnv:r.apiKeyEnv??"ANTHROPIC_API_KEY",timeoutMs:r.timeoutMs??void 0,baseUrl:r.baseUrl??void 0,workspace:e.workspaceDir});return new wN({runtimeAdapter:n},{timeoutMs:r.timeoutMs??void 0})}return t?.info?.("[PD:CorrectionObserver] OpenClaw runtime profile not yet supported for correction observer. Skipping."),null}catch(r){return t?.warn?.(`[PD:CorrectionObserver] Failed to resolve CorrectionObserver: ${String(r)}`),null}}async function v$n(e,t){try{let r=b$n(e,t);if(!r){t?.debug?.("[PD:CorrectionObserver] Observer not resolved. Skipping cycle.");return}t?.info?.("[PD:CorrectionObserver] Observer resolved. Initiating periodic optimization...");let n=ws.get(e.workspaceDir),i=n.listRecentSessions({limit:x$n}).map(g=>g.sessionId);if(i.length===0){t?.info?.("[PD:CorrectionObserver] No recent sessions found. Skipping correction optimization.");return}let a=[];for(let g of i.slice(0,S$n))try{let y=n.listUserTurnsForSession(g);for(let x of y)x.rawExcerpt&&a.push(x.rawExcerpt)}catch(y){t?.warn?.(`[PD:CorrectionObserver] Failed to load user turns for session ${g}: ${String(y)}`)}let c=ZO.get(e.stateDir).getStore().keywords,u={totalKeywords:c.length,terms:c.map(g=>({term:g.term,weight:g.weight,hitCount:g.hitCount??0,truePositiveCount:g.truePositiveCount??0,falsePositiveCount:g.falsePositiveCount??0}))},l=VY.get(e.stateDir,e.workspaceDir,t),d=await l.buildTrajectoryHistory(i),p={parentSessionId:"correction-observer-service",workspaceDir:e.workspaceDir,keywordStoreSummary:u,recentMessages:a,trajectoryHistory:d},m=new O$;m.register({agentId:"correction-observer",mode:"realtime",runner:r}),t?.info?.(`[PD:CorrectionObserver] Dispatching with ${d.length} trajectory events, ${a.length} recent messages.`);let f=await m.dispatch("correction-observer",p);t?.info?.(`[PD:CorrectionObserver] Completed: updated=${f.updated}, summary="${f.summary}"`),f.updated&&l.applyResult(f)}catch(r){let n=`Correction observer cycle failed: ${String(r)}`;t?.warn?.(`[PD:CorrectionObserver] ${n}`),It.log(e.workspaceDir,"CORRECTION_OBSERVER_CYCLE_FAILED",n)}}var Hke={id:"principles-correction-observer",start(e){let t=e?.workspaceDir,r=e?.logger||console;if(!t){r&&r.warn("[PD:CorrectionObserver] workspaceDir not found in service config. Correction observer disabled.");return}if(Kke.has(t)){r&&r.info(`[PD:CorrectionObserver] Already started for workspace: ${t}. Skipping duplicate start.`);return}let n=r2(t,"correction_observer","correctionObserver",r);if(!n.enabled){r?.info?.(`[PD:CorrectionObserver] ${n.reason}. ${n.nextAction}`);return}if(n.readiness==="needs_setup"){r?.info?.(`[PD:CorrectionObserver] ${n.reason}. ${n.nextAction}`);return}Kke.add(t),P2=!1;let o=Qt.fromHookContext({workspaceDir:t,...e.config});r&&r.info(`[PD:CorrectionObserver] Starting with workspaceDir=${o.workspaceDir}, stateDir=${o.stateDir}`);let i=_$n;async function a(){P2||(await v$n(o,r),!P2&&(ey=setTimeout(a,i),ey.unref()))}ey=setTimeout(()=>{a().catch(s=>{r&&r.error(`[PD:CorrectionObserver] Startup cycle failed: ${String(s)}`),!P2&&(ey=setTimeout(a,i),ey.unref())})},y$n),ey.unref()},stop(e){P2=!0,Kke.clear(),ey&&clearTimeout(ey),ey=null}};var T$n=12e4,Jke=3e4,xzt="internalization_auto_consumer",tP=new Map;function E$n(e){let t=tP.get(e);return t||(t={stopped:!1,timeoutId:null},tP.set(e,t)),t}function Szt(e){return`pd runtime internalization run-once --workspace "${e}" --runner dreamer --runtime config --json`}function R$n(e){return e==="lease_conflict"?"Retry later or check for concurrent worker processes.":e==="timeout"?"Check model provider service status/latency, or increase timeout settings in workflows.yaml.":e==="cancelled"?"Re-enqueue or restart the task if it was cancelled by mistake.":e==="output_invalid"?"Verify if model outputs conform to expected schema and adjust prompt or validation templates if needed.":e==="input_invalid"?"Check predecessor task outputs and database integrity for malformed input references.":e==="max_attempts_exceeded"?"Investigate persistent failures, correct the root issue, and clear last_error or reset attempt count.":"Run: pd runtime internalization run-once --runner dreamer --runtime config --json to isolate the failure."}async function w$n(e,t){let r=Qo(e,xzt,{info:a=>t.info(a),warn:a=>t.warn(a)});if(!r.enabled){let a=JSON.stringify({reason:"internalization_auto_consumer_disabled",nextAction:Szt(e),flagSource:r.source});It.log(e,"INTERNALIZATION_CONSUMER_SKIP",a),t.info(`[PD:AutoConsumer] Cycle skipped: auto-consumer disabled. Source: ${r.source}`);return}let n=ss(e);if(!n.ok){let a=JSON.stringify({reason:"config_malformed",nextAction:n.errors[0]?.nextAction??"Fix .pd/config.yaml and retry",errors:n.errors.map(s=>s.reason)});It.log(e,"INTERNALIZATION_CONSUMER_SKIP",a),t.warn("[PD:AutoConsumer] Config malformed, skipping cycle.");return}let o=G9(n.effective,a=>process.env[a]);if(q9(o)){let a=JSON.stringify({reason:"runtime_config_error",message:o.message,nextAction:o.nextAction});It.log(e,"INTERNALIZATION_CONSUMER_SKIP",a),t.warn(`[PD:AutoConsumer] Runtime config error: ${o.message}`);return}let i=null;try{i=await w$({workspaceDir:e,readonly:!1});let{stateManager:a}=i,s=new I$(a);s.setPolicy({enabledChannels:new Set(["prompt","code_tool_hook","defer_archive"]),actionableTaskKinds:new Set(qX)});let c=await s.getSnapshot();c.readyTasks.length>5&&t.warn(`[PD:AutoConsumer] Backlog detected: ${c.readyTasks.length} tasks ready. Processing only one task.`);let l=Qo(e,"internalization_full_chain").enabled?cwe:GX,d=uwe({autoConsumerEnabled:!0,readyTaskCount:c.readyTasks.length,runnerKinds:l});if(!d.shouldConsume){It.log(e,"INTERNALIZATION_CONSUMER_SKIP",JSON.stringify({reason:d.reason,readyTaskCount:c.readyTasks.length}));return}let p=o.runtimeKind,m=new x$({stateManager:a},{owner:"auto-consumer",runtimeKind:p,dryRun:!0}),f=null,g="no_ready_tasks",y;for(let ae of d.runnerKinds){let ue=await m.wakeOnce(ae);if(ue.decision==="would_lease"){f=ue;break}g=ue.decision,y=ue.decision==="no_ready_tasks"?ue.reason:void 0}if(!f){let ae={decision:g};y&&(ae.reason=y),It.log(e,"INTERNALIZATION_CONSUMER_SKIP",JSON.stringify(ae)),t.info(`[PD:AutoConsumer] No task to consume: ${g}`);return}let x;if(p==="pi-ai")if(Qo(e,"l2_dreamer").enabled&&f.taskKind==="dreamer"){let ue=`${e}/.state`,re=awe(lo(ue),{logger:{warn:_e=>t.warn(_e)}});x=new p$({provider:o.provider??"openai",model:o.model??"gpt-4o",apiKeyEnv:o.apiKeyEnv??"OPENAI_API_KEY",baseUrl:o.baseUrl,workspace:e,totalBudgetMs:o.timeoutMs},{artifactReader:{getArtifactById:async _e=>{let De=await a.piArtifactStore.getArtifactById(_e);return De?{artifactId:De.artifactId,artifactKind:String(De.artifactKind),sourceTaskId:De.sourceTaskId,contentJson:De.contentJson,createdAt:De.createdAt}:null},listBySourceTaskId:async _e=>(await a.piArtifactStore.listBySourceTaskId(_e)).map(Ke=>({artifactId:Ke.artifactId,artifactKind:String(Ke.artifactKind),sourceTaskId:Ke.sourceTaskId,contentJson:Ke.contentJson,createdAt:Ke.createdAt}))},principleReader:re})}else x=new cp({provider:o.provider??"openai",model:o.model??"gpt-4o",apiKeyEnv:o.apiKeyEnv??"OPENAI_API_KEY",maxRetries:o.maxRetries,maxTokens:o.maxTokens,timeoutMs:o.timeoutMs,baseUrl:o.baseUrl,workspace:e});else if(p==="openclaw-cli")x=new vg({runtimeMode:o.openclawMode??"default",workspaceDir:e});else throw new Error(`Unsupported runtime kind resolved for auto-consumer: ${p}`);let b=f.taskId,w=f.taskKind,L={owner:"auto-consumer",runtimeKind:p},W;switch(w){case"dreamer":W=new S$({stateManager:a,runtimeAdapter:x,eventEmitter:hi,artifactStore:a.piArtifactStore,validator:new xN,contentHashFn:vf},L);break;case"philosopher":W=new b$({stateManager:a,runtimeAdapter:x,eventEmitter:hi,artifactStore:a.piArtifactStore,validator:new SN,contentHashFn:vf},L);break;case"scribe":W=new v$({stateManager:a,runtimeAdapter:x,eventEmitter:hi,artifactStore:a.piArtifactStore,validator:new bN,contentHashFn:vf},L);break;case"artificer":W=new T$({stateManager:a,runtimeAdapter:x,eventEmitter:hi,artifactStore:a.piArtifactStore,validator:new TN,contentHashFn:vf},L);break;case"evaluator":W=new R$({stateManager:a,runtimeAdapter:x,eventEmitter:hi,artifactStore:a.piArtifactStore,validator:new EN},L);break;default:It.log(e,"INTERNALIZATION_CONSUMER_SKIP",JSON.stringify({decision:"no_runner_for_kind",taskKind:w})),t.warn(`[PD:AutoConsumer] No auto-consumer runner for task kind '${w}'; skipping. Advance manually: pd runtime internalization run-once --runner ${w}`);return}t.info(`[PD:AutoConsumer] Running ${w} task: ${b}`),It.log(e,"INTERNALIZATION_CONSUMER_RUN",JSON.stringify({taskId:b,taskKind:w}));let J;try{J=await W.run(b)}catch(ae){t.error(`[PD:AutoConsumer] Runner crashed for task ${b}: ${String(ae)}`);try{let ue=await a.getTask(b),re=`Unhandled runner exception: ${ae instanceof Error?ae.message:String(ae)}`;ue&&a.getRetryPolicy().shouldRetry(ue)?(await a.markTaskRetryWait(b,"execution_failed",re),t.info(`[PD:AutoConsumer] Marked task ${b} as retry_wait.`)):(await a.markTaskFailed(b,"execution_failed",re),t.info(`[PD:AutoConsumer] Marked task ${b} as failed.`))}catch(ue){t.error(`[PD:AutoConsumer] Failed to update state for crashed task ${b}: ${String(ue)}`)}throw ae}if(J.status==="succeeded"){let ae=await m.commitNextTaskProposal(b);It.log(e,"INTERNALIZATION_CONSUMER_SUCCESS",JSON.stringify({taskId:b,status:J.status,successorDecision:ae.decision})),t.info(`[PD:AutoConsumer] Task ${b} succeeded. Successor: ${ae.decision}`)}else{let ae=J.errorCategory,ue=J.failureReason,re=R$n(ae);It.log(e,"INTERNALIZATION_CONSUMER_TASK_FAILED",JSON.stringify({taskId:b,status:J.status,errorCategory:ae,failureReason:ue,nextAction:re})),t.warn(`[PD:AutoConsumer] Task ${b} status: ${J.status}. Category: ${ae}. Reason: ${ue}. Next Action: ${re}`)}}catch(a){It.log(e,"INTERNALIZATION_CONSUMER_ERROR",String(a)),t.error(`[PD:AutoConsumer] Cycle error: ${String(a)}`)}finally{i&&await i.close().catch(()=>{})}}var Xke={id:"principles-internalization-auto-consumer",start(e){let t=e?.workspaceDir,r=e?.logger||console;if(!t){r.warn("[PD:AutoConsumer] No workspace directory, not starting.");return}let n=t,o=E$n(n);if(!o.stopped&&o.timeoutId!==null){r.info(`[PD:AutoConsumer] Already started for workspace: ${n}`);return}let i=Qo(n,xzt,{info:u=>r.info(u),warn:u=>r.warn(u)});if(!i.enabled){let u=JSON.stringify({reason:"internalization_auto_consumer_disabled",nextAction:Szt(n),flagSource:i.source});It.log(n,"INTERNALIZATION_CONSUMER_DISABLED",u),r.info(`[PD:AutoConsumer] NOT started for workspace: ${n}. Disabled (source: ${i.source}).`);return}o.stopped=!1;let a=T$n;function s(){o.stopped||(o.timeoutId=setTimeout(c,a),o.timeoutId?.unref())}async function c(){o.stopped||(await w$n(n,r),s())}o.timeoutId=setTimeout(()=>{c().catch(u=>{r.error(`[PD:AutoConsumer] Startup cycle failed: ${String(u)}`),!o.stopped&&(o.timeoutId=setTimeout(c,a),o.timeoutId?.unref())})},Jke),o.timeoutId?.unref(),It.log(n,"INTERNALIZATION_CONSUMER_STARTED",JSON.stringify({intervalMs:a,initialDelayMs:Jke})),r.info(`[PD:AutoConsumer] Started for workspace: ${n} (interval: ${a}ms, initial delay: ${Jke}ms)`)},stop(e){let t=e?.workspaceDir;if(t){let r=tP.get(t);r&&(r.stopped=!0,r.timeoutId&&clearTimeout(r.timeoutId),r.timeoutId=null),tP.delete(t)}else{for(let[,r]of tP)r.stopped=!0,r.timeoutId&&clearTimeout(r.timeoutId),r.timeoutId=null;tP.clear()}}};var bzt={id:"principles-disciple-trajectory",start(e){e.workspaceDir&&Qt.fromHookContext(e).trajectory},stop(e){e.workspaceDir&&ws.dispose(e.workspaceDir)}};import*as HY from"fs";import*as kzt from"path";import*as Azt from"os";var vzt=[];import*as vE from"fs";import*as Yke from"path";var Tzt="pd_tasks.json";function Ezt(e){return Yke.join(e,".state",Tzt)}function I$n(e){let t=Yke.join(e,".state");vE.existsSync(t)||vE.mkdirSync(t,{recursive:!0})}function Rzt(e){let t=Ezt(e);if(!vE.existsSync(t))return[];try{let r=vE.readFileSync(t,"utf-8"),n=JSON.parse(r);return Array.isArray(n)?n:[]}catch(r){return console.warn(`[PD:TaskStore] Failed to parse ${Tzt}: ${String(r)}`),[]}}async function wzt(e,t){let r=Ezt(e);I$n(e),await P7(r,async()=>{Cr(r,JSON.stringify(t,null,2))})}var KY=kzt.join(Azt.homedir(),".openclaw","cron","jobs.json");function k$n(e){if(!HY.existsSync(KY))return e?.info?.("[PD:Reconciler] cron/jobs.json not found, starting with empty store"),{version:1,jobs:[]};try{let t=HY.readFileSync(KY,"utf-8"),r=JSON.parse(t);return e?.info?.(`[PD:Reconciler] Loaded cron/jobs.json: ${r.jobs.length} jobs`),r}catch(t){return e?.warn?.(`[PD:Reconciler] Failed to parse cron/jobs.json: ${String(t)}`),{version:1,jobs:[]}}}async function A$n(e){await P7(KY,async()=>{Cr(KY,JSON.stringify(e,null,2))})}function C$n(e,t){let r=[],n=new Map;for(let o of t)n.set(o.name,o);for(let o of e){let i=n.get(o.name);if(!i)o.enabled&&r.push({type:"CREATE",task:o});else{let a=i.metadata?.pdVersion;o.enabled?!a||a!==o.version?r.push({type:"UPDATE",task:o,job:i}):r.push({type:"SKIP",task:o,job:i}):r.push({type:"DISABLE",task:o,job:i})}}for(let o of t){if(!o.name.startsWith("PD "))continue;e.find(a=>a.name===o.name)||r.push({type:"ORPHAN",job:o})}return r}function Izt(e,t,r,n){return n?.info?.(`[PD:Reconciler] Building cron job: ${e.name} (id=${e.id}, interval=${e.schedule.everyMs}ms)`),{id:`pd-${e.id}-${t}`,name:e.name,agentId:e.agentId||"main",description:e.description,enabled:e.enabled,schedule:{kind:"every",everyMs:e.schedule.everyMs},sessionTarget:"isolated",wakeMode:"now",payload:{kind:"agentTurn",message:O$n(e,r,n),lightContext:e.execution.lightContext??!0,timeoutSeconds:e.execution.timeoutSeconds??120,toolsAllow:e.execution.toolsAllow},delivery:{mode:e.delivery.mode},createdAtMs:t,updatedAtMs:t,state:{nextRunAtMs:t+e.schedule.everyMs},metadata:{pdVersion:e.version,pdTaskId:e.id}}}function O$n(e,t,r){return e.description}async function Czt(e,t){let r=t?.dryRun??!1,n=t?.logger??console,o=Date.now(),i={created:[],updated:[],skipped:[],orphaned:[],errors:[]},a=Rzt(e),s=new Map(a.map(p=>[p.id,p])),c=vzt.map(p=>{let m=s.get(p.id);return m?{...p,meta:{...p.meta,...m.meta}}:{...p,meta:{createdAtMs:o}}}),u=await k$n(n),l=P$n(c,u,n),d=C$n(l,u.jobs);for(let p of d)switch(p.type){case"CREATE":if(p.task){if(!r){let m=Izt(p.task,o,e,n);u.jobs.push(m),n.info?.(`[PD:Reconciler] Created job: ${p.task.name}`)}i.created.push(p.task.name)}break;case"UPDATE":if(p.task&&p.job){if(!r){let m=u.jobs.indexOf(p.job),f=Izt(p.task,o,e,n);f.id=p.job.id,f.state={...p.job.state,nextRunAtMs:void 0},u.jobs[m]=f,n.info?.(`[PD:Reconciler] Updated job: ${p.task.name}`)}i.updated.push(p.task.name)}break;case"DISABLE":if(p.job){if(!r){let m=u.jobs.indexOf(p.job);m>=0&&(u.jobs[m]={...p.job,enabled:!1,updatedAtMs:o})}n.warn?.(`[PD:Reconciler] Disabled job: ${p.job.name}`)}break;case"ORPHAN":p.job&&(n.warn?.(`[PD:Reconciler] Orphaned job (no declaration): ${p.job.name}`),i.orphaned.push(p.job.name));break;case"SKIP":p.task&&i.skipped.push(p.task.name);break}if(!r&&(i.created.length>0||i.updated.length>0)){await A$n(u),n.info?.(`[PD:Reconciler] Wrote cron/jobs.json: ${u.jobs.length} total jobs`);for(let p of u.jobs)p.name.startsWith("PD ")&&n.info?.(`[PD:Reconciler] PD job: name=${p.name}, enabled=${p.enabled}, schedule=${JSON.stringify(p.schedule)}, nextRun=${p.state.nextRunAtMs?new Date(p.state.nextRunAtMs).toISOString():"TBD"}`)}return!r&&c.length>0&&await wzt(e,c),i}function P$n(e,t,r){let n=new Map(t.jobs.map(o=>[o.name,o]));return e.map(o=>{let i=n.get(o.name);if(!i)return o;let a=i.state.consecutiveErrors??0,s=i.state.lastError??"",c=s.includes("timed out")||s.includes("timeout");if(c&&a>0&&i.payload.kind==="agentTurn"){let l=i.payload.timeoutSeconds??120,d=Math.min(1800,l*2);d>l&&(i.payload.timeoutSeconds=d,i.state.consecutiveErrors=0,i.state.lastError=void 0,r.info?.(`[PD:Reconciler] Auto-increased timeout for '${o.name}': ${l}s \u2192 ${d}s (was ${a} consecutive timeouts)`))}let u=a>=3&&!c&&!o.meta?.autoDisabled;return a===0&&o.meta?.autoDisabled&&r.info?.(`[PD:Reconciler] Task '${o.id}' was previously auto-disabled but has 0 consecutive errors now`),u||o.meta||i.state.lastRunAtMs?{...o,meta:{...o.meta,...u?{autoDisabled:!0,autoDisabledAt:Date.now(),autoDisabledReason:`consecutiveErrors=${a}`}:{},...o.meta?{consecutiveFailCount:a}:{},...i.state.lastRunAtMs?{lastFailedAtMs:i.state.lastRunAtMs}:{}}}:o})}var Ozt={id:"principles-disciple-task-manager",async start(e){let{workspaceDir:t}=e,r=e.logger??e.api?.logger;if(!t){r?.warn?.("[PD:TaskManager] No workspaceDir, skipping PD task reconciliation");return}r?.info?.("[PD:TaskManager] Starting PD task reconciliation...");try{let n=await Czt(t,{logger:r??console});r?.info?.(`[PD:TaskManager] Reconcile complete: +${n.created.length} ~${n.updated.length} =${n.skipped.length} orphan=${n.orphaned.length}`),n.created.length>0&&r?.info?.(`[PD:TaskManager] Created jobs: ${n.created.join(", ")}`),n.updated.length>0&&r?.info?.(`[PD:TaskManager] Updated jobs: ${n.updated.join(", ")}`),n.errors.length>0&&r?.warn?.(`[PD:TaskManager] Reconcile errors: ${n.errors.map(o=>o.message).join(", ")}`)}catch(n){r?.warn?.(`[PD:TaskManager] Reconcile failed: ${String(n)}`)}},stop(e){}};import*as fc from"fs";import*as oa from"path";function Pzt(e,t){try{let r=oa.join(t,"docs"),n=oa.join(t,"memory",".state"),o=[{legacy:oa.join(r,"PRINCIPLES.md"),newKey:"PRINCIPLES"},{legacy:oa.join(r,"THINKING_OS.md"),newKey:"THINKING_OS"},{legacy:oa.join(r,"DECISION_POLICY.json"),newKey:"DECISION_POLICY"},{legacy:oa.join(r,"evolution_queue.json"),newKey:"EVOLUTION_QUEUE"},{legacy:oa.join(r,".pain_flag"),newKey:"PAIN_FLAG"},{legacy:oa.join(r,"SYSTEM_CAPABILITIES.json"),newKey:"SYSTEM_CAPABILITIES"},{legacy:oa.join(r,"SYSTEM.log"),newKey:"SYSTEM_LOG"},{legacy:oa.join(r,"THINKING_OS_CANDIDATES.md"),newKey:"THINKING_OS_CANDIDATES"},{legacy:oa.join(n,"pain_dictionary.json"),newKey:"DICTIONARY"},{legacy:oa.join(n,"pain_settings.json"),newKey:"PAIN_SETTINGS"},{legacy:oa.join(n,"thinking_os_usage.json"),newKey:"THINKING_OS_USAGE"},{legacy:oa.join(n,"pain_candidates.json"),newKey:"PAIN_CANDIDATES"},{legacy:oa.join(n,"evolution_directive.json"),newKey:"EVOLUTION_DIRECTIVE"},{legacy:oa.join(n,"sessions"),newKey:"SESSION_DIR"},{legacy:oa.join(n,"logs","events.jsonl"),newKey:"SYSTEM_LOG"}],i=0;for(let a of o)if(fc.existsSync(a.legacy)){let s=qo(t,a.newKey),c=oa.dirname(s);if(fc.existsSync(c)||fc.mkdirSync(c,{recursive:!0}),fc.existsSync(s))e.logger?.warn?.(`[PD:Migration] Skipping ${oa.basename(a.legacy)}: already exists at destination.`);else try{fc.renameSync(a.legacy,s),e.logger.info(`[PD:Migration] Migrated ${oa.basename(a.legacy)} to ${s.replace(t,"")}`),i++}catch(u){e.logger.error(`[PD:Migration] Failed to rename ${a.legacy}: ${String(u)}`)}}if(i>0&&e.logger.info(`[PD:Migration] Successfully migrated ${i} files/folders to new architecture.`),fc.existsSync(n))try{let a=fc.readdirSync(n);if(a.length===0||a.length===1&&a[0]==="logs"){let s=oa.join(n,"logs");fc.existsSync(s)&&fc.readdirSync(s).length===0&&fc.rmdirSync(s),fc.readdirSync(n).length===0&&(fc.rmdirSync(n),e.logger.info("[PD:Migration] Cleaned up empty legacy state directory."))}}catch(a){e.logger.debug?.(`[PD:Migration] Failed to cleanup legacy state dir: ${String(a)}`)}}catch(r){e.logger.error(`[PD:Migration] Directory refactor migration failed: ${String(r)}`)}}import*as Gd from"fs";import*as A0 from"path";var N$n=["AGENTS.md","MEMORY.md"],M$n=["THINKING_OS.md"],Nzt=A0.join(".principles","skills"),L$n=".principles",Mzt=".pre-pri286.bak";function D$n(e){try{let t=Gd.readFileSync(e,"utf-8");return typeof t!="string"?null:t}catch{return null}}function U$n(e,t){let r=e+Mzt;try{return Gd.writeFileSync(r,t,"utf-8"),!0}catch{return!1}}function $$n(e){let t=A0.join(e,Nzt);if(!Gd.existsSync(t))return{files:[]};try{let r=Gd.readdirSync(t,{withFileTypes:!0}),n=[];for(let o of r)if(o.isDirectory()){let i=A0.join(t,o.name,"SKILL.md");Gd.existsSync(i)&&n.push(i)}return{files:n}}catch(r){let n=r instanceof Error?r.message:String(r);return{files:[],error:{file:Nzt,error:`Failed to enumerate skills directory: ${n}`}}}}function F$n(e,t){let r=[];for(let o of N$n)r.push(A0.join(e,o));for(let o of M$n)r.push(A0.join(e,L$n,o));let n=$$n(e);return n.error&&t.errors.push(n.error),r.push(...n.files),r}function Lzt(e,t){let r={migratedFiles:[],skippedFiles:[],errors:[]},n=F$n(t,r);for(let o of n){let i=A0.relative(t,o);if(!Gd.existsSync(o))continue;let a=D$n(o);if(a===null){r.errors.push({file:i,error:"Failed to read file content"});continue}if(!Lve(a,i)){r.skippedFiles.push(i);continue}let s=Mve(a,i);if(!s.changed){r.skippedFiles.push(i);continue}let c=s.migrated;if(!U$n(o,a)){r.errors.push({file:i,error:"Failed to create backup file before migration"});continue}try{Gd.writeFileSync(o,c,"utf-8"),r.migratedFiles.push(i),e.logger.info(`[PD:GuidanceMigration] Migrated ${i} (backup at ${i}${Mzt})`)}catch(l){let d=l instanceof Error?l.message:String(l);r.errors.push({file:i,error:`Failed to write migrated content: ${d}`});try{Gd.writeFileSync(o,a,"utf-8")}catch{e.logger.error(`[PD:GuidanceMigration] CRITICAL: Failed to restore original content for ${i} after write failure`)}}}return r.migratedFiles.length>0&&e.logger.info(`[PD:GuidanceMigration] Migration complete: ${r.migratedFiles.length} migrated, ${r.skippedFiles.length} skipped, ${r.errors.length} errors`),r}function z$n(e,t,r){return{workspaceDir:e,sessionId:t??"openclaw:session-unavailable",toolName:r}}function Dzt(e){let t=new WeakMap,r=new WeakMap;function n(s){if(typeof s.rawPayload!="object"||s.rawPayload===null)throw new Error(`OpenClaw ${s.kind} dispatch is missing its native payload token`);let c=Object.hasOwn(s.rawPayload,"nativeToken")?Reflect.get(s.rawPayload,"nativeToken"):s.rawPayload;if(typeof c!="object"||c===null)throw new Error(`OpenClaw ${s.kind} dispatch has an invalid native payload token`);let u=t.get(c);if(!u||u.kind!==s.kind)throw new Error(`OpenClaw ${s.kind} dispatch has a mismatched native payload`);return u}function o(s,c,u,l){let d={decision:u,source:s.source,...l?{reason:l}:{}};return r.set(d,c),d}let i=eUt({ruleContextProvider(s){if(typeof s.rawPayload!="object"||s.rawPayload===null)throw new Error("OpenClaw rule context request is missing its native payload");let c=Reflect.get(s.rawPayload,"nativeToken");if(typeof c!="object"||c===null)throw new Error("OpenClaw rule context request has an invalid native token");let u=t.get(c);if(!u||u.kind!=="before_tool_call")throw new Error("OpenClaw rule context request has a mismatched native payload");return e.ruleContextProvider?.(u.event,u.context,s)},ruleInputEnrichmentProvider(s){if(typeof s.rawPayload!="object"||s.rawPayload===null)throw new Error("OpenClaw rule enrichment request is missing its native payload");let c=Reflect.get(s.rawPayload,"nativeToken");if(typeof c!="object"||c===null)throw new Error("OpenClaw rule enrichment request has an invalid native token");let u=t.get(c);if(!u||u.kind!=="before_tool_call")throw new Error("OpenClaw rule enrichment request has a mismatched native payload");return e.ruleInputEnrichmentProvider?.(u.event,u.context,s)},promptExcludePrincipleIds(s){let c=n(s);if(c.kind!=="before_prompt_build")throw new Error("OpenClaw prompt exclusion payload mismatch");return e.promptExcludePrincipleIds?.(c.event,c.context)??new Set},async beforePromptBuild(s,c){let u=n(s);if(u.kind!=="before_prompt_build")throw new Error("OpenClaw prompt payload mismatch");let l=await e.beforePromptBuild(u.event,u.context,c);return o(s,{kind:u.kind,value:l},l?"modify":"allow")},painEnrichmentProvider(s){let c=n(s);if(c.kind!=="after_tool_call")throw new Error("OpenClaw pain payload mismatch");return e.painEnrichmentProvider?.(c.event,c.context)}});async function a(s,c,u){let l={};t.set(l,s);let d={kind:s.kind,context:{...z$n(c,u,s.kind==="before_prompt_build"?void 0:s.event.toolName),...s.kind==="after_tool_call"?{toolInput:s.event.params??{},toolOutput:{error:s.event.error,result:s.event.result,durationMs:s.event.durationMs}}:{}},rawPayload:s.kind==="before_tool_call"?{nativeToken:l,toolInput:{toolName:s.event.toolName,params:s.event.params??{}}}:{nativeToken:l},source:`openclaw:${s.kind}`},p=await i.dispatch(d),m=r.get(p);if(s.kind==="before_tool_call"&&!m){let f=e.onBeforeToolResult?.(s.event,s.context,p);return{kind:s.kind,value:p.decision==="deny"?{block:!0,blockReason:p.reason}:f}}if(s.kind==="after_tool_call"&&!m)return p.metadata?.outcome!=="unavailable"&&await e.onAfterToolResult?.(s.event,s.context,p),{kind:s.kind,value:void 0};if(!m||m.kind!==s.kind)throw new Error(`OpenClaw ${s.kind} result mapping is missing`);return m}return{runtime:i,async dispatchBeforePromptBuild(s,c){if(!c.workspaceDir)throw new Error("OpenClaw before_prompt_build requires workspaceDir");let u=await a({kind:"before_prompt_build",event:s,context:c},c.workspaceDir,c.sessionId);if(u.kind!=="before_prompt_build")throw new Error("OpenClaw prompt result mismatch");return u.value},async dispatchBeforeToolCall(s,c){if(!c.workspaceDir)throw new Error("OpenClaw before_tool_call requires workspaceDir");let u=await a({kind:"before_tool_call",event:s,context:c},c.workspaceDir,c.sessionId);if(u.kind!=="before_tool_call")throw new Error("OpenClaw gate result mismatch");return u.value},async dispatchAfterToolCall(s,c){if(!c.workspaceDir)throw new Error("OpenClaw after_tool_call requires workspaceDir");await a({kind:"after_tool_call",event:s,context:c},c.workspaceDir,c.sessionId)}}}var Uzt=new Set;try{M7()}catch{}function _ws(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function XY(e,t,r){return Qo(e,t,r)}function W$n(e,t){let r=XY(e,"evolution_worker",t);if(r.enabled)return{shouldStart:!0,flagSource:r.source,disabledInfo:null};let n=JSON.stringify({reason:"mvp_quiet_per_adr0014",nextAction:"set features.evolution_worker.enabled=true in .pd/config.yaml to enable",featureFlag:"evolution_worker",boundedContext:"legacy_evolution_worker",flagSource:r.source});return{shouldStart:!1,flagSource:r.source,disabledInfo:n}}function q$n(e,t){let r=XY(e,"correction_observer",t);if(r.enabled)return{shouldStart:!0,flagSource:r.source,disabledInfo:null};let n=JSON.stringify({reason:"correction_observer_disabled",nextAction:"set features.correction_observer.enabled=true in .pd/config.yaml to enable",featureFlag:"correction_observer",boundedContext:"correction_observer_service",flagSource:r.source});return{shouldStart:!1,flagSource:r.source,disabledInfo:n}}function G$n(e,t){let r=XY(e,"internalization_auto_consumer",t);if(r.enabled)return{shouldStart:!0,flagSource:r.source,disabledInfo:null};let n=JSON.stringify({reason:"internalization_auto_consumer_disabled",nextAction:`pd runtime internalization run-once --workspace "${e}" --runner dreamer --runtime config --json`,featureFlag:"internalization_auto_consumer",boundedContext:"internalization_auto_consumer",flagSource:r.source});return{shouldStart:!1,flagSource:r.source,disabledInfo:n}}function j$n(e,t){let r=XY(e,"abstraction_layer_v1",t);return r.enabled?{enabled:!0,source:r.source,rollbackReason:null}:{enabled:!1,source:r.source,rollbackReason:JSON.stringify({reason:"abstraction_layer_v1_disabled",nextAction:"set features.abstraction_layer_v1.enabled=true in .pd/config.yaml for controlled shared-runtime parity validation",route:"openclaw_legacy",flagSource:r.source})}}var B$n={name:"Principles Disciple",description:"Evolutionary programming agent framework with strategic guardrails and reflection loops.",register(e){e.logger.info(`Principles Disciple Plugin registered. (Path: ${e.rootDir??"(unknown)"})`),Fd.setExtensionRoot(e.rootDir??"."),setTimeout(()=>{let d=S$t({agentId:"main"},e,"startup.health_check"),p=Rs(d);p?(e.logger.error(`[PD:health] Tool hook workspaceDir is INVALID: "${d}" - ${p}`),e.logger.error("[PD:health] Tool hook events will be written to the WRONG .state directory!")):e.logger.info(`[PD:health] Tool hook workspaceDir OK: "${d}"`);let m=i2(N7(e.config,e.id));if(m.authorized)e.logger.info("[PD:health] conversation hooks (allowConversationAccess) OK");else{let f=!1;try{f=M7()}catch(g){e.logger.warn(`[PD:health] auto-fix for allowConversationAccess failed: ${String(g instanceof Error?g.message:g)}`)}f?e.logger.info("[PD:health] allowConversationAccess auto-configured. Restart the gateway to activate conversation hooks."):e.logger.error(`[PD:health] conversation hooks (llm_output / trajectory) will be BLOCKED by OpenClaw.
|
|
3164
3164
|
reason: ${m.reason}
|
|
3165
|
-
nextAction: ${m.nextAction}`)}},1e3).unref();let r=new Map,n=new Set,o=l=>{let d=r.get(l);return d||(d=j$n(l,e.logger),r.set(l,d)),!d.enabled&&!n.has(l)&&(n.add(l),e.logger.info(`[PD:host-runtime] OpenClaw legacy route selected. ${d.rollbackReason}`)),d},i=Y9();if(!i.passed)for(let l of i.violations)e.logger.error(`[PD:surface-guard] VIOLATION: ${l}`);e.logger.info(`[PD:surface-guard] Core surfaces: ${i.enabledCoreSurfaces.join(", ")}`),e.logger.info(`[PD:surface-guard] Disabled non-core surfaces: ${i.disabledNonCoreSurfaces.length}`);for(let l of i.warnings)e.logger.warn(`[PD:surface-guard] ${l}`);let a=e.pluginConfig?.language||"en",s=new WeakMap,c=Dzt({promptExcludePrincipleIds:(l,d)=>{try{let p=Qt.fromHookContext({...d,workspaceDir:d.workspaceDir}).evolutionReducer,m=qIe(d.workspaceDir??"",p,e.logger);return s.set(l,m),m.selectedIds}catch(p){return e.logger.info(`[PD:RuntimeV2] Legacy principle dedup unavailable; continuing with shared active principles: ${String(p)}`),new Set}},beforePromptBuild:async(l,d,p)=>{let m=s.get(l);return s.delete(l),GIe(l,{...d,api:e},p,m)},ruleContextProvider:(l,d,p)=>VIe(Qt.fromHookContext({...d,workspaceDir:d.workspaceDir}),p.targetPath,d.sessionId,e.logger),ruleInputEnrichmentProvider:(l,d)=>r2t(l,d.workspaceDir??"",d.sessionId),onBeforeToolResult:(l,d,p)=>{if(!d.workspaceDir){e.logger.warn("[PD_GATE:RULE_HOST] shared result mapping skipped: workspaceDir missing; nextAction=inspect OpenClaw hook context");return}n2t(l,{...d,workspaceDir:d.workspaceDir,logger:e.logger},p);let m=p.metadata?.ruleDecision;if(m==="auto_correct"||m==="requireApproval")return BIe(l,{...d,workspaceDir:d.workspaceDir,pluginConfig:e.pluginConfig??{},logger:e.logger})},painEnrichmentProvider:(l,d)=>F$t(l,{...d,workspaceDir:d.workspaceDir??"",pluginConfig:e.pluginConfig??{}}),onAfterToolResult:(l,d,p)=>z$t(l,{...d,workspaceDir:d.workspaceDir??""},p)});e.on("before_prompt_build",pf("hook:before_prompt_build",e.logger,async(l,d)=>{let p=Kh(d,e,"before_prompt_build");if(!p.ok){e.logger.error(`[PD:before_prompt_build] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped \u2014 no mutation will occur. NextAction: ${p.nextAction}`);return}let m=p.workspaceDir;p.consistencyWarning&&e.logger.warn(`[PD:before_prompt_build] ${p.consistencyWarning}`);try{if(!Uzt.has(m)){Uzt.add(m),Pzt(e,m),Lzt(e,m),ZFt(e,m,a),It.log(m,"SYSTEM_BOOT",`Principles Disciple online. Language: ${a}`);let x=W$n(m,e.logger);x.shouldStart?(BY.api=e,BY.start({config:e.config,workspaceDir:m,stateDir:JY.join(m,".state"),logger:e.logger}),e.logger.info(`[PD] EvolutionWorker started for workspace: ${m} (flag source: ${x.flagSource})`)):(e.logger.info(`[PD] EvolutionWorker NOT started for workspace: ${m}. ${x.disabledInfo}`),It.log(m,"EVOLUTION_WORKER_DISABLED",x.disabledInfo??""));let b=q$n(m,e.logger);b.shouldStart?(Hke.start({config:e.config,workspaceDir:m,stateDir:JY.join(m,".state"),logger:e.logger}),e.logger.info(`[PD] CorrectionObserver started for workspace: ${m} (flag source: ${b.flagSource})`)):(e.logger.info(`[PD] CorrectionObserver NOT started for workspace: ${m}. ${b.disabledInfo}`),It.log(m,"CORRECTION_OBSERVER_DISABLED",b.disabledInfo??""));let w=G$n(m,e.logger);w.shouldStart?(Xke.start({config:e.config,workspaceDir:m,stateDir:JY.join(m,".state"),logger:e.logger}),e.logger.info(`[PD] InternalizationAutoConsumer started for workspace: ${m} (flag source: ${w.flagSource})`)):(e.logger.info(`[PD] InternalizationAutoConsumer NOT started for workspace: ${m}. ${w.disabledInfo}`),It.log(m,"INTERNALIZATION_CONSUMER_DISABLED",w.disabledInfo??""))}let f={...d,workspaceDir:m},y=o(m).enabled?await c.dispatchBeforePromptBuild(l,f):await GIe(l,{...f,api:e});return Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_prompt_build",sessionId:d.sessionId}),y}catch(f){Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_prompt_build",sessionId:d.sessionId,error:String(f)}),e.logger.error(`[PD] Error in before_prompt_build: ${String(f)}`)}})),e.on("before_tool_call",pf("hook:before_tool_call",e.logger,(l,d)=>{let p=Kh(d,e,"before_tool_call");if(!p.ok){e.logger.error(`[PD:before_tool_call] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped \u2014 security gate bypassed. NextAction: ${p.nextAction}`);return}let m=p.workspaceDir;p.consistencyWarning&&e.logger.warn(`[PD:before_tool_call] ${p.consistencyWarning}`);try{let f=e.pluginConfig??{},{logger:g}=e,y={...d,workspaceDir:m,pluginConfig:f,logger:g};if(!o(m).enabled){let b=BIe(l,y);return Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_tool_call"},{flushImmediately:!0}),b}return c.dispatchBeforeToolCall(l,y).then(b=>(Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_tool_call"},{flushImmediately:!0}),b)).catch(b=>{let w=b instanceof Error?b.message.slice(0,500):a0(b).slice(0,500);Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_tool_call",error:w},{flushImmediately:!0}),e.logger.error(`[PD] Error in before_tool_call: ${w}`)})}catch(f){Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_tool_call",error:String(f)},{flushImmediately:!0}),e.logger.error(`[PD] Error in before_tool_call: ${String(f)}`)}})),e.on("after_tool_call",pf("hook:after_tool_call",e.logger,(l,d)=>{let p=Kh(d,e,"after_tool_call");if(!p.ok){e.logger.error(`[PD:after_tool_call] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped \u2014 pain detection bypassed. NextAction: ${p.nextAction}`);return}let m=p.workspaceDir;p.consistencyWarning&&e.logger.warn(`[PD:after_tool_call] ${p.consistencyWarning}`);try{let f=e.pluginConfig??{},g={...d,workspaceDir:m,pluginConfig:f};if(!o(m).enabled){FIe(l,g,e),Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"after_tool_call"},{flushImmediately:!0});return}if(l.toolName==="pain"||l.toolName==="skill:pain"){FIe(l,g,e),Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"after_tool_call"},{flushImmediately:!0});return}return c.dispatchAfterToolCall(l,g).then(()=>{Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"after_tool_call"},{flushImmediately:!0})}).catch(x=>{let b=x instanceof Error?x.message.slice(0,500):a0(x).slice(0,500);Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"after_tool_call",error:b},{flushImmediately:!0}),e.logger.error(`[PD:EmpathyObserver] Error in after_tool_call: ${b}`)})}catch(f){Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"after_tool_call",error:String(f)},{flushImmediately:!0}),e.logger.error(`[PD:EmpathyObserver] Error in after_tool_call: ${String(f)}`)}}),{timeoutMs:1e4}),e.on("llm_output",pf("hook:llm_output",e.logger,(l,d)=>{let p=Kh(d,e,"llm_output");if(!p.ok){e.logger.error(`[PD:llm_output] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped \u2014 LLM analysis bypassed. NextAction: ${p.nextAction}`);return}let m=p.workspaceDir;p.consistencyWarning&&e.logger.warn(`[PD:llm_output] ${p.consistencyWarning}`);try{m2t(l,{...d,workspaceDir:m}),Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"llm_output",sessionId:d.sessionId})}catch(f){Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"llm_output",sessionId:d.sessionId,error:String(f)}),e.logger.error(`[PD] Error in llm_output: ${String(f)}`)}}),{timeoutMs:1e4}),e.on("before_reset",pf("hook:before_reset",e.logger,(l,d)=>{let p=Kh(d,e,"before_reset");if(!p.ok){e.logger.error(`[PD:before_reset] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped. NextAction: ${p.nextAction}`);return}return p.consistencyWarning&&e.logger.warn(`[PD:before_reset] ${p.consistencyWarning}`),o2t(l,{...d,workspaceDir:p.workspaceDir})})),e.on("before_compaction",pf("hook:before_compaction",e.logger,(l,d)=>{let p=Kh(d,e,"before_compaction");if(!p.ok){e.logger.error(`[PD:before_compaction] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped. NextAction: ${p.nextAction}`);return}return p.consistencyWarning&&e.logger.warn(`[PD:before_compaction] ${p.consistencyWarning}`),i2t(l,{...d,workspaceDir:p.workspaceDir})})),e.on("after_compaction",pf("hook:after_compaction",e.logger,(l,d)=>{let p=Kh(d,e,"after_compaction");if(!p.ok){e.logger.error(`[PD:after_compaction] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped. NextAction: ${p.nextAction}`);return}return p.consistencyWarning&&e.logger.warn(`[PD:after_compaction] ${p.consistencyWarning}`),a2t(l,{...d,workspaceDir:p.workspaceDir})})),e.on("before_message_write",pf("hook:before_message_write",e.logger,(l,d)=>{let p=Kh(d,e,"before_message_write");if(!p.ok){e.logger.warn(`[PD:before_message_write] workspaceDir resolution failed: ${p.reason}`);return}try{g2t(l,{...d,workspaceDir:p.workspaceDir,pluginConfig:N7(e.config,e.id)})}catch(m){e.logger.warn(`[PD:before_message_write] error: ${String(m)}`)}}));try{let l=xT("service:correction-observer",Hke,e.logger);l&&e.registerService(l);let d=xT("service:trajectory",bzt,e.logger);d&&e.registerService(d);let p=xT("service:pd-task",Ozt,e.logger);p&&e.registerService(p);let m=xT("service:internalization-auto-consumer",Xke,e.logger);m&&e.registerService(m)}catch(l){e.logger.error(`[PD] Failed to register services: ${String(l)}`)}let u=(l,d,p,m,f)=>{let g={name:l,description:p,handler:m,...f?.acceptsArgs?{acceptsArgs:!0}:{}};e.registerCommand(g),d&&e.registerCommand({...g,name:d,description:`${p} (alias of /${l})`})};u("pd-init","pdi",us("pd-init",a),l=>_2t(l)),u("pd-bootstrap","pdb",us("pd-bootstrap",a),l=>x2t(l)),u("pd-research","pdr",us("pd-research",a),l=>S2t(l)),u("pd-thinking","pdt",us("pd-thinking",a),l=>T2t(l),{acceptsArgs:!0}),u("pd-help","pdh",us("pd-help",a),()=>a==="zh"?{text:`
|
|
3165
|
+
nextAction: ${m.nextAction}`)}},1e3).unref();let r=new Map,n=new Set,o=l=>{let d=r.get(l);return d||(d=j$n(l,e.logger),r.set(l,d)),!d.enabled&&!n.has(l)&&(n.add(l),e.logger.info(`[PD:host-runtime] OpenClaw legacy route selected. ${d.rollbackReason}`)),d},i=Y9();if(!i.passed)for(let l of i.violations)e.logger.error(`[PD:surface-guard] VIOLATION: ${l}`);e.logger.info(`[PD:surface-guard] Core surfaces: ${i.enabledCoreSurfaces.join(", ")}`),e.logger.info(`[PD:surface-guard] Disabled non-core surfaces: ${i.disabledNonCoreSurfaces.length}`);for(let l of i.warnings)e.logger.warn(`[PD:surface-guard] ${l}`);let a=e.pluginConfig?.language||"zh",s=new WeakMap,c=Dzt({promptExcludePrincipleIds:(l,d)=>{try{let p=Qt.fromHookContext({...d,workspaceDir:d.workspaceDir}).evolutionReducer,m=qIe(d.workspaceDir??"",p,e.logger);return s.set(l,m),m.selectedIds}catch(p){return e.logger.info(`[PD:RuntimeV2] Legacy principle dedup unavailable; continuing with shared active principles: ${String(p)}`),new Set}},beforePromptBuild:async(l,d,p)=>{let m=s.get(l);return s.delete(l),GIe(l,{...d,api:e},p,m)},ruleContextProvider:(l,d,p)=>VIe(Qt.fromHookContext({...d,workspaceDir:d.workspaceDir}),p.targetPath,d.sessionId,e.logger),ruleInputEnrichmentProvider:(l,d)=>r2t(l,d.workspaceDir??"",d.sessionId),onBeforeToolResult:(l,d,p)=>{if(!d.workspaceDir){e.logger.warn("[PD_GATE:RULE_HOST] shared result mapping skipped: workspaceDir missing; nextAction=inspect OpenClaw hook context");return}n2t(l,{...d,workspaceDir:d.workspaceDir,logger:e.logger},p);let m=p.metadata?.ruleDecision;if(m==="auto_correct"||m==="requireApproval")return BIe(l,{...d,workspaceDir:d.workspaceDir,pluginConfig:e.pluginConfig??{},logger:e.logger})},painEnrichmentProvider:(l,d)=>F$t(l,{...d,workspaceDir:d.workspaceDir??"",pluginConfig:e.pluginConfig??{}}),onAfterToolResult:(l,d,p)=>z$t(l,{...d,workspaceDir:d.workspaceDir??""},p)});e.on("before_prompt_build",pf("hook:before_prompt_build",e.logger,async(l,d)=>{let p=Kh(d,e,"before_prompt_build");if(!p.ok){e.logger.error(`[PD:before_prompt_build] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped \u2014 no mutation will occur. NextAction: ${p.nextAction}`);return}let m=p.workspaceDir;p.consistencyWarning&&e.logger.warn(`[PD:before_prompt_build] ${p.consistencyWarning}`);try{if(!Uzt.has(m)){Uzt.add(m),Pzt(e,m),Lzt(e,m),ZFt(e,m,a),It.log(m,"SYSTEM_BOOT",`Principles Disciple online. Language: ${a}`);let x=W$n(m,e.logger);x.shouldStart?(BY.api=e,BY.start({config:e.config,workspaceDir:m,stateDir:JY.join(m,".state"),logger:e.logger}),e.logger.info(`[PD] EvolutionWorker started for workspace: ${m} (flag source: ${x.flagSource})`)):(e.logger.info(`[PD] EvolutionWorker NOT started for workspace: ${m}. ${x.disabledInfo}`),It.log(m,"EVOLUTION_WORKER_DISABLED",x.disabledInfo??""));let b=q$n(m,e.logger);b.shouldStart?(Hke.start({config:e.config,workspaceDir:m,stateDir:JY.join(m,".state"),logger:e.logger}),e.logger.info(`[PD] CorrectionObserver started for workspace: ${m} (flag source: ${b.flagSource})`)):(e.logger.info(`[PD] CorrectionObserver NOT started for workspace: ${m}. ${b.disabledInfo}`),It.log(m,"CORRECTION_OBSERVER_DISABLED",b.disabledInfo??""));let w=G$n(m,e.logger);w.shouldStart?(Xke.start({config:e.config,workspaceDir:m,stateDir:JY.join(m,".state"),logger:e.logger}),e.logger.info(`[PD] InternalizationAutoConsumer started for workspace: ${m} (flag source: ${w.flagSource})`)):(e.logger.info(`[PD] InternalizationAutoConsumer NOT started for workspace: ${m}. ${w.disabledInfo}`),It.log(m,"INTERNALIZATION_CONSUMER_DISABLED",w.disabledInfo??""))}let f={...d,workspaceDir:m},y=o(m).enabled?await c.dispatchBeforePromptBuild(l,f):await GIe(l,{...f,api:e});return Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_prompt_build",sessionId:d.sessionId}),y}catch(f){Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_prompt_build",sessionId:d.sessionId,error:String(f)}),e.logger.error(`[PD] Error in before_prompt_build: ${String(f)}`)}})),e.on("before_tool_call",pf("hook:before_tool_call",e.logger,(l,d)=>{let p=Kh(d,e,"before_tool_call");if(!p.ok){e.logger.error(`[PD:before_tool_call] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped \u2014 security gate bypassed. NextAction: ${p.nextAction}`);return}let m=p.workspaceDir;p.consistencyWarning&&e.logger.warn(`[PD:before_tool_call] ${p.consistencyWarning}`);try{let f=e.pluginConfig??{},{logger:g}=e,y={...d,workspaceDir:m,pluginConfig:f,logger:g};if(!o(m).enabled){let b=BIe(l,y);return Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_tool_call"},{flushImmediately:!0}),b}return c.dispatchBeforeToolCall(l,y).then(b=>(Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_tool_call"},{flushImmediately:!0}),b)).catch(b=>{let w=b instanceof Error?b.message.slice(0,500):a0(b).slice(0,500);Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_tool_call",error:w},{flushImmediately:!0}),e.logger.error(`[PD] Error in before_tool_call: ${w}`)})}catch(f){Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"before_tool_call",error:String(f)},{flushImmediately:!0}),e.logger.error(`[PD] Error in before_tool_call: ${String(f)}`)}})),e.on("after_tool_call",pf("hook:after_tool_call",e.logger,(l,d)=>{let p=Kh(d,e,"after_tool_call");if(!p.ok){e.logger.error(`[PD:after_tool_call] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped \u2014 pain detection bypassed. NextAction: ${p.nextAction}`);return}let m=p.workspaceDir;p.consistencyWarning&&e.logger.warn(`[PD:after_tool_call] ${p.consistencyWarning}`);try{let f=e.pluginConfig??{},g={...d,workspaceDir:m,pluginConfig:f};if(!o(m).enabled){FIe(l,g,e),Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"after_tool_call"},{flushImmediately:!0});return}if(l.toolName==="pain"||l.toolName==="skill:pain"){FIe(l,g,e),Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"after_tool_call"},{flushImmediately:!0});return}return c.dispatchAfterToolCall(l,g).then(()=>{Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"after_tool_call"},{flushImmediately:!0})}).catch(x=>{let b=x instanceof Error?x.message.slice(0,500):a0(x).slice(0,500);Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"after_tool_call",error:b},{flushImmediately:!0}),e.logger.error(`[PD:EmpathyObserver] Error in after_tool_call: ${b}`)})}catch(f){Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"after_tool_call",error:String(f)},{flushImmediately:!0}),e.logger.error(`[PD:EmpathyObserver] Error in after_tool_call: ${String(f)}`)}}),{timeoutMs:1e4}),e.on("llm_output",pf("hook:llm_output",e.logger,(l,d)=>{let p=Kh(d,e,"llm_output");if(!p.ok){e.logger.error(`[PD:llm_output] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped \u2014 LLM analysis bypassed. NextAction: ${p.nextAction}`);return}let m=p.workspaceDir;p.consistencyWarning&&e.logger.warn(`[PD:llm_output] ${p.consistencyWarning}`);try{m2t(l,{...d,workspaceDir:m}),Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"llm_output",sessionId:d.sessionId})}catch(f){Qt.fromHookContext({workspaceDir:m}).eventLog.recordHookExecution({hook:"llm_output",sessionId:d.sessionId,error:String(f)}),e.logger.error(`[PD] Error in llm_output: ${String(f)}`)}}),{timeoutMs:1e4}),e.on("before_reset",pf("hook:before_reset",e.logger,(l,d)=>{let p=Kh(d,e,"before_reset");if(!p.ok){e.logger.error(`[PD:before_reset] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped. NextAction: ${p.nextAction}`);return}return p.consistencyWarning&&e.logger.warn(`[PD:before_reset] ${p.consistencyWarning}`),o2t(l,{...d,workspaceDir:p.workspaceDir})})),e.on("before_compaction",pf("hook:before_compaction",e.logger,(l,d)=>{let p=Kh(d,e,"before_compaction");if(!p.ok){e.logger.error(`[PD:before_compaction] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped. NextAction: ${p.nextAction}`);return}return p.consistencyWarning&&e.logger.warn(`[PD:before_compaction] ${p.consistencyWarning}`),i2t(l,{...d,workspaceDir:p.workspaceDir})})),e.on("after_compaction",pf("hook:after_compaction",e.logger,(l,d)=>{let p=Kh(d,e,"after_compaction");if(!p.ok){e.logger.error(`[PD:after_compaction] workspaceDir resolution failed. reason=${p.reason} agentId=${d.agentId??"(missing)"} sessionId=${d.sessionId??"(missing)"}. Hook skipped. NextAction: ${p.nextAction}`);return}return p.consistencyWarning&&e.logger.warn(`[PD:after_compaction] ${p.consistencyWarning}`),a2t(l,{...d,workspaceDir:p.workspaceDir})})),e.on("before_message_write",pf("hook:before_message_write",e.logger,(l,d)=>{let p=Kh(d,e,"before_message_write");if(!p.ok){e.logger.warn(`[PD:before_message_write] workspaceDir resolution failed: ${p.reason}`);return}try{g2t(l,{...d,workspaceDir:p.workspaceDir,pluginConfig:N7(e.config,e.id)})}catch(m){e.logger.warn(`[PD:before_message_write] error: ${String(m)}`)}}));try{let l=xT("service:correction-observer",Hke,e.logger);l&&e.registerService(l);let d=xT("service:trajectory",bzt,e.logger);d&&e.registerService(d);let p=xT("service:pd-task",Ozt,e.logger);p&&e.registerService(p);let m=xT("service:internalization-auto-consumer",Xke,e.logger);m&&e.registerService(m)}catch(l){e.logger.error(`[PD] Failed to register services: ${String(l)}`)}let u=(l,d,p,m,f)=>{let g={name:l,description:p,handler:m,...f?.acceptsArgs?{acceptsArgs:!0}:{}};e.registerCommand(g),d&&e.registerCommand({...g,name:d,description:`${p} (alias of /${l})`})};u("pd-init","pdi",us("pd-init",a),l=>_2t(l)),u("pd-bootstrap","pdb",us("pd-bootstrap",a),l=>x2t(l)),u("pd-research","pdr",us("pd-research",a),l=>S2t(l)),u("pd-thinking","pdt",us("pd-thinking",a),l=>T2t(l),{acceptsArgs:!0}),u("pd-help","pdh",us("pd-help",a),()=>a==="zh"?{text:`
|
|
3166
3166
|
\u{1F4D6} **Principles Disciple \u547D\u4EE4\u5927\u5168**
|
|
3167
3167
|
|
|
3168
3168
|
## \u{1F680} \u5FEB\u901F\u5F00\u59CB
|
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
"id": "principles-disciple",
|
|
3
3
|
"name": "Principles Disciple",
|
|
4
4
|
"description": "Turn repeated Agent corrections into Owner-approved, observable, reversible behavior principles. Stop correcting the same AI behavior across sessions.",
|
|
5
|
-
"version": "1.207.
|
|
5
|
+
"version": "1.207.2",
|
|
6
6
|
"activation": {
|
|
7
7
|
"onCapabilities": [
|
|
8
8
|
"hook"
|
|
9
9
|
]
|
|
10
10
|
},
|
|
11
11
|
"skills": [
|
|
12
|
-
"templates/langs/en/skills",
|
|
13
12
|
"templates/langs/zh/skills"
|
|
14
13
|
],
|
|
15
14
|
"configSchema": {
|
package/openclaw.plugin.json
CHANGED
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
"id": "principles-disciple",
|
|
3
3
|
"name": "Principles Disciple",
|
|
4
4
|
"description": "Turn repeated Agent corrections into Owner-approved, observable, reversible behavior principles. Stop correcting the same AI behavior across sessions.",
|
|
5
|
-
"version": "1.207.
|
|
5
|
+
"version": "1.207.2",
|
|
6
6
|
"activation": {
|
|
7
7
|
"onCapabilities": [
|
|
8
8
|
"hook"
|
|
9
9
|
]
|
|
10
10
|
},
|
|
11
11
|
"skills": [
|
|
12
|
-
"templates/langs/en/skills",
|
|
13
12
|
"templates/langs/zh/skills"
|
|
14
13
|
],
|
|
15
14
|
"configSchema": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "principles-disciple",
|
|
3
|
-
"version": "1.207.
|
|
3
|
+
"version": "1.207.2",
|
|
4
4
|
"description": "Turn repeated Agent corrections into Owner-approved, observable, reversible behavior principles. Stop correcting the same AI behavior across sessions.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
package/scripts/sync-plugin.mjs
CHANGED
|
@@ -686,24 +686,33 @@ function syncFilteredManifest(lang) {
|
|
|
686
686
|
process.exit(1);
|
|
687
687
|
}
|
|
688
688
|
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
689
|
+
// PR #1332 companion: the source manifest declares exactly one root
|
|
690
|
+
// (zh, product default). REPLACE language roots with the selected one
|
|
691
|
+
// instead of only filtering, so `--lang en` works against a zh-default
|
|
692
|
+
// source manifest. Mirrors the production transform in
|
|
693
|
+
// create-principles-disciple/src/skill-language.ts.
|
|
694
|
+
const langRoots = {
|
|
695
|
+
zh: 'templates/langs/zh/skills',
|
|
696
|
+
en: 'templates/langs/en/skills',
|
|
697
|
+
};
|
|
698
|
+
const isLangRoot = (sp) =>
|
|
699
|
+
typeof sp === 'string' &&
|
|
700
|
+
(sp.replaceAll('\\', '/') === langRoots.zh || sp.replaceAll('\\', '/') === langRoots.en);
|
|
693
701
|
|
|
694
|
-
if (
|
|
695
|
-
console.error(`❌
|
|
702
|
+
if (!existsSync(join(SOURCE_DIR, langRoots[selectedLang]))) {
|
|
703
|
+
console.error(`❌ Skill templates missing for language "${selectedLang}": ${langRoots[selectedLang]}`);
|
|
696
704
|
process.exit(1);
|
|
697
705
|
}
|
|
698
706
|
|
|
699
|
-
manifest.skills
|
|
707
|
+
const kept = manifest.skills.filter((sp) => !isLangRoot(sp));
|
|
708
|
+
manifest.skills = [...kept, langRoots[selectedLang]];
|
|
700
709
|
|
|
701
710
|
// Use syncItem semantics: remove target, then write freshly
|
|
702
711
|
if (existsSync(targetPath)) {
|
|
703
712
|
rmSync(targetPath, { force: true });
|
|
704
713
|
}
|
|
705
714
|
writeFileSync(targetPath, JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
|
|
706
|
-
console.log(` ✅ skills filtered to lang: ${selectedLang} (${
|
|
715
|
+
console.log(` ✅ skills filtered to lang: ${selectedLang} (${manifest.skills.length} path(s))`);
|
|
707
716
|
}
|
|
708
717
|
|
|
709
718
|
/**
|
package/scripts/verify-build.mjs
CHANGED
|
@@ -94,14 +94,25 @@ for (const [path, config] of Object.entries(expectedCounts)) {
|
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
// 3.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
97
|
+
// 3. Verify skill template roots for BOTH languages ship in dist — the
|
|
98
|
+
// installer rewrites the installed manifest per --lang (PR #1332 companion),
|
|
99
|
+
// so a missing root breaks install-time language selection. A "publishable"
|
|
100
|
+
// skill is an immediate child directory containing SKILL.md (what OpenClaw
|
|
101
|
+
// links into ~/.openclaw/plugin-skills).
|
|
102
|
+
for (const lang of ['zh', 'en']) {
|
|
103
|
+
const skillsDir = join(rootDir, 'dist/templates/langs', lang, 'skills');
|
|
104
|
+
if (!existsSync(skillsDir)) {
|
|
105
|
+
console.error(`❌ Missing skill templates: dist/templates/langs/${lang}/skills`);
|
|
106
|
+
hasError = true;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const publishable = readdirSync(skillsDir, { withFileTypes: true })
|
|
110
|
+
.filter((e) => e.isDirectory() && existsSync(join(skillsDir, e.name, 'SKILL.md')));
|
|
111
|
+
if (publishable.length < 20) {
|
|
112
|
+
console.error(`❌ dist/templates/langs/${lang}/skills has only ${publishable.length} publishable skills (expected at least 20)`);
|
|
113
|
+
hasError = true;
|
|
114
|
+
} else {
|
|
115
|
+
console.log(`✅ ${lang} skills: ${publishable.length} (dist/templates/langs/${lang}/skills/)`);
|
|
105
116
|
}
|
|
106
117
|
}
|
|
107
118
|
|